@mieweb/pulsevault 0.5.0 → 0.7.0
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/CHANGELOG.md +152 -1
- package/OPERATIONS.md +123 -46
- package/PROTOCOL.md +27 -5
- package/README.md +31 -8
- package/dist/app.d.ts +8 -7
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +4 -3
- package/dist/app.js.map +1 -1
- package/dist/core.d.ts +23 -9
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +106 -21
- package/dist/core.js.map +1 -1
- package/dist/lib/completion.d.ts +22 -5
- package/dist/lib/completion.d.ts.map +1 -1
- package/dist/lib/completion.js +247 -35
- package/dist/lib/completion.js.map +1 -1
- package/dist/lib/deeplinks.d.ts +18 -2
- package/dist/lib/deeplinks.d.ts.map +1 -1
- package/dist/lib/deeplinks.js +13 -2
- package/dist/lib/deeplinks.js.map +1 -1
- package/dist/lib/magic.d.ts +41 -1
- package/dist/lib/magic.d.ts.map +1 -1
- package/dist/lib/magic.js +104 -0
- package/dist/lib/magic.js.map +1 -1
- package/dist/lib/options.d.ts +2 -0
- package/dist/lib/options.d.ts.map +1 -1
- package/dist/lib/options.js +8 -4
- package/dist/lib/options.js.map +1 -1
- package/dist/lib/protocol-version.gen.js +1 -1
- package/dist/lib/pulsevaultTus.d.ts.map +1 -1
- package/dist/lib/pulsevaultTus.js +35 -1
- package/dist/lib/pulsevaultTus.js.map +1 -1
- package/dist/lib/web-ready.d.ts +145 -18
- package/dist/lib/web-ready.d.ts.map +1 -1
- package/dist/lib/web-ready.js +484 -91
- package/dist/lib/web-ready.js.map +1 -1
- package/dist/storage/local.d.ts +3 -1
- package/dist/storage/local.d.ts.map +1 -1
- package/dist/storage/local.js +310 -50
- package/dist/storage/local.js.map +1 -1
- package/dist/storage/s3.d.ts.map +1 -1
- package/dist/storage/s3.js +21 -1
- package/dist/storage/s3.js.map +1 -1
- package/dist/storage/types.d.ts +89 -4
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/types.js +7 -0
- package/dist/storage/types.js.map +1 -1
- package/package.json +2 -2
- package/protocol/openapi.json +26 -3
- package/protocol/schemas/artifact-status.schema.json +13 -1
- package/protocol/schemas/deep-link.schema.json +2 -2
- package/scripts/web-ready-migrate.mjs +35 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-ready.js","sourceRoot":"","sources":["../../src/lib/web-ready.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"web-ready.js","sourceRoot":"","sources":["../../src/lib/web-ready.ts"],"names":[],"mappings":"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"}
|
package/dist/storage/local.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { PulseVaultArtifactMeta, PulseVaultArtifactPatch, PulseVaultArtifactRecord, PulseVaultStorage, UploadKind } from './types.js';
|
|
1
|
+
import type { PulseVaultArtifactMeta, PulseVaultArtifactPatch, PulseVaultArtifactRecord, PulseVaultStorage, StoreArtifactParams, UploadKind } from './types.js';
|
|
2
2
|
export type LocalStorageOptions = {
|
|
3
3
|
/** Directory where uploads are stored (flat kind-scoped subdirs). Resolved against CWD if relative. */
|
|
4
4
|
workspaceDir: string;
|
|
@@ -62,6 +62,8 @@ export type LocalStorage = PulseVaultStorage & {
|
|
|
62
62
|
patchArtifact(artifactId: string, patch: PulseVaultArtifactPatch): Promise<boolean>;
|
|
63
63
|
/** Satisfies the optional `PulseVaultStorage.listRelated` contract. */
|
|
64
64
|
listRelated(artifactId: string): AsyncIterable<PulseVaultArtifactRecord>;
|
|
65
|
+
/** Satisfies the optional `PulseVaultStorage.storeArtifact` contract. */
|
|
66
|
+
storeArtifact(params: StoreArtifactParams): Promise<boolean>;
|
|
65
67
|
};
|
|
66
68
|
export declare function createLocalStorage(opts: LocalStorageOptions): LocalStorage;
|
|
67
69
|
//# sourceMappingURL=local.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EAExB,iBAAiB,EAEjB,mBAAmB,EACnB,UAAU,EACX,MAAM,YAAY,CAAC;AAgJpB,MAAM,MAAM,mBAAmB,GAAG;IAChC,uGAAuG;IACvG,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,MAAM,YAAY,GAAG,iBAAiB,GAAG;IAC7C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B;;;;;OAKG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzD;;;;OAIG;IACH,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACxD,wEAAwE;IACxE,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzD,uEAAuE;IACvE,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxD,mEAAmE;IACnE,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpD,yEAAyE;IACzE,aAAa,CAAC,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa,CAAC,wBAAwB,CAAC,CAAC;IAC1F,4EAA4E;IAC5E,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAC;IAC7E,yEAAyE;IACzE,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpF,uEAAuE;IACvE,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CAAC,wBAAwB,CAAC,CAAC;IACzE,yEAAyE;IACzE,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9D,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,YAAY,CA0sB1E"}
|
package/dist/storage/local.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { FileStore } from '@tus/file-store';
|
|
2
|
+
import { ERRORS, Upload } from '@tus/server';
|
|
2
3
|
import fs from 'node:fs/promises';
|
|
3
4
|
import path from 'node:path';
|
|
4
5
|
import { randomUUID } from 'node:crypto';
|
|
5
6
|
import { isUuid } from '../lib/uuid.js';
|
|
7
|
+
import { EXTENSION_REGEX } from '../lib/options.js';
|
|
8
|
+
import { CONFORM_TARGET } from '../lib/web-ready.js';
|
|
6
9
|
import { parseUploadKind } from './types.js';
|
|
7
10
|
const SIDECAR_VERSION = 1;
|
|
8
11
|
/** Hidden directory inside workspaceRoot that holds per-upload sidecar files. */
|
|
@@ -28,6 +31,14 @@ function extToContentType(ext) {
|
|
|
28
31
|
return 'video/quicktime';
|
|
29
32
|
case '.m4v':
|
|
30
33
|
return 'video/x-m4v';
|
|
34
|
+
case '.webm':
|
|
35
|
+
return 'video/webm';
|
|
36
|
+
case '.mkv':
|
|
37
|
+
return 'video/x-matroska';
|
|
38
|
+
case '.3gp':
|
|
39
|
+
return 'video/3gpp';
|
|
40
|
+
case '.avi':
|
|
41
|
+
return 'video/x-msvideo';
|
|
31
42
|
case '.srt':
|
|
32
43
|
return 'application/x-subrip';
|
|
33
44
|
case '.pulse':
|
|
@@ -46,6 +57,7 @@ function extToContentType(ext) {
|
|
|
46
57
|
function sidecarToCachedMeta(sidecar, ready) {
|
|
47
58
|
return {
|
|
48
59
|
ext: sidecar.ext,
|
|
60
|
+
...(sidecar.sourceExt ? { sourceExt: sidecar.sourceExt } : {}),
|
|
49
61
|
ready,
|
|
50
62
|
kind: sidecar.kind ?? 'video',
|
|
51
63
|
relatedTo: sidecar.relatedTo,
|
|
@@ -53,9 +65,71 @@ function sidecarToCachedMeta(sidecar, ready) {
|
|
|
53
65
|
name: sidecar.name,
|
|
54
66
|
};
|
|
55
67
|
}
|
|
68
|
+
/** A recorded web-ready result read back from a sidecar. */
|
|
69
|
+
function isWebReadyResult(value) {
|
|
70
|
+
const result = value;
|
|
71
|
+
return (typeof result === 'object' &&
|
|
72
|
+
result !== null &&
|
|
73
|
+
typeof result.action === 'string' &&
|
|
74
|
+
typeof result.reason === 'string');
|
|
75
|
+
}
|
|
56
76
|
export function createLocalStorage(opts) {
|
|
57
77
|
const workspaceRoot = path.resolve(opts.workspaceDir);
|
|
58
|
-
|
|
78
|
+
/**
|
|
79
|
+
* Whether the tus upload `uploadId` (`<kind>/<artifactId><ext>`) finished and a conversion then
|
|
80
|
+
* replaced its file: the sidecar is ready, names this upload's extension as `sourceExt`, and the
|
|
81
|
+
* file is gone. tus still has its record of the upload (`<uploadId>.json`).
|
|
82
|
+
*/
|
|
83
|
+
const replacedByConversion = async (uploadId) => {
|
|
84
|
+
const slash = uploadId.indexOf('/');
|
|
85
|
+
const kind = uploadId.slice(0, slash);
|
|
86
|
+
const artifactId = uploadId.slice(slash + 1, slash + 37);
|
|
87
|
+
const ext = uploadId.slice(slash + 37);
|
|
88
|
+
if (slash < 0 || !isUuid(artifactId) || !EXTENSION_REGEX.test(ext))
|
|
89
|
+
return false;
|
|
90
|
+
const sidecar = await readSidecar(artifactId);
|
|
91
|
+
if (!sidecar || sidecar.status !== 'ready' || (sidecar.kind ?? 'video') !== kind)
|
|
92
|
+
return false;
|
|
93
|
+
if (sidecar.sourceExt !== ext || sidecar.ext === ext)
|
|
94
|
+
return false;
|
|
95
|
+
return (await storedExt(artifactId, sidecar.kind ?? 'video', ext)) !== ext;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* tus's store for the workspace, which also answers for an upload a conversion replaced (a
|
|
99
|
+
* finished `.webm` conformed to `<id>.mp4`): tus would answer a client re-sending the final
|
|
100
|
+
* `PATCH` whose response it lost with `410`, the file being gone. Such an upload reads as
|
|
101
|
+
* complete, and its (empty) tail is taken without a write, so the retry reaches
|
|
102
|
+
* `onUploadFinish`'s already-finished branch and gets `204`, as one without a conversion does.
|
|
103
|
+
*/
|
|
104
|
+
class LocalFileStore extends FileStore {
|
|
105
|
+
async getUpload(id) {
|
|
106
|
+
try {
|
|
107
|
+
return await super.getUpload(id);
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
if (err !== ERRORS.FILE_NO_LONGER_EXISTS || !(await replacedByConversion(id)))
|
|
111
|
+
throw err;
|
|
112
|
+
const record = await this.configstore.get(id);
|
|
113
|
+
if (!record || typeof record.size !== 'number')
|
|
114
|
+
throw err;
|
|
115
|
+
return new Upload({
|
|
116
|
+
id,
|
|
117
|
+
size: record.size,
|
|
118
|
+
offset: record.size,
|
|
119
|
+
metadata: record.metadata,
|
|
120
|
+
creation_date: record.creation_date,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async write(readable, id, offset) {
|
|
125
|
+
if (!(await replacedByConversion(id)))
|
|
126
|
+
return super.write(readable, id, offset);
|
|
127
|
+
for await (const _ of readable)
|
|
128
|
+
; // a finished upload: nothing more to store
|
|
129
|
+
return offset;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const datastore = new LocalFileStore({ directory: workspaceRoot });
|
|
59
133
|
const metaCacheLimit = opts.metaCacheLimit ?? DEFAULT_META_CACHE_LIMIT;
|
|
60
134
|
// Metadata cache keyed by artifactId. Populated eagerly on reserve and
|
|
61
135
|
// lazily from the sidecar on cache-miss — so we never do a workspace-wide
|
|
@@ -96,6 +170,39 @@ export function createLocalStorage(opts) {
|
|
|
96
170
|
};
|
|
97
171
|
/** Relative path (from workspaceRoot) to the artifact bytes. */
|
|
98
172
|
const artifactRelPath = (artifactId, kind, ext) => `${kind}/${artifactId}${ext}`;
|
|
173
|
+
/** The artifact's bytes file, strictly inside its kind directory, as `sidecarPath` checks. */
|
|
174
|
+
const storedPath = (artifactId, kind, ext) => {
|
|
175
|
+
const base = path.resolve(workspaceRoot, kind);
|
|
176
|
+
const resolved = path.resolve(base, `${artifactId}${ext}`);
|
|
177
|
+
if (!resolved.startsWith(`${base}${path.sep}`)) {
|
|
178
|
+
throw new Error('artifactId escapes the kind directory');
|
|
179
|
+
}
|
|
180
|
+
return resolved;
|
|
181
|
+
};
|
|
182
|
+
/**
|
|
183
|
+
* The extension of the file that holds an artifact's bytes, given the `ext` its sidecar names:
|
|
184
|
+
* that file, or for a video the conform target (`<id>.mp4`) when only that exists. A sidecar
|
|
185
|
+
* another instance wrote from a copy older than a conversion still names the uploaded file,
|
|
186
|
+
* which the conversion deleted; its bytes are in the converted file. `null` when neither exists.
|
|
187
|
+
*/
|
|
188
|
+
const storedExt = async (artifactId, kind, ext) => {
|
|
189
|
+
// Only a real id becomes a path, as everywhere else in this adapter.
|
|
190
|
+
if (!isUuid(artifactId) || !EXTENSION_REGEX.test(ext))
|
|
191
|
+
return null;
|
|
192
|
+
const candidates = kind === 'video' && ext !== CONFORM_TARGET.extension ? [ext, CONFORM_TARGET.extension] : [ext];
|
|
193
|
+
for (const candidate of candidates) {
|
|
194
|
+
try {
|
|
195
|
+
const stat = await fs.stat(storedPath(artifactId, kind, candidate));
|
|
196
|
+
if (stat.isFile())
|
|
197
|
+
return candidate;
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
if (err?.code !== 'ENOENT')
|
|
201
|
+
throw err;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return null;
|
|
205
|
+
};
|
|
99
206
|
const writeSidecar = async (artifactId, sidecar) => {
|
|
100
207
|
// Atomic tmp + rename so a crash mid-write can never leave a truncated
|
|
101
208
|
// JSON blob that `loadMeta` would then treat as corrupt. The tmp name is
|
|
@@ -114,10 +221,14 @@ export function createLocalStorage(opts) {
|
|
|
114
221
|
}
|
|
115
222
|
};
|
|
116
223
|
/**
|
|
117
|
-
* Read-modify-write of a sidecar
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
224
|
+
* Read-modify-write of a sidecar runs one at a time per artifact in this process, so an
|
|
225
|
+
* acknowledgement, a conversion switching the stored file and a removal each act on the sidecar
|
|
226
|
+
* as the last of them left it. Across instances sharing the workspace (OPERATIONS.md,
|
|
227
|
+
* "Horizontal scaling") there is no lock: the last rename wins. The completion bookkeeping
|
|
228
|
+
* recovers: the replay redoes a lost acknowledgement or conversion record, idempotently, and a
|
|
229
|
+
* sidecar written from a copy older than a conversion still finds the bytes: a conversion's file
|
|
230
|
+
* is always `<id>.mp4`, which `resolve` and `getLocalPath` fall back to (`storedExt`). A lost
|
|
231
|
+
* `outcome` isn't redone; nothing records it a second time.
|
|
121
232
|
*/
|
|
122
233
|
const sidecarWrites = new Map();
|
|
123
234
|
const withSidecarLock = async (artifactId, work) => {
|
|
@@ -169,6 +280,9 @@ export function createLocalStorage(opts) {
|
|
|
169
280
|
return {
|
|
170
281
|
version: SIDECAR_VERSION,
|
|
171
282
|
ext: parsed.ext,
|
|
283
|
+
...(typeof parsed.sourceExt === 'string' && EXTENSION_REGEX.test(parsed.sourceExt)
|
|
284
|
+
? { sourceExt: parsed.sourceExt }
|
|
285
|
+
: {}),
|
|
172
286
|
filename: parsed.filename,
|
|
173
287
|
status,
|
|
174
288
|
kind,
|
|
@@ -181,8 +295,11 @@ export function createLocalStorage(opts) {
|
|
|
181
295
|
// uploading means its completion hasn't happened yet.
|
|
182
296
|
acknowledged: parsed.acknowledged ?? status === 'ready',
|
|
183
297
|
converted: parsed.converted ?? status === 'ready',
|
|
298
|
+
...(isWebReadyResult(parsed.webReady) ? { webReady: parsed.webReady } : {}),
|
|
299
|
+
...(typeof parsed.generation === 'string' ? { generation: parsed.generation } : {}),
|
|
184
300
|
...(parsed.outcome !== undefined ? { outcome: parsed.outcome } : {}),
|
|
185
301
|
...(typeof parsed.readyAt === 'number' ? { readyAt: parsed.readyAt } : {}),
|
|
302
|
+
...(parsed.generated === true ? { generated: true } : {}),
|
|
186
303
|
};
|
|
187
304
|
}
|
|
188
305
|
catch {
|
|
@@ -221,6 +338,7 @@ export function createLocalStorage(opts) {
|
|
|
221
338
|
artifactId,
|
|
222
339
|
kind: sidecar.kind ?? 'video',
|
|
223
340
|
ext: sidecar.ext,
|
|
341
|
+
...(sidecar.sourceExt ? { sourceExt: sidecar.sourceExt } : {}),
|
|
224
342
|
filename: sidecar.filename,
|
|
225
343
|
...(sidecar.relatedTo ? { relatedTo: sidecar.relatedTo } : {}),
|
|
226
344
|
...(sidecar.checksum ? { checksum: sidecar.checksum } : {}),
|
|
@@ -230,9 +348,12 @@ export function createLocalStorage(opts) {
|
|
|
230
348
|
ready: sidecar.status === 'ready',
|
|
231
349
|
acknowledged: sidecar.acknowledged !== false,
|
|
232
350
|
converted: sidecar.converted !== false,
|
|
351
|
+
...(sidecar.webReady ? { webReady: sidecar.webReady } : {}),
|
|
352
|
+
...(sidecar.generation ? { generation: sidecar.generation } : {}),
|
|
233
353
|
...(sidecar.outcome !== undefined ? { outcome: sidecar.outcome } : {}),
|
|
234
354
|
updatedAt,
|
|
235
355
|
...(sidecar.readyAt !== undefined ? { readyAt: sidecar.readyAt } : {}),
|
|
356
|
+
...(sidecar.generated ? { generated: true } : {}),
|
|
236
357
|
});
|
|
237
358
|
const loadMeta = async (artifactId) => {
|
|
238
359
|
const cached = metaCache.get(artifactId);
|
|
@@ -270,31 +391,36 @@ export function createLocalStorage(opts) {
|
|
|
270
391
|
...(context !== undefined ? { context } : {}),
|
|
271
392
|
acknowledged: false,
|
|
272
393
|
converted: false,
|
|
394
|
+
generation: randomUUID(),
|
|
273
395
|
};
|
|
274
|
-
//
|
|
275
|
-
//
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
throw err;
|
|
286
|
-
// A file already exists at this path, but `readSidecar` treats a malformed/corrupt
|
|
287
|
-
// one as absent (e.g. debris from a crash mid-write) — re-check before deciding this
|
|
288
|
-
// is a genuine collision rather than debris that's safe to overwrite.
|
|
289
|
-
const existing = await readSidecar(artifactId);
|
|
290
|
-
if (existing) {
|
|
291
|
-
throw Object.assign(new Error(`artifactId ${artifactId} already has an upload`), {
|
|
292
|
-
statusCode: 409,
|
|
293
|
-
status_code: 409,
|
|
294
|
-
});
|
|
396
|
+
// Under the sidecar lock, so a removal of the same id in this process either finished
|
|
397
|
+
// (its sidecar went last) or hasn't started.
|
|
398
|
+
await withSidecarLock(artifactId, async () => {
|
|
399
|
+
// Collision guard: `wx` fails atomically with EEXIST if a sidecar already exists for
|
|
400
|
+
// this artifactId, rather than the previous read-then-write (`loadMeta` then
|
|
401
|
+
// `writeSidecar`) which left a window for two concurrent/retried requests to both pass
|
|
402
|
+
// the check before either had written — letting the second silently clobber the first's
|
|
403
|
+
// sidecar and race @tus/file-store's own offset tracking. Translates to HTTP 409 via
|
|
404
|
+
// @tus/server's error path, same as before.
|
|
405
|
+
try {
|
|
406
|
+
await fs.writeFile(sidecarPath(artifactId), JSON.stringify(sidecar), { flag: 'wx' });
|
|
295
407
|
}
|
|
296
|
-
|
|
297
|
-
|
|
408
|
+
catch (err) {
|
|
409
|
+
if (err?.code !== 'EEXIST')
|
|
410
|
+
throw err;
|
|
411
|
+
// A file already exists at this path, but `readSidecar` treats a malformed/corrupt
|
|
412
|
+
// one as absent (e.g. debris from a crash mid-write) — re-check before deciding this
|
|
413
|
+
// is a genuine collision rather than debris that's safe to overwrite.
|
|
414
|
+
const existing = await readSidecar(artifactId);
|
|
415
|
+
if (existing) {
|
|
416
|
+
throw Object.assign(new Error(`artifactId ${artifactId} already has an upload`), {
|
|
417
|
+
statusCode: 409,
|
|
418
|
+
status_code: 409,
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
await writeSidecar(artifactId, sidecar);
|
|
422
|
+
}
|
|
423
|
+
});
|
|
298
424
|
if (relatedTo) {
|
|
299
425
|
// The relation index entry. Written after the sidecar so a crash between the two leaves
|
|
300
426
|
// an artifact without an index entry (it still works, it's just not listed under its
|
|
@@ -308,28 +434,26 @@ export function createLocalStorage(opts) {
|
|
|
308
434
|
// actual file lands at `<workspaceRoot>/<kind>/<artifactId><ext>`.
|
|
309
435
|
return artifactRelPath(artifactId, kind, ext);
|
|
310
436
|
};
|
|
311
|
-
const resolve = async (artifactId) => {
|
|
437
|
+
const resolve = async (artifactId, reread = false) => {
|
|
312
438
|
const meta = await loadMeta(artifactId);
|
|
313
439
|
// Only serve ready uploads. In-progress uploads stay hidden — a client
|
|
314
440
|
// GETting mid-upload would otherwise receive a truncated file.
|
|
315
441
|
if (!meta || !meta.ready)
|
|
316
442
|
return null;
|
|
317
|
-
const
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
443
|
+
const ext = await storedExt(artifactId, meta.kind, meta.ext);
|
|
444
|
+
if (ext === null) {
|
|
445
|
+
// The cache may be older than another instance's removal and new upload of the id: read
|
|
446
|
+
// the sidecar once more.
|
|
447
|
+
if (reread)
|
|
321
448
|
return null;
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
if (err?.code === 'ENOENT')
|
|
325
|
-
return null;
|
|
326
|
-
throw err;
|
|
449
|
+
metaCache.delete(artifactId);
|
|
450
|
+
return resolve(artifactId, true);
|
|
327
451
|
}
|
|
328
452
|
return {
|
|
329
453
|
kind: 'stream',
|
|
330
454
|
root: workspaceRoot,
|
|
331
|
-
filename:
|
|
332
|
-
contentType: extToContentType(
|
|
455
|
+
filename: artifactRelPath(artifactId, meta.kind, ext),
|
|
456
|
+
contentType: extToContentType(ext),
|
|
333
457
|
};
|
|
334
458
|
};
|
|
335
459
|
const markReady = (artifactId) => withSidecarLock(artifactId, async () => {
|
|
@@ -344,32 +468,138 @@ export function createLocalStorage(opts) {
|
|
|
344
468
|
cacheSet(artifactId, sidecarToCachedMeta(sidecar, true));
|
|
345
469
|
return;
|
|
346
470
|
}
|
|
347
|
-
|
|
471
|
+
// An upload reserved before generations were kept gets one now, so its conversion runs.
|
|
472
|
+
await writeSidecar(artifactId, {
|
|
473
|
+
...sidecar,
|
|
474
|
+
status: 'ready',
|
|
475
|
+
readyAt: Date.now(),
|
|
476
|
+
generation: sidecar.generation ?? randomUUID(),
|
|
477
|
+
});
|
|
348
478
|
cacheSet(artifactId, sidecarToCachedMeta(sidecar, true));
|
|
349
479
|
});
|
|
350
|
-
|
|
351
|
-
|
|
480
|
+
/**
|
|
481
|
+
* The steps an upload takes, at once: claim the id (`wx`, as `reserveUpload`), index it under
|
|
482
|
+
* `relatedTo`, rename the bytes into place, then mark it ready, under `relatedTo`'s lock and
|
|
483
|
+
* only while it's still the ready artifact of `relatedGeneration`. Anything that fails after
|
|
484
|
+
* the claim is rolled back, so no half-stored artifact reads as one on its way and stops the
|
|
485
|
+
* next try. A crash part-way leaves an `"uploading"` one the retention sweep removes.
|
|
486
|
+
*/
|
|
487
|
+
const storeArtifact = async ({ artifactId, kind, ext, filename, relatedTo, relatedGeneration, bytes, }) => {
|
|
488
|
+
if (!isUuid(artifactId) || !isUuid(relatedTo))
|
|
489
|
+
throw new Error('storeArtifact needs UUID artifactIds');
|
|
490
|
+
if (!EXTENSION_REGEX.test(ext))
|
|
491
|
+
throw new Error(`storeArtifact: bad extension ${ext}`);
|
|
492
|
+
// Before any path is made from it: `kind` names a directory under the workspace.
|
|
493
|
+
if (parseUploadKind(kind) !== kind)
|
|
494
|
+
throw new Error(`storeArtifact: bad kind ${String(kind)}`);
|
|
495
|
+
await fs.mkdir(path.join(workspaceRoot, kind), { recursive: true, mode: 0o750 });
|
|
496
|
+
await fs.mkdir(sidecarDir(), { recursive: true, mode: 0o750 });
|
|
497
|
+
const sidecar = {
|
|
498
|
+
version: SIDECAR_VERSION,
|
|
499
|
+
ext,
|
|
500
|
+
filename,
|
|
501
|
+
status: 'uploading',
|
|
502
|
+
kind,
|
|
503
|
+
relatedTo,
|
|
504
|
+
// Made here, not uploaded: no host hook to run, nothing to convert.
|
|
505
|
+
acknowledged: true,
|
|
506
|
+
converted: true,
|
|
507
|
+
generation: randomUUID(),
|
|
508
|
+
generated: true,
|
|
509
|
+
};
|
|
510
|
+
await withSidecarLock(artifactId, () => fs.writeFile(sidecarPath(artifactId), JSON.stringify(sidecar), { flag: 'wx' }));
|
|
511
|
+
const dir = relatedDir(relatedTo);
|
|
512
|
+
const finalPath = storedPath(artifactId, kind, ext);
|
|
513
|
+
const tmpPath = `${finalPath}.${randomUUID()}.tmp`;
|
|
514
|
+
const rollBack = async () => {
|
|
515
|
+
await fs.rm(tmpPath, { force: true });
|
|
516
|
+
await fs.rm(finalPath, { force: true });
|
|
517
|
+
await fs.rm(path.join(dir, artifactId), { force: true });
|
|
518
|
+
await withSidecarLock(artifactId, () => fs.rm(sidecarPath(artifactId), { force: true }));
|
|
519
|
+
metaCache.delete(artifactId);
|
|
520
|
+
};
|
|
521
|
+
try {
|
|
522
|
+
await fs.mkdir(dir, { recursive: true, mode: 0o750 });
|
|
523
|
+
await fs.writeFile(path.join(dir, artifactId), '', { flag: 'w' });
|
|
524
|
+
await fs.writeFile(tmpPath, bytes);
|
|
525
|
+
await fs.rename(tmpPath, finalPath);
|
|
526
|
+
// Under the video's lock, so it can't be deleted or reserved again in between.
|
|
527
|
+
const stored = await withSidecarLock(relatedTo, async () => {
|
|
528
|
+
const parent = await readSidecar(relatedTo);
|
|
529
|
+
if (parent?.status !== 'ready' || (parent.generation ?? null) !== relatedGeneration)
|
|
530
|
+
return false;
|
|
531
|
+
await withSidecarLock(artifactId, () => writeSidecar(artifactId, { ...sidecar, status: 'ready', readyAt: Date.now() }));
|
|
532
|
+
return true;
|
|
533
|
+
});
|
|
534
|
+
if (!stored) {
|
|
535
|
+
await rollBack();
|
|
536
|
+
return false;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
catch (err) {
|
|
540
|
+
await rollBack();
|
|
541
|
+
throw err;
|
|
542
|
+
}
|
|
543
|
+
cacheSet(artifactId, sidecarToCachedMeta(sidecar, true));
|
|
544
|
+
return true;
|
|
545
|
+
};
|
|
546
|
+
// Under the sidecar lock, from the sidecar itself: in this process, a conversion switching the
|
|
547
|
+
// artifact to a new file (`patchArtifact` with `ext`) either finishes first — and this removes
|
|
548
|
+
// the new file — or finds the sidecar gone and drops what it wrote.
|
|
549
|
+
const remove = (artifactId) => withSidecarLock(artifactId, async () => {
|
|
550
|
+
// The sidecar decides, never the cache: a read racing this removal (or an earlier one) can
|
|
551
|
+
// have cached the artifact again, and a removal that trusted it would report the same
|
|
552
|
+
// artifact removed twice.
|
|
553
|
+
const sidecar = await readSidecar(artifactId);
|
|
352
554
|
// Drop from cache before rm so a racing `resolve` arriving after the
|
|
353
555
|
// rm but before cache eviction can't hand back a stale path.
|
|
354
556
|
metaCache.delete(artifactId);
|
|
355
|
-
if (!
|
|
557
|
+
if (!sidecar)
|
|
356
558
|
return false;
|
|
559
|
+
const meta = sidecarToCachedMeta(sidecar, sidecar.status === 'ready');
|
|
357
560
|
const artifactPath = path.join(workspaceRoot, meta.kind, `${artifactId}${meta.ext}`);
|
|
561
|
+
// The uploaded file and tus's record of it, when a conversion stored the bytes under a new
|
|
562
|
+
// extension (normally already gone; left behind by a crash during the switch).
|
|
563
|
+
const sourcePath = meta.sourceExt
|
|
564
|
+
? path.join(workspaceRoot, meta.kind, `${artifactId}${meta.sourceExt}`)
|
|
565
|
+
: null;
|
|
566
|
+
// A video's conversion output, whatever this sidecar's copy says (`storedExt`).
|
|
567
|
+
const conformedPath = meta.kind === 'video' && meta.ext !== CONFORM_TARGET.extension
|
|
568
|
+
? path.join(workspaceRoot, artifactRelPath(artifactId, meta.kind, CONFORM_TARGET.extension))
|
|
569
|
+
: null;
|
|
358
570
|
await Promise.all([
|
|
359
571
|
fs.rm(artifactPath, { force: true }),
|
|
360
572
|
fs.rm(`${artifactPath}.json`, { force: true }),
|
|
361
|
-
|
|
573
|
+
...(sourcePath
|
|
574
|
+
? [fs.rm(sourcePath, { force: true }), fs.rm(`${sourcePath}.json`, { force: true })]
|
|
575
|
+
: []),
|
|
576
|
+
...(conformedPath ? [fs.rm(conformedPath, { force: true })] : []),
|
|
362
577
|
...(meta.relatedTo
|
|
363
578
|
? [fs.rm(path.join(relatedDir(meta.relatedTo), artifactId), { force: true })]
|
|
364
579
|
: []),
|
|
365
580
|
]);
|
|
581
|
+
// Last: until the sidecar is gone the id can't be reserved again, so a new upload of it
|
|
582
|
+
// never has its bytes removed by this one's removal.
|
|
583
|
+
await fs.rm(sidecarPath(artifactId), { force: true });
|
|
584
|
+
// Again: a read during the removal may have cached it from the sidecar it still saw.
|
|
585
|
+
metaCache.delete(artifactId);
|
|
366
586
|
return true;
|
|
367
|
-
};
|
|
587
|
+
});
|
|
588
|
+
/**
|
|
589
|
+
* From the sidecar, not the cache: another instance on the same workspace may have removed
|
|
590
|
+
* the artifact and reserved its id again (a new extension) since this one cached it, and a
|
|
591
|
+
* caller about to read or rewrite the bytes must get today's file.
|
|
592
|
+
*/
|
|
368
593
|
const getLocalPath = async (artifactId) => {
|
|
369
|
-
const
|
|
370
|
-
if (!
|
|
594
|
+
const sidecar = await readSidecar(artifactId);
|
|
595
|
+
if (!sidecar) {
|
|
596
|
+
metaCache.delete(artifactId);
|
|
371
597
|
return null;
|
|
372
|
-
|
|
598
|
+
}
|
|
599
|
+
cacheSet(artifactId, sidecarToCachedMeta(sidecar, sidecar.status === 'ready'));
|
|
600
|
+
const kind = sidecar.kind ?? 'video';
|
|
601
|
+
const ext = (await storedExt(artifactId, kind, sidecar.ext)) ?? sidecar.ext;
|
|
602
|
+
return path.join(workspaceRoot, artifactRelPath(artifactId, kind, ext));
|
|
373
603
|
};
|
|
374
604
|
const getKind = async (artifactId) => {
|
|
375
605
|
const meta = await loadMeta(artifactId);
|
|
@@ -395,14 +625,38 @@ export function createLocalStorage(opts) {
|
|
|
395
625
|
return sidecarToMeta(artifactId, sidecar, await lastActivity(artifactId, sidecar));
|
|
396
626
|
};
|
|
397
627
|
const patchArtifact = (artifactId, patch) => withSidecarLock(artifactId, async () => {
|
|
628
|
+
if (patch.ext !== undefined && !EXTENSION_REGEX.test(patch.ext)) {
|
|
629
|
+
throw new TypeError(`patchArtifact: invalid ext ${JSON.stringify(patch.ext)}`);
|
|
630
|
+
}
|
|
398
631
|
const sidecar = await readSidecar(artifactId);
|
|
399
632
|
if (!sidecar)
|
|
400
633
|
return false;
|
|
634
|
+
// Another pass already recorded its conversion, or the id was removed and reserved again:
|
|
635
|
+
// this patch belongs to neither.
|
|
636
|
+
if (patch.unlessConverted && sidecar.converted !== false)
|
|
637
|
+
return false;
|
|
638
|
+
if (patch.generation !== undefined && (sidecar.generation ?? null) !== patch.generation)
|
|
639
|
+
return false;
|
|
640
|
+
const kind = sidecar.kind ?? 'video';
|
|
641
|
+
const stored = (ext) => path.join(workspaceRoot, kind, `${artifactId}${ext}`);
|
|
642
|
+
const ext = patch.ext ?? sidecar.ext;
|
|
643
|
+
if (patch.file !== undefined) {
|
|
644
|
+
if (path.dirname(path.resolve(patch.file)) !== path.join(workspaceRoot, kind)) {
|
|
645
|
+
throw new TypeError('patchArtifact: `file` must be in the artifact\'s kind directory');
|
|
646
|
+
}
|
|
647
|
+
await fs.rename(patch.file, stored(ext));
|
|
648
|
+
}
|
|
401
649
|
const next = { ...sidecar };
|
|
402
650
|
if (patch.acknowledged !== undefined)
|
|
403
651
|
next.acknowledged = patch.acknowledged;
|
|
404
652
|
if (patch.converted !== undefined)
|
|
405
653
|
next.converted = patch.converted;
|
|
654
|
+
if (patch.webReady !== undefined)
|
|
655
|
+
next.webReady = patch.webReady;
|
|
656
|
+
if (patch.ext !== undefined && patch.ext !== sidecar.ext) {
|
|
657
|
+
next.sourceExt = sidecar.sourceExt ?? sidecar.ext;
|
|
658
|
+
next.ext = patch.ext;
|
|
659
|
+
}
|
|
406
660
|
if (patch.outcome !== undefined) {
|
|
407
661
|
if (patch.outcome === null)
|
|
408
662
|
delete next.outcome;
|
|
@@ -413,6 +667,11 @@ export function createLocalStorage(opts) {
|
|
|
413
667
|
// The cache holds nothing a patch changes, but a `ready` flip elsewhere must not be undone
|
|
414
668
|
// by a stale entry either — keep it consistent with what was just written.
|
|
415
669
|
cacheSet(artifactId, sidecarToCachedMeta(next, next.status === 'ready'));
|
|
670
|
+
// The sidecar names the new file: the one under the old extension goes. (A crash before
|
|
671
|
+
// this leaves it for `remove`, which deletes `sourceExt` too. A sidecar copy that still
|
|
672
|
+
// names it finds the new file instead: `storedExt`.)
|
|
673
|
+
if (ext !== sidecar.ext)
|
|
674
|
+
await fs.rm(stored(sidecar.ext), { force: true });
|
|
416
675
|
return true;
|
|
417
676
|
});
|
|
418
677
|
async function* listRelated(artifactId) {
|
|
@@ -498,7 +757,7 @@ export function createLocalStorage(opts) {
|
|
|
498
757
|
workspaceRoot,
|
|
499
758
|
initialize,
|
|
500
759
|
reserveUpload,
|
|
501
|
-
resolve,
|
|
760
|
+
resolve: (artifactId) => resolve(artifactId),
|
|
502
761
|
markReady,
|
|
503
762
|
remove,
|
|
504
763
|
getLocalPath,
|
|
@@ -510,6 +769,7 @@ export function createLocalStorage(opts) {
|
|
|
510
769
|
describeArtifact,
|
|
511
770
|
patchArtifact,
|
|
512
771
|
listRelated,
|
|
772
|
+
storeArtifact,
|
|
513
773
|
};
|
|
514
774
|
}
|
|
515
775
|
//# sourceMappingURL=local.js.map
|