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