diff --git a/.vscode/launch.json b/.vscode/launch.json index 137f942..6850e1a 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,7 +9,7 @@ "type": "go", "request": "launch", "mode": "auto", - "program": "${workspaceFolder}/scripts/dev-server/devserver.go", + "program": "${workspaceFolder}/scripts/dev-server/", "env": { "GOOS": "windows", "GOARCH": "amd64" diff --git a/scripts/dev-server/devserver.go b/scripts/dev-server/devserver.go index 78e54d8..4c012c1 100644 --- a/scripts/dev-server/devserver.go +++ b/scripts/dev-server/devserver.go @@ -16,11 +16,14 @@ func main() { simplehttp.DefaultStaticData["Title"] = "D3vugu-components examples" simplehttp.DefaultStaticData["CSSFiles"] = []string{"/static/css/d3c-theme-base.css"} + var wasmHandler WASMExecHandler + wd, _ := os.Getwd() uiDir := filepath.Join(wd) l := ":8875" log.Printf("Starting HTTP Server at %q", l) h := simplehttp.New(uiDir, true) + http.Handle("/wasm_exec.js", &wasmHandler) // A hack to circumvent the old hardcoded path in simplehttp. TODO: Seek alternative to the simplehttp dev server http.Handle("/", h) http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir(filepath.Join(uiDir, "static"))))) diff --git a/scripts/dev-server/wasm-exec-handler.go b/scripts/dev-server/wasm-exec-handler.go new file mode 100644 index 0000000..5e1b6ad --- /dev/null +++ b/scripts/dev-server/wasm-exec-handler.go @@ -0,0 +1,43 @@ +package main + +import ( + "bytes" + "net/http" + "os" + "os/exec" + "path/filepath" + "strings" + "sync" + "time" +) + +type WASMExecHandler struct { + wasmExecJsOnce sync.Once + wasmExecJsContent []byte + wasmExecJsTs time.Time +} + +func (h *WASMExecHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + b, err := exec.Command("go", "env", "GOROOT").CombinedOutput() + if err != nil { + http.Error(w, "failed to run `go env GOROOT`: "+err.Error(), 500) + return + } + + h.wasmExecJsOnce.Do(func() { + h.wasmExecJsContent, err = os.ReadFile(filepath.Join(strings.TrimSpace(string(b)), "lib/wasm/wasm_exec.js")) + if err != nil { + http.Error(w, "failed to run `go env GOROOT`: "+err.Error(), 500) + return + } + h.wasmExecJsTs = time.Now() // hack but whatever for now + }) + + if len(h.wasmExecJsContent) == 0 { + http.Error(w, "failed to read wasm_exec.js from local Go environment", 500) + return + } + + w.Header().Set("Content-Type", "text/javascript") + http.ServeContent(w, r, "/wasm_exec.js", h.wasmExecJsTs, bytes.NewReader(h.wasmExecJsContent)) +}