@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
@@ -4,7 +4,8 @@ import os from 'node:os';
4
4
  import path from 'node:path';
5
5
  import { launch } from 'puppeteer-core';
6
6
  import { runExportInPage } from './runner/runner.js';
7
- export class ServerExporter {
7
+ import { AbortError, createAbortError, createAbortGate, throwIfAborted, } from './utils/abort-gate.js';
8
+ export class ServerExporterBase {
8
9
  store;
9
10
  options;
10
11
  maxJobs;
@@ -19,24 +20,56 @@ export class ServerExporter {
19
20
  this.runnerModuleCodePromise = Promise.resolve(options.runner.moduleCode);
20
21
  }
21
22
  }
22
- async acquireSlot() {
23
+ createAbortError(message = 'Export aborted') {
24
+ return createAbortError(message);
25
+ }
26
+ async abortMultipartUploadBestEffort(input) {
27
+ if (!input.uploadId)
28
+ return;
29
+ try {
30
+ await this.store.abortMultipartUpload({ key: input.key, uploadId: input.uploadId });
31
+ }
32
+ catch (abortErr) {
33
+ input.logger.warn('[ServerExporter] abort failed', abortErr);
34
+ }
35
+ }
36
+ async acquireSlot(abortSignal) {
37
+ if (abortSignal?.aborted) {
38
+ throw this.createAbortError();
39
+ }
23
40
  if (this.activeJobs < this.maxJobs) {
24
41
  this.activeJobs += 1;
25
42
  return;
26
43
  }
27
- await new Promise((resolve) => {
28
- this.waiters.push(resolve);
44
+ await new Promise((resolve, reject) => {
45
+ const waiter = { resolve, reject, abortSignal };
46
+ if (abortSignal) {
47
+ const abortListener = () => {
48
+ const idx = this.waiters.indexOf(waiter);
49
+ if (idx >= 0)
50
+ this.waiters.splice(idx, 1);
51
+ abortSignal.removeEventListener('abort', abortListener);
52
+ reject(this.createAbortError());
53
+ };
54
+ waiter.abortListener = abortListener;
55
+ abortSignal.addEventListener('abort', abortListener, { once: true });
56
+ }
57
+ this.waiters.push(waiter);
29
58
  });
30
59
  this.activeJobs += 1;
31
60
  }
32
61
  releaseSlot() {
33
62
  this.activeJobs -= 1;
34
63
  const next = this.waiters.shift();
35
- if (next)
36
- next();
64
+ if (next) {
65
+ if (next.abortSignal && next.abortListener) {
66
+ next.abortSignal.removeEventListener('abort', next.abortListener);
67
+ }
68
+ next.resolve();
69
+ }
37
70
  }
38
71
  async exportToStore(input) {
39
- await this.acquireSlot();
72
+ await this.acquireSlot(input.abortSignal);
40
73
  const jobId = crypto.randomUUID();
41
74
  const logger = this.options.logger ?? console;
42
75
  const t0 = Date.now();
@@ -51,6 +84,7 @@ export class ServerExporter {
51
84
  };
52
85
  const partSizeBytes = this.options.upload?.partSizeBytes ?? 8 * 1024 * 1024;
53
86
  const contentType = this.options.upload?.contentType ?? 'video/mp4';
87
+ const partUrlExpiresInSeconds = this.options.upload?.partUrlExpiresInSeconds ?? 600;
54
88
  if (partSizeBytes < 5 * 1024 * 1024) {
55
89
  throw new Error('upload.partSizeBytes must be >= 5 MiB for multipart upload');
56
90
  }
@@ -59,10 +93,14 @@ export class ServerExporter {
59
93
  `${new Date().toISOString().replace(/[:.]/g, '-')}-${jobId}.mp4`;
60
94
  let browser = null;
61
95
  let page = null;
62
- let abortListener = null;
63
96
  let uploadId = null;
64
97
  let userDataDir = null;
65
98
  let abortedByUser = false;
99
+ const { abortPromise, dispose: disposeAbortGate } = createAbortGate(input.abortSignal, () => {
100
+ abortedByUser = true;
101
+ // Hard-stop the page so the job can exit quickly (runner promise rejects on page close).
102
+ void page?.close({ runBeforeUnload: false }).catch(() => { });
103
+ });
66
104
  try {
67
105
  log('Preparing job', {
68
106
  key,
@@ -70,8 +108,10 @@ export class ServerExporter {
70
108
  headless: this.options.browser?.headless ?? true,
71
109
  executablePath: this.options.browser?.executablePath,
72
110
  });
111
+ throwIfAborted(input.abortSignal);
73
112
  userDataDir = await fs.mkdtemp(path.join(this.options.browser?.userDataDirBase ?? os.tmpdir(), 'meframe-server-'));
74
113
  log('Created userDataDir', { userDataDir });
114
+ throwIfAborted(input.abortSignal);
75
115
  const uploadInit = await this.store.createMultipartUpload({
76
116
  key,
77
117
  contentType,
@@ -87,9 +127,11 @@ export class ServerExporter {
87
127
  this.options.onProgress?.({ jobId, ...evt });
88
128
  };
89
129
  log('Loading runner bundle...');
130
+ throwIfAborted(input.abortSignal);
90
131
  const runnerModuleCode = await this.getRunnerModuleCode();
91
132
  log('Runner bundle loaded', { bytes: runnerModuleCode.length });
92
133
  log('Launching browser...');
134
+ throwIfAborted(input.abortSignal);
93
135
  browser = await launch({
94
136
  headless: this.options.browser?.headless ?? true,
95
137
  executablePath: this.options.browser?.executablePath,
@@ -98,55 +140,55 @@ export class ServerExporter {
98
140
  });
99
141
  log('Browser launched');
100
142
  log('Creating page...');
143
+ throwIfAborted(input.abortSignal);
101
144
  page = await browser.newPage();
102
145
  log('Page created');
103
146
  // Forward runner logs / errors to Node side for observability.
104
- page.on('console', (msg) => logger.info('[runner:console]', msg.text()));
105
- page.on('pageerror', (err) => logger.error('[runner:pageerror]', err));
106
- page.on('error', (err) => logger.error('[runner:error]', err));
147
+ page.on('console', (msg) => logger.info(`[runner:console][${jobId}][${msg?.type?.() ?? 'log'}]`, msg.text()));
148
+ page.on('pageerror', (err) => logger.error(`[runner:pageerror][${jobId}]`, err));
149
+ page.on('error', (err) => logger.error(`[runner:error][${jobId}]`, err));
107
150
  page.on('requestfailed', (req) => {
108
- logger.warn('[runner:requestfailed]', {
151
+ const failure = req?.failure?.();
152
+ if (failure?.errorText === 'net::ERR_ABORTED')
153
+ return;
154
+ logger.warn(`[runner:requestfailed][${jobId}]`, {
109
155
  url: req?.url?.(),
110
156
  method: req?.method?.(),
111
- failure: req?.failure?.(),
157
+ failure,
112
158
  });
113
159
  });
114
- if (input.abortSignal) {
115
- abortListener = () => {
116
- // Best-effort; page may already be closed.
117
- abortedByUser = true;
118
- void page?.evaluate(() => window.__serverAbort?.()).catch(() => { });
119
- };
120
- input.abortSignal.addEventListener('abort', abortListener);
121
- }
122
160
  log('Running export in page...');
123
- await runExportInPage(page, {
124
- requestPartUrl: async (partNumber) => this.store.getUploadPartUrl({
125
- key,
161
+ await Promise.race([
162
+ runExportInPage(page, {
163
+ requestPartUrl: async (partNumber) => this.store.getUploadPartUrl({
164
+ key,
165
+ uploadId: uploadId,
166
+ partNumber,
167
+ expiresInSeconds: partUrlExpiresInSeconds,
168
+ }),
169
+ reportPartDone: async (partNumber, etag) => {
170
+ const normalizedEtag = etag.replaceAll('"', '');
171
+ parts.push({ partNumber, etag: normalizedEtag });
172
+ },
173
+ reportProgress: async (event) => onProgress(event),
174
+ reportError: async (message) => {
175
+ throw new Error(message);
176
+ },
177
+ reportComplete: async (_totalBytes) => {
178
+ // no-op, completion handled after runner resolves
179
+ },
180
+ }, {
181
+ model: input.model,
182
+ exportOptions: input.exportOptions ?? {},
183
+ partSizeBytes,
126
184
  uploadId: uploadId,
127
- partNumber,
128
- expiresInSeconds: 600,
185
+ key,
186
+ runnerModuleCode,
187
+ pageUrl: input.pageUrl,
188
+ workerPath: input.workerPath,
129
189
  }),
130
- reportPartDone: async (partNumber, etag) => {
131
- parts.push({ partNumber, etag });
132
- },
133
- reportProgress: async (event) => onProgress(event),
134
- reportError: async (message) => {
135
- throw new Error(message);
136
- },
137
- reportComplete: async (_totalBytes) => {
138
- // no-op, completion handled after runner resolves
139
- },
140
- }, {
141
- model: input.model,
142
- exportOptions: input.exportOptions ?? {},
143
- partSizeBytes,
144
- uploadId: uploadId,
145
- key,
146
- runnerModuleCode,
147
- pageUrl: input.pageUrl,
148
- workerPath: input.workerPath,
149
- });
190
+ abortPromise,
191
+ ]);
150
192
  log('Runner resolved');
151
193
  parts.sort((a, b) => a.partNumber - b.partNumber);
152
194
  this.assertPartsValid(parts);
@@ -158,6 +200,7 @@ export class ServerExporter {
158
200
  catch (error) {
159
201
  const isAbort = abortedByUser ||
160
202
  input.abortSignal?.aborted === true ||
203
+ error instanceof AbortError ||
161
204
  (error instanceof DOMException && error.name === 'AbortError') ||
162
205
  (error instanceof Error && error.name === 'AbortError');
163
206
  if (isAbort) {
@@ -166,37 +209,30 @@ export class ServerExporter {
166
209
  else {
167
210
  logger.error('[ServerExporter] export failed', error);
168
211
  }
169
- // Best-effort abort
170
- try {
171
- const keyToAbort = key;
172
- const uploadIdToAbort = uploadId ?? error?.uploadId;
173
- if (uploadIdToAbort) {
174
- await this.store.abortMultipartUpload({ key: keyToAbort, uploadId: uploadIdToAbort });
175
- }
176
- }
177
- catch (abortErr) {
178
- logger.warn('[ServerExporter] abort failed', abortErr);
179
- }
212
+ await this.abortMultipartUploadBestEffort({ key, uploadId, logger });
180
213
  if (isAbort) {
181
- throw new DOMException('Export aborted', 'AbortError');
214
+ throw this.createAbortError();
182
215
  }
183
216
  throw error;
184
217
  }
185
218
  finally {
186
- if (input.abortSignal && abortListener) {
187
- input.abortSignal.removeEventListener('abort', abortListener);
188
- }
189
- const cleanupTasks = [];
219
+ disposeAbortGate();
220
+ // Cleanup order matters: Chromium may still be writing to the profile directory
221
+ // while closing. Close the browser first, then remove userDataDir.
190
222
  if (browser) {
191
- cleanupTasks.push(browser.close());
223
+ try {
224
+ await browser.close();
225
+ }
226
+ catch (e) {
227
+ logger.warn('[ServerExporter] cleanup failed', e);
228
+ }
192
229
  }
193
230
  if (userDataDir) {
194
- cleanupTasks.push(fs.rm(userDataDir, { recursive: true, force: true }));
195
- }
196
- const results = await Promise.allSettled(cleanupTasks);
197
- for (const r of results) {
198
- if (r.status === 'rejected') {
199
- logger.warn('[ServerExporter] cleanup failed', r.reason);
231
+ try {
232
+ await fs.rm(userDataDir, { recursive: true, force: true });
233
+ }
234
+ catch (e) {
235
+ logger.warn('[ServerExporter] cleanup failed', e);
200
236
  }
201
237
  }
202
238
  this.releaseSlot();
@@ -227,8 +263,8 @@ export class ServerExporter {
227
263
  }
228
264
  async getRunnerModuleCode() {
229
265
  if (!this.runnerModuleCodePromise) {
230
- this.runnerModuleCodePromise = (async () => {
231
- const runnerModuleFile = new URL('./runner-browser/runner.mjs', import.meta.url);
266
+ const promise = (async () => {
267
+ const runnerModuleFile = this.getRunnerModuleFile();
232
268
  try {
233
269
  return await fs.readFile(runnerModuleFile, 'utf8');
234
270
  }
@@ -239,6 +275,11 @@ export class ServerExporter {
239
275
  throw e;
240
276
  }
241
277
  })();
278
+ // Only cache successful reads; allow retry if it fails.
279
+ this.runnerModuleCodePromise = promise.then((code) => code, (err) => {
280
+ this.runnerModuleCodePromise = null;
281
+ throw err;
282
+ });
242
283
  }
243
284
  return await this.runnerModuleCodePromise;
244
285
  }
@@ -248,4 +289,4 @@ export class ServerExporter {
248
289
  return prefix.endsWith('/') ? prefix : `${prefix}/`;
249
290
  }
250
291
  }
251
- //# sourceMappingURL=ServerExporter.js.map
292
+ //# 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 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -19,7 +19,6 @@ export interface RunnerBridge {
19
19
  reportProgress(event: ExportProgressEvent): Promise<void>;
20
20
  reportError(message: string): Promise<void>;
21
21
  reportComplete(totalBytes: number): Promise<void>;
22
- onAbortRequested?: () => void;
23
22
  }
24
23
  export declare function runExportInPage(page: Page, bridge: RunnerBridge, params: RunnerParams): Promise<void>;
25
24
  //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/runner/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,GAAG,CAAC;IACX,aAAa,EAAE,GAAG,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAC;IAC/F,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CAsFf"}
@@ -1,23 +1,39 @@
1
1
  export async function runExportInPage(page, bridge, params) {
2
2
  const { model, exportOptions, partSizeBytes, uploadId, key, // reserved for future use (e.g., logging)
3
3
  runnerModuleCode, pageUrl, workerPath, } = params;
4
+ let settled = false;
4
5
  let doneResolve;
5
6
  let doneReject;
6
7
  const done = new Promise((resolve, reject) => {
7
- doneResolve = resolve;
8
- doneReject = reject;
8
+ doneResolve = () => {
9
+ if (settled)
10
+ return;
11
+ settled = true;
12
+ resolve();
13
+ };
14
+ doneReject = (err) => {
15
+ if (settled)
16
+ return;
17
+ settled = true;
18
+ reject(err);
19
+ };
9
20
  });
21
+ // Ensure the promise settles if the page is closed / crashes.
22
+ const onPageClose = () => doneReject(new Error('Runner page closed'));
23
+ const onPageError = (err) => doneReject(err instanceof Error ? err : new Error(`Runner page error: ${String(err)}`));
24
+ page.once('close', onPageClose);
25
+ page.once('error', onPageError);
10
26
  // Bridge functions exposed to the browser context
11
27
  await page.exposeFunction('runnerRequestPartUrl', bridge.requestPartUrl);
12
28
  await page.exposeFunction('runnerReportPartDone', bridge.reportPartDone);
13
29
  await page.exposeFunction('runnerReportProgress', bridge.reportProgress);
14
30
  await page.exposeFunction('runnerReportError', async (message) => {
15
- await bridge.reportError(message);
16
31
  doneReject(new Error(message));
32
+ await bridge.reportError(message).catch(() => { });
17
33
  });
18
34
  await page.exposeFunction('runnerReportComplete', async (totalBytes) => {
19
- await bridge.reportComplete(totalBytes);
20
35
  doneResolve();
36
+ await bridge.reportComplete(totalBytes).catch(() => { });
21
37
  });
22
38
  const runnerConfig = {
23
39
  model,
@@ -46,6 +62,12 @@ ${runnerModuleCode}
46
62
  </head>
47
63
  <body></body>
48
64
  </html>`);
49
- await done;
65
+ try {
66
+ await done;
67
+ }
68
+ finally {
69
+ page.off('close', onPageClose);
70
+ page.off('error', onPageError);
71
+ }
50
72
  }
51
73
  //# 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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"}
@@ -55,6 +55,11 @@ export interface ServerExporterOptions {
55
55
  keyPrefix?: string;
56
56
  partSizeBytes?: number;
57
57
  contentType?: string;
58
+ /**
59
+ * Expiration for pre-signed part upload URLs requested from store.getUploadPartUrl().
60
+ * Defaults to 600 seconds.
61
+ */
62
+ partUrlExpiresInSeconds?: number;
58
63
  };
59
64
  onProgress?: (evt: {
60
65
  jobId: string;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,qBAAqB,CAAC,KAAK,EAAE;QAC3B,GAAG,EAAE,MAAM,CAAC;QACZ,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAElC,gBAAgB,CAAC,KAAK,EAAE;QACtB,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAC;IAE/D,uBAAuB,CAAC,KAAK,EAAE;QAC7B,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,KAAK,CAAC;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACpD,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAElB,oBAAoB,CAAC,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,oBAAoB,CAAC;IAC5B,MAAM,CAAC,EAAE;QACP;;;WAGG;QACH,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAClC,MAAM,CAAC,EAAE;QACP,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB;;;WAGG;QACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;KAClC,CAAC;IACF,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,mBAAmB,KAAK,IAAI,CAAC;IACpE,MAAM,CAAC,EAAE;QACP,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAC3B,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;KAC7B,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,GAAG,CAAC;IACX,aAAa,EAAE,GAAG,CAAC;IACnB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;CACb"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ export declare class AbortError extends Error {
2
+ name: string;
3
+ }
4
+ export declare function createAbortError(message?: string): Error;
5
+ export declare function throwIfAborted(abortSignal?: AbortSignal): void;
6
+ export declare function createAbortGate(abortSignal: AbortSignal | undefined, onAbort: () => void): {
7
+ abortPromise: Promise<never>;
8
+ dispose: () => void;
9
+ };
10
+ //# sourceMappingURL=abort-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abort-gate.d.ts","sourceRoot":"","sources":["../../../src/utils/abort-gate.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAW,SAAQ,KAAK;IAC1B,IAAI,SAAgB;CAC9B;AAED,wBAAgB,gBAAgB,CAAC,OAAO,SAAmB,GAAG,KAAK,CAElE;AAED,wBAAgB,cAAc,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAI9D;AAED,wBAAgB,eAAe,CAC7B,WAAW,EAAE,WAAW,GAAG,SAAS,EACpC,OAAO,EAAE,MAAM,IAAI,GAClB;IAAE,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,CAmCvD"}
@@ -0,0 +1,45 @@
1
+ export class AbortError extends Error {
2
+ name = 'AbortError';
3
+ }
4
+ export function createAbortError(message = 'Export aborted') {
5
+ return new AbortError(message);
6
+ }
7
+ export function throwIfAborted(abortSignal) {
8
+ if (abortSignal?.aborted) {
9
+ throw createAbortError();
10
+ }
11
+ }
12
+ export function createAbortGate(abortSignal, onAbort) {
13
+ if (!abortSignal) {
14
+ return { abortPromise: new Promise(() => { }), dispose: () => { } };
15
+ }
16
+ if (abortSignal.aborted) {
17
+ onAbort();
18
+ const abortPromise = Promise.reject(createAbortError());
19
+ // Prevent unhandled rejection if the job ends before this promise is awaited.
20
+ void abortPromise.catch(() => { });
21
+ return { abortPromise, dispose: () => { } };
22
+ }
23
+ let disposed = false;
24
+ let abortListener = null;
25
+ const abortPromise = new Promise((_, reject) => {
26
+ abortListener = () => {
27
+ if (disposed)
28
+ return;
29
+ onAbort();
30
+ reject(createAbortError());
31
+ };
32
+ abortSignal.addEventListener('abort', abortListener, { once: true });
33
+ });
34
+ // Prevent unhandled rejection if abort fires after the main flow already resolved/rejected.
35
+ void abortPromise.catch(() => { });
36
+ const dispose = () => {
37
+ disposed = true;
38
+ if (abortListener) {
39
+ abortSignal.removeEventListener('abort', abortListener);
40
+ abortListener = null;
41
+ }
42
+ };
43
+ return { abortPromise, dispose };
44
+ }
45
+ //# sourceMappingURL=abort-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abort-gate.js","sourceRoot":"","sources":["../../../src/utils/abort-gate.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAW,SAAQ,KAAK;IAC1B,IAAI,GAAG,YAAY,CAAC;CAC9B;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAO,GAAG,gBAAgB;IACzD,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,WAAyB;IACtD,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;QACzB,MAAM,gBAAgB,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,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"}