@velajs/storage 0.3.1 → 0.3.2

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 (99) hide show
  1. package/CHANGELOG.md +6 -1
  2. package/dist/body-BMUcBeQ0.js +93 -0
  3. package/dist/body-BMUcBeQ0.js.map +1 -0
  4. package/dist/client/index.d.ts +49 -46
  5. package/dist/client/index.js +207 -228
  6. package/dist/client/index.js.map +1 -0
  7. package/dist/drivers/memory/index.d.ts +17 -13
  8. package/dist/drivers/memory/index.js +190 -197
  9. package/dist/drivers/memory/index.js.map +1 -0
  10. package/dist/drivers/r2/index.d.ts +7 -4
  11. package/dist/drivers/r2/index.js +162 -160
  12. package/dist/drivers/r2/index.js.map +1 -0
  13. package/dist/drivers/r2-http/index.d.ts +23 -19
  14. package/dist/drivers/r2-http/index.js +52 -45
  15. package/dist/drivers/r2-http/index.js.map +1 -0
  16. package/dist/drivers/s3/index.d.ts +79 -5
  17. package/dist/drivers/s3/index.js +2 -3
  18. package/dist/index.d.ts +271 -17
  19. package/dist/index.js +1078 -16
  20. package/dist/index.js.map +1 -0
  21. package/dist/middleware/index.d.ts +177 -15
  22. package/dist/middleware/index.js +553 -8
  23. package/dist/middleware/index.js.map +1 -0
  24. package/dist/protocol.types-C5PPBD12.d.ts +80 -0
  25. package/dist/r2.types-Bw4Ft83t.d.ts +71 -0
  26. package/dist/retry-DXtO6R9D.js +119 -0
  27. package/dist/retry-DXtO6R9D.js.map +1 -0
  28. package/dist/s3-DrE9NrnD.js +557 -0
  29. package/dist/s3-DrE9NrnD.js.map +1 -0
  30. package/dist/storage.error-DVCOkJhc.js +49 -0
  31. package/dist/storage.error-DVCOkJhc.js.map +1 -0
  32. package/dist/storage.types-BJN7Yp1J.d.ts +288 -0
  33. package/dist/storagesdk/index.d.ts +73 -69
  34. package/dist/storagesdk/index.js +117 -130
  35. package/dist/storagesdk/index.js.map +1 -0
  36. package/dist/stored-file-2Yl07eRc.js +105 -0
  37. package/dist/stored-file-2Yl07eRc.js.map +1 -0
  38. package/dist/testing/index.d.ts +12 -8
  39. package/dist/testing/index.js +36 -53
  40. package/dist/testing/index.js.map +1 -0
  41. package/package.json +62 -48
  42. package/dist/base64.d.ts +0 -8
  43. package/dist/base64.js +0 -25
  44. package/dist/decorators/inject-storage.decorator.d.ts +0 -17
  45. package/dist/decorators/inject-storage.decorator.js +0 -21
  46. package/dist/drivers/r2/r2.types.d.ts +0 -67
  47. package/dist/drivers/r2/r2.types.js +0 -5
  48. package/dist/drivers/s3/s3-client.d.ts +0 -33
  49. package/dist/drivers/s3/s3-client.js +0 -154
  50. package/dist/drivers/s3/s3.driver.d.ts +0 -4
  51. package/dist/drivers/s3/s3.driver.js +0 -407
  52. package/dist/drivers/s3/s3.types.d.ts +0 -28
  53. package/dist/drivers/s3/s3.types.js +0 -1
  54. package/dist/drivers/s3/xml.d.ts +0 -6
  55. package/dist/drivers/s3/xml.js +0 -52
  56. package/dist/http/authorizer.types.d.ts +0 -59
  57. package/dist/http/authorizer.types.js +0 -1
  58. package/dist/http/http-helpers.d.ts +0 -22
  59. package/dist/http/http-helpers.js +0 -80
  60. package/dist/http/protocol.types.d.ts +0 -76
  61. package/dist/http/protocol.types.js +0 -1
  62. package/dist/internal/body.d.ts +0 -18
  63. package/dist/internal/body.js +0 -90
  64. package/dist/internal/retry.d.ts +0 -41
  65. package/dist/internal/retry.js +0 -127
  66. package/dist/internal/stored-file.d.ts +0 -27
  67. package/dist/internal/stored-file.js +0 -114
  68. package/dist/middleware/cache.d.ts +0 -50
  69. package/dist/middleware/cache.js +0 -101
  70. package/dist/middleware/compose.d.ts +0 -12
  71. package/dist/middleware/compose.js +0 -11
  72. package/dist/middleware/compression.d.ts +0 -16
  73. package/dist/middleware/compression.js +0 -101
  74. package/dist/middleware/encryption.d.ts +0 -14
  75. package/dist/middleware/encryption.js +0 -134
  76. package/dist/middleware/failover.d.ts +0 -18
  77. package/dist/middleware/failover.js +0 -52
  78. package/dist/middleware/retry.d.ts +0 -14
  79. package/dist/middleware/retry.js +0 -47
  80. package/dist/middleware/versioning.d.ts +0 -36
  81. package/dist/middleware/versioning.js +0 -89
  82. package/dist/middleware/wrap.d.ts +0 -11
  83. package/dist/middleware/wrap.js +0 -46
  84. package/dist/object-key.d.ts +0 -17
  85. package/dist/object-key.js +0 -42
  86. package/dist/storage.controller.d.ts +0 -21
  87. package/dist/storage.controller.js +0 -386
  88. package/dist/storage.error.d.ts +0 -38
  89. package/dist/storage.error.js +0 -52
  90. package/dist/storage.facade.d.ts +0 -47
  91. package/dist/storage.facade.js +0 -443
  92. package/dist/storage.module.d.ts +0 -46
  93. package/dist/storage.module.js +0 -113
  94. package/dist/storage.service.d.ts +0 -42
  95. package/dist/storage.service.js +0 -86
  96. package/dist/storage.tokens.d.ts +0 -13
  97. package/dist/storage.tokens.js +0 -26
  98. package/dist/storage.types.d.ts +0 -245
  99. package/dist/storage.types.js +0 -1
@@ -0,0 +1,49 @@
1
+ //#region src/storage.error.ts
2
+ /** Codes that are safe to retry by default (transient failures). */
3
+ const RETRYABLE = /* @__PURE__ */ new Set([
4
+ "Network",
5
+ "RateLimited",
6
+ "Timeout",
7
+ "Provider"
8
+ ]);
9
+ var StorageError = class StorageError extends Error {
10
+ name = "StorageError";
11
+ code;
12
+ retryable;
13
+ status;
14
+ /** Whether `message` is non-client-safe (provider/transport/wrapped origin). */
15
+ internal;
16
+ constructor(code, message, options) {
17
+ super(message, options?.cause !== void 0 ? { cause: options.cause } : void 0);
18
+ this.code = code;
19
+ this.status = options?.status;
20
+ this.retryable = options?.retryable ?? RETRYABLE.has(code);
21
+ this.internal = options?.internal ?? false;
22
+ }
23
+ /** Wrap an arbitrary thrown value as a `StorageError` (idempotent). */
24
+ static wrap(e) {
25
+ if (e instanceof StorageError) return e;
26
+ if (isAbort(e)) return new StorageError("Aborted", "operation aborted", { cause: e });
27
+ return new StorageError("Provider", e instanceof Error ? e.message : String(e), {
28
+ cause: e,
29
+ internal: true
30
+ });
31
+ }
32
+ /** Map a transport status code to a `StorageError` (5xx/429 retryable). */
33
+ static fromStatus(status, message, cause) {
34
+ return new StorageError(status === 404 ? "NotFound" : status === 403 || status === 401 ? "AccessDenied" : status === 409 ? "Conflict" : status === 429 ? "RateLimited" : status >= 500 ? "Provider" : "InvalidRequest", message, {
35
+ status,
36
+ cause,
37
+ retryable: status === 429 || status >= 500,
38
+ internal: true
39
+ });
40
+ }
41
+ };
42
+ /** True for `AbortError`-shaped values (DOMException or `{ name: 'AbortError' }`). */
43
+ function isAbort(e) {
44
+ return typeof e === "object" && e !== null && "name" in e && e.name === "AbortError";
45
+ }
46
+ //#endregion
47
+ export { isAbort as n, StorageError as t };
48
+
49
+ //# sourceMappingURL=storage.error-DVCOkJhc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.error-DVCOkJhc.js","names":[],"sources":["../src/storage.error.ts"],"sourcesContent":["/**\n * The single error taxonomy for `@velajs/storage`. Every driver maps its\n * provider/transport failures onto a {@link StorageErrorCode}; the facade's\n * capability gates throw `Unsupported`; the retry loop keys off\n * {@link StorageError.retryable}; and the HTTP controller maps codes to\n * status via its own `codeToHttp()` table.\n */\nexport type StorageErrorCode =\n | 'NotFound'\n | 'AccessDenied'\n | 'Unsupported'\n | 'ReadOnly'\n | 'InvalidKey'\n | 'InvalidRequest'\n | 'Conflict'\n | 'RateLimited'\n | 'Network'\n | 'Timeout'\n | 'Aborted'\n | 'Provider'\n | 'Parse';\n\n/** Codes that are safe to retry by default (transient failures). */\nconst RETRYABLE: ReadonlySet<StorageErrorCode> = new Set<StorageErrorCode>([\n 'Network',\n 'RateLimited',\n 'Timeout',\n 'Provider',\n]);\n\nexport interface StorageErrorOptions {\n cause?: unknown;\n /** Underlying HTTP status, when the failure came from a transport response. */\n status?: number;\n /** Override the default retryability implied by {@link StorageErrorCode}. */\n retryable?: boolean;\n /**\n * True when `message` came from a provider/transport/wrapped source rather\n * than being authored as client-safe text. The HTTP controller redacts such\n * messages so raw provider detail never reaches a client. Default false —\n * a bare `new StorageError(code, msg)` is the author's vouch that `msg` is\n * client-safe; driver/wrap code MUST set this when echoing provider text.\n */\n internal?: boolean;\n}\n\nexport class StorageError extends Error {\n override name = 'StorageError';\n readonly code: StorageErrorCode;\n readonly retryable: boolean;\n readonly status: number | undefined;\n /** Whether `message` is non-client-safe (provider/transport/wrapped origin). */\n readonly internal: boolean;\n\n constructor(code: StorageErrorCode, message: string, options?: StorageErrorOptions) {\n super(message, options?.cause !== undefined ? { cause: options.cause } : undefined);\n this.code = code;\n this.status = options?.status;\n this.retryable = options?.retryable ?? RETRYABLE.has(code);\n this.internal = options?.internal ?? false;\n }\n\n /** Wrap an arbitrary thrown value as a `StorageError` (idempotent). */\n static wrap(e: unknown): StorageError {\n if (e instanceof StorageError) return e;\n if (isAbort(e)) return new StorageError('Aborted', 'operation aborted', { cause: e });\n // The wrapped message is arbitrary provider/host text — never client-safe.\n return new StorageError('Provider', e instanceof Error ? e.message : String(e), {\n cause: e,\n internal: true,\n });\n }\n\n /** Map a transport status code to a `StorageError` (5xx/429 retryable). */\n static fromStatus(status: number, message: string, cause?: unknown): StorageError {\n const code: StorageErrorCode =\n status === 404\n ? 'NotFound'\n : status === 403 || status === 401\n ? 'AccessDenied'\n : status === 409\n ? 'Conflict'\n : status === 429\n ? 'RateLimited'\n : status >= 500\n ? 'Provider'\n : 'InvalidRequest';\n return new StorageError(code, message, {\n status,\n cause,\n retryable: status === 429 || status >= 500,\n // Message came off a transport response — treat as non-client-safe.\n internal: true,\n });\n }\n}\n\n/** True for `AbortError`-shaped values (DOMException or `{ name: 'AbortError' }`). */\nexport function isAbort(e: unknown): boolean {\n return (\n typeof e === 'object' &&\n e !== null &&\n 'name' in e &&\n (e as { name?: unknown }).name === 'AbortError'\n );\n}\n"],"mappings":";;AAuBA,MAAM,4BAA2C,IAAI,IAAsB;CACzE;CACA;CACA;CACA;AACF,CAAC;AAkBD,IAAa,eAAb,MAAa,qBAAqB,MAAM;CACtC,OAAgB;CAChB;CACA;CACA;;CAEA;CAEA,YAAY,MAAwB,SAAiB,SAA+B;EAClF,MAAM,SAAS,SAAS,UAAU,KAAA,IAAY,EAAE,OAAO,QAAQ,MAAM,IAAI,KAAA,CAAS;EAClF,KAAK,OAAO;EACZ,KAAK,SAAS,SAAS;EACvB,KAAK,YAAY,SAAS,aAAa,UAAU,IAAI,IAAI;EACzD,KAAK,WAAW,SAAS,YAAY;CACvC;;CAGA,OAAO,KAAK,GAA0B;EACpC,IAAI,aAAa,cAAc,OAAO;EACtC,IAAI,QAAQ,CAAC,GAAG,OAAO,IAAI,aAAa,WAAW,qBAAqB,EAAE,OAAO,EAAE,CAAC;EAEpF,OAAO,IAAI,aAAa,YAAY,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,GAAG;GAC9E,OAAO;GACP,UAAU;EACZ,CAAC;CACH;;CAGA,OAAO,WAAW,QAAgB,SAAiB,OAA+B;EAahF,OAAO,IAAI,aAXT,WAAW,MACP,aACA,WAAW,OAAO,WAAW,MAC3B,iBACA,WAAW,MACT,aACA,WAAW,MACT,gBACA,UAAU,MACR,aACA,kBACgB,SAAS;GACrC;GACA;GACA,WAAW,WAAW,OAAO,UAAU;GAEvC,UAAU;EACZ,CAAC;CACH;AACF;;AAGA,SAAgB,QAAQ,GAAqB;CAC3C,OACE,OAAO,MAAM,YACb,MAAM,QACN,UAAU,KACT,EAAyB,SAAS;AAEvC"}
@@ -0,0 +1,288 @@
1
+ //#region src/storage.error.d.ts
2
+ /**
3
+ * The single error taxonomy for `@velajs/storage`. Every driver maps its
4
+ * provider/transport failures onto a {@link StorageErrorCode}; the facade's
5
+ * capability gates throw `Unsupported`; the retry loop keys off
6
+ * {@link StorageError.retryable}; and the HTTP controller maps codes to
7
+ * status via its own `codeToHttp()` table.
8
+ */
9
+ type StorageErrorCode = 'NotFound' | 'AccessDenied' | 'Unsupported' | 'ReadOnly' | 'InvalidKey' | 'InvalidRequest' | 'Conflict' | 'RateLimited' | 'Network' | 'Timeout' | 'Aborted' | 'Provider' | 'Parse';
10
+ interface StorageErrorOptions {
11
+ cause?: unknown;
12
+ /** Underlying HTTP status, when the failure came from a transport response. */
13
+ status?: number;
14
+ /** Override the default retryability implied by {@link StorageErrorCode}. */
15
+ retryable?: boolean;
16
+ /**
17
+ * True when `message` came from a provider/transport/wrapped source rather
18
+ * than being authored as client-safe text. The HTTP controller redacts such
19
+ * messages so raw provider detail never reaches a client. Default false —
20
+ * a bare `new StorageError(code, msg)` is the author's vouch that `msg` is
21
+ * client-safe; driver/wrap code MUST set this when echoing provider text.
22
+ */
23
+ internal?: boolean;
24
+ }
25
+ declare class StorageError extends Error {
26
+ name: string;
27
+ readonly code: StorageErrorCode;
28
+ readonly retryable: boolean;
29
+ readonly status: number | undefined;
30
+ /** Whether `message` is non-client-safe (provider/transport/wrapped origin). */
31
+ readonly internal: boolean;
32
+ constructor(code: StorageErrorCode, message: string, options?: StorageErrorOptions);
33
+ /** Wrap an arbitrary thrown value as a `StorageError` (idempotent). */
34
+ static wrap(e: unknown): StorageError;
35
+ /** Map a transport status code to a `StorageError` (5xx/429 retryable). */
36
+ static fromStatus(status: number, message: string, cause?: unknown): StorageError;
37
+ }
38
+ /** True for `AbortError`-shaped values (DOMException or `{ name: 'AbortError' }`). */
39
+ declare function isAbort(e: unknown): boolean;
40
+ //#endregion
41
+ //#region src/storage.types.d.ts
42
+ type Body = Blob | File | ReadableStream<Uint8Array> | ArrayBuffer | ArrayBufferView | Uint8Array | string;
43
+ /** A multipart part must have a known length, so streams are excluded. */
44
+ type PartBody = Blob | ArrayBuffer | ArrayBufferView | Uint8Array;
45
+ interface RetryBackoffContext {
46
+ /** 1-based retry number (attempt 1 is the first retry after the initial call). */
47
+ attempt: number;
48
+ error: StorageError;
49
+ }
50
+ type RetryOptions = number | {
51
+ max: number;
52
+ backoff?: (ctx: RetryBackoffContext) => number;
53
+ };
54
+ interface OperationOptions {
55
+ /** Abort the operation when this signal fires. */
56
+ signal?: AbortSignal;
57
+ /** Per-attempt timeout in ms. `0` or negative disables timeout handling. */
58
+ timeout?: number;
59
+ /** Retry transient failures. A number is treated as `{ max: number }`. */
60
+ retries?: RetryOptions;
61
+ }
62
+ interface UploadProgress {
63
+ /** Cumulative bytes sent so far. */
64
+ loaded: number;
65
+ /** Total bytes to send, when known (omitted for unknown-length streams). */
66
+ total?: number;
67
+ }
68
+ /** Tuning for multipart uploads. `multipart: true` uses these defaults. */
69
+ interface MultipartOptions {
70
+ /** Bytes per part. Default 5 MiB (S3's minimum non-final part size). */
71
+ partSize?: number;
72
+ /** Parts uploaded concurrently. Default 4. */
73
+ concurrency?: number;
74
+ }
75
+ interface UploadOptions extends OperationOptions {
76
+ contentType?: string;
77
+ /** Persisted only when the driver advertises `supportsCacheControl`. */
78
+ cacheControl?: string;
79
+ /** Persisted only when the driver advertises `supportsMetadata` (empty == none). */
80
+ metadata?: Record<string, string>;
81
+ onProgress?: (p: UploadProgress) => void;
82
+ /** Force/relax multipart. `true` uses {@link MultipartOptions} defaults. */
83
+ multipart?: boolean | MultipartOptions;
84
+ }
85
+ interface UploadResult {
86
+ key: string;
87
+ size: number;
88
+ contentType: string;
89
+ etag?: string;
90
+ lastModified?: number;
91
+ /** Reserved for the versioning middleware / provider versioning. */
92
+ versionId?: string;
93
+ }
94
+ /** 0-based, `end` inclusive (matches the HTTP `Range` header). */
95
+ interface ByteRange {
96
+ start: number;
97
+ end?: number;
98
+ }
99
+ interface DownloadOptions extends OperationOptions {
100
+ /** Honored only when the driver advertises `supportsRange`. */
101
+ range?: ByteRange;
102
+ }
103
+ interface StoredFile {
104
+ key: string;
105
+ name: string;
106
+ size: number;
107
+ type: string;
108
+ lastModified?: number;
109
+ etag?: string;
110
+ metadata?: Record<string, string>;
111
+ arrayBuffer(): Promise<ArrayBuffer>;
112
+ text(): Promise<string>;
113
+ blob(): Promise<Blob>;
114
+ /** Web Streams only. */
115
+ stream(): ReadableStream<Uint8Array>;
116
+ }
117
+ interface ListOptions extends OperationOptions {
118
+ prefix?: string;
119
+ cursor?: string;
120
+ limit?: number;
121
+ /** S3-style folder folding. Honored only when the driver advertises `supportsDelimiter`. */
122
+ delimiter?: string;
123
+ }
124
+ interface ListResult {
125
+ items: StoredFile[];
126
+ /** Common prefixes when `delimiter` is set. */
127
+ prefixes?: string[];
128
+ /** Continuation cursor; absent when the listing is exhausted. */
129
+ cursor?: string;
130
+ }
131
+ interface DeleteManyOptions extends OperationOptions {
132
+ /** Concurrency for the fan-out fallback. Default 8. */
133
+ concurrency?: number;
134
+ /** Stop at the first error instead of collecting all. Default false. */
135
+ stopOnError?: boolean;
136
+ }
137
+ interface DeleteManyError {
138
+ key: string;
139
+ error: StorageError;
140
+ }
141
+ interface DeleteManyResult {
142
+ deleted: string[];
143
+ errors?: DeleteManyError[];
144
+ }
145
+ interface UrlOptions extends OperationOptions {
146
+ expiresIn?: number;
147
+ /** Forces the signing path (e.g. to set `Content-Disposition: attachment`). */
148
+ responseContentDisposition?: string;
149
+ }
150
+ interface SignUploadOptions extends OperationOptions {
151
+ expiresIn: number;
152
+ contentType?: string;
153
+ /** When set, drivers use a POST policy so the store enforces the size cap. */
154
+ maxSize?: number;
155
+ minSize?: number;
156
+ }
157
+ type SignedUpload = {
158
+ method: 'PUT';
159
+ url: string;
160
+ headers?: Record<string, string>;
161
+ } | {
162
+ method: 'POST';
163
+ url: string;
164
+ fields: Record<string, string>;
165
+ };
166
+ /** Advisory descriptor for what a driver's signing supports. */
167
+ interface SignedUrlCapability {
168
+ /** Can mint a presigned download URL via `url()`. */
169
+ supported: boolean;
170
+ /** Can mint a presigned upload via `signedUploadUrl()`. */
171
+ upload: boolean;
172
+ /** Provider ceiling on `expiresIn` (seconds), if any. */
173
+ maxExpiresIn?: number;
174
+ }
175
+ interface CreateMultipartOptions extends OperationOptions {
176
+ contentType?: string;
177
+ cacheControl?: string;
178
+ metadata?: Record<string, string>;
179
+ }
180
+ interface UploadedPart {
181
+ partNumber: number;
182
+ etag: string;
183
+ size?: number;
184
+ }
185
+ interface MultipartUpload {
186
+ readonly key: string;
187
+ readonly uploadId: string;
188
+ uploadPart(partNumber: number, body: PartBody, opts?: OperationOptions): Promise<UploadedPart>;
189
+ complete(parts: UploadedPart[], opts?: OperationOptions): Promise<UploadResult>;
190
+ abort(opts?: OperationOptions): Promise<void>;
191
+ /** Enables cross-request resume where the provider can list uploaded parts. */
192
+ listParts?(opts?: OperationOptions): Promise<UploadedPart[]>;
193
+ }
194
+ interface SignedMultipartCreate {
195
+ uploadId: string;
196
+ partSize: number;
197
+ }
198
+ interface SignedPart {
199
+ url: string;
200
+ headers?: Record<string, string>;
201
+ }
202
+ interface SignedMultipartCapability {
203
+ create(key: string, opts: {
204
+ contentType?: string;
205
+ metadata?: Record<string, string>;
206
+ partSize?: number;
207
+ }): Promise<SignedMultipartCreate>;
208
+ signPart(key: string, uploadId: string, partNumber: number, opts?: {
209
+ expiresIn?: number;
210
+ }): Promise<SignedPart>;
211
+ complete(key: string, uploadId: string, parts: UploadedPart[]): Promise<UploadResult>;
212
+ abort(key: string, uploadId: string): Promise<void>;
213
+ }
214
+ interface StorageDriver<Raw = unknown> {
215
+ readonly name: string;
216
+ readonly raw: Raw;
217
+ readonly reportsUploadProgress?: boolean;
218
+ readonly supportsRange?: boolean;
219
+ readonly supportsDelimiter?: boolean;
220
+ readonly supportsMetadata?: boolean;
221
+ readonly supportsCacheControl?: boolean;
222
+ readonly supportsServerSideCopy?: boolean;
223
+ readonly signedUrl?: SignedUrlCapability;
224
+ upload(key: string, body: Body, opts?: UploadOptions): Promise<UploadResult>;
225
+ download(key: string, opts?: DownloadOptions): Promise<StoredFile>;
226
+ head(key: string, opts?: OperationOptions): Promise<StoredFile>;
227
+ exists(key: string, opts?: OperationOptions): Promise<boolean>;
228
+ delete(key: string, opts?: OperationOptions): Promise<void>;
229
+ /** Optional native bulk delete; the facade fans out to `delete` otherwise. */
230
+ deleteMany?(keys: string[], opts?: DeleteManyOptions): Promise<DeleteManyResult>;
231
+ copy(from: string, to: string, opts?: OperationOptions): Promise<void>;
232
+ /** Optional native rename; the facade falls back to copy+delete otherwise. */
233
+ move?(from: string, to: string, opts?: OperationOptions): Promise<void>;
234
+ list(opts?: ListOptions): Promise<ListResult>;
235
+ url(key: string, opts?: UrlOptions): Promise<string>;
236
+ signedUploadUrl(key: string, opts: SignUploadOptions): Promise<SignedUpload>;
237
+ /** Server-side multipart. Presence == capability. */
238
+ createMultipartUpload?(key: string, opts?: CreateMultipartOptions): Promise<MultipartUpload>;
239
+ resumeMultipartUpload?(key: string, uploadId: string): MultipartUpload;
240
+ /** Browser-direct presigned multipart. Presence == capability. */
241
+ signedMultipart?: SignedMultipartCapability;
242
+ }
243
+ /** Queryable capability snapshot for callers that branch up-front. */
244
+ interface StorageCapabilities {
245
+ rangeRead: boolean;
246
+ uploadProgress: boolean;
247
+ delimiter: boolean;
248
+ metadata: boolean;
249
+ cacheControl: boolean;
250
+ serverSideCopy: boolean;
251
+ multipart: boolean;
252
+ signedMultipart: boolean;
253
+ signedUrl: SignedUrlCapability;
254
+ }
255
+ interface StorageHookEvent {
256
+ type: string;
257
+ key?: string;
258
+ status: 'success' | 'error';
259
+ durationMs: number;
260
+ error?: StorageError;
261
+ }
262
+ interface StorageHooks {
263
+ onOperation?: (e: StorageHookEvent) => void;
264
+ onError?: (e: {
265
+ type: string;
266
+ key?: string;
267
+ error: StorageError;
268
+ }) => void;
269
+ onRetry?: (e: {
270
+ type: string;
271
+ key?: string;
272
+ attempt: number;
273
+ maxRetries: number;
274
+ delayMs: number;
275
+ error: StorageError;
276
+ }) => void;
277
+ }
278
+ interface StorageOptions extends OperationOptions {
279
+ driver: StorageDriver;
280
+ /** Sub-scopes the keyspace within a bucket; normalized (no leading/trailing '/'). */
281
+ prefix?: string;
282
+ /** Reject all mutating operations. */
283
+ readonly?: boolean;
284
+ hooks?: StorageHooks;
285
+ }
286
+ //#endregion
287
+ export { UploadResult as A, StorageDriver as C, StoredFile as D, StorageOptions as E, StorageErrorOptions as F, isAbort as I, UrlOptions as M, StorageError as N, UploadOptions as O, StorageErrorCode as P, StorageCapabilities as S, StorageHooks as T, SignedMultipartCapability as _, DeleteManyOptions as a, SignedUpload as b, ListOptions as c, MultipartUpload as d, OperationOptions as f, SignUploadOptions as g, RetryOptions as h, DeleteManyError as i, UploadedPart as j, UploadProgress as k, ListResult as l, RetryBackoffContext as m, ByteRange as n, DeleteManyResult as o, PartBody as p, CreateMultipartOptions as r, DownloadOptions as s, Body as t, MultipartOptions as u, SignedMultipartCreate as v, StorageHookEvent as w, SignedUrlCapability as x, SignedPart as y };
288
+ //# sourceMappingURL=storage.types-BJN7Yp1J.d.ts.map
@@ -1,78 +1,79 @@
1
- import type { Body, StorageDriver } from '../storage.types';
1
+ import { C as StorageDriver, t as Body } from "../storage.types-BJN7Yp1J.js";
2
+ //#region src/storagesdk/index.d.ts
2
3
  /** Metadata for one storagesdk object (path-based). */
3
- export interface StorageSdkItemMeta {
4
- path: string;
5
- size: number;
6
- contentType: string;
7
- etag: string;
8
- lastModified: Date | number;
9
- metadata?: Record<string, string>;
4
+ interface StorageSdkItemMeta {
5
+ path: string;
6
+ size: number;
7
+ contentType: string;
8
+ etag: string;
9
+ lastModified: Date | number;
10
+ metadata?: Record<string, string>;
10
11
  }
11
12
  /** A storagesdk download result: metadata plus the buffered body. */
12
- export interface StorageSdkItem extends StorageSdkItemMeta {
13
- body: Uint8Array<ArrayBuffer>;
13
+ interface StorageSdkItem extends StorageSdkItemMeta {
14
+ body: Uint8Array<ArrayBuffer>;
14
15
  }
15
- export interface StorageSdkListResult {
16
- items: StorageSdkItemMeta[];
17
- cursor?: string;
18
- prefixes?: string[];
16
+ interface StorageSdkListResult {
17
+ items: StorageSdkItemMeta[];
18
+ cursor?: string;
19
+ prefixes?: string[];
19
20
  }
20
21
  /** The structural subset of a `@storagesdk/adapters` adapter we consume. */
21
- export interface StorageSdkAdapterLike<Raw = unknown> {
22
- readonly name?: string;
23
- readonly raw?: Raw;
24
- download(path: string, opts?: {
25
- signal?: AbortSignal;
26
- }): Promise<StorageSdkItem>;
27
- head(path: string, opts?: {
28
- signal?: AbortSignal;
29
- }): Promise<StorageSdkItemMeta>;
30
- list(opts?: {
31
- prefix?: string;
32
- cursor?: string;
33
- limit?: number;
34
- delimiter?: string;
35
- signal?: AbortSignal;
36
- }): Promise<StorageSdkListResult>;
37
- url(path: string, opts?: {
38
- expiresIn?: number;
39
- signal?: AbortSignal;
40
- }): Promise<string>;
41
- upload(path: string, body: Body, opts?: {
42
- contentType?: string;
43
- metadata?: Record<string, string>;
44
- signal?: AbortSignal;
45
- }): Promise<StorageSdkItemMeta | void>;
46
- delete(path: string, opts?: {
47
- signal?: AbortSignal;
48
- }): Promise<void>;
49
- copy(from: string, to: string, opts?: {
50
- signal?: AbortSignal;
51
- }): Promise<void>;
52
- move?(from: string, to: string, opts?: {
53
- signal?: AbortSignal;
54
- }): Promise<void>;
55
- exists?(path: string, opts?: {
56
- signal?: AbortSignal;
57
- }): Promise<boolean>;
58
- signedUploadUrl?(path: string, opts: {
59
- expiresIn: number;
60
- contentType?: string;
61
- }): Promise<{
62
- method: 'PUT';
63
- url: string;
64
- headers?: Record<string, string>;
65
- }>;
22
+ interface StorageSdkAdapterLike<Raw = unknown> {
23
+ readonly name?: string;
24
+ readonly raw?: Raw;
25
+ download(path: string, opts?: {
26
+ signal?: AbortSignal;
27
+ }): Promise<StorageSdkItem>;
28
+ head(path: string, opts?: {
29
+ signal?: AbortSignal;
30
+ }): Promise<StorageSdkItemMeta>;
31
+ list(opts?: {
32
+ prefix?: string;
33
+ cursor?: string;
34
+ limit?: number;
35
+ delimiter?: string;
36
+ signal?: AbortSignal;
37
+ }): Promise<StorageSdkListResult>;
38
+ url(path: string, opts?: {
39
+ expiresIn?: number;
40
+ signal?: AbortSignal;
41
+ }): Promise<string>;
42
+ upload(path: string, body: Body, opts?: {
43
+ contentType?: string;
44
+ metadata?: Record<string, string>;
45
+ signal?: AbortSignal;
46
+ }): Promise<StorageSdkItemMeta | void>;
47
+ delete(path: string, opts?: {
48
+ signal?: AbortSignal;
49
+ }): Promise<void>;
50
+ copy(from: string, to: string, opts?: {
51
+ signal?: AbortSignal;
52
+ }): Promise<void>;
53
+ move?(from: string, to: string, opts?: {
54
+ signal?: AbortSignal;
55
+ }): Promise<void>;
56
+ exists?(path: string, opts?: {
57
+ signal?: AbortSignal;
58
+ }): Promise<boolean>;
59
+ signedUploadUrl?(path: string, opts: {
60
+ expiresIn: number;
61
+ contentType?: string;
62
+ }): Promise<{
63
+ method: 'PUT';
64
+ url: string;
65
+ headers?: Record<string, string>;
66
+ }>;
66
67
  }
67
- export interface StorageSdkBridgeOptions {
68
- /** Advertise range support (only if your adapter honors `range`). Default false. */
69
- supportsRange?: boolean;
70
- /** Advertise delimiter/prefix support. Default false. */
71
- supportsDelimiter?: boolean;
72
- /** Advertise arbitrary metadata support. Default true. */
73
- supportsMetadata?: boolean;
74
- /** Advertise cache-control support. Default false. */
75
- supportsCacheControl?: boolean;
68
+ interface StorageSdkBridgeOptions {
69
+ /** Advertise range support (only if your adapter honors `range`). Default false. */
70
+ supportsRange?: boolean;
71
+ /** Advertise delimiter/prefix support. Default false. */
72
+ supportsDelimiter?: boolean;
73
+ /** Advertise arbitrary metadata support. Default true. */
74
+ supportsMetadata?: boolean;
75
+ /** Advertise cache-control support. Default false. */
76
+ supportsCacheControl?: boolean;
76
77
  }
77
78
  /**
78
79
  * Adapt a `@storagesdk/adapters` adapter to a {@link StorageDriver}.
@@ -82,4 +83,7 @@ export interface StorageSdkBridgeOptions {
82
83
  * so this is an explicit mapping. Multipart / presigned-multipart are not
83
84
  * exposed (the facade will gate them as `Unsupported`).
84
85
  */
85
- export declare function storageSdkDriver<Raw = unknown>(adapter: StorageSdkAdapterLike<Raw>, options?: StorageSdkBridgeOptions): StorageDriver<Raw>;
86
+ declare function storageSdkDriver<Raw = unknown>(adapter: StorageSdkAdapterLike<Raw>, options?: StorageSdkBridgeOptions): StorageDriver<Raw>;
87
+ //#endregion
88
+ export { StorageSdkAdapterLike, StorageSdkBridgeOptions, StorageSdkItem, StorageSdkItemMeta, StorageSdkListResult, storageSdkDriver };
89
+ //# sourceMappingURL=index.d.ts.map