@ustorage/sdk 0.1.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.
@@ -0,0 +1,555 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/node/index.ts
21
+ var node_exports = {};
22
+ __export(node_exports, {
23
+ FetchHttpClient: () => FetchHttpClient,
24
+ MemoryResumeStore: () => MemoryResumeStore,
25
+ NodeBufferUploadSource: () => NodeBufferUploadSource,
26
+ NodeFileResumeStore: () => NodeFileResumeStore,
27
+ NodeFileUploadSource: () => NodeFileUploadSource,
28
+ NodeHttpClient: () => FetchHttpClient,
29
+ NodeMemoryResumeStore: () => NodeMemoryResumeStore,
30
+ UStorageCoreClient: () => UStorageCoreClient,
31
+ UStorageError: () => UStorageError,
32
+ UStorageNodeClient: () => UStorageNodeClient,
33
+ UploadApi: () => UploadApi,
34
+ Uploader: () => Uploader,
35
+ nodeSigner: () => nodeSigner,
36
+ resolveToken: () => resolveToken,
37
+ toUStorageError: () => toUStorageError
38
+ });
39
+ module.exports = __toCommonJS(node_exports);
40
+
41
+ // src/core/auth/index.ts
42
+ async function resolveToken(value) {
43
+ return typeof value === "function" ? value() : value;
44
+ }
45
+
46
+ // src/core/errors/index.ts
47
+ var UStorageError = class extends Error {
48
+ code;
49
+ status;
50
+ requestId;
51
+ details;
52
+ constructor(message, options) {
53
+ super(message);
54
+ this.name = "UStorageError";
55
+ this.code = options.code;
56
+ this.status = options.status;
57
+ this.requestId = options.requestId;
58
+ this.details = options.details;
59
+ }
60
+ };
61
+ function toUStorageError(status, body) {
62
+ const parsed = body;
63
+ if (parsed?.error?.code && parsed.error.message) {
64
+ return new UStorageError(parsed.error.message, {
65
+ code: parsed.error.code,
66
+ status,
67
+ requestId: parsed.request_id,
68
+ details: parsed.error.details
69
+ });
70
+ }
71
+ return new UStorageError(`UStorage request failed with status ${status}`, { code: "REQUEST_FAILED", status });
72
+ }
73
+
74
+ // src/core/http/index.ts
75
+ var FetchHttpClient = class {
76
+ baseUrl;
77
+ authHeaders;
78
+ fetchImpl;
79
+ constructor(options) {
80
+ this.baseUrl = options.baseUrl.replace(/\/$/, "");
81
+ this.authHeaders = options.authHeaders;
82
+ this.fetchImpl = options.fetchImpl ?? fetch;
83
+ }
84
+ async request(options) {
85
+ const headers = new Headers();
86
+ for (const [key, value] of Object.entries(options.headers ?? {})) {
87
+ if (value !== void 0 && value !== null) headers.set(key, value);
88
+ }
89
+ let body;
90
+ if (options.body !== void 0) {
91
+ if (isBodyInit(options.body)) {
92
+ body = options.body;
93
+ } else {
94
+ headers.set("content-type", headers.get("content-type") ?? "application/json");
95
+ body = JSON.stringify(options.body);
96
+ }
97
+ }
98
+ const path = this.pathWithQuery(options.path, options.query);
99
+ const authHeaders = this.authHeaders ? await this.authHeaders({ method: options.method, path, body }) : {};
100
+ for (const [key, value] of Object.entries(authHeaders)) headers.set(key, value);
101
+ const response = await this.fetchImpl(this.url(path), {
102
+ method: options.method,
103
+ headers,
104
+ body,
105
+ signal: options.signal
106
+ });
107
+ if (response.status === 204) return void 0;
108
+ const text = await response.text();
109
+ const parsed = text ? parseJson(text) : void 0;
110
+ if (!response.ok) throw toUStorageError(response.status, parsed);
111
+ return parsed;
112
+ }
113
+ url(path) {
114
+ return new URL(path.startsWith("/") ? path : `/${path}`, `${this.baseUrl}/`).toString();
115
+ }
116
+ pathWithQuery(path, query) {
117
+ const url = new URL(path.startsWith("/") ? path : `/${path}`, "http://sdk.local");
118
+ for (const [key, value] of Object.entries(query ?? {})) {
119
+ if (value !== void 0 && value !== null) url.searchParams.set(key, String(value));
120
+ }
121
+ return `${url.pathname}${url.search}`;
122
+ }
123
+ };
124
+ function parseJson(value) {
125
+ try {
126
+ return JSON.parse(value);
127
+ } catch {
128
+ return value;
129
+ }
130
+ }
131
+ function isBodyInit(value) {
132
+ return typeof Blob !== "undefined" && value instanceof Blob || typeof FormData !== "undefined" && value instanceof FormData || typeof URLSearchParams !== "undefined" && value instanceof URLSearchParams || typeof ArrayBuffer !== "undefined" && value instanceof ArrayBuffer || ArrayBuffer.isView(value) || typeof ReadableStream !== "undefined" && value instanceof ReadableStream;
133
+ }
134
+
135
+ // src/core/upload/api.ts
136
+ var UploadApi = class {
137
+ constructor(http) {
138
+ this.http = http;
139
+ }
140
+ http;
141
+ createUploadToken(request) {
142
+ return this.http.request({ method: "POST", path: "/uploads/tokens", body: request });
143
+ }
144
+ createSession(request) {
145
+ return this.http.request({ method: "POST", path: "/uploads/sessions", body: request });
146
+ }
147
+ createFileUrl(request) {
148
+ return this.http.request({ method: "POST", path: "/files/url", body: request });
149
+ }
150
+ uploadChunk(uploadId, index, body, checksum, signal) {
151
+ return this.http.request({ method: "PUT", path: `/uploads/${uploadId}/chunks/${index}`, headers: { "x-chunk-checksum": checksum }, body, signal });
152
+ }
153
+ getStatus(uploadId) {
154
+ return this.http.request({ method: "GET", path: `/uploads/${uploadId}/status` });
155
+ }
156
+ complete(uploadId, request = {}) {
157
+ return this.http.request({ method: "POST", path: `/uploads/${uploadId}/complete`, body: request });
158
+ }
159
+ cancel(uploadId) {
160
+ return this.http.request({ method: "DELETE", path: `/uploads/${uploadId}` });
161
+ }
162
+ };
163
+
164
+ // src/core/upload/checksum.ts
165
+ async function sha256Hex(data) {
166
+ const bytes = await toBytes(data);
167
+ const digest = await crypto.subtle.digest("SHA-256", bytes);
168
+ return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, "0")).join("");
169
+ }
170
+ async function toBytes(data) {
171
+ if (data instanceof ArrayBuffer) return data;
172
+ if (ArrayBuffer.isView(data)) return new Uint8Array(data.buffer, data.byteOffset, data.byteLength).slice().buffer;
173
+ if (typeof Blob !== "undefined" && data instanceof Blob) return data.arrayBuffer();
174
+ if (typeof data === "string") return new TextEncoder().encode(data).buffer;
175
+ return new Response(data).arrayBuffer();
176
+ }
177
+
178
+ // src/core/upload/file-metadata.ts
179
+ var mimeTypesByExtension = {
180
+ jpg: "image/jpeg",
181
+ jpeg: "image/jpeg",
182
+ png: "image/png",
183
+ gif: "image/gif",
184
+ webp: "image/webp",
185
+ bmp: "image/bmp",
186
+ svg: "image/svg+xml",
187
+ heic: "image/heic",
188
+ mp4: "video/mp4",
189
+ mpeg: "video/mpeg",
190
+ mov: "video/quicktime",
191
+ avi: "video/x-msvideo",
192
+ webm: "video/webm",
193
+ ogg: "video/ogg",
194
+ "3gp": "video/3gpp",
195
+ flv: "video/x-flv",
196
+ mp3: "audio/mpeg",
197
+ wav: "audio/wav",
198
+ aac: "audio/aac",
199
+ m4a: "audio/x-m4a",
200
+ flac: "audio/flac",
201
+ amr: "audio/amr",
202
+ pdf: "application/pdf",
203
+ txt: "text/plain",
204
+ json: "application/json",
205
+ zip: "application/zip",
206
+ tar: "application/x-tar",
207
+ rar: "application/vnd.rar",
208
+ doc: "application/msword",
209
+ docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
210
+ xls: "application/vnd.ms-excel",
211
+ xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
212
+ ppt: "application/vnd.ms-powerpoint",
213
+ pptx: "application/vnd.openxmlformats-officedocument.presentationml.presentation"
214
+ };
215
+ function extensionFromName(nameOrKey) {
216
+ const filename = nameOrKey.split(/[\\/]/).filter(Boolean).at(-1) ?? nameOrKey;
217
+ const dot = filename.lastIndexOf(".");
218
+ if (dot <= 0 || dot === filename.length - 1) {
219
+ return null;
220
+ }
221
+ return filename.slice(dot + 1).toLowerCase();
222
+ }
223
+ function mimeTypeFromExtension(extension) {
224
+ return extension ? mimeTypesByExtension[extension.toLowerCase()] ?? null : null;
225
+ }
226
+ function resolveUploadContentType(explicit, sourceType, ...names) {
227
+ const normalizedExplicit = normalizeContentType(explicit);
228
+ if (normalizedExplicit) {
229
+ return normalizedExplicit;
230
+ }
231
+ const normalizedSourceType = normalizeContentType(sourceType);
232
+ if (normalizedSourceType) {
233
+ return normalizedSourceType;
234
+ }
235
+ for (const name of names) {
236
+ if (!name) continue;
237
+ const inferred = mimeTypeFromExtension(extensionFromName(name));
238
+ if (inferred) {
239
+ return inferred;
240
+ }
241
+ }
242
+ return null;
243
+ }
244
+ function normalizeContentType(value) {
245
+ const normalized = value?.trim();
246
+ return normalized ? normalized : null;
247
+ }
248
+
249
+ // src/core/upload/uploader.ts
250
+ var Uploader = class {
251
+ constructor(uploads, resumeStore) {
252
+ this.uploads = uploads;
253
+ this.resumeStore = resumeStore;
254
+ }
255
+ uploads;
256
+ resumeStore;
257
+ async putObject(source, options) {
258
+ const chunkSize = options.chunkSize ?? 8 * 1024 * 1024;
259
+ if (chunkSize <= 0) throw new Error("chunkSize must be positive");
260
+ const totalChunks = source.size === 0 ? 1 : Math.ceil(source.size / chunkSize);
261
+ const useResume = options.resume === true || Boolean(options.resumeKey);
262
+ const resumeKey = useResume ? options.resumeKey ?? await source.fingerprint(options.key) : void 0;
263
+ let uploadId = resumeKey && this.resumeStore ? await this.resumeStore.get(resumeKey) : void 0;
264
+ let missingChunks;
265
+ if (uploadId) {
266
+ try {
267
+ const status = await this.uploads.getStatus(uploadId);
268
+ missingChunks = status.missing_chunks;
269
+ options.onProgress?.(statusToProgress(status));
270
+ } catch {
271
+ uploadId = void 0;
272
+ if (resumeKey) await this.resumeStore?.delete(resumeKey);
273
+ }
274
+ }
275
+ if (!uploadId) {
276
+ const session = await this.uploads.createSession({
277
+ bucket_name: options.bucketName,
278
+ key: options.key,
279
+ workspace_name: options.workspaceName ?? null,
280
+ mime_type: resolveUploadContentType(
281
+ options.contentType,
282
+ source.type,
283
+ options.key,
284
+ source.name
285
+ ),
286
+ file_size: source.size,
287
+ chunk_size: chunkSize,
288
+ total_chunks: totalChunks,
289
+ checksum: typeof options.checksum === "object" ? options.checksum.file ?? null : null,
290
+ metadata: options.metadata,
291
+ overwrite: options.overwrite ?? true,
292
+ visibility: options.visibility ?? null
293
+ });
294
+ uploadId = session.upload_id;
295
+ missingChunks = Array.from({ length: totalChunks }, (_, index) => index);
296
+ if (resumeKey) await this.resumeStore?.set(resumeKey, uploadId);
297
+ }
298
+ for (const index of missingChunks ?? []) {
299
+ const start = index * chunkSize;
300
+ const end = source.size === 0 ? 0 : Math.min(source.size, start + chunkSize);
301
+ const chunk = await source.slice(start, end);
302
+ const checksum = await this.chunkChecksum(options.checksum, index, chunk.body);
303
+ const response = await this.uploads.uploadChunk(uploadId, index, chunk.body, checksum, options.signal);
304
+ options.onProgress?.(chunkResponseToProgress(response));
305
+ }
306
+ const complete = await this.uploads.complete(uploadId, { checksum: typeof options.checksum === "object" ? options.checksum.file : void 0 });
307
+ if (resumeKey) await this.resumeStore?.delete(resumeKey);
308
+ return {
309
+ ...complete,
310
+ uploadId: complete.upload_id,
311
+ fileId: complete.file_id,
312
+ publicId: complete.public_id,
313
+ visibility: complete.visibility,
314
+ url: complete.url,
315
+ expiresAt: complete.expires_at ?? null
316
+ };
317
+ }
318
+ async chunkChecksum(checksum, index, body) {
319
+ if (!checksum) return void 0;
320
+ if (checksum === "sha256") return sha256Hex(body);
321
+ return checksum.chunks?.[index];
322
+ }
323
+ };
324
+ function chunkResponseToProgress(response) {
325
+ return {
326
+ uploadId: response.upload_id,
327
+ chunkIndex: response.chunk_index,
328
+ uploadedChunks: response.uploaded_chunks,
329
+ totalChunks: response.total_chunks,
330
+ uploadedSize: response.uploaded_size,
331
+ fileSize: response.file_size,
332
+ progress: response.progress
333
+ };
334
+ }
335
+ function statusToProgress(response) {
336
+ return {
337
+ uploadId: response.upload_id,
338
+ uploadedChunks: response.uploaded_chunks.length,
339
+ totalChunks: response.total_chunks,
340
+ uploadedSize: response.uploaded_size,
341
+ fileSize: response.file_size,
342
+ progress: response.progress
343
+ };
344
+ }
345
+
346
+ // src/core/client/index.ts
347
+ var UStorageCoreClient = class {
348
+ uploads;
349
+ uploader;
350
+ constructor(options) {
351
+ const uploadHttp = options.uploadHttpClient ?? new FetchHttpClient({ baseUrl: options.uploadBaseUrl, authHeaders: options.authHeaders });
352
+ this.uploads = new UploadApi(uploadHttp);
353
+ this.uploader = new Uploader(this.uploads, options.resumeStore);
354
+ }
355
+ async getObjectUrl(input) {
356
+ const response = await this.uploads.createFileUrl({
357
+ file_id: input.fileId ?? null,
358
+ bucket: input.bucket ?? null,
359
+ bucket_id: input.bucketId ?? null,
360
+ key: input.key ?? null,
361
+ path: input.path ?? null,
362
+ expires_in: input.expiresIn ?? null
363
+ });
364
+ return {
365
+ fileId: response.file_id,
366
+ publicId: response.public_id,
367
+ visibility: response.visibility,
368
+ url: response.url,
369
+ expiresAt: response.expires_at
370
+ };
371
+ }
372
+ getSignedUrl(input) {
373
+ return this.getObjectUrl(input);
374
+ }
375
+ uploadSource(source, options) {
376
+ return this.uploader.putObject(source, options);
377
+ }
378
+ };
379
+
380
+ // src/core/upload/source.ts
381
+ var MemoryResumeStore = class {
382
+ values = /* @__PURE__ */ new Map();
383
+ get(key) {
384
+ return this.values.get(key);
385
+ }
386
+ set(key, uploadId) {
387
+ this.values.set(key, uploadId);
388
+ }
389
+ delete(key) {
390
+ this.values.delete(key);
391
+ }
392
+ };
393
+
394
+ // src/node/node-client.ts
395
+ var import_node_path2 = require("path");
396
+
397
+ // src/node/node-upload-source.ts
398
+ var import_node_path = require("path");
399
+ var import_promises = require("fs/promises");
400
+ var NodeFileUploadSource = class _NodeFileUploadSource {
401
+ constructor(path, size, name, type) {
402
+ this.path = path;
403
+ this.name = name ?? (0, import_node_path.basename)(path);
404
+ this.size = size;
405
+ this.type = type;
406
+ }
407
+ path;
408
+ name;
409
+ size;
410
+ type;
411
+ static async fromPath(path, options = {}) {
412
+ const info = await (0, import_promises.stat)(path);
413
+ const name = options.name ?? (0, import_node_path.basename)(path);
414
+ return new _NodeFileUploadSource(
415
+ path,
416
+ info.size,
417
+ name,
418
+ resolveUploadContentType(options.type, void 0, name, path) ?? void 0
419
+ );
420
+ }
421
+ fingerprint(key) {
422
+ return ["node-file", key ?? "", this.path, this.name, this.size, this.type ?? ""].join(":");
423
+ }
424
+ async slice(start, end) {
425
+ const length = end - start;
426
+ if (length === 0) return { body: new Uint8Array(), size: 0 };
427
+ const file = await (0, import_promises.open)(this.path, "r");
428
+ try {
429
+ const buffer = Buffer.alloc(length);
430
+ await file.read(buffer, 0, length, start);
431
+ const body = new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength).slice().buffer;
432
+ return { body, size: buffer.byteLength };
433
+ } finally {
434
+ await closeFile(file);
435
+ }
436
+ }
437
+ };
438
+ var NodeBufferUploadSource = class {
439
+ constructor(buffer, name, type) {
440
+ this.buffer = buffer;
441
+ this.name = name;
442
+ this.type = resolveUploadContentType(type, void 0, name) ?? void 0;
443
+ this.size = buffer.byteLength;
444
+ }
445
+ buffer;
446
+ name;
447
+ size;
448
+ type;
449
+ fingerprint(key) {
450
+ return ["node-buffer", key ?? "", this.name, this.size, this.type ?? ""].join(":");
451
+ }
452
+ slice(start, end) {
453
+ const buffer = this.buffer.subarray(start, end);
454
+ const body = new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength).slice().buffer;
455
+ return { body, size: buffer.byteLength };
456
+ }
457
+ };
458
+ async function closeFile(file) {
459
+ await file.close();
460
+ }
461
+
462
+ // src/node/node-client.ts
463
+ var UStorageNodeClient = class extends UStorageCoreClient {
464
+ constructor(options) {
465
+ super({
466
+ uploadBaseUrl: options.uploadBaseUrl,
467
+ resumeStore: options.resumeStore,
468
+ authHeaders: async () => {
469
+ if ("accessKey" in options.auth) {
470
+ return {
471
+ "x-access-key": options.auth.accessKey,
472
+ "x-secret-key": options.auth.secretKey
473
+ };
474
+ }
475
+ return { Authorization: `Bearer ${await resolveToken(options.auth.bearerToken)}` };
476
+ }
477
+ });
478
+ }
479
+ async putObject(options) {
480
+ if (typeof options.body === "string") {
481
+ return this.uploadSource(await NodeFileUploadSource.fromPath(options.body, { name: objectName(options.key), type: options.contentType ?? void 0 }), options);
482
+ }
483
+ return this.uploadSource(new NodeBufferUploadSource(options.body, objectName(options.key), options.contentType ?? void 0), options);
484
+ }
485
+ async uploadFile(path, options) {
486
+ const key = options.key ?? (0, import_node_path2.basename)(path);
487
+ return this.uploadSource(await NodeFileUploadSource.fromPath(path, { name: objectName(key), type: options.contentType ?? void 0 }), { ...options, key });
488
+ }
489
+ };
490
+ function objectName(key) {
491
+ return key.split("/").filter(Boolean).at(-1) ?? key;
492
+ }
493
+
494
+ // src/node/node-resume-store.ts
495
+ var import_promises2 = require("fs/promises");
496
+ var import_node_path3 = require("path");
497
+ var import_promises3 = require("fs/promises");
498
+ var NodeMemoryResumeStore = class extends MemoryResumeStore {
499
+ };
500
+ var NodeFileResumeStore = class {
501
+ constructor(path) {
502
+ this.path = path;
503
+ }
504
+ path;
505
+ async get(key) {
506
+ const values = await this.read();
507
+ return values[key];
508
+ }
509
+ async set(key, uploadId) {
510
+ const values = await this.read();
511
+ values[key] = uploadId;
512
+ await this.write(values);
513
+ }
514
+ async delete(key) {
515
+ const values = await this.read();
516
+ delete values[key];
517
+ await this.write(values);
518
+ }
519
+ async read() {
520
+ try {
521
+ return JSON.parse(await (0, import_promises2.readFile)(this.path, "utf8"));
522
+ } catch {
523
+ return {};
524
+ }
525
+ }
526
+ async write(values) {
527
+ await (0, import_promises3.mkdir)((0, import_node_path3.dirname)(this.path), { recursive: true });
528
+ await (0, import_promises2.writeFile)(this.path, JSON.stringify(values, null, 2));
529
+ }
530
+ async clear() {
531
+ await (0, import_promises2.rm)(this.path, { force: true });
532
+ }
533
+ };
534
+
535
+ // src/node/node-signer.ts
536
+ var nodeSigner = { supported: false };
537
+ // Annotate the CommonJS export names for ESM import in node:
538
+ 0 && (module.exports = {
539
+ FetchHttpClient,
540
+ MemoryResumeStore,
541
+ NodeBufferUploadSource,
542
+ NodeFileResumeStore,
543
+ NodeFileUploadSource,
544
+ NodeHttpClient,
545
+ NodeMemoryResumeStore,
546
+ UStorageCoreClient,
547
+ UStorageError,
548
+ UStorageNodeClient,
549
+ UploadApi,
550
+ Uploader,
551
+ nodeSigner,
552
+ resolveToken,
553
+ toUStorageError
554
+ });
555
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/node/index.ts","../../src/core/auth/index.ts","../../src/core/errors/index.ts","../../src/core/http/index.ts","../../src/core/upload/api.ts","../../src/core/upload/checksum.ts","../../src/core/upload/file-metadata.ts","../../src/core/upload/uploader.ts","../../src/core/client/index.ts","../../src/core/upload/source.ts","../../src/node/node-client.ts","../../src/node/node-upload-source.ts","../../src/node/node-resume-store.ts","../../src/node/node-signer.ts"],"sourcesContent":["export * from '../core';\nexport * from './node-client';\nexport * from './node-http-client';\nexport * from './node-resume-store';\nexport * from './node-signer';\nexport * from './node-upload-source';\n","export type BrowserAuth =\n | { bearerToken: string | (() => string | Promise<string>); uploadToken?: never }\n | { uploadToken: string | (() => string | Promise<string>); bearerToken?: never };\n\nexport interface NodeCredentialAuth {\n accessKey: string;\n secretKey: string;\n}\n\nexport interface BearerAuth {\n bearerToken: string | (() => string | Promise<string>);\n}\n\nexport async function resolveToken(value: string | (() => string | Promise<string>)): Promise<string> {\n return typeof value === 'function' ? value() : value;\n}\n","import type { ErrorResponse } from '../types';\n\nexport class UStorageError extends Error {\n readonly code: string;\n readonly status: number;\n readonly requestId?: string;\n readonly details?: unknown;\n\n constructor(message: string, options: { code: string; status: number; requestId?: string; details?: unknown }) {\n super(message);\n this.name = 'UStorageError';\n this.code = options.code;\n this.status = options.status;\n this.requestId = options.requestId;\n this.details = options.details;\n }\n}\n\nexport function toUStorageError(status: number, body: unknown): UStorageError {\n const parsed = body as Partial<ErrorResponse>;\n if (parsed?.error?.code && parsed.error.message) {\n return new UStorageError(parsed.error.message, {\n code: parsed.error.code,\n status,\n requestId: parsed.request_id,\n details: parsed.error.details,\n });\n }\n return new UStorageError(`UStorage request failed with status ${status}`, { code: 'REQUEST_FAILED', status });\n}\n","import { toUStorageError } from '../errors';\n\nexport type HeaderValue = string | undefined | null;\n\nexport interface HttpRequestOptions {\n method: string;\n path: string;\n headers?: Record<string, HeaderValue>;\n query?: Record<string, string | number | boolean | undefined | null>;\n body?: unknown;\n signal?: AbortSignal;\n}\n\nexport interface HttpClient {\n request<T>(options: HttpRequestOptions): Promise<T>;\n}\n\nexport type AuthHeadersProvider = (request?: { method: string; path: string; body?: BodyInit }) => Record<string, string> | Promise<Record<string, string>>;\n\nexport class FetchHttpClient implements HttpClient {\n private readonly baseUrl: string;\n private readonly authHeaders?: AuthHeadersProvider;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: { baseUrl: string; authHeaders?: AuthHeadersProvider; fetchImpl?: typeof fetch }) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, '');\n this.authHeaders = options.authHeaders;\n this.fetchImpl = options.fetchImpl ?? fetch;\n }\n\n async request<T>(options: HttpRequestOptions): Promise<T> {\n const headers = new Headers();\n for (const [key, value] of Object.entries(options.headers ?? {})) {\n if (value !== undefined && value !== null) headers.set(key, value);\n }\n let body: BodyInit | undefined;\n if (options.body !== undefined) {\n if (isBodyInit(options.body)) {\n body = options.body;\n } else {\n headers.set('content-type', headers.get('content-type') ?? 'application/json');\n body = JSON.stringify(options.body);\n }\n }\n const path = this.pathWithQuery(options.path, options.query);\n const authHeaders = this.authHeaders ? await this.authHeaders({ method: options.method, path, body }) : {};\n for (const [key, value] of Object.entries(authHeaders)) headers.set(key, value);\n const response = await this.fetchImpl(this.url(path), {\n method: options.method,\n headers,\n body,\n signal: options.signal,\n });\n if (response.status === 204) return undefined as T;\n const text = await response.text();\n const parsed = text ? parseJson(text) : undefined;\n if (!response.ok) throw toUStorageError(response.status, parsed);\n return parsed as T;\n }\n\n private url(path: string): string {\n return new URL(path.startsWith('/') ? path : `/${path}`, `${this.baseUrl}/`).toString();\n }\n\n private pathWithQuery(path: string, query?: HttpRequestOptions['query']): string {\n const url = new URL(path.startsWith('/') ? path : `/${path}`, 'http://sdk.local');\n for (const [key, value] of Object.entries(query ?? {})) {\n if (value !== undefined && value !== null) url.searchParams.set(key, String(value));\n }\n return `${url.pathname}${url.search}`;\n }\n}\n\nfunction parseJson(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n\nfunction isBodyInit(value: unknown): value is BodyInit {\n return typeof Blob !== 'undefined' && value instanceof Blob ||\n typeof FormData !== 'undefined' && value instanceof FormData ||\n typeof URLSearchParams !== 'undefined' && value instanceof URLSearchParams ||\n typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer ||\n ArrayBuffer.isView(value) ||\n typeof ReadableStream !== 'undefined' && value instanceof ReadableStream;\n}\n","import type { HttpClient } from '../http';\nimport type { UploadBody } from './source';\nimport type {\n CompleteUploadRequest,\n CompleteUploadResponse,\n CreateFileUrlRequest,\n CreateFileUrlResponse,\n CreateUploadSessionRequest,\n CreateUploadSessionResponse,\n CreateUploadTokenRequest,\n CreateUploadTokenResponse,\n UploadChunkResponse,\n UploadStatusResponse,\n} from '../types';\n\nexport class UploadApi {\n constructor(private readonly http: HttpClient) {}\n\n createUploadToken(request: CreateUploadTokenRequest): Promise<CreateUploadTokenResponse> {\n return this.http.request({ method: 'POST', path: '/uploads/tokens', body: request });\n }\n\n createSession(request: CreateUploadSessionRequest): Promise<CreateUploadSessionResponse> {\n return this.http.request({ method: 'POST', path: '/uploads/sessions', body: request });\n }\n\n createFileUrl(request: CreateFileUrlRequest): Promise<CreateFileUrlResponse> {\n return this.http.request({ method: 'POST', path: '/files/url', body: request });\n }\n\n uploadChunk(uploadId: string, index: number, body: UploadBody, checksum?: string, signal?: AbortSignal): Promise<UploadChunkResponse> {\n return this.http.request({ method: 'PUT', path: `/uploads/${uploadId}/chunks/${index}`, headers: { 'x-chunk-checksum': checksum }, body, signal });\n }\n\n getStatus(uploadId: string): Promise<UploadStatusResponse> {\n return this.http.request({ method: 'GET', path: `/uploads/${uploadId}/status` });\n }\n\n complete(uploadId: string, request: CompleteUploadRequest = {}): Promise<CompleteUploadResponse> {\n return this.http.request({ method: 'POST', path: `/uploads/${uploadId}/complete`, body: request });\n }\n\n cancel(uploadId: string): Promise<void> {\n return this.http.request({ method: 'DELETE', path: `/uploads/${uploadId}` });\n }\n}\n","import type { UploadBody } from './source';\n\nexport async function sha256Hex(data: UploadBody): Promise<string> {\n const bytes = await toBytes(data);\n const digest = await crypto.subtle.digest('SHA-256', bytes);\n return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, '0')).join('');\n}\n\nasync function toBytes(data: UploadBody): Promise<ArrayBuffer> {\n if (data instanceof ArrayBuffer) return data;\n if (ArrayBuffer.isView(data)) return new Uint8Array(data.buffer, data.byteOffset, data.byteLength).slice().buffer;\n if (typeof Blob !== 'undefined' && data instanceof Blob) return data.arrayBuffer();\n if (typeof data === 'string') return new TextEncoder().encode(data).buffer;\n return new Response(data).arrayBuffer();\n}\n","const mimeTypesByExtension: Record<string, string> = {\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n svg: 'image/svg+xml',\n heic: 'image/heic',\n mp4: 'video/mp4',\n mpeg: 'video/mpeg',\n mov: 'video/quicktime',\n avi: 'video/x-msvideo',\n webm: 'video/webm',\n ogg: 'video/ogg',\n '3gp': 'video/3gpp',\n flv: 'video/x-flv',\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n aac: 'audio/aac',\n m4a: 'audio/x-m4a',\n flac: 'audio/flac',\n amr: 'audio/amr',\n pdf: 'application/pdf',\n txt: 'text/plain',\n json: 'application/json',\n zip: 'application/zip',\n tar: 'application/x-tar',\n rar: 'application/vnd.rar',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n xls: 'application/vnd.ms-excel',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n ppt: 'application/vnd.ms-powerpoint',\n pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n};\n\nexport function extensionFromName(nameOrKey: string): string | null {\n const filename = nameOrKey.split(/[\\\\/]/).filter(Boolean).at(-1) ?? nameOrKey;\n const dot = filename.lastIndexOf('.');\n if (dot <= 0 || dot === filename.length - 1) {\n return null;\n }\n return filename.slice(dot + 1).toLowerCase();\n}\n\nexport function mimeTypeFromExtension(extension: string | null): string | null {\n return extension ? mimeTypesByExtension[extension.toLowerCase()] ?? null : null;\n}\n\nexport function resolveUploadContentType(\n explicit: string | null | undefined,\n sourceType: string | null | undefined,\n ...names: Array<string | null | undefined>\n): string | null {\n const normalizedExplicit = normalizeContentType(explicit);\n if (normalizedExplicit) {\n return normalizedExplicit;\n }\n\n const normalizedSourceType = normalizeContentType(sourceType);\n if (normalizedSourceType) {\n return normalizedSourceType;\n }\n\n for (const name of names) {\n if (!name) continue;\n const inferred = mimeTypeFromExtension(extensionFromName(name));\n if (inferred) {\n return inferred;\n }\n }\n\n return null;\n}\n\nfunction normalizeContentType(value: string | null | undefined): string | null {\n const normalized = value?.trim();\n return normalized ? normalized : null;\n}\n","import { sha256Hex } from './checksum';\nimport { resolveUploadContentType } from './file-metadata';\nimport type { UploadApi } from './api';\nimport type { JsonValue, UploadChunkResponse, CompleteUploadResponse } from '../types';\nimport type { ResumeStore, UploadBody, UploadSource } from './source';\n\nexport interface PutObjectOptions {\n bucketName: string;\n key: string;\n workspaceName?: string;\n contentType?: string | null;\n metadata?: JsonValue;\n checksum?: false | 'sha256' | { file?: string; chunks?: Record<number, string> };\n resume?: boolean;\n resumeKey?: string;\n overwrite?: boolean;\n visibility?: 'public' | 'private';\n chunkSize?: number;\n signal?: AbortSignal;\n onProgress?: (event: UploadProgressEvent) => void;\n}\n\nexport interface UploadFileOptions extends Omit<PutObjectOptions, 'key'> {\n key?: string;\n}\n\nexport interface UploadProgressEvent {\n uploadId: string;\n chunkIndex?: number;\n uploadedChunks: number;\n totalChunks: number;\n uploadedSize: number;\n fileSize: number;\n progress: number;\n}\n\nexport interface UploadObjectResult extends CompleteUploadResponse {\n uploadId: string;\n fileId: string;\n publicId?: string;\n visibility?: 'public' | 'private' | string;\n url?: string;\n expiresAt?: string | null;\n}\n\nexport class Uploader {\n constructor(\n private readonly uploads: UploadApi,\n private readonly resumeStore?: ResumeStore,\n ) {}\n\n async putObject(source: UploadSource, options: PutObjectOptions): Promise<UploadObjectResult> {\n const chunkSize = options.chunkSize ?? 8 * 1024 * 1024;\n if (chunkSize <= 0) throw new Error('chunkSize must be positive');\n const totalChunks = source.size === 0 ? 1 : Math.ceil(source.size / chunkSize);\n const useResume = options.resume === true || Boolean(options.resumeKey);\n const resumeKey = useResume ? options.resumeKey ?? await source.fingerprint(options.key) : undefined;\n let uploadId = resumeKey && this.resumeStore ? await this.resumeStore.get(resumeKey) : undefined;\n let missingChunks: number[] | undefined;\n if (uploadId) {\n try {\n const status = await this.uploads.getStatus(uploadId);\n missingChunks = status.missing_chunks;\n options.onProgress?.(statusToProgress(status));\n } catch {\n uploadId = undefined;\n if (resumeKey) await this.resumeStore?.delete(resumeKey);\n }\n }\n if (!uploadId) {\n const session = await this.uploads.createSession({\n bucket_name: options.bucketName,\n key: options.key,\n workspace_name: options.workspaceName ?? null,\n mime_type: resolveUploadContentType(\n options.contentType,\n source.type,\n options.key,\n source.name,\n ),\n file_size: source.size,\n chunk_size: chunkSize,\n total_chunks: totalChunks,\n checksum: typeof options.checksum === 'object' ? options.checksum.file ?? null : null,\n metadata: options.metadata,\n overwrite: options.overwrite ?? true,\n visibility: options.visibility ?? null,\n });\n uploadId = session.upload_id;\n missingChunks = Array.from({ length: totalChunks }, (_, index) => index);\n if (resumeKey) await this.resumeStore?.set(resumeKey, uploadId);\n }\n for (const index of missingChunks ?? []) {\n const start = index * chunkSize;\n const end = source.size === 0 ? 0 : Math.min(source.size, start + chunkSize);\n const chunk = await source.slice(start, end);\n const checksum = await this.chunkChecksum(options.checksum, index, chunk.body);\n const response = await this.uploads.uploadChunk(uploadId, index, chunk.body, checksum, options.signal);\n options.onProgress?.(chunkResponseToProgress(response));\n }\n const complete = await this.uploads.complete(uploadId, { checksum: typeof options.checksum === 'object' ? options.checksum.file : undefined });\n if (resumeKey) await this.resumeStore?.delete(resumeKey);\n return {\n ...complete,\n uploadId: complete.upload_id,\n fileId: complete.file_id,\n publicId: complete.public_id,\n visibility: complete.visibility,\n url: complete.url,\n expiresAt: complete.expires_at ?? null,\n };\n }\n\n private async chunkChecksum(checksum: PutObjectOptions['checksum'], index: number, body: UploadBody): Promise<string | undefined> {\n if (!checksum) return undefined;\n if (checksum === 'sha256') return sha256Hex(body);\n return checksum.chunks?.[index];\n }\n}\n\nfunction chunkResponseToProgress(response: UploadChunkResponse): UploadProgressEvent {\n return {\n uploadId: response.upload_id,\n chunkIndex: response.chunk_index,\n uploadedChunks: response.uploaded_chunks,\n totalChunks: response.total_chunks,\n uploadedSize: response.uploaded_size,\n fileSize: response.file_size,\n progress: response.progress,\n };\n}\n\nfunction statusToProgress(response: { upload_id: string; uploaded_chunks: number[]; total_chunks: number; uploaded_size: number; file_size: number; progress: number }): UploadProgressEvent {\n return {\n uploadId: response.upload_id,\n uploadedChunks: response.uploaded_chunks.length,\n totalChunks: response.total_chunks,\n uploadedSize: response.uploaded_size,\n fileSize: response.file_size,\n progress: response.progress,\n };\n}\n","import { FetchHttpClient, type AuthHeadersProvider, type HttpClient } from '../http';\nimport { UploadApi } from '../upload/api';\nimport { Uploader } from '../upload/uploader';\nimport type { ResumeStore, UploadSource } from '../upload/source';\nimport type { GetObjectUrlInput, GetObjectUrlResult } from '../types';\nimport type { PutObjectOptions } from '../upload/uploader';\n\nexport interface UStorageClientOptions {\n uploadBaseUrl: string;\n authHeaders?: AuthHeadersProvider;\n uploadHttpClient?: HttpClient;\n resumeStore?: ResumeStore;\n}\n\nexport class UStorageCoreClient {\n readonly uploads: UploadApi;\n private readonly uploader: Uploader;\n\n constructor(options: UStorageClientOptions) {\n const uploadHttp = options.uploadHttpClient ?? new FetchHttpClient({ baseUrl: options.uploadBaseUrl, authHeaders: options.authHeaders });\n this.uploads = new UploadApi(uploadHttp);\n this.uploader = new Uploader(this.uploads, options.resumeStore);\n }\n\n async getObjectUrl(input: GetObjectUrlInput): Promise<GetObjectUrlResult> {\n const response = await this.uploads.createFileUrl({\n file_id: input.fileId ?? null,\n bucket: input.bucket ?? null,\n bucket_id: input.bucketId ?? null,\n key: input.key ?? null,\n path: input.path ?? null,\n expires_in: input.expiresIn ?? null,\n });\n return {\n fileId: response.file_id,\n publicId: response.public_id,\n visibility: response.visibility,\n url: response.url,\n expiresAt: response.expires_at,\n };\n }\n\n getSignedUrl(input: GetObjectUrlInput): Promise<GetObjectUrlResult> {\n return this.getObjectUrl(input);\n }\n\n protected uploadSource(source: UploadSource, options: PutObjectOptions) {\n return this.uploader.putObject(source, options);\n }\n}\n","export type UploadBody = BodyInit | ArrayBufferView;\n\nexport interface UploadChunk {\n body: UploadBody;\n size: number;\n}\n\nexport interface UploadSource {\n readonly name: string;\n readonly size: number;\n readonly type?: string;\n fingerprint(key?: string): string | Promise<string>;\n slice(start: number, end: number): UploadChunk | Promise<UploadChunk>;\n}\n\nexport interface ResumeStore {\n get(key: string): Promise<string | undefined> | string | undefined;\n set(key: string, uploadId: string): Promise<void> | void;\n delete(key: string): Promise<void> | void;\n}\n\nexport class MemoryResumeStore implements ResumeStore {\n private readonly values = new Map<string, string>();\n\n get(key: string): string | undefined {\n return this.values.get(key);\n }\n\n set(key: string, uploadId: string): void {\n this.values.set(key, uploadId);\n }\n\n delete(key: string): void {\n this.values.delete(key);\n }\n}\n","import { basename } from 'node:path';\nimport { resolveToken, type BearerAuth, type NodeCredentialAuth } from '../core/auth';\nimport { UStorageCoreClient } from '../core/client';\nimport type { ResumeStore } from '../core/upload/source';\nimport type { PutObjectOptions, UploadFileOptions } from '../core/upload/uploader';\nimport { NodeBufferUploadSource, NodeFileUploadSource } from './node-upload-source';\n\nexport type UStorageNodeAuth = NodeCredentialAuth | BearerAuth;\n\nexport interface UStorageNodeClientOptions {\n uploadBaseUrl: string;\n auth: UStorageNodeAuth;\n resumeStore?: ResumeStore;\n}\n\nexport class UStorageNodeClient extends UStorageCoreClient {\n constructor(options: UStorageNodeClientOptions) {\n super({\n uploadBaseUrl: options.uploadBaseUrl,\n resumeStore: options.resumeStore,\n authHeaders: async (): Promise<Record<string, string>> => {\n if ('accessKey' in options.auth) {\n return {\n 'x-access-key': options.auth.accessKey,\n 'x-secret-key': options.auth.secretKey,\n };\n }\n return { Authorization: `Bearer ${await resolveToken(options.auth.bearerToken)}` };\n },\n });\n }\n\n async putObject(options: PutObjectOptions & { body: Buffer | string }) {\n if (typeof options.body === 'string') {\n return this.uploadSource(await NodeFileUploadSource.fromPath(options.body, { name: objectName(options.key), type: options.contentType ?? undefined }), options);\n }\n return this.uploadSource(new NodeBufferUploadSource(options.body, objectName(options.key), options.contentType ?? undefined), options);\n }\n\n async uploadFile(path: string, options: UploadFileOptions) {\n const key = options.key ?? basename(path);\n return this.uploadSource(await NodeFileUploadSource.fromPath(path, { name: objectName(key), type: options.contentType ?? undefined }), { ...options, key });\n }\n}\n\nfunction objectName(key: string): string {\n return key.split('/').filter(Boolean).at(-1) ?? key;\n}\n","import { basename } from 'node:path';\nimport { open, stat } from 'node:fs/promises';\nimport type { FileHandle } from 'node:fs/promises';\nimport { resolveUploadContentType } from '../core/upload/file-metadata';\nimport type { UploadChunk, UploadSource } from '../core/upload/source';\n\nexport class NodeFileUploadSource implements UploadSource {\n readonly name: string;\n readonly size: number;\n readonly type?: string;\n\n private constructor(private readonly path: string, size: number, name?: string, type?: string) {\n this.name = name ?? basename(path);\n this.size = size;\n this.type = type;\n }\n\n static async fromPath(path: string, options: { name?: string; type?: string } = {}): Promise<NodeFileUploadSource> {\n const info = await stat(path);\n const name = options.name ?? basename(path);\n return new NodeFileUploadSource(\n path,\n info.size,\n name,\n resolveUploadContentType(options.type, undefined, name, path) ?? undefined,\n );\n }\n\n fingerprint(key?: string): string {\n return ['node-file', key ?? '', this.path, this.name, this.size, this.type ?? ''].join(':');\n }\n\n async slice(start: number, end: number): Promise<UploadChunk> {\n const length = end - start;\n if (length === 0) return { body: new Uint8Array(), size: 0 };\n const file = await open(this.path, 'r');\n try {\n const buffer = Buffer.alloc(length);\n await file.read(buffer, 0, length, start);\n const body = new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength).slice().buffer;\n return { body, size: buffer.byteLength };\n } finally {\n await closeFile(file);\n }\n }\n}\n\nexport class NodeBufferUploadSource implements UploadSource {\n readonly size: number;\n readonly type?: string;\n\n constructor(private readonly buffer: Buffer, readonly name: string, type?: string) {\n this.type = resolveUploadContentType(type, undefined, name) ?? undefined;\n this.size = buffer.byteLength;\n }\n\n fingerprint(key?: string): string {\n return ['node-buffer', key ?? '', this.name, this.size, this.type ?? ''].join(':');\n }\n\n slice(start: number, end: number): UploadChunk {\n const buffer = this.buffer.subarray(start, end);\n const body = new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength).slice().buffer;\n return { body, size: buffer.byteLength };\n }\n}\n\nasync function closeFile(file: FileHandle): Promise<void> {\n await file.close();\n}\n","import { readFile, writeFile, rm } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport { mkdir } from 'node:fs/promises';\nimport { MemoryResumeStore, type ResumeStore } from '../core/upload/source';\n\nexport class NodeMemoryResumeStore extends MemoryResumeStore {}\n\nexport class NodeFileResumeStore implements ResumeStore {\n constructor(private readonly path: string) {}\n\n async get(key: string): Promise<string | undefined> {\n const values = await this.read();\n return values[key];\n }\n\n async set(key: string, uploadId: string): Promise<void> {\n const values = await this.read();\n values[key] = uploadId;\n await this.write(values);\n }\n\n async delete(key: string): Promise<void> {\n const values = await this.read();\n delete values[key];\n await this.write(values);\n }\n\n private async read(): Promise<Record<string, string>> {\n try {\n return JSON.parse(await readFile(this.path, 'utf8')) as Record<string, string>;\n } catch {\n return {};\n }\n }\n\n private async write(values: Record<string, string>): Promise<void> {\n await mkdir(dirname(this.path), { recursive: true });\n await writeFile(this.path, JSON.stringify(values, null, 2));\n }\n\n async clear(): Promise<void> {\n await rm(this.path, { force: true });\n }\n}\n","export interface SignedRequestPlaceholder {\n readonly supported: false;\n}\n\nexport const nodeSigner: SignedRequestPlaceholder = { supported: false };\n"],"mappings":"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","names":["import_node_path","import_promises","import_node_path"]}