|
@@ -2,13 +2,12 @@ package nodes
|
|
|
|
|
|
import (
|
|
import (
|
|
"encoding/json"
|
|
"encoding/json"
|
|
- "errors"
|
|
|
|
"fmt"
|
|
"fmt"
|
|
|
|
+ "github.com/gogf/gf/v2/container/gqueue"
|
|
"github.com/robertkrimen/otto"
|
|
"github.com/robertkrimen/otto"
|
|
"sparrow/pkg/protocol"
|
|
"sparrow/pkg/protocol"
|
|
"sparrow/pkg/ruleEngine"
|
|
"sparrow/pkg/ruleEngine"
|
|
"sparrow/pkg/server"
|
|
"sparrow/pkg/server"
|
|
- "sync"
|
|
|
|
)
|
|
)
|
|
|
|
|
|
const jsWrapperPrifixTemplate = `function %s(msgStr, metaDataStr, msgType) {
|
|
const jsWrapperPrifixTemplate = `function %s(msgStr, metaDataStr, msgType) {
|
|
@@ -32,7 +31,7 @@ const ruleNodeFuncName = "ruleNodeFunc"
|
|
type FilterJavascriptNode struct {
|
|
type FilterJavascriptNode struct {
|
|
vm *otto.Otto
|
|
vm *otto.Otto
|
|
config *FilterJavascriptNodeConfig
|
|
config *FilterJavascriptNodeConfig
|
|
- l sync.Mutex
|
|
|
|
|
|
+ queue *gqueue.Queue
|
|
}
|
|
}
|
|
|
|
|
|
func (j *FilterJavascriptNode) Init(ctx ruleEngine.Context, config string) error {
|
|
func (j *FilterJavascriptNode) Init(ctx ruleEngine.Context, config string) error {
|
|
@@ -45,6 +44,8 @@ func (j *FilterJavascriptNode) Init(ctx ruleEngine.Context, config string) error
|
|
j.config = c
|
|
j.config = c
|
|
}
|
|
}
|
|
j.vm = otto.New()
|
|
j.vm = otto.New()
|
|
|
|
+ j.queue = gqueue.New(10)
|
|
|
|
+ go j.handleMessage(ctx)
|
|
_, err := j.vm.Run(generateRuleNodeScript("filter", j.config.FuncBody))
|
|
_, err := j.vm.Run(generateRuleNodeScript("filter", j.config.FuncBody))
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
@@ -52,35 +53,41 @@ func (j *FilterJavascriptNode) Init(ctx ruleEngine.Context, config string) error
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
|
|
-func (j *FilterJavascriptNode) OnMessage(ctx ruleEngine.Context, message *protocol.Message) error {
|
|
|
|
- body := message.Data
|
|
|
|
- metaData, err := json.Marshal(message.MetaData)
|
|
|
|
- if err != nil {
|
|
|
|
- server.Log.Errorf("metadata marshal error:%s", err.Error())
|
|
|
|
- next := j.processError(ctx, message, err)
|
|
|
|
- ctx.TellError(next, err)
|
|
|
|
- return errors.New("metadata marshal error " + err.Error())
|
|
|
|
- }
|
|
|
|
- j.l.Lock()
|
|
|
|
- defer j.l.Unlock()
|
|
|
|
- res, err := j.vm.Call("filter", nil, body, string(metaData), message.Type)
|
|
|
|
- if err != nil {
|
|
|
|
- //next := j.processError(ctx, message, err)
|
|
|
|
- //ctx.TellError(next, err)
|
|
|
|
- server.Log.Errorf("vm call filter error:%s", err.Error())
|
|
|
|
- fmt.Printf("________++++==%s", metaData)
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
- v := false
|
|
|
|
- if result, err := res.ToBoolean(); err == nil {
|
|
|
|
- v = result
|
|
|
|
- }
|
|
|
|
|
|
+func (j *FilterJavascriptNode) handleMessage(ctx ruleEngine.Context) {
|
|
|
|
|
|
- if v {
|
|
|
|
- ctx.TellNext(message, protocol.True)
|
|
|
|
- } else {
|
|
|
|
- ctx.TellNext(message, protocol.False)
|
|
|
|
|
|
+ for {
|
|
|
|
+ if v := j.queue.Pop(); v != nil {
|
|
|
|
+ message := v.(*protocol.Message)
|
|
|
|
+ body := message.Data
|
|
|
|
+ metaData, err := json.Marshal(message.MetaData)
|
|
|
|
+ if err != nil {
|
|
|
|
+ server.Log.Errorf("metadata marshal error:%s", err.Error())
|
|
|
|
+ next := j.processError(ctx, message, err)
|
|
|
|
+ ctx.TellError(next, err)
|
|
|
|
+ }
|
|
|
|
+ res, err := j.vm.Call("filter", nil, body, string(metaData), message.Type)
|
|
|
|
+ if err != nil {
|
|
|
|
+ next := j.processError(ctx, message, err)
|
|
|
|
+ ctx.TellError(next, err)
|
|
|
|
+ server.Log.Errorf("vm call filter error:%s", err.Error())
|
|
|
|
+ fmt.Printf("________++++==%s", metaData)
|
|
|
|
+ }
|
|
|
|
+ v := false
|
|
|
|
+ if result, err := res.ToBoolean(); err == nil {
|
|
|
|
+ v = result
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if v {
|
|
|
|
+ ctx.TellNext(message, protocol.True)
|
|
|
|
+ } else {
|
|
|
|
+ ctx.TellNext(message, protocol.False)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (j *FilterJavascriptNode) OnMessage(ctx ruleEngine.Context, message *protocol.Message) error {
|
|
|
|
+ j.queue.Push(message)
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
|