@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.
481 lines (480 loc) • 22.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "PrinterController", {
enumerable: true,
get: function() {
return PrinterController;
}
});
const _awilixexpress = require("awilix-express");
const _authenticate = require("../middleware/authenticate");
const _validators = require("../handlers/validators");
const _printercontrollervalidation = require("./validation/printer-controller.validation");
const _serverconstants = require("../server.constants");
const _printer = require("../middleware/printer");
const _correlationtokenutil = require("../utils/correlation-token.util");
const _authorizationconstants = require("../constants/authorization.constants");
const _printersocketstore = require("../state/printer-socket.store");
const _testprintersocketstore = require("../state/test-printer-socket.store");
const _printercache = require("../state/printer.cache");
const _printereventscache = require("../state/printer-events.cache");
const _floorstore = require("../state/floor.store");
const _loggerfactory = require("../handlers/logger-factory");
const _express = require("express");
const _printerserviceinterface = require("../services/interfaces/printer.service.interface");
const _axios = require("axios");
const _faileddependencyexception = require("../exceptions/failed-dependency.exception");
const _runtimeexceptions = require("../exceptions/runtime.exceptions");
const _printerapiinterface = require("../services/printer-api.interface");
const _printerapifactory = require("../services/printer-api.factory");
const _normalizeurl = require("../utils/normalize-url");
const _urlutils = require("../utils/url.utils");
const _printerresolver = require("../middleware/printer-resolver");
function _ts_decorate(decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
}
function _ts_metadata(k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
}
class PrinterController {
printerApiFactory;
printerSocketStore;
testPrinterSocketStore;
printerService;
printerCache;
printerEventsCache;
printerApi;
floorStore;
logger;
constructor(loggerFactory, printerApiFactory, printerSocketStore, testPrinterSocketStore, printerService, printerCache, printerEventsCache, printerApi, floorStore){
this.printerApiFactory = printerApiFactory;
this.printerSocketStore = printerSocketStore;
this.testPrinterSocketStore = testPrinterSocketStore;
this.printerService = printerService;
this.printerCache = printerCache;
this.printerEventsCache = printerEventsCache;
this.printerApi = printerApi;
this.floorStore = floorStore;
this.logger = loggerFactory(PrinterController.name);
}
async list(req, res) {
res.send(await this.printerCache.listCachedPrinters(true));
}
async create(req, res) {
const newPrinter = req.body;
if (req.query.forceSave !== "true") {
await this.testPrintApiConnection(newPrinter);
}
const createdPrinter = await this.printerService.create(newPrinter);
res.send(await this.printerCache.getCachedPrinterOrThrowAsync(createdPrinter.id));
}
async createBatch(req, res) {
const importResult = await this.printerService.batchImport(req.body);
res.send(importResult);
}
async getPrinter(req, res) {
const { currentPrinterId } = (0, _printerresolver.getScopedPrinter)(req);
res.send(await this.printerCache.getCachedPrinterOrThrowAsync(currentPrinterId));
}
async getPrinterSocketInfo(req, res) {
const { currentPrinterId } = (0, _printerresolver.getScopedPrinter)(req);
res.send(await this.printerEventsCache.getPrinterSocketEvents(currentPrinterId));
}
async update(req, res) {
const forceSave = req.query.forceSave === "true";
const { currentPrinterId } = (0, _printerresolver.getScopedPrinter)(req);
const updatedPrinter = req.body;
if (!forceSave) {
await this.testPrintApiConnection(updatedPrinter);
}
await this.printerService.update(currentPrinterId, updatedPrinter);
res.send(await this.printerCache.getCachedPrinterOrThrowAsync(currentPrinterId));
}
async delete(req, res) {
const { currentPrinterId } = (0, _printerresolver.getScopedPrinter)(req);
await this.printerService.delete(currentPrinterId);
await this.floorStore.removePrinterFromAnyFloor(currentPrinterId);
res.send();
}
async updateEnabled(req, res) {
const { currentPrinterId } = (0, _printerresolver.getScopedPrinter)(req);
const data = await (0, _validators.validateMiddleware)(req, _printercontrollervalidation.updatePrinterEnabledSchema);
await this.printerService.updateEnabled(currentPrinterId, data.enabled);
res.send({});
}
async updatePrinterDisabledReason(req, res) {
const { currentPrinterId } = (0, _printerresolver.getScopedPrinter)(req);
const data = await (0, _validators.validateMiddleware)(req, _printercontrollervalidation.updatePrinterDisabledReasonSchema);
await this.printerService.updateDisabledReason(currentPrinterId, data.disabledReason);
res.send({});
}
async refreshPrinterSocket(req, res) {
const { currentPrinterId } = (0, _printerresolver.getScopedPrinter)(req);
this.printerSocketStore.reconnectPrinterAdapter(currentPrinterId);
await this.printerEventsCache.deletePrinterSocketEvents(currentPrinterId);
res.send({});
}
async testConnection(req, res) {
if (req.body.printerURL?.length) {
req.body.printerURL = (0, _normalizeurl.normalizeUrl)(req.body.printerURL, {
defaultProtocol: _urlutils.defaultHttpProtocol
});
}
const newPrinter = await (0, _validators.validateMiddleware)(req, _printercontrollervalidation.testPrinterApiSchema);
const printerCorrelationToken = (0, _correlationtokenutil.generateCorrelationToken)();
this.logger.log(`Testing printer with correlation token ${printerCorrelationToken}`);
try {
await this.testPrinterSocketStore.setupTestPrinter(printerCorrelationToken, newPrinter);
} catch (e) {
res.send({
correlationToken: printerCorrelationToken,
failure: true,
error: e.toString()
});
return;
}
res.send({
correlationToken: printerCorrelationToken
});
}
async getPrinterLoginDetails(req, res) {
const { printerLogin } = (0, _printerresolver.getScopedPrinter)(req);
res.send(printerLogin);
}
async sendSerialConnectCommand(req, res) {
await this.printerApi.connect();
res.send({});
}
async sendSerialDisconnectCommand(req, res) {
await this.printerApi.disconnect();
res.send({});
}
async movePrintHead(req, res) {
await this.printerApi.movePrintHead(req.body);
res.send({});
}
async homeAxes(req, res) {
await this.printerApi.homeAxes(req.body);
res.send({});
}
async pausePrint(req, res) {
await this.printerApi.pausePrint();
res.send({});
}
async resumePrint(req, res) {
await this.printerApi.resumePrint();
res.send({});
}
async cancelPrint(req, res) {
await this.printerApi.cancelPrint();
res.send({});
}
async restartServer(req, res) {
await this.printerApi.restartServer();
res.send();
}
async setFeedRate(req, res) {
const { currentPrinterId } = (0, _printerresolver.getScopedPrinter)(req);
const data = await (0, _validators.validateMiddleware)(req, _printercontrollervalidation.feedRateSchema);
await this.printerService.updateFeedRate(currentPrinterId, data.feedRate);
res.send({});
}
async setFlowRate(req, res) {
const { currentPrinterId } = (0, _printerresolver.getScopedPrinter)(req);
const data = await (0, _validators.validateMiddleware)(req, _printercontrollervalidation.flowRateSchema);
await this.printerService.updateFlowRate(currentPrinterId, data.flowRate);
res.send({});
}
async testPrintApiConnection(inputLoginDto) {
await (0, _validators.validateInput)(inputLoginDto, _printercontrollervalidation.testPrinterApiSchema);
try {
if (this.printerApi) {
await this.printerApi.getVersion();
} else {
const printerApi = this.printerApiFactory.getScopedPrinter(inputLoginDto);
await printerApi.getVersion();
}
} catch (e) {
this.logger.log("Printer version test failed");
if (e instanceof _axios.AxiosError) {
this.logger.debug(e.message + " " + e.status + " " + e.response?.status);
switch(e.response?.status){
case 404:
break;
case 401:
case 403:
{
throw new _faileddependencyexception.FailedDependencyException("Authentication failed", e.response?.status);
}
case 0:
case 502:
case 503:
{
throw new _faileddependencyexception.FailedDependencyException("Printer service unreachable", e.response?.status);
}
default:
{
if (!e.response?.status) {
throw new _faileddependencyexception.FailedDependencyException(`Reaching Printer service failed without status (code ${e.code})`);
} else {
throw new _faileddependencyexception.FailedDependencyException(`Reaching Printer service failed with status (code ${e.code})`, e.response?.status);
}
}
}
}
throw new _runtimeexceptions.InternalServerException(`Could not call Printer service, internal problem`, e.stack);
}
}
}
_ts_decorate([
(0, _awilixexpress.GET)(),
(0, _awilixexpress.route)("/"),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _express.Request === "undefined" ? Object : _express.Request,
typeof _express.Response === "undefined" ? Object : _express.Response
]),
_ts_metadata("design:returntype", Promise)
], PrinterController.prototype, "list", null);
_ts_decorate([
(0, _awilixexpress.POST)(),
(0, _awilixexpress.route)("/"),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _express.Request === "undefined" ? Object : _express.Request,
typeof _express.Response === "undefined" ? Object : _express.Response
]),
_ts_metadata("design:returntype", Promise)
], PrinterController.prototype, "create", null);
_ts_decorate([
(0, _awilixexpress.POST)(),
(0, _awilixexpress.route)("/batch"),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _express.Request === "undefined" ? Object : _express.Request,
typeof _express.Response === "undefined" ? Object : _express.Response
]),
_ts_metadata("design:returntype", Promise)
], PrinterController.prototype, "createBatch", null);
_ts_decorate([
(0, _awilixexpress.GET)(),
(0, _awilixexpress.route)("/:id"),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _express.Request === "undefined" ? Object : _express.Request,
typeof _express.Response === "undefined" ? Object : _express.Response
]),
_ts_metadata("design:returntype", Promise)
], PrinterController.prototype, "getPrinter", null);
_ts_decorate([
(0, _awilixexpress.GET)(),
(0, _awilixexpress.route)("/:id/socket"),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _express.Request === "undefined" ? Object : _express.Request,
typeof _express.Response === "undefined" ? Object : _express.Response
]),
_ts_metadata("design:returntype", Promise)
], PrinterController.prototype, "getPrinterSocketInfo", null);
_ts_decorate([
(0, _awilixexpress.PATCH)(),
(0, _awilixexpress.route)("/:id"),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _express.Request === "undefined" ? Object : _express.Request,
typeof _express.Response === "undefined" ? Object : _express.Response
]),
_ts_metadata("design:returntype", Promise)
], PrinterController.prototype, "update", null);
_ts_decorate([
(0, _awilixexpress.DELETE)(),
(0, _awilixexpress.route)("/:id"),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _express.Request === "undefined" ? Object : _express.Request,
typeof _express.Response === "undefined" ? Object : _express.Response
]),
_ts_metadata("design:returntype", Promise)
], PrinterController.prototype, "delete", null);
_ts_decorate([
(0, _awilixexpress.PATCH)(),
(0, _awilixexpress.route)("/:id/enabled"),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _express.Request === "undefined" ? Object : _express.Request,
typeof _express.Response === "undefined" ? Object : _express.Response
]),
_ts_metadata("design:returntype", Promise)
], PrinterController.prototype, "updateEnabled", null);
_ts_decorate([
(0, _awilixexpress.PATCH)(),
(0, _awilixexpress.route)("/:id/disabled-reason"),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _express.Request === "undefined" ? Object : _express.Request,
typeof _express.Response === "undefined" ? Object : _express.Response
]),
_ts_metadata("design:returntype", Promise)
], PrinterController.prototype, "updatePrinterDisabledReason", null);
_ts_decorate([
(0, _awilixexpress.POST)(),
(0, _awilixexpress.route)("/:id/refresh-socket"),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _express.Request === "undefined" ? Object : _express.Request,
typeof _express.Response === "undefined" ? Object : _express.Response
]),
_ts_metadata("design:returntype", Promise)
], PrinterController.prototype, "refreshPrinterSocket", null);
_ts_decorate([
(0, _awilixexpress.POST)(),
(0, _awilixexpress.route)("/test-connection"),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _express.Request === "undefined" ? Object : _express.Request,
typeof _express.Response === "undefined" ? Object : _express.Response
]),
_ts_metadata("design:returntype", Promise)
], PrinterController.prototype, "testConnection", null);
_ts_decorate([
(0, _awilixexpress.GET)(),
(0, _awilixexpress.route)("/:id/login-details"),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _express.Request === "undefined" ? Object : _express.Request,
typeof _express.Response === "undefined" ? Object : _express.Response
]),
_ts_metadata("design:returntype", Promise)
], PrinterController.prototype, "getPrinterLoginDetails", null);
_ts_decorate([
(0, _awilixexpress.POST)(),
(0, _awilixexpress.route)("/:id/serial-connect"),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _express.Request === "undefined" ? Object : _express.Request,
typeof _express.Response === "undefined" ? Object : _express.Response
]),
_ts_metadata("design:returntype", Promise)
], PrinterController.prototype, "sendSerialConnectCommand", null);
_ts_decorate([
(0, _awilixexpress.POST)(),
(0, _awilixexpress.route)("/:id/serial-disconnect"),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _express.Request === "undefined" ? Object : _express.Request,
typeof _express.Response === "undefined" ? Object : _express.Response
]),
_ts_metadata("design:returntype", Promise)
], PrinterController.prototype, "sendSerialDisconnectCommand", null);
_ts_decorate([
(0, _awilixexpress.POST)(),
(0, _awilixexpress.route)("/:id/jog"),
(0, _awilixexpress.route)("/:id/move"),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _express.Request === "undefined" ? Object : _express.Request,
typeof _express.Response === "undefined" ? Object : _express.Response
]),
_ts_metadata("design:returntype", Promise)
], PrinterController.prototype, "movePrintHead", null);
_ts_decorate([
(0, _awilixexpress.POST)(),
(0, _awilixexpress.route)("/:id/home"),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _express.Request === "undefined" ? Object : _express.Request,
typeof _express.Response === "undefined" ? Object : _express.Response
]),
_ts_metadata("design:returntype", Promise)
], PrinterController.prototype, "homeAxes", null);
_ts_decorate([
(0, _awilixexpress.POST)(),
(0, _awilixexpress.route)("/:id/job/pause"),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _express.Request === "undefined" ? Object : _express.Request,
typeof _express.Response === "undefined" ? Object : _express.Response
]),
_ts_metadata("design:returntype", Promise)
], PrinterController.prototype, "pausePrint", null);
_ts_decorate([
(0, _awilixexpress.POST)(),
(0, _awilixexpress.route)("/:id/job/resume"),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _express.Request === "undefined" ? Object : _express.Request,
typeof _express.Response === "undefined" ? Object : _express.Response
]),
_ts_metadata("design:returntype", Promise)
], PrinterController.prototype, "resumePrint", null);
_ts_decorate([
(0, _awilixexpress.POST)(),
(0, _awilixexpress.route)("/:id/job/stop"),
(0, _awilixexpress.route)("/:id/job/cancel"),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _express.Request === "undefined" ? Object : _express.Request,
typeof _express.Response === "undefined" ? Object : _express.Response
]),
_ts_metadata("design:returntype", Promise)
], PrinterController.prototype, "cancelPrint", null);
_ts_decorate([
(0, _awilixexpress.POST)(),
(0, _awilixexpress.route)("/:id/octoprint/server/restart"),
(0, _awilixexpress.route)("/:id/server/restart"),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _express.Request === "undefined" ? Object : _express.Request,
typeof _express.Response === "undefined" ? Object : _express.Response
]),
_ts_metadata("design:returntype", Promise)
], PrinterController.prototype, "restartServer", null);
_ts_decorate([
(0, _awilixexpress.PATCH)(),
(0, _awilixexpress.route)("/:id/feed-rate"),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _express.Request === "undefined" ? Object : _express.Request,
typeof _express.Response === "undefined" ? Object : _express.Response
]),
_ts_metadata("design:returntype", Promise)
], PrinterController.prototype, "setFeedRate", null);
_ts_decorate([
(0, _awilixexpress.PATCH)(),
(0, _awilixexpress.route)("/:id/flow-rate"),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _express.Request === "undefined" ? Object : _express.Request,
typeof _express.Response === "undefined" ? Object : _express.Response
]),
_ts_metadata("design:returntype", Promise)
], PrinterController.prototype, "setFlowRate", null);
PrinterController = _ts_decorate([
(0, _awilixexpress.route)(_serverconstants.AppConstants.apiRoute + "/printer"),
(0, _awilixexpress.before)([
(0, _authenticate.authenticate)(),
(0, _authenticate.authorizeRoles)([
_authorizationconstants.ROLES.OPERATOR,
_authorizationconstants.ROLES.ADMIN
]),
(0, _printer.printerResolveMiddleware)()
]),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _loggerfactory.ILoggerFactory === "undefined" ? Object : _loggerfactory.ILoggerFactory,
typeof _printerapifactory.PrinterApiFactory === "undefined" ? Object : _printerapifactory.PrinterApiFactory,
typeof _printersocketstore.PrinterSocketStore === "undefined" ? Object : _printersocketstore.PrinterSocketStore,
typeof _testprintersocketstore.TestPrinterSocketStore === "undefined" ? Object : _testprintersocketstore.TestPrinterSocketStore,
typeof _printerserviceinterface.IPrinterService === "undefined" ? Object : _printerserviceinterface.IPrinterService,
typeof _printercache.PrinterCache === "undefined" ? Object : _printercache.PrinterCache,
typeof _printereventscache.PrinterEventsCache === "undefined" ? Object : _printereventscache.PrinterEventsCache,
typeof _printerapiinterface.IPrinterApi === "undefined" ? Object : _printerapiinterface.IPrinterApi,
typeof _floorstore.FloorStore === "undefined" ? Object : _floorstore.FloorStore
])
], PrinterController);
//# sourceMappingURL=printer.controller.js.map