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