Comments (8)
Unrelated to this library, see golang/go#41310
from websocket.
I don't know if you are too busy af but I found the answer and I don't know if you have the time to create an example of a ping pong websocket client compiled in WASM.
So what I did was to require a callback, passing the message as an argument, the reason is because of async nature of (*Conn) Read()
method, minimal reproduction following:
//go:build js && wasm
package main
import (
"context"
"syscall/js"
"nhooyr.io/websocket"
)
func main() {
ctx := context.Background()
conn, _, err := websocket.Dial(ctx, "ws://localhost:8080/ping-pong", nil)
if err != nil {
panic(err)
}
wr, err := conn.Writer(ctx, websocket.MessageText)
if err != nil {
panic(err)
}
js.Global().Set("sendMessageGo", js.FuncOf(func(_ js.Value, args []js.Value) any {
// args[0] is the string that want to sent to the server
wr.Write([]byte(args[0].String()))
wr.Close()
// spawning a goroutine because of conn.Read() is async, and js functions cannot wait
go func() {
_, bb, err := conn.Read(ctx)
if err != nil {
panic(err)
}
// args[1] is the callback, has the shape (bytes) => {/* any operation with the bytes */}
// passing to the callback the bytes in string format
args[1].Invoke(string(bb))
}()
// the js functions must return inmediatly, cannot wait for async operations
return nil
}))
waitCh := make(chan struct{})
<-waitCh
}
from websocket.
Hmm weird. I have this test here which runs in WASM and requires no extra goroutines. https://github.com/nhooyr/websocket/blob/master/ws_js_test.go
I'm def a little busy to look into exactly what's going on in your example. I'll open this up again and look into it later.
from websocket.
don't worry, I saw in the tests that you are not testing the (*Conn) .Read()
method, it's only dialing to a ws server, no reading
from websocket.
No it is, see this line
Line 32 in e3a2d32
It writes a message and then confirms the same message is read back.
from websocket.
forget it, you are in fact reading in the wstest.Echo, but I think it has something to do when you are binding the Go function with the JS function
from websocket.
I tried this other example and also worked, with Promise object instead of callback for compatibility with async
and await
js keywords:
//go:build js && wasm
package main
import (
"context"
"syscall/js"
"nhooyr.io/websocket"
)
func main() {
ctx := context.Background()
conn, _, err := websocket.Dial(ctx, "ws://localhost:8080/ws-chat", nil)
if err != nil {
panic(err)
}
js.Global().Set("sendMessageGo", js.FuncOf(func(_ js.Value, args []js.Value) any {
wr, err := conn.Writer(ctx, websocket.MessageText)
if err != nil {
panic(err)
}
wr.Write([]byte(args[0].String()))
wr.Close()
// returning a Promise
return js.Global().Get("Promise").New(js.FuncOf(func(_ js.Value, args []js.Value) any {
// args[0] is resolve callback
// args[1] is reject callback
// spawining a goroutine because of conn.Read() blocking nature
go func() {
_, bb, err := conn.Read(ctx)
if err != nil {
// if there is an error, reject the promise, calling the reject callback
args[1].Invoke(err.Error())
return
}
// if there is no error then pass to resolve the bytes that comes from the server
args[0].Invoke(string(bb))
}()
// also the constructor must return inmediatly, cannot wait for async operations
return nil
}))
}))
waitCh := make(chan struct{})
<-waitCh
}
from websocket.
Ah yes I see, you probably can't block in a JS callback so you have to return a promise. That makes sense. We can document it for sure. See also https://www.reddit.com/r/WebAssembly/comments/nm69e8/blocking_calls_in_wasm/
from websocket.
Related Issues (20)
- Can't activate CORS for examples /chat/ HOT 2
- Reader() can only read one message, but Read() can read all messages HOT 5
- Error: panic: unaligned 64-bit atomic operation on arm32-bit while establishing websocket connection HOT 2
- Invalid readme example HOT 3
- Goroutine spike when closing connections in v1.8.10 (regression) HOT 3
- Transmit only single frame in Write when compression enabled too HOT 6
- Data race on `Conn.closeErr` HOT 3
- websocket.Conn.CloseNow() panics in WaitGroup.Wait HOT 2
- failed to get reader: use of closed network connection HOT 3
- Inline part of the full examples HOT 7
- Add custom ping message option to Ping function HOT 1
- failed to WebSocket dial: response body is not a io.ReadWriteCloser: io.nopCloserWriterTo HOT 1
- unsupported permessage-deflate parameter: "client_max_window_bits=15" from client HOT 8
- Update docs and mention explicit close required change in v1.8.11 HOT 16
- panic: sync: WaitGroup is reused before previous Wait has returned HOT 1
- Return net.ErrClosed from Read methods when connection is closed by us HOT 6
- failed: Close received after close HOT 6
- Document wsjson.Read closes the connection with the appropriate close status and error message if bad JSON is read
- Should use path.Match instead of filepath.Match HOT 4
- Compatibility issues HOT 14
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from websocket.