UNPKG

@firtoz/socka

Version:

Standard Schema–first WebSocket RPC for TypeScript — Bun, Hono, Node ws, Cloudflare Workers, Durable Objects

84 lines (83 loc) • 2.29 kB
// src/test-utils/fake-websocket.ts function createFakeWebSocket(initialReadyState = WebSocket.CONNECTING) { const sent = []; const listeners = /* @__PURE__ */ new Map(); let readyState = initialReadyState; const addListener = (type, listener) => { let set = listeners.get(type); if (!set) { set = /* @__PURE__ */ new Set(); listeners.set(type, set); } set.add(listener); }; const socket = { binaryType: "blob", get readyState() { return readyState; }, addEventListener(type, listener, _options) { const fn = typeof listener === "function" ? listener : (ev) => listener.handleEvent(ev); addListener(type, fn); }, removeEventListener(type, listener, _options) { const set = listeners.get(type); if (!set) return; const fn = typeof listener === "function" ? listener : (ev) => listener.handleEvent(ev); set.delete(fn); }, send(data) { if (ArrayBuffer.isView(data)) { const v = data; const copy = new ArrayBuffer(v.byteLength); new Uint8Array(copy).set( new Uint8Array(v.buffer, v.byteOffset, v.byteLength) ); sent.push(copy); return; } sent.push(data); }, close(_code, _reason) { }, dispatchEvent(event) { const set = listeners.get(event.type); if (!set) return true; for (const l of set) { l(event); } return !event.defaultPrevented; } }; const dispatchMessage = (data) => { const ev = new MessageEvent("message", { data }); socket.dispatchEvent(ev); }; const dispatchOpen = () => { readyState = WebSocket.OPEN; socket.dispatchEvent(new Event("open")); }; const dispatchClose = () => { readyState = WebSocket.CLOSED; socket.dispatchEvent(new CloseEvent("close", { code: 1e3 })); }; const dispatchError = () => { readyState = WebSocket.CLOSED; socket.dispatchEvent(new Event("error")); }; const setReadyState = (state) => { readyState = state; }; return { socket, sent, dispatchMessage, dispatchOpen, dispatchClose, dispatchError, setReadyState }; } export { createFakeWebSocket }; //# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map