all goroutines are dead asleep - deadlock! wasm docs
- Langage dominant
- Go
- Étoiles
- 5.5k
- Forks
- 372
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Description
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
```
Guide de contribution
Aucun guide de contribution indexé pour ce dépôt
Piste de recherche
Commencez par cmd/go-ws-client/main.go et reproduisez l’appel window.goWS("ws://localhost:8080/ws-chat") à l’aide de l’index.html et des commandes Makefile fournis. Inspectez ensuite ws_js.go autour de la stack frame Dial signalée et comparez le comportement de WebAssembly avec l’exemple de serveur. La tâche est terminée lorsque le deadlock est expliqué et que l’utilisation documentée ou la reproduction de l’issue est corrigée et vérifiée.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- go, wasm
- Domaine
- networking
- Type d'issue
- Bug
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 30/100