dcl-catalyst-client 22.0.0 → 22.0.1-38601546385.commit-cee8815
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 +47 -0
- package/dist/client/CatalystClient.d.ts.map +1 -1
- package/dist/client/CatalystClient.js +2 -1
- package/dist/client/CatalystClient.js.map +1 -1
- package/dist/client/ContentClient.d.ts +10 -2
- package/dist/client/ContentClient.d.ts.map +1 -1
- package/dist/client/ContentClient.js +500 -10
- package/dist/client/ContentClient.js.map +1 -1
- package/dist/client/LambdasClient.d.ts +1 -3
- package/dist/client/LambdasClient.d.ts.map +1 -1
- package/dist/client/LambdasClient.js +0 -2
- package/dist/client/LambdasClient.js.map +1 -1
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +6 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/specs/catalyst.schemas.d.ts +1028 -248
- package/dist/client/specs/catalyst.schemas.d.ts.map +1 -1
- package/dist/client/specs/catalyst.schemas.js +149 -3
- package/dist/client/specs/catalyst.schemas.js.map +1 -1
- package/dist/client/specs/lambdas-client.d.ts +829 -251
- package/dist/client/specs/lambdas-client.d.ts.map +1 -1
- package/dist/client/specs/lambdas-client.js +232 -40
- package/dist/client/specs/lambdas-client.js.map +1 -1
- package/dist/client/types.d.ts +75 -0
- package/dist/client/types.d.ts.map +1 -1
- package/dist/client/utils/batching.d.ts +20 -0
- package/dist/client/utils/batching.d.ts.map +1 -0
- package/dist/client/utils/batching.js +39 -0
- package/dist/client/utils/batching.js.map +1 -0
- package/dist/client/utils/errors.d.ts +43 -0
- package/dist/client/utils/errors.d.ts.map +1 -0
- package/dist/client/utils/errors.js +66 -0
- package/dist/client/utils/errors.js.map +1 -0
- package/dist/client/utils/fetcher.d.ts +1 -1
- package/dist/client/utils/fetcher.d.ts.map +1 -1
- package/dist/client/utils/fetcher.js +15 -1
- package/dist/client/utils/fetcher.js.map +1 -1
- package/dist/client/utils/upload-progress.d.ts +57 -0
- package/dist/client/utils/upload-progress.d.ts.map +1 -0
- package/dist/client/utils/upload-progress.js +246 -0
- package/dist/client/utils/upload-progress.js.map +1 -0
- package/dist/contracts-snapshots/data.d.ts.map +1 -1
- package/dist/contracts-snapshots/data.js +7 -1
- package/dist/contracts-snapshots/data.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/package.json +1 -1
- package/package.json +3 -3
package/dist/client/types.d.ts
CHANGED
|
@@ -28,6 +28,9 @@ export type FetchResponse = {
|
|
|
28
28
|
json(): Promise<any>;
|
|
29
29
|
text(): Promise<string>;
|
|
30
30
|
arrayBuffer(): Promise<ArrayBuffer>;
|
|
31
|
+
headers?: {
|
|
32
|
+
get(name: string): string | null;
|
|
33
|
+
};
|
|
31
34
|
};
|
|
32
35
|
/**
|
|
33
36
|
* The fetch component the client depends on.
|
|
@@ -69,6 +72,68 @@ export type ServerMetadata = {
|
|
|
69
72
|
export type ParallelConfig = {
|
|
70
73
|
urls: string[];
|
|
71
74
|
};
|
|
75
|
+
export type PartialDeploymentProgress = {
|
|
76
|
+
/** Bytes of content confirmed on the server so far (includes content already present before the upload). */
|
|
77
|
+
uploadedBytes: number;
|
|
78
|
+
/** Total bytes of the entity's content files. */
|
|
79
|
+
totalBytes: number;
|
|
80
|
+
/** Number of batches confirmed staged so far. */
|
|
81
|
+
completedBatches: number;
|
|
82
|
+
/** Total number of batches known so far; grows if the server reports more content missing. */
|
|
83
|
+
totalBatches: number;
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Stage of an upload reported by `onUploadProgress`:
|
|
87
|
+
* - `checking`: asking the server which files it already stores.
|
|
88
|
+
* - `uploading`: file bytes are going out.
|
|
89
|
+
* - `processing`: every scheduled byte was sent; waiting for the server's answer.
|
|
90
|
+
*/
|
|
91
|
+
export type UploadPhase = 'checking' | 'uploading' | 'processing';
|
|
92
|
+
/** Byte-level progress of a deployment upload. */
|
|
93
|
+
export type UploadProgress = {
|
|
94
|
+
phase: UploadPhase;
|
|
95
|
+
/**
|
|
96
|
+
* File bytes handed to the HTTP client so far, summed across requests (multipart overhead excluded).
|
|
97
|
+
* Never decreases and never exceeds `totalBytes`.
|
|
98
|
+
*/
|
|
99
|
+
sentBytes: number;
|
|
100
|
+
/**
|
|
101
|
+
* File bytes the deployment must send: files the server already stores are excluded, and the entity
|
|
102
|
+
* file is included when sent. Grows when content is re-sent (retries, the server's `missing` list).
|
|
103
|
+
* While `checking`, it is every candidate file.
|
|
104
|
+
*/
|
|
105
|
+
totalBytes: number;
|
|
106
|
+
};
|
|
107
|
+
export type UploadProgressOptions = {
|
|
108
|
+
/**
|
|
109
|
+
* Invoked with byte-level upload progress, at most every 200 ms plus on every phase change. With
|
|
110
|
+
* {@link ClientOptions.streamingUploads} on Node, the request body is streamed and counted as it is
|
|
111
|
+
* handed to the HTTP client; otherwise a request's bytes count as sent when its response arrives.
|
|
112
|
+
*/
|
|
113
|
+
onUploadProgress?: (progress: UploadProgress) => void;
|
|
114
|
+
};
|
|
115
|
+
export type PartialDeploymentOptions = UploadProgressOptions & {
|
|
116
|
+
/**
|
|
117
|
+
* Max summed file bytes per request. Default {@link DEFAULT_MAX_BATCH_SIZE_BYTES} (100 MiB — safely
|
|
118
|
+
* under the ~200MB request ceiling of the infrastructure in front of the content servers).
|
|
119
|
+
*/
|
|
120
|
+
maxBatchSizeBytes?: number;
|
|
121
|
+
/** Concurrent batch uploads after the first (entity-carrying) request. Default 2. */
|
|
122
|
+
concurrency?: number;
|
|
123
|
+
/**
|
|
124
|
+
* Retries after retryable failures (408, 409, 429, 5xx, network), and rounds allowed without progress
|
|
125
|
+
* when the server keeps reporting content missing. Both budgets reset whenever the server's missing
|
|
126
|
+
* list shrinks below its lowest count so far. Default 3.
|
|
127
|
+
*/
|
|
128
|
+
maxResumeAttempts?: number;
|
|
129
|
+
/** Base retry delay in ms, doubled on each retry (exponential backoff), never below `Retry-After`. Default 1000. */
|
|
130
|
+
resumeDelay?: number;
|
|
131
|
+
/** Invoked after each staged batch with cumulative progress. */
|
|
132
|
+
onProgress?: (progress: PartialDeploymentProgress) => void;
|
|
133
|
+
};
|
|
134
|
+
export type PartialDeploymentResult = {
|
|
135
|
+
creationTimestamp: number;
|
|
136
|
+
};
|
|
72
137
|
export type ClientOptions = {
|
|
73
138
|
url: string;
|
|
74
139
|
fetcher: IFetchComponent;
|
|
@@ -79,5 +144,15 @@ export type ClientOptions = {
|
|
|
79
144
|
* @type {ParallelConfig}
|
|
80
145
|
*/
|
|
81
146
|
parallelConfig?: ParallelConfig;
|
|
147
|
+
/**
|
|
148
|
+
* Declares that `fetcher` can send a streamed deployment body, so `onUploadProgress` counts bytes as
|
|
149
|
+
* they go out instead of per request. Default false. Only enable it when the fetcher:
|
|
150
|
+
* - passes `body` to the global (undici) `fetch` of Node >= 18, which accepts a web `ReadableStream`;
|
|
151
|
+
* - forwards the `duplex: 'half'` option and the `content-length` header unchanged;
|
|
152
|
+
* - never retries a POST with the same options, since the stream can only be read once.
|
|
153
|
+
* `@dcl/fetch-component` meets this. node-fetch does not (it would send the stream as a string).
|
|
154
|
+
* Each request in flight then also holds an encoded copy of its body, about the batch size.
|
|
155
|
+
*/
|
|
156
|
+
streamingUploads?: boolean;
|
|
82
157
|
};
|
|
83
158
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AAEpE;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,IAAI,CAAC,EAAE,GAAG,CAAA;IACV,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,CAAA;IACpB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;IACvB,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default cap on the summed file bytes per partial-deployment request. The infrastructure in front of
|
|
3
|
+
* the content servers times out requests larger than ~200MB, so 100MB keeps a comfortable safety
|
|
4
|
+
* margin (the cap counts file bytes, not exact wire size — the margin also absorbs multipart overhead
|
|
5
|
+
* and the entity JSON riding along in the first request) while keeping the request count low for large
|
|
6
|
+
* scenes. Also under the servers' own request caps (worlds-content-server 350MB, catalyst 2GiB).
|
|
7
|
+
*/
|
|
8
|
+
export declare const DEFAULT_MAX_BATCH_SIZE_BYTES: number;
|
|
9
|
+
export type FileBatch = {
|
|
10
|
+
hashes: string[];
|
|
11
|
+
sizeBytes: number;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Splits files into batches whose summed byte size stays at or below `maxBatchSizeBytes`, using
|
|
15
|
+
* first-fit-decreasing bin packing. Files are never split, so a file larger than the cap still lands
|
|
16
|
+
* alone in an over-cap batch; deployPartial rejects such files before uploading. Deterministic given the
|
|
17
|
+
* same input.
|
|
18
|
+
*/
|
|
19
|
+
export declare function splitIntoBatches(files: Map<string, Uint8Array>, maxBatchSizeBytes: number): FileBatch[];
|
|
20
|
+
//# sourceMappingURL=batching.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batching.d.ts","sourceRoot":"","sources":["../../../src/client/utils/batching.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,QAAoB,CAAA;AAE7D,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,iBAAiB,EAAE,MAAM,GAAG,SAAS,EAAE,CAqBvG"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.splitIntoBatches = exports.DEFAULT_MAX_BATCH_SIZE_BYTES = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Default cap on the summed file bytes per partial-deployment request. The infrastructure in front of
|
|
6
|
+
* the content servers times out requests larger than ~200MB, so 100MB keeps a comfortable safety
|
|
7
|
+
* margin (the cap counts file bytes, not exact wire size — the margin also absorbs multipart overhead
|
|
8
|
+
* and the entity JSON riding along in the first request) while keeping the request count low for large
|
|
9
|
+
* scenes. Also under the servers' own request caps (worlds-content-server 350MB, catalyst 2GiB).
|
|
10
|
+
*/
|
|
11
|
+
exports.DEFAULT_MAX_BATCH_SIZE_BYTES = 100 * 1024 * 1024; // 100 MiB
|
|
12
|
+
/**
|
|
13
|
+
* Splits files into batches whose summed byte size stays at or below `maxBatchSizeBytes`, using
|
|
14
|
+
* first-fit-decreasing bin packing. Files are never split, so a file larger than the cap still lands
|
|
15
|
+
* alone in an over-cap batch; deployPartial rejects such files before uploading. Deterministic given the
|
|
16
|
+
* same input.
|
|
17
|
+
*/
|
|
18
|
+
function splitIntoBatches(files, maxBatchSizeBytes) {
|
|
19
|
+
const entries = Array.from(files.entries()).sort((a, b) => b[1].byteLength - a[1].byteLength);
|
|
20
|
+
const batches = [];
|
|
21
|
+
for (const [hash, content] of entries) {
|
|
22
|
+
const size = content.byteLength;
|
|
23
|
+
let placed = false;
|
|
24
|
+
for (const batch of batches) {
|
|
25
|
+
if (batch.sizeBytes + size <= maxBatchSizeBytes) {
|
|
26
|
+
batch.hashes.push(hash);
|
|
27
|
+
batch.sizeBytes += size;
|
|
28
|
+
placed = true;
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (!placed) {
|
|
33
|
+
batches.push({ hashes: [hash], sizeBytes: size });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return batches;
|
|
37
|
+
}
|
|
38
|
+
exports.splitIntoBatches = splitIntoBatches;
|
|
39
|
+
//# sourceMappingURL=batching.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batching.js","sourceRoot":"","sources":["../../../src/client/utils/batching.ts"],"names":[],"mappings":";;;AAAA;;;;;;GAMG;AACU,QAAA,4BAA4B,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAA,CAAC,UAAU;AAOxE;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,KAA8B,EAAE,iBAAyB;IACxF,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;IAC7F,MAAM,OAAO,GAAgB,EAAE,CAAA;IAE/B,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,OAAO,EAAE;QACrC,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAA;QAC/B,IAAI,MAAM,GAAG,KAAK,CAAA;QAClB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;YAC3B,IAAI,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,iBAAiB,EAAE;gBAC/C,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACvB,KAAK,CAAC,SAAS,IAAI,IAAI,CAAA;gBACvB,MAAM,GAAG,IAAI,CAAA;gBACb,MAAK;aACN;SACF;QACD,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;SAClD;KACF;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AArBD,4CAqBC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** Base error for a failed deployment. Carries the HTTP status and raw response body when available. */
|
|
2
|
+
export declare class DeploymentError extends Error {
|
|
3
|
+
readonly status?: number | undefined;
|
|
4
|
+
readonly responseBody?: string | undefined;
|
|
5
|
+
constructor(message: string, status?: number | undefined, responseBody?: string | undefined);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* The server rejected the deployment with a validation error (HTTP 400) — e.g. the deployment exceeds
|
|
9
|
+
* the size budget, or a signature/permission check failed. Terminal: retrying will not help.
|
|
10
|
+
*/
|
|
11
|
+
export declare class PartialDeploymentValidationError extends DeploymentError {
|
|
12
|
+
constructor(message: string, status?: number, responseBody?: string);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The target server does not support partial deployments: it ran the full deployment pipeline on a
|
|
16
|
+
* staging request and rejected it because referenced content was not uploaded or stored. Fall back to
|
|
17
|
+
* `deploy()` (a single request) against such a server. Best-effort detection via the server's error text.
|
|
18
|
+
*/
|
|
19
|
+
export declare class PartialDeploymentNotSupportedError extends DeploymentError {
|
|
20
|
+
constructor(message: string, status?: number, responseBody?: string);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* A transient failure the resume loop should retry (408, 409, 429, 5xx). Deliberately NOT a
|
|
24
|
+
* {@link DeploymentError} (those are terminal). `retryAfterMs`, when set from a server `Retry-After`
|
|
25
|
+
* header, is used as the backoff floor so the client waits out the server's window instead of exhausting
|
|
26
|
+
* its attempts inside it.
|
|
27
|
+
*/
|
|
28
|
+
export declare class RetryablePartialDeploymentError extends Error {
|
|
29
|
+
readonly retryAfterMs?: number | undefined;
|
|
30
|
+
readonly status?: number | undefined;
|
|
31
|
+
readonly responseBody?: string | undefined;
|
|
32
|
+
constructor(message: string, retryAfterMs?: number | undefined, status?: number | undefined, responseBody?: string | undefined);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The server asked to retry later than the client is willing to wait (e.g. a partial-upload quota that
|
|
36
|
+
* frees up only when older uploads expire). Terminal for this call; `retryAfterMs` says when a new
|
|
37
|
+
* attempt may succeed, and the message carries the server's explanation.
|
|
38
|
+
*/
|
|
39
|
+
export declare class PartialDeploymentRetryLaterError extends DeploymentError {
|
|
40
|
+
readonly retryAfterMs: number;
|
|
41
|
+
constructor(message: string, retryAfterMs: number, status?: number, responseBody?: string);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/client/utils/errors.ts"],"names":[],"mappings":"AAAA,wGAAwG;AACxG,qBAAa,eAAgB,SAAQ,KAAK;aACK,MAAM,CAAC;aAA0B,YAAY,CAAC;gBAA/E,OAAO,EAAE,MAAM,EAAkB,MAAM,CAAC,oBAAQ,EAAkB,YAAY,CAAC,oBAAQ;CAIpG;AAED;;;GAGG;AACH,qBAAa,gCAAiC,SAAQ,eAAe;gBACvD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;CAIpE;AAED;;;;GAIG;AACH,qBAAa,kCAAmC,SAAQ,eAAe;gBACzD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;CAIpE;AAED;;;;;GAKG;AACH,qBAAa,+BAAgC,SAAQ,KAAK;aAGtC,YAAY,CAAC;aACb,MAAM,CAAC;aACP,YAAY,CAAC;gBAH7B,OAAO,EAAE,MAAM,EACC,YAAY,CAAC,oBAAQ,EACrB,MAAM,CAAC,oBAAQ,EACf,YAAY,CAAC,oBAAQ;CAKxC;AAED;;;;GAIG;AACH,qBAAa,gCAAiC,SAAQ,eAAe;aACtB,YAAY,EAAE,MAAM;gBAArD,OAAO,EAAE,MAAM,EAAkB,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;CAI1G"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PartialDeploymentRetryLaterError = exports.RetryablePartialDeploymentError = exports.PartialDeploymentNotSupportedError = exports.PartialDeploymentValidationError = exports.DeploymentError = void 0;
|
|
4
|
+
/** Base error for a failed deployment. Carries the HTTP status and raw response body when available. */
|
|
5
|
+
class DeploymentError extends Error {
|
|
6
|
+
constructor(message, status, responseBody) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.status = status;
|
|
9
|
+
this.responseBody = responseBody;
|
|
10
|
+
this.name = 'DeploymentError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.DeploymentError = DeploymentError;
|
|
14
|
+
/**
|
|
15
|
+
* The server rejected the deployment with a validation error (HTTP 400) — e.g. the deployment exceeds
|
|
16
|
+
* the size budget, or a signature/permission check failed. Terminal: retrying will not help.
|
|
17
|
+
*/
|
|
18
|
+
class PartialDeploymentValidationError extends DeploymentError {
|
|
19
|
+
constructor(message, status, responseBody) {
|
|
20
|
+
super(message, status, responseBody);
|
|
21
|
+
this.name = 'PartialDeploymentValidationError';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.PartialDeploymentValidationError = PartialDeploymentValidationError;
|
|
25
|
+
/**
|
|
26
|
+
* The target server does not support partial deployments: it ran the full deployment pipeline on a
|
|
27
|
+
* staging request and rejected it because referenced content was not uploaded or stored. Fall back to
|
|
28
|
+
* `deploy()` (a single request) against such a server. Best-effort detection via the server's error text.
|
|
29
|
+
*/
|
|
30
|
+
class PartialDeploymentNotSupportedError extends DeploymentError {
|
|
31
|
+
constructor(message, status, responseBody) {
|
|
32
|
+
super(message, status, responseBody);
|
|
33
|
+
this.name = 'PartialDeploymentNotSupportedError';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.PartialDeploymentNotSupportedError = PartialDeploymentNotSupportedError;
|
|
37
|
+
/**
|
|
38
|
+
* A transient failure the resume loop should retry (408, 409, 429, 5xx). Deliberately NOT a
|
|
39
|
+
* {@link DeploymentError} (those are terminal). `retryAfterMs`, when set from a server `Retry-After`
|
|
40
|
+
* header, is used as the backoff floor so the client waits out the server's window instead of exhausting
|
|
41
|
+
* its attempts inside it.
|
|
42
|
+
*/
|
|
43
|
+
class RetryablePartialDeploymentError extends Error {
|
|
44
|
+
constructor(message, retryAfterMs, status, responseBody) {
|
|
45
|
+
super(message);
|
|
46
|
+
this.retryAfterMs = retryAfterMs;
|
|
47
|
+
this.status = status;
|
|
48
|
+
this.responseBody = responseBody;
|
|
49
|
+
this.name = 'RetryablePartialDeploymentError';
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.RetryablePartialDeploymentError = RetryablePartialDeploymentError;
|
|
53
|
+
/**
|
|
54
|
+
* The server asked to retry later than the client is willing to wait (e.g. a partial-upload quota that
|
|
55
|
+
* frees up only when older uploads expire). Terminal for this call; `retryAfterMs` says when a new
|
|
56
|
+
* attempt may succeed, and the message carries the server's explanation.
|
|
57
|
+
*/
|
|
58
|
+
class PartialDeploymentRetryLaterError extends DeploymentError {
|
|
59
|
+
constructor(message, retryAfterMs, status, responseBody) {
|
|
60
|
+
super(message, status, responseBody);
|
|
61
|
+
this.retryAfterMs = retryAfterMs;
|
|
62
|
+
this.name = 'PartialDeploymentRetryLaterError';
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.PartialDeploymentRetryLaterError = PartialDeploymentRetryLaterError;
|
|
66
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/client/utils/errors.ts"],"names":[],"mappings":";;;AAAA,wGAAwG;AACxG,MAAa,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe,EAAkB,MAAe,EAAkB,YAAqB;QACjG,KAAK,CAAC,OAAO,CAAC,CAAA;QAD6B,WAAM,GAAN,MAAM,CAAS;QAAkB,iBAAY,GAAZ,YAAY,CAAS;QAEjG,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;IAC/B,CAAC;CACF;AALD,0CAKC;AAED;;;GAGG;AACH,MAAa,gCAAiC,SAAQ,eAAe;IACnE,YAAY,OAAe,EAAE,MAAe,EAAE,YAAqB;QACjE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,CAAA;QACpC,IAAI,CAAC,IAAI,GAAG,kCAAkC,CAAA;IAChD,CAAC;CACF;AALD,4EAKC;AAED;;;;GAIG;AACH,MAAa,kCAAmC,SAAQ,eAAe;IACrE,YAAY,OAAe,EAAE,MAAe,EAAE,YAAqB;QACjE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,CAAA;QACpC,IAAI,CAAC,IAAI,GAAG,oCAAoC,CAAA;IAClD,CAAC;CACF;AALD,gFAKC;AAED;;;;;GAKG;AACH,MAAa,+BAAgC,SAAQ,KAAK;IACxD,YACE,OAAe,EACC,YAAqB,EACrB,MAAe,EACf,YAAqB;QAErC,KAAK,CAAC,OAAO,CAAC,CAAA;QAJE,iBAAY,GAAZ,YAAY,CAAS;QACrB,WAAM,GAAN,MAAM,CAAS;QACf,iBAAY,GAAZ,YAAY,CAAS;QAGrC,IAAI,CAAC,IAAI,GAAG,iCAAiC,CAAA;IAC/C,CAAC;CACF;AAVD,0EAUC;AAED;;;;GAIG;AACH,MAAa,gCAAiC,SAAQ,eAAe;IACnE,YAAY,OAAe,EAAkB,YAAoB,EAAE,MAAe,EAAE,YAAqB;QACvG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,CAAA;QADO,iBAAY,GAAZ,YAAY,CAAQ;QAE/D,IAAI,CAAC,IAAI,GAAG,kCAAkC,CAAA;IAChD,CAAC;CACF;AALD,4EAKC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../../../src/client/utils/fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE1C,KAAK,OAAO,GAAG;IACb,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../../../src/client/utils/fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE1C,KAAK,OAAO,GAAG;IACb,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAA;IAC5D,MAAM,CAAC,EAAE,GAAG,CAAA;IACZ,IAAI,CAAC,EAAE,GAAG,CAAA;IACV,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC,CAAA;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;AAcrF,eAAO,MAAM,eAAe,8CAA+C,OAAO,oBAcjF,CAAA;AAED,eAAe,eAAe,CAAA"}
|
|
@@ -1,15 +1,29 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.useCustomClient = void 0;
|
|
4
|
+
// Arrays become repeated keys; null and undefined are left out (presence flags would read them as set).
|
|
5
|
+
function toSearchParams(params) {
|
|
6
|
+
const searchParams = new URLSearchParams();
|
|
7
|
+
for (const [key, value] of Object.entries(params !== null && params !== void 0 ? params : {})) {
|
|
8
|
+
for (const item of Array.isArray(value) ? value : [value]) {
|
|
9
|
+
if (item !== undefined && item !== null)
|
|
10
|
+
searchParams.append(key, String(item));
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return searchParams;
|
|
14
|
+
}
|
|
4
15
|
// NOTE: used by orval generator
|
|
5
16
|
const useCustomClient = ({ url, method, params, data, headers }) => {
|
|
6
17
|
const relPath = url.substring('/lambdas'.length + 1);
|
|
7
18
|
return async function (baseUrl, fetch) {
|
|
8
|
-
const response = await fetch.fetch(`${baseUrl}/${relPath}?` +
|
|
19
|
+
const response = await fetch.fetch(`${baseUrl}/${relPath}?` + toSearchParams(params), {
|
|
9
20
|
method,
|
|
10
21
|
headers,
|
|
11
22
|
...(data ? { body: JSON.stringify(data) } : {})
|
|
12
23
|
});
|
|
24
|
+
// A HEAD response has no body to parse.
|
|
25
|
+
if (method === 'head')
|
|
26
|
+
return undefined;
|
|
13
27
|
return response.json();
|
|
14
28
|
};
|
|
15
29
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../../../src/client/utils/fetcher.ts"],"names":[],"mappings":";;;AAaA,gCAAgC;AACzB,MAAM,eAAe,GAAG,CAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAW,EAAmB,EAAE;IACrG,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACpD,OAAO,KAAK,WAAW,OAAe,EAAE,KAAsB;QAC5D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,OAAO,GAAG,GAAG,
|
|
1
|
+
{"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../../../src/client/utils/fetcher.ts"],"names":[],"mappings":";;;AAaA,wGAAwG;AACxG,SAAS,cAAc,CAAC,MAAgC;IACtD,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAA;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC,EAAE;QACvD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;YACzD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI;gBAAE,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;SAChF;KACF;IACD,OAAO,YAAY,CAAA;AACrB,CAAC;AAED,gCAAgC;AACzB,MAAM,eAAe,GAAG,CAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAW,EAAmB,EAAE;IACrG,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACpD,OAAO,KAAK,WAAW,OAAe,EAAE,KAAsB;QAC5D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,OAAO,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,EAAE;YACpF,MAAM;YACN,OAAO;YACP,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChD,CAAC,CAAA;QAEF,wCAAwC;QACxC,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO,SAAc,CAAA;QAE5C,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAA;IACxB,CAAC,CAAA;AACH,CAAC,CAAA;AAdY,QAAA,eAAe,mBAc3B;AAED,kBAAe,uBAAe,CAAA"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { UploadProgress } from '../types';
|
|
2
|
+
export declare const UPLOAD_PROGRESS_INTERVAL_MS = 200;
|
|
3
|
+
export declare const UPLOAD_SLICE_BYTES: number;
|
|
4
|
+
/** Whether request bodies can be streamed (and so counted as they go out): only on Node. */
|
|
5
|
+
export declare function supportsStreamingUpload(): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Whether `error` is the rejection of a fetcher that dropped the `duplex` option of a streamed body.
|
|
8
|
+
* Targets undici's "TypeError: RequestInit: duplex option is required when sending a body."
|
|
9
|
+
*/
|
|
10
|
+
export declare function isDuplexUnsupportedError(error: unknown): boolean;
|
|
11
|
+
export type CountingBody = {
|
|
12
|
+
body: ReadableStream<Uint8Array>;
|
|
13
|
+
headers: {
|
|
14
|
+
'content-type': string;
|
|
15
|
+
'content-length': string;
|
|
16
|
+
};
|
|
17
|
+
/** Releases the encoded body and stops the stream if it is still open. */
|
|
18
|
+
dispose: () => void;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Encodes `form` once and returns a stream of it that calls `onStreamed` with the cumulative
|
|
22
|
+
* number of body bytes handed to the HTTP client, one slice at a time.
|
|
23
|
+
*/
|
|
24
|
+
export declare function createCountingBody(url: string, form: FormData, onStreamed: (streamedBytes: number, bodyBytes: number) => void, signal?: AbortSignal): Promise<CountingBody>;
|
|
25
|
+
/** Returns `headers` plus `extra`, dropping any caller header that `extra` replaces (case-insensitive). */
|
|
26
|
+
export declare function withBodyHeaders(headers: Record<string, string> | undefined, extra: Record<string, string>): Record<string, string>;
|
|
27
|
+
/** Progress of one request, in file bytes. */
|
|
28
|
+
export type UploadRequestProgress = {
|
|
29
|
+
/** Body bytes streamed so far; converted to file bytes proportionally. */
|
|
30
|
+
streamed(streamedBytes: number, bodyBytes: number): void;
|
|
31
|
+
/** The body won't be streamed after all: its bytes count when the response arrives. */
|
|
32
|
+
unstreamed(): void;
|
|
33
|
+
/** A response arrived for an unstreamed body: all its file bytes count as sent. */
|
|
34
|
+
delivered(): void;
|
|
35
|
+
/** The request ended. Bytes it never sent leave the total only once a retry or success follows. */
|
|
36
|
+
end(): void;
|
|
37
|
+
};
|
|
38
|
+
export type UploadProgressTracker = {
|
|
39
|
+
/** Reports the `/available-content` check, with every candidate file as the provisional total. */
|
|
40
|
+
checking(candidateBytes: number): void;
|
|
41
|
+
/** Adds the file bytes a round of requests is about to send, dropping what earlier rounds never sent. */
|
|
42
|
+
plan(fileBytes: number): void;
|
|
43
|
+
/** Starts a request carrying `fileBytes` of the planned bytes; `streaming` when its body is counted. */
|
|
44
|
+
request(fileBytes: number, streaming: boolean): UploadRequestProgress;
|
|
45
|
+
/** The deployment succeeded: emits `processing` with every byte sent, then stops. */
|
|
46
|
+
complete(): void;
|
|
47
|
+
/** The deployment failed: stops without emitting. */
|
|
48
|
+
close(): void;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Runs `upload`, completing the tracker when it succeeds and closing it silently when it rejects or
|
|
52
|
+
* `succeeded` rejects its result (e.g. an error response the caller still receives).
|
|
53
|
+
*/
|
|
54
|
+
export declare function trackUpload<T>(tracker: UploadProgressTracker | undefined, upload: () => Promise<T>, succeeded?: (result: T) => boolean): Promise<T>;
|
|
55
|
+
/** Tracks byte-level upload progress across requests, throttling events to `onUploadProgress`. */
|
|
56
|
+
export declare function createUploadProgressTracker(onUploadProgress: (progress: UploadProgress) => void, now?: () => number, intervalMs?: number): UploadProgressTracker;
|
|
57
|
+
//# sourceMappingURL=upload-progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-progress.d.ts","sourceRoot":"","sources":["../../../src/client/utils/upload-progress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,cAAc,EAAE,MAAM,UAAU,CAAA;AAGtD,eAAO,MAAM,2BAA2B,MAAM,CAAA;AAG9C,eAAO,MAAM,kBAAkB,QAAa,CAAA;AAE5C,4FAA4F;AAC5F,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEhE;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,CAAA;IAChC,OAAO,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7D,0EAA0E;IAC1E,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB,CAAA;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,QAAQ,EACd,UAAU,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,EAC9D,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC,CAsDvB;AAED,2GAA2G;AAC3G,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC3C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIxB;AAED,8CAA8C;AAC9C,MAAM,MAAM,qBAAqB,GAAG;IAClC,0EAA0E;IAC1E,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxD,uFAAuF;IACvF,UAAU,IAAI,IAAI,CAAA;IAClB,mFAAmF;IACnF,SAAS,IAAI,IAAI,CAAA;IACjB,mGAAmG;IACnG,GAAG,IAAI,IAAI,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,kGAAkG;IAClG,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IACtC,yGAAyG;IACzG,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,wGAAwG;IACxG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,qBAAqB,CAAA;IACrE,qFAAqF;IACrF,QAAQ,IAAI,IAAI,CAAA;IAChB,qDAAqD;IACrD,KAAK,IAAI,IAAI,CAAA;CACd,CAAA;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,CAAC,EACjC,OAAO,EAAE,qBAAqB,GAAG,SAAS,EAC1C,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACxB,SAAS,GAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAoB,GAC7C,OAAO,CAAC,CAAC,CAAC,CAUZ;AAED,kGAAkG;AAClG,wBAAgB,2BAA2B,CACzC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,EACpD,GAAG,GAAE,MAAM,MAAiB,EAC5B,UAAU,GAAE,MAAoC,GAC/C,qBAAqB,CAoIvB"}
|