Skip to content

Commit d2827e3

Browse files
authored
Merge pull request #179 from SenseUnit/js_parallel_init
Parallel init for JS scripts
2 parents 179b450 + 69e9caa commit d2827e3

File tree

3 files changed

+79
-60
lines changed

3 files changed

+79
-60
lines changed

access/jsfilter.go

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"os"
99

1010
"github.com/dop251/goja"
11+
"golang.org/x/sync/errgroup"
1112

1213
"github.com/SenseUnit/dumbproxy/jsext"
1314
clog "github.com/SenseUnit/dumbproxy/log"
@@ -32,39 +33,47 @@ func NewJSFilter(filename string, instances int, logger *clog.CondLogger, next F
3233

3334
instances = max(1, instances)
3435
pool := make(chan JSFilterFunc, instances)
36+
initGroup, _ := errgroup.WithContext(context.Background())
3537

3638
for i := 0; i < instances; i++ {
37-
vm := goja.New()
38-
err = jsext.AddPrinter(vm, logger)
39-
if err != nil {
40-
return nil, fmt.Errorf("can't add print function to runtime: %w", err)
41-
}
42-
err = jsext.ConfigureRuntime(vm)
43-
if err != nil {
44-
return nil, fmt.Errorf("can't configure runtime: %w", err)
45-
}
46-
vm.SetFieldNameMapper(goja.TagFieldNameMapper("json", true))
47-
_, err = vm.RunString(string(script))
48-
if err != nil {
49-
return nil, fmt.Errorf("script run failed: %w", err)
50-
}
39+
initGroup.Go(func() error {
40+
vm := goja.New()
41+
err := jsext.AddPrinter(vm, logger)
42+
if err != nil {
43+
return fmt.Errorf("can't add print function to runtime: %w", err)
44+
}
45+
err = jsext.ConfigureRuntime(vm)
46+
if err != nil {
47+
return fmt.Errorf("can't configure runtime: %w", err)
48+
}
49+
_, err = vm.RunString(string(script))
50+
if err != nil {
51+
return fmt.Errorf("script run failed: %w", err)
52+
}
5153

52-
var f JSFilterFunc
53-
var accessFnJSVal goja.Value
54-
if ex := vm.Try(func() {
55-
accessFnJSVal = vm.Get("access")
56-
}); ex != nil {
57-
return nil, fmt.Errorf("\"access\" function cannot be located in VM context: %w", err)
58-
}
59-
if accessFnJSVal == nil {
60-
return nil, errors.New("\"access\" function is not defined")
61-
}
62-
err = vm.ExportTo(accessFnJSVal, &f)
63-
if err != nil {
64-
return nil, fmt.Errorf("can't export \"access\" function from JS VM: %w", err)
65-
}
54+
var f JSFilterFunc
55+
var accessFnJSVal goja.Value
56+
if ex := vm.Try(func() {
57+
accessFnJSVal = vm.Get("access")
58+
}); ex != nil {
59+
return fmt.Errorf("\"access\" function cannot be located in VM context: %w", err)
60+
}
61+
if accessFnJSVal == nil {
62+
return errors.New("\"access\" function is not defined")
63+
}
64+
err = vm.ExportTo(accessFnJSVal, &f)
65+
if err != nil {
66+
return fmt.Errorf("can't export \"access\" function from JS VM: %w", err)
67+
}
6668

67-
pool <- f
69+
pool <- f
70+
return nil
71+
})
72+
}
73+
74+
err = initGroup.Wait()
75+
if err != nil {
76+
return nil, err
6877
}
6978

7079
return &JSFilter{

dialer/jsrouter.go

Lines changed: 40 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"os"
99

1010
"github.com/dop251/goja"
11+
"golang.org/x/sync/errgroup"
1112

1213
"github.com/SenseUnit/dumbproxy/dialer/dto"
1314
"github.com/SenseUnit/dumbproxy/jsext"
@@ -30,39 +31,47 @@ func NewJSRouter(filename string, instances int, factory func(string) (Dialer, e
3031

3132
instances = max(1, instances)
3233
pool := make(chan JSRouterFunc, instances)
34+
initGroup, _ := errgroup.WithContext(context.Background())
3335

3436
for i := 0; i < instances; i++ {
35-
vm := goja.New()
36-
err := jsext.AddPrinter(vm, logger)
37-
if err != nil {
38-
return nil, fmt.Errorf("can't add print function to runtime: %w", err)
39-
}
40-
err = jsext.ConfigureRuntime(vm)
41-
if err != nil {
42-
return nil, fmt.Errorf("can't configure runtime runtime: %w", err)
43-
}
44-
vm.SetFieldNameMapper(goja.TagFieldNameMapper("json", true))
45-
_, err = vm.RunString(string(script))
46-
if err != nil {
47-
return nil, fmt.Errorf("script run failed: %w", err)
48-
}
49-
50-
var f JSRouterFunc
51-
var routerFnJSVal goja.Value
52-
if ex := vm.Try(func() {
53-
routerFnJSVal = vm.Get("getProxy")
54-
}); ex != nil {
55-
return nil, fmt.Errorf("\"getProxy\" function cannot be located in VM context: %w", err)
56-
}
57-
if routerFnJSVal == nil {
58-
return nil, errors.New("\"getProxy\" function is not defined")
59-
}
60-
err = vm.ExportTo(routerFnJSVal, &f)
61-
if err != nil {
62-
return nil, fmt.Errorf("can't export \"getProxy\" function from JS VM: %w", err)
63-
}
64-
65-
pool <- f
37+
initGroup.Go(func() error {
38+
vm := goja.New()
39+
err := jsext.AddPrinter(vm, logger)
40+
if err != nil {
41+
return fmt.Errorf("can't add print function to runtime: %w", err)
42+
}
43+
err = jsext.ConfigureRuntime(vm)
44+
if err != nil {
45+
return fmt.Errorf("can't configure runtime runtime: %w", err)
46+
}
47+
_, err = vm.RunString(string(script))
48+
if err != nil {
49+
return fmt.Errorf("script run failed: %w", err)
50+
}
51+
52+
var f JSRouterFunc
53+
var routerFnJSVal goja.Value
54+
if ex := vm.Try(func() {
55+
routerFnJSVal = vm.Get("getProxy")
56+
}); ex != nil {
57+
return fmt.Errorf("\"getProxy\" function cannot be located in VM context: %w", err)
58+
}
59+
if routerFnJSVal == nil {
60+
return errors.New("\"getProxy\" function is not defined")
61+
}
62+
err = vm.ExportTo(routerFnJSVal, &f)
63+
if err != nil {
64+
return fmt.Errorf("can't export \"getProxy\" function from JS VM: %w", err)
65+
}
66+
67+
pool <- f
68+
return nil
69+
})
70+
}
71+
72+
err = initGroup.Wait()
73+
if err != nil {
74+
return nil, err
6675
}
6776

6877
return &JSRouter{

jsext/jsext.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package jsext
33
import "github.com/dop251/goja"
44

55
func ConfigureRuntime(vm *goja.Runtime) error {
6+
vm.SetFieldNameMapper(goja.TagFieldNameMapper("json", true))
67
if err := AddFileReader(vm); err != nil {
78
return err
89
}

0 commit comments

Comments
 (0)