Dear beings, I couldn't find a JavaScript WebSocket library for my beloved language Nim. It's nothing complicated, so I wrote one myself.
import std/dom
import std/jsffi
type
WebSocket* = ref object of RootObj
MessageEvent* = ref object of Event
MessageEventTarget* = proc(ev: MessageEvent) {.closure.}
WebSocketEvent* {.pure.} = enum
Open = "open"
Message = "message"
Close = "close"
Error = "error"
proc newWebSocket*(url: cstring): WebSocket {.importcpp: "new WebSocket(#)".}
## Vytvoří nový WebSocket připojený k zadané URL
proc readyState*(ws: WebSocket): cint {.importcpp: "#.readyState".}
## Vrátí aktuální stav připojení
proc send*(ws: WebSocket, data: cstring) {.importcpp: "#.send(#)".}
## Odešle data přes WebSocket
proc close*(ws: WebSocket) {.importcpp: "#.close()".}
## Uzavře WebSocket připojení
# Konstanty pro readyState
const
CONNECTING* = 0.cint
OPEN* = 1.cint
CLOSING* = 2.cint
CLOSED* = 3.cint
# Vlastnosti jako property
proc `onopen=`*(ws: WebSocket, cb: MessageEventTarget) {.importcpp: "#.onopen = #", nodecl.}
proc onopen*(ws: WebSocket): MessageEventTarget {.importcpp: "#.onopen", nodecl.}
proc `onmessage=`*(ws: WebSocket, cb: MessageEventTarget) {.importcpp: "#.onmessage = #", nodecl.}
proc onmessage*(ws: WebSocket): MessageEventTarget {.importcpp: "#.onmessage", nodecl.}
proc `onclose=`*(ws: WebSocket, cb: MessageEventTarget) {.importcpp: "#.onclose = #", nodecl.}
proc onclose*(ws: WebSocket): MessageEventTarget {.importcpp: "#.onclose", nodecl.}
proc `onerror=`*(ws: WebSocket, cb: MessageEventTarget) {.importcpp: "#.onerror = #", nodecl.}
proc onerror*(ws: WebSocket): MessageEventTarget {.importcpp: "#.onerror", nodecl.}
# Přístup k datům z message eventu
proc data*(ev: MessageEvent): cstring {.importjs: "#.data".}
Why isn't it part of the standard library?
It took me a bit of time to understand how getters and setters work, but after drawing inspiration from std/jsffi and consulting with AI, I finally get it. Hopefully, I've got it right.