Веб-сокеты через WebAssembly, сгенерированные golang?

Можно ли написать клиент 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

Вы должны взглянуть на пример клиента: github.com/gorilla/websocket/blob/master/examples/echo/…

hewiefreeman 18.04.2019 23:36

@ newplayer65 Спасибо, но я знаю, как реализовать клиент, как видите, я делаю то же самое, что и в строке 32 в примере. Собственно речь не о библиотеке, а больше о go и wasm.

Brad 19.04.2019 05:28
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
5
2
5 095
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Посмотрите на файл библиотека веб-сокетов gopherJS. Этот был создан для работы в браузере (первоначально js).

Недавно я видел на YouTube видео, в котором он используется в WASM, но больше не смог его найти.

Я посмотрел, довольно интересно. У вас есть представление о том, в чем разница между gopherjs/js и syscall/js, какой из них лучше всего подходит для wasm, из документа кажется, что syscall/js

Brad 22.04.2019 10:55

Поддержка gopherjs и wasm для go создана Richard Musiol. syscall/js адаптирован для wasm, поэтому я бы использовал его.

TehSphinX 22.04.2019 18:05

@tehspinx да, а также после некоторых исследований я узнал, что gopher/js умирает, так что да, системный вызов/js был бы рациональным выбором

Brad 22.04.2019 20:18

да... зачем компилировать в js, если можно компилировать в wasm :D

TehSphinX 24.04.2019 08:33
Ответ принят как подходящий

Я решил эту проблему, извлекая объект 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. Потому что вы должны вызвать снаружи, и это то, что вы делаете.

Lee 23.04.2019 09:10

быстрое примечание, js.TypedArrayOf больше не существует. вы можете просто отправить строку в ws.Call("отправить", "сообщение")

Pizza lord 26.09.2019 11:37

gorilla/websocket не поддерживает веб-сборку. В итоге я использовал нхуир/вебсокет, который поддерживает wasm.

У вас случайно нет примера клиента, работающего с nhooyr/websocket в wasm?

Phrozen 20.11.2020 09:31

Я бы тоже хотел это увидеть :)

mama 28.03.2021 15:04

Другие вопросы по теме