ws.mjs raw
1 // TinyJS Runtime — WebSocket Bridge
2 // Provides Go-callable WebSocket operations.
3 // Function names match Go signatures (PascalCase).
4
5 const _conns = new Map();
6 let _nextId = 1;
7
8 // Open a WebSocket connection. Returns connection ID.
9 // Callback params are Go closures compiled to JS functions.
10 export function Dial(url, onMessage, onOpen, onClose, onError) {
11 const id = _nextId++;
12 const ws = new WebSocket(url);
13 const conn = { ws, id, closed: false };
14 _conns.set(id, conn);
15
16 ws.onopen = () => {
17 if (onOpen) onOpen(id);
18 };
19
20 ws.onmessage = (ev) => {
21 if (onMessage) onMessage(id, String(ev.data));
22 };
23
24 ws.onclose = (ev) => {
25 conn.closed = true;
26 _conns.delete(id);
27 if (onClose) onClose(id, ev.code, ev.reason);
28 };
29
30 ws.onerror = (ev) => {
31 if (onError) onError(id);
32 };
33
34 return id;
35 }
36
37 // Send a string message on a connection.
38 export function Send(connId, msg) {
39 const conn = _conns.get(connId);
40 if (conn && !conn.closed && conn.ws.readyState === WebSocket.OPEN) {
41 conn.ws.send(msg);
42 return true;
43 }
44 return false;
45 }
46
47 // Close a connection.
48 export function Close(connId) {
49 const conn = _conns.get(connId);
50 if (conn) {
51 conn.closed = true;
52 conn.ws.close();
53 _conns.delete(connId);
54 }
55 }
56
57 // Get connection readyState.
58 export function ReadyState(connId) {
59 const conn = _conns.get(connId);
60 if (!conn) return -1;
61 return conn.ws.readyState;
62 }
63