@fdm-monster/server 1.8.3 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.template +6 -4
- package/.gitattributes +4 -2
- package/.yarn/install-state.gz +0 -0
- package/.yarn/releases/yarn-4.9.1.cjs +948 -0
- package/.yarnrc.yml +1 -1
- package/README.md +27 -28
- package/RELEASE_NOTES.MD +69 -1
- package/biome.json +33 -0
- package/dist/consoles/download-github-releases.js.map +1 -1
- package/dist/consoles/launch-http-servers.js +31 -0
- package/dist/consoles/launch-http-servers.js.map +1 -0
- package/dist/consoles/mock-octoprint.server.js +291 -0
- package/dist/consoles/mock-octoprint.server.js.map +1 -0
- package/dist/consoles/mock-prusalink.server.js +57 -0
- package/dist/consoles/mock-prusalink.server.js.map +1 -0
- package/dist/consoles/utils/api-messages.js +856 -0
- package/dist/consoles/utils/api-messages.js.map +1 -0
- package/dist/consoles/utils/delayed-memory.storage.js +42 -0
- package/dist/consoles/utils/delayed-memory.storage.js.map +1 -0
- package/dist/consoles/utils/ws-messages.js +88 -0
- package/dist/consoles/utils/ws-messages.js.map +1 -0
- package/dist/constants/event.constants.js +5 -21
- package/dist/constants/event.constants.js.map +1 -1
- package/dist/constants/server-settings.constants.js +8 -12
- package/dist/constants/server-settings.constants.js.map +1 -1
- package/dist/container.js +13 -14
- package/dist/container.js.map +1 -1
- package/dist/container.tokens.js +3 -4
- package/dist/container.tokens.js.map +1 -1
- package/dist/controllers/auth.controller.js +114 -24
- package/dist/controllers/auth.controller.js.map +1 -1
- package/dist/controllers/batch-call.controller.js +95 -24
- package/dist/controllers/batch-call.controller.js.map +1 -1
- package/dist/controllers/camera-stream.controller.js +16 -12
- package/dist/controllers/camera-stream.controller.js.map +1 -1
- package/dist/controllers/custom-gcode.controller.js +116 -40
- package/dist/controllers/custom-gcode.controller.js.map +1 -1
- package/dist/controllers/dto/update-client-dist.dto.js +0 -21
- package/dist/controllers/dto/update-client-dist.dto.js.map +1 -1
- package/dist/controllers/first-time-setup.controller.js +54 -18
- package/dist/controllers/first-time-setup.controller.js.map +1 -1
- package/dist/controllers/floor.controller.js +154 -43
- package/dist/controllers/floor.controller.js.map +1 -1
- package/dist/controllers/metrics.controller.js +56 -0
- package/dist/controllers/metrics.controller.js.map +1 -0
- package/dist/controllers/print-completion.controller.js +81 -18
- package/dist/controllers/print-completion.controller.js.map +1 -1
- package/dist/controllers/printer-files.controller.js +45 -29
- package/dist/controllers/printer-files.controller.js.map +1 -1
- package/dist/controllers/printer-group.controller.js +123 -33
- package/dist/controllers/printer-group.controller.js.map +1 -1
- package/dist/controllers/printer-settings.controller.js +73 -26
- package/dist/controllers/printer-settings.controller.js.map +1 -1
- package/dist/controllers/printer.controller.js +57 -198
- package/dist/controllers/printer.controller.js.map +1 -1
- package/dist/controllers/server-private.controller.js +153 -39
- package/dist/controllers/server-private.controller.js.map +1 -1
- package/dist/controllers/server-public.controller.js +87 -88
- package/dist/controllers/server-public.controller.js.map +1 -1
- package/dist/controllers/settings.controller.js +222 -79
- package/dist/controllers/settings.controller.js.map +1 -1
- package/dist/controllers/user.controller.js +67 -57
- package/dist/controllers/user.controller.js.map +1 -1
- package/dist/controllers/validation/auth-controller.validation.js +6 -5
- package/dist/controllers/validation/auth-controller.validation.js.map +1 -1
- package/dist/controllers/validation/batch-controller.validation.js +17 -18
- package/dist/controllers/validation/batch-controller.validation.js.map +1 -1
- package/dist/controllers/validation/generic.validation.js +8 -3
- package/dist/controllers/validation/generic.validation.js.map +1 -1
- package/dist/controllers/validation/printer-completion-controller.validation.js +16 -0
- package/dist/controllers/validation/printer-completion-controller.validation.js.map +1 -0
- package/dist/controllers/validation/printer-controller.validation.js +31 -50
- package/dist/controllers/validation/printer-controller.validation.js.map +1 -1
- package/dist/controllers/validation/printer-files-controller.validation.js +25 -15
- package/dist/controllers/validation/printer-files-controller.validation.js.map +1 -1
- package/dist/controllers/validation/printer-settings-controller.validation.js +6 -5
- package/dist/controllers/validation/printer-settings-controller.validation.js.map +1 -1
- package/dist/controllers/validation/server-private.validation.js +17 -0
- package/dist/controllers/validation/server-private.validation.js.map +1 -0
- package/dist/controllers/validation/setting.validation.js +28 -10
- package/dist/controllers/validation/setting.validation.js.map +1 -1
- package/dist/controllers/validation/user-controller.validation.js +44 -13
- package/dist/controllers/validation/user-controller.validation.js.map +1 -1
- package/dist/data-source.js +10 -6
- package/dist/data-source.js.map +1 -1
- package/dist/entities/camera-stream.entity.js +2 -3
- package/dist/entities/camera-stream.entity.js.map +1 -1
- package/dist/entities/custom-gcode.entity.js +1 -2
- package/dist/entities/custom-gcode.entity.js.map +1 -1
- package/dist/entities/floor-position.entity.js.map +1 -1
- package/dist/entities/floor.entity.js +1 -2
- package/dist/entities/floor.entity.js.map +1 -1
- package/dist/entities/group.entity.js +6 -2
- package/dist/entities/group.entity.js.map +1 -1
- package/dist/entities/permission.entity.js +1 -2
- package/dist/entities/permission.entity.js.map +1 -1
- package/dist/entities/print-completion.entity.js +1 -2
- package/dist/entities/print-completion.entity.js.map +1 -1
- package/dist/entities/printer-group.entity.js +6 -2
- package/dist/entities/printer-group.entity.js.map +1 -1
- package/dist/entities/printer.entity.js +22 -4
- package/dist/entities/printer.entity.js.map +1 -1
- package/dist/entities/refresh-token.entity.js +1 -2
- package/dist/entities/refresh-token.entity.js.map +1 -1
- package/dist/entities/role.entity.js +1 -2
- package/dist/entities/role.entity.js.map +1 -1
- package/dist/entities/settings.entity.js +1 -2
- package/dist/entities/settings.entity.js.map +1 -1
- package/dist/entities/user-role.entity.js +1 -2
- package/dist/entities/user-role.entity.js.map +1 -1
- package/dist/entities/user.entity.js +1 -2
- package/dist/entities/user.entity.js.map +1 -1
- package/dist/exceptions/runtime.exceptions.js.map +1 -1
- package/dist/handlers/logger-factory.js +2 -2
- package/dist/handlers/logger-factory.js.map +1 -1
- package/dist/handlers/logger.js +11 -58
- package/dist/handlers/logger.js.map +1 -1
- package/dist/handlers/logging/file-logging.transport.js +35 -0
- package/dist/handlers/logging/file-logging.transport.js.map +1 -0
- package/dist/handlers/logging/loki-logging.transport.js +55 -0
- package/dist/handlers/logging/loki-logging.transport.js.map +1 -0
- package/dist/handlers/logging/static.logger.js +134 -0
- package/dist/handlers/logging/static.logger.js.map +1 -0
- package/dist/handlers/validators.js +7 -116
- package/dist/handlers/validators.js.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/middleware/authenticate.js +11 -22
- package/dist/middleware/authenticate.js.map +1 -1
- package/dist/middleware/database.js.map +1 -1
- package/dist/middleware/demo.middleware.js +4 -17
- package/dist/middleware/demo.middleware.js.map +1 -1
- package/dist/middleware/exception.filter.js +23 -23
- package/dist/middleware/exception.filter.js.map +1 -1
- package/dist/middleware/global.middleware.js +4 -4
- package/dist/middleware/global.middleware.js.map +1 -1
- package/dist/middleware/param-converter.middleware.js +81 -0
- package/dist/middleware/param-converter.middleware.js.map +1 -0
- package/dist/middleware/passport.js +3 -5
- package/dist/middleware/passport.js.map +1 -1
- package/dist/middleware/printer-resolver.js +37 -0
- package/dist/middleware/printer-resolver.js.map +1 -0
- package/dist/middleware/printer.js +22 -10
- package/dist/middleware/printer.js.map +1 -1
- package/dist/middleware/socketio.middleware.js +35 -0
- package/dist/middleware/socketio.middleware.js.map +1 -0
- package/dist/migrations/1706829146617-InitSqlite.js +1 -1
- package/dist/migrations/1706829146617-InitSqlite.js.map +1 -1
- package/dist/migrations/1707494762198-PrinterGroup.js +1 -1
- package/dist/migrations/1707494762198-PrinterGroup.js.map +1 -1
- package/dist/migrations/1708465930665-ChangePrintCompletionDeletePrinterCascade.js +1 -1
- package/dist/migrations/1708465930665-ChangePrintCompletionDeletePrinterCascade.js.map +1 -1
- package/dist/migrations/1713897879622-AddPrinterType.js +1 -1
- package/dist/migrations/1713897879622-AddPrinterType.js.map +1 -1
- package/dist/migrations/1745141688926-AddPrinterUsernamePassword.js +229 -0
- package/dist/migrations/1745141688926-AddPrinterUsernamePassword.js.map +1 -0
- package/dist/models/Auth/Permission.js.map +1 -1
- package/dist/models/Auth/RefreshToken.js +1 -1
- package/dist/models/Auth/RefreshToken.js.map +1 -1
- package/dist/models/Auth/Role.js.map +1 -1
- package/dist/models/Auth/User.js.map +1 -1
- package/dist/models/CameraStream.js +20 -0
- package/dist/models/CameraStream.js.map +1 -1
- package/dist/models/CustomGcode.js.map +1 -1
- package/dist/models/Floor.js.map +1 -1
- package/dist/models/FloorPrinter.js +10 -1
- package/dist/models/FloorPrinter.js.map +1 -1
- package/dist/models/PrintCompletion.js.map +1 -1
- package/dist/models/Printer.js +12 -5
- package/dist/models/Printer.js.map +1 -1
- package/dist/models/Settings.js +11 -43
- package/dist/models/Settings.js.map +1 -1
- package/dist/models/index.js +0 -4
- package/dist/models/index.js.map +1 -1
- package/dist/mongo-migrations/20210713120034-printers-settingsapperance-apikey.js.map +1 -1
- package/dist/mongo-migrations/20210907173950-printers-enabled.js.map +1 -1
- package/dist/mongo-migrations/20211029110742-user-password-passwordhash.js.map +1 -1
- package/dist/mongo-migrations/20230414141005-floor-remove-groupinfloor.js.map +1 -1
- package/dist/mongo-migrations/20230427202911-printer-remove-sortindex.js.map +1 -1
- package/dist/mongo-migrations/20230716065316-user-remove-name.js.map +1 -1
- package/dist/mongo-migrations/20231111081809-printer-flatten-name.js.map +1 -1
- package/dist/mongo-migrations/20231111082521-printer-remove-settingsappearance.js.map +1 -1
- package/dist/mongo-migrations/20231202183902-printer-files-simpler.js.map +1 -1
- package/dist/server.constants.js +8 -4
- package/dist/server.constants.js.map +1 -1
- package/dist/server.core.js +29 -2
- package/dist/server.core.js.map +1 -1
- package/dist/server.env.js +22 -18
- package/dist/server.env.js.map +1 -1
- package/dist/server.host.js +24 -33
- package/dist/server.host.js.map +1 -1
- package/dist/services/authentication/auth.service.js +15 -20
- package/dist/services/authentication/auth.service.js.map +1 -1
- package/dist/services/authentication/jwt.service.js +1 -1
- package/dist/services/authentication/jwt.service.js.map +1 -1
- package/dist/services/core/batch-call.service.js +23 -25
- package/dist/services/core/batch-call.service.js.map +1 -1
- package/dist/services/core/client-bundle.service.js +78 -136
- package/dist/services/core/client-bundle.service.js.map +1 -1
- package/dist/services/core/config.service.js.map +1 -1
- package/dist/services/core/cradle.service.js +21 -0
- package/dist/services/core/cradle.service.js.map +1 -0
- package/dist/services/core/github.service.js +2 -2
- package/dist/services/core/github.service.js.map +1 -1
- package/dist/services/core/http-client.factory.js +1 -1
- package/dist/services/core/http-client.factory.js.map +1 -1
- package/dist/services/core/logs-manager.service.js +3 -3
- package/dist/services/core/logs-manager.service.js.map +1 -1
- package/dist/services/core/monsterpi.service.js +1 -1
- package/dist/services/core/monsterpi.service.js.map +1 -1
- package/dist/services/core/multer.service.js +8 -7
- package/dist/services/core/multer.service.js.map +1 -1
- package/dist/services/core/server-release.service.js +14 -8
- package/dist/services/core/server-release.service.js.map +1 -1
- package/dist/services/core/yaml.service.js +16 -17
- package/dist/services/core/yaml.service.js.map +1 -1
- package/dist/services/interfaces/camera-stream.dto.js +4 -34
- package/dist/services/interfaces/camera-stream.dto.js.map +1 -1
- package/dist/services/interfaces/custom-gcode.dto.js.map +1 -1
- package/dist/services/interfaces/floor.dto.js +5 -47
- package/dist/services/interfaces/floor.dto.js.map +1 -1
- package/dist/services/interfaces/login.dto.js +2 -0
- package/dist/services/interfaces/login.dto.js.map +1 -1
- package/dist/services/interfaces/print-completion.dto.js.map +1 -1
- package/dist/services/interfaces/printer-group.dto.js +0 -14
- package/dist/services/interfaces/printer-group.dto.js.map +1 -1
- package/dist/services/interfaces/printer.dto.js +11 -11
- package/dist/services/interfaces/printer.dto.js.map +1 -1
- package/dist/services/interfaces/settings.dto.js.map +1 -1
- package/dist/services/interfaces/task.interfaces.js +6 -0
- package/dist/services/interfaces/task.interfaces.js.map +1 -0
- package/dist/services/mongoose/camera-stream.service.js +17 -15
- package/dist/services/mongoose/camera-stream.service.js.map +1 -1
- package/dist/services/mongoose/custom-gcode.service.js +4 -2
- package/dist/services/mongoose/custom-gcode.service.js.map +1 -1
- package/dist/services/mongoose/floor.service.js +37 -30
- package/dist/services/mongoose/floor.service.js.map +1 -1
- package/dist/services/mongoose/permission.service.js +1 -1
- package/dist/services/mongoose/permission.service.js.map +1 -1
- package/dist/services/mongoose/print-completion.service.js +2 -2
- package/dist/services/mongoose/print-completion.service.js.map +1 -1
- package/dist/services/mongoose/print-completion.shared.js +2 -2
- package/dist/services/mongoose/print-completion.shared.js.map +1 -1
- package/dist/services/mongoose/printer.service.js +33 -45
- package/dist/services/mongoose/printer.service.js.map +1 -1
- package/dist/services/mongoose/refresh-token.service.js +5 -8
- package/dist/services/mongoose/refresh-token.service.js.map +1 -1
- package/dist/services/mongoose/role.service.js +14 -5
- package/dist/services/mongoose/role.service.js.map +1 -1
- package/dist/services/mongoose/settings.service.js +35 -62
- package/dist/services/mongoose/settings.service.js.map +1 -1
- package/dist/services/mongoose/user.service.js +8 -7
- package/dist/services/mongoose/user.service.js.map +1 -1
- package/dist/services/moonraker/constants/{websocket.constants.js → moonraker.constants.js} +1 -1
- package/dist/services/moonraker/constants/{websocket.constants.js.map → moonraker.constants.js.map} +1 -1
- package/dist/services/moonraker/moonraker-websocket.adapter.js +109 -96
- package/dist/services/moonraker/moonraker-websocket.adapter.js.map +1 -1
- package/dist/services/moonraker/moonraker.client.js +25 -16
- package/dist/services/moonraker/moonraker.client.js.map +1 -1
- package/dist/services/moonraker.api.js +5 -7
- package/dist/services/moonraker.api.js.map +1 -1
- package/dist/services/octoprint/constants/octoprint-service.constants.js +7 -36
- package/dist/services/octoprint/constants/octoprint-service.constants.js.map +1 -1
- package/dist/services/octoprint/constants/octoprint-websocket.constants.js +12 -3
- package/dist/services/octoprint/constants/octoprint-websocket.constants.js.map +1 -1
- package/dist/services/octoprint/dto/octoprint-event.dto.js +2 -1
- package/dist/services/octoprint/dto/octoprint-event.dto.js.map +1 -1
- package/dist/services/octoprint/octoprint-api.routes.js +1 -38
- package/dist/services/octoprint/octoprint-api.routes.js.map +1 -1
- package/dist/services/octoprint/octoprint-websocket.adapter.js +66 -72
- package/dist/services/octoprint/octoprint-websocket.adapter.js.map +1 -1
- package/dist/services/octoprint/octoprint.client.js +19 -192
- package/dist/services/octoprint/octoprint.client.js.map +1 -1
- package/dist/services/octoprint/utils/octoprint-http-client.builder.js.map +1 -1
- package/dist/services/octoprint.api.js +10 -19
- package/dist/services/octoprint.api.js.map +1 -1
- package/dist/services/orm/base.service.js +11 -12
- package/dist/services/orm/base.service.js.map +1 -1
- package/dist/services/orm/camera-stream.service.js +5 -1
- package/dist/services/orm/camera-stream.service.js.map +1 -1
- package/dist/services/orm/custom-gcode.service.js +2 -2
- package/dist/services/orm/custom-gcode.service.js.map +1 -1
- package/dist/services/orm/floor-position.service.js +0 -5
- package/dist/services/orm/floor-position.service.js.map +1 -1
- package/dist/services/orm/floor.service.js +43 -39
- package/dist/services/orm/floor.service.js.map +1 -1
- package/dist/services/orm/permission.service.js +3 -4
- package/dist/services/orm/permission.service.js.map +1 -1
- package/dist/services/orm/print-completion.service.js +2 -4
- package/dist/services/orm/print-completion.service.js.map +1 -1
- package/dist/services/orm/printer-group.service.js +2 -7
- package/dist/services/orm/printer-group.service.js.map +1 -1
- package/dist/services/orm/printer.service.js +21 -36
- package/dist/services/orm/printer.service.js.map +1 -1
- package/dist/services/orm/refresh-token.service.js +5 -11
- package/dist/services/orm/refresh-token.service.js.map +1 -1
- package/dist/services/orm/role.service.js +11 -10
- package/dist/services/orm/role.service.js.map +1 -1
- package/dist/services/orm/settings.service.js +37 -133
- package/dist/services/orm/settings.service.js.map +1 -1
- package/dist/services/orm/user.service.js +13 -15
- package/dist/services/orm/user.service.js.map +1 -1
- package/dist/services/printer-api.factory.js +9 -6
- package/dist/services/printer-api.factory.js.map +1 -1
- package/dist/services/printer-api.interface.js +13 -6
- package/dist/services/printer-api.interface.js.map +1 -1
- package/dist/services/prusa-link/constants/prusalink-event.dto.js +18 -0
- package/dist/services/prusa-link/constants/prusalink-event.dto.js.map +1 -0
- package/dist/services/prusa-link/constants/prusalink.constants.js +13 -0
- package/dist/services/prusa-link/constants/prusalink.constants.js.map +1 -0
- package/dist/services/prusa-link/dto/file-response.dto.js +6 -0
- package/dist/services/prusa-link/dto/file-response.dto.js.map +1 -0
- package/dist/services/{octoprint/dto/plugin.dto.js → prusa-link/dto/file.dto.js} +1 -1
- package/dist/services/prusa-link/dto/file.dto.js.map +1 -0
- package/dist/services/prusa-link/dto/job-state.dto.js +6 -0
- package/dist/services/prusa-link/dto/job-state.dto.js.map +1 -0
- package/dist/services/prusa-link/dto/printer-state.dto.js +6 -0
- package/dist/services/prusa-link/dto/printer-state.dto.js.map +1 -0
- package/dist/services/prusa-link/dto/status.dto.js +6 -0
- package/dist/services/prusa-link/dto/status.dto.js.map +1 -0
- package/dist/services/prusa-link/dto/version.dto.js +6 -0
- package/dist/services/prusa-link/dto/version.dto.js.map +1 -0
- package/dist/services/prusa-link/prusa-link-http-polling.adapter.js +142 -0
- package/dist/services/prusa-link/prusa-link-http-polling.adapter.js.map +1 -0
- package/dist/services/prusa-link/prusa-link.api.js +235 -0
- package/dist/services/prusa-link/prusa-link.api.js.map +1 -0
- package/dist/services/prusa-link/utils/digest-auth.params.js +6 -0
- package/dist/services/prusa-link/utils/digest-auth.params.js.map +1 -0
- package/dist/services/prusa-link/utils/digest-auth.util.js +28 -0
- package/dist/services/prusa-link/utils/digest-auth.util.js.map +1 -0
- package/dist/services/prusa-link/utils/prusa-link-http-client.builder.js +131 -0
- package/dist/services/prusa-link/utils/prusa-link-http-client.builder.js.map +1 -0
- package/dist/services/socket.factory.js +9 -6
- package/dist/services/socket.factory.js.map +1 -1
- package/dist/services/{core/task-manager.service.js → task-manager.service.js} +72 -78
- package/dist/services/task-manager.service.js.map +1 -0
- package/dist/services/validators/camera-service.validation.js +19 -0
- package/dist/services/validators/camera-service.validation.js.map +1 -0
- package/dist/services/validators/floor-service.validation.js +47 -36
- package/dist/services/validators/floor-service.validation.js.map +1 -1
- package/dist/services/validators/print-completion-service.validation.js +22 -9
- package/dist/services/validators/print-completion-service.validation.js.map +1 -1
- package/dist/services/validators/printer-service.validation.js +112 -29
- package/dist/services/validators/printer-service.validation.js.map +1 -1
- package/dist/services/validators/settings-service.validation.js +79 -66
- package/dist/services/validators/settings-service.validation.js.map +1 -1
- package/dist/services/validators/user-service.validation.js +17 -16
- package/dist/services/validators/user-service.validation.js.map +1 -1
- package/dist/services/validators/yaml-service.validation.js +94 -51
- package/dist/services/validators/yaml-service.validation.js.map +1 -1
- package/dist/shared/default-http-client.builder.js.map +1 -1
- package/dist/shared/load-controllers.js +20 -0
- package/dist/shared/load-controllers.js.map +1 -0
- package/dist/shared/runtime-settings.migration.js +53 -0
- package/dist/shared/runtime-settings.migration.js.map +1 -0
- package/dist/shared/websocket-rpc-extended.adapter.js +15 -14
- package/dist/shared/websocket-rpc-extended.adapter.js.map +1 -1
- package/dist/shared/websocket.adapter.js +4 -5
- package/dist/shared/websocket.adapter.js.map +1 -1
- package/dist/state/file-upload-tracker.cache.js +5 -4
- package/dist/state/file-upload-tracker.cache.js.map +1 -1
- package/dist/state/file.cache.js +1 -1
- package/dist/state/file.cache.js.map +1 -1
- package/dist/state/floor.store.js +6 -6
- package/dist/state/floor.store.js.map +1 -1
- package/dist/state/printer-events.cache.js +21 -22
- package/dist/state/printer-events.cache.js.map +1 -1
- package/dist/state/printer-files.store.js +6 -8
- package/dist/state/printer-files.store.js.map +1 -1
- package/dist/state/printer-socket.store.js +27 -50
- package/dist/state/printer-socket.store.js.map +1 -1
- package/dist/state/printer-thumbnail.cache.js +5 -9
- package/dist/state/printer-thumbnail.cache.js.map +1 -1
- package/dist/state/printer.cache.js +14 -12
- package/dist/state/printer.cache.js.map +1 -1
- package/dist/state/settings.store.js +74 -50
- package/dist/state/settings.store.js.map +1 -1
- package/dist/state/socket-io.gateway.js +39 -36
- package/dist/state/socket-io.gateway.js.map +1 -1
- package/dist/state/test-printer-socket.store.js +20 -15
- package/dist/state/test-printer-socket.store.js.map +1 -1
- package/dist/state/validation/create-test-printer.validation.js +13 -11
- package/dist/state/validation/create-test-printer.validation.js.map +1 -1
- package/dist/task.presets.js.map +1 -1
- package/dist/tasks/boot.task.js +14 -19
- package/dist/tasks/boot.task.js.map +1 -1
- package/dist/tasks/client-bundle.task.js +1 -3
- package/dist/tasks/client-bundle.task.js.map +1 -1
- package/dist/tasks/print-completion.socketio.task.js +27 -28
- package/dist/tasks/print-completion.socketio.task.js.map +1 -1
- package/dist/tasks/printer-file-clean.task.js +6 -10
- package/dist/tasks/printer-file-clean.task.js.map +1 -1
- package/dist/tasks/printer-websocket-restore.task.js +3 -14
- package/dist/tasks/printer-websocket-restore.task.js.map +1 -1
- package/dist/tasks/printer-websocket.task.js +2 -14
- package/dist/tasks/printer-websocket.task.js.map +1 -1
- package/dist/tasks/socketio.task.js +6 -33
- package/dist/tasks/socketio.task.js.map +1 -1
- package/dist/tasks/software-update.task.js +1 -1
- package/dist/tasks/software-update.task.js.map +1 -1
- package/dist/tasks.js +3 -3
- package/dist/tasks.js.map +1 -1
- package/dist/utils/array.util.js.map +1 -1
- package/dist/utils/cache/key-diff.cache.js.map +1 -1
- package/dist/utils/env.utils.js +0 -2
- package/dist/utils/env.utils.js.map +1 -1
- package/dist/utils/normalize-url.js +3 -2
- package/dist/utils/normalize-url.js.map +1 -1
- package/dist/utils/printer-type.utils.js.map +1 -1
- package/dist/utils/time.utils.js +7 -17
- package/dist/utils/time.utils.js.map +1 -1
- package/dist/utils/url.utils.js +3 -4
- package/dist/utils/url.utils.js.map +1 -1
- package/package.json +46 -48
- package/tsconfig.json +2 -1
- package/.yarn/releases/yarn-4.7.0.cjs +0 -935
- package/dist/consoles/check-ports.js +0 -170
- package/dist/consoles/check-ports.js.map +0 -1
- package/dist/consoles/http-file-receiver.console.js +0 -81
- package/dist/consoles/http-file-receiver.console.js.map +0 -1
- package/dist/consoles/sqlite-torm.js +0 -31
- package/dist/consoles/sqlite-torm.js.map +0 -1
- package/dist/consoles/upload-test.js +0 -52
- package/dist/consoles/upload-test.js.map +0 -1
- package/dist/controllers/plugin-firmware-update.controller.js +0 -234
- package/dist/controllers/plugin-firmware-update.controller.js.map +0 -1
- package/dist/entities/base.entity.js +0 -29
- package/dist/entities/base.entity.js.map +0 -1
- package/dist/entities/printer-file.entity.js +0 -140
- package/dist/entities/printer-file.entity.js.map +0 -1
- package/dist/handlers/cache-manager.js +0 -18
- package/dist/handlers/cache-manager.js.map +0 -1
- package/dist/models/PrinterFile.js +0 -44
- package/dist/models/PrinterFile.js.map +0 -1
- package/dist/services/core/task-manager.service.js.map +0 -1
- package/dist/services/octoprint/dto/plugin.dto.js.map +0 -1
- package/dist/services/octoprint/plugin-base.service.js +0 -101
- package/dist/services/octoprint/plugin-base.service.js.map +0 -1
- package/dist/services/octoprint/plugin-firmware-update.service.js +0 -100
- package/dist/services/octoprint/plugin-firmware-update.service.js.map +0 -1
- package/dist/services/octoprint/plugin-repository.cache.js +0 -46
- package/dist/services/octoprint/plugin-repository.cache.js.map +0 -1
- package/dist/utils/benchmark.util.js +0 -39
- package/dist/utils/benchmark.util.js.map +0 -1
- package/dist/utils/is-docker.js +0 -40
- package/dist/utils/is-docker.js.map +0 -1
- package/dist/utils/metric.utils.js +0 -35
- package/dist/utils/metric.utils.js.map +0 -1
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "PrusaLinkHttpPollingAdapter", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return PrusaLinkHttpPollingAdapter;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _printerapiinterface = require("../printer-api.interface");
|
|
12
|
+
const _errorutils = require("../../utils/error.utils");
|
|
13
|
+
const _prusalinkconstants = require("./constants/prusalink.constants");
|
|
14
|
+
const defaultLog = {
|
|
15
|
+
adapter: "prusa-link"
|
|
16
|
+
};
|
|
17
|
+
class PrusaLinkHttpPollingAdapter {
|
|
18
|
+
prusaLinkApi;
|
|
19
|
+
eventEmitter2;
|
|
20
|
+
configService;
|
|
21
|
+
printerType;
|
|
22
|
+
printerId;
|
|
23
|
+
login;
|
|
24
|
+
socketState;
|
|
25
|
+
apiState;
|
|
26
|
+
lastMessageReceivedTimestamp;
|
|
27
|
+
refreshPrinterCurrentInterval;
|
|
28
|
+
eventEmittingAllowed;
|
|
29
|
+
constructor(loggerFactory, prusaLinkApi, eventEmitter2, configService){
|
|
30
|
+
this.prusaLinkApi = prusaLinkApi;
|
|
31
|
+
this.eventEmitter2 = eventEmitter2;
|
|
32
|
+
this.configService = configService;
|
|
33
|
+
this.printerType = _printerapiinterface.PrusaLinkType;
|
|
34
|
+
this.eventEmittingAllowed = true;
|
|
35
|
+
this.logger = loggerFactory(PrusaLinkHttpPollingAdapter.name);
|
|
36
|
+
}
|
|
37
|
+
allowEmittingEvents() {
|
|
38
|
+
this.eventEmittingAllowed = true;
|
|
39
|
+
}
|
|
40
|
+
disallowEmittingEvents() {
|
|
41
|
+
this.eventEmittingAllowed = false;
|
|
42
|
+
}
|
|
43
|
+
needsReopen() {
|
|
44
|
+
return !this.refreshPrinterCurrentInterval;
|
|
45
|
+
}
|
|
46
|
+
needsSetup() {
|
|
47
|
+
return !this.refreshPrinterCurrentInterval;
|
|
48
|
+
}
|
|
49
|
+
needsReauth() {
|
|
50
|
+
throw new Error("Method not implemented.");
|
|
51
|
+
}
|
|
52
|
+
isClosedOrAborted() {
|
|
53
|
+
throw new Error("Method not implemented.");
|
|
54
|
+
}
|
|
55
|
+
reauthSession() {
|
|
56
|
+
throw new Error("Method not implemented.");
|
|
57
|
+
}
|
|
58
|
+
registerCredentials(socketLogin) {
|
|
59
|
+
this.login = socketLogin.loginDto;
|
|
60
|
+
this.printerId = socketLogin.printerId;
|
|
61
|
+
}
|
|
62
|
+
open() {
|
|
63
|
+
this.startPolling();
|
|
64
|
+
}
|
|
65
|
+
close() {
|
|
66
|
+
this.logger.debug("Polling adapter attempting stoppage.", this.logMeta());
|
|
67
|
+
this.stopPolling();
|
|
68
|
+
}
|
|
69
|
+
setupSocketSession() {
|
|
70
|
+
this.logger.warn("SetupSocketSession", defaultLog);
|
|
71
|
+
return Promise.resolve();
|
|
72
|
+
}
|
|
73
|
+
resetSocketState() {
|
|
74
|
+
this.logger.warn("ResetSocketState", defaultLog);
|
|
75
|
+
}
|
|
76
|
+
startPolling() {
|
|
77
|
+
this.stopPolling();
|
|
78
|
+
this.logger.debug("Polling adapter starting, setting interval.", this.logMeta());
|
|
79
|
+
this.refreshPrinterCurrentInterval = setInterval(async ()=>{
|
|
80
|
+
if (!this.printerId) {
|
|
81
|
+
this.logger.warn("Printer ID is not set, skipping status check.", this.logMeta());
|
|
82
|
+
this.stopPolling();
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this.socketState = "opening";
|
|
86
|
+
try {
|
|
87
|
+
this.prusaLinkApi.login = {
|
|
88
|
+
printerURL: this.login.printerURL,
|
|
89
|
+
username: this.login.username,
|
|
90
|
+
password: this.login.password,
|
|
91
|
+
apiKey: "",
|
|
92
|
+
printerType: _printerapiinterface.PrusaLinkType
|
|
93
|
+
};
|
|
94
|
+
this.socketState = "authenticating";
|
|
95
|
+
const printerState = await this.prusaLinkApi.getPrinterState();
|
|
96
|
+
if (printerState.state.flags?.link_state && printerState.state.flags?.link_state !== "PRINTING") {
|
|
97
|
+
printerState.state.text = printerState.state.flags.link_state;
|
|
98
|
+
}
|
|
99
|
+
const jobState = await this.prusaLinkApi.getJobState();
|
|
100
|
+
this.socketState = "authenticated";
|
|
101
|
+
this.apiState = "responding";
|
|
102
|
+
await this.emitEvent("current", {
|
|
103
|
+
...printerState,
|
|
104
|
+
job: jobState.job,
|
|
105
|
+
progress: {
|
|
106
|
+
printTime: jobState.progress?.printTime,
|
|
107
|
+
printTimeLeft: jobState.progress?.printTimeLeft,
|
|
108
|
+
completion: jobState.progress?.completion * 100
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
} catch (error) {
|
|
112
|
+
this.socketState = "error";
|
|
113
|
+
this.logger.error(`Failed to fetch PrusaLink status ${(0, _errorutils.errorSummary)(error)}`, this.logMeta());
|
|
114
|
+
}
|
|
115
|
+
}, 5000);
|
|
116
|
+
}
|
|
117
|
+
stopPolling() {
|
|
118
|
+
if (this.refreshPrinterCurrentInterval) {
|
|
119
|
+
this.logger.debug("Polling adapter stopping, clearing interval.", this.logMeta());
|
|
120
|
+
clearInterval(this.refreshPrinterCurrentInterval);
|
|
121
|
+
this.refreshPrinterCurrentInterval = undefined;
|
|
122
|
+
this.socketState = "closed";
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async emitEvent(event, payload) {
|
|
126
|
+
if (!this.eventEmittingAllowed) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
this.logger.debug(`Emitting event ${(0, _prusalinkconstants.prusaLinkEvent)(event)}`, this.logMeta());
|
|
130
|
+
await this.eventEmitter2.emitAsync((0, _prusalinkconstants.prusaLinkEvent)(event), {
|
|
131
|
+
event,
|
|
132
|
+
payload,
|
|
133
|
+
printerId: this.printerId,
|
|
134
|
+
printerType: _printerapiinterface.PrusaLinkType
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
logMeta() {
|
|
138
|
+
return defaultLog;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
//# sourceMappingURL=prusa-link-http-polling.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/services/prusa-link/prusa-link-http-polling.adapter.ts"],"names":["PrusaLinkHttpPollingAdapter","defaultLog","adapter","printerType","printerId","login","socketState","apiState","lastMessageReceivedTimestamp","refreshPrinterCurrentInterval","eventEmittingAllowed","constructor","loggerFactory","prusaLinkApi","eventEmitter2","configService","PrusaLinkType","logger","name","allowEmittingEvents","disallowEmittingEvents","needsReopen","needsSetup","needsReauth","Error","isClosedOrAborted","reauthSession","registerCredentials","socketLogin","loginDto","open","startPolling","close","debug","logMeta","stopPolling","setupSocketSession","warn","Promise","resolve","resetSocketState","setInterval","printerURL","username","password","apiKey","printerState","getPrinterState","state","flags","link_state","text","jobState","getJobState","emitEvent","job","progress","printTime","printTimeLeft","completion","error","errorSummary","clearInterval","undefined","event","payload","prusaLinkEvent","emitAsync"],"mappings":"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"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "PrusaLinkApi", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return PrusaLinkApi;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _printerapiinterface = require("../printer-api.interface");
|
|
12
|
+
const _prusalinkhttpclientbuilder = require("./utils/prusa-link-http-client.builder");
|
|
13
|
+
const _fs = require("fs");
|
|
14
|
+
const _eventconstants = require("../../constants/event.constants");
|
|
15
|
+
const _runtimeexceptions = require("../../exceptions/runtime.exceptions");
|
|
16
|
+
const defaultLog = {
|
|
17
|
+
adapter: "prusa-link"
|
|
18
|
+
};
|
|
19
|
+
class PrusaLinkApi {
|
|
20
|
+
eventEmitter2;
|
|
21
|
+
httpClientFactory;
|
|
22
|
+
settingsStore;
|
|
23
|
+
printerLogin;
|
|
24
|
+
logger;
|
|
25
|
+
authHeader;
|
|
26
|
+
constructor(loggerFactory, eventEmitter2, httpClientFactory, settingsStore, printerLogin){
|
|
27
|
+
this.eventEmitter2 = eventEmitter2;
|
|
28
|
+
this.httpClientFactory = httpClientFactory;
|
|
29
|
+
this.settingsStore = settingsStore;
|
|
30
|
+
this.printerLogin = printerLogin;
|
|
31
|
+
this.authHeader = null;
|
|
32
|
+
this.logger = loggerFactory(PrusaLinkApi.name);
|
|
33
|
+
this.logger.debug("Constructed api client", this.logMeta());
|
|
34
|
+
}
|
|
35
|
+
get type() {
|
|
36
|
+
return _printerapiinterface.PrusaLinkType;
|
|
37
|
+
}
|
|
38
|
+
set login(login) {
|
|
39
|
+
this.printerLogin = login;
|
|
40
|
+
}
|
|
41
|
+
get client() {
|
|
42
|
+
return this.createClient();
|
|
43
|
+
}
|
|
44
|
+
async getVersion() {
|
|
45
|
+
const response = await this.client.get("/api/version");
|
|
46
|
+
return response.data.server;
|
|
47
|
+
}
|
|
48
|
+
async getFiles() {
|
|
49
|
+
const response = await this.client.get("/api/files");
|
|
50
|
+
return response.data.files.filter((dir)=>dir.path === "/usb")[0].children.map((f)=>({
|
|
51
|
+
path: f.display,
|
|
52
|
+
date: null,
|
|
53
|
+
size: -1
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
async getFile(path) {
|
|
57
|
+
const response = await this.getFileRaw(path);
|
|
58
|
+
return {
|
|
59
|
+
path: response.data.name,
|
|
60
|
+
size: response.data.size,
|
|
61
|
+
date: null
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
async getStatus() {
|
|
65
|
+
const response = await this.client.get("/api/v1/status");
|
|
66
|
+
return response.data;
|
|
67
|
+
}
|
|
68
|
+
async getPrinterState() {
|
|
69
|
+
const response = await this.client.get("/api/printer");
|
|
70
|
+
return response.data;
|
|
71
|
+
}
|
|
72
|
+
async getJobState() {
|
|
73
|
+
const response = await this.client.get("/api/job");
|
|
74
|
+
return response.data;
|
|
75
|
+
}
|
|
76
|
+
connect() {
|
|
77
|
+
throw new Error("Method not implemented.");
|
|
78
|
+
}
|
|
79
|
+
disconnect() {
|
|
80
|
+
throw new Error("Method not implemented.");
|
|
81
|
+
}
|
|
82
|
+
restartServer() {
|
|
83
|
+
throw new Error("Method not implemented.");
|
|
84
|
+
}
|
|
85
|
+
restartHost() {
|
|
86
|
+
throw new Error("Method not implemented.");
|
|
87
|
+
}
|
|
88
|
+
restartPrinterFirmware() {
|
|
89
|
+
throw new Error("Method not implemented.");
|
|
90
|
+
}
|
|
91
|
+
async startPrint(path) {
|
|
92
|
+
await this.client.post(`/api/v1/files/usb/${path}`);
|
|
93
|
+
}
|
|
94
|
+
async pausePrint() {
|
|
95
|
+
const jobId = await this.getCurrentJobId();
|
|
96
|
+
if (!jobId) {
|
|
97
|
+
this.logger.warn("Job pause command did not complete, job or job id not set");
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
await this.client.put(`/api/v1/job/${jobId}/pause`);
|
|
101
|
+
}
|
|
102
|
+
async resumePrint() {
|
|
103
|
+
const jobId = await this.getCurrentJobId();
|
|
104
|
+
if (!jobId) {
|
|
105
|
+
this.logger.warn("Job resume command did not complete, job or job id not set");
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
await this.client.put(`/api/v1/job/${jobId}/resume`);
|
|
109
|
+
}
|
|
110
|
+
async cancelPrint() {
|
|
111
|
+
const jobId = await this.getCurrentJobId();
|
|
112
|
+
if (!jobId) {
|
|
113
|
+
this.logger.warn("Job cancel command did not complete, job or job id not set");
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
await this.client.delete(`/api/v1/job/${jobId}`);
|
|
117
|
+
}
|
|
118
|
+
quickStop() {
|
|
119
|
+
throw new Error("Method not implemented.");
|
|
120
|
+
}
|
|
121
|
+
sendGcode(script) {
|
|
122
|
+
throw new Error("Method not implemented.");
|
|
123
|
+
}
|
|
124
|
+
movePrintHead(amounts) {
|
|
125
|
+
throw new Error("Method not implemented.");
|
|
126
|
+
}
|
|
127
|
+
homeAxes(axes) {
|
|
128
|
+
throw new Error("Method not implemented.");
|
|
129
|
+
}
|
|
130
|
+
async downloadFile(path) {
|
|
131
|
+
const fileReference = await this.getFileRaw(path);
|
|
132
|
+
const pathUrl = fileReference.data.refs.download;
|
|
133
|
+
return await this.client.get(pathUrl, {
|
|
134
|
+
responseType: "stream"
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
async getFileChunk(path, startBytes, endBytes) {
|
|
138
|
+
const fileReference = await this.getFileRaw(path);
|
|
139
|
+
const pathUrl = fileReference.data.refs.download;
|
|
140
|
+
return await this.createClient((o)=>o.withHeaders({
|
|
141
|
+
Range: `bytes=${startBytes}-${endBytes}`
|
|
142
|
+
})).get(pathUrl);
|
|
143
|
+
}
|
|
144
|
+
async uploadFile(multerFileOrBuffer, startPrint, progressToken) {
|
|
145
|
+
try {
|
|
146
|
+
let fileBuffer;
|
|
147
|
+
const filename = multerFileOrBuffer.originalname;
|
|
148
|
+
if (Buffer.isBuffer(multerFileOrBuffer)) {
|
|
149
|
+
this.logger.log("Using file directly from memory buffer for upload");
|
|
150
|
+
fileBuffer = multerFileOrBuffer;
|
|
151
|
+
} else {
|
|
152
|
+
const filePath = multerFileOrBuffer.path;
|
|
153
|
+
this.logger.log(`Reading file from disk for upload: ${filePath}`);
|
|
154
|
+
fileBuffer = (0, _fs.readFileSync)(filePath);
|
|
155
|
+
}
|
|
156
|
+
const contentLength = fileBuffer.length;
|
|
157
|
+
const response = await this.createClient((b)=>{
|
|
158
|
+
b.withHeaders({
|
|
159
|
+
"Content-Length": contentLength.toString(),
|
|
160
|
+
"Overwrite": "?1",
|
|
161
|
+
"Print-After-Upload": startPrint ? "?1" : "?0"
|
|
162
|
+
}).withTimeout(this.settingsStore.getTimeoutSettings().apiUploadTimeout).withOnUploadProgress((p)=>{
|
|
163
|
+
if (progressToken) {
|
|
164
|
+
this.eventEmitter2.emit(`${(0, _eventconstants.uploadProgressEvent)(progressToken)}`, progressToken, p);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
}).put(`/api/v1/files/usb/${encodeURIComponent(filename)}`, fileBuffer);
|
|
168
|
+
if (progressToken) {
|
|
169
|
+
this.eventEmitter2.emit(`${(0, _eventconstants.uploadDoneEvent)(progressToken)}`, progressToken);
|
|
170
|
+
}
|
|
171
|
+
return response.data;
|
|
172
|
+
} catch (e) {
|
|
173
|
+
if (progressToken) {
|
|
174
|
+
this.eventEmitter2.emit(`${(0, _eventconstants.uploadFailedEvent)(progressToken)}`, progressToken, e?.message);
|
|
175
|
+
}
|
|
176
|
+
let data;
|
|
177
|
+
try {
|
|
178
|
+
data = JSON.parse(e.response?.body);
|
|
179
|
+
} catch {
|
|
180
|
+
data = e.response?.body;
|
|
181
|
+
}
|
|
182
|
+
throw new _runtimeexceptions.ExternalServiceError({
|
|
183
|
+
error: e.message,
|
|
184
|
+
statusCode: e.response?.statusCode,
|
|
185
|
+
data,
|
|
186
|
+
success: false,
|
|
187
|
+
stack: e.stack
|
|
188
|
+
}, "Prusa-Link");
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
async deleteFile(path) {
|
|
192
|
+
await this.client.delete(`/api/v1/files/usb/${path}`);
|
|
193
|
+
}
|
|
194
|
+
async deleteFolder(path) {
|
|
195
|
+
await this.client.delete(`/api/v1/files/usb/${path}`);
|
|
196
|
+
}
|
|
197
|
+
getSettings() {
|
|
198
|
+
throw new Error("Method not implemented.");
|
|
199
|
+
}
|
|
200
|
+
getReprintState() {
|
|
201
|
+
throw new Error("Method not implemented.");
|
|
202
|
+
}
|
|
203
|
+
getFileRaw(path) {
|
|
204
|
+
return this.client.get(`/api/v1/files/usb/${path}`);
|
|
205
|
+
}
|
|
206
|
+
async getCurrentJobId() {
|
|
207
|
+
const status = await this.getStatus();
|
|
208
|
+
return status.job?.id;
|
|
209
|
+
}
|
|
210
|
+
createClient(buildFluentOptions) {
|
|
211
|
+
const builder = new _prusalinkhttpclientbuilder.PrusaLinkHttpClientBuilder();
|
|
212
|
+
return this.httpClientFactory.createClientWithBaseUrl(builder, this.printerLogin.printerURL, (b)=>{
|
|
213
|
+
this.logger.debug("Building API client", this.logMeta());
|
|
214
|
+
b.withDigestAuth(this.printerLogin.username, this.printerLogin.password, (error)=>{
|
|
215
|
+
this.logger.error("Authentication error occurred", error);
|
|
216
|
+
}, (error, attemptCount)=>{
|
|
217
|
+
this.logger.log(`Authentication attempt count ${attemptCount} for method ${error.config?.method?.toUpperCase()} path ${error.config?.url}`, this.logMeta());
|
|
218
|
+
}, (authHeader)=>{
|
|
219
|
+
this.logger.debug("Authentication successful, saving auth header for later reuse", this.logMeta());
|
|
220
|
+
this.authHeader = authHeader;
|
|
221
|
+
});
|
|
222
|
+
if (this.authHeader) {
|
|
223
|
+
b.withAuthHeader(this.authHeader);
|
|
224
|
+
}
|
|
225
|
+
if (buildFluentOptions && typeof buildFluentOptions === "function") {
|
|
226
|
+
buildFluentOptions(b);
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
logMeta() {
|
|
231
|
+
return defaultLog;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
//# sourceMappingURL=prusa-link.api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/services/prusa-link/prusa-link.api.ts"],"names":["PrusaLinkApi","defaultLog","adapter","logger","authHeader","constructor","loggerFactory","eventEmitter2","httpClientFactory","settingsStore","printerLogin","name","debug","logMeta","type","PrusaLinkType","login","client","createClient","getVersion","response","get","data","server","getFiles","files","filter","dir","path","children","map","f","display","date","size","getFile","getFileRaw","getStatus","getPrinterState","getJobState","connect","Error","disconnect","restartServer","restartHost","restartPrinterFirmware","startPrint","post","pausePrint","jobId","getCurrentJobId","warn","put","resumePrint","cancelPrint","delete","quickStop","sendGcode","script","movePrintHead","amounts","homeAxes","axes","downloadFile","fileReference","pathUrl","refs","download","responseType","getFileChunk","startBytes","endBytes","o","withHeaders","Range","uploadFile","multerFileOrBuffer","progressToken","fileBuffer","filename","originalname","Buffer","isBuffer","log","filePath","readFileSync","contentLength","length","b","toString","withTimeout","getTimeoutSettings","apiUploadTimeout","withOnUploadProgress","p","emit","uploadProgressEvent","encodeURIComponent","uploadDoneEvent","e","uploadFailedEvent","message","JSON","parse","body","ExternalServiceError","error","statusCode","success","stack","deleteFile","deleteFolder","getSettings","getReprintState","status","job","id","buildFluentOptions","builder","PrusaLinkHttpClientBuilder","createClientWithBaseUrl","printerURL","withDigestAuth","username","password","attemptCount","config","method","toUpperCase","url","withAuthHeader"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/services/prusa-link/utils/digest-auth.params.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "generateDigestAuthHeader", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return generateDigestAuthHeader;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _nodecrypto = require("node:crypto");
|
|
12
|
+
function generateDigestAuthHeader(params) {
|
|
13
|
+
const { username, password, method, uri, realm, nonce, qop, nc, cnonce } = params;
|
|
14
|
+
const ha1 = (0, _nodecrypto.createHash)("md5").update(`${username}:${realm}:${password}`).digest("hex");
|
|
15
|
+
const ha2 = (0, _nodecrypto.createHash)("md5").update(`${method}:${uri}`).digest("hex");
|
|
16
|
+
let response;
|
|
17
|
+
let authHeader;
|
|
18
|
+
if (qop) {
|
|
19
|
+
response = (0, _nodecrypto.createHash)("md5").update(`${ha1}:${nonce}:${nc}:${cnonce}:${qop}:${ha2}`).digest("hex");
|
|
20
|
+
authHeader = `Digest username="${username}", realm="${realm}", nonce="${nonce}", uri="${uri}", qop=${qop}, nc=${nc}, cnonce="${cnonce}", response="${response}"`;
|
|
21
|
+
} else {
|
|
22
|
+
response = (0, _nodecrypto.createHash)("md5").update(`${ha1}:${nonce}:${ha2}`).digest("hex");
|
|
23
|
+
authHeader = `Digest username="${username}", realm="${realm}", nonce="${nonce}", uri="${uri}", response="${response}"`;
|
|
24
|
+
}
|
|
25
|
+
return authHeader;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=digest-auth.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/services/prusa-link/utils/digest-auth.util.ts"],"names":["generateDigestAuthHeader","params","username","password","method","uri","realm","nonce","qop","nc","cnonce","ha1","createHash","update","digest","ha2","response","authHeader"],"mappings":";;;;+BAGgBA;;;eAAAA;;;4BAHW;AAGpB,SAASA,yBAAyBC,MAAwB;IAC/D,MAAM,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,GAAG,EAAEC,KAAK,EAAEC,KAAK,EAAEC,GAAG,EAAEC,EAAE,EAAEC,MAAM,EAAE,GAAGT;IAE3E,MAAMU,MAAMC,IAAAA,sBAAU,EAAC,OAAOC,MAAM,CAAC,GAAGX,SAAS,CAAC,EAAEI,MAAM,CAAC,EAAEH,UAAU,EAAEW,MAAM,CAAC;IAChF,MAAMC,MAAMH,IAAAA,sBAAU,EAAC,OAAOC,MAAM,CAAC,GAAGT,OAAO,CAAC,EAAEC,KAAK,EAAES,MAAM,CAAC;IAEhE,IAAIE;IACJ,IAAIC;IACJ,IAAIT,KAAK;QAEPQ,WAAWJ,IAAAA,sBAAU,EAAC,OAAOC,MAAM,CAAC,GAAGF,IAAI,CAAC,EAAEJ,MAAM,CAAC,EAAEE,GAAG,CAAC,EAAEC,OAAO,CAAC,EAAEF,IAAI,CAAC,EAAEO,KAAK,EAAED,MAAM,CAAC;QAE5FG,aAAa,CAAC,iBAAiB,EAAEf,SAAS,UAAU,EAAEI,MAAM,UAAU,EAAEC,MAAM,QAAQ,EAAEF,IAAI,OAAO,EAAEG,IAAI,KAAK,EAAEC,GAAG,UAAU,EAAEC,OAAO,aAAa,EAAEM,SAAS,CAAC,CAAC;IAClK,OAAO;QAELA,WAAWJ,IAAAA,sBAAU,EAAC,OAAOC,MAAM,CAAC,GAAGF,IAAI,CAAC,EAAEJ,MAAM,CAAC,EAAEQ,KAAK,EAAED,MAAM,CAAC;QAErEG,aAAa,CAAC,iBAAiB,EAAEf,SAAS,UAAU,EAAEI,MAAM,UAAU,EAAEC,MAAM,QAAQ,EAAEF,IAAI,aAAa,EAAEW,SAAS,CAAC,CAAC;IACxH;IAEA,OAAOC;AACT"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "PrusaLinkHttpClientBuilder", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return PrusaLinkHttpClientBuilder;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _defaulthttpclientbuilder = require("../../../shared/default-http-client.builder");
|
|
12
|
+
const _octoprintserviceconstants = require("../../octoprint/constants/octoprint-service.constants");
|
|
13
|
+
const _digestauthutil = require("./digest-auth.util");
|
|
14
|
+
const _nodecrypto = require("node:crypto");
|
|
15
|
+
class PrusaLinkHttpClientBuilder extends _defaulthttpclientbuilder.DefaultHttpClientBuilder {
|
|
16
|
+
maxRetries = 1;
|
|
17
|
+
username;
|
|
18
|
+
password;
|
|
19
|
+
authHeaderContext;
|
|
20
|
+
onAuthError;
|
|
21
|
+
onAuthSuccess;
|
|
22
|
+
onRequestRetry;
|
|
23
|
+
build() {
|
|
24
|
+
if (!this.axiosOptions.baseURL) {
|
|
25
|
+
throw new Error("Base URL is required");
|
|
26
|
+
}
|
|
27
|
+
const axiosInstance = super.build();
|
|
28
|
+
if (this.username && this.password) {
|
|
29
|
+
axiosInstance.interceptors.request.use(async (config)=>{
|
|
30
|
+
if (this.authHeaderContext) {
|
|
31
|
+
const computedDigestHeader = this.generateDigestHeader(config.method?.toUpperCase() ?? "GET", config.url ?? "/");
|
|
32
|
+
config.headers[_octoprintserviceconstants.authorizationHeaderKey] = computedDigestHeader;
|
|
33
|
+
}
|
|
34
|
+
return config;
|
|
35
|
+
});
|
|
36
|
+
axiosInstance.interceptors.response.use((response)=>response, async (error)=>{
|
|
37
|
+
const originalRequest = error.config;
|
|
38
|
+
if (error.response?.status === 401 && this.username?.length && this.password?.length && (!originalRequest._retryCount || originalRequest._retryCount < this.maxRetries)) {
|
|
39
|
+
const wwwAuthHeader = error.response.headers[_octoprintserviceconstants.wwwAuthenticationHeaderKey];
|
|
40
|
+
if (wwwAuthHeader) {
|
|
41
|
+
if (typeof this.onAuthSuccess === "function") {
|
|
42
|
+
this.onAuthSuccess(wwwAuthHeader);
|
|
43
|
+
}
|
|
44
|
+
this.saveParsedAuthHeaderContext(wwwAuthHeader);
|
|
45
|
+
originalRequest._retryCount = (originalRequest._retryCount ?? 0) + 1;
|
|
46
|
+
if (typeof this.onRequestRetry === "function") {
|
|
47
|
+
this.onRequestRetry(error, originalRequest._retryCount);
|
|
48
|
+
}
|
|
49
|
+
return axiosInstance(originalRequest);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (error.response?.status === 401 && this.onAuthError && typeof this.onAuthError === "function") {
|
|
53
|
+
this.onAuthError(error);
|
|
54
|
+
}
|
|
55
|
+
return Promise.reject(error);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return axiosInstance;
|
|
59
|
+
}
|
|
60
|
+
withDigestAuth(username, password, onAuthError, onRequestRetry, onAuthSuccess) {
|
|
61
|
+
if (!username?.length) {
|
|
62
|
+
throw new Error("username may not be an empty string");
|
|
63
|
+
}
|
|
64
|
+
if (!password?.length) {
|
|
65
|
+
throw new Error("password may not be an empty string");
|
|
66
|
+
}
|
|
67
|
+
if (onAuthError && typeof onAuthError !== "function") {
|
|
68
|
+
throw new Error("onAuthError must be a function");
|
|
69
|
+
}
|
|
70
|
+
if (onAuthSuccess && typeof onAuthSuccess !== "function") {
|
|
71
|
+
throw new Error("onAuthSuccess must be a function");
|
|
72
|
+
}
|
|
73
|
+
if (onRequestRetry && typeof onRequestRetry !== "function") {
|
|
74
|
+
throw new Error("onRequestRetry must be a function");
|
|
75
|
+
}
|
|
76
|
+
this.username = username;
|
|
77
|
+
this.password = password;
|
|
78
|
+
this.onAuthError = onAuthError;
|
|
79
|
+
this.onRequestRetry = onRequestRetry;
|
|
80
|
+
this.onAuthSuccess = onAuthSuccess;
|
|
81
|
+
return this;
|
|
82
|
+
}
|
|
83
|
+
withAuthHeader(authHeader) {
|
|
84
|
+
if (!authHeader?.length) {
|
|
85
|
+
throw new Error("Digest header may not be an empty string");
|
|
86
|
+
}
|
|
87
|
+
this.saveParsedAuthHeaderContext(authHeader);
|
|
88
|
+
return this;
|
|
89
|
+
}
|
|
90
|
+
saveParsedAuthHeaderContext(authHeader) {
|
|
91
|
+
const headerValue = authHeader.startsWith("Digest ") ? authHeader.substring(7) : authHeader;
|
|
92
|
+
const authParams = Object.fromEntries(headerValue.split(", ").map((param)=>{
|
|
93
|
+
const parts = param.split("=");
|
|
94
|
+
if (parts.length === 2) {
|
|
95
|
+
return [
|
|
96
|
+
parts[0],
|
|
97
|
+
parts[1].replace(/"/g, "")
|
|
98
|
+
];
|
|
99
|
+
}
|
|
100
|
+
return [
|
|
101
|
+
parts[0],
|
|
102
|
+
""
|
|
103
|
+
];
|
|
104
|
+
}));
|
|
105
|
+
this.authHeaderContext = {
|
|
106
|
+
realm: authParams.realm,
|
|
107
|
+
nonce: authParams.nonce,
|
|
108
|
+
qop: authParams.qop,
|
|
109
|
+
hasQop: "qop" in authParams
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
generateDigestHeader(method, uri) {
|
|
113
|
+
if (!this.authHeaderContext || !this.username || !this.password) {
|
|
114
|
+
throw new Error("Digest auth not properly configured");
|
|
115
|
+
}
|
|
116
|
+
const { realm, nonce, qop, hasQop } = this.authHeaderContext;
|
|
117
|
+
return (0, _digestauthutil.generateDigestAuthHeader)({
|
|
118
|
+
username: this.username,
|
|
119
|
+
password: this.password,
|
|
120
|
+
method,
|
|
121
|
+
uri,
|
|
122
|
+
realm,
|
|
123
|
+
nonce,
|
|
124
|
+
qop: hasQop ? qop : undefined,
|
|
125
|
+
nc: hasQop ? "00000001" : undefined,
|
|
126
|
+
cnonce: hasQop ? (0, _nodecrypto.randomBytes)(8).toString("hex") : undefined
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
//# sourceMappingURL=prusa-link-http-client.builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/services/prusa-link/utils/prusa-link-http-client.builder.ts"],"names":["PrusaLinkHttpClientBuilder","DefaultHttpClientBuilder","maxRetries","username","password","authHeaderContext","onAuthError","onAuthSuccess","onRequestRetry","build","axiosOptions","baseURL","Error","axiosInstance","interceptors","request","use","config","computedDigestHeader","generateDigestHeader","method","toUpperCase","url","headers","authorizationHeaderKey","response","error","originalRequest","status","length","_retryCount","wwwAuthHeader","wwwAuthenticationHeaderKey","saveParsedAuthHeaderContext","Promise","reject","withDigestAuth","withAuthHeader","authHeader","headerValue","startsWith","substring","authParams","Object","fromEntries","split","map","param","parts","replace","realm","nonce","qop","hasQop","uri","generateDigestAuthHeader","undefined","nc","cnonce","randomBytes","toString"],"mappings":"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"}
|
|
@@ -11,18 +11,21 @@ Object.defineProperty(exports, "SocketFactory", {
|
|
|
11
11
|
const _containertokens = require("../container.tokens");
|
|
12
12
|
const _printerapiinterface = require("./printer-api.interface");
|
|
13
13
|
class SocketFactory {
|
|
14
|
-
|
|
15
|
-
constructor(
|
|
16
|
-
this.
|
|
14
|
+
cradleService;
|
|
15
|
+
constructor(cradleService){
|
|
16
|
+
this.cradleService = cradleService;
|
|
17
17
|
}
|
|
18
18
|
createInstance(printerType) {
|
|
19
|
-
const settingsStore = this.
|
|
19
|
+
const settingsStore = this.cradleService.resolve(_containertokens.DITokens.settingsStore);
|
|
20
20
|
const serverSettings = settingsStore.getServerSettings();
|
|
21
21
|
const moonrakerSupport = serverSettings.experimentalMoonrakerSupport;
|
|
22
|
+
const prusaLinkSupport = serverSettings.experimentalPrusaLinkSupport;
|
|
22
23
|
if (printerType === _printerapiinterface.OctoprintType) {
|
|
23
|
-
return this.
|
|
24
|
+
return this.cradleService.resolve(_containertokens.DITokens.octoPrintSockIoAdapter);
|
|
24
25
|
} else if (moonrakerSupport && printerType === _printerapiinterface.MoonrakerType) {
|
|
25
|
-
return this.
|
|
26
|
+
return this.cradleService.resolve(_containertokens.DITokens.moonrakerWebsocketAdapter);
|
|
27
|
+
} else if (prusaLinkSupport && printerType === _printerapiinterface.PrusaLinkType) {
|
|
28
|
+
return this.cradleService.resolve(_containertokens.DITokens.prusaLinkPollingAdapter);
|
|
26
29
|
} else {
|
|
27
30
|
throw new Error("PrinterType is unknown, cant pick the right socket adapter");
|
|
28
31
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/services/socket.factory.ts"],"names":["SocketFactory","
|
|
1
|
+
{"version":3,"sources":["../../src/services/socket.factory.ts"],"names":["SocketFactory","constructor","cradleService","createInstance","printerType","settingsStore","resolve","DITokens","serverSettings","getServerSettings","moonrakerSupport","experimentalMoonrakerSupport","prusaLinkSupport","experimentalPrusaLinkSupport","OctoprintType","octoPrintSockIoAdapter","MoonrakerType","moonrakerWebsocketAdapter","PrusaLinkType","prusaLinkPollingAdapter","Error"],"mappings":";;;;+BAMaA;;;eAAAA;;;iCANY;qCACmC;AAKrD,MAAMA;;IACXC,YAAY,AAAiBC,aAA4B,CAAE;aAA9BA,gBAAAA;IAA+B;IAE5DC,eAAeC,WAAmB,EAAqB;QACrD,MAAMC,gBAAgB,IAAI,CAACH,aAAa,CAACI,OAAO,CAAgBC,yBAAQ,CAACF,aAAa;QACtF,MAAMG,iBAAiBH,cAAcI,iBAAiB;QACtD,MAAMC,mBAAmBF,eAAeG,4BAA4B;QACpE,MAAMC,mBAAmBJ,eAAeK,4BAA4B;QAEpE,IAAIT,gBAAgBU,kCAAa,EAAE;YACjC,OAAO,IAAI,CAACZ,aAAa,CAACI,OAAO,CAACC,yBAAQ,CAACQ,sBAAsB;QACnE,OAAO,IAAIL,oBAAoBN,gBAAgBY,kCAAa,EAAE;YAC5D,OAAO,IAAI,CAACd,aAAa,CAACI,OAAO,CAACC,yBAAQ,CAACU,yBAAyB;QACtE,OAAO,IAAIL,oBAAoBR,gBAAgBc,kCAAa,EAAE;YAC5D,OAAO,IAAI,CAAChB,aAAa,CAACI,OAAO,CAACC,yBAAQ,CAACY,uBAAuB;QACpE,OAAO;YACL,MAAM,IAAIC,MAAM;QAClB;IACF;AACF"}
|