95 lines
1.7 KiB
Go
95 lines
1.7 KiB
Go
package core
|
|
|
|
import (
|
|
"sync"
|
|
"sync/atomic"
|
|
|
|
"github.com/dop251/goja"
|
|
)
|
|
|
|
type RR struct {
|
|
Req *Request
|
|
Res *Response
|
|
End func()
|
|
}
|
|
|
|
type HttpListen struct {
|
|
Path string
|
|
Method string
|
|
Chan chan *RR
|
|
UUID string
|
|
Closed bool
|
|
// Handle func(*Request, *Response)
|
|
}
|
|
|
|
var httpListens sync.Map
|
|
var httpListensAny sync.Map
|
|
var listenCounter2 int64
|
|
|
|
func AddHttpListen(api, method string, vm *goja.Runtime, uuid string, resolve func(result interface{}), reject func(reason interface{})) {
|
|
if method == "ANY" {
|
|
var hl *HttpListen
|
|
v, ok := httpListensAny.Load(uuid)
|
|
if ok {
|
|
// logs.Debug("load", uuid)
|
|
hl = v.(*HttpListen)
|
|
} else {
|
|
hl = &HttpListen{
|
|
Path: api,
|
|
Method: method,
|
|
Chan: make(chan *RR, 1000),
|
|
}
|
|
// logs.Debug("crate", uuid)
|
|
httpListensAny.Store(uuid, hl)
|
|
}
|
|
f, ok := <-hl.Chan
|
|
if ok {
|
|
// logs.Debug("http resolved")
|
|
resolve(f)
|
|
} else {
|
|
// logs.Debug("script is stopped")
|
|
reject(Error(vm, "script is stopped"))
|
|
}
|
|
return
|
|
}
|
|
hl := &HttpListen{
|
|
Path: api,
|
|
Method: method,
|
|
UUID: uuid,
|
|
}
|
|
key := atomic.AddInt64(&listenCounter2, 1)
|
|
hl.Chan = make(chan *RR, 1)
|
|
httpListens.Store(key, hl)
|
|
f, ok := <-hl.Chan
|
|
if ok {
|
|
resolve(f)
|
|
} else {
|
|
reject(Error(vm, "script is stopped"))
|
|
}
|
|
}
|
|
|
|
func CancelHttpListen(uuid string) {
|
|
httpListens.Range(func(key, value any) bool {
|
|
hl := value.(*HttpListen)
|
|
if hl.UUID == uuid {
|
|
httpListens.Delete(key)
|
|
if !hl.Closed {
|
|
hl.Closed = true
|
|
close(hl.Chan)
|
|
}
|
|
}
|
|
return true
|
|
})
|
|
httpListensAny.Range(func(key, value any) bool {
|
|
hl := value.(*HttpListen)
|
|
if hl.UUID == uuid {
|
|
httpListens.Delete(key)
|
|
if !hl.Closed {
|
|
hl.Closed = true
|
|
close(hl.Chan)
|
|
}
|
|
}
|
|
return true
|
|
})
|
|
}
|