@fdm-monster/server 2.0.0-rc1 → 2.0.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.
Files changed (230) hide show
  1. package/.env.template +8 -3
  2. package/.yarn/install-state.gz +0 -0
  3. package/CONTRIBUTING.md +1 -1
  4. package/README.md +5 -4
  5. package/RELEASE_NOTES.MD +53 -0
  6. package/SECURITY.md +1 -1
  7. package/dist/consoles/download-github-releases.js +3 -3
  8. package/dist/consoles/launch-http-servers.js +4 -4
  9. package/dist/consoles/launch-http-servers.js.map +1 -1
  10. package/dist/consoles/mock-bambu.server.js +35 -16
  11. package/dist/consoles/mock-bambu.server.js.map +1 -1
  12. package/dist/consoles/mock-camera/default-image.js +13 -0
  13. package/dist/consoles/mock-camera/default-image.js.map +1 -0
  14. package/dist/consoles/mock-camera/mock-camera.server.js +160 -0
  15. package/dist/consoles/mock-camera/mock-camera.server.js.map +1 -0
  16. package/dist/consoles/mock-octoprint.server.js +281 -73
  17. package/dist/consoles/mock-octoprint.server.js.map +1 -1
  18. package/dist/consoles/mock-prusalink.server.js +11 -11
  19. package/dist/consoles/mock-prusalink.server.js.map +1 -1
  20. package/dist/consoles/typeorm-create.js +135 -0
  21. package/dist/consoles/typeorm-create.js.map +1 -0
  22. package/dist/consoles/typeorm-generate.js +8 -8
  23. package/dist/consoles/typeorm-generate.js.map +1 -1
  24. package/dist/constants/authorization.constants.js +13 -26
  25. package/dist/constants/authorization.constants.js.map +1 -1
  26. package/dist/constants/server-settings.constants.js +7 -20
  27. package/dist/constants/server-settings.constants.js.map +1 -1
  28. package/dist/container.js +18 -10
  29. package/dist/container.js.map +1 -1
  30. package/dist/container.tokens.js +9 -5
  31. package/dist/container.tokens.js.map +1 -1
  32. package/dist/controllers/batch-call.controller.js +0 -15
  33. package/dist/controllers/batch-call.controller.js.map +1 -1
  34. package/dist/controllers/file-storage.controller.js +319 -0
  35. package/dist/controllers/file-storage.controller.js.map +1 -0
  36. package/dist/controllers/first-time-setup.controller.js +2 -1
  37. package/dist/controllers/first-time-setup.controller.js.map +1 -1
  38. package/dist/controllers/floor.controller.js +12 -12
  39. package/dist/controllers/floor.controller.js.map +1 -1
  40. package/dist/controllers/print-job.controller.js +666 -0
  41. package/dist/controllers/print-job.controller.js.map +1 -0
  42. package/dist/controllers/print-queue.controller.js +375 -0
  43. package/dist/controllers/print-queue.controller.js.map +1 -0
  44. package/dist/controllers/printer-files.controller.js +86 -59
  45. package/dist/controllers/printer-files.controller.js.map +1 -1
  46. package/dist/controllers/printer-settings.controller.js +0 -21
  47. package/dist/controllers/printer-settings.controller.js.map +1 -1
  48. package/dist/controllers/{printer-group.controller.js → printer-tag.controller.js} +51 -34
  49. package/dist/controllers/printer-tag.controller.js.map +1 -0
  50. package/dist/controllers/printer.controller.js +15 -0
  51. package/dist/controllers/printer.controller.js.map +1 -1
  52. package/dist/controllers/server-private.controller.js +2 -1
  53. package/dist/controllers/server-private.controller.js.map +1 -1
  54. package/dist/controllers/server-public.controller.js +6 -2
  55. package/dist/controllers/server-public.controller.js.map +1 -1
  56. package/dist/controllers/settings.controller.js +44 -44
  57. package/dist/controllers/settings.controller.js.map +1 -1
  58. package/dist/controllers/slicer-compat.controller.js +220 -0
  59. package/dist/controllers/slicer-compat.controller.js.map +1 -0
  60. package/dist/data-source.js +20 -8
  61. package/dist/data-source.js.map +1 -1
  62. package/dist/entities/camera-stream.entity.js +2 -1
  63. package/dist/entities/camera-stream.entity.js.map +1 -1
  64. package/dist/entities/floor.entity.js +3 -5
  65. package/dist/entities/floor.entity.js.map +1 -1
  66. package/dist/entities/index.js +15 -7
  67. package/dist/entities/index.js.map +1 -1
  68. package/dist/entities/print-job.entity.js +195 -0
  69. package/dist/entities/print-job.entity.js.map +1 -0
  70. package/dist/entities/{printer-group.entity.js → printer-tag.entity.js} +17 -17
  71. package/dist/entities/printer-tag.entity.js.map +1 -0
  72. package/dist/entities/printer.entity.js +4 -10
  73. package/dist/entities/printer.entity.js.map +1 -1
  74. package/dist/entities/settings.entity.js +3 -12
  75. package/dist/entities/settings.entity.js.map +1 -1
  76. package/dist/entities/{group.entity.js → tag.entity.js} +15 -8
  77. package/dist/entities/tag.entity.js.map +1 -0
  78. package/dist/index.js +8 -2
  79. package/dist/index.js.map +1 -1
  80. package/dist/middleware/exception.filter.js +114 -90
  81. package/dist/middleware/exception.filter.js.map +1 -1
  82. package/dist/middleware/global.middleware.js +6 -6
  83. package/dist/middleware/global.middleware.js.map +1 -1
  84. package/dist/middleware/slicer-api-key.middleware.js +29 -0
  85. package/dist/middleware/slicer-api-key.middleware.js.map +1 -0
  86. package/dist/migrations/1767278216516-ChangeCameraPrinterOnDeleteSetNull.js +186 -0
  87. package/dist/migrations/1767278216516-ChangeCameraPrinterOnDeleteSetNull.js.map +1 -0
  88. package/dist/migrations/1767279607392-DropCustomGcode.js +31 -0
  89. package/dist/migrations/1767279607392-DropCustomGcode.js.map +1 -0
  90. package/dist/migrations/1767291804417-DropPrintCompletions.js +37 -0
  91. package/dist/migrations/1767291804417-DropPrintCompletions.js.map +1 -0
  92. package/dist/migrations/1767352862576-DropSettingsFileClean.js +88 -0
  93. package/dist/migrations/1767352862576-DropSettingsFileClean.js.map +1 -0
  94. package/dist/migrations/1767355639023-ChangeFloorLevelToOrder.js +107 -0
  95. package/dist/migrations/1767355639023-ChangeFloorLevelToOrder.js.map +1 -0
  96. package/dist/migrations/1767370191762-ChangeFloorNonUniqueOrder.js +62 -0
  97. package/dist/migrations/1767370191762-ChangeFloorNonUniqueOrder.js.map +1 -0
  98. package/dist/migrations/1767432108916-RenameGroupToTag.js +86 -0
  99. package/dist/migrations/1767432108916-RenameGroupToTag.js.map +1 -0
  100. package/dist/migrations/1767451444137-AddPrintJob.js +207 -0
  101. package/dist/migrations/1767451444137-AddPrintJob.js.map +1 -0
  102. package/dist/server.constants.js +9 -9
  103. package/dist/server.constants.js.map +1 -1
  104. package/dist/server.host.js +24 -32
  105. package/dist/server.host.js.map +1 -1
  106. package/dist/services/bambu/bambu-ftp.adapter.js +1 -1
  107. package/dist/services/bambu/bambu-ftp.adapter.js.map +1 -1
  108. package/dist/services/bambu/bambu-mqtt.adapter.js +73 -76
  109. package/dist/services/bambu/bambu-mqtt.adapter.js.map +1 -1
  110. package/dist/services/core/batch-call.service.js +0 -25
  111. package/dist/services/core/batch-call.service.js.map +1 -1
  112. package/dist/services/core/multer.service.js +5 -9
  113. package/dist/services/core/multer.service.js.map +1 -1
  114. package/dist/services/core/yaml.service.js +231 -156
  115. package/dist/services/core/yaml.service.js.map +1 -1
  116. package/dist/services/file-analysis.service.js +146 -0
  117. package/dist/services/file-analysis.service.js.map +1 -0
  118. package/dist/services/file-storage.service.js +387 -0
  119. package/dist/services/file-storage.service.js.map +1 -0
  120. package/dist/services/interfaces/floor.dto.js +3 -3
  121. package/dist/services/interfaces/floor.dto.js.map +1 -1
  122. package/dist/services/interfaces/{printer-group.dto.js → printer-tag.dto.js} +9 -8
  123. package/dist/services/interfaces/printer-tag.dto.js.map +1 -0
  124. package/dist/services/interfaces/{print-completion.interface.js → printer-tag.service.interface.js} +1 -1
  125. package/dist/services/interfaces/{printer-group.service.interface.js.map → printer-tag.service.interface.js.map} +1 -1
  126. package/dist/services/interfaces/settings.dto.js +0 -1
  127. package/dist/services/interfaces/settings.dto.js.map +1 -1
  128. package/dist/services/interfaces/{group.dto.js → tag.dto.js} +1 -1
  129. package/dist/services/interfaces/tag.dto.js.map +1 -0
  130. package/dist/services/octoprint/dto/files/gcode-analysis.dto.js.map +1 -0
  131. package/dist/services/octoprint/octoprint-api.routes.js +0 -7
  132. package/dist/services/octoprint/octoprint-api.routes.js.map +1 -1
  133. package/dist/services/octoprint/octoprint.client.js +0 -4
  134. package/dist/services/octoprint/octoprint.client.js.map +1 -1
  135. package/dist/services/orm/floor.service.js +9 -16
  136. package/dist/services/orm/floor.service.js.map +1 -1
  137. package/dist/services/orm/print-job.service.js +539 -0
  138. package/dist/services/orm/print-job.service.js.map +1 -0
  139. package/dist/services/orm/printer-tag.service.js +120 -0
  140. package/dist/services/orm/printer-tag.service.js.map +1 -0
  141. package/dist/services/orm/settings.service.js +5 -6
  142. package/dist/services/orm/settings.service.js.map +1 -1
  143. package/dist/services/print-file-downloader.service.js +169 -0
  144. package/dist/services/print-file-downloader.service.js.map +1 -0
  145. package/dist/services/print-queue.service.js +268 -0
  146. package/dist/services/print-queue.service.js.map +1 -0
  147. package/dist/services/prusa-link/prusa-link-http-polling.adapter.js +1 -3
  148. package/dist/services/prusa-link/prusa-link-http-polling.adapter.js.map +1 -1
  149. package/dist/services/validators/floor-service.validation.js +10 -10
  150. package/dist/services/validators/floor-service.validation.js.map +1 -1
  151. package/dist/services/validators/print-job.validation.js +31 -0
  152. package/dist/services/validators/print-job.validation.js.map +1 -0
  153. package/dist/services/validators/settings-service.validation.js +21 -24
  154. package/dist/services/validators/settings-service.validation.js.map +1 -1
  155. package/dist/services/validators/yaml-service.validation.js +9 -13
  156. package/dist/services/validators/yaml-service.validation.js.map +1 -1
  157. package/dist/shared/load-controllers.js +2 -1
  158. package/dist/shared/load-controllers.js.map +1 -1
  159. package/dist/shared/runtime-settings.migration.js +9 -9
  160. package/dist/shared/runtime-settings.migration.js.map +1 -1
  161. package/dist/state/floor.store.js +2 -9
  162. package/dist/state/floor.store.js.map +1 -1
  163. package/dist/state/printer-events.cache.js +179 -19
  164. package/dist/state/printer-events.cache.js.map +1 -1
  165. package/dist/state/printer-thumbnail.cache.js +98 -183
  166. package/dist/state/printer-thumbnail.cache.js.map +1 -1
  167. package/dist/state/settings.store.js +39 -37
  168. package/dist/state/settings.store.js.map +1 -1
  169. package/dist/state/socket-io.gateway.js +1 -1
  170. package/dist/state/socket-io.gateway.js.map +1 -1
  171. package/dist/tasks/boot.task.js +7 -5
  172. package/dist/tasks/boot.task.js.map +1 -1
  173. package/dist/tasks/print-job-analysis.task.js +116 -0
  174. package/dist/tasks/print-job-analysis.task.js.map +1 -0
  175. package/dist/tasks/printer-files-load.task.js +29 -0
  176. package/dist/tasks/printer-files-load.task.js.map +1 -0
  177. package/dist/tasks/socketio.task.js +1 -1
  178. package/dist/tasks/socketio.task.js.map +1 -1
  179. package/dist/tasks.js +3 -2
  180. package/dist/tasks.js.map +1 -1
  181. package/dist/utils/parsers/3mf.parser.js +337 -0
  182. package/dist/utils/parsers/3mf.parser.js.map +1 -0
  183. package/dist/utils/parsers/bgcode.parser.js +223 -0
  184. package/dist/utils/parsers/bgcode.parser.js.map +1 -0
  185. package/dist/utils/parsers/gcode.parser.js +254 -0
  186. package/dist/utils/parsers/gcode.parser.js.map +1 -0
  187. package/dist/utils/swagger/decorators.js +39 -0
  188. package/dist/utils/swagger/decorators.js.map +1 -0
  189. package/dist/utils/swagger/generator.js +196 -0
  190. package/dist/utils/swagger/generator.js.map +1 -0
  191. package/dist/utils/swagger/swagger.js +93 -0
  192. package/dist/utils/swagger/swagger.js.map +1 -0
  193. package/package.json +21 -17
  194. package/dist/controllers/custom-gcode.controller.js +0 -147
  195. package/dist/controllers/custom-gcode.controller.js.map +0 -1
  196. package/dist/controllers/print-completion.controller.js +0 -118
  197. package/dist/controllers/print-completion.controller.js.map +0 -1
  198. package/dist/controllers/printer-group.controller.js.map +0 -1
  199. package/dist/entities/custom-gcode.entity.js +0 -49
  200. package/dist/entities/custom-gcode.entity.js.map +0 -1
  201. package/dist/entities/group.entity.js.map +0 -1
  202. package/dist/entities/print-completion.entity.js +0 -90
  203. package/dist/entities/print-completion.entity.js.map +0 -1
  204. package/dist/entities/printer-group.entity.js.map +0 -1
  205. package/dist/services/interfaces/custom-gcode.dto.js +0 -18
  206. package/dist/services/interfaces/custom-gcode.dto.js.map +0 -1
  207. package/dist/services/interfaces/custom-gcode.service.interface.js +0 -6
  208. package/dist/services/interfaces/custom-gcode.service.interface.js.map +0 -1
  209. package/dist/services/interfaces/gcode-analysis.dto.js.map +0 -1
  210. package/dist/services/interfaces/group.dto.js.map +0 -1
  211. package/dist/services/interfaces/print-completion-context.dto.js +0 -6
  212. package/dist/services/interfaces/print-completion-context.dto.js.map +0 -1
  213. package/dist/services/interfaces/print-completion.dto.js +0 -38
  214. package/dist/services/interfaces/print-completion.dto.js.map +0 -1
  215. package/dist/services/interfaces/print-completion.interface.js.map +0 -1
  216. package/dist/services/interfaces/printer-group.dto.js.map +0 -1
  217. package/dist/services/interfaces/printer-group.service.interface.js +0 -6
  218. package/dist/services/orm/custom-gcode.service.js +0 -42
  219. package/dist/services/orm/custom-gcode.service.js.map +0 -1
  220. package/dist/services/orm/print-completion.service.js +0 -87
  221. package/dist/services/orm/print-completion.service.js.map +0 -1
  222. package/dist/services/orm/print-completion.shared.js +0 -59
  223. package/dist/services/orm/print-completion.shared.js.map +0 -1
  224. package/dist/services/orm/printer-group.service.js +0 -109
  225. package/dist/services/orm/printer-group.service.js.map +0 -1
  226. package/dist/tasks/print-completion.socketio.task.js +0 -91
  227. package/dist/tasks/print-completion.socketio.task.js.map +0 -1
  228. package/dist/tasks/printer-file-clean.task.js +0 -74
  229. package/dist/tasks/printer-file-clean.task.js.map +0 -1
  230. /package/dist/services/{interfaces → octoprint/dto/files}/gcode-analysis.dto.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/parsers/3mf.parser.ts"],"names":["ThreeMFParser","parse","filePath","stats","fs","stat","fileName","path","basename","zip","AdmZip","zipEntries","getEntries","metadataJsonEntry","find","e","entryName","metadata","jsonContent","getData","toString","jsonData","JSON","normalizeJsonMetadata","modelEntry","extractMetadataFromXML","plates","extractPlates","isMultiPlate","length","thumbnails","extractThumbnails","topLevelPrintTime","parseTime","printTime","topLevelFilamentWeight","parseFloat","totalFilamentWeight","filamentWeight","topLevelLayers","parseInt","layerCount","topLevelFilamentUsedMm","filamentUsed","topLevelFilamentUsedCm3","filamentVolume","topLevelFilamentDensity","filamentDensity","topLevelMaxZ","maxZ","topLevelSlicerVersion","slicerVersion","generator","topLevelNozzleDiameter","nozzleDiameter","topLevelLayerHeight","layerHeight","layer_height","topLevelFirstLayerHeight","firstLayerHeight","first_layer_height","topLevelBedTemp","bedTemp","bed_temperature","topLevelNozzleTemp","nozzleTemp","nozzle_temperature","topLevelFillDensity","infillDensity","infill_density","fill_density","topLevelFilamentType","filamentType","filament_type","topLevelPrinterModel","printerModel","printer_model","topLevelFilamentDiameter","filamentDiameter","filament_diameter","plate","gcodePrintTimeSeconds","filamentUsedGrams","totalLayers","filamentUsedMm","filamentUsedCm3","filamentDensityGramsCm3","maxLayerZ","nozzleDiameterMm","bedTemperature","nozzleTemperature","fillDensity","filamentDiameterMm","reduce","sum","p","Math","max","map","firstPlate","normalized","fileFormat","fileSize","size","totalPlates","totalFilamentUsedGrams","undefined","raw","_thumbnails","String","estimatedPrintTimeSec","xml","patterns","pattern","match","key","source","generatorMatch","plateEntries","filter","endsWith","entry","plateMatch","plateNumber","Number","gcodeContent","min","parseGCodeHeader","plateThumbs","includes","model_printing_time","total_estimated_time","print_time","total_filament_weight_g","filament_weight","total_filament_weight","total_layer_number","layer_count","total_layers","plateMetadata","total_filament_length_mm","filament_length_mm","filament_used_mm","total_filament_volume_cm3","filament_volume_cm3","filament_density","max_z_height","max_layer_z","bambustudio","slicer_version","slicer","nozzle_diameter","initial_layer_height","initial_layer_print_height","bed_temperature_actual","bed_temp","bed_temperature_initial_layer","nozzle_temp","nozzle_temperature_initial_layer","sparse_infill_density","objects","t","type","push","sort","a","b","gcode","lines","split","slice","line","startsWith","bambuMatch","trim","toLowerCase","replace","value","_","unit","bedTempMatch","thumbEntries","sizeMatch","width","height","format","toUpperCase","imageData","base64Data","data","num","isNaN","hours","minutes","secs","seconds"],"mappings":"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"}
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "BGCodeParser", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return BGCodeParser;
9
+ }
10
+ });
11
+ const _promises = /*#__PURE__*/ _interop_require_wildcard(require("node:fs/promises"));
12
+ const _path = /*#__PURE__*/ _interop_require_wildcard(require("path"));
13
+ function _getRequireWildcardCache(nodeInterop) {
14
+ if (typeof WeakMap !== "function") return null;
15
+ var cacheBabelInterop = new WeakMap();
16
+ var cacheNodeInterop = new WeakMap();
17
+ return (_getRequireWildcardCache = function(nodeInterop) {
18
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
19
+ })(nodeInterop);
20
+ }
21
+ function _interop_require_wildcard(obj, nodeInterop) {
22
+ if (!nodeInterop && obj && obj.__esModule) {
23
+ return obj;
24
+ }
25
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
26
+ return {
27
+ default: obj
28
+ };
29
+ }
30
+ var cache = _getRequireWildcardCache(nodeInterop);
31
+ if (cache && cache.has(obj)) {
32
+ return cache.get(obj);
33
+ }
34
+ var newObj = {
35
+ __proto__: null
36
+ };
37
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
38
+ for(var key in obj){
39
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
40
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
41
+ if (desc && (desc.get || desc.set)) {
42
+ Object.defineProperty(newObj, key, desc);
43
+ } else {
44
+ newObj[key] = obj[key];
45
+ }
46
+ }
47
+ }
48
+ newObj.default = obj;
49
+ if (cache) {
50
+ cache.set(obj, newObj);
51
+ }
52
+ return newObj;
53
+ }
54
+ class BGCodeParser {
55
+ async parse(filePath) {
56
+ const stats = await _promises.stat(filePath);
57
+ const fileName = _path.basename(filePath);
58
+ const buffer = await this.readFileHeader(filePath, 4096);
59
+ const metadata = this.parseHeader(buffer);
60
+ const blocks = this.parseBlocks(buffer);
61
+ const thumbnails = this.extractThumbnails(buffer);
62
+ const normalized = {
63
+ fileName,
64
+ fileFormat: "bgcode",
65
+ fileSize: stats.size,
66
+ producer: metadata.producer,
67
+ producedOn: metadata.produced_on,
68
+ checksumType: metadata.checksum_type,
69
+ gcodePrintTimeSeconds: this.parseTime(metadata.estimated_printing_time_normal_mode || metadata.estimated_printing_time || metadata.print_time),
70
+ nozzleDiameterMm: this.parseFirstValue(metadata.nozzle_diameter),
71
+ filamentDiameterMm: this.parseFirstValue(metadata.filament_diameter) || 1.75,
72
+ filamentDensityGramsCm3: this.parseFirstValue(metadata.filament_density),
73
+ filamentUsedMm: this.parseFirstValue(metadata.filament_used_mm),
74
+ filamentUsedCm3: this.parseFirstValue(metadata.filament_used_cm3),
75
+ filamentUsedGrams: this.parseFirstValue(metadata.filament_used_g),
76
+ totalFilamentUsedGrams: this.parseFirstValue(metadata.filament_used_g),
77
+ layerHeight: this.parseFloat(metadata.layer_height),
78
+ firstLayerHeight: this.parseFloat(metadata.first_layer_height || metadata.initial_layer_height),
79
+ bedTemperature: this.parseFirstValue(metadata.bed_temperature),
80
+ nozzleTemperature: this.parseFirstValue(metadata.temperature),
81
+ fillDensity: metadata.fill_density || null,
82
+ filamentType: this.parseFirstCsvValue(metadata.filament_type),
83
+ printerModel: metadata.printer_model || null,
84
+ slicerVersion: metadata.producer || null,
85
+ maxLayerZ: this.parseFloat(metadata.max_layer_z),
86
+ totalLayers: this.parseInt(metadata.total_layers || metadata.layer_count),
87
+ thumbnails: thumbnails.length > 0 ? thumbnails : undefined,
88
+ blocks: blocks.length > 0 ? blocks : undefined
89
+ };
90
+ return {
91
+ raw: {
92
+ _thumbnails: thumbnails,
93
+ blocks
94
+ },
95
+ normalized
96
+ };
97
+ }
98
+ async readFileHeader(filePath, bytes) {
99
+ const fileHandle = await _promises.open(filePath, "r");
100
+ try {
101
+ const buffer = Buffer.alloc(bytes);
102
+ await fileHandle.read(buffer, 0, bytes, 0);
103
+ return buffer;
104
+ } finally{
105
+ await fileHandle.close();
106
+ }
107
+ }
108
+ parseHeader(buffer) {
109
+ const metadata = {};
110
+ const magic = buffer.toString("ascii", 0, 4);
111
+ if (magic !== "GCDE" && magic !== "BGCD") {
112
+ throw new Error(`Invalid BGCode file: magic number not found (got "${magic}", expected "GCDE" or "BGCD")`);
113
+ }
114
+ const version = buffer.readUInt32LE(4);
115
+ metadata.version = version.toString();
116
+ const headerText = buffer.toString("utf8", 0, Math.min(buffer.length, 2048));
117
+ this.extractMetadataFromText(headerText, metadata);
118
+ return metadata;
119
+ }
120
+ extractMetadataFromText(text, metadata) {
121
+ const lines = text.split('\n');
122
+ const producerMatch = text.match(/Producer=([^\n\r\0]+)/);
123
+ if (producerMatch) {
124
+ metadata.producer = producerMatch[1].trim();
125
+ }
126
+ for (const line of lines){
127
+ const match = line.match(/^([a-z_\s]+(?:\[[^\]]+\])?(?:\([^)]+\))?)\s*=\s*(.+)/i);
128
+ if (match) {
129
+ let key = match[1].trim().toLowerCase().replace(/\s+/g, '_');
130
+ let value = match[2].trim();
131
+ key = key.replace(/\(([^)]+)\)/g, (_, content)=>'_' + content.replace(/\s+/g, '_'));
132
+ key = key.replace(/\[([^\]]+)\]/g, (_, unit)=>'_' + unit.replace(/\^/g, ''));
133
+ key = key.replace(/_+/g, '_');
134
+ metadata[key] = value;
135
+ }
136
+ }
137
+ const patterns = [
138
+ /producer[=:]\s*([^\n\r]+)/i,
139
+ /produced[\s_]on[=:]\s*([^\n\r]+)/i,
140
+ /print[\s_]time[=:]\s*([^\n\r]+)/i,
141
+ /layer[\s_]height[=:]\s*([^\n\r]+)/i,
142
+ /nozzle_diameter[=:]\s*([^\n\r]+)/i,
143
+ /bed_temperature[=:]\s*([^\n\r]+)/i,
144
+ /nozzle_temperature[=:]\s*([^\n\r]+)/i
145
+ ];
146
+ for (const pattern of patterns){
147
+ const match = text.match(pattern);
148
+ if (match) {
149
+ const key = pattern.source.match(/^(\w+)/)?.[1] || "";
150
+ metadata[key] = match[1].trim();
151
+ }
152
+ }
153
+ }
154
+ parseBlocks(buffer) {
155
+ const blocks = [];
156
+ try {
157
+ let offset = 8;
158
+ const blockCount = Math.min(buffer.readUInt16LE(offset), 10);
159
+ for(let i = 0; i < blockCount; i++){
160
+ blocks.push({
161
+ type: `Block${i}`,
162
+ compressedSize: 0,
163
+ uncompressedSize: 0,
164
+ compression: "unknown"
165
+ });
166
+ }
167
+ } catch (error) {}
168
+ return blocks;
169
+ }
170
+ extractThumbnails(buffer) {
171
+ const thumbnails = [];
172
+ try {
173
+ for(let i = 0; i < buffer.length - 8; i++){
174
+ if (buffer[i] === 0x89 && buffer[i + 1] === 0x50 && buffer[i + 2] === 0x4E && buffer[i + 3] === 0x47) {
175
+ thumbnails.push({
176
+ width: 0,
177
+ height: 0,
178
+ format: "PNG",
179
+ size: 0
180
+ });
181
+ break;
182
+ }
183
+ }
184
+ } catch (error) {}
185
+ return thumbnails;
186
+ }
187
+ parseFloat(value) {
188
+ if (!value) return null;
189
+ const num = parseFloat(value);
190
+ return isNaN(num) ? null : num;
191
+ }
192
+ parseInt(value) {
193
+ if (!value) return null;
194
+ const num = parseInt(value, 10);
195
+ return isNaN(num) ? null : num;
196
+ }
197
+ parseTime(value) {
198
+ if (!value) return null;
199
+ const match = value.match(/(?:(\d+)h)?(?:\s*(\d+)m)?(?:\s*(\d+)s)?/);
200
+ if (match && (match[1] || match[2] || match[3])) {
201
+ const hours = parseInt(match[1] || "0");
202
+ const minutes = parseInt(match[2] || "0");
203
+ const secs = parseInt(match[3] || "0");
204
+ return hours * 3600 + minutes * 60 + secs;
205
+ }
206
+ const seconds = parseFloat(value);
207
+ if (!isNaN(seconds)) return seconds;
208
+ return null;
209
+ }
210
+ parseFirstValue(value) {
211
+ if (!value) return null;
212
+ const firstValue = value.split(',')[0].trim();
213
+ const num = parseFloat(firstValue);
214
+ return isNaN(num) ? null : num;
215
+ }
216
+ parseFirstCsvValue(value) {
217
+ if (!value) return null;
218
+ const firstValue = value.split(/[;,]/)[0].trim();
219
+ return firstValue || null;
220
+ }
221
+ }
222
+
223
+ //# sourceMappingURL=bgcode.parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/parsers/bgcode.parser.ts"],"names":["BGCodeParser","parse","filePath","stats","fs","stat","fileName","path","basename","buffer","readFileHeader","metadata","parseHeader","blocks","parseBlocks","thumbnails","extractThumbnails","normalized","fileFormat","fileSize","size","producer","producedOn","produced_on","checksumType","checksum_type","gcodePrintTimeSeconds","parseTime","estimated_printing_time_normal_mode","estimated_printing_time","print_time","nozzleDiameterMm","parseFirstValue","nozzle_diameter","filamentDiameterMm","filament_diameter","filamentDensityGramsCm3","filament_density","filamentUsedMm","filament_used_mm","filamentUsedCm3","filament_used_cm3","filamentUsedGrams","filament_used_g","totalFilamentUsedGrams","layerHeight","parseFloat","layer_height","firstLayerHeight","first_layer_height","initial_layer_height","bedTemperature","bed_temperature","nozzleTemperature","temperature","fillDensity","fill_density","filamentType","parseFirstCsvValue","filament_type","printerModel","printer_model","slicerVersion","maxLayerZ","max_layer_z","totalLayers","parseInt","total_layers","layer_count","length","undefined","raw","_thumbnails","bytes","fileHandle","open","Buffer","alloc","read","close","magic","toString","Error","version","readUInt32LE","headerText","Math","min","extractMetadataFromText","text","lines","split","producerMatch","match","trim","line","key","toLowerCase","replace","value","_","content","unit","patterns","pattern","source","offset","blockCount","readUInt16LE","i","push","type","compressedSize","uncompressedSize","compression","error","width","height","format","num","isNaN","hours","minutes","secs","seconds","firstValue"],"mappings":"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"}
@@ -0,0 +1,254 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "GCodeParser", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return GCodeParser;
9
+ }
10
+ });
11
+ const _promises = /*#__PURE__*/ _interop_require_wildcard(require("node:fs/promises"));
12
+ const _nodereadline = /*#__PURE__*/ _interop_require_wildcard(require("node:readline"));
13
+ const _nodefs = require("node:fs");
14
+ function _getRequireWildcardCache(nodeInterop) {
15
+ if (typeof WeakMap !== "function") return null;
16
+ var cacheBabelInterop = new WeakMap();
17
+ var cacheNodeInterop = new WeakMap();
18
+ return (_getRequireWildcardCache = function(nodeInterop) {
19
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
20
+ })(nodeInterop);
21
+ }
22
+ function _interop_require_wildcard(obj, nodeInterop) {
23
+ if (!nodeInterop && obj && obj.__esModule) {
24
+ return obj;
25
+ }
26
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
27
+ return {
28
+ default: obj
29
+ };
30
+ }
31
+ var cache = _getRequireWildcardCache(nodeInterop);
32
+ if (cache && cache.has(obj)) {
33
+ return cache.get(obj);
34
+ }
35
+ var newObj = {
36
+ __proto__: null
37
+ };
38
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
39
+ for(var key in obj){
40
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
41
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
42
+ if (desc && (desc.get || desc.set)) {
43
+ Object.defineProperty(newObj, key, desc);
44
+ } else {
45
+ newObj[key] = obj[key];
46
+ }
47
+ }
48
+ }
49
+ newObj.default = obj;
50
+ if (cache) {
51
+ cache.set(obj, newObj);
52
+ }
53
+ return newObj;
54
+ }
55
+ class GCodeParser {
56
+ maxHeaderLinesToRead = 500;
57
+ maxFooterLinesToRead = 500;
58
+ async parse(filePath) {
59
+ const stats = await _promises.stat(filePath);
60
+ const fileName = filePath.split(/[/\\]/).pop() || filePath;
61
+ const metadata = await this.extractMetadata(filePath);
62
+ const thumbnails = await this.extractThumbnails(filePath);
63
+ const normalized = {
64
+ fileName,
65
+ fileFormat: "gcode",
66
+ fileSize: stats.size,
67
+ gcodePrintTimeSeconds: this.parseTime(metadata.estimated_printing_time_normal_mode || metadata.estimated_printing_time || metadata.print_time),
68
+ nozzleDiameterMm: this.parseFloat(metadata.nozzle_diameter),
69
+ filamentDiameterMm: this.parseFloat(metadata.filament_diameter),
70
+ filamentDensityGramsCm3: this.parseFloat(metadata.filament_density),
71
+ filamentUsedMm: this.parseFloat(metadata.filament_used_mm),
72
+ filamentUsedCm3: this.parseFloat(metadata.filament_used_cm3),
73
+ filamentUsedGrams: this.parseFloat(metadata.filament_used_g),
74
+ totalFilamentUsedGrams: this.parseFloat(metadata.total_filament_used_g || metadata.filament_used_g),
75
+ layerHeight: this.parseFloat(metadata.layer_height),
76
+ firstLayerHeight: this.parseFloat(metadata.first_layer_height || metadata.initial_layer_height),
77
+ bedTemperature: this.parseFloat(metadata.bed_temperature || metadata.first_layer_bed_temperature),
78
+ nozzleTemperature: this.parseFloat(metadata.temperature || metadata.first_layer_temperature),
79
+ fillDensity: metadata.fill_density || null,
80
+ filamentType: metadata.filament_type || null,
81
+ printerModel: metadata.printer_model || metadata.printer_name || null,
82
+ slicerVersion: metadata.generated_by || metadata.slicer_version || null,
83
+ maxLayerZ: this.parseFloat(metadata.max_layer_z),
84
+ totalLayers: this.parseInt(metadata.total_layers) || this.parseInt(metadata.layer_count),
85
+ generatedBy: metadata.generated_by,
86
+ thumbnails: thumbnails.length > 0 ? thumbnails.map((t)=>({
87
+ width: t.width,
88
+ height: t.height,
89
+ format: t.format,
90
+ dataLength: t.data?.length || 0
91
+ })) : undefined
92
+ };
93
+ return {
94
+ raw: {
95
+ _thumbnails: thumbnails,
96
+ metadata
97
+ },
98
+ normalized
99
+ };
100
+ }
101
+ async extractMetadata(filePath) {
102
+ const metadata = {};
103
+ await this.extractMetadataFromStart(filePath, metadata);
104
+ await this.extractMetadataFromEnd(filePath, metadata);
105
+ return metadata;
106
+ }
107
+ async extractMetadataFromStart(filePath, metadata) {
108
+ let linesRead = 0;
109
+ const fileStream = (0, _nodefs.createReadStream)(filePath);
110
+ const rl = _nodereadline.createInterface({
111
+ input: fileStream,
112
+ crlfDelay: Infinity
113
+ });
114
+ for await (const line of rl){
115
+ if (linesRead >= this.maxHeaderLinesToRead) break;
116
+ linesRead++;
117
+ this.parseMetadataLine(line, metadata);
118
+ }
119
+ rl.close();
120
+ fileStream.close();
121
+ }
122
+ async extractMetadataFromEnd(filePath, metadata) {
123
+ const stats = await _promises.stat(filePath);
124
+ const fileSize = stats.size;
125
+ const estimatedBytes = this.maxFooterLinesToRead * 50;
126
+ const startPosition = Math.max(0, fileSize - estimatedBytes);
127
+ const fileHandle = await _promises.open(filePath, 'r');
128
+ try {
129
+ const buffer = Buffer.alloc(estimatedBytes);
130
+ const { bytesRead } = await fileHandle.read(buffer, 0, estimatedBytes, startPosition);
131
+ const text = buffer.toString('utf8', 0, bytesRead);
132
+ const lines = text.split('\n');
133
+ for (const line of lines){
134
+ this.parseMetadataLine(line, metadata);
135
+ }
136
+ } finally{
137
+ await fileHandle.close();
138
+ }
139
+ }
140
+ parseMetadataLine(line, metadata) {
141
+ if (!line.startsWith(";")) return;
142
+ const generatedByMatch = line.match(/^;\s*generated by\s+([^\s]+)/i);
143
+ if (generatedByMatch && !metadata.generated_by) {
144
+ metadata.generated_by = generatedByMatch[1];
145
+ return;
146
+ }
147
+ const prusaMatch = line.match(/^;\s*([^=]+?)\s*=\s*(.+)$/);
148
+ if (prusaMatch) {
149
+ let key = prusaMatch[1].trim().toLowerCase().replace(/\s+/g, "_");
150
+ let value = prusaMatch[2].trim();
151
+ key = key.replace(/\[([^\]]+)\]/g, (_, unit)=>'_' + unit.replace(/\^/g, ''));
152
+ key = key.replace(/\(([^)]+)\)/g, (_, content)=>'_' + content.replace(/\s+/g, '_'));
153
+ key = key.replace(/_+/g, '_');
154
+ if (!metadata[key]) {
155
+ metadata[key] = value.trim();
156
+ }
157
+ return;
158
+ }
159
+ const curaMatch = line.match(/^;([A-Z_]+):(.+)$/);
160
+ if (curaMatch) {
161
+ const [, key, value] = curaMatch;
162
+ const normalizedKey = key.toLowerCase();
163
+ if (!metadata[normalizedKey]) {
164
+ metadata[normalizedKey] = value.trim();
165
+ }
166
+ return;
167
+ }
168
+ const s3dMatch = line.match(/^;\s*([^:]+?):\s*(.+)$/);
169
+ if (s3dMatch) {
170
+ const [, key, value] = s3dMatch;
171
+ const normalizedKey = key.trim().toLowerCase().replace(/\s+/g, "_");
172
+ if (!metadata[normalizedKey]) {
173
+ metadata[normalizedKey] = value.trim();
174
+ }
175
+ }
176
+ }
177
+ async extractThumbnails(filePath) {
178
+ const thumbnails = [];
179
+ let linesRead = 0;
180
+ let inThumbnail = false;
181
+ let thumbnailData = [];
182
+ let currentWidth = 0;
183
+ let currentHeight = 0;
184
+ let currentFormat = "PNG";
185
+ const fileStream = (0, _nodefs.createReadStream)(filePath);
186
+ const rl = _nodereadline.createInterface({
187
+ input: fileStream,
188
+ crlfDelay: Infinity
189
+ });
190
+ for await (const line of rl){
191
+ if (linesRead >= this.maxHeaderLinesToRead && !inThumbnail) break;
192
+ linesRead++;
193
+ const thumbnailStart = line.match(/;\s*thumbnail begin (\d+)x(\d+)\s*(\w+)?/i);
194
+ if (thumbnailStart) {
195
+ inThumbnail = true;
196
+ currentWidth = parseInt(thumbnailStart[1]);
197
+ currentHeight = parseInt(thumbnailStart[2]);
198
+ const thirdParam = thumbnailStart[3];
199
+ if (thirdParam && /^(PNG|JPG|JPEG|QOI)$/i.test(thirdParam)) {
200
+ currentFormat = thirdParam.toUpperCase();
201
+ } else {
202
+ currentFormat = "PNG";
203
+ }
204
+ thumbnailData = [];
205
+ continue;
206
+ }
207
+ if (inThumbnail) {
208
+ if (line.match(/;\s*thumbnail end/i)) {
209
+ thumbnails.push({
210
+ width: currentWidth,
211
+ height: currentHeight,
212
+ format: currentFormat.toUpperCase(),
213
+ data: thumbnailData.join("")
214
+ });
215
+ inThumbnail = false;
216
+ thumbnailData = [];
217
+ } else if (line.startsWith(";")) {
218
+ const data = line.substring(1).trim();
219
+ if (data) {
220
+ thumbnailData.push(data);
221
+ }
222
+ }
223
+ }
224
+ }
225
+ rl.close();
226
+ fileStream.close();
227
+ return thumbnails;
228
+ }
229
+ parseFloat(value) {
230
+ if (!value) return null;
231
+ const num = parseFloat(value);
232
+ return isNaN(num) ? null : num;
233
+ }
234
+ parseInt(value) {
235
+ if (!value) return null;
236
+ const num = parseInt(value, 10);
237
+ return isNaN(num) ? null : num;
238
+ }
239
+ parseTime(value) {
240
+ if (!value) return null;
241
+ const match = value.match(/(?:(\d+)h)?(?:\s*(\d+)m)?(?:\s*(\d+)s)?/);
242
+ if (match && (match[1] || match[2] || match[3])) {
243
+ const hours = parseInt(match[1] || "0");
244
+ const minutes = parseInt(match[2] || "0");
245
+ const secs = parseInt(match[3] || "0");
246
+ return hours * 3600 + minutes * 60 + secs;
247
+ }
248
+ const seconds = parseFloat(value);
249
+ if (!isNaN(seconds)) return seconds;
250
+ return null;
251
+ }
252
+ }
253
+
254
+ //# sourceMappingURL=gcode.parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/parsers/gcode.parser.ts"],"names":["GCodeParser","maxHeaderLinesToRead","maxFooterLinesToRead","parse","filePath","stats","fs","stat","fileName","split","pop","metadata","extractMetadata","thumbnails","extractThumbnails","normalized","fileFormat","fileSize","size","gcodePrintTimeSeconds","parseTime","estimated_printing_time_normal_mode","estimated_printing_time","print_time","nozzleDiameterMm","parseFloat","nozzle_diameter","filamentDiameterMm","filament_diameter","filamentDensityGramsCm3","filament_density","filamentUsedMm","filament_used_mm","filamentUsedCm3","filament_used_cm3","filamentUsedGrams","filament_used_g","totalFilamentUsedGrams","total_filament_used_g","layerHeight","layer_height","firstLayerHeight","first_layer_height","initial_layer_height","bedTemperature","bed_temperature","first_layer_bed_temperature","nozzleTemperature","temperature","first_layer_temperature","fillDensity","fill_density","filamentType","filament_type","printerModel","printer_model","printer_name","slicerVersion","generated_by","slicer_version","maxLayerZ","max_layer_z","totalLayers","parseInt","total_layers","layer_count","generatedBy","length","map","t","width","height","format","dataLength","data","undefined","raw","_thumbnails","extractMetadataFromStart","extractMetadataFromEnd","linesRead","fileStream","createReadStream","rl","readline","createInterface","input","crlfDelay","Infinity","line","parseMetadataLine","close","estimatedBytes","startPosition","Math","max","fileHandle","open","buffer","Buffer","alloc","bytesRead","read","text","toString","lines","startsWith","generatedByMatch","match","prusaMatch","key","trim","toLowerCase","replace","value","_","unit","content","curaMatch","normalizedKey","s3dMatch","inThumbnail","thumbnailData","currentWidth","currentHeight","currentFormat","thumbnailStart","thirdParam","test","toUpperCase","push","join","substring","num","isNaN","hours","minutes","secs","seconds"],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get API_METADATA_KEY () {
13
+ return API_METADATA_KEY;
14
+ },
15
+ get ApiOperation () {
16
+ return ApiOperation;
17
+ },
18
+ get ApiProperty () {
19
+ return ApiProperty;
20
+ }
21
+ });
22
+ require("reflect-metadata");
23
+ const API_METADATA_KEY = "Router Config";
24
+ function ApiProperty(options = {}) {
25
+ return function(target, propertyKey) {
26
+ const metadata = Reflect.getMetadata(API_METADATA_KEY, target.constructor) || {};
27
+ metadata[propertyKey] = options;
28
+ Reflect.defineMetadata(API_METADATA_KEY, metadata, target.constructor);
29
+ };
30
+ }
31
+ function ApiOperation(options = {}) {
32
+ return function(target, propertyKey, descriptor) {
33
+ const metadata = Reflect.getMetadata(API_METADATA_KEY, target.constructor) || {};
34
+ metadata[`${propertyKey}:operation`] = options;
35
+ Reflect.defineMetadata(API_METADATA_KEY, metadata, target.constructor);
36
+ };
37
+ }
38
+
39
+ //# sourceMappingURL=decorators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/swagger/decorators.ts"],"names":["API_METADATA_KEY","ApiOperation","ApiProperty","options","target","propertyKey","metadata","Reflect","getMetadata","defineMetadata","descriptor"],"mappings":";;;;;;;;;;;QAGaA;eAAAA;;QAwBGC;eAAAA;;QARAC;eAAAA;;;QAlBT;AAEA,MAAMF,mBAAmB;AAgBzB,SAASE,YAAYC,UAA8B,CAAC,CAAC;IAC1D,OAAO,SAAUC,MAAW,EAAEC,WAAmB;QAC/C,MAAMC,WAAWC,QAAQC,WAAW,CAACR,kBAAkBI,OAAO,WAAW,KAAK,CAAC;QAC/EE,QAAQ,CAACD,YAAY,GAAGF;QACxBI,QAAQE,cAAc,CAACT,kBAAkBM,UAAUF,OAAO,WAAW;IACvE;AACF;AAEO,SAASH,aAAaE,UAA+B,CAAC,CAAC;IAC5D,OAAO,SAAUC,MAAW,EAAEC,WAAmB,EAAEK,UAA8B;QAC/E,MAAMJ,WAAWC,QAAQC,WAAW,CAACR,kBAAkBI,OAAO,WAAW,KAAK,CAAC;QAC/EE,QAAQ,CAAC,GAAGD,YAAY,UAAU,CAAC,CAAC,GAAGF;QACvCI,QAAQE,cAAc,CAACT,kBAAkBM,UAAUF,OAAO,WAAW;IACvE;AACF"}