/
jsenv_handler.go
78 lines (59 loc) · 1.37 KB
/
jsenv_handler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package automation
import (
"context"
"fmt"
"github.com/cortezaproject/corteza/server/pkg/expr"
"github.com/cortezaproject/corteza/server/pkg/jsenv"
)
type (
jsenvHandler struct {
reg jsenvHandlerRegistry
}
)
func JsenvHandler(reg queueHandlerRegistry) *jsenvHandler {
h := &jsenvHandler{
reg: reg,
}
h.register()
return h
}
func initVm() jsenv.Vm {
tr := jsenv.NewTransformer(jsenv.LoaderJS, jsenv.TargetNoop)
vm := jsenv.New(tr)
// register a request body reader
vm.Register("readRequestBody", ReadRequestBody)
return vm
}
func (h jsenvHandler) execute(ctx context.Context, args *jsenvExecuteArgs) (res *jsenvExecuteResults, err error) {
vm := initVm()
res = &jsenvExecuteResults{}
if !args.hasSource {
err = fmt.Errorf("could not process payload, function missing")
return
}
if !args.hasScope {
err = fmt.Errorf("could not process payload, scope missing")
return
}
fn, err := vm.RegisterFunction(args.Source)
if err != nil {
err = fmt.Errorf("could not register jsenv function: %s", err)
return
}
out, err := fn.Exec(vm.New(expr.UntypedValue(args.Scope)))
if err != nil {
err = fmt.Errorf("could not exec jsenv function: %s", err)
return
}
switch vv := out.(type) {
case int64:
res.ResultInt = int64(vv)
case string:
res.ResultString = string(vv)
case bool:
res.ResultBool = vv
default:
res.ResultAny = vv
}
return
}