loopwind 0.21.0 → 0.23.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 (139) hide show
  1. package/README.md +9 -2
  2. package/dist/cli.js +5 -3
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/render.d.ts +1 -0
  5. package/dist/commands/render.d.ts.map +1 -1
  6. package/dist/commands/render.js +1 -0
  7. package/dist/commands/render.js.map +1 -1
  8. package/dist/lib/encode-worker.d.ts +2 -0
  9. package/dist/lib/encode-worker.d.ts.map +1 -0
  10. package/dist/lib/encode-worker.js +29 -0
  11. package/dist/lib/encode-worker.js.map +1 -0
  12. package/dist/lib/mjpeg-muxer.d.ts +46 -0
  13. package/dist/lib/mjpeg-muxer.d.ts.map +1 -0
  14. package/dist/lib/mjpeg-muxer.js +513 -0
  15. package/dist/lib/mjpeg-muxer.js.map +1 -0
  16. package/dist/lib/render-core.d.ts +63 -0
  17. package/dist/lib/render-core.d.ts.map +1 -0
  18. package/dist/lib/render-core.js +65 -0
  19. package/dist/lib/render-core.js.map +1 -0
  20. package/dist/lib/renderer.d.ts.map +1 -1
  21. package/dist/lib/renderer.js +10 -7
  22. package/dist/lib/renderer.js.map +1 -1
  23. package/dist/lib/resvg-init.d.ts +15 -0
  24. package/dist/lib/resvg-init.d.ts.map +1 -0
  25. package/dist/lib/resvg-init.js +55 -0
  26. package/dist/lib/resvg-init.js.map +1 -0
  27. package/dist/lib/tailwind/colors.d.ts +8 -0
  28. package/dist/lib/tailwind/colors.d.ts.map +1 -0
  29. package/dist/lib/tailwind/colors.js +102 -0
  30. package/dist/lib/tailwind/colors.js.map +1 -0
  31. package/dist/lib/tailwind/index.d.ts +10 -0
  32. package/dist/lib/tailwind/index.d.ts.map +1 -0
  33. package/dist/lib/tailwind/index.js +9 -0
  34. package/dist/lib/tailwind/index.js.map +1 -0
  35. package/dist/lib/tailwind/resolvers.d.ts +28 -0
  36. package/dist/lib/tailwind/resolvers.d.ts.map +1 -0
  37. package/dist/lib/tailwind/resolvers.js +94 -0
  38. package/dist/lib/tailwind/resolvers.js.map +1 -0
  39. package/dist/lib/tailwind/types.d.ts +29 -0
  40. package/dist/lib/tailwind/types.d.ts.map +1 -0
  41. package/dist/lib/tailwind/types.js +8 -0
  42. package/dist/lib/tailwind/types.js.map +1 -0
  43. package/dist/lib/tailwind-config-loader.d.ts +8 -45
  44. package/dist/lib/tailwind-config-loader.d.ts.map +1 -1
  45. package/dist/lib/tailwind-config-loader.js +6 -429
  46. package/dist/lib/tailwind-config-loader.js.map +1 -1
  47. package/dist/lib/tailwind.d.ts +1 -1
  48. package/dist/lib/tailwind.d.ts.map +1 -1
  49. package/dist/lib/tailwind.js +1 -1
  50. package/dist/lib/tailwind.js.map +1 -1
  51. package/dist/lib/video-preview.d.ts.map +1 -1
  52. package/dist/lib/video-preview.js +28 -16
  53. package/dist/lib/video-preview.js.map +1 -1
  54. package/dist/lib/video-renderer.d.ts +19 -1
  55. package/dist/lib/video-renderer.d.ts.map +1 -1
  56. package/dist/lib/video-renderer.js +194 -70
  57. package/dist/lib/video-renderer.js.map +1 -1
  58. package/dist/sdk/edge/index.d.ts +91 -0
  59. package/dist/sdk/edge/index.d.ts.map +1 -0
  60. package/dist/sdk/edge/index.js +187 -0
  61. package/dist/sdk/edge/index.js.map +1 -0
  62. package/dist/sdk/workers/index.d.ts +135 -0
  63. package/dist/sdk/workers/index.d.ts.map +1 -0
  64. package/dist/sdk/workers/index.js +271 -0
  65. package/dist/sdk/workers/index.js.map +1 -0
  66. package/dist/sdk/workers/tailwind-config.d.ts +48 -0
  67. package/dist/sdk/workers/tailwind-config.d.ts.map +1 -0
  68. package/dist/sdk/workers/tailwind-config.js +187 -0
  69. package/dist/sdk/workers/tailwind-config.js.map +1 -0
  70. package/dist/sdk/workers/tailwind.d.ts +9 -0
  71. package/dist/sdk/workers/tailwind.d.ts.map +1 -0
  72. package/dist/sdk/workers/tailwind.js +8 -0
  73. package/dist/sdk/workers/tailwind.js.map +1 -0
  74. package/package.json +6 -2
  75. package/test-cloudflare-worker/README.md +64 -0
  76. package/test-cloudflare-worker/dist/README.md +1 -0
  77. package/test-cloudflare-worker/dist/index.js +23743 -0
  78. package/test-cloudflare-worker/dist/index.js.map +8 -0
  79. package/test-cloudflare-worker/package-lock.json +1773 -0
  80. package/test-cloudflare-worker/package.json +25 -0
  81. package/test-cloudflare-worker/test-sdk.mjs +75 -0
  82. package/test-cloudflare-worker/wrangler.toml +14 -0
  83. package/test-video-720p.mjs +96 -0
  84. package/test-video-breakdown.mjs +98 -0
  85. package/test-video-perf-1080.mjs +67 -0
  86. package/test-video-perf.mjs +56 -0
  87. package/test-worker-1080p.mjs +103 -0
  88. package/test-worker-viability.mjs +140 -0
  89. package/website/astro.config.mjs +4 -9
  90. package/website/dist/_astro/PlaygroundEditor.DzFavsm8.js +26 -0
  91. package/website/dist/_astro/VideoPreviewClient.BrajhYmh.js +1 -0
  92. package/website/dist/_astro/agents.CZXv4DCM.css +1 -0
  93. package/website/dist/_astro/client.BHSq4mdQ.js +33 -0
  94. package/website/dist/_astro/index.CTbGshLK.js +9 -0
  95. package/website/dist/_astro/jsx-runtime.BjG_zV1W.js +9 -0
  96. package/website/dist/_routes.json +1 -0
  97. package/website/dist/_worker.js/_@astrojs-ssr-adapter.mjs +4 -4
  98. package/website/dist/_worker.js/_astro-internal_middleware.mjs +2 -2
  99. package/website/dist/_worker.js/chunks/Logo_Cud5QvBJ.mjs +22 -0
  100. package/website/dist/_worker.js/chunks/_@astro-renderers_-YVK7NHa.mjs +15015 -0
  101. package/website/dist/_worker.js/chunks/astro/{server_Y5_QHO8v.mjs → server_CsUrSZgd.mjs} +113 -2
  102. package/website/dist/_worker.js/chunks/{astro-designed-error-pages_BNTLO-TA.mjs → astro-designed-error-pages_1ELXm5Tt.mjs} +1 -1
  103. package/website/dist/_worker.js/chunks/{index_C1UTDwYg.mjs → index_BDWR1Q-q.mjs} +2 -2
  104. package/website/dist/_worker.js/chunks/{noop-middleware_DlWGj5t5.mjs → noop-middleware_B8fH5jha.mjs} +1 -1
  105. package/website/dist/_worker.js/index.js +38 -30
  106. package/website/dist/_worker.js/manifest_Bk6136-u.mjs +98 -0
  107. package/website/dist/_worker.js/pages/_image.astro.mjs +1 -1
  108. package/website/dist/_worker.js/pages/api/playground/render.astro.mjs +25562 -0
  109. package/website/dist/_worker.js/pages/api/playground/templates.astro.mjs +92 -0
  110. package/website/dist/_worker.js/pages/api/raw-markdown/_---path_.astro.mjs +1 -1
  111. package/website/dist/_worker.js/pages/playground/_example_.astro.mjs +95 -0
  112. package/website/dist/_worker.js/pages/playground.astro.mjs +1 -0
  113. package/website/dist/_worker.js/renderers.mjs +1 -56
  114. package/website/dist/agents/index.html +4 -2
  115. package/website/dist/animation/index.html +629 -3
  116. package/website/dist/config/index.html +4 -2
  117. package/website/dist/fonts/index.html +4 -2
  118. package/website/dist/getting-started/index.html +4 -2
  119. package/website/dist/helpers/index.html +196 -10
  120. package/website/dist/images/index.html +4 -2
  121. package/website/dist/index.html +4 -3
  122. package/website/dist/llm.txt +870 -20
  123. package/website/dist/playground/index.html +6 -0
  124. package/website/dist/preview/index.html +4 -2
  125. package/website/dist/sdk/index.html +639 -127
  126. package/website/dist/sitemap.xml +12 -12
  127. package/website/dist/styling/index.html +4 -2
  128. package/website/dist/templates/index.html +4 -2
  129. package/website/dist/video/index.html +47 -12
  130. package/website/package-lock.json +11 -1
  131. package/website/package.json +3 -1
  132. package/website/wrangler.toml +9 -0
  133. package/_dsgn/templates/dashed-stroke-test/template.tsx +0 -73
  134. package/_dsgn/templates/path-follow-test/template.tsx +0 -176
  135. package/_dsgn/templates/path-simple-test/template.tsx +0 -98
  136. package/_dsgn/templates/stroke-dash-test/meta.json +0 -12
  137. package/_dsgn/templates/stroke-dash-test/template.tsx +0 -53
  138. package/website/dist/_astro/agents.Yx-L_igG.css +0 -1
  139. package/website/dist/_worker.js/manifest_CT_D-YDe.mjs +0 -98
@@ -0,0 +1,513 @@
1
+ /**
2
+ * Simple MJPEG to MP4 muxer
3
+ * Pure TypeScript, no dependencies, serverless-compatible
4
+ *
5
+ * Creates MP4 files with MJPEG video codec (each frame is a JPEG)
6
+ * Much faster than H.264 encoding since Sharp handles JPEG natively
7
+ */
8
+ export class MJPEGMuxer {
9
+ width;
10
+ height;
11
+ fps;
12
+ frames = [];
13
+ constructor(options) {
14
+ this.width = options.width;
15
+ this.height = options.height;
16
+ this.fps = options.fps;
17
+ }
18
+ addFrame(jpegBuffer) {
19
+ this.frames.push(jpegBuffer);
20
+ }
21
+ finalize() {
22
+ const frameCount = this.frames.length;
23
+ const duration = Math.floor((frameCount / this.fps) * 1000); // ms
24
+ const timescale = 1000;
25
+ // Calculate frame sizes
26
+ const frameSizes = [];
27
+ for (const frame of this.frames) {
28
+ frameSizes.push(frame.length);
29
+ }
30
+ // Build boxes
31
+ const ftyp = this.buildFtyp();
32
+ const moov = this.buildMoov(frameCount, duration, timescale, frameSizes);
33
+ const mdat = this.buildMdat();
34
+ // Calculate mdat offset (ftyp + moov + mdat header)
35
+ const mdatOffset = ftyp.length + moov.length + 8; // +8 for mdat box header
36
+ // Fix chunk offset in moov (stco box)
37
+ this.fixChunkOffset(moov, mdatOffset);
38
+ // Combine all boxes
39
+ const totalSize = ftyp.length + moov.length + mdat.length;
40
+ const result = Buffer.alloc(totalSize);
41
+ let offset = 0;
42
+ ftyp.copy(result, offset);
43
+ offset += ftyp.length;
44
+ moov.copy(result, offset);
45
+ offset += moov.length;
46
+ mdat.copy(result, offset);
47
+ return result;
48
+ }
49
+ fixChunkOffset(moov, mdatOffset) {
50
+ // Find stco box and update the offset
51
+ // stco is nested: moov > trak > mdia > minf > stbl > stco
52
+ let pos = 0;
53
+ while (pos < moov.length - 4) {
54
+ const boxType = moov.toString('ascii', pos + 4, pos + 8);
55
+ if (boxType === 'stco') {
56
+ // Found stco, update the chunk offset (last 4 bytes of the box)
57
+ const stcoSize = moov.readUInt32BE(pos);
58
+ moov.writeUInt32BE(mdatOffset, pos + stcoSize - 4);
59
+ return;
60
+ }
61
+ pos++;
62
+ }
63
+ }
64
+ buildFtyp() {
65
+ // File type box
66
+ const size = 20;
67
+ const buf = Buffer.alloc(size);
68
+ let offset = 0;
69
+ buf.writeUInt32BE(size, offset);
70
+ offset += 4;
71
+ buf.write('ftyp', offset);
72
+ offset += 4;
73
+ buf.write('isom', offset);
74
+ offset += 4; // major brand
75
+ buf.writeUInt32BE(512, offset);
76
+ offset += 4; // minor version
77
+ buf.write('isom', offset);
78
+ offset += 4; // compatible brand
79
+ return buf;
80
+ }
81
+ buildMoov(frameCount, duration, timescale, frameSizes) {
82
+ const mvhd = this.buildMvhd(duration, timescale);
83
+ const trak = this.buildTrak(frameCount, duration, timescale, frameSizes);
84
+ const moovSize = 8 + mvhd.length + trak.length;
85
+ const buf = Buffer.alloc(moovSize);
86
+ let offset = 0;
87
+ buf.writeUInt32BE(moovSize, offset);
88
+ offset += 4;
89
+ buf.write('moov', offset);
90
+ offset += 4;
91
+ mvhd.copy(buf, offset);
92
+ offset += mvhd.length;
93
+ trak.copy(buf, offset);
94
+ return buf;
95
+ }
96
+ buildMvhd(duration, timescale) {
97
+ const size = 108;
98
+ const buf = Buffer.alloc(size);
99
+ let offset = 0;
100
+ buf.writeUInt32BE(size, offset);
101
+ offset += 4;
102
+ buf.write('mvhd', offset);
103
+ offset += 4;
104
+ buf.writeUInt32BE(0, offset);
105
+ offset += 4; // version + flags
106
+ buf.writeUInt32BE(0, offset);
107
+ offset += 4; // creation time
108
+ buf.writeUInt32BE(0, offset);
109
+ offset += 4; // modification time
110
+ buf.writeUInt32BE(timescale, offset);
111
+ offset += 4; // timescale
112
+ buf.writeUInt32BE(duration, offset);
113
+ offset += 4; // duration
114
+ buf.writeUInt32BE(0x00010000, offset);
115
+ offset += 4; // rate (1.0)
116
+ buf.writeUInt16BE(0x0100, offset);
117
+ offset += 2; // volume (1.0)
118
+ buf.writeUInt16BE(0, offset);
119
+ offset += 2; // reserved
120
+ buf.writeUInt32BE(0, offset);
121
+ offset += 4; // reserved
122
+ buf.writeUInt32BE(0, offset);
123
+ offset += 4; // reserved
124
+ // Matrix (identity)
125
+ const matrix = [0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0, 0x40000000];
126
+ for (const val of matrix) {
127
+ buf.writeUInt32BE(val, offset);
128
+ offset += 4;
129
+ }
130
+ // Pre-defined (6 zeros)
131
+ for (let i = 0; i < 6; i++) {
132
+ buf.writeUInt32BE(0, offset);
133
+ offset += 4;
134
+ }
135
+ buf.writeUInt32BE(2, offset); // next track ID
136
+ return buf;
137
+ }
138
+ buildTrak(frameCount, duration, timescale, frameSizes) {
139
+ const tkhd = this.buildTkhd(duration, timescale);
140
+ const mdia = this.buildMdia(frameCount, duration, timescale, frameSizes);
141
+ const trakSize = 8 + tkhd.length + mdia.length;
142
+ const buf = Buffer.alloc(trakSize);
143
+ let offset = 0;
144
+ buf.writeUInt32BE(trakSize, offset);
145
+ offset += 4;
146
+ buf.write('trak', offset);
147
+ offset += 4;
148
+ tkhd.copy(buf, offset);
149
+ offset += tkhd.length;
150
+ mdia.copy(buf, offset);
151
+ return buf;
152
+ }
153
+ buildTkhd(duration, timescale) {
154
+ const size = 92;
155
+ const buf = Buffer.alloc(size);
156
+ let offset = 0;
157
+ buf.writeUInt32BE(size, offset);
158
+ offset += 4;
159
+ buf.write('tkhd', offset);
160
+ offset += 4;
161
+ buf.writeUInt32BE(0x00000003, offset);
162
+ offset += 4; // version + flags (enabled, in movie)
163
+ buf.writeUInt32BE(0, offset);
164
+ offset += 4; // creation time
165
+ buf.writeUInt32BE(0, offset);
166
+ offset += 4; // modification time
167
+ buf.writeUInt32BE(1, offset);
168
+ offset += 4; // track ID
169
+ buf.writeUInt32BE(0, offset);
170
+ offset += 4; // reserved
171
+ buf.writeUInt32BE(duration, offset);
172
+ offset += 4; // duration
173
+ buf.writeUInt32BE(0, offset);
174
+ offset += 4; // reserved
175
+ buf.writeUInt32BE(0, offset);
176
+ offset += 4; // reserved
177
+ buf.writeUInt16BE(0, offset);
178
+ offset += 2; // layer
179
+ buf.writeUInt16BE(0, offset);
180
+ offset += 2; // alternate group
181
+ buf.writeUInt16BE(0, offset);
182
+ offset += 2; // volume
183
+ buf.writeUInt16BE(0, offset);
184
+ offset += 2; // reserved
185
+ // Matrix (identity)
186
+ const matrix = [0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0, 0x40000000];
187
+ for (const val of matrix) {
188
+ buf.writeUInt32BE(val, offset);
189
+ offset += 4;
190
+ }
191
+ buf.writeUInt32BE(this.width << 16, offset);
192
+ offset += 4; // width (fixed point)
193
+ buf.writeUInt32BE(this.height << 16, offset); // height (fixed point)
194
+ return buf;
195
+ }
196
+ buildMdia(frameCount, duration, timescale, frameSizes) {
197
+ const mdhd = this.buildMdhd(duration, timescale);
198
+ const hdlr = this.buildHdlr();
199
+ const minf = this.buildMinf(frameCount, frameSizes);
200
+ const mdiaSize = 8 + mdhd.length + hdlr.length + minf.length;
201
+ const buf = Buffer.alloc(mdiaSize);
202
+ let offset = 0;
203
+ buf.writeUInt32BE(mdiaSize, offset);
204
+ offset += 4;
205
+ buf.write('mdia', offset);
206
+ offset += 4;
207
+ mdhd.copy(buf, offset);
208
+ offset += mdhd.length;
209
+ hdlr.copy(buf, offset);
210
+ offset += hdlr.length;
211
+ minf.copy(buf, offset);
212
+ return buf;
213
+ }
214
+ buildMdhd(duration, timescale) {
215
+ const size = 32;
216
+ const buf = Buffer.alloc(size);
217
+ let offset = 0;
218
+ buf.writeUInt32BE(size, offset);
219
+ offset += 4;
220
+ buf.write('mdhd', offset);
221
+ offset += 4;
222
+ buf.writeUInt32BE(0, offset);
223
+ offset += 4; // version + flags
224
+ buf.writeUInt32BE(0, offset);
225
+ offset += 4; // creation time
226
+ buf.writeUInt32BE(0, offset);
227
+ offset += 4; // modification time
228
+ buf.writeUInt32BE(timescale, offset);
229
+ offset += 4; // timescale
230
+ buf.writeUInt32BE(duration, offset);
231
+ offset += 4; // duration
232
+ buf.writeUInt16BE(0x55C4, offset);
233
+ offset += 2; // language (und)
234
+ buf.writeUInt16BE(0, offset); // quality
235
+ return buf;
236
+ }
237
+ buildHdlr() {
238
+ const size = 37;
239
+ const buf = Buffer.alloc(size);
240
+ let offset = 0;
241
+ buf.writeUInt32BE(size, offset);
242
+ offset += 4;
243
+ buf.write('hdlr', offset);
244
+ offset += 4;
245
+ buf.writeUInt32BE(0, offset);
246
+ offset += 4; // version + flags
247
+ buf.writeUInt32BE(0, offset);
248
+ offset += 4; // pre-defined
249
+ buf.write('vide', offset);
250
+ offset += 4; // handler type
251
+ buf.writeUInt32BE(0, offset);
252
+ offset += 4; // reserved
253
+ buf.writeUInt32BE(0, offset);
254
+ offset += 4; // reserved
255
+ buf.writeUInt32BE(0, offset);
256
+ offset += 4; // reserved
257
+ buf.writeUInt8(0, offset); // name (null-terminated)
258
+ return buf;
259
+ }
260
+ buildMinf(frameCount, frameSizes) {
261
+ const vmhd = this.buildVmhd();
262
+ const dinf = this.buildDinf();
263
+ const stbl = this.buildStbl(frameCount, frameSizes);
264
+ const minfSize = 8 + vmhd.length + dinf.length + stbl.length;
265
+ const buf = Buffer.alloc(minfSize);
266
+ let offset = 0;
267
+ buf.writeUInt32BE(minfSize, offset);
268
+ offset += 4;
269
+ buf.write('minf', offset);
270
+ offset += 4;
271
+ vmhd.copy(buf, offset);
272
+ offset += vmhd.length;
273
+ dinf.copy(buf, offset);
274
+ offset += dinf.length;
275
+ stbl.copy(buf, offset);
276
+ return buf;
277
+ }
278
+ buildVmhd() {
279
+ const size = 20;
280
+ const buf = Buffer.alloc(size);
281
+ let offset = 0;
282
+ buf.writeUInt32BE(size, offset);
283
+ offset += 4;
284
+ buf.write('vmhd', offset);
285
+ offset += 4;
286
+ buf.writeUInt32BE(1, offset);
287
+ offset += 4; // version + flags
288
+ buf.writeUInt16BE(0, offset);
289
+ offset += 2; // graphics mode
290
+ buf.writeUInt16BE(0, offset);
291
+ offset += 2; // opcolor
292
+ buf.writeUInt16BE(0, offset);
293
+ offset += 2;
294
+ buf.writeUInt16BE(0, offset);
295
+ return buf;
296
+ }
297
+ buildDinf() {
298
+ // Data Information Box with Data Reference
299
+ const drefSize = 28;
300
+ const dinfSize = 8 + drefSize;
301
+ const buf = Buffer.alloc(dinfSize);
302
+ let offset = 0;
303
+ buf.writeUInt32BE(dinfSize, offset);
304
+ offset += 4;
305
+ buf.write('dinf', offset);
306
+ offset += 4;
307
+ // dref
308
+ buf.writeUInt32BE(drefSize, offset);
309
+ offset += 4;
310
+ buf.write('dref', offset);
311
+ offset += 4;
312
+ buf.writeUInt32BE(0, offset);
313
+ offset += 4; // version + flags
314
+ buf.writeUInt32BE(1, offset);
315
+ offset += 4; // entry count
316
+ // url entry
317
+ buf.writeUInt32BE(12, offset);
318
+ offset += 4;
319
+ buf.write('url ', offset);
320
+ offset += 4;
321
+ buf.writeUInt32BE(1, offset); // flags (self-contained)
322
+ return buf;
323
+ }
324
+ buildStbl(frameCount, frameSizes) {
325
+ const stsd = this.buildStsd();
326
+ const stts = this.buildStts(frameCount);
327
+ const stsc = this.buildStsc(frameCount);
328
+ const stsz = this.buildStsz(frameSizes);
329
+ const stco = this.buildStco(frameSizes);
330
+ const stblSize = 8 + stsd.length + stts.length + stsc.length + stsz.length + stco.length;
331
+ const buf = Buffer.alloc(stblSize);
332
+ let offset = 0;
333
+ buf.writeUInt32BE(stblSize, offset);
334
+ offset += 4;
335
+ buf.write('stbl', offset);
336
+ offset += 4;
337
+ stsd.copy(buf, offset);
338
+ offset += stsd.length;
339
+ stts.copy(buf, offset);
340
+ offset += stts.length;
341
+ stsc.copy(buf, offset);
342
+ offset += stsc.length;
343
+ stsz.copy(buf, offset);
344
+ offset += stsz.length;
345
+ stco.copy(buf, offset);
346
+ return buf;
347
+ }
348
+ buildStsd() {
349
+ // Sample Description Box for MJPEG
350
+ const mjpegEntrySize = 86;
351
+ const size = 16 + mjpegEntrySize;
352
+ const buf = Buffer.alloc(size);
353
+ let offset = 0;
354
+ buf.writeUInt32BE(size, offset);
355
+ offset += 4;
356
+ buf.write('stsd', offset);
357
+ offset += 4;
358
+ buf.writeUInt32BE(0, offset);
359
+ offset += 4; // version + flags
360
+ buf.writeUInt32BE(1, offset);
361
+ offset += 4; // entry count
362
+ // MJPEG sample entry
363
+ buf.writeUInt32BE(mjpegEntrySize, offset);
364
+ offset += 4;
365
+ buf.write('jpeg', offset);
366
+ offset += 4; // MJPEG codec
367
+ buf.writeUInt32BE(0, offset);
368
+ offset += 4; // reserved
369
+ buf.writeUInt16BE(0, offset);
370
+ offset += 2; // reserved
371
+ buf.writeUInt16BE(1, offset);
372
+ offset += 2; // data reference index
373
+ buf.writeUInt16BE(0, offset);
374
+ offset += 2; // version
375
+ buf.writeUInt16BE(0, offset);
376
+ offset += 2; // revision
377
+ buf.writeUInt32BE(0, offset);
378
+ offset += 4; // vendor
379
+ buf.writeUInt32BE(0, offset);
380
+ offset += 4; // temporal quality
381
+ buf.writeUInt32BE(0, offset);
382
+ offset += 4; // spatial quality
383
+ buf.writeUInt16BE(this.width, offset);
384
+ offset += 2;
385
+ buf.writeUInt16BE(this.height, offset);
386
+ offset += 2;
387
+ buf.writeUInt32BE(0x00480000, offset);
388
+ offset += 4; // horiz resolution (72 dpi)
389
+ buf.writeUInt32BE(0x00480000, offset);
390
+ offset += 4; // vert resolution (72 dpi)
391
+ buf.writeUInt32BE(0, offset);
392
+ offset += 4; // data size
393
+ buf.writeUInt16BE(1, offset);
394
+ offset += 2; // frame count
395
+ // Compressor name (32 bytes, pascal string)
396
+ buf.writeUInt8(4, offset);
397
+ offset += 1;
398
+ buf.write('jpeg', offset);
399
+ offset += 4;
400
+ offset += 27; // padding
401
+ buf.writeUInt16BE(24, offset);
402
+ offset += 2; // depth
403
+ buf.writeInt16BE(-1, offset); // color table ID
404
+ return buf;
405
+ }
406
+ buildStts(frameCount) {
407
+ // Time-to-Sample Box
408
+ const size = 24;
409
+ const buf = Buffer.alloc(size);
410
+ let offset = 0;
411
+ buf.writeUInt32BE(size, offset);
412
+ offset += 4;
413
+ buf.write('stts', offset);
414
+ offset += 4;
415
+ buf.writeUInt32BE(0, offset);
416
+ offset += 4; // version + flags
417
+ buf.writeUInt32BE(1, offset);
418
+ offset += 4; // entry count
419
+ buf.writeUInt32BE(frameCount, offset);
420
+ offset += 4; // sample count
421
+ buf.writeUInt32BE(Math.round(1000 / this.fps), offset); // sample delta (duration per frame in timescale units)
422
+ return buf;
423
+ }
424
+ buildStsc(frameCount) {
425
+ // Sample-to-Chunk Box (all samples in one chunk)
426
+ const size = 28;
427
+ const buf = Buffer.alloc(size);
428
+ let offset = 0;
429
+ buf.writeUInt32BE(size, offset);
430
+ offset += 4;
431
+ buf.write('stsc', offset);
432
+ offset += 4;
433
+ buf.writeUInt32BE(0, offset);
434
+ offset += 4; // version + flags
435
+ buf.writeUInt32BE(1, offset);
436
+ offset += 4; // entry count
437
+ buf.writeUInt32BE(1, offset);
438
+ offset += 4; // first chunk
439
+ buf.writeUInt32BE(frameCount, offset);
440
+ offset += 4; // samples per chunk
441
+ buf.writeUInt32BE(1, offset); // sample description index
442
+ return buf;
443
+ }
444
+ buildStsz(frameSizes) {
445
+ // Sample Size Box
446
+ const size = 20 + frameSizes.length * 4;
447
+ const buf = Buffer.alloc(size);
448
+ let offset = 0;
449
+ buf.writeUInt32BE(size, offset);
450
+ offset += 4;
451
+ buf.write('stsz', offset);
452
+ offset += 4;
453
+ buf.writeUInt32BE(0, offset);
454
+ offset += 4; // version + flags
455
+ buf.writeUInt32BE(0, offset);
456
+ offset += 4; // sample size (0 = variable)
457
+ buf.writeUInt32BE(frameSizes.length, offset);
458
+ offset += 4; // sample count
459
+ for (const frameSize of frameSizes) {
460
+ buf.writeUInt32BE(frameSize, offset);
461
+ offset += 4;
462
+ }
463
+ return buf;
464
+ }
465
+ buildStco(frameSizes) {
466
+ // Chunk Offset Box (32-bit)
467
+ // size(4) + type(4) + version/flags(4) + entry_count(4) + offset(4) = 20
468
+ const size = 20;
469
+ const buf = Buffer.alloc(size);
470
+ let offset = 0;
471
+ buf.writeUInt32BE(size, offset);
472
+ offset += 4;
473
+ buf.write('stco', offset);
474
+ offset += 4;
475
+ buf.writeUInt32BE(0, offset);
476
+ offset += 4; // version + flags
477
+ buf.writeUInt32BE(1, offset);
478
+ offset += 4; // entry count
479
+ // Offset will be updated after we know moov size
480
+ buf.writeUInt32BE(0, offset); // placeholder
481
+ return buf;
482
+ }
483
+ buildMdat() {
484
+ // Calculate total size
485
+ let totalDataSize = 0;
486
+ for (const frame of this.frames) {
487
+ totalDataSize += frame.length;
488
+ }
489
+ const mdatSize = 8 + totalDataSize;
490
+ const buf = Buffer.alloc(mdatSize);
491
+ let offset = 0;
492
+ buf.writeUInt32BE(mdatSize, offset);
493
+ offset += 4;
494
+ buf.write('mdat', offset);
495
+ offset += 4;
496
+ for (const frame of this.frames) {
497
+ frame.copy(buf, offset);
498
+ offset += frame.length;
499
+ }
500
+ return buf;
501
+ }
502
+ }
503
+ /**
504
+ * Create MJPEG MP4 from JPEG buffers
505
+ */
506
+ export function createMJPEGVideo(jpegFrames, options) {
507
+ const muxer = new MJPEGMuxer(options);
508
+ for (const frame of jpegFrames) {
509
+ muxer.addFrame(frame);
510
+ }
511
+ return muxer.finalize();
512
+ }
513
+ //# sourceMappingURL=mjpeg-muxer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mjpeg-muxer.js","sourceRoot":"","sources":["../../src/lib/mjpeg-muxer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Core rendering logic shared between Node.js and Workers environments
3
+ *
4
+ * This module provides pure JavaScript rendering using Satori.
5
+ * The SVG-to-PNG conversion is handled by the caller (resvg-js or resvg-wasm).
6
+ */
7
+ import React from 'react';
8
+ import type { TemplateProps } from '../types/template.js';
9
+ /**
10
+ * Font configuration
11
+ */
12
+ export interface FontConfig {
13
+ name: string;
14
+ data: ArrayBuffer;
15
+ weight?: number;
16
+ style?: 'normal' | 'italic';
17
+ }
18
+ /**
19
+ * Style config for templates
20
+ */
21
+ export interface StyleConfig {
22
+ colors?: Record<string, string>;
23
+ fonts?: Record<string, string[]>;
24
+ }
25
+ /**
26
+ * Template definition
27
+ */
28
+ export interface TemplateConfig<TProps = any> {
29
+ name: string;
30
+ type?: 'image' | 'video';
31
+ size: {
32
+ width: number;
33
+ height: number;
34
+ };
35
+ video?: {
36
+ fps: number;
37
+ duration: number;
38
+ };
39
+ config?: StyleConfig;
40
+ render: (props: TProps & TemplateProps) => React.ReactElement;
41
+ }
42
+ /**
43
+ * Render options
44
+ */
45
+ export interface RenderOptions {
46
+ fonts: FontConfig[];
47
+ config?: StyleConfig;
48
+ frame?: number;
49
+ progress?: number;
50
+ totalFrames?: number;
51
+ durationMs?: number;
52
+ }
53
+ /**
54
+ * Render a template to SVG string
55
+ *
56
+ * This is the core rendering function used by both Node.js and Workers.
57
+ */
58
+ export declare function renderTemplateToSVG<TProps>(template: TemplateConfig<TProps>, props: TProps, options: RenderOptions): Promise<string>;
59
+ /**
60
+ * Define a template (helper function)
61
+ */
62
+ export declare function defineTemplate<TProps = any>(config: TemplateConfig<TProps>): TemplateConfig<TProps>;
63
+ //# sourceMappingURL=render-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-core.d.ts","sourceRoot":"","sources":["../../src/lib/render-core.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,MAAM,GAAG,GAAG;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACzB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,KAAK,KAAK,CAAC,YAAY,CAAC;CAC/D;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAC9C,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,EAChC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,CAAC,CA+CjB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,GAAG,GAAG,EACzC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,GAC7B,cAAc,CAAC,MAAM,CAAC,CAKxB"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Core rendering logic shared between Node.js and Workers environments
3
+ *
4
+ * This module provides pure JavaScript rendering using Satori.
5
+ * The SVG-to-PNG conversion is handled by the caller (resvg-js or resvg-wasm).
6
+ */
7
+ import satori from 'satori';
8
+ import { tw } from './tailwind.js';
9
+ /**
10
+ * Render a template to SVG string
11
+ *
12
+ * This is the core rendering function used by both Node.js and Workers.
13
+ */
14
+ export async function renderTemplateToSVG(template, props, options) {
15
+ const { fonts, config, frame = 0, progress = 0, totalFrames, durationMs } = options;
16
+ // Create tw helper with config
17
+ const twHelper = (classes) => tw(classes, null, config || template.config || null, {
18
+ frame,
19
+ progress,
20
+ totalFrames,
21
+ durationMs,
22
+ });
23
+ // Create placeholder helpers (callers should provide pre-fetched data)
24
+ const imageHelper = (url) => {
25
+ console.warn('image() helper called synchronously. Pre-fetch images for best results.');
26
+ return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==';
27
+ };
28
+ const qrHelper = (text) => {
29
+ console.warn('qr() helper called synchronously. Pre-generate QR codes for best results.');
30
+ return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==';
31
+ };
32
+ // Build full props
33
+ const fullProps = {
34
+ ...props,
35
+ frame,
36
+ progress,
37
+ tw: twHelper,
38
+ qr: qrHelper,
39
+ image: imageHelper,
40
+ config: config || template.config || {},
41
+ };
42
+ // Render to SVG using Satori
43
+ const svg = await satori(template.render(fullProps), {
44
+ width: template.size.width,
45
+ height: template.size.height,
46
+ fonts: fonts.map(f => ({
47
+ name: f.name,
48
+ data: f.data,
49
+ weight: (f.weight || 400),
50
+ style: f.style || 'normal',
51
+ })),
52
+ embedFont: true,
53
+ });
54
+ return svg;
55
+ }
56
+ /**
57
+ * Define a template (helper function)
58
+ */
59
+ export function defineTemplate(config) {
60
+ return {
61
+ ...config,
62
+ type: config.type || 'image',
63
+ };
64
+ }
65
+ //# sourceMappingURL=render-core.js.map