@tidblink/server 0.0.0-stage → 0.3.0-rc.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 (83) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +993 -2
  3. package/dist/audio.d.ts +63 -0
  4. package/dist/audio.d.ts.map +1 -0
  5. package/dist/audio.js +163 -0
  6. package/dist/audio.js.map +1 -0
  7. package/dist/client-tools.d.ts +46 -0
  8. package/dist/client-tools.d.ts.map +1 -0
  9. package/dist/client-tools.js +114 -0
  10. package/dist/client-tools.js.map +1 -0
  11. package/dist/control.d.ts +17 -0
  12. package/dist/control.d.ts.map +1 -0
  13. package/dist/control.js +52 -0
  14. package/dist/control.js.map +1 -0
  15. package/dist/errors.d.ts +80 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +87 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/files.d.ts +129 -0
  20. package/dist/files.d.ts.map +1 -0
  21. package/dist/files.js +388 -0
  22. package/dist/files.js.map +1 -0
  23. package/dist/history.d.ts +242 -0
  24. package/dist/history.d.ts.map +1 -0
  25. package/dist/history.js +91 -0
  26. package/dist/history.js.map +1 -0
  27. package/dist/http.d.ts +64 -0
  28. package/dist/http.d.ts.map +1 -0
  29. package/dist/http.js +282 -0
  30. package/dist/http.js.map +1 -0
  31. package/dist/index.d.ts +26 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +12 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/organization.d.ts +70 -0
  36. package/dist/organization.d.ts.map +1 -0
  37. package/dist/organization.js +118 -0
  38. package/dist/organization.js.map +1 -0
  39. package/dist/progress.d.ts +34 -0
  40. package/dist/progress.d.ts.map +1 -0
  41. package/dist/progress.js +154 -0
  42. package/dist/progress.js.map +1 -0
  43. package/dist/realtime.d.ts +91 -0
  44. package/dist/realtime.d.ts.map +1 -0
  45. package/dist/realtime.js +112 -0
  46. package/dist/realtime.js.map +1 -0
  47. package/dist/schedulers.d.ts +129 -0
  48. package/dist/schedulers.d.ts.map +1 -0
  49. package/dist/schedulers.js +91 -0
  50. package/dist/schedulers.js.map +1 -0
  51. package/dist/session.d.ts +136 -0
  52. package/dist/session.d.ts.map +1 -0
  53. package/dist/session.js +226 -0
  54. package/dist/session.js.map +1 -0
  55. package/dist/sse.d.ts +7 -0
  56. package/dist/sse.d.ts.map +1 -0
  57. package/dist/sse.js +45 -0
  58. package/dist/sse.js.map +1 -0
  59. package/dist/turn.d.ts +43 -0
  60. package/dist/turn.d.ts.map +1 -0
  61. package/dist/turn.js +206 -0
  62. package/dist/turn.js.map +1 -0
  63. package/dist/usage.d.ts +462 -0
  64. package/dist/usage.d.ts.map +1 -0
  65. package/dist/usage.js +20 -0
  66. package/dist/usage.js.map +1 -0
  67. package/dist/user.d.ts +96 -0
  68. package/dist/user.d.ts.map +1 -0
  69. package/dist/user.js +139 -0
  70. package/dist/user.js.map +1 -0
  71. package/examples/answer-client-tool.mjs +69 -0
  72. package/examples/control-turn.mjs +48 -0
  73. package/examples/create-session.mjs +69 -0
  74. package/examples/observe-message.mjs +44 -0
  75. package/examples/organization-session.mjs +66 -0
  76. package/examples/prepare-realtime-connection.mjs +61 -0
  77. package/examples/provision-user.mjs +83 -0
  78. package/examples/read-usage.mjs +62 -0
  79. package/examples/schedule-task.mjs +67 -0
  80. package/examples/send-message.mjs +43 -0
  81. package/examples/submit-audio.mjs +52 -0
  82. package/examples/upload-file.mjs +53 -0
  83. package/package.json +65 -4
package/dist/errors.js ADDED
@@ -0,0 +1,87 @@
1
+ export class TiDBLinkError extends Error {
2
+ requestId;
3
+ constructor(message, options) {
4
+ super(message, options?.cause === undefined ? undefined : { cause: options.cause });
5
+ this.name = new.target.name;
6
+ this.requestId = options?.requestId;
7
+ }
8
+ }
9
+ export class TiDBLinkApiError extends TiDBLinkError {
10
+ status;
11
+ code;
12
+ details;
13
+ retryAfter;
14
+ constructor(input) {
15
+ super(input.message, input.requestId === undefined
16
+ ? undefined
17
+ : { requestId: input.requestId });
18
+ this.status = input.status;
19
+ this.code = input.code;
20
+ this.details = input.details;
21
+ this.retryAfter = input.retryAfter;
22
+ }
23
+ }
24
+ export class ConflictError extends TiDBLinkApiError {
25
+ }
26
+ export class ConnectionError extends TiDBLinkError {
27
+ }
28
+ /** The request may have succeeded, so repeating it could create another effect. */
29
+ export class OutcomeUnknownError extends TiDBLinkError {
30
+ turnId;
31
+ sessionId;
32
+ inputId;
33
+ constructor(message, options) {
34
+ super(message, options);
35
+ this.turnId = options?.turnId;
36
+ this.sessionId = options?.sessionId;
37
+ this.inputId = options?.inputId;
38
+ }
39
+ }
40
+ export class TurnWaitTimeoutError extends OutcomeUnknownError {
41
+ }
42
+ export class InputNotAppliedError extends TiDBLinkError {
43
+ sessionId;
44
+ inputId;
45
+ turnId;
46
+ constructor(sessionId, inputId, turnId) {
47
+ super("The original message was not incorporated; inspect its interaction receipt");
48
+ this.sessionId = sessionId;
49
+ this.inputId = inputId;
50
+ this.turnId = turnId;
51
+ }
52
+ }
53
+ export class TurnFailedError extends TiDBLinkError {
54
+ code;
55
+ turnId;
56
+ sessionId;
57
+ inputId;
58
+ constructor(input) {
59
+ super(input.message);
60
+ this.code = input.code;
61
+ this.turnId = input.turnId;
62
+ this.sessionId = input.sessionId;
63
+ this.inputId = input.inputId;
64
+ }
65
+ }
66
+ export class TurnInterruptedError extends TiDBLinkError {
67
+ sessionId;
68
+ inputId;
69
+ turnId;
70
+ constructor(turnId, message = "Turn was interrupted", sessionId, inputId) {
71
+ super(message);
72
+ this.sessionId = sessionId;
73
+ this.inputId = inputId;
74
+ this.turnId = turnId;
75
+ }
76
+ }
77
+ /** Observation stopped locally; the original command can still be queried or observed. */
78
+ export class ObservationStoppedError extends OutcomeUnknownError {
79
+ cursor;
80
+ timedOut;
81
+ constructor(message, options) {
82
+ super(message, options);
83
+ this.cursor = options.cursor;
84
+ this.timedOut = options.timedOut ?? false;
85
+ }
86
+ }
87
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,129 @@
1
+ import { HttpClient } from "./http.js";
2
+ import { OutcomeUnknownError } from "./errors.js";
3
+ import type { RequestOptions } from "./organization.js";
4
+ export interface UserFile {
5
+ fileId: string;
6
+ originalName: string;
7
+ status: "uploading" | "ready" | "failed";
8
+ byteSize: number | null;
9
+ sha256: string | null;
10
+ checksumVerification: "whole" | "part_only" | null;
11
+ contentType: string | null;
12
+ lastError: string | null;
13
+ createdAt: string;
14
+ updatedAt: string;
15
+ source: {
16
+ kind: "user_upload";
17
+ } | {
18
+ kind: "artifact_revision";
19
+ artifactId: string;
20
+ revisionId: string;
21
+ revisionNumber: number;
22
+ sessionId: string;
23
+ turnId: string | null;
24
+ operationId: string | null;
25
+ };
26
+ }
27
+ export interface FileUploadCapabilities {
28
+ protocol: "tidb-link.user-files.v2";
29
+ inlineThreshold: number;
30
+ maxUploadBytes: number;
31
+ checksum: "sha-256";
32
+ }
33
+ export interface CreateFileUploadInput extends RequestOptions {
34
+ idempotencyKey: string;
35
+ originalName: string;
36
+ byteSize: number;
37
+ sha256: string;
38
+ contentType: string | null;
39
+ }
40
+ export interface UploadFileInput extends RequestOptions {
41
+ /** Persist with the original input before upload; reuse only for that exact file. */
42
+ idempotencyKey: string;
43
+ originalName: string;
44
+ bytes: Uint8Array;
45
+ contentType?: string | null;
46
+ }
47
+ export interface FileUpload {
48
+ uploadId: string;
49
+ file: UserFile;
50
+ mode: "tidb-link" | "s3";
51
+ expectedChecksumVerification: "whole";
52
+ expiresAt: string;
53
+ contentUrl?: string;
54
+ uploadUrl?: {
55
+ method: "PUT";
56
+ url: string;
57
+ headers: Record<string, string>;
58
+ expiresAt: string;
59
+ };
60
+ partSize?: number;
61
+ totalParts?: number;
62
+ }
63
+ export interface FileUploadStatus {
64
+ uploadId: string;
65
+ file: UserFile;
66
+ mode: "tidb-link" | "s3" | "initializing";
67
+ state: "active" | "completing" | "aborting" | "completed" | "aborted";
68
+ expiresAt: string;
69
+ }
70
+ export interface FileUploadPart {
71
+ number: number;
72
+ url: string;
73
+ size: number;
74
+ headers: Record<string, string>;
75
+ expiresAt: string;
76
+ }
77
+ export interface FileListOptions extends RequestOptions {
78
+ history?: boolean;
79
+ limit?: number;
80
+ cursor?: string;
81
+ }
82
+ export interface FilePage {
83
+ files: UserFile[];
84
+ nextCursor: string | null;
85
+ }
86
+ export interface FileDownloadGrant {
87
+ url: string;
88
+ expiresAt: string;
89
+ byteSize: number;
90
+ sha256: string;
91
+ }
92
+ export type FileContent = {
93
+ type: "bytes";
94
+ bytes: Uint8Array;
95
+ contentType: string;
96
+ } | {
97
+ type: "download";
98
+ grant: FileDownloadGrant;
99
+ };
100
+ export interface UploadedFilePart {
101
+ number: number;
102
+ etag: string;
103
+ sha256: string;
104
+ }
105
+ export declare class FileUploadOutcomeUnknownError extends OutcomeUnknownError {
106
+ readonly idempotencyKey: string;
107
+ readonly uploadId: string | undefined;
108
+ constructor(idempotencyKey: string, uploadId: string | undefined, cause: OutcomeUnknownError);
109
+ }
110
+ export declare class UserFiles {
111
+ #private;
112
+ constructor(http: HttpClient);
113
+ capabilities(options?: RequestOptions): Promise<FileUploadCapabilities>;
114
+ createUpload(input: CreateFileUploadInput): Promise<FileUpload>;
115
+ getUpload(uploadId: string, options?: RequestOptions): Promise<FileUploadStatus>;
116
+ uploadContent(uploadId: string, bytes: Uint8Array, options?: RequestOptions): Promise<UserFile>;
117
+ presignPart(uploadId: string, number: number, sha256: string, options?: RequestOptions): Promise<FileUploadPart>;
118
+ uploadPart(part: FileUploadPart, bytes: Uint8Array, options?: RequestOptions): Promise<UploadedFilePart>;
119
+ private transfer;
120
+ completeUpload(uploadId: string, parts?: UploadedFilePart[], options?: RequestOptions): Promise<UserFile>;
121
+ cancelUpload(uploadId: string, options?: RequestOptions): Promise<UserFile>;
122
+ upload(input: UploadFileInput): Promise<UserFile>;
123
+ list(options?: FileListOptions): Promise<FilePage>;
124
+ get(fileId: string, options?: RequestOptions): Promise<UserFile>;
125
+ getContent(fileId: string, options?: RequestOptions): Promise<FileContent>;
126
+ downloadFromGrant(grant: FileDownloadGrant, options?: RequestOptions): Promise<Uint8Array>;
127
+ download(fileId: string, options?: RequestOptions): Promise<Uint8Array>;
128
+ }
129
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"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"}
package/dist/files.js ADDED
@@ -0,0 +1,388 @@
1
+ import { requestOptions, HttpClient, requireKnownKeys } from "./http.js";
2
+ import { OutcomeUnknownError, TiDBLinkError, TiDBLinkApiError, ConnectionError, } from "./errors.js";
3
+ export class FileUploadOutcomeUnknownError extends OutcomeUnknownError {
4
+ idempotencyKey;
5
+ uploadId;
6
+ constructor(idempotencyKey, uploadId, cause) {
7
+ super("File upload outcome is unknown; recover the original upload before transferring again", { ...(cause.requestId ? { requestId: cause.requestId } : {}), cause });
8
+ this.idempotencyKey = idempotencyKey;
9
+ this.uploadId = uploadId;
10
+ }
11
+ }
12
+ const uploadPath = (id) => `/api/v1/user/drive/uploads/${encodeURIComponent(id)}`;
13
+ const digest = async (bytes) => {
14
+ const value = new Uint8Array(await crypto.subtle.digest("SHA-256", Uint8Array.from(bytes)));
15
+ return {
16
+ hex: Array.from(value, (byte) => byte.toString(16).padStart(2, "0")).join(""),
17
+ base64: btoa(String.fromCharCode(...value)),
18
+ };
19
+ };
20
+ const fileReceipt = (value, requestId) => {
21
+ if (!value?.file?.fileId ||
22
+ !["uploading", "ready", "failed"].includes(value.file.status)) {
23
+ throw new OutcomeUnknownError("File operation returned no usable File; read the upload state", { requestId });
24
+ }
25
+ return value.file;
26
+ };
27
+ const requireReady = (file, byteSize, sha256) => {
28
+ if (file.status !== "ready" ||
29
+ file.byteSize !== byteSize ||
30
+ file.sha256 !== sha256 ||
31
+ file.checksumVerification !== "whole") {
32
+ throw new TiDBLinkError("File is not ready with the expected complete size and checksum");
33
+ }
34
+ return file;
35
+ };
36
+ const requireActiveGrant = (expiresAt) => {
37
+ if (!Number.isFinite(Date.parse(expiresAt)) ||
38
+ Date.parse(expiresAt) <= Date.now())
39
+ throw new TiDBLinkApiError({
40
+ status: 410,
41
+ code: "file_transfer_expired",
42
+ message: "File transfer credential expired; obtain a fresh credential for the original file",
43
+ });
44
+ };
45
+ const transferUrl = (url) => {
46
+ if (!["http:", "https:"].includes(url.protocol) ||
47
+ url.username ||
48
+ url.password ||
49
+ url.hash)
50
+ throw new TypeError("File transfer URL must be HTTP(S) without embedded credentials or a fragment");
51
+ return url;
52
+ };
53
+ export class UserFiles {
54
+ #http;
55
+ constructor(http) {
56
+ this.#http = http;
57
+ }
58
+ async capabilities(options) {
59
+ options = requestOptions(options);
60
+ return (await this.#http.get("/api/v1/user/drive/upload-capabilities", options)).capabilities;
61
+ }
62
+ async createUpload(input) {
63
+ requireKnownKeys(input, [
64
+ "idempotencyKey",
65
+ "originalName",
66
+ "byteSize",
67
+ "sha256",
68
+ "contentType",
69
+ "signal",
70
+ "requestId",
71
+ ], "File upload");
72
+ if (typeof input.idempotencyKey !== "string" ||
73
+ !/^[\x21-\x7e]{1,255}$/.test(input.idempotencyKey))
74
+ throw new TypeError("File upload requires a stable idempotencyKey (1-255 visible ASCII characters)");
75
+ if (typeof input.originalName !== "string" ||
76
+ !input.originalName ||
77
+ input.originalName.length > 255 ||
78
+ !Number.isSafeInteger(input.byteSize) ||
79
+ input.byteSize < 0 ||
80
+ !/^[a-f0-9]{64}$/.test(input.sha256) ||
81
+ !(input.contentType === null ||
82
+ (typeof input.contentType === "string" &&
83
+ input.contentType.length <= 255)))
84
+ throw new TypeError("File upload requires a name, nonnegative byteSize, complete SHA-256 and nullable contentType");
85
+ const { idempotencyKey, signal, requestId, ...body } = input;
86
+ const result = await this.#http.postResponse("/api/v1/user/drive/uploads", body, {
87
+ idempotencyKey,
88
+ outcomeUnknown: true,
89
+ ...(signal ? { signal } : {}),
90
+ ...(requestId ? { requestId } : {}),
91
+ });
92
+ const upload = result.data?.upload;
93
+ if (!upload?.uploadId ||
94
+ upload.file?.fileId !== upload.uploadId ||
95
+ !["tidb-link", "s3"].includes(upload.mode) ||
96
+ !Number.isFinite(Date.parse(upload.expiresAt)) ||
97
+ upload.expectedChecksumVerification !== "whole")
98
+ throw new OutcomeUnknownError("File creation returned no usable upload; replay the same creation identity", { requestId: result.requestId });
99
+ return upload;
100
+ }
101
+ async getUpload(uploadId, options) {
102
+ options = requestOptions(options);
103
+ return (await this.#http.get(uploadPath(uploadId), options)).upload;
104
+ }
105
+ async uploadContent(uploadId, bytes, options) {
106
+ options = requestOptions(options);
107
+ const checksum = await digest(bytes);
108
+ const { response, requestId } = await this.#http.rawResponse(`${uploadPath(uploadId)}/content`, {
109
+ ...options,
110
+ method: "PUT",
111
+ body: Uint8Array.from(bytes),
112
+ headers: {
113
+ "content-type": "application/octet-stream",
114
+ "content-length": String(bytes.byteLength),
115
+ "content-digest": `sha-256=:${checksum.base64}:`,
116
+ },
117
+ outcomeUnknown: true,
118
+ });
119
+ try {
120
+ return fileReceipt(await response.json(), requestId);
121
+ }
122
+ catch (cause) {
123
+ if (cause instanceof OutcomeUnknownError)
124
+ throw cause;
125
+ throw new OutcomeUnknownError("Inline transfer returned no usable File; read the upload state", { requestId, cause });
126
+ }
127
+ }
128
+ async presignPart(uploadId, number, sha256, options) {
129
+ options = requestOptions(options);
130
+ if (!Number.isSafeInteger(number) ||
131
+ number < 1 ||
132
+ !/^[a-f0-9]{64}$/.test(sha256))
133
+ throw new TypeError("A part requires a positive number and SHA-256");
134
+ const result = await this.#http.postResponse(`${uploadPath(uploadId)}/parts/${number}/presign`, { sha256 }, { ...options, outcomeUnknown: true });
135
+ const part = result.data?.part;
136
+ if (part?.number !== number ||
137
+ !Number.isSafeInteger(part.size) ||
138
+ part.size < 0 ||
139
+ !part.url ||
140
+ !part.headers ||
141
+ !Number.isFinite(Date.parse(part.expiresAt)))
142
+ throw new OutcomeUnknownError("Part signing returned no usable grant; reconcile before transferring", { requestId: result.requestId });
143
+ return part;
144
+ }
145
+ async uploadPart(part, bytes, options) {
146
+ options = requestOptions(options);
147
+ if (bytes.byteLength !== part.size)
148
+ throw new TypeError("Part bytes do not match the signed size");
149
+ const checksum = await digest(bytes);
150
+ const signedChecksum = new Headers(part.headers).get("x-amz-checksum-sha256");
151
+ if (signedChecksum !== checksum.base64)
152
+ throw new TypeError("Part bytes do not match the signed checksum");
153
+ const response = await this.transfer(part.url, part.expiresAt, {
154
+ method: "PUT",
155
+ headers: { ...part.headers, "content-length": String(bytes.byteLength) },
156
+ body: Uint8Array.from(bytes),
157
+ ...(options?.signal ? { signal: options.signal } : {}),
158
+ });
159
+ const etag = response.headers.get("etag");
160
+ await response.body?.cancel();
161
+ if (!etag)
162
+ throw new OutcomeUnknownError("Part transfer returned no ETag; reconcile before completing");
163
+ return { number: part.number, etag, sha256: checksum.hex };
164
+ }
165
+ async transfer(url, expiresAt, init) {
166
+ requireActiveGrant(expiresAt);
167
+ const destination = transferUrl(this.#http.resolveUrl(url));
168
+ init.signal?.throwIfAborted();
169
+ let response;
170
+ try {
171
+ response = await fetch(destination, { ...init, redirect: "error" });
172
+ }
173
+ catch {
174
+ throw new OutcomeUnknownError("File transfer outcome is unknown; inspect the original upload");
175
+ }
176
+ if (!response.ok) {
177
+ await response.body?.cancel();
178
+ if (response.status >= 500 || response.status === 408)
179
+ throw new OutcomeUnknownError("File transfer outcome is unknown; inspect the original upload");
180
+ throw new TiDBLinkApiError({
181
+ status: response.status,
182
+ code: "file_transfer_failed",
183
+ message: "File byte transfer was refused",
184
+ });
185
+ }
186
+ return response;
187
+ }
188
+ async completeUpload(uploadId, parts, options) {
189
+ options = requestOptions(options);
190
+ const result = await this.#http.postResponse(`${uploadPath(uploadId)}/complete`, parts === undefined ? {} : { parts }, { ...options, outcomeUnknown: true });
191
+ return fileReceipt(result.data, result.requestId);
192
+ }
193
+ async cancelUpload(uploadId, options) {
194
+ options = requestOptions(options);
195
+ const result = await this.#http.deleteResponse(uploadPath(uploadId), { ...options, outcomeUnknown: true });
196
+ return fileReceipt(result.data, result.requestId);
197
+ }
198
+ async upload(input) {
199
+ requireKnownKeys(input, [
200
+ "idempotencyKey",
201
+ "originalName",
202
+ "bytes",
203
+ "contentType",
204
+ "signal",
205
+ "requestId",
206
+ ], "File upload");
207
+ if (!(input.bytes instanceof Uint8Array))
208
+ throw new TypeError("File bytes must be a Uint8Array");
209
+ const { bytes: source, ...metadata } = input;
210
+ const bytes = Uint8Array.from(source);
211
+ const checksum = await digest(bytes);
212
+ const options = {
213
+ ...(input.signal ? { signal: input.signal } : {}),
214
+ ...(input.requestId ? { requestId: input.requestId } : {}),
215
+ };
216
+ let uploadId;
217
+ try {
218
+ const upload = await this.createUpload({
219
+ ...metadata,
220
+ contentType: input.contentType ?? null,
221
+ byteSize: bytes.byteLength,
222
+ sha256: checksum.hex,
223
+ });
224
+ uploadId = upload.uploadId;
225
+ if (upload.file.status === "ready")
226
+ return requireReady(upload.file, bytes.byteLength, checksum.hex);
227
+ requireActiveGrant(upload.expiresAt);
228
+ let parts;
229
+ if (upload.mode === "tidb-link") {
230
+ if (upload.uploadUrl) {
231
+ const grant = upload.uploadUrl;
232
+ if (grant.method !== "PUT" ||
233
+ new Headers(grant.headers).get("content-digest") !==
234
+ `sha-256=:${checksum.base64}:`)
235
+ throw new TiDBLinkError("Inline upload grant does not match the complete file checksum");
236
+ const response = await this.transfer(grant.url, grant.expiresAt, {
237
+ method: "PUT",
238
+ headers: {
239
+ ...grant.headers,
240
+ "content-length": String(bytes.byteLength),
241
+ },
242
+ body: bytes,
243
+ ...(input.signal ? { signal: input.signal } : {}),
244
+ });
245
+ await response.body?.cancel();
246
+ }
247
+ else
248
+ await this.uploadContent(uploadId, bytes, options);
249
+ }
250
+ else {
251
+ const { partSize, totalParts } = upload;
252
+ if (!partSize ||
253
+ !Number.isSafeInteger(partSize) ||
254
+ !Number.isSafeInteger(totalParts) ||
255
+ totalParts !== Math.ceil(bytes.byteLength / partSize))
256
+ throw new TiDBLinkError("Multipart upload plan does not cover the complete file");
257
+ parts = [];
258
+ for (let number = 1; number <= totalParts; number++) {
259
+ const partBytes = bytes.subarray((number - 1) * partSize, number * partSize);
260
+ const part = await this.presignPart(uploadId, number, (await digest(partBytes)).hex, options);
261
+ parts.push(await this.uploadPart(part, partBytes, options));
262
+ }
263
+ }
264
+ return requireReady(await this.completeUpload(uploadId, parts, options), bytes.byteLength, checksum.hex);
265
+ }
266
+ catch (cause) {
267
+ if (cause instanceof OutcomeUnknownError)
268
+ throw new FileUploadOutcomeUnknownError(metadata.idempotencyKey, uploadId, cause);
269
+ throw cause;
270
+ }
271
+ }
272
+ list(options = {}) {
273
+ requireKnownKeys(options, ["history", "limit", "cursor", "signal", "requestId"], "File list options");
274
+ const query = new URLSearchParams();
275
+ if (options.history !== undefined)
276
+ query.set("history", String(options.history));
277
+ if (options.limit !== undefined)
278
+ query.set("limit", String(options.limit));
279
+ if (options.cursor !== undefined)
280
+ query.set("cursor", options.cursor);
281
+ return this.#http.get(`/api/v1/files${query.size ? `?${query}` : ""}`, options);
282
+ }
283
+ async get(fileId, options) {
284
+ options = requestOptions(options);
285
+ return (await this.#http.get(`/api/v1/files/${encodeURIComponent(fileId)}`, options)).file;
286
+ }
287
+ async getContent(fileId, options) {
288
+ options = requestOptions(options);
289
+ const { response, requestId } = await this.#http.rawResponse(`/api/v1/files/${encodeURIComponent(fileId)}/content`, options);
290
+ const contentType = response.headers.get("content-type") ?? "application/octet-stream";
291
+ try {
292
+ if (contentType.split(";")[0]?.trim().toLowerCase() ===
293
+ "application/vnd.tidb-link.file-download+json") {
294
+ const grant = await response.json();
295
+ if (!grant?.url ||
296
+ !Number.isSafeInteger(grant.byteSize) ||
297
+ grant.byteSize < 0 ||
298
+ !/^[a-f0-9]{64}$/.test(grant.sha256) ||
299
+ !Number.isFinite(Date.parse(grant.expiresAt)))
300
+ throw new TiDBLinkError("File content returned no usable download grant", { requestId });
301
+ return { type: "download", grant };
302
+ }
303
+ return {
304
+ type: "bytes",
305
+ bytes: new Uint8Array(await response.arrayBuffer()),
306
+ contentType,
307
+ };
308
+ }
309
+ catch (cause) {
310
+ if (cause instanceof TiDBLinkError)
311
+ throw cause;
312
+ throw new ConnectionError("File content could not be read completely", {
313
+ requestId,
314
+ });
315
+ }
316
+ }
317
+ async downloadFromGrant(grant, options) {
318
+ options = requestOptions(options);
319
+ requireActiveGrant(grant.expiresAt);
320
+ let destination = transferUrl(this.#http.resolveUrl(grant.url));
321
+ options?.signal?.throwIfAborted();
322
+ let response;
323
+ try {
324
+ response = await fetch(destination, {
325
+ redirect: "manual",
326
+ ...(options?.signal ? { signal: options.signal } : {}),
327
+ });
328
+ if ([301, 302, 303, 307, 308].includes(response.status)) {
329
+ const location = response.headers.get("location");
330
+ await response.body?.cancel();
331
+ if (!location)
332
+ throw new TiDBLinkError("File download redirect omitted its destination");
333
+ destination = transferUrl(new URL(location, destination));
334
+ if (destination.protocol !== "https:")
335
+ throw new TiDBLinkError("File download redirect requires HTTPS");
336
+ response = await fetch(destination, {
337
+ redirect: "error",
338
+ ...(options?.signal ? { signal: options.signal } : {}),
339
+ });
340
+ }
341
+ }
342
+ catch (cause) {
343
+ if (cause instanceof TiDBLinkError)
344
+ throw cause;
345
+ throw new ConnectionError("File download could not be reached");
346
+ }
347
+ if (!response.ok) {
348
+ await response.body?.cancel();
349
+ throw new TiDBLinkApiError({
350
+ status: response.status,
351
+ code: "file_download_failed",
352
+ message: "File download was refused; obtain a fresh credential if it expired",
353
+ });
354
+ }
355
+ let bytes;
356
+ try {
357
+ bytes = new Uint8Array(await response.arrayBuffer());
358
+ }
359
+ catch {
360
+ throw new ConnectionError("File download ended before the complete body arrived");
361
+ }
362
+ if (bytes.byteLength !== grant.byteSize ||
363
+ (await digest(bytes)).hex !== grant.sha256)
364
+ throw new TiDBLinkError("Downloaded file does not match its complete size and checksum");
365
+ return bytes;
366
+ }
367
+ async download(fileId, options) {
368
+ options = requestOptions(options);
369
+ const file = await this.get(fileId, options);
370
+ if (file.status !== "ready" ||
371
+ file.byteSize === null ||
372
+ file.sha256 === null ||
373
+ file.checksumVerification !== "whole")
374
+ throw new TiDBLinkError("Only a ready, whole-file verified File can be downloaded");
375
+ const content = await this.getContent(fileId, options);
376
+ if (content.type === "download") {
377
+ if (content.grant.byteSize !== file.byteSize ||
378
+ content.grant.sha256 !== file.sha256)
379
+ throw new TiDBLinkError("Download grant does not match the selected File");
380
+ return this.downloadFromGrant(content.grant, options);
381
+ }
382
+ if (content.bytes.byteLength !== file.byteSize ||
383
+ (await digest(content.bytes)).hex !== file.sha256)
384
+ throw new TiDBLinkError("Downloaded file does not match its complete size and checksum");
385
+ return content.bytes;
386
+ }
387
+ }
388
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"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"}