@meframe/server 0.0.1

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/README.md ADDED
@@ -0,0 +1,63 @@
1
+ ## @meframe/server
2
+
3
+ `@meframe/server` is a Node.js package that runs `@meframe/core` export inside a real Chromium instance (via browser automation) and uploads the output using an injected multipart store interface.
4
+
5
+ ### Status
6
+
7
+ **Experimental, but functional.**
8
+
9
+ Current capabilities:
10
+
11
+ - Runs `@meframe/core` export in a real Chromium instance (via `puppeteer-core`)
12
+ - Streams mux output into multipart parts (no full MP4 `Blob` in Node memory)
13
+ - Supports cancellation (`AbortSignal`) and progress callback (`onProgress`)
14
+
15
+ See:
16
+
17
+ - `packages/server/examples/README.md` for example usage (local + S3)
18
+ - `packages/server/docs/INTEGRATION.md` for a complete integration guide (Chinese)
19
+ - `packages/server/docs/ARCHITECTURE.md` for architecture and constraints
20
+
21
+ ### Design goals
22
+
23
+ - **No cloud SDK dependency**: upload is abstracted via `MultipartObjectStore`.
24
+ - **Low memory**: avoid returning a full MP4 `Blob` to Node; stream mux output into multipart parts.
25
+ - **Works with existing web pipeline**: reuse `@meframe/core` export flow (OPFS + WebCodecs + workers).
26
+
27
+ ### Public API
28
+
29
+ - `ServerExporter`
30
+ - `exportToStore({ model, exportOptions, pageUrl?, key?, metadata?, abortSignal? })`
31
+
32
+ Types are exported from `@meframe/server` root entry.
33
+
34
+ ### Notes / requirements
35
+
36
+ - **Chromium is not bundled**: this package depends on `puppeteer-core`, so production must provide a Chromium/Chrome binary and pass `executablePath` (or set env in your app).
37
+ - **Secure context is required** for WebCodecs: the exporter should navigate to a trustworthy origin (e.g. `http://127.0.0.1` or `https://...`) via `pageUrl` before running the runner.
38
+ - **Worker files must be accessible** to the page at `/<workerPath>/...` (default `/meframe-workers/...`). The local example serves them from `@meframe/core/dist/workers`.
39
+
40
+ ### Run examples
41
+
42
+ Local end-to-end (writes `packages/server/examples/local/out.mp4`):
43
+
44
+ ```bash
45
+ pnpm --filter @meframe/core build
46
+ pnpm --filter @meframe/adapter-medeo build
47
+ pnpm --filter @meframe/server build
48
+
49
+ MEFRAME_CHROME_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
50
+ MEFRAME_WORKER_PATH="https://medeo.app/fe-assets/meframe-workers-2" \
51
+ pnpm --filter @meframe/server dev
52
+ ```
53
+
54
+ S3 example (reference; requires AWS creds + bucket CORS exposing `ETag`):
55
+
56
+ ```bash
57
+ MEFRAME_CHROME_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
58
+ MEFRAME_WORKER_PATH="https://medeo.app/fe-assets/meframe-workers-2" \
59
+ MEFRAME_RUNNER_PAGE_URL="https://your-domain.example/meframe-runner.html" \
60
+ S3_BUCKET="your-bucket" \
61
+ MEDEO_PUBLIC_BASE_URL="https://cdn.example.com" \
62
+ node packages/server/examples/s3/export-to-s3.mjs
63
+ ```
@@ -0,0 +1,17 @@
1
+ import type { ExportToStoreInput, ExportToStoreResult, ServerExporterOptions } from './types.js';
2
+ export declare class ServerExporter {
3
+ private readonly store;
4
+ private readonly options;
5
+ private readonly maxJobs;
6
+ private activeJobs;
7
+ private waiters;
8
+ private runnerModuleCodePromise;
9
+ constructor(options: ServerExporterOptions);
10
+ private acquireSlot;
11
+ private releaseSlot;
12
+ exportToStore(input: ExportToStoreInput): Promise<ExportToStoreResult>;
13
+ private assertPartsValid;
14
+ private getRunnerModuleCode;
15
+ private normalizeKeyPrefix;
16
+ }
17
+ //# sourceMappingURL=ServerExporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerExporter.d.ts","sourceRoot":"","sources":["../src/ServerExporter.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAGpB,qBAAa,cAAc;IACzB,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,CAAyB;IACxC,OAAO,CAAC,uBAAuB,CAAgC;gBAEnD,OAAO,EAAE,qBAAqB;YAS5B,WAAW;IAWzB,OAAO,CAAC,WAAW;IAMb,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA6L5E,OAAO,CAAC,gBAAgB;YA0BV,mBAAmB;IAmBjC,OAAO,CAAC,kBAAkB;CAI3B"}
@@ -0,0 +1,251 @@
1
+ import crypto from 'node:crypto';
2
+ import fs from 'node:fs/promises';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import { launch } from 'puppeteer-core';
6
+ import { runExportInPage } from './runner/runner.js';
7
+ export class ServerExporter {
8
+ store;
9
+ options;
10
+ maxJobs;
11
+ activeJobs = 0;
12
+ waiters = [];
13
+ runnerModuleCodePromise = null;
14
+ constructor(options) {
15
+ this.store = options.store;
16
+ this.options = options;
17
+ this.maxJobs = options.concurrency?.maxJobs ?? 1;
18
+ if (typeof options.runner?.moduleCode === 'string') {
19
+ this.runnerModuleCodePromise = Promise.resolve(options.runner.moduleCode);
20
+ }
21
+ }
22
+ async acquireSlot() {
23
+ if (this.activeJobs < this.maxJobs) {
24
+ this.activeJobs += 1;
25
+ return;
26
+ }
27
+ await new Promise((resolve) => {
28
+ this.waiters.push(resolve);
29
+ });
30
+ this.activeJobs += 1;
31
+ }
32
+ releaseSlot() {
33
+ this.activeJobs -= 1;
34
+ const next = this.waiters.shift();
35
+ if (next)
36
+ next();
37
+ }
38
+ async exportToStore(input) {
39
+ await this.acquireSlot();
40
+ const jobId = crypto.randomUUID();
41
+ const logger = this.options.logger ?? console;
42
+ const t0 = Date.now();
43
+ const log = (message, extra) => {
44
+ const elapsedMs = Date.now() - t0;
45
+ if (extra) {
46
+ logger.info(`[ServerExporter][${jobId}][${elapsedMs}ms] ${message}`, extra);
47
+ }
48
+ else {
49
+ logger.info(`[ServerExporter][${jobId}][${elapsedMs}ms] ${message}`);
50
+ }
51
+ };
52
+ const partSizeBytes = this.options.defaults?.partSizeBytes ?? 8 * 1024 * 1024;
53
+ const contentType = this.options.defaults?.contentType ?? 'video/mp4';
54
+ if (partSizeBytes < 5 * 1024 * 1024) {
55
+ throw new Error('defaults.partSizeBytes must be >= 5 MiB for multipart upload');
56
+ }
57
+ const key = input.key ??
58
+ `${this.normalizeKeyPrefix(this.options.defaults?.keyPrefix)}` +
59
+ `${new Date().toISOString().replace(/[:.]/g, '-')}-${jobId}.mp4`;
60
+ let browser = null;
61
+ let page = null;
62
+ let abortListener = null;
63
+ let uploadId = null;
64
+ let userDataDir = null;
65
+ let abortedByUser = false;
66
+ try {
67
+ log('Preparing job', {
68
+ key,
69
+ partSizeBytes,
70
+ headless: this.options.puppeteer?.headless ?? true,
71
+ executablePath: this.options.puppeteer?.executablePath,
72
+ });
73
+ userDataDir = await fs.mkdtemp(path.join(this.options.puppeteer?.userDataDirBase ?? os.tmpdir(), 'meframe-server-'));
74
+ log('Created userDataDir', { userDataDir });
75
+ const uploadInit = await this.store.createMultipartUpload({
76
+ key,
77
+ contentType,
78
+ metadata: input.metadata,
79
+ });
80
+ uploadId = uploadInit.uploadId;
81
+ if (!uploadId) {
82
+ throw new Error('Failed to create multipart upload');
83
+ }
84
+ log('Multipart upload created', { uploadId });
85
+ const parts = [];
86
+ const onProgress = (evt) => {
87
+ this.options.onProgress?.({ jobId, ...evt });
88
+ };
89
+ log('Loading runner bundle...');
90
+ const runnerModuleCode = await this.getRunnerModuleCode();
91
+ log('Runner bundle loaded', { bytes: runnerModuleCode.length });
92
+ log('Launching browser...');
93
+ browser = await launch({
94
+ headless: this.options.puppeteer?.headless ?? true,
95
+ executablePath: this.options.puppeteer?.executablePath,
96
+ args: this.options.puppeteer?.launchArgs,
97
+ userDataDir,
98
+ });
99
+ log('Browser launched');
100
+ log('Creating page...');
101
+ page = await browser.newPage();
102
+ log('Page created');
103
+ // 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));
107
+ page.on('requestfailed', (req) => {
108
+ logger.warn('[runner:requestfailed]', {
109
+ url: req?.url?.(),
110
+ method: req?.method?.(),
111
+ failure: req?.failure?.(),
112
+ });
113
+ });
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
+ log('Running export in page...');
123
+ await runExportInPage(page, {
124
+ requestPartUrl: async (partNumber) => this.store.getUploadPartUrl({
125
+ key,
126
+ uploadId: uploadId,
127
+ partNumber,
128
+ expiresInSeconds: 600,
129
+ }),
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
+ });
150
+ log('Runner resolved');
151
+ parts.sort((a, b) => a.partNumber - b.partNumber);
152
+ this.assertPartsValid(parts);
153
+ log('Completing multipart upload...', { parts: parts.length });
154
+ await this.store.completeMultipartUpload({ key, uploadId: uploadId, parts });
155
+ log('Export completed', { key });
156
+ return { key };
157
+ }
158
+ catch (error) {
159
+ const isAbort = abortedByUser ||
160
+ input.abortSignal?.aborted === true ||
161
+ (error instanceof DOMException && error.name === 'AbortError') ||
162
+ (error instanceof Error && error.name === 'AbortError');
163
+ if (isAbort) {
164
+ logger.info('[ServerExporter] export aborted');
165
+ }
166
+ else {
167
+ logger.error('[ServerExporter] export failed', error);
168
+ }
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
+ }
180
+ if (isAbort) {
181
+ throw new DOMException('Export aborted', 'AbortError');
182
+ }
183
+ throw error;
184
+ }
185
+ finally {
186
+ if (input.abortSignal && abortListener) {
187
+ input.abortSignal.removeEventListener('abort', abortListener);
188
+ }
189
+ const cleanupTasks = [];
190
+ if (browser) {
191
+ cleanupTasks.push(browser.close());
192
+ }
193
+ 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);
200
+ }
201
+ }
202
+ this.releaseSlot();
203
+ }
204
+ }
205
+ assertPartsValid(parts) {
206
+ if (parts.length === 0) {
207
+ throw new Error('No multipart parts were uploaded');
208
+ }
209
+ const seen = new Set();
210
+ for (let i = 0; i < parts.length; i++) {
211
+ const part = parts[i];
212
+ if (!Number.isInteger(part.partNumber) || part.partNumber <= 0) {
213
+ throw new Error(`Invalid partNumber: ${part.partNumber}`);
214
+ }
215
+ if (!part.etag) {
216
+ throw new Error(`Missing ETag for part ${part.partNumber}`);
217
+ }
218
+ if (seen.has(part.partNumber)) {
219
+ throw new Error(`Duplicate partNumber: ${part.partNumber}`);
220
+ }
221
+ seen.add(part.partNumber);
222
+ const expected = i + 1;
223
+ if (part.partNumber !== expected) {
224
+ throw new Error(`Non-contiguous parts: expected part ${expected}, got ${part.partNumber}`);
225
+ }
226
+ }
227
+ }
228
+ async getRunnerModuleCode() {
229
+ if (!this.runnerModuleCodePromise) {
230
+ this.runnerModuleCodePromise = (async () => {
231
+ const runnerModuleFile = new URL('./runner/runner.mjs', import.meta.url);
232
+ try {
233
+ return await fs.readFile(runnerModuleFile, 'utf8');
234
+ }
235
+ catch (e) {
236
+ if (e && typeof e === 'object' && e.code === 'ENOENT') {
237
+ throw new Error('Runner bundle not found. Please build @meframe/server first (pnpm --filter @meframe/server build).');
238
+ }
239
+ throw e;
240
+ }
241
+ })();
242
+ }
243
+ return await this.runnerModuleCodePromise;
244
+ }
245
+ normalizeKeyPrefix(prefix) {
246
+ if (!prefix)
247
+ return 'exports/';
248
+ return prefix.endsWith('/') ? prefix : `${prefix}/`;
249
+ }
250
+ }
251
+ //# sourceMappingURL=ServerExporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerExporter.js","sourceRoot":"","sources":["../src/ServerExporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { BrowserLauncher } from './types.js';
2
+ export declare const puppeteerCoreLauncher: BrowserLauncher;
3
+ //# sourceMappingURL=puppeteer-core-launcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"puppeteer-core-launcher.d.ts","sourceRoot":"","sources":["../../src/browser/puppeteer-core-launcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAqC,MAAM,YAAY,CAAC;AAErF,eAAO,MAAM,qBAAqB,EAAE,eASnC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { launch } from 'puppeteer-core';
2
+ export const puppeteerCoreLauncher = {
3
+ async launch(options) {
4
+ return await launch({
5
+ headless: options.headless ?? true,
6
+ executablePath: options.executablePath,
7
+ args: options.args,
8
+ userDataDir: options.userDataDir,
9
+ });
10
+ },
11
+ };
12
+ //# sourceMappingURL=puppeteer-core-launcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"puppeteer-core-launcher.js","sourceRoot":"","sources":["../../src/browser/puppeteer-core-launcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAGxC,MAAM,CAAC,MAAM,qBAAqB,GAAoB;IACpD,KAAK,CAAC,MAAM,CAAC,OAA6B;QACxC,OAAO,MAAM,MAAM,CAAC;YAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;YAClC,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,21 @@
1
+ export interface PageLike {
2
+ setContent(html: string): Promise<unknown>;
3
+ goto(url: string, options?: any): Promise<unknown>;
4
+ exposeFunction(name: string, fn: (...args: any[]) => any): Promise<unknown>;
5
+ evaluate(fn: (...args: any[]) => any, ...args: any[]): Promise<unknown>;
6
+ on(event: string, handler: (...args: any[]) => void): void;
7
+ }
8
+ export interface BrowserLike {
9
+ newPage(): Promise<PageLike>;
10
+ close(): Promise<void>;
11
+ }
12
+ export interface BrowserLaunchOptions {
13
+ headless?: boolean;
14
+ executablePath?: string;
15
+ args?: string[];
16
+ userDataDir?: string;
17
+ }
18
+ export interface BrowserLauncher {
19
+ launch(options: BrowserLaunchOptions): Promise<BrowserLike>;
20
+ }
21
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/browser/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5E,QAAQ,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;CAC5D;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CAC7D"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/browser/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export type { ExportProgressEvent, ExportToStoreInput, ExportToStoreResult, MultipartObjectStore, ServerExporterOptions, } from './types.js';
2
+ export { ServerExporter } from './ServerExporter.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { ServerExporter } from './ServerExporter.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { MultipartObjectStore } from '../../dist/types';
2
+ export declare class MockMultipartObjectStore implements MultipartObjectStore {
3
+ private uploads;
4
+ createMultipartUpload(input: {
5
+ key: string;
6
+ contentType: string;
7
+ metadata?: Record<string, string> | undefined;
8
+ }): Promise<{
9
+ uploadId: string;
10
+ }>;
11
+ getUploadPartUrl(input: {
12
+ key: string;
13
+ uploadId: string;
14
+ partNumber: number;
15
+ expiresInSeconds?: number | undefined;
16
+ }): Promise<{
17
+ url: string;
18
+ headers?: Record<string, string> | undefined;
19
+ }>;
20
+ completeMultipartUpload(input: {
21
+ key: string;
22
+ uploadId: string;
23
+ parts: {
24
+ partNumber: number;
25
+ etag: string;
26
+ }[];
27
+ }): Promise<void>;
28
+ abortMultipartUpload(input: {
29
+ key: string;
30
+ uploadId: string;
31
+ }): Promise<void>;
32
+ getCompletedParts(uploadId: string): Array<{
33
+ partNumber: number;
34
+ etag: string;
35
+ }> | undefined;
36
+ }
37
+ //# sourceMappingURL=MockMultipartObjectStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockMultipartObjectStore.d.ts","sourceRoot":"","sources":["../../src/mock/MockMultipartObjectStore.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AASrD,qBAAa,wBAAyB,YAAW,oBAAoB;IACnE,OAAO,CAAC,OAAO,CAAmC;IAE5C,qBAAqB,CAAC,KAAK,EAAE;QACjC,GAAG,EAAE,MAAM,CAAC;QACZ,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;KAC/C,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAW3B,gBAAgB,CAAC,KAAK,EAAE;QAC5B,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KACvC,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;KAAE,CAAC;IAQpE,uBAAuB,CAAC,KAAK,EAAE;QACnC,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KAC/C,GAAG,OAAO,CAAC,IAAI,CAAC;IAMX,oBAAoB,CAAC,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAInF,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,SAAS;CAG7F"}
@@ -0,0 +1,34 @@
1
+ import crypto from 'node:crypto';
2
+ export class MockMultipartObjectStore {
3
+ uploads = new Map();
4
+ async createMultipartUpload(input) {
5
+ const uploadId = crypto.randomUUID();
6
+ this.uploads.set(uploadId, {
7
+ key: input.key,
8
+ contentType: input.contentType,
9
+ metadata: input.metadata,
10
+ parts: [],
11
+ });
12
+ return { uploadId };
13
+ }
14
+ async getUploadPartUrl(input) {
15
+ // For tests we return a pseudo URL; uploading is simulated by runner mocks.
16
+ if (!this.uploads.has(input.uploadId)) {
17
+ throw new Error('Unknown uploadId');
18
+ }
19
+ return { url: `mock://${input.key}/part/${input.partNumber}` };
20
+ }
21
+ async completeMultipartUpload(input) {
22
+ const record = this.uploads.get(input.uploadId);
23
+ if (!record)
24
+ throw new Error('Unknown uploadId');
25
+ record.parts = input.parts.slice();
26
+ }
27
+ async abortMultipartUpload(input) {
28
+ this.uploads.delete(input.uploadId);
29
+ }
30
+ getCompletedParts(uploadId) {
31
+ return this.uploads.get(uploadId)?.parts;
32
+ }
33
+ }
34
+ //# sourceMappingURL=MockMultipartObjectStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockMultipartObjectStore.js","sourceRoot":"","sources":["../../src/mock/MockMultipartObjectStore.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAUjC,MAAM,OAAO,wBAAwB;IAC3B,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;IAElD,KAAK,CAAC,qBAAqB,CAAC,KAI3B;QACC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE;YACzB,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,KAAK,EAAE,EAAE;SACV,CAAC,CAAC;QACH,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,KAKtB;QACC,4EAA4E;QAC5E,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,UAAU,KAAK,CAAC,GAAG,SAAS,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,KAI7B;QACC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,KAAwC;QACjE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,iBAAiB,CAAC,QAAgB;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;IAC3C,CAAC;CACF"}