@nestm/storage 0.1.0-alpha.6 → 0.1.0-alpha.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/README.md +182 -2
- package/SECURITY.md +40 -0
- package/dist/ai-sdk/ai-sdk-workspace-tools.d.ts +63 -0
- package/dist/ai-sdk/ai-sdk-workspace-tools.d.ts.map +1 -0
- package/dist/ai-sdk/ai-sdk-workspace-tools.js +383 -0
- package/dist/ai-sdk/ai-sdk-workspace-tools.js.map +1 -0
- package/dist/ai-sdk/index.d.ts +2 -0
- package/dist/ai-sdk/index.d.ts.map +1 -0
- package/dist/ai-sdk/index.js +2 -0
- package/dist/ai-sdk/index.js.map +1 -0
- package/dist/files-sdk/files-sdk.driver.d.ts +16 -2
- package/dist/files-sdk/files-sdk.driver.d.ts.map +1 -1
- package/dist/files-sdk/files-sdk.driver.js +159 -0
- package/dist/files-sdk/files-sdk.driver.js.map +1 -1
- package/dist/files-sdk/fs/index.d.ts +21 -2
- package/dist/files-sdk/fs/index.d.ts.map +1 -1
- package/dist/files-sdk/fs/index.js +600 -1
- package/dist/files-sdk/fs/index.js.map +1 -1
- package/dist/files-sdk/index.d.ts +1 -1
- package/dist/files-sdk/index.d.ts.map +1 -1
- package/dist/files-sdk/index.js.map +1 -1
- package/dist/files-sdk/provider/index.d.ts.map +1 -1
- package/dist/files-sdk/provider/index.js +7 -0
- package/dist/files-sdk/provider/index.js.map +1 -1
- package/dist/files-sdk/s3/index.d.ts +12 -3
- package/dist/files-sdk/s3/index.d.ts.map +1 -1
- package/dist/files-sdk/s3/index.js +203 -37
- package/dist/files-sdk/s3/index.js.map +1 -1
- package/dist/storage.client.d.ts +5 -1
- package/dist/storage.client.d.ts.map +1 -1
- package/dist/storage.client.js +49 -0
- package/dist/storage.client.js.map +1 -1
- package/dist/storage.driver.d.ts +3 -1
- package/dist/storage.driver.d.ts.map +1 -1
- package/dist/storage.driver.js.map +1 -1
- package/dist/storage.service.d.ts.map +1 -1
- package/dist/storage.service.js +28 -3
- package/dist/storage.service.js.map +1 -1
- package/dist/storage.types.d.ts +36 -0
- package/dist/storage.types.d.ts.map +1 -1
- package/dist/storage.types.js.map +1 -1
- package/dist/workspace/index.d.ts +4 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +4 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/storage-workspace.cursor.d.ts +6 -0
- package/dist/workspace/storage-workspace.cursor.d.ts.map +1 -0
- package/dist/workspace/storage-workspace.cursor.js +45 -0
- package/dist/workspace/storage-workspace.cursor.js.map +1 -0
- package/dist/workspace/storage-workspace.d.ts +6 -0
- package/dist/workspace/storage-workspace.d.ts.map +1 -0
- package/dist/workspace/storage-workspace.error.d.ts +28 -0
- package/dist/workspace/storage-workspace.error.d.ts.map +1 -0
- package/dist/workspace/storage-workspace.error.js +67 -0
- package/dist/workspace/storage-workspace.error.js.map +1 -0
- package/dist/workspace/storage-workspace.js +747 -0
- package/dist/workspace/storage-workspace.js.map +1 -0
- package/dist/workspace/storage-workspace.path.d.ts +9 -0
- package/dist/workspace/storage-workspace.path.d.ts.map +1 -0
- package/dist/workspace/storage-workspace.path.js +68 -0
- package/dist/workspace/storage-workspace.path.js.map +1 -0
- package/dist/workspace/storage-workspace.types.d.ts +97 -0
- package/dist/workspace/storage-workspace.types.d.ts.map +1 -0
- package/dist/workspace/storage-workspace.types.js +20 -0
- package/dist/workspace/storage-workspace.types.js.map +1 -0
- package/package.json +23 -4
|
@@ -20,6 +20,27 @@ function conditionalCopyAdapterOf(adapter) {
|
|
|
20
20
|
}
|
|
21
21
|
return candidate;
|
|
22
22
|
}
|
|
23
|
+
function conditionalMutationAdapterOf(adapter) {
|
|
24
|
+
if (typeof adapter !== 'object' ||
|
|
25
|
+
adapter === null ||
|
|
26
|
+
!('conditionalMutation' in adapter) ||
|
|
27
|
+
!('uploadConditional' in adapter) ||
|
|
28
|
+
!('deleteConditional' in adapter)) {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
const candidate = adapter;
|
|
32
|
+
const capability = candidate.conditionalMutation;
|
|
33
|
+
if (capability === undefined ||
|
|
34
|
+
typeof capability.create !== 'boolean' ||
|
|
35
|
+
typeof capability.replace !== 'boolean' ||
|
|
36
|
+
typeof capability.delete !== 'boolean' ||
|
|
37
|
+
typeof capability.etag !== 'boolean' ||
|
|
38
|
+
typeof candidate.uploadConditional !== 'function' ||
|
|
39
|
+
typeof candidate.deleteConditional !== 'function') {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
return candidate;
|
|
43
|
+
}
|
|
23
44
|
function signedUploadPolicyAdapterOf(adapter) {
|
|
24
45
|
if (typeof adapter !== 'object' ||
|
|
25
46
|
adapter === null ||
|
|
@@ -157,6 +178,32 @@ function mapRetryOptions(retries) {
|
|
|
157
178
|
}),
|
|
158
179
|
};
|
|
159
180
|
}
|
|
181
|
+
function storageRetryOptions(retries) {
|
|
182
|
+
if (retries === undefined || typeof retries === 'number') {
|
|
183
|
+
return retries;
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
max: retries.max,
|
|
187
|
+
...(retries.backoff !== undefined && {
|
|
188
|
+
backoff: ({ attempt, error }) => retries.backoff?.({
|
|
189
|
+
attempt,
|
|
190
|
+
error: new FilesError(error.code === StorageErrorCode.NOT_FOUND
|
|
191
|
+
? 'NotFound'
|
|
192
|
+
: error.code === StorageErrorCode.UNAUTHORIZED
|
|
193
|
+
? 'Unauthorized'
|
|
194
|
+
: error.code === StorageErrorCode.CONFLICT
|
|
195
|
+
? 'Conflict'
|
|
196
|
+
: error.code === StorageErrorCode.READ_ONLY
|
|
197
|
+
? 'ReadOnly'
|
|
198
|
+
: 'Provider', error.message, error, {
|
|
199
|
+
aborted: error.aborted,
|
|
200
|
+
permanent: error.permanent,
|
|
201
|
+
timedOut: error.timedOut,
|
|
202
|
+
}),
|
|
203
|
+
}) ?? 0,
|
|
204
|
+
}),
|
|
205
|
+
};
|
|
206
|
+
}
|
|
160
207
|
function operationOptions(options) {
|
|
161
208
|
if (options === undefined) {
|
|
162
209
|
return undefined;
|
|
@@ -349,12 +396,24 @@ export class FilesSdkStorageDriver {
|
|
|
349
396
|
#files;
|
|
350
397
|
#name;
|
|
351
398
|
#conditionalCopy;
|
|
399
|
+
#conditionalMutation;
|
|
400
|
+
#prefix;
|
|
401
|
+
#readOnly;
|
|
402
|
+
#retries;
|
|
403
|
+
#signal;
|
|
404
|
+
#timeout;
|
|
352
405
|
#signedUploadPolicy;
|
|
353
406
|
#signedDownloadPolicy;
|
|
354
407
|
constructor(options) {
|
|
355
408
|
this.#files = new Files(options);
|
|
356
409
|
this.#name = options.adapter.name;
|
|
357
410
|
this.#conditionalCopy = conditionalCopyAdapterOf(options.adapter);
|
|
411
|
+
this.#conditionalMutation = conditionalMutationAdapterOf(options.adapter);
|
|
412
|
+
this.#prefix = this.#files.prefix;
|
|
413
|
+
this.#readOnly = options.readonly === true;
|
|
414
|
+
this.#retries = storageRetryOptions(options.retries);
|
|
415
|
+
this.#signal = options.signal;
|
|
416
|
+
this.#timeout = options.timeout;
|
|
358
417
|
this.#signedUploadPolicy = signedUploadPolicyAdapterOf(options.adapter);
|
|
359
418
|
this.#signedDownloadPolicy = signedDownloadPolicyAdapterOf(options.adapter);
|
|
360
419
|
}
|
|
@@ -373,6 +432,12 @@ export class FilesSdkStorageDriver {
|
|
|
373
432
|
...(this.#conditionalCopy !== undefined && {
|
|
374
433
|
conditionalCopy: { ...this.#conditionalCopy.conditionalCopy },
|
|
375
434
|
}),
|
|
435
|
+
...(this.#conditionalMutation !== undefined &&
|
|
436
|
+
!this.#readOnly && {
|
|
437
|
+
conditionalMutation: {
|
|
438
|
+
...this.#conditionalMutation.conditionalMutation,
|
|
439
|
+
},
|
|
440
|
+
}),
|
|
376
441
|
signedDownload: { ...capabilities.signedUrl },
|
|
377
442
|
...(this.#signedDownloadPolicy !== undefined && {
|
|
378
443
|
signedDownloadPolicy: {
|
|
@@ -389,6 +454,39 @@ export class FilesSdkStorageDriver {
|
|
|
389
454
|
async upload(key, body, options) {
|
|
390
455
|
return this.#call(async () => uploadResultOf(await this.#files.upload(key, mapBody(body), uploadOptions(options))));
|
|
391
456
|
}
|
|
457
|
+
uploadConditional(key, body, options) {
|
|
458
|
+
if (this.#readOnly) {
|
|
459
|
+
return Promise.reject(new StorageError(`Cannot call uploadConditional() on a read-only storage adapter.`, {
|
|
460
|
+
code: StorageErrorCode.READ_ONLY,
|
|
461
|
+
key,
|
|
462
|
+
operation: 'upload',
|
|
463
|
+
permanent: true,
|
|
464
|
+
}));
|
|
465
|
+
}
|
|
466
|
+
const adapter = this.#conditionalMutation;
|
|
467
|
+
if (adapter === undefined) {
|
|
468
|
+
return Promise.reject(new StorageError(`Storage adapter "${this.#name}" does not support conditional upload.`, {
|
|
469
|
+
code: StorageErrorCode.NOT_SUPPORTED,
|
|
470
|
+
key,
|
|
471
|
+
operation: 'upload',
|
|
472
|
+
permanent: true,
|
|
473
|
+
}));
|
|
474
|
+
}
|
|
475
|
+
const mergedOptions = this.#conditionalOptions(options);
|
|
476
|
+
return this.#call(async () => {
|
|
477
|
+
const physicalKey = this.#path(key);
|
|
478
|
+
const result = await adapter.uploadConditional(physicalKey, mapBody(body), mergedOptions);
|
|
479
|
+
if (result.key !== physicalKey) {
|
|
480
|
+
throw new StorageError('Storage adapter returned an unexpected conditional upload key.', {
|
|
481
|
+
code: StorageErrorCode.PROVIDER,
|
|
482
|
+
key,
|
|
483
|
+
operation: 'upload',
|
|
484
|
+
permanent: true,
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
return { ...result, key };
|
|
488
|
+
});
|
|
489
|
+
}
|
|
392
490
|
async download(key, options) {
|
|
393
491
|
return this.#call(async () => {
|
|
394
492
|
const file = await this.#files.download(key, downloadOptions(options));
|
|
@@ -409,6 +507,27 @@ export class FilesSdkStorageDriver {
|
|
|
409
507
|
await this.#files.delete(key, operationOptions(options));
|
|
410
508
|
});
|
|
411
509
|
}
|
|
510
|
+
deleteConditional(key, options) {
|
|
511
|
+
if (this.#readOnly) {
|
|
512
|
+
return Promise.reject(new StorageError(`Cannot call deleteConditional() on a read-only storage adapter.`, {
|
|
513
|
+
code: StorageErrorCode.READ_ONLY,
|
|
514
|
+
key,
|
|
515
|
+
operation: 'delete',
|
|
516
|
+
permanent: true,
|
|
517
|
+
}));
|
|
518
|
+
}
|
|
519
|
+
const adapter = this.#conditionalMutation;
|
|
520
|
+
if (adapter === undefined) {
|
|
521
|
+
return Promise.reject(new StorageError(`Storage adapter "${this.#name}" does not support conditional delete.`, {
|
|
522
|
+
code: StorageErrorCode.NOT_SUPPORTED,
|
|
523
|
+
key,
|
|
524
|
+
operation: 'delete',
|
|
525
|
+
permanent: true,
|
|
526
|
+
}));
|
|
527
|
+
}
|
|
528
|
+
const mergedOptions = this.#conditionalOptions(options);
|
|
529
|
+
return this.#call(() => adapter.deleteConditional(this.#path(key), mergedOptions));
|
|
530
|
+
}
|
|
412
531
|
copy(sourceKey, destinationKey, options) {
|
|
413
532
|
return this.#call(() => this.#files.copy(sourceKey, destinationKey, operationOptions(options)));
|
|
414
533
|
}
|
|
@@ -466,6 +585,46 @@ export class FilesSdkStorageDriver {
|
|
|
466
585
|
throw mapFilesSdkError(error);
|
|
467
586
|
}
|
|
468
587
|
}
|
|
588
|
+
#path(key) {
|
|
589
|
+
if (typeof key !== 'string' || key.length === 0) {
|
|
590
|
+
throw new StorageError('key must be a non-empty string.', {
|
|
591
|
+
code: StorageErrorCode.INVALID_ARGUMENT,
|
|
592
|
+
permanent: true,
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
if (key.includes('\0')) {
|
|
596
|
+
throw new StorageError('key must not contain null bytes.', {
|
|
597
|
+
code: StorageErrorCode.INVALID_ARGUMENT,
|
|
598
|
+
key,
|
|
599
|
+
permanent: true,
|
|
600
|
+
});
|
|
601
|
+
}
|
|
602
|
+
if (this.#prefix.length === 0) {
|
|
603
|
+
return key;
|
|
604
|
+
}
|
|
605
|
+
const normalized = key.replace(/^\/+/u, '');
|
|
606
|
+
if (normalized
|
|
607
|
+
.split('/')
|
|
608
|
+
.some((segment) => segment === '.' || segment === '..')) {
|
|
609
|
+
throw new StorageError('key must not contain . or .. path segments.', {
|
|
610
|
+
code: StorageErrorCode.INVALID_ARGUMENT,
|
|
611
|
+
key,
|
|
612
|
+
permanent: true,
|
|
613
|
+
});
|
|
614
|
+
}
|
|
615
|
+
return `${this.#prefix}/${normalized}`;
|
|
616
|
+
}
|
|
617
|
+
#conditionalOptions(options) {
|
|
618
|
+
return {
|
|
619
|
+
...options,
|
|
620
|
+
...(options.retries === undefined &&
|
|
621
|
+
this.#retries !== undefined && { retries: this.#retries }),
|
|
622
|
+
...(options.signal === undefined &&
|
|
623
|
+
this.#signal !== undefined && { signal: this.#signal }),
|
|
624
|
+
...(options.timeout === undefined &&
|
|
625
|
+
this.#timeout !== undefined && { timeout: this.#timeout }),
|
|
626
|
+
};
|
|
627
|
+
}
|
|
469
628
|
}
|
|
470
629
|
export function createFilesSdkDriver(options) {
|
|
471
630
|
return new FilesSdkStorageDriver(options);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files-sdk.driver.js","sourceRoot":"","sources":["../../src/files-sdk/files-sdk.driver.ts"],"names":[],"mappings":"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","sourcesContent":["import { Readable } from 'node:stream';\n\nimport {\n Files,\n FilesError,\n type Adapter,\n type Body,\n type DownloadOptions,\n type FilesOptions,\n type ListOptions,\n type OperationOptions,\n type RetryOptions,\n type SearchOptions,\n type SignUploadOptions,\n type StoredFile,\n type UploadOptions,\n type UploadResult,\n type UrlOptions,\n} from 'files-sdk';\n\nimport {\n StorageError,\n StorageErrorCode,\n isStorageError,\n} from '../storage.error.js';\nimport type { StorageDriver } from '../storage.driver.js';\nimport type {\n StorageBody,\n StorageDownloadOptions,\n StorageListOptions,\n StorageListResult,\n StorageObject,\n StorageObjectMetadata,\n StorageOperationOptions,\n StorageConditionalCopyCapability,\n StoragePromotionOptions,\n StorageRetryOptions,\n StorageSearchOptions,\n StorageSignedUploadPolicyCapability,\n StorageSignedDownloadPolicyCapability,\n StorageSignedDownloadOptions,\n StorageSignedUpload,\n StorageSignedUploadOptions,\n StorageUploadOptions,\n StorageUploadResult,\n} from '../storage.types.js';\nimport { getFilesSdkUploadControl } from '../storage-upload-control.js';\n\nexport type FilesSdkDriverOptions<AdapterType extends Adapter> =\n FilesOptions<AdapterType>;\n\n/**\n * Optional adapter extension for providers that can conditionally copy an\n * immutable source identity. Plain files-sdk adapters remain fully supported.\n */\nexport interface FilesSdkConditionalCopyAdapter {\n readonly conditionalCopy: StorageConditionalCopyCapability;\n promote(\n sourceKey: string,\n destinationKey: string,\n options: StoragePromotionOptions,\n ): Promise<void>;\n}\n\nexport interface FilesSdkSignedUploadPolicyAdapter {\n readonly signedUploadPolicy: StorageSignedUploadPolicyCapability;\n}\n\nexport interface FilesSdkSignedDownloadPolicyAdapter {\n readonly signedDownloadPolicy: StorageSignedDownloadPolicyCapability;\n}\n\nfunction conditionalCopyAdapterOf(\n adapter: Adapter,\n): FilesSdkConditionalCopyAdapter | undefined {\n if (\n typeof adapter !== 'object' ||\n adapter === null ||\n !('conditionalCopy' in adapter) ||\n !('promote' in adapter)\n ) {\n return undefined;\n }\n const candidate = adapter as Adapter &\n Partial<FilesSdkConditionalCopyAdapter>;\n const capability = candidate.conditionalCopy;\n if (\n capability === undefined ||\n typeof capability.supported !== 'boolean' ||\n typeof capability.etag !== 'boolean' ||\n typeof capability.version !== 'boolean' ||\n typeof candidate.promote !== 'function'\n ) {\n return undefined;\n }\n return candidate as Adapter & FilesSdkConditionalCopyAdapter;\n}\n\nfunction signedUploadPolicyAdapterOf(\n adapter: Adapter,\n): FilesSdkSignedUploadPolicyAdapter | undefined {\n if (\n typeof adapter !== 'object' ||\n adapter === null ||\n !('signedUploadPolicy' in adapter)\n ) {\n return undefined;\n }\n const candidate = adapter as Adapter &\n Partial<FilesSdkSignedUploadPolicyAdapter>;\n const capability = candidate.signedUploadPolicy;\n if (\n capability === undefined ||\n typeof capability.contentType !== 'boolean' ||\n typeof capability.sizeRange !== 'boolean'\n ) {\n return undefined;\n }\n return candidate as Adapter & FilesSdkSignedUploadPolicyAdapter;\n}\n\nfunction signedDownloadPolicyAdapterOf(\n adapter: Adapter,\n): FilesSdkSignedDownloadPolicyAdapter | undefined {\n if (\n typeof adapter !== 'object' ||\n adapter === null ||\n !('signedDownloadPolicy' in adapter)\n ) {\n return undefined;\n }\n const candidate = adapter as Adapter &\n Partial<FilesSdkSignedDownloadPolicyAdapter>;\n const capability = candidate.signedDownloadPolicy;\n if (capability === undefined || typeof capability.expiresIn !== 'boolean') {\n return undefined;\n }\n return candidate as Adapter & FilesSdkSignedDownloadPolicyAdapter;\n}\n\ninterface FilesErrorLike {\n readonly name: string;\n readonly message: string;\n readonly code: FilesError['code'];\n readonly aborted: boolean;\n readonly timedOut: boolean;\n readonly permanent: boolean;\n readonly cause?: unknown;\n}\n\nfunction isFilesErrorCode(value: unknown): value is FilesError['code'] {\n return (\n value === 'NotFound' ||\n value === 'Unauthorized' ||\n value === 'Conflict' ||\n value === 'ReadOnly' ||\n value === 'Provider'\n );\n}\n\nfunction isFilesErrorLike(error: unknown): error is FilesErrorLike {\n if (error instanceof FilesError) {\n return true;\n }\n if (!(error instanceof Error)) {\n return false;\n }\n\n try {\n return (\n error.name === 'FilesError' &&\n typeof error.message === 'string' &&\n 'code' in error &&\n isFilesErrorCode(error.code) &&\n 'aborted' in error &&\n typeof error.aborted === 'boolean' &&\n 'timedOut' in error &&\n typeof error.timedOut === 'boolean' &&\n 'permanent' in error &&\n typeof error.permanent === 'boolean'\n );\n } catch {\n return false;\n }\n}\n\nfunction unwrapFilesError(error: FilesErrorLike): FilesErrorLike {\n const seen = new Set<FilesErrorLike>();\n let current = error;\n\n while (\n current.code === 'Provider' &&\n !current.aborted &&\n !current.timedOut &&\n !current.permanent &&\n isFilesErrorLike(current.cause) &&\n current.message === current.cause.message &&\n !seen.has(current.cause)\n ) {\n seen.add(current);\n current = current.cause;\n }\n\n return current;\n}\n\nexport function mapFilesSdkError(error: unknown): StorageError {\n if (isStorageError(error)) {\n return error;\n }\n if (!isFilesErrorLike(error)) {\n return new StorageError(\n error instanceof Error ? error.message : String(error),\n {\n cause: error,\n code: StorageErrorCode.PROVIDER,\n },\n );\n }\n\n const filesError = unwrapFilesError(error);\n\n if (isStorageError(filesError.cause)) {\n return filesError.cause;\n }\n\n let code: StorageErrorCode;\n if (filesError.timedOut) {\n code = StorageErrorCode.TIMEOUT;\n } else if (filesError.aborted) {\n code = StorageErrorCode.ABORTED;\n } else {\n switch (filesError.code) {\n case 'NotFound':\n code = StorageErrorCode.NOT_FOUND;\n break;\n case 'Unauthorized':\n code = StorageErrorCode.UNAUTHORIZED;\n break;\n case 'Conflict':\n code = StorageErrorCode.CONFLICT;\n break;\n case 'ReadOnly':\n code = StorageErrorCode.READ_ONLY;\n break;\n case 'Provider':\n code = /(?:not supported|does not support|unsupported)/iu.test(\n filesError.message,\n )\n ? StorageErrorCode.NOT_SUPPORTED\n : StorageErrorCode.PROVIDER;\n break;\n }\n }\n\n return new StorageError(filesError.message, {\n aborted: filesError.aborted,\n cause: filesError.cause ?? error,\n code,\n permanent: filesError.permanent,\n timedOut: filesError.timedOut,\n });\n}\n\nfunction mapRetryOptions(\n retries: StorageRetryOptions | undefined,\n): RetryOptions | undefined {\n if (retries === undefined || typeof retries === 'number') {\n return retries;\n }\n\n return {\n max: retries.max,\n ...(retries.backoff !== undefined && {\n backoff: ({ attempt, error }) =>\n retries.backoff?.({\n attempt,\n error: mapFilesSdkError(error),\n }) ?? 0,\n }),\n };\n}\n\nfunction operationOptions(\n options?: StorageOperationOptions,\n): OperationOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n\n const retries = mapRetryOptions(options.retries);\n return {\n ...(retries !== undefined && { retries }),\n ...(options.signal !== undefined && { signal: options.signal }),\n ...(options.timeout !== undefined && { timeout: options.timeout }),\n };\n}\n\nasync function* normalizeNodeChunks(\n source: Readable,\n): AsyncGenerator<Uint8Array> {\n for await (const chunk of source) {\n if (typeof chunk === 'string') {\n yield new TextEncoder().encode(chunk);\n continue;\n }\n if (chunk instanceof Uint8Array) {\n yield chunk;\n continue;\n }\n throw new StorageError(\n 'Node upload streams must yield strings or Uint8Array chunks.',\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n },\n );\n }\n}\n\nfunction mapBody(body: StorageBody): Body {\n if (body instanceof Readable) {\n return Readable.toWeb(\n Readable.from(normalizeNodeChunks(body)),\n ) as ReadableStream<Uint8Array>;\n }\n return body;\n}\n\nfunction normalizeDownloadStream(\n source: ReadableStream<Uint8Array>,\n): ReadableStream<Uint8Array> {\n let reader: ReadableStreamDefaultReader<Uint8Array> | undefined =\n source.getReader();\n\n const release = (): void => {\n reader?.releaseLock();\n reader = undefined;\n };\n\n return new ReadableStream<Uint8Array>({\n async cancel(reason) {\n const activeReader = reader;\n if (activeReader === undefined) {\n return;\n }\n try {\n await activeReader.cancel(reason);\n } catch (error) {\n throw mapFilesSdkError(error);\n } finally {\n release();\n }\n },\n async pull(controller) {\n const activeReader = reader;\n if (activeReader === undefined) {\n controller.close();\n return;\n }\n try {\n const result = await activeReader.read();\n if (result.done) {\n release();\n controller.close();\n return;\n }\n controller.enqueue(result.value);\n } catch (error) {\n release();\n controller.error(mapFilesSdkError(error));\n }\n },\n });\n}\n\nfunction uploadOptions(\n options?: StorageUploadOptions,\n): UploadOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return {\n ...operationOptions(options),\n ...(options.cacheControl !== undefined && {\n cacheControl: options.cacheControl,\n }),\n ...(options.contentType !== undefined && {\n contentType: options.contentType,\n }),\n ...(options.control !== undefined && {\n control: getFilesSdkUploadControl(options.control),\n }),\n ...(options.metadata !== undefined && { metadata: options.metadata }),\n ...(options.multipart !== undefined && {\n multipart: options.multipart,\n }),\n ...(options.onProgress !== undefined && {\n onProgress: options.onProgress,\n }),\n };\n}\n\nfunction downloadOptions(options?: StorageDownloadOptions): DownloadOptions {\n return {\n ...operationOptions(options),\n as: 'stream',\n ...(options?.range !== undefined && { range: options.range }),\n };\n}\n\nfunction listOptions(options?: StorageListOptions): ListOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return {\n ...operationOptions(options),\n ...(options.cursor !== undefined && { cursor: options.cursor }),\n ...(options.delimiter !== undefined && { delimiter: options.delimiter }),\n ...(options.limit !== undefined && { limit: options.limit }),\n ...(options.prefix !== undefined && { prefix: options.prefix }),\n };\n}\n\nfunction searchOptions(\n options?: StorageSearchOptions,\n): SearchOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return {\n ...operationOptions(options),\n ...(options.caseInsensitive !== undefined && {\n caseInsensitive: options.caseInsensitive,\n }),\n ...(options.limit !== undefined && { limit: options.limit }),\n ...(options.match !== undefined && { match: options.match }),\n ...(options.maxResults !== undefined && {\n maxResults: options.maxResults,\n }),\n ...(options.prefix !== undefined && { prefix: options.prefix }),\n };\n}\n\nfunction signedDownloadOptions(\n options?: StorageSignedDownloadOptions,\n): UrlOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return {\n ...operationOptions(options),\n ...(options.expiresIn !== undefined && {\n expiresIn: options.expiresIn,\n }),\n ...(options.responseContentDisposition !== undefined && {\n responseContentDisposition: options.responseContentDisposition,\n }),\n };\n}\n\nfunction signedUploadOptions(\n options: StorageSignedUploadOptions,\n): SignUploadOptions {\n return {\n ...operationOptions(options),\n expiresIn: options.expiresIn,\n ...(options.contentType !== undefined && {\n contentType: options.contentType,\n }),\n ...(options.maxSize !== undefined && { maxSize: options.maxSize }),\n ...(options.minSize !== undefined && { minSize: options.minSize }),\n };\n}\n\nfunction metadataOf(file: StoredFile): StorageObjectMetadata {\n return {\n contentType: file.type,\n ...(file.etag !== undefined && { etag: file.etag }),\n key: file.key,\n ...(file.lastModified !== undefined && {\n lastModified: new Date(file.lastModified),\n }),\n ...(file.metadata !== undefined && {\n metadata: { ...file.metadata },\n }),\n name: file.name,\n size: file.size,\n };\n}\n\nfunction uploadResultOf(result: UploadResult): StorageUploadResult {\n return {\n contentType: result.contentType,\n ...(result.etag !== undefined && { etag: result.etag }),\n key: result.key,\n ...(result.lastModified !== undefined && {\n lastModified: new Date(result.lastModified),\n }),\n size: result.size,\n };\n}\n\nexport class FilesSdkStorageDriver<\n AdapterType extends Adapter = Adapter,\n> implements StorageDriver {\n readonly #files: Files<AdapterType>;\n readonly #name: string;\n readonly #conditionalCopy: FilesSdkConditionalCopyAdapter | undefined;\n readonly #signedUploadPolicy: FilesSdkSignedUploadPolicyAdapter | undefined;\n readonly #signedDownloadPolicy:\n FilesSdkSignedDownloadPolicyAdapter | undefined;\n\n constructor(options: FilesSdkDriverOptions<AdapterType>) {\n this.#files = new Files(options);\n this.#name = options.adapter.name;\n this.#conditionalCopy = conditionalCopyAdapterOf(options.adapter);\n this.#signedUploadPolicy = signedUploadPolicyAdapterOf(options.adapter);\n this.#signedDownloadPolicy = signedDownloadPolicyAdapterOf(options.adapter);\n }\n\n get name(): string {\n return this.#name;\n }\n\n get capabilities() {\n const capabilities = this.#files.capabilities;\n return {\n cacheControl: capabilities.cacheControl,\n delimiter: capabilities.delimiter,\n metadata: capabilities.metadata,\n rangeRead: capabilities.rangeRead,\n resumableUpload: capabilities.multipart,\n serverSideCopy: capabilities.serverSideCopy,\n ...(this.#conditionalCopy !== undefined && {\n conditionalCopy: { ...this.#conditionalCopy.conditionalCopy },\n }),\n signedDownload: { ...capabilities.signedUrl },\n ...(this.#signedDownloadPolicy !== undefined && {\n signedDownloadPolicy: {\n ...this.#signedDownloadPolicy.signedDownloadPolicy,\n },\n }),\n signedUpload: 'runtime' as const,\n ...(this.#signedUploadPolicy !== undefined && {\n signedUploadPolicy: { ...this.#signedUploadPolicy.signedUploadPolicy },\n }),\n nativeUploadProgress: capabilities.uploadProgress,\n };\n }\n\n async upload(\n key: string,\n body: StorageBody,\n options?: StorageUploadOptions,\n ): Promise<StorageUploadResult> {\n return this.#call(async () =>\n uploadResultOf(\n await this.#files.upload(key, mapBody(body), uploadOptions(options)),\n ),\n );\n }\n\n async download(\n key: string,\n options?: StorageDownloadOptions,\n ): Promise<StorageObject> {\n return this.#call(async () => {\n const file = await this.#files.download(key, downloadOptions(options));\n return {\n ...metadataOf(file),\n body: normalizeDownloadStream(file.stream()),\n };\n });\n }\n\n async head(\n key: string,\n options?: StorageOperationOptions,\n ): Promise<StorageObjectMetadata> {\n return this.#call(async () =>\n metadataOf(await this.#files.head(key, operationOptions(options))),\n );\n }\n\n exists(key: string, options?: StorageOperationOptions): Promise<boolean> {\n return this.#call(() => this.#files.exists(key, operationOptions(options)));\n }\n\n delete(key: string, options?: StorageOperationOptions): Promise<void> {\n return this.#call(async () => {\n await this.#files.delete(key, operationOptions(options));\n });\n }\n\n copy(\n sourceKey: string,\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void> {\n return this.#call(() =>\n this.#files.copy(sourceKey, destinationKey, operationOptions(options)),\n );\n }\n\n move(\n sourceKey: string,\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void> {\n return this.#call(() =>\n this.#files.move(sourceKey, destinationKey, operationOptions(options)),\n );\n }\n\n promote(\n sourceKey: string,\n destinationKey: string,\n options: StoragePromotionOptions,\n ): Promise<void> {\n const adapter = this.#conditionalCopy;\n if (adapter === undefined || !adapter.conditionalCopy.supported) {\n return Promise.reject(\n new StorageError(\n `Storage adapter \"${this.#name}\" does not support conditional promotion.`,\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n key: sourceKey,\n operation: 'promote',\n permanent: true,\n },\n ),\n );\n }\n return this.#call(() =>\n adapter.promote(sourceKey, destinationKey, options),\n );\n }\n\n async list(options?: StorageListOptions): Promise<StorageListResult> {\n return this.#call(async () => {\n const result = await this.#files.list(listOptions(options));\n return {\n items: result.items.map(metadataOf),\n ...(result.cursor !== undefined && { cursor: result.cursor }),\n ...(result.prefixes !== undefined && {\n prefixes: [...result.prefixes],\n }),\n };\n });\n }\n\n search(\n pattern: string | RegExp,\n options?: StorageSearchOptions,\n ): AsyncIterable<StorageObjectMetadata> {\n return this.#search(pattern, options);\n }\n\n async *#search(\n pattern: string | RegExp,\n options?: StorageSearchOptions,\n ): AsyncGenerator<StorageObjectMetadata, void> {\n try {\n for await (const file of this.#files.search(\n pattern,\n searchOptions(options),\n )) {\n yield metadataOf(file);\n }\n } catch (error) {\n throw mapFilesSdkError(error);\n }\n }\n\n signDownload(\n key: string,\n options?: StorageSignedDownloadOptions,\n ): Promise<string> {\n return this.#call(() =>\n this.#files.url(key, signedDownloadOptions(options)),\n );\n }\n\n signUpload(\n key: string,\n options: StorageSignedUploadOptions,\n ): Promise<StorageSignedUpload> {\n return this.#call(() =>\n this.#files.signedUploadUrl(key, signedUploadOptions(options)),\n );\n }\n\n async #call<Result>(operation: () => Promise<Result>): Promise<Result> {\n try {\n return await operation();\n } catch (error) {\n throw mapFilesSdkError(error);\n }\n }\n}\n\nexport function createFilesSdkDriver<AdapterType extends Adapter>(\n options: FilesSdkDriverOptions<AdapterType>,\n): FilesSdkStorageDriver<AdapterType> {\n return new FilesSdkStorageDriver(options);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"files-sdk.driver.js","sourceRoot":"","sources":["../../src/files-sdk/files-sdk.driver.ts"],"names":[],"mappings":"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","sourcesContent":["import { Readable } from 'node:stream';\n\nimport {\n Files,\n FilesError,\n type Adapter,\n type Body,\n type DownloadOptions,\n type FilesOptions,\n type ListOptions,\n type OperationOptions,\n type RetryOptions,\n type SearchOptions,\n type SignUploadOptions,\n type StoredFile,\n type UploadOptions,\n type UploadResult,\n type UrlOptions,\n} from 'files-sdk';\n\nimport {\n StorageError,\n StorageErrorCode,\n isStorageError,\n} from '../storage.error.js';\nimport type { StorageDriver } from '../storage.driver.js';\nimport type {\n StorageBody,\n StorageConditionalDeleteOptions,\n StorageConditionalMutationCapability,\n StorageConditionalUploadOptions,\n StorageDownloadOptions,\n StorageListOptions,\n StorageListResult,\n StorageObject,\n StorageObjectMetadata,\n StorageOperationOptions,\n StorageConditionalCopyCapability,\n StoragePromotionOptions,\n StorageRetryOptions,\n StorageSearchOptions,\n StorageSignedUploadPolicyCapability,\n StorageSignedDownloadPolicyCapability,\n StorageSignedDownloadOptions,\n StorageSignedUpload,\n StorageSignedUploadOptions,\n StorageUploadOptions,\n StorageUploadResult,\n} from '../storage.types.js';\nimport { getFilesSdkUploadControl } from '../storage-upload-control.js';\n\nexport type FilesSdkDriverOptions<AdapterType extends Adapter> =\n FilesOptions<AdapterType>;\n\n/**\n * Optional adapter extension for providers that can conditionally copy an\n * immutable source identity. Plain files-sdk adapters remain fully supported.\n */\nexport interface FilesSdkConditionalCopyAdapter {\n readonly conditionalCopy: StorageConditionalCopyCapability;\n promote(\n sourceKey: string,\n destinationKey: string,\n options: StoragePromotionOptions,\n ): Promise<void>;\n}\n\n/** Optional adapter extension for native compare-and-set mutations. */\nexport interface FilesSdkConditionalMutationAdapter {\n readonly conditionalMutation: StorageConditionalMutationCapability;\n uploadConditional(\n key: string,\n body: Body,\n options: StorageConditionalUploadOptions,\n ): Promise<StorageUploadResult>;\n deleteConditional(\n key: string,\n options: StorageConditionalDeleteOptions,\n ): Promise<void>;\n}\n\nexport interface FilesSdkSignedUploadPolicyAdapter {\n readonly signedUploadPolicy: StorageSignedUploadPolicyCapability;\n}\n\nexport interface FilesSdkSignedDownloadPolicyAdapter {\n readonly signedDownloadPolicy: StorageSignedDownloadPolicyCapability;\n}\n\nfunction conditionalCopyAdapterOf(\n adapter: Adapter,\n): FilesSdkConditionalCopyAdapter | undefined {\n if (\n typeof adapter !== 'object' ||\n adapter === null ||\n !('conditionalCopy' in adapter) ||\n !('promote' in adapter)\n ) {\n return undefined;\n }\n const candidate = adapter as Adapter &\n Partial<FilesSdkConditionalCopyAdapter>;\n const capability = candidate.conditionalCopy;\n if (\n capability === undefined ||\n typeof capability.supported !== 'boolean' ||\n typeof capability.etag !== 'boolean' ||\n typeof capability.version !== 'boolean' ||\n typeof candidate.promote !== 'function'\n ) {\n return undefined;\n }\n return candidate as Adapter & FilesSdkConditionalCopyAdapter;\n}\n\nfunction conditionalMutationAdapterOf(\n adapter: Adapter,\n): FilesSdkConditionalMutationAdapter | undefined {\n if (\n typeof adapter !== 'object' ||\n adapter === null ||\n !('conditionalMutation' in adapter) ||\n !('uploadConditional' in adapter) ||\n !('deleteConditional' in adapter)\n ) {\n return undefined;\n }\n const candidate = adapter as Adapter &\n Partial<FilesSdkConditionalMutationAdapter>;\n const capability = candidate.conditionalMutation;\n if (\n capability === undefined ||\n typeof capability.create !== 'boolean' ||\n typeof capability.replace !== 'boolean' ||\n typeof capability.delete !== 'boolean' ||\n typeof capability.etag !== 'boolean' ||\n typeof candidate.uploadConditional !== 'function' ||\n typeof candidate.deleteConditional !== 'function'\n ) {\n return undefined;\n }\n return candidate as Adapter & FilesSdkConditionalMutationAdapter;\n}\n\nfunction signedUploadPolicyAdapterOf(\n adapter: Adapter,\n): FilesSdkSignedUploadPolicyAdapter | undefined {\n if (\n typeof adapter !== 'object' ||\n adapter === null ||\n !('signedUploadPolicy' in adapter)\n ) {\n return undefined;\n }\n const candidate = adapter as Adapter &\n Partial<FilesSdkSignedUploadPolicyAdapter>;\n const capability = candidate.signedUploadPolicy;\n if (\n capability === undefined ||\n typeof capability.contentType !== 'boolean' ||\n typeof capability.sizeRange !== 'boolean'\n ) {\n return undefined;\n }\n return candidate as Adapter & FilesSdkSignedUploadPolicyAdapter;\n}\n\nfunction signedDownloadPolicyAdapterOf(\n adapter: Adapter,\n): FilesSdkSignedDownloadPolicyAdapter | undefined {\n if (\n typeof adapter !== 'object' ||\n adapter === null ||\n !('signedDownloadPolicy' in adapter)\n ) {\n return undefined;\n }\n const candidate = adapter as Adapter &\n Partial<FilesSdkSignedDownloadPolicyAdapter>;\n const capability = candidate.signedDownloadPolicy;\n if (capability === undefined || typeof capability.expiresIn !== 'boolean') {\n return undefined;\n }\n return candidate as Adapter & FilesSdkSignedDownloadPolicyAdapter;\n}\n\ninterface FilesErrorLike {\n readonly name: string;\n readonly message: string;\n readonly code: FilesError['code'];\n readonly aborted: boolean;\n readonly timedOut: boolean;\n readonly permanent: boolean;\n readonly cause?: unknown;\n}\n\nfunction isFilesErrorCode(value: unknown): value is FilesError['code'] {\n return (\n value === 'NotFound' ||\n value === 'Unauthorized' ||\n value === 'Conflict' ||\n value === 'ReadOnly' ||\n value === 'Provider'\n );\n}\n\nfunction isFilesErrorLike(error: unknown): error is FilesErrorLike {\n if (error instanceof FilesError) {\n return true;\n }\n if (!(error instanceof Error)) {\n return false;\n }\n\n try {\n return (\n error.name === 'FilesError' &&\n typeof error.message === 'string' &&\n 'code' in error &&\n isFilesErrorCode(error.code) &&\n 'aborted' in error &&\n typeof error.aborted === 'boolean' &&\n 'timedOut' in error &&\n typeof error.timedOut === 'boolean' &&\n 'permanent' in error &&\n typeof error.permanent === 'boolean'\n );\n } catch {\n return false;\n }\n}\n\nfunction unwrapFilesError(error: FilesErrorLike): FilesErrorLike {\n const seen = new Set<FilesErrorLike>();\n let current = error;\n\n while (\n current.code === 'Provider' &&\n !current.aborted &&\n !current.timedOut &&\n !current.permanent &&\n isFilesErrorLike(current.cause) &&\n current.message === current.cause.message &&\n !seen.has(current.cause)\n ) {\n seen.add(current);\n current = current.cause;\n }\n\n return current;\n}\n\nexport function mapFilesSdkError(error: unknown): StorageError {\n if (isStorageError(error)) {\n return error;\n }\n if (!isFilesErrorLike(error)) {\n return new StorageError(\n error instanceof Error ? error.message : String(error),\n {\n cause: error,\n code: StorageErrorCode.PROVIDER,\n },\n );\n }\n\n const filesError = unwrapFilesError(error);\n\n if (isStorageError(filesError.cause)) {\n return filesError.cause;\n }\n\n let code: StorageErrorCode;\n if (filesError.timedOut) {\n code = StorageErrorCode.TIMEOUT;\n } else if (filesError.aborted) {\n code = StorageErrorCode.ABORTED;\n } else {\n switch (filesError.code) {\n case 'NotFound':\n code = StorageErrorCode.NOT_FOUND;\n break;\n case 'Unauthorized':\n code = StorageErrorCode.UNAUTHORIZED;\n break;\n case 'Conflict':\n code = StorageErrorCode.CONFLICT;\n break;\n case 'ReadOnly':\n code = StorageErrorCode.READ_ONLY;\n break;\n case 'Provider':\n code = /(?:not supported|does not support|unsupported)/iu.test(\n filesError.message,\n )\n ? StorageErrorCode.NOT_SUPPORTED\n : StorageErrorCode.PROVIDER;\n break;\n }\n }\n\n return new StorageError(filesError.message, {\n aborted: filesError.aborted,\n cause: filesError.cause ?? error,\n code,\n permanent: filesError.permanent,\n timedOut: filesError.timedOut,\n });\n}\n\nfunction mapRetryOptions(\n retries: StorageRetryOptions | undefined,\n): RetryOptions | undefined {\n if (retries === undefined || typeof retries === 'number') {\n return retries;\n }\n\n return {\n max: retries.max,\n ...(retries.backoff !== undefined && {\n backoff: ({ attempt, error }) =>\n retries.backoff?.({\n attempt,\n error: mapFilesSdkError(error),\n }) ?? 0,\n }),\n };\n}\n\nfunction storageRetryOptions(\n retries: RetryOptions | undefined,\n): StorageRetryOptions | undefined {\n if (retries === undefined || typeof retries === 'number') {\n return retries;\n }\n return {\n max: retries.max,\n ...(retries.backoff !== undefined && {\n backoff: ({ attempt, error }) =>\n retries.backoff?.({\n attempt,\n error: new FilesError(\n error.code === StorageErrorCode.NOT_FOUND\n ? 'NotFound'\n : error.code === StorageErrorCode.UNAUTHORIZED\n ? 'Unauthorized'\n : error.code === StorageErrorCode.CONFLICT\n ? 'Conflict'\n : error.code === StorageErrorCode.READ_ONLY\n ? 'ReadOnly'\n : 'Provider',\n error.message,\n error,\n {\n aborted: error.aborted,\n permanent: error.permanent,\n timedOut: error.timedOut,\n },\n ),\n }) ?? 0,\n }),\n };\n}\n\nfunction operationOptions(\n options?: StorageOperationOptions,\n): OperationOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n\n const retries = mapRetryOptions(options.retries);\n return {\n ...(retries !== undefined && { retries }),\n ...(options.signal !== undefined && { signal: options.signal }),\n ...(options.timeout !== undefined && { timeout: options.timeout }),\n };\n}\n\nasync function* normalizeNodeChunks(\n source: Readable,\n): AsyncGenerator<Uint8Array> {\n for await (const chunk of source) {\n if (typeof chunk === 'string') {\n yield new TextEncoder().encode(chunk);\n continue;\n }\n if (chunk instanceof Uint8Array) {\n yield chunk;\n continue;\n }\n throw new StorageError(\n 'Node upload streams must yield strings or Uint8Array chunks.',\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n },\n );\n }\n}\n\nfunction mapBody(body: StorageBody): Body {\n if (body instanceof Readable) {\n return Readable.toWeb(\n Readable.from(normalizeNodeChunks(body)),\n ) as ReadableStream<Uint8Array>;\n }\n return body;\n}\n\nfunction normalizeDownloadStream(\n source: ReadableStream<Uint8Array>,\n): ReadableStream<Uint8Array> {\n let reader: ReadableStreamDefaultReader<Uint8Array> | undefined =\n source.getReader();\n\n const release = (): void => {\n reader?.releaseLock();\n reader = undefined;\n };\n\n return new ReadableStream<Uint8Array>({\n async cancel(reason) {\n const activeReader = reader;\n if (activeReader === undefined) {\n return;\n }\n try {\n await activeReader.cancel(reason);\n } catch (error) {\n throw mapFilesSdkError(error);\n } finally {\n release();\n }\n },\n async pull(controller) {\n const activeReader = reader;\n if (activeReader === undefined) {\n controller.close();\n return;\n }\n try {\n const result = await activeReader.read();\n if (result.done) {\n release();\n controller.close();\n return;\n }\n controller.enqueue(result.value);\n } catch (error) {\n release();\n controller.error(mapFilesSdkError(error));\n }\n },\n });\n}\n\nfunction uploadOptions(\n options?: StorageUploadOptions,\n): UploadOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return {\n ...operationOptions(options),\n ...(options.cacheControl !== undefined && {\n cacheControl: options.cacheControl,\n }),\n ...(options.contentType !== undefined && {\n contentType: options.contentType,\n }),\n ...(options.control !== undefined && {\n control: getFilesSdkUploadControl(options.control),\n }),\n ...(options.metadata !== undefined && { metadata: options.metadata }),\n ...(options.multipart !== undefined && {\n multipart: options.multipart,\n }),\n ...(options.onProgress !== undefined && {\n onProgress: options.onProgress,\n }),\n };\n}\n\nfunction downloadOptions(options?: StorageDownloadOptions): DownloadOptions {\n return {\n ...operationOptions(options),\n as: 'stream',\n ...(options?.range !== undefined && { range: options.range }),\n };\n}\n\nfunction listOptions(options?: StorageListOptions): ListOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return {\n ...operationOptions(options),\n ...(options.cursor !== undefined && { cursor: options.cursor }),\n ...(options.delimiter !== undefined && { delimiter: options.delimiter }),\n ...(options.limit !== undefined && { limit: options.limit }),\n ...(options.prefix !== undefined && { prefix: options.prefix }),\n };\n}\n\nfunction searchOptions(\n options?: StorageSearchOptions,\n): SearchOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return {\n ...operationOptions(options),\n ...(options.caseInsensitive !== undefined && {\n caseInsensitive: options.caseInsensitive,\n }),\n ...(options.limit !== undefined && { limit: options.limit }),\n ...(options.match !== undefined && { match: options.match }),\n ...(options.maxResults !== undefined && {\n maxResults: options.maxResults,\n }),\n ...(options.prefix !== undefined && { prefix: options.prefix }),\n };\n}\n\nfunction signedDownloadOptions(\n options?: StorageSignedDownloadOptions,\n): UrlOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return {\n ...operationOptions(options),\n ...(options.expiresIn !== undefined && {\n expiresIn: options.expiresIn,\n }),\n ...(options.responseContentDisposition !== undefined && {\n responseContentDisposition: options.responseContentDisposition,\n }),\n };\n}\n\nfunction signedUploadOptions(\n options: StorageSignedUploadOptions,\n): SignUploadOptions {\n return {\n ...operationOptions(options),\n expiresIn: options.expiresIn,\n ...(options.contentType !== undefined && {\n contentType: options.contentType,\n }),\n ...(options.maxSize !== undefined && { maxSize: options.maxSize }),\n ...(options.minSize !== undefined && { minSize: options.minSize }),\n };\n}\n\nfunction metadataOf(file: StoredFile): StorageObjectMetadata {\n return {\n contentType: file.type,\n ...(file.etag !== undefined && { etag: file.etag }),\n key: file.key,\n ...(file.lastModified !== undefined && {\n lastModified: new Date(file.lastModified),\n }),\n ...(file.metadata !== undefined && {\n metadata: { ...file.metadata },\n }),\n name: file.name,\n size: file.size,\n };\n}\n\nfunction uploadResultOf(result: UploadResult): StorageUploadResult {\n return {\n contentType: result.contentType,\n ...(result.etag !== undefined && { etag: result.etag }),\n key: result.key,\n ...(result.lastModified !== undefined && {\n lastModified: new Date(result.lastModified),\n }),\n size: result.size,\n };\n}\n\nexport class FilesSdkStorageDriver<\n AdapterType extends Adapter = Adapter,\n> implements StorageDriver {\n readonly #files: Files<AdapterType>;\n readonly #name: string;\n readonly #conditionalCopy: FilesSdkConditionalCopyAdapter | undefined;\n readonly #conditionalMutation: FilesSdkConditionalMutationAdapter | undefined;\n readonly #prefix: string;\n readonly #readOnly: boolean;\n readonly #retries: StorageRetryOptions | undefined;\n readonly #signal: AbortSignal | undefined;\n readonly #timeout: number | undefined;\n readonly #signedUploadPolicy: FilesSdkSignedUploadPolicyAdapter | undefined;\n readonly #signedDownloadPolicy:\n FilesSdkSignedDownloadPolicyAdapter | undefined;\n\n constructor(options: FilesSdkDriverOptions<AdapterType>) {\n this.#files = new Files(options);\n this.#name = options.adapter.name;\n this.#conditionalCopy = conditionalCopyAdapterOf(options.adapter);\n this.#conditionalMutation = conditionalMutationAdapterOf(options.adapter);\n this.#prefix = this.#files.prefix;\n this.#readOnly = options.readonly === true;\n this.#retries = storageRetryOptions(options.retries);\n this.#signal = options.signal;\n this.#timeout = options.timeout;\n this.#signedUploadPolicy = signedUploadPolicyAdapterOf(options.adapter);\n this.#signedDownloadPolicy = signedDownloadPolicyAdapterOf(options.adapter);\n }\n\n get name(): string {\n return this.#name;\n }\n\n get capabilities() {\n const capabilities = this.#files.capabilities;\n return {\n cacheControl: capabilities.cacheControl,\n delimiter: capabilities.delimiter,\n metadata: capabilities.metadata,\n rangeRead: capabilities.rangeRead,\n resumableUpload: capabilities.multipart,\n serverSideCopy: capabilities.serverSideCopy,\n ...(this.#conditionalCopy !== undefined && {\n conditionalCopy: { ...this.#conditionalCopy.conditionalCopy },\n }),\n ...(this.#conditionalMutation !== undefined &&\n !this.#readOnly && {\n conditionalMutation: {\n ...this.#conditionalMutation.conditionalMutation,\n },\n }),\n signedDownload: { ...capabilities.signedUrl },\n ...(this.#signedDownloadPolicy !== undefined && {\n signedDownloadPolicy: {\n ...this.#signedDownloadPolicy.signedDownloadPolicy,\n },\n }),\n signedUpload: 'runtime' as const,\n ...(this.#signedUploadPolicy !== undefined && {\n signedUploadPolicy: { ...this.#signedUploadPolicy.signedUploadPolicy },\n }),\n nativeUploadProgress: capabilities.uploadProgress,\n };\n }\n\n async upload(\n key: string,\n body: StorageBody,\n options?: StorageUploadOptions,\n ): Promise<StorageUploadResult> {\n return this.#call(async () =>\n uploadResultOf(\n await this.#files.upload(key, mapBody(body), uploadOptions(options)),\n ),\n );\n }\n\n uploadConditional(\n key: string,\n body: StorageBody,\n options: StorageConditionalUploadOptions,\n ): Promise<StorageUploadResult> {\n if (this.#readOnly) {\n return Promise.reject(\n new StorageError(\n `Cannot call uploadConditional() on a read-only storage adapter.`,\n {\n code: StorageErrorCode.READ_ONLY,\n key,\n operation: 'upload',\n permanent: true,\n },\n ),\n );\n }\n const adapter = this.#conditionalMutation;\n if (adapter === undefined) {\n return Promise.reject(\n new StorageError(\n `Storage adapter \"${this.#name}\" does not support conditional upload.`,\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n key,\n operation: 'upload',\n permanent: true,\n },\n ),\n );\n }\n const mergedOptions = this.#conditionalOptions(options);\n return this.#call(async () => {\n const physicalKey = this.#path(key);\n const result = await adapter.uploadConditional(\n physicalKey,\n mapBody(body),\n mergedOptions,\n );\n if (result.key !== physicalKey) {\n throw new StorageError(\n 'Storage adapter returned an unexpected conditional upload key.',\n {\n code: StorageErrorCode.PROVIDER,\n key,\n operation: 'upload',\n permanent: true,\n },\n );\n }\n return { ...result, key };\n });\n }\n\n async download(\n key: string,\n options?: StorageDownloadOptions,\n ): Promise<StorageObject> {\n return this.#call(async () => {\n const file = await this.#files.download(key, downloadOptions(options));\n return {\n ...metadataOf(file),\n body: normalizeDownloadStream(file.stream()),\n };\n });\n }\n\n async head(\n key: string,\n options?: StorageOperationOptions,\n ): Promise<StorageObjectMetadata> {\n return this.#call(async () =>\n metadataOf(await this.#files.head(key, operationOptions(options))),\n );\n }\n\n exists(key: string, options?: StorageOperationOptions): Promise<boolean> {\n return this.#call(() => this.#files.exists(key, operationOptions(options)));\n }\n\n delete(key: string, options?: StorageOperationOptions): Promise<void> {\n return this.#call(async () => {\n await this.#files.delete(key, operationOptions(options));\n });\n }\n\n deleteConditional(\n key: string,\n options: StorageConditionalDeleteOptions,\n ): Promise<void> {\n if (this.#readOnly) {\n return Promise.reject(\n new StorageError(\n `Cannot call deleteConditional() on a read-only storage adapter.`,\n {\n code: StorageErrorCode.READ_ONLY,\n key,\n operation: 'delete',\n permanent: true,\n },\n ),\n );\n }\n const adapter = this.#conditionalMutation;\n if (adapter === undefined) {\n return Promise.reject(\n new StorageError(\n `Storage adapter \"${this.#name}\" does not support conditional delete.`,\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n key,\n operation: 'delete',\n permanent: true,\n },\n ),\n );\n }\n const mergedOptions = this.#conditionalOptions(options);\n return this.#call(() =>\n adapter.deleteConditional(this.#path(key), mergedOptions),\n );\n }\n\n copy(\n sourceKey: string,\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void> {\n return this.#call(() =>\n this.#files.copy(sourceKey, destinationKey, operationOptions(options)),\n );\n }\n\n move(\n sourceKey: string,\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void> {\n return this.#call(() =>\n this.#files.move(sourceKey, destinationKey, operationOptions(options)),\n );\n }\n\n promote(\n sourceKey: string,\n destinationKey: string,\n options: StoragePromotionOptions,\n ): Promise<void> {\n const adapter = this.#conditionalCopy;\n if (adapter === undefined || !adapter.conditionalCopy.supported) {\n return Promise.reject(\n new StorageError(\n `Storage adapter \"${this.#name}\" does not support conditional promotion.`,\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n key: sourceKey,\n operation: 'promote',\n permanent: true,\n },\n ),\n );\n }\n return this.#call(() =>\n adapter.promote(sourceKey, destinationKey, options),\n );\n }\n\n async list(options?: StorageListOptions): Promise<StorageListResult> {\n return this.#call(async () => {\n const result = await this.#files.list(listOptions(options));\n return {\n items: result.items.map(metadataOf),\n ...(result.cursor !== undefined && { cursor: result.cursor }),\n ...(result.prefixes !== undefined && {\n prefixes: [...result.prefixes],\n }),\n };\n });\n }\n\n search(\n pattern: string | RegExp,\n options?: StorageSearchOptions,\n ): AsyncIterable<StorageObjectMetadata> {\n return this.#search(pattern, options);\n }\n\n async *#search(\n pattern: string | RegExp,\n options?: StorageSearchOptions,\n ): AsyncGenerator<StorageObjectMetadata, void> {\n try {\n for await (const file of this.#files.search(\n pattern,\n searchOptions(options),\n )) {\n yield metadataOf(file);\n }\n } catch (error) {\n throw mapFilesSdkError(error);\n }\n }\n\n signDownload(\n key: string,\n options?: StorageSignedDownloadOptions,\n ): Promise<string> {\n return this.#call(() =>\n this.#files.url(key, signedDownloadOptions(options)),\n );\n }\n\n signUpload(\n key: string,\n options: StorageSignedUploadOptions,\n ): Promise<StorageSignedUpload> {\n return this.#call(() =>\n this.#files.signedUploadUrl(key, signedUploadOptions(options)),\n );\n }\n\n async #call<Result>(operation: () => Promise<Result>): Promise<Result> {\n try {\n return await operation();\n } catch (error) {\n throw mapFilesSdkError(error);\n }\n }\n\n #path(key: string): string {\n if (typeof key !== 'string' || key.length === 0) {\n throw new StorageError('key must be a non-empty string.', {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n });\n }\n if (key.includes('\\0')) {\n throw new StorageError('key must not contain null bytes.', {\n code: StorageErrorCode.INVALID_ARGUMENT,\n key,\n permanent: true,\n });\n }\n if (this.#prefix.length === 0) {\n return key;\n }\n const normalized = key.replace(/^\\/+/u, '');\n if (\n normalized\n .split('/')\n .some((segment) => segment === '.' || segment === '..')\n ) {\n throw new StorageError('key must not contain . or .. path segments.', {\n code: StorageErrorCode.INVALID_ARGUMENT,\n key,\n permanent: true,\n });\n }\n return `${this.#prefix}/${normalized}`;\n }\n\n #conditionalOptions<\n Options extends\n StorageConditionalUploadOptions | StorageConditionalDeleteOptions,\n >(options: Options): Options {\n return {\n ...options,\n ...(options.retries === undefined &&\n this.#retries !== undefined && { retries: this.#retries }),\n ...(options.signal === undefined &&\n this.#signal !== undefined && { signal: this.#signal }),\n ...(options.timeout === undefined &&\n this.#timeout !== undefined && { timeout: this.#timeout }),\n };\n }\n}\n\nexport function createFilesSdkDriver<AdapterType extends Adapter>(\n options: FilesSdkDriverOptions<AdapterType>,\n): FilesSdkStorageDriver<AdapterType> {\n return new FilesSdkStorageDriver(options);\n}\n"]}
|
|
@@ -1,8 +1,23 @@
|
|
|
1
1
|
import { type FsAdapter, type FsAdapterOptions } from 'files-sdk/fs';
|
|
2
|
-
import { type FilesSdkDriverOptions, type FilesSdkStorageDriver } from '../files-sdk.driver.js';
|
|
2
|
+
import { type FilesSdkConditionalMutationAdapter, type FilesSdkDriverOptions, type FilesSdkStorageDriver } from '../files-sdk.driver.js';
|
|
3
3
|
export interface FsStorageDriverOptions extends Omit<FilesSdkDriverOptions<FsAdapter>, 'adapter'> {
|
|
4
4
|
adapter: FsAdapterOptions;
|
|
5
5
|
}
|
|
6
|
+
export type FsStorageAdapter = FsAdapter & FilesSdkConditionalMutationAdapter;
|
|
7
|
+
/**
|
|
8
|
+
* Adds symlink-defended reads and process-local conditional mutations to a
|
|
9
|
+
* files-sdk fs adapter.
|
|
10
|
+
*
|
|
11
|
+
* The configured root must be dedicated to this driver: no other process and
|
|
12
|
+
* no unconditional filesystem writer may mutate it concurrently. Each call
|
|
13
|
+
* rejects symlinks in the existing key path and uses exclusive same-directory
|
|
14
|
+
* temporary files plus atomic renames, but Node has no portable `openat2`
|
|
15
|
+
* equivalent that could make those checks safe against a hostile concurrent
|
|
16
|
+
* tree rewrite. This is a CAS implementation for an exclusively-owned local
|
|
17
|
+
* workspace, not a host-filesystem sandbox. Body and metadata sidecars are two
|
|
18
|
+
* files, so a process crash between their renames can still require cleanup.
|
|
19
|
+
*/
|
|
20
|
+
export declare function withFsConditionalMutation(base: FsAdapter): FsStorageAdapter;
|
|
6
21
|
/**
|
|
7
22
|
* Creates the files-sdk filesystem driver from the storage package's own
|
|
8
23
|
* dependency context. The adapter reaches only `node:fs`, so this entry point
|
|
@@ -14,8 +29,12 @@ export interface FsStorageDriverOptions extends Omit<FilesSdkDriverOptions<FsAda
|
|
|
14
29
|
* put. Sidecars never surface as keys: `list` and `search` skip them, and
|
|
15
30
|
* uploading a key that ends in `.meta.json` fails closed rather than colliding
|
|
16
31
|
* with one.
|
|
32
|
+
*
|
|
33
|
+
* Conditional mutations additionally require an exclusively-owned root. See
|
|
34
|
+
* {@link withFsConditionalMutation}; use an OS sandbox as well when running an
|
|
35
|
+
* agent that has direct shell or filesystem tools.
|
|
17
36
|
*/
|
|
18
|
-
export declare function createFsStorageDriver(options: FsStorageDriverOptions): FilesSdkStorageDriver<
|
|
37
|
+
export declare function createFsStorageDriver(options: FsStorageDriverOptions): FilesSdkStorageDriver<FsStorageAdapter>;
|
|
19
38
|
export { fs, mapFsError } from 'files-sdk/fs';
|
|
20
39
|
export type { FsAdapter, FsAdapterOptions } from 'files-sdk/fs';
|
|
21
40
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/files-sdk/fs/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/files-sdk/fs/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAM,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AASzE,OAAO,EAEL,KAAK,kCAAkC,EACvC,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC3B,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAClD,qBAAqB,CAAC,SAAS,CAAC,EAChC,SAAS,CACV;IACC,OAAO,EAAE,gBAAgB,CAAC;CAC3B;AAED,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,kCAAkC,CAAC;AAwgB9E;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,SAAS,GAAG,gBAAgB,CAuM3E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,sBAAsB,GAC9B,qBAAqB,CAAC,gBAAgB,CAAC,CAMzC;AAED,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|