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.

144 lines (143 loc) 4.53 kB
import "../printer-api.interface.js"; import { errorSummary } from "../../utils/error.utils.js"; import { SOCKET_STATE } from "../../shared/dtos/socket-state.type.js"; import { API_STATE } from "../../shared/dtos/api-state.type.js"; import { WsMessage } from "../octoprint/octoprint-websocket.adapter.js"; import { prusaLinkEvent } from "./constants/prusalink.constants.js"; //#region src/services/prusa-link/prusa-link-http-polling.adapter.ts const defaultLog = { adapter: "prusa-link" }; var PrusaLinkHttpPollingAdapter = class PrusaLinkHttpPollingAdapter { printerType = 2; printerId; login; socketState; apiState; lastMessageReceivedTimestamp; logger; refreshPrinterCurrentInterval; eventEmittingAllowed = true; constructor(loggerFactory, prusaLinkApi, eventEmitter2) { this.prusaLinkApi = prusaLinkApi; this.eventEmitter2 = eventEmitter2; this.logger = loggerFactory(PrusaLinkHttpPollingAdapter.name); } allowEmittingEvents() { this.eventEmittingAllowed = true; } disallowEmittingEvents() { this.eventEmittingAllowed = false; } needsReopen() { return !this.refreshPrinterCurrentInterval; } needsSetup() { return !this.refreshPrinterCurrentInterval; } needsReauth() { throw new Error("Method not implemented."); } isClosedOrAborted() { throw new Error("Method not implemented."); } reauthSession() { throw new Error("Method not implemented."); } registerCredentials(socketLogin) { this.login = socketLogin.loginDto; this.printerId = socketLogin.printerId; } open() { this.startPolling(); } close() { this.logger.debug("Polling adapter attempting stoppage.", this.logMeta()); this.stopPolling(); } setupSocketSession() { this.logger.warn("SetupSocketSession", defaultLog); return Promise.resolve(); } resetSocketState() { this.logger.warn("ResetSocketState", defaultLog); } startPolling() { this.stopPolling(); this.logger.debug("Polling adapter starting, setting interval.", this.logMeta()); this.refreshPrinterCurrentInterval = setInterval(async () => { if (!this.printerId) { this.logger.warn("Printer ID is not set, skipping status check.", this.logMeta()); this.stopPolling(); return; } this.updateSocketState(SOCKET_STATE.opening); try { this.prusaLinkApi.login = { printerURL: this.login.printerURL, username: this.login.username, password: this.login.password, apiKey: "", printerType: 2 }; this.updateSocketState(SOCKET_STATE.authenticating); const printerState = await this.prusaLinkApi.getPrinterState(); if (printerState.state.flags?.link_state && printerState.state.flags?.link_state !== "PRINTING") printerState.state.text = printerState.state.flags.link_state; const jobState = await this.prusaLinkApi.getJobState(); this.updateSocketState(SOCKET_STATE.authenticated); this.updateApiState(API_STATE.responding); await this.emitEvent("current", { ...printerState, job: jobState.job, progress: { printTime: jobState.progress?.printTime, printTimeLeft: jobState.progress?.printTimeLeft, completion: jobState.progress?.completion * 100 } }); } catch (error) { this.updateSocketState(SOCKET_STATE.error); this.logger.error(`Failed to fetch PrusaLink status ${errorSummary(error)}`, this.logMeta()); } }, 5e3); } stopPolling() { if (this.refreshPrinterCurrentInterval) { this.logger.debug("Polling adapter stopping, clearing interval.", this.logMeta()); clearInterval(this.refreshPrinterCurrentInterval); this.refreshPrinterCurrentInterval = void 0; this.updateSocketState(SOCKET_STATE.closed); } } async emitEvent(event, payload) { if (!this.eventEmittingAllowed) return; this.logger.debug(`Emitting event ${prusaLinkEvent(event)}`, this.logMeta()); await this.eventEmitter2.emitAsync(prusaLinkEvent(event), { event, payload, printerId: this.printerId, printerType: 2 }); } emitEventSync(event, payload) { if (!this.eventEmittingAllowed) return; this.eventEmitter2.emit(prusaLinkEvent(event), { event, payload, printerId: this.printerId, printerType: 2 }); } updateSocketState(state) { this.socketState = state; this.emitEventSync(WsMessage.WS_STATE_UPDATED, state); } updateApiState(state) { this.apiState = state; this.emitEventSync(WsMessage.API_STATE_UPDATED, state); } logMeta() { return defaultLog; } }; //#endregion export { PrusaLinkHttpPollingAdapter }; //# sourceMappingURL=prusa-link-http-polling.adapter.js.map