@fdm-monster/server 2.0.10 → 2.0.11
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/.claude/CLAUDE.md +76 -0
- package/.vite-hooks/pre-commit +1 -0
- package/.yarn/install-state.gz +0 -0
- package/.yarn/releases/yarn-4.13.0.cjs +940 -0
- package/.yarnrc.yml +1 -1
- package/README.md +1 -1
- package/RELEASE_NOTES.MD +14 -0
- package/dist/_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.js +9 -0
- package/dist/_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateMetadata.js +6 -0
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/_virtual/_virtual_controllers.js +43 -0
- package/dist/consoles/typeorm-create.js +51 -112
- package/dist/consoles/typeorm-create.js.map +1 -1
- package/dist/consoles/typeorm-generate.js +99 -165
- package/dist/consoles/typeorm-generate.js.map +1 -1
- package/dist/consoles/typeorm-migrate.js +35 -43
- package/dist/consoles/typeorm-migrate.js.map +1 -1
- package/dist/constants/authorization.constants.js +75 -97
- package/dist/constants/authorization.constants.js.map +1 -1
- package/dist/constants/event.constants.js +11 -41
- package/dist/constants/event.constants.js.map +1 -1
- package/dist/constants/http-status-codes.constants.js +319 -71
- package/dist/constants/http-status-codes.constants.js.map +1 -1
- package/dist/constants/server-settings.constants.js +45 -87
- package/dist/constants/server-settings.constants.js.map +1 -1
- package/dist/constants/service.constants.js +3 -21
- package/dist/constants/service.constants.js.map +1 -1
- package/dist/container.js +167 -181
- package/dist/container.js.map +1 -1
- package/dist/container.tokens.js +78 -85
- package/dist/container.tokens.js.map +1 -1
- package/dist/controllers/auth.controller.js +156 -225
- package/dist/controllers/auth.controller.js.map +1 -1
- package/dist/controllers/batch-call.controller.js +79 -116
- package/dist/controllers/batch-call.controller.js.map +1 -1
- package/dist/controllers/camera-stream.controller.js +74 -119
- package/dist/controllers/camera-stream.controller.js.map +1 -1
- package/dist/controllers/dto/update-client-dist.dto.js +8 -15
- package/dist/controllers/dto/update-client-dist.dto.js.map +1 -1
- package/dist/controllers/file-storage.controller.js +251 -312
- package/dist/controllers/file-storage.controller.js.map +1 -1
- package/dist/controllers/first-time-setup.controller.js +83 -135
- package/dist/controllers/first-time-setup.controller.js.map +1 -1
- package/dist/controllers/floor.controller.js +111 -175
- package/dist/controllers/floor.controller.js.map +1 -1
- package/dist/controllers/metrics.controller.js +27 -53
- package/dist/controllers/metrics.controller.js.map +1 -1
- package/dist/controllers/print-job.controller.js +366 -451
- package/dist/controllers/print-job.controller.js.map +1 -1
- package/dist/controllers/print-queue.controller.js +329 -427
- package/dist/controllers/print-queue.controller.js.map +1 -1
- package/dist/controllers/printer-files.controller.js +244 -305
- package/dist/controllers/printer-files.controller.js.map +1 -1
- package/dist/controllers/printer-maintenance-log.controller.js +109 -165
- package/dist/controllers/printer-maintenance-log.controller.js.map +1 -1
- package/dist/controllers/printer-settings.controller.js +50 -81
- package/dist/controllers/printer-settings.controller.js.map +1 -1
- package/dist/controllers/printer-tag.controller.js +104 -166
- package/dist/controllers/printer-tag.controller.js.map +1 -1
- package/dist/controllers/printer.controller.js +352 -469
- package/dist/controllers/printer.controller.js.map +1 -1
- package/dist/controllers/server-private.controller.js +182 -239
- package/dist/controllers/server-private.controller.js.map +1 -1
- package/dist/controllers/server-public.controller.js +104 -158
- package/dist/controllers/server-public.controller.js.map +1 -1
- package/dist/controllers/settings.controller.js +229 -364
- package/dist/controllers/settings.controller.js.map +1 -1
- package/dist/controllers/slicer-compat.controller.js +179 -206
- package/dist/controllers/slicer-compat.controller.js.map +1 -1
- package/dist/controllers/user.controller.js +226 -348
- package/dist/controllers/user.controller.js.map +1 -1
- package/dist/controllers/validation/auth-controller.validation.js +5 -14
- package/dist/controllers/validation/auth-controller.validation.js.map +1 -1
- package/dist/controllers/validation/batch-controller.validation.js +13 -35
- package/dist/controllers/validation/batch-controller.validation.js.map +1 -1
- package/dist/controllers/validation/generic.validation.js +6 -23
- package/dist/controllers/validation/generic.validation.js.map +1 -1
- package/dist/controllers/validation/printer-completion-controller.validation.js +5 -14
- package/dist/controllers/validation/printer-completion-controller.validation.js.map +1 -1
- package/dist/controllers/validation/printer-controller.validation.js +16 -48
- package/dist/controllers/validation/printer-controller.validation.js.map +1 -1
- package/dist/controllers/validation/printer-files-controller.validation.js +12 -47
- package/dist/controllers/validation/printer-files-controller.validation.js.map +1 -1
- package/dist/controllers/validation/printer-settings-controller.validation.js +5 -14
- package/dist/controllers/validation/printer-settings-controller.validation.js.map +1 -1
- package/dist/controllers/validation/server-private.validation.js +7 -14
- package/dist/controllers/validation/server-private.validation.js.map +1 -1
- package/dist/controllers/validation/setting.validation.js +12 -34
- package/dist/controllers/validation/setting.validation.js.map +1 -1
- package/dist/controllers/validation/user-controller.validation.js +27 -65
- package/dist/controllers/validation/user-controller.validation.js.map +1 -1
- package/dist/data-source.js +74 -79
- package/dist/data-source.js.map +1 -1
- package/dist/entities/camera-stream.entity.js +49 -91
- package/dist/entities/camera-stream.entity.js.map +1 -1
- package/dist/entities/floor-position.entity.js +38 -75
- package/dist/entities/floor-position.entity.js.map +1 -1
- package/dist/entities/floor.entity.js +18 -48
- package/dist/entities/floor.entity.js.map +1 -1
- package/dist/entities/index.js +14 -66
- package/dist/entities/print-job.entity.js +114 -196
- package/dist/entities/print-job.entity.js.map +1 -1
- package/dist/entities/printer-maintenance-log.entity.js +61 -140
- package/dist/entities/printer-maintenance-log.entity.js.map +1 -1
- package/dist/entities/printer-tag.entity.js +33 -66
- package/dist/entities/printer-tag.entity.js.map +1 -1
- package/dist/entities/printer.entity.js +67 -124
- package/dist/entities/printer.entity.js.map +1 -1
- package/dist/entities/refresh-token.entity.js +31 -66
- package/dist/entities/refresh-token.entity.js.map +1 -1
- package/dist/entities/role.entity.js +16 -45
- package/dist/entities/role.entity.js.map +1 -1
- package/dist/entities/settings.entity.js +38 -77
- package/dist/entities/settings.entity.js.map +1 -1
- package/dist/entities/tag.entity.js +19 -43
- package/dist/entities/tag.entity.js.map +1 -1
- package/dist/entities/user-role.entity.js +30 -67
- package/dist/entities/user-role.entity.js.map +1 -1
- package/dist/entities/user.entity.js +32 -87
- package/dist/entities/user.entity.js.map +1 -1
- package/dist/exceptions/failed-dependency.exception.js +11 -18
- package/dist/exceptions/failed-dependency.exception.js.map +1 -1
- package/dist/exceptions/job.exceptions.js +9 -16
- package/dist/exceptions/job.exceptions.js.map +1 -1
- package/dist/exceptions/runtime.exceptions.js +82 -121
- package/dist/exceptions/runtime.exceptions.js.map +1 -1
- package/dist/handlers/event-emitter.js +13 -20
- package/dist/handlers/event-emitter.js.map +1 -1
- package/dist/handlers/logger-factory.js +7 -14
- package/dist/handlers/logger-factory.js.map +1 -1
- package/dist/handlers/logger.js +26 -36
- package/dist/handlers/logger.js.map +1 -1
- package/dist/handlers/logging/file-logging.transport.js +17 -31
- package/dist/handlers/logging/file-logging.transport.js.map +1 -1
- package/dist/handlers/logging/loki-logging.transport.js +34 -50
- package/dist/handlers/logging/loki-logging.transport.js.map +1 -1
- package/dist/handlers/logging/static.logger.js +83 -124
- package/dist/handlers/logging/static.logger.js.map +1 -1
- package/dist/handlers/validators.js +8 -25
- package/dist/handlers/validators.js.map +1 -1
- package/dist/index.js +23 -26
- package/dist/index.js.map +1 -1
- package/dist/middleware/authenticate.js +26 -69
- package/dist/middleware/authenticate.js.map +1 -1
- package/dist/middleware/database.js +16 -22
- package/dist/middleware/database.js.map +1 -1
- package/dist/middleware/demo.middleware.js +19 -27
- package/dist/middleware/demo.middleware.js.map +1 -1
- package/dist/middleware/exception.filter.js +109 -133
- package/dist/middleware/exception.filter.js.map +1 -1
- package/dist/middleware/global.middleware.js +28 -47
- package/dist/middleware/global.middleware.js.map +1 -1
- package/dist/middleware/param-converter.middleware.js +31 -69
- package/dist/middleware/param-converter.middleware.js.map +1 -1
- package/dist/middleware/passport.js +38 -64
- package/dist/middleware/passport.js.map +1 -1
- package/dist/middleware/printer-resolver.js +26 -33
- package/dist/middleware/printer-resolver.js.map +1 -1
- package/dist/middleware/printer.js +56 -94
- package/dist/middleware/printer.js.map +1 -1
- package/dist/middleware/slicer-api-key.middleware.js +23 -26
- package/dist/middleware/slicer-api-key.middleware.js.map +1 -1
- package/dist/middleware/socketio.middleware.js +21 -32
- package/dist/middleware/socketio.middleware.js.map +1 -1
- package/dist/migrations/1706829146617-InitSqlite.js +84 -91
- package/dist/migrations/1706829146617-InitSqlite.js.map +1 -1
- package/dist/migrations/1707494762198-PrinterGroup.js +22 -29
- package/dist/migrations/1707494762198-PrinterGroup.js.map +1 -1
- package/dist/migrations/1708465930665-ChangePrintCompletionDeletePrinterCascade.js +26 -33
- package/dist/migrations/1708465930665-ChangePrintCompletionDeletePrinterCascade.js.map +1 -1
- package/dist/migrations/1713300747465-ChangeRoleNameUnique.js +27 -34
- package/dist/migrations/1713300747465-ChangeRoleNameUnique.js.map +1 -1
- package/dist/migrations/1713897879622-AddPrinterType.js +34 -41
- package/dist/migrations/1713897879622-AddPrinterType.js.map +1 -1
- package/dist/migrations/1720338804844-RemovePrinterFile.js +12 -19
- package/dist/migrations/1720338804844-RemovePrinterFile.js.map +1 -1
- package/dist/migrations/1745141688926-AddPrinterUsernamePassword.js +26 -33
- package/dist/migrations/1745141688926-AddPrinterUsernamePassword.js.map +1 -1
- package/dist/migrations/1766576698569-DropPermissions.js +11 -18
- package/dist/migrations/1766576698569-DropPermissions.js.map +1 -1
- package/dist/migrations/1767278216516-ChangeCameraPrinterOnDeleteSetNull.js +26 -33
- package/dist/migrations/1767278216516-ChangeCameraPrinterOnDeleteSetNull.js.map +1 -1
- package/dist/migrations/1767279607392-DropCustomGcode.js +12 -19
- package/dist/migrations/1767279607392-DropCustomGcode.js.map +1 -1
- package/dist/migrations/1767291804417-DropPrintCompletions.js +12 -19
- package/dist/migrations/1767291804417-DropPrintCompletions.js.map +1 -1
- package/dist/migrations/1767352862576-DropSettingsFileClean.js +18 -25
- package/dist/migrations/1767352862576-DropSettingsFileClean.js.map +1 -1
- package/dist/migrations/1767355639023-ChangeFloorLevelToOrder.js +26 -33
- package/dist/migrations/1767355639023-ChangeFloorLevelToOrder.js.map +1 -1
- package/dist/migrations/1767370191762-ChangeFloorNonUniqueOrder.js +18 -25
- package/dist/migrations/1767370191762-ChangeFloorNonUniqueOrder.js.map +1 -1
- package/dist/migrations/1767432108916-RenameGroupToTag.js +22 -29
- package/dist/migrations/1767432108916-RenameGroupToTag.js.map +1 -1
- package/dist/migrations/1767451444137-AddPrintJob.js +20 -27
- package/dist/migrations/1767451444137-AddPrintJob.js.map +1 -1
- package/dist/migrations/1767909428129-AddPrinterMaintenanceLog.js +14 -21
- package/dist/migrations/1767909428129-AddPrinterMaintenanceLog.js.map +1 -1
- package/dist/plugins/controllers-plugin.js +21 -0
- package/dist/plugins/controllers-plugin.js.map +1 -0
- package/dist/server.constants.js +79 -91
- package/dist/server.constants.js.map +1 -1
- package/dist/server.core.js +56 -122
- package/dist/server.core.js.map +1 -1
- package/dist/server.env.js +56 -121
- package/dist/server.env.js.map +1 -1
- package/dist/server.host.js +66 -99
- package/dist/server.host.js.map +1 -1
- package/dist/services/authentication/auth.service.js +103 -126
- package/dist/services/authentication/auth.service.js.map +1 -1
- package/dist/services/authentication/jwt.service.js +23 -32
- package/dist/services/authentication/jwt.service.js.map +1 -1
- package/dist/services/bambu/bambu-ftp.adapter.js +194 -236
- package/dist/services/bambu/bambu-ftp.adapter.js.map +1 -1
- package/dist/services/bambu/bambu-mqtt.adapter.js +394 -449
- package/dist/services/bambu/bambu-mqtt.adapter.js.map +1 -1
- package/dist/services/bambu/bambu.client.js +64 -65
- package/dist/services/bambu/bambu.client.js.map +1 -1
- package/dist/services/bambu/mqtt-message.types.js +1 -6
- package/dist/services/bambu.api.js +230 -247
- package/dist/services/bambu.api.js.map +1 -1
- package/dist/services/core/batch-call.service.js +139 -163
- package/dist/services/core/batch-call.service.js.map +1 -1
- package/dist/services/core/client-bundle.service.js +126 -165
- package/dist/services/core/client-bundle.service.js.map +1 -1
- package/dist/services/core/config.service.js +16 -26
- package/dist/services/core/config.service.js.map +1 -1
- package/dist/services/core/cradle.service.js +11 -19
- package/dist/services/core/cradle.service.js.map +1 -1
- package/dist/services/core/github.service.js +59 -79
- package/dist/services/core/github.service.js.map +1 -1
- package/dist/services/core/http-client.factory.js +30 -38
- package/dist/services/core/http-client.factory.js.map +1 -1
- package/dist/services/core/logs-manager.service.js +61 -84
- package/dist/services/core/logs-manager.service.js.map +1 -1
- package/dist/services/core/monsterpi.service.js +26 -36
- package/dist/services/core/monsterpi.service.js.map +1 -1
- package/dist/services/core/multer.service.js +69 -129
- package/dist/services/core/multer.service.js.map +1 -1
- package/dist/services/core/server-release.service.js +77 -99
- package/dist/services/core/server-release.service.js.map +1 -1
- package/dist/services/core/yaml.service.js +443 -573
- package/dist/services/core/yaml.service.js.map +1 -1
- package/dist/services/file-analysis.service.js +134 -144
- package/dist/services/file-analysis.service.js.map +1 -1
- package/dist/services/file-storage.service.js +324 -423
- package/dist/services/file-storage.service.js.map +1 -1
- package/dist/services/interfaces/auth.service.interface.js +1 -6
- package/dist/services/interfaces/camera-stream.dto.js +23 -41
- package/dist/services/interfaces/camera-stream.dto.js.map +1 -1
- package/dist/services/interfaces/camera-stream.service.interface.js +1 -6
- package/dist/services/interfaces/file-upload-tracker.interface.js +1 -6
- package/dist/services/interfaces/floor.dto.js +31 -55
- package/dist/services/interfaces/floor.dto.js.map +1 -1
- package/dist/services/interfaces/floor.service.interface.js +1 -6
- package/dist/services/interfaces/jwt.service.interface.js +1 -6
- package/dist/services/interfaces/login.dto.js +10 -17
- package/dist/services/interfaces/login.dto.js.map +1 -1
- package/dist/services/interfaces/page.interface.js +5 -12
- package/dist/services/interfaces/page.interface.js.map +1 -1
- package/dist/services/interfaces/permission.service.interface.js +1 -6
- package/dist/services/interfaces/printer-file.dto.js +1 -6
- package/dist/services/interfaces/printer-maintenance-log.dto.js +1 -6
- package/dist/services/interfaces/printer-tag.dto.js +11 -26
- package/dist/services/interfaces/printer-tag.dto.js.map +1 -1
- package/dist/services/interfaces/printer-tag.service.interface.js +1 -6
- package/dist/services/interfaces/printer.dto.js +21 -36
- package/dist/services/interfaces/printer.dto.js.map +1 -1
- package/dist/services/interfaces/printer.service.interface.js +1 -6
- package/dist/services/interfaces/refresh-token.dto.js +9 -16
- package/dist/services/interfaces/refresh-token.dto.js.map +1 -1
- package/dist/services/interfaces/refresh-token.service.interface.js +1 -6
- package/dist/services/interfaces/role-service.interface.js +1 -6
- package/dist/services/interfaces/role.dto.js +7 -14
- package/dist/services/interfaces/role.dto.js.map +1 -1
- package/dist/services/interfaces/settings.dto.js +10 -17
- package/dist/services/interfaces/settings.dto.js.map +1 -1
- package/dist/services/interfaces/settings.service.interface.js +1 -6
- package/dist/services/interfaces/tag.dto.js +1 -6
- package/dist/services/interfaces/task.interfaces.js +1 -6
- package/dist/services/interfaces/user-role.dto.js +9 -16
- package/dist/services/interfaces/user-role.dto.js.map +1 -1
- package/dist/services/interfaces/user-service.interface.js +1 -6
- package/dist/services/interfaces/user.dto.js +22 -37
- package/dist/services/interfaces/user.dto.js.map +1 -1
- package/dist/services/moonraker/constants/moonraker-event.dto.js +16 -31
- package/dist/services/moonraker/constants/moonraker-event.dto.js.map +1 -1
- package/dist/services/moonraker/constants/moonraker.constants.js +4 -11
- package/dist/services/moonraker/constants/moonraker.constants.js.map +1 -1
- package/dist/services/moonraker/dto/access/access-info.dto.js +1 -6
- package/dist/services/moonraker/dto/access/access-login-refresh.dto.js +1 -6
- package/dist/services/moonraker/dto/access/access-login-result.dto.js +1 -6
- package/dist/services/moonraker/dto/access/access-user-result.dto.js +1 -6
- package/dist/services/moonraker/dto/access/access-user.dto.js +1 -6
- package/dist/services/moonraker/dto/database/database-namespace-item.dto.js +1 -6
- package/dist/services/moonraker/dto/database/database-namespace-list.dto.js +1 -6
- package/dist/services/moonraker/dto/gcode-help.dto.js +1 -6
- package/dist/services/moonraker/dto/gcode-store.dto.js +1 -6
- package/dist/services/moonraker/dto/job-queue/enqueue-job.dto.js +1 -6
- package/dist/services/moonraker/dto/job-queue/job-queue-status.dto.js +1 -6
- package/dist/services/moonraker/dto/machine/machine-device-power-device-state.dto.js +1 -6
- package/dist/services/moonraker/dto/machine/machine-device-power-devices.dto.js +1 -6
- package/dist/services/moonraker/dto/machine/machine-peripherals-canbus.dto.js +1 -6
- package/dist/services/moonraker/dto/machine/machine-peripherals-serial.dto.js +1 -6
- package/dist/services/moonraker/dto/machine/machine-peripherals-usb.dto.js +1 -6
- package/dist/services/moonraker/dto/machine/machine-peripherals-video.dto.js +1 -6
- package/dist/services/moonraker/dto/machine/machine-system-info.dto.js +1 -6
- package/dist/services/moonraker/dto/machine/machine-update-status.dto.js +1 -6
- package/dist/services/moonraker/dto/machine/machine-wled-strips.dto.js +1 -6
- package/dist/services/moonraker/dto/notifier-list.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/bed-mesh.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/configfile.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/display-status.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/extruder.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/fan.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/filament-motion-sensor.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/filament-switch-sensor.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/gcode-move.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/gcode.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/heater-bed.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/heaters.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/idle-timeout.dto.js +6 -21
- package/dist/services/moonraker/dto/objects/idle-timeout.dto.js.map +1 -1
- package/dist/services/moonraker/dto/objects/mcu.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/motion-report.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/output-pin.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/pause-resume.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/print-stats.dto.js +9 -24
- package/dist/services/moonraker/dto/objects/print-stats.dto.js.map +1 -1
- package/dist/services/moonraker/dto/objects/printer-object.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/printer-object.types.js +1 -6
- package/dist/services/moonraker/dto/objects/printer-objects-list.dto.js +28 -43
- package/dist/services/moonraker/dto/objects/printer-objects-list.dto.js.map +1 -1
- package/dist/services/moonraker/dto/objects/printer-objects-query.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/stepper-enable.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/system-stats.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/temperature-fan.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/temperature-sensor.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/toolhead.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/virtual-sdcard.dto.js +1 -6
- package/dist/services/moonraker/dto/objects/webhooks.dto.js +1 -6
- package/dist/services/moonraker/dto/octoprint-compat/api-job.dto.js +1 -6
- package/dist/services/moonraker/dto/octoprint-compat/api-login.dto.js +1 -6
- package/dist/services/moonraker/dto/octoprint-compat/api-printer.dto.js +1 -6
- package/dist/services/moonraker/dto/octoprint-compat/api-profiles.dto.js +1 -6
- package/dist/services/moonraker/dto/octoprint-compat/api-settings.dto.js +1 -6
- package/dist/services/moonraker/dto/octoprint-compat/api-version.dto.js +1 -6
- package/dist/services/moonraker/dto/octoprint-compat/server-version.dto.js +1 -6
- package/dist/services/moonraker/dto/printer-info.dto.js +7 -22
- package/dist/services/moonraker/dto/printer-info.dto.js.map +1 -1
- package/dist/services/moonraker/dto/printer-query-endstops.dto.js +1 -6
- package/dist/services/moonraker/dto/process-stats.dto.js +1 -6
- package/dist/services/moonraker/dto/rest/action-result.dto.js +1 -6
- package/dist/services/moonraker/dto/rest/error.dto.js +1 -6
- package/dist/services/moonraker/dto/rest/result.dto.js +6 -13
- package/dist/services/moonraker/dto/rest/result.dto.js.map +1 -1
- package/dist/services/moonraker/dto/rollover-logs.dto.js +1 -6
- package/dist/services/moonraker/dto/rpc/json-rpc-error.dto.js +1 -6
- package/dist/services/moonraker/dto/rpc/json-rpc-request.dto.js +1 -6
- package/dist/services/moonraker/dto/rpc/json-rpc-response.dto.js +1 -6
- package/dist/services/moonraker/dto/server/server-config.dto.js +1 -6
- package/dist/services/moonraker/dto/server/server-info.dto.js +7 -14
- package/dist/services/moonraker/dto/server/server-info.dto.js.map +1 -1
- package/dist/services/moonraker/dto/server-announcements/announcement-action.dto.js +1 -6
- package/dist/services/moonraker/dto/server-announcements/announcement-entry-id.dto.js +1 -6
- package/dist/services/moonraker/dto/server-announcements/announcement-feeds.dto.js +1 -6
- package/dist/services/moonraker/dto/server-announcements/announcement-list.dto.js +1 -6
- package/dist/services/moonraker/dto/server-files/server-file-directory-action.dto.js +1 -6
- package/dist/services/moonraker/dto/server-files/server-file-directory-info.dto.js +1 -6
- package/dist/services/moonraker/dto/server-files/server-file-metadata.dto.js +1 -6
- package/dist/services/moonraker/dto/server-files/server-file-root.dto.js +1 -6
- package/dist/services/moonraker/dto/server-files/server-file-thumbnail.dto.js +1 -6
- package/dist/services/moonraker/dto/server-files/server-file-zip-action.dto.js +1 -6
- package/dist/services/moonraker/dto/server-files/server-file.dto.js +1 -6
- package/dist/services/moonraker/dto/server-history/history-job.dto.js +1 -6
- package/dist/services/moonraker/dto/server-history/history-last-totals.dto.js +1 -6
- package/dist/services/moonraker/dto/server-history/history-list.dto.js +1 -6
- package/dist/services/moonraker/dto/server-history/history-totals.dto.js +1 -6
- package/dist/services/moonraker/dto/server-history/job.dto.js +6 -21
- package/dist/services/moonraker/dto/server-history/job.dto.js.map +1 -1
- package/dist/services/moonraker/dto/server-sensors/sensor-info.dto.js +1 -6
- package/dist/services/moonraker/dto/server-sensors/sensor-list.dto.js +1 -6
- package/dist/services/moonraker/dto/server-sensors/sensor-measurements.dto.js +1 -6
- package/dist/services/moonraker/dto/server-webcams/webcam-item.dto.js +1 -6
- package/dist/services/moonraker/dto/server-webcams/webcam-list.dto.js +1 -6
- package/dist/services/moonraker/dto/server-webcams/webcam-test.dto.js +1 -6
- package/dist/services/moonraker/dto/spoolman/spoolman-active-spool.dto.js +1 -6
- package/dist/services/moonraker/dto/spoolman/spoolman-proxy-request.dto.js +1 -6
- package/dist/services/moonraker/dto/spoolman/spoolman-response.dto.js +1 -6
- package/dist/services/moonraker/dto/spoolman/spoolman-status.dto.js +1 -6
- package/dist/services/moonraker/dto/sudo-info.dto.js +1 -6
- package/dist/services/moonraker/dto/sudo-response.dto.js +1 -6
- package/dist/services/moonraker/dto/temperature-store.dto.js +1 -6
- package/dist/services/moonraker/dto/websocket/connection-identify-response.dto.js +1 -6
- package/dist/services/moonraker/dto/websocket/connection-identify.dto.js +1 -6
- package/dist/services/moonraker/dto/websocket/json-rpc-event.dto.js +1 -6
- package/dist/services/moonraker/dto/websocket/message.types.js +1 -6
- package/dist/services/moonraker/dto/websocket/methods.js +29 -44
- package/dist/services/moonraker/dto/websocket/methods.js.map +1 -1
- package/dist/services/moonraker/dto/websocket/notify-active-spool-set.params.js +1 -6
- package/dist/services/moonraker/dto/websocket/notify-agent-event.params.js +1 -6
- package/dist/services/moonraker/dto/websocket/notify-announcement-update.params.js +1 -6
- package/dist/services/moonraker/dto/websocket/notify-announcement.params.js +1 -6
- package/dist/services/moonraker/dto/websocket/notify-button-event.params.js +1 -6
- package/dist/services/moonraker/dto/websocket/notify-filelist-changed.params.js +11 -18
- package/dist/services/moonraker/dto/websocket/notify-filelist-changed.params.js.map +1 -1
- package/dist/services/moonraker/dto/websocket/notify-history-changed.params.js +1 -6
- package/dist/services/moonraker/dto/websocket/notify-job-queue-changed.params.js +1 -6
- package/dist/services/moonraker/dto/websocket/notify-proc-stat-update.params.js +1 -6
- package/dist/services/moonraker/dto/websocket/notify-sensor-update.params.js +1 -6
- package/dist/services/moonraker/dto/websocket/notify-service-state-changed.params.js +1 -6
- package/dist/services/moonraker/dto/websocket/notify-spoolman-status-changed.js +1 -6
- package/dist/services/moonraker/dto/websocket/notify-sudo-alert.params.js +1 -6
- package/dist/services/moonraker/dto/websocket/notify-update-response.params.js +7 -22
- package/dist/services/moonraker/dto/websocket/notify-update-response.params.js.map +1 -1
- package/dist/services/moonraker/dto/websocket/notify-user-change.params.js +1 -6
- package/dist/services/moonraker/moonraker-websocket.adapter.js +313 -348
- package/dist/services/moonraker/moonraker-websocket.adapter.js.map +1 -1
- package/dist/services/moonraker/moonraker.client.js +536 -559
- package/dist/services/moonraker/moonraker.client.js.map +1 -1
- package/dist/services/moonraker.api.js +167 -192
- package/dist/services/moonraker.api.js.map +1 -1
- package/dist/services/octoprint/constants/firmware-update-settings.constants.js +19 -28
- package/dist/services/octoprint/constants/firmware-update-settings.constants.js.map +1 -1
- package/dist/services/octoprint/constants/octoprint-service.constants.js +3 -30
- package/dist/services/octoprint/constants/octoprint-service.constants.js.map +1 -1
- package/dist/services/octoprint/constants/octoprint-websocket.constants.js +41 -56
- package/dist/services/octoprint/constants/octoprint-websocket.constants.js.map +1 -1
- package/dist/services/octoprint/dto/access/user-list.dto.js +1 -6
- package/dist/services/octoprint/dto/access/user.dto.js +1 -6
- package/dist/services/octoprint/dto/auth/current-user.dto.js +1 -6
- package/dist/services/octoprint/dto/auth/login.dto.js +1 -6
- package/dist/services/octoprint/dto/connection/connection-state.type.js +23 -30
- package/dist/services/octoprint/dto/connection/connection-state.type.js.map +1 -1
- package/dist/services/octoprint/dto/connection/connection.dto.js +1 -6
- package/dist/services/octoprint/dto/events/client-authed.dto.js +1 -6
- package/dist/services/octoprint/dto/events/client-closed.dto.js +1 -6
- package/dist/services/octoprint/dto/events/client-opened.dto.js +1 -6
- package/dist/services/octoprint/dto/events/dwelling.dto.js +1 -6
- package/dist/services/octoprint/dto/events/file-added.dto.js +1 -6
- package/dist/services/octoprint/dto/events/file-deselected.dto.js +1 -6
- package/dist/services/octoprint/dto/events/file-removed.dto.js +1 -6
- package/dist/services/octoprint/dto/events/folder-added.dto.js +1 -6
- package/dist/services/octoprint/dto/events/home.dto.js +1 -6
- package/dist/services/octoprint/dto/events/metadata-analysis-finished.dto.js +1 -6
- package/dist/services/octoprint/dto/events/metadata-analysis-started.dto.js +1 -6
- package/dist/services/octoprint/dto/events/metadata-statistics-updated.dto.js +1 -6
- package/dist/services/octoprint/dto/events/position-update.dto.js +1 -6
- package/dist/services/octoprint/dto/events/print-cancelled.dto.js +1 -6
- package/dist/services/octoprint/dto/events/print-cancelling.dto.js +1 -6
- package/dist/services/octoprint/dto/events/print-done.dto.js +1 -6
- package/dist/services/octoprint/dto/events/print-failed.dto.js +1 -6
- package/dist/services/octoprint/dto/events/print-paused.dto.js +1 -6
- package/dist/services/octoprint/dto/events/print-resumed.dto.js +1 -6
- package/dist/services/octoprint/dto/events/print-started.dto.js +1 -6
- package/dist/services/octoprint/dto/events/printer-state-changed.dto.js +1 -6
- package/dist/services/octoprint/dto/events/transfer-done.dto.js +1 -6
- package/dist/services/octoprint/dto/events/transfer-started.dto.js +1 -6
- package/dist/services/octoprint/dto/events/updated-files.dto.js +1 -6
- package/dist/services/octoprint/dto/events/upload.dto.js +1 -6
- package/dist/services/octoprint/dto/events/user-logged-in.dto.js +1 -6
- package/dist/services/octoprint/dto/events/z-change.dto.js +1 -6
- package/dist/services/octoprint/dto/files/gcode-analysis.dto.js +1 -6
- package/dist/services/octoprint/dto/files/octoprint-file.dto.js +1 -6
- package/dist/services/octoprint/dto/files/octoprint-files-response.dto.js +1 -6
- package/dist/services/octoprint/dto/job/current-job.dto.js +8 -15
- package/dist/services/octoprint/dto/job/current-job.dto.js.map +1 -1
- package/dist/services/octoprint/dto/job/job.dto.js +1 -6
- package/dist/services/octoprint/dto/octoprint-event.dto.js +21 -39
- package/dist/services/octoprint/dto/octoprint-event.dto.js.map +1 -1
- package/dist/services/octoprint/dto/printer/busy-file.dto.js +1 -6
- package/dist/services/octoprint/dto/printer/current-printer-state.dto.js +1 -6
- package/dist/services/octoprint/dto/printer/flags.dto.js +1 -6
- package/dist/services/octoprint/dto/printer/markings.dto.js +1 -6
- package/dist/services/octoprint/dto/printer/progress.dto.js +1 -6
- package/dist/services/octoprint/dto/printer/resends.dto.js +1 -6
- package/dist/services/octoprint/dto/printer/state.dto.js +1 -6
- package/dist/services/octoprint/dto/printer/temps.dto.js +1 -6
- package/dist/services/octoprint/dto/rest/error.dto.js +1 -6
- package/dist/services/octoprint/dto/server/server.dto.js +1 -6
- package/dist/services/octoprint/dto/server/version.dto.js +1 -6
- package/dist/services/octoprint/dto/settings/serial-settings.dto.js +1 -6
- package/dist/services/octoprint/dto/settings/settings-parts.type.js +1 -6
- package/dist/services/octoprint/dto/settings/settings.dto.js +1 -6
- package/dist/services/octoprint/dto/settings/virtual-printer-settings.dto.js +1 -6
- package/dist/services/octoprint/dto/system/system-info.dto.js +32 -39
- package/dist/services/octoprint/dto/system/system-info.dto.js.map +1 -1
- package/dist/services/octoprint/dto/websocket/connection-message.dto.js +1 -6
- package/dist/services/octoprint/dto/websocket/current-message.dto.js +1 -6
- package/dist/services/octoprint/dto/websocket/event-message.dto.js +1 -6
- package/dist/services/octoprint/dto/websocket/event.type.js +42 -49
- package/dist/services/octoprint/dto/websocket/event.type.js.map +1 -1
- package/dist/services/octoprint/dto/websocket/history-message.dto.js +1 -6
- package/dist/services/octoprint/dto/websocket/plugin-message.dto.js +1 -6
- package/dist/services/octoprint/dto/websocket/timelapse-message.dto.js +1 -6
- package/dist/services/octoprint/octoprint-api.routes.js +77 -94
- package/dist/services/octoprint/octoprint-api.routes.js.map +1 -1
- package/dist/services/octoprint/octoprint-websocket.adapter.js +265 -315
- package/dist/services/octoprint/octoprint-websocket.adapter.js.map +1 -1
- package/dist/services/octoprint/octoprint.client.js +220 -261
- package/dist/services/octoprint/octoprint.client.js.map +1 -1
- package/dist/services/octoprint/utils/api.utils.js +15 -32
- package/dist/services/octoprint/utils/api.utils.js.map +1 -1
- package/dist/services/octoprint/utils/file.utils.js +44 -67
- package/dist/services/octoprint/utils/file.utils.js.map +1 -1
- package/dist/services/octoprint/utils/octoprint-http-client.builder.js +16 -29
- package/dist/services/octoprint/utils/octoprint-http-client.builder.js.map +1 -1
- package/dist/services/octoprint.api.js +113 -128
- package/dist/services/octoprint.api.js.map +1 -1
- package/dist/services/orm/base.interface.js +1 -6
- package/dist/services/orm/base.service.js +57 -73
- package/dist/services/orm/base.service.js.map +1 -1
- package/dist/services/orm/camera-stream.service.js +21 -27
- package/dist/services/orm/camera-stream.service.js.map +1 -1
- package/dist/services/orm/floor-position.service.js +42 -49
- package/dist/services/orm/floor-position.service.js.map +1 -1
- package/dist/services/orm/floor.service.js +110 -138
- package/dist/services/orm/floor.service.js.map +1 -1
- package/dist/services/orm/permission.service.js +16 -23
- package/dist/services/orm/permission.service.js.map +1 -1
- package/dist/services/orm/print-job.service.js +443 -545
- package/dist/services/orm/print-job.service.js.map +1 -1
- package/dist/services/orm/printer-maintenance-log.service.js +102 -149
- package/dist/services/orm/printer-maintenance-log.service.js.map +1 -1
- package/dist/services/orm/printer-tag.service.js +93 -118
- package/dist/services/orm/printer-tag.service.js.map +1 -1
- package/dist/services/orm/printer.service.js +110 -158
- package/dist/services/orm/printer.service.js.map +1 -1
- package/dist/services/orm/refresh-token.service.js +69 -99
- package/dist/services/orm/refresh-token.service.js.map +1 -1
- package/dist/services/orm/role.service.js +99 -116
- package/dist/services/orm/role.service.js.map +1 -1
- package/dist/services/orm/settings.service.js +84 -94
- package/dist/services/orm/settings.service.js.map +1 -1
- package/dist/services/orm/user-role.service.js +39 -53
- package/dist/services/orm/user-role.service.js.map +1 -1
- package/dist/services/orm/user.service.js +142 -189
- package/dist/services/orm/user.service.js.map +1 -1
- package/dist/services/print-file-downloader.service.js +153 -167
- package/dist/services/print-file-downloader.service.js.map +1 -1
- package/dist/services/print-queue.service.js +240 -326
- package/dist/services/print-queue.service.js.map +1 -1
- package/dist/services/printer-api.factory.js +26 -43
- package/dist/services/printer-api.factory.js.map +1 -1
- package/dist/services/printer-api.interface.js +23 -53
- package/dist/services/printer-api.interface.js.map +1 -1
- package/dist/services/prusa-link/constants/prusalink-event.dto.js +9 -16
- package/dist/services/prusa-link/constants/prusalink-event.dto.js.map +1 -1
- package/dist/services/prusa-link/constants/prusalink.constants.js +4 -11
- package/dist/services/prusa-link/constants/prusalink.constants.js.map +1 -1
- package/dist/services/prusa-link/dto/file-response.dto.js +1 -6
- package/dist/services/prusa-link/dto/file.dto.js +1 -6
- package/dist/services/prusa-link/dto/job-state.dto.js +1 -6
- package/dist/services/prusa-link/dto/printer-state.dto.js +1 -6
- package/dist/services/prusa-link/dto/status.dto.js +1 -6
- package/dist/services/prusa-link/dto/version.dto.js +1 -6
- package/dist/services/prusa-link/prusa-link-http-polling.adapter.js +141 -157
- package/dist/services/prusa-link/prusa-link-http-polling.adapter.js.map +1 -1
- package/dist/services/prusa-link/prusa-link.api.js +206 -240
- package/dist/services/prusa-link/prusa-link.api.js.map +1 -1
- package/dist/services/prusa-link/utils/digest-auth.params.js +1 -6
- package/dist/services/prusa-link/utils/digest-auth.util.js +17 -24
- package/dist/services/prusa-link/utils/digest-auth.util.js.map +1 -1
- package/dist/services/prusa-link/utils/prusa-link-http-client.builder.js +92 -129
- package/dist/services/prusa-link/utils/prusa-link-http-client.builder.js.map +1 -1
- package/dist/services/socket.factory.js +21 -36
- package/dist/services/socket.factory.js.map +1 -1
- package/dist/services/task-manager.service.js +190 -174
- package/dist/services/task-manager.service.js.map +1 -1
- package/dist/services/typeorm/typeorm.service.js +31 -46
- package/dist/services/typeorm/typeorm.service.js.map +1 -1
- package/dist/services/validators/floor-service.validation.js +26 -63
- package/dist/services/validators/floor-service.validation.js.map +1 -1
- package/dist/services/validators/print-job.validation.js +11 -26
- package/dist/services/validators/print-job.validation.js.map +1 -1
- package/dist/services/validators/printer-maintenance-log.validation.js +17 -37
- package/dist/services/validators/printer-maintenance-log.validation.js.map +1 -1
- package/dist/services/validators/printer-service.validation.js +60 -125
- package/dist/services/validators/printer-service.validation.js.map +1 -1
- package/dist/services/validators/settings-service.validation.js +46 -106
- package/dist/services/validators/settings-service.validation.js.map +1 -1
- package/dist/services/validators/user-service.validation.js +19 -36
- package/dist/services/validators/user-service.validation.js.map +1 -1
- package/dist/services/validators/yaml-service.validation.js +96 -132
- package/dist/services/validators/yaml-service.validation.js.map +1 -1
- package/dist/services/websocket-adapter.interface.js +1 -6
- package/dist/shared/default-http-client.builder.js +74 -92
- package/dist/shared/default-http-client.builder.js.map +1 -1
- package/dist/shared/dtos/api-state.type.js +8 -15
- package/dist/shared/dtos/api-state.type.js.map +1 -1
- package/dist/shared/dtos/socket-login.dto.js +1 -6
- package/dist/shared/dtos/socket-state.type.js +11 -18
- package/dist/shared/dtos/socket-state.type.js.map +1 -1
- package/dist/shared/load-controllers.js +41 -19
- package/dist/shared/load-controllers.js.map +1 -1
- package/dist/shared/runtime-settings.migration.js +43 -50
- package/dist/shared/runtime-settings.migration.js.map +1 -1
- package/dist/shared/websocket-rpc-extended.adapter.js +74 -75
- package/dist/shared/websocket-rpc-extended.adapter.js.map +1 -1
- package/dist/shared/websocket.adapter.js +78 -63
- package/dist/shared/websocket.adapter.js.map +1 -1
- package/dist/state/file-upload-tracker.cache.js +63 -75
- package/dist/state/file-upload-tracker.cache.js.map +1 -1
- package/dist/state/floor.store.js +77 -89
- package/dist/state/floor.store.js.map +1 -1
- package/dist/state/printer-events.cache.js +237 -295
- package/dist/state/printer-events.cache.js.map +1 -1
- package/dist/state/printer-socket.store.js +156 -174
- package/dist/state/printer-socket.store.js.map +1 -1
- package/dist/state/printer-thumbnail.cache.js +129 -130
- package/dist/state/printer-thumbnail.cache.js.map +1 -1
- package/dist/state/printer.cache.js +87 -102
- package/dist/state/printer.cache.js.map +1 -1
- package/dist/state/settings.store.js +211 -234
- package/dist/state/settings.store.js.map +1 -1
- package/dist/state/socket-io.gateway.js +58 -87
- package/dist/state/socket-io.gateway.js.map +1 -1
- package/dist/state/test-printer-socket.store.js +116 -137
- package/dist/state/test-printer-socket.store.js.map +1 -1
- package/dist/state/validation/create-test-printer.validation.js +14 -21
- package/dist/state/validation/create-test-printer.validation.js.map +1 -1
- package/dist/task.presets.js +30 -37
- package/dist/task.presets.js.map +1 -1
- package/dist/tasks/boot.task.js +100 -128
- package/dist/tasks/boot.task.js.map +1 -1
- package/dist/tasks/client-bundle.task.js +20 -28
- package/dist/tasks/client-bundle.task.js.map +1 -1
- package/dist/tasks/print-job-analysis.task.js +88 -113
- package/dist/tasks/print-job-analysis.task.js.map +1 -1
- package/dist/tasks/printer-websocket-restore.task.js +41 -54
- package/dist/tasks/printer-websocket-restore.task.js.map +1 -1
- package/dist/tasks/printer-websocket.task.js +11 -19
- package/dist/tasks/printer-websocket.task.js.map +1 -1
- package/dist/tasks/socketio.task.js +35 -53
- package/dist/tasks/socketio.task.js.map +1 -1
- package/dist/tasks/software-update.task.js +12 -20
- package/dist/tasks/software-update.task.js.map +1 -1
- package/dist/tasks.js +27 -41
- package/dist/tasks.js.map +1 -1
- package/dist/types/express/index.d.js +1 -6
- package/dist/types/virtual-modules.d.js +1 -0
- package/dist/utils/array.util.js +9 -24
- package/dist/utils/array.util.js.map +1 -1
- package/dist/utils/bgcode/bgcode-thumbnail.parser.js +26 -44
- package/dist/utils/bgcode/bgcode-thumbnail.parser.js.map +1 -1
- package/dist/utils/bgcode/bgcode.constants.js +9 -45
- package/dist/utils/bgcode/bgcode.constants.js.map +1 -1
- package/dist/utils/bgcode/bgcode.types.js +57 -106
- package/dist/utils/bgcode/bgcode.types.js.map +1 -1
- package/dist/utils/bgcode/bgcode.utils.js +167 -256
- package/dist/utils/bgcode/bgcode.utils.js.map +1 -1
- package/dist/utils/bgcode/heatshrink-decoder.js +130 -170
- package/dist/utils/bgcode/heatshrink-decoder.js.map +1 -1
- package/dist/utils/bgcode/png-encoder.js +53 -66
- package/dist/utils/bgcode/png-encoder.js.map +1 -1
- package/dist/utils/bgcode/qoi-decoder.js +116 -135
- package/dist/utils/bgcode/qoi-decoder.js.map +1 -1
- package/dist/utils/cache/key-diff.cache.js +56 -85
- package/dist/utils/cache/key-diff.cache.js.map +1 -1
- package/dist/utils/correlation-token.util.js +4 -11
- package/dist/utils/correlation-token.util.js.map +1 -1
- package/dist/utils/crypto.utils.js +7 -23
- package/dist/utils/crypto.utils.js.map +1 -1
- package/dist/utils/env.utils.js +14 -49
- package/dist/utils/env.utils.js.map +1 -1
- package/dist/utils/error.utils.js +4 -11
- package/dist/utils/error.utils.js.map +1 -1
- package/dist/utils/fs.utils.js +26 -49
- package/dist/utils/fs.utils.js.map +1 -1
- package/dist/utils/gcode.utils.js +30 -43
- package/dist/utils/gcode.utils.js.map +1 -1
- package/dist/utils/image-dimensions.js +39 -54
- package/dist/utils/image-dimensions.js.map +1 -1
- package/dist/utils/job-stats.util.js +41 -72
- package/dist/utils/job-stats.util.js.map +1 -1
- package/dist/utils/normalize-url.js +135 -203
- package/dist/utils/normalize-url.js.map +1 -1
- package/dist/utils/parsers/3mf.parser.js +298 -365
- package/dist/utils/parsers/3mf.parser.js.map +1 -1
- package/dist/utils/parsers/bgcode.parser.js +149 -202
- package/dist/utils/parsers/bgcode.parser.js.map +1 -1
- package/dist/utils/parsers/gcode.parser.js +200 -263
- package/dist/utils/parsers/gcode.parser.js.map +1 -1
- package/dist/utils/parsers/parser.types.js +1 -6
- package/dist/utils/pretty-print.utils.js +5 -20
- package/dist/utils/pretty-print.utils.js.map +1 -1
- package/dist/utils/semver.utils.js +10 -26
- package/dist/utils/semver.utils.js.map +1 -1
- package/dist/utils/swagger/decorators.js +14 -32
- package/dist/utils/swagger/decorators.js.map +1 -1
- package/dist/utils/swagger/generator.js +151 -194
- package/dist/utils/swagger/generator.js.map +1 -1
- package/dist/utils/swagger/swagger.js +40 -51
- package/dist/utils/swagger/swagger.js.map +1 -1
- package/dist/utils/thumbnail.util.js +11 -20
- package/dist/utils/thumbnail.util.js.map +1 -1
- package/dist/utils/time.utils.js +4 -12
- package/dist/utils/time.utils.js.map +1 -1
- package/dist/utils/url.utils.js +9 -27
- package/dist/utils/url.utils.js.map +1 -1
- package/package.json +79 -90
- package/packages/consoles/package.json +44 -0
- package/packages/consoles/tsconfig.json +23 -0
- package/packages/consoles/vite.config.ts +15 -0
- package/tsconfig.json +10 -6
- package/vite.config.ts +62 -0
- package/.swcrc +0 -33
- package/.yarn/releases/yarn-4.12.0.cjs +0 -942
- package/biome.json +0 -36
- package/dist/consoles/bambu-mqtt-diagnostic.console.js +0 -565
- package/dist/consoles/bambu-mqtt-diagnostic.console.js.map +0 -1
- package/dist/consoles/download-github-releases.js +0 -50
- package/dist/consoles/download-github-releases.js.map +0 -1
- package/dist/consoles/gcode-scanner-poc.console.js +0 -52
- package/dist/consoles/gcode-scanner-poc.console.js.map +0 -1
- package/dist/consoles/launch-http-servers.js +0 -31
- package/dist/consoles/launch-http-servers.js.map +0 -1
- package/dist/consoles/mock-bambu.server.js +0 -319
- package/dist/consoles/mock-bambu.server.js.map +0 -1
- package/dist/consoles/mock-camera/default-image.js +0 -13
- package/dist/consoles/mock-camera/default-image.js.map +0 -1
- package/dist/consoles/mock-camera/mock-camera.server.js +0 -160
- package/dist/consoles/mock-camera/mock-camera.server.js.map +0 -1
- package/dist/consoles/mock-octoprint.server.js +0 -499
- package/dist/consoles/mock-octoprint.server.js.map +0 -1
- package/dist/consoles/mock-prusalink.server.js +0 -57
- package/dist/consoles/mock-prusalink.server.js.map +0 -1
- package/dist/consoles/moonraker-test.console.js +0 -3
- package/dist/consoles/moonraker-test.console.js.map +0 -1
- package/dist/consoles/utils/api-messages.js +0 -856
- package/dist/consoles/utils/api-messages.js.map +0 -1
- package/dist/consoles/utils/delayed-memory.storage.js +0 -42
- package/dist/consoles/utils/delayed-memory.storage.js.map +0 -1
- package/dist/consoles/utils/ws-messages.js +0 -88
- package/dist/consoles/utils/ws-messages.js.map +0 -1
- package/dist/entities/index.js.map +0 -1
- package/dist/services/bambu/mqtt-message.types.js.map +0 -1
- package/dist/services/interfaces/auth.service.interface.js.map +0 -1
- package/dist/services/interfaces/camera-stream.service.interface.js.map +0 -1
- package/dist/services/interfaces/file-upload-tracker.interface.js.map +0 -1
- package/dist/services/interfaces/floor.service.interface.js.map +0 -1
- package/dist/services/interfaces/jwt.service.interface.js.map +0 -1
- package/dist/services/interfaces/permission.service.interface.js.map +0 -1
- package/dist/services/interfaces/printer-file.dto.js.map +0 -1
- package/dist/services/interfaces/printer-maintenance-log.dto.js.map +0 -1
- package/dist/services/interfaces/printer-tag.service.interface.js.map +0 -1
- package/dist/services/interfaces/printer.service.interface.js.map +0 -1
- package/dist/services/interfaces/refresh-token.service.interface.js.map +0 -1
- package/dist/services/interfaces/role-service.interface.js.map +0 -1
- package/dist/services/interfaces/settings.service.interface.js.map +0 -1
- package/dist/services/interfaces/tag.dto.js.map +0 -1
- package/dist/services/interfaces/task.interfaces.js.map +0 -1
- package/dist/services/interfaces/user-service.interface.js.map +0 -1
- package/dist/services/moonraker/dto/access/access-info.dto.js.map +0 -1
- package/dist/services/moonraker/dto/access/access-login-refresh.dto.js.map +0 -1
- package/dist/services/moonraker/dto/access/access-login-result.dto.js.map +0 -1
- package/dist/services/moonraker/dto/access/access-user-result.dto.js.map +0 -1
- package/dist/services/moonraker/dto/access/access-user.dto.js.map +0 -1
- package/dist/services/moonraker/dto/database/database-namespace-item.dto.js.map +0 -1
- package/dist/services/moonraker/dto/database/database-namespace-list.dto.js.map +0 -1
- package/dist/services/moonraker/dto/gcode-help.dto.js.map +0 -1
- package/dist/services/moonraker/dto/gcode-store.dto.js.map +0 -1
- package/dist/services/moonraker/dto/job-queue/enqueue-job.dto.js.map +0 -1
- package/dist/services/moonraker/dto/job-queue/job-queue-status.dto.js.map +0 -1
- package/dist/services/moonraker/dto/machine/machine-device-power-device-state.dto.js.map +0 -1
- package/dist/services/moonraker/dto/machine/machine-device-power-devices.dto.js.map +0 -1
- package/dist/services/moonraker/dto/machine/machine-peripherals-canbus.dto.js.map +0 -1
- package/dist/services/moonraker/dto/machine/machine-peripherals-serial.dto.js.map +0 -1
- package/dist/services/moonraker/dto/machine/machine-peripherals-usb.dto.js.map +0 -1
- package/dist/services/moonraker/dto/machine/machine-peripherals-video.dto.js.map +0 -1
- package/dist/services/moonraker/dto/machine/machine-system-info.dto.js.map +0 -1
- package/dist/services/moonraker/dto/machine/machine-update-status.dto.js.map +0 -1
- package/dist/services/moonraker/dto/machine/machine-wled-strips.dto.js.map +0 -1
- package/dist/services/moonraker/dto/notifier-list.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/bed-mesh.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/configfile.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/display-status.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/extruder.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/fan.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/filament-motion-sensor.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/filament-switch-sensor.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/gcode-move.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/gcode.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/heater-bed.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/heaters.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/mcu.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/motion-report.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/output-pin.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/pause-resume.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/printer-object.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/printer-object.types.js.map +0 -1
- package/dist/services/moonraker/dto/objects/printer-objects-query.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/stepper-enable.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/system-stats.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/temperature-fan.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/temperature-sensor.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/toolhead.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/virtual-sdcard.dto.js.map +0 -1
- package/dist/services/moonraker/dto/objects/webhooks.dto.js.map +0 -1
- package/dist/services/moonraker/dto/octoprint-compat/api-job.dto.js.map +0 -1
- package/dist/services/moonraker/dto/octoprint-compat/api-login.dto.js.map +0 -1
- package/dist/services/moonraker/dto/octoprint-compat/api-printer.dto.js.map +0 -1
- package/dist/services/moonraker/dto/octoprint-compat/api-profiles.dto.js.map +0 -1
- package/dist/services/moonraker/dto/octoprint-compat/api-settings.dto.js.map +0 -1
- package/dist/services/moonraker/dto/octoprint-compat/api-version.dto.js.map +0 -1
- package/dist/services/moonraker/dto/octoprint-compat/server-version.dto.js.map +0 -1
- package/dist/services/moonraker/dto/printer-query-endstops.dto.js.map +0 -1
- package/dist/services/moonraker/dto/process-stats.dto.js.map +0 -1
- package/dist/services/moonraker/dto/rest/action-result.dto.js.map +0 -1
- package/dist/services/moonraker/dto/rest/error.dto.js.map +0 -1
- package/dist/services/moonraker/dto/rollover-logs.dto.js.map +0 -1
- package/dist/services/moonraker/dto/rpc/json-rpc-error.dto.js.map +0 -1
- package/dist/services/moonraker/dto/rpc/json-rpc-request.dto.js.map +0 -1
- package/dist/services/moonraker/dto/rpc/json-rpc-response.dto.js.map +0 -1
- package/dist/services/moonraker/dto/server/server-config.dto.js.map +0 -1
- package/dist/services/moonraker/dto/server-announcements/announcement-action.dto.js.map +0 -1
- package/dist/services/moonraker/dto/server-announcements/announcement-entry-id.dto.js.map +0 -1
- package/dist/services/moonraker/dto/server-announcements/announcement-feeds.dto.js.map +0 -1
- package/dist/services/moonraker/dto/server-announcements/announcement-list.dto.js.map +0 -1
- package/dist/services/moonraker/dto/server-files/server-file-directory-action.dto.js.map +0 -1
- package/dist/services/moonraker/dto/server-files/server-file-directory-info.dto.js.map +0 -1
- package/dist/services/moonraker/dto/server-files/server-file-metadata.dto.js.map +0 -1
- package/dist/services/moonraker/dto/server-files/server-file-root.dto.js.map +0 -1
- package/dist/services/moonraker/dto/server-files/server-file-thumbnail.dto.js.map +0 -1
- package/dist/services/moonraker/dto/server-files/server-file-zip-action.dto.js.map +0 -1
- package/dist/services/moonraker/dto/server-files/server-file.dto.js.map +0 -1
- package/dist/services/moonraker/dto/server-history/history-job.dto.js.map +0 -1
- package/dist/services/moonraker/dto/server-history/history-last-totals.dto.js.map +0 -1
- package/dist/services/moonraker/dto/server-history/history-list.dto.js.map +0 -1
- package/dist/services/moonraker/dto/server-history/history-totals.dto.js.map +0 -1
- package/dist/services/moonraker/dto/server-sensors/sensor-info.dto.js.map +0 -1
- package/dist/services/moonraker/dto/server-sensors/sensor-list.dto.js.map +0 -1
- package/dist/services/moonraker/dto/server-sensors/sensor-measurements.dto.js.map +0 -1
- package/dist/services/moonraker/dto/server-webcams/webcam-item.dto.js.map +0 -1
- package/dist/services/moonraker/dto/server-webcams/webcam-list.dto.js.map +0 -1
- package/dist/services/moonraker/dto/server-webcams/webcam-test.dto.js.map +0 -1
- package/dist/services/moonraker/dto/spoolman/spoolman-active-spool.dto.js.map +0 -1
- package/dist/services/moonraker/dto/spoolman/spoolman-proxy-request.dto.js.map +0 -1
- package/dist/services/moonraker/dto/spoolman/spoolman-response.dto.js.map +0 -1
- package/dist/services/moonraker/dto/spoolman/spoolman-status.dto.js.map +0 -1
- package/dist/services/moonraker/dto/sudo-info.dto.js.map +0 -1
- package/dist/services/moonraker/dto/sudo-response.dto.js.map +0 -1
- package/dist/services/moonraker/dto/temperature-store.dto.js.map +0 -1
- package/dist/services/moonraker/dto/websocket/connection-identify-response.dto.js.map +0 -1
- package/dist/services/moonraker/dto/websocket/connection-identify.dto.js.map +0 -1
- package/dist/services/moonraker/dto/websocket/json-rpc-event.dto.js.map +0 -1
- package/dist/services/moonraker/dto/websocket/message.types.js.map +0 -1
- package/dist/services/moonraker/dto/websocket/notify-active-spool-set.params.js.map +0 -1
- package/dist/services/moonraker/dto/websocket/notify-agent-event.params.js.map +0 -1
- package/dist/services/moonraker/dto/websocket/notify-announcement-update.params.js.map +0 -1
- package/dist/services/moonraker/dto/websocket/notify-announcement.params.js.map +0 -1
- package/dist/services/moonraker/dto/websocket/notify-button-event.params.js.map +0 -1
- package/dist/services/moonraker/dto/websocket/notify-history-changed.params.js.map +0 -1
- package/dist/services/moonraker/dto/websocket/notify-job-queue-changed.params.js.map +0 -1
- package/dist/services/moonraker/dto/websocket/notify-proc-stat-update.params.js.map +0 -1
- package/dist/services/moonraker/dto/websocket/notify-sensor-update.params.js.map +0 -1
- package/dist/services/moonraker/dto/websocket/notify-service-state-changed.params.js.map +0 -1
- package/dist/services/moonraker/dto/websocket/notify-spoolman-status-changed.js.map +0 -1
- package/dist/services/moonraker/dto/websocket/notify-sudo-alert.params.js.map +0 -1
- package/dist/services/moonraker/dto/websocket/notify-user-change.params.js.map +0 -1
- package/dist/services/octoprint/dto/access/user-list.dto.js.map +0 -1
- package/dist/services/octoprint/dto/access/user.dto.js.map +0 -1
- package/dist/services/octoprint/dto/auth/current-user.dto.js.map +0 -1
- package/dist/services/octoprint/dto/auth/login.dto.js.map +0 -1
- package/dist/services/octoprint/dto/connection/connection.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/client-authed.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/client-closed.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/client-opened.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/dwelling.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/file-added.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/file-deselected.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/file-removed.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/folder-added.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/home.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/metadata-analysis-finished.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/metadata-analysis-started.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/metadata-statistics-updated.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/position-update.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/print-cancelled.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/print-cancelling.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/print-done.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/print-failed.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/print-paused.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/print-resumed.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/print-started.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/printer-state-changed.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/transfer-done.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/transfer-started.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/updated-files.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/upload.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/user-logged-in.dto.js.map +0 -1
- package/dist/services/octoprint/dto/events/z-change.dto.js.map +0 -1
- package/dist/services/octoprint/dto/files/gcode-analysis.dto.js.map +0 -1
- package/dist/services/octoprint/dto/files/octoprint-file.dto.js.map +0 -1
- package/dist/services/octoprint/dto/files/octoprint-files-response.dto.js.map +0 -1
- package/dist/services/octoprint/dto/job/job.dto.js.map +0 -1
- package/dist/services/octoprint/dto/printer/busy-file.dto.js.map +0 -1
- package/dist/services/octoprint/dto/printer/current-printer-state.dto.js.map +0 -1
- package/dist/services/octoprint/dto/printer/flags.dto.js.map +0 -1
- package/dist/services/octoprint/dto/printer/markings.dto.js.map +0 -1
- package/dist/services/octoprint/dto/printer/progress.dto.js.map +0 -1
- package/dist/services/octoprint/dto/printer/resends.dto.js.map +0 -1
- package/dist/services/octoprint/dto/printer/state.dto.js.map +0 -1
- package/dist/services/octoprint/dto/printer/temps.dto.js.map +0 -1
- package/dist/services/octoprint/dto/rest/error.dto.js.map +0 -1
- package/dist/services/octoprint/dto/server/server.dto.js.map +0 -1
- package/dist/services/octoprint/dto/server/version.dto.js.map +0 -1
- package/dist/services/octoprint/dto/settings/serial-settings.dto.js.map +0 -1
- package/dist/services/octoprint/dto/settings/settings-parts.type.js.map +0 -1
- package/dist/services/octoprint/dto/settings/settings.dto.js.map +0 -1
- package/dist/services/octoprint/dto/settings/virtual-printer-settings.dto.js.map +0 -1
- package/dist/services/octoprint/dto/websocket/connection-message.dto.js.map +0 -1
- package/dist/services/octoprint/dto/websocket/current-message.dto.js.map +0 -1
- package/dist/services/octoprint/dto/websocket/event-message.dto.js.map +0 -1
- package/dist/services/octoprint/dto/websocket/history-message.dto.js.map +0 -1
- package/dist/services/octoprint/dto/websocket/plugin-message.dto.js.map +0 -1
- package/dist/services/octoprint/dto/websocket/timelapse-message.dto.js.map +0 -1
- package/dist/services/orm/base.interface.js.map +0 -1
- package/dist/services/prusa-link/dto/file-response.dto.js.map +0 -1
- package/dist/services/prusa-link/dto/file.dto.js.map +0 -1
- package/dist/services/prusa-link/dto/job-state.dto.js.map +0 -1
- package/dist/services/prusa-link/dto/printer-state.dto.js.map +0 -1
- package/dist/services/prusa-link/dto/status.dto.js.map +0 -1
- package/dist/services/prusa-link/dto/version.dto.js.map +0 -1
- package/dist/services/prusa-link/utils/digest-auth.params.js.map +0 -1
- package/dist/services/websocket-adapter.interface.js.map +0 -1
- package/dist/shared/dtos/socket-login.dto.js.map +0 -1
- package/dist/types/express/index.d.js.map +0 -1
- package/dist/utils/parsers/parser.types.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/services/authentication/jwt.service.ts"],"
|
|
1
|
+
{"version":3,"file":"jwt.service.js","names":[],"sources":["../../../src/services/authentication/jwt.service.ts"],"sourcesContent":["import jwt from \"jsonwebtoken\";\nimport { AppConstants } from \"@/server.constants\";\nimport type { IConfigService } from \"@/services/core/config.service\";\nimport { SettingsStore } from \"@/state/settings.store\";\nimport type { IJwtService } from \"@/services/interfaces/jwt.service.interface\";\n\nexport class JwtService implements IJwtService {\n constructor(\n private readonly settingsStore: SettingsStore,\n private readonly configService: IConfigService,\n ) {}\n\n async signJwtToken(userId: number, username: string) {\n const { jwtSecret, jwtExpiresIn } = await this.settingsStore.getCredentialSettings();\n\n return jwt.sign({ userId, username }, jwtSecret, {\n expiresIn: jwtExpiresIn,\n subject: userId.toString(),\n audience: this.configService.get(AppConstants.OVERRIDE_JWT_AUDIENCE, AppConstants.DEFAULT_JWT_AUDIENCE),\n issuer: this.configService.get(AppConstants.OVERRIDE_JWT_ISSUER, AppConstants.DEFAULT_JWT_ISSUER),\n });\n }\n}\n"],"mappings":";;;AAMA,IAAa,aAAb,MAA+C;CAC7C,YACE,eACA,eACA;AAFiB,OAAA,gBAAA;AACA,OAAA,gBAAA;;CAGnB,MAAM,aAAa,QAAgB,UAAkB;EACnD,MAAM,EAAE,WAAW,iBAAiB,MAAM,KAAK,cAAc,uBAAuB;AAEpF,SAAO,IAAI,KAAK;GAAE;GAAQ;GAAU,EAAE,WAAW;GAC/C,WAAW;GACX,SAAS,OAAO,UAAU;GAC1B,UAAU,KAAK,cAAc,IAAI,aAAa,uBAAuB,aAAa,qBAAqB;GACvG,QAAQ,KAAK,cAAc,IAAI,aAAa,qBAAqB,aAAa,mBAAmB;GAClG,CAAC"}
|
|
@@ -1,238 +1,196 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
cleanup() {
|
|
196
|
-
this.ftpClient = null;
|
|
197
|
-
}
|
|
198
|
-
sanitizeHost(host) {
|
|
199
|
-
if (!host?.length) {
|
|
200
|
-
throw new Error("Host must be a non-empty string");
|
|
201
|
-
}
|
|
202
|
-
const trimmed = host.trim();
|
|
203
|
-
if (trimmed.length === 0) {
|
|
204
|
-
throw new Error("Host cannot be empty");
|
|
205
|
-
}
|
|
206
|
-
const ipv4Pattern = /^(\d{1,3}\.){3}\d{1,3}$/;
|
|
207
|
-
const hostnamePattern = /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
|
|
208
|
-
if (!ipv4Pattern.test(trimmed) && !hostnamePattern.test(trimmed)) {
|
|
209
|
-
throw new Error("Invalid host format. Must be a valid IP address or hostname");
|
|
210
|
-
}
|
|
211
|
-
if (ipv4Pattern.test(trimmed)) {
|
|
212
|
-
const parts = trimmed.split(".").map(Number);
|
|
213
|
-
if (parts.some((part)=>part < 0 || part > 255)) {
|
|
214
|
-
throw new Error("Invalid IPv4 address. Octets must be between 0 and 255");
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
return trimmed;
|
|
218
|
-
}
|
|
219
|
-
sanitizeAccessCode(accessCode) {
|
|
220
|
-
if (!accessCode?.length) {
|
|
221
|
-
throw new Error("Access code must be a non-empty string");
|
|
222
|
-
}
|
|
223
|
-
const trimmed = accessCode.trim();
|
|
224
|
-
if (trimmed.length === 0) {
|
|
225
|
-
throw new Error("Access code cannot be empty");
|
|
226
|
-
}
|
|
227
|
-
if (trimmed.length < 4 || trimmed.length > 32) {
|
|
228
|
-
throw new Error("Access code must be between 4 and 32 characters");
|
|
229
|
-
}
|
|
230
|
-
const alphanumericPattern = /^[a-zA-Z0-9]+$/;
|
|
231
|
-
if (!alphanumericPattern.test(trimmed)) {
|
|
232
|
-
throw new Error("Access code must contain only alphanumeric characters");
|
|
233
|
-
}
|
|
234
|
-
return trimmed;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
1
|
+
import { uploadDoneEvent, uploadFailedEvent, uploadProgressEvent } from "../../constants/event.constants.js";
|
|
2
|
+
import { AppConstants } from "../../server.constants.js";
|
|
3
|
+
import { getMediaPath } from "../../utils/fs.utils.js";
|
|
4
|
+
import { errorSummary } from "../../utils/error.utils.js";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { createReadStream, existsSync, mkdirSync, unlinkSync } from "node:fs";
|
|
7
|
+
import { Client } from "basic-ftp";
|
|
8
|
+
//#region src/services/bambu/bambu-ftp.adapter.ts
|
|
9
|
+
var BambuFtpAdapter = class BambuFtpAdapter {
|
|
10
|
+
logger;
|
|
11
|
+
ftpClient = null;
|
|
12
|
+
host = null;
|
|
13
|
+
accessCode = null;
|
|
14
|
+
isConnecting = false;
|
|
15
|
+
constructor(settingsStore, loggerFactory, eventEmitter2) {
|
|
16
|
+
this.settingsStore = settingsStore;
|
|
17
|
+
this.eventEmitter2 = eventEmitter2;
|
|
18
|
+
this.logger = loggerFactory(BambuFtpAdapter.name);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Connect to FTP server
|
|
22
|
+
*/
|
|
23
|
+
async connect(host, accessCode) {
|
|
24
|
+
if (this.ftpClient && !this.ftpClient.closed) {
|
|
25
|
+
this.logger.debug("FTP already connected");
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (this.isConnecting) throw new Error("Connection already in progress");
|
|
29
|
+
const sanitizedHost = this.sanitizeHost(host);
|
|
30
|
+
const sanitizedAccessCode = this.sanitizeAccessCode(accessCode);
|
|
31
|
+
this.host = sanitizedHost;
|
|
32
|
+
this.accessCode = sanitizedAccessCode;
|
|
33
|
+
this.isConnecting = true;
|
|
34
|
+
const timeout = this.settingsStore.getTimeoutSettings().apiTimeout;
|
|
35
|
+
this.logger.log(`Connecting to Bambu FTP at ${sanitizedHost}:990`);
|
|
36
|
+
try {
|
|
37
|
+
this.ftpClient = new Client(timeout);
|
|
38
|
+
this.ftpClient.ftp.verbose = false;
|
|
39
|
+
await this.ftpClient.access({
|
|
40
|
+
host: sanitizedHost,
|
|
41
|
+
port: 990,
|
|
42
|
+
user: "bblp",
|
|
43
|
+
password: sanitizedAccessCode,
|
|
44
|
+
secure: "implicit",
|
|
45
|
+
secureOptions: {
|
|
46
|
+
checkServerIdentity: () => {},
|
|
47
|
+
rejectUnauthorized: false
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
this.isConnecting = false;
|
|
51
|
+
this.logger.log("FTP connected successfully");
|
|
52
|
+
} catch (error) {
|
|
53
|
+
this.isConnecting = false;
|
|
54
|
+
this.cleanup();
|
|
55
|
+
this.logger.error("FTP connection failed:", error);
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async disconnect() {
|
|
60
|
+
if (!this.ftpClient) return;
|
|
61
|
+
this.logger.log("Disconnecting FTP");
|
|
62
|
+
try {
|
|
63
|
+
this.ftpClient.close();
|
|
64
|
+
} catch (error) {
|
|
65
|
+
this.logger.error("Error closing FTP:", error);
|
|
66
|
+
} finally {
|
|
67
|
+
this.cleanup();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async listFiles(dirPath = "/") {
|
|
71
|
+
this.ensureConnected();
|
|
72
|
+
try {
|
|
73
|
+
this.logger.log(`Connecting ftp ${dirPath}`);
|
|
74
|
+
const files = await this.ftpClient.list(dirPath);
|
|
75
|
+
this.logger.debug(`Listed ${files.length} files in ${dirPath}`);
|
|
76
|
+
return files;
|
|
77
|
+
} catch (error) {
|
|
78
|
+
this.logger.error(`Failed to list files in ${dirPath}: ${errorSummary(error)}`);
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
getFileStoragePath(filename) {
|
|
83
|
+
const storagePath = join(getMediaPath(), AppConstants.defaultFileUploadsStorage);
|
|
84
|
+
if (!existsSync(storagePath)) mkdirSync(storagePath, { recursive: true });
|
|
85
|
+
return join(storagePath, filename);
|
|
86
|
+
}
|
|
87
|
+
async uploadFile(stream, remotePath, progressToken) {
|
|
88
|
+
this.ensureConnected();
|
|
89
|
+
try {
|
|
90
|
+
if (progressToken) this.ftpClient.trackProgress((info) => {
|
|
91
|
+
this.eventEmitter2.emit(`${uploadProgressEvent(progressToken)}`, progressToken, {
|
|
92
|
+
loaded: info.bytes,
|
|
93
|
+
total: info.bytesOverall
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
this.logger.log(`Uploading stream to ${remotePath}`);
|
|
97
|
+
await this.ftpClient.uploadFrom(stream, remotePath);
|
|
98
|
+
this.ftpClient.trackProgress();
|
|
99
|
+
if (progressToken) this.eventEmitter2.emit(`${uploadDoneEvent(progressToken)}`, progressToken);
|
|
100
|
+
this.logger.log(`File uploaded successfully: ${remotePath}`);
|
|
101
|
+
} catch (error) {
|
|
102
|
+
if (progressToken) this.eventEmitter2.emit(`${uploadFailedEvent(progressToken)}`, progressToken, error?.message);
|
|
103
|
+
this.logger.error(`Upload failed for ${remotePath}:`, error);
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async downloadFile(remotePath, localPath) {
|
|
108
|
+
this.ensureConnected();
|
|
109
|
+
try {
|
|
110
|
+
this.logger.log(`Downloading ${remotePath} to ${localPath}`);
|
|
111
|
+
await this.ftpClient.downloadTo(localPath, remotePath);
|
|
112
|
+
this.logger.log(`File downloaded successfully: ${remotePath}`);
|
|
113
|
+
} catch (error) {
|
|
114
|
+
this.logger.error(`Download failed for ${remotePath}:`, error);
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async downloadFileAsStream(remotePath) {
|
|
119
|
+
this.ensureConnected();
|
|
120
|
+
const filename = remotePath.split("/").pop() || "download";
|
|
121
|
+
const tempPath = this.getFileStoragePath(`bambu-download-${Date.now()}-${filename}`);
|
|
122
|
+
try {
|
|
123
|
+
this.logger.log(`Downloading ${remotePath} to temp file for streaming`);
|
|
124
|
+
await this.ftpClient.downloadTo(tempPath, remotePath);
|
|
125
|
+
this.logger.log(`File downloaded successfully: ${remotePath}`);
|
|
126
|
+
const stream = createReadStream(tempPath);
|
|
127
|
+
const cleanup = () => {
|
|
128
|
+
try {
|
|
129
|
+
unlinkSync(tempPath);
|
|
130
|
+
this.logger.debug(`Cleaned up temp file: ${tempPath}`);
|
|
131
|
+
} catch (cleanupError) {
|
|
132
|
+
this.logger.warn(`Failed to cleanup temp file ${tempPath}:`, cleanupError);
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
stream.on("close", cleanup);
|
|
136
|
+
stream.on("error", cleanup);
|
|
137
|
+
return {
|
|
138
|
+
stream,
|
|
139
|
+
tempPath,
|
|
140
|
+
cleanup
|
|
141
|
+
};
|
|
142
|
+
} catch (error) {
|
|
143
|
+
try {
|
|
144
|
+
unlinkSync(tempPath);
|
|
145
|
+
} catch {}
|
|
146
|
+
this.logger.error(`Download failed for ${remotePath}:`, error);
|
|
147
|
+
throw error;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async deleteFile(remotePath) {
|
|
151
|
+
this.ensureConnected();
|
|
152
|
+
try {
|
|
153
|
+
this.logger.log(`Deleting file: ${remotePath}`);
|
|
154
|
+
await this.ftpClient.remove(remotePath);
|
|
155
|
+
this.logger.log(`File deleted successfully: ${remotePath}`);
|
|
156
|
+
} catch (error) {
|
|
157
|
+
this.logger.error(`Delete failed for ${remotePath}:`, error);
|
|
158
|
+
throw error;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
get isConnected() {
|
|
162
|
+
return this.ftpClient != null && !this.ftpClient.closed;
|
|
163
|
+
}
|
|
164
|
+
ensureConnected() {
|
|
165
|
+
if (!this.isConnected) throw new Error("FTP not connected. Call connect() first.");
|
|
166
|
+
}
|
|
167
|
+
cleanup() {
|
|
168
|
+
this.ftpClient = null;
|
|
169
|
+
}
|
|
170
|
+
sanitizeHost(host) {
|
|
171
|
+
if (!host?.length) throw new Error("Host must be a non-empty string");
|
|
172
|
+
const trimmed = host.trim();
|
|
173
|
+
if (trimmed.length === 0) throw new Error("Host cannot be empty");
|
|
174
|
+
const ipv4Pattern = /^(\d{1,3}\.){3}\d{1,3}$/;
|
|
175
|
+
if (!ipv4Pattern.test(trimmed) && !/^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(trimmed)) throw new Error("Invalid host format. Must be a valid IP address or hostname");
|
|
176
|
+
if (ipv4Pattern.test(trimmed)) {
|
|
177
|
+
if (trimmed.split(".").map(Number).some((part) => part < 0 || part > 255)) throw new Error("Invalid IPv4 address. Octets must be between 0 and 255");
|
|
178
|
+
}
|
|
179
|
+
return trimmed;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Sanitize and validate access code input
|
|
183
|
+
*/
|
|
184
|
+
sanitizeAccessCode(accessCode) {
|
|
185
|
+
if (!accessCode?.length) throw new Error("Access code must be a non-empty string");
|
|
186
|
+
const trimmed = accessCode.trim();
|
|
187
|
+
if (trimmed.length === 0) throw new Error("Access code cannot be empty");
|
|
188
|
+
if (trimmed.length < 4 || trimmed.length > 32) throw new Error("Access code must be between 4 and 32 characters");
|
|
189
|
+
if (!/^[a-zA-Z0-9]+$/.test(trimmed)) throw new Error("Access code must contain only alphanumeric characters");
|
|
190
|
+
return trimmed;
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
//#endregion
|
|
194
|
+
export { BambuFtpAdapter };
|
|
237
195
|
|
|
238
196
|
//# sourceMappingURL=bambu-ftp.adapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/services/bambu/bambu-ftp.adapter.ts"],"names":["BambuFtpAdapter","logger","ftpClient","host","accessCode","isConnecting","settingsStore","loggerFactory","eventEmitter2","name","connect","closed","debug","Error","sanitizedHost","sanitizeHost","sanitizedAccessCode","sanitizeAccessCode","timeout","getTimeoutSettings","apiTimeout","log","Client","ftp","verbose","access","port","user","password","secure","secureOptions","checkServerIdentity","undefined","rejectUnauthorized","error","cleanup","disconnect","close","listFiles","dirPath","ensureConnected","files","list","length","errorSummary","getFileStoragePath","filename","storagePath","join","getMediaPath","AppConstants","defaultFileUploadsStorage","existsSync","mkdirSync","recursive","uploadFile","stream","remotePath","progressToken","trackProgress","info","emit","uploadProgressEvent","loaded","bytes","total","bytesOverall","uploadFrom","uploadDoneEvent","uploadFailedEvent","message","downloadFile","localPath","downloadTo","downloadFileAsStream","split","pop","tempPath","Date","now","createReadStream","unlinkSync","cleanupError","warn","on","deleteFile","remove","isConnected","trimmed","trim","ipv4Pattern","hostnamePattern","test","parts","map","Number","some","part","alphanumericPattern"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bambu-ftp.adapter.js","names":[],"sources":["../../../src/services/bambu/bambu-ftp.adapter.ts"],"sourcesContent":["import EventEmitter2 from \"eventemitter2\";\nimport { SettingsStore } from \"@/state/settings.store\";\nimport { LoggerService } from \"@/handlers/logger\";\nimport type { ILoggerFactory } from \"@/handlers/logger-factory\";\nimport { Client, FileInfo } from \"basic-ftp\";\nimport { uploadDoneEvent, uploadFailedEvent, uploadProgressEvent } from \"@/constants/event.constants\";\nimport { unlinkSync, createReadStream, mkdirSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { AppConstants } from \"@/server.constants\";\nimport { getMediaPath } from \"@/utils/fs.utils\";\nimport { errorSummary } from \"@/utils/error.utils\";\n\nexport class BambuFtpAdapter {\n protected readonly logger: LoggerService;\n\n private ftpClient: Client | null = null;\n private host: string | null = null;\n private accessCode: string | null = null;\n private isConnecting = false;\n\n constructor(\n private readonly settingsStore: SettingsStore,\n loggerFactory: ILoggerFactory,\n private readonly eventEmitter2: EventEmitter2,\n ) {\n this.logger = loggerFactory(BambuFtpAdapter.name);\n }\n\n /**\n * Connect to FTP server\n */\n async connect(host: string, accessCode: string): Promise<void> {\n if (this.ftpClient && !this.ftpClient.closed) {\n this.logger.debug(\"FTP already connected\");\n return;\n }\n\n if (this.isConnecting) {\n throw new Error(\"Connection already in progress\");\n }\n\n // Validate and sanitize inputs\n const sanitizedHost = this.sanitizeHost(host);\n const sanitizedAccessCode = this.sanitizeAccessCode(accessCode);\n\n this.host = sanitizedHost;\n this.accessCode = sanitizedAccessCode;\n this.isConnecting = true;\n\n const timeout = this.settingsStore.getTimeoutSettings().apiTimeout;\n\n this.logger.log(`Connecting to Bambu FTP at ${sanitizedHost}:990`);\n\n try {\n this.ftpClient = new Client(timeout);\n\n // Enable logging if in debug mode\n this.ftpClient.ftp.verbose = false;\n\n await this.ftpClient.access({\n host: sanitizedHost,\n port: 990,\n user: \"bblp\",\n password: sanitizedAccessCode,\n secure: \"implicit\",\n secureOptions: {\n checkServerIdentity: () => {\n return undefined;\n },\n rejectUnauthorized: false,\n },\n });\n\n this.isConnecting = false;\n this.logger.log(\"FTP connected successfully\");\n } catch (error) {\n this.isConnecting = false;\n this.cleanup();\n this.logger.error(\"FTP connection failed:\", error);\n throw error;\n }\n }\n\n async disconnect(): Promise<void> {\n if (!this.ftpClient) {\n return;\n }\n\n this.logger.log(\"Disconnecting FTP\");\n\n try {\n this.ftpClient.close();\n } catch (error) {\n this.logger.error(\"Error closing FTP:\", error);\n } finally {\n this.cleanup();\n }\n }\n\n async listFiles(dirPath: string = \"/\"): Promise<FileInfo[]> {\n this.ensureConnected();\n\n try {\n this.logger.log(`Connecting ftp ${dirPath}`);\n const files = await this.ftpClient!.list(dirPath);\n this.logger.debug(`Listed ${files.length} files in ${dirPath}`);\n return files;\n } catch (error) {\n this.logger.error(`Failed to list files in ${dirPath}: ${errorSummary(error)}`);\n throw error;\n }\n }\n\n private getFileStoragePath(filename: string): string {\n const storagePath = join(getMediaPath(), AppConstants.defaultFileUploadsStorage);\n\n if (!existsSync(storagePath)) {\n mkdirSync(storagePath, { recursive: true });\n }\n\n return join(storagePath, filename);\n }\n\n async uploadFile(stream: Readable, remotePath: string, progressToken?: string): Promise<void> {\n this.ensureConnected();\n\n try {\n if (progressToken) {\n this.ftpClient!.trackProgress((info) => {\n this.eventEmitter2.emit(`${uploadProgressEvent(progressToken)}`, progressToken, {\n loaded: info.bytes,\n total: info.bytesOverall,\n });\n });\n }\n\n this.logger.log(`Uploading stream to ${remotePath}`);\n await this.ftpClient!.uploadFrom(stream, remotePath);\n\n this.ftpClient!.trackProgress();\n\n if (progressToken) {\n this.eventEmitter2.emit(`${uploadDoneEvent(progressToken)}`, progressToken);\n }\n\n this.logger.log(`File uploaded successfully: ${remotePath}`);\n } catch (error) {\n if (progressToken) {\n this.eventEmitter2.emit(`${uploadFailedEvent(progressToken)}`, progressToken, (error as Error)?.message);\n }\n this.logger.error(`Upload failed for ${remotePath}:`, error);\n throw error;\n }\n }\n\n async downloadFile(remotePath: string, localPath: string): Promise<void> {\n this.ensureConnected();\n\n try {\n this.logger.log(`Downloading ${remotePath} to ${localPath}`);\n await this.ftpClient!.downloadTo(localPath, remotePath);\n this.logger.log(`File downloaded successfully: ${remotePath}`);\n } catch (error) {\n this.logger.error(`Download failed for ${remotePath}:`, error);\n throw error;\n }\n }\n\n async downloadFileAsStream(remotePath: string): Promise<{ stream: Readable; tempPath: string; cleanup: () => void }> {\n this.ensureConnected();\n\n const filename = remotePath.split(\"/\").pop() || \"download\";\n const tempPath = this.getFileStoragePath(`bambu-download-${Date.now()}-${filename}`);\n\n try {\n this.logger.log(`Downloading ${remotePath} to temp file for streaming`);\n await this.ftpClient!.downloadTo(tempPath, remotePath);\n this.logger.log(`File downloaded successfully: ${remotePath}`);\n\n const stream = createReadStream(tempPath);\n\n const cleanup = () => {\n try {\n unlinkSync(tempPath);\n this.logger.debug(`Cleaned up temp file: ${tempPath}`);\n } catch (cleanupError) {\n this.logger.warn(`Failed to cleanup temp file ${tempPath}:`, cleanupError);\n }\n };\n\n stream.on(\"close\", cleanup);\n stream.on(\"error\", cleanup);\n\n return { stream, tempPath, cleanup };\n } catch (error) {\n try {\n unlinkSync(tempPath);\n } catch {}\n this.logger.error(`Download failed for ${remotePath}:`, error);\n throw error;\n }\n }\n\n async deleteFile(remotePath: string): Promise<void> {\n this.ensureConnected();\n\n try {\n this.logger.log(`Deleting file: ${remotePath}`);\n await this.ftpClient!.remove(remotePath);\n this.logger.log(`File deleted successfully: ${remotePath}`);\n } catch (error) {\n this.logger.error(`Delete failed for ${remotePath}:`, error);\n throw error;\n }\n }\n\n get isConnected(): boolean {\n return this.ftpClient != null && !this.ftpClient.closed;\n }\n\n private ensureConnected(): void {\n if (!this.isConnected) {\n throw new Error(\"FTP not connected. Call connect() first.\");\n }\n }\n\n private cleanup(): void {\n this.ftpClient = null;\n }\n\n private sanitizeHost(host: string): string {\n if (!host?.length) {\n throw new Error(\"Host must be a non-empty string\");\n }\n\n const trimmed = host.trim();\n if (trimmed.length === 0) {\n throw new Error(\"Host cannot be empty\");\n }\n\n // Validate format: IP address or hostname\n const ipv4Pattern = /^(\\d{1,3}\\.){3}\\d{1,3}$/;\n const hostnamePattern =\n /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n\n if (!ipv4Pattern.test(trimmed) && !hostnamePattern.test(trimmed)) {\n throw new Error(\"Invalid host format. Must be a valid IP address or hostname\");\n }\n\n // Additional validation for IPv4 address ranges\n if (ipv4Pattern.test(trimmed)) {\n const parts = trimmed.split(\".\").map(Number);\n if (parts.some((part) => part < 0 || part > 255)) {\n throw new Error(\"Invalid IPv4 address. Octets must be between 0 and 255\");\n }\n }\n\n return trimmed;\n }\n\n /**\n * Sanitize and validate access code input\n */\n private sanitizeAccessCode(accessCode: string): string {\n if (!accessCode?.length) {\n throw new Error(\"Access code must be a non-empty string\");\n }\n\n // Trim whitespace\n const trimmed = accessCode.trim();\n\n if (trimmed.length === 0) {\n throw new Error(\"Access code cannot be empty\");\n }\n\n // Bambu Lab access codes are typically 8 characters\n if (trimmed.length < 4 || trimmed.length > 32) {\n throw new Error(\"Access code must be between 4 and 32 characters\");\n }\n\n // Ensure only alphanumeric characters (no special characters that could cause injection)\n const alphanumericPattern = /^[a-zA-Z0-9]+$/;\n if (!alphanumericPattern.test(trimmed)) {\n throw new Error(\"Access code must contain only alphanumeric characters\");\n }\n\n return trimmed;\n }\n}\n"],"mappings":"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"}
|