libwebsocket provides WebSocket client and server helpers for Magnolia.
It is a thin wrapper around native runtime built-ins:
ws_dialws_sendws_recvws_closews_listen
ws := import('websocket')
Connects to a WebSocket endpoint.
Success result:
{
type: :ok
socket: {type: :websocket, id: 0}
status: 101
headers: {...}
}
Error result:
{
type: :error
error: '<message>'
status: 0
headers: {}
}
Sends a message.
datamust be a string.opcodedefaults to text (1).
Returns {type: :sent} on success, or {type: :error, error: ...}.
Reads one message.
Message result:
{
type: :message
opcode: 1
data: 'hello'
}
Closed result:
{
type: :closed
code: 1000
reason: ''
}
Error result:
{
type: :error
error: '<message>'
}
Closes the socket. Defaults to close code 1000.
Starts a WebSocket server on host and upgrades requests on path.
onConnect receives one event per successful upgrade:
{
type: :connect
socket: {type: :websocket, id: 1}
req: {
method: 'GET'
url: '/ws'
headers: {...}
}
}
On startup/upgrade errors it receives:
{type: :error, error: '<message>'}
Returns a close function that gracefully shuts down the server.
Opcode.text = 1Opcode.binary = 2Opcode.close = 8Opcode.ping = 9Opcode.pong = 10
CloseCode.normal = 1000CloseCode.goingAway = 1001CloseCode.protocolError = 1002CloseCode.unsupportedData = 1003CloseCode.invalidFramePayloadData = 1007CloseCode.policyViolation = 1008CloseCode.messageTooBig = 1009CloseCode.internalServerError = 1011
ws := import('websocket')
result := ws.connect('ws://echo.websocket.org')
if result.type = :ok -> {
sock := result.socket
ws.send(sock, 'hello from magnolia')
msg := ws.recv(sock)
println(msg)
ws.close(sock)
} else {
println(result.error)
}