// Init export async function init() { const socketName = await (window as any).getServerSocket(); connectSocket(socketName, (client: any) => { console.log("SOCKET CONNECTED"); }); } // State const replyHandlers = new Map(); const listeners = new Map(); let messageQueue: any[] = []; let socketClient: any = null; // Functions function connectSocket(name: any, onOpen: any) { (window as any).ipcConnect(name, function (client: any) { client.on("message", (data: any) => { console.log("CLIENT IPC GOT MESSAGE"); console.log(data); const msg = JSON.parse(data); if (msg.type === "error") { // Up to you whether or not to care about the error const { id } = msg; replyHandlers.delete(id); } else if (msg.type === "reply") { const { id, result } = msg; const handler = replyHandlers.get(id); if (handler) { replyHandlers.delete(id); handler.resolve(result); } } else if (msg.type === "push") { const { name, args } = msg; const listens = listeners.get(name); if (listens) { listens.forEach((listener: any) => { listener(args); }); } } else { throw new Error("Unknown message type: " + JSON.stringify(msg)); } }); client.on("connect", () => { socketClient = client; // Send any messages that were queued while closed if (messageQueue.length > 0) { messageQueue.forEach((msg) => client.emit("message", msg)); messageQueue = []; } onOpen(client); }); client.on("disconnect", () => { socketClient = null; }); }); } function send(name: any, args: any) { return new Promise((resolve, reject) => { let id = (window as any).uuid.v4(); replyHandlers.set(id, { resolve, reject }); if (socketClient) { socketClient.emit("message", JSON.stringify({ id, name, args })); } else { messageQueue.push(JSON.stringify({ id, name, args })); } }); } export function listen(name: any, cb: any) { if (!listeners.get(name)) { listeners.set(name, []); } listeners.get(name).push(cb); return () => { let arr = listeners.get(name); listeners.set( name, arr.filter((cb_: any) => cb_ !== cb) ); }; } function unlisten(name: any) { listeners.set(name, []); }