@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
JavaScript
// 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