@memberjunction/video-studio-render-worker 0.0.1-seed.1 → 6.2.0-edge.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +183 -0
- package/README.md +139 -4
- package/assets/fonts/Inter-OFL.txt +93 -0
- package/assets/fonts/Inter-Regular.ttf +0 -0
- package/assets/fonts/JetBrainsMono-OFL.txt +93 -0
- package/assets/fonts/JetBrainsMono-Regular.ttf +0 -0
- package/dist/backend.d.ts +201 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +205 -0
- package/dist/backend.js.map +1 -0
- package/dist/bundle.d.ts +112 -0
- package/dist/bundle.d.ts.map +1 -0
- package/dist/bundle.js +433 -0
- package/dist/bundle.js.map +1 -0
- package/dist/checks/dom-rules.d.ts +57 -0
- package/dist/checks/dom-rules.d.ts.map +1 -0
- package/dist/checks/dom-rules.js +205 -0
- package/dist/checks/dom-rules.js.map +1 -0
- package/dist/checks/hyperframes-check.d.ts +37 -0
- package/dist/checks/hyperframes-check.d.ts.map +1 -0
- package/dist/checks/hyperframes-check.js +161 -0
- package/dist/checks/hyperframes-check.js.map +1 -0
- package/dist/checks/static-checks.d.ts +46 -0
- package/dist/checks/static-checks.d.ts.map +1 -0
- package/dist/checks/static-checks.js +681 -0
- package/dist/checks/static-checks.js.map +1 -0
- package/dist/hyperframes-backend.d.ts +53 -0
- package/dist/hyperframes-backend.d.ts.map +1 -0
- package/dist/hyperframes-backend.js +733 -0
- package/dist/hyperframes-backend.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs.d.ts +88 -0
- package/dist/jobs.d.ts.map +1 -0
- package/dist/jobs.js +650 -0
- package/dist/jobs.js.map +1 -0
- package/dist/lint-gate.d.ts +21 -0
- package/dist/lint-gate.d.ts.map +1 -0
- package/dist/lint-gate.js +528 -0
- package/dist/lint-gate.js.map +1 -0
- package/dist/main.d.ts +47 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +195 -0
- package/dist/main.js.map +1 -0
- package/dist/one-shot.d.ts +37 -0
- package/dist/one-shot.d.ts.map +1 -0
- package/dist/one-shot.js +228 -0
- package/dist/one-shot.js.map +1 -0
- package/dist/preamble.d.ts +69 -0
- package/dist/preamble.d.ts.map +1 -0
- package/dist/preamble.js +331 -0
- package/dist/preamble.js.map +1 -0
- package/dist/server.d.ts +75 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +526 -0
- package/dist/server.js.map +1 -0
- package/package.json +43 -5
package/dist/preamble.js
ADDED
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strict Content-Security-Policy injected into every staged HTML file (Decision 3).
|
|
3
|
+
*
|
|
4
|
+
* Blocks all external network egress (`connect-src 'none'`, `frame-src 'none'`, `worker-src 'none'`,
|
|
5
|
+
* `object-src 'none'`, `base-uri 'none'`, `form-action 'none'`) while allowing local bundle files
|
|
6
|
+
* (`'self'`), `data:` / `blob:` URIs, and inline composition scripts/styles.
|
|
7
|
+
*/
|
|
8
|
+
export const COMPOSITION_CSP = [
|
|
9
|
+
"default-src 'self' data: blob:",
|
|
10
|
+
"script-src 'self' 'unsafe-inline'",
|
|
11
|
+
"style-src 'self' 'unsafe-inline'",
|
|
12
|
+
"connect-src 'none'",
|
|
13
|
+
"frame-src 'none'",
|
|
14
|
+
"worker-src 'none'",
|
|
15
|
+
"object-src 'none'",
|
|
16
|
+
"base-uri 'none'",
|
|
17
|
+
"form-action 'none'",
|
|
18
|
+
].join('; ');
|
|
19
|
+
/**
|
|
20
|
+
* Default SIL OFL font families bundled in the RenderWorker package (`assets/fonts/`)
|
|
21
|
+
* under `MJ Sans` (`Inter-Regular.ttf`) and `MJ Mono` (`JetBrainsMono-Regular.ttf`) so
|
|
22
|
+
* HyperFrames' font compiler never maps them to Google Fonts and compositions render
|
|
23
|
+
* deterministically offline with `FontIsBundled: true` (VS-RND-5 Decision 4 / Round 1).
|
|
24
|
+
*/
|
|
25
|
+
export const BUNDLED_DEFAULT_FONTS = ['MJ Sans', 'MJ Mono'];
|
|
26
|
+
/**
|
|
27
|
+
* Builds the `<meta http-equiv="Content-Security-Policy">` tag injected into every `.html` file.
|
|
28
|
+
*/
|
|
29
|
+
export function BuildCspMetaTag() {
|
|
30
|
+
return `<meta http-equiv="Content-Security-Policy" content="${COMPOSITION_CSP}">`;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Builds the `<style data-mj-default-fonts>` tag registering the worker's bundled `MJ Sans`
|
|
34
|
+
* (`Inter-Regular.ttf`) and `MJ Mono` (`JetBrainsMono-Regular.ttf`) `@font-face` rules served from `/__mj_fonts/`.
|
|
35
|
+
*/
|
|
36
|
+
export function BuildDefaultFontsStyleTag() {
|
|
37
|
+
return [
|
|
38
|
+
'<style data-mj-default-fonts>',
|
|
39
|
+
"@font-face{font-family:'MJ Sans';src:url('/__mj_fonts/Inter-Regular.ttf') format('truetype');font-weight:100 900;font-style:normal;font-display:block;}",
|
|
40
|
+
"@font-face{font-family:'MJ Mono';src:url('/__mj_fonts/JetBrainsMono-Regular.ttf') format('truetype');font-weight:100 900;font-style:normal;font-display:block;}",
|
|
41
|
+
'</style>',
|
|
42
|
+
].join('');
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Escapes a JSON string for safe embedding inside an HTML `<script>` element (`<`, `>`, U+2028, U+2029).
|
|
46
|
+
*/
|
|
47
|
+
export function EscapeJsonForInlineScript(value) {
|
|
48
|
+
const raw = JSON.stringify(value ?? {});
|
|
49
|
+
return raw
|
|
50
|
+
.replace(/</g, '\\u003c')
|
|
51
|
+
.replace(/>/g, '\\u003e')
|
|
52
|
+
.replace(/\u2028/g, '\\u2028')
|
|
53
|
+
.replace(/\u2029/g, '\\u2029');
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Builds the inline JavaScript source that defines a frozen `window.MJVideo: MJVideoRuntime`,
|
|
57
|
+
* replaces `Math.random` with `MJVideo.Random`, and hooks HyperFrames' `window.__hf.seek`.
|
|
58
|
+
*/
|
|
59
|
+
export function BuildPreambleScript(options) {
|
|
60
|
+
const safeDataJson = EscapeJsonForInlineScript(options.DataSnapshot && typeof options.DataSnapshot === 'object' ? options.DataSnapshot : {});
|
|
61
|
+
const safeSeed = Number.isFinite(options.Seed) ? Math.trunc(options.Seed) : 0;
|
|
62
|
+
const safeFormat = JSON.stringify(options.Format);
|
|
63
|
+
const safeWidth = Math.trunc(options.Width);
|
|
64
|
+
const safeHeight = Math.trunc(options.Height);
|
|
65
|
+
const safeFps = Math.trunc(options.Fps);
|
|
66
|
+
const safeDuration = typeof options.DurationSeconds === 'number' && Number.isFinite(options.DurationSeconds)
|
|
67
|
+
? String(options.DurationSeconds)
|
|
68
|
+
: 'undefined';
|
|
69
|
+
return [
|
|
70
|
+
'(function(w) {',
|
|
71
|
+
' "use strict";',
|
|
72
|
+
' var window = w;',
|
|
73
|
+
' function deepFreeze(obj) {',
|
|
74
|
+
' if (obj === null || typeof obj !== "object" || Object.isFrozen(obj)) return obj;',
|
|
75
|
+
' Object.freeze(obj);',
|
|
76
|
+
' var keys = Object.keys(obj);',
|
|
77
|
+
' for (var i = 0; i < keys.length; i++) {',
|
|
78
|
+
' deepFreeze(obj[keys[i]]);',
|
|
79
|
+
' }',
|
|
80
|
+
' return obj;',
|
|
81
|
+
' }',
|
|
82
|
+
' function mix32(h, k) {',
|
|
83
|
+
' h = Math.imul(h ^ (k >>> 0), 0x85ebca6b) >>> 0;',
|
|
84
|
+
' h = Math.imul(h ^ (h >>> 13), 0xc2b2ae35) >>> 0;',
|
|
85
|
+
' return (h ^ (h >>> 16)) >>> 0;',
|
|
86
|
+
' }',
|
|
87
|
+
' function hashFrameSeed(seed, timeMs) {',
|
|
88
|
+
' return mix32((seed ^ 0x9e3779b9) >>> 0, timeMs >>> 0);',
|
|
89
|
+
' }',
|
|
90
|
+
' function hashNoise(seed, keys) {',
|
|
91
|
+
' var h = (seed ^ 0x9e3779b9) >>> 0;',
|
|
92
|
+
' for (var i = 0; i < keys.length; i++) {',
|
|
93
|
+
' var key = String(keys[i]);',
|
|
94
|
+
' for (var j = 0; j < key.length; j++) {',
|
|
95
|
+
' h = mix32(h, key.charCodeAt(j));',
|
|
96
|
+
' }',
|
|
97
|
+
' h = mix32(h, 0xff);',
|
|
98
|
+
' }',
|
|
99
|
+
' var t = (h + 0x6D2B79F5) >>> 0;',
|
|
100
|
+
' t = Math.imul(t ^ (t >>> 15), t | 1);',
|
|
101
|
+
' t ^= t + Math.imul(t ^ (t >>> 7), t | 61);',
|
|
102
|
+
' return ((t ^ (t >>> 14)) >>> 0) / 4294967296;',
|
|
103
|
+
' }',
|
|
104
|
+
` var baseSeed = ${safeSeed};`,
|
|
105
|
+
` var frozenData = deepFreeze(${safeDataJson});`,
|
|
106
|
+
' var prngState = baseSeed >>> 0;',
|
|
107
|
+
' var frameCallbacks = [];',
|
|
108
|
+
' var dispatchSeq = 0;',
|
|
109
|
+
' function nextRandom() {',
|
|
110
|
+
' prngState = (prngState + 0x6D2B79F5) >>> 0;',
|
|
111
|
+
' var t = prngState;',
|
|
112
|
+
' t = Math.imul(t ^ (t >>> 15), t | 1);',
|
|
113
|
+
' t ^= t + Math.imul(t ^ (t >>> 7), t | 61);',
|
|
114
|
+
' return ((t ^ (t >>> 14)) >>> 0) / 4294967296;',
|
|
115
|
+
' }',
|
|
116
|
+
' function dispatchFrame(timeSeconds) {',
|
|
117
|
+
' dispatchSeq++;',
|
|
118
|
+
' var safeTime = typeof timeSeconds === "number" && isFinite(timeSeconds) ? timeSeconds : 0;',
|
|
119
|
+
' var timeMs = Math.round(safeTime * 1000);',
|
|
120
|
+
' prngState = hashFrameSeed(baseSeed, timeMs);',
|
|
121
|
+
' for (var i = 0; i < frameCallbacks.length; i++) {',
|
|
122
|
+
' frameCallbacks[i](safeTime);',
|
|
123
|
+
' }',
|
|
124
|
+
' }',
|
|
125
|
+
' var runtimeObj = {',
|
|
126
|
+
' Data: frozenData,',
|
|
127
|
+
' Seed: baseSeed,',
|
|
128
|
+
` Format: ${safeFormat},`,
|
|
129
|
+
` Width: ${safeWidth},`,
|
|
130
|
+
` Height: ${safeHeight},`,
|
|
131
|
+
` Fps: ${safeFps},`,
|
|
132
|
+
` DurationSeconds: ${safeDuration},`,
|
|
133
|
+
' Random: function() { return nextRandom(); },',
|
|
134
|
+
' Noise: function() {',
|
|
135
|
+
' var args = [];',
|
|
136
|
+
' for (var i = 0; i < arguments.length; i++) args.push(arguments[i]);',
|
|
137
|
+
' return hashNoise(baseSeed, args);',
|
|
138
|
+
' },',
|
|
139
|
+
' OnFrame: function(cb) {',
|
|
140
|
+
' if (typeof cb === "function") {',
|
|
141
|
+
' frameCallbacks.push(cb);',
|
|
142
|
+
' }',
|
|
143
|
+
' ensureCompositionTimelines();',
|
|
144
|
+
' }',
|
|
145
|
+
' };',
|
|
146
|
+
' var runtime = Object.freeze(runtimeObj);',
|
|
147
|
+
' Object.defineProperty(w, "MJVideo", {',
|
|
148
|
+
' value: runtime,',
|
|
149
|
+
' writable: false,',
|
|
150
|
+
' configurable: false,',
|
|
151
|
+
' enumerable: true',
|
|
152
|
+
' });',
|
|
153
|
+
' Math.random = runtime.Random;',
|
|
154
|
+
' if (w.Math && typeof w.Math === "object") {',
|
|
155
|
+
' w.Math.random = runtime.Random;',
|
|
156
|
+
' }',
|
|
157
|
+
' function createSyntheticTimeline(dur) {',
|
|
158
|
+
' var fallbackDur = typeof runtimeObj.DurationSeconds === "number" && isFinite(runtimeObj.DurationSeconds) && runtimeObj.DurationSeconds > 0 ? runtimeObj.DurationSeconds : 5;',
|
|
159
|
+
' var safeDur = typeof dur === "number" && isFinite(dur) && dur > 0 ? dur : fallbackDur;',
|
|
160
|
+
' var currentTime = 0;',
|
|
161
|
+
' var tl = {',
|
|
162
|
+
' duration: function() { return safeDur; },',
|
|
163
|
+
' totalDuration: function() { return safeDur; },',
|
|
164
|
+
' time: function(t) {',
|
|
165
|
+
' if (arguments.length > 0 && typeof t === "number" && isFinite(t)) {',
|
|
166
|
+
' currentTime = t;',
|
|
167
|
+
' dispatchFrame(t);',
|
|
168
|
+
' }',
|
|
169
|
+
' return currentTime;',
|
|
170
|
+
' },',
|
|
171
|
+
' totalTime: function(t) {',
|
|
172
|
+
' if (arguments.length > 0 && typeof t === "number" && isFinite(t)) {',
|
|
173
|
+
' currentTime = t;',
|
|
174
|
+
' dispatchFrame(t);',
|
|
175
|
+
' return tl;',
|
|
176
|
+
' }',
|
|
177
|
+
' return currentTime;',
|
|
178
|
+
' },',
|
|
179
|
+
' seek: function(t) {',
|
|
180
|
+
' if (arguments.length > 0 && typeof t === "number" && isFinite(t)) {',
|
|
181
|
+
' currentTime = t;',
|
|
182
|
+
' dispatchFrame(t);',
|
|
183
|
+
' }',
|
|
184
|
+
' return tl;',
|
|
185
|
+
' },',
|
|
186
|
+
' progress: function(p) {',
|
|
187
|
+
' if (arguments.length > 0 && typeof p === "number" && isFinite(p)) {',
|
|
188
|
+
' currentTime = p * safeDur;',
|
|
189
|
+
' dispatchFrame(currentTime);',
|
|
190
|
+
' return tl;',
|
|
191
|
+
' }',
|
|
192
|
+
' return safeDur > 0 ? currentTime / safeDur : 0;',
|
|
193
|
+
' },',
|
|
194
|
+
' pause: function() { return tl; },',
|
|
195
|
+
' play: function() { return tl; },',
|
|
196
|
+
' paused: function() { return true; },',
|
|
197
|
+
' timeScale: function() { return 1; },',
|
|
198
|
+
' getChildren: function() { return []; }',
|
|
199
|
+
' };',
|
|
200
|
+
' Object.defineProperty(tl, "__mjWrapped", { value: true, enumerable: false });',
|
|
201
|
+
' Object.defineProperty(tl, "__mjSynthetic", { value: true, enumerable: false });',
|
|
202
|
+
' return tl;',
|
|
203
|
+
' }',
|
|
204
|
+
' function wrapTimeline(tl) {',
|
|
205
|
+
' if (!tl || typeof tl !== "object" || tl.__mjWrapped) return tl;',
|
|
206
|
+
' Object.defineProperty(tl, "__mjWrapped", { value: true, enumerable: false });',
|
|
207
|
+
' if (typeof tl.totalTime === "function") {',
|
|
208
|
+
' var origTotalTime = tl.totalTime;',
|
|
209
|
+
' tl.totalTime = function(t) {',
|
|
210
|
+
' var seqBefore = dispatchSeq;',
|
|
211
|
+
' var res = origTotalTime.apply(this, arguments);',
|
|
212
|
+
' if (arguments.length > 0 && typeof t === "number" && isFinite(t) && dispatchSeq === seqBefore) {',
|
|
213
|
+
' dispatchFrame(t);',
|
|
214
|
+
' }',
|
|
215
|
+
' return res;',
|
|
216
|
+
' };',
|
|
217
|
+
' }',
|
|
218
|
+
' if (typeof tl.seek === "function") {',
|
|
219
|
+
' var origSeek = tl.seek;',
|
|
220
|
+
' tl.seek = function(t) {',
|
|
221
|
+
' var seqBefore = dispatchSeq;',
|
|
222
|
+
' var res = origSeek.apply(this, arguments);',
|
|
223
|
+
' if (arguments.length > 0 && typeof t === "number" && isFinite(t) && dispatchSeq === seqBefore) {',
|
|
224
|
+
' dispatchFrame(t);',
|
|
225
|
+
' }',
|
|
226
|
+
' return res;',
|
|
227
|
+
' };',
|
|
228
|
+
' }',
|
|
229
|
+
' return tl;',
|
|
230
|
+
' }',
|
|
231
|
+
' window.__timelines = window.__timelines || {};',
|
|
232
|
+
' function ensureCompositionTimelines() {',
|
|
233
|
+
' window.__timelines = window.__timelines || {};',
|
|
234
|
+
' if (!w.document || typeof w.document.querySelectorAll !== "function") return;',
|
|
235
|
+
' var hosts = w.document.querySelectorAll("[data-composition-id]");',
|
|
236
|
+
' for (var i = 0; i < hosts.length; i++) {',
|
|
237
|
+
' var id = hosts[i].getAttribute("data-composition-id");',
|
|
238
|
+
' if (!id) continue;',
|
|
239
|
+
' var durAttr = parseFloat(hosts[i].getAttribute("data-duration") || "");',
|
|
240
|
+
' var existing = window.__timelines[id];',
|
|
241
|
+
' var tl = existing ? wrapTimeline(existing) : createSyntheticTimeline(durAttr);',
|
|
242
|
+
' window.__timelines[id] = tl;',
|
|
243
|
+
' }',
|
|
244
|
+
' }',
|
|
245
|
+
' function wrapHfObject(hfObj) {',
|
|
246
|
+
' if (!hfObj || typeof hfObj !== "object" || hfObj.__mjWrapped) return hfObj;',
|
|
247
|
+
' var underlyingSeek = typeof hfObj.seek === "function" ? hfObj.seek : null;',
|
|
248
|
+
' Object.defineProperty(hfObj, "__mjWrapped", { value: true, enumerable: false });',
|
|
249
|
+
' Object.defineProperty(hfObj, "seek", {',
|
|
250
|
+
' configurable: true,',
|
|
251
|
+
' enumerable: true,',
|
|
252
|
+
' get: function() {',
|
|
253
|
+
' return function(t, opts) {',
|
|
254
|
+
' ensureCompositionTimelines();',
|
|
255
|
+
' var seqBefore = dispatchSeq;',
|
|
256
|
+
' var res = underlyingSeek ? underlyingSeek.call(this, t, opts) : undefined;',
|
|
257
|
+
' if (dispatchSeq === seqBefore) {',
|
|
258
|
+
' dispatchFrame(t);',
|
|
259
|
+
' }',
|
|
260
|
+
' return res;',
|
|
261
|
+
' };',
|
|
262
|
+
' },',
|
|
263
|
+
' set: function(fn) {',
|
|
264
|
+
' underlyingSeek = typeof fn === "function" ? fn : null;',
|
|
265
|
+
' }',
|
|
266
|
+
' });',
|
|
267
|
+
' return hfObj;',
|
|
268
|
+
' }',
|
|
269
|
+
' var currentHf = wrapHfObject(w.__hf || {});',
|
|
270
|
+
' Object.defineProperty(w, "__hf", {',
|
|
271
|
+
' configurable: true,',
|
|
272
|
+
' enumerable: true,',
|
|
273
|
+
' get: function() { return currentHf; },',
|
|
274
|
+
' set: function(nextHf) {',
|
|
275
|
+
' ensureCompositionTimelines();',
|
|
276
|
+
' currentHf = wrapHfObject(nextHf || {});',
|
|
277
|
+
' }',
|
|
278
|
+
' });',
|
|
279
|
+
' if (typeof w.document !== "undefined" && typeof w.document.addEventListener === "function") {',
|
|
280
|
+
' w.document.addEventListener("DOMContentLoaded", function() {',
|
|
281
|
+
' ensureCompositionTimelines();',
|
|
282
|
+
' });',
|
|
283
|
+
' }',
|
|
284
|
+
'})(typeof window !== "undefined" ? window : globalThis);',
|
|
285
|
+
].join('\n');
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Injects the CSP `<meta>` tag, bundled default `@font-face` `<style>`, and the `window.MJVideo`
|
|
289
|
+
* inline `<script>` right after `<!doctype ...>` (or at byte 0 when no doctype is present).
|
|
290
|
+
* The preamble is collapsed onto a single line so line numbers in staged HTML remain unchanged.
|
|
291
|
+
*/
|
|
292
|
+
export function InjectPreambleIntoHtml(html, options) {
|
|
293
|
+
const metaTag = BuildCspMetaTag();
|
|
294
|
+
const fontsStyleTag = BuildDefaultFontsStyleTag();
|
|
295
|
+
const singleLineScript = BuildPreambleScript(options).replace(/\n\s*/g, ' ');
|
|
296
|
+
const scriptTag = `<script>${singleLineScript}</script>`;
|
|
297
|
+
const preamble = `${metaTag}${fontsStyleTag}${scriptTag}`;
|
|
298
|
+
const doctypeMatch = /^\s*<!doctype[^>]*>/i.exec(html);
|
|
299
|
+
if (doctypeMatch) {
|
|
300
|
+
const insertAt = doctypeMatch[0].length;
|
|
301
|
+
return `${html.slice(0, insertAt)}${preamble}${html.slice(insertAt)}`;
|
|
302
|
+
}
|
|
303
|
+
return `${preamble}${html}`;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Convenience helper constructing `PreambleRuntimeOptions` from a `RenderProjectBundle` plus frame geometry.
|
|
307
|
+
*/
|
|
308
|
+
export function BuildPreambleOptionsFromBundle(bundle, geometry) {
|
|
309
|
+
const defaults = defaultGeometryForFormat(bundle.Format);
|
|
310
|
+
return {
|
|
311
|
+
DataSnapshot: bundle.DataSnapshot ?? {},
|
|
312
|
+
Seed: bundle.Seed,
|
|
313
|
+
Format: bundle.Format,
|
|
314
|
+
Width: geometry?.Width ?? defaults.Width,
|
|
315
|
+
Height: geometry?.Height ?? defaults.Height,
|
|
316
|
+
Fps: geometry?.Fps ?? 30,
|
|
317
|
+
DurationSeconds: geometry?.DurationSeconds,
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
function defaultGeometryForFormat(format) {
|
|
321
|
+
switch (format) {
|
|
322
|
+
case '9:16':
|
|
323
|
+
return { Width: 1080, Height: 1920 };
|
|
324
|
+
case '1:1':
|
|
325
|
+
return { Width: 1080, Height: 1080 };
|
|
326
|
+
case '16:9':
|
|
327
|
+
default:
|
|
328
|
+
return { Width: 1920, Height: 1080 };
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
//# sourceMappingURL=preamble.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preamble.js","sourceRoot":"","sources":["../src/preamble.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import * as http from 'node:http';
|
|
2
|
+
import { type RenderBackend } from './backend.js';
|
|
3
|
+
/** Default bind host for the render worker HTTP server. */
|
|
4
|
+
export declare const DEFAULT_HOST = "127.0.0.1";
|
|
5
|
+
/** Default bind port (`0` selects an ephemeral OS-assigned port). */
|
|
6
|
+
export declare const DEFAULT_PORT = 0;
|
|
7
|
+
/** Default maximum JSON request body size in megabytes (256 MiB). */
|
|
8
|
+
export declare const DEFAULT_MAX_BODY_MB = 256;
|
|
9
|
+
/** Default maximum JSON request body size in bytes (256 MiB). */
|
|
10
|
+
export declare const DEFAULT_MAX_BODY_BYTES: number;
|
|
11
|
+
/** Default maximum concurrent jobs (`/check`, `/render`, `/stills`, `/contact-sheet`, `/keyframes`). */
|
|
12
|
+
export declare const DEFAULT_CONCURRENCY = 1;
|
|
13
|
+
/** Default per-job timeout ceiling (30 minutes). */
|
|
14
|
+
export declare const DEFAULT_MAX_TIMEOUT_MS: number;
|
|
15
|
+
/** Default timeout for non-render jobs (`/check`, `/stills`, `/contact-sheet`, `/keyframes`, pre-render lint) (5 minutes). */
|
|
16
|
+
export declare const DEFAULT_NON_RENDER_TIMEOUT_MS: number;
|
|
17
|
+
/** Default heartbeat interval for streaming `/render` responses (15 seconds). */
|
|
18
|
+
export declare const DEFAULT_HEARTBEAT_MS = 15000;
|
|
19
|
+
/** Default TTL for unfetched rendered MP4 buffers in the video store (10 minutes). */
|
|
20
|
+
export declare const DEFAULT_VIDEO_TTL_MS: number;
|
|
21
|
+
/**
|
|
22
|
+
* Configuration options for `CreateRenderWorkerServer`.
|
|
23
|
+
*/
|
|
24
|
+
export interface RenderWorkerServerOptions {
|
|
25
|
+
/** Rendering backend (`FakeRenderBackend` in unit tests, `HyperFramesRenderBackend` in production). */
|
|
26
|
+
Backend: RenderBackend;
|
|
27
|
+
/** Default bind host when `Listen()` is called without an explicit host (defaults to `'127.0.0.1'`). */
|
|
28
|
+
Host?: string;
|
|
29
|
+
/** Default bind port when `Listen()` is called without an explicit port (defaults to `0`). */
|
|
30
|
+
Port?: number;
|
|
31
|
+
/** Optional bearer token required on every route (including `GET /health`). */
|
|
32
|
+
Token?: string;
|
|
33
|
+
/** Alias for `Token` (optional bearer token required on every route including `GET /health`). */
|
|
34
|
+
BearerToken?: string;
|
|
35
|
+
/** Maximum request body size in megabytes (defaults to 256 MiB). */
|
|
36
|
+
MaxBodyMb?: number;
|
|
37
|
+
/** Maximum request body size in bytes (if set, overrides `MaxBodyMb`). */
|
|
38
|
+
MaxBodyBytes?: number;
|
|
39
|
+
/** Maximum concurrent render/check/capture jobs (defaults to 1). */
|
|
40
|
+
Concurrency?: number;
|
|
41
|
+
/** Maximum timeout in milliseconds per job (defaults to 1,800,000 ms / 30 min). */
|
|
42
|
+
MaxTimeoutMs?: number;
|
|
43
|
+
/** Default timeout in milliseconds for non-render jobs and pre-render lint (defaults to 300,000 ms / 5 min). */
|
|
44
|
+
NonRenderTimeoutMs?: number;
|
|
45
|
+
/** Base directory for temporary bundle staging and keyframe extraction (defaults to `os.tmpdir()`). */
|
|
46
|
+
TempRoot?: string;
|
|
47
|
+
/** Interval in milliseconds for `Heartbeat` NDJSON events on `/render` (defaults to 15,000 ms). */
|
|
48
|
+
HeartbeatIntervalMs?: number;
|
|
49
|
+
/** TTL in milliseconds for unfetched MP4 entries in `/videos/<VideoID>` (defaults to 600,000 ms). */
|
|
50
|
+
VideoTtlMs?: number;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Running HTTP render worker server handle returned by `CreateRenderWorkerServer`.
|
|
54
|
+
*/
|
|
55
|
+
export interface RenderWorkerServer {
|
|
56
|
+
/** Underlying Node `http.Server`. */
|
|
57
|
+
readonly HttpServer: http.Server;
|
|
58
|
+
/** Bound TCP port after `Listen` resolves (`0` before listening). */
|
|
59
|
+
readonly Port: number;
|
|
60
|
+
/** Starts listening on `host` and `port` (defaults to `options.Host ?? '127.0.0.1'` and `options.Port ?? 0`). */
|
|
61
|
+
Listen(port?: number, host?: string): Promise<number>;
|
|
62
|
+
/** Aborts in-flight jobs, clears the video store, and closes the HTTP server. */
|
|
63
|
+
Close(): Promise<void>;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Returns `true` when `host` is a loopback address (`127.0.0.1`, `::1`, `::ffff:127.0.0.1`, or `localhost`).
|
|
67
|
+
*/
|
|
68
|
+
export declare function IsLoopbackHost(host: string): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Creates an HTTP server implementing all `RENDER_WORKER_ROUTES`.
|
|
71
|
+
*
|
|
72
|
+
* Notice that this module does NOT import `hyperframes-backend.ts`; callers inject `Backend`.
|
|
73
|
+
*/
|
|
74
|
+
export declare function CreateRenderWorkerServer(options: RenderWorkerServerOptions): RenderWorkerServer;
|
|
75
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAclC,OAAO,EAEH,KAAK,aAAa,EACrB,MAAM,cAAc,CAAC;AAetB,2DAA2D;AAC3D,eAAO,MAAM,YAAY,cAAc,CAAC;AAExC,qEAAqE;AACrE,eAAO,MAAM,YAAY,IAAI,CAAC;AAE9B,qEAAqE;AACrE,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC,iEAAiE;AACjE,eAAO,MAAM,sBAAsB,QAAoC,CAAC;AAExE,wGAAwG;AACxG,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,oDAAoD;AACpD,eAAO,MAAM,sBAAsB,QAAiB,CAAC;AAErD,8HAA8H;AAC9H,eAAO,MAAM,6BAA6B,QAAgB,CAAC;AAE3D,iFAAiF;AACjF,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAE3C,sFAAsF;AACtF,eAAO,MAAM,oBAAoB,QAAiB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACtC,uGAAuG;IACvG,OAAO,EAAE,aAAa,CAAC;IACvB,wGAAwG;IACxG,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8FAA8F;IAC9F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iGAAiG;IACjG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gHAAgH;IAChH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uGAAuG;IACvG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mGAAmG;IACnG,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,qGAAqG;IACrG,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,qCAAqC;IACrC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;IACjC,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iHAAiH;IACjH,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,iFAAiF;IACjF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAOD;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQpD;AAUD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,kBAAkB,CAoc/F"}
|