@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.
Files changed (52) hide show
  1. package/CHANGELOG.md +152 -1
  2. package/OPERATIONS.md +123 -46
  3. package/PROTOCOL.md +27 -5
  4. package/README.md +31 -8
  5. package/dist/app.d.ts +8 -7
  6. package/dist/app.d.ts.map +1 -1
  7. package/dist/app.js +4 -3
  8. package/dist/app.js.map +1 -1
  9. package/dist/core.d.ts +23 -9
  10. package/dist/core.d.ts.map +1 -1
  11. package/dist/core.js +106 -21
  12. package/dist/core.js.map +1 -1
  13. package/dist/lib/completion.d.ts +22 -5
  14. package/dist/lib/completion.d.ts.map +1 -1
  15. package/dist/lib/completion.js +247 -35
  16. package/dist/lib/completion.js.map +1 -1
  17. package/dist/lib/deeplinks.d.ts +18 -2
  18. package/dist/lib/deeplinks.d.ts.map +1 -1
  19. package/dist/lib/deeplinks.js +13 -2
  20. package/dist/lib/deeplinks.js.map +1 -1
  21. package/dist/lib/magic.d.ts +41 -1
  22. package/dist/lib/magic.d.ts.map +1 -1
  23. package/dist/lib/magic.js +104 -0
  24. package/dist/lib/magic.js.map +1 -1
  25. package/dist/lib/options.d.ts +2 -0
  26. package/dist/lib/options.d.ts.map +1 -1
  27. package/dist/lib/options.js +8 -4
  28. package/dist/lib/options.js.map +1 -1
  29. package/dist/lib/protocol-version.gen.js +1 -1
  30. package/dist/lib/pulsevaultTus.d.ts.map +1 -1
  31. package/dist/lib/pulsevaultTus.js +35 -1
  32. package/dist/lib/pulsevaultTus.js.map +1 -1
  33. package/dist/lib/web-ready.d.ts +145 -18
  34. package/dist/lib/web-ready.d.ts.map +1 -1
  35. package/dist/lib/web-ready.js +484 -91
  36. package/dist/lib/web-ready.js.map +1 -1
  37. package/dist/storage/local.d.ts +3 -1
  38. package/dist/storage/local.d.ts.map +1 -1
  39. package/dist/storage/local.js +310 -50
  40. package/dist/storage/local.js.map +1 -1
  41. package/dist/storage/s3.d.ts.map +1 -1
  42. package/dist/storage/s3.js +21 -1
  43. package/dist/storage/s3.js.map +1 -1
  44. package/dist/storage/types.d.ts +89 -4
  45. package/dist/storage/types.d.ts.map +1 -1
  46. package/dist/storage/types.js +7 -0
  47. package/dist/storage/types.js.map +1 -1
  48. package/package.json +2 -2
  49. package/protocol/openapi.json +26 -3
  50. package/protocol/schemas/artifact-status.schema.json +13 -1
  51. package/protocol/schemas/deep-link.schema.json +2 -2
  52. 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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"}
@@ -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":"AAKA,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EAExB,iBAAiB,EAEjB,UAAU,EACX,MAAM,YAAY,CAAC;AAgHpB,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;CAC1E,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,YAAY,CAyd1E"}
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"}
@@ -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
- const datastore = new FileStore({ directory: workspaceRoot });
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's flags runs one at a time per artifact in this process, so
118
- * an acknowledgement and a conversion finishing at the same moment can't lose each other's
119
- * write. (Across instances on a shared filesystem the last rename wins; the replay recovers a
120
- * lost acknowledgement or conversion record: both are redone, idempotently.)
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
- // Collision guard: `wx` fails atomically with EEXIST if a sidecar already exists for
275
- // this artifactId, rather than the previous read-then-write (`loadMeta` then
276
- // `writeSidecar`) which left a window for two concurrent/retried requests to both pass
277
- // the check before either had written — letting the second silently clobber the first's
278
- // sidecar and race @tus/file-store's own offset tracking. Translates to HTTP 409 via
279
- // @tus/server's error path, same as before.
280
- try {
281
- await fs.writeFile(sidecarPath(artifactId), JSON.stringify(sidecar), { flag: 'wx' });
282
- }
283
- catch (err) {
284
- if (err?.code !== 'EEXIST')
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
- await writeSidecar(artifactId, sidecar);
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 relFile = artifactRelPath(artifactId, meta.kind, meta.ext);
318
- try {
319
- const stat = await fs.stat(path.join(workspaceRoot, relFile));
320
- if (!stat.isFile())
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
- catch (err) {
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: relFile,
332
- contentType: extToContentType(meta.ext),
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
- await writeSidecar(artifactId, { ...sidecar, status: 'ready', readyAt: Date.now() });
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
- const remove = async (artifactId) => {
351
- const meta = await loadMeta(artifactId);
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 (!meta)
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
- fs.rm(sidecarPath(artifactId), { force: true }),
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 meta = await loadMeta(artifactId);
370
- if (!meta)
594
+ const sidecar = await readSidecar(artifactId);
595
+ if (!sidecar) {
596
+ metaCache.delete(artifactId);
371
597
  return null;
372
- return path.join(workspaceRoot, meta.kind, `${artifactId}${meta.ext}`);
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