@memberjunction/video-studio-render-worker 0.0.1-seed.1 → 6.2.0-edge.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 (59) hide show
  1. package/LICENSE +183 -0
  2. package/README.md +139 -4
  3. package/assets/fonts/Inter-OFL.txt +93 -0
  4. package/assets/fonts/Inter-Regular.ttf +0 -0
  5. package/assets/fonts/JetBrainsMono-OFL.txt +93 -0
  6. package/assets/fonts/JetBrainsMono-Regular.ttf +0 -0
  7. package/dist/backend.d.ts +201 -0
  8. package/dist/backend.d.ts.map +1 -0
  9. package/dist/backend.js +205 -0
  10. package/dist/backend.js.map +1 -0
  11. package/dist/bundle.d.ts +112 -0
  12. package/dist/bundle.d.ts.map +1 -0
  13. package/dist/bundle.js +433 -0
  14. package/dist/bundle.js.map +1 -0
  15. package/dist/checks/dom-rules.d.ts +57 -0
  16. package/dist/checks/dom-rules.d.ts.map +1 -0
  17. package/dist/checks/dom-rules.js +205 -0
  18. package/dist/checks/dom-rules.js.map +1 -0
  19. package/dist/checks/hyperframes-check.d.ts +37 -0
  20. package/dist/checks/hyperframes-check.d.ts.map +1 -0
  21. package/dist/checks/hyperframes-check.js +161 -0
  22. package/dist/checks/hyperframes-check.js.map +1 -0
  23. package/dist/checks/static-checks.d.ts +46 -0
  24. package/dist/checks/static-checks.d.ts.map +1 -0
  25. package/dist/checks/static-checks.js +681 -0
  26. package/dist/checks/static-checks.js.map +1 -0
  27. package/dist/hyperframes-backend.d.ts +53 -0
  28. package/dist/hyperframes-backend.d.ts.map +1 -0
  29. package/dist/hyperframes-backend.js +733 -0
  30. package/dist/hyperframes-backend.js.map +1 -0
  31. package/dist/index.d.ts +20 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +20 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/jobs.d.ts +88 -0
  36. package/dist/jobs.d.ts.map +1 -0
  37. package/dist/jobs.js +650 -0
  38. package/dist/jobs.js.map +1 -0
  39. package/dist/lint-gate.d.ts +21 -0
  40. package/dist/lint-gate.d.ts.map +1 -0
  41. package/dist/lint-gate.js +528 -0
  42. package/dist/lint-gate.js.map +1 -0
  43. package/dist/main.d.ts +47 -0
  44. package/dist/main.d.ts.map +1 -0
  45. package/dist/main.js +195 -0
  46. package/dist/main.js.map +1 -0
  47. package/dist/one-shot.d.ts +37 -0
  48. package/dist/one-shot.d.ts.map +1 -0
  49. package/dist/one-shot.js +228 -0
  50. package/dist/one-shot.js.map +1 -0
  51. package/dist/preamble.d.ts +69 -0
  52. package/dist/preamble.d.ts.map +1 -0
  53. package/dist/preamble.js +331 -0
  54. package/dist/preamble.js.map +1 -0
  55. package/dist/server.d.ts +75 -0
  56. package/dist/server.d.ts.map +1 -0
  57. package/dist/server.js +526 -0
  58. package/dist/server.js.map +1 -0
  59. package/package.json +43 -5
package/dist/main.d.ts ADDED
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env node
2
+ import type { RenderBackend } from './backend.js';
3
+ import { type RenderWorkerServer } from './server.js';
4
+ /**
5
+ * Parsed runtime configuration derived from `RENDER_WORKER_ENV` environment variables.
6
+ */
7
+ export interface RenderWorkerMainConfig {
8
+ Host: string;
9
+ Port: number;
10
+ Token?: string;
11
+ MaxBodyBytes: number;
12
+ Concurrency: number;
13
+ MaxTimeoutMs: number;
14
+ AllowRoot: boolean;
15
+ }
16
+ /**
17
+ * Options for `StartRenderWorkerFromEnv`.
18
+ */
19
+ export interface StartRenderWorkerOptions {
20
+ /** Environment map (defaults to `process.env`). */
21
+ Env?: NodeJS.ProcessEnv;
22
+ /** Optional backend override (defaults to `new HyperFramesRenderBackend()`). */
23
+ Backend?: RenderBackend;
24
+ /** Optional effective UID override for unit testing root rejection. */
25
+ EffectiveUid?: number;
26
+ /** Optional stdout line writer (defaults to `(line) => process.stdout.write(line + '\n')`). */
27
+ WriteStdoutLine?: (line: string) => void;
28
+ }
29
+ /**
30
+ * Parses `RENDER_WORKER_ENV` environment variables into a validated `RenderWorkerMainConfig`.
31
+ */
32
+ export declare function ParseRenderWorkerEnv(env?: NodeJS.ProcessEnv): RenderWorkerMainConfig;
33
+ /**
34
+ * Validates that the worker is not running as root (`uid === 0`) unless `AllowRoot` is enabled.
35
+ */
36
+ export declare function AssertNonRootUser(allowRoot: boolean, effectiveUid?: number): void;
37
+ /**
38
+ * Redirects `console.log` and `console.info` to `process.stderr` so third-party libraries
39
+ * cannot pollute stdout after the `VIDEO_STUDIO_RENDER_WORKER_PORT=<port>` handshake line.
40
+ */
41
+ export declare function RedirectConsoleStdoutToStderr(): void;
42
+ /**
43
+ * Starts the HTTP render worker using `RENDER_WORKER_ENV`, writes
44
+ * `VIDEO_STUDIO_RENDER_WORKER_PORT=<port>` to stdout once listening, and returns the server handle.
45
+ */
46
+ export declare function StartRenderWorkerFromEnv(options?: StartRenderWorkerOptions): Promise<RenderWorkerServer>;
47
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAQH,KAAK,kBAAkB,EAC1B,MAAM,aAAa,CAAC;AAGrB;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACrC,mDAAmD;IACnD,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,gFAAgF;IAChF,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+FAA+F;IAC/F,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,sBAAsB,CAyCjG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAYjF;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,IAAI,IAAI,CAMpD;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC1C,OAAO,GAAE,wBAA6B,GACvC,OAAO,CAAC,kBAAkB,CAAC,CA0B7B"}
package/dist/main.js ADDED
@@ -0,0 +1,195 @@
1
+ #!/usr/bin/env node
2
+ import * as fs from 'node:fs';
3
+ import { pathToFileURL } from 'node:url';
4
+ import { format as formatUtil } from 'node:util';
5
+ import { RENDER_WORKER_ENV, RENDER_WORKER_PORT_PREFIX, } from '@memberjunction/video-studio-core';
6
+ import { HyperFramesRenderBackend } from './hyperframes-backend.js';
7
+ import { CreateRenderWorkerServer, DEFAULT_CONCURRENCY, DEFAULT_HOST, DEFAULT_MAX_BODY_BYTES, DEFAULT_MAX_BODY_MB, DEFAULT_MAX_TIMEOUT_MS, DEFAULT_PORT, } from './server.js';
8
+ import { RunOneShot } from './one-shot.js';
9
+ /**
10
+ * Parses `RENDER_WORKER_ENV` environment variables into a validated `RenderWorkerMainConfig`.
11
+ */
12
+ export function ParseRenderWorkerEnv(env = process.env) {
13
+ const host = env[RENDER_WORKER_ENV.Host]?.trim() || DEFAULT_HOST;
14
+ const rawPort = env[RENDER_WORKER_ENV.Port]?.trim();
15
+ const port = rawPort !== undefined && rawPort !== '' ? Number.parseInt(rawPort, 10) : DEFAULT_PORT;
16
+ const token = env[RENDER_WORKER_ENV.Token]?.trim() || undefined;
17
+ const rawMaxBodyMb = env[RENDER_WORKER_ENV.MaxBodyMb]?.trim();
18
+ const maxBodyMb = rawMaxBodyMb !== undefined && rawMaxBodyMb !== ''
19
+ ? Number.parseFloat(rawMaxBodyMb)
20
+ : DEFAULT_MAX_BODY_MB;
21
+ const maxBodyBytes = Number.isFinite(maxBodyMb) && maxBodyMb > 0
22
+ ? Math.round(maxBodyMb * 1024 * 1024)
23
+ : DEFAULT_MAX_BODY_BYTES;
24
+ const rawConcurrency = env[RENDER_WORKER_ENV.Concurrency]?.trim();
25
+ const concurrency = rawConcurrency !== undefined && rawConcurrency !== ''
26
+ ? Math.max(1, Number.parseInt(rawConcurrency, 10) || DEFAULT_CONCURRENCY)
27
+ : DEFAULT_CONCURRENCY;
28
+ const rawTimeout = env[RENDER_WORKER_ENV.MaxTimeoutMs]?.trim();
29
+ const maxTimeoutMs = rawTimeout !== undefined && rawTimeout !== ''
30
+ ? Math.max(50, Number.parseInt(rawTimeout, 10) || DEFAULT_MAX_TIMEOUT_MS)
31
+ : DEFAULT_MAX_TIMEOUT_MS;
32
+ const rawAllowRoot = env[RENDER_WORKER_ENV.AllowRoot]?.trim().toLowerCase();
33
+ const allowRoot = rawAllowRoot === '1' || rawAllowRoot === 'true';
34
+ return {
35
+ Host: host,
36
+ Port: Number.isFinite(port) && port >= 0 ? port : DEFAULT_PORT,
37
+ Token: token,
38
+ MaxBodyBytes: maxBodyBytes,
39
+ Concurrency: concurrency,
40
+ MaxTimeoutMs: maxTimeoutMs,
41
+ AllowRoot: allowRoot,
42
+ };
43
+ }
44
+ /**
45
+ * Validates that the worker is not running as root (`uid === 0`) unless `AllowRoot` is enabled.
46
+ */
47
+ export function AssertNonRootUser(allowRoot, effectiveUid) {
48
+ const uid = effectiveUid !== undefined
49
+ ? effectiveUid
50
+ : typeof process.getuid === 'function'
51
+ ? process.getuid()
52
+ : 10001;
53
+ if (uid === 0 && !allowRoot) {
54
+ throw new Error(`Refusing to start render worker as root (uid=0). Set ${RENDER_WORKER_ENV.AllowRoot}=1 only in trusted test environments.`);
55
+ }
56
+ }
57
+ /**
58
+ * Redirects `console.log` and `console.info` to `process.stderr` so third-party libraries
59
+ * cannot pollute stdout after the `VIDEO_STUDIO_RENDER_WORKER_PORT=<port>` handshake line.
60
+ */
61
+ export function RedirectConsoleStdoutToStderr() {
62
+ const writeStderr = (...args) => {
63
+ process.stderr.write(`${formatUtil(...args)}\n`);
64
+ };
65
+ console.log = writeStderr;
66
+ console.info = writeStderr;
67
+ }
68
+ /**
69
+ * Starts the HTTP render worker using `RENDER_WORKER_ENV`, writes
70
+ * `VIDEO_STUDIO_RENDER_WORKER_PORT=<port>` to stdout once listening, and returns the server handle.
71
+ */
72
+ export async function StartRenderWorkerFromEnv(options = {}) {
73
+ process.env.DO_NOT_TRACK = '1';
74
+ process.env.HYPERFRAMES_NO_TELEMETRY = '1';
75
+ const config = ParseRenderWorkerEnv(options.Env);
76
+ AssertNonRootUser(config.AllowRoot, options.EffectiveUid);
77
+ const backend = options.Backend ?? new HyperFramesRenderBackend();
78
+ const server = CreateRenderWorkerServer({
79
+ Backend: backend,
80
+ Host: config.Host,
81
+ Port: config.Port,
82
+ Token: config.Token,
83
+ BearerToken: config.Token,
84
+ MaxBodyBytes: config.MaxBodyBytes,
85
+ Concurrency: config.Concurrency,
86
+ MaxTimeoutMs: config.MaxTimeoutMs,
87
+ });
88
+ const boundPort = await server.Listen(config.Port, config.Host);
89
+ const writeLine = options.WriteStdoutLine ?? ((line) => void process.stdout.write(`${line}\n`));
90
+ writeLine(`${RENDER_WORKER_PORT_PREFIX}${boundPort}`);
91
+ RedirectConsoleStdoutToStderr();
92
+ return server;
93
+ }
94
+ function isStdinPipeOrSocket() {
95
+ try {
96
+ const stdinStat = fs.fstatSync(0);
97
+ return stdinStat.isFIFO() || stdinStat.isSocket();
98
+ }
99
+ catch {
100
+ return false;
101
+ }
102
+ }
103
+ async function runOneShotCliEntrypoint(argv) {
104
+ process.env.DO_NOT_TRACK = '1';
105
+ process.env.HYPERFRAMES_NO_TELEMETRY = '1';
106
+ const config = ParseRenderWorkerEnv(process.env);
107
+ AssertNonRootUser(config.AllowRoot);
108
+ RedirectConsoleStdoutToStderr();
109
+ const backend = new HyperFramesRenderBackend();
110
+ const abortController = new AbortController();
111
+ const isPipedStdin = isStdinPipeOrSocket();
112
+ let stdinClosedEarly = false;
113
+ const onSignal = () => {
114
+ abortController.abort();
115
+ };
116
+ process.once('SIGINT', onSignal);
117
+ process.once('SIGTERM', onSignal);
118
+ const onStdinClosed = () => {
119
+ stdinClosedEarly = true;
120
+ abortController.abort();
121
+ };
122
+ if (isPipedStdin) {
123
+ process.stdin.once('end', onStdinClosed);
124
+ process.stdin.once('close', onStdinClosed);
125
+ process.stdin.resume();
126
+ }
127
+ let exitCode = 1;
128
+ try {
129
+ exitCode = await RunOneShot(argv, backend, process.stdout, {
130
+ Stderr: process.stderr,
131
+ Stdin: isPipedStdin ? process.stdin : undefined,
132
+ Signal: abortController.signal,
133
+ });
134
+ }
135
+ finally {
136
+ if (isPipedStdin) {
137
+ process.stdin.removeListener('end', onStdinClosed);
138
+ process.stdin.removeListener('close', onStdinClosed);
139
+ process.stdin.pause();
140
+ }
141
+ await backend.Shutdown().catch(() => undefined);
142
+ if (stdinClosedEarly && process.pid > 1) {
143
+ // If our piped stdin closed while the job was still running (e.g. MJAPI died or
144
+ // docker exec -i was terminated), also signal PID 1 so a detached --rm container
145
+ // stops immediately instead of lingering.
146
+ try {
147
+ process.kill(1, 'SIGTERM');
148
+ }
149
+ catch {
150
+ // Best-effort when running inside a per-run container.
151
+ }
152
+ }
153
+ }
154
+ process.exit(exitCode);
155
+ }
156
+ async function runCliEntrypoint() {
157
+ try {
158
+ process.env.DO_NOT_TRACK = '1';
159
+ process.env.HYPERFRAMES_NO_TELEMETRY = '1';
160
+ if (process.argv[2] === 'run') {
161
+ await runOneShotCliEntrypoint(process.argv.slice(2));
162
+ return;
163
+ }
164
+ const backend = new HyperFramesRenderBackend();
165
+ const server = await StartRenderWorkerFromEnv({ Backend: backend });
166
+ let shuttingDown = false;
167
+ const shutdown = async () => {
168
+ if (shuttingDown) {
169
+ return;
170
+ }
171
+ shuttingDown = true;
172
+ await server.Close().catch(() => undefined);
173
+ await backend.Shutdown().catch(() => undefined);
174
+ process.exit(0);
175
+ };
176
+ process.once('SIGINT', () => void shutdown());
177
+ process.once('SIGTERM', () => void shutdown());
178
+ if (isStdinPipeOrSocket()) {
179
+ process.stdin.once('end', () => void shutdown());
180
+ process.stdin.once('close', () => void shutdown());
181
+ process.stdin.resume();
182
+ }
183
+ }
184
+ catch (error) {
185
+ const message = error instanceof Error ? error.message : String(error);
186
+ process.stderr.write(`${message}\n`);
187
+ process.exit(1);
188
+ }
189
+ }
190
+ const isExecutedDirectly = typeof process.argv[1] === 'string' &&
191
+ import.meta.url === pathToFileURL(process.argv[1]).href;
192
+ if (isExecutedDirectly) {
193
+ void runCliEntrypoint();
194
+ }
195
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { type RenderBackend } from './backend.js';
2
+ /** Supported operation names for `main.js run <op>`. */
3
+ export declare const ONE_SHOT_OPERATIONS: readonly ["render", "stills", "contact-sheet", "check", "keyframes", "health"];
4
+ /** Union of valid one-shot CLI operation names. */
5
+ export type OneShotOperation = (typeof ONE_SHOT_OPERATIONS)[number];
6
+ /** Usage message written to stderr when CLI arguments are invalid (exit code 2). */
7
+ export declare const ONE_SHOT_USAGE = "Usage: main.js run <render|stills|contact-sheet|check|keyframes|health> --request <file> --out <dir>\n";
8
+ /**
9
+ * Optional configuration for `RunOneShot`.
10
+ */
11
+ export interface RunOneShotOptions {
12
+ /** Optional stderr writer for usage messages (defaults to `process.stderr`). */
13
+ Stderr?: {
14
+ write(chunk: string): unknown;
15
+ };
16
+ /**
17
+ * Optional readable stdin stream. When this pipe emits `end` or `close` while the
18
+ * operation is in flight, the job's `AbortSignal` is triggered immediately.
19
+ */
20
+ Stdin?: NodeJS.ReadableStream;
21
+ /** Optional external cancellation signal. */
22
+ Signal?: AbortSignal;
23
+ /** Optional temporary directory root forwarded to `Run*Job`. */
24
+ TempRoot?: string;
25
+ }
26
+ /**
27
+ * Executes a single render-worker operation from files on disk (`--request <file> --out <dir>`),
28
+ * streaming `RenderStreamEvent` `Progress` JSON lines to `stdout` for `render`, writing the
29
+ * operation output to `<out>/result.json` (plus `<out>/video.mp4` for `render`), or writing
30
+ * `<out>/error.json` (`RenderWorkerErrorBody`) on failure.
31
+ *
32
+ * @returns Exit code: `0` on success, `1` on job/runtime failure, `2` on invalid CLI arguments.
33
+ */
34
+ export declare function RunOneShot(argv: readonly string[], backend: RenderBackend, stdout?: {
35
+ write(chunk: string): unknown;
36
+ }, options?: RunOneShotOptions): Promise<number>;
37
+ //# sourceMappingURL=one-shot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"one-shot.d.ts","sourceRoot":"","sources":["../src/one-shot.ts"],"names":[],"mappings":"AAWA,OAAO,EAAqB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAUrE,wDAAwD;AACxD,eAAO,MAAM,mBAAmB,gFAOtB,CAAC;AAEX,mDAAmD;AACnD,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,oFAAoF;AACpF,eAAO,MAAM,cAAc,2GACiF,CAAC;AAE7G;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B,gFAAgF;IAChF,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAC3C;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B,6CAA6C;IAC7C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAQD;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC5B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,aAAa,EACtB,MAAM,GAAE;IAAE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;CAAmB,EAC1D,OAAO,GAAE,iBAAsB,GAChC,OAAO,CAAC,MAAM,CAAC,CAkJjB"}
@@ -0,0 +1,228 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import * as path from 'node:path';
3
+ import { RenderWorkerError } from './backend.js';
4
+ import { GetWorkerHealth, RunCheckJob, RunContactSheetJob, RunKeyframesJob, RunRenderJob, RunStillsJob, } from './jobs.js';
5
+ /** Supported operation names for `main.js run <op>`. */
6
+ export const ONE_SHOT_OPERATIONS = [
7
+ 'render',
8
+ 'stills',
9
+ 'contact-sheet',
10
+ 'check',
11
+ 'keyframes',
12
+ 'health',
13
+ ];
14
+ /** Usage message written to stderr when CLI arguments are invalid (exit code 2). */
15
+ export const ONE_SHOT_USAGE = 'Usage: main.js run <render|stills|contact-sheet|check|keyframes|health> --request <file> --out <dir>\n';
16
+ /**
17
+ * Executes a single render-worker operation from files on disk (`--request <file> --out <dir>`),
18
+ * streaming `RenderStreamEvent` `Progress` JSON lines to `stdout` for `render`, writing the
19
+ * operation output to `<out>/result.json` (plus `<out>/video.mp4` for `render`), or writing
20
+ * `<out>/error.json` (`RenderWorkerErrorBody`) on failure.
21
+ *
22
+ * @returns Exit code: `0` on success, `1` on job/runtime failure, `2` on invalid CLI arguments.
23
+ */
24
+ export async function RunOneShot(argv, backend, stdout = process.stdout, options = {}) {
25
+ const stderr = options.Stderr ?? process.stderr;
26
+ const parsedArgs = parseOneShotArgs(argv);
27
+ if (!parsedArgs) {
28
+ stderr.write(ONE_SHOT_USAGE);
29
+ return 2;
30
+ }
31
+ const { Operation: op, RequestPath: requestPath, OutDir: outDir } = parsedArgs;
32
+ try {
33
+ await fs.mkdir(outDir, { recursive: true });
34
+ }
35
+ catch (error) {
36
+ const message = error instanceof Error ? error.message : String(error);
37
+ stderr.write(`Failed to create output directory "${outDir}": ${message}\n`);
38
+ return 1;
39
+ }
40
+ const controller = new AbortController();
41
+ const onExternalAbort = () => {
42
+ controller.abort(options.Signal?.reason);
43
+ };
44
+ if (options.Signal) {
45
+ if (options.Signal.aborted) {
46
+ controller.abort(options.Signal.reason);
47
+ }
48
+ else {
49
+ options.Signal.addEventListener('abort', onExternalAbort, { once: true });
50
+ }
51
+ }
52
+ const onStdinClosed = () => {
53
+ if (!controller.signal.aborted) {
54
+ controller.abort(new RenderWorkerError('Cancelled', 'One-shot worker stdin pipe closed.'));
55
+ }
56
+ };
57
+ if (options.Stdin) {
58
+ options.Stdin.once('end', onStdinClosed);
59
+ options.Stdin.once('close', onStdinClosed);
60
+ options.Stdin.resume();
61
+ }
62
+ try {
63
+ throwIfAborted(controller.signal);
64
+ if (op === 'health') {
65
+ if (requestPath !== undefined) {
66
+ await readRequestJson(requestPath);
67
+ }
68
+ throwIfAborted(controller.signal);
69
+ const health = await GetWorkerHealth(backend);
70
+ throwIfAborted(controller.signal);
71
+ await writeJsonFile(path.join(outDir, 'result.json'), health);
72
+ return 0;
73
+ }
74
+ const rawRequest = await readRequestJson(requestPath);
75
+ throwIfAborted(controller.signal);
76
+ switch (op) {
77
+ case 'render': {
78
+ const renderResult = await RunRenderJob(rawRequest, backend, (progress) => {
79
+ const event = { Type: 'Progress', Progress: progress };
80
+ stdout.write(`${JSON.stringify(event)}\n`);
81
+ }, controller.signal, { TempRoot: options.TempRoot });
82
+ const videoFilename = 'video.mp4';
83
+ await fs.writeFile(path.join(outDir, videoFilename), renderResult.Video);
84
+ const metadata = {
85
+ Format: renderResult.Format,
86
+ VideoID: videoFilename,
87
+ VideoSizeBytes: renderResult.Video.byteLength,
88
+ MimeType: renderResult.MimeType,
89
+ Width: renderResult.Width,
90
+ Height: renderResult.Height,
91
+ Fps: renderResult.Fps,
92
+ DurationSeconds: renderResult.DurationSeconds,
93
+ FrameCount: renderResult.FrameCount,
94
+ HasAudio: renderResult.HasAudio,
95
+ RendererVersion: renderResult.RendererVersion,
96
+ RenderDurationMs: renderResult.RenderDurationMs,
97
+ };
98
+ await writeJsonFile(path.join(outDir, 'result.json'), metadata);
99
+ return 0;
100
+ }
101
+ case 'stills': {
102
+ const stillsResult = await RunStillsJob(rawRequest, backend, controller.signal, { TempRoot: options.TempRoot });
103
+ await writeJsonFile(path.join(outDir, 'result.json'), stillsResult);
104
+ return 0;
105
+ }
106
+ case 'contact-sheet': {
107
+ const contactSheetResult = await RunContactSheetJob(rawRequest, backend, controller.signal, { TempRoot: options.TempRoot });
108
+ await writeJsonFile(path.join(outDir, 'result.json'), contactSheetResult);
109
+ return 0;
110
+ }
111
+ case 'check': {
112
+ const checkResult = await RunCheckJob(rawRequest, backend, controller.signal, { TempRoot: options.TempRoot });
113
+ await writeJsonFile(path.join(outDir, 'result.json'), checkResult);
114
+ return 0;
115
+ }
116
+ case 'keyframes': {
117
+ const keyframeResult = await RunKeyframesJob(rawRequest, backend, controller.signal, { TempRoot: options.TempRoot });
118
+ await writeJsonFile(path.join(outDir, 'result.json'), keyframeResult);
119
+ return 0;
120
+ }
121
+ }
122
+ }
123
+ catch (error) {
124
+ const workerError = toRenderWorkerError(error, controller.signal);
125
+ await writeJsonFile(path.join(outDir, 'error.json'), workerError.ToBody()).catch(() => undefined);
126
+ return 1;
127
+ }
128
+ finally {
129
+ if (options.Signal) {
130
+ options.Signal.removeEventListener('abort', onExternalAbort);
131
+ }
132
+ if (options.Stdin) {
133
+ options.Stdin.removeListener('end', onStdinClosed);
134
+ options.Stdin.removeListener('close', onStdinClosed);
135
+ }
136
+ }
137
+ }
138
+ function parseOneShotArgs(argv) {
139
+ const tokens = argv[0] === 'run' ? argv.slice(1) : argv;
140
+ if (tokens.length === 0) {
141
+ return null;
142
+ }
143
+ const opCandidate = tokens[0];
144
+ if (!isOneShotOperation(opCandidate)) {
145
+ return null;
146
+ }
147
+ let requestPath;
148
+ let outDir;
149
+ let i = 1;
150
+ while (i < tokens.length) {
151
+ const flag = tokens[i];
152
+ const value = tokens[i + 1];
153
+ if (flag === '--request') {
154
+ if (!value || value.startsWith('--') || requestPath !== undefined) {
155
+ return null;
156
+ }
157
+ requestPath = value;
158
+ i += 2;
159
+ }
160
+ else if (flag === '--out') {
161
+ if (!value || value.startsWith('--') || outDir !== undefined) {
162
+ return null;
163
+ }
164
+ outDir = value;
165
+ i += 2;
166
+ }
167
+ else {
168
+ return null;
169
+ }
170
+ }
171
+ if (!outDir || outDir.trim().length === 0) {
172
+ return null;
173
+ }
174
+ if (opCandidate !== 'health' && (!requestPath || requestPath.trim().length === 0)) {
175
+ return null;
176
+ }
177
+ return {
178
+ Operation: opCandidate,
179
+ RequestPath: requestPath,
180
+ OutDir: outDir,
181
+ };
182
+ }
183
+ function isOneShotOperation(value) {
184
+ return (value !== undefined &&
185
+ ONE_SHOT_OPERATIONS.includes(value));
186
+ }
187
+ async function readRequestJson(requestPath) {
188
+ let raw;
189
+ try {
190
+ raw = await fs.readFile(requestPath, 'utf8');
191
+ }
192
+ catch (error) {
193
+ const message = error instanceof Error ? error.message : String(error);
194
+ throw new RenderWorkerError('InvalidRequest', `Unable to read request file "${requestPath}": ${message}`);
195
+ }
196
+ try {
197
+ return JSON.parse(raw);
198
+ }
199
+ catch (error) {
200
+ const message = error instanceof Error ? error.message : String(error);
201
+ throw new RenderWorkerError('InvalidRequest', `Invalid JSON in request file "${requestPath}": ${message}`);
202
+ }
203
+ }
204
+ async function writeJsonFile(filePath, payload) {
205
+ await fs.writeFile(filePath, JSON.stringify(payload), 'utf8');
206
+ }
207
+ function throwIfAborted(signal) {
208
+ if (!signal.aborted) {
209
+ return;
210
+ }
211
+ if (signal.reason instanceof RenderWorkerError) {
212
+ throw signal.reason;
213
+ }
214
+ throw new RenderWorkerError('Cancelled', 'One-shot worker operation was cancelled.');
215
+ }
216
+ function toRenderWorkerError(error, signal) {
217
+ if (error instanceof RenderWorkerError) {
218
+ return error;
219
+ }
220
+ if (signal.aborted) {
221
+ if (signal.reason instanceof RenderWorkerError) {
222
+ return signal.reason;
223
+ }
224
+ return new RenderWorkerError('Cancelled', error instanceof Error ? error.message : 'One-shot worker operation was cancelled.');
225
+ }
226
+ return new RenderWorkerError('Internal', error instanceof Error ? error.message : String(error));
227
+ }
228
+ //# sourceMappingURL=one-shot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"one-shot.js","sourceRoot":"","sources":["../src/one-shot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import type { RenderProjectBundle, VideoFormat } from '@memberjunction/video-studio-core';
2
+ /**
3
+ * Strict Content-Security-Policy injected into every staged HTML file (Decision 3).
4
+ *
5
+ * Blocks all external network egress (`connect-src 'none'`, `frame-src 'none'`, `worker-src 'none'`,
6
+ * `object-src 'none'`, `base-uri 'none'`, `form-action 'none'`) while allowing local bundle files
7
+ * (`'self'`), `data:` / `blob:` URIs, and inline composition scripts/styles.
8
+ */
9
+ export declare const COMPOSITION_CSP: string;
10
+ /**
11
+ * Options used to construct the injected `window.MJVideo` runtime preamble.
12
+ */
13
+ export interface PreambleRuntimeOptions {
14
+ /** Bound data snapshot exposed at `window.MJVideo.Data`. */
15
+ DataSnapshot: Record<string, unknown>;
16
+ /** Integer seed exposed at `window.MJVideo.Seed`. */
17
+ Seed: number;
18
+ /** Target video aspect-ratio format. */
19
+ Format: VideoFormat;
20
+ /** Output frame width in pixels. */
21
+ Width: number;
22
+ /** Output frame height in pixels. */
23
+ Height: number;
24
+ /** Output frame rate in frames per second. */
25
+ Fps: number;
26
+ /** Optional composition duration in seconds. */
27
+ DurationSeconds?: number;
28
+ }
29
+ /**
30
+ * Default SIL OFL font families bundled in the RenderWorker package (`assets/fonts/`)
31
+ * under `MJ Sans` (`Inter-Regular.ttf`) and `MJ Mono` (`JetBrainsMono-Regular.ttf`) so
32
+ * HyperFrames' font compiler never maps them to Google Fonts and compositions render
33
+ * deterministically offline with `FontIsBundled: true` (VS-RND-5 Decision 4 / Round 1).
34
+ */
35
+ export declare const BUNDLED_DEFAULT_FONTS: readonly ["MJ Sans", "MJ Mono"];
36
+ /**
37
+ * Builds the `<meta http-equiv="Content-Security-Policy">` tag injected into every `.html` file.
38
+ */
39
+ export declare function BuildCspMetaTag(): string;
40
+ /**
41
+ * Builds the `<style data-mj-default-fonts>` tag registering the worker's bundled `MJ Sans`
42
+ * (`Inter-Regular.ttf`) and `MJ Mono` (`JetBrainsMono-Regular.ttf`) `@font-face` rules served from `/__mj_fonts/`.
43
+ */
44
+ export declare function BuildDefaultFontsStyleTag(): string;
45
+ /**
46
+ * Escapes a JSON string for safe embedding inside an HTML `<script>` element (`<`, `>`, U+2028, U+2029).
47
+ */
48
+ export declare function EscapeJsonForInlineScript(value: unknown): string;
49
+ /**
50
+ * Builds the inline JavaScript source that defines a frozen `window.MJVideo: MJVideoRuntime`,
51
+ * replaces `Math.random` with `MJVideo.Random`, and hooks HyperFrames' `window.__hf.seek`.
52
+ */
53
+ export declare function BuildPreambleScript(options: PreambleRuntimeOptions): string;
54
+ /**
55
+ * Injects the CSP `<meta>` tag, bundled default `@font-face` `<style>`, and the `window.MJVideo`
56
+ * inline `<script>` right after `<!doctype ...>` (or at byte 0 when no doctype is present).
57
+ * The preamble is collapsed onto a single line so line numbers in staged HTML remain unchanged.
58
+ */
59
+ export declare function InjectPreambleIntoHtml(html: string, options: PreambleRuntimeOptions): string;
60
+ /**
61
+ * Convenience helper constructing `PreambleRuntimeOptions` from a `RenderProjectBundle` plus frame geometry.
62
+ */
63
+ export declare function BuildPreambleOptionsFromBundle(bundle: RenderProjectBundle, geometry?: {
64
+ Width?: number;
65
+ Height?: number;
66
+ Fps?: number;
67
+ DurationSeconds?: number;
68
+ }): PreambleRuntimeOptions;
69
+ //# sourceMappingURL=preamble.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preamble.d.ts","sourceRoot":"","sources":["../src/preamble.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAE1F;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,QAUhB,CAAC;AAEb;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,MAAM,EAAE,WAAW,CAAC;IACpB,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,iCAAkC,CAAC;AAErE;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAOlD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAOhE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,CAuO3E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,GAAG,MAAM,CAa5F;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC1C,MAAM,EAAE,mBAAmB,EAC3B,QAAQ,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GACvF,sBAAsB,CAWxB"}