Files
Sillyv2/core/node_web.go
T
cdle 8eb0db0dc1 x
2023-06-02 16:52:49 +08:00

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
})
}