diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index b8c52e7..1d8a802 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -8,7 +8,7 @@ jobs: deploy: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Build run: docker build -t hackpad . - name: Publish diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e867bc4..780652c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,19 +9,19 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-go@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-go@v3 with: - go-version: 1.16 + go-version: 1.20.x - name: Lint run: make lint test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-go@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-go@v3 with: - go-version: 1.16 + go-version: 1.20.x - name: Test run: make test diff --git a/Makefile b/Makefile index 77ce405..dccf283 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,11 @@ SHELL := /usr/bin/env bash -GO_VERSION = 1.16.6 +GO_VERSION = 1.20 GOROOT = PATH := ${PWD}/cache/go/bin:${PWD}/cache/go/misc/wasm:${PATH} GOOS = js GOARCH = wasm export -LINT_VERSION=1.27.0 +LINT_VERSION=1.52.2 .PHONY: serve serve: @@ -71,7 +71,7 @@ cache/go${GO_VERSION}: cache git clone \ --depth 1 \ --single-branch \ - --branch hackpad-go${GO_VERSION} \ + --branch hackpad/release-branch.go${GO_VERSION} \ https://github.com/hack-pad/go.git \ "$$TMP"; \ pushd "$$TMP/src"; \ diff --git a/cmd/editor/css/css.go b/cmd/editor/css/css.go index 027bf35..c02d6ae 100644 --- a/cmd/editor/css/css.go +++ b/cmd/editor/css/css.go @@ -1,3 +1,4 @@ +//go:build js // +build js package css diff --git a/cmd/editor/dom/document.go b/cmd/editor/dom/document.go index a2088e6..b03f1a8 100644 --- a/cmd/editor/dom/document.go +++ b/cmd/editor/dom/document.go @@ -1,3 +1,4 @@ +//go:build js // +build js package dom diff --git a/cmd/editor/dom/element.go b/cmd/editor/dom/element.go index d6f20aa..4727ce8 100644 --- a/cmd/editor/dom/element.go +++ b/cmd/editor/dom/element.go @@ -1,3 +1,4 @@ +//go:build js // +build js package dom @@ -111,14 +112,20 @@ func (e *Element) QuerySelectorAll(query string) []*Element { return sliceFromArray(e.elem.Call("querySelectorAll", query)) } -func (e *Element) AddEventListener(name string, listener EventListener) { - e.elem.Call("addEventListener", name, js.FuncOf(func(this js.Value, args []js.Value) interface{} { +func (e *Element) RemoveEventListener(name string, listener js.Func) { + e.elem.Call("removeEventListener", name, listener) +} + +func (e *Element) AddEventListener(name string, listener EventListener) js.Func { + listenerFunc := js.FuncOf(func(_ js.Value, args []js.Value) interface{} { defer common.CatchExceptionHandler(func(err error) { log.Error("recovered from panic: ", err, "\n", string(debug.Stack())) }) listener(args[0]) return nil - })) + }) + e.elem.Call("addEventListener", name, listenerFunc) + return listenerFunc } func (e *Element) Focus() { diff --git a/cmd/editor/dom/rect.go b/cmd/editor/dom/rect.go index fa01989..2b46c95 100644 --- a/cmd/editor/dom/rect.go +++ b/cmd/editor/dom/rect.go @@ -1,3 +1,4 @@ +//go:build js // +build js package dom diff --git a/cmd/editor/dom/window.go b/cmd/editor/dom/window.go index 35f92fb..a8a02ec 100644 --- a/cmd/editor/dom/window.go +++ b/cmd/editor/dom/window.go @@ -1,3 +1,4 @@ +//go:build js // +build js package dom diff --git a/cmd/editor/editor.go b/cmd/editor/editor.go index 1cd268b..857f5bf 100644 --- a/cmd/editor/editor.go +++ b/cmd/editor/editor.go @@ -1,9 +1,9 @@ +//go:build js // +build js package main import ( - "io/ioutil" "os" "syscall/js" @@ -13,19 +13,20 @@ import ( ) // editorJSFunc is a JS function that opens on a JS element and returns a JS object with the following spec: -// { -// getContents() string -// setContents(string) -// getCursorIndex() int -// setCursorIndex(int) -// } +// +// { +// getContents() string +// setContents(string) +// getCursorIndex() int +// setCursorIndex(int) +// } type editorJSFunc js.Value func (e editorJSFunc) New(elem *dom.Element) ide.Editor { editor := &jsEditor{ titleChan: make(chan string, 1), } - editor.elem = js.Value(e).Invoke(elem, js.FuncOf(editor.onEdit)) + editor.elem = js.Value(e).Invoke(elem.JSValue(), js.FuncOf(editor.onEdit)) return editor } @@ -43,7 +44,7 @@ func (j *jsEditor) onEdit(js.Value, []js.Value) interface{} { if err == nil { perm = info.Mode() } - err = ioutil.WriteFile(j.filePath, []byte(contents), perm) + err = os.WriteFile(j.filePath, []byte(contents), perm) if err != nil { log.Error("Failed to write file contents: ", err) } @@ -62,7 +63,7 @@ func (j *jsEditor) CurrentFile() string { } func (j *jsEditor) ReloadFile() error { - contents, err := ioutil.ReadFile(j.filePath) + contents, err := os.ReadFile(j.filePath) if err != nil { return err } diff --git a/cmd/editor/ide/command.go b/cmd/editor/ide/command.go index 9a182df..bde335d 100644 --- a/cmd/editor/ide/command.go +++ b/cmd/editor/ide/command.go @@ -1,3 +1,4 @@ +//go:build js // +build js package ide @@ -16,15 +17,15 @@ const ( ) // runGoProcess optimizes runProcess by skipping the wait time for listing PATH directories on startup -func (w *window) runGoProcess(console TaskConsole, args ...string) promise.Promise { +func (w *window) runGoProcess(console TaskConsole, args ...string) promise.JS { return w.runRawProcess(console, goBinaryPath, "go", args...) } -func (w *window) runProcess(console TaskConsole, name string, args ...string) promise.Promise { +func (w *window) runProcess(console TaskConsole, name string, args ...string) promise.JS { return w.runRawProcess(console, name, name, args...) } -func (w *window) runRawProcess(console TaskConsole, fullPath, name string, args ...string) promise.Promise { +func (w *window) runRawProcess(console TaskConsole, fullPath, name string, args ...string) promise.JS { resolve, reject, prom := promise.New() go func() { var success bool @@ -69,6 +70,6 @@ func (w *window) startProcess(console TaskConsole, rawPath, name string, args .. func (w *window) runPlayground(console TaskConsole) { w.runGoProcess(console, "build", "-v", ".").Then(func(_ interface{}) interface{} { - return w.runProcess(console, "./playground") + return w.runProcess(console, "./playground").JSValue() }) } diff --git a/cmd/editor/ide/console.go b/cmd/editor/ide/console.go index 53473a3..299ee7f 100644 --- a/cmd/editor/ide/console.go +++ b/cmd/editor/ide/console.go @@ -1,3 +1,4 @@ +//go:build js // +build js package ide diff --git a/cmd/editor/ide/dropdown.go b/cmd/editor/ide/dropdown.go index 42ea8a7..5848cf1 100644 --- a/cmd/editor/ide/dropdown.go +++ b/cmd/editor/ide/dropdown.go @@ -1,3 +1,4 @@ +//go:build js // +build js package ide @@ -33,7 +34,7 @@ func newDropdown(attachTo, content *dom.Element) *dropdown { attached: attachTo, } dom.GetDocument().AddEventListener("click", func(event js.Value) { - if !event.Call("composedPath").Call("includes", drop).Bool() { + if !event.Call("composedPath").Call("includes", drop.JSValue()).Bool() { drop.Close() } }) diff --git a/cmd/editor/ide/editor.go b/cmd/editor/ide/editor.go index e31d680..3fd4ded 100644 --- a/cmd/editor/ide/editor.go +++ b/cmd/editor/ide/editor.go @@ -1,3 +1,4 @@ +//go:build js // +build js package ide diff --git a/cmd/editor/ide/settings.go b/cmd/editor/ide/settings.go index b979cb1..a1d9045 100644 --- a/cmd/editor/ide/settings.go +++ b/cmd/editor/ide/settings.go @@ -1,3 +1,4 @@ +//go:build js // +build js package ide diff --git a/cmd/editor/ide/tab.go b/cmd/editor/ide/tab.go index b8eb663..53ce46a 100644 --- a/cmd/editor/ide/tab.go +++ b/cmd/editor/ide/tab.go @@ -1,3 +1,4 @@ +//go:build js // +build js package ide diff --git a/cmd/editor/ide/tab_pane.go b/cmd/editor/ide/tab_pane.go index bd2e778..0fbfe86 100644 --- a/cmd/editor/ide/tab_pane.go +++ b/cmd/editor/ide/tab_pane.go @@ -1,3 +1,4 @@ +//go:build js // +build js package ide diff --git a/cmd/editor/ide/window.go b/cmd/editor/ide/window.go index 8d37e06..cadbc9f 100644 --- a/cmd/editor/ide/window.go +++ b/cmd/editor/ide/window.go @@ -1,3 +1,4 @@ +//go:build js // +build js package ide @@ -5,7 +6,7 @@ package ide import ( _ "embed" "go/format" - "io/ioutil" + "os" "strings" "syscall/js" @@ -99,7 +100,7 @@ func New(elem *dom.Element, editorBuilder EditorBuilder, consoleBuilder ConsoleB } go func() { - src, err := ioutil.ReadFile(path) + src, err := os.ReadFile(path) if err != nil { log.Errorf("Failed to read Go file %q: %v", path, err) return @@ -109,7 +110,7 @@ func New(elem *dom.Element, editorBuilder EditorBuilder, consoleBuilder ConsoleB log.Errorf("Failed to format Go file %q: %v", path, err) return } - err = ioutil.WriteFile(path, out, 0) + err = os.WriteFile(path, out, 0) if err != nil { log.Errorf("Failed to write Go file %q: %v", path, err) return @@ -183,11 +184,12 @@ func (w *window) makeDefaultEditor(id int, title, contents *dom.Element) Tabber title.SetInnerHTML(``) inputElem := title.QuerySelector("input") - dom.QueueMicrotask(func() { - inputElem.Focus() // run focus on next run loop so opening a file immediately doesn't trigger onblur - }) + inputElem.Focus() - keydownFn := func(event js.Value) { + blurListener := inputElem.AddEventListener("blur", func(js.Value) { + w.editorsPane.closeTabID(id) + }) + title.AddEventListener("keydown", func(event js.Value) { if event.Get("key").String() != "Enter" { return } @@ -199,19 +201,15 @@ func (w *window) makeDefaultEditor(id int, title, contents *dom.Element) Tabber if fileName == "" { return } - title.SetInnerText("New file") - err := editor.OpenFile(fileName) - if err != nil { - log.Error(err) - } - w.editorsPane.focusID(id) - } - title.AddEventListener("keydown", keydownFn) - inputElem.AddEventListener("blur", func(event js.Value) { - titleText := title.InnerText() - if titleText != "New file" { - w.editorsPane.closeTabID(id) - } + inputElem.RemoveEventListener("blur", blurListener) + title.SetInnerText("New file") // setting inner text triggers onblur because the input HTML is about to be removed + go func() { + err := editor.OpenFile(fileName) + if err != nil { + log.Error(err) + } + w.editorsPane.focusID(id) + }() }) return editor } diff --git a/cmd/editor/main.go b/cmd/editor/main.go index 7c0c828..dde89c0 100644 --- a/cmd/editor/main.go +++ b/cmd/editor/main.go @@ -1,10 +1,10 @@ +//go:build js // +build js package main import ( "flag" - "io/ioutil" "os" "syscall/js" @@ -85,7 +85,7 @@ func main() { fmt.Println("Hello from Wasm!", datasize.Gigabytes(4)) } ` - err := ioutil.WriteFile("main.go", []byte(mainGoContents), 0600) + err := os.WriteFile("main.go", []byte(mainGoContents), 0600) if err != nil { log.Error("Failed to write to main.go: ", err) return diff --git a/cmd/editor/plaineditor/editor.go b/cmd/editor/plaineditor/editor.go index c21cd57..8c7ccdd 100644 --- a/cmd/editor/plaineditor/editor.go +++ b/cmd/editor/plaineditor/editor.go @@ -1,9 +1,10 @@ +//go:build js // +build js package plaineditor import ( - "io/ioutil" + "os" "syscall/js" "github.com/hack-pad/hackpad/cmd/editor/dom" @@ -50,7 +51,7 @@ func (e *textAreaEditor) CurrentFile() string { } func (e *textAreaEditor) ReloadFile() error { - contents, err := ioutil.ReadFile(e.filePath) + contents, err := os.ReadFile(e.filePath) if err != nil { return err } @@ -59,7 +60,7 @@ func (e *textAreaEditor) ReloadFile() error { } func (e *textAreaEditor) edited(newContents func() string) { - err := ioutil.WriteFile(e.filePath, []byte(newContents()), 0600) + err := os.WriteFile(e.filePath, []byte(newContents()), 0600) if err != nil { log.Errorf("Failed to write %s: %s", e.filePath, err.Error()) return diff --git a/cmd/editor/plaineditor/typer.go b/cmd/editor/plaineditor/typer.go index 40f7c5b..1fbfeb1 100644 --- a/cmd/editor/plaineditor/typer.go +++ b/cmd/editor/plaineditor/typer.go @@ -1,3 +1,4 @@ +//go:build js // +build js package plaineditor @@ -42,7 +43,7 @@ func handleKeydown(event js.Value) { selectionEnd := target.Get("selectionEnd").Int() key := event.Get("key").String() code := event.Get("code").String() - //metaKey := event.Get("metaKey").Bool() + // metaKey := event.Get("metaKey").Bool() preventDefault := func() { event.Call("preventDefault") @@ -59,11 +60,11 @@ func handleKeydown(event js.Value) { if code == KeyEnter { // TODO restore cmd+enter triggering run button - //if metaKey { - //preventDefault() - //runPlayground() - //return - //} + // if metaKey { + // preventDefault() + // runPlayground() + // return + // } lastNewLine := strings.LastIndexByte(slice(text, 0, selectionStart), '\n') if lastNewLine != -1 { diff --git a/cmd/editor/taskconsole/console.go b/cmd/editor/taskconsole/console.go index f8908b8..aabaa0c 100644 --- a/cmd/editor/taskconsole/console.go +++ b/cmd/editor/taskconsole/console.go @@ -1,3 +1,4 @@ +//go:build js // +build js package taskconsole diff --git a/cmd/editor/taskconsole/writer_elem.go b/cmd/editor/taskconsole/writer_elem.go index 5c46b76..6554354 100644 --- a/cmd/editor/taskconsole/writer_elem.go +++ b/cmd/editor/taskconsole/writer_elem.go @@ -1,3 +1,4 @@ +//go:build js // +build js package taskconsole diff --git a/cmd/editor/terminal/terminal.go b/cmd/editor/terminal/terminal.go index abb485d..232fa01 100644 --- a/cmd/editor/terminal/terminal.go +++ b/cmd/editor/terminal/terminal.go @@ -1,3 +1,4 @@ +//go:build js // +build js package terminal @@ -35,7 +36,7 @@ type terminal struct { func (b *terminalBuilder) New(elem *dom.Element, rawName, name string, args ...string) (ide.Console, error) { term := &terminal{ - xterm: b.newXTermFunc.Invoke(elem), + xterm: b.newXTermFunc.Invoke(elem.JSValue()), titleChan: make(chan string, 1), } go func() { @@ -112,7 +113,7 @@ func (t *terminal) Close() error { } t.closed = true const colorRed = "\033[1;31m" - t.xterm.Call("write", idbblob.FromBlob(blob.NewBytes([]byte("\n\r"+colorRed+"[exited]\n\r")))) + t.xterm.Call("write", idbblob.FromBlob(blob.NewBytes([]byte("\n\r"+colorRed+"[exited]\n\r"))).JSValue()) var err error for _, closer := range t.closables { cErr := closer() @@ -130,7 +131,7 @@ func (t *terminal) readOutputPipes(r io.Reader) { _, err := r.Read(buf) switch err { case nil: - t.xterm.Call("write", idbblob.FromBlob(blob.NewBytes(buf))) + t.xterm.Call("write", idbblob.FromBlob(blob.NewBytes(buf)).JSValue()) case io.EOF: t.Close() return diff --git a/cmd/sh/main.go b/cmd/sh/main.go index 11f9656..938b006 100644 --- a/cmd/sh/main.go +++ b/cmd/sh/main.go @@ -1,7 +1,7 @@ package main import ( - "io/ioutil" + "io" "log" "os" @@ -9,7 +9,7 @@ import ( ) func main() { - log.SetOutput(ioutil.Discard) + log.SetOutput(io.Discard) exitCode := hush.Run() os.Exit(exitCode) } diff --git a/go.mod b/go.mod index 57315e8..4497bae 100644 --- a/go.mod +++ b/go.mod @@ -1,15 +1,30 @@ module github.com/hack-pad/hackpad -go 1.16 +go 1.20 require ( github.com/avct/uasurfer v0.0.0-20191028135549-26b5daa857f1 - github.com/hack-pad/go-indexeddb v0.1.0 - github.com/hack-pad/hackpadfs v0.1.2 + github.com/hack-pad/go-indexeddb v0.3.2 + github.com/hack-pad/hackpadfs v0.2.1 github.com/hack-pad/hush v0.1.0 github.com/johnstarich/go/datasize v0.0.1 github.com/machinebox/progress v0.2.0 github.com/pkg/errors v0.9.1 - github.com/stretchr/testify v1.5.1 go.uber.org/atomic v1.6.0 ) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/fatih/color v1.12.0 // indirect + github.com/hack-pad/safejs v0.1.1 // indirect + github.com/matryer/is v1.4.1 // indirect + github.com/mattn/go-colorable v0.1.8 // indirect + github.com/mattn/go-isatty v0.0.12 // indirect + github.com/mattn/go-tty v0.0.3 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/stretchr/objx v0.5.0 // indirect + github.com/stretchr/testify v1.8.2 // indirect + golang.org/x/sys v0.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + mvdan.cc/sh/v3 v3.3.0 // indirect +) diff --git a/go.sum b/go.sum index 954e55c..2a362ea 100644 --- a/go.sum +++ b/go.sum @@ -10,16 +10,16 @@ github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc= github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/google/renameio v1.0.1-0.20210406141108-81588dbe0453 h1:vvZyWjAX9oDB+DWpMsZMyv6Q3NZtim2C5Zcdh+H0OmQ= github.com/google/renameio v1.0.1-0.20210406141108-81588dbe0453/go.mod h1:t/HQoYBZSsWSNK35C6CO/TpPLDVWvxOHboWUAweKUpk= -github.com/hack-pad/go-indexeddb v0.1.0 h1:UzRAl6WiKxLJePkgi2uaQa9MMPWcjO29zI3pt9D+rNs= -github.com/hack-pad/go-indexeddb v0.1.0/go.mod h1:NH8CaojufPNcKYDhy5JkjfyBXE/72oJPeiywlabN/lM= -github.com/hack-pad/hackpadfs v0.1.1 h1:DhzS50ln5XAOxZ0Xlnb/o3P/+MWUqlcbGdOQ5m+Fg6c= -github.com/hack-pad/hackpadfs v0.1.1/go.mod h1:8bsINHOQhQUioUUiCzCyZZNLfEXjs0RwBIf3lTG+CEg= -github.com/hack-pad/hackpadfs v0.1.2 h1:ZsHfvrNAMNNBVLMKprOiN2rLD37x+YGj3QPJrhUdRF4= -github.com/hack-pad/hackpadfs v0.1.2/go.mod h1:8bsINHOQhQUioUUiCzCyZZNLfEXjs0RwBIf3lTG+CEg= -github.com/hack-pad/hush v0.0.0-20210730065049-bd589dbef3a3 h1:0WBvEONkD8zXBRe7+5+mp34L2Upmok0yPKvOqOzpksw= -github.com/hack-pad/hush v0.0.0-20210730065049-bd589dbef3a3/go.mod h1:NqjEIfyA2YtlnEPlI/1K3tNuyXGByWFadPxPlGrDPms= +github.com/hack-pad/go-indexeddb v0.3.2 h1:DTqeJJYc1usa45Q5r52t01KhvlSN02+Oq+tQbSBI91A= +github.com/hack-pad/go-indexeddb v0.3.2/go.mod h1:QvfTevpDVlkfomY498LhstjwbPW6QC4VC/lxYb0Kom0= +github.com/hack-pad/hackpadfs v0.2.1 h1:FelFhIhv26gyjujoA/yeFO+6YGlqzmc9la/6iKMIxMw= +github.com/hack-pad/hackpadfs v0.2.1/go.mod h1:khQBuCEwGXWakkmq8ZiFUvUZz84ZkJ2KNwKvChs4OrU= github.com/hack-pad/hush v0.1.0 h1:lm/iUaRpVsKkpbN6U9wf45arVnCXzTqsMG1jyihIgkI= github.com/hack-pad/hush v0.1.0/go.mod h1:NqjEIfyA2YtlnEPlI/1K3tNuyXGByWFadPxPlGrDPms= +github.com/hack-pad/safejs v0.1.0 h1:qPS6vjreAqh2amUqj4WNG1zIw7qlRQJ9K10eDKMCnE8= +github.com/hack-pad/safejs v0.1.0/go.mod h1:HdS+bKF1NrE72VoXZeWzxFOVQVUSqZJAG0xNCnb+Tio= +github.com/hack-pad/safejs v0.1.1 h1:d5qPO0iQ7h2oVtpzGnLExE+Wn9AtytxIfltcS2b9KD8= +github.com/hack-pad/safejs v0.1.1/go.mod h1:HdS+bKF1NrE72VoXZeWzxFOVQVUSqZJAG0xNCnb+Tio= github.com/johnstarich/go/datasize v0.0.1 h1:Hjswen8gwmO7trXtQ8Xl8NUOQAKKm1wvus3/xK5eHGY= github.com/johnstarich/go/datasize v0.0.1/go.mod h1:4eHLMGz7Q5uCmZeS9rZdahvAih1QmBg1EW3bBXTJpi4= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -32,8 +32,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/machinebox/progress v0.2.0 h1:7z8+w32Gy1v8S6VvDoOPPBah3nLqdKjr3GUly18P8Qo= github.com/machinebox/progress v0.2.0/go.mod h1:hl4FywxSjfmkmCrersGhmJH7KwuKl+Ueq9BXkOny+iE= -github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ= +github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -55,15 +55,23 @@ github.com/rogpeppe/go-internal v1.7.0 h1:3qqXGV8nn7GJT65debw77Dzrx9sfWYgP0DDo7x github.com/rogpeppe/go-internal v1.7.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -78,26 +86,28 @@ golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324 h1:pAwJxDByZctfPwzlNGrDN2BQLsdPb9NkhoTJtUkAO28= golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20210503060354-a79de5458b56 h1:b8jxX3zqjpqb2LklXPzKSGJhzyxCOZSz8ncv8Nv+y7w= golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c h1:IGkKhmfzcztjm6gYkykvu/NiS8kaqbCWAEWWAyf8J5U= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.5.0 h1:+bSpV5HIeWkuvgaMfI3UmKRThoTA5ODJTUd8T17NO+4= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= mvdan.cc/editorconfig v0.2.0 h1:XL+7ys6ls/RKrkUNFQvEwIvNHh+JKx8Mj1pUV5wQxQE= mvdan.cc/editorconfig v0.2.0/go.mod h1:lvnnD3BNdBYkhq+B4uBuFFKatfp02eB6HixDvEz91C0= mvdan.cc/sh/v3 v3.3.0 h1:ujzElMnry63f4I5sjPFxzo6xia+gwsHZM0yyauuyZ6k= diff --git a/http_get.go b/http_get.go index d00aaa0..1004e24 100644 --- a/http_get.go +++ b/http_get.go @@ -1,3 +1,4 @@ +//go:build js // +build js package main diff --git a/install.go b/install.go index 3d61311..3f856ff 100644 --- a/install.go +++ b/install.go @@ -1,3 +1,4 @@ +//go:build js // +build js package main @@ -25,7 +26,7 @@ func installFunc(this js.Value, args []js.Value) interface{} { } resolve(nil) }() - return prom + return prom.JSValue() } func install(args []js.Value) error { diff --git a/internal/common/js.go b/internal/common/js.go index 07bc0ae..b4f4f23 100644 --- a/internal/common/js.go +++ b/internal/common/js.go @@ -1,3 +1,4 @@ +//go:build js // +build js package common diff --git a/internal/console/js_console.go b/internal/console/js_console.go index 8f9b6cb..633ea58 100644 --- a/internal/console/js_console.go +++ b/internal/console/js_console.go @@ -1,3 +1,4 @@ +//go:build js && wasm // +build js,wasm package console diff --git a/internal/console/writer_elem.go b/internal/console/writer_elem.go index 8fffd70..7560a37 100644 --- a/internal/console/writer_elem.go +++ b/internal/console/writer_elem.go @@ -1,3 +1,4 @@ +//go:build js && wasm // +build js,wasm package console diff --git a/internal/fs/download.go b/internal/fs/download.go index e64647f..26d127f 100644 --- a/internal/fs/download.go +++ b/internal/fs/download.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs diff --git a/internal/fs/file_descriptors_js.go b/internal/fs/file_descriptors_js.go index 830d141..e5bf644 100644 --- a/internal/fs/file_descriptors_js.go +++ b/internal/fs/file_descriptors_js.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs diff --git a/internal/fs/fs_js.go b/internal/fs/fs_js.go index 526ab9b..c84fc05 100644 --- a/internal/fs/fs_js.go +++ b/internal/fs/fs_js.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs diff --git a/internal/fs/fs_other.go b/internal/fs/fs_other.go index c3d5b35..2b9f628 100644 --- a/internal/fs/fs_other.go +++ b/internal/fs/fs_other.go @@ -1,3 +1,4 @@ +//go:build !js // +build !js package fs diff --git a/internal/fs/pipe.go b/internal/fs/pipe.go index e4ddb39..dd6c80f 100644 --- a/internal/fs/pipe.go +++ b/internal/fs/pipe.go @@ -38,8 +38,6 @@ func newPipe(newFID func() FID) (r, w *fileDescriptor) { } type pipeChan struct { - unimplementedFile - buf chan byte done chan struct{} reader, writer FID diff --git a/internal/fs/wasm_cache.go b/internal/fs/wasm_cache.go index fce0589..bc1f8fc 100644 --- a/internal/fs/wasm_cache.go +++ b/internal/fs/wasm_cache.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs diff --git a/internal/global/init.go b/internal/global/init.go index 16840a8..78b08ba 100644 --- a/internal/global/init.go +++ b/internal/global/init.go @@ -1,3 +1,4 @@ +//go:build js // +build js package global diff --git a/internal/interop/download.go b/internal/interop/download.go index a8d2d83..aa7458f 100644 --- a/internal/interop/download.go +++ b/internal/interop/download.go @@ -1,3 +1,4 @@ +//go:build js // +build js package interop diff --git a/internal/interop/error_js.go b/internal/interop/error_js.go index e1ca60c..f2d5c16 100644 --- a/internal/interop/error_js.go +++ b/internal/interop/error_js.go @@ -1,3 +1,4 @@ +//go:build js // +build js package interop @@ -9,13 +10,13 @@ import ( "github.com/pkg/errors" ) -func WrapAsJSError(err error, message string) error { +func WrapAsJSError(err error, message string) js.Value { return wrapAsJSError(err, message) } -func wrapAsJSError(err error, message string, args ...js.Value) error { +func wrapAsJSError(err error, message string, args ...js.Value) js.Value { if err == nil { - return nil + return js.Null() } errMessage := errors.Wrap(err, message).Error() @@ -23,9 +24,8 @@ func wrapAsJSError(err error, message string, args ...js.Value) error { errMessage += fmt.Sprintf("\n%v", arg) } - val := js.ValueOf(map[string]interface{}{ + return js.ValueOf(map[string]interface{}{ "message": js.ValueOf(errMessage), "code": js.ValueOf(mapToErrNo(err, errMessage)), }) - return js.Error{Value: val} } diff --git a/internal/interop/event.go b/internal/interop/event.go index 8e0748a..5132115 100644 --- a/internal/interop/event.go +++ b/internal/interop/event.go @@ -1,3 +1,4 @@ +//go:build js // +build js package interop @@ -21,17 +22,8 @@ func NewEventTarget() EventTarget { } type Event struct { - Target js.Value - Type string - stopPropagation bool -} - -func (e Event) StopPropagation() { - e.stopPropagation = true -} - -func (e Event) Stopped() bool { - return e.stopPropagation + Target js.Value + Type string } type eventTarget struct { diff --git a/internal/interop/funcs.go b/internal/interop/funcs.go index 4881c7a..9e37e60 100644 --- a/internal/interop/funcs.go +++ b/internal/interop/funcs.go @@ -1,3 +1,4 @@ +//go:build js // +build js package interop @@ -68,8 +69,8 @@ func setFuncHandler(name string, fn interface{}, args []js.Value) (returnedVal i }() ret, err = fn(args) - err = wrapAsJSError(err, name, args...) - ret = append([]interface{}{err}, ret...) + errValue := wrapAsJSError(err, name, args...) + ret = append([]interface{}{errValue}, ret...) callback.Invoke(ret...) }() return nil diff --git a/internal/interop/load.go b/internal/interop/load.go index c04ec63..d23e168 100644 --- a/internal/interop/load.go +++ b/internal/interop/load.go @@ -1,3 +1,4 @@ +//go:build js // +build js package interop diff --git a/internal/interop/once_func.go b/internal/interop/once_func.go index 9f24635..983b107 100644 --- a/internal/interop/once_func.go +++ b/internal/interop/once_func.go @@ -1,3 +1,4 @@ +//go:build js // +build js package interop diff --git a/internal/interop/profile.go b/internal/interop/profile.go index 3b488ff..eecd6a6 100644 --- a/internal/interop/profile.go +++ b/internal/interop/profile.go @@ -1,3 +1,4 @@ +//go:build js // +build js package interop @@ -18,8 +19,8 @@ func ProfileJS(this js.Value, args []js.Value) interface{} { go func() { MemoryProfileJS(this, args) // Re-enable once these profiles actually work in the browser. Currently produces 0 samples. - //TraceProfileJS(this, args) - //StartCPUProfileJS(this, args) + // TraceProfileJS(this, args) + // StartCPUProfileJS(this, args) }() return nil } diff --git a/internal/interop/value_caches.go b/internal/interop/value_caches.go index fb39fd8..3477c44 100644 --- a/internal/interop/value_caches.go +++ b/internal/interop/value_caches.go @@ -1,3 +1,4 @@ +//go:build js // +build js package interop diff --git a/internal/interop/values.go b/internal/interop/values.go index eaf09af..d0e14a9 100644 --- a/internal/interop/values.go +++ b/internal/interop/values.go @@ -1,3 +1,4 @@ +//go:build js // +build js package interop diff --git a/internal/js/fs/chmod.go b/internal/js/fs/chmod.go index 6977ba5..ac51928 100644 --- a/internal/js/fs/chmod.go +++ b/internal/js/fs/chmod.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs diff --git a/internal/js/fs/chown.go b/internal/js/fs/chown.go index 779671a..c00b726 100644 --- a/internal/js/fs/chown.go +++ b/internal/js/fs/chown.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs diff --git a/internal/js/fs/close.go b/internal/js/fs/close.go index c1c8919..f7c96d7 100644 --- a/internal/js/fs/close.go +++ b/internal/js/fs/close.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs diff --git a/internal/js/fs/fchmod.go b/internal/js/fs/fchmod.go index 8c04fa5..00681c6 100644 --- a/internal/js/fs/fchmod.go +++ b/internal/js/fs/fchmod.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs diff --git a/internal/js/fs/flock.go b/internal/js/fs/flock.go index cf9f041..5957aab 100644 --- a/internal/js/fs/flock.go +++ b/internal/js/fs/flock.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs diff --git a/internal/js/fs/fs.go b/internal/js/fs/fs.go index 3d84e68..efaac7a 100644 --- a/internal/js/fs/fs.go +++ b/internal/js/fs/fs.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs @@ -118,9 +119,9 @@ func destroyMount(this js.Value, args []js.Value) interface{} { resolve, reject, prom := promise.New() mountPath := args[0].String() go func() { - err := interop.WrapAsJSError(fs.DestroyMount(mountPath), "destroyMount") - if err != nil { - reject(err) + jsErr := interop.WrapAsJSError(fs.DestroyMount(mountPath), "destroyMount") + if jsErr.Type() != js.TypeNull { + reject(jsErr) } else { resolve(nil) } diff --git a/internal/js/fs/fstat.go b/internal/js/fs/fstat.go index aed0af1..635452d 100644 --- a/internal/js/fs/fstat.go +++ b/internal/js/fs/fstat.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs diff --git a/internal/js/fs/fsync.go b/internal/js/fs/fsync.go index a42fd37..83c6475 100644 --- a/internal/js/fs/fsync.go +++ b/internal/js/fs/fsync.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs diff --git a/internal/js/fs/ftruncate.go b/internal/js/fs/ftruncate.go index cf8d478..401b052 100644 --- a/internal/js/fs/ftruncate.go +++ b/internal/js/fs/ftruncate.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs diff --git a/internal/js/fs/lstat.go b/internal/js/fs/lstat.go index 402c65a..dd766f4 100644 --- a/internal/js/fs/lstat.go +++ b/internal/js/fs/lstat.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs diff --git a/internal/js/fs/mkdir.go b/internal/js/fs/mkdir.go index 34a9cde..5825d59 100644 --- a/internal/js/fs/mkdir.go +++ b/internal/js/fs/mkdir.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs diff --git a/internal/js/fs/open.go b/internal/js/fs/open.go index 6d48057..cbd36ce 100644 --- a/internal/js/fs/open.go +++ b/internal/js/fs/open.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs @@ -31,5 +32,5 @@ func openSync(args []js.Value) (interface{}, error) { p := process.Current() fd, err := p.Files().Open(path, flags, mode) - return fd, err + return fd.JSValue(), err } diff --git a/internal/js/fs/overlay.go b/internal/js/fs/overlay.go index d7ab43b..aa94ee9 100644 --- a/internal/js/fs/overlay.go +++ b/internal/js/fs/overlay.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs @@ -37,7 +38,7 @@ func overlayIndexedDB(this js.Value, args []js.Value) interface{} { resolve(nil) } }() - return prom + return prom.JSValue() } func OverlayIndexedDB(args []js.Value) (err error) { @@ -76,7 +77,7 @@ func overlayTarGzip(this js.Value, args []js.Value) interface{} { resolve(nil) } }() - return prom + return prom.JSValue() } func OverlayTarGzip(args []js.Value) error { diff --git a/internal/js/fs/pipe.go b/internal/js/fs/pipe.go index 52808fc..4880555 100644 --- a/internal/js/fs/pipe.go +++ b/internal/js/fs/pipe.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs @@ -20,5 +21,5 @@ func pipeSync(args []js.Value) (interface{}, error) { } p := process.Current() fds := p.Files().Pipe() - return []interface{}{fds[0], fds[1]}, nil + return []interface{}{fds[0].JSValue(), fds[1].JSValue()}, nil } diff --git a/internal/js/fs/read.go b/internal/js/fs/read.go index ce69947..21b76bb 100644 --- a/internal/js/fs/read.go +++ b/internal/js/fs/read.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs diff --git a/internal/js/fs/readdir.go b/internal/js/fs/readdir.go index c06ca17..17e0c44 100644 --- a/internal/js/fs/readdir.go +++ b/internal/js/fs/readdir.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs diff --git a/internal/js/fs/rename.go b/internal/js/fs/rename.go index 86731cf..aac86ac 100644 --- a/internal/js/fs/rename.go +++ b/internal/js/fs/rename.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs diff --git a/internal/js/fs/rmdir.go b/internal/js/fs/rmdir.go index f15e5cf..e3a518f 100644 --- a/internal/js/fs/rmdir.go +++ b/internal/js/fs/rmdir.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs diff --git a/internal/js/fs/stat.go b/internal/js/fs/stat.go index 1abdb85..64be1ed 100644 --- a/internal/js/fs/stat.go +++ b/internal/js/fs/stat.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs @@ -35,13 +36,13 @@ var ( }) ) -func jsStat(info os.FileInfo) interface{} { +func jsStat(info os.FileInfo) js.Value { if info == nil { - return nil + return js.Null() } const blockSize = 4096 // TODO find useful value for blksize modTime := info.ModTime().UnixNano() / 1e6 - return map[string]interface{}{ + return js.ValueOf(map[string]interface{}{ "dev": 0, "ino": 0, "mode": jsMode(info.Mode()), @@ -63,7 +64,7 @@ func jsStat(info os.FileInfo) interface{} { "isFile": jsBoolFunc(info.Mode().IsRegular()), "isSocket": funcFalse, "isSymbolicLink": jsBoolFunc(info.Mode()&os.ModeSymlink == os.ModeSymlink), - } + }) } var modeBitTranslation = map[os.FileMode]uint32{ diff --git a/internal/js/fs/unlink.go b/internal/js/fs/unlink.go index 4f396cc..aaa7847 100644 --- a/internal/js/fs/unlink.go +++ b/internal/js/fs/unlink.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs diff --git a/internal/js/fs/utimes.go b/internal/js/fs/utimes.go index 70765e7..5e1e9eb 100644 --- a/internal/js/fs/utimes.go +++ b/internal/js/fs/utimes.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs diff --git a/internal/js/fs/write.go b/internal/js/fs/write.go index 053d981..361757b 100644 --- a/internal/js/fs/write.go +++ b/internal/js/fs/write.go @@ -1,3 +1,4 @@ +//go:build js // +build js package fs @@ -45,5 +46,5 @@ func write(args []js.Value) ([]interface{}, error) { p := process.Current() n, err := p.Files().Write(fd, buffer, offset, length, position) - return []interface{}{n, buffer}, err + return []interface{}{n, buffer.JSValue()}, err } diff --git a/internal/js/process/dir.go b/internal/js/process/dir.go index e29cf96..b3ca96b 100644 --- a/internal/js/process/dir.go +++ b/internal/js/process/dir.go @@ -1,3 +1,4 @@ +//go:build js // +build js package process diff --git a/internal/js/process/groups.go b/internal/js/process/groups.go index 097cc96..dffca5e 100644 --- a/internal/js/process/groups.go +++ b/internal/js/process/groups.go @@ -1,3 +1,4 @@ +//go:build js // +build js package process diff --git a/internal/js/process/process.go b/internal/js/process/process.go index f687eae..c46b156 100644 --- a/internal/js/process/process.go +++ b/internal/js/process/process.go @@ -1,3 +1,4 @@ +//go:build js // +build js package process @@ -26,8 +27,8 @@ func Init() { interop.SetFunc(jsProcess, "getgid", getegid) interop.SetFunc(jsProcess, "getegid", getegid) interop.SetFunc(jsProcess, "getgroups", getgroups) - jsProcess.Set("pid", currentProcess.PID()) - jsProcess.Set("ppid", currentProcess.ParentPID()) + jsProcess.Set("pid", currentProcess.PID().JSValue()) + jsProcess.Set("ppid", currentProcess.ParentPID().JSValue()) interop.SetFunc(jsProcess, "umask", umask) interop.SetFunc(jsProcess, "cwd", cwd) interop.SetFunc(jsProcess, "chdir", chdir) @@ -35,14 +36,14 @@ func Init() { globals.Set("child_process", map[string]interface{}{}) childProcess := globals.Get("child_process") interop.SetFunc(childProcess, "spawn", spawn) - //interop.SetFunc(childProcess, "spawnSync", spawnSync) // TODO is there any way to run spawnSync so we don't hit deadlock? + // interop.SetFunc(childProcess, "spawnSync", spawnSync) // TODO is there any way to run spawnSync so we don't hit deadlock? interop.SetFunc(childProcess, "wait", wait) interop.SetFunc(childProcess, "waitSync", waitSync) } func switchedContext(pid, ppid process.PID) { - jsProcess.Set("pid", pid) - jsProcess.Set("ppid", ppid) + jsProcess.Set("pid", pid.JSValue()) + jsProcess.Set("ppid", ppid.JSValue()) } func Dump() interface{} { diff --git a/internal/js/process/spawn.go b/internal/js/process/spawn.go index 81c487b..ee544b3 100644 --- a/internal/js/process/spawn.go +++ b/internal/js/process/spawn.go @@ -1,3 +1,4 @@ +//go:build js // +build js package process @@ -35,12 +36,16 @@ func spawn(args []js.Value) (interface{}, error) { return Spawn(command, argv, procAttr) } -func Spawn(command string, args []string, attr *process.ProcAttr) (process.Process, error) { +type jsWrapper interface { + JSValue() js.Value +} + +func Spawn(command string, args []string, attr *process.ProcAttr) (js.Value, error) { p, err := process.New(command, args, attr) if err != nil { - return p, err + return js.Value{}, err } - return p, p.Start() + return p.(jsWrapper).JSValue(), p.Start() } func parseProcAttr(defaultCommand string, value js.Value) (argv0 string, attr *process.ProcAttr) { diff --git a/internal/js/process/umask.go b/internal/js/process/umask.go index 55b37d4..3b5da65 100644 --- a/internal/js/process/umask.go +++ b/internal/js/process/umask.go @@ -1,3 +1,4 @@ +//go:build js // +build js package process diff --git a/internal/js/process/wait.go b/internal/js/process/wait.go index 98375cf..5c0b90b 100644 --- a/internal/js/process/wait.go +++ b/internal/js/process/wait.go @@ -1,3 +1,4 @@ +//go:build js // +build js package process @@ -22,10 +23,10 @@ func waitSync(args []js.Value) (interface{}, error) { pid := process.PID(args[0].Int()) waitStatus := new(syscall.WaitStatus) wpid, err := Wait(pid, waitStatus, 0, nil) - return map[string]interface{}{ - "pid": wpid, + return js.ValueOf(map[string]interface{}{ + "pid": wpid.JSValue(), "exitCode": waitStatus.ExitStatus(), - }, err + }), err } func Wait(pid process.PID, wstatus *syscall.WaitStatus, options int, rusage *syscall.Rusage) (wpid process.PID, err error) { diff --git a/internal/log/js_log.go b/internal/log/js_log.go index d59c394..5373b92 100644 --- a/internal/log/js_log.go +++ b/internal/log/js_log.go @@ -1,15 +1,18 @@ +//go:build js && wasm // +build js,wasm package log import ( + "fmt" "syscall/js" "github.com/hack-pad/hackpad/internal/global" + "github.com/hack-pad/safejs" ) var ( - console = js.Global().Get("console") + console = safejs.MustGetGlobal("console") ) const logLevelKey = "logLevel" @@ -53,10 +56,18 @@ func logJSValues(kind consoleType, args ...interface{}) int { if kind < logLevel { return 0 } - console.Call(kind.String(), args...) + var jsArgs []interface{} + for _, arg := range args { + jsArg, err := safejs.ValueOf(arg) + if err != nil { + jsArg = safejs.Safe(js.ValueOf(fmt.Sprintf("LOGERR(%s: %T %+v)", err, arg, arg))) + } + jsArgs = append(jsArgs, jsArg) + } + _, _ = console.Call(kind.String(), jsArgs...) return 0 } func writeLog(c consoleType, s string) { - console.Call(c.String(), s) + _, _ = console.Call(c.String(), s) } diff --git a/internal/log/other_log.go b/internal/log/other_log.go index 183b3d9..4cecda3 100644 --- a/internal/log/other_log.go +++ b/internal/log/other_log.go @@ -1,3 +1,4 @@ +//go:build !js // +build !js package log diff --git a/internal/process/process_js.go b/internal/process/process_js.go index 3b152d7..d0f0981 100644 --- a/internal/process/process_js.go +++ b/internal/process/process_js.go @@ -1,3 +1,4 @@ +//go:build js // +build js package process @@ -14,8 +15,8 @@ var ( func (p *process) JSValue() js.Value { return js.ValueOf(map[string]interface{}{ - "pid": p.pid, - "ppid": p.parentPID, + "pid": p.pid.JSValue(), + "ppid": p.parentPID.JSValue(), "error": interop.WrapAsJSError(p.err, "spawn"), }) } diff --git a/internal/process/process_other.go b/internal/process/process_other.go index 867ede1..0511890 100644 --- a/internal/process/process_other.go +++ b/internal/process/process_other.go @@ -1,3 +1,4 @@ +//go:build !js // +build !js package process diff --git a/internal/process/wasm.go b/internal/process/wasm.go index 058a7a1..eb20df1 100644 --- a/internal/process/wasm.go +++ b/internal/process/wasm.go @@ -1,3 +1,4 @@ +//go:build js // +build js package process diff --git a/internal/promise/js.go b/internal/promise/js.go index 88fe6b7..eaf574c 100644 --- a/internal/promise/js.go +++ b/internal/promise/js.go @@ -1,3 +1,4 @@ +//go:build js // +build js package promise diff --git a/internal/terminal/term.go b/internal/terminal/term.go index f717d32..9545346 100644 --- a/internal/terminal/term.go +++ b/internal/terminal/term.go @@ -1,3 +1,4 @@ +//go:build js // +build js package terminal diff --git a/main.go b/main.go index 6b9661e..158b397 100644 --- a/main.go +++ b/main.go @@ -1,3 +1,4 @@ +//go:build js // +build js package main