@meframe/server 0.0.2 → 0.0.4

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 (51) hide show
  1. package/dist/cjs/ServerExporter.cjs.js +16 -0
  2. package/dist/cjs/ServerExporter.cjs.js.map +1 -0
  3. package/dist/cjs/ServerExporterBase.js +299 -0
  4. package/dist/cjs/ServerExporterBase.js.map +1 -0
  5. package/dist/cjs/index.cjs.js +6 -0
  6. package/dist/cjs/index.cjs.js.map +1 -0
  7. package/dist/cjs/package.json +3 -0
  8. package/dist/cjs/runner/runner.js +76 -0
  9. package/dist/cjs/runner/runner.js.map +1 -0
  10. package/dist/cjs/types.js +3 -0
  11. package/dist/cjs/types.js.map +1 -0
  12. package/dist/cjs/utils/abort-gate.js +52 -0
  13. package/dist/cjs/utils/abort-gate.js.map +1 -0
  14. package/dist/esm/ServerExporter.d.ts +5 -0
  15. package/dist/esm/ServerExporter.d.ts.map +1 -0
  16. package/dist/esm/ServerExporter.js +8 -0
  17. package/dist/esm/ServerExporter.js.map +1 -0
  18. package/dist/{ServerExporter.d.ts → esm/ServerExporterBase.d.ts} +5 -2
  19. package/dist/esm/ServerExporterBase.d.ts.map +1 -0
  20. package/dist/{ServerExporter.js → esm/ServerExporterBase.js} +113 -72
  21. package/dist/esm/ServerExporterBase.js.map +1 -0
  22. package/dist/esm/index.d.ts.map +1 -0
  23. package/dist/esm/index.js.map +1 -0
  24. package/dist/{runner → esm/runner}/runner.d.ts +0 -1
  25. package/dist/esm/runner/runner.d.ts.map +1 -0
  26. package/dist/{runner → esm/runner}/runner.js +27 -5
  27. package/dist/esm/runner/runner.js.map +1 -0
  28. package/dist/{types.d.ts → esm/types.d.ts} +5 -0
  29. package/dist/esm/types.d.ts.map +1 -0
  30. package/dist/esm/types.js.map +1 -0
  31. package/dist/esm/utils/abort-gate.d.ts +10 -0
  32. package/dist/esm/utils/abort-gate.d.ts.map +1 -0
  33. package/dist/esm/utils/abort-gate.js +45 -0
  34. package/dist/esm/utils/abort-gate.js.map +1 -0
  35. package/dist/runner-browser/runner.mjs +2220 -1990
  36. package/package.json +12 -10
  37. package/dist/ServerExporter.d.ts.map +0 -1
  38. package/dist/ServerExporter.js.map +0 -1
  39. package/dist/index.d.ts.map +0 -1
  40. package/dist/index.js.map +0 -1
  41. package/dist/runner/runner-browser.d.ts +0 -21
  42. package/dist/runner/runner-browser.d.ts.map +0 -1
  43. package/dist/runner/runner-browser.js +0 -223
  44. package/dist/runner/runner-browser.js.map +0 -1
  45. package/dist/runner/runner.d.ts.map +0 -1
  46. package/dist/runner/runner.js.map +0 -1
  47. package/dist/types.d.ts.map +0 -1
  48. package/dist/types.js.map +0 -1
  49. /package/dist/{index.d.ts → esm/index.d.ts} +0 -0
  50. /package/dist/{index.js → esm/index.js} +0 -0
  51. /package/dist/{types.js → esm/types.js} +0 -0
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ServerExporter = void 0;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const ServerExporterBase_js_1 = require("./ServerExporterBase.js");
9
+ class ServerExporter extends ServerExporterBase_js_1.ServerExporterBase {
10
+ getRunnerModuleFile() {
11
+ // CJS build outputs to dist/cjs, while the runner bundle is at dist/runner-browser/runner.mjs
12
+ return node_path_1.default.resolve(__dirname, '../runner-browser/runner.mjs');
13
+ }
14
+ }
15
+ exports.ServerExporter = ServerExporter;
16
+ //# sourceMappingURL=ServerExporter.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerExporter.cjs.js","sourceRoot":"","sources":["../../src/ServerExporter.cjs.ts"],"names":[],"mappings":";;;;;;AAAA,0DAA6B;AAE7B,mEAA6D;AAE7D,MAAa,cAAe,SAAQ,0CAAkB;IAC1C,mBAAmB;QAC3B,8FAA8F;QAC9F,OAAO,mBAAI,CAAC,OAAO,CAAC,SAAS,EAAE,8BAA8B,CAAC,CAAC;IACjE,CAAC;CACF;AALD,wCAKC"}
@@ -0,0 +1,299 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ServerExporterBase = void 0;
7
+ const node_crypto_1 = __importDefault(require("node:crypto"));
8
+ const promises_1 = __importDefault(require("node:fs/promises"));
9
+ const node_os_1 = __importDefault(require("node:os"));
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ const puppeteer_core_1 = require("puppeteer-core");
12
+ const runner_js_1 = require("./runner/runner.js");
13
+ const abort_gate_js_1 = require("./utils/abort-gate.js");
14
+ class ServerExporterBase {
15
+ store;
16
+ options;
17
+ maxJobs;
18
+ activeJobs = 0;
19
+ waiters = [];
20
+ runnerModuleCodePromise = null;
21
+ constructor(options) {
22
+ this.store = options.store;
23
+ this.options = options;
24
+ this.maxJobs = options.concurrency?.maxJobs ?? 1;
25
+ if (typeof options.runner?.moduleCode === 'string') {
26
+ this.runnerModuleCodePromise = Promise.resolve(options.runner.moduleCode);
27
+ }
28
+ }
29
+ createAbortError(message = 'Export aborted') {
30
+ return (0, abort_gate_js_1.createAbortError)(message);
31
+ }
32
+ async abortMultipartUploadBestEffort(input) {
33
+ if (!input.uploadId)
34
+ return;
35
+ try {
36
+ await this.store.abortMultipartUpload({ key: input.key, uploadId: input.uploadId });
37
+ }
38
+ catch (abortErr) {
39
+ input.logger.warn('[ServerExporter] abort failed', abortErr);
40
+ }
41
+ }
42
+ async acquireSlot(abortSignal) {
43
+ if (abortSignal?.aborted) {
44
+ throw this.createAbortError();
45
+ }
46
+ if (this.activeJobs < this.maxJobs) {
47
+ this.activeJobs += 1;
48
+ return;
49
+ }
50
+ await new Promise((resolve, reject) => {
51
+ const waiter = { resolve, reject, abortSignal };
52
+ if (abortSignal) {
53
+ const abortListener = () => {
54
+ const idx = this.waiters.indexOf(waiter);
55
+ if (idx >= 0)
56
+ this.waiters.splice(idx, 1);
57
+ abortSignal.removeEventListener('abort', abortListener);
58
+ reject(this.createAbortError());
59
+ };
60
+ waiter.abortListener = abortListener;
61
+ abortSignal.addEventListener('abort', abortListener, { once: true });
62
+ }
63
+ this.waiters.push(waiter);
64
+ });
65
+ this.activeJobs += 1;
66
+ }
67
+ releaseSlot() {
68
+ this.activeJobs -= 1;
69
+ const next = this.waiters.shift();
70
+ if (next) {
71
+ if (next.abortSignal && next.abortListener) {
72
+ next.abortSignal.removeEventListener('abort', next.abortListener);
73
+ }
74
+ next.resolve();
75
+ }
76
+ }
77
+ async exportToStore(input) {
78
+ await this.acquireSlot(input.abortSignal);
79
+ const jobId = node_crypto_1.default.randomUUID();
80
+ const logger = this.options.logger ?? console;
81
+ const t0 = Date.now();
82
+ const log = (message, extra) => {
83
+ const elapsedMs = Date.now() - t0;
84
+ if (extra) {
85
+ logger.info(`[ServerExporter][${jobId}][${elapsedMs}ms] ${message}`, extra);
86
+ }
87
+ else {
88
+ logger.info(`[ServerExporter][${jobId}][${elapsedMs}ms] ${message}`);
89
+ }
90
+ };
91
+ const partSizeBytes = this.options.upload?.partSizeBytes ?? 8 * 1024 * 1024;
92
+ const contentType = this.options.upload?.contentType ?? 'video/mp4';
93
+ const partUrlExpiresInSeconds = this.options.upload?.partUrlExpiresInSeconds ?? 600;
94
+ if (partSizeBytes < 5 * 1024 * 1024) {
95
+ throw new Error('upload.partSizeBytes must be >= 5 MiB for multipart upload');
96
+ }
97
+ const key = input.key ??
98
+ `${this.normalizeKeyPrefix(this.options.upload?.keyPrefix)}` +
99
+ `${new Date().toISOString().replace(/[:.]/g, '-')}-${jobId}.mp4`;
100
+ let browser = null;
101
+ let page = null;
102
+ let uploadId = null;
103
+ let userDataDir = null;
104
+ let abortedByUser = false;
105
+ const { abortPromise, dispose: disposeAbortGate } = (0, abort_gate_js_1.createAbortGate)(input.abortSignal, () => {
106
+ abortedByUser = true;
107
+ // Hard-stop the page so the job can exit quickly (runner promise rejects on page close).
108
+ void page?.close({ runBeforeUnload: false }).catch(() => { });
109
+ });
110
+ try {
111
+ log('Preparing job', {
112
+ key,
113
+ partSizeBytes,
114
+ headless: this.options.browser?.headless ?? true,
115
+ executablePath: this.options.browser?.executablePath,
116
+ });
117
+ (0, abort_gate_js_1.throwIfAborted)(input.abortSignal);
118
+ userDataDir = await promises_1.default.mkdtemp(node_path_1.default.join(this.options.browser?.userDataDirBase ?? node_os_1.default.tmpdir(), 'meframe-server-'));
119
+ log('Created userDataDir', { userDataDir });
120
+ (0, abort_gate_js_1.throwIfAborted)(input.abortSignal);
121
+ const uploadInit = await this.store.createMultipartUpload({
122
+ key,
123
+ contentType,
124
+ metadata: input.metadata,
125
+ });
126
+ uploadId = uploadInit.uploadId;
127
+ if (!uploadId) {
128
+ throw new Error('Failed to create multipart upload');
129
+ }
130
+ log('Multipart upload created', { uploadId });
131
+ const parts = [];
132
+ const onProgress = (evt) => {
133
+ this.options.onProgress?.({ jobId, ...evt });
134
+ };
135
+ log('Loading runner bundle...');
136
+ (0, abort_gate_js_1.throwIfAborted)(input.abortSignal);
137
+ const runnerModuleCode = await this.getRunnerModuleCode();
138
+ log('Runner bundle loaded', { bytes: runnerModuleCode.length });
139
+ log('Launching browser...');
140
+ (0, abort_gate_js_1.throwIfAborted)(input.abortSignal);
141
+ browser = await (0, puppeteer_core_1.launch)({
142
+ headless: this.options.browser?.headless ?? true,
143
+ executablePath: this.options.browser?.executablePath,
144
+ args: this.options.browser?.launchArgs,
145
+ userDataDir,
146
+ });
147
+ log('Browser launched');
148
+ log('Creating page...');
149
+ (0, abort_gate_js_1.throwIfAborted)(input.abortSignal);
150
+ page = await browser.newPage();
151
+ log('Page created');
152
+ // Forward runner logs / errors to Node side for observability.
153
+ page.on('console', (msg) => logger.info(`[runner:console][${jobId}][${msg?.type?.() ?? 'log'}]`, msg.text()));
154
+ page.on('pageerror', (err) => logger.error(`[runner:pageerror][${jobId}]`, err));
155
+ page.on('error', (err) => logger.error(`[runner:error][${jobId}]`, err));
156
+ page.on('requestfailed', (req) => {
157
+ const failure = req?.failure?.();
158
+ if (failure?.errorText === 'net::ERR_ABORTED')
159
+ return;
160
+ logger.warn(`[runner:requestfailed][${jobId}]`, {
161
+ url: req?.url?.(),
162
+ method: req?.method?.(),
163
+ failure,
164
+ });
165
+ });
166
+ log('Running export in page...');
167
+ await Promise.race([
168
+ (0, runner_js_1.runExportInPage)(page, {
169
+ requestPartUrl: async (partNumber) => this.store.getUploadPartUrl({
170
+ key,
171
+ uploadId: uploadId,
172
+ partNumber,
173
+ expiresInSeconds: partUrlExpiresInSeconds,
174
+ }),
175
+ reportPartDone: async (partNumber, etag) => {
176
+ const normalizedEtag = etag.replaceAll('"', '');
177
+ parts.push({ partNumber, etag: normalizedEtag });
178
+ },
179
+ reportProgress: async (event) => onProgress(event),
180
+ reportError: async (message) => {
181
+ throw new Error(message);
182
+ },
183
+ reportComplete: async (_totalBytes) => {
184
+ // no-op, completion handled after runner resolves
185
+ },
186
+ }, {
187
+ model: input.model,
188
+ exportOptions: input.exportOptions ?? {},
189
+ partSizeBytes,
190
+ uploadId: uploadId,
191
+ key,
192
+ runnerModuleCode,
193
+ pageUrl: input.pageUrl,
194
+ workerPath: input.workerPath,
195
+ }),
196
+ abortPromise,
197
+ ]);
198
+ log('Runner resolved');
199
+ parts.sort((a, b) => a.partNumber - b.partNumber);
200
+ this.assertPartsValid(parts);
201
+ log('Completing multipart upload...', { parts: parts.length });
202
+ await this.store.completeMultipartUpload({ key, uploadId: uploadId, parts });
203
+ log('Export completed', { key });
204
+ return { key };
205
+ }
206
+ catch (error) {
207
+ const isAbort = abortedByUser ||
208
+ input.abortSignal?.aborted === true ||
209
+ error instanceof abort_gate_js_1.AbortError ||
210
+ (error instanceof DOMException && error.name === 'AbortError') ||
211
+ (error instanceof Error && error.name === 'AbortError');
212
+ if (isAbort) {
213
+ logger.info('[ServerExporter] export aborted');
214
+ }
215
+ else {
216
+ logger.error('[ServerExporter] export failed', error);
217
+ }
218
+ await this.abortMultipartUploadBestEffort({ key, uploadId, logger });
219
+ if (isAbort) {
220
+ throw this.createAbortError();
221
+ }
222
+ throw error;
223
+ }
224
+ finally {
225
+ disposeAbortGate();
226
+ // Cleanup order matters: Chromium may still be writing to the profile directory
227
+ // while closing. Close the browser first, then remove userDataDir.
228
+ if (browser) {
229
+ try {
230
+ await browser.close();
231
+ }
232
+ catch (e) {
233
+ logger.warn('[ServerExporter] cleanup failed', e);
234
+ }
235
+ }
236
+ if (userDataDir) {
237
+ try {
238
+ await promises_1.default.rm(userDataDir, { recursive: true, force: true });
239
+ }
240
+ catch (e) {
241
+ logger.warn('[ServerExporter] cleanup failed', e);
242
+ }
243
+ }
244
+ this.releaseSlot();
245
+ }
246
+ }
247
+ assertPartsValid(parts) {
248
+ if (parts.length === 0) {
249
+ throw new Error('No multipart parts were uploaded');
250
+ }
251
+ const seen = new Set();
252
+ for (let i = 0; i < parts.length; i++) {
253
+ const part = parts[i];
254
+ if (!Number.isInteger(part.partNumber) || part.partNumber <= 0) {
255
+ throw new Error(`Invalid partNumber: ${part.partNumber}`);
256
+ }
257
+ if (!part.etag) {
258
+ throw new Error(`Missing ETag for part ${part.partNumber}`);
259
+ }
260
+ if (seen.has(part.partNumber)) {
261
+ throw new Error(`Duplicate partNumber: ${part.partNumber}`);
262
+ }
263
+ seen.add(part.partNumber);
264
+ const expected = i + 1;
265
+ if (part.partNumber !== expected) {
266
+ throw new Error(`Non-contiguous parts: expected part ${expected}, got ${part.partNumber}`);
267
+ }
268
+ }
269
+ }
270
+ async getRunnerModuleCode() {
271
+ if (!this.runnerModuleCodePromise) {
272
+ const promise = (async () => {
273
+ const runnerModuleFile = this.getRunnerModuleFile();
274
+ try {
275
+ return await promises_1.default.readFile(runnerModuleFile, 'utf8');
276
+ }
277
+ catch (e) {
278
+ if (e && typeof e === 'object' && e.code === 'ENOENT') {
279
+ throw new Error('Runner bundle not found. Please build @meframe/server first (pnpm --filter @meframe/server build).');
280
+ }
281
+ throw e;
282
+ }
283
+ })();
284
+ // Only cache successful reads; allow retry if it fails.
285
+ this.runnerModuleCodePromise = promise.then((code) => code, (err) => {
286
+ this.runnerModuleCodePromise = null;
287
+ throw err;
288
+ });
289
+ }
290
+ return await this.runnerModuleCodePromise;
291
+ }
292
+ normalizeKeyPrefix(prefix) {
293
+ if (!prefix)
294
+ return 'exports/';
295
+ return prefix.endsWith('/') ? prefix : `${prefix}/`;
296
+ }
297
+ }
298
+ exports.ServerExporterBase = ServerExporterBase;
299
+ //# sourceMappingURL=ServerExporterBase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerExporterBase.js","sourceRoot":"","sources":["../../src/ServerExporterBase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ServerExporter = void 0;
4
+ var ServerExporter_cjs_js_1 = require("./ServerExporter.cjs.js");
5
+ Object.defineProperty(exports, "ServerExporter", { enumerable: true, get: function () { return ServerExporter_cjs_js_1.ServerExporter; } });
6
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","sourceRoot":"","sources":["../../src/index.cjs.ts"],"names":[],"mappings":";;;AAQA,iEAAyD;AAAhD,uHAAA,cAAc,OAAA"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runExportInPage = runExportInPage;
4
+ async function runExportInPage(page, bridge, params) {
5
+ const { model, exportOptions, partSizeBytes, uploadId, key, // reserved for future use (e.g., logging)
6
+ runnerModuleCode, pageUrl, workerPath, } = params;
7
+ let settled = false;
8
+ let doneResolve;
9
+ let doneReject;
10
+ const done = new Promise((resolve, reject) => {
11
+ doneResolve = () => {
12
+ if (settled)
13
+ return;
14
+ settled = true;
15
+ resolve();
16
+ };
17
+ doneReject = (err) => {
18
+ if (settled)
19
+ return;
20
+ settled = true;
21
+ reject(err);
22
+ };
23
+ });
24
+ // Ensure the promise settles if the page is closed / crashes.
25
+ const onPageClose = () => doneReject(new Error('Runner page closed'));
26
+ const onPageError = (err) => doneReject(err instanceof Error ? err : new Error(`Runner page error: ${String(err)}`));
27
+ page.once('close', onPageClose);
28
+ page.once('error', onPageError);
29
+ // Bridge functions exposed to the browser context
30
+ await page.exposeFunction('runnerRequestPartUrl', bridge.requestPartUrl);
31
+ await page.exposeFunction('runnerReportPartDone', bridge.reportPartDone);
32
+ await page.exposeFunction('runnerReportProgress', bridge.reportProgress);
33
+ await page.exposeFunction('runnerReportError', async (message) => {
34
+ doneReject(new Error(message));
35
+ await bridge.reportError(message).catch(() => { });
36
+ });
37
+ await page.exposeFunction('runnerReportComplete', async (totalBytes) => {
38
+ doneResolve();
39
+ await bridge.reportComplete(totalBytes).catch(() => { });
40
+ });
41
+ const runnerConfig = {
42
+ model,
43
+ exportOptions,
44
+ partSizeBytes,
45
+ uploadId,
46
+ key,
47
+ workerPath,
48
+ };
49
+ if (pageUrl) {
50
+ // Ensure a trustworthy origin so Web APIs like WebCodecs are available.
51
+ // e.g. http://127.0.0.1 is considered a secure context.
52
+ await page.goto(pageUrl, { waitUntil: 'domcontentloaded' });
53
+ }
54
+ // Avoid module import inside page.evaluate(). Use a module script to bootstrap the runner.
55
+ await page.setContent(`<!doctype html>
56
+ <html>
57
+ <head>
58
+ <meta charset="utf-8" />
59
+ <script>
60
+ window.__MEFRAME_RUNNER_CONFIG__ = ${JSON.stringify(runnerConfig)};
61
+ </script>
62
+ <script type="module">
63
+ ${runnerModuleCode}
64
+ </script>
65
+ </head>
66
+ <body></body>
67
+ </html>`);
68
+ try {
69
+ await done;
70
+ }
71
+ finally {
72
+ page.off('close', onPageClose);
73
+ page.off('error', onPageError);
74
+ }
75
+ }
76
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/runner/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AbortError = void 0;
4
+ exports.createAbortError = createAbortError;
5
+ exports.throwIfAborted = throwIfAborted;
6
+ exports.createAbortGate = createAbortGate;
7
+ class AbortError extends Error {
8
+ name = 'AbortError';
9
+ }
10
+ exports.AbortError = AbortError;
11
+ function createAbortError(message = 'Export aborted') {
12
+ return new AbortError(message);
13
+ }
14
+ function throwIfAborted(abortSignal) {
15
+ if (abortSignal?.aborted) {
16
+ throw createAbortError();
17
+ }
18
+ }
19
+ function createAbortGate(abortSignal, onAbort) {
20
+ if (!abortSignal) {
21
+ return { abortPromise: new Promise(() => { }), dispose: () => { } };
22
+ }
23
+ if (abortSignal.aborted) {
24
+ onAbort();
25
+ const abortPromise = Promise.reject(createAbortError());
26
+ // Prevent unhandled rejection if the job ends before this promise is awaited.
27
+ void abortPromise.catch(() => { });
28
+ return { abortPromise, dispose: () => { } };
29
+ }
30
+ let disposed = false;
31
+ let abortListener = null;
32
+ const abortPromise = new Promise((_, reject) => {
33
+ abortListener = () => {
34
+ if (disposed)
35
+ return;
36
+ onAbort();
37
+ reject(createAbortError());
38
+ };
39
+ abortSignal.addEventListener('abort', abortListener, { once: true });
40
+ });
41
+ // Prevent unhandled rejection if abort fires after the main flow already resolved/rejected.
42
+ void abortPromise.catch(() => { });
43
+ const dispose = () => {
44
+ disposed = true;
45
+ if (abortListener) {
46
+ abortSignal.removeEventListener('abort', abortListener);
47
+ abortListener = null;
48
+ }
49
+ };
50
+ return { abortPromise, dispose };
51
+ }
52
+ //# sourceMappingURL=abort-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abort-gate.js","sourceRoot":"","sources":["../../../src/utils/abort-gate.ts"],"names":[],"mappings":";;;AAIA,4CAEC;AAED,wCAIC;AAED,0CAsCC;AApDD,MAAa,UAAW,SAAQ,KAAK;IAC1B,IAAI,GAAG,YAAY,CAAC;CAC9B;AAFD,gCAEC;AAED,SAAgB,gBAAgB,CAAC,OAAO,GAAG,gBAAgB;IACzD,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,SAAgB,cAAc,CAAC,WAAyB;IACtD,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;QACzB,MAAM,gBAAgB,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAC7B,WAAoC,EACpC,OAAmB;IAEnB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,YAAY,EAAE,IAAI,OAAO,CAAQ,GAAG,EAAE,GAAE,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;IAC3E,CAAC;IAED,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;QACV,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACxD,8EAA8E;QAC9E,KAAK,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;IAC7C,CAAC;IAED,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,aAAa,GAAwB,IAAI,CAAC;IAC9C,MAAM,YAAY,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QACpD,aAAa,GAAG,GAAG,EAAE;YACnB,IAAI,QAAQ;gBAAE,OAAO;YACrB,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC;QACF,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IACH,4FAA4F;IAC5F,KAAK,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAElC,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,QAAQ,GAAG,IAAI,CAAC;QAChB,IAAI,aAAa,EAAE,CAAC;YAClB,WAAW,CAAC,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YACxD,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { ServerExporterBase } from './ServerExporterBase.js';
2
+ export declare class ServerExporter extends ServerExporterBase {
3
+ protected getRunnerModuleFile(): URL;
4
+ }
5
+ //# sourceMappingURL=ServerExporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerExporter.d.ts","sourceRoot":"","sources":["../../src/ServerExporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,qBAAa,cAAe,SAAQ,kBAAkB;IACpD,SAAS,CAAC,mBAAmB,IAAI,GAAG;CAIrC"}
@@ -0,0 +1,8 @@
1
+ import { ServerExporterBase } from './ServerExporterBase.js';
2
+ export class ServerExporter extends ServerExporterBase {
3
+ getRunnerModuleFile() {
4
+ // ESM build outputs to dist/esm, while the runner bundle is at dist/runner-browser/runner.mjs
5
+ return new URL('../runner-browser/runner.mjs', import.meta.url);
6
+ }
7
+ }
8
+ //# sourceMappingURL=ServerExporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerExporter.js","sourceRoot":"","sources":["../../src/ServerExporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,OAAO,cAAe,SAAQ,kBAAkB;IAC1C,mBAAmB;QAC3B,8FAA8F;QAC9F,OAAO,IAAI,GAAG,CAAC,8BAA8B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClE,CAAC;CACF"}
@@ -1,5 +1,6 @@
1
1
  import type { ExportToStoreInput, ExportToStoreResult, ServerExporterOptions } from './types.js';
2
- export declare class ServerExporter {
2
+ export declare abstract class ServerExporterBase {
3
+ protected abstract getRunnerModuleFile(): string | URL;
3
4
  private readonly store;
4
5
  private readonly options;
5
6
  private readonly maxJobs;
@@ -7,6 +8,8 @@ export declare class ServerExporter {
7
8
  private waiters;
8
9
  private runnerModuleCodePromise;
9
10
  constructor(options: ServerExporterOptions);
11
+ private createAbortError;
12
+ private abortMultipartUploadBestEffort;
10
13
  private acquireSlot;
11
14
  private releaseSlot;
12
15
  exportToStore(input: ExportToStoreInput): Promise<ExportToStoreResult>;
@@ -14,4 +17,4 @@ export declare class ServerExporter {
14
17
  private getRunnerModuleCode;
15
18
  private normalizeKeyPrefix;
16
19
  }
17
- //# sourceMappingURL=ServerExporter.d.ts.map
20
+ //# sourceMappingURL=ServerExporterBase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerExporterBase.d.ts","sourceRoot":"","sources":["../../src/ServerExporterBase.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AASpB,8BAAsB,kBAAkB;IACtC,SAAS,CAAC,QAAQ,CAAC,mBAAmB,IAAI,MAAM,GAAG,GAAG;IAEtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,OAAO,CAKP;IACR,OAAO,CAAC,uBAAuB,CAAgC;gBAEnD,OAAO,EAAE,qBAAqB;IAS1C,OAAO,CAAC,gBAAgB;YAIV,8BAA8B;YAa9B,WAAW;IAyBzB,OAAO,CAAC,WAAW;IAWb,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA8L5E,OAAO,CAAC,gBAAgB;YA0BV,mBAAmB;IA2BjC,OAAO,CAAC,kBAAkB;CAI3B"}