github.com/0chain/gosdk@v1.17.11/wasmsdk/jsbridge/template_data.go (about) 1 //go:build js && wasm 2 3 package jsbridge 4 5 import ( 6 "bytes" 7 _ "embed" 8 "fmt" 9 "net/url" 10 "os" 11 "path" 12 "strings" 13 "syscall/js" 14 "text/template" 15 16 "github.com/0chain/gosdk/core/version" 17 ) 18 19 //go:embed zcnworker.js.tpl 20 var WorkerJSTpl []byte 21 22 func buildWorkerJS(args, env []string, path string) (string, error) { 23 return buildJS(args, env, path, WorkerJSTpl) 24 } 25 26 func buildJS(args, env []string, wasmPath string, tpl []byte) (string, error) { 27 var workerJS bytes.Buffer 28 29 if len(args) == 0 { 30 args = []string{wasmPath} 31 } 32 33 if len(env) == 0 { 34 env = os.Environ() 35 } 36 var cachePath string 37 if uRL, err := url.ParseRequestURI(wasmPath); err != nil || !uRL.IsAbs() { 38 origin := js.Global().Get("location").Get("origin").String() 39 u, err := url.Parse(origin) 40 if err != nil { 41 return "", err 42 } 43 u.Path = path.Join(u.Path, wasmPath) 44 cachePath = u.String() 45 params := url.Values{} 46 params.Add("v", version.VERSIONSTR) 47 u.RawQuery = params.Encode() 48 wasmPath = u.String() 49 } 50 suffix := os.Getenv("SUFFIX") 51 if suffix == "" { 52 suffix = "dev" 53 } 54 cdnPath := fmt.Sprintf("https://d2os1u2xwjukgr.cloudfront.net/%s/zcn.wasm", suffix) 55 data := templateData{ 56 Path: cdnPath, 57 Args: args, 58 Env: env, 59 FallbackPath: wasmPath, 60 CachePath: cachePath, 61 } 62 if err := template.Must(template.New("js").Parse(string(tpl))).Execute(&workerJS, data); err != nil { 63 return "", err 64 } 65 return workerJS.String(), nil 66 } 67 68 type templateData struct { 69 Path string 70 Args []string 71 Env []string 72 FallbackPath string 73 CachePath string 74 } 75 76 func (d templateData) ArgsToJS() string { 77 el := []string{} 78 for _, e := range d.Args { 79 el = append(el, `"`+e+`"`) 80 } 81 return "[" + strings.Join(el, ",") + "]" 82 } 83 84 func (d templateData) EnvToJS() string { 85 el := []string{} 86 for _, entry := range d.Env { 87 if k, v, ok := strings.Cut(entry, "="); ok { 88 el = append(el, fmt.Sprintf(`"%s":"%s"`, k, v)) 89 } 90 } 91 return "{" + strings.Join(el, ",") + "}" 92 }