@helix3/helix-cli 0.1.16-helix3.249 → 0.1.16-helix3.251

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 CHANGED
@@ -49,7 +49,7 @@ The token is stored in `~/.helix/credentials.json` (mode `600`). It's sent as
49
49
  | `helix item publish <mesh.glb> --title <t> [--collectible-supply <n>] [initial distribution flags] [--dry-run\|--quote]` | Publish a Standard item by default, or one fixed-supply Collectible. The item definition is separate from acquisition routes. |
50
50
  | `helix item distribution create\|list\|update\|disable …` | Manage Marketplace/World Claim or Buy routes without republishing the item or paying another publish fee. |
51
51
  | `helix device create <dir> --id <slug> --title <t> --model <mesh.glb> --template standing-desk\|clock\|television` | Scaffold a GLB-backed `helix.device/1` definition, including the interactive TV/media-player template. There is intentionally no website Device editor. |
52
- | `helix device validate [dir] [--json]` | Validate the definition, GLB bytes and named-node bindings, typed state/controls, capabilities, and Home+World compatibility. |
52
+ | `helix device validate [dir] [--json]` | Validate the definition, GLB bytes and named-node bindings, typed state/controls, capabilities, and Home+World compatibility, including [declarative character hand reach](docs/device-hand-reach.md). |
53
53
  | `helix device test [dir] [--mode single\|multiplayer\|both] [--json]` | Exercise every interaction, persistence remount, and deterministic one-/two-client authority convergence. |
54
54
  | `helix world scene-elements compile <input> --output <scene>` | Compile typed Scene v2 authoring, including exact Continuum Device pins, instances, and locally validated typed links. See [`examples/scene-elements-devices.json`](examples/scene-elements-devices.json). |
55
55
  | `helix preview-video <slug> <youtube-url>` | Set or clear a published world's YouTube preview. |
package/dist/api.d.ts CHANGED
@@ -17,6 +17,14 @@ export declare class HelixApi {
17
17
  private token;
18
18
  constructor(baseUrl: string, token?: string | null);
19
19
  setToken(token: string): void;
20
+ /**
21
+ * A stable, non-reversible scope for durable client state (for example the
22
+ * resumable large-upload checkpoint). It binds that state to this API origin
23
+ * and credential identity, so a signed intent token cannot be reused against
24
+ * another server or account. The bearer itself is never persisted; only this
25
+ * one-way fingerprint leaves memory.
26
+ */
27
+ scopeFingerprint(): string;
20
28
  request<T>(method: string, path: string, body?: unknown): Promise<T>;
21
29
  requestItem<T>(method: string, path: string, body?: unknown): Promise<T>;
22
30
  requestBytes(path: string, headers?: Record<string, string>): Promise<{
package/dist/api.js CHANGED
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.HelixApi = exports.ApiError = exports.API_FETCH_TIMEOUT_MS = void 0;
4
4
  exports.uploadToTicket = uploadToTicket;
5
+ const node_crypto_1 = require("node:crypto");
5
6
  exports.API_FETCH_TIMEOUT_MS = 30_000;
6
7
  function withTimeout(init, timeoutMs = exports.API_FETCH_TIMEOUT_MS) {
7
8
  return { ...init, signal: AbortSignal.timeout(timeoutMs) };
@@ -41,6 +42,26 @@ class HelixApi {
41
42
  setToken(token) {
42
43
  this.token = token;
43
44
  }
45
+ /**
46
+ * A stable, non-reversible scope for durable client state (for example the
47
+ * resumable large-upload checkpoint). It binds that state to this API origin
48
+ * and credential identity, so a signed intent token cannot be reused against
49
+ * another server or account. The bearer itself is never persisted; only this
50
+ * one-way fingerprint leaves memory.
51
+ */
52
+ scopeFingerprint() {
53
+ let origin = this.baseUrl;
54
+ try {
55
+ origin = new URL(this.baseUrl).origin;
56
+ }
57
+ catch {
58
+ // A non-URL base still scopes, just less precisely.
59
+ }
60
+ return (0, node_crypto_1.createHash)('sha256')
61
+ .update(`${origin}\n${this.token ?? ''}`)
62
+ .digest('hex')
63
+ .slice(0, 32);
64
+ }
44
65
  async request(method, path, body) {
45
66
  const res = await fetch(`${this.baseUrl}${path}`, withTimeout({
46
67
  method,
package/dist/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,19 @@ export declare class HelixContinuumApi implements ContinuumPublicationApi {
12
12
  mediaType: string;
13
13
  audience?: 'private' | 'public';
14
14
  }): Promise<ContinuumObjectRecord>;
15
+ /**
16
+ * Publish a cooked file from disk without ever holding the whole file.
17
+ *
18
+ * Small objects keep the generic 32 MiB lane; only a reviewed Unreal object
19
+ * above that cap takes the dedicated resumable large lane. The file is
20
+ * stream-hashed once and each part is read on demand.
21
+ */
22
+ putObjectFromFile(input: {
23
+ path: string;
24
+ filename: string;
25
+ mediaType: string;
26
+ audience?: 'private' | 'public';
27
+ }): Promise<ContinuumObjectRecord>;
15
28
  adoptUniversalItemObject(assetId: string, contentSha256: string, audience?: 'private' | 'public'): Promise<ContinuumObjectRecord>;
16
29
  adoptVaultObject(versionId: string, audience?: 'private' | 'public'): Promise<ContinuumObjectRecord>;
17
30
  adoptInstantWorldObject(buildId: string, contentSha256: string): Promise<ContinuumObjectRecord>;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.HelixLegacyAdminContinuumApi = exports.HelixContinuumApi = void 0;
4
4
  const node_buffer_1 = require("node:buffer");
5
5
  const node_crypto_1 = require("node:crypto");
6
+ const promises_1 = require("node:fs/promises");
6
7
  const objectUpload_1 = require("./objectUpload");
7
8
  function unwrap(value) {
8
9
  return value && typeof value === 'object' && 'item' in value ? value.item : value;
@@ -46,6 +47,41 @@ class HelixContinuumApi {
46
47
  mediaType: input.mediaType, audience: input.audience,
47
48
  }));
48
49
  }
50
+ /**
51
+ * Publish a cooked file from disk without ever holding the whole file.
52
+ *
53
+ * Small objects keep the generic 32 MiB lane; only a reviewed Unreal object
54
+ * above that cap takes the dedicated resumable large lane. The file is
55
+ * stream-hashed once and each part is read on demand.
56
+ */
57
+ async putObjectFromFile(input) {
58
+ const { sha256, sizeBytes } = await (0, objectUpload_1.sha256File)(input.path);
59
+ if (sizeBytes <= objectUpload_1.CONTINUUM_OBJECT_UPLOAD_MAX_BYTES) {
60
+ const bytes = await (0, promises_1.readFile)(input.path);
61
+ const result = await this.putObject({
62
+ bytes,
63
+ filename: input.filename,
64
+ mediaType: input.mediaType,
65
+ audience: input.audience,
66
+ });
67
+ if (result.cid !== `cid:sha256:${sha256}` || result.bytes !== sizeBytes) {
68
+ throw new Error('Continuum finalized receipt does not match the file on disk');
69
+ }
70
+ return result;
71
+ }
72
+ const receipt = await (0, objectUpload_1.stageContinuumLargeObjectFromFile)(this.api, {
73
+ ...input,
74
+ sha256,
75
+ sizeBytes,
76
+ });
77
+ const result = normalizeObjectReceipt(receipt);
78
+ if (result.cid !== `cid:sha256:${sha256}` ||
79
+ result.bytes !== sizeBytes ||
80
+ result.mediaType !== input.mediaType) {
81
+ throw new Error('Continuum large finalized receipt does not match the file on disk');
82
+ }
83
+ return result;
84
+ }
49
85
  async adoptUniversalItemObject(assetId, contentSha256, audience) {
50
86
  return normalizeObjectReceipt(await this.api.request('POST', `/api/v1/continuum/universal-item-assets/${encodeURIComponent(assetId)}/object-adoption`, { contentSha256, audience: audience ?? 'private' }));
51
87
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/continuum/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/continuum/client.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,17 @@
1
- import type { HelixApi } from '../api';
1
+ import { type HelixApi } from '../api';
2
2
  export declare const CONTINUUM_OBJECT_UPLOAD_MAX_BYTES: number;
3
3
  export declare const CONTINUUM_INLINE_OBJECT_MAX_BYTES: number;
4
+ /** Advertised maximum for the dedicated reviewed-Unreal large lane. */
5
+ export declare const CONTINUUM_LARGE_OBJECT_MAX_BYTES: number;
6
+ /** Per-part PUT deadline. A timeout is a transient failure: the checkpoint is kept. */
7
+ export declare const CONTINUUM_LARGE_PART_TIMEOUT_MS: number;
8
+ interface Receipt {
9
+ contentId: string;
10
+ sizeBytes: number;
11
+ mediaType: string;
12
+ filename: string;
13
+ audience: 'private' | 'public';
14
+ }
4
15
  /** Local bytes use the verified binary ingestion flow above the inline endpoint's small JSON-body limit. */
5
16
  export declare function stageContinuumObject(api: HelixApi, input: {
6
17
  bytes: Uint8Array;
@@ -8,3 +19,46 @@ export declare function stageContinuumObject(api: HelixApi, input: {
8
19
  mediaType: string;
9
20
  audience?: 'private' | 'public';
10
21
  }): Promise<unknown>;
22
+ export type ContinuumLargeUploadDeps = {
23
+ /** Durable directory for the resumable intent token. Defaults to ~/.helix. */
24
+ stateDirectory?: string;
25
+ /**
26
+ * Stable checkpoint scope. Defaults to the API origin plus a non-reversible
27
+ * fingerprint of the caller's credential, so a signed intent token can never
28
+ * be reused against another account or server. The raw bearer is never stored.
29
+ */
30
+ scope?: string;
31
+ partTimeoutMs?: number;
32
+ onProgress?: (uploadedBytes: number, totalBytes: number) => void;
33
+ fetchImpl?: typeof fetch;
34
+ now?: () => number;
35
+ };
36
+ export interface ContinuumLargeUploadIntentResponse {
37
+ uploadId: string;
38
+ uploadToken: string;
39
+ expiresAt: string;
40
+ partSizeBytes: number;
41
+ partCount: number;
42
+ parts: {
43
+ partNumber: number;
44
+ partUrl: string;
45
+ }[];
46
+ receipt: Receipt;
47
+ }
48
+ /** Stream a file once to get its exact size and SHA-256 with bounded memory. */
49
+ export declare function sha256File(path: string): Promise<{
50
+ sha256: string;
51
+ sizeBytes: number;
52
+ }>;
53
+ export declare function stageContinuumLargeObjectFromFile(api: HelixApi, input: {
54
+ path: string;
55
+ filename: string;
56
+ mediaType: string;
57
+ audience?: 'private' | 'public';
58
+ sha256?: string;
59
+ sizeBytes?: number;
60
+ }, deps?: ContinuumLargeUploadDeps): Promise<Receipt & {
61
+ cid: string;
62
+ bytes: number;
63
+ }>;
64
+ export {};
@@ -1,10 +1,24 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CONTINUUM_INLINE_OBJECT_MAX_BYTES = exports.CONTINUUM_OBJECT_UPLOAD_MAX_BYTES = void 0;
3
+ exports.CONTINUUM_LARGE_PART_TIMEOUT_MS = exports.CONTINUUM_LARGE_OBJECT_MAX_BYTES = exports.CONTINUUM_INLINE_OBJECT_MAX_BYTES = exports.CONTINUUM_OBJECT_UPLOAD_MAX_BYTES = void 0;
4
4
  exports.stageContinuumObject = stageContinuumObject;
5
+ exports.sha256File = sha256File;
6
+ exports.stageContinuumLargeObjectFromFile = stageContinuumLargeObjectFromFile;
5
7
  const node_crypto_1 = require("node:crypto");
8
+ const promises_1 = require("node:fs/promises");
9
+ const node_os_1 = require("node:os");
10
+ const node_path_1 = require("node:path");
11
+ const api_1 = require("../api");
6
12
  exports.CONTINUUM_OBJECT_UPLOAD_MAX_BYTES = 32 * 1024 * 1024;
7
13
  exports.CONTINUUM_INLINE_OBJECT_MAX_BYTES = 1024 * 1024;
14
+ /** Advertised maximum for the dedicated reviewed-Unreal large lane. */
15
+ exports.CONTINUUM_LARGE_OBJECT_MAX_BYTES = 8 * 1024 * 1024 * 1024;
16
+ /** Per-part PUT deadline. A timeout is a transient failure: the checkpoint is kept. */
17
+ exports.CONTINUUM_LARGE_PART_TIMEOUT_MS = 10 * 60 * 1000;
18
+ /** S3/R2 multipart geometry bounds, mirrored from the backend lane. */
19
+ const LARGE_MIN_PART_BYTES = 5 * 1024 * 1024;
20
+ const LARGE_MAX_PART_BYTES = 5 * 1024 * 1024 * 1024;
21
+ const LARGE_MAX_PARTS = 10_000;
8
22
  /** Local bytes use the verified binary ingestion flow above the inline endpoint's small JSON-body limit. */
9
23
  async function stageContinuumObject(api, input) {
10
24
  if (input.bytes.byteLength > exports.CONTINUUM_OBJECT_UPLOAD_MAX_BYTES)
@@ -31,4 +45,331 @@ async function stageContinuumObject(api, input) {
31
45
  throw new Error(`Continuum binary upload failed (${uploaded.status})`);
32
46
  return api.request('POST', `/api/v1/continuum/objects/upload-intents/${encodeURIComponent(intent.uploadId)}/finalize`, { ...receipt, uploadToken: intent.uploadToken });
33
47
  }
48
+ function largeUploadScope(api, deps) {
49
+ if (deps.scope)
50
+ return deps.scope;
51
+ const candidate = api;
52
+ try {
53
+ const fingerprint = candidate.scopeFingerprint?.();
54
+ if (typeof fingerprint === 'string' && fingerprint)
55
+ return fingerprint;
56
+ }
57
+ catch {
58
+ // A malformed API surface must not silently fall back to a global scope.
59
+ }
60
+ return 'default';
61
+ }
62
+ function largeUploadStateDirectory(api, deps) {
63
+ const base = deps.stateDirectory ?? (0, node_path_1.join)((0, node_os_1.homedir)(), '.helix', 'continuum', 'large-uploads');
64
+ return (0, node_path_1.join)(base, largeUploadScope(api, deps));
65
+ }
66
+ /**
67
+ * The multipart geometry must be internally consistent: a bounded part size and
68
+ * exactly the smallest part count that reconstructs the reserved size. A
69
+ * damaged or forged checkpoint must never request a whole-object buffer or an
70
+ * out-of-range slice.
71
+ */
72
+ function isValidLargeGeometry(value) {
73
+ if (!Number.isSafeInteger(value.partSizeBytes) ||
74
+ value.partSizeBytes < LARGE_MIN_PART_BYTES ||
75
+ value.partSizeBytes > LARGE_MAX_PART_BYTES) {
76
+ return false;
77
+ }
78
+ if (!Number.isSafeInteger(value.partCount) ||
79
+ value.partCount < 1 ||
80
+ value.partCount > LARGE_MAX_PARTS) {
81
+ return false;
82
+ }
83
+ return value.partCount === Math.max(1, Math.ceil(value.sizeBytes / value.partSizeBytes));
84
+ }
85
+ async function readStoredLargeIntent(directory, sha256) {
86
+ try {
87
+ const raw = JSON.parse(await (0, promises_1.readFile)((0, node_path_1.join)(directory, `${sha256}.json`), 'utf8'));
88
+ if (raw?.schema !== 'helix.creator.continuum-large-upload/1' ||
89
+ raw.contentId !== `cid:sha256:${sha256}` ||
90
+ typeof raw.uploadId !== 'string' ||
91
+ !raw.uploadId ||
92
+ typeof raw.uploadToken !== 'string' ||
93
+ !raw.uploadToken ||
94
+ typeof raw.expiresAt !== 'string' ||
95
+ !Number.isFinite(Date.parse(raw.expiresAt)) ||
96
+ !raw.receipt ||
97
+ !isValidLargeGeometry({
98
+ sizeBytes: raw.receipt.sizeBytes,
99
+ partSizeBytes: raw.partSizeBytes,
100
+ partCount: raw.partCount,
101
+ })) {
102
+ return null;
103
+ }
104
+ return raw;
105
+ }
106
+ catch (error) {
107
+ if (error.code === 'ENOENT')
108
+ return null;
109
+ return null;
110
+ }
111
+ }
112
+ async function writeStoredLargeIntent(directory, sha256, intent) {
113
+ await (0, promises_1.mkdir)(directory, { recursive: true, mode: 0o700 });
114
+ const target = (0, node_path_1.join)(directory, `${sha256}.json`);
115
+ const temp = `${target}.${process.pid}.${Date.now()}.tmp`;
116
+ await (0, promises_1.writeFile)(temp, `${JSON.stringify(intent)}\n`, { mode: 0o600 });
117
+ await (0, promises_1.rename)(temp, target);
118
+ }
119
+ async function clearStoredLargeIntent(directory, sha256) {
120
+ await (0, promises_1.unlink)((0, node_path_1.join)(directory, `${sha256}.json`)).catch(() => undefined);
121
+ }
122
+ /** Stream a file once to get its exact size and SHA-256 with bounded memory. */
123
+ async function sha256File(path) {
124
+ const digest = (0, node_crypto_1.createHash)('sha256');
125
+ const handle = await (0, promises_1.open)(path, 'r');
126
+ let sizeBytes = 0;
127
+ try {
128
+ const chunk = Buffer.allocUnsafe(1024 * 1024);
129
+ for (;;) {
130
+ const { bytesRead } = await handle.read(chunk, 0, chunk.length, sizeBytes);
131
+ if (bytesRead === 0)
132
+ break;
133
+ digest.update(chunk.subarray(0, bytesRead));
134
+ sizeBytes += bytesRead;
135
+ }
136
+ }
137
+ finally {
138
+ await handle.close();
139
+ }
140
+ return { sha256: digest.digest('hex'), sizeBytes };
141
+ }
142
+ /** Read exactly `length` bytes at `offset`; never reads more than one part. */
143
+ async function readFileSlice(path, offset, length) {
144
+ const handle = await (0, promises_1.open)(path, 'r');
145
+ try {
146
+ const buffer = Buffer.allocUnsafe(length);
147
+ let filled = 0;
148
+ while (filled < length) {
149
+ const { bytesRead } = await handle.read(buffer, filled, length - filled, offset + filled);
150
+ if (bytesRead === 0)
151
+ break;
152
+ filled += bytesRead;
153
+ }
154
+ if (filled !== length) {
155
+ throw new Error('Continuum large upload file changed while uploading');
156
+ }
157
+ return buffer;
158
+ }
159
+ finally {
160
+ await handle.close();
161
+ }
162
+ }
163
+ function unwrapEnvelope(value) {
164
+ return value && typeof value === 'object' && 'item' in value
165
+ ? value.item
166
+ : value;
167
+ }
168
+ function assertReceipt(value, receipt) {
169
+ const candidate = value;
170
+ if (!candidate ||
171
+ candidate.contentId !== receipt.contentId ||
172
+ candidate.sizeBytes !== receipt.sizeBytes ||
173
+ candidate.mediaType !== receipt.mediaType ||
174
+ candidate.filename !== receipt.filename ||
175
+ candidate.audience !== receipt.audience) {
176
+ throw new Error('Continuum large upload intent does not match the object');
177
+ }
178
+ return candidate;
179
+ }
180
+ function validatePartList(raw, partCount) {
181
+ if (!Array.isArray(raw)) {
182
+ throw new Error('Continuum large upload intent is malformed');
183
+ }
184
+ const seen = new Set();
185
+ return raw.map((part) => {
186
+ const candidate = part;
187
+ if (!candidate ||
188
+ !Number.isSafeInteger(candidate.partNumber) ||
189
+ candidate.partNumber < 1 ||
190
+ candidate.partNumber > partCount ||
191
+ typeof candidate.partUrl !== 'string') {
192
+ throw new Error('Continuum large upload part URL is malformed');
193
+ }
194
+ const partNumber = candidate.partNumber;
195
+ if (seen.has(partNumber)) {
196
+ throw new Error('Continuum large upload intent repeats a part number');
197
+ }
198
+ seen.add(partNumber);
199
+ return { partNumber, partUrl: candidate.partUrl };
200
+ });
201
+ }
202
+ function assertLargeIntent(value, receipt, now) {
203
+ const intent = unwrapEnvelope(value);
204
+ if (!intent ||
205
+ typeof intent.uploadId !== 'string' ||
206
+ !intent.uploadId ||
207
+ typeof intent.uploadToken !== 'string' ||
208
+ !intent.uploadToken ||
209
+ typeof intent.expiresAt !== 'string' ||
210
+ !Number.isFinite(Date.parse(intent.expiresAt)) ||
211
+ !Array.isArray(intent.parts)) {
212
+ throw new Error('Continuum large upload intent is malformed');
213
+ }
214
+ assertReceipt(intent.receipt, receipt);
215
+ if (!isValidLargeGeometry({
216
+ sizeBytes: receipt.sizeBytes,
217
+ partSizeBytes: intent.partSizeBytes,
218
+ partCount: intent.partCount,
219
+ })) {
220
+ throw new Error('Continuum large upload intent geometry is invalid');
221
+ }
222
+ if (Date.parse(intent.expiresAt) <= now) {
223
+ throw new Error('Continuum large upload intent is already expired');
224
+ }
225
+ const parts = validatePartList(intent.parts, intent.partCount);
226
+ return { ...intent, parts };
227
+ }
228
+ function assertPartUrl(url) {
229
+ const parsed = new URL(url);
230
+ if (!['http:', 'https:'].includes(parsed.protocol) ||
231
+ parsed.username ||
232
+ parsed.password ||
233
+ parsed.hash) {
234
+ throw new Error('Continuum large upload part URL is invalid');
235
+ }
236
+ return parsed;
237
+ }
238
+ function resumeFailureKind(error) {
239
+ if (!(error instanceof api_1.ApiError))
240
+ return 'transient';
241
+ const raw = error.body?.message;
242
+ const message = Array.isArray(raw) ? raw.join(' ') : raw ?? '';
243
+ if (error.status === 401)
244
+ return 'closed';
245
+ if (error.status === 403) {
246
+ // The lane uses 403 for both an expired token (replace) and an ownership or
247
+ // approval failure (fail closed). Only the expiry wording may replace state.
248
+ return /expired|expiry/i.test(message) ? 'definitive' : 'closed';
249
+ }
250
+ if ([400, 404, 409, 410, 422].includes(error.status))
251
+ return 'definitive';
252
+ return 'transient';
253
+ }
254
+ async function stageContinuumLargeObjectFromFile(api, input, deps = {}) {
255
+ const fetchImpl = deps.fetchImpl ?? fetch;
256
+ const now = deps.now ?? Date.now;
257
+ const computed = input.sha256 && input.sizeBytes
258
+ ? { sha256: input.sha256, sizeBytes: input.sizeBytes }
259
+ : await sha256File(input.path);
260
+ const { sha256, sizeBytes } = computed;
261
+ if (sizeBytes <= exports.CONTINUUM_OBJECT_UPLOAD_MAX_BYTES) {
262
+ throw new Error('Continuum large upload is only for objects above the 32 MiB generic cap');
263
+ }
264
+ if (sizeBytes > exports.CONTINUUM_LARGE_OBJECT_MAX_BYTES) {
265
+ throw new Error('Continuum large upload exceeds the advertised 8 GiB maximum');
266
+ }
267
+ const receipt = {
268
+ contentId: `cid:sha256:${sha256}`,
269
+ sizeBytes,
270
+ mediaType: input.mediaType,
271
+ filename: input.filename,
272
+ audience: input.audience ?? 'private',
273
+ };
274
+ const directory = largeUploadStateDirectory(api, deps);
275
+ let intent = null;
276
+ const stored = await readStoredLargeIntent(directory, sha256);
277
+ if (stored &&
278
+ Date.parse(stored.expiresAt) > now() &&
279
+ stored.receipt.contentId === receipt.contentId &&
280
+ stored.receipt.mediaType === receipt.mediaType &&
281
+ stored.receipt.filename === receipt.filename &&
282
+ stored.receipt.audience === receipt.audience &&
283
+ stored.receipt.sizeBytes === receipt.sizeBytes) {
284
+ let resumed = null;
285
+ let resumeFailedDefinitively = false;
286
+ try {
287
+ resumed = unwrapEnvelope(await api.request('POST', `/api/v1/continuum/objects/large-upload-intents/${encodeURIComponent(stored.uploadId)}/part-urls`, { uploadToken: stored.uploadToken }));
288
+ }
289
+ catch (error) {
290
+ // A temporary resume error must NOT discard the durable checkpoint.
291
+ if (resumeFailureKind(error) === 'definitive') {
292
+ resumeFailedDefinitively = true;
293
+ }
294
+ else {
295
+ throw error;
296
+ }
297
+ }
298
+ if (resumeFailedDefinitively) {
299
+ // Only a definitive expiry/ownership/unresumable status replaces state.
300
+ await clearStoredLargeIntent(directory, sha256);
301
+ intent = null;
302
+ }
303
+ else if (resumed?.completed === true) {
304
+ // Completed-but-unpublished: finish idempotently. Keep the checkpoint
305
+ // until the server returns the published object, so a transient complete
306
+ // failure can retry without re-uploading.
307
+ try {
308
+ const object = (await api.request('POST', `/api/v1/continuum/objects/large-upload-intents/${encodeURIComponent(stored.uploadId)}/complete`, { ...receipt, uploadToken: stored.uploadToken }));
309
+ await clearStoredLargeIntent(directory, sha256);
310
+ return object;
311
+ }
312
+ catch (error) {
313
+ if (resumeFailureKind(error) === 'definitive') {
314
+ await clearStoredLargeIntent(directory, sha256);
315
+ }
316
+ throw error;
317
+ }
318
+ }
319
+ else {
320
+ intent = {
321
+ uploadId: stored.uploadId,
322
+ uploadToken: stored.uploadToken,
323
+ expiresAt: stored.expiresAt,
324
+ partSizeBytes: stored.partSizeBytes,
325
+ partCount: stored.partCount,
326
+ parts: validatePartList(resumed?.parts ?? [], stored.partCount),
327
+ receipt,
328
+ };
329
+ }
330
+ }
331
+ if (!intent) {
332
+ const created = assertLargeIntent(await api.request('POST', '/api/v1/continuum/objects/large-upload-intents', receipt), receipt, now());
333
+ await writeStoredLargeIntent(directory, sha256, {
334
+ schema: 'helix.creator.continuum-large-upload/1',
335
+ contentId: receipt.contentId,
336
+ uploadId: created.uploadId,
337
+ uploadToken: created.uploadToken,
338
+ expiresAt: created.expiresAt,
339
+ partSizeBytes: created.partSizeBytes,
340
+ partCount: created.partCount,
341
+ receipt,
342
+ });
343
+ intent = created;
344
+ }
345
+ const partCount = intent.partCount;
346
+ const partTimeoutMs = deps.partTimeoutMs ?? exports.CONTINUUM_LARGE_PART_TIMEOUT_MS;
347
+ let uploaded = 0;
348
+ for (const part of [...intent.parts].sort((a, b) => a.partNumber - b.partNumber)) {
349
+ const offset = (part.partNumber - 1) * intent.partSizeBytes;
350
+ const length = Math.min(intent.partSizeBytes, sizeBytes - offset);
351
+ if (length <= 0) {
352
+ throw new Error('Continuum large upload part range is outside the object');
353
+ }
354
+ assertPartUrl(part.partUrl);
355
+ const body = await readFileSlice(input.path, offset, length);
356
+ const response = await fetchImpl(part.partUrl, {
357
+ method: 'PUT',
358
+ body,
359
+ redirect: 'error',
360
+ signal: AbortSignal.timeout(partTimeoutMs),
361
+ });
362
+ if (!response.ok) {
363
+ throw new Error(`Continuum large part upload failed (${response.status})`);
364
+ }
365
+ uploaded += length;
366
+ deps.onProgress?.(uploaded, sizeBytes);
367
+ }
368
+ if (partCount < 1) {
369
+ throw new Error('Continuum large upload has no parts');
370
+ }
371
+ const object = (await api.request('POST', `/api/v1/continuum/objects/large-upload-intents/${encodeURIComponent(intent.uploadId)}/complete`, { ...receipt, uploadToken: intent.uploadToken }));
372
+ await clearStoredLargeIntent(directory, sha256);
373
+ return object;
374
+ }
34
375
  //# sourceMappingURL=objectUpload.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"objectUpload.js","sourceRoot":"","sources":["../../src/continuum/objectUpload.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"objectUpload.js","sourceRoot":"","sources":["../../src/continuum/objectUpload.ts"],"names":[],"mappings":"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"}