11package mokapi
22
33import (
4+ "bytes"
5+ "encoding/json"
46 "fmt"
57 "github.com/dop251/goja"
68 "mokapi/js/util"
@@ -18,7 +20,13 @@ func (m *Module) On(event string, do goja.Value, vArgs goja.Value) {
1820 }
1921
2022 f := func (args ... interface {}) (bool , error ) {
21- r , err := m .loop .RunAsync (func (vm * goja.Runtime ) (goja.Value , error ) {
23+ origin , err := getHashes (args ... )
24+ if err != nil {
25+ return false , err
26+ }
27+
28+ var r goja.Value
29+ r , err = m .loop .RunAsync (func (vm * goja.Runtime ) (goja.Value , error ) {
2230 call , _ := goja .AssertFunction (do )
2331 var params []goja.Value
2432 for _ , v := range args {
@@ -35,7 +43,16 @@ func (m *Module) On(event string, do goja.Value, vArgs goja.Value) {
3543 return false , err
3644 }
3745
38- return r .ToBoolean (), nil
46+ if r != goja .Undefined () {
47+ return r .ToBoolean (), nil
48+ }
49+
50+ newHashes , err := getHashes (args ... )
51+ if err != nil {
52+ return false , err
53+ }
54+
55+ return haveChanges (origin , newHashes ), nil
3956 }
4057
4158 m .host .On (event , f , args .tags )
@@ -69,3 +86,25 @@ func getOnArgs(vm *goja.Runtime, args goja.Value) (onArgs, error) {
6986 }
7087 return onArgs {}, nil
7188}
89+
90+ func getHashes (args ... any ) ([][]byte , error ) {
91+ var result [][]byte
92+ for _ , arg := range args {
93+ b , err := json .Marshal (arg )
94+ if err != nil {
95+ return nil , fmt .Errorf ("unable to marshal arg" )
96+ }
97+ result = append (result , b )
98+ }
99+ return result , nil
100+ }
101+
102+ func haveChanges (origin [][]byte , new [][]byte ) bool {
103+ for i , o := range origin {
104+ n := new [i ]
105+ if ! bytes .Equal (o , n ) {
106+ return true
107+ }
108+ }
109+ return false
110+ }
0 commit comments