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  }