@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.
80 lines (79 loc) • 2.24 kB
JavaScript
import { AppConstants } from "../server.constants.js";
import { WebSocket } from "ws";
//#region src/shared/websocket.adapter.ts
var WebsocketAdapter = class WebsocketAdapter {
socket;
logger;
eventEmittingAllowed = true;
constructor(loggerFactory) {
this.logger = loggerFactory(WebsocketAdapter.name);
}
get isOpened() {
return this.socket?.readyState === WebSocket.OPEN;
}
close() {
this.socket?.close();
delete this.socket;
}
allowEmittingEvents() {
this.eventEmittingAllowed = true;
}
disallowEmittingEvents() {
this.eventEmittingAllowed = false;
}
/**
* @protected
* Open a WebSocket connection.
*
* @param {string|URL} url The URL to connect to.
* @returns {void}
*/
open(url) {
if (!url) throw new Error("Cant setup up websocket, URL may not be empty.");
this.socket = new WebSocket(url, { handshakeTimeout: AppConstants.defaultWebsocketHandshakeTimeout });
this.socket.onopen = (event) => this.onOpen(event);
this.socket.onerror = (error) => this.onError(error);
this.socket.onclose = (event) => this.onClose(event);
this.socket.onmessage = (message) => this.onMessage(message.data);
}
/**
* @protected
* Send a message through the WebSocket connection.
*
* @param {string} payload - The message payload to send.
* @returns {Promise<void>} A promise that resolves when the message is sent successfully.
*/
async sendMessage(payload) {
if (!this.isOpened || !this.socket) {
this.logger.error("Websocket is not opened, cant send a message");
return;
}
return await new Promise((resolve, reject) => {
this.socket.send(payload, (error) => {
if (error) reject(error);
resolve();
});
});
}
/**
* Handle open event.
* @private
* @param {Event} event - The event object.
* @returns {Promise<void>} A promise that resolves when the open handling is complete.
*/
async onOpen(event) {
await this.afterOpened(event);
}
/**
* Handle close event.
* @private
* @param {CloseEvent} event - The event object.
* @returns {Promise<void>} A promise that resolves when the close handling is complete.
*/
async onClose(event) {
await this.afterClosed(event);
}
};
//#endregion
export { WebsocketAdapter };
//# sourceMappingURL=websocket.adapter.js.map