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