@fdm-monster/server 2.0.6 → 2.0.8

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 (73) hide show
  1. package/.yarn/install-state.gz +0 -0
  2. package/RELEASE_NOTES.MD +31 -0
  3. package/dist/consoles/bambu-mqtt-diagnostic.console.js +565 -0
  4. package/dist/consoles/bambu-mqtt-diagnostic.console.js.map +1 -0
  5. package/dist/consoles/mock-bambu.server.js +114 -88
  6. package/dist/consoles/mock-bambu.server.js.map +1 -1
  7. package/dist/controllers/file-storage.controller.js +34 -14
  8. package/dist/controllers/file-storage.controller.js.map +1 -1
  9. package/dist/controllers/print-job.controller.js +33 -236
  10. package/dist/controllers/print-job.controller.js.map +1 -1
  11. package/dist/controllers/print-queue.controller.js +82 -17
  12. package/dist/controllers/print-queue.controller.js.map +1 -1
  13. package/dist/controllers/printer-files.controller.js +8 -2
  14. package/dist/controllers/printer-files.controller.js.map +1 -1
  15. package/dist/controllers/printer.controller.js +3 -3
  16. package/dist/controllers/printer.controller.js.map +1 -1
  17. package/dist/entities/print-job.entity.js.map +1 -1
  18. package/dist/server.constants.js +1 -1
  19. package/dist/services/bambu/bambu-ftp.adapter.js +13 -21
  20. package/dist/services/bambu/bambu-ftp.adapter.js.map +1 -1
  21. package/dist/services/bambu/bambu-mqtt.adapter.js +86 -32
  22. package/dist/services/bambu/bambu-mqtt.adapter.js.map +1 -1
  23. package/dist/services/bambu/bambu.client.js.map +1 -1
  24. package/dist/services/bambu.api.js +12 -24
  25. package/dist/services/bambu.api.js.map +1 -1
  26. package/dist/services/file-storage.service.js +11 -2
  27. package/dist/services/file-storage.service.js.map +1 -1
  28. package/dist/services/moonraker/moonraker.client.js +5 -17
  29. package/dist/services/moonraker/moonraker.client.js.map +1 -1
  30. package/dist/services/moonraker.api.js +3 -2
  31. package/dist/services/moonraker.api.js.map +1 -1
  32. package/dist/services/octoprint/octoprint.client.js +5 -17
  33. package/dist/services/octoprint/octoprint.client.js.map +1 -1
  34. package/dist/services/octoprint.api.js +3 -2
  35. package/dist/services/octoprint.api.js.map +1 -1
  36. package/dist/services/orm/print-job.service.js +55 -47
  37. package/dist/services/orm/print-job.service.js.map +1 -1
  38. package/dist/services/print-queue.service.js +90 -30
  39. package/dist/services/print-queue.service.js.map +1 -1
  40. package/dist/services/printer-api.interface.js +13 -0
  41. package/dist/services/printer-api.interface.js.map +1 -1
  42. package/dist/services/prusa-link/prusa-link.api.js +12 -22
  43. package/dist/services/prusa-link/prusa-link.api.js.map +1 -1
  44. package/dist/tasks/print-job-analysis.task.js.map +1 -1
  45. package/dist/utils/bgcode/bgcode-thumbnail.parser.js +50 -0
  46. package/dist/utils/bgcode/bgcode-thumbnail.parser.js.map +1 -0
  47. package/dist/utils/bgcode/bgcode.constants.js +57 -0
  48. package/dist/utils/bgcode/bgcode.constants.js.map +1 -0
  49. package/dist/utils/bgcode/bgcode.types.js +132 -0
  50. package/dist/utils/bgcode/bgcode.types.js.map +1 -0
  51. package/dist/utils/bgcode/bgcode.utils.js +288 -0
  52. package/dist/utils/bgcode/bgcode.utils.js.map +1 -0
  53. package/dist/utils/bgcode/heatshrink-decoder.js +172 -0
  54. package/dist/utils/bgcode/heatshrink-decoder.js.map +1 -0
  55. package/dist/utils/bgcode/png-encoder.js +76 -0
  56. package/dist/utils/bgcode/png-encoder.js.map +1 -0
  57. package/dist/utils/bgcode/qoi-decoder.js +141 -0
  58. package/dist/utils/bgcode/qoi-decoder.js.map +1 -0
  59. package/dist/utils/image-dimensions.js +62 -0
  60. package/dist/utils/image-dimensions.js.map +1 -0
  61. package/dist/utils/job-stats.util.js +79 -0
  62. package/dist/utils/job-stats.util.js.map +1 -0
  63. package/dist/utils/parsers/3mf.parser.js +39 -9
  64. package/dist/utils/parsers/3mf.parser.js.map +1 -1
  65. package/dist/utils/parsers/bgcode.parser.js +125 -144
  66. package/dist/utils/parsers/bgcode.parser.js.map +1 -1
  67. package/dist/utils/parsers/gcode.parser.js +13 -2
  68. package/dist/utils/parsers/gcode.parser.js.map +1 -1
  69. package/dist/utils/parsers/parser.types.js +6 -0
  70. package/dist/utils/parsers/parser.types.js.map +1 -0
  71. package/dist/utils/thumbnail.util.js +24 -0
  72. package/dist/utils/thumbnail.util.js.map +1 -0
  73. package/package.json +13 -10
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "HeatshrinkDecoder", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return HeatshrinkDecoder;
9
+ }
10
+ });
11
+ var HSState = /*#__PURE__*/ function(HSState) {
12
+ HSState[HSState["TAG_BIT"] = 0] = "TAG_BIT";
13
+ HSState[HSState["YIELD_LITERAL"] = 1] = "YIELD_LITERAL";
14
+ HSState[HSState["BACKREF_INDEX_MSB"] = 2] = "BACKREF_INDEX_MSB";
15
+ HSState[HSState["BACKREF_INDEX_LSB"] = 3] = "BACKREF_INDEX_LSB";
16
+ HSState[HSState["BACKREF_COUNT_MSB"] = 4] = "BACKREF_COUNT_MSB";
17
+ HSState[HSState["BACKREF_COUNT_LSB"] = 5] = "BACKREF_COUNT_LSB";
18
+ HSState[HSState["YIELD_BACKREF"] = 6] = "YIELD_BACKREF";
19
+ return HSState;
20
+ }(HSState || {});
21
+ class HeatshrinkDecoder {
22
+ windowBits;
23
+ lookaheadBits;
24
+ windowSize;
25
+ window;
26
+ head = 0;
27
+ state = 0;
28
+ outputIndex = 0;
29
+ outputCount = 0;
30
+ inputBuffer;
31
+ inputIndex = 0;
32
+ bitAccumulator = 0;
33
+ bitsAvailable = 0;
34
+ constructor(windowBits, lookaheadBits){
35
+ this.windowBits = windowBits;
36
+ this.lookaheadBits = lookaheadBits;
37
+ this.windowSize = 1 << windowBits;
38
+ this.window = Buffer.alloc(this.windowSize);
39
+ this.inputBuffer = Buffer.alloc(0);
40
+ }
41
+ decompress(input) {
42
+ this.inputBuffer = input;
43
+ this.inputIndex = 0;
44
+ this.bitAccumulator = 0;
45
+ this.bitsAvailable = 0;
46
+ this.head = 0;
47
+ this.state = 0;
48
+ const output = [];
49
+ while(this.inputIndex < this.inputBuffer.length || this.bitsAvailable > 0){
50
+ const result = this.step();
51
+ if (result === null) {
52
+ break;
53
+ }
54
+ if (result >= 0) {
55
+ output.push(result);
56
+ }
57
+ }
58
+ return Buffer.from(output);
59
+ }
60
+ step() {
61
+ switch(this.state){
62
+ case 0:
63
+ return this.handleTagBit();
64
+ case 1:
65
+ return this.handleYieldLiteral();
66
+ case 2:
67
+ return this.handleBackrefIndexMSB();
68
+ case 3:
69
+ return this.handleBackrefIndexLSB();
70
+ case 4:
71
+ return this.handleBackrefCountMSB();
72
+ case 5:
73
+ return this.handleBackrefCountLSB();
74
+ case 6:
75
+ return this.handleYieldBackref();
76
+ default:
77
+ return null;
78
+ }
79
+ }
80
+ readBits(count) {
81
+ while(this.bitsAvailable < count && this.inputIndex < this.inputBuffer.length){
82
+ this.bitAccumulator = this.bitAccumulator << 8 | this.inputBuffer[this.inputIndex++];
83
+ this.bitsAvailable += 8;
84
+ }
85
+ if (this.bitsAvailable < count) {
86
+ return null;
87
+ }
88
+ this.bitsAvailable -= count;
89
+ const result = this.bitAccumulator >> this.bitsAvailable & (1 << count) - 1;
90
+ this.bitAccumulator &= (1 << this.bitsAvailable) - 1;
91
+ return result;
92
+ }
93
+ handleTagBit() {
94
+ const bit = this.readBits(1);
95
+ if (bit === null) return null;
96
+ if (bit === 1) {
97
+ this.state = 1;
98
+ } else {
99
+ if (this.windowBits > 8) {
100
+ this.state = 2;
101
+ } else {
102
+ this.outputIndex = 0;
103
+ this.state = 3;
104
+ }
105
+ }
106
+ return -1;
107
+ }
108
+ handleYieldLiteral() {
109
+ const byte = this.readBits(8);
110
+ if (byte === null) return null;
111
+ this.pushByte(byte);
112
+ this.state = 0;
113
+ return byte;
114
+ }
115
+ handleBackrefIndexMSB() {
116
+ const msb = this.readBits(this.windowBits - 8);
117
+ if (msb === null) return null;
118
+ this.outputIndex = msb << 8;
119
+ this.state = 3;
120
+ return -1;
121
+ }
122
+ handleBackrefIndexLSB() {
123
+ const bits = this.windowBits > 8 ? 8 : this.windowBits;
124
+ const lsb = this.readBits(bits);
125
+ if (lsb === null) return null;
126
+ this.outputIndex |= lsb;
127
+ this.outputCount = 0;
128
+ if (this.lookaheadBits > 8) {
129
+ this.state = 4;
130
+ } else {
131
+ this.state = 5;
132
+ }
133
+ return -1;
134
+ }
135
+ handleBackrefCountMSB() {
136
+ const msb = this.readBits(this.lookaheadBits - 8);
137
+ if (msb === null) return null;
138
+ this.outputCount = msb << 8;
139
+ this.state = 5;
140
+ return -1;
141
+ }
142
+ handleBackrefCountLSB() {
143
+ const bits = this.lookaheadBits > 8 ? 8 : this.lookaheadBits;
144
+ const lsb = this.readBits(bits);
145
+ if (lsb === null) return null;
146
+ this.outputCount |= lsb;
147
+ this.outputCount += 1;
148
+ this.outputIndex += 1;
149
+ this.state = 6;
150
+ return -1;
151
+ }
152
+ handleYieldBackref() {
153
+ if (this.outputCount === 0) {
154
+ this.state = 0;
155
+ return -1;
156
+ }
157
+ const pos = (this.head - this.outputIndex + this.windowSize) % this.windowSize;
158
+ const byte = this.window[pos];
159
+ this.pushByte(byte);
160
+ this.outputCount--;
161
+ if (this.outputCount === 0) {
162
+ this.state = 0;
163
+ }
164
+ return byte;
165
+ }
166
+ pushByte(byte) {
167
+ this.window[this.head] = byte;
168
+ this.head = (this.head + 1) % this.windowSize;
169
+ }
170
+ }
171
+
172
+ //# sourceMappingURL=heatshrink-decoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/bgcode/heatshrink-decoder.ts"],"names":["HeatshrinkDecoder","HSState","windowBits","lookaheadBits","windowSize","window","head","state","outputIndex","outputCount","inputBuffer","inputIndex","bitAccumulator","bitsAvailable","Buffer","alloc","decompress","input","output","length","result","step","push","from","handleTagBit","handleYieldLiteral","handleBackrefIndexMSB","handleBackrefIndexLSB","handleBackrefCountMSB","handleBackrefCountLSB","handleYieldBackref","readBits","count","bit","byte","pushByte","msb","bits","lsb","pos"],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "encodePNG", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return encodePNG;
9
+ }
10
+ });
11
+ const _nodezlib = require("node:zlib");
12
+ const PNG_SIGNATURE = Buffer.from([
13
+ 0x89,
14
+ 0x50,
15
+ 0x4E,
16
+ 0x47,
17
+ 0x0D,
18
+ 0x0A,
19
+ 0x1A,
20
+ 0x0A
21
+ ]);
22
+ function crc32(buffer) {
23
+ let crc = 0xffffffff;
24
+ for(let i = 0; i < buffer.length; i++){
25
+ crc ^= buffer[i];
26
+ for(let j = 0; j < 8; j++){
27
+ crc = crc >>> 1 ^ 0xedb88320 & -(crc & 1);
28
+ }
29
+ }
30
+ return (crc ^ 0xffffffff) >>> 0;
31
+ }
32
+ function writeChunk(type, data) {
33
+ const typeBuffer = Buffer.from(type, 'ascii');
34
+ const length = Buffer.alloc(4);
35
+ length.writeUInt32BE(data.length, 0);
36
+ const crcBuffer = Buffer.concat([
37
+ typeBuffer,
38
+ data
39
+ ]);
40
+ const crc = Buffer.alloc(4);
41
+ crc.writeUInt32BE(crc32(crcBuffer), 0);
42
+ return Buffer.concat([
43
+ length,
44
+ typeBuffer,
45
+ data,
46
+ crc
47
+ ]);
48
+ }
49
+ function encodePNG(width, height, rgba) {
50
+ const ihdr = Buffer.alloc(13);
51
+ ihdr.writeUInt32BE(width, 0);
52
+ ihdr.writeUInt32BE(height, 4);
53
+ ihdr.writeUInt8(8, 8);
54
+ ihdr.writeUInt8(6, 9);
55
+ ihdr.writeUInt8(0, 10);
56
+ ihdr.writeUInt8(0, 11);
57
+ ihdr.writeUInt8(0, 12);
58
+ const bytesPerPixel = 4;
59
+ const scanlineLength = width * bytesPerPixel;
60
+ const filteredData = Buffer.alloc(height * (scanlineLength + 1));
61
+ for(let y = 0; y < height; y++){
62
+ const scanlineOffset = y * (scanlineLength + 1);
63
+ filteredData[scanlineOffset] = 0;
64
+ rgba.copy(filteredData, scanlineOffset + 1, y * scanlineLength, (y + 1) * scanlineLength);
65
+ }
66
+ const compressed = (0, _nodezlib.deflateSync)(filteredData);
67
+ const chunks = [
68
+ PNG_SIGNATURE,
69
+ writeChunk('IHDR', ihdr),
70
+ writeChunk('IDAT', compressed),
71
+ writeChunk('IEND', Buffer.alloc(0))
72
+ ];
73
+ return Buffer.concat(chunks);
74
+ }
75
+
76
+ //# sourceMappingURL=png-encoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/bgcode/png-encoder.ts"],"names":["encodePNG","PNG_SIGNATURE","Buffer","from","crc32","buffer","crc","i","length","j","writeChunk","type","data","typeBuffer","alloc","writeUInt32BE","crcBuffer","concat","width","height","rgba","ihdr","writeUInt8","bytesPerPixel","scanlineLength","filteredData","y","scanlineOffset","copy","compressed","deflateSync","chunks"],"mappings":";;;;+BAiCgBA;;;eAAAA;;;0BA5BY;AAE5B,MAAMC,gBAAgBC,OAAOC,IAAI,CAAC;IAAC;IAAM;IAAM;IAAM;IAAM;IAAM;IAAM;IAAM;CAAK;AAElF,SAASC,MAAMC,MAAc;IAE3B,IAAIC,MAAM;IACV,IAAK,IAAIC,IAAI,GAAGA,IAAIF,OAAOG,MAAM,EAAED,IAAK;QACtCD,OAAOD,MAAM,CAACE,EAAE;QAChB,IAAK,IAAIE,IAAI,GAAGA,IAAI,GAAGA,IAAK;YAC1BH,MAAM,AAACA,QAAQ,IAAM,aAAa,CAAEA,CAAAA,MAAM,CAAA;QAC5C;IACF;IACA,OAAO,AAACA,CAAAA,MAAM,UAAS,MAAO;AAChC;AAEA,SAASI,WAAWC,IAAY,EAAEC,IAAY;IAC5C,MAAMC,aAAaX,OAAOC,IAAI,CAACQ,MAAM;IACrC,MAAMH,SAASN,OAAOY,KAAK,CAAC;IAC5BN,OAAOO,aAAa,CAACH,KAAKJ,MAAM,EAAE;IAElC,MAAMQ,YAAYd,OAAOe,MAAM,CAAC;QAACJ;QAAYD;KAAK;IAClD,MAAMN,MAAMJ,OAAOY,KAAK,CAAC;IACzBR,IAAIS,aAAa,CAACX,MAAMY,YAAY;IAEpC,OAAOd,OAAOe,MAAM,CAAC;QAACT;QAAQK;QAAYD;QAAMN;KAAI;AACtD;AAEO,SAASN,UAAUkB,KAAa,EAAEC,MAAc,EAAEC,IAAY;IACnE,MAAMC,OAAOnB,OAAOY,KAAK,CAAC;IAC1BO,KAAKN,aAAa,CAACG,OAAO;IAC1BG,KAAKN,aAAa,CAACI,QAAQ;IAC3BE,KAAKC,UAAU,CAAC,GAAG;IACnBD,KAAKC,UAAU,CAAC,GAAG;IACnBD,KAAKC,UAAU,CAAC,GAAG;IACnBD,KAAKC,UAAU,CAAC,GAAG;IACnBD,KAAKC,UAAU,CAAC,GAAG;IAGnB,MAAMC,gBAAgB;IACtB,MAAMC,iBAAiBN,QAAQK;IAC/B,MAAME,eAAevB,OAAOY,KAAK,CAACK,SAAUK,CAAAA,iBAAiB,CAAA;IAE7D,IAAK,IAAIE,IAAI,GAAGA,IAAIP,QAAQO,IAAK;QAC/B,MAAMC,iBAAiBD,IAAKF,CAAAA,iBAAiB,CAAA;QAC7CC,YAAY,CAACE,eAAe,GAAG;QAC/BP,KAAKQ,IAAI,CAACH,cAAcE,iBAAiB,GAAGD,IAAIF,gBAAgB,AAACE,CAAAA,IAAI,CAAA,IAAKF;IAC5E;IAGA,MAAMK,aAAaC,IAAAA,qBAAW,EAACL;IAG/B,MAAMM,SAAS;QACb9B;QACAS,WAAW,QAAQW;QACnBX,WAAW,QAAQmB;QACnBnB,WAAW,QAAQR,OAAOY,KAAK,CAAC;KACjC;IAED,OAAOZ,OAAOe,MAAM,CAACc;AACvB"}
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "decodeQOI", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return decodeQOI;
9
+ }
10
+ });
11
+ const QOI_OP_INDEX = 0x00;
12
+ const QOI_OP_DIFF = 0x40;
13
+ const QOI_OP_LUMA = 0x80;
14
+ const QOI_OP_RUN = 0xc0;
15
+ const QOI_OP_RGB = 0xfe;
16
+ const QOI_OP_RGBA = 0xff;
17
+ const QOI_MAGIC = 0x716f6966;
18
+ function hashColor(r, g, b, a) {
19
+ return (r * 3 + g * 5 + b * 7 + a * 11) % 64;
20
+ }
21
+ function decodeQOI(buffer) {
22
+ let pos = 0;
23
+ if (buffer.length < 14) {
24
+ throw new Error('Invalid QOI file: too short');
25
+ }
26
+ const magic = buffer.readUInt32BE(pos);
27
+ pos += 4;
28
+ if (magic !== QOI_MAGIC) {
29
+ throw new Error(`Invalid QOI magic: expected ${QOI_MAGIC.toString(16)}, got ${magic.toString(16)}`);
30
+ }
31
+ const width = buffer.readUInt32BE(pos);
32
+ pos += 4;
33
+ const height = buffer.readUInt32BE(pos);
34
+ pos += 4;
35
+ const channels = buffer.readUInt8(pos);
36
+ pos += 1;
37
+ const colorspace = buffer.readUInt8(pos);
38
+ pos += 1;
39
+ if (channels !== 3 && channels !== 4) {
40
+ throw new Error(`Invalid QOI channels: ${channels}`);
41
+ }
42
+ const pixelCount = width * height;
43
+ const outputSize = pixelCount * 4;
44
+ const output = Buffer.alloc(outputSize);
45
+ const colorArray = new Array(64);
46
+ for(let i = 0; i < 64; i++){
47
+ colorArray[i] = [
48
+ 0,
49
+ 0,
50
+ 0,
51
+ 0
52
+ ];
53
+ }
54
+ let r = 0, g = 0, b = 0, a = 255;
55
+ let outPos = 0;
56
+ while(outPos < outputSize){
57
+ if (pos + 8 <= buffer.length) {
58
+ let isEnd = true;
59
+ for(let i = 0; i < 7; i++){
60
+ if (buffer[pos + i] !== 0x00) {
61
+ isEnd = false;
62
+ break;
63
+ }
64
+ }
65
+ if (isEnd && buffer[pos + 7] === 0x01) {
66
+ break;
67
+ }
68
+ }
69
+ if (pos >= buffer.length) {
70
+ throw new Error('Unexpected end of QOI data');
71
+ }
72
+ const byte1 = buffer[pos++];
73
+ if (byte1 === QOI_OP_RGB) {
74
+ r = buffer[pos++];
75
+ g = buffer[pos++];
76
+ b = buffer[pos++];
77
+ } else if (byte1 === QOI_OP_RGBA) {
78
+ r = buffer[pos++];
79
+ g = buffer[pos++];
80
+ b = buffer[pos++];
81
+ a = buffer[pos++];
82
+ } else {
83
+ const tag = byte1 & 0xc0;
84
+ if (tag === QOI_OP_INDEX) {
85
+ const index = byte1 & 0x3f;
86
+ [r, g, b, a] = colorArray[index];
87
+ } else if (tag === QOI_OP_DIFF) {
88
+ const dr = (byte1 >> 4 & 0x03) - 2;
89
+ const dg = (byte1 >> 2 & 0x03) - 2;
90
+ const db = (byte1 & 0x03) - 2;
91
+ r = r + dr & 0xff;
92
+ g = g + dg & 0xff;
93
+ b = b + db & 0xff;
94
+ } else if (tag === QOI_OP_LUMA) {
95
+ const byte2 = buffer[pos++];
96
+ const dg = (byte1 & 0x3f) - 32;
97
+ const dr_dg = (byte2 >> 4 & 0x0f) - 8;
98
+ const db_dg = (byte2 & 0x0f) - 8;
99
+ g = g + dg & 0xff;
100
+ r = r + dg + dr_dg & 0xff;
101
+ b = b + dg + db_dg & 0xff;
102
+ } else if (tag === QOI_OP_RUN) {
103
+ const run = (byte1 & 0x3f) + 1;
104
+ for(let i = 0; i < run; i++){
105
+ output[outPos++] = r;
106
+ output[outPos++] = g;
107
+ output[outPos++] = b;
108
+ output[outPos++] = a;
109
+ }
110
+ const hash = hashColor(r, g, b, a);
111
+ colorArray[hash] = [
112
+ r,
113
+ g,
114
+ b,
115
+ a
116
+ ];
117
+ continue;
118
+ }
119
+ }
120
+ output[outPos++] = r;
121
+ output[outPos++] = g;
122
+ output[outPos++] = b;
123
+ output[outPos++] = a;
124
+ const hash = hashColor(r, g, b, a);
125
+ colorArray[hash] = [
126
+ r,
127
+ g,
128
+ b,
129
+ a
130
+ ];
131
+ }
132
+ return {
133
+ width,
134
+ height,
135
+ channels,
136
+ colorspace,
137
+ data: output
138
+ };
139
+ }
140
+
141
+ //# sourceMappingURL=qoi-decoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/bgcode/qoi-decoder.ts"],"names":["decodeQOI","QOI_OP_INDEX","QOI_OP_DIFF","QOI_OP_LUMA","QOI_OP_RUN","QOI_OP_RGB","QOI_OP_RGBA","QOI_MAGIC","hashColor","r","g","b","a","buffer","pos","length","Error","magic","readUInt32BE","toString","width","height","channels","readUInt8","colorspace","pixelCount","outputSize","output","Buffer","alloc","colorArray","Array","i","outPos","isEnd","byte1","tag","index","dr","dg","db","byte2","dr_dg","db_dg","run","hash","data"],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "getImageDimensions", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return getImageDimensions;
9
+ }
10
+ });
11
+ function getImageDimensions(imageData, format) {
12
+ if (format === "PNG") {
13
+ return getPngDimensions(imageData);
14
+ } else if (format === "JPG" || format === "JPEG") {
15
+ return getJpgDimensions(imageData);
16
+ }
17
+ return {
18
+ width: 0,
19
+ height: 0
20
+ };
21
+ }
22
+ function getPngDimensions(data) {
23
+ if (data.length < 24) {
24
+ return {
25
+ width: 0,
26
+ height: 0
27
+ };
28
+ }
29
+ const width = data.readUInt32BE(16);
30
+ const height = data.readUInt32BE(20);
31
+ return {
32
+ width,
33
+ height
34
+ };
35
+ }
36
+ function getJpgDimensions(data) {
37
+ let offset = 2;
38
+ while(offset < data.length){
39
+ if (data[offset] !== 0xFF) break;
40
+ const marker = data[offset + 1];
41
+ offset += 2;
42
+ if (marker === 0xC0 || marker === 0xC2) {
43
+ if (offset + 5 < data.length) {
44
+ const height = data.readUInt16BE(offset + 1);
45
+ const width = data.readUInt16BE(offset + 3);
46
+ return {
47
+ width,
48
+ height
49
+ };
50
+ }
51
+ break;
52
+ }
53
+ const segmentLength = data.readUInt16BE(offset);
54
+ offset += segmentLength;
55
+ }
56
+ return {
57
+ width: 0,
58
+ height: 0
59
+ };
60
+ }
61
+
62
+ //# sourceMappingURL=image-dimensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/image-dimensions.ts"],"names":["getImageDimensions","imageData","format","getPngDimensions","getJpgDimensions","width","height","data","length","readUInt32BE","offset","marker","readUInt16BE","segmentLength"],"mappings":";;;;+BAAgBA;;;eAAAA;;;AAAT,SAASA,mBAAmBC,SAAiB,EAAEC,MAAc;IAClE,IAAIA,WAAW,OAAO;QACpB,OAAOC,iBAAiBF;IAC1B,OAAO,IAAIC,WAAW,SAASA,WAAW,QAAQ;QAChD,OAAOE,iBAAiBH;IAC1B;IACA,OAAO;QAAEI,OAAO;QAAGC,QAAQ;IAAE;AAC/B;AAEA,SAASH,iBAAiBI,IAAY;IACpC,IAAIA,KAAKC,MAAM,GAAG,IAAI;QACpB,OAAO;YAAEH,OAAO;YAAGC,QAAQ;QAAE;IAC/B;IAEA,MAAMD,QAAQE,KAAKE,YAAY,CAAC;IAChC,MAAMH,SAASC,KAAKE,YAAY,CAAC;IAEjC,OAAO;QAAEJ;QAAOC;IAAO;AACzB;AAEA,SAASF,iBAAiBG,IAAY;IACpC,IAAIG,SAAS;IAEb,MAAOA,SAASH,KAAKC,MAAM,CAAE;QAC3B,IAAID,IAAI,CAACG,OAAO,KAAK,MAAM;QAE3B,MAAMC,SAASJ,IAAI,CAACG,SAAS,EAAE;QAC/BA,UAAU;QAEV,IAAIC,WAAW,QAAQA,WAAW,MAAM;YACtC,IAAID,SAAS,IAAIH,KAAKC,MAAM,EAAE;gBAC5B,MAAMF,SAASC,KAAKK,YAAY,CAACF,SAAS;gBAC1C,MAAML,QAAQE,KAAKK,YAAY,CAACF,SAAS;gBACzC,OAAO;oBAAEL;oBAAOC;gBAAO;YACzB;YACA;QACF;QAEA,MAAMO,gBAAgBN,KAAKK,YAAY,CAACF;QACxCA,UAAUG;IACZ;IAEA,OAAO;QAAER,OAAO;QAAGC,QAAQ;IAAE;AAC/B"}
@@ -0,0 +1,79 @@
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 calculateJobDuration () {
13
+ return calculateJobDuration;
14
+ },
15
+ get initializeOrUpdateStatistics () {
16
+ return initializeOrUpdateStatistics;
17
+ },
18
+ get updateStatisticsForCancellation () {
19
+ return updateStatisticsForCancellation;
20
+ },
21
+ get updateStatisticsForCompletion () {
22
+ return updateStatisticsForCompletion;
23
+ },
24
+ get updateStatisticsForFailure () {
25
+ return updateStatisticsForFailure;
26
+ }
27
+ });
28
+ function calculateJobDuration(startedAt, endedAt = new Date()) {
29
+ if (!startedAt) {
30
+ return null;
31
+ }
32
+ return (endedAt.getTime() - startedAt.getTime()) / 1000;
33
+ }
34
+ function initializeOrUpdateStatistics(job, endedAt = new Date(), options = {}) {
35
+ const actualPrintTimeSeconds = calculateJobDuration(job.startedAt, endedAt);
36
+ if (!job.statistics) {
37
+ return {
38
+ startedAt: job.startedAt,
39
+ endedAt,
40
+ actualPrintTimeSeconds,
41
+ progress: options.progress ?? job.progress ?? null,
42
+ failureReason: options.failureReason,
43
+ failureTime: options.failureTime
44
+ };
45
+ } else {
46
+ job.statistics.endedAt = endedAt;
47
+ job.statistics.actualPrintTimeSeconds = actualPrintTimeSeconds;
48
+ if (options.progress !== undefined) {
49
+ job.statistics.progress = options.progress;
50
+ }
51
+ if (options.failureReason !== undefined) {
52
+ job.statistics.failureReason = options.failureReason;
53
+ job.statistics.failureTime = options.failureTime ?? endedAt;
54
+ }
55
+ return job.statistics;
56
+ }
57
+ }
58
+ function updateStatisticsForCompletion(job, endedAt = new Date()) {
59
+ job.statistics = initializeOrUpdateStatistics(job, endedAt, {
60
+ progress: 100
61
+ });
62
+ job.endedAt = endedAt;
63
+ job.progress = 100;
64
+ }
65
+ function updateStatisticsForFailure(job, reason, endedAt = new Date()) {
66
+ job.statistics = initializeOrUpdateStatistics(job, endedAt, {
67
+ failureReason: reason,
68
+ failureTime: endedAt
69
+ });
70
+ job.endedAt = endedAt;
71
+ job.statusReason = reason;
72
+ }
73
+ function updateStatisticsForCancellation(job, reason = "Print cancelled by user", endedAt = new Date()) {
74
+ job.statistics = initializeOrUpdateStatistics(job, endedAt);
75
+ job.endedAt = endedAt;
76
+ job.statusReason = reason;
77
+ }
78
+
79
+ //# sourceMappingURL=job-stats.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/job-stats.util.ts"],"names":["calculateJobDuration","initializeOrUpdateStatistics","updateStatisticsForCancellation","updateStatisticsForCompletion","updateStatisticsForFailure","startedAt","endedAt","Date","getTime","job","options","actualPrintTimeSeconds","statistics","progress","failureReason","failureTime","undefined","reason","statusReason"],"mappings":";;;;;;;;;;;QAEgBA;eAAAA;;QAaAC;eAAAA;;QAoDAC;eAAAA;;QAnBAC;eAAAA;;QAMAC;eAAAA;;;AApDT,SAASJ,qBAAqBK,SAAsB,EAAEC,UAAgB,IAAIC,MAAM;IACrF,IAAI,CAACF,WAAW;QACd,OAAO;IACT;IACA,OAAO,AAACC,CAAAA,QAAQE,OAAO,KAAKH,UAAUG,OAAO,EAAC,IAAK;AACrD;AAQO,SAASP,6BACdQ,GAAa,EACbH,UAAgB,IAAIC,MAAM,EAC1BG,UAAmC,CAAC,CAAC;IAErC,MAAMC,yBAAyBX,qBAAqBS,IAAIJ,SAAS,EAAEC;IAEnE,IAAI,CAACG,IAAIG,UAAU,EAAE;QACnB,OAAO;YACLP,WAAWI,IAAIJ,SAAS;YACxBC;YACAK;YACAE,UAAUH,QAAQG,QAAQ,IAAIJ,IAAII,QAAQ,IAAI;YAC9CC,eAAeJ,QAAQI,aAAa;YACpCC,aAAaL,QAAQK,WAAW;QAClC;IACF,OAAO;QACLN,IAAIG,UAAU,CAACN,OAAO,GAAGA;QACzBG,IAAIG,UAAU,CAACD,sBAAsB,GAAGA;QAExC,IAAID,QAAQG,QAAQ,KAAKG,WAAW;YAClCP,IAAIG,UAAU,CAACC,QAAQ,GAAGH,QAAQG,QAAQ;QAC5C;QAEA,IAAIH,QAAQI,aAAa,KAAKE,WAAW;YACvCP,IAAIG,UAAU,CAACE,aAAa,GAAGJ,QAAQI,aAAa;YACpDL,IAAIG,UAAU,CAACG,WAAW,GAAGL,QAAQK,WAAW,IAAIT;QACtD;QAEA,OAAOG,IAAIG,UAAU;IACvB;AACF;AAEO,SAAST,8BAA8BM,GAAa,EAAEH,UAAgB,IAAIC,MAAM;IACrFE,IAAIG,UAAU,GAAGX,6BAA6BQ,KAAKH,SAAS;QAAEO,UAAU;IAAI;IAC5EJ,IAAIH,OAAO,GAAGA;IACdG,IAAII,QAAQ,GAAG;AACjB;AAEO,SAAST,2BACdK,GAAa,EACbQ,MAAc,EACdX,UAAgB,IAAIC,MAAM;IAE1BE,IAAIG,UAAU,GAAGX,6BAA6BQ,KAAKH,SAAS;QAC1DQ,eAAeG;QACfF,aAAaT;IACf;IACAG,IAAIH,OAAO,GAAGA;IACdG,IAAIS,YAAY,GAAGD;AACrB;AAEO,SAASf,gCACdO,GAAa,EACbQ,SAAiB,yBAAyB,EAC1CX,UAAgB,IAAIC,MAAM;IAE1BE,IAAIG,UAAU,GAAGX,6BAA6BQ,KAAKH;IACnDG,IAAIH,OAAO,GAAGA;IACdG,IAAIS,YAAY,GAAGD;AACrB"}
@@ -11,6 +11,7 @@ Object.defineProperty(exports, "ThreeMFParser", {
11
11
  const _promises = /*#__PURE__*/ _interop_require_wildcard(require("node:fs/promises"));
12
12
  const _nodepath = /*#__PURE__*/ _interop_require_wildcard(require("node:path"));
13
13
  const _admzip = /*#__PURE__*/ _interop_require_default(require("adm-zip"));
14
+ const _imagedimensions = require("../image-dimensions");
14
15
  function _interop_require_default(obj) {
15
16
  return obj && obj.__esModule ? obj : {
16
17
  default: obj
@@ -158,6 +159,12 @@ class ThreeMFParser {
158
159
  slicerVersion: topLevelSlicerVersion,
159
160
  maxLayerZ: topLevelMaxZ,
160
161
  totalLayers: topLevelLayers,
162
+ thumbnails: thumbnails.length > 0 ? thumbnails.map((t)=>({
163
+ width: t.width,
164
+ height: t.height,
165
+ format: t.format,
166
+ dataLength: t.data?.length || 0
167
+ })) : undefined,
161
168
  plates: plates.length > 0 ? plates : undefined
162
169
  };
163
170
  return {
@@ -223,6 +230,24 @@ class ThreeMFParser {
223
230
  const gcodeContent = entry.getData().toString("utf8", 0, Math.min(50000, entry.getData().length));
224
231
  const metadata = this.parseGCodeHeader(gcodeContent);
225
232
  const plateThumbs = zipEntries.filter((e)=>e.entryName.includes(`plate_${plateMatch[1]}`) && (e.entryName.endsWith(".png") || e.entryName.endsWith(".jpg")));
233
+ const plateThumbnails = plateThumbs.map((t)=>{
234
+ const format = t.entryName.endsWith(".png") ? "PNG" : "JPG";
235
+ const imageData = t.getData();
236
+ const sizeMatch = t.entryName.match(/(\d+)x(\d+)/);
237
+ let width = sizeMatch ? Number.parseInt(sizeMatch[1]) : 0;
238
+ let height = sizeMatch ? Number.parseInt(sizeMatch[2]) : 0;
239
+ if (width === 0 || height === 0) {
240
+ const dimensions = (0, _imagedimensions.getImageDimensions)(imageData, format);
241
+ width = dimensions.width;
242
+ height = dimensions.height;
243
+ }
244
+ return {
245
+ width,
246
+ height,
247
+ format,
248
+ data: imageData.toString("base64")
249
+ };
250
+ });
226
251
  const printTime = this.parseTime(metadata.model_printing_time || metadata.total_estimated_time || metadata.print_time);
227
252
  const filamentWeight = this.parseFloat(metadata.total_filament_weight_g || metadata.filament_weight || metadata.total_filament_weight);
228
253
  const layerCount = this.parseInt(metadata.total_layer_number || metadata.layer_count || metadata.total_layers);
@@ -246,11 +271,12 @@ class ThreeMFParser {
246
271
  filamentType: metadata.filament_type || null,
247
272
  printerModel: metadata.printer_model || null,
248
273
  objects: [],
249
- thumbnails: plateThumbs.map((t)=>({
250
- path: t.entryName,
251
- size: t.getData().length,
252
- type: t.entryName.endsWith(".png") ? "PNG" : "JPG"
253
- }))
274
+ thumbnails: plateThumbnails.length > 0 ? plateThumbnails.map((t)=>({
275
+ width: t.width,
276
+ height: t.height,
277
+ format: t.format,
278
+ dataLength: t.data?.length || 0
279
+ })) : undefined
254
280
  };
255
281
  plates.push(plateMetadata);
256
282
  }
@@ -293,17 +319,21 @@ class ThreeMFParser {
293
319
  const thumbnails = [];
294
320
  const thumbEntries = zipEntries.filter((e)=>e.entryName.match(/Metadata\/.*\.(png|jpg|jpeg)/i) || e.entryName.match(/Thumbnails\/.*/i));
295
321
  for (const entry of thumbEntries){
296
- const sizeMatch = entry.entryName.match(/(\d+)x(\d+)/);
297
- const width = sizeMatch ? Number.parseInt(sizeMatch[1]) : 0;
298
- const height = sizeMatch ? Number.parseInt(sizeMatch[2]) : 0;
299
322
  const format = entry.entryName.match(/\.(png|jpg|jpeg)$/i)?.[1].toUpperCase() || "PNG";
300
323
  const imageData = entry.getData();
324
+ const sizeMatch = entry.entryName.match(/(\d+)x(\d+)/);
325
+ let width = sizeMatch ? Number.parseInt(sizeMatch[1]) : 0;
326
+ let height = sizeMatch ? Number.parseInt(sizeMatch[2]) : 0;
327
+ if (width === 0 || height === 0) {
328
+ const dimensions = (0, _imagedimensions.getImageDimensions)(imageData, format);
329
+ width = dimensions.width;
330
+ height = dimensions.height;
331
+ }
301
332
  const base64Data = imageData.toString("base64");
302
333
  thumbnails.push({
303
334
  width,
304
335
  height,
305
336
  format,
306
- path: entry.entryName,
307
337
  data: base64Data
308
338
  });
309
339
  }