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