UNPKG

@fdm-monster/server

Version:

FDM Monster is a bulk OctoPrint, Klipper, PrusaLink and BambuLab manager to set up, configure and monitor 3D printers. Our aim is to provide neat overview over your farm.

76 lines (75 loc) 2.33 kB
import { WebsocketAdapter } from "./websocket.adapter.js"; //#region src/shared/websocket-rpc-extended.adapter.ts var WebsocketRpcExtendedAdapter = class WebsocketRpcExtendedAdapter extends WebsocketAdapter { logger; requestMap; constructor(loggerFactory) { super(loggerFactory); this.logger = loggerFactory(WebsocketRpcExtendedAdapter.name); this.requestMap = /* @__PURE__ */ new Map(); } sendRequest(request, options) { if (!this.socket) throw new Error("Websocket was not created, cannot send request"); request.id = request.id++; const requestId = request.id; const promise = new Promise((resolve, reject) => { const timeout = setTimeout(() => { this.clearRequest(requestId); reject(/* @__PURE__ */ new Error(`Websocket RPC Request by ID ${requestId} timed out`)); }, Math.min(3e3, options?.timeout ?? 1e4)); this.requestMap.set(requestId, { resolve, reject, timeout }); }); this.socket.send(JSON.stringify(request)); return promise; } async onMessage(message) { const response = JSON.parse(message.toString()); const requestId = response.id; if (!requestId) { const event = response; return await this.onEventMessage(event); } const request = this.requestMap.get(requestId); if (!request) { this.logger.warn(`No request was associated with the provided request id ${response.id}, websocket RPC response has been dropped`); return; } if (request) { clearTimeout(request.timeout); request.resolve(response); this.requestMap.delete(requestId); } } clearRequest(requestId) { const request = this.requestMap.get(requestId); if (request) { clearTimeout(request.timeout); this.requestMap.delete(requestId); } } /** * Clear all pending requests and their timeouts * This should be called when closing the adapter to prevent memory/timeout leaks */ clearAllRequests() { for (const [, request] of this.requestMap.entries()) { clearTimeout(request.timeout); request.reject(/* @__PURE__ */ new Error("WebSocket adapter closed")); } this.requestMap.clear(); } /** * Override close to ensure proper cleanup of pending requests */ close() { this.clearAllRequests(); super.close(); } }; //#endregion export { WebsocketRpcExtendedAdapter }; //# sourceMappingURL=websocket-rpc-extended.adapter.js.map