@fdm-monster/server 2.0.11 → 2.1.1
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/.yarn/install-state.gz +0 -0
- package/.yarn/releases/{yarn-4.13.0.cjs → yarn-4.14.1.cjs} +288 -288
- package/.yarnrc.yml +5 -1
- package/README.md +2 -1
- package/RELEASE_NOTES.MD +153 -2
- package/dist/_virtual/{_@oxc-project_runtime@0.127.0 → _@oxc-project_runtime@0.129.0}/helpers/decorate.js +1 -1
- package/dist/_virtual/{_@oxc-project_runtime@0.127.0 → _@oxc-project_runtime@0.129.0}/helpers/decorateMetadata.js +1 -1
- package/dist/_virtual/_virtual_controllers.js +2 -0
- package/dist/consoles/typeorm-create.js.map +1 -1
- package/dist/consoles/typeorm-generate.js.map +1 -1
- package/dist/consoles/typeorm-migrate.js.map +1 -1
- package/dist/constants/authorization.constants.js.map +1 -1
- package/dist/container.js +2 -0
- package/dist/container.js.map +1 -1
- package/dist/container.tokens.js +1 -0
- package/dist/container.tokens.js.map +1 -1
- package/dist/controllers/api-key.controller.js +72 -0
- package/dist/controllers/api-key.controller.js.map +1 -0
- package/dist/controllers/auth.controller.js +6 -4
- package/dist/controllers/auth.controller.js.map +1 -1
- package/dist/controllers/batch-call.controller.js +2 -2
- package/dist/controllers/batch-call.controller.js.map +1 -1
- package/dist/controllers/camera-stream.controller.js +2 -2
- package/dist/controllers/camera-stream.controller.js.map +1 -1
- package/dist/controllers/file-storage.controller.js +2 -2
- package/dist/controllers/file-storage.controller.js.map +1 -1
- package/dist/controllers/first-time-setup.controller.js +2 -2
- package/dist/controllers/first-time-setup.controller.js.map +1 -1
- package/dist/controllers/floor.controller.js +2 -2
- package/dist/controllers/floor.controller.js.map +1 -1
- package/dist/controllers/metrics.controller.js +2 -2
- package/dist/controllers/metrics.controller.js.map +1 -1
- package/dist/controllers/print-job.controller.js +2 -2
- package/dist/controllers/print-job.controller.js.map +1 -1
- package/dist/controllers/print-queue.controller.js +2 -2
- package/dist/controllers/print-queue.controller.js.map +1 -1
- package/dist/controllers/printer-files.controller.js +2 -2
- package/dist/controllers/printer-files.controller.js.map +1 -1
- package/dist/controllers/printer-maintenance-log.controller.js +2 -2
- package/dist/controllers/printer-maintenance-log.controller.js.map +1 -1
- package/dist/controllers/printer-settings.controller.js +2 -2
- package/dist/controllers/printer-settings.controller.js.map +1 -1
- package/dist/controllers/printer-tag.controller.js +2 -2
- package/dist/controllers/printer-tag.controller.js.map +1 -1
- package/dist/controllers/printer.controller.js +2 -2
- package/dist/controllers/printer.controller.js.map +1 -1
- package/dist/controllers/server-private.controller.js +2 -2
- package/dist/controllers/server-private.controller.js.map +1 -1
- package/dist/controllers/server-public.controller.js +2 -2
- package/dist/controllers/server-public.controller.js.map +1 -1
- package/dist/controllers/settings.controller.js +2 -2
- package/dist/controllers/settings.controller.js.map +1 -1
- package/dist/controllers/slicer-compat.controller.js +2 -2
- package/dist/controllers/slicer-compat.controller.js.map +1 -1
- package/dist/controllers/user.controller.js +2 -2
- package/dist/controllers/user.controller.js.map +1 -1
- package/dist/controllers/validation/api-key-controller.validation.js +11 -0
- package/dist/controllers/validation/api-key-controller.validation.js.map +1 -0
- package/dist/data-source.js +6 -2
- package/dist/data-source.js.map +1 -1
- package/dist/entities/api-key.entity.js +60 -0
- package/dist/entities/api-key.entity.js.map +1 -0
- package/dist/entities/camera-stream.entity.js +2 -2
- package/dist/entities/floor-position.entity.js +2 -2
- package/dist/entities/floor.entity.js +2 -2
- package/dist/entities/index.js +2 -1
- package/dist/entities/print-job.entity.js +2 -2
- package/dist/entities/printer-maintenance-log.entity.js +2 -2
- package/dist/entities/printer-tag.entity.js +2 -2
- package/dist/entities/printer.entity.js +2 -2
- package/dist/entities/refresh-token.entity.js +2 -2
- package/dist/entities/role.entity.js +2 -2
- package/dist/entities/settings.entity.js +2 -2
- package/dist/entities/tag.entity.js +2 -2
- package/dist/entities/user-role.entity.js +2 -2
- package/dist/entities/user.entity.js +2 -2
- package/dist/exceptions/failed-dependency.exception.js.map +1 -1
- package/dist/exceptions/job.exceptions.js.map +1 -1
- package/dist/exceptions/runtime.exceptions.js.map +1 -1
- package/dist/handlers/event-emitter.js.map +1 -1
- package/dist/handlers/logger-factory.js.map +1 -1
- package/dist/handlers/logger.js.map +1 -1
- package/dist/handlers/logging/file-logging.transport.js +1 -2
- package/dist/handlers/logging/file-logging.transport.js.map +1 -1
- package/dist/handlers/logging/loki-logging.transport.js.map +1 -1
- package/dist/handlers/logging/static.logger.js.map +1 -1
- package/dist/handlers/validators.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/middleware/api-key.strategy.js +45 -0
- package/dist/middleware/api-key.strategy.js.map +1 -0
- package/dist/middleware/authenticate.js.map +1 -1
- package/dist/middleware/database.js.map +1 -1
- package/dist/middleware/demo.middleware.js.map +1 -1
- package/dist/middleware/exception.filter.js.map +1 -1
- package/dist/middleware/global.middleware.js.map +1 -1
- package/dist/middleware/param-converter.middleware.js.map +1 -1
- package/dist/middleware/passport.js +3 -0
- package/dist/middleware/passport.js.map +1 -1
- package/dist/middleware/printer-resolver.js.map +1 -1
- package/dist/middleware/printer.js.map +1 -1
- package/dist/middleware/slicer-api-key.middleware.js.map +1 -1
- package/dist/middleware/socketio.middleware.js.map +1 -1
- package/dist/migrations/1706829146617-InitSqlite.js.map +1 -1
- package/dist/migrations/1707494762198-PrinterGroup.js.map +1 -1
- package/dist/migrations/1708465930665-ChangePrintCompletionDeletePrinterCascade.js.map +1 -1
- package/dist/migrations/1713300747465-ChangeRoleNameUnique.js.map +1 -1
- package/dist/migrations/1713897879622-AddPrinterType.js.map +1 -1
- package/dist/migrations/1720338804844-RemovePrinterFile.js.map +1 -1
- package/dist/migrations/1745141688926-AddPrinterUsernamePassword.js.map +1 -1
- package/dist/migrations/1766576698569-DropPermissions.js.map +1 -1
- package/dist/migrations/1767278216516-ChangeCameraPrinterOnDeleteSetNull.js.map +1 -1
- package/dist/migrations/1767279607392-DropCustomGcode.js.map +1 -1
- package/dist/migrations/1767291804417-DropPrintCompletions.js.map +1 -1
- package/dist/migrations/1767352862576-DropSettingsFileClean.js.map +1 -1
- package/dist/migrations/1767355639023-ChangeFloorLevelToOrder.js.map +1 -1
- package/dist/migrations/1767370191762-ChangeFloorNonUniqueOrder.js.map +1 -1
- package/dist/migrations/1767432108916-RenameGroupToTag.js.map +1 -1
- package/dist/migrations/1767451444137-AddPrintJob.js.map +1 -1
- package/dist/migrations/1767909428129-AddPrinterMaintenanceLog.js.map +1 -1
- package/dist/migrations/1778446203015-AddApiKey.js +49 -0
- package/dist/migrations/1778446203015-AddApiKey.js.map +1 -0
- package/dist/plugins/controllers-plugin.js.map +1 -1
- package/dist/server.constants.js +2 -1
- package/dist/server.constants.js.map +1 -1
- package/dist/server.core.js +6 -2
- package/dist/server.core.js.map +1 -1
- package/dist/server.env.js.map +1 -1
- 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.map +1 -1
- 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.map +1 -1
- package/dist/services/core/batch-call.service.js.map +1 -1
- package/dist/services/core/client-bundle.service.js.map +1 -1
- package/dist/services/core/config.service.js +4 -0
- package/dist/services/core/config.service.js.map +1 -1
- package/dist/services/core/cradle.service.js.map +1 -1
- package/dist/services/core/github.service.js.map +1 -1
- package/dist/services/core/http-client.factory.js.map +1 -1
- package/dist/services/core/logs-manager.service.js.map +1 -1
- package/dist/services/core/monsterpi.service.js.map +1 -1
- package/dist/services/core/multer.service.js.map +1 -1
- package/dist/services/core/server-release.service.js.map +1 -1
- package/dist/services/core/yaml.service.js.map +1 -1
- package/dist/services/file-analysis.service.js.map +1 -1
- package/dist/services/file-storage.service.js.map +1 -1
- package/dist/services/interfaces/api-key.dto.js +19 -0
- package/dist/services/interfaces/api-key.dto.js.map +1 -0
- package/dist/services/interfaces/api-key.service.interface.js +1 -0
- package/dist/services/interfaces/user.dto.js +2 -0
- package/dist/services/interfaces/user.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.map +1 -1
- 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.map +1 -1
- package/dist/services/octoprint/utils/api.utils.js.map +1 -1
- package/dist/services/octoprint/utils/file.utils.js.map +1 -1
- package/dist/services/octoprint/utils/octoprint-http-client.builder.js.map +1 -1
- package/dist/services/octoprint.api.js.map +1 -1
- package/dist/services/orm/api-key.service.js +90 -0
- package/dist/services/orm/api-key.service.js.map +1 -0
- 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.map +1 -1
- package/dist/services/orm/permission.service.js.map +1 -1
- package/dist/services/orm/print-job.service.js.map +1 -1
- package/dist/services/orm/printer-maintenance-log.service.js.map +1 -1
- package/dist/services/orm/printer-tag.service.js.map +1 -1
- 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.map +1 -1
- package/dist/services/orm/settings.service.js.map +1 -1
- package/dist/services/orm/user-role.service.js.map +1 -1
- package/dist/services/orm/user.service.js.map +1 -1
- package/dist/services/print-file-downloader.service.js.map +1 -1
- package/dist/services/print-queue.service.js.map +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/prusa-link-http-polling.adapter.js.map +1 -1
- package/dist/services/prusa-link/prusa-link.api.js.map +1 -1
- package/dist/services/prusa-link/utils/digest-auth.util.js +19 -12
- 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 +45 -11
- package/dist/services/prusa-link/utils/prusa-link-http-client.builder.js.map +1 -1
- package/dist/services/socket.factory.js.map +1 -1
- package/dist/services/task-manager.service.js.map +1 -1
- package/dist/services/typeorm/typeorm.service.js.map +1 -1
- package/dist/services/validators/printer-service.validation.js.map +1 -1
- package/dist/shared/default-http-client.builder.js.map +1 -1
- package/dist/shared/load-controllers.js.map +1 -1
- package/dist/shared/runtime-settings.migration.js.map +1 -1
- 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/floor.store.js.map +1 -1
- package/dist/state/printer-events.cache.js.map +1 -1
- package/dist/state/printer-socket.store.js.map +1 -1
- package/dist/state/printer-thumbnail.cache.js.map +1 -1
- package/dist/state/printer.cache.js.map +1 -1
- package/dist/state/settings.store.js.map +1 -1
- package/dist/state/socket-io.gateway.js.map +1 -1
- package/dist/state/test-printer-socket.store.js.map +1 -1
- package/dist/tasks/boot.task.js.map +1 -1
- package/dist/tasks/client-bundle.task.js.map +1 -1
- package/dist/tasks/print-job-analysis.task.js.map +1 -1
- package/dist/tasks/printer-websocket-restore.task.js.map +1 -1
- package/dist/tasks/printer-websocket.task.js.map +1 -1
- package/dist/tasks/socketio.task.js.map +1 -1
- package/dist/tasks/software-update.task.js.map +1 -1
- package/dist/tasks.js.map +1 -1
- package/dist/utils/array.util.js.map +1 -1
- package/dist/utils/bgcode/bgcode-thumbnail.parser.js.map +1 -1
- package/dist/utils/bgcode/bgcode.utils.js.map +1 -1
- package/dist/utils/bgcode/heatshrink-decoder.js.map +1 -1
- package/dist/utils/bgcode/png-encoder.js.map +1 -1
- package/dist/utils/bgcode/qoi-decoder.js.map +1 -1
- package/dist/utils/cache/key-diff.cache.js.map +1 -1
- package/dist/utils/correlation-token.util.js.map +1 -1
- package/dist/utils/crypto.utils.js.map +1 -1
- package/dist/utils/env.utils.js.map +1 -1
- package/dist/utils/error.utils.js.map +1 -1
- package/dist/utils/fs.utils.js.map +1 -1
- package/dist/utils/gcode.utils.js.map +1 -1
- package/dist/utils/image-dimensions.js.map +1 -1
- package/dist/utils/job-stats.util.js.map +1 -1
- package/dist/utils/normalize-url.js.map +1 -1
- package/dist/utils/parsers/3mf.parser.js.map +1 -1
- package/dist/utils/parsers/bgcode.parser.js.map +1 -1
- package/dist/utils/parsers/gcode.parser.js.map +1 -1
- package/dist/utils/pretty-print.utils.js.map +1 -1
- package/dist/utils/semver.utils.js.map +1 -1
- package/dist/utils/swagger/decorators.js.map +1 -1
- package/dist/utils/swagger/generator.js.map +1 -1
- package/dist/utils/swagger/swagger.js.map +1 -1
- package/dist/utils/thumbnail.util.js.map +1 -1
- package/dist/utils/time.utils.js.map +1 -1
- package/dist/utils/url.utils.js.map +1 -1
- package/package.json +17 -14
- package/packages/consoles/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"moonraker.client.js","names":[],"sources":["../../../src/services/moonraker/moonraker.client.ts"],"sourcesContent":["import { AxiosError, AxiosResponse } from \"axios\";\nimport type { ServerInfoDto } from \"@/services/moonraker/dto/server/server-info.dto\";\nimport type { LoginDto } from \"@/services/interfaces/login.dto\";\nimport type { ResultDto } from \"./dto/rest/result.dto\";\nimport type { ServerConfigDto } from \"@/services/moonraker/dto/server/server-config.dto\";\nimport type { TemperatureStoreDto } from \"@/services/moonraker/dto/temperature-store.dto\";\nimport type { GcodeStoreDto } from \"@/services/moonraker/dto/gcode-store.dto\";\nimport type { ActionResultDto } from \"@/services/moonraker/dto/rest/action-result.dto\";\nimport type { PrinterInfoDto } from \"@/services/moonraker/dto/printer-info.dto\";\nimport { KnownPrinterObject, PrinterAvailableObjects } from \"@/services/moonraker/dto/objects/printer-objects-list.dto\";\nimport type { PrinterQueryEndstopsDto } from \"@/services/moonraker/dto/printer-query-endstops.dto\";\nimport type { GcodeHelpDto } from \"@/services/moonraker/dto/gcode-help.dto\";\nimport type { MachineSystemInfoDto } from \"@/services/moonraker/dto/machine/machine-system-info.dto\";\nimport type { ProcessStatsDto } from \"@/services/moonraker/dto/process-stats.dto\";\nimport type { SudoInfoDto } from \"@/services/moonraker/dto/sudo-info.dto\";\nimport type { SudoResponseDto } from \"@/services/moonraker/dto/sudo-response.dto\";\nimport type { MachinePeripheralsUsbDto } from \"@/services/moonraker/dto/machine/machine-peripherals-usb.dto\";\nimport type { MachinePeripheralsSerialDto } from \"@/services/moonraker/dto/machine/machine-peripherals-serial.dto\";\nimport type { MachinePeripheralsVideoDto } from \"@/services/moonraker/dto/machine/machine-peripherals-video.dto\";\nimport type { MachinePeripheralsCanbusDto } from \"@/services/moonraker/dto/machine/machine-peripherals-canbus.dto\";\nimport type { ServerFileDto } from \"@/services/moonraker/dto/server-files/server-file.dto\";\nimport type { ServerFileRootDto } from \"@/services/moonraker/dto/server-files/server-file-root.dto\";\nimport type { ServerFileMetadataDto } from \"@/services/moonraker/dto/server-files/server-file-metadata.dto\";\nimport type { ServerFileThumbnailDto } from \"@/services/moonraker/dto/server-files/server-file-thumbnail.dto\";\nimport type { ServerFileDirectoryInfoDto } from \"@/services/moonraker/dto/server-files/server-file-directory-info.dto\";\nimport {\n ServerFileDirectoryActionDto,\n ServerFileDirectoryMovedDto,\n} from \"@/services/moonraker/dto/server-files/server-file-directory-action.dto\";\nimport type { ServerFileZipActionDto } from \"@/services/moonraker/dto/server-files/server-file-zip-action.dto\";\nimport FormData from \"form-data\";\nimport { uploadDoneEvent, uploadFailedEvent, uploadProgressEvent } from \"@/constants/event.constants\";\nimport EventEmitter2 from \"eventemitter2\";\nimport type { AccessLoginResultDto } from \"@/services/moonraker/dto/access/access-login-result.dto\";\nimport type { AccessUserResultDto } from \"@/services/moonraker/dto/access/access-user-result.dto\";\nimport type { AccessUserDto } from \"@/services/moonraker/dto/access/access-user.dto\";\nimport type { AccessLoginRefreshDto } from \"@/services/moonraker/dto/access/access-login-refresh.dto\";\nimport type { AccessInfoDto } from \"@/services/moonraker/dto/access/access-info.dto\";\nimport {\n Namespaces,\n type DatabaseNamespaceListDto,\n} from \"@/services/moonraker/dto/database/database-namespace-list.dto\";\nimport type { DatabaseNamespaceItemDto } from \"@/services/moonraker/dto/database/database-namespace-item.dto\";\nimport type { JobQueueStatusDto } from \"@/services/moonraker/dto/job-queue/job-queue-status.dto\";\nimport type { EnqueueJobDto } from \"@/services/moonraker/dto/job-queue/enqueue-job.dto\";\nimport type { AnnouncementListDto } from \"@/services/moonraker/dto/server-announcements/announcement-list.dto\";\nimport type { AnnouncementEntryIdDto } from \"@/services/moonraker/dto/server-announcements/announcement-entry-id.dto\";\nimport type { AnnouncementFeedsDto } from \"@/services/moonraker/dto/server-announcements/announcement-feeds.dto\";\nimport type { AnnouncementActionDto } from \"@/services/moonraker/dto/server-announcements/announcement-action.dto\";\nimport type { WebcamDto, WebcamListDto } from \"@/services/moonraker/dto/server-webcams/webcam-list.dto\";\nimport type { WebcamItemDto } from \"@/services/moonraker/dto/server-webcams/webcam-item.dto\";\nimport type { WebcamTestDto } from \"@/services/moonraker/dto/server-webcams/webcam-test.dto\";\nimport type { NotifierListDto } from \"@/services/moonraker/dto/notifier-list.dto\";\nimport type { MachineUpdateStatusDto } from \"@/services/moonraker/dto/machine/machine-update-status.dto\";\nimport type { MachineDevicePowerDevicesDto } from \"@/services/moonraker/dto/machine/machine-device-power-devices.dto\";\nimport type { MachineDevicePowerDeviceStateDto } from \"@/services/moonraker/dto/machine/machine-device-power-device-state.dto\";\nimport type { MachineWledStripsDto } from \"@/services/moonraker/dto/machine/machine-wled-strips.dto\";\nimport type { JsonRpcResponseDto } from \"@/services/moonraker/dto/rpc/json-rpc-response.dto\";\nimport type { JsonRpcRequestDto } from \"@/services/moonraker/dto/rpc/json-rpc-request.dto\";\nimport type { SensorListDto } from \"@/services/moonraker/dto/server-sensors/sensor-list.dto\";\nimport type { SensorsMeasurementsDto } from \"@/services/moonraker/dto/server-sensors/sensor-measurements.dto\";\nimport type { SensorDto } from \"@/services/moonraker/dto/server-sensors/sensor-info.dto\";\nimport type { SpoolmanStatusDto } from \"@/services/moonraker/dto/spoolman/spoolman-status.dto\";\nimport type { SpoolmanActiveSpoolDto } from \"@/services/moonraker/dto/spoolman/spoolman-active-spool.dto\";\nimport type { SpoolmanProxyRequestDto } from \"@/services/moonraker/dto/spoolman/spoolman-proxy-request.dto\";\nimport type { SpoolmanResponseDto } from \"@/services/moonraker/dto/spoolman/spoolman-response.dto\";\nimport type { ApiVersionDto } from \"@/services/moonraker/dto/octoprint-compat/api-version.dto\";\nimport type { ServerVersionDto } from \"@/services/moonraker/dto/octoprint-compat/server-version.dto\";\nimport type { ApiLoginDto } from \"@/services/moonraker/dto/octoprint-compat/api-login.dto\";\nimport type { ApiSettingsDto } from \"@/services/moonraker/dto/octoprint-compat/api-settings.dto\";\nimport type { ApiJobDto } from \"@/services/moonraker/dto/octoprint-compat/api-job.dto\";\nimport type { ApiPrinterDto } from \"@/services/moonraker/dto/octoprint-compat/api-printer.dto\";\nimport type { ApiProfilesDto } from \"@/services/moonraker/dto/octoprint-compat/api-profiles.dto\";\nimport type { HistoryListDto } from \"@/services/moonraker/dto/server-history/history-list.dto\";\nimport type { HistoryTotalsDto } from \"@/services/moonraker/dto/server-history/history-totals.dto\";\nimport type { HistoryLastTotalsDto } from \"@/services/moonraker/dto/server-history/history-last-totals.dto\";\nimport type { HistoryJobDto } from \"@/services/moonraker/dto/server-history/history-job.dto\";\nimport type { PrinterObjectsQueryDto } from \"@/services/moonraker/dto/objects/printer-objects-query.dto\";\nimport { DefaultHttpClientBuilder } from \"@/shared/default-http-client.builder\";\nimport { HttpClientFactory } from \"@/services/core/http-client.factory\";\nimport { LoggerService } from \"@/handlers/logger\";\nimport type { ILoggerFactory } from \"@/handlers/logger-factory\";\nimport { ExternalServiceError } from \"@/exceptions/runtime.exceptions\";\nimport { SettingsStore } from \"@/state/settings.store\";\n\nexport class MoonrakerClient {\n protected logger: LoggerService;\n\n constructor(\n loggerFactory: ILoggerFactory,\n private readonly httpClientFactory: HttpClientFactory,\n private readonly eventEmitter2: EventEmitter2,\n private readonly settingsStore: SettingsStore,\n ) {\n this.logger = loggerFactory(MoonrakerClient.name);\n }\n\n async getServerInfo(login: LoginDto) {\n return this.createClient(login).get<ResultDto<ServerInfoDto>>(\"/server/info\");\n }\n\n async getServerConfig(login: LoginDto) {\n return this.createClient(login).get<ResultDto<ServerConfigDto>>(\"/server/config\");\n }\n\n async getTemperatureStore(login: LoginDto, includeMonitors: boolean = false) {\n return this.createClient(login).get<ResultDto<TemperatureStoreDto>>(\n `/server/temperature_store?include_monitors=${!!includeMonitors}`,\n );\n }\n\n async getGcodeStore(login: LoginDto, count: number = 100) {\n return this.createClient(login).get<ResultDto<GcodeStoreDto>>(`/server/gcode_store?count=${count}`);\n }\n\n async postRolloverLogs(login: LoginDto, application: \"moonraker\" | \"klipper\" | \"\" = \"\") {\n return this.createClient(login).post<ResultDto<GcodeStoreDto>>(`server/logs/rollover`, { application });\n }\n\n async postRestartServer(login: LoginDto) {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`server/restart`);\n }\n\n async postJsonRpc<I, O>(login: LoginDto, method: string, params?: I, id?: number) {\n return this.createClient(login).post<\n JsonRpcResponseDto<O>,\n AxiosResponse<JsonRpcResponseDto<O>>,\n JsonRpcRequestDto<I>\n >(`server/jsonrpc`, {\n jsonrpc: \"2.0\",\n id: id ? id : 0,\n method,\n params,\n });\n }\n\n async getPrinterInfo(login: LoginDto) {\n return this.createClient(login).post<ResultDto<PrinterInfoDto>>(`printer/info`);\n }\n\n async postQuickStop(login: LoginDto) {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`printer/emergency_stop`);\n }\n\n async postHostRestart(login: LoginDto) {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`printer/restart`);\n }\n\n async postFirmwareRestart(login: LoginDto) {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`printer/firmware_restart`);\n }\n\n async getPrinterObjectsList(login: LoginDto) {\n return this.createClient(login).get<ResultDto<PrinterAvailableObjects>>(`printer/objects/list`);\n }\n\n async getPrinterObjectsQuery<R = PrinterObjectsQueryDto>(\n login: LoginDto,\n query: Partial<Record<KnownPrinterObject, string[]>>,\n ) {\n const queryString = this.convertToQueryString(query);\n return this.createClient(login).get<ResultDto<R>>(`printer/objects/query?${queryString}`);\n }\n\n postSubscribePrinterObjects<R = PrinterObjectsQueryDto>(\n login: LoginDto,\n connectionId: number,\n query: Partial<Record<KnownPrinterObject, string[]>>,\n ) {\n const queryString = this.convertToQueryString(query);\n return this.createClient(login).post<ResultDto<R>>(\n `printer/objects/subscribe?connection_id=${connectionId}&${queryString}`,\n );\n }\n\n async getPrinterQueryEndstops(login: LoginDto) {\n return this.createClient(login).get<ResultDto<PrinterQueryEndstopsDto>>(`printer/query-endstops`);\n }\n\n async postGcodeScript(login: LoginDto, script: string = \"G28\") {\n return this.createClient(login).get<ResultDto<ActionResultDto>>(`printer/gcode/script?script=${script}`);\n }\n\n async getGcodeHelp(login: LoginDto) {\n return this.createClient(login).get<ResultDto<GcodeHelpDto>>(`printer/gcode/help`);\n }\n\n async postPrintStart(login: LoginDto, filename: string) {\n // will throw 400 if SD busy\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`printer/print/start?filename=${filename}`);\n }\n\n async postPrintPause(login: LoginDto) {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`printer/print/pause`);\n }\n\n async postPrintResume(login: LoginDto) {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`printer/print/resume`);\n }\n\n async postPrintCancel(login: LoginDto) {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`printer/print/cancel`);\n }\n\n async getMachineSystemInfo(login: LoginDto) {\n return this.createClient(login).get<ResultDto<MachineSystemInfoDto>>(`machine/system_info`);\n }\n\n async postMachineShutdown(login: LoginDto) {\n // Will result in error.\n return this.createClient(login).post<null>(`machine/shutdown`);\n }\n\n async postMachineReboot(login: LoginDto) {\n // Will result in error.\n return this.createClient(login).post<null>(`machine/reboot`);\n }\n\n async postMachineRestartService(\n login: LoginDto,\n service:\n | \"crowsnest\"\n | \"MoonCord\"\n | \"moonraker\"\n | \"moonraker-telegram-bot\"\n | \"klipper\"\n | \"KlipperScreen\"\n | \"sonar\"\n | \"webcamd\",\n ) {\n // Can result in 500 if klipper fails to start\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`machine/services/restart?service=${service}`);\n }\n\n async postMachineStartService(login: LoginDto, service: \"webcamd\" | \"klipper\") {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`machine/services/restart?service=${service}`);\n }\n\n async postMachineProcessStats(login: LoginDto) {\n // Will result in error.\n return this.createClient(login).post<ResultDto<ProcessStatsDto>>(`machine/proc_stats`);\n }\n\n async getMachineSudoInfo(login: LoginDto, checkAccess: boolean = false) {\n return this.createClient(login).get<ResultDto<SudoInfoDto>>(`machine/sudo/info?check_access=${checkAccess}`);\n }\n\n async postMachineSetSudoPassword(login: LoginDto, password: string) {\n // Does not persist across reboots\n return this.createClient(login).post<ResultDto<SudoResponseDto>>(`machine/sudo/password`, {\n password,\n });\n }\n\n async getMachineListPeripheralsUsb(login: LoginDto) {\n return this.createClient(login).get<ResultDto<MachinePeripheralsUsbDto>>(`machine/peripherals/usb`);\n }\n\n async getMachineListPeripheralsSerial(login: LoginDto) {\n return this.createClient(login).get<ResultDto<MachinePeripheralsSerialDto>>(`machine/peripherals/serial`);\n }\n\n async getMachineListPeripheralsVideo(login: LoginDto) {\n return this.createClient(login).get<ResultDto<MachinePeripheralsVideoDto>>(`machine/peripherals/video`);\n }\n\n async getMachineListPeripheralsCanbus(login: LoginDto, canInterface: \"can0\" | \"can1\" | string = \"can0\") {\n return this.createClient(login).get<ResultDto<MachinePeripheralsCanbusDto>>(\n `machine/peripherals/canbus?interface=${canInterface}`,\n );\n }\n\n async getServerFilesList(login: LoginDto, rootFolder = \"\") {\n const paramString = rootFolder?.length ? `?root=${rootFolder}` : \"\";\n return this.createClient(login).get<ResultDto<ServerFileDto[]>>(`server/files/list${paramString}`);\n }\n\n async getServerFilesRoots(login: LoginDto) {\n return this.createClient(login).get<ResultDto<ServerFileRootDto[]>>(`server/files/roots`);\n }\n\n async getServerFileMetadata(login: LoginDto, filename: string) {\n return this.createClient(login).get<ResultDto<ServerFileMetadataDto>>(`server/files/metadata?filename=${filename}`);\n }\n\n async getServerFileMetadataScan(login: LoginDto, filename: string) {\n return this.createClient(login).get<ResultDto<ServerFileMetadataDto>>(`server/files/metascan?filename=${filename}`);\n }\n\n async getServerFilesThumbnails(login: LoginDto, filename: string) {\n return this.createClient(login).get<ResultDto<ServerFileThumbnailDto[]>>(\n `server/files/thumbnails?filename=${filename}`,\n );\n }\n\n async getServerFilesDirectoryInfo(login: LoginDto, path: string, extended: boolean) {\n return this.createClient(login).get<ResultDto<ServerFileDirectoryInfoDto>>(\n `server/files/directory?path=${path}&extended=${extended}`,\n );\n }\n\n async postServerFilesDirectory(login: LoginDto, path: string) {\n return this.createClient(login).post<ResultDto<ServerFileDirectoryActionDto>>(`server/files/directory`, {\n path,\n });\n }\n\n async deleteServerFilesDirectory(login: LoginDto, path: string, force: boolean) {\n return this.createClient(login).delete<ResultDto<ServerFileDirectoryActionDto>>(\n `server/files/directory?path=${path}&force=${!!force}`,\n );\n }\n\n async postServerFilesMove(login: LoginDto, source: string, dest: string) {\n return this.createClient(login).post<ResultDto<ServerFileDirectoryMovedDto>>(`server/files/directory`, {\n source,\n dest,\n });\n }\n\n async postServerFilesCopy(login: LoginDto, source: string, dest: string) {\n return this.createClient(login).post<ResultDto<ServerFileDirectoryActionDto>>(`server/files/copy`, {\n source,\n dest,\n });\n }\n\n async postServerFilesZip(login: LoginDto, items: string[], dest: string, store_only: boolean) {\n return this.createClient(login).post<ResultDto<ServerFileZipActionDto>>(`server/files/zip`, {\n items,\n store_only,\n dest,\n });\n }\n\n async getServerFilesDownload(login: LoginDto, root: string, filename: string) {\n return await this.createClient(login).get<NodeJS.ReadableStream>(`server/files/${root}/${filename}`, {\n responseType: \"stream\",\n });\n }\n\n async getServerFilesDownloadChunk(\n login: LoginDto,\n root: string,\n filename: string,\n startBytes: number,\n endBytes: number,\n ) {\n return await this.createClient(login).get<string>(`server/files/${root}/${filename}`, {\n headers: {\n Range: `bytes=${startBytes}-${endBytes}`,\n },\n });\n }\n\n async postServerFileUpload(\n login: LoginDto,\n stream: NodeJS.ReadableStream,\n fileName: string,\n contentLength: number,\n startPrint: boolean,\n progressToken?: string,\n root?: string,\n path?: string,\n checksum?: string,\n ) {\n const formData = new FormData();\n if (root?.length) {\n formData.append(\"root\", root);\n }\n if (path?.length) {\n formData.append(\"path\", path);\n }\n if (checksum?.length) {\n formData.append(\"checksum\", checksum);\n }\n if (startPrint) {\n formData.append(\"print\", \"true\");\n }\n\n formData.append(\"file\", stream, { filename: fileName, knownLength: contentLength });\n\n // Calculate the header that axios uses to determine progress\n const result: number = await new Promise<number>((resolve, reject) => {\n return formData.getLength((err, length) => {\n if (err) reject(new Error(\"Could not retrieve formData length\"));\n resolve(length);\n });\n });\n\n try {\n const response = await this.createClient(login, (b) => {\n b.withMultiPartFormData()\n .withTimeout(this.settingsStore.getTimeoutSettings().apiUploadTimeout)\n .withHeaders({\n ...formData.getHeaders(),\n \"Content-Length\": result.toString(),\n })\n .withOnUploadProgress((p) => {\n if (progressToken) {\n this.eventEmitter2.emit(`${uploadProgressEvent(progressToken)}`, progressToken, p);\n }\n });\n }).post(`server/files/upload`, formData);\n\n if (progressToken) {\n this.eventEmitter2.emit(`${uploadDoneEvent(progressToken)}`, progressToken);\n }\n\n return response.data;\n } catch (e: any) {\n if (progressToken) {\n this.eventEmitter2.emit(`${uploadFailedEvent(progressToken)}`, progressToken, (e as AxiosError)?.message);\n }\n let data;\n try {\n data = JSON.parse(e.response?.body);\n } catch {\n data = e.response?.body;\n }\n throw new ExternalServiceError(\n {\n error: e.message,\n statusCode: e.response?.statusCode,\n data,\n success: false,\n stack: e.stack,\n },\n \"Moonraker\",\n );\n }\n }\n\n async deleteServerFile(login: LoginDto, root: string, path: string) {\n const url = `server/files/${root}/${path}`;\n return this.createClient(login).delete<ResultDto<ServerFileDirectoryActionDto>>(url);\n }\n\n async getServerFileKlippyLogDownload(login: LoginDto) {\n return this.createClient(login).get<string>(`server/files/klippy.log`);\n }\n\n async getServerFileMoonrakerLogDownload(login: LoginDto) {\n return this.createClient(login).get<string>(`server/files/moonraker.log`);\n }\n\n async postAccessLoginUser(\n login: LoginDto,\n username: string,\n password: string,\n source: \"ldap\" | \"moonraker\" = \"moonraker\",\n ) {\n return this.createClient(login).post<ResultDto<AccessLoginResultDto>>(\"/access/login\", {\n username,\n password,\n source,\n });\n }\n\n async postAccessLogoutUser(login: LoginDto) {\n // requires a bearer mechanism\n return this.createClient(login).post<ResultDto<AccessUserResultDto>>(`access/logout`);\n }\n\n async getAccessUser(login: LoginDto) {\n // requires a bearer mechanism\n return this.createClient(login).get<ResultDto<AccessUserDto>>(`access/user`);\n }\n\n async postAccessCreateUser(login: LoginDto, username: string, password: string) {\n return this.createClient(login).post<ResultDto<AccessLoginResultDto>>(`access/login`, {\n username,\n password,\n });\n }\n\n async deleteAccessUser(login: LoginDto, username: string) {\n return this.createClient(login).delete<ResultDto<AccessUserResultDto>>(`access/user`, {\n data: {\n username,\n },\n });\n }\n\n async listAccessUsers(login: LoginDto) {\n // requires a bearer mechanism\n return this.createClient(login).get<ResultDto<AccessUserDto[]>>(`access/user/list`);\n }\n\n async postAccessResetPassword(login: LoginDto, refresh_token: string) {\n return this.createClient(login).post<ResultDto<AccessLoginRefreshDto>>(`access/refresh_jwt`, {\n refresh_token,\n });\n }\n\n async getAccessOneshotToken(login: LoginDto) {\n return this.createClient(login).get<ResultDto<string>>(`access/oneshot_token`);\n }\n\n async getAccessInfo(login: LoginDto) {\n return this.createClient(login).get<ResultDto<AccessInfoDto>>(`access/info`);\n }\n\n async getAccessApiKey(login: LoginDto) {\n return this.createClient(login).get<ResultDto<string>>(`access/api_key`);\n }\n\n async postAccessApiKeyCreate(login: LoginDto) {\n return this.createClient(login).post<ResultDto<string>>(`access/api_key`);\n }\n\n async getDatabaseNamespaceList(login: LoginDto) {\n return this.createClient(login).get<ResultDto<DatabaseNamespaceListDto>>(`database/list`);\n }\n\n async getDatabaseNamespaceItem(login: LoginDto, namespace: Namespaces, key: string) {\n return this.createClient(login).get<ResultDto<DatabaseNamespaceItemDto>>(\n `database/item?namespace=${namespace}&key=${key}`,\n );\n }\n\n async postDatabaseNamespaceItem(\n login: LoginDto,\n namespace: Namespaces,\n key: string,\n value: any,\n typeHint?: \"int\" | \"str\" | \"bool\" | \"json\",\n ) {\n const typeHintParam = typeHint?.length ? `:${typeHint}` : \"\";\n return this.createClient(login).post<ResultDto<DatabaseNamespaceItemDto>>(\n `database/item?namespace=${namespace}&key=${key}&value${typeHintParam}=${value}`,\n );\n }\n\n async deleteDatabaseNamespaceItem(login: LoginDto, namespace: Namespaces, key: string) {\n return this.createClient(login).delete<ResultDto<DatabaseNamespaceItemDto>>(\n `database/item?namespace=${namespace}&key=${key}`,\n );\n }\n\n async getJobQueueStatus(login: LoginDto) {\n return this.createClient(login).get<ResultDto<JobQueueStatusDto>>(`job_queue/status`);\n }\n\n async postJobQueueJob(login: LoginDto, filenames: string[], reset: boolean) {\n // Alternatively param based with comma separated filenames: \"POST /server/job_queue/job?filenames=job1.gcode,job2.gcode,subdir/job3.gcode\"\n return this.createClient(login).post<\n ResultDto<JobQueueStatusDto>,\n AxiosResponse<ResultDto<JobQueueStatusDto>>,\n EnqueueJobDto\n >(`job_queue/job`, {\n filenames,\n reset,\n });\n }\n\n async deleteJobQueueJob(login: LoginDto, jobIds: string[], all?: boolean) {\n const base = `job_queue/job`;\n const url = !!all ? `${base}?all=true` : `${base}?job_ids=${jobIds.join(\",\")}`;\n return this.createClient(login).delete<ResultDto<DatabaseNamespaceItemDto>>(url);\n }\n\n async postJobQueuePause(login: LoginDto) {\n return this.createClient(login).post<ResultDto<JobQueueStatusDto>>(`job_queue/pause`);\n }\n\n async postJobQueueStart(login: LoginDto) {\n return this.createClient(login).post<ResultDto<JobQueueStatusDto>>(`job_queue/start`);\n }\n\n async postJobQueueJump(login: LoginDto, jobId: string) {\n return this.createClient(login).post<ResultDto<JobQueueStatusDto>>(`job_queue/jump?job_id=${jobId}`);\n }\n\n async getAnnouncementsList(login: LoginDto, includeDismissed: boolean) {\n return this.createClient(login).get<ResultDto<AnnouncementListDto>>(\n `server/announcements/list?include_dismissed=${includeDismissed}`,\n );\n }\n\n async postAnnouncementsUpdate(login: LoginDto) {\n return this.createClient(login).post<ResultDto<AnnouncementListDto>>(`server/announcements/update`);\n }\n\n /**\n *\n * @param login\n * @param entryId The entry identifier (name). This field may contain forward slashes, so it should be url escaped when placed in the query string of an http request. This parameter is required.\n * @param wakeTime The time, in seconds, in which the entry's dismissed state will revert to false. This parameter is optional, if omitted the entry will be dismissed indefinitely.\n */\n async postAnnouncementsDismiss(login: LoginDto, entryId: string, wakeTime: number) {\n return this.createClient(login).post<ResultDto<AnnouncementEntryIdDto>>(\n `server/announcements/dismiss?entry_id=${encodeURIComponent(entryId)}&wake_time=${wakeTime}`,\n );\n }\n\n async getAnnouncementsFeeds(login: LoginDto) {\n return this.createClient(login).get<ResultDto<AnnouncementFeedsDto>>(`server/announcements/feeds`);\n }\n\n async postAnnouncementsFeedAdd(login: LoginDto, name: string) {\n return this.createClient(login).get<ResultDto<AnnouncementActionDto>>(`server/announcements/feeds?name=${name}`);\n }\n\n async deleteAnnouncementsFeedRemove(login: LoginDto, name: string) {\n return this.createClient(login).delete<ResultDto<AnnouncementActionDto>>(`server/announcements/feeds?name=${name}`);\n }\n\n async getWebcamList(login: LoginDto) {\n return this.createClient(login).get<ResultDto<WebcamListDto>>(`server/webcams/list`);\n }\n\n async getWebcamItem(login: LoginDto, uid?: string, name?: string) {\n const base = `server/webcams/get_item`;\n const url = !!uid?.length ? `${base}?uid=${uid}` : `${base}?name=${name}`;\n return this.createClient(login).get<ResultDto<WebcamItemDto>>(url);\n }\n\n async postWebcamItemUpdate(login: LoginDto, webcam: Omit<WebcamDto, \"source\">) {\n return this.createClient(login).post<ResultDto<WebcamItemDto>>(`server/webcams/post_item`, webcam);\n }\n\n async deleteWebcamItem(login: LoginDto, uid?: string, name?: string) {\n const base = `server/webcams/delete_item`;\n const url = !!uid?.length ? `${base}?uid=${uid}` : `${base}?name=${name}`;\n return this.createClient(login).get<ResultDto<WebcamItemDto>>(url);\n }\n\n async postWebcamTest(login: LoginDto, uid?: string, name?: string) {\n const base = `server/webcams/test`;\n const url = !!uid?.length ? `${base}?uid=${uid}` : `${base}?name=${name}`;\n return this.createClient(login).get<ResultDto<WebcamTestDto>>(url);\n }\n\n async getNotifierList(login: LoginDto) {\n return this.createClient(login).get<ResultDto<NotifierListDto>>(`server/notifiers/list`);\n }\n\n async postMachineUpdateStatus(login: LoginDto) {\n // Refresh parameter is deprecated over refresh endpoint\n return this.createClient(login).post<ResultDto<MachineUpdateStatusDto>>(`machine/update/status`);\n }\n\n async postMachineUpdateRefresh(login: LoginDto, name?: string | \"moonraker\" | \"klipper\") {\n const base = `machine/update/refresh`;\n const url = !!name ? `${base}` : `${base}?name=${name}`;\n return this.createClient(login).post<ResultDto<MachineUpdateStatusDto>>(url);\n }\n\n async postMachineUpdateFull(login: LoginDto) {\n // Order\n // system if enabled\n // All configured clients\n // Klipper\n // Moonraker\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`machine/update/full`);\n }\n\n async postMachineUpdateMoonraker(login: LoginDto) {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`machine/update/moonraker`);\n }\n\n async postMachineUpdateKlipper(login: LoginDto) {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`machine/update/klipper`);\n }\n\n async postMachineUpdateClient(login: LoginDto, name: string) {\n // [update_manager client client_name] sections (in config)\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`machine/update/client?name=${name}`);\n }\n\n async postMachineUpdateSystem(login: LoginDto) {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`machine/update/system`);\n }\n\n async postMachineUpdateRecover(login: LoginDto, name?: string | \"moonraker\" | \"klipper\", hard: boolean = false) {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(\n `machine/update/recover?name=${name}&hard=${hard}`,\n );\n }\n\n async postMachineUpdateRollback(login: LoginDto, name?: string | \"moonraker\" | \"klipper\") {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`machine/update/rollback?name=${name}`);\n }\n\n async getMachineDevicePowerDevices(login: LoginDto) {\n return this.createClient(login).get<ResultDto<MachineDevicePowerDevicesDto>>(`machine/device_power/devices`);\n }\n\n async getMachineDevicePowerDeviceState(login: LoginDto, device: string) {\n return this.createClient(login).get<ResultDto<MachineDevicePowerDeviceStateDto>>(\n `machine/device_power/device?device=${device}`,\n );\n }\n\n async postMachineDevicePowerDeviceState(login: LoginDto, device: string, action: \"on\" | \"off\" | \"toggle\") {\n return this.createClient(login).post<ResultDto<MachineDevicePowerDeviceStateDto>>(\n `machine/device_power/device?device=${device}&action=${action}`,\n );\n }\n\n async getMachineDevicePowerBatchDeviceState(login: LoginDto, devices: string[]) {\n return this.createClient(login).get<ResultDto<MachineDevicePowerDeviceStateDto>>(\n `machine/device_power/status?${devices.join(\"&\")}`,\n );\n }\n\n async postMachineDevicePowerBatchPowerOn(login: LoginDto, device: string) {\n return this.createClient(login).post<ResultDto<MachineDevicePowerDeviceStateDto>>(\n `machine/device_power/on?device=${device}`,\n );\n }\n\n async postMachineDevicePowerBatchPowerOff(login: LoginDto, device: string) {\n return this.createClient(login).post<ResultDto<MachineDevicePowerDeviceStateDto>>(\n `machine/device_power/off?device=${device}`,\n );\n }\n\n async getMachineWledStrips(login: LoginDto) {\n return this.createClient(login).get<ResultDto<MachineWledStripsDto>>(`machine/wled/strips`);\n }\n\n async getMachineWledStatuses(login: LoginDto, strips: string[]) {\n return this.createClient(login).get<ResultDto<MachineWledStripsDto>>(`machine/wled/status?${strips.join(\"&\")}`);\n }\n\n async postMachineWledPowerOn(login: LoginDto, strips: string[]) {\n return this.createClient(login).post<ResultDto<MachineWledStripsDto>>(`machine/wled/on?${strips.join(\"&\")}`);\n }\n\n async postMachineWledPowerOff(login: LoginDto, strips: string[]) {\n return this.createClient(login).post<ResultDto<MachineWledStripsDto>>(`machine/wled/off?${strips.join(\"&\")}`);\n }\n\n async postMachineWledPowerStripAction(login: LoginDto, strips: string[]) {\n return this.createClient(login).post<ResultDto<MachineWledStripsDto>>(`machine/wled/toggle?${strips.join(\"&\")}`);\n }\n\n async getMachineWledStripAction(\n login: LoginDto,\n strip: string,\n action: \"control\" | \"on\" | \"off\",\n controlParams: Record<string, number>,\n ) {\n const queryParams = Object.entries(controlParams)\n .map(([k, v]) => `${k}=${v}`)\n .join(\"&\");\n return this.createClient(login).get<ResultDto<MachineWledStripsDto>>(\n `machine/wled/strip?strip=${strip}&action=${action}&${queryParams}`,\n );\n }\n\n async getServerSensorsList(login: LoginDto) {\n return this.createClient(login).get<ResultDto<SensorListDto>>(`server/sensors/list`);\n }\n\n async getServerSensorItem(login: LoginDto, sensor: string) {\n return this.createClient(login).get<ResultDto<SensorDto>>(`server/sensors/info?sensor=${sensor}`);\n }\n\n async getServerSensorMeasurements(login: LoginDto, sensor: string) {\n return this.createClient(login).get<ResultDto<SensorsMeasurementsDto>>(\n `server/sensors/measurements?sensor=${sensor}`,\n );\n }\n\n async getServerSensorMeasurementsBatch(login: LoginDto) {\n return this.createClient(login).get<ResultDto<SensorsMeasurementsDto>>(`server/sensors/measurements`);\n }\n\n async getServerSpoolmanStatus(login: LoginDto) {\n return this.createClient(login).get<ResultDto<SpoolmanStatusDto>>(`server/spoolman/status`);\n }\n\n async postServerSpoolmanActiveSpool(login: LoginDto, spoolId: number) {\n return this.createClient(login).post<ResultDto<SpoolmanActiveSpoolDto>>(`server/spoolman/spool_id`, {\n spool_id: spoolId,\n });\n }\n\n async getServerSpoolmanActiveSpool(login: LoginDto) {\n return this.createClient(login).get<ResultDto<SpoolmanActiveSpoolDto>>(`server/spoolman/spool_id`);\n }\n\n async postServerSpoolmanProxyRequest<I, O>(login: LoginDto, body?: SpoolmanProxyRequestDto<I>) {\n // Spoolman v1 will not wrap responses! Errors are proxied directly.\n return this.createClient(login).post<\n SpoolmanResponseDto<O>,\n AxiosResponse<SpoolmanResponseDto<O>>,\n SpoolmanProxyRequestDto<I>\n >(`server/spoolman/proxy`, body);\n }\n\n /**\n * @description API might not be available in the future\n * @param login\n */\n async getApiVersion(login: LoginDto) {\n return this.createClient(login).get<ApiVersionDto>(`api/version`);\n }\n\n /**\n * @description API might not be available in the future\n * @param login\n */\n async getServerVersion(login: LoginDto) {\n return this.createClient(login).get<ServerVersionDto>(`api/server`);\n }\n\n /**\n * @description API might not be available in the future\n * @param login\n */\n async getApiLogin(login: LoginDto) {\n return this.createClient(login).get<ApiLoginDto>(`api/login`);\n }\n\n /**\n * @deprecated API might not be available in the future\n * @param login\n */\n async getApiSettings(login: LoginDto) {\n return this.createClient(login).get<ApiSettingsDto>(`api/settings`);\n }\n\n /**\n * @deprecated API might not be available in the future\n * @param login\n */\n async getApiJob(login: LoginDto) {\n return this.createClient(login).get<ApiJobDto>(`api/job`);\n }\n\n /**\n * @deprecated API might not be available in the future\n * @param login\n */\n async getApiPrinter(login: LoginDto) {\n return this.createClient(login).get<ApiPrinterDto>(`api/printer`);\n }\n\n /**\n * @deprecated API might not be available in the future\n * @param login\n * @param commands\n */\n async postApiPrinterCommand(login: LoginDto, commands: string[]) {\n return this.createClient(login).post<{}>(`api/command`, {\n commands,\n });\n }\n\n /**\n * @deprecated API might not be available in the future\n * @param login\n */\n async getApiProfiles(login: LoginDto) {\n return this.createClient(login).get<ApiProfilesDto>(`api/printerprofiles`);\n }\n\n async getServerHistoryList(\n login: LoginDto,\n limit: number,\n start: number,\n since?: number,\n before?: number,\n order: \"asc\" | \"desc\" = \"desc\",\n ) {\n let params = `limit=${limit}&start=${start}&order=${order}`;\n if (!!before || before === 0) {\n params += \"&before=\" + before;\n }\n if (!!since || since === 0) {\n params += \"&since=\" + since;\n }\n return this.createClient(login).get<ResultDto<HistoryListDto>>(`server/history/list?${params}`);\n }\n\n async getServerHistoryTotals(login: LoginDto) {\n return this.createClient(login).get<ResultDto<HistoryTotalsDto>>(`server/history/totals`);\n }\n\n async postServerHistoryResetTotals(login: LoginDto) {\n return this.createClient(login).post<ResultDto<HistoryLastTotalsDto>>(`server/history/reset_totals`);\n }\n\n async getServerHistoryJob(login: LoginDto, uid: string) {\n return this.createClient(login).get<ResultDto<HistoryJobDto>>(`server/history/job?uid=${uid}`);\n }\n\n async deleteServerHistoryJob(login: LoginDto, uid?: string) {\n const base = `server/history/job`;\n const url = !!uid?.length ? `${base}?uid=${uid}` : `${base}?all=true`;\n return this.createClient(login).get<ResultDto<string[]>>(url);\n }\n\n private convertToQueryString(query: Partial<Record<KnownPrinterObject, string[]>>): string {\n return Object.entries(query)\n .reduce((acc: string[], [key, value]) => {\n if (value.length > 0) {\n acc.push(`${key}=${value.join(\",\")}`);\n } else {\n acc.push(key);\n }\n return acc;\n }, [])\n .join(\"&\");\n }\n\n private createClient(login: LoginDto, buildFluentOptions?: (base: DefaultHttpClientBuilder) => void) {\n const baseAddress = login.printerURL;\n\n return this.createAnonymousClient(baseAddress, (o) => {\n if (buildFluentOptions) {\n buildFluentOptions(o);\n }\n });\n }\n\n private createAnonymousClient(baseAddress: string, buildFluentOptions?: (base: DefaultHttpClientBuilder) => void) {\n const builder = new DefaultHttpClientBuilder();\n\n return this.httpClientFactory.createClientWithBaseUrl(builder, baseAddress, (b) => {\n if (buildFluentOptions) {\n buildFluentOptions(b);\n }\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"moonraker.client.js","names":[],"sources":["../../../src/services/moonraker/moonraker.client.ts"],"sourcesContent":["import { AxiosError, AxiosResponse } from \"axios\";\nimport type { ServerInfoDto } from \"@/services/moonraker/dto/server/server-info.dto\";\nimport type { LoginDto } from \"@/services/interfaces/login.dto\";\nimport type { ResultDto } from \"./dto/rest/result.dto\";\nimport type { ServerConfigDto } from \"@/services/moonraker/dto/server/server-config.dto\";\nimport type { TemperatureStoreDto } from \"@/services/moonraker/dto/temperature-store.dto\";\nimport type { GcodeStoreDto } from \"@/services/moonraker/dto/gcode-store.dto\";\nimport type { ActionResultDto } from \"@/services/moonraker/dto/rest/action-result.dto\";\nimport type { PrinterInfoDto } from \"@/services/moonraker/dto/printer-info.dto\";\nimport { KnownPrinterObject, PrinterAvailableObjects } from \"@/services/moonraker/dto/objects/printer-objects-list.dto\";\nimport type { PrinterQueryEndstopsDto } from \"@/services/moonraker/dto/printer-query-endstops.dto\";\nimport type { GcodeHelpDto } from \"@/services/moonraker/dto/gcode-help.dto\";\nimport type { MachineSystemInfoDto } from \"@/services/moonraker/dto/machine/machine-system-info.dto\";\nimport type { ProcessStatsDto } from \"@/services/moonraker/dto/process-stats.dto\";\nimport type { SudoInfoDto } from \"@/services/moonraker/dto/sudo-info.dto\";\nimport type { SudoResponseDto } from \"@/services/moonraker/dto/sudo-response.dto\";\nimport type { MachinePeripheralsUsbDto } from \"@/services/moonraker/dto/machine/machine-peripherals-usb.dto\";\nimport type { MachinePeripheralsSerialDto } from \"@/services/moonraker/dto/machine/machine-peripherals-serial.dto\";\nimport type { MachinePeripheralsVideoDto } from \"@/services/moonraker/dto/machine/machine-peripherals-video.dto\";\nimport type { MachinePeripheralsCanbusDto } from \"@/services/moonraker/dto/machine/machine-peripherals-canbus.dto\";\nimport type { ServerFileDto } from \"@/services/moonraker/dto/server-files/server-file.dto\";\nimport type { ServerFileRootDto } from \"@/services/moonraker/dto/server-files/server-file-root.dto\";\nimport type { ServerFileMetadataDto } from \"@/services/moonraker/dto/server-files/server-file-metadata.dto\";\nimport type { ServerFileThumbnailDto } from \"@/services/moonraker/dto/server-files/server-file-thumbnail.dto\";\nimport type { ServerFileDirectoryInfoDto } from \"@/services/moonraker/dto/server-files/server-file-directory-info.dto\";\nimport {\n ServerFileDirectoryActionDto,\n ServerFileDirectoryMovedDto,\n} from \"@/services/moonraker/dto/server-files/server-file-directory-action.dto\";\nimport type { ServerFileZipActionDto } from \"@/services/moonraker/dto/server-files/server-file-zip-action.dto\";\nimport FormData from \"form-data\";\nimport { uploadDoneEvent, uploadFailedEvent, uploadProgressEvent } from \"@/constants/event.constants\";\nimport EventEmitter2 from \"eventemitter2\";\nimport type { AccessLoginResultDto } from \"@/services/moonraker/dto/access/access-login-result.dto\";\nimport type { AccessUserResultDto } from \"@/services/moonraker/dto/access/access-user-result.dto\";\nimport type { AccessUserDto } from \"@/services/moonraker/dto/access/access-user.dto\";\nimport type { AccessLoginRefreshDto } from \"@/services/moonraker/dto/access/access-login-refresh.dto\";\nimport type { AccessInfoDto } from \"@/services/moonraker/dto/access/access-info.dto\";\nimport {\n Namespaces,\n type DatabaseNamespaceListDto,\n} from \"@/services/moonraker/dto/database/database-namespace-list.dto\";\nimport type { DatabaseNamespaceItemDto } from \"@/services/moonraker/dto/database/database-namespace-item.dto\";\nimport type { JobQueueStatusDto } from \"@/services/moonraker/dto/job-queue/job-queue-status.dto\";\nimport type { EnqueueJobDto } from \"@/services/moonraker/dto/job-queue/enqueue-job.dto\";\nimport type { AnnouncementListDto } from \"@/services/moonraker/dto/server-announcements/announcement-list.dto\";\nimport type { AnnouncementEntryIdDto } from \"@/services/moonraker/dto/server-announcements/announcement-entry-id.dto\";\nimport type { AnnouncementFeedsDto } from \"@/services/moonraker/dto/server-announcements/announcement-feeds.dto\";\nimport type { AnnouncementActionDto } from \"@/services/moonraker/dto/server-announcements/announcement-action.dto\";\nimport type { WebcamDto, WebcamListDto } from \"@/services/moonraker/dto/server-webcams/webcam-list.dto\";\nimport type { WebcamItemDto } from \"@/services/moonraker/dto/server-webcams/webcam-item.dto\";\nimport type { WebcamTestDto } from \"@/services/moonraker/dto/server-webcams/webcam-test.dto\";\nimport type { NotifierListDto } from \"@/services/moonraker/dto/notifier-list.dto\";\nimport type { MachineUpdateStatusDto } from \"@/services/moonraker/dto/machine/machine-update-status.dto\";\nimport type { MachineDevicePowerDevicesDto } from \"@/services/moonraker/dto/machine/machine-device-power-devices.dto\";\nimport type { MachineDevicePowerDeviceStateDto } from \"@/services/moonraker/dto/machine/machine-device-power-device-state.dto\";\nimport type { MachineWledStripsDto } from \"@/services/moonraker/dto/machine/machine-wled-strips.dto\";\nimport type { JsonRpcResponseDto } from \"@/services/moonraker/dto/rpc/json-rpc-response.dto\";\nimport type { JsonRpcRequestDto } from \"@/services/moonraker/dto/rpc/json-rpc-request.dto\";\nimport type { SensorListDto } from \"@/services/moonraker/dto/server-sensors/sensor-list.dto\";\nimport type { SensorsMeasurementsDto } from \"@/services/moonraker/dto/server-sensors/sensor-measurements.dto\";\nimport type { SensorDto } from \"@/services/moonraker/dto/server-sensors/sensor-info.dto\";\nimport type { SpoolmanStatusDto } from \"@/services/moonraker/dto/spoolman/spoolman-status.dto\";\nimport type { SpoolmanActiveSpoolDto } from \"@/services/moonraker/dto/spoolman/spoolman-active-spool.dto\";\nimport type { SpoolmanProxyRequestDto } from \"@/services/moonraker/dto/spoolman/spoolman-proxy-request.dto\";\nimport type { SpoolmanResponseDto } from \"@/services/moonraker/dto/spoolman/spoolman-response.dto\";\nimport type { ApiVersionDto } from \"@/services/moonraker/dto/octoprint-compat/api-version.dto\";\nimport type { ServerVersionDto } from \"@/services/moonraker/dto/octoprint-compat/server-version.dto\";\nimport type { ApiLoginDto } from \"@/services/moonraker/dto/octoprint-compat/api-login.dto\";\nimport type { ApiSettingsDto } from \"@/services/moonraker/dto/octoprint-compat/api-settings.dto\";\nimport type { ApiJobDto } from \"@/services/moonraker/dto/octoprint-compat/api-job.dto\";\nimport type { ApiPrinterDto } from \"@/services/moonraker/dto/octoprint-compat/api-printer.dto\";\nimport type { ApiProfilesDto } from \"@/services/moonraker/dto/octoprint-compat/api-profiles.dto\";\nimport type { HistoryListDto } from \"@/services/moonraker/dto/server-history/history-list.dto\";\nimport type { HistoryTotalsDto } from \"@/services/moonraker/dto/server-history/history-totals.dto\";\nimport type { HistoryLastTotalsDto } from \"@/services/moonraker/dto/server-history/history-last-totals.dto\";\nimport type { HistoryJobDto } from \"@/services/moonraker/dto/server-history/history-job.dto\";\nimport type { PrinterObjectsQueryDto } from \"@/services/moonraker/dto/objects/printer-objects-query.dto\";\nimport { DefaultHttpClientBuilder } from \"@/shared/default-http-client.builder\";\nimport { HttpClientFactory } from \"@/services/core/http-client.factory\";\nimport { LoggerService } from \"@/handlers/logger\";\nimport type { ILoggerFactory } from \"@/handlers/logger-factory\";\nimport { ExternalServiceError } from \"@/exceptions/runtime.exceptions\";\nimport { SettingsStore } from \"@/state/settings.store\";\n\nexport class MoonrakerClient {\n protected logger: LoggerService;\n\n constructor(\n loggerFactory: ILoggerFactory,\n private readonly httpClientFactory: HttpClientFactory,\n private readonly eventEmitter2: EventEmitter2,\n private readonly settingsStore: SettingsStore,\n ) {\n this.logger = loggerFactory(MoonrakerClient.name);\n }\n\n async getServerInfo(login: LoginDto) {\n return this.createClient(login).get<ResultDto<ServerInfoDto>>(\"/server/info\");\n }\n\n async getServerConfig(login: LoginDto) {\n return this.createClient(login).get<ResultDto<ServerConfigDto>>(\"/server/config\");\n }\n\n async getTemperatureStore(login: LoginDto, includeMonitors: boolean = false) {\n return this.createClient(login).get<ResultDto<TemperatureStoreDto>>(\n `/server/temperature_store?include_monitors=${!!includeMonitors}`,\n );\n }\n\n async getGcodeStore(login: LoginDto, count: number = 100) {\n return this.createClient(login).get<ResultDto<GcodeStoreDto>>(`/server/gcode_store?count=${count}`);\n }\n\n async postRolloverLogs(login: LoginDto, application: \"moonraker\" | \"klipper\" | \"\" = \"\") {\n return this.createClient(login).post<ResultDto<GcodeStoreDto>>(`server/logs/rollover`, { application });\n }\n\n async postRestartServer(login: LoginDto) {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`server/restart`);\n }\n\n async postJsonRpc<I, O>(login: LoginDto, method: string, params?: I, id?: number) {\n return this.createClient(login).post<\n JsonRpcResponseDto<O>,\n AxiosResponse<JsonRpcResponseDto<O>>,\n JsonRpcRequestDto<I>\n >(`server/jsonrpc`, {\n jsonrpc: \"2.0\",\n id: id ? id : 0,\n method,\n params,\n });\n }\n\n async getPrinterInfo(login: LoginDto) {\n return this.createClient(login).post<ResultDto<PrinterInfoDto>>(`printer/info`);\n }\n\n async postQuickStop(login: LoginDto) {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`printer/emergency_stop`);\n }\n\n async postHostRestart(login: LoginDto) {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`printer/restart`);\n }\n\n async postFirmwareRestart(login: LoginDto) {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`printer/firmware_restart`);\n }\n\n async getPrinterObjectsList(login: LoginDto) {\n return this.createClient(login).get<ResultDto<PrinterAvailableObjects>>(`printer/objects/list`);\n }\n\n async getPrinterObjectsQuery<R = PrinterObjectsQueryDto>(\n login: LoginDto,\n query: Partial<Record<KnownPrinterObject, string[]>>,\n ) {\n const queryString = this.convertToQueryString(query);\n return this.createClient(login).get<ResultDto<R>>(`printer/objects/query?${queryString}`);\n }\n\n postSubscribePrinterObjects<R = PrinterObjectsQueryDto>(\n login: LoginDto,\n connectionId: number,\n query: Partial<Record<KnownPrinterObject, string[]>>,\n ) {\n const queryString = this.convertToQueryString(query);\n return this.createClient(login).post<ResultDto<R>>(\n `printer/objects/subscribe?connection_id=${connectionId}&${queryString}`,\n );\n }\n\n async getPrinterQueryEndstops(login: LoginDto) {\n return this.createClient(login).get<ResultDto<PrinterQueryEndstopsDto>>(`printer/query-endstops`);\n }\n\n async postGcodeScript(login: LoginDto, script: string = \"G28\") {\n return this.createClient(login).get<ResultDto<ActionResultDto>>(`printer/gcode/script?script=${script}`);\n }\n\n async getGcodeHelp(login: LoginDto) {\n return this.createClient(login).get<ResultDto<GcodeHelpDto>>(`printer/gcode/help`);\n }\n\n async postPrintStart(login: LoginDto, filename: string) {\n // will throw 400 if SD busy\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`printer/print/start?filename=${filename}`);\n }\n\n async postPrintPause(login: LoginDto) {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`printer/print/pause`);\n }\n\n async postPrintResume(login: LoginDto) {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`printer/print/resume`);\n }\n\n async postPrintCancel(login: LoginDto) {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`printer/print/cancel`);\n }\n\n async getMachineSystemInfo(login: LoginDto) {\n return this.createClient(login).get<ResultDto<MachineSystemInfoDto>>(`machine/system_info`);\n }\n\n async postMachineShutdown(login: LoginDto) {\n // Will result in error.\n return this.createClient(login).post<null>(`machine/shutdown`);\n }\n\n async postMachineReboot(login: LoginDto) {\n // Will result in error.\n return this.createClient(login).post<null>(`machine/reboot`);\n }\n\n async postMachineRestartService(\n login: LoginDto,\n service:\n | \"crowsnest\"\n | \"MoonCord\"\n | \"moonraker\"\n | \"moonraker-telegram-bot\"\n | \"klipper\"\n | \"KlipperScreen\"\n | \"sonar\"\n | \"webcamd\",\n ) {\n // Can result in 500 if klipper fails to start\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`machine/services/restart?service=${service}`);\n }\n\n async postMachineStartService(login: LoginDto, service: \"webcamd\" | \"klipper\") {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`machine/services/restart?service=${service}`);\n }\n\n async postMachineProcessStats(login: LoginDto) {\n // Will result in error.\n return this.createClient(login).post<ResultDto<ProcessStatsDto>>(`machine/proc_stats`);\n }\n\n async getMachineSudoInfo(login: LoginDto, checkAccess: boolean = false) {\n return this.createClient(login).get<ResultDto<SudoInfoDto>>(`machine/sudo/info?check_access=${checkAccess}`);\n }\n\n async postMachineSetSudoPassword(login: LoginDto, password: string) {\n // Does not persist across reboots\n return this.createClient(login).post<ResultDto<SudoResponseDto>>(`machine/sudo/password`, {\n password,\n });\n }\n\n async getMachineListPeripheralsUsb(login: LoginDto) {\n return this.createClient(login).get<ResultDto<MachinePeripheralsUsbDto>>(`machine/peripherals/usb`);\n }\n\n async getMachineListPeripheralsSerial(login: LoginDto) {\n return this.createClient(login).get<ResultDto<MachinePeripheralsSerialDto>>(`machine/peripherals/serial`);\n }\n\n async getMachineListPeripheralsVideo(login: LoginDto) {\n return this.createClient(login).get<ResultDto<MachinePeripheralsVideoDto>>(`machine/peripherals/video`);\n }\n\n async getMachineListPeripheralsCanbus(login: LoginDto, canInterface: \"can0\" | \"can1\" | string = \"can0\") {\n return this.createClient(login).get<ResultDto<MachinePeripheralsCanbusDto>>(\n `machine/peripherals/canbus?interface=${canInterface}`,\n );\n }\n\n async getServerFilesList(login: LoginDto, rootFolder = \"\") {\n const paramString = rootFolder?.length ? `?root=${rootFolder}` : \"\";\n return this.createClient(login).get<ResultDto<ServerFileDto[]>>(`server/files/list${paramString}`);\n }\n\n async getServerFilesRoots(login: LoginDto) {\n return this.createClient(login).get<ResultDto<ServerFileRootDto[]>>(`server/files/roots`);\n }\n\n async getServerFileMetadata(login: LoginDto, filename: string) {\n return this.createClient(login).get<ResultDto<ServerFileMetadataDto>>(`server/files/metadata?filename=${filename}`);\n }\n\n async getServerFileMetadataScan(login: LoginDto, filename: string) {\n return this.createClient(login).get<ResultDto<ServerFileMetadataDto>>(`server/files/metascan?filename=${filename}`);\n }\n\n async getServerFilesThumbnails(login: LoginDto, filename: string) {\n return this.createClient(login).get<ResultDto<ServerFileThumbnailDto[]>>(\n `server/files/thumbnails?filename=${filename}`,\n );\n }\n\n async getServerFilesDirectoryInfo(login: LoginDto, path: string, extended: boolean) {\n return this.createClient(login).get<ResultDto<ServerFileDirectoryInfoDto>>(\n `server/files/directory?path=${path}&extended=${extended}`,\n );\n }\n\n async postServerFilesDirectory(login: LoginDto, path: string) {\n return this.createClient(login).post<ResultDto<ServerFileDirectoryActionDto>>(`server/files/directory`, {\n path,\n });\n }\n\n async deleteServerFilesDirectory(login: LoginDto, path: string, force: boolean) {\n return this.createClient(login).delete<ResultDto<ServerFileDirectoryActionDto>>(\n `server/files/directory?path=${path}&force=${!!force}`,\n );\n }\n\n async postServerFilesMove(login: LoginDto, source: string, dest: string) {\n return this.createClient(login).post<ResultDto<ServerFileDirectoryMovedDto>>(`server/files/directory`, {\n source,\n dest,\n });\n }\n\n async postServerFilesCopy(login: LoginDto, source: string, dest: string) {\n return this.createClient(login).post<ResultDto<ServerFileDirectoryActionDto>>(`server/files/copy`, {\n source,\n dest,\n });\n }\n\n async postServerFilesZip(login: LoginDto, items: string[], dest: string, store_only: boolean) {\n return this.createClient(login).post<ResultDto<ServerFileZipActionDto>>(`server/files/zip`, {\n items,\n store_only,\n dest,\n });\n }\n\n async getServerFilesDownload(login: LoginDto, root: string, filename: string) {\n return await this.createClient(login).get<NodeJS.ReadableStream>(`server/files/${root}/${filename}`, {\n responseType: \"stream\",\n });\n }\n\n async getServerFilesDownloadChunk(\n login: LoginDto,\n root: string,\n filename: string,\n startBytes: number,\n endBytes: number,\n ) {\n return await this.createClient(login).get<string>(`server/files/${root}/${filename}`, {\n headers: {\n Range: `bytes=${startBytes}-${endBytes}`,\n },\n });\n }\n\n async postServerFileUpload(\n login: LoginDto,\n stream: NodeJS.ReadableStream,\n fileName: string,\n contentLength: number,\n startPrint: boolean,\n progressToken?: string,\n root?: string,\n path?: string,\n checksum?: string,\n ) {\n const formData = new FormData();\n if (root?.length) {\n formData.append(\"root\", root);\n }\n if (path?.length) {\n formData.append(\"path\", path);\n }\n if (checksum?.length) {\n formData.append(\"checksum\", checksum);\n }\n if (startPrint) {\n formData.append(\"print\", \"true\");\n }\n\n formData.append(\"file\", stream, { filename: fileName, knownLength: contentLength });\n\n // Calculate the header that axios uses to determine progress\n const result: number = await new Promise<number>((resolve, reject) => {\n return formData.getLength((err, length) => {\n if (err) reject(new Error(\"Could not retrieve formData length\"));\n resolve(length);\n });\n });\n\n try {\n const response = await this.createClient(login, (b) => {\n b.withMultiPartFormData()\n .withTimeout(this.settingsStore.getTimeoutSettings().apiUploadTimeout)\n .withHeaders({\n ...formData.getHeaders(),\n \"Content-Length\": result.toString(),\n })\n .withOnUploadProgress((p) => {\n if (progressToken) {\n this.eventEmitter2.emit(`${uploadProgressEvent(progressToken)}`, progressToken, p);\n }\n });\n }).post(`server/files/upload`, formData);\n\n if (progressToken) {\n this.eventEmitter2.emit(`${uploadDoneEvent(progressToken)}`, progressToken);\n }\n\n return response.data;\n } catch (e: any) {\n if (progressToken) {\n this.eventEmitter2.emit(`${uploadFailedEvent(progressToken)}`, progressToken, (e as AxiosError)?.message);\n }\n let data;\n try {\n data = JSON.parse(e.response?.body);\n } catch {\n data = e.response?.body;\n }\n throw new ExternalServiceError(\n {\n error: e.message,\n statusCode: e.response?.statusCode,\n data,\n success: false,\n stack: e.stack,\n },\n \"Moonraker\",\n );\n }\n }\n\n async deleteServerFile(login: LoginDto, root: string, path: string) {\n const url = `server/files/${root}/${path}`;\n return this.createClient(login).delete<ResultDto<ServerFileDirectoryActionDto>>(url);\n }\n\n async getServerFileKlippyLogDownload(login: LoginDto) {\n return this.createClient(login).get<string>(`server/files/klippy.log`);\n }\n\n async getServerFileMoonrakerLogDownload(login: LoginDto) {\n return this.createClient(login).get<string>(`server/files/moonraker.log`);\n }\n\n async postAccessLoginUser(\n login: LoginDto,\n username: string,\n password: string,\n source: \"ldap\" | \"moonraker\" = \"moonraker\",\n ) {\n return this.createClient(login).post<ResultDto<AccessLoginResultDto>>(\"/access/login\", {\n username,\n password,\n source,\n });\n }\n\n async postAccessLogoutUser(login: LoginDto) {\n // requires a bearer mechanism\n return this.createClient(login).post<ResultDto<AccessUserResultDto>>(`access/logout`);\n }\n\n async getAccessUser(login: LoginDto) {\n // requires a bearer mechanism\n return this.createClient(login).get<ResultDto<AccessUserDto>>(`access/user`);\n }\n\n async postAccessCreateUser(login: LoginDto, username: string, password: string) {\n return this.createClient(login).post<ResultDto<AccessLoginResultDto>>(`access/login`, {\n username,\n password,\n });\n }\n\n async deleteAccessUser(login: LoginDto, username: string) {\n return this.createClient(login).delete<ResultDto<AccessUserResultDto>>(`access/user`, {\n data: {\n username,\n },\n });\n }\n\n async listAccessUsers(login: LoginDto) {\n // requires a bearer mechanism\n return this.createClient(login).get<ResultDto<AccessUserDto[]>>(`access/user/list`);\n }\n\n async postAccessResetPassword(login: LoginDto, refresh_token: string) {\n return this.createClient(login).post<ResultDto<AccessLoginRefreshDto>>(`access/refresh_jwt`, {\n refresh_token,\n });\n }\n\n async getAccessOneshotToken(login: LoginDto) {\n return this.createClient(login).get<ResultDto<string>>(`access/oneshot_token`);\n }\n\n async getAccessInfo(login: LoginDto) {\n return this.createClient(login).get<ResultDto<AccessInfoDto>>(`access/info`);\n }\n\n async getAccessApiKey(login: LoginDto) {\n return this.createClient(login).get<ResultDto<string>>(`access/api_key`);\n }\n\n async postAccessApiKeyCreate(login: LoginDto) {\n return this.createClient(login).post<ResultDto<string>>(`access/api_key`);\n }\n\n async getDatabaseNamespaceList(login: LoginDto) {\n return this.createClient(login).get<ResultDto<DatabaseNamespaceListDto>>(`database/list`);\n }\n\n async getDatabaseNamespaceItem(login: LoginDto, namespace: Namespaces, key: string) {\n return this.createClient(login).get<ResultDto<DatabaseNamespaceItemDto>>(\n `database/item?namespace=${namespace}&key=${key}`,\n );\n }\n\n async postDatabaseNamespaceItem(\n login: LoginDto,\n namespace: Namespaces,\n key: string,\n value: any,\n typeHint?: \"int\" | \"str\" | \"bool\" | \"json\",\n ) {\n const typeHintParam = typeHint?.length ? `:${typeHint}` : \"\";\n return this.createClient(login).post<ResultDto<DatabaseNamespaceItemDto>>(\n `database/item?namespace=${namespace}&key=${key}&value${typeHintParam}=${value}`,\n );\n }\n\n async deleteDatabaseNamespaceItem(login: LoginDto, namespace: Namespaces, key: string) {\n return this.createClient(login).delete<ResultDto<DatabaseNamespaceItemDto>>(\n `database/item?namespace=${namespace}&key=${key}`,\n );\n }\n\n async getJobQueueStatus(login: LoginDto) {\n return this.createClient(login).get<ResultDto<JobQueueStatusDto>>(`job_queue/status`);\n }\n\n async postJobQueueJob(login: LoginDto, filenames: string[], reset: boolean) {\n // Alternatively param based with comma separated filenames: \"POST /server/job_queue/job?filenames=job1.gcode,job2.gcode,subdir/job3.gcode\"\n return this.createClient(login).post<\n ResultDto<JobQueueStatusDto>,\n AxiosResponse<ResultDto<JobQueueStatusDto>>,\n EnqueueJobDto\n >(`job_queue/job`, {\n filenames,\n reset,\n });\n }\n\n async deleteJobQueueJob(login: LoginDto, jobIds: string[], all?: boolean) {\n const base = `job_queue/job`;\n const url = !!all ? `${base}?all=true` : `${base}?job_ids=${jobIds.join(\",\")}`;\n return this.createClient(login).delete<ResultDto<DatabaseNamespaceItemDto>>(url);\n }\n\n async postJobQueuePause(login: LoginDto) {\n return this.createClient(login).post<ResultDto<JobQueueStatusDto>>(`job_queue/pause`);\n }\n\n async postJobQueueStart(login: LoginDto) {\n return this.createClient(login).post<ResultDto<JobQueueStatusDto>>(`job_queue/start`);\n }\n\n async postJobQueueJump(login: LoginDto, jobId: string) {\n return this.createClient(login).post<ResultDto<JobQueueStatusDto>>(`job_queue/jump?job_id=${jobId}`);\n }\n\n async getAnnouncementsList(login: LoginDto, includeDismissed: boolean) {\n return this.createClient(login).get<ResultDto<AnnouncementListDto>>(\n `server/announcements/list?include_dismissed=${includeDismissed}`,\n );\n }\n\n async postAnnouncementsUpdate(login: LoginDto) {\n return this.createClient(login).post<ResultDto<AnnouncementListDto>>(`server/announcements/update`);\n }\n\n /**\n *\n * @param login\n * @param entryId The entry identifier (name). This field may contain forward slashes, so it should be url escaped when placed in the query string of an http request. This parameter is required.\n * @param wakeTime The time, in seconds, in which the entry's dismissed state will revert to false. This parameter is optional, if omitted the entry will be dismissed indefinitely.\n */\n async postAnnouncementsDismiss(login: LoginDto, entryId: string, wakeTime: number) {\n return this.createClient(login).post<ResultDto<AnnouncementEntryIdDto>>(\n `server/announcements/dismiss?entry_id=${encodeURIComponent(entryId)}&wake_time=${wakeTime}`,\n );\n }\n\n async getAnnouncementsFeeds(login: LoginDto) {\n return this.createClient(login).get<ResultDto<AnnouncementFeedsDto>>(`server/announcements/feeds`);\n }\n\n async postAnnouncementsFeedAdd(login: LoginDto, name: string) {\n return this.createClient(login).get<ResultDto<AnnouncementActionDto>>(`server/announcements/feeds?name=${name}`);\n }\n\n async deleteAnnouncementsFeedRemove(login: LoginDto, name: string) {\n return this.createClient(login).delete<ResultDto<AnnouncementActionDto>>(`server/announcements/feeds?name=${name}`);\n }\n\n async getWebcamList(login: LoginDto) {\n return this.createClient(login).get<ResultDto<WebcamListDto>>(`server/webcams/list`);\n }\n\n async getWebcamItem(login: LoginDto, uid?: string, name?: string) {\n const base = `server/webcams/get_item`;\n const url = !!uid?.length ? `${base}?uid=${uid}` : `${base}?name=${name}`;\n return this.createClient(login).get<ResultDto<WebcamItemDto>>(url);\n }\n\n async postWebcamItemUpdate(login: LoginDto, webcam: Omit<WebcamDto, \"source\">) {\n return this.createClient(login).post<ResultDto<WebcamItemDto>>(`server/webcams/post_item`, webcam);\n }\n\n async deleteWebcamItem(login: LoginDto, uid?: string, name?: string) {\n const base = `server/webcams/delete_item`;\n const url = !!uid?.length ? `${base}?uid=${uid}` : `${base}?name=${name}`;\n return this.createClient(login).get<ResultDto<WebcamItemDto>>(url);\n }\n\n async postWebcamTest(login: LoginDto, uid?: string, name?: string) {\n const base = `server/webcams/test`;\n const url = !!uid?.length ? `${base}?uid=${uid}` : `${base}?name=${name}`;\n return this.createClient(login).get<ResultDto<WebcamTestDto>>(url);\n }\n\n async getNotifierList(login: LoginDto) {\n return this.createClient(login).get<ResultDto<NotifierListDto>>(`server/notifiers/list`);\n }\n\n async postMachineUpdateStatus(login: LoginDto) {\n // Refresh parameter is deprecated over refresh endpoint\n return this.createClient(login).post<ResultDto<MachineUpdateStatusDto>>(`machine/update/status`);\n }\n\n async postMachineUpdateRefresh(login: LoginDto, name?: string | \"moonraker\" | \"klipper\") {\n const base = `machine/update/refresh`;\n const url = !!name ? `${base}` : `${base}?name=${name}`;\n return this.createClient(login).post<ResultDto<MachineUpdateStatusDto>>(url);\n }\n\n async postMachineUpdateFull(login: LoginDto) {\n // Order\n // system if enabled\n // All configured clients\n // Klipper\n // Moonraker\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`machine/update/full`);\n }\n\n async postMachineUpdateMoonraker(login: LoginDto) {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`machine/update/moonraker`);\n }\n\n async postMachineUpdateKlipper(login: LoginDto) {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`machine/update/klipper`);\n }\n\n async postMachineUpdateClient(login: LoginDto, name: string) {\n // [update_manager client client_name] sections (in config)\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`machine/update/client?name=${name}`);\n }\n\n async postMachineUpdateSystem(login: LoginDto) {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`machine/update/system`);\n }\n\n async postMachineUpdateRecover(login: LoginDto, name?: string | \"moonraker\" | \"klipper\", hard: boolean = false) {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(\n `machine/update/recover?name=${name}&hard=${hard}`,\n );\n }\n\n async postMachineUpdateRollback(login: LoginDto, name?: string | \"moonraker\" | \"klipper\") {\n return this.createClient(login).post<ResultDto<ActionResultDto>>(`machine/update/rollback?name=${name}`);\n }\n\n async getMachineDevicePowerDevices(login: LoginDto) {\n return this.createClient(login).get<ResultDto<MachineDevicePowerDevicesDto>>(`machine/device_power/devices`);\n }\n\n async getMachineDevicePowerDeviceState(login: LoginDto, device: string) {\n return this.createClient(login).get<ResultDto<MachineDevicePowerDeviceStateDto>>(\n `machine/device_power/device?device=${device}`,\n );\n }\n\n async postMachineDevicePowerDeviceState(login: LoginDto, device: string, action: \"on\" | \"off\" | \"toggle\") {\n return this.createClient(login).post<ResultDto<MachineDevicePowerDeviceStateDto>>(\n `machine/device_power/device?device=${device}&action=${action}`,\n );\n }\n\n async getMachineDevicePowerBatchDeviceState(login: LoginDto, devices: string[]) {\n return this.createClient(login).get<ResultDto<MachineDevicePowerDeviceStateDto>>(\n `machine/device_power/status?${devices.join(\"&\")}`,\n );\n }\n\n async postMachineDevicePowerBatchPowerOn(login: LoginDto, device: string) {\n return this.createClient(login).post<ResultDto<MachineDevicePowerDeviceStateDto>>(\n `machine/device_power/on?device=${device}`,\n );\n }\n\n async postMachineDevicePowerBatchPowerOff(login: LoginDto, device: string) {\n return this.createClient(login).post<ResultDto<MachineDevicePowerDeviceStateDto>>(\n `machine/device_power/off?device=${device}`,\n );\n }\n\n async getMachineWledStrips(login: LoginDto) {\n return this.createClient(login).get<ResultDto<MachineWledStripsDto>>(`machine/wled/strips`);\n }\n\n async getMachineWledStatuses(login: LoginDto, strips: string[]) {\n return this.createClient(login).get<ResultDto<MachineWledStripsDto>>(`machine/wled/status?${strips.join(\"&\")}`);\n }\n\n async postMachineWledPowerOn(login: LoginDto, strips: string[]) {\n return this.createClient(login).post<ResultDto<MachineWledStripsDto>>(`machine/wled/on?${strips.join(\"&\")}`);\n }\n\n async postMachineWledPowerOff(login: LoginDto, strips: string[]) {\n return this.createClient(login).post<ResultDto<MachineWledStripsDto>>(`machine/wled/off?${strips.join(\"&\")}`);\n }\n\n async postMachineWledPowerStripAction(login: LoginDto, strips: string[]) {\n return this.createClient(login).post<ResultDto<MachineWledStripsDto>>(`machine/wled/toggle?${strips.join(\"&\")}`);\n }\n\n async getMachineWledStripAction(\n login: LoginDto,\n strip: string,\n action: \"control\" | \"on\" | \"off\",\n controlParams: Record<string, number>,\n ) {\n const queryParams = Object.entries(controlParams)\n .map(([k, v]) => `${k}=${v}`)\n .join(\"&\");\n return this.createClient(login).get<ResultDto<MachineWledStripsDto>>(\n `machine/wled/strip?strip=${strip}&action=${action}&${queryParams}`,\n );\n }\n\n async getServerSensorsList(login: LoginDto) {\n return this.createClient(login).get<ResultDto<SensorListDto>>(`server/sensors/list`);\n }\n\n async getServerSensorItem(login: LoginDto, sensor: string) {\n return this.createClient(login).get<ResultDto<SensorDto>>(`server/sensors/info?sensor=${sensor}`);\n }\n\n async getServerSensorMeasurements(login: LoginDto, sensor: string) {\n return this.createClient(login).get<ResultDto<SensorsMeasurementsDto>>(\n `server/sensors/measurements?sensor=${sensor}`,\n );\n }\n\n async getServerSensorMeasurementsBatch(login: LoginDto) {\n return this.createClient(login).get<ResultDto<SensorsMeasurementsDto>>(`server/sensors/measurements`);\n }\n\n async getServerSpoolmanStatus(login: LoginDto) {\n return this.createClient(login).get<ResultDto<SpoolmanStatusDto>>(`server/spoolman/status`);\n }\n\n async postServerSpoolmanActiveSpool(login: LoginDto, spoolId: number) {\n return this.createClient(login).post<ResultDto<SpoolmanActiveSpoolDto>>(`server/spoolman/spool_id`, {\n spool_id: spoolId,\n });\n }\n\n async getServerSpoolmanActiveSpool(login: LoginDto) {\n return this.createClient(login).get<ResultDto<SpoolmanActiveSpoolDto>>(`server/spoolman/spool_id`);\n }\n\n async postServerSpoolmanProxyRequest<I, O>(login: LoginDto, body?: SpoolmanProxyRequestDto<I>) {\n // Spoolman v1 will not wrap responses! Errors are proxied directly.\n return this.createClient(login).post<\n SpoolmanResponseDto<O>,\n AxiosResponse<SpoolmanResponseDto<O>>,\n SpoolmanProxyRequestDto<I>\n >(`server/spoolman/proxy`, body);\n }\n\n /**\n * @description API might not be available in the future\n * @param login\n */\n async getApiVersion(login: LoginDto) {\n return this.createClient(login).get<ApiVersionDto>(`api/version`);\n }\n\n /**\n * @description API might not be available in the future\n * @param login\n */\n async getServerVersion(login: LoginDto) {\n return this.createClient(login).get<ServerVersionDto>(`api/server`);\n }\n\n /**\n * @description API might not be available in the future\n * @param login\n */\n async getApiLogin(login: LoginDto) {\n return this.createClient(login).get<ApiLoginDto>(`api/login`);\n }\n\n /**\n * @deprecated API might not be available in the future\n * @param login\n */\n async getApiSettings(login: LoginDto) {\n return this.createClient(login).get<ApiSettingsDto>(`api/settings`);\n }\n\n /**\n * @deprecated API might not be available in the future\n * @param login\n */\n async getApiJob(login: LoginDto) {\n return this.createClient(login).get<ApiJobDto>(`api/job`);\n }\n\n /**\n * @deprecated API might not be available in the future\n * @param login\n */\n async getApiPrinter(login: LoginDto) {\n return this.createClient(login).get<ApiPrinterDto>(`api/printer`);\n }\n\n /**\n * @deprecated API might not be available in the future\n * @param login\n * @param commands\n */\n async postApiPrinterCommand(login: LoginDto, commands: string[]) {\n return this.createClient(login).post<{}>(`api/command`, {\n commands,\n });\n }\n\n /**\n * @deprecated API might not be available in the future\n * @param login\n */\n async getApiProfiles(login: LoginDto) {\n return this.createClient(login).get<ApiProfilesDto>(`api/printerprofiles`);\n }\n\n async getServerHistoryList(\n login: LoginDto,\n limit: number,\n start: number,\n since?: number,\n before?: number,\n order: \"asc\" | \"desc\" = \"desc\",\n ) {\n let params = `limit=${limit}&start=${start}&order=${order}`;\n if (!!before || before === 0) {\n params += \"&before=\" + before;\n }\n if (!!since || since === 0) {\n params += \"&since=\" + since;\n }\n return this.createClient(login).get<ResultDto<HistoryListDto>>(`server/history/list?${params}`);\n }\n\n async getServerHistoryTotals(login: LoginDto) {\n return this.createClient(login).get<ResultDto<HistoryTotalsDto>>(`server/history/totals`);\n }\n\n async postServerHistoryResetTotals(login: LoginDto) {\n return this.createClient(login).post<ResultDto<HistoryLastTotalsDto>>(`server/history/reset_totals`);\n }\n\n async getServerHistoryJob(login: LoginDto, uid: string) {\n return this.createClient(login).get<ResultDto<HistoryJobDto>>(`server/history/job?uid=${uid}`);\n }\n\n async deleteServerHistoryJob(login: LoginDto, uid?: string) {\n const base = `server/history/job`;\n const url = !!uid?.length ? `${base}?uid=${uid}` : `${base}?all=true`;\n return this.createClient(login).get<ResultDto<string[]>>(url);\n }\n\n private convertToQueryString(query: Partial<Record<KnownPrinterObject, string[]>>): string {\n return Object.entries(query)\n .reduce((acc: string[], [key, value]) => {\n if (value.length > 0) {\n acc.push(`${key}=${value.join(\",\")}`);\n } else {\n acc.push(key);\n }\n return acc;\n }, [])\n .join(\"&\");\n }\n\n private createClient(login: LoginDto, buildFluentOptions?: (base: DefaultHttpClientBuilder) => void) {\n const baseAddress = login.printerURL;\n\n return this.createAnonymousClient(baseAddress, (o) => {\n if (buildFluentOptions) {\n buildFluentOptions(o);\n }\n });\n }\n\n private createAnonymousClient(baseAddress: string, buildFluentOptions?: (base: DefaultHttpClientBuilder) => void) {\n const builder = new DefaultHttpClientBuilder();\n\n return this.httpClientFactory.createClientWithBaseUrl(builder, baseAddress, (b) => {\n if (buildFluentOptions) {\n buildFluentOptions(b);\n }\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"moonraker.api.js","names":[],"sources":["../../src/services/moonraker.api.ts"],"sourcesContent":["import {\n FileDto,\n IPrinterApi,\n MoonrakerType,\n PartialReprintFileDto,\n PrinterType,\n ReprintState,\n UploadFileInput,\n uploadFileInputSchema,\n} from \"@/services/printer-api.interface\";\nimport { MoonrakerClient } from \"@/services/moonraker/moonraker.client\";\nimport type { LoginDto } from \"@/services/interfaces/login.dto\";\nimport { NotImplementedException } from \"@/exceptions/runtime.exceptions\";\nimport { AxiosPromise } from \"axios\";\nimport type { PrinterObjectsQueryDto } from \"@/services/moonraker/dto/objects/printer-objects-query.dto\";\nimport { PrintStatsObject, WebhooksObject } from \"@/services/moonraker/dto/objects/printer-object.types\";\n\n/**\n * Moonraker Remote API\n * https://moonraker.readthedocs.io/en/latest/web_api/#query-server-info\n */\nexport class MoonrakerApi implements IPrinterApi {\n private readonly client: MoonrakerClient;\n\n constructor(\n moonrakerClient: MoonrakerClient,\n private printerLogin: LoginDto,\n ) {\n this.client = moonrakerClient;\n }\n\n get type(): PrinterType {\n return MoonrakerType;\n }\n\n /**\n * When no request scope is present, this setter is to be used before calling any function.\n * @param login\n */\n set login(login: LoginDto) {\n this.printerLogin = login;\n }\n\n get login() {\n return this.printerLogin;\n }\n\n async getVersion() {\n const result = await this.client.getApiVersion(this.login);\n return result.data?.server;\n }\n\n async validateConnection(): Promise<void> {\n await this.getVersion();\n }\n\n async connect() {\n // TODO Needs investigation\n throw new NotImplementedException();\n }\n\n async disconnect() {\n // TODO Needs investigation\n throw new NotImplementedException();\n }\n\n async restartServer() {\n await this.client.postRestartServer(this.login);\n }\n\n async restartHost() {\n await this.client.postHostRestart(this.login);\n }\n\n async restartPrinterFirmware() {\n await this.client.postFirmwareRestart(this.login);\n }\n\n async startPrint(filename: string) {\n await this.client.postPrintStart(this.login, filename);\n }\n\n async pausePrint(): Promise<void> {\n await this.client.postPrintPause(this.login);\n }\n\n async resumePrint(): Promise<void> {\n await this.client.postPrintResume(this.login);\n }\n\n async cancelPrint(): Promise<void> {\n await this.client.postPrintCancel(this.login);\n }\n\n async sendGcode(script: string): Promise<void> {\n await this.client.postGcodeScript(this.login, script);\n }\n\n async quickStop(): Promise<void> {\n await this.client.postQuickStop(this.login);\n }\n\n async movePrintHead(amounts: { x?: number; y?: number; z?: number; speed?: number }) {\n // Compare to https://github.com/OctoPrint/OctoPrint/blob/fed2dd7660c1587e2c280a30ed9d84ceffa1b89d/src/octoprint/printer/standard.py#L511\n // And https://github.com/fluidd-core/fluidd/blob/05e87ef288cc22b5180be052cf201fa68d8a0ccf/src/components/widgets/toolhead/ToolheadControlCross.vue#L261\n const setSpeed = !!amounts.speed ? amounts.speed : 10;\n let g1CommandAxes = \"\";\n if (!Number.isNaN(amounts.x)) {\n g1CommandAxes += ` X${amounts.x}`;\n }\n if (!Number.isNaN(amounts.y)) {\n g1CommandAxes += ` Y${amounts.y}`;\n }\n if (!Number.isNaN(amounts.z)) {\n g1CommandAxes += ` Z${amounts.z}`;\n }\n\n await this.client.postGcodeScript(\n this.login,\n `\n G91\n G1 ${g1CommandAxes} F${setSpeed}\n G90`,\n );\n }\n\n async getFile(path: string): Promise<FileDto> {\n const metadata = await this.client.getServerFileMetadata(this.login, path);\n const file = metadata.data.result;\n return { size: file.size, path, date: Math.floor(file.modified * 1000), dir: false };\n }\n\n async getFiles(recursive = false, startDir = \"\") {\n if (recursive && startDir) {\n throw new Error(\"Recursive mode does not support startDir parameter for Moonraker\");\n }\n\n const stripGcodes = (path: string) => (path.startsWith(\"gcodes/\") ? path.substring(7) : path);\n const buildPath = (name: string) => (startDir ? `${startDir}/${name}` : name);\n\n if (recursive) {\n const response = await this.client.getServerFilesList(this.login, \"gcodes\");\n const dirsSet = new Set<string>();\n const files: FileDto[] = response.data.result.map((f) => {\n const strippedPath = stripGcodes(f.path);\n const pathParts = strippedPath.split(\"/\");\n for (let i = 0; i < pathParts.length - 1; i++) {\n dirsSet.add(pathParts.slice(0, i + 1).join(\"/\"));\n }\n return this.toFileDto(strippedPath, f.size, f.modified, false);\n });\n\n dirsSet.forEach((dirPath) => files.push(this.toFileDto(dirPath, 0, null, true)));\n\n return {\n dirs: files.filter((f) => f.dir),\n files: files.filter((f) => !f.dir),\n };\n }\n\n const moonrakerPath = startDir ? `gcodes/${startDir}` : \"gcodes\";\n const response = await this.client.getServerFilesDirectoryInfo(this.login, moonrakerPath, false);\n const { dirs: apiDirs, files: apiFiles } = response.data.result;\n\n return {\n dirs: apiDirs.map((d) => this.toFileDto(buildPath(d.dirname), d.size, d.modified, true)),\n files: apiFiles.map((f) => this.toFileDto(buildPath(f.filename), f.size, f.modified, false)),\n };\n }\n\n private toFileDto(path: string, size: number, modified: number | null, dir: boolean): FileDto {\n return {\n path,\n size,\n date: modified !== null ? Math.floor(modified * 1000) : null,\n dir,\n };\n }\n\n async homeAxes(axes: { x?: boolean; y?: boolean; z?: boolean }): Promise<void> {\n // Compare to https://github.com/fluidd-core/fluidd/blob/05e87ef288cc22b5180be052cf201fa68d8a0ccf/src/components/widgets/toolhead/ToolheadControlBarsAxis.vue#L86\n let homeCommand = `G28`;\n if (!!axes.x) {\n homeCommand += ` X`;\n }\n if (!!axes.y) {\n homeCommand += ` Y`;\n }\n if (!!axes.z) {\n homeCommand += ` Z`;\n }\n\n await this.client.postGcodeScript(this.login, homeCommand);\n }\n\n async downloadFile(path: string): AxiosPromise<NodeJS.ReadableStream> {\n return await this.client.getServerFilesDownload(this.login, \"gcodes\", path);\n }\n\n async getFileChunk(path: string, startBytes: number, endBytes: number): AxiosPromise<string> {\n return await this.client.getServerFilesDownloadChunk(this.login, \"gcodes\", path, startBytes, endBytes);\n }\n\n async uploadFile(input: UploadFileInput) {\n const validated = uploadFileInputSchema.parse(input);\n await this.client.postServerFileUpload(\n this.login,\n validated.stream,\n validated.fileName,\n validated.contentLength,\n validated.startPrint,\n validated.uploadToken,\n );\n }\n\n async deleteFile(path: string) {\n await this.client.deleteServerFile(this.login, \"gcodes\", path);\n }\n\n async deleteFolder(path: string) {\n await this.client.deleteServerFilesDirectory(this.login, path, false);\n }\n\n async getSettings() {\n const result = await this.client.getServerConfig(this.login);\n return result.data?.result;\n }\n\n async getReprintState(): Promise<PartialReprintFileDto> {\n const response = await this.client.getPrinterObjectsQuery<\n PrinterObjectsQueryDto<PrintStatsObject & WebhooksObject>\n >(this.login, {\n print_stats: [],\n webhooks: [],\n });\n\n const result = response.data.result;\n const operational = result.status.webhooks.state === \"ready\";\n\n const response2 = await this.client.getServerHistoryList(this.login, 5, 0);\n const jobs = (response2.data?.result.jobs ?? []).sort((a, b) => (a.start_time > b.start_time ? 1 : 0));\n\n if (jobs.length === 0 || !operational) {\n return {\n connectionState: operational ? \"Operational\" : \"Error\",\n reprintState: ReprintState.NoLastPrint,\n };\n }\n\n const job = jobs[0];\n return {\n connectionState: \"Operational\",\n reprintState: ReprintState.LastPrintReady,\n file: {\n date: job.start_time,\n path: job.filename,\n size: job.metadata.size,\n dir: false,\n },\n };\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"moonraker.api.js","names":[],"sources":["../../src/services/moonraker.api.ts"],"sourcesContent":["import {\n FileDto,\n IPrinterApi,\n MoonrakerType,\n PartialReprintFileDto,\n PrinterType,\n ReprintState,\n UploadFileInput,\n uploadFileInputSchema,\n} from \"@/services/printer-api.interface\";\nimport { MoonrakerClient } from \"@/services/moonraker/moonraker.client\";\nimport type { LoginDto } from \"@/services/interfaces/login.dto\";\nimport { NotImplementedException } from \"@/exceptions/runtime.exceptions\";\nimport { AxiosPromise } from \"axios\";\nimport type { PrinterObjectsQueryDto } from \"@/services/moonraker/dto/objects/printer-objects-query.dto\";\nimport { PrintStatsObject, WebhooksObject } from \"@/services/moonraker/dto/objects/printer-object.types\";\n\n/**\n * Moonraker Remote API\n * https://moonraker.readthedocs.io/en/latest/web_api/#query-server-info\n */\nexport class MoonrakerApi implements IPrinterApi {\n private readonly client: MoonrakerClient;\n\n constructor(\n moonrakerClient: MoonrakerClient,\n private printerLogin: LoginDto,\n ) {\n this.client = moonrakerClient;\n }\n\n get type(): PrinterType {\n return MoonrakerType;\n }\n\n /**\n * When no request scope is present, this setter is to be used before calling any function.\n * @param login\n */\n set login(login: LoginDto) {\n this.printerLogin = login;\n }\n\n get login() {\n return this.printerLogin;\n }\n\n async getVersion() {\n const result = await this.client.getApiVersion(this.login);\n return result.data?.server;\n }\n\n async validateConnection(): Promise<void> {\n await this.getVersion();\n }\n\n async connect() {\n // TODO Needs investigation\n throw new NotImplementedException();\n }\n\n async disconnect() {\n // TODO Needs investigation\n throw new NotImplementedException();\n }\n\n async restartServer() {\n await this.client.postRestartServer(this.login);\n }\n\n async restartHost() {\n await this.client.postHostRestart(this.login);\n }\n\n async restartPrinterFirmware() {\n await this.client.postFirmwareRestart(this.login);\n }\n\n async startPrint(filename: string) {\n await this.client.postPrintStart(this.login, filename);\n }\n\n async pausePrint(): Promise<void> {\n await this.client.postPrintPause(this.login);\n }\n\n async resumePrint(): Promise<void> {\n await this.client.postPrintResume(this.login);\n }\n\n async cancelPrint(): Promise<void> {\n await this.client.postPrintCancel(this.login);\n }\n\n async sendGcode(script: string): Promise<void> {\n await this.client.postGcodeScript(this.login, script);\n }\n\n async quickStop(): Promise<void> {\n await this.client.postQuickStop(this.login);\n }\n\n async movePrintHead(amounts: { x?: number; y?: number; z?: number; speed?: number }) {\n // Compare to https://github.com/OctoPrint/OctoPrint/blob/fed2dd7660c1587e2c280a30ed9d84ceffa1b89d/src/octoprint/printer/standard.py#L511\n // And https://github.com/fluidd-core/fluidd/blob/05e87ef288cc22b5180be052cf201fa68d8a0ccf/src/components/widgets/toolhead/ToolheadControlCross.vue#L261\n const setSpeed = !!amounts.speed ? amounts.speed : 10;\n let g1CommandAxes = \"\";\n if (!Number.isNaN(amounts.x)) {\n g1CommandAxes += ` X${amounts.x}`;\n }\n if (!Number.isNaN(amounts.y)) {\n g1CommandAxes += ` Y${amounts.y}`;\n }\n if (!Number.isNaN(amounts.z)) {\n g1CommandAxes += ` Z${amounts.z}`;\n }\n\n await this.client.postGcodeScript(\n this.login,\n `\n G91\n G1 ${g1CommandAxes} F${setSpeed}\n G90`,\n );\n }\n\n async getFile(path: string): Promise<FileDto> {\n const metadata = await this.client.getServerFileMetadata(this.login, path);\n const file = metadata.data.result;\n return { size: file.size, path, date: Math.floor(file.modified * 1000), dir: false };\n }\n\n async getFiles(recursive = false, startDir = \"\") {\n if (recursive && startDir) {\n throw new Error(\"Recursive mode does not support startDir parameter for Moonraker\");\n }\n\n const stripGcodes = (path: string) => (path.startsWith(\"gcodes/\") ? path.substring(7) : path);\n const buildPath = (name: string) => (startDir ? `${startDir}/${name}` : name);\n\n if (recursive) {\n const response = await this.client.getServerFilesList(this.login, \"gcodes\");\n const dirsSet = new Set<string>();\n const files: FileDto[] = response.data.result.map((f) => {\n const strippedPath = stripGcodes(f.path);\n const pathParts = strippedPath.split(\"/\");\n for (let i = 0; i < pathParts.length - 1; i++) {\n dirsSet.add(pathParts.slice(0, i + 1).join(\"/\"));\n }\n return this.toFileDto(strippedPath, f.size, f.modified, false);\n });\n\n dirsSet.forEach((dirPath) => files.push(this.toFileDto(dirPath, 0, null, true)));\n\n return {\n dirs: files.filter((f) => f.dir),\n files: files.filter((f) => !f.dir),\n };\n }\n\n const moonrakerPath = startDir ? `gcodes/${startDir}` : \"gcodes\";\n const response = await this.client.getServerFilesDirectoryInfo(this.login, moonrakerPath, false);\n const { dirs: apiDirs, files: apiFiles } = response.data.result;\n\n return {\n dirs: apiDirs.map((d) => this.toFileDto(buildPath(d.dirname), d.size, d.modified, true)),\n files: apiFiles.map((f) => this.toFileDto(buildPath(f.filename), f.size, f.modified, false)),\n };\n }\n\n private toFileDto(path: string, size: number, modified: number | null, dir: boolean): FileDto {\n return {\n path,\n size,\n date: modified !== null ? Math.floor(modified * 1000) : null,\n dir,\n };\n }\n\n async homeAxes(axes: { x?: boolean; y?: boolean; z?: boolean }): Promise<void> {\n // Compare to https://github.com/fluidd-core/fluidd/blob/05e87ef288cc22b5180be052cf201fa68d8a0ccf/src/components/widgets/toolhead/ToolheadControlBarsAxis.vue#L86\n let homeCommand = `G28`;\n if (!!axes.x) {\n homeCommand += ` X`;\n }\n if (!!axes.y) {\n homeCommand += ` Y`;\n }\n if (!!axes.z) {\n homeCommand += ` Z`;\n }\n\n await this.client.postGcodeScript(this.login, homeCommand);\n }\n\n async downloadFile(path: string): AxiosPromise<NodeJS.ReadableStream> {\n return await this.client.getServerFilesDownload(this.login, \"gcodes\", path);\n }\n\n async getFileChunk(path: string, startBytes: number, endBytes: number): AxiosPromise<string> {\n return await this.client.getServerFilesDownloadChunk(this.login, \"gcodes\", path, startBytes, endBytes);\n }\n\n async uploadFile(input: UploadFileInput) {\n const validated = uploadFileInputSchema.parse(input);\n await this.client.postServerFileUpload(\n this.login,\n validated.stream,\n validated.fileName,\n validated.contentLength,\n validated.startPrint,\n validated.uploadToken,\n );\n }\n\n async deleteFile(path: string) {\n await this.client.deleteServerFile(this.login, \"gcodes\", path);\n }\n\n async deleteFolder(path: string) {\n await this.client.deleteServerFilesDirectory(this.login, path, false);\n }\n\n async getSettings() {\n const result = await this.client.getServerConfig(this.login);\n return result.data?.result;\n }\n\n async getReprintState(): Promise<PartialReprintFileDto> {\n const response = await this.client.getPrinterObjectsQuery<\n PrinterObjectsQueryDto<PrintStatsObject & WebhooksObject>\n >(this.login, {\n print_stats: [],\n webhooks: [],\n });\n\n const result = response.data.result;\n const operational = result.status.webhooks.state === \"ready\";\n\n const response2 = await this.client.getServerHistoryList(this.login, 5, 0);\n const jobs = (response2.data?.result.jobs ?? []).sort((a, b) => (a.start_time > b.start_time ? 1 : 0));\n\n if (jobs.length === 0 || !operational) {\n return {\n connectionState: operational ? \"Operational\" : \"Error\",\n reprintState: ReprintState.NoLastPrint,\n };\n }\n\n const job = jobs[0];\n return {\n connectionState: \"Operational\",\n reprintState: ReprintState.LastPrintReady,\n file: {\n date: job.start_time,\n path: job.filename,\n size: job.metadata.size,\n dir: false,\n },\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"octoprint-api.routes.js","names":[],"sources":["../../../src/services/octoprint/octoprint-api.routes.ts"],"sourcesContent":["export class OctoprintRoutes {\n octoPrintBase = \"/\";\n apiBase = `${this.octoPrintBase}api`;\n apiVersion = `${this.apiBase}/version`;\n apiServer = `${this.apiBase}/server`;\n apiCurrentUser = `${this.apiBase}/currentuser`;\n apiSettingsPart = `${this.apiBase}/settings`;\n apiFiles = `${this.apiBase}/files`;\n apiFilesLocal = `${this.apiFiles}/local`;\n apiConnection = `${this.apiBase}/connection`;\n apiJob = `${this.apiBase}/job`;\n apiPrinter = `${this.apiBase}/printer`;\n apiPrinterHead = `${this.apiBase}/printer/printhead`;\n apiPrinterBed = `${this.apiPrinter}/bed`;\n apiPrinterCustomCommand = `${this.apiPrinter}/command`;\n apiPrinterProfiles = `${this.apiBase}/printerprofiles`;\n apiSystem = `${this.apiBase}/system`;\n apiSystemInfo = `${this.apiSystem}/info`;\n apiSystemCommands = `${this.apiSystem}/commands`;\n apiServerRestartCommand = `${this.apiSystemCommands}/core/restart`;\n apiUsers = `${this.apiBase}/users`;\n apiLogin = `${this.apiBase}/login`;\n\n get disconnectCommand() {\n return { command: \"disconnect\" };\n }\n\n get cancelJobCommand() {\n return { command: \"cancel\" };\n }\n\n get pauseJobCommand() {\n return { command: \"pause\", action: \"pause\" };\n }\n\n get resumeJobCommand() {\n return { command: \"pause\", action: \"resume\" };\n }\n\n get connectCommand() {\n return { command: \"connect\" };\n }\n\n getBedTargetCommand(targetTemperature: number) {\n return { command: \"target\", target: targetTemperature };\n }\n\n apiPrinterCurrent = (history?: boolean, limit?: number, exclude?: (\"temperature\" | \"sd\" | \"state\")[]) => {\n exclude = exclude?.filter((e) => !!e.length);\n const excludeParam = exclude?.length ? `&exclude=${exclude?.join(\",\")}` : \"\";\n const limitParam = !!limit ? `&limit=${limit}` : \"\";\n return `${this.apiPrinter}?history=${!!history}${limitParam}${excludeParam}`;\n };\n\n apiFile = (path: string) => `${this.apiFilesLocal}/${path}`;\n\n downloadFileLocal = (path: string) => `${this.octoPrintBase}downloads/files/local/${path}`;\n\n apiGetFiles = (recursive = false, path = \"\") =>\n `${this.apiFiles}/local${path ? `/${path}` : \"\"}?recursive=${recursive}`;\n\n selectCommand(print = false) {\n return { command: \"select\", print };\n }\n\n moveFileCommand(destination: string) {\n return { command: \"move\", destination };\n }\n\n printerNameSetting(name: string) {\n return {\n appearance: {\n name: name,\n },\n };\n }\n}\n"],"mappings":";AAAA,IAAa,kBAAb,MAA6B;CAC3B,gBAAgB;CAChB,UAAU,GAAG,KAAK,cAAc;CAChC,aAAa,GAAG,KAAK,QAAQ;CAC7B,YAAY,GAAG,KAAK,QAAQ;CAC5B,iBAAiB,GAAG,KAAK,QAAQ;CACjC,kBAAkB,GAAG,KAAK,QAAQ;CAClC,WAAW,GAAG,KAAK,QAAQ;CAC3B,gBAAgB,GAAG,KAAK,SAAS;CACjC,gBAAgB,GAAG,KAAK,QAAQ;CAChC,SAAS,GAAG,KAAK,QAAQ;CACzB,aAAa,GAAG,KAAK,QAAQ;CAC7B,iBAAiB,GAAG,KAAK,QAAQ;CACjC,gBAAgB,GAAG,KAAK,WAAW;CACnC,0BAA0B,GAAG,KAAK,WAAW;CAC7C,qBAAqB,GAAG,KAAK,QAAQ;CACrC,YAAY,GAAG,KAAK,QAAQ;CAC5B,gBAAgB,GAAG,KAAK,UAAU;CAClC,oBAAoB,GAAG,KAAK,UAAU;CACtC,0BAA0B,GAAG,KAAK,kBAAkB;CACpD,WAAW,GAAG,KAAK,QAAQ;CAC3B,WAAW,GAAG,KAAK,QAAQ;CAE3B,IAAI,oBAAoB;
|
|
1
|
+
{"version":3,"file":"octoprint-api.routes.js","names":[],"sources":["../../../src/services/octoprint/octoprint-api.routes.ts"],"sourcesContent":["export class OctoprintRoutes {\n octoPrintBase = \"/\";\n apiBase = `${this.octoPrintBase}api`;\n apiVersion = `${this.apiBase}/version`;\n apiServer = `${this.apiBase}/server`;\n apiCurrentUser = `${this.apiBase}/currentuser`;\n apiSettingsPart = `${this.apiBase}/settings`;\n apiFiles = `${this.apiBase}/files`;\n apiFilesLocal = `${this.apiFiles}/local`;\n apiConnection = `${this.apiBase}/connection`;\n apiJob = `${this.apiBase}/job`;\n apiPrinter = `${this.apiBase}/printer`;\n apiPrinterHead = `${this.apiBase}/printer/printhead`;\n apiPrinterBed = `${this.apiPrinter}/bed`;\n apiPrinterCustomCommand = `${this.apiPrinter}/command`;\n apiPrinterProfiles = `${this.apiBase}/printerprofiles`;\n apiSystem = `${this.apiBase}/system`;\n apiSystemInfo = `${this.apiSystem}/info`;\n apiSystemCommands = `${this.apiSystem}/commands`;\n apiServerRestartCommand = `${this.apiSystemCommands}/core/restart`;\n apiUsers = `${this.apiBase}/users`;\n apiLogin = `${this.apiBase}/login`;\n\n get disconnectCommand() {\n return { command: \"disconnect\" };\n }\n\n get cancelJobCommand() {\n return { command: \"cancel\" };\n }\n\n get pauseJobCommand() {\n return { command: \"pause\", action: \"pause\" };\n }\n\n get resumeJobCommand() {\n return { command: \"pause\", action: \"resume\" };\n }\n\n get connectCommand() {\n return { command: \"connect\" };\n }\n\n getBedTargetCommand(targetTemperature: number) {\n return { command: \"target\", target: targetTemperature };\n }\n\n apiPrinterCurrent = (history?: boolean, limit?: number, exclude?: (\"temperature\" | \"sd\" | \"state\")[]) => {\n exclude = exclude?.filter((e) => !!e.length);\n const excludeParam = exclude?.length ? `&exclude=${exclude?.join(\",\")}` : \"\";\n const limitParam = !!limit ? `&limit=${limit}` : \"\";\n return `${this.apiPrinter}?history=${!!history}${limitParam}${excludeParam}`;\n };\n\n apiFile = (path: string) => `${this.apiFilesLocal}/${path}`;\n\n downloadFileLocal = (path: string) => `${this.octoPrintBase}downloads/files/local/${path}`;\n\n apiGetFiles = (recursive = false, path = \"\") =>\n `${this.apiFiles}/local${path ? `/${path}` : \"\"}?recursive=${recursive}`;\n\n selectCommand(print = false) {\n return { command: \"select\", print };\n }\n\n moveFileCommand(destination: string) {\n return { command: \"move\", destination };\n }\n\n printerNameSetting(name: string) {\n return {\n appearance: {\n name: name,\n },\n };\n }\n}\n"],"mappings":";AAAA,IAAa,kBAAb,MAA6B;CAC3B,gBAAgB;CAChB,UAAU,GAAG,KAAK,cAAc;CAChC,aAAa,GAAG,KAAK,QAAQ;CAC7B,YAAY,GAAG,KAAK,QAAQ;CAC5B,iBAAiB,GAAG,KAAK,QAAQ;CACjC,kBAAkB,GAAG,KAAK,QAAQ;CAClC,WAAW,GAAG,KAAK,QAAQ;CAC3B,gBAAgB,GAAG,KAAK,SAAS;CACjC,gBAAgB,GAAG,KAAK,QAAQ;CAChC,SAAS,GAAG,KAAK,QAAQ;CACzB,aAAa,GAAG,KAAK,QAAQ;CAC7B,iBAAiB,GAAG,KAAK,QAAQ;CACjC,gBAAgB,GAAG,KAAK,WAAW;CACnC,0BAA0B,GAAG,KAAK,WAAW;CAC7C,qBAAqB,GAAG,KAAK,QAAQ;CACrC,YAAY,GAAG,KAAK,QAAQ;CAC5B,gBAAgB,GAAG,KAAK,UAAU;CAClC,oBAAoB,GAAG,KAAK,UAAU;CACtC,0BAA0B,GAAG,KAAK,kBAAkB;CACpD,WAAW,GAAG,KAAK,QAAQ;CAC3B,WAAW,GAAG,KAAK,QAAQ;CAE3B,IAAI,oBAAoB;EACtB,OAAO,EAAE,SAAS,cAAc;;CAGlC,IAAI,mBAAmB;EACrB,OAAO,EAAE,SAAS,UAAU;;CAG9B,IAAI,kBAAkB;EACpB,OAAO;GAAE,SAAS;GAAS,QAAQ;GAAS;;CAG9C,IAAI,mBAAmB;EACrB,OAAO;GAAE,SAAS;GAAS,QAAQ;GAAU;;CAG/C,IAAI,iBAAiB;EACnB,OAAO,EAAE,SAAS,WAAW;;CAG/B,oBAAoB,mBAA2B;EAC7C,OAAO;GAAE,SAAS;GAAU,QAAQ;GAAmB;;CAGzD,qBAAqB,SAAmB,OAAgB,YAAiD;EACvG,UAAU,SAAS,QAAQ,MAAM,CAAC,CAAC,EAAE,OAAO;EAC5C,MAAM,eAAe,SAAS,SAAS,YAAY,SAAS,KAAK,IAAI,KAAK;EAC1E,MAAM,aAAa,CAAC,CAAC,QAAQ,UAAU,UAAU;EACjD,OAAO,GAAG,KAAK,WAAW,WAAW,CAAC,CAAC,UAAU,aAAa;;CAGhE,WAAW,SAAiB,GAAG,KAAK,cAAc,GAAG;CAErD,qBAAqB,SAAiB,GAAG,KAAK,cAAc,wBAAwB;CAEpF,eAAe,YAAY,OAAO,OAAO,OACvC,GAAG,KAAK,SAAS,QAAQ,OAAO,IAAI,SAAS,GAAG,aAAa;CAE/D,cAAc,QAAQ,OAAO;EAC3B,OAAO;GAAE,SAAS;GAAU;GAAO;;CAGrC,gBAAgB,aAAqB;EACnC,OAAO;GAAE,SAAS;GAAQ;GAAa;;CAGzC,mBAAmB,MAAc;EAC/B,OAAO,EACL,YAAY,EACJ,MACP,EACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"octoprint-websocket.adapter.js","names":[],"sources":["../../../src/services/octoprint/octoprint-websocket.adapter.ts"],"sourcesContent":["import { HttpStatusCode } from \"@/constants/http-status-codes.constants\";\nimport { AppConstants } from \"@/server.constants\";\nimport { ExternalServiceError } from \"@/exceptions/runtime.exceptions\";\nimport { httpToWsUrl } from \"@/utils/url.utils\";\nimport { normalizeUrl } from \"@/utils/normalize-url\";\nimport { OctoprintClient } from \"@/services/octoprint/octoprint.client\";\nimport EventEmitter2 from \"eventemitter2\";\nimport { LoggerService } from \"@/handlers/logger\";\nimport { ConfigService } from \"@/services/core/config.service\";\nimport type { ILoggerFactory } from \"@/handlers/logger-factory\";\nimport { AxiosError } from \"axios\";\nimport type { ISocketLogin } from \"@/shared/dtos/socket-login.dto\";\nimport { WebsocketAdapter } from \"@/shared/websocket.adapter\";\nimport type { OctoPrintEventDto } from \"@/services/octoprint/dto/octoprint-event.dto\";\nimport type { LoginDto } from \"@/services/interfaces/login.dto\";\nimport { SOCKET_STATE, SocketState } from \"@/shared/dtos/socket-state.type\";\nimport { API_STATE, ApiState } from \"@/shared/dtos/api-state.type\";\nimport type { OP_LoginDto } from \"@/services/octoprint/dto/auth/login.dto\";\nimport { Event as WsEvent } from \"ws\";\nimport type { CurrentMessageDto } from \"@/services/octoprint/dto/websocket/current-message.dto\";\nimport type { OctoprintErrorDto } from \"@/services/octoprint/dto/rest/error.dto\";\nimport { OctoprintType } from \"@/services/printer-api.interface\";\nimport type { IWebsocketAdapter } from \"@/services/websocket-adapter.interface\";\nimport type { CurrentJobDto } from \"@/services/octoprint/dto/job/current-job.dto\";\n\nexport const WsMessage = {\n // Custom events\n WS_OPENED: \"WS_OPENED\",\n WS_CLOSED: \"WS_CLOSED\",\n WS_ERROR: \"WS_ERROR\",\n API_STATE_UPDATED: \"API_STATE_UPDATED\",\n WS_STATE_UPDATED: \"WS_STATE_UPDATED\",\n} as const;\n\nexport const OctoPrintMessage = {\n connected: \"connected\",\n reauthRequired: \"reauthRequired\",\n current: \"current\",\n history: \"history\",\n event: \"event\",\n plugin: \"plugin\",\n timelapse: \"timelapse\",\n slicingProgress: \"slicingProgress\",\n} as const;\n\nexport const octoPrintEvent = (event: string) => `octoprint.${event}`;\n\nexport class OctoprintWebsocketAdapter extends WebsocketAdapter implements IWebsocketAdapter {\n public readonly printerType = 0;\n public printerId?: number;\n stateUpdated = false;\n stateUpdateTimestamp: null | number = null;\n socketState: SocketState = SOCKET_STATE.unopened;\n apiStateUpdated = false;\n apiStateUpdateTimestamp: null | number = null;\n apiState: ApiState = API_STATE.unset;\n lastMessageReceivedTimestamp: null | number = null;\n reauthRequired = false;\n reauthRequiredTimestamp: null | number = null;\n // Guaranteed to be set and valid by PrinterApiFactory\n login: LoginDto;\n protected logger: LoggerService;\n private socketURL?: URL;\n private sessionDto?: OP_LoginDto;\n private username?: string;\n private refreshPrinterCurrentInterval?: NodeJS.Timeout;\n\n constructor(\n loggerFactory: ILoggerFactory,\n private readonly octoprintClient: OctoprintClient,\n private readonly eventEmitter2: EventEmitter2,\n private readonly configService: ConfigService,\n ) {\n super(loggerFactory);\n\n this.logger = loggerFactory(OctoprintWebsocketAdapter.name);\n }\n\n get _debugMode() {\n return this.configService.get(AppConstants.debugSocketStatesKey, AppConstants.defaultDebugSocketStates) === \"true\";\n }\n\n needsReopen() {\n const isApiOnline = this.apiState === API_STATE.responding;\n return isApiOnline && (this.socketState === SOCKET_STATE.closed || this.socketState === SOCKET_STATE.error);\n }\n\n needsSetup() {\n return this.socketState === SOCKET_STATE.unopened;\n }\n\n needsReauth() {\n return this.reauthRequired;\n }\n\n isClosedOrAborted() {\n return this.socketState === SOCKET_STATE.closed || this.socketState === SOCKET_STATE.aborted;\n }\n\n registerCredentials(socketLogin: ISocketLogin) {\n const { printerId, loginDto } = socketLogin;\n this.printerId = printerId;\n this.login = loginDto;\n\n const httpUrlString = normalizeUrl(this.login.printerURL);\n const httpUrl = new URL(httpUrlString);\n const httpUrlPath = httpUrl.pathname;\n\n const wsUrl = httpToWsUrl(httpUrlString);\n wsUrl.pathname = (httpUrlPath ?? \"/\") + \"sockjs/websocket\";\n this.socketURL = wsUrl;\n }\n\n open() {\n if (this.socket) {\n throw new Error(`Socket already exists by printerId, ignoring open request`);\n }\n\n super.open(this.socketURL);\n }\n\n close() {\n clearInterval(this.refreshPrinterCurrentInterval);\n super.close();\n }\n\n async sendThrottle(throttle: number = AppConstants.defaultSocketThrottleRate): Promise<void> {\n return await this.sendMessage(JSON.stringify({ throttle }));\n }\n\n async reauthSession() {\n this.logger.log(\"Sending reauthSession\");\n await this.setupSocketSession();\n await this.sendAuth();\n this.resetReauthRequired();\n }\n\n /**\n * Retrieve session token by authenticating with OctoPrint API\n */\n async setupSocketSession(): Promise<void> {\n this.resetSocketState();\n this.sessionDto = await this.octoprintClient\n .login(this.login)\n .then((d) => {\n const r = d.data;\n // Check response for red flags\n if (r.name === \"_api\") {\n // TODO this conclusion is often wrong (when server is disconnected)\n this.setApiState(\"globalKey\");\n this.setSocketState(\"aborted\");\n throw new ExternalServiceError(\"Global API Key detected, aborting socket connection\", \"OctoPrint\");\n } else if (r.needs?.group[0] === \"guests\") {\n this.logger.warn(\"Detected group guests in OctoPrint login response, marking as unauthorized\");\n // This doesn't occur often (instead a 400 with CSRF failed is returned)\n this.setApiState(\"authFail\");\n this.setSocketState(\"aborted\");\n throw new ExternalServiceError(\n \"Guest group detected, authentication failed, aborting socket connection\",\n \"OctoPrint\",\n );\n }\n this.setApiState(\"responding\");\n this.setSocketState(\"opening\");\n return r;\n })\n .catch((e: AxiosError) => {\n this.setSocketState(\"aborted\");\n // TODO improve error type detection\n if (e instanceof ExternalServiceError) {\n this.logger.warn(`Printer authorization error, apiState: ${this.apiState}`);\n throw e;\n } else {\n if (e?.response?.status === 403) {\n this.setApiState(\"authFail\");\n this.setSocketState(\"aborted\");\n throw new ExternalServiceError(e, \"OctoPrint\");\n }\n // We make an exception for such a problem concerning log anonymization\n this.logger.error(`Printer (${this.printerId}) network or transport error, marking it as unreachable; ${e}`);\n this.setApiState(\"noResponse\");\n }\n throw e;\n });\n\n this.username = await this.octoprintClient.getAdminUserOrDefault(this.login).catch((e: AxiosError) => {\n const status = e.response?.status;\n\n this.setApiState(\"authFail\");\n this.setSocketState(\"aborted\");\n\n if (\n status &&\n [\n HttpStatusCode.BAD_GATEWAY,\n HttpStatusCode.NOT_IMPLEMENTED,\n HttpStatusCode.SERVICE_UNAVAILABLE,\n HttpStatusCode.GATEWAY_TIMEOUT,\n ].includes(status)\n ) {\n this.logger.error(`Detected a 501-504 error (${status}) probably OctoPrint has crashed or is restarting`);\n }\n throw e;\n });\n\n await this.updateCurrentStateSafely();\n\n this.logger.log(`Setting up printer current interval loop with 10 seconds interval`);\n if (this.refreshPrinterCurrentInterval) {\n clearInterval(this.refreshPrinterCurrentInterval);\n }\n this.refreshPrinterCurrentInterval = setInterval(async () => {\n await this.updateCurrentStateSafely();\n // This timeout should be greater than or equal to the API timeout\n }, 10000);\n }\n\n setReauthRequired() {\n this.reauthRequired = true;\n this.reauthRequiredTimestamp = Date.now();\n }\n\n resetReauthRequired() {\n this.reauthRequired = false;\n this.reauthRequiredTimestamp = null;\n }\n\n resetSocketState() {\n this.setSocketState(\"unopened\");\n this.setApiState(\"unset\");\n }\n\n emitEventSync(event: string, payload: any) {\n if (!this.eventEmittingAllowed) {\n return;\n }\n\n this.eventEmitter2.emit(octoPrintEvent(event), {\n event,\n payload,\n printerId: this.printerId,\n printerType: OctoprintType,\n } as OctoPrintEventDto);\n }\n\n protected async afterOpened(_: WsEvent): Promise<void> {\n this.setSocketState(\"opened\");\n await this.sendAuth();\n await this.sendThrottle(AppConstants.defaultSocketThrottleRate);\n }\n\n protected async onMessage(message: string): Promise<void> {\n this.lastMessageReceivedTimestamp = Date.now();\n\n if (this.socketState !== SOCKET_STATE.authenticated) {\n this.setSocketState(\"authenticated\");\n }\n\n const data = JSON.parse(message);\n const eventName = Object.keys(data)[0];\n const payload = data[eventName];\n\n if (this._debugMode) {\n this.logger.log(`RX Msg ${eventName} ${message.substring(0, 140)}...`);\n }\n\n if (eventName === OctoPrintMessage.reauthRequired) {\n this.logger.log(\"Received 'reauthRequired', acting on it\");\n this.setReauthRequired();\n }\n\n await this.emitEvent(eventName, payload);\n }\n\n protected async afterClosed(event: any) {\n this.setSocketState(\"closed\");\n delete this.socket;\n await this.emitEvent(WsMessage.WS_CLOSED, \"connection closed\");\n }\n\n protected async onError(error: any) {\n this.setSocketState(\"error\");\n await this.emitEvent(WsMessage.WS_ERROR, error?.length ? error : \"connection error\");\n }\n\n /**\n * Re-fetch the printer current state without depending on Websocket\n * @private\n */\n private async updateCurrentStateSafely() {\n try {\n const current = await this.octoprintClient.getPrinterCurrent(this.login, true);\n const isOperational = current.data?.state?.flags?.operational;\n\n let job = {} as CurrentJobDto;\n if (isOperational) {\n const jobResponse = await this.octoprintClient.getJob(this.login);\n job = jobResponse.data;\n }\n\n this.setApiState(API_STATE.responding);\n return await this.emitEvent(\"current\", { ...current.data, progress: job?.progress, job: job?.job });\n } catch (e) {\n if ((e as AxiosError).isAxiosError) {\n const castError = e as OctoprintErrorDto;\n if (castError?.response?.status == 409) {\n this.logger.error(`Printer current interval loop error`);\n await this.emitEvent(\"current\", {\n state: {\n flags: {\n operational: false,\n error: false,\n },\n text: \"USB disconnected\",\n error: castError?.response.data.error,\n },\n } as CurrentMessageDto);\n return;\n }\n this.logger.error(`Could not update Octoprint current due to a request error`);\n this.setApiState(API_STATE.noResponse);\n return;\n }\n this.logger.error(`Could not update Octoprint current due to an unknown error`);\n this.setApiState(API_STATE.noResponse);\n }\n }\n\n private async emitEvent(event: string, payload?: any) {\n if (!this.eventEmittingAllowed) {\n return;\n }\n\n await this.eventEmitter2.emitAsync(octoPrintEvent(event), {\n event,\n payload,\n printerId: this.printerId,\n printerType: 0,\n } as OctoPrintEventDto);\n }\n\n private async sendAuth(): Promise<void> {\n if (!this.sessionDto?.session?.length) {\n throw new Error(\"Cant send auth, session is unset.\");\n }\n\n this.setSocketState(SOCKET_STATE.authenticating as SocketState);\n await this.sendMessage(\n JSON.stringify({\n auth: `${this.username}:${this.sessionDto.session}`,\n }),\n );\n }\n\n private setSocketState(state: SocketState) {\n this.socketState = state;\n this.stateUpdated = true;\n this.stateUpdateTimestamp = Date.now();\n if (this._debugMode) {\n this.logger.log(`${this.printerId} Socket state updated to: ` + state);\n }\n this.emitEventSync(WsMessage.WS_STATE_UPDATED, state);\n }\n\n private setApiState(state: ApiState) {\n if (state === API_STATE.globalKey) {\n this.logger.warn(\"Global API Key WS State detected\");\n }\n this.apiState = state;\n this.apiStateUpdated = true;\n this.apiStateUpdateTimestamp = Date.now();\n if (this._debugMode) {\n this.logger.log(`${this.printerId} API state updated to: ` + state);\n }\n this.emitEventSync(WsMessage.API_STATE_UPDATED, state);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"octoprint-websocket.adapter.js","names":[],"sources":["../../../src/services/octoprint/octoprint-websocket.adapter.ts"],"sourcesContent":["import { HttpStatusCode } from \"@/constants/http-status-codes.constants\";\nimport { AppConstants } from \"@/server.constants\";\nimport { ExternalServiceError } from \"@/exceptions/runtime.exceptions\";\nimport { httpToWsUrl } from \"@/utils/url.utils\";\nimport { normalizeUrl } from \"@/utils/normalize-url\";\nimport { OctoprintClient } from \"@/services/octoprint/octoprint.client\";\nimport EventEmitter2 from \"eventemitter2\";\nimport { LoggerService } from \"@/handlers/logger\";\nimport { ConfigService } from \"@/services/core/config.service\";\nimport type { ILoggerFactory } from \"@/handlers/logger-factory\";\nimport { AxiosError } from \"axios\";\nimport type { ISocketLogin } from \"@/shared/dtos/socket-login.dto\";\nimport { WebsocketAdapter } from \"@/shared/websocket.adapter\";\nimport type { OctoPrintEventDto } from \"@/services/octoprint/dto/octoprint-event.dto\";\nimport type { LoginDto } from \"@/services/interfaces/login.dto\";\nimport { SOCKET_STATE, SocketState } from \"@/shared/dtos/socket-state.type\";\nimport { API_STATE, ApiState } from \"@/shared/dtos/api-state.type\";\nimport type { OP_LoginDto } from \"@/services/octoprint/dto/auth/login.dto\";\nimport { Event as WsEvent } from \"ws\";\nimport type { CurrentMessageDto } from \"@/services/octoprint/dto/websocket/current-message.dto\";\nimport type { OctoprintErrorDto } from \"@/services/octoprint/dto/rest/error.dto\";\nimport { OctoprintType } from \"@/services/printer-api.interface\";\nimport type { IWebsocketAdapter } from \"@/services/websocket-adapter.interface\";\nimport type { CurrentJobDto } from \"@/services/octoprint/dto/job/current-job.dto\";\n\nexport const WsMessage = {\n // Custom events\n WS_OPENED: \"WS_OPENED\",\n WS_CLOSED: \"WS_CLOSED\",\n WS_ERROR: \"WS_ERROR\",\n API_STATE_UPDATED: \"API_STATE_UPDATED\",\n WS_STATE_UPDATED: \"WS_STATE_UPDATED\",\n} as const;\n\nexport const OctoPrintMessage = {\n connected: \"connected\",\n reauthRequired: \"reauthRequired\",\n current: \"current\",\n history: \"history\",\n event: \"event\",\n plugin: \"plugin\",\n timelapse: \"timelapse\",\n slicingProgress: \"slicingProgress\",\n} as const;\n\nexport const octoPrintEvent = (event: string) => `octoprint.${event}`;\n\nexport class OctoprintWebsocketAdapter extends WebsocketAdapter implements IWebsocketAdapter {\n public readonly printerType = 0;\n public printerId?: number;\n stateUpdated = false;\n stateUpdateTimestamp: null | number = null;\n socketState: SocketState = SOCKET_STATE.unopened;\n apiStateUpdated = false;\n apiStateUpdateTimestamp: null | number = null;\n apiState: ApiState = API_STATE.unset;\n lastMessageReceivedTimestamp: null | number = null;\n reauthRequired = false;\n reauthRequiredTimestamp: null | number = null;\n // Guaranteed to be set and valid by PrinterApiFactory\n login: LoginDto;\n protected logger: LoggerService;\n private socketURL?: URL;\n private sessionDto?: OP_LoginDto;\n private username?: string;\n private refreshPrinterCurrentInterval?: NodeJS.Timeout;\n\n constructor(\n loggerFactory: ILoggerFactory,\n private readonly octoprintClient: OctoprintClient,\n private readonly eventEmitter2: EventEmitter2,\n private readonly configService: ConfigService,\n ) {\n super(loggerFactory);\n\n this.logger = loggerFactory(OctoprintWebsocketAdapter.name);\n }\n\n get _debugMode() {\n return this.configService.get(AppConstants.debugSocketStatesKey, AppConstants.defaultDebugSocketStates) === \"true\";\n }\n\n needsReopen() {\n const isApiOnline = this.apiState === API_STATE.responding;\n return isApiOnline && (this.socketState === SOCKET_STATE.closed || this.socketState === SOCKET_STATE.error);\n }\n\n needsSetup() {\n return this.socketState === SOCKET_STATE.unopened;\n }\n\n needsReauth() {\n return this.reauthRequired;\n }\n\n isClosedOrAborted() {\n return this.socketState === SOCKET_STATE.closed || this.socketState === SOCKET_STATE.aborted;\n }\n\n registerCredentials(socketLogin: ISocketLogin) {\n const { printerId, loginDto } = socketLogin;\n this.printerId = printerId;\n this.login = loginDto;\n\n const httpUrlString = normalizeUrl(this.login.printerURL);\n const httpUrl = new URL(httpUrlString);\n const httpUrlPath = httpUrl.pathname;\n\n const wsUrl = httpToWsUrl(httpUrlString);\n wsUrl.pathname = (httpUrlPath ?? \"/\") + \"sockjs/websocket\";\n this.socketURL = wsUrl;\n }\n\n open() {\n if (this.socket) {\n throw new Error(`Socket already exists by printerId, ignoring open request`);\n }\n\n super.open(this.socketURL);\n }\n\n close() {\n clearInterval(this.refreshPrinterCurrentInterval);\n super.close();\n }\n\n async sendThrottle(throttle: number = AppConstants.defaultSocketThrottleRate): Promise<void> {\n return await this.sendMessage(JSON.stringify({ throttle }));\n }\n\n async reauthSession() {\n this.logger.log(\"Sending reauthSession\");\n await this.setupSocketSession();\n await this.sendAuth();\n this.resetReauthRequired();\n }\n\n /**\n * Retrieve session token by authenticating with OctoPrint API\n */\n async setupSocketSession(): Promise<void> {\n this.resetSocketState();\n this.sessionDto = await this.octoprintClient\n .login(this.login)\n .then((d) => {\n const r = d.data;\n // Check response for red flags\n if (r.name === \"_api\") {\n // TODO this conclusion is often wrong (when server is disconnected)\n this.setApiState(\"globalKey\");\n this.setSocketState(\"aborted\");\n throw new ExternalServiceError(\"Global API Key detected, aborting socket connection\", \"OctoPrint\");\n } else if (r.needs?.group[0] === \"guests\") {\n this.logger.warn(\"Detected group guests in OctoPrint login response, marking as unauthorized\");\n // This doesn't occur often (instead a 400 with CSRF failed is returned)\n this.setApiState(\"authFail\");\n this.setSocketState(\"aborted\");\n throw new ExternalServiceError(\n \"Guest group detected, authentication failed, aborting socket connection\",\n \"OctoPrint\",\n );\n }\n this.setApiState(\"responding\");\n this.setSocketState(\"opening\");\n return r;\n })\n .catch((e: AxiosError) => {\n this.setSocketState(\"aborted\");\n // TODO improve error type detection\n if (e instanceof ExternalServiceError) {\n this.logger.warn(`Printer authorization error, apiState: ${this.apiState}`);\n throw e;\n } else {\n if (e?.response?.status === 403) {\n this.setApiState(\"authFail\");\n this.setSocketState(\"aborted\");\n throw new ExternalServiceError(e, \"OctoPrint\");\n }\n // We make an exception for such a problem concerning log anonymization\n this.logger.error(`Printer (${this.printerId}) network or transport error, marking it as unreachable; ${e}`);\n this.setApiState(\"noResponse\");\n }\n throw e;\n });\n\n this.username = await this.octoprintClient.getAdminUserOrDefault(this.login).catch((e: AxiosError) => {\n const status = e.response?.status;\n\n this.setApiState(\"authFail\");\n this.setSocketState(\"aborted\");\n\n if (\n status &&\n [\n HttpStatusCode.BAD_GATEWAY,\n HttpStatusCode.NOT_IMPLEMENTED,\n HttpStatusCode.SERVICE_UNAVAILABLE,\n HttpStatusCode.GATEWAY_TIMEOUT,\n ].includes(status)\n ) {\n this.logger.error(`Detected a 501-504 error (${status}) probably OctoPrint has crashed or is restarting`);\n }\n throw e;\n });\n\n await this.updateCurrentStateSafely();\n\n this.logger.log(`Setting up printer current interval loop with 10 seconds interval`);\n if (this.refreshPrinterCurrentInterval) {\n clearInterval(this.refreshPrinterCurrentInterval);\n }\n this.refreshPrinterCurrentInterval = setInterval(async () => {\n await this.updateCurrentStateSafely();\n // This timeout should be greater than or equal to the API timeout\n }, 10000);\n }\n\n setReauthRequired() {\n this.reauthRequired = true;\n this.reauthRequiredTimestamp = Date.now();\n }\n\n resetReauthRequired() {\n this.reauthRequired = false;\n this.reauthRequiredTimestamp = null;\n }\n\n resetSocketState() {\n this.setSocketState(\"unopened\");\n this.setApiState(\"unset\");\n }\n\n emitEventSync(event: string, payload: any) {\n if (!this.eventEmittingAllowed) {\n return;\n }\n\n this.eventEmitter2.emit(octoPrintEvent(event), {\n event,\n payload,\n printerId: this.printerId,\n printerType: OctoprintType,\n } as OctoPrintEventDto);\n }\n\n protected async afterOpened(_: WsEvent): Promise<void> {\n this.setSocketState(\"opened\");\n await this.sendAuth();\n await this.sendThrottle(AppConstants.defaultSocketThrottleRate);\n }\n\n protected async onMessage(message: string): Promise<void> {\n this.lastMessageReceivedTimestamp = Date.now();\n\n if (this.socketState !== SOCKET_STATE.authenticated) {\n this.setSocketState(\"authenticated\");\n }\n\n const data = JSON.parse(message);\n const eventName = Object.keys(data)[0];\n const payload = data[eventName];\n\n if (this._debugMode) {\n this.logger.log(`RX Msg ${eventName} ${message.substring(0, 140)}...`);\n }\n\n if (eventName === OctoPrintMessage.reauthRequired) {\n this.logger.log(\"Received 'reauthRequired', acting on it\");\n this.setReauthRequired();\n }\n\n await this.emitEvent(eventName, payload);\n }\n\n protected async afterClosed(event: any) {\n this.setSocketState(\"closed\");\n delete this.socket;\n await this.emitEvent(WsMessage.WS_CLOSED, \"connection closed\");\n }\n\n protected async onError(error: any) {\n this.setSocketState(\"error\");\n await this.emitEvent(WsMessage.WS_ERROR, error?.length ? error : \"connection error\");\n }\n\n /**\n * Re-fetch the printer current state without depending on Websocket\n * @private\n */\n private async updateCurrentStateSafely() {\n try {\n const current = await this.octoprintClient.getPrinterCurrent(this.login, true);\n const isOperational = current.data?.state?.flags?.operational;\n\n let job = {} as CurrentJobDto;\n if (isOperational) {\n const jobResponse = await this.octoprintClient.getJob(this.login);\n job = jobResponse.data;\n }\n\n this.setApiState(API_STATE.responding);\n return await this.emitEvent(\"current\", { ...current.data, progress: job?.progress, job: job?.job });\n } catch (e) {\n if ((e as AxiosError).isAxiosError) {\n const castError = e as OctoprintErrorDto;\n if (castError?.response?.status == 409) {\n this.logger.error(`Printer current interval loop error`);\n await this.emitEvent(\"current\", {\n state: {\n flags: {\n operational: false,\n error: false,\n },\n text: \"USB disconnected\",\n error: castError?.response.data.error,\n },\n } as CurrentMessageDto);\n return;\n }\n this.logger.error(`Could not update Octoprint current due to a request error`);\n this.setApiState(API_STATE.noResponse);\n return;\n }\n this.logger.error(`Could not update Octoprint current due to an unknown error`);\n this.setApiState(API_STATE.noResponse);\n }\n }\n\n private async emitEvent(event: string, payload?: any) {\n if (!this.eventEmittingAllowed) {\n return;\n }\n\n await this.eventEmitter2.emitAsync(octoPrintEvent(event), {\n event,\n payload,\n printerId: this.printerId,\n printerType: 0,\n } as OctoPrintEventDto);\n }\n\n private async sendAuth(): Promise<void> {\n if (!this.sessionDto?.session?.length) {\n throw new Error(\"Cant send auth, session is unset.\");\n }\n\n this.setSocketState(SOCKET_STATE.authenticating as SocketState);\n await this.sendMessage(\n JSON.stringify({\n auth: `${this.username}:${this.sessionDto.session}`,\n }),\n );\n }\n\n private setSocketState(state: SocketState) {\n this.socketState = state;\n this.stateUpdated = true;\n this.stateUpdateTimestamp = Date.now();\n if (this._debugMode) {\n this.logger.log(`${this.printerId} Socket state updated to: ` + state);\n }\n this.emitEventSync(WsMessage.WS_STATE_UPDATED, state);\n }\n\n private setApiState(state: ApiState) {\n if (state === API_STATE.globalKey) {\n this.logger.warn(\"Global API Key WS State detected\");\n }\n this.apiState = state;\n this.apiStateUpdated = true;\n this.apiStateUpdateTimestamp = Date.now();\n if (this._debugMode) {\n this.logger.log(`${this.printerId} API state updated to: ` + state);\n }\n this.emitEventSync(WsMessage.API_STATE_UPDATED, state);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"octoprint.client.js","names":[],"sources":["../../../src/services/octoprint/octoprint.client.ts"],"sourcesContent":["import FormData from \"form-data\";\nimport { uploadDoneEvent, uploadFailedEvent, uploadProgressEvent } from \"@/constants/event.constants\";\nimport { ExternalServiceError } from \"@/exceptions/runtime.exceptions\";\nimport { OctoprintRoutes } from \"./octoprint-api.routes\";\nimport { AxiosError, AxiosPromise } from \"axios\";\nimport EventEmitter2 from \"eventemitter2\";\nimport { LoggerService } from \"@/handlers/logger\";\nimport type { LoginDto } from \"@/services/interfaces/login.dto\";\nimport type { ILoggerFactory } from \"@/handlers/logger-factory\";\nimport { flattenOctoPrintFiles } from \"@/services/octoprint/utils/file.utils\";\nimport type { ConnectionDto } from \"@/services/octoprint/dto/connection/connection.dto\";\nimport type { OP_LoginDto } from \"@/services/octoprint/dto/auth/login.dto\";\nimport type { VersionDto } from \"@/services/octoprint/dto/server/version.dto\";\nimport type { ServerDto } from \"@/services/octoprint/dto/server/server.dto\";\nimport type { UserListDto } from \"@/services/octoprint/dto/access/user-list.dto\";\nimport type { OctoprintFilesResponseDto } from \"@/services/octoprint/dto/files/octoprint-files-response.dto\";\nimport type { CurrentUserDto } from \"@/services/octoprint/dto/auth/current-user.dto\";\nimport type { CurrentJobDto } from \"@/services/octoprint/dto/job/current-job.dto\";\nimport type { SettingsDto } from \"@/services/octoprint/dto/settings/settings.dto\";\nimport type { CurrentPrinterStateDto } from \"@/services/octoprint/dto/printer/current-printer-state.dto\";\nimport { HttpClientFactory } from \"@/services/core/http-client.factory\";\nimport { OctoprintHttpClientBuilder } from \"@/services/octoprint/utils/octoprint-http-client.builder\";\nimport type { OctoprintFileDto } from \"@/services/octoprint/dto/files/octoprint-file.dto\";\nimport { SettingsStore } from \"@/state/settings.store\";\nimport { Readable } from \"node:stream\";\nimport type { FileDto } from \"@/services/printer-api.interface\";\n\ntype TAxes = \"x\" | \"y\" | \"z\";\n\n/**\n * OctoPrint REST API\n * https://docs.octoprint.org/en/master/api/index.html\n */\nexport class OctoprintClient extends OctoprintRoutes {\n protected logger: LoggerService;\n\n constructor(\n loggerFactory: ILoggerFactory,\n private readonly httpClientFactory: HttpClientFactory,\n private readonly eventEmitter2: EventEmitter2,\n private readonly settingsStore: SettingsStore,\n ) {\n super();\n\n this.logger = loggerFactory(OctoprintClient.name);\n }\n\n async getApiVersion(login: LoginDto) {\n return await this.createClient(login).get<VersionDto>(this.apiVersion);\n }\n\n async getServer(login: LoginDto) {\n return await this.createClient(login).get<ServerDto>(this.apiServer);\n }\n\n async login(login: LoginDto) {\n return await this.createClient(login).post<OP_LoginDto>(this.apiLogin, {\n passive: true,\n });\n }\n\n async sendConnectionCommand(login: LoginDto, commandData: any) {\n await this.createClient(login).post(this.apiConnection, commandData);\n }\n\n async sendPrintHeadJogCommand(login: LoginDto, amounts: { x?: number; y?: number; z?: number; speed?: number }) {\n const axesToHome: Record<TAxes, number> = {\n x: amounts.x ?? 0,\n y: amounts.y ?? 0,\n z: amounts.z ?? 0,\n };\n const commandData = {\n command: \"jog\",\n ...axesToHome,\n };\n\n return this.sendPrintHeadCommand(login, commandData);\n }\n\n async sendPrintHeadHomeCommand(login: LoginDto, axes: { x?: boolean; y?: boolean; z?: boolean }) {\n const axesToHome: string[] = [...(axes.x ? [\"x\"] : []), ...(axes.y ? [\"y\"] : []), ...(axes.z ? [\"z\"] : [])];\n const commandData = {\n command: \"home\",\n axes: axesToHome,\n };\n return this.sendPrintHeadCommand(login, commandData);\n }\n\n /**\n * Ability to jog, home or set feed rate\n */\n async sendPrintHeadCommand(login: LoginDto, commandData: any) {\n await this.createClient(login).post(this.apiPrinterHead, commandData);\n }\n\n async sendCustomGCodeCommand(login: LoginDto, commandString: string) {\n await this.createClient(login).post(this.apiPrinterCustomCommand, {\n command: commandString,\n });\n }\n\n async getJob(login: LoginDto) {\n return await this.createClient(login).get<CurrentJobDto>(this.apiJob);\n }\n\n /**\n * Ability to start, cancel, restart, or pause a job\n */\n async sendJobCommand(login: LoginDto, commandData: any) {\n return await this.createClient(login).post(this.apiJob, commandData);\n }\n\n async sendBedTempCommand(login: LoginDto, targetTemp: number) {\n const data = this.getBedTargetCommand(targetTemp);\n return await this.createClient(login).post(this.apiPrinterBed, data);\n }\n\n async getSettings(login: LoginDto) {\n return await this.createClient(login).get<SettingsDto>(this.apiSettingsPart);\n }\n\n async updatePrinterNameSetting(login: LoginDto, printerName: string) {\n const settingPatch = this.printerNameSetting(printerName);\n return await this.createClient(login).post(this.apiSettingsPart, settingPatch);\n }\n\n async getCurrentUser(login: LoginDto) {\n return await this.createClient(login).get<CurrentUserDto>(this.apiCurrentUser);\n }\n\n async getAdminUserOrDefault(login: LoginDto) {\n const currentUserResponse = await this.getCurrentUser(login);\n return currentUserResponse?.data?.name;\n }\n\n async getUsers(login: LoginDto) {\n return await this.createClient(login).get<UserListDto>(this.apiUsers);\n }\n\n async getLocalFiles(login: LoginDto, recursive = false, startDir = \"\"): Promise<FileDto[]> {\n const url = this.apiGetFiles(recursive, startDir);\n const response = await this.createClient(login).get<OctoprintFilesResponseDto | OctoprintFileDto>(url);\n\n if (!response?.data) {\n return [];\n }\n\n const data = response.data as any;\n const items = data.files || (data.children ? data.children : []);\n\n if (!items.length) {\n return [];\n }\n\n if (recursive) {\n return flattenOctoPrintFiles(items, startDir);\n } else {\n return items.map((item: OctoprintFileDto) => ({\n path: item.path || item.name,\n size: item.size || 0,\n date: item.date || null,\n dir: item.type === \"folder\",\n }));\n }\n }\n\n async getFile(login: LoginDto, path: string) {\n const urlPath = this.apiFile(path);\n const response = await this.createClient(login).get<OctoprintFileDto>(urlPath);\n\n const file = response?.data;\n return {\n path: file.path,\n size: file.size,\n date: file.date,\n dir: file.type === \"folder\",\n };\n }\n\n async downloadFile(login: LoginDto, path: string): AxiosPromise<NodeJS.ReadableStream> {\n const urlPath = this.downloadFileLocal(path);\n\n return await this.createClient(login).get(urlPath, {\n responseType: \"stream\",\n });\n }\n\n async getFileChunk(login: LoginDto, filePath: string, startBytes: number, endBytes: number) {\n const pathUrl = this.downloadFileLocal(filePath);\n\n return await this.createClient(login, (o) =>\n o.withHeaders({\n Range: `bytes=${startBytes}-${endBytes}`,\n }),\n ).get<string>(pathUrl);\n }\n\n async createFolder(login: LoginDto, path: string, foldername: string) {\n const formData = new FormData();\n formData.append(\"path\", path);\n formData.append(\"foldername\", foldername);\n\n const headers = {\n ...formData.getHeaders(),\n \"Content-Length\": formData.getLengthSync().toString(),\n };\n\n return await this.createClient(login, (o) => o.withHeaders(headers)).post(this.apiFilesLocal, formData);\n }\n\n async moveFileOrFolder(login: LoginDto, path: string, destination: string) {\n const command = this.moveFileCommand(destination);\n return await this.createClient(login).post(this.apiFile(path), command);\n }\n\n async postSelectPrintFile(login: LoginDto, path: string, print: boolean) {\n const command = this.selectCommand(print);\n const url = this.apiFile(path);\n await this.createClient(login).post(url, command);\n }\n\n async uploadFileAsMultiPart(\n login: LoginDto,\n stream: Readable,\n fileName: string,\n contentLength: number,\n startPrint: boolean,\n progressToken?: string,\n ) {\n const urlPath = this.apiFilesLocal;\n\n const formData = new FormData();\n if (startPrint) {\n formData.append(\"print\", \"true\");\n }\n\n formData.append(\"file\", stream, {\n filename: fileName,\n knownLength: contentLength,\n });\n\n // Calculate the header that axios uses to determine progress\n const result: number = await new Promise<number>((resolve, reject) => {\n return formData.getLength((err, length) => {\n if (err) reject(new Error(\"Could not retrieve formData length\"));\n resolve(length);\n });\n });\n\n try {\n const response = await this.createClient(login, (builder) =>\n builder\n .withMultiPartFormData()\n .withTimeout(this.settingsStore.getTimeoutSettings().apiUploadTimeout)\n .withHeaders({\n ...formData.getHeaders(),\n \"Content-Length\": result.toString(),\n })\n .withOnUploadProgress((p) => {\n if (progressToken) {\n this.eventEmitter2.emit(`${uploadProgressEvent(progressToken)}`, progressToken, p);\n }\n }),\n ).post(urlPath, formData);\n\n if (progressToken) {\n this.eventEmitter2.emit(`${uploadDoneEvent(progressToken)}`, progressToken);\n }\n\n return response.data;\n } catch (e: any) {\n if (progressToken) {\n this.eventEmitter2.emit(`${uploadFailedEvent(progressToken)}`, progressToken, (e as AxiosError)?.message);\n }\n let data;\n try {\n data = JSON.parse(e.response?.body);\n } catch {\n data = e.response?.body;\n }\n throw new ExternalServiceError(\n {\n error: e.message,\n statusCode: e.response?.statusCode,\n data,\n success: false,\n stack: e.stack,\n },\n \"OctoPrint\",\n );\n }\n }\n\n async deleteFileOrFolder(login: LoginDto, path: string) {\n await this.createClient(login).delete(this.apiFile(path));\n }\n\n async getPrinterCurrent(\n login: LoginDto,\n history: boolean,\n limit?: number,\n exclude?: (\"temperature\" | \"sd\" | \"state\")[],\n ) {\n const pathUrl = this.apiPrinterCurrent(history, limit, exclude);\n return await this.createClient(login).get<CurrentPrinterStateDto>(pathUrl);\n }\n\n async getConnection(login: LoginDto) {\n return await this.createClient(login).get<ConnectionDto>(this.apiConnection);\n }\n\n async getPrinterProfiles(login: LoginDto) {\n return await this.createClient(login).get(this.apiPrinterProfiles);\n }\n\n async getSystemInfo(login: LoginDto) {\n return await this.createClient(login).get(this.apiSystemInfo);\n }\n\n async getSystemCommands(login: LoginDto) {\n return await this.createClient(login).get(this.apiSystemCommands);\n }\n\n async postServerRestartCommand(login: LoginDto) {\n await this.createClient(login).post(this.apiServerRestartCommand);\n }\n\n private createClient(login: LoginDto, buildFluentOptions?: (base: OctoprintHttpClientBuilder) => void) {\n const baseAddress = login.printerURL;\n\n return this.createAnonymousClient(baseAddress, (o) => {\n if (buildFluentOptions) {\n buildFluentOptions(o);\n }\n\n o.withXApiKeyHeader(login.apiKey);\n });\n }\n\n private createAnonymousClient(baseAddress: string, buildFluentOptions?: (base: OctoprintHttpClientBuilder) => void) {\n const builder = new OctoprintHttpClientBuilder();\n\n return this.httpClientFactory.createClientWithBaseUrl(builder, baseAddress, (b) => {\n if (buildFluentOptions) {\n buildFluentOptions(b);\n }\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"octoprint.client.js","names":[],"sources":["../../../src/services/octoprint/octoprint.client.ts"],"sourcesContent":["import FormData from \"form-data\";\nimport { uploadDoneEvent, uploadFailedEvent, uploadProgressEvent } from \"@/constants/event.constants\";\nimport { ExternalServiceError } from \"@/exceptions/runtime.exceptions\";\nimport { OctoprintRoutes } from \"./octoprint-api.routes\";\nimport { AxiosError, AxiosPromise } from \"axios\";\nimport EventEmitter2 from \"eventemitter2\";\nimport { LoggerService } from \"@/handlers/logger\";\nimport type { LoginDto } from \"@/services/interfaces/login.dto\";\nimport type { ILoggerFactory } from \"@/handlers/logger-factory\";\nimport { flattenOctoPrintFiles } from \"@/services/octoprint/utils/file.utils\";\nimport type { ConnectionDto } from \"@/services/octoprint/dto/connection/connection.dto\";\nimport type { OP_LoginDto } from \"@/services/octoprint/dto/auth/login.dto\";\nimport type { VersionDto } from \"@/services/octoprint/dto/server/version.dto\";\nimport type { ServerDto } from \"@/services/octoprint/dto/server/server.dto\";\nimport type { UserListDto } from \"@/services/octoprint/dto/access/user-list.dto\";\nimport type { OctoprintFilesResponseDto } from \"@/services/octoprint/dto/files/octoprint-files-response.dto\";\nimport type { CurrentUserDto } from \"@/services/octoprint/dto/auth/current-user.dto\";\nimport type { CurrentJobDto } from \"@/services/octoprint/dto/job/current-job.dto\";\nimport type { SettingsDto } from \"@/services/octoprint/dto/settings/settings.dto\";\nimport type { CurrentPrinterStateDto } from \"@/services/octoprint/dto/printer/current-printer-state.dto\";\nimport { HttpClientFactory } from \"@/services/core/http-client.factory\";\nimport { OctoprintHttpClientBuilder } from \"@/services/octoprint/utils/octoprint-http-client.builder\";\nimport type { OctoprintFileDto } from \"@/services/octoprint/dto/files/octoprint-file.dto\";\nimport { SettingsStore } from \"@/state/settings.store\";\nimport { Readable } from \"node:stream\";\nimport type { FileDto } from \"@/services/printer-api.interface\";\n\ntype TAxes = \"x\" | \"y\" | \"z\";\n\n/**\n * OctoPrint REST API\n * https://docs.octoprint.org/en/master/api/index.html\n */\nexport class OctoprintClient extends OctoprintRoutes {\n protected logger: LoggerService;\n\n constructor(\n loggerFactory: ILoggerFactory,\n private readonly httpClientFactory: HttpClientFactory,\n private readonly eventEmitter2: EventEmitter2,\n private readonly settingsStore: SettingsStore,\n ) {\n super();\n\n this.logger = loggerFactory(OctoprintClient.name);\n }\n\n async getApiVersion(login: LoginDto) {\n return await this.createClient(login).get<VersionDto>(this.apiVersion);\n }\n\n async getServer(login: LoginDto) {\n return await this.createClient(login).get<ServerDto>(this.apiServer);\n }\n\n async login(login: LoginDto) {\n return await this.createClient(login).post<OP_LoginDto>(this.apiLogin, {\n passive: true,\n });\n }\n\n async sendConnectionCommand(login: LoginDto, commandData: any) {\n await this.createClient(login).post(this.apiConnection, commandData);\n }\n\n async sendPrintHeadJogCommand(login: LoginDto, amounts: { x?: number; y?: number; z?: number; speed?: number }) {\n const axesToHome: Record<TAxes, number> = {\n x: amounts.x ?? 0,\n y: amounts.y ?? 0,\n z: amounts.z ?? 0,\n };\n const commandData = {\n command: \"jog\",\n ...axesToHome,\n };\n\n return this.sendPrintHeadCommand(login, commandData);\n }\n\n async sendPrintHeadHomeCommand(login: LoginDto, axes: { x?: boolean; y?: boolean; z?: boolean }) {\n const axesToHome: string[] = [...(axes.x ? [\"x\"] : []), ...(axes.y ? [\"y\"] : []), ...(axes.z ? [\"z\"] : [])];\n const commandData = {\n command: \"home\",\n axes: axesToHome,\n };\n return this.sendPrintHeadCommand(login, commandData);\n }\n\n /**\n * Ability to jog, home or set feed rate\n */\n async sendPrintHeadCommand(login: LoginDto, commandData: any) {\n await this.createClient(login).post(this.apiPrinterHead, commandData);\n }\n\n async sendCustomGCodeCommand(login: LoginDto, commandString: string) {\n await this.createClient(login).post(this.apiPrinterCustomCommand, {\n command: commandString,\n });\n }\n\n async getJob(login: LoginDto) {\n return await this.createClient(login).get<CurrentJobDto>(this.apiJob);\n }\n\n /**\n * Ability to start, cancel, restart, or pause a job\n */\n async sendJobCommand(login: LoginDto, commandData: any) {\n return await this.createClient(login).post(this.apiJob, commandData);\n }\n\n async sendBedTempCommand(login: LoginDto, targetTemp: number) {\n const data = this.getBedTargetCommand(targetTemp);\n return await this.createClient(login).post(this.apiPrinterBed, data);\n }\n\n async getSettings(login: LoginDto) {\n return await this.createClient(login).get<SettingsDto>(this.apiSettingsPart);\n }\n\n async updatePrinterNameSetting(login: LoginDto, printerName: string) {\n const settingPatch = this.printerNameSetting(printerName);\n return await this.createClient(login).post(this.apiSettingsPart, settingPatch);\n }\n\n async getCurrentUser(login: LoginDto) {\n return await this.createClient(login).get<CurrentUserDto>(this.apiCurrentUser);\n }\n\n async getAdminUserOrDefault(login: LoginDto) {\n const currentUserResponse = await this.getCurrentUser(login);\n return currentUserResponse?.data?.name;\n }\n\n async getUsers(login: LoginDto) {\n return await this.createClient(login).get<UserListDto>(this.apiUsers);\n }\n\n async getLocalFiles(login: LoginDto, recursive = false, startDir = \"\"): Promise<FileDto[]> {\n const url = this.apiGetFiles(recursive, startDir);\n const response = await this.createClient(login).get<OctoprintFilesResponseDto | OctoprintFileDto>(url);\n\n if (!response?.data) {\n return [];\n }\n\n const data = response.data as any;\n const items = data.files || (data.children ? data.children : []);\n\n if (!items.length) {\n return [];\n }\n\n if (recursive) {\n return flattenOctoPrintFiles(items, startDir);\n } else {\n return items.map((item: OctoprintFileDto) => ({\n path: item.path || item.name,\n size: item.size || 0,\n date: item.date || null,\n dir: item.type === \"folder\",\n }));\n }\n }\n\n async getFile(login: LoginDto, path: string) {\n const urlPath = this.apiFile(path);\n const response = await this.createClient(login).get<OctoprintFileDto>(urlPath);\n\n const file = response?.data;\n return {\n path: file.path,\n size: file.size,\n date: file.date,\n dir: file.type === \"folder\",\n };\n }\n\n async downloadFile(login: LoginDto, path: string): AxiosPromise<NodeJS.ReadableStream> {\n const urlPath = this.downloadFileLocal(path);\n\n return await this.createClient(login).get(urlPath, {\n responseType: \"stream\",\n });\n }\n\n async getFileChunk(login: LoginDto, filePath: string, startBytes: number, endBytes: number) {\n const pathUrl = this.downloadFileLocal(filePath);\n\n return await this.createClient(login, (o) =>\n o.withHeaders({\n Range: `bytes=${startBytes}-${endBytes}`,\n }),\n ).get<string>(pathUrl);\n }\n\n async createFolder(login: LoginDto, path: string, foldername: string) {\n const formData = new FormData();\n formData.append(\"path\", path);\n formData.append(\"foldername\", foldername);\n\n const headers = {\n ...formData.getHeaders(),\n \"Content-Length\": formData.getLengthSync().toString(),\n };\n\n return await this.createClient(login, (o) => o.withHeaders(headers)).post(this.apiFilesLocal, formData);\n }\n\n async moveFileOrFolder(login: LoginDto, path: string, destination: string) {\n const command = this.moveFileCommand(destination);\n return await this.createClient(login).post(this.apiFile(path), command);\n }\n\n async postSelectPrintFile(login: LoginDto, path: string, print: boolean) {\n const command = this.selectCommand(print);\n const url = this.apiFile(path);\n await this.createClient(login).post(url, command);\n }\n\n async uploadFileAsMultiPart(\n login: LoginDto,\n stream: Readable,\n fileName: string,\n contentLength: number,\n startPrint: boolean,\n progressToken?: string,\n ) {\n const urlPath = this.apiFilesLocal;\n\n const formData = new FormData();\n if (startPrint) {\n formData.append(\"print\", \"true\");\n }\n\n formData.append(\"file\", stream, {\n filename: fileName,\n knownLength: contentLength,\n });\n\n // Calculate the header that axios uses to determine progress\n const result: number = await new Promise<number>((resolve, reject) => {\n return formData.getLength((err, length) => {\n if (err) reject(new Error(\"Could not retrieve formData length\"));\n resolve(length);\n });\n });\n\n try {\n const response = await this.createClient(login, (builder) =>\n builder\n .withMultiPartFormData()\n .withTimeout(this.settingsStore.getTimeoutSettings().apiUploadTimeout)\n .withHeaders({\n ...formData.getHeaders(),\n \"Content-Length\": result.toString(),\n })\n .withOnUploadProgress((p) => {\n if (progressToken) {\n this.eventEmitter2.emit(`${uploadProgressEvent(progressToken)}`, progressToken, p);\n }\n }),\n ).post(urlPath, formData);\n\n if (progressToken) {\n this.eventEmitter2.emit(`${uploadDoneEvent(progressToken)}`, progressToken);\n }\n\n return response.data;\n } catch (e: any) {\n if (progressToken) {\n this.eventEmitter2.emit(`${uploadFailedEvent(progressToken)}`, progressToken, (e as AxiosError)?.message);\n }\n let data;\n try {\n data = JSON.parse(e.response?.body);\n } catch {\n data = e.response?.body;\n }\n throw new ExternalServiceError(\n {\n error: e.message,\n statusCode: e.response?.statusCode,\n data,\n success: false,\n stack: e.stack,\n },\n \"OctoPrint\",\n );\n }\n }\n\n async deleteFileOrFolder(login: LoginDto, path: string) {\n await this.createClient(login).delete(this.apiFile(path));\n }\n\n async getPrinterCurrent(\n login: LoginDto,\n history: boolean,\n limit?: number,\n exclude?: (\"temperature\" | \"sd\" | \"state\")[],\n ) {\n const pathUrl = this.apiPrinterCurrent(history, limit, exclude);\n return await this.createClient(login).get<CurrentPrinterStateDto>(pathUrl);\n }\n\n async getConnection(login: LoginDto) {\n return await this.createClient(login).get<ConnectionDto>(this.apiConnection);\n }\n\n async getPrinterProfiles(login: LoginDto) {\n return await this.createClient(login).get(this.apiPrinterProfiles);\n }\n\n async getSystemInfo(login: LoginDto) {\n return await this.createClient(login).get(this.apiSystemInfo);\n }\n\n async getSystemCommands(login: LoginDto) {\n return await this.createClient(login).get(this.apiSystemCommands);\n }\n\n async postServerRestartCommand(login: LoginDto) {\n await this.createClient(login).post(this.apiServerRestartCommand);\n }\n\n private createClient(login: LoginDto, buildFluentOptions?: (base: OctoprintHttpClientBuilder) => void) {\n const baseAddress = login.printerURL;\n\n return this.createAnonymousClient(baseAddress, (o) => {\n if (buildFluentOptions) {\n buildFluentOptions(o);\n }\n\n o.withXApiKeyHeader(login.apiKey);\n });\n }\n\n private createAnonymousClient(baseAddress: string, buildFluentOptions?: (base: OctoprintHttpClientBuilder) => void) {\n const builder = new OctoprintHttpClientBuilder();\n\n return this.httpClientFactory.createClientWithBaseUrl(builder, baseAddress, (b) => {\n if (buildFluentOptions) {\n buildFluentOptions(b);\n }\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.utils.js","names":[],"sources":["../../../../src/services/octoprint/utils/api.utils.ts"],"sourcesContent":["import {\n apiKeyHeaderKey,\n contentTypeHeaderKey,\n jsonContentType,\n} from \"@/services/octoprint/constants/octoprint-service.constants\";\nimport { ValidationException } from \"@/exceptions/runtime.exceptions\";\nimport type { LoginDto } from \"@/services/interfaces/login.dto\";\n\nexport function validateLogin(login: LoginDto) {\n if (!login.apiKey || !login.printerURL) {\n throw new ValidationException(\"printer apiKey or printerURL undefined\");\n }\n\n return {\n apiKey: login.apiKey,\n printerURL: login.printerURL,\n };\n}\n\nexport function constructHeaders(apiKey: string, contentType = jsonContentType) {\n return {\n [contentTypeHeaderKey]: contentType, // Can be overwritten without problem\n [apiKeyHeaderKey]: apiKey,\n };\n}\n"],"mappings":";;;AAQA,SAAgB,cAAc,OAAiB;
|
|
1
|
+
{"version":3,"file":"api.utils.js","names":[],"sources":["../../../../src/services/octoprint/utils/api.utils.ts"],"sourcesContent":["import {\n apiKeyHeaderKey,\n contentTypeHeaderKey,\n jsonContentType,\n} from \"@/services/octoprint/constants/octoprint-service.constants\";\nimport { ValidationException } from \"@/exceptions/runtime.exceptions\";\nimport type { LoginDto } from \"@/services/interfaces/login.dto\";\n\nexport function validateLogin(login: LoginDto) {\n if (!login.apiKey || !login.printerURL) {\n throw new ValidationException(\"printer apiKey or printerURL undefined\");\n }\n\n return {\n apiKey: login.apiKey,\n printerURL: login.printerURL,\n };\n}\n\nexport function constructHeaders(apiKey: string, contentType = jsonContentType) {\n return {\n [contentTypeHeaderKey]: contentType, // Can be overwritten without problem\n [apiKeyHeaderKey]: apiKey,\n };\n}\n"],"mappings":";;;AAQA,SAAgB,cAAc,OAAiB;CAC7C,IAAI,CAAC,MAAM,UAAU,CAAC,MAAM,YAC1B,MAAM,IAAI,oBAAoB,yCAAyC;CAGzE,OAAO;EACL,QAAQ,MAAM;EACd,YAAY,MAAM;EACnB;;AAGH,SAAgB,iBAAiB,QAAgB,cAAc,iBAAiB;CAC9E,OAAO;GACJ,uBAAuB;GACvB,kBAAkB;EACpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file.utils.js","names":[],"sources":["../../../../src/services/octoprint/utils/file.utils.ts"],"sourcesContent":["import type { OctoPrintCustomDto, OctoprintFileDto } from \"@/services/octoprint/dto/files/octoprint-file.dto\";\nimport type { FileDto } from \"@/services/printer-api.interface\";\n\nexport function normalizePrinterFile(file: OctoprintFileDto): FileDto {\n if (!file) {\n throw new Error(\"File should not be null for normalization\");\n }\n\n const keys = Object.keys(file);\n const fileCopy = {\n ...file,\n };\n\n const knownKeys = [\n \"path\",\n \"date\",\n \"hash\",\n // \"display\",\n // \"gcodeAnalysis\",\n // \"origin\",\n // \"name\",\n // \"prints\",\n // \"refs\",\n \"size\",\n // \"statistics\",\n // \"type\",\n // \"typePath\",\n ];\n\n const unknownKeys = keys.filter((k) => !knownKeys.includes(k));\n\n const customData: OctoPrintCustomDto = {};\n for (const unknownKey of unknownKeys) {\n customData[unknownKey] = fileCopy[unknownKey];\n delete fileCopy[unknownKey];\n }\n\n return {\n path: fileCopy.path,\n size: fileCopy.size,\n date: fileCopy.date,\n dir: fileCopy.type === \"folder\",\n };\n}\n\nexport function flattenOctoPrintFiles(items: OctoprintFileDto[], parentPath: string = \"\"): FileDto[] {\n const files: FileDto[] = [];\n\n for (const item of items) {\n const fullPath = parentPath ? `${parentPath}/${item.name}` : item.name;\n\n if (item.type === \"folder\") {\n files.push({\n path: fullPath,\n size: 0,\n date: item.date || null,\n dir: true,\n });\n\n if (item.children) {\n files.push(...flattenOctoPrintFiles(item.children, fullPath));\n }\n } else if (item.type === \"machinecode\") {\n files.push({\n path: fullPath,\n size: item.size,\n date: item.date,\n dir: false,\n });\n }\n }\n\n return files;\n}\n"],"mappings":";AAGA,SAAgB,qBAAqB,MAAiC;
|
|
1
|
+
{"version":3,"file":"file.utils.js","names":[],"sources":["../../../../src/services/octoprint/utils/file.utils.ts"],"sourcesContent":["import type { OctoPrintCustomDto, OctoprintFileDto } from \"@/services/octoprint/dto/files/octoprint-file.dto\";\nimport type { FileDto } from \"@/services/printer-api.interface\";\n\nexport function normalizePrinterFile(file: OctoprintFileDto): FileDto {\n if (!file) {\n throw new Error(\"File should not be null for normalization\");\n }\n\n const keys = Object.keys(file);\n const fileCopy = {\n ...file,\n };\n\n const knownKeys = [\n \"path\",\n \"date\",\n \"hash\",\n // \"display\",\n // \"gcodeAnalysis\",\n // \"origin\",\n // \"name\",\n // \"prints\",\n // \"refs\",\n \"size\",\n // \"statistics\",\n // \"type\",\n // \"typePath\",\n ];\n\n const unknownKeys = keys.filter((k) => !knownKeys.includes(k));\n\n const customData: OctoPrintCustomDto = {};\n for (const unknownKey of unknownKeys) {\n customData[unknownKey] = fileCopy[unknownKey];\n delete fileCopy[unknownKey];\n }\n\n return {\n path: fileCopy.path,\n size: fileCopy.size,\n date: fileCopy.date,\n dir: fileCopy.type === \"folder\",\n };\n}\n\nexport function flattenOctoPrintFiles(items: OctoprintFileDto[], parentPath: string = \"\"): FileDto[] {\n const files: FileDto[] = [];\n\n for (const item of items) {\n const fullPath = parentPath ? `${parentPath}/${item.name}` : item.name;\n\n if (item.type === \"folder\") {\n files.push({\n path: fullPath,\n size: 0,\n date: item.date || null,\n dir: true,\n });\n\n if (item.children) {\n files.push(...flattenOctoPrintFiles(item.children, fullPath));\n }\n } else if (item.type === \"machinecode\") {\n files.push({\n path: fullPath,\n size: item.size,\n date: item.date,\n dir: false,\n });\n }\n }\n\n return files;\n}\n"],"mappings":";AAGA,SAAgB,qBAAqB,MAAiC;CACpE,IAAI,CAAC,MACH,MAAM,IAAI,MAAM,4CAA4C;CAG9D,MAAM,OAAO,OAAO,KAAK,KAAK;CAC9B,MAAM,WAAW,EACf,GAAG,MACJ;CAED,MAAM,YAAY;EAChB;EACA;EACA;EAOA;EAID;CAED,MAAM,cAAc,KAAK,QAAQ,MAAM,CAAC,UAAU,SAAS,EAAE,CAAC;CAE9D,MAAM,aAAiC,EAAE;CACzC,KAAK,MAAM,cAAc,aAAa;EACpC,WAAW,cAAc,SAAS;EAClC,OAAO,SAAS;;CAGlB,OAAO;EACL,MAAM,SAAS;EACf,MAAM,SAAS;EACf,MAAM,SAAS;EACf,KAAK,SAAS,SAAS;EACxB;;AAGH,SAAgB,sBAAsB,OAA2B,aAAqB,IAAe;CACnG,MAAM,QAAmB,EAAE;CAE3B,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,WAAW,aAAa,GAAG,WAAW,GAAG,KAAK,SAAS,KAAK;EAElE,IAAI,KAAK,SAAS,UAAU;GAC1B,MAAM,KAAK;IACT,MAAM;IACN,MAAM;IACN,MAAM,KAAK,QAAQ;IACnB,KAAK;IACN,CAAC;GAEF,IAAI,KAAK,UACP,MAAM,KAAK,GAAG,sBAAsB,KAAK,UAAU,SAAS,CAAC;SAE1D,IAAI,KAAK,SAAS,eACvB,MAAM,KAAK;GACT,MAAM;GACN,MAAM,KAAK;GACX,MAAM,KAAK;GACX,KAAK;GACN,CAAC;;CAIN,OAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"octoprint-http-client.builder.js","names":[],"sources":["../../../../src/services/octoprint/utils/octoprint-http-client.builder.ts"],"sourcesContent":["import { DefaultHttpClientBuilder } from \"@/shared/default-http-client.builder\";\nimport { apiKeyHeaderKey } from \"@/services/octoprint/constants/octoprint-service.constants\";\nimport { AxiosInstance } from \"axios\";\n\nexport class OctoprintHttpClientBuilder extends DefaultHttpClientBuilder {\n public override build<D = any>(): AxiosInstance {\n if (!this.axiosOptions.baseURL) {\n throw new Error(\"Base URL is required\");\n }\n\n return super.build<D>();\n }\n\n public withXApiKeyHeader(apiKey?: string): this {\n if (!apiKey?.length) {\n throw new Error(\"XApiKey header may not be an empty string\");\n }\n\n this.withHeaders({ [apiKeyHeaderKey]: apiKey });\n\n return this;\n }\n}\n"],"mappings":";;;AAIA,IAAa,6BAAb,cAAgD,yBAAyB;CACvE,QAAgD;
|
|
1
|
+
{"version":3,"file":"octoprint-http-client.builder.js","names":[],"sources":["../../../../src/services/octoprint/utils/octoprint-http-client.builder.ts"],"sourcesContent":["import { DefaultHttpClientBuilder } from \"@/shared/default-http-client.builder\";\nimport { apiKeyHeaderKey } from \"@/services/octoprint/constants/octoprint-service.constants\";\nimport { AxiosInstance } from \"axios\";\n\nexport class OctoprintHttpClientBuilder extends DefaultHttpClientBuilder {\n public override build<D = any>(): AxiosInstance {\n if (!this.axiosOptions.baseURL) {\n throw new Error(\"Base URL is required\");\n }\n\n return super.build<D>();\n }\n\n public withXApiKeyHeader(apiKey?: string): this {\n if (!apiKey?.length) {\n throw new Error(\"XApiKey header may not be an empty string\");\n }\n\n this.withHeaders({ [apiKeyHeaderKey]: apiKey });\n\n return this;\n }\n}\n"],"mappings":";;;AAIA,IAAa,6BAAb,cAAgD,yBAAyB;CACvE,QAAgD;EAC9C,IAAI,CAAC,KAAK,aAAa,SACrB,MAAM,IAAI,MAAM,uBAAuB;EAGzC,OAAO,MAAM,OAAU;;CAGzB,kBAAyB,QAAuB;EAC9C,IAAI,CAAC,QAAQ,QACX,MAAM,IAAI,MAAM,4CAA4C;EAG9D,KAAK,YAAY,GAAG,kBAAkB,QAAQ,CAAC;EAE/C,OAAO"}
|