@fdm-monster/server 1.8.3 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (448) hide show
  1. package/.env.template +6 -4
  2. package/.gitattributes +4 -2
  3. package/.yarn/install-state.gz +0 -0
  4. package/.yarn/releases/yarn-4.9.1.cjs +948 -0
  5. package/.yarnrc.yml +1 -1
  6. package/README.md +27 -28
  7. package/RELEASE_NOTES.MD +69 -1
  8. package/biome.json +33 -0
  9. package/dist/consoles/download-github-releases.js.map +1 -1
  10. package/dist/consoles/launch-http-servers.js +31 -0
  11. package/dist/consoles/launch-http-servers.js.map +1 -0
  12. package/dist/consoles/mock-octoprint.server.js +291 -0
  13. package/dist/consoles/mock-octoprint.server.js.map +1 -0
  14. package/dist/consoles/mock-prusalink.server.js +57 -0
  15. package/dist/consoles/mock-prusalink.server.js.map +1 -0
  16. package/dist/consoles/utils/api-messages.js +856 -0
  17. package/dist/consoles/utils/api-messages.js.map +1 -0
  18. package/dist/consoles/utils/delayed-memory.storage.js +42 -0
  19. package/dist/consoles/utils/delayed-memory.storage.js.map +1 -0
  20. package/dist/consoles/utils/ws-messages.js +88 -0
  21. package/dist/consoles/utils/ws-messages.js.map +1 -0
  22. package/dist/constants/event.constants.js +5 -21
  23. package/dist/constants/event.constants.js.map +1 -1
  24. package/dist/constants/server-settings.constants.js +8 -12
  25. package/dist/constants/server-settings.constants.js.map +1 -1
  26. package/dist/container.js +13 -14
  27. package/dist/container.js.map +1 -1
  28. package/dist/container.tokens.js +3 -4
  29. package/dist/container.tokens.js.map +1 -1
  30. package/dist/controllers/auth.controller.js +114 -24
  31. package/dist/controllers/auth.controller.js.map +1 -1
  32. package/dist/controllers/batch-call.controller.js +95 -24
  33. package/dist/controllers/batch-call.controller.js.map +1 -1
  34. package/dist/controllers/camera-stream.controller.js +16 -12
  35. package/dist/controllers/camera-stream.controller.js.map +1 -1
  36. package/dist/controllers/custom-gcode.controller.js +116 -40
  37. package/dist/controllers/custom-gcode.controller.js.map +1 -1
  38. package/dist/controllers/dto/update-client-dist.dto.js +0 -21
  39. package/dist/controllers/dto/update-client-dist.dto.js.map +1 -1
  40. package/dist/controllers/first-time-setup.controller.js +54 -18
  41. package/dist/controllers/first-time-setup.controller.js.map +1 -1
  42. package/dist/controllers/floor.controller.js +154 -43
  43. package/dist/controllers/floor.controller.js.map +1 -1
  44. package/dist/controllers/metrics.controller.js +56 -0
  45. package/dist/controllers/metrics.controller.js.map +1 -0
  46. package/dist/controllers/print-completion.controller.js +81 -18
  47. package/dist/controllers/print-completion.controller.js.map +1 -1
  48. package/dist/controllers/printer-files.controller.js +45 -29
  49. package/dist/controllers/printer-files.controller.js.map +1 -1
  50. package/dist/controllers/printer-group.controller.js +123 -33
  51. package/dist/controllers/printer-group.controller.js.map +1 -1
  52. package/dist/controllers/printer-settings.controller.js +73 -26
  53. package/dist/controllers/printer-settings.controller.js.map +1 -1
  54. package/dist/controllers/printer.controller.js +57 -198
  55. package/dist/controllers/printer.controller.js.map +1 -1
  56. package/dist/controllers/server-private.controller.js +153 -39
  57. package/dist/controllers/server-private.controller.js.map +1 -1
  58. package/dist/controllers/server-public.controller.js +87 -88
  59. package/dist/controllers/server-public.controller.js.map +1 -1
  60. package/dist/controllers/settings.controller.js +222 -79
  61. package/dist/controllers/settings.controller.js.map +1 -1
  62. package/dist/controllers/user.controller.js +67 -57
  63. package/dist/controllers/user.controller.js.map +1 -1
  64. package/dist/controllers/validation/auth-controller.validation.js +6 -5
  65. package/dist/controllers/validation/auth-controller.validation.js.map +1 -1
  66. package/dist/controllers/validation/batch-controller.validation.js +17 -18
  67. package/dist/controllers/validation/batch-controller.validation.js.map +1 -1
  68. package/dist/controllers/validation/generic.validation.js +8 -3
  69. package/dist/controllers/validation/generic.validation.js.map +1 -1
  70. package/dist/controllers/validation/printer-completion-controller.validation.js +16 -0
  71. package/dist/controllers/validation/printer-completion-controller.validation.js.map +1 -0
  72. package/dist/controllers/validation/printer-controller.validation.js +31 -50
  73. package/dist/controllers/validation/printer-controller.validation.js.map +1 -1
  74. package/dist/controllers/validation/printer-files-controller.validation.js +25 -15
  75. package/dist/controllers/validation/printer-files-controller.validation.js.map +1 -1
  76. package/dist/controllers/validation/printer-settings-controller.validation.js +6 -5
  77. package/dist/controllers/validation/printer-settings-controller.validation.js.map +1 -1
  78. package/dist/controllers/validation/server-private.validation.js +17 -0
  79. package/dist/controllers/validation/server-private.validation.js.map +1 -0
  80. package/dist/controllers/validation/setting.validation.js +28 -10
  81. package/dist/controllers/validation/setting.validation.js.map +1 -1
  82. package/dist/controllers/validation/user-controller.validation.js +44 -13
  83. package/dist/controllers/validation/user-controller.validation.js.map +1 -1
  84. package/dist/data-source.js +10 -6
  85. package/dist/data-source.js.map +1 -1
  86. package/dist/entities/camera-stream.entity.js +2 -3
  87. package/dist/entities/camera-stream.entity.js.map +1 -1
  88. package/dist/entities/custom-gcode.entity.js +1 -2
  89. package/dist/entities/custom-gcode.entity.js.map +1 -1
  90. package/dist/entities/floor-position.entity.js.map +1 -1
  91. package/dist/entities/floor.entity.js +1 -2
  92. package/dist/entities/floor.entity.js.map +1 -1
  93. package/dist/entities/group.entity.js +6 -2
  94. package/dist/entities/group.entity.js.map +1 -1
  95. package/dist/entities/permission.entity.js +1 -2
  96. package/dist/entities/permission.entity.js.map +1 -1
  97. package/dist/entities/print-completion.entity.js +1 -2
  98. package/dist/entities/print-completion.entity.js.map +1 -1
  99. package/dist/entities/printer-group.entity.js +6 -2
  100. package/dist/entities/printer-group.entity.js.map +1 -1
  101. package/dist/entities/printer.entity.js +22 -4
  102. package/dist/entities/printer.entity.js.map +1 -1
  103. package/dist/entities/refresh-token.entity.js +1 -2
  104. package/dist/entities/refresh-token.entity.js.map +1 -1
  105. package/dist/entities/role.entity.js +1 -2
  106. package/dist/entities/role.entity.js.map +1 -1
  107. package/dist/entities/settings.entity.js +1 -2
  108. package/dist/entities/settings.entity.js.map +1 -1
  109. package/dist/entities/user-role.entity.js +1 -2
  110. package/dist/entities/user-role.entity.js.map +1 -1
  111. package/dist/entities/user.entity.js +1 -2
  112. package/dist/entities/user.entity.js.map +1 -1
  113. package/dist/exceptions/runtime.exceptions.js.map +1 -1
  114. package/dist/handlers/logger-factory.js +2 -2
  115. package/dist/handlers/logger-factory.js.map +1 -1
  116. package/dist/handlers/logger.js +11 -58
  117. package/dist/handlers/logger.js.map +1 -1
  118. package/dist/handlers/logging/file-logging.transport.js +35 -0
  119. package/dist/handlers/logging/file-logging.transport.js.map +1 -0
  120. package/dist/handlers/logging/loki-logging.transport.js +55 -0
  121. package/dist/handlers/logging/loki-logging.transport.js.map +1 -0
  122. package/dist/handlers/logging/static.logger.js +134 -0
  123. package/dist/handlers/logging/static.logger.js.map +1 -0
  124. package/dist/handlers/validators.js +7 -116
  125. package/dist/handlers/validators.js.map +1 -1
  126. package/dist/index.js +13 -0
  127. package/dist/index.js.map +1 -1
  128. package/dist/middleware/authenticate.js +11 -22
  129. package/dist/middleware/authenticate.js.map +1 -1
  130. package/dist/middleware/database.js.map +1 -1
  131. package/dist/middleware/demo.middleware.js +4 -17
  132. package/dist/middleware/demo.middleware.js.map +1 -1
  133. package/dist/middleware/exception.filter.js +23 -23
  134. package/dist/middleware/exception.filter.js.map +1 -1
  135. package/dist/middleware/global.middleware.js +4 -4
  136. package/dist/middleware/global.middleware.js.map +1 -1
  137. package/dist/middleware/param-converter.middleware.js +81 -0
  138. package/dist/middleware/param-converter.middleware.js.map +1 -0
  139. package/dist/middleware/passport.js +3 -5
  140. package/dist/middleware/passport.js.map +1 -1
  141. package/dist/middleware/printer-resolver.js +37 -0
  142. package/dist/middleware/printer-resolver.js.map +1 -0
  143. package/dist/middleware/printer.js +22 -10
  144. package/dist/middleware/printer.js.map +1 -1
  145. package/dist/middleware/socketio.middleware.js +35 -0
  146. package/dist/middleware/socketio.middleware.js.map +1 -0
  147. package/dist/migrations/1706829146617-InitSqlite.js +1 -1
  148. package/dist/migrations/1706829146617-InitSqlite.js.map +1 -1
  149. package/dist/migrations/1707494762198-PrinterGroup.js +1 -1
  150. package/dist/migrations/1707494762198-PrinterGroup.js.map +1 -1
  151. package/dist/migrations/1708465930665-ChangePrintCompletionDeletePrinterCascade.js +1 -1
  152. package/dist/migrations/1708465930665-ChangePrintCompletionDeletePrinterCascade.js.map +1 -1
  153. package/dist/migrations/1713897879622-AddPrinterType.js +1 -1
  154. package/dist/migrations/1713897879622-AddPrinterType.js.map +1 -1
  155. package/dist/migrations/1745141688926-AddPrinterUsernamePassword.js +229 -0
  156. package/dist/migrations/1745141688926-AddPrinterUsernamePassword.js.map +1 -0
  157. package/dist/models/Auth/Permission.js.map +1 -1
  158. package/dist/models/Auth/RefreshToken.js +1 -1
  159. package/dist/models/Auth/RefreshToken.js.map +1 -1
  160. package/dist/models/Auth/Role.js.map +1 -1
  161. package/dist/models/Auth/User.js.map +1 -1
  162. package/dist/models/CameraStream.js +20 -0
  163. package/dist/models/CameraStream.js.map +1 -1
  164. package/dist/models/CustomGcode.js.map +1 -1
  165. package/dist/models/Floor.js.map +1 -1
  166. package/dist/models/FloorPrinter.js +10 -1
  167. package/dist/models/FloorPrinter.js.map +1 -1
  168. package/dist/models/PrintCompletion.js.map +1 -1
  169. package/dist/models/Printer.js +12 -5
  170. package/dist/models/Printer.js.map +1 -1
  171. package/dist/models/Settings.js +11 -43
  172. package/dist/models/Settings.js.map +1 -1
  173. package/dist/models/index.js +0 -4
  174. package/dist/models/index.js.map +1 -1
  175. package/dist/mongo-migrations/20210713120034-printers-settingsapperance-apikey.js.map +1 -1
  176. package/dist/mongo-migrations/20210907173950-printers-enabled.js.map +1 -1
  177. package/dist/mongo-migrations/20211029110742-user-password-passwordhash.js.map +1 -1
  178. package/dist/mongo-migrations/20230414141005-floor-remove-groupinfloor.js.map +1 -1
  179. package/dist/mongo-migrations/20230427202911-printer-remove-sortindex.js.map +1 -1
  180. package/dist/mongo-migrations/20230716065316-user-remove-name.js.map +1 -1
  181. package/dist/mongo-migrations/20231111081809-printer-flatten-name.js.map +1 -1
  182. package/dist/mongo-migrations/20231111082521-printer-remove-settingsappearance.js.map +1 -1
  183. package/dist/mongo-migrations/20231202183902-printer-files-simpler.js.map +1 -1
  184. package/dist/server.constants.js +8 -4
  185. package/dist/server.constants.js.map +1 -1
  186. package/dist/server.core.js +29 -2
  187. package/dist/server.core.js.map +1 -1
  188. package/dist/server.env.js +22 -18
  189. package/dist/server.env.js.map +1 -1
  190. package/dist/server.host.js +24 -33
  191. package/dist/server.host.js.map +1 -1
  192. package/dist/services/authentication/auth.service.js +15 -20
  193. package/dist/services/authentication/auth.service.js.map +1 -1
  194. package/dist/services/authentication/jwt.service.js +1 -1
  195. package/dist/services/authentication/jwt.service.js.map +1 -1
  196. package/dist/services/core/batch-call.service.js +23 -25
  197. package/dist/services/core/batch-call.service.js.map +1 -1
  198. package/dist/services/core/client-bundle.service.js +78 -136
  199. package/dist/services/core/client-bundle.service.js.map +1 -1
  200. package/dist/services/core/config.service.js.map +1 -1
  201. package/dist/services/core/cradle.service.js +21 -0
  202. package/dist/services/core/cradle.service.js.map +1 -0
  203. package/dist/services/core/github.service.js +2 -2
  204. package/dist/services/core/github.service.js.map +1 -1
  205. package/dist/services/core/http-client.factory.js +1 -1
  206. package/dist/services/core/http-client.factory.js.map +1 -1
  207. package/dist/services/core/logs-manager.service.js +3 -3
  208. package/dist/services/core/logs-manager.service.js.map +1 -1
  209. package/dist/services/core/monsterpi.service.js +1 -1
  210. package/dist/services/core/monsterpi.service.js.map +1 -1
  211. package/dist/services/core/multer.service.js +8 -7
  212. package/dist/services/core/multer.service.js.map +1 -1
  213. package/dist/services/core/server-release.service.js +14 -8
  214. package/dist/services/core/server-release.service.js.map +1 -1
  215. package/dist/services/core/yaml.service.js +16 -17
  216. package/dist/services/core/yaml.service.js.map +1 -1
  217. package/dist/services/interfaces/camera-stream.dto.js +4 -34
  218. package/dist/services/interfaces/camera-stream.dto.js.map +1 -1
  219. package/dist/services/interfaces/custom-gcode.dto.js.map +1 -1
  220. package/dist/services/interfaces/floor.dto.js +5 -47
  221. package/dist/services/interfaces/floor.dto.js.map +1 -1
  222. package/dist/services/interfaces/login.dto.js +2 -0
  223. package/dist/services/interfaces/login.dto.js.map +1 -1
  224. package/dist/services/interfaces/print-completion.dto.js.map +1 -1
  225. package/dist/services/interfaces/printer-group.dto.js +0 -14
  226. package/dist/services/interfaces/printer-group.dto.js.map +1 -1
  227. package/dist/services/interfaces/printer.dto.js +11 -11
  228. package/dist/services/interfaces/printer.dto.js.map +1 -1
  229. package/dist/services/interfaces/settings.dto.js.map +1 -1
  230. package/dist/services/interfaces/task.interfaces.js +6 -0
  231. package/dist/services/interfaces/task.interfaces.js.map +1 -0
  232. package/dist/services/mongoose/camera-stream.service.js +17 -15
  233. package/dist/services/mongoose/camera-stream.service.js.map +1 -1
  234. package/dist/services/mongoose/custom-gcode.service.js +4 -2
  235. package/dist/services/mongoose/custom-gcode.service.js.map +1 -1
  236. package/dist/services/mongoose/floor.service.js +37 -30
  237. package/dist/services/mongoose/floor.service.js.map +1 -1
  238. package/dist/services/mongoose/permission.service.js +1 -1
  239. package/dist/services/mongoose/permission.service.js.map +1 -1
  240. package/dist/services/mongoose/print-completion.service.js +2 -2
  241. package/dist/services/mongoose/print-completion.service.js.map +1 -1
  242. package/dist/services/mongoose/print-completion.shared.js +2 -2
  243. package/dist/services/mongoose/print-completion.shared.js.map +1 -1
  244. package/dist/services/mongoose/printer.service.js +33 -45
  245. package/dist/services/mongoose/printer.service.js.map +1 -1
  246. package/dist/services/mongoose/refresh-token.service.js +5 -8
  247. package/dist/services/mongoose/refresh-token.service.js.map +1 -1
  248. package/dist/services/mongoose/role.service.js +14 -5
  249. package/dist/services/mongoose/role.service.js.map +1 -1
  250. package/dist/services/mongoose/settings.service.js +35 -62
  251. package/dist/services/mongoose/settings.service.js.map +1 -1
  252. package/dist/services/mongoose/user.service.js +8 -7
  253. package/dist/services/mongoose/user.service.js.map +1 -1
  254. package/dist/services/moonraker/constants/{websocket.constants.js → moonraker.constants.js} +1 -1
  255. package/dist/services/moonraker/constants/{websocket.constants.js.map → moonraker.constants.js.map} +1 -1
  256. package/dist/services/moonraker/moonraker-websocket.adapter.js +109 -96
  257. package/dist/services/moonraker/moonraker-websocket.adapter.js.map +1 -1
  258. package/dist/services/moonraker/moonraker.client.js +25 -16
  259. package/dist/services/moonraker/moonraker.client.js.map +1 -1
  260. package/dist/services/moonraker.api.js +5 -7
  261. package/dist/services/moonraker.api.js.map +1 -1
  262. package/dist/services/octoprint/constants/octoprint-service.constants.js +7 -36
  263. package/dist/services/octoprint/constants/octoprint-service.constants.js.map +1 -1
  264. package/dist/services/octoprint/constants/octoprint-websocket.constants.js +12 -3
  265. package/dist/services/octoprint/constants/octoprint-websocket.constants.js.map +1 -1
  266. package/dist/services/octoprint/dto/octoprint-event.dto.js +2 -1
  267. package/dist/services/octoprint/dto/octoprint-event.dto.js.map +1 -1
  268. package/dist/services/octoprint/octoprint-api.routes.js +1 -38
  269. package/dist/services/octoprint/octoprint-api.routes.js.map +1 -1
  270. package/dist/services/octoprint/octoprint-websocket.adapter.js +66 -72
  271. package/dist/services/octoprint/octoprint-websocket.adapter.js.map +1 -1
  272. package/dist/services/octoprint/octoprint.client.js +19 -192
  273. package/dist/services/octoprint/octoprint.client.js.map +1 -1
  274. package/dist/services/octoprint/utils/octoprint-http-client.builder.js.map +1 -1
  275. package/dist/services/octoprint.api.js +10 -19
  276. package/dist/services/octoprint.api.js.map +1 -1
  277. package/dist/services/orm/base.service.js +11 -12
  278. package/dist/services/orm/base.service.js.map +1 -1
  279. package/dist/services/orm/camera-stream.service.js +5 -1
  280. package/dist/services/orm/camera-stream.service.js.map +1 -1
  281. package/dist/services/orm/custom-gcode.service.js +2 -2
  282. package/dist/services/orm/custom-gcode.service.js.map +1 -1
  283. package/dist/services/orm/floor-position.service.js +0 -5
  284. package/dist/services/orm/floor-position.service.js.map +1 -1
  285. package/dist/services/orm/floor.service.js +43 -39
  286. package/dist/services/orm/floor.service.js.map +1 -1
  287. package/dist/services/orm/permission.service.js +3 -4
  288. package/dist/services/orm/permission.service.js.map +1 -1
  289. package/dist/services/orm/print-completion.service.js +2 -4
  290. package/dist/services/orm/print-completion.service.js.map +1 -1
  291. package/dist/services/orm/printer-group.service.js +2 -7
  292. package/dist/services/orm/printer-group.service.js.map +1 -1
  293. package/dist/services/orm/printer.service.js +21 -36
  294. package/dist/services/orm/printer.service.js.map +1 -1
  295. package/dist/services/orm/refresh-token.service.js +5 -11
  296. package/dist/services/orm/refresh-token.service.js.map +1 -1
  297. package/dist/services/orm/role.service.js +11 -10
  298. package/dist/services/orm/role.service.js.map +1 -1
  299. package/dist/services/orm/settings.service.js +37 -133
  300. package/dist/services/orm/settings.service.js.map +1 -1
  301. package/dist/services/orm/user.service.js +13 -15
  302. package/dist/services/orm/user.service.js.map +1 -1
  303. package/dist/services/printer-api.factory.js +9 -6
  304. package/dist/services/printer-api.factory.js.map +1 -1
  305. package/dist/services/printer-api.interface.js +13 -6
  306. package/dist/services/printer-api.interface.js.map +1 -1
  307. package/dist/services/prusa-link/constants/prusalink-event.dto.js +18 -0
  308. package/dist/services/prusa-link/constants/prusalink-event.dto.js.map +1 -0
  309. package/dist/services/prusa-link/constants/prusalink.constants.js +13 -0
  310. package/dist/services/prusa-link/constants/prusalink.constants.js.map +1 -0
  311. package/dist/services/prusa-link/dto/file-response.dto.js +6 -0
  312. package/dist/services/prusa-link/dto/file-response.dto.js.map +1 -0
  313. package/dist/services/{octoprint/dto/plugin.dto.js → prusa-link/dto/file.dto.js} +1 -1
  314. package/dist/services/prusa-link/dto/file.dto.js.map +1 -0
  315. package/dist/services/prusa-link/dto/job-state.dto.js +6 -0
  316. package/dist/services/prusa-link/dto/job-state.dto.js.map +1 -0
  317. package/dist/services/prusa-link/dto/printer-state.dto.js +6 -0
  318. package/dist/services/prusa-link/dto/printer-state.dto.js.map +1 -0
  319. package/dist/services/prusa-link/dto/status.dto.js +6 -0
  320. package/dist/services/prusa-link/dto/status.dto.js.map +1 -0
  321. package/dist/services/prusa-link/dto/version.dto.js +6 -0
  322. package/dist/services/prusa-link/dto/version.dto.js.map +1 -0
  323. package/dist/services/prusa-link/prusa-link-http-polling.adapter.js +142 -0
  324. package/dist/services/prusa-link/prusa-link-http-polling.adapter.js.map +1 -0
  325. package/dist/services/prusa-link/prusa-link.api.js +235 -0
  326. package/dist/services/prusa-link/prusa-link.api.js.map +1 -0
  327. package/dist/services/prusa-link/utils/digest-auth.params.js +6 -0
  328. package/dist/services/prusa-link/utils/digest-auth.params.js.map +1 -0
  329. package/dist/services/prusa-link/utils/digest-auth.util.js +28 -0
  330. package/dist/services/prusa-link/utils/digest-auth.util.js.map +1 -0
  331. package/dist/services/prusa-link/utils/prusa-link-http-client.builder.js +131 -0
  332. package/dist/services/prusa-link/utils/prusa-link-http-client.builder.js.map +1 -0
  333. package/dist/services/socket.factory.js +9 -6
  334. package/dist/services/socket.factory.js.map +1 -1
  335. package/dist/services/{core/task-manager.service.js → task-manager.service.js} +72 -78
  336. package/dist/services/task-manager.service.js.map +1 -0
  337. package/dist/services/validators/camera-service.validation.js +19 -0
  338. package/dist/services/validators/camera-service.validation.js.map +1 -0
  339. package/dist/services/validators/floor-service.validation.js +47 -36
  340. package/dist/services/validators/floor-service.validation.js.map +1 -1
  341. package/dist/services/validators/print-completion-service.validation.js +22 -9
  342. package/dist/services/validators/print-completion-service.validation.js.map +1 -1
  343. package/dist/services/validators/printer-service.validation.js +112 -29
  344. package/dist/services/validators/printer-service.validation.js.map +1 -1
  345. package/dist/services/validators/settings-service.validation.js +79 -66
  346. package/dist/services/validators/settings-service.validation.js.map +1 -1
  347. package/dist/services/validators/user-service.validation.js +17 -16
  348. package/dist/services/validators/user-service.validation.js.map +1 -1
  349. package/dist/services/validators/yaml-service.validation.js +94 -51
  350. package/dist/services/validators/yaml-service.validation.js.map +1 -1
  351. package/dist/shared/default-http-client.builder.js.map +1 -1
  352. package/dist/shared/load-controllers.js +20 -0
  353. package/dist/shared/load-controllers.js.map +1 -0
  354. package/dist/shared/runtime-settings.migration.js +53 -0
  355. package/dist/shared/runtime-settings.migration.js.map +1 -0
  356. package/dist/shared/websocket-rpc-extended.adapter.js +15 -14
  357. package/dist/shared/websocket-rpc-extended.adapter.js.map +1 -1
  358. package/dist/shared/websocket.adapter.js +4 -5
  359. package/dist/shared/websocket.adapter.js.map +1 -1
  360. package/dist/state/file-upload-tracker.cache.js +5 -4
  361. package/dist/state/file-upload-tracker.cache.js.map +1 -1
  362. package/dist/state/file.cache.js +1 -1
  363. package/dist/state/file.cache.js.map +1 -1
  364. package/dist/state/floor.store.js +6 -6
  365. package/dist/state/floor.store.js.map +1 -1
  366. package/dist/state/printer-events.cache.js +21 -22
  367. package/dist/state/printer-events.cache.js.map +1 -1
  368. package/dist/state/printer-files.store.js +6 -8
  369. package/dist/state/printer-files.store.js.map +1 -1
  370. package/dist/state/printer-socket.store.js +27 -50
  371. package/dist/state/printer-socket.store.js.map +1 -1
  372. package/dist/state/printer-thumbnail.cache.js +5 -9
  373. package/dist/state/printer-thumbnail.cache.js.map +1 -1
  374. package/dist/state/printer.cache.js +14 -12
  375. package/dist/state/printer.cache.js.map +1 -1
  376. package/dist/state/settings.store.js +74 -50
  377. package/dist/state/settings.store.js.map +1 -1
  378. package/dist/state/socket-io.gateway.js +39 -36
  379. package/dist/state/socket-io.gateway.js.map +1 -1
  380. package/dist/state/test-printer-socket.store.js +20 -15
  381. package/dist/state/test-printer-socket.store.js.map +1 -1
  382. package/dist/state/validation/create-test-printer.validation.js +13 -11
  383. package/dist/state/validation/create-test-printer.validation.js.map +1 -1
  384. package/dist/task.presets.js.map +1 -1
  385. package/dist/tasks/boot.task.js +14 -19
  386. package/dist/tasks/boot.task.js.map +1 -1
  387. package/dist/tasks/client-bundle.task.js +1 -3
  388. package/dist/tasks/client-bundle.task.js.map +1 -1
  389. package/dist/tasks/print-completion.socketio.task.js +27 -28
  390. package/dist/tasks/print-completion.socketio.task.js.map +1 -1
  391. package/dist/tasks/printer-file-clean.task.js +6 -10
  392. package/dist/tasks/printer-file-clean.task.js.map +1 -1
  393. package/dist/tasks/printer-websocket-restore.task.js +3 -14
  394. package/dist/tasks/printer-websocket-restore.task.js.map +1 -1
  395. package/dist/tasks/printer-websocket.task.js +2 -14
  396. package/dist/tasks/printer-websocket.task.js.map +1 -1
  397. package/dist/tasks/socketio.task.js +6 -33
  398. package/dist/tasks/socketio.task.js.map +1 -1
  399. package/dist/tasks/software-update.task.js +1 -1
  400. package/dist/tasks/software-update.task.js.map +1 -1
  401. package/dist/tasks.js +3 -3
  402. package/dist/tasks.js.map +1 -1
  403. package/dist/utils/array.util.js.map +1 -1
  404. package/dist/utils/cache/key-diff.cache.js.map +1 -1
  405. package/dist/utils/env.utils.js +0 -2
  406. package/dist/utils/env.utils.js.map +1 -1
  407. package/dist/utils/normalize-url.js +3 -2
  408. package/dist/utils/normalize-url.js.map +1 -1
  409. package/dist/utils/printer-type.utils.js.map +1 -1
  410. package/dist/utils/time.utils.js +7 -17
  411. package/dist/utils/time.utils.js.map +1 -1
  412. package/dist/utils/url.utils.js +3 -4
  413. package/dist/utils/url.utils.js.map +1 -1
  414. package/package.json +46 -48
  415. package/tsconfig.json +2 -1
  416. package/.yarn/releases/yarn-4.7.0.cjs +0 -935
  417. package/dist/consoles/check-ports.js +0 -170
  418. package/dist/consoles/check-ports.js.map +0 -1
  419. package/dist/consoles/http-file-receiver.console.js +0 -81
  420. package/dist/consoles/http-file-receiver.console.js.map +0 -1
  421. package/dist/consoles/sqlite-torm.js +0 -31
  422. package/dist/consoles/sqlite-torm.js.map +0 -1
  423. package/dist/consoles/upload-test.js +0 -52
  424. package/dist/consoles/upload-test.js.map +0 -1
  425. package/dist/controllers/plugin-firmware-update.controller.js +0 -234
  426. package/dist/controllers/plugin-firmware-update.controller.js.map +0 -1
  427. package/dist/entities/base.entity.js +0 -29
  428. package/dist/entities/base.entity.js.map +0 -1
  429. package/dist/entities/printer-file.entity.js +0 -140
  430. package/dist/entities/printer-file.entity.js.map +0 -1
  431. package/dist/handlers/cache-manager.js +0 -18
  432. package/dist/handlers/cache-manager.js.map +0 -1
  433. package/dist/models/PrinterFile.js +0 -44
  434. package/dist/models/PrinterFile.js.map +0 -1
  435. package/dist/services/core/task-manager.service.js.map +0 -1
  436. package/dist/services/octoprint/dto/plugin.dto.js.map +0 -1
  437. package/dist/services/octoprint/plugin-base.service.js +0 -101
  438. package/dist/services/octoprint/plugin-base.service.js.map +0 -1
  439. package/dist/services/octoprint/plugin-firmware-update.service.js +0 -100
  440. package/dist/services/octoprint/plugin-firmware-update.service.js.map +0 -1
  441. package/dist/services/octoprint/plugin-repository.cache.js +0 -46
  442. package/dist/services/octoprint/plugin-repository.cache.js.map +0 -1
  443. package/dist/utils/benchmark.util.js +0 -39
  444. package/dist/utils/benchmark.util.js.map +0 -1
  445. package/dist/utils/is-docker.js +0 -40
  446. package/dist/utils/is-docker.js.map +0 -1
  447. package/dist/utils/metric.utils.js +0 -35
  448. package/dist/utils/metric.utils.js.map +0 -1
package/.yarnrc.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  nodeLinker: node-modules
2
2
 
3
- yarnPath: .yarn/releases/yarn-4.7.0.cjs
3
+ yarnPath: .yarn/releases/yarn-4.9.1.cjs
4
4
  httpTimeout: 1000000
package/README.md CHANGED
@@ -20,7 +20,7 @@
20
20
  </a>
21
21
  </p>
22
22
 
23
- FDM Monster is a server for managing your 3D printer farm through [OctoPrint](https://octoprint.org/) as well as [Klipper](https://www.klipper3d.org/) using [Moonraker](https://github.com/Arksine/moonraker).
23
+ FDM Monster is a server for managing your 3D printer farm through [OctoPrint](https://octoprint.org/) as well as [Klipper](https://www.klipper3d.org/) using [Moonraker](https://github.com/Arksine/moonraker) and [Prusa-Link](https://github.com/prusa3d/Prusa-Link).
24
24
 
25
25
  ## Check out our [documentation](https://docs.fdm-monster.net)
26
26
 
@@ -29,7 +29,7 @@ FDM Monster is a server for managing your 3D printer farm through [OctoPrint](ht
29
29
  ## Features 🖨️
30
30
  Here is a list of features that make FDM Monster stand out:
31
31
 
32
- - Adding OctoPrint and Moonraker instances
32
+ - Adding OctoPrint, Moonraker and Prusa-Link instances
33
33
  - Dragging or creating new printers on a customizable grid
34
34
  - Drag n drop GCode to print
35
35
  - Select printers and print one GCode file in batch
@@ -74,7 +74,7 @@ Thanks to the following parties for their financial support:
74
74
 
75
75
  | Tier 1 | Tier 2 | Tier 3 | Tier 4 | One time |
76
76
  |--------|--------|--------|--------|-----------|
77
- | | [WindArrow3d](https://github.com/WindArrow3d), [thatguymendel](https://github.com/thatguymendel) | | [doucettom](https://github.com/doucettom) | [th3dstudio](https://github.com/th3dstudio) |
77
+ | | [thatguymendel](https://github.com/thatguymendel) | | [doucettom](https://github.com/doucettom) | [th3dstudio](https://github.com/th3dstudio) |
78
78
 
79
79
 
80
80
  ## Contributors ✨
@@ -82,7 +82,7 @@ Thanks to the following parties for their financial support:
82
82
  These are the people involved in the project. Find the meaning of the emoji keys [here](https://allcontributors.org/docs/en/emoji-key).
83
83
 
84
84
  <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
85
- [![All Contributors](https://img.shields.io/badge/all_contributors-22-orange.svg?style=flat-square)](#contributors-)
85
+ [![All Contributors](https://img.shields.io/badge/all_contributors-23-orange.svg?style=flat-square)](#contributors-)
86
86
  <!-- ALL-CONTRIBUTORS-BADGE:END -->
87
87
 
88
88
  <!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
@@ -91,34 +91,33 @@ These are the people involved in the project. Find the meaning of the emoji keys
91
91
  <table>
92
92
  <tbody>
93
93
  <tr>
94
- <td align="center" valign="top" width="14.28%"><a href="https://github.com/davidzwa"><img src="https://avatars.githubusercontent.com/u/6005355?v=4?s=80" width="80px;" alt="David Zwart"/><br /><sub><b>David Zwart</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Adavidzwa" title="Bug reports">🐛</a> <a href="https://github.com/fdm-monster/fdm-monster/commits?author=davidzwa" title="Code">💻</a> <a href="#maintenance-davidzwa" title="Maintenance">🚧</a> <a href="#userTesting-davidzwa" title="User Testing">📓</a></td>
95
- <td align="center" valign="top" width="14.28%"><a href="https://kevenaar.name"><img src="https://avatars.githubusercontent.com/u/834643?v=4?s=80" width="80px;" alt="Maurice Kevenaar"/><br /><sub><b>Maurice Kevenaar</b></sub></a><br /><a href="#security-mkevenaar" title="Security">🛡️</a> <a href="#maintenance-mkevenaar" title="Maintenance">🚧</a> <a href="#ideas-mkevenaar" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Amkevenaar" title="Bug reports">🐛</a> <a href="https://github.com/fdm-monster/fdm-monster/pulls?q=is%3Apr+reviewed-by%3Amkevenaar" title="Reviewed Pull Requests">👀</a> <a href="#infra-mkevenaar" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
96
- <td align="center" valign="top" width="14.28%"><a href="https://github.com/Tobikisss"><img src="https://avatars.githubusercontent.com/u/45754890?v=4?s=80" width="80px;" alt="Tobias"/><br /><sub><b>Tobias</b></sub></a><br /><a href="#ideas-Tobikisss" title="Ideas, Planning, & Feedback">🤔</a> <a href="#maintenance-Tobikisss" title="Maintenance">🚧</a> <a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3ATobikisss" title="Bug reports">🐛</a></td>
97
- <td align="center" valign="top" width="14.28%"><a href="https://tideline3d.com"><img src="https://avatars.githubusercontent.com/u/12903320?v=4?s=80" width="80px;" alt="tideline3d"/><br /><sub><b>tideline3d</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Atideline3d" title="Bug reports">🐛</a> <a href="#ideas-tideline3d" title="Ideas, Planning, & Feedback">🤔</a></td>
98
- <td align="center" valign="top" width="14.28%"><a href="https://github.com/windarrow3d"><img src="https://avatars.githubusercontent.com/u/91099282?v=4?s=80" width="80px;" alt="WindArrow3d"/><br /><sub><b>WindArrow3d</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Awindarrow3d" title="Bug reports">🐛</a> <a href="#financial-windarrow3d" title="Financial">💵</a> <a href="#ideas-windarrow3d" title="Ideas, Planning, & Feedback">🤔</a> <a href="#userTesting-windarrow3d" title="User Testing">📓</a> <a href="#platform-windarrow3d" title="Packaging/porting to new platform">📦</a></td>
99
- <td align="center" valign="top" width="14.28%"><a href="http://lucianchapar.com"><img src="https://avatars.githubusercontent.com/u/33263520?v=4?s=80" width="80px;" alt="Lucian Chapar"/><br /><sub><b>Lucian Chapar</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Alucian151" title="Bug reports">🐛</a></td>
100
- <td align="center" valign="top" width="14.28%"><a href="https://github.com/Dumnersm580"><img src="https://avatars.githubusercontent.com/u/80608783?v=4?s=80" width="80px;" alt="Dumnersm580"/><br /><sub><b>Dumnersm580</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/commits?author=Dumnersm580" title="Documentation">📖</a> <a href="#ideas-Dumnersm580" title="Ideas, Planning, & Feedback">🤔</a></td>
94
+ <td align="center" valign="top" width="10%"><a href="https://github.com/davidzwa"><img src="https://avatars.githubusercontent.com/u/6005355?v=4?s=40" width="40px;" alt="David Zwart"/><br /><sub><b>David Zwart</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Adavidzwa" title="Bug reports">🐛</a> <a href="https://github.com/fdm-monster/fdm-monster/commits?author=davidzwa" title="Code">💻</a> <a href="#maintenance-davidzwa" title="Maintenance">🚧</a> <a href="#userTesting-davidzwa" title="User Testing">📓</a></td>
95
+ <td align="center" valign="top" width="10%"><a href="https://kevenaar.name"><img src="https://avatars.githubusercontent.com/u/834643?v=4?s=40" width="40px;" alt="Maurice Kevenaar"/><br /><sub><b>Maurice Kevenaar</b></sub></a><br /><a href="#security-mkevenaar" title="Security">🛡️</a> <a href="#maintenance-mkevenaar" title="Maintenance">🚧</a> <a href="#ideas-mkevenaar" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Amkevenaar" title="Bug reports">🐛</a> <a href="https://github.com/fdm-monster/fdm-monster/pulls?q=is%3Apr+reviewed-by%3Amkevenaar" title="Reviewed Pull Requests">👀</a> <a href="#infra-mkevenaar" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
96
+ <td align="center" valign="top" width="10%"><a href="https://github.com/Tobikisss"><img src="https://avatars.githubusercontent.com/u/45754890?v=4?s=40" width="40px;" alt="Tobias"/><br /><sub><b>Tobias</b></sub></a><br /><a href="#ideas-Tobikisss" title="Ideas, Planning, & Feedback">🤔</a> <a href="#maintenance-Tobikisss" title="Maintenance">🚧</a> <a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3ATobikisss" title="Bug reports">🐛</a></td>
97
+ <td align="center" valign="top" width="10%"><a href="https://tideline3d.com"><img src="https://avatars.githubusercontent.com/u/12903320?v=4?s=40" width="40px;" alt="tideline3d"/><br /><sub><b>tideline3d</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Atideline3d" title="Bug reports">🐛</a> <a href="#ideas-tideline3d" title="Ideas, Planning, & Feedback">🤔</a></td>
98
+ <td align="center" valign="top" width="10%"><a href="https://github.com/windarrow3d"><img src="https://avatars.githubusercontent.com/u/91099282?v=4?s=40" width="40px;" alt="WindArrow3d"/><br /><sub><b>WindArrow3d</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Awindarrow3d" title="Bug reports">🐛</a> <a href="#financial-windarrow3d" title="Financial">💵</a> <a href="#ideas-windarrow3d" title="Ideas, Planning, & Feedback">🤔</a> <a href="#userTesting-windarrow3d" title="User Testing">📓</a> <a href="#platform-windarrow3d" title="Packaging/porting to new platform">📦</a></td>
99
+ <td align="center" valign="top" width="10%"><a href="http://lucianchapar.com"><img src="https://avatars.githubusercontent.com/u/33263520?v=4?s=40" width="40px;" alt="Lucian Chapar"/><br /><sub><b>Lucian Chapar</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Alucian151" title="Bug reports">🐛</a></td>
100
+ <td align="center" valign="top" width="10%"><a href="https://github.com/Dumnersm580"><img src="https://avatars.githubusercontent.com/u/80608783?v=4?s=40" width="40px;" alt="Dumnersm580"/><br /><sub><b>Dumnersm580</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/commits?author=Dumnersm580" title="Documentation">📖</a> <a href="#ideas-Dumnersm580" title="Ideas, Planning, & Feedback">🤔</a></td>
101
+ <td align="center" valign="top" width="10%"><a href="http://www.tophattwaffle.com"><img src="https://avatars.githubusercontent.com/u/6774125?v=4?s=40" width="40px;" alt="tophattwaffle"/><br /><sub><b>tophattwaffle</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Atophattwaffle" title="Bug reports">🐛</a> <a href="#ideas-tophattwaffle" title="Ideas, Planning, & Feedback">🤔</a></td>
102
+ <td align="center" valign="top" width="10%"><a href="https://github.com/rmhenn"><img src="https://avatars.githubusercontent.com/u/22482801?v=4?s=40" width="40px;" alt="rmhenn"/><br /><sub><b>rmhenn</b></sub></a><br /><a href="#ideas-rmhenn" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Armhenn" title="Bug reports">🐛</a></td>
103
+ <td align="center" valign="top" width="10%"><a href="https://github.com/cyrixdx4"><img src="https://avatars.githubusercontent.com/u/62126724?v=4?s=40" width="40px;" alt="cyrixdx4"/><br /><sub><b>cyrixdx4</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Acyrixdx4" title="Bug reports">🐛</a></td>
101
104
  </tr>
102
105
  <tr>
103
- <td align="center" valign="top" width="14.28%"><a href="http://www.tophattwaffle.com"><img src="https://avatars.githubusercontent.com/u/6774125?v=4?s=80" width="80px;" alt="tophattwaffle"/><br /><sub><b>tophattwaffle</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Atophattwaffle" title="Bug reports">🐛</a> <a href="#ideas-tophattwaffle" title="Ideas, Planning, & Feedback">🤔</a></td>
104
- <td align="center" valign="top" width="14.28%"><a href="https://github.com/rmhenn"><img src="https://avatars.githubusercontent.com/u/22482801?v=4?s=80" width="80px;" alt="rmhenn"/><br /><sub><b>rmhenn</b></sub></a><br /><a href="#ideas-rmhenn" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Armhenn" title="Bug reports">🐛</a></td>
105
- <td align="center" valign="top" width="14.28%"><a href="https://github.com/cyrixdx4"><img src="https://avatars.githubusercontent.com/u/62126724?v=4?s=80" width="80px;" alt="cyrixdx4"/><br /><sub><b>cyrixdx4</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Acyrixdx4" title="Bug reports">🐛</a></td>
106
- <td align="center" valign="top" width="14.28%"><a href="https://github.com/doucettom"><img src="https://avatars.githubusercontent.com/u/6595645?v=4?s=80" width="80px;" alt="doucettom"/><br /><sub><b>doucettom</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Adoucettom" title="Bug reports">🐛</a> <a href="#ideas-doucettom" title="Ideas, Planning, & Feedback">🤔</a></td>
107
- <td align="center" valign="top" width="14.28%"><a href="https://github.com/ZombiesLoveMe"><img src="https://avatars.githubusercontent.com/u/35661391?v=4?s=80" width="80px;" alt="Callum"/><br /><sub><b>Callum</b></sub></a><br /><a href="#ideas-ZombiesLoveMe" title="Ideas, Planning, & Feedback">🤔</a></td>
108
- <td align="center" valign="top" width="14.28%"><a href="https://github.com/bharvey88"><img src="https://avatars.githubusercontent.com/u/8107750?v=4?s=80" width="80px;" alt="bharvey88"/><br /><sub><b>bharvey88</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Abharvey88" title="Bug reports">🐛</a> <a href="#infra-bharvey88" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#platform-bharvey88" title="Packaging/porting to new platform">📦</a></td>
109
- <td align="center" valign="top" width="14.28%"><a href="https://github.com/Mikec78660"><img src="https://avatars.githubusercontent.com/u/108021920?v=4?s=80" width="80px;" alt="Mikec78660"/><br /><sub><b>Mikec78660</b></sub></a><br /><a href="#ideas-Mikec78660" title="Ideas, Planning, & Feedback">🤔</a></td>
106
+ <td align="center" valign="top" width="10%"><a href="https://github.com/doucettom"><img src="https://avatars.githubusercontent.com/u/6595645?v=4?s=40" width="40px;" alt="doucettom"/><br /><sub><b>doucettom</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Adoucettom" title="Bug reports">🐛</a> <a href="#ideas-doucettom" title="Ideas, Planning, & Feedback">🤔</a></td>
107
+ <td align="center" valign="top" width="10%"><a href="https://github.com/ZombiesLoveMe"><img src="https://avatars.githubusercontent.com/u/35661391?v=4?s=40" width="40px;" alt="Callum"/><br /><sub><b>Callum</b></sub></a><br /><a href="#ideas-ZombiesLoveMe" title="Ideas, Planning, & Feedback">🤔</a></td>
108
+ <td align="center" valign="top" width="10%"><a href="https://github.com/bharvey88"><img src="https://avatars.githubusercontent.com/u/8107750?v=4?s=40" width="40px;" alt="bharvey88"/><br /><sub><b>bharvey88</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Abharvey88" title="Bug reports">🐛</a> <a href="#infra-bharvey88" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#platform-bharvey88" title="Packaging/porting to new platform">📦</a></td>
109
+ <td align="center" valign="top" width="10%"><a href="https://github.com/Mikec78660"><img src="https://avatars.githubusercontent.com/u/108021920?v=4?s=40" width="40px;" alt="Mikec78660"/><br /><sub><b>Mikec78660</b></sub></a><br /><a href="#ideas-Mikec78660" title="Ideas, Planning, & Feedback">🤔</a></td>
110
+ <td align="center" valign="top" width="10%"><a href="https://techinterview.guide"><img src="https://avatars.githubusercontent.com/u/168030?v=4?s=40" width="40px;" alt="w. ian douglas"/><br /><sub><b>w. ian douglas</b></sub></a><br /><a href="#ideas-iandouglas" title="Ideas, Planning, & Feedback">🤔</a></td>
111
+ <td align="center" valign="top" width="10%"><a href="http://insanityautomation.com/"><img src="https://avatars.githubusercontent.com/u/38436470?v=4?s=40" width="40px;" alt="InsanityAutomation"/><br /><sub><b>InsanityAutomation</b></sub></a><br /><a href="#ideas-InsanityAutomation" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3AInsanityAutomation" title="Bug reports">🐛</a></td>
112
+ <td align="center" valign="top" width="10%"><a href="https://github.com/LyfeOnEdge"><img src="https://avatars.githubusercontent.com/u/26140376?v=4?s=40" width="40px;" alt="Andrew (LyfeOnEdge) (ArcticGentoo)"/><br /><sub><b>Andrew (LyfeOnEdge) (ArcticGentoo)</b></sub></a><br /><a href="#ideas-LyfeOnEdge" title="Ideas, Planning, & Feedback">🤔</a></td>
113
+ <td align="center" valign="top" width="10%"><a href="https://github.com/callanova"><img src="https://avatars.githubusercontent.com/u/175639705?v=4?s=40" width="40px;" alt="callanova"/><br /><sub><b>callanova</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Acallanova" title="Bug reports">🐛</a></td>
114
+ <td align="center" valign="top" width="10%"><a href="https://github.com/thatguymendel"><img src="https://avatars.githubusercontent.com/u/67444998?v=4?s=40" width="40px;" alt="thatguymendel"/><br /><sub><b>thatguymendel</b></sub></a><br /><a href="#ideas-thatguymendel" title="Ideas, Planning, & Feedback">🤔</a></td>
115
+ <td align="center" valign="top" width="10%"><a href="https://github.com/julien-printerbox"><img src="https://avatars.githubusercontent.com/u/134132189?v=4?s=40" width="40px;" alt="julien-printerbox"/><br /><sub><b>julien-printerbox</b></sub></a><br /><a href="#ideas-julien-printerbox" title="Ideas, Planning, & Feedback">🤔</a></td>
110
116
  </tr>
111
117
  <tr>
112
- <td align="center" valign="top" width="14.28%"><a href="https://techinterview.guide"><img src="https://avatars.githubusercontent.com/u/168030?v=4?s=80" width="80px;" alt="w. ian douglas"/><br /><sub><b>w. ian douglas</b></sub></a><br /><a href="#ideas-iandouglas" title="Ideas, Planning, & Feedback">🤔</a></td>
113
- <td align="center" valign="top" width="14.28%"><a href="http://insanityautomation.com/"><img src="https://avatars.githubusercontent.com/u/38436470?v=4?s=80" width="80px;" alt="InsanityAutomation"/><br /><sub><b>InsanityAutomation</b></sub></a><br /><a href="#ideas-InsanityAutomation" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3AInsanityAutomation" title="Bug reports">🐛</a></td>
114
- <td align="center" valign="top" width="14.28%"><a href="https://github.com/LyfeOnEdge"><img src="https://avatars.githubusercontent.com/u/26140376?v=4?s=80" width="80px;" alt="Andrew (LyfeOnEdge) (ArcticGentoo)"/><br /><sub><b>Andrew (LyfeOnEdge) (ArcticGentoo)</b></sub></a><br /><a href="#ideas-LyfeOnEdge" title="Ideas, Planning, & Feedback">🤔</a></td>
115
- <td align="center" valign="top" width="14.28%"><a href="https://github.com/callanova"><img src="https://avatars.githubusercontent.com/u/175639705?v=4?s=80" width="80px;" alt="callanova"/><br /><sub><b>callanova</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Acallanova" title="Bug reports">🐛</a></td>
116
- <td align="center" valign="top" width="14.28%"><a href="https://github.com/thatguymendel"><img src="https://avatars.githubusercontent.com/u/67444998?v=4?s=80" width="80px;" alt="thatguymendel"/><br /><sub><b>thatguymendel</b></sub></a><br /><a href="#ideas-thatguymendel" title="Ideas, Planning, & Feedback">🤔</a></td>
117
- <td align="center" valign="top" width="14.28%"><a href="https://github.com/julien-printerbox"><img src="https://avatars.githubusercontent.com/u/134132189?v=4?s=80" width="80px;" alt="julien-printerbox"/><br /><sub><b>julien-printerbox</b></sub></a><br /><a href="#ideas-julien-printerbox" title="Ideas, Planning, & Feedback">🤔</a></td>
118
- <td align="center" valign="top" width="14.28%"><a href="https://github.com/Tbwan"><img src="https://avatars.githubusercontent.com/u/44231748?v=4?s=80" width="80px;" alt="Tbwan"/><br /><sub><b>Tbwan</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3ATbwan" title="Bug reports">🐛</a></td>
119
- </tr>
120
- <tr>
121
- <td align="center" valign="top" width="14.28%"><a href="https://github.com/nuvious"><img src="https://avatars.githubusercontent.com/u/5287736?v=4?s=80" width="80px;" alt="David Cheeseman"/><br /><sub><b>David Cheeseman</b></sub></a><br /><a href="#ideas-nuvious" title="Ideas, Planning, & Feedback">🤔</a> <a href="#platform-nuvious" title="Packaging/porting to new platform">📦</a> <a href="#infra-nuvious" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
118
+ <td align="center" valign="top" width="10%"><a href="https://github.com/Tbwan"><img src="https://avatars.githubusercontent.com/u/44231748?v=4?s=40" width="40px;" alt="Tbwan"/><br /><sub><b>Tbwan</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3ATbwan" title="Bug reports">🐛</a></td>
119
+ <td align="center" valign="top" width="10%"><a href="https://github.com/nuvious"><img src="https://avatars.githubusercontent.com/u/5287736?v=4?s=40" width="40px;" alt="David Cheeseman"/><br /><sub><b>David Cheeseman</b></sub></a><br /><a href="#ideas-nuvious" title="Ideas, Planning, & Feedback">🤔</a> <a href="#platform-nuvious" title="Packaging/porting to new platform">📦</a> <a href="#infra-nuvious" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
120
+ <td align="center" valign="top" width="10%"><a href="https://github.com/thatguy-jaysenodell"><img src="https://avatars.githubusercontent.com/u/118288184?v=4?s=40" width="40px;" alt="That Guy Jaysen"/><br /><sub><b>That Guy Jaysen</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Athatguy-jaysenodell" title="Bug reports">🐛</a></td>
122
121
  </tr>
123
122
  </tbody>
124
123
  </table>
package/RELEASE_NOTES.MD CHANGED
@@ -1,5 +1,73 @@
1
1
  # Develop
2
2
 
3
+ # FDM Monster 1.9.0
4
+
5
+ ## Features
6
+
7
+ - Introduce separate upload timeout setting for better control and resilience
8
+ - Ability to add startPrint to specify print or not after upload
9
+
10
+ ## Fixes
11
+
12
+ - OctoPrint 1.8.7 needs explicit passive flag in body instead of header to login
13
+ - PrusaLink subfeature was not added to printer type feature (new client packaged)
14
+ - Improve Moonraker error logging
15
+ - Make colored logs opt-in with "ENABLE_COLORED_LOGS: true" env var
16
+ - SocketIO gateway logs errors more explicitly
17
+ - Logger is now static, reducing memory usage and test duration
18
+
19
+ # FDM Monster 1.9.0-rc1
20
+
21
+ ## Features
22
+
23
+ - Introduce PrusaLink adapter for limited printer support for these printers: MK3S(+) (needs PrusaLink extension with Raspberry Pi), Mini(+), MK4(S), XL, Core One
24
+ - Add opt-in Prometheus integration (still experimental)
25
+ - Add opt-in Loki integration (still experimental)
26
+
27
+ ## Chores
28
+
29
+ - Remove unused code for OctoPrint plugin support (this work needs to go through triage again)
30
+ - Remove unused code for OctoPrint plugin backup (this work needs to go through triage again)
31
+ - Remove unused code for OctoPrint plugin firmware update (this work needs to go through triage again)
32
+ - Remove unused code for OctoPrint plugin repository
33
+ - Remove unused code for Prusa firmware releases
34
+ - Remove printer API endpoints for OctoPrint plugins, backups and firmware updates
35
+ - Remove cache-manager package
36
+ - Remove unused console files
37
+ - Update .env.template
38
+ - Removed BaseEntity
39
+ - Make printerId camera nullish
40
+ - Merge create and update schema floor
41
+ - Schema printerPositionsSchema simplified
42
+ - Add biome linter/formatter, remove prettier and eslint
43
+
44
+ ## Changes
45
+
46
+ - `tsconfig.json` strictNullChecks and strictPropertyInitialization set to true for better null propagation logic.
47
+ - Update dependency injection with awilix, switch to CLASSIC mode for less verbose code
48
+ - Update API controller, use decorators over api builder
49
+ - Remove PrinterFile entity (unused)
50
+ - Remove printer/connection PATCH endpoint (unused)
51
+ - Remove debug settings from server settings database
52
+ - Remove all API compatibility feature flags except for printerGroupsApi and multiplePrinterServices
53
+
54
+ ## Fixes
55
+
56
+ - Fix punycode warning by pinning tr46 package
57
+ - Fix camera dto and entity to be consistent
58
+ - Make yaml import fill in default arrays
59
+ - Make printCompletionSchema context type any
60
+ - Enforce properties on camera stream Mongoose schema for consistency with TypeORM camera stream entity
61
+ - Enforce floor id on Mongoose schema for consistency with TypeORM floor entity
62
+ - Set floor id in Mongoose floor service for consistency with typeorm service
63
+ - Fix print completion interface and dto
64
+ - Improved API key validation: klipper validation completely isolated from OctoPrint api key validation
65
+ - Query parameter `forceSave` in printer create/update API was used incorrectly (flipped around)
66
+ - Fixed all typescript issues
67
+ - Server settings would not always migrate properly
68
+ - Printer files store will not cache files of disabled printers
69
+ - Klipper printer should print on upload
70
+
3
71
  # FDM Monster 19/03/2025 1.8.3
4
72
 
5
73
  ## Fixes
@@ -152,7 +220,7 @@
152
220
  - Used attributes for PrinterFilesController
153
221
  - Renamed OctoPrintApiService to OctoprintClient
154
222
  - Switch to 1.6.x client UI version range
155
- - Update Octoprint websocket with refresh interval, defaulting to 10sec. This loop will keep refresh attempts internal to the Websocket adapter of each service type (Octoprint, Moonraker, Bambu, etc).
223
+ - Update Octoprint websocket with refresh interval, defaulting to 10sec. This loop will keep refresh attempts internal to the Websocket adapter of each service type (Octoprint, Moonraker, etc).
156
224
 
157
225
  ## Fixes:
158
226
 
package/biome.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
3
+ "vcs": {
4
+ "enabled": false,
5
+ "clientKind": "git",
6
+ "useIgnoreFile": false
7
+ },
8
+ "files": {
9
+ "ignoreUnknown": false,
10
+ "ignore": []
11
+ },
12
+ "formatter": {
13
+ "enabled": true,
14
+ "indentStyle": "space",
15
+ "indentWidth": 2,
16
+ "lineWidth": 120
17
+ },
18
+ "organizeImports": {
19
+ "enabled": true
20
+ },
21
+ "linter": {
22
+ "enabled": true,
23
+ "rules": {
24
+ "recommended": true
25
+ }
26
+ },
27
+ "javascript": {
28
+ "formatter": {
29
+ "quoteStyle": "double",
30
+ "trailingCommas": "all"
31
+ }
32
+ }
33
+ }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/consoles/download-github-releases.ts"],"names":["fetchReleases","response","axios","get","releases","data","releaseData","map","release","tag_name","name","published_at","body","outputPath","path","join","__dirname","fs","writeFileSync","JSON","stringify","console","log","error","fetchLatest"],"mappings":";;;;8DAAkB;2DACH;6DACE;;;;;;AASjB,MAAMA,gBAAgB;IACpB,IAAI;QACF,MAAMC,WAAW,MAAMC,cAAK,CAACC,GAAG,CAAY;QAC5C,MAAMC,WAAWH,SAASI,IAAI;QAG9B,MAAMC,cAAcF,SAASG,GAAG,CAAC,CAACC,UAAa,CAAA;gBAC7CC,UAAUD,QAAQC,QAAQ;gBAC1BC,MAAMF,QAAQE,IAAI;gBAClBC,cAAcH,QAAQG,YAAY;gBAClCC,MAAMJ,QAAQI,IAAI;YACpB,CAAA;QAGA,MAAMC,aAAaC,aAAI,CAACC,IAAI,CAACC,WAAW;QACxCC,WAAE,CAACC,aAAa,CAACL,YAAYM,KAAKC,SAAS,CAACd,aAAa,MAAM;QAC/De,QAAQC,GAAG,CAAC,CAAC,yBAAyB,EAAET,YAAY;IACtD,EAAE,OAAOU,OAAO;QACdF,QAAQE,KAAK,CAAC,4BAA4BA;IAC5C;AACF;AAEA,MAAMC,cAAc;IAClB,IAAI;QACF,MAAMvB,WAAW,MAAMC,cAAK,CAACC,GAAG,CAAU;QAC1C,MAAMK,UAAUP,SAASI,IAAI;QAG7B,MAAMC,cAAc;YAClBG,UAAUD,QAAQC,QAAQ;YAC1BC,MAAMF,QAAQE,IAAI;YAClBC,cAAcH,QAAQG,YAAY;YAClCC,MAAMJ,QAAQI,IAAI;QACpB;QAGA,MAAMC,aAAaC,aAAI,CAACC,IAAI,CAACC,WAAW;QACxCC,WAAE,CAACC,aAAa,CAACL,YAAYM,KAAKC,SAAS,CAACd,aAAa,MAAM;QAC/De,QAAQC,GAAG,CAAC,CAAC,yBAAyB,EAAET,YAAY;IACtD,EAAE,OAAOU,OAAO;QACdF,QAAQE,KAAK,CAAC,4BAA4BA;IAC5C;AACF;AAEAvB;AACAwB"}
1
+ {"version":3,"sources":["../../src/consoles/download-github-releases.ts"],"names":["fetchReleases","response","axios","get","releases","data","releaseData","map","release","tag_name","name","published_at","body","outputPath","path","join","__dirname","fs","writeFileSync","JSON","stringify","console","log","error","fetchLatest"],"mappings":";;;;8DAAkB;2DACH;6DACE;;;;;;AASjB,MAAMA,gBAAgB;IACpB,IAAI;QACF,MAAMC,WAAW,MAAMC,cAAK,CAACC,GAAG,CAAY;QAC5C,MAAMC,WAAWH,SAASI,IAAI;QAG9B,MAAMC,cAAcF,SAASG,GAAG,CAAC,CAACC,UAAa,CAAA;gBAC7CC,UAAUD,QAAQC,QAAQ;gBAC1BC,MAAMF,QAAQE,IAAI;gBAClBC,cAAcH,QAAQG,YAAY;gBAClCC,MAAMJ,QAAQI,IAAI;YACpB,CAAA;QAGA,MAAMC,aAAaC,aAAI,CAACC,IAAI,CAACC,WAAW;QACxCC,WAAE,CAACC,aAAa,CAACL,YAAYM,KAAKC,SAAS,CAACd,aAAa,MAAM;QAC/De,QAAQC,GAAG,CAAC,CAAC,yBAAyB,EAAET,YAAY;IACtD,EAAE,OAAOU,OAAO;QACdF,QAAQE,KAAK,CAAC,4BAA4BA;IAC5C;AACF;AAEA,MAAMC,cAAc;IAClB,IAAI;QACF,MAAMvB,WAAW,MAAMC,cAAK,CAACC,GAAG,CAC9B;QAEF,MAAMK,UAAUP,SAASI,IAAI;QAG7B,MAAMC,cAAc;YAClBG,UAAUD,QAAQC,QAAQ;YAC1BC,MAAMF,QAAQE,IAAI;YAClBC,cAAcH,QAAQG,YAAY;YAClCC,MAAMJ,QAAQI,IAAI;QACpB;QAGA,MAAMC,aAAaC,aAAI,CAACC,IAAI,CAACC,WAAW;QACxCC,WAAE,CAACC,aAAa,CAACL,YAAYM,KAAKC,SAAS,CAACd,aAAa,MAAM;QAC/De,QAAQC,GAAG,CAAC,CAAC,yBAAyB,EAAET,YAAY;IACtD,EAAE,OAAOU,OAAO;QACdF,QAAQE,KAAK,CAAC,4BAA4BA;IAC5C;AACF;AAEAvB;AACAwB"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ const _child_process = require("child_process");
6
+ const _path = /*#__PURE__*/ _interop_require_default(require("path"));
7
+ function _interop_require_default(obj) {
8
+ return obj && obj.__esModule ? obj : {
9
+ default: obj
10
+ };
11
+ }
12
+ const startPort = 1234;
13
+ const instanceCount = 10;
14
+ console.log(`Starting ${instanceCount} fake OctoPrint servers...`);
15
+ for(let i = 0; i < instanceCount; i++){
16
+ const port = startPort + i;
17
+ const process = (0, _child_process.spawn)("node", [
18
+ _path.default.join(__dirname, "./mock-octoprint.server.js"),
19
+ port.toString()
20
+ ]);
21
+ process.stdout.on("data", (data)=>{
22
+ console.log(`[Server ${i + 1} - Port ${port}]: ${data.toString().trim()}`);
23
+ });
24
+ process.stderr.on("data", (data)=>{
25
+ console.error(`[Server ${i + 1} - Port ${port}] ERROR: ${data.toString().trim()}`);
26
+ });
27
+ console.log(`Started server ${i + 1} on port ${port}`);
28
+ }
29
+ console.log("All servers started. Press Ctrl+C to stop all servers.");
30
+
31
+ //# sourceMappingURL=launch-http-servers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/consoles/launch-http-servers.ts"],"names":["startPort","instanceCount","console","log","i","port","process","spawn","path","join","__dirname","toString","stdout","on","data","trim","stderr","error"],"mappings":";;;;+BAAsB;6DACL;;;;;;AAEjB,MAAMA,YAAY;AAClB,MAAMC,gBAAgB;AAEtBC,QAAQC,GAAG,CAAC,CAAC,SAAS,EAAEF,cAAc,0BAA0B,CAAC;AAEjE,IAAK,IAAIG,IAAI,GAAGA,IAAIH,eAAeG,IAAK;IACtC,MAAMC,OAAOL,YAAYI;IACzB,MAAME,UAAUC,IAAAA,oBAAK,EAAC,QAAQ;QAACC,aAAI,CAACC,IAAI,CAACC,WAAW;QAA+BL,KAAKM,QAAQ;KAAG;IAEnGL,QAAQM,MAAM,CAACC,EAAE,CAAC,QAAQ,CAACC;QACzBZ,QAAQC,GAAG,CAAC,CAAC,QAAQ,EAAEC,IAAI,EAAE,QAAQ,EAAEC,KAAK,GAAG,EAAES,KAAKH,QAAQ,GAAGI,IAAI,IAAI;IAC3E;IAEAT,QAAQU,MAAM,CAACH,EAAE,CAAC,QAAQ,CAACC;QACzBZ,QAAQe,KAAK,CAAC,CAAC,QAAQ,EAAEb,IAAI,EAAE,QAAQ,EAAEC,KAAK,SAAS,EAAES,KAAKH,QAAQ,GAAGI,IAAI,IAAI;IACnF;IAEAb,QAAQC,GAAG,CAAC,CAAC,eAAe,EAAEC,IAAI,EAAE,SAAS,EAAEC,MAAM;AACvD;AAEAH,QAAQC,GAAG,CAAC"}
@@ -0,0 +1,291 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ const _express = /*#__PURE__*/ _interop_require_default(require("express"));
6
+ const _multer = /*#__PURE__*/ _interop_require_default(require("multer"));
7
+ const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
8
+ const _path = /*#__PURE__*/ _interop_require_default(require("path"));
9
+ const _ws = require("ws");
10
+ const _http = /*#__PURE__*/ _interop_require_default(require("http"));
11
+ const _zod = require("zod");
12
+ const _nodeconsole = /*#__PURE__*/ _interop_require_wildcard(require("node:console"));
13
+ const _apimessages = require("./utils/api-messages");
14
+ const _wsmessages = require("./utils/ws-messages");
15
+ function _interop_require_default(obj) {
16
+ return obj && obj.__esModule ? obj : {
17
+ default: obj
18
+ };
19
+ }
20
+ function _getRequireWildcardCache(nodeInterop) {
21
+ if (typeof WeakMap !== "function") return null;
22
+ var cacheBabelInterop = new WeakMap();
23
+ var cacheNodeInterop = new WeakMap();
24
+ return (_getRequireWildcardCache = function(nodeInterop) {
25
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
26
+ })(nodeInterop);
27
+ }
28
+ function _interop_require_wildcard(obj, nodeInterop) {
29
+ if (!nodeInterop && obj && obj.__esModule) {
30
+ return obj;
31
+ }
32
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
33
+ return {
34
+ default: obj
35
+ };
36
+ }
37
+ var cache = _getRequireWildcardCache(nodeInterop);
38
+ if (cache && cache.has(obj)) {
39
+ return cache.get(obj);
40
+ }
41
+ var newObj = {
42
+ __proto__: null
43
+ };
44
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
45
+ for(var key in obj){
46
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
47
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
48
+ if (desc && (desc.get || desc.set)) {
49
+ Object.defineProperty(newObj, key, desc);
50
+ } else {
51
+ newObj[key] = obj[key];
52
+ }
53
+ }
54
+ }
55
+ newObj.default = obj;
56
+ if (cache) {
57
+ cache.set(obj, newObj);
58
+ }
59
+ return newObj;
60
+ }
61
+ const port = process.argv[2] ? parseInt(process.argv[2]) : 1234;
62
+ const uploadsDir = _path.default.join(__dirname, "uploads", `server-${port.toString()}`);
63
+ const WS_MESSAGE_INTERVAL = 1000;
64
+ if (!_fs.default.existsSync(uploadsDir)) {
65
+ _nodeconsole.log(`[PORT ${port}] Creating uploads folder ${uploadsDir}`);
66
+ _fs.default.mkdirSync(uploadsDir, {
67
+ recursive: true
68
+ });
69
+ }
70
+ cleanupUploads();
71
+ const upload = (0, _multer.default)({
72
+ dest: uploadsDir
73
+ });
74
+ const app = (0, _express.default)();
75
+ const server = _http.default.createServer(app);
76
+ const wss = new _ws.Server({
77
+ server
78
+ });
79
+ const clients = new Map();
80
+ const AuthSchema = _zod.z.object({
81
+ command: _zod.z.literal("auth"),
82
+ user: _zod.z.literal("admin"),
83
+ token: _zod.z.string().regex(/^[a-zA-Z0-9]{32}$/)
84
+ });
85
+ wss.on("connection", (ws)=>{
86
+ const clientId = Date.now().toString();
87
+ _nodeconsole.log(`[PORT ${port}] New WebSocket connection established`);
88
+ let authenticated = false;
89
+ let messageInterval = null;
90
+ ws.on("message", async (message)=>{
91
+ try {
92
+ const msgString = message.toString();
93
+ if (msgString.includes("throttle")) {
94
+ _nodeconsole.log(`Throttle message received ${msgString}`);
95
+ return;
96
+ }
97
+ const json = JSON.parse(msgString);
98
+ if (!authenticated) {
99
+ if (!json) {
100
+ _nodeconsole.log(`[PORT ${port}] Invalid message JSON format`);
101
+ ws.close();
102
+ return;
103
+ }
104
+ try {
105
+ const parts = json.auth.split(":");
106
+ AuthSchema.parse({
107
+ command: "auth",
108
+ user: parts[0],
109
+ token: parts[1]
110
+ });
111
+ _nodeconsole.log(`[PORT ${port}] Authentication successful for admin`);
112
+ authenticated = true;
113
+ clients.set(clientId, {
114
+ ws,
115
+ authenticated
116
+ });
117
+ setTimeout(async ()=>{
118
+ try {
119
+ ws.send(JSON.stringify(_wsmessages.currentMessage));
120
+ } catch (fileError) {
121
+ _nodeconsole.error(`[PORT ${port}] Error reading message file:`, fileError);
122
+ ws.send(JSON.stringify({
123
+ error: "Failed to read message content"
124
+ }));
125
+ }
126
+ }, 500);
127
+ messageInterval = setupMessageInterval(ws, clientId, WS_MESSAGE_INTERVAL);
128
+ } catch (validationError) {
129
+ _nodeconsole.log(`[PORT ${port}] Authentication failed: Invalid token format ${JSON.stringify(json)} ${validationError}`);
130
+ ws.close();
131
+ }
132
+ } else {
133
+ _nodeconsole.log(`[PORT ${port}] Received message from authenticated client`);
134
+ }
135
+ } catch (error) {
136
+ _nodeconsole.error(`[PORT ${port}] Error processing message:`, error);
137
+ ws.close();
138
+ }
139
+ });
140
+ ws.on("close", ()=>{
141
+ _nodeconsole.log(`[PORT ${port}] WebSocket connection closed ${clientId}`);
142
+ if (messageInterval) {
143
+ clearInterval(messageInterval);
144
+ messageInterval = null;
145
+ }
146
+ clients.delete(clientId);
147
+ });
148
+ const setupMessageInterval = (ws, clientId, baseInterval)=>{
149
+ if (messageInterval) {
150
+ clearInterval(messageInterval);
151
+ messageInterval = null;
152
+ }
153
+ const getRandomizedInterval = (baseMs)=>{
154
+ const variationFactor = 0.85 + Math.random() * 0.3;
155
+ return Math.floor(baseMs * variationFactor);
156
+ };
157
+ const sendPeriodicMessage = ()=>{
158
+ try {
159
+ if (ws.readyState === ws.OPEN) {
160
+ ws.send(JSON.stringify(_wsmessages.currentMessage));
161
+ _nodeconsole.log(`[PORT ${port}] Periodic message sent to client (ID: ${clientId})`);
162
+ messageInterval = setTimeout(sendPeriodicMessage, getRandomizedInterval(baseInterval));
163
+ } else {
164
+ _nodeconsole.log(`[PORT ${port}] Stopped periodic messages for client (ID: ${clientId})`);
165
+ messageInterval = null;
166
+ }
167
+ } catch (error) {
168
+ _nodeconsole.error(`[PORT ${port}] Error sending periodic message:`, error);
169
+ messageInterval = null;
170
+ }
171
+ };
172
+ messageInterval = setTimeout(sendPeriodicMessage, getRandomizedInterval(baseInterval));
173
+ return messageInterval;
174
+ };
175
+ });
176
+ app.get("/api/version", async (req, res)=>{
177
+ res.send({
178
+ server: "1",
179
+ api: "2",
180
+ text: "3"
181
+ });
182
+ });
183
+ app.get("/api/currentuser", async (req, res)=>{
184
+ res.send({
185
+ name: "admin",
186
+ permissions: [],
187
+ groups: []
188
+ });
189
+ });
190
+ app.get("/api/printer", async (req, res)=>{
191
+ _nodeconsole.log(`[PORT ${port}] ${req.method.toUpperCase()} ${req.url} request`);
192
+ res.status(200).json(_apimessages.printerHistorySuccessResponse);
193
+ });
194
+ app.get("/api/connection", async (req, res)=>{
195
+ _nodeconsole.log(`[PORT ${port}] ${req.method.toUpperCase()} ${req.url} request`);
196
+ res.status(200).json(_apimessages.connectionSuccessResponse);
197
+ });
198
+ app.get("/api/job", async (req, res)=>{
199
+ _nodeconsole.log(`[PORT ${port}] ${req.method.toUpperCase()} ${req.url} request`);
200
+ res.status(200).json(_apimessages.jobSuccessResponse);
201
+ });
202
+ app.get("/api/files/local", async (req, res)=>{
203
+ _nodeconsole.log(`[PORT ${port}] ${req.method.toUpperCase()} ${req.url} request`);
204
+ res.status(200).json(_apimessages.filesSuccessResponse);
205
+ });
206
+ app.post("/api/login", async (req, res)=>{
207
+ res.send({
208
+ _is_external_client: true,
209
+ _login_mechanism: "apikey",
210
+ session: "123123abc123123abc123123abc123ab"
211
+ });
212
+ });
213
+ app.post("/api/files/local", upload.single("file"), (req, res)=>{
214
+ const { select, print } = req.body;
215
+ const file = req.file;
216
+ if (!file) {
217
+ return res.status(400).json({
218
+ error: "Missing file"
219
+ });
220
+ }
221
+ if (typeof select === "undefined" || typeof print === "undefined") {
222
+ return res.status(400).json({
223
+ error: "Missing required fields: select, print"
224
+ });
225
+ }
226
+ if (Object.keys(req.body).length !== 2) {
227
+ return res.status(400).json({
228
+ error: "Only fields 'select' and 'print' are allowed"
229
+ });
230
+ }
231
+ if (![
232
+ "true",
233
+ "false"
234
+ ].includes(select) || ![
235
+ "true",
236
+ "false"
237
+ ].includes(print)) {
238
+ return res.status(400).json({
239
+ error: "Fields 'select' and 'print' must be boolean values (true/false)"
240
+ });
241
+ }
242
+ _nodeconsole.log(`[PORT ${port}] Received file:`, file.originalname);
243
+ _nodeconsole.log(`[PORT ${port}] File size:`, file.size);
244
+ _nodeconsole.log(`[PORT ${port}] MIME type:`, file.mimetype);
245
+ _nodeconsole.log(`[PORT ${port}] select:`, select, `\n[PORT ${port}] print:`, print, `\n-----`);
246
+ res.json({
247
+ message: "File received successfully"
248
+ });
249
+ });
250
+ app.use((req, res)=>{
251
+ _nodeconsole.log(`[PORT ${port}] ${req.method.toUpperCase()} ${req.url} Not found`);
252
+ res.status(404).json({
253
+ error: "Not Found"
254
+ });
255
+ });
256
+ server.listen(port, ()=>{
257
+ _nodeconsole.log(`[PORT ${port}] Server is running on http://localhost:${port}`);
258
+ _nodeconsole.log(`[PORT ${port}] WebSocket server is available on ws://localhost:${port}`);
259
+ });
260
+ process.on("SIGINT", ()=>{
261
+ _nodeconsole.log("\n[PORT ${port}] Received SIGINT signal (Ctrl+C). Shutting down gracefully...");
262
+ cleanupUploads();
263
+ server.close(()=>{
264
+ _nodeconsole.log("[PORT ${port}] Server closed");
265
+ process.exit(0);
266
+ });
267
+ });
268
+ process.on("SIGTERM", ()=>{
269
+ _nodeconsole.log("\n[PORT ${port}] Received SIGTERM signal. Shutting down gracefully...");
270
+ cleanupUploads();
271
+ server.close(()=>{
272
+ _nodeconsole.log("[PORT ${port}] Server closed");
273
+ process.exit(0);
274
+ });
275
+ });
276
+ function cleanupUploads() {
277
+ try {
278
+ _nodeconsole.log(`[PORT ${port}] Cleaning up uploads folder...`);
279
+ const files = _fs.default.readdirSync(uploadsDir);
280
+ for (const file of files){
281
+ const filePath = _path.default.join(uploadsDir, file);
282
+ _fs.default.unlinkSync(filePath);
283
+ _nodeconsole.log(`[PORT ${port}] Deleted: ${filePath}`);
284
+ }
285
+ _nodeconsole.log(`[PORT ${port}] Uploads folder cleanup complete`);
286
+ } catch (error) {
287
+ _nodeconsole.error(`[PORT ${port}] Error cleaning up uploads folder:`, error);
288
+ }
289
+ }
290
+
291
+ //# sourceMappingURL=mock-octoprint.server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/consoles/mock-octoprint.server.ts"],"names":["port","process","argv","parseInt","uploadsDir","path","join","__dirname","toString","WS_MESSAGE_INTERVAL","fs","existsSync","console","log","mkdirSync","recursive","cleanupUploads","upload","multer","dest","app","express","server","http","createServer","wss","WebSocketServer","clients","Map","AuthSchema","z","object","command","literal","user","token","string","regex","on","ws","clientId","Date","now","authenticated","messageInterval","message","msgString","includes","json","JSON","parse","close","parts","auth","split","set","setTimeout","send","stringify","currentMessage","fileError","error","setupMessageInterval","validationError","clearInterval","delete","baseInterval","getRandomizedInterval","baseMs","variationFactor","Math","random","floor","sendPeriodicMessage","readyState","OPEN","get","req","res","api","text","name","permissions","groups","method","toUpperCase","url","status","printerHistorySuccessResponse","connectionSuccessResponse","jobSuccessResponse","filesSuccessResponse","post","_is_external_client","_login_mechanism","session","single","select","print","body","file","Object","keys","length","originalname","size","mimetype","use","listen","exit","files","readdirSync","filePath","unlinkSync"],"mappings":"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"}