Можно ли написать клиент Websocket в wasm поверх go? Я пытался использовать gorilla/websocket, но безуспешно:
func main() {
ws := func(this js.Value, inputs []js.Value) interface{} {
go func() {
wsDial, r, err := websocket.DefaultDialer.Dial("ws://localhost:3000/ws", nil)
fmt.Println(wsDial, r, err)
}()
return nil
}
js.Global().Set("ws", js.FuncOf(ws))
select {}
}
Я получаю следующую ошибку при вызове ws():
dial tcp: Protocol not available
@ newplayer65 Спасибо, но я знаю, как реализовать клиент, как видите, я делаю то же самое, что и в строке 32 в примере. Собственно речь не о библиотеке, а больше о go и wasm.

Посмотрите на файл библиотека веб-сокетов gopherJS. Этот был создан для работы в браузере (первоначально js).
Недавно я видел на YouTube видео, в котором он используется в WASM, но больше не смог его найти.
Я посмотрел, довольно интересно. У вас есть представление о том, в чем разница между gopherjs/js и syscall/js, какой из них лучше всего подходит для wasm, из документа кажется, что syscall/js
Поддержка gopherjs и wasm для go создана Richard Musiol. syscall/js адаптирован для wasm, поэтому я бы использовал его.
@tehspinx да, а также после некоторых исследований я узнал, что gopher/js умирает, так что да, системный вызов/js был бы рациональным выбором
да... зачем компилировать в js, если можно компилировать в wasm :D
Я решил эту проблему, извлекая объект WebSocket из глобального объекта JavaScript, в моем случае это window, потому что я запускаю его в браузере. Я использовал только библиотеку "syscall/js". Это выглядит так:
ws := js.Global().Get("WebSocket").New("ws://localhost:8080/ws")
ws.Call("addEventListener", "open", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
fmt.Println("open")
ws.Call("send", js.TypedArrayOf([]byte{123}))
return nil
}))
Это кажется правильным, потому что внутри WASM невозможно создать объект WebSocket. Потому что вы должны вызвать снаружи, и это то, что вы делаете.
быстрое примечание, js.TypedArrayOf больше не существует. вы можете просто отправить строку в ws.Call("отправить", "сообщение")
gorilla/websocket не поддерживает веб-сборку. В итоге я использовал нхуир/вебсокет, который поддерживает wasm.
У вас случайно нет примера клиента, работающего с nhooyr/websocket в wasm?
Я бы тоже хотел это увидеть :)
Вы должны взглянуть на пример клиента: github.com/gorilla/websocket/blob/master/examples/echo/…