all goroutines are dead asleep - deadlock! wasm docs
- 主要语言
- Go
- 星标
- 5.5k
- 派生
- 376
- PR 合并指标
- 30 天内没有已合并 PR
描述
I'm trying to do the next:
### Client Code:
```go
//go:build js && wasm
package main
import (
"context"
"log"
"syscall/js"
"nhooyr.io/websocket"
)
func main() {
ctx := context.Background()
window := js.Global()
window.Set("goWS", js.FuncOf(func(_ js.Value, args []js.Value) any {
conn, _, err := websocket.Dial(ctx, args[0].String(), nil)
if err != nil {
log.Fatal(err)
}
goWSObject := window.Get("goWS")
goWSObject.Set("send", js.FuncOf(func(_ js.Value, args []js.Value) any {
if err := conn.Write(ctx, websocket.MessageText, []byte(args[0].String())); err != nil {
log.Fatal(err)
}
return nil
}))
goWSObject.Set("waitMessage", js.FuncOf(func(_ js.Value, _ []js.Value) any {
_, bb, err := conn.Read(ctx)
if err != nil {
log.Fatal(err)
}
return bb
}))
return nil
}))
waitCh := make(chan struct{})
<-waitCh
}
```
### `index.html`:
```html
goWS
const go = new Go();
WebAssembly.instantiateStreaming(fetch("/assets/app.wasm"), go.importObject)
.then(res => go.run(res.instance))
```
### Server code:
```go
package main
import (
"context"
"net/http"
"nhooyr.io/websocket"
)
func main() {
ctx := context.Background()
http.HandleFunc("/ws-chat", func(w http.ResponseWriter, r *http.Request) {
conn, err := websocket.Accept(w, r, &websocket.AcceptOptions{
InsecureSkipVerify: true,
})
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
_, bb, err := conn.Read(ctx)
if err != nil {
conn.Close(websocket.StatusInternalError, err.Error())
return
}
wr, err := conn.Writer(ctx, websocket.MessageText)
if err != nil {
conn.Close(websocket.StatusInternalError, err.Error())
return
}
wr.Write(bb)
wr.Close()
conn.CloseNow()
})
http.ListenAndServe(":8080", http.DefaultServeMux)
}
```
Also I'm going to attach my Makefile so you can see the commands when I'm compiling:
```make
build_client:
GOOS=js GOARCH=wasm go build -o dist/assets/app.wasm cmd/go-ws-client/main.go
cp $(go env GOROOT)/misc/wasm/wasm_exec.js dist/assets/
build_server:
go build -o dist/bin/app-server cmd/go-ws-server/main.go
```
### Structure of `dist` folder:
```
dist/
- assets/
- app.wasm
- wasm_exec.js
- bin/
- app-server
- index.html
```
But i'm getting the following errors after calling `window.goWS("ws://localhost:8080/ws-chat")` from the firefox browser's console:
### Console:
```
> window.goWS("ws://localhost:8080/ws-chat")
fatal error: all goroutines are asleep - deadlock! wasm_exec.js:22:14
wasm_exec.js:22:14
goroutine 1 [chan receive]: wasm_exec.js:22:14
main.main() wasm_exec.js:22:14
/home/oscar/Escritorio/proyecto-react/cmd/go-ws-client/main.go:47 +0xc wasm_exec.js:22:14
wasm_exec.js:22:14
goroutine 7 [select]: wasm_exec.js:22:14
nhooyr.io/websocket.dial({0x5aa80, 0x1430050}, {0x1466020, 0x1b}, 0x0) wasm_exec.js:22:14
/home/oscar/go/pkg/mod/nhooyr.io/websocket@v1.8.10/ws_js.go:320 +0x1c wasm_exec.js:22:14
nhooyr.io/websocket.Dial({0x5aa80, 0x1430050}, {0x1466020, 0x1b}, 0x0) wasm_exec.js:22:14
/home/oscar/go/pkg/mod/nhooyr.io/websocket@v1.8.10/ws_js.go:289 +0x2 wasm_exec.js:22:14
main.main.func1.1({{}, 0x0, 0x0}, {0x140e0f0, 0x1, 0x1}) wasm_exec.js:22:14
/home/oscar/Escritorio/proyecto-react/cmd/go-ws-client/main.go:19 +0x4 wasm_exec.js:22:14
syscall/js.handleEvent() wasm_exec.js:22:14
/usr/local/go/src/syscall/js/func.go:100 +0x26 wasm_exec.js:22:14
exit code: 2 wasm_exec.js:101:14
undefined
```
贡献指南
这个仓库没有索引到贡献指南
调研方向
从 cmd/go-ws-client/main.go 开始,使用提供的 index.html 和 Makefile 命令重现 window.goWS("ws://localhost:8080/ws-chat") 调用。然后检查报告的 Dial 堆栈帧附近的 ws_js.go,并将 WebAssembly 的行为与服务器示例进行比较。当 deadlock 得到解释,并且 issue 中记录的用法或复现步骤得到修正和验证后,即可视为完成。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- go, wasm
- 领域
- networking
- Issue 类型
- 缺陷
- 难度
- 3/5
- 预计耗时
- 1-2 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 30/100