@fdm-monster/server 1.9.4 → 2.0.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 +8 -7
- package/.yarn/install-state.gz +0 -0
- package/CONTRIBUTING.md +5 -5
- package/README.md +9 -8
- package/RELEASE_NOTES.MD +52 -0
- package/SECURITY.md +1 -1
- package/biome.json +8 -5
- package/dist/consoles/download-github-releases.js +3 -3
- package/dist/consoles/launch-http-servers.js +4 -4
- package/dist/consoles/launch-http-servers.js.map +1 -1
- package/dist/consoles/mock-bambu.server.js +50 -30
- package/dist/consoles/mock-bambu.server.js.map +1 -1
- package/dist/consoles/mock-camera/default-image.js +13 -0
- package/dist/consoles/mock-camera/default-image.js.map +1 -0
- package/dist/consoles/mock-camera/mock-camera.server.js +160 -0
- package/dist/consoles/mock-camera/mock-camera.server.js.map +1 -0
- package/dist/consoles/mock-octoprint.server.js +281 -73
- package/dist/consoles/mock-octoprint.server.js.map +1 -1
- package/dist/consoles/mock-prusalink.server.js +17 -17
- package/dist/consoles/mock-prusalink.server.js.map +1 -1
- package/dist/consoles/typeorm-create.js +135 -0
- package/dist/consoles/typeorm-create.js.map +1 -0
- package/dist/consoles/typeorm-generate.js +8 -8
- package/dist/consoles/typeorm-generate.js.map +1 -1
- package/dist/consoles/utils/api-messages.js.map +1 -1
- package/dist/constants/authorization.constants.js +25 -31
- package/dist/constants/authorization.constants.js.map +1 -1
- package/dist/constants/event.constants.js.map +1 -1
- package/dist/constants/server-settings.constants.js +3 -19
- package/dist/constants/server-settings.constants.js.map +1 -1
- package/dist/container.js +43 -59
- package/dist/container.js.map +1 -1
- package/dist/container.tokens.js +9 -6
- package/dist/container.tokens.js.map +1 -1
- package/dist/controllers/auth.controller.js +1 -1
- package/dist/controllers/auth.controller.js.map +1 -1
- package/dist/controllers/batch-call.controller.js +7 -25
- package/dist/controllers/batch-call.controller.js.map +1 -1
- package/dist/controllers/file-storage.controller.js +248 -0
- package/dist/controllers/file-storage.controller.js.map +1 -0
- package/dist/controllers/first-time-setup.controller.js +6 -5
- package/dist/controllers/first-time-setup.controller.js.map +1 -1
- package/dist/controllers/floor.controller.js +12 -12
- package/dist/controllers/floor.controller.js.map +1 -1
- package/dist/controllers/metrics.controller.js.map +1 -1
- package/dist/controllers/print-job.controller.js +666 -0
- package/dist/controllers/print-job.controller.js.map +1 -0
- package/dist/controllers/print-queue.controller.js +375 -0
- package/dist/controllers/print-queue.controller.js.map +1 -0
- package/dist/controllers/printer-files.controller.js +88 -59
- package/dist/controllers/printer-files.controller.js.map +1 -1
- package/dist/controllers/printer-settings.controller.js +0 -21
- package/dist/controllers/printer-settings.controller.js.map +1 -1
- package/dist/controllers/{printer-group.controller.js → printer-tag.controller.js} +51 -34
- package/dist/controllers/printer-tag.controller.js.map +1 -0
- package/dist/controllers/printer.controller.js +21 -7
- package/dist/controllers/printer.controller.js.map +1 -1
- package/dist/controllers/server-private.controller.js +2 -1
- package/dist/controllers/server-private.controller.js.map +1 -1
- package/dist/controllers/server-public.controller.js +11 -15
- package/dist/controllers/server-public.controller.js.map +1 -1
- package/dist/controllers/settings.controller.js +0 -68
- package/dist/controllers/settings.controller.js.map +1 -1
- package/dist/controllers/slicer-compat.controller.js +216 -0
- package/dist/controllers/slicer-compat.controller.js.map +1 -0
- package/dist/controllers/user.controller.js +8 -12
- package/dist/controllers/user.controller.js.map +1 -1
- package/dist/controllers/validation/batch-controller.validation.js +13 -13
- package/dist/controllers/validation/batch-controller.validation.js.map +1 -1
- package/dist/controllers/validation/generic.validation.js +4 -8
- package/dist/controllers/validation/generic.validation.js.map +1 -1
- package/dist/controllers/validation/printer-files-controller.validation.js +2 -2
- package/dist/controllers/validation/user-controller.validation.js +14 -9
- package/dist/controllers/validation/user-controller.validation.js.map +1 -1
- package/dist/data-source.js +25 -12
- package/dist/data-source.js.map +1 -1
- package/dist/entities/camera-stream.entity.js +2 -1
- package/dist/entities/camera-stream.entity.js.map +1 -1
- package/dist/entities/floor.entity.js +3 -5
- package/dist/entities/floor.entity.js.map +1 -1
- package/dist/entities/index.js +15 -11
- package/dist/entities/index.js.map +1 -1
- package/dist/entities/print-job.entity.js +195 -0
- package/dist/entities/print-job.entity.js.map +1 -0
- package/dist/entities/{printer-group.entity.js → printer-tag.entity.js} +17 -17
- package/dist/entities/printer-tag.entity.js.map +1 -0
- package/dist/entities/printer.entity.js +4 -10
- package/dist/entities/printer.entity.js.map +1 -1
- package/dist/entities/settings.entity.js +3 -12
- package/dist/entities/settings.entity.js.map +1 -1
- package/dist/entities/{group.entity.js → tag.entity.js} +15 -8
- package/dist/entities/tag.entity.js.map +1 -0
- package/dist/handlers/logging/file-logging.transport.js.map +1 -1
- package/dist/handlers/logging/static.logger.js.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/middleware/authenticate.js +4 -4
- package/dist/middleware/authenticate.js.map +1 -1
- package/dist/middleware/database.js +1 -1
- package/dist/middleware/exception.filter.js +114 -90
- package/dist/middleware/exception.filter.js.map +1 -1
- package/dist/middleware/global.middleware.js +10 -18
- package/dist/middleware/global.middleware.js.map +1 -1
- package/dist/middleware/param-converter.middleware.js +5 -13
- package/dist/middleware/param-converter.middleware.js.map +1 -1
- package/dist/middleware/passport.js +2 -2
- package/dist/middleware/passport.js.map +1 -1
- package/dist/middleware/printer-resolver.js.map +1 -1
- package/dist/middleware/printer.js +3 -2
- package/dist/middleware/printer.js.map +1 -1
- package/dist/middleware/socketio.middleware.js.map +1 -1
- package/dist/migrations/1745141688926-AddPrinterUsernamePassword.js +1 -1
- package/dist/migrations/1745141688926-AddPrinterUsernamePassword.js.map +1 -1
- package/dist/migrations/1766576698569-DropPermissions.js +28 -0
- package/dist/migrations/1766576698569-DropPermissions.js.map +1 -0
- package/dist/migrations/1767278216516-ChangeCameraPrinterOnDeleteSetNull.js +186 -0
- package/dist/migrations/1767278216516-ChangeCameraPrinterOnDeleteSetNull.js.map +1 -0
- package/dist/migrations/1767279607392-DropCustomGcode.js +31 -0
- package/dist/migrations/1767279607392-DropCustomGcode.js.map +1 -0
- package/dist/migrations/1767291804417-DropPrintCompletions.js +37 -0
- package/dist/migrations/1767291804417-DropPrintCompletions.js.map +1 -0
- package/dist/migrations/1767352862576-DropSettingsFileClean.js +88 -0
- package/dist/migrations/1767352862576-DropSettingsFileClean.js.map +1 -0
- package/dist/migrations/1767355639023-ChangeFloorLevelToOrder.js +107 -0
- package/dist/migrations/1767355639023-ChangeFloorLevelToOrder.js.map +1 -0
- package/dist/migrations/1767370191762-ChangeFloorNonUniqueOrder.js +62 -0
- package/dist/migrations/1767370191762-ChangeFloorNonUniqueOrder.js.map +1 -0
- package/dist/migrations/1767432108916-RenameGroupToTag.js +86 -0
- package/dist/migrations/1767432108916-RenameGroupToTag.js.map +1 -0
- package/dist/migrations/1767451444137-AddPrintJob.js +207 -0
- package/dist/migrations/1767451444137-AddPrintJob.js.map +1 -0
- package/dist/server.constants.js +9 -17
- package/dist/server.constants.js.map +1 -1
- package/dist/server.core.js +3 -7
- package/dist/server.core.js.map +1 -1
- package/dist/server.env.js +4 -49
- package/dist/server.env.js.map +1 -1
- package/dist/server.host.js +26 -44
- package/dist/server.host.js.map +1 -1
- package/dist/services/authentication/auth.service.js.map +1 -1
- package/dist/services/authentication/jwt.service.js.map +1 -1
- package/dist/services/bambu/bambu-ftp.adapter.js +3 -3
- package/dist/services/bambu/bambu-ftp.adapter.js.map +1 -1
- package/dist/services/bambu/bambu-mqtt.adapter.js +74 -77
- package/dist/services/bambu/bambu-mqtt.adapter.js.map +1 -1
- package/dist/services/bambu/bambu.client.js.map +1 -1
- package/dist/services/bambu.api.js +11 -0
- package/dist/services/bambu.api.js.map +1 -1
- package/dist/services/core/batch-call.service.js +0 -25
- package/dist/services/core/batch-call.service.js.map +1 -1
- package/dist/services/core/multer.service.js +5 -9
- package/dist/services/core/multer.service.js.map +1 -1
- package/dist/services/core/yaml.service.js +219 -187
- package/dist/services/core/yaml.service.js.map +1 -1
- package/dist/services/file-analysis.service.js +146 -0
- package/dist/services/file-analysis.service.js.map +1 -0
- package/dist/services/file-storage.service.js +386 -0
- package/dist/services/file-storage.service.js.map +1 -0
- package/dist/services/interfaces/camera-stream.dto.js +2 -2
- package/dist/services/interfaces/camera-stream.dto.js.map +1 -1
- package/dist/services/interfaces/floor.dto.js +3 -3
- package/dist/services/interfaces/floor.dto.js.map +1 -1
- package/dist/services/interfaces/{printer-group.dto.js → printer-tag.dto.js} +9 -8
- package/dist/services/interfaces/printer-tag.dto.js.map +1 -0
- package/dist/services/interfaces/{print-completion.interface.js → printer-tag.service.interface.js} +1 -1
- package/dist/services/interfaces/{printer-group.service.interface.js.map → printer-tag.service.interface.js.map} +1 -1
- package/dist/services/interfaces/printer.dto.js +2 -2
- package/dist/services/interfaces/printer.dto.js.map +1 -1
- package/dist/services/interfaces/refresh-token.dto.js.map +1 -1
- package/dist/services/interfaces/role.dto.js.map +1 -1
- package/dist/services/interfaces/settings.dto.js +0 -1
- package/dist/services/interfaces/settings.dto.js.map +1 -1
- package/dist/services/interfaces/{group.dto.js → tag.dto.js} +1 -1
- package/dist/services/interfaces/tag.dto.js.map +1 -0
- package/dist/services/interfaces/user.dto.js.map +1 -1
- package/dist/services/moonraker/constants/moonraker-event.dto.js.map +1 -1
- package/dist/services/moonraker/moonraker-websocket.adapter.js.map +1 -1
- package/dist/services/moonraker/moonraker.client.js.map +1 -1
- package/dist/services/moonraker.api.js +3 -0
- package/dist/services/moonraker.api.js.map +1 -1
- package/dist/services/octoprint/dto/files/gcode-analysis.dto.js.map +1 -0
- package/dist/services/octoprint/dto/octoprint-event.dto.js.map +1 -1
- package/dist/services/octoprint/octoprint-api.routes.js +0 -7
- package/dist/services/octoprint/octoprint-api.routes.js.map +1 -1
- package/dist/services/octoprint/octoprint-websocket.adapter.js.map +1 -1
- package/dist/services/octoprint/octoprint.client.js +0 -4
- package/dist/services/octoprint/octoprint.client.js.map +1 -1
- package/dist/services/octoprint.api.js +3 -0
- package/dist/services/octoprint.api.js.map +1 -1
- package/dist/services/orm/base.service.js.map +1 -1
- package/dist/services/orm/camera-stream.service.js.map +1 -1
- package/dist/services/orm/floor-position.service.js.map +1 -1
- package/dist/services/orm/floor.service.js +12 -19
- package/dist/services/orm/floor.service.js.map +1 -1
- package/dist/services/orm/permission.service.js +3 -54
- package/dist/services/orm/permission.service.js.map +1 -1
- package/dist/services/orm/print-job.service.js +539 -0
- package/dist/services/orm/print-job.service.js.map +1 -0
- package/dist/services/orm/printer-tag.service.js +120 -0
- package/dist/services/orm/printer-tag.service.js.map +1 -0
- package/dist/services/orm/printer.service.js.map +1 -1
- package/dist/services/orm/refresh-token.service.js.map +1 -1
- package/dist/services/orm/role.service.js +25 -39
- package/dist/services/orm/role.service.js.map +1 -1
- package/dist/services/orm/settings.service.js +4 -15
- package/dist/services/orm/settings.service.js.map +1 -1
- package/dist/services/orm/user.service.js +17 -13
- package/dist/services/orm/user.service.js.map +1 -1
- package/dist/services/print-file-downloader.service.js +169 -0
- package/dist/services/print-file-downloader.service.js.map +1 -0
- package/dist/services/print-queue.service.js +268 -0
- package/dist/services/print-queue.service.js.map +1 -0
- package/dist/services/printer-api.factory.js +1 -1
- package/dist/services/printer-api.factory.js.map +1 -1
- package/dist/services/printer-api.interface.js.map +1 -1
- package/dist/services/prusa-link/constants/prusalink-event.dto.js.map +1 -1
- package/dist/services/prusa-link/prusa-link-http-polling.adapter.js +1 -3
- package/dist/services/prusa-link/prusa-link-http-polling.adapter.js.map +1 -1
- package/dist/services/prusa-link/prusa-link.api.js +4 -1
- package/dist/services/prusa-link/prusa-link.api.js.map +1 -1
- package/dist/services/prusa-link/utils/prusa-link-http-client.builder.js.map +1 -1
- package/dist/services/validators/floor-service.validation.js +25 -31
- package/dist/services/validators/floor-service.validation.js.map +1 -1
- package/dist/services/validators/print-job.validation.js +31 -0
- package/dist/services/validators/print-job.validation.js.map +1 -0
- package/dist/services/validators/settings-service.validation.js +0 -22
- package/dist/services/validators/settings-service.validation.js.map +1 -1
- package/dist/services/validators/user-service.validation.js +15 -10
- package/dist/services/validators/user-service.validation.js.map +1 -1
- package/dist/services/validators/yaml-service.validation.js +8 -14
- package/dist/services/validators/yaml-service.validation.js.map +1 -1
- package/dist/shared/load-controllers.js +2 -1
- package/dist/shared/load-controllers.js.map +1 -1
- package/dist/shared/runtime-settings.migration.js +1 -11
- package/dist/shared/runtime-settings.migration.js.map +1 -1
- package/dist/shared/websocket-rpc-extended.adapter.js +13 -4
- package/dist/shared/websocket-rpc-extended.adapter.js.map +1 -1
- package/dist/shared/websocket.adapter.js.map +1 -1
- package/dist/state/file-upload-tracker.cache.js.map +1 -1
- package/dist/state/file.cache.js +6 -6
- package/dist/state/file.cache.js.map +1 -1
- package/dist/state/floor.store.js +3 -10
- package/dist/state/floor.store.js.map +1 -1
- package/dist/state/printer-events.cache.js +180 -20
- package/dist/state/printer-events.cache.js.map +1 -1
- package/dist/state/printer-files.store.js.map +1 -1
- package/dist/state/printer-socket.store.js +25 -20
- package/dist/state/printer-socket.store.js.map +1 -1
- package/dist/state/printer-thumbnail.cache.js +98 -188
- package/dist/state/printer-thumbnail.cache.js.map +1 -1
- package/dist/state/printer.cache.js +3 -13
- package/dist/state/printer.cache.js.map +1 -1
- package/dist/state/settings.store.js +4 -42
- package/dist/state/settings.store.js.map +1 -1
- package/dist/state/socket-io.gateway.js +1 -1
- package/dist/state/socket-io.gateway.js.map +1 -1
- package/dist/state/test-printer-socket.store.js +6 -3
- package/dist/state/test-printer-socket.store.js.map +1 -1
- package/dist/tasks/boot.task.js +11 -91
- package/dist/tasks/boot.task.js.map +1 -1
- package/dist/tasks/print-job-analysis.task.js +116 -0
- package/dist/tasks/print-job-analysis.task.js.map +1 -0
- package/dist/tasks/printer-files-load.task.js +29 -0
- package/dist/tasks/printer-files-load.task.js.map +1 -0
- package/dist/tasks/socketio.task.js +1 -1
- package/dist/tasks/socketio.task.js.map +1 -1
- package/dist/tasks.js +3 -2
- package/dist/tasks.js.map +1 -1
- package/dist/utils/cache/key-diff.cache.js +20 -61
- package/dist/utils/cache/key-diff.cache.js.map +1 -1
- package/dist/utils/parsers/3mf.parser.js +337 -0
- package/dist/utils/parsers/3mf.parser.js.map +1 -0
- package/dist/utils/parsers/bgcode.parser.js +223 -0
- package/dist/utils/parsers/bgcode.parser.js.map +1 -0
- package/dist/utils/parsers/gcode.parser.js +254 -0
- package/dist/utils/parsers/gcode.parser.js.map +1 -0
- package/dist/utils/swagger/decorators.js +39 -0
- package/dist/utils/swagger/decorators.js.map +1 -0
- package/dist/utils/swagger/generator.js +196 -0
- package/dist/utils/swagger/generator.js.map +1 -0
- package/dist/utils/swagger/swagger.js +93 -0
- package/dist/utils/swagger/swagger.js.map +1 -0
- package/package.json +24 -30
- package/dist/controllers/custom-gcode.controller.js +0 -150
- package/dist/controllers/custom-gcode.controller.js.map +0 -1
- package/dist/controllers/print-completion.controller.js +0 -118
- package/dist/controllers/print-completion.controller.js.map +0 -1
- package/dist/controllers/printer-group.controller.js.map +0 -1
- package/dist/entities/custom-gcode.entity.js +0 -49
- package/dist/entities/custom-gcode.entity.js.map +0 -1
- package/dist/entities/group.entity.js.map +0 -1
- package/dist/entities/permission.entity.js +0 -37
- package/dist/entities/permission.entity.js.map +0 -1
- package/dist/entities/print-completion.entity.js +0 -90
- package/dist/entities/print-completion.entity.js.map +0 -1
- package/dist/entities/printer-group.entity.js.map +0 -1
- package/dist/models/Auth/Permission.js +0 -20
- package/dist/models/Auth/Permission.js.map +0 -1
- package/dist/models/Auth/RefreshToken.js +0 -41
- package/dist/models/Auth/RefreshToken.js.map +0 -1
- package/dist/models/Auth/Role.js +0 -20
- package/dist/models/Auth/Role.js.map +0 -1
- package/dist/models/Auth/User.js +0 -49
- package/dist/models/Auth/User.js.map +0 -1
- package/dist/models/CameraStream.js +0 -49
- package/dist/models/CameraStream.js.map +0 -1
- package/dist/models/CustomGcode.js +0 -28
- package/dist/models/CustomGcode.js.map +0 -1
- package/dist/models/Floor.js +0 -33
- package/dist/models/Floor.js.map +0 -1
- package/dist/models/FloorPrinter.js +0 -38
- package/dist/models/FloorPrinter.js.map +0 -1
- package/dist/models/PrintCompletion.js +0 -40
- package/dist/models/PrintCompletion.js.map +0 -1
- package/dist/models/Printer.js +0 -78
- package/dist/models/Printer.js.map +0 -1
- package/dist/models/Settings.js +0 -150
- package/dist/models/Settings.js.map +0 -1
- package/dist/models/index.js +0 -54
- package/dist/models/index.js.map +0 -1
- package/dist/mongo-migrations/20210713120034-printers-settingsapperance-apikey.js +0 -45
- package/dist/mongo-migrations/20210713120034-printers-settingsapperance-apikey.js.map +0 -1
- package/dist/mongo-migrations/20210907173950-printers-enabled.js +0 -35
- package/dist/mongo-migrations/20210907173950-printers-enabled.js.map +0 -1
- package/dist/mongo-migrations/20211029110742-user-password-passwordhash.js +0 -35
- package/dist/mongo-migrations/20211029110742-user-password-passwordhash.js.map +0 -1
- package/dist/mongo-migrations/20230414141005-floor-remove-groupinfloor.js +0 -60
- package/dist/mongo-migrations/20230414141005-floor-remove-groupinfloor.js.map +0 -1
- package/dist/mongo-migrations/20230427202911-printer-remove-sortindex.js +0 -30
- package/dist/mongo-migrations/20230427202911-printer-remove-sortindex.js.map +0 -1
- package/dist/mongo-migrations/20230716065316-user-remove-name.js +0 -30
- package/dist/mongo-migrations/20230716065316-user-remove-name.js.map +0 -1
- package/dist/mongo-migrations/20231111081809-printer-flatten-name.js +0 -35
- package/dist/mongo-migrations/20231111081809-printer-flatten-name.js.map +0 -1
- package/dist/mongo-migrations/20231111082521-printer-remove-settingsappearance.js +0 -41
- package/dist/mongo-migrations/20231111082521-printer-remove-settingsappearance.js.map +0 -1
- package/dist/mongo-migrations/20231202183902-printer-files-simpler.js +0 -41
- package/dist/mongo-migrations/20231202183902-printer-files-simpler.js.map +0 -1
- package/dist/services/interfaces/custom-gcode.dto.js +0 -18
- package/dist/services/interfaces/custom-gcode.dto.js.map +0 -1
- package/dist/services/interfaces/custom-gcode.service.interface.js +0 -6
- package/dist/services/interfaces/custom-gcode.service.interface.js.map +0 -1
- package/dist/services/interfaces/gcode-analysis.dto.js.map +0 -1
- package/dist/services/interfaces/group.dto.js.map +0 -1
- package/dist/services/interfaces/permission.dto.js +0 -16
- package/dist/services/interfaces/permission.dto.js.map +0 -1
- package/dist/services/interfaces/print-completion-context.dto.js +0 -6
- package/dist/services/interfaces/print-completion-context.dto.js.map +0 -1
- package/dist/services/interfaces/print-completion.dto.js +0 -38
- package/dist/services/interfaces/print-completion.dto.js.map +0 -1
- package/dist/services/interfaces/print-completion.interface.js.map +0 -1
- package/dist/services/interfaces/printer-group.dto.js.map +0 -1
- package/dist/services/interfaces/printer-group.service.interface.js +0 -6
- package/dist/services/mongoose/camera-stream.service.js +0 -67
- package/dist/services/mongoose/camera-stream.service.js.map +0 -1
- package/dist/services/mongoose/custom-gcode.service.js +0 -50
- package/dist/services/mongoose/custom-gcode.service.js.map +0 -1
- package/dist/services/mongoose/floor.service.js +0 -139
- package/dist/services/mongoose/floor.service.js.map +0 -1
- package/dist/services/mongoose/permission.service.js +0 -73
- package/dist/services/mongoose/permission.service.js.map +0 -1
- package/dist/services/mongoose/print-completion.service.js +0 -134
- package/dist/services/mongoose/print-completion.service.js.map +0 -1
- package/dist/services/mongoose/print-completion.shared.js +0 -59
- package/dist/services/mongoose/print-completion.shared.js.map +0 -1
- package/dist/services/mongoose/printer.service.js +0 -216
- package/dist/services/mongoose/printer.service.js.map +0 -1
- package/dist/services/mongoose/refresh-token.service.js +0 -104
- package/dist/services/mongoose/refresh-token.service.js.map +0 -1
- package/dist/services/mongoose/role.service.js +0 -132
- package/dist/services/mongoose/role.service.js.map +0 -1
- package/dist/services/mongoose/settings.service.js +0 -124
- package/dist/services/mongoose/settings.service.js.map +0 -1
- package/dist/services/mongoose/user.service.js +0 -180
- package/dist/services/mongoose/user.service.js.map +0 -1
- package/dist/services/orm/custom-gcode.service.js +0 -42
- package/dist/services/orm/custom-gcode.service.js.map +0 -1
- package/dist/services/orm/print-completion.service.js +0 -87
- package/dist/services/orm/print-completion.service.js.map +0 -1
- package/dist/services/orm/printer-group.service.js +0 -109
- package/dist/services/orm/printer-group.service.js.map +0 -1
- package/dist/services/validators/camera-service.validation.js +0 -19
- package/dist/services/validators/camera-service.validation.js.map +0 -1
- package/dist/services/validators/print-completion-service.validation.js +0 -33
- package/dist/services/validators/print-completion-service.validation.js.map +0 -1
- package/dist/shared.constants.js +0 -15
- package/dist/shared.constants.js.map +0 -1
- package/dist/tasks/print-completion.socketio.task.js +0 -91
- package/dist/tasks/print-completion.socketio.task.js.map +0 -1
- package/dist/tasks/printer-file-clean.task.js +0 -74
- package/dist/tasks/printer-file-clean.task.js.map +0 -1
- package/migrate-mongo-config.js +0 -45
- /package/dist/services/{interfaces → octoprint/dto/files}/gcode-analysis.dto.js +0 -0
package/.env.template
CHANGED
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
SERVER_PORT=4000
|
|
3
3
|
# Optional, default: production, possible values: "development", "production"
|
|
4
4
|
NODE_ENV=development
|
|
5
|
-
# Optional, default: mongodb://127.0.0.1:27017/fdm-monster
|
|
6
|
-
MONGO=mongodb://127.0.0.1:27017/fdm-monster
|
|
7
5
|
ENABLE_COLORED_LOGS=false
|
|
8
6
|
|
|
9
7
|
# Github Personal Access Token, allows downloading the Client bundle without hitting a Github API rate limit
|
|
@@ -26,7 +24,7 @@ OVERRIDE_JWT_EXPIRES_IN=3600
|
|
|
26
24
|
# Optional, changing this will invalidate all existing logins
|
|
27
25
|
OVERRIDE_JWT_ISSUER=fdm-monster-server-2023
|
|
28
26
|
# Optional, changing this will invalidate all existing logins
|
|
29
|
-
OVERRIDE_JWT_AUDIENCE=fdm-monster-client-
|
|
27
|
+
OVERRIDE_JWT_AUDIENCE=fdm-monster-client-next-2026
|
|
30
28
|
|
|
31
29
|
# Demo mode, will set wizard to completed
|
|
32
30
|
OVERRIDE_IS_DEMO_MODE=true
|
|
@@ -37,12 +35,9 @@ OVERRIDE_DEMO_PASSWORD=demo2023
|
|
|
37
35
|
# Optional, default: ADMIN, logical values: "ADMIN", "OPERATOR"
|
|
38
36
|
OVERRIDE_DEMO_ROLE=ADMIN
|
|
39
37
|
|
|
40
|
-
# Debug
|
|
41
|
-
DEBUG_ROUTES=false
|
|
38
|
+
# Debug socket states
|
|
42
39
|
DEBUG_SOCKET_STATES=false
|
|
43
40
|
|
|
44
|
-
# Enables TypeORM
|
|
45
|
-
ENABLE_EXPERIMENTAL_TYPEORM=false
|
|
46
41
|
# Saves SQLite database to ./database/fdm-monster.sqlite
|
|
47
42
|
DATABASE_PATH=./database
|
|
48
43
|
# Optional, default: fdm-monster.sqlite
|
|
@@ -52,3 +47,9 @@ ENABLE_PROMETHEUS=false
|
|
|
52
47
|
ENABLE_LOKI=false
|
|
53
48
|
LOKI_ADDRESS=
|
|
54
49
|
ENABLE_PROMETHEUS_METRICS=false
|
|
50
|
+
|
|
51
|
+
# Swagger/OpenAPI Documentation
|
|
52
|
+
# Optional, default: false. Set to true to disable Swagger UI and OpenAPI documentation endpoints
|
|
53
|
+
DISABLE_SWAGGER_OPENAPI=false
|
|
54
|
+
# Optional, default: false. Set to true to generate swagger.json file in media folder
|
|
55
|
+
GENERATE_SWAGGER_JSON=false
|
package/.yarn/install-state.gz
CHANGED
|
Binary file
|
package/CONTRIBUTING.md
CHANGED
|
@@ -35,7 +35,7 @@ Sorry we do not have a documentation with F.A.Q. yet. Please visit us on discord
|
|
|
35
35
|
FDM Monster currently consists of two active repositories:
|
|
36
36
|
|
|
37
37
|
- [FDM Monster](https://github.com/fdm-monster/fdm-monster) - the server
|
|
38
|
-
- [FDM Monster Client](https://github.com/fdm-monster/fdm-monster-client) - the client UI
|
|
38
|
+
- [FDM Monster Client](https://github.com/fdm-monster/fdm-monster-client-next) - the client UI
|
|
39
39
|
- [FDM Connector](https://github.com/fdm-monster/fdm-connector) - the OctoPrint plugin (not in use yet)
|
|
40
40
|
|
|
41
41
|
### Design decisions
|
|
@@ -43,7 +43,7 @@ FDM Monster currently consists of two active repositories:
|
|
|
43
43
|
Server design
|
|
44
44
|
|
|
45
45
|
- **FDM Monster server** was chosen to be a Node.js server. The backend is currently structured as a REST API. It might be surprising that we use `awilix` as Inversion-of-Control implementation, but if you study the resulting architecture it will show its fresh and quick-to-develop benefits rapidly.
|
|
46
|
-
- **FDM Monster server** runs using
|
|
46
|
+
- **FDM Monster server** runs using Sqlite as database and Typeorm as ORM
|
|
47
47
|
- **FDM Monster server** caches data in-memory using a self-written store/cache system between the database (no redis!)
|
|
48
48
|
- **FDM Monster server** API is built up using `awilix-express` and uses `node-input-validation` as API validation
|
|
49
49
|
- **FDM Monster server** is equipped with a task scheduler (ToadScheduler) which gives the capability to run workloads in the background.
|
|
@@ -94,7 +94,7 @@ Explain the problem and include additional details to help maintainers reproduce
|
|
|
94
94
|
You might be delighted to know that the FDM Monster server was structured consistently for other developers to be able to work with it rapidly.
|
|
95
95
|
|
|
96
96
|
1. Clone the repository from the development branch (git clone https://github.com/fdm-monster/fdm-monster.git)
|
|
97
|
-
2. Ensure
|
|
97
|
+
2. Ensure Node (v24) is installed
|
|
98
98
|
3. Adjust/create a `.env` with NODE_ENV=development **inside the server folder**
|
|
99
99
|
4. `npm install` **inside the server folder** to create the `node_modules` folder
|
|
100
100
|
5. Run the server with `npm run dev` to let nodemon detect and apply any changes you make
|
|
@@ -109,11 +109,11 @@ Please make sure you understand the meaning of these files/folders:
|
|
|
109
109
|
- server.constants.js
|
|
110
110
|
- constants
|
|
111
111
|
- controllers (API)
|
|
112
|
+
- entities (typeorm)
|
|
112
113
|
- exceptions
|
|
113
114
|
- handlers
|
|
114
115
|
- middleware
|
|
115
|
-
-
|
|
116
|
-
- migrations (mongodb/mongoose)
|
|
116
|
+
- migrations (typeorm/sqlite)
|
|
117
117
|
- services // services/octoprint/...
|
|
118
118
|
- state // state/printer.state.js // state/files.store.js // state/data/...
|
|
119
119
|
- tasks // tasks/boot.task.js // printer-websocket.task.js
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<p align="center" style="margin-bottom: 0">
|
|
2
2
|
<a href="https://docs.fdm-monster.net/" target="_blank" rel="noopener noreferrer">
|
|
3
|
-
<img width="150" src="https://github.com/fdm-monster/fdm-monster-client/blob/main/public/img/logo.png?raw=true" alt="FDM Monster">
|
|
3
|
+
<img width="150" src="https://github.com/fdm-monster/fdm-monster-client-next/blob/main/public/img/logo.png?raw=true" alt="FDM Monster">
|
|
4
4
|
</a>
|
|
5
5
|
</p>
|
|
6
6
|
<h1 align="center" style="padding-top: 0; margin-top: 10px">FDM Monster</h1>
|
|
@@ -38,7 +38,7 @@ Here is a list of features that make FDM Monster stand out:
|
|
|
38
38
|
- Import printers from software like OctoFarm
|
|
39
39
|
- YAML backup and import
|
|
40
40
|
- Thumbnail support
|
|
41
|
-
- SQLite
|
|
41
|
+
- SQLite database
|
|
42
42
|
|
|
43
43
|
## Installation methods ⚙️
|
|
44
44
|
|
|
@@ -75,7 +75,7 @@ Thanks to the following parties for their financial support:
|
|
|
75
75
|
|
|
76
76
|
| Tier 1 | Tier 2 | Tier 3 | Tier 4 | One time |
|
|
77
77
|
|--------|--------|--------|--------|-----------|
|
|
78
|
-
| | [thatguymendel](https://github.com/thatguymendel) | | [doucettom](https://github.com/doucettom) | [th3dstudio](https://github.com/th3dstudio) |
|
|
78
|
+
| | [thatguymendel](https://github.com/thatguymendel) | [MrHitchcock](https://github.com/MrHitchcock) | [doucettom](https://github.com/doucettom) | [th3dstudio](https://github.com/th3dstudio) |
|
|
79
79
|
|
|
80
80
|
|
|
81
81
|
## Contributors ✨
|
|
@@ -83,7 +83,7 @@ Thanks to the following parties for their financial support:
|
|
|
83
83
|
These are the people involved in the project. Find the meaning of the emoji keys [here](https://allcontributors.org/docs/en/emoji-key).
|
|
84
84
|
|
|
85
85
|
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
|
86
|
-
[](#contributors-)
|
|
87
87
|
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
|
88
88
|
|
|
89
89
|
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
|
@@ -119,6 +119,7 @@ These are the people involved in the project. Find the meaning of the emoji keys
|
|
|
119
119
|
<td align="center" valign="top" width="10%"><a href="https://github.com/Tbwan"><img src="https://avatars.githubusercontent.com/u/44231748?v=4?s=40" width="40px;" alt="Tbwan"/><br /><sub><b>Tbwan</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3ATbwan" title="Bug reports">🐛</a></td>
|
|
120
120
|
<td align="center" valign="top" width="10%"><a href="https://github.com/nuvious"><img src="https://avatars.githubusercontent.com/u/5287736?v=4?s=40" width="40px;" alt="David Cheeseman"/><br /><sub><b>David Cheeseman</b></sub></a><br /><a href="#ideas-nuvious" title="Ideas, Planning, & Feedback">🤔</a> <a href="#platform-nuvious" title="Packaging/porting to new platform">📦</a> <a href="#infra-nuvious" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
|
121
121
|
<td align="center" valign="top" width="10%"><a href="https://github.com/thatguy-jaysenodell"><img src="https://avatars.githubusercontent.com/u/118288184?v=4?s=40" width="40px;" alt="That Guy Jaysen"/><br /><sub><b>That Guy Jaysen</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Athatguy-jaysenodell" title="Bug reports">🐛</a></td>
|
|
122
|
+
<td align="center" valign="top" width="10%"><a href="http://design.zagethy.com"><img src="https://avatars.githubusercontent.com/u/6075740?v=4?s=40" width="40px;" alt="Zagethy"/><br /><sub><b>Zagethy</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3AZagethy" title="Bug reports">🐛</a></td>
|
|
122
123
|
</tr>
|
|
123
124
|
</tbody>
|
|
124
125
|
</table>
|
|
@@ -147,7 +148,6 @@ the [CONTRIBUTING](CONTRIBUTING.md) file.
|
|
|
147
148
|
### Development Progress
|
|
148
149
|
|
|
149
150
|
- [x] :rocket: Docker amd64 image
|
|
150
|
-
- [x] 🛡️ MongoDB 5 & 6 support
|
|
151
151
|
- [x] :rocket: Quick copy paste of FDM Monster printers
|
|
152
152
|
- [x] 🛡️ Complete API test coverage
|
|
153
153
|
- [x] :rocket: Floor management
|
|
@@ -158,13 +158,14 @@ the [CONTRIBUTING](CONTRIBUTING.md) file.
|
|
|
158
158
|
- [x] 🔌 Raspberry Pi image (https://github.com/fdm-monster/MonsterPi)
|
|
159
159
|
- [x] :rocket: Documentation (https://docs.fdm-monster.net)
|
|
160
160
|
- [x] 🛡️ Login and user management
|
|
161
|
-
- [x] OctoFarm
|
|
161
|
+
- [x] OctoFarm printer import
|
|
162
162
|
- [x] Klipper and Moonraker API integration
|
|
163
163
|
- [x] GCode Thumbnail support
|
|
164
164
|
- [x] `.bgcode` support
|
|
165
165
|
- [x] Modernized UI layout and tile design
|
|
166
|
-
- [
|
|
167
|
-
- [
|
|
166
|
+
- [x] History and statistics
|
|
167
|
+
- [x] Print Queue
|
|
168
|
+
- [x] Extended webcam integration
|
|
168
169
|
- [ ] Spoolman integration
|
|
169
170
|
|
|
170
171
|
## License
|
package/RELEASE_NOTES.MD
CHANGED
|
@@ -1,5 +1,57 @@
|
|
|
1
1
|
# Develop
|
|
2
2
|
|
|
3
|
+
# FDM Monster 2.0.0
|
|
4
|
+
|
|
5
|
+
## Feat
|
|
6
|
+
|
|
7
|
+
- All UI features in https://github.com/fdm-monster/fdm-monster-client-next/blob/main/RELEASE_NOTES.MD
|
|
8
|
+
- Add mock camera console to project (for development)
|
|
9
|
+
- Add swagger and OpenAPI integration
|
|
10
|
+
- UI Client is now fdm-monster-client-next at v2.0.0
|
|
11
|
+
- Add color option to tag
|
|
12
|
+
- Add API to upload from slicer
|
|
13
|
+
- Change API to /api/v2
|
|
14
|
+
- Queue
|
|
15
|
+
- PrintJob
|
|
16
|
+
- File Analysis
|
|
17
|
+
|
|
18
|
+
## Fixes
|
|
19
|
+
|
|
20
|
+
- Renames PrinterFloors permission group to Floors
|
|
21
|
+
- Load printer files in background instead of synchronously
|
|
22
|
+
- BambuLab connection rejections cannot cause server crashes anymore
|
|
23
|
+
- Default grid size is now 4 by 2 (which is less overwhelming)
|
|
24
|
+
- Floor service wouldn't update printer position, comparison was x==x, y==x
|
|
25
|
+
- ExceptionFilter now logs using loggerFactory
|
|
26
|
+
- YAML import service was brittle against printer type failures, added robustness
|
|
27
|
+
- Camera should tolerate printer deletion: SET NULL applied to Foreign Key
|
|
28
|
+
- Quick stop API endpoint moved to printer controller, removing the need for custom gcode api controller.
|
|
29
|
+
- Drop printer file clean task, outdated concept
|
|
30
|
+
- File uploads now go to media/file-uploads instead of media
|
|
31
|
+
- First-time-setup api filter now allows swagger endpoints
|
|
32
|
+
- Floor order change not properly implemented in API service
|
|
33
|
+
- Remove experimental thumbnail support
|
|
34
|
+
|
|
35
|
+
## Chore
|
|
36
|
+
- Remove batch/single set gcode analysis to false
|
|
37
|
+
- Removed client next experimental setting
|
|
38
|
+
- Drop unused Custom Gcode table
|
|
39
|
+
- Drop broken PrintCompletion table
|
|
40
|
+
- Rename PrinterGroup to PrinterTag, and Group to Tag
|
|
41
|
+
|
|
42
|
+
# FDM Monster 2.0.0-rc1
|
|
43
|
+
|
|
44
|
+
## Features
|
|
45
|
+
|
|
46
|
+
- Remove mongodb support (breaking change)
|
|
47
|
+
- Reimplement role system based on RoleName (not id and name)
|
|
48
|
+
- Cleanup and remove unused permission table
|
|
49
|
+
- Key-diff cache is now Map instead of Object
|
|
50
|
+
|
|
51
|
+
## Fixes
|
|
52
|
+
|
|
53
|
+
- Update printer now replaces old socket with new one
|
|
54
|
+
|
|
3
55
|
# FDM Monster 1.9.4
|
|
4
56
|
|
|
5
57
|
## Fixes
|
package/SECURITY.md
CHANGED
package/biome.json
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$schema": "https://biomejs.dev/schemas/
|
|
2
|
+
"$schema": "https://biomejs.dev/schemas/2.3.10/schema.json",
|
|
3
3
|
"vcs": {
|
|
4
4
|
"enabled": false,
|
|
5
5
|
"clientKind": "git",
|
|
6
6
|
"useIgnoreFile": false
|
|
7
7
|
},
|
|
8
8
|
"files": {
|
|
9
|
-
"ignoreUnknown": false
|
|
10
|
-
"ignore": []
|
|
9
|
+
"ignoreUnknown": false
|
|
11
10
|
},
|
|
12
11
|
"formatter": {
|
|
13
12
|
"enabled": true,
|
|
@@ -15,8 +14,12 @@
|
|
|
15
14
|
"indentWidth": 2,
|
|
16
15
|
"lineWidth": 120
|
|
17
16
|
},
|
|
18
|
-
"
|
|
19
|
-
"
|
|
17
|
+
"assist": {
|
|
18
|
+
"actions": {
|
|
19
|
+
"source": {
|
|
20
|
+
"organizeImports": "on"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
20
23
|
},
|
|
21
24
|
"linter": {
|
|
22
25
|
"enabled": true,
|
|
@@ -12,7 +12,7 @@ function _interop_require_default(obj) {
|
|
|
12
12
|
}
|
|
13
13
|
const fetchReleases = async ()=>{
|
|
14
14
|
try {
|
|
15
|
-
const response = await _axios.default.get("https://api.github.com/repos/fdm-monster/fdm-monster-client/releases");
|
|
15
|
+
const response = await _axios.default.get("https://api.github.com/repos/fdm-monster/fdm-monster-client-next/releases");
|
|
16
16
|
const releases = response.data;
|
|
17
17
|
const releaseData = releases.map((release)=>({
|
|
18
18
|
tag_name: release.tag_name,
|
|
@@ -29,7 +29,7 @@ const fetchReleases = async ()=>{
|
|
|
29
29
|
};
|
|
30
30
|
const fetchLatest = async ()=>{
|
|
31
31
|
try {
|
|
32
|
-
const response = await _axios.default.get("https://api.github.com/repos/fdm-monster/fdm-monster-client/releases/latest");
|
|
32
|
+
const response = await _axios.default.get("https://api.github.com/repos/fdm-monster/fdm-monster-client-next/releases/latest");
|
|
33
33
|
const release = response.data;
|
|
34
34
|
const releaseData = {
|
|
35
35
|
tag_name: release.tag_name,
|
|
@@ -37,7 +37,7 @@ const fetchLatest = async ()=>{
|
|
|
37
37
|
published_at: release.published_at,
|
|
38
38
|
body: release.body
|
|
39
39
|
};
|
|
40
|
-
const outputPath = _path.default.join(__dirname, "github-releases-latest-client-slim
|
|
40
|
+
const outputPath = _path.default.join(__dirname, "github-releases-latest-client-slim.data.json");
|
|
41
41
|
_fs.default.writeFileSync(outputPath, JSON.stringify(releaseData, null, 2));
|
|
42
42
|
console.log(`Releases data written to ${outputPath}`);
|
|
43
43
|
} catch (error) {
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
-
const
|
|
6
|
-
const
|
|
5
|
+
const _nodechild_process = require("node:child_process");
|
|
6
|
+
const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
|
|
7
7
|
function _interop_require_default(obj) {
|
|
8
8
|
return obj && obj.__esModule ? obj : {
|
|
9
9
|
default: obj
|
|
@@ -14,8 +14,8 @@ const instanceCount = 10;
|
|
|
14
14
|
console.log(`Starting ${instanceCount} fake OctoPrint servers...`);
|
|
15
15
|
for(let i = 0; i < instanceCount; i++){
|
|
16
16
|
const port = startPort + i;
|
|
17
|
-
const process = (0,
|
|
18
|
-
|
|
17
|
+
const process = (0, _nodechild_process.spawn)("node", [
|
|
18
|
+
_nodepath.default.join(__dirname, "./mock-octoprint.server.js"),
|
|
19
19
|
port.toString()
|
|
20
20
|
]);
|
|
21
21
|
process.stdout.on("data", (data)=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/consoles/launch-http-servers.ts"],"names":["startPort","instanceCount","console","log","i","port","process","spawn","path","join","__dirname","toString","stdout","on","data","trim","stderr","error"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/consoles/launch-http-servers.ts"],"names":["startPort","instanceCount","console","log","i","port","process","spawn","path","join","__dirname","toString","stdout","on","data","trim","stderr","error"],"mappings":";;;;mCAAsB;iEACL;;;;;;AAEjB,MAAMA,YAAY;AAClB,MAAMC,gBAAgB;AAEtBC,QAAQC,GAAG,CAAC,CAAC,SAAS,EAAEF,cAAc,0BAA0B,CAAC;AAEjE,IAAK,IAAIG,IAAI,GAAGA,IAAIH,eAAeG,IAAK;IACtC,MAAMC,OAAOL,YAAYI;IACzB,MAAME,UAAUC,IAAAA,wBAAK,EAAC,QAAQ;QAACC,iBAAI,CAACC,IAAI,CAACC,WAAW;QAA+BL,KAAKM,QAAQ;KAAG;IAEnGL,QAAQM,MAAM,CAACC,EAAE,CAAC,QAAQ,CAACC;QACzBZ,QAAQC,GAAG,CAAC,CAAC,QAAQ,EAAEC,IAAI,EAAE,QAAQ,EAAEC,KAAK,GAAG,EAAES,KAAKH,QAAQ,GAAGI,IAAI,IAAI;IAC3E;IAEAT,QAAQU,MAAM,CAACH,EAAE,CAAC,QAAQ,CAACC;QACzBZ,QAAQe,KAAK,CAAC,CAAC,QAAQ,EAAEb,IAAI,EAAE,QAAQ,EAAEC,KAAK,SAAS,EAAES,KAAKH,QAAQ,GAAGI,IAAI,IAAI;IACnF;IAEAb,QAAQC,GAAG,CAAC,CAAC,eAAe,EAAEC,IAAI,EAAE,SAAS,EAAEC,MAAM;AACvD;AAEAH,QAAQC,GAAG,CAAC"}
|
|
@@ -18,7 +18,7 @@ const DEFAULT_MQTT_PORT = 8883;
|
|
|
18
18
|
const DEFAULT_SERIAL = "01P00A000000001";
|
|
19
19
|
const DEFAULT_ACCESS_CODE = "12345678";
|
|
20
20
|
const MESSAGE_INTERVAL = 1000;
|
|
21
|
-
const DEFAULT_USERNAME =
|
|
21
|
+
const DEFAULT_USERNAME = "bblp";
|
|
22
22
|
const port = process.argv[2] ? Number.parseInt(process.argv[2]) : DEFAULT_PORT;
|
|
23
23
|
const mqttPort = process.argv[3] ? Number.parseInt(process.argv[3]) : DEFAULT_MQTT_PORT;
|
|
24
24
|
const serial = process.argv[4] || DEFAULT_SERIAL;
|
|
@@ -48,21 +48,21 @@ async function generateSelfSignedCert() {
|
|
|
48
48
|
console.log(`[BAMBU MOCK] Generating self-signed certificate for TLS...`);
|
|
49
49
|
const attrs = [
|
|
50
50
|
{
|
|
51
|
-
name:
|
|
52
|
-
value:
|
|
51
|
+
name: "commonName",
|
|
52
|
+
value: "BambuLab Mock Printer"
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
|
-
name:
|
|
56
|
-
value:
|
|
55
|
+
name: "countryName",
|
|
56
|
+
value: "US"
|
|
57
57
|
},
|
|
58
58
|
{
|
|
59
|
-
name:
|
|
60
|
-
value:
|
|
59
|
+
name: "organizationName",
|
|
60
|
+
value: "Bambu Lab Mock"
|
|
61
61
|
}
|
|
62
62
|
];
|
|
63
63
|
const options = {
|
|
64
64
|
days: 365,
|
|
65
|
-
algorithm:
|
|
65
|
+
algorithm: "sha256",
|
|
66
66
|
keySize: 2048
|
|
67
67
|
};
|
|
68
68
|
const pems = await _selfsigned.default.generate(attrs, options);
|
|
@@ -70,12 +70,14 @@ async function generateSelfSignedCert() {
|
|
|
70
70
|
return {
|
|
71
71
|
key: pems.private,
|
|
72
72
|
cert: pems.cert,
|
|
73
|
-
minVersion:
|
|
74
|
-
ciphers:
|
|
73
|
+
minVersion: "TLSv1.2",
|
|
74
|
+
ciphers: "HIGH:!aNULL:!MD5"
|
|
75
75
|
};
|
|
76
76
|
}
|
|
77
77
|
let isPrinting = false;
|
|
78
|
+
let isFinished = false;
|
|
78
79
|
let currentPrintFile = "";
|
|
80
|
+
let finishedFileName = "";
|
|
79
81
|
let printProgress = 0;
|
|
80
82
|
let isPaused = false;
|
|
81
83
|
let nozzleTemp = 25;
|
|
@@ -95,7 +97,7 @@ const PRINT_DURATION = 20;
|
|
|
95
97
|
"Welcome to Bambu Lab Mock FTP Server"
|
|
96
98
|
]
|
|
97
99
|
});
|
|
98
|
-
ftpServer.on("login", ({
|
|
100
|
+
ftpServer.on("login", ({ username, password }, resolve, reject)=>{
|
|
99
101
|
console.log(`[BAMBU MOCK FTP] Login attempt - Username: ${username}`);
|
|
100
102
|
if (username === "bblp" && password === accessCode) {
|
|
101
103
|
console.log(`[BAMBU MOCK FTP] Authentication successful`);
|
|
@@ -107,7 +109,7 @@ const PRINT_DURATION = 20;
|
|
|
107
109
|
reject(new Error("Invalid username or password"));
|
|
108
110
|
}
|
|
109
111
|
});
|
|
110
|
-
ftpServer.on("client-error", ({
|
|
112
|
+
ftpServer.on("client-error", ({ error })=>{
|
|
111
113
|
console.error(`[BAMBU MOCK FTP] Client error:`, error);
|
|
112
114
|
});
|
|
113
115
|
ftpServer.listen().then(()=>{
|
|
@@ -133,7 +135,12 @@ const PRINT_DURATION = 20;
|
|
|
133
135
|
}
|
|
134
136
|
});
|
|
135
137
|
const publishState = ()=>{
|
|
136
|
-
if (
|
|
138
|
+
if (isFinished) {
|
|
139
|
+
isFinished = false;
|
|
140
|
+
finishedFileName = "";
|
|
141
|
+
currentPrintFile = "";
|
|
142
|
+
printProgress = 0;
|
|
143
|
+
} else if (isPrinting && !isPaused) {
|
|
137
144
|
const elapsedSeconds = (Date.now() - printStartTime) / 1000;
|
|
138
145
|
printProgress = Math.min(elapsedSeconds / PRINT_DURATION * 100, 100);
|
|
139
146
|
if (printProgress < 10) {
|
|
@@ -144,16 +151,24 @@ const PRINT_DURATION = 20;
|
|
|
144
151
|
bedTemp = 60;
|
|
145
152
|
}
|
|
146
153
|
if (printProgress >= 100) {
|
|
154
|
+
isFinished = true;
|
|
155
|
+
finishedFileName = currentPrintFile;
|
|
147
156
|
isPrinting = false;
|
|
148
|
-
printProgress =
|
|
149
|
-
|
|
150
|
-
console.log(`[BAMBU MOCK MQTT] Print completed`);
|
|
157
|
+
printProgress = 100;
|
|
158
|
+
console.log(`[BAMBU MOCK MQTT] Print completed: ${currentPrintFile}`);
|
|
151
159
|
}
|
|
152
160
|
}
|
|
153
|
-
if (!isPrinting && nozzleTemp > 25) {
|
|
161
|
+
if (!isPrinting && !isFinished && nozzleTemp > 25) {
|
|
154
162
|
nozzleTemp = Math.max(nozzleTemp - 2, 25);
|
|
155
163
|
bedTemp = Math.max(bedTemp - 1, 25);
|
|
156
164
|
}
|
|
165
|
+
let gcodeState = "IDLE";
|
|
166
|
+
if (isFinished) gcodeState = "FINISHED";
|
|
167
|
+
else if (isPrinting && isPaused) gcodeState = "PAUSE";
|
|
168
|
+
else if (isPrinting) gcodeState = "PRINTING";
|
|
169
|
+
const fileName = isFinished ? finishedFileName : currentPrintFile;
|
|
170
|
+
const hasJob = isPrinting || isFinished;
|
|
171
|
+
const printingLabel = isPaused ? "paused" : isFinished ? "finished" : "printing";
|
|
157
172
|
const state = {
|
|
158
173
|
print: {
|
|
159
174
|
nozzle_temper: Math.round(nozzleTemp),
|
|
@@ -161,15 +176,15 @@ const PRINT_DURATION = 20;
|
|
|
161
176
|
bed_temper: Math.round(bedTemp),
|
|
162
177
|
bed_target_temper: isPrinting ? 60 : 0,
|
|
163
178
|
chamber_temper: 30,
|
|
164
|
-
mc_percent: Math.round(printProgress),
|
|
165
|
-
mc_remaining_time:
|
|
166
|
-
mc_print_stage:
|
|
167
|
-
gcode_state:
|
|
168
|
-
gcode_file:
|
|
179
|
+
mc_percent: isFinished ? 100 : Math.round(printProgress),
|
|
180
|
+
mc_remaining_time: hasJob ? Math.round(Math.max(0, (PRINT_DURATION - (Date.now() - printStartTime) / 1000) / 60)) : 0,
|
|
181
|
+
mc_print_stage: hasJob ? printingLabel : "idle",
|
|
182
|
+
gcode_state: gcodeState,
|
|
183
|
+
gcode_file: fileName || "",
|
|
169
184
|
wifi_signal: "-45dBm",
|
|
170
|
-
layer_num:
|
|
171
|
-
total_layer_num:
|
|
172
|
-
subtask_name:
|
|
185
|
+
layer_num: hasJob ? Math.floor((isFinished ? 100 : printProgress) / 2) : 0,
|
|
186
|
+
total_layer_num: hasJob ? 50 : 0,
|
|
187
|
+
subtask_name: fileName || "",
|
|
173
188
|
heatbreak_fan_speed: isPrinting ? "5000" : "0",
|
|
174
189
|
cooling_fan_speed: isPrinting ? "8000" : "0",
|
|
175
190
|
big_fan1_speed: isPrinting ? "3000" : "0",
|
|
@@ -198,12 +213,12 @@ const PRINT_DURATION = 20;
|
|
|
198
213
|
try {
|
|
199
214
|
const payload = JSON.parse(message.toString());
|
|
200
215
|
console.log(`[BAMBU MOCK MQTT] Received command on ${topic}:`, JSON.stringify(payload));
|
|
201
|
-
if (payload.print
|
|
216
|
+
if (payload.print?.command) {
|
|
202
217
|
const command = payload.print.command;
|
|
203
218
|
console.log(`[BAMBU MOCK MQTT] Processing command: ${command}`);
|
|
204
219
|
if (command === "project_file" || command === "start") {
|
|
205
220
|
const filename = payload.print.param || payload.print.subtask_name || "unknown.gcode";
|
|
206
|
-
if (filename.endsWith(
|
|
221
|
+
if (filename.endsWith(".gcode") || filename.endsWith(".3mf")) {
|
|
207
222
|
isPrinting = true;
|
|
208
223
|
isPaused = false;
|
|
209
224
|
printStartTime = Date.now();
|
|
@@ -227,11 +242,16 @@ const PRINT_DURATION = 20;
|
|
|
227
242
|
}
|
|
228
243
|
} else if (command === "stop") {
|
|
229
244
|
if (isPrinting) {
|
|
245
|
+
const stoppedFile = currentPrintFile;
|
|
230
246
|
isPrinting = false;
|
|
231
247
|
isPaused = false;
|
|
232
248
|
printProgress = 0;
|
|
233
|
-
|
|
234
|
-
|
|
249
|
+
console.log(`[BAMBU MOCK MQTT] Stopping print: ${stoppedFile}`);
|
|
250
|
+
setTimeout(()=>{
|
|
251
|
+
if (!isPrinting) {
|
|
252
|
+
currentPrintFile = "";
|
|
253
|
+
}
|
|
254
|
+
}, MESSAGE_INTERVAL * 2);
|
|
235
255
|
}
|
|
236
256
|
}
|
|
237
257
|
}
|
|
@@ -266,7 +286,7 @@ const PRINT_DURATION = 20;
|
|
|
266
286
|
});
|
|
267
287
|
console.log(`[BAMBU MOCK] Mock server is running. Press Ctrl+C to stop.`);
|
|
268
288
|
})().catch((error)=>{
|
|
269
|
-
console.error(
|
|
289
|
+
console.error("[BAMBU MOCK] Fatal error during startup:", error);
|
|
270
290
|
process.exit(1);
|
|
271
291
|
});
|
|
272
292
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/consoles/mock-bambu.server.ts"],"names":["DEFAULT_PORT","DEFAULT_MQTT_PORT","DEFAULT_SERIAL","DEFAULT_ACCESS_CODE","MESSAGE_INTERVAL","DEFAULT_USERNAME","port","process","argv","Number","parseInt","mqttPort","serial","accessCode","console","log","ftpDir","path","join","os","tmpdir","sdcardDir","fs","existsSync","mkdirSync","recursive","generateSelfSignedCert","attrs","name","value","options","days","algorithm","keySize","pems","selfsigned","generate","key","private","cert","minVersion","ciphers","isPrinting","currentPrintFile","printProgress","isPaused","nozzleTemp","bedTemp","printStartTime","PRINT_DURATION","tlsCerts","ftpServer","FtpSrv","url","pasv_url","pasv_min","pasv_max","tls","anonymous","greeting","on","
|
|
1
|
+
{"version":3,"sources":["../../src/consoles/mock-bambu.server.ts"],"names":["DEFAULT_PORT","DEFAULT_MQTT_PORT","DEFAULT_SERIAL","DEFAULT_ACCESS_CODE","MESSAGE_INTERVAL","DEFAULT_USERNAME","port","process","argv","Number","parseInt","mqttPort","serial","accessCode","console","log","ftpDir","path","join","os","tmpdir","sdcardDir","fs","existsSync","mkdirSync","recursive","generateSelfSignedCert","attrs","name","value","options","days","algorithm","keySize","pems","selfsigned","generate","key","private","cert","minVersion","ciphers","isPrinting","isFinished","currentPrintFile","finishedFileName","printProgress","isPaused","nozzleTemp","bedTemp","printStartTime","PRINT_DURATION","tlsCerts","ftpServer","FtpSrv","url","pasv_url","pasv_min","pasv_max","tls","anonymous","greeting","on","username","password","resolve","reject","root","Error","error","listen","then","mqttClient","mqtt","connect","clientId","Date","now","rejectUnauthorized","reportTopic","requestTopic","subscribe","err","publishState","elapsedSeconds","Math","min","max","gcodeState","fileName","hasJob","printingLabel","state","print","nozzle_temper","round","nozzle_target_temper","bed_temper","bed_target_temper","chamber_temper","mc_percent","mc_remaining_time","mc_print_stage","gcode_state","gcode_file","wifi_signal","layer_num","floor","total_layer_num","subtask_name","heatbreak_fan_speed","cooling_fan_speed","big_fan1_speed","big_fan2_speed","spd_lvl","spd_mag","print_error","lifecycle","command","msg","sequence_id","String","publish","JSON","stringify","qos","setInterval","topic","message","payload","parse","toString","filename","param","endsWith","pausedProgress","stoppedFile","setTimeout","connected","endAsync","close","exit","catch"],"mappings":"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"}
|