UNPKG

@fdm-monster/server

Version:

FDM Monster is a bulk OctoPrint manager to set up, configure and monitor 3D printers. Our aim is to provide extremely optimized websocket performance and reliability.

68 lines (67 loc) 2.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "WebsocketRpcExtendedAdapter", { enumerable: true, get: function() { return WebsocketRpcExtendedAdapter; } }); const _websocketadapter = require("./websocket.adapter"); class WebsocketRpcExtendedAdapter extends _websocketadapter.WebsocketAdapter { requestMap; constructor(loggerFactory){ super(loggerFactory); this.logger = loggerFactory(WebsocketRpcExtendedAdapter.name); this.requestMap = new Map(); } sendRequest(request, options = { timeout: 10000 }) { 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(new Error(`Websocket RPC Request by ID ${requestId} timed out`)); }, Math.min(3000, options?.timeout) ?? 10000); 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); } } } //# sourceMappingURL=websocket-rpc-extended.adapter.js.map