@nestm/storage 0.1.0-alpha.2 → 0.1.0-alpha.20
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 +320 -0
- package/README.md +975 -29
- package/SECURITY.md +128 -0
- package/dist/ai-sdk/ai-sdk-file-workflow-tools.d.ts +53 -0
- package/dist/ai-sdk/ai-sdk-file-workflow-tools.d.ts.map +1 -0
- package/dist/ai-sdk/ai-sdk-file-workflow-tools.js +370 -0
- package/dist/ai-sdk/ai-sdk-file-workflow-tools.js.map +1 -0
- package/dist/ai-sdk/ai-sdk-workspace-tools.d.ts +91 -0
- package/dist/ai-sdk/ai-sdk-workspace-tools.d.ts.map +1 -0
- package/dist/ai-sdk/ai-sdk-workspace-tools.js +497 -0
- package/dist/ai-sdk/ai-sdk-workspace-tools.js.map +1 -0
- package/dist/ai-sdk/index.d.ts +3 -0
- package/dist/ai-sdk/index.d.ts.map +1 -0
- package/dist/ai-sdk/index.js +3 -0
- package/dist/ai-sdk/index.js.map +1 -0
- package/dist/bytes/index.d.ts +30 -0
- package/dist/bytes/index.d.ts.map +1 -0
- package/dist/bytes/index.js +96 -0
- package/dist/bytes/index.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/storage-staged-content.d.ts +39 -0
- package/dist/core/storage-staged-content.d.ts.map +1 -0
- package/dist/core/storage-staged-content.js +109 -0
- package/dist/core/storage-staged-content.js.map +1 -0
- package/dist/core/storage-streams.d.ts +19 -0
- package/dist/core/storage-streams.d.ts.map +1 -0
- package/dist/core/storage-streams.js +95 -0
- package/dist/core/storage-streams.js.map +1 -0
- package/dist/core/storage-text-edit.d.ts +38 -0
- package/dist/core/storage-text-edit.d.ts.map +1 -0
- package/dist/core/storage-text-edit.js +86 -0
- package/dist/core/storage-text-edit.js.map +1 -0
- package/dist/core/storage-text-stream-edit.d.ts +8 -0
- package/dist/core/storage-text-stream-edit.d.ts.map +1 -0
- package/dist/core/storage-text-stream-edit.js +114 -0
- package/dist/core/storage-text-stream-edit.js.map +1 -0
- package/dist/core/storage-text.d.ts +22 -0
- package/dist/core/storage-text.d.ts.map +1 -0
- package/dist/core/storage-text.js +69 -0
- package/dist/core/storage-text.js.map +1 -0
- package/dist/crypto/index.d.ts +2 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +2 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/storage-encrypted-content.d.ts +49 -0
- package/dist/crypto/storage-encrypted-content.d.ts.map +1 -0
- package/dist/crypto/storage-encrypted-content.js +212 -0
- package/dist/crypto/storage-encrypted-content.js.map +1 -0
- package/dist/files-sdk/azure/azure-conditional.d.ts +5 -0
- package/dist/files-sdk/azure/azure-conditional.d.ts.map +1 -0
- package/dist/files-sdk/azure/azure-conditional.js +184 -0
- package/dist/files-sdk/azure/azure-conditional.js.map +1 -0
- package/dist/files-sdk/azure/index.d.ts +10 -0
- package/dist/files-sdk/azure/index.d.ts.map +1 -0
- package/dist/files-sdk/azure/index.js +34 -0
- package/dist/files-sdk/azure/index.js.map +1 -0
- package/dist/files-sdk/files-sdk.driver.d.ts +85 -3
- package/dist/files-sdk/files-sdk.driver.d.ts.map +1 -1
- package/dist/files-sdk/files-sdk.driver.js +1437 -37
- package/dist/files-sdk/files-sdk.driver.js.map +1 -1
- package/dist/files-sdk/fs/index.d.ts +42 -0
- package/dist/files-sdk/fs/index.d.ts.map +1 -0
- package/dist/files-sdk/fs/index.js +1117 -0
- package/dist/files-sdk/fs/index.js.map +1 -0
- 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/memory.d.ts +7 -0
- package/dist/files-sdk/memory.d.ts.map +1 -0
- package/dist/files-sdk/memory.js +72 -0
- package/dist/files-sdk/memory.js.map +1 -0
- package/dist/files-sdk/provider/index.d.ts +58 -0
- package/dist/files-sdk/provider/index.d.ts.map +1 -0
- package/dist/files-sdk/provider/index.js +169 -0
- package/dist/files-sdk/provider/index.js.map +1 -0
- package/dist/files-sdk/s3/construction-metadata.d.ts +9 -0
- package/dist/files-sdk/s3/construction-metadata.d.ts.map +1 -0
- package/dist/files-sdk/s3/construction-metadata.js +24 -0
- package/dist/files-sdk/s3/construction-metadata.js.map +1 -0
- package/dist/files-sdk/s3/index.d.ts +54 -0
- package/dist/files-sdk/s3/index.d.ts.map +1 -0
- package/dist/files-sdk/s3/index.js +1505 -0
- package/dist/files-sdk/s3/index.js.map +1 -0
- package/dist/gateway/index.d.ts +1 -1
- package/dist/gateway/index.d.ts.map +1 -1
- package/dist/gateway/index.js.map +1 -1
- package/dist/gateway/storage-gateway-fastify-parser.d.ts.map +1 -1
- package/dist/gateway/storage-gateway-fastify-parser.js.map +1 -1
- package/dist/gateway/storage-gateway.controller.d.ts +12 -11
- package/dist/gateway/storage-gateway.controller.d.ts.map +1 -1
- package/dist/gateway/storage-gateway.controller.js +240 -70
- package/dist/gateway/storage-gateway.controller.js.map +1 -1
- package/dist/gateway/storage-gateway.guard.d.ts.map +1 -1
- package/dist/gateway/storage-gateway.guard.js.map +1 -1
- package/dist/gateway/storage-gateway.module.d.ts.map +1 -1
- package/dist/gateway/storage-gateway.module.js +60 -1
- package/dist/gateway/storage-gateway.module.js.map +1 -1
- package/dist/gateway/storage-gateway.tokens.d.ts +1 -0
- package/dist/gateway/storage-gateway.tokens.d.ts.map +1 -1
- package/dist/gateway/storage-gateway.tokens.js +1 -0
- package/dist/gateway/storage-gateway.tokens.js.map +1 -1
- package/dist/gateway/storage-gateway.types.d.ts +53 -10
- package/dist/gateway/storage-gateway.types.d.ts.map +1 -1
- package/dist/gateway/storage-gateway.types.js.map +1 -1
- package/dist/inject-storage.decorator.js.map +1 -1
- package/dist/storage-etag.d.ts +13 -0
- package/dist/storage-etag.d.ts.map +1 -0
- package/dist/storage-etag.js +31 -0
- package/dist/storage-etag.js.map +1 -0
- package/dist/storage-upload-control.d.ts.map +1 -1
- package/dist/storage.client.d.ts +14 -1
- package/dist/storage.client.d.ts.map +1 -1
- package/dist/storage.client.js +204 -2
- package/dist/storage.client.js.map +1 -1
- package/dist/storage.driver.d.ts +28 -1
- package/dist/storage.driver.d.ts.map +1 -1
- package/dist/storage.driver.js.map +1 -1
- package/dist/storage.error.d.ts +17 -10
- package/dist/storage.error.d.ts.map +1 -1
- package/dist/storage.error.js +47 -1
- package/dist/storage.error.js.map +1 -1
- package/dist/storage.module.d.ts.map +1 -1
- package/dist/storage.module.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.tokens.js.map +1 -1
- package/dist/storage.types.d.ts +150 -1
- package/dist/storage.types.d.ts.map +1 -1
- package/dist/storage.types.js.map +1 -1
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +3 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/provider-conformance.d.ts +65 -0
- package/dist/testing/provider-conformance.d.ts.map +1 -0
- package/dist/testing/provider-conformance.js +869 -0
- package/dist/testing/provider-conformance.js.map +1 -0
- package/dist/workspace/index.d.ts +12 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +10 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/storage-catalog-checkout.d.ts +7 -0
- package/dist/workspace/storage-catalog-checkout.d.ts.map +1 -0
- package/dist/workspace/storage-catalog-checkout.js +13 -0
- package/dist/workspace/storage-catalog-checkout.js.map +1 -0
- package/dist/workspace/storage-draft-stream.d.ts +3 -0
- package/dist/workspace/storage-draft-stream.d.ts.map +1 -0
- package/dist/workspace/storage-draft-stream.js +57 -0
- package/dist/workspace/storage-draft-stream.js.map +1 -0
- package/dist/workspace/storage-file-catalog.types.d.ts +73 -0
- package/dist/workspace/storage-file-catalog.types.d.ts.map +1 -0
- package/dist/workspace/storage-file-catalog.types.js +2 -0
- package/dist/workspace/storage-file-catalog.types.js.map +1 -0
- package/dist/workspace/storage-file-workflow.d.ts +7 -0
- package/dist/workspace/storage-file-workflow.d.ts.map +1 -0
- package/dist/workspace/storage-file-workflow.js +657 -0
- package/dist/workspace/storage-file-workflow.js.map +1 -0
- package/dist/workspace/storage-file-workflow.protection.d.ts +31 -0
- package/dist/workspace/storage-file-workflow.protection.d.ts.map +1 -0
- package/dist/workspace/storage-file-workflow.protection.js +339 -0
- package/dist/workspace/storage-file-workflow.protection.js.map +1 -0
- package/dist/workspace/storage-file-workflow.types.d.ts +184 -0
- package/dist/workspace/storage-file-workflow.types.d.ts.map +1 -0
- package/dist/workspace/storage-file-workflow.types.js +10 -0
- package/dist/workspace/storage-file-workflow.types.js.map +1 -0
- package/dist/workspace/storage-text-draft.d.ts +21 -0
- package/dist/workspace/storage-text-draft.d.ts.map +1 -0
- package/dist/workspace/storage-text-draft.js +77 -0
- package/dist/workspace/storage-text-draft.js.map +1 -0
- package/dist/workspace/storage-working-files.d.ts +34 -0
- package/dist/workspace/storage-working-files.d.ts.map +1 -0
- package/dist/workspace/storage-working-files.js +326 -0
- package/dist/workspace/storage-working-files.js.map +1 -0
- package/dist/workspace/storage-workspace.cursor.d.ts +71 -0
- package/dist/workspace/storage-workspace.cursor.d.ts.map +1 -0
- package/dist/workspace/storage-workspace.cursor.js +408 -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 +32 -0
- package/dist/workspace/storage-workspace.error.d.ts.map +1 -0
- package/dist/workspace/storage-workspace.error.js +75 -0
- package/dist/workspace/storage-workspace.error.js.map +1 -0
- package/dist/workspace/storage-workspace.js +849 -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 +123 -0
- package/dist/workspace/storage-workspace.types.d.ts.map +1 -0
- package/dist/workspace/storage-workspace.types.js +22 -0
- package/dist/workspace/storage-workspace.types.js.map +1 -0
- package/package.json +99 -20
package/dist/storage.driver.d.ts
CHANGED
|
@@ -1,14 +1,41 @@
|
|
|
1
|
-
import type { StorageBody, StorageCapabilities, StorageDownloadOptions, StorageListOptions, StorageListResult, StorageObject, StorageObjectMetadata, StorageOperationOptions, StorageSearchOptions, StorageSignedDownloadOptions, StorageSignedUpload, StorageSignedUploadOptions, StorageUploadOptions, StorageUploadResult } from './storage.types.js';
|
|
1
|
+
import type { StorageBody, StorageCapabilities, StorageConditionalDeleteOptions, StorageConditionalReadOptions, StorageConditionalUploadOptions, StorageDownloadOptions, StorageListOptions, StorageListResult, StorageObject, StorageObjectMetadata, StorageOperationOptions, StoragePromotionOptions, StorageSearchOptions, StorageSignedDownloadOptions, StorageSignedUpload, StorageSignedUploadOptions, StorageUploadOptions, StorageUploadResult } from './storage.types.js';
|
|
2
2
|
export interface StorageDriver {
|
|
3
3
|
readonly name: string;
|
|
4
4
|
readonly capabilities: StorageCapabilities;
|
|
5
5
|
upload(key: string, body: StorageBody, options?: StorageUploadOptions): Promise<StorageUploadResult>;
|
|
6
|
+
uploadConditional?(key: string, body: StorageBody, options: StorageConditionalUploadOptions): Promise<StorageUploadResult>;
|
|
6
7
|
download(key: string, options?: StorageDownloadOptions): Promise<StorageObject>;
|
|
8
|
+
downloadConditional?(key: string, options: StorageConditionalReadOptions): Promise<StorageObject>;
|
|
7
9
|
head(key: string, options?: StorageOperationOptions): Promise<StorageObjectMetadata>;
|
|
8
10
|
exists(key: string, options?: StorageOperationOptions): Promise<boolean>;
|
|
9
11
|
delete(key: string, options?: StorageOperationOptions): Promise<void>;
|
|
12
|
+
deleteConditional?(key: string, options: StorageConditionalDeleteOptions): Promise<void>;
|
|
10
13
|
copy(sourceKey: string, destinationKey: string, options?: StorageOperationOptions): Promise<void>;
|
|
11
14
|
move(sourceKey: string, destinationKey: string, options?: StorageOperationOptions): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Conditionally copies a staged object to its final key. The source remains
|
|
17
|
+
* in place so applications can delete it only after their metadata commit.
|
|
18
|
+
*/
|
|
19
|
+
promote?(sourceKey: string, destinationKey: string, options: StoragePromotionOptions): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Lists one page and, when more entries remain, returns an opaque cursor for
|
|
22
|
+
* the next logical position. Cursors are bound to the request's `prefix` and
|
|
23
|
+
* `delimiter`; callers may choose a different supported `limit` when they
|
|
24
|
+
* resume.
|
|
25
|
+
*
|
|
26
|
+
* A cursor is non-consuming. Reusing it, including after following any
|
|
27
|
+
* descendant cursor, must resume from the same logical position while the
|
|
28
|
+
* provider namespace is unchanged. It must also work with an independently
|
|
29
|
+
* constructed compatible driver and client that address the same store with
|
|
30
|
+
* the same backend configuration while the provider token remains valid and
|
|
31
|
+
* available. Drivers must not make cursor state local to one process, client,
|
|
32
|
+
* or session.
|
|
33
|
+
*
|
|
34
|
+
* This contract does not provide snapshot isolation: concurrent namespace
|
|
35
|
+
* mutations may change subsequent pages. It does not guarantee provider
|
|
36
|
+
* token lifetime or backend availability, and provider invalidation remains
|
|
37
|
+
* an ordinary list-operation failure.
|
|
38
|
+
*/
|
|
12
39
|
list(options?: StorageListOptions): Promise<StorageListResult>;
|
|
13
40
|
search(pattern: string | RegExp, options?: StorageSearchOptions): AsyncIterable<StorageObjectMetadata>;
|
|
14
41
|
signDownload(key: string, options?: StorageSignedDownloadOptions): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.driver.d.ts","sourceRoot":"","sources":["../src/storage.driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,EACpB,4BAA4B,EAC5B,mBAAmB,EACnB,0BAA0B,EAC1B,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAE3C,MAAM,CACJ,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChC,QAAQ,CACN,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,IAAI,CACF,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,IAAI,CACF,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,IAAI,CACF,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,IAAI,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC/D,MAAM,CACJ,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,aAAa,CAAC,qBAAqB,CAAC,CAAC;IACxC,YAAY,CACV,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,4BAA4B,GACrC,OAAO,CAAC,MAAM,CAAC,CAAC;IACnB,UAAU,CACR,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC"}
|
|
1
|
+
{"version":3,"file":"storage.driver.d.ts","sourceRoot":"","sources":["../src/storage.driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,+BAA+B,EAC/B,6BAA6B,EAC7B,+BAA+B,EAC/B,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,EACpB,4BAA4B,EAC5B,mBAAmB,EACnB,0BAA0B,EAC1B,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAE3C,MAAM,CACJ,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChC,iBAAiB,CAAC,CAChB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChC,QAAQ,CACN,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,mBAAmB,CAAC,CAClB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,IAAI,CACF,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,iBAAiB,CAAC,CAChB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,IAAI,CACF,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,IAAI,CACF,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB;;;OAGG;IACH,OAAO,CAAC,CACN,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB;;;;;;;;;;;;;;;;;;OAkBG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC/D,MAAM,CACJ,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,aAAa,CAAC,qBAAqB,CAAC,CAAC;IACxC,YAAY,CACV,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,4BAA4B,GACrC,OAAO,CAAC,MAAM,CAAC,CAAC;IACnB,UAAU,CACR,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.driver.js","sourceRoot":"","sources":["../src/storage.driver.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n StorageBody,\n StorageCapabilities,\n StorageDownloadOptions,\n StorageListOptions,\n StorageListResult,\n StorageObject,\n StorageObjectMetadata,\n StorageOperationOptions,\n StorageSearchOptions,\n StorageSignedDownloadOptions,\n StorageSignedUpload,\n StorageSignedUploadOptions,\n StorageUploadOptions,\n StorageUploadResult,\n} from './storage.types.js';\n\nexport interface StorageDriver {\n readonly name: string;\n readonly capabilities: StorageCapabilities;\n\n upload(\n key: string,\n body: StorageBody,\n options?: StorageUploadOptions,\n ): Promise<StorageUploadResult>;\n download(\n key: string,\n options?: StorageDownloadOptions,\n ): Promise<StorageObject>;\n head(\n key: string,\n options?: StorageOperationOptions,\n ): Promise<StorageObjectMetadata>;\n exists(key: string, options?: StorageOperationOptions): Promise<boolean>;\n delete(key: string, options?: StorageOperationOptions): Promise<void>;\n copy(\n sourceKey: string,\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void>;\n move(\n sourceKey: string,\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void>;\n list(options?: StorageListOptions): Promise<StorageListResult>;\n search(\n pattern: string | RegExp,\n options?: StorageSearchOptions,\n ): AsyncIterable<StorageObjectMetadata>;\n signDownload(\n key: string,\n options?: StorageSignedDownloadOptions,\n ): Promise<string>;\n signUpload(\n key: string,\n options: StorageSignedUploadOptions,\n ): Promise<StorageSignedUpload>;\n close?(): void | Promise<void>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"storage.driver.js","sourceRoot":"","sources":["../src/storage.driver.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n StorageBody,\n StorageCapabilities,\n StorageConditionalDeleteOptions,\n StorageConditionalReadOptions,\n StorageConditionalUploadOptions,\n StorageDownloadOptions,\n StorageListOptions,\n StorageListResult,\n StorageObject,\n StorageObjectMetadata,\n StorageOperationOptions,\n StoragePromotionOptions,\n StorageSearchOptions,\n StorageSignedDownloadOptions,\n StorageSignedUpload,\n StorageSignedUploadOptions,\n StorageUploadOptions,\n StorageUploadResult,\n} from './storage.types.js';\n\nexport interface StorageDriver {\n readonly name: string;\n readonly capabilities: StorageCapabilities;\n\n upload(\n key: string,\n body: StorageBody,\n options?: StorageUploadOptions,\n ): Promise<StorageUploadResult>;\n uploadConditional?(\n key: string,\n body: StorageBody,\n options: StorageConditionalUploadOptions,\n ): Promise<StorageUploadResult>;\n download(\n key: string,\n options?: StorageDownloadOptions,\n ): Promise<StorageObject>;\n downloadConditional?(\n key: string,\n options: StorageConditionalReadOptions,\n ): Promise<StorageObject>;\n head(\n key: string,\n options?: StorageOperationOptions,\n ): Promise<StorageObjectMetadata>;\n exists(key: string, options?: StorageOperationOptions): Promise<boolean>;\n delete(key: string, options?: StorageOperationOptions): Promise<void>;\n deleteConditional?(\n key: string,\n options: StorageConditionalDeleteOptions,\n ): Promise<void>;\n copy(\n sourceKey: string,\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void>;\n move(\n sourceKey: string,\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void>;\n /**\n * Conditionally copies a staged object to its final key. The source remains\n * in place so applications can delete it only after their metadata commit.\n */\n promote?(\n sourceKey: string,\n destinationKey: string,\n options: StoragePromotionOptions,\n ): Promise<void>;\n /**\n * Lists one page and, when more entries remain, returns an opaque cursor for\n * the next logical position. Cursors are bound to the request's `prefix` and\n * `delimiter`; callers may choose a different supported `limit` when they\n * resume.\n *\n * A cursor is non-consuming. Reusing it, including after following any\n * descendant cursor, must resume from the same logical position while the\n * provider namespace is unchanged. It must also work with an independently\n * constructed compatible driver and client that address the same store with\n * the same backend configuration while the provider token remains valid and\n * available. Drivers must not make cursor state local to one process, client,\n * or session.\n *\n * This contract does not provide snapshot isolation: concurrent namespace\n * mutations may change subsequent pages. It does not guarantee provider\n * token lifetime or backend availability, and provider invalidation remains\n * an ordinary list-operation failure.\n */\n list(options?: StorageListOptions): Promise<StorageListResult>;\n search(\n pattern: string | RegExp,\n options?: StorageSearchOptions,\n ): AsyncIterable<StorageObjectMetadata>;\n signDownload(\n key: string,\n options?: StorageSignedDownloadOptions,\n ): Promise<string>;\n signUpload(\n key: string,\n options: StorageSignedUploadOptions,\n ): Promise<StorageSignedUpload>;\n close?(): void | Promise<void>;\n}\n"]}
|
package/dist/storage.error.d.ts
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
export declare const StorageErrorCode: {
|
|
2
|
-
readonly NOT_FOUND:
|
|
3
|
-
readonly UNAUTHORIZED:
|
|
4
|
-
readonly CONFLICT:
|
|
5
|
-
readonly READ_ONLY:
|
|
6
|
-
readonly INVALID_ARGUMENT:
|
|
7
|
-
readonly NOT_SUPPORTED:
|
|
8
|
-
readonly ABORTED:
|
|
9
|
-
readonly TIMEOUT:
|
|
10
|
-
readonly LIMIT_EXCEEDED:
|
|
11
|
-
readonly PROVIDER:
|
|
2
|
+
readonly NOT_FOUND: 'NOT_FOUND';
|
|
3
|
+
readonly UNAUTHORIZED: 'UNAUTHORIZED';
|
|
4
|
+
readonly CONFLICT: 'CONFLICT';
|
|
5
|
+
readonly READ_ONLY: 'READ_ONLY';
|
|
6
|
+
readonly INVALID_ARGUMENT: 'INVALID_ARGUMENT';
|
|
7
|
+
readonly NOT_SUPPORTED: 'NOT_SUPPORTED';
|
|
8
|
+
readonly ABORTED: 'ABORTED';
|
|
9
|
+
readonly TIMEOUT: 'TIMEOUT';
|
|
10
|
+
readonly LIMIT_EXCEEDED: 'LIMIT_EXCEEDED';
|
|
11
|
+
readonly PROVIDER: 'PROVIDER';
|
|
12
12
|
};
|
|
13
13
|
export type StorageErrorCode = (typeof StorageErrorCode)[keyof typeof StorageErrorCode];
|
|
14
|
+
declare const STORAGE_ERROR_BRAND: unique symbol;
|
|
14
15
|
export interface StorageErrorOptions {
|
|
15
16
|
code: StorageErrorCode;
|
|
16
17
|
store?: string;
|
|
@@ -19,9 +20,12 @@ export interface StorageErrorOptions {
|
|
|
19
20
|
aborted?: boolean;
|
|
20
21
|
timedOut?: boolean;
|
|
21
22
|
permanent?: boolean;
|
|
23
|
+
applied?: boolean;
|
|
24
|
+
appliedEtag?: string;
|
|
22
25
|
cause?: unknown;
|
|
23
26
|
}
|
|
24
27
|
export declare class StorageError extends Error {
|
|
28
|
+
readonly [STORAGE_ERROR_BRAND]: true;
|
|
25
29
|
readonly code: StorageErrorCode;
|
|
26
30
|
readonly store: string | undefined;
|
|
27
31
|
readonly operation: string | undefined;
|
|
@@ -29,6 +33,8 @@ export declare class StorageError extends Error {
|
|
|
29
33
|
readonly aborted: boolean;
|
|
30
34
|
readonly timedOut: boolean;
|
|
31
35
|
readonly permanent: boolean;
|
|
36
|
+
readonly applied: boolean;
|
|
37
|
+
readonly appliedEtag?: string;
|
|
32
38
|
readonly cause?: unknown;
|
|
33
39
|
constructor(message: string, options: StorageErrorOptions);
|
|
34
40
|
}
|
|
@@ -36,4 +42,5 @@ export declare function isStorageError(error: unknown): error is StorageError;
|
|
|
36
42
|
export declare function normalizeStorageError(error: unknown, options?: Omit<StorageErrorOptions, 'code' | 'cause'> & {
|
|
37
43
|
code?: StorageErrorCode;
|
|
38
44
|
}): StorageError;
|
|
45
|
+
export {};
|
|
39
46
|
//# sourceMappingURL=storage.error.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.error.d.ts","sourceRoot":"","sources":["../src/storage.error.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"storage.error.d.ts","sourceRoot":"","sources":["../src/storage.error.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB;aAC3B,SAAS,EAAE,WAAW;aACtB,YAAY,EAAE,cAAc;aAC5B,QAAQ,EAAE,UAAU;aACpB,SAAS,EAAE,WAAW;aACtB,gBAAgB,EAAE,kBAAkB;aACpC,aAAa,EAAE,eAAe;aAC9B,OAAO,EAAE,SAAS;aAClB,OAAO,EAAE,SAAS;aAClB,cAAc,EAAE,gBAAgB;aAChC,QAAQ,EAAE,UAAU;CACZ,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAC1B,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAC;AAE3D,QAAA,MAAM,mBAAmB,eAA4C,CAAC;AAMtE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,YAAa,SAAQ,KAAK;IACrC,SAAiB,CAAC,mBAAmB,CAAC,EAAE,IAAI,CAAC;IAC7C,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAkB,KAAK,CAAC,EAAE,OAAO,CAAC;IAElC,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAyBxD;CACF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CA2CpE;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,IAAI,CAAC,mBAAmB,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG;IACrD,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACpB,GACL,YAAY,CAYd"}
|
package/dist/storage.error.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isCanonicalStorageEtag } from './storage-etag.js';
|
|
1
2
|
export const StorageErrorCode = {
|
|
2
3
|
NOT_FOUND: 'NOT_FOUND',
|
|
3
4
|
UNAUTHORIZED: 'UNAUTHORIZED',
|
|
@@ -10,6 +11,10 @@ export const StorageErrorCode = {
|
|
|
10
11
|
LIMIT_EXCEEDED: 'LIMIT_EXCEEDED',
|
|
11
12
|
PROVIDER: 'PROVIDER',
|
|
12
13
|
};
|
|
14
|
+
const STORAGE_ERROR_BRAND = Symbol.for('@nestm/storage/StorageError');
|
|
15
|
+
function isStorageErrorCode(value) {
|
|
16
|
+
return Object.values(StorageErrorCode).includes(value);
|
|
17
|
+
}
|
|
13
18
|
export class StorageError extends Error {
|
|
14
19
|
code;
|
|
15
20
|
store;
|
|
@@ -18,9 +23,17 @@ export class StorageError extends Error {
|
|
|
18
23
|
aborted;
|
|
19
24
|
timedOut;
|
|
20
25
|
permanent;
|
|
26
|
+
applied;
|
|
27
|
+
appliedEtag;
|
|
21
28
|
cause;
|
|
22
29
|
constructor(message, options) {
|
|
23
30
|
super(message, { cause: options.cause });
|
|
31
|
+
Object.defineProperty(this, STORAGE_ERROR_BRAND, {
|
|
32
|
+
configurable: false,
|
|
33
|
+
enumerable: false,
|
|
34
|
+
value: true,
|
|
35
|
+
writable: false,
|
|
36
|
+
});
|
|
24
37
|
this.name = 'StorageError';
|
|
25
38
|
this.code = options.code;
|
|
26
39
|
this.store = options.store;
|
|
@@ -29,11 +42,44 @@ export class StorageError extends Error {
|
|
|
29
42
|
this.aborted = options.aborted === true;
|
|
30
43
|
this.timedOut = options.timedOut === true;
|
|
31
44
|
this.permanent = options.permanent === true;
|
|
45
|
+
this.applied = options.applied === true;
|
|
46
|
+
if (this.applied &&
|
|
47
|
+
options.appliedEtag !== undefined &&
|
|
48
|
+
isCanonicalStorageEtag(options.appliedEtag)) {
|
|
49
|
+
this.appliedEtag = options.appliedEtag;
|
|
50
|
+
}
|
|
32
51
|
this.cause = options.cause;
|
|
33
52
|
}
|
|
34
53
|
}
|
|
35
54
|
export function isStorageError(error) {
|
|
36
|
-
|
|
55
|
+
if (error instanceof StorageError) {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
if (!(error instanceof Error) || error.name !== 'StorageError') {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const candidate = error;
|
|
63
|
+
const hasCompatibleBrand = candidate[STORAGE_ERROR_BRAND] === true ||
|
|
64
|
+
candidate[STORAGE_ERROR_BRAND] === undefined;
|
|
65
|
+
return (hasCompatibleBrand &&
|
|
66
|
+
isStorageErrorCode(candidate.code) &&
|
|
67
|
+
typeof candidate.aborted === 'boolean' &&
|
|
68
|
+
typeof candidate.timedOut === 'boolean' &&
|
|
69
|
+
typeof candidate.permanent === 'boolean' &&
|
|
70
|
+
(candidate.applied === undefined ||
|
|
71
|
+
typeof candidate.applied === 'boolean') &&
|
|
72
|
+
(candidate.appliedEtag === undefined ||
|
|
73
|
+
(candidate.applied === true &&
|
|
74
|
+
isCanonicalStorageEtag(candidate.appliedEtag))) &&
|
|
75
|
+
(candidate.store === undefined || typeof candidate.store === 'string') &&
|
|
76
|
+
(candidate.operation === undefined ||
|
|
77
|
+
typeof candidate.operation === 'string') &&
|
|
78
|
+
(candidate.key === undefined || typeof candidate.key === 'string'));
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
37
83
|
}
|
|
38
84
|
export function normalizeStorageError(error, options = {}) {
|
|
39
85
|
if (isStorageError(error)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.error.js","sourceRoot":"","sources":["../src/storage.error.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,SAAS,EAAE,WAAW;IACtB,YAAY,EAAE,cAAc;IAC5B,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,gBAAgB,EAAE,kBAAkB;IACpC,aAAa,EAAE,eAAe;IAC9B,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,cAAc,EAAE,gBAAgB;IAChC,QAAQ,EAAE,UAAU;CACZ,CAAC;
|
|
1
|
+
{"version":3,"file":"storage.error.js","sourceRoot":"","sources":["../src/storage.error.ts"],"names":[],"mappings":"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","sourcesContent":["import { isCanonicalStorageEtag } from './storage-etag.js';\n\nexport const StorageErrorCode = {\n NOT_FOUND: 'NOT_FOUND',\n UNAUTHORIZED: 'UNAUTHORIZED',\n CONFLICT: 'CONFLICT',\n READ_ONLY: 'READ_ONLY',\n INVALID_ARGUMENT: 'INVALID_ARGUMENT',\n NOT_SUPPORTED: 'NOT_SUPPORTED',\n ABORTED: 'ABORTED',\n TIMEOUT: 'TIMEOUT',\n LIMIT_EXCEEDED: 'LIMIT_EXCEEDED',\n PROVIDER: 'PROVIDER',\n} as const;\n\nexport type StorageErrorCode =\n (typeof StorageErrorCode)[keyof typeof StorageErrorCode];\n\nconst STORAGE_ERROR_BRAND = Symbol.for('@nestm/storage/StorageError');\n\nfunction isStorageErrorCode(value: unknown): value is StorageErrorCode {\n return Object.values(StorageErrorCode).includes(value as StorageErrorCode);\n}\n\nexport interface StorageErrorOptions {\n code: StorageErrorCode;\n store?: string;\n operation?: string;\n key?: string;\n aborted?: boolean;\n timedOut?: boolean;\n permanent?: boolean;\n applied?: boolean;\n appliedEtag?: string;\n cause?: unknown;\n}\n\nexport class StorageError extends Error {\n declare readonly [STORAGE_ERROR_BRAND]: true;\n readonly code: StorageErrorCode;\n readonly store: string | undefined;\n readonly operation: string | undefined;\n readonly key: string | undefined;\n readonly aborted: boolean;\n readonly timedOut: boolean;\n readonly permanent: boolean;\n readonly applied: boolean;\n readonly appliedEtag?: string;\n override readonly cause?: unknown;\n\n constructor(message: string, options: StorageErrorOptions) {\n super(message, { cause: options.cause });\n Object.defineProperty(this, STORAGE_ERROR_BRAND, {\n configurable: false,\n enumerable: false,\n value: true,\n writable: false,\n });\n this.name = 'StorageError';\n this.code = options.code;\n this.store = options.store;\n this.operation = options.operation;\n this.key = options.key;\n this.aborted = options.aborted === true;\n this.timedOut = options.timedOut === true;\n this.permanent = options.permanent === true;\n this.applied = options.applied === true;\n if (\n this.applied &&\n options.appliedEtag !== undefined &&\n isCanonicalStorageEtag(options.appliedEtag)\n ) {\n this.appliedEtag = options.appliedEtag;\n }\n this.cause = options.cause;\n }\n}\n\nexport function isStorageError(error: unknown): error is StorageError {\n if (error instanceof StorageError) {\n return true;\n }\n if (!(error instanceof Error) || error.name !== 'StorageError') {\n return false;\n }\n\n try {\n const candidate = error as Error & {\n readonly [STORAGE_ERROR_BRAND]?: unknown;\n readonly aborted?: unknown;\n readonly applied?: unknown;\n readonly appliedEtag?: unknown;\n readonly code?: unknown;\n readonly key?: unknown;\n readonly operation?: unknown;\n readonly permanent?: unknown;\n readonly store?: unknown;\n readonly timedOut?: unknown;\n };\n const hasCompatibleBrand =\n candidate[STORAGE_ERROR_BRAND] === true ||\n candidate[STORAGE_ERROR_BRAND] === undefined;\n return (\n hasCompatibleBrand &&\n isStorageErrorCode(candidate.code) &&\n typeof candidate.aborted === 'boolean' &&\n typeof candidate.timedOut === 'boolean' &&\n typeof candidate.permanent === 'boolean' &&\n (candidate.applied === undefined ||\n typeof candidate.applied === 'boolean') &&\n (candidate.appliedEtag === undefined ||\n (candidate.applied === true &&\n isCanonicalStorageEtag(candidate.appliedEtag))) &&\n (candidate.store === undefined || typeof candidate.store === 'string') &&\n (candidate.operation === undefined ||\n typeof candidate.operation === 'string') &&\n (candidate.key === undefined || typeof candidate.key === 'string')\n );\n } catch {\n return false;\n }\n}\n\nexport function normalizeStorageError(\n error: unknown,\n options: Omit<StorageErrorOptions, 'code' | 'cause'> & {\n code?: StorageErrorCode;\n } = {},\n): StorageError {\n if (isStorageError(error)) {\n return error;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n\n return new StorageError(message, {\n ...options,\n cause: error,\n code: options.code ?? StorageErrorCode.PROVIDER,\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.module.d.ts","sourceRoot":"","sources":["../src/storage.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAInB,MAAM,gBAAgB,CAAC;AAIxB,OAAO,KAAK,EAEV,0BAA0B,EAC1B,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EAErB,MAAM,6BAA6B,CAAC;AAsBrC,qBACa,oBAAoB;CAAG;AAmNpC,qBACa,aAAa;IACxB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa;
|
|
1
|
+
{"version":3,"file":"storage.module.d.ts","sourceRoot":"","sources":["../src/storage.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAInB,MAAM,gBAAgB,CAAC;AAIxB,OAAO,KAAK,EAEV,0BAA0B,EAC1B,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EAErB,MAAM,6BAA6B,CAAC;AAsBrC,qBACa,oBAAoB;CAAG;AAmNpC,qBACa,aAAa;IACxB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAY3D;IAED,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,yBAAyB,GAAG,aAAa,CAarE;IAED,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa,CAU/D;IAED,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,0BAA0B,GAAG,aAAa,CAUzE;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.module.js","sourceRoot":"","sources":["../src/storage.module.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Module,\n type DynamicModule,\n type FactoryProvider,\n type ModuleMetadata,\n type Provider,\n} from '@nestjs/common';\n\nimport { StorageClient } from './storage.client.js';\nimport type { StorageDriver } from './storage.driver.js';\nimport type {\n StorageAsyncStoreDefinition,\n StorageFeatureAsyncOptions,\n StorageFeatureOptions,\n StorageModuleAsyncOptions,\n StorageModuleOptions,\n StorageStoreDefinition,\n} from './storage-module.options.js';\nimport { StorageService } from './storage.service.js';\nimport {\n DEFAULT_STORAGE_NAME,\n STORAGE_DEFAULT_NAME,\n getStorageToken,\n normalizeStorageName,\n} from './storage.tokens.js';\nimport type { StoragePlugin } from './storage.types.js';\n\ninterface PreparedStore {\n name: string;\n driver: StorageDriver;\n plugins: readonly StoragePlugin[];\n}\n\ninterface PreparedAsyncStore {\n name: string;\n definition: StorageAsyncStoreDefinition;\n plugins: readonly StoragePlugin[];\n}\n\n@Module({})\nexport class StorageFeatureModule {}\n\nfunction assertStores(names: readonly string[]): void {\n if (names.length === 0) {\n throw new TypeError('At least one storage store must be configured.');\n }\n const duplicates = names.filter(\n (name, index) => names.indexOf(name) !== index,\n );\n if (duplicates.length > 0) {\n throw new TypeError(\n `Duplicate storage store names: ${[...new Set(duplicates)].join(', ')}.`,\n );\n }\n}\n\nfunction resolveDefaultName(\n names: readonly string[],\n requested?: string,\n): string | null {\n if (requested !== undefined) {\n const normalized = normalizeStorageName(requested);\n if (!names.includes(normalized)) {\n throw new TypeError(\n `Default storage store \"${normalized}\" is not present in this registration.`,\n );\n }\n return normalized;\n }\n if (names.length === 1) {\n return names[0] ?? null;\n }\n return names.includes(DEFAULT_STORAGE_NAME) ? DEFAULT_STORAGE_NAME : null;\n}\n\nfunction prepareStores(\n stores: readonly StorageStoreDefinition[],\n plugins: readonly StoragePlugin[] = [],\n): PreparedStore[] {\n const prepared = stores.map((store) => ({\n driver: store.driver,\n name: normalizeStorageName(store.name),\n plugins: [...plugins, ...(store.plugins ?? [])],\n }));\n assertStores(prepared.map((store) => store.name));\n return prepared;\n}\n\nfunction prepareAsyncStores(\n stores: readonly StorageAsyncStoreDefinition[],\n plugins: readonly StoragePlugin[] = [],\n): PreparedAsyncStore[] {\n const prepared = stores.map((definition) => ({\n definition,\n name: normalizeStorageName(definition.name),\n plugins: [...plugins, ...(definition.plugins ?? [])],\n }));\n assertStores(prepared.map((store) => store.name));\n return prepared;\n}\n\nfunction uniqueImports(\n root: ModuleMetadata['imports'] = [],\n stores: readonly PreparedAsyncStore[] = [],\n): NonNullable<ModuleMetadata['imports']> {\n return [\n ...new Set([\n ...root,\n ...stores.flatMap((store) => store.definition.imports ?? []),\n ]),\n ];\n}\n\nfunction serviceProvider(\n defaultName: string | null,\n names: readonly string[],\n): Provider[] {\n const storeTokens = names.map((name) => getStorageToken(name));\n return [\n { provide: STORAGE_DEFAULT_NAME, useValue: defaultName },\n {\n provide: StorageService,\n inject: [STORAGE_DEFAULT_NAME, ...storeTokens],\n useFactory: (\n configuredDefault: string | null,\n ...clients: StorageClient[]\n ): StorageService => {\n return new StorageService(\n new Map(names.map((name, index) => [name, clients[index]!])),\n configuredDefault,\n );\n },\n },\n ];\n}\n\nfunction syncDynamicModule(\n module: typeof StorageModule | typeof StorageFeatureModule,\n stores: readonly PreparedStore[],\n defaultName: string | null,\n global: boolean,\n includeService: boolean,\n imports: ModuleMetadata['imports'] = [],\n): DynamicModule {\n const clientProviders: Provider[] = stores.map((store) => ({\n provide: getStorageToken(store.name),\n useFactory: () =>\n new StorageClient(store.name, store.driver, store.plugins),\n }));\n const storeTokens = stores.map((store) => getStorageToken(store.name));\n const names = stores.map((store) => store.name);\n\n return {\n module,\n global,\n imports: uniqueImports(imports),\n providers: [\n ...clientProviders,\n ...(includeService ? serviceProvider(defaultName, names) : []),\n ],\n exports: [...storeTokens, ...(includeService ? [StorageService] : [])],\n };\n}\n\nfunction asyncClientProvider(store: PreparedAsyncStore): {\n client: FactoryProvider;\n extra?: Provider;\n} {\n const token = getStorageToken(store.name);\n const definition = store.definition;\n\n if (definition.useFactory !== undefined) {\n const factory = definition.useFactory as unknown as (\n ...dependencies: unknown[]\n ) => StorageDriver | Promise<StorageDriver>;\n return {\n client: {\n provide: token,\n inject: definition.inject ?? [],\n useFactory: async (...dependencies: unknown[]) =>\n new StorageClient(\n store.name,\n await factory(...dependencies),\n store.plugins,\n ),\n },\n };\n }\n\n if (definition.useClass !== undefined) {\n return {\n client: {\n provide: token,\n inject: [definition.useClass],\n useFactory: async (factory) =>\n new StorageClient(\n store.name,\n await factory.createStorageDriver(store.name),\n store.plugins,\n ),\n },\n extra: definition.useClass,\n };\n }\n\n return {\n client: {\n provide: token,\n inject: [definition.useExisting],\n useFactory: async (factory) =>\n new StorageClient(\n store.name,\n await factory.createStorageDriver(store.name),\n store.plugins,\n ),\n },\n };\n}\n\nfunction asyncDynamicModule(\n module: typeof StorageModule | typeof StorageFeatureModule,\n stores: readonly PreparedAsyncStore[],\n defaultName: string | null,\n global: boolean,\n includeService: boolean,\n imports: ModuleMetadata['imports'] = [],\n): DynamicModule {\n const clients = stores.map(asyncClientProvider);\n const extras = clients\n .map(({ extra }) => extra)\n .filter((provider): provider is Provider => provider !== undefined);\n const storeTokens = stores.map((store) => getStorageToken(store.name));\n\n return {\n module,\n global,\n imports: uniqueImports(imports, stores),\n providers: [\n ...new Set(extras),\n ...clients.map(({ client }) => client),\n ...(includeService\n ? serviceProvider(\n defaultName,\n stores.map((store) => store.name),\n )\n : []),\n ],\n exports: [...storeTokens, ...(includeService ? [StorageService] : [])],\n };\n}\n\n@Module({})\nexport class StorageModule {\n static forRoot(options: StorageModuleOptions): DynamicModule {\n const stores = prepareStores(options.stores, options.plugins);\n return syncDynamicModule(\n StorageModule,\n stores,\n resolveDefaultName(\n stores.map((store) => store.name),\n options.default,\n ),\n options.isGlobal === true,\n true,\n );\n }\n\n static forRootAsync(options: StorageModuleAsyncOptions): DynamicModule {\n const stores = prepareAsyncStores(options.stores, options.plugins);\n return asyncDynamicModule(\n StorageModule,\n stores,\n resolveDefaultName(\n stores.map((store) => store.name),\n options.default,\n ),\n options.isGlobal === true,\n true,\n options.imports,\n );\n }\n\n static forFeature(options: StorageFeatureOptions): DynamicModule {\n const stores = prepareStores(options.stores, options.plugins);\n return syncDynamicModule(\n StorageFeatureModule,\n stores,\n null,\n false,\n false,\n options.imports,\n );\n }\n\n static forFeatureAsync(options: StorageFeatureAsyncOptions): DynamicModule {\n const stores = prepareAsyncStores(options.stores, options.plugins);\n return asyncDynamicModule(\n StorageFeatureModule,\n stores,\n null,\n false,\n false,\n options.imports,\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"storage.module.js","sourceRoot":"","sources":["../src/storage.module.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Module,\n type DynamicModule,\n type FactoryProvider,\n type ModuleMetadata,\n type Provider,\n} from '@nestjs/common';\n\nimport { StorageClient } from './storage.client.js';\nimport type { StorageDriver } from './storage.driver.js';\nimport type {\n StorageAsyncStoreDefinition,\n StorageFeatureAsyncOptions,\n StorageFeatureOptions,\n StorageModuleAsyncOptions,\n StorageModuleOptions,\n StorageStoreDefinition,\n} from './storage-module.options.js';\nimport { StorageService } from './storage.service.js';\nimport {\n DEFAULT_STORAGE_NAME,\n STORAGE_DEFAULT_NAME,\n getStorageToken,\n normalizeStorageName,\n} from './storage.tokens.js';\nimport type { StoragePlugin } from './storage.types.js';\n\ninterface PreparedStore {\n name: string;\n driver: StorageDriver;\n plugins: readonly StoragePlugin[];\n}\n\ninterface PreparedAsyncStore {\n name: string;\n definition: StorageAsyncStoreDefinition;\n plugins: readonly StoragePlugin[];\n}\n\n@Module({})\nexport class StorageFeatureModule {}\n\nfunction assertStores(names: readonly string[]): void {\n if (names.length === 0) {\n throw new TypeError('At least one storage store must be configured.');\n }\n const duplicates = names.filter(\n (name, index) => names.indexOf(name) !== index,\n );\n if (duplicates.length > 0) {\n throw new TypeError(\n `Duplicate storage store names: ${[...new Set(duplicates)].join(', ')}.`,\n );\n }\n}\n\nfunction resolveDefaultName(\n names: readonly string[],\n requested?: string,\n): string | null {\n if (requested !== undefined) {\n const normalized = normalizeStorageName(requested);\n if (!names.includes(normalized)) {\n throw new TypeError(\n `Default storage store \"${normalized}\" is not present in this registration.`,\n );\n }\n return normalized;\n }\n if (names.length === 1) {\n return names[0] ?? null;\n }\n return names.includes(DEFAULT_STORAGE_NAME) ? DEFAULT_STORAGE_NAME : null;\n}\n\nfunction prepareStores(\n stores: readonly StorageStoreDefinition[],\n plugins: readonly StoragePlugin[] = [],\n): PreparedStore[] {\n const prepared = stores.map((store) => ({\n driver: store.driver,\n name: normalizeStorageName(store.name),\n plugins: [...plugins, ...(store.plugins ?? [])],\n }));\n assertStores(prepared.map((store) => store.name));\n return prepared;\n}\n\nfunction prepareAsyncStores(\n stores: readonly StorageAsyncStoreDefinition[],\n plugins: readonly StoragePlugin[] = [],\n): PreparedAsyncStore[] {\n const prepared = stores.map((definition) => ({\n definition,\n name: normalizeStorageName(definition.name),\n plugins: [...plugins, ...(definition.plugins ?? [])],\n }));\n assertStores(prepared.map((store) => store.name));\n return prepared;\n}\n\nfunction uniqueImports(\n root: ModuleMetadata['imports'] = [],\n stores: readonly PreparedAsyncStore[] = [],\n): NonNullable<ModuleMetadata['imports']> {\n return [\n ...new Set([\n ...root,\n ...stores.flatMap((store) => store.definition.imports ?? []),\n ]),\n ];\n}\n\nfunction serviceProvider(\n defaultName: string | null,\n names: readonly string[],\n): Provider[] {\n const storeTokens = names.map((name) => getStorageToken(name));\n return [\n { provide: STORAGE_DEFAULT_NAME, useValue: defaultName },\n {\n provide: StorageService,\n inject: [STORAGE_DEFAULT_NAME, ...storeTokens],\n useFactory: (\n configuredDefault: string | null,\n ...clients: StorageClient[]\n ): StorageService => {\n return new StorageService(\n new Map(names.map((name, index) => [name, clients[index]!])),\n configuredDefault,\n );\n },\n },\n ];\n}\n\nfunction syncDynamicModule(\n module: typeof StorageModule | typeof StorageFeatureModule,\n stores: readonly PreparedStore[],\n defaultName: string | null,\n global: boolean,\n includeService: boolean,\n imports: ModuleMetadata['imports'] = [],\n): DynamicModule {\n const clientProviders: Provider[] = stores.map((store) => ({\n provide: getStorageToken(store.name),\n useFactory: () =>\n new StorageClient(store.name, store.driver, store.plugins),\n }));\n const storeTokens = stores.map((store) => getStorageToken(store.name));\n const names = stores.map((store) => store.name);\n\n return {\n module,\n global,\n imports: uniqueImports(imports),\n providers: [\n ...clientProviders,\n ...(includeService ? serviceProvider(defaultName, names) : []),\n ],\n exports: [...storeTokens, ...(includeService ? [StorageService] : [])],\n };\n}\n\nfunction asyncClientProvider(store: PreparedAsyncStore): {\n client: FactoryProvider;\n extra?: Provider;\n} {\n const token = getStorageToken(store.name);\n const definition = store.definition;\n\n if (definition.useFactory !== undefined) {\n const factory = definition.useFactory as unknown as (\n ...dependencies: unknown[]\n ) => StorageDriver | Promise<StorageDriver>;\n return {\n client: {\n provide: token,\n inject: definition.inject ?? [],\n useFactory: async (...dependencies: unknown[]) =>\n new StorageClient(\n store.name,\n await factory(...dependencies),\n store.plugins,\n ),\n },\n };\n }\n\n if (definition.useClass !== undefined) {\n return {\n client: {\n provide: token,\n inject: [definition.useClass],\n useFactory: async (factory) =>\n new StorageClient(\n store.name,\n await factory.createStorageDriver(store.name),\n store.plugins,\n ),\n },\n extra: definition.useClass,\n };\n }\n\n return {\n client: {\n provide: token,\n inject: [definition.useExisting],\n useFactory: async (factory) =>\n new StorageClient(\n store.name,\n await factory.createStorageDriver(store.name),\n store.plugins,\n ),\n },\n };\n}\n\nfunction asyncDynamicModule(\n module: typeof StorageModule | typeof StorageFeatureModule,\n stores: readonly PreparedAsyncStore[],\n defaultName: string | null,\n global: boolean,\n includeService: boolean,\n imports: ModuleMetadata['imports'] = [],\n): DynamicModule {\n const clients = stores.map(asyncClientProvider);\n const extras = clients\n .map(({ extra }) => extra)\n .filter((provider): provider is Provider => provider !== undefined);\n const storeTokens = stores.map((store) => getStorageToken(store.name));\n\n return {\n module,\n global,\n imports: uniqueImports(imports, stores),\n providers: [\n ...new Set(extras),\n ...clients.map(({ client }) => client),\n ...(includeService\n ? serviceProvider(\n defaultName,\n stores.map((store) => store.name),\n )\n : []),\n ],\n exports: [...storeTokens, ...(includeService ? [StorageService] : [])],\n };\n}\n\n@Module({})\nexport class StorageModule {\n static forRoot(options: StorageModuleOptions): DynamicModule {\n const stores = prepareStores(options.stores, options.plugins);\n return syncDynamicModule(\n StorageModule,\n stores,\n resolveDefaultName(\n stores.map((store) => store.name),\n options.default,\n ),\n options.isGlobal === true,\n true,\n );\n }\n\n static forRootAsync(options: StorageModuleAsyncOptions): DynamicModule {\n const stores = prepareAsyncStores(options.stores, options.plugins);\n return asyncDynamicModule(\n StorageModule,\n stores,\n resolveDefaultName(\n stores.map((store) => store.name),\n options.default,\n ),\n options.isGlobal === true,\n true,\n options.imports,\n );\n }\n\n static forFeature(options: StorageFeatureOptions): DynamicModule {\n const stores = prepareStores(options.stores, options.plugins);\n return syncDynamicModule(\n StorageFeatureModule,\n stores,\n null,\n false,\n false,\n options.imports,\n );\n }\n\n static forFeatureAsync(options: StorageFeatureAsyncOptions): DynamicModule {\n const stores = prepareAsyncStores(options.stores, options.plugins);\n return asyncDynamicModule(\n StorageFeatureModule,\n stores,\n null,\n false,\n false,\n options.imports,\n );\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.service.d.ts","sourceRoot":"","sources":["../src/storage.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,KAAK,EAIV,kBAAkB,EAElB,iBAAiB,EACjB,sBAAsB,EAEtB,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"storage.service.d.ts","sourceRoot":"","sources":["../src/storage.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,KAAK,EAIV,kBAAkB,EAElB,iBAAiB,EACjB,sBAAsB,EAEtB,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAwF5B,qBAAa,cAAc;;IAKvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAF9B,YACE,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,EAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,EAG5C;IAED,IAAI,KAAK,IAAI,SAAS,MAAM,EAAE,CAE7B;IAED,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,CA6BhC;IAEK,QAAQ,CACZ,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CA6EhC;IAEK,IAAI,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAuIlE;CACF"}
|
package/dist/storage.service.js
CHANGED
|
@@ -3,6 +3,30 @@ import { StorageClient } from './storage.client.js';
|
|
|
3
3
|
import { StorageError, StorageErrorCode } from './storage.error.js';
|
|
4
4
|
import { normalizeStorageName } from './storage.tokens.js';
|
|
5
5
|
const identity = (key) => key;
|
|
6
|
+
function joinStorageKey(prefix, key) {
|
|
7
|
+
if (prefix === undefined || prefix.length === 0) {
|
|
8
|
+
return key;
|
|
9
|
+
}
|
|
10
|
+
const normalizedPrefix = prefix.replace(/\/+$/u, '');
|
|
11
|
+
for (const [label, value] of [
|
|
12
|
+
['destinationPrefix', normalizedPrefix],
|
|
13
|
+
['transformed destination key', key],
|
|
14
|
+
]) {
|
|
15
|
+
if (value.length === 0 ||
|
|
16
|
+
value.startsWith('/') ||
|
|
17
|
+
value.includes('\\') ||
|
|
18
|
+
value.includes('\0') ||
|
|
19
|
+
value
|
|
20
|
+
.split('/')
|
|
21
|
+
.some((segment) => segment.length === 0 || segment === '.' || segment === '..')) {
|
|
22
|
+
throw new StorageError(`${label} must be a canonical relative POSIX storage key.`, {
|
|
23
|
+
code: StorageErrorCode.INVALID_ARGUMENT,
|
|
24
|
+
permanent: true,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return `${normalizedPrefix}/${key}`;
|
|
29
|
+
}
|
|
6
30
|
function assertDifferentStores(from, to) {
|
|
7
31
|
if (from === to) {
|
|
8
32
|
throw new StorageError('Cross-store transfer and sync require different source and destination stores.', {
|
|
@@ -137,6 +161,7 @@ export class StorageService {
|
|
|
137
161
|
const source = this.use(fromName);
|
|
138
162
|
const destination = this.use(toName);
|
|
139
163
|
const transformKey = options.transformKey ?? identity;
|
|
164
|
+
const destinationKeyOf = (key) => joinStorageKey(options.destinationPrefix, transformKey(key));
|
|
140
165
|
const compare = options.compare ?? 'etag';
|
|
141
166
|
const sourceObjects = await walk(source, options);
|
|
142
167
|
const destinationObjects = await walk(destination, {
|
|
@@ -149,7 +174,7 @@ export class StorageService {
|
|
|
149
174
|
...(options.signal !== undefined && { signal: options.signal }),
|
|
150
175
|
});
|
|
151
176
|
const destinationIndex = new Map(destinationObjects.map((object) => [object.key, object]));
|
|
152
|
-
const desiredDestinationKeys = new Set(sourceObjects.map((object) =>
|
|
177
|
+
const desiredDestinationKeys = new Set(sourceObjects.map((object) => destinationKeyOf(object.key)));
|
|
153
178
|
const deleteKeys = (options.prune ?? false)
|
|
154
179
|
? destinationObjects
|
|
155
180
|
.map((object) => object.key)
|
|
@@ -158,7 +183,7 @@ export class StorageService {
|
|
|
158
183
|
const plannedUploads = [];
|
|
159
184
|
const plannedSkips = [];
|
|
160
185
|
for (const object of sourceObjects) {
|
|
161
|
-
const existing = destinationIndex.get(
|
|
186
|
+
const existing = destinationIndex.get(destinationKeyOf(object.key));
|
|
162
187
|
(existing && unchanged(object, existing, compare)
|
|
163
188
|
? plannedSkips
|
|
164
189
|
: plannedUploads).push(object.key);
|
|
@@ -178,7 +203,7 @@ export class StorageService {
|
|
|
178
203
|
};
|
|
179
204
|
const skipped = new Set();
|
|
180
205
|
const settled = await settleMany(sourceObjects, (object) => object.key, async (object) => {
|
|
181
|
-
const destinationKey =
|
|
206
|
+
const destinationKey = destinationKeyOf(object.key);
|
|
182
207
|
const existing = destinationIndex.get(destinationKey);
|
|
183
208
|
if (existing && unchanged(object, existing, compare)) {
|
|
184
209
|
skipped.add(object.key);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.service.js","sourceRoot":"","sources":["../src/storage.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAa3D,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,GAAG,CAAC;AAE9C,SAAS,qBAAqB,CAAC,IAAY,EAAE,EAAU;IACrD,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QAChB,MAAM,IAAI,YAAY,CACpB,gFAAgF,EAChF;YACE,IAAI,EAAE,gBAAgB,CAAC,gBAAgB;YACvC,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;SACZ,CACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAChB,MAA6B,EAC7B,WAAkC,EAClC,OAA2B;IAE3B,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC;IAC1C,CAAC;IACD,OAAO,CACL,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI;QAChC,MAAM,CAAC,IAAI,KAAK,SAAS;QACzB,WAAW,CAAC,IAAI,KAAK,SAAS;QAC9B,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,CACjC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,IAAI,CACjB,MAAqB,EACrB,OAIC;IAED,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC;QACxC,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QAC5D,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QAC/D,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;KAChE,CAAC,EAAE,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,OAAO,cAAc;IAKN;IAJV,QAAQ,CAAqC;IAEtD,YACE,OAA2C,EAC1B,WAA0B;QAA1B,gBAAW,GAAX,WAAW,CAAe;QAE3C,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,KAAK;QACP,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED,GAAG,CAAC,IAAa;QACf,MAAM,QAAQ,GACZ,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAErE,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,MAAM,IAAI,YAAY,CACpB,iEAAiE,EACjE;gBACE,IAAI,EAAE,gBAAgB,CAAC,gBAAgB;gBACvC,SAAS,EAAE,IAAI;aAChB,CACF,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;YAC7B,MAAM,IAAI,YAAY,CACpB,SAAS,CAAC,MAAM,KAAK,CAAC;gBACpB,CAAC,CAAC,kBAAkB,QAAQ,sBAAsB;gBAClD,CAAC,CAAC,kBAAkB,QAAQ,0CAA0C,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAC/F;gBACE,IAAI,EAAE,gBAAgB,CAAC,gBAAgB;gBACvC,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,QAAQ;aAChB,CACF,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,OAA+B;QAE/B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChD,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,QAAQ,CAAC;QACtD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAElC,MAAM,MAAM,GAAG,CACb,GAAW,EACX,MAAyC,EACnC,EAAE;YACR,IAAI,IAAI,CAAC,CAAC;YACV,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACrD,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,UAAU,CAC9B,OAAO,EACP,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EACtB,KAAK,EAAE,MAAM,EAAE,EAAE;YACf,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChD,IACE,CAAC,SAAS;gBACV,CAAC,MAAM,WAAW,CAAC,MAAM,CAAC,cAAc,EAAE;oBACxC,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI;wBAClC,MAAM,EAAE,OAAO,CAAC,MAAM;qBACvB,CAAC;iBACH,CAAC,CAAC,EACH,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACxB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAC9B,OAAO,MAAM,CAAC,GAAG,CAAC;YACpB,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,EAAE;gBACzD,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI;oBAClC,MAAM,EAAE,OAAO,CAAC,MAAM;iBACvB,CAAC;aACH,CAAC,CAAC;YACH,IAAI,CAAC;gBACH,MAAM,WAAW,CAAC,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC,IAAI,EAAE;oBACxD,WAAW,EAAE,UAAU,CAAC,WAAW;oBACnC,GAAG,CAAC,UAAU,CAAC,QAAQ,KAAK,SAAS,IAAI;wBACvC,QAAQ,EAAE,UAAU,CAAC,QAAQ;qBAC9B,CAAC;oBACF,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI;wBAClC,MAAM,EAAE,OAAO,CAAC,MAAM;qBACvB,CAAC;iBACH,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBAC5B,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBACxD,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;YAClC,OAAO,MAAM,CAAC,GAAG,CAAC;QACpB,CAAC,EACD,OAAO,CACR,CAAC;QAEF,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAClC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO;YACL,WAAW;YACX,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;YACvD,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SAC7D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAA2B;QACpC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChD,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,QAAQ,CAAC;QACtD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC;QAC1C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE;YACjD,GAAG,CAAC,OAAO,CAAC,iBAAiB,KAAK,SAAS;gBACzC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,iBAAiB,EAAE;gBACvC,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS;oBAC5B,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;oBAC5B,CAAC,CAAC,EAAE,CAAC;YACT,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;YAC5D,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SAChE,CAAC,CAAC;QACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B,kBAAkB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CACzD,CAAC;QACF,MAAM,sBAAsB,GAAG,IAAI,GAAG,CACpC,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CACxD,CAAC;QACF,MAAM,UAAU,GACd,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;YACtB,CAAC,CAAC,kBAAkB;iBACf,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC;iBAC3B,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACtD,CAAC,CAAC,EAAE,CAAC;QAET,MAAM,cAAc,GAAa,EAAE,CAAC;QACpC,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,CAAC,QAAQ,IAAI,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC;gBAC/C,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,cAAc,CACjB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO;gBACL,QAAQ,EAAE,cAAc;gBACxB,OAAO,EAAE,YAAY;gBACrB,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;aAC9C,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GACT,aAAa,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,MAAM,MAAM,GAAG,CACb,GAAW,EACX,MAAqC,EAC/B,EAAE;YACR,IAAI,IAAI,CAAC,CAAC;YACV,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACrD,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAElC,MAAM,OAAO,GAAG,MAAM,UAAU,CAC9B,aAAa,EACb,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EACtB,KAAK,EAAE,MAAM,EAAE,EAAE;YACf,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACtD,IAAI,QAAQ,IAAI,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;gBACrD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACxB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAC9B,OAAO,MAAM,CAAC,GAAG,CAAC;YACpB,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,EAAE;gBACzD,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI;oBAClC,MAAM,EAAE,OAAO,CAAC,MAAM;iBACvB,CAAC;aACH,CAAC,CAAC;YACH,IAAI,CAAC;gBACH,MAAM,WAAW,CAAC,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC,IAAI,EAAE;oBACxD,WAAW,EAAE,UAAU,CAAC,WAAW;oBACnC,GAAG,CAAC,UAAU,CAAC,QAAQ,KAAK,SAAS,IAAI;wBACvC,QAAQ,EAAE,UAAU,CAAC,QAAQ;qBAC9B,CAAC;oBACF,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI;wBAClC,MAAM,EAAE,OAAO,CAAC,MAAM;qBACvB,CAAC;iBACH,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBAC5B,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBACxD,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YAC/B,OAAO,MAAM,CAAC,GAAG,CAAC;QACpB,CAAC,EACD,OAAO,CACR,CAAC;QAEF,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAClC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,OAA6B,CAAC;QAClC,IAAI,YAAY,GAAuB,EAAE,CAAC;QAC1C,MAAM,QAAQ,GACZ,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvE,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,UAAU,EAAE;gBAC5D,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,IAAI;oBACvC,WAAW,EAAE,OAAO,CAAC,WAAW;iBACjC,CAAC;gBACF,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC/D,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,IAAI;oBACvC,WAAW,EAAE,OAAO,CAAC,WAAW;iBACjC,CAAC;aACH,CAAC,CAAC;YACH,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC;YAC/B,YAAY,GAAG,YAAY,CAAC,MAAM,IAAI,EAAE,CAAC;YACzC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC;QACpD,OAAO;YACL,QAAQ;YACR,OAAO,EAAE,WAAW;YACpB,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;YAChD,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;SACrC,CAAC;IACJ,CAAC;CACF","sourcesContent":["import { settleMany } from './internal/settle-many.js';\nimport { StorageClient } from './storage.client.js';\nimport { StorageError, StorageErrorCode } from './storage.error.js';\nimport { normalizeStorageName } from './storage.tokens.js';\nimport type {\n StorageBulkError,\n StorageObjectMetadata,\n StorageSyncCompare,\n StorageSyncOptions,\n StorageSyncProgress,\n StorageSyncResult,\n StorageTransferOptions,\n StorageTransferProgress,\n StorageTransferResult,\n} from './storage.types.js';\n\nconst identity = (key: string): string => key;\n\nfunction assertDifferentStores(from: string, to: string): void {\n if (from === to) {\n throw new StorageError(\n 'Cross-store transfer and sync require different source and destination stores.',\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n store: from,\n },\n );\n }\n}\n\nfunction unchanged(\n source: StorageObjectMetadata,\n destination: StorageObjectMetadata,\n compare: StorageSyncCompare,\n): boolean {\n if (typeof compare === 'function') {\n return compare(source, destination);\n }\n if (compare === 'size') {\n return source.size === destination.size;\n }\n return (\n source.size === destination.size &&\n source.etag !== undefined &&\n destination.etag !== undefined &&\n source.etag === destination.etag\n );\n}\n\nasync function walk(\n client: StorageClient,\n options: {\n prefix?: string;\n limit?: number;\n signal?: AbortSignal;\n },\n): Promise<StorageObjectMetadata[]> {\n const objects: StorageObjectMetadata[] = [];\n for await (const object of client.listAll({\n ...(options.limit !== undefined && { limit: options.limit }),\n ...(options.prefix !== undefined && { prefix: options.prefix }),\n ...(options.signal !== undefined && { signal: options.signal }),\n })) {\n objects.push(object);\n }\n return objects;\n}\n\nexport class StorageService {\n readonly #clients: ReadonlyMap<string, StorageClient>;\n\n constructor(\n clients: ReadonlyMap<string, StorageClient>,\n private readonly defaultName: string | null,\n ) {\n this.#clients = new Map(clients);\n }\n\n get names(): readonly string[] {\n return [...this.#clients.keys()].sort();\n }\n\n use(name?: string): StorageClient {\n const resolved =\n name === undefined ? this.defaultName : normalizeStorageName(name);\n\n if (resolved === null) {\n throw new StorageError(\n 'No default storage store is configured; call storage.use(name).',\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n },\n );\n }\n\n const client = this.#clients.get(resolved);\n if (client === undefined) {\n const available = this.names;\n throw new StorageError(\n available.length === 0\n ? `Storage store \"${resolved}\" is not registered.`\n : `Storage store \"${resolved}\" is not registered. Available stores: ${available.join(', ')}.`,\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n store: resolved,\n },\n );\n }\n return client;\n }\n\n async transfer(\n options: StorageTransferOptions,\n ): Promise<StorageTransferResult> {\n const fromName = normalizeStorageName(options.from);\n const toName = normalizeStorageName(options.to);\n assertDifferentStores(fromName, toName);\n const source = this.use(fromName);\n const destination = this.use(toName);\n const transformKey = options.transformKey ?? identity;\n const overwrite = options.overwrite ?? true;\n const objects = await walk(source, options);\n const total = objects.length;\n let done = 0;\n const skipped = new Set<string>();\n\n const report = (\n key: string,\n status: StorageTransferProgress['status'],\n ): void => {\n done += 1;\n options.onProgress?.({ done, key, status, total });\n };\n\n const settled = await settleMany(\n objects,\n (object) => object.key,\n async (object) => {\n const destinationKey = transformKey(object.key);\n if (\n !overwrite &&\n (await destination.exists(destinationKey, {\n ...(options.signal !== undefined && {\n signal: options.signal,\n }),\n }))\n ) {\n skipped.add(object.key);\n report(object.key, 'skipped');\n return object.key;\n }\n\n const downloaded = await source.downloadStream(object.key, {\n ...(options.signal !== undefined && {\n signal: options.signal,\n }),\n });\n try {\n await destination.upload(destinationKey, downloaded.body, {\n contentType: downloaded.contentType,\n ...(downloaded.metadata !== undefined && {\n metadata: downloaded.metadata,\n }),\n ...(options.signal !== undefined && {\n signal: options.signal,\n }),\n });\n } catch (error) {\n if (!downloaded.body.locked) {\n await downloaded.body.cancel().catch(() => undefined);\n }\n throw error;\n }\n report(object.key, 'transferred');\n return object.key;\n },\n options,\n );\n\n const transferred: string[] = [];\n const skippedKeys: string[] = [];\n for (const key of settled.results) {\n (skipped.has(key) ? skippedKeys : transferred).push(key);\n }\n\n return {\n transferred,\n ...(skippedKeys.length > 0 && { skipped: skippedKeys }),\n ...(settled.errors.length > 0 && { errors: settled.errors }),\n };\n }\n\n async sync(options: StorageSyncOptions): Promise<StorageSyncResult> {\n const fromName = normalizeStorageName(options.from);\n const toName = normalizeStorageName(options.to);\n assertDifferentStores(fromName, toName);\n const source = this.use(fromName);\n const destination = this.use(toName);\n const transformKey = options.transformKey ?? identity;\n const compare = options.compare ?? 'etag';\n const sourceObjects = await walk(source, options);\n const destinationObjects = await walk(destination, {\n ...(options.destinationPrefix !== undefined\n ? { prefix: options.destinationPrefix }\n : options.prefix !== undefined\n ? { prefix: options.prefix }\n : {}),\n ...(options.limit !== undefined && { limit: options.limit }),\n ...(options.signal !== undefined && { signal: options.signal }),\n });\n const destinationIndex = new Map(\n destinationObjects.map((object) => [object.key, object]),\n );\n const desiredDestinationKeys = new Set(\n sourceObjects.map((object) => transformKey(object.key)),\n );\n const deleteKeys =\n (options.prune ?? false)\n ? destinationObjects\n .map((object) => object.key)\n .filter((key) => !desiredDestinationKeys.has(key))\n : [];\n\n const plannedUploads: string[] = [];\n const plannedSkips: string[] = [];\n for (const object of sourceObjects) {\n const existing = destinationIndex.get(transformKey(object.key));\n (existing && unchanged(object, existing, compare)\n ? plannedSkips\n : plannedUploads\n ).push(object.key);\n }\n\n if (options.dryRun) {\n return {\n uploaded: plannedUploads,\n skipped: plannedSkips,\n ...(options.prune && { deleted: deleteKeys }),\n };\n }\n\n const total =\n sourceObjects.length + (options.prune ? deleteKeys.length : 0);\n let done = 0;\n const report = (\n key: string,\n status: StorageSyncProgress['status'],\n ): void => {\n done += 1;\n options.onProgress?.({ done, key, status, total });\n };\n const skipped = new Set<string>();\n\n const settled = await settleMany(\n sourceObjects,\n (object) => object.key,\n async (object) => {\n const destinationKey = transformKey(object.key);\n const existing = destinationIndex.get(destinationKey);\n if (existing && unchanged(object, existing, compare)) {\n skipped.add(object.key);\n report(object.key, 'skipped');\n return object.key;\n }\n const downloaded = await source.downloadStream(object.key, {\n ...(options.signal !== undefined && {\n signal: options.signal,\n }),\n });\n try {\n await destination.upload(destinationKey, downloaded.body, {\n contentType: downloaded.contentType,\n ...(downloaded.metadata !== undefined && {\n metadata: downloaded.metadata,\n }),\n ...(options.signal !== undefined && {\n signal: options.signal,\n }),\n });\n } catch (error) {\n if (!downloaded.body.locked) {\n await downloaded.body.cancel().catch(() => undefined);\n }\n throw error;\n }\n report(object.key, 'uploaded');\n return object.key;\n },\n options,\n );\n\n const uploaded: string[] = [];\n const skippedKeys: string[] = [];\n for (const key of settled.results) {\n (skipped.has(key) ? skippedKeys : uploaded).push(key);\n }\n\n let deleted: string[] | undefined;\n let deleteErrors: StorageBulkError[] = [];\n const canPrune =\n options.prune && !(options.stopOnError && settled.errors.length > 0);\n if (canPrune) {\n const deleteResult = await destination.deleteMany(deleteKeys, {\n ...(options.concurrency !== undefined && {\n concurrency: options.concurrency,\n }),\n ...(options.signal !== undefined && { signal: options.signal }),\n ...(options.stopOnError !== undefined && {\n stopOnError: options.stopOnError,\n }),\n });\n deleted = deleteResult.deleted;\n deleteErrors = deleteResult.errors ?? [];\n for (const key of deleted) {\n report(key, 'deleted');\n }\n }\n\n const errors = [...settled.errors, ...deleteErrors];\n return {\n uploaded,\n skipped: skippedKeys,\n ...(options.prune && { deleted: deleted ?? [] }),\n ...(errors.length > 0 && { errors }),\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"storage.service.js","sourceRoot":"","sources":["../src/storage.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { settleMany } from './internal/settle-many.js';\nimport { StorageClient } from './storage.client.js';\nimport { StorageError, StorageErrorCode } from './storage.error.js';\nimport { normalizeStorageName } from './storage.tokens.js';\nimport type {\n StorageBulkError,\n StorageObjectMetadata,\n StorageSyncCompare,\n StorageSyncOptions,\n StorageSyncProgress,\n StorageSyncResult,\n StorageTransferOptions,\n StorageTransferProgress,\n StorageTransferResult,\n} from './storage.types.js';\n\nconst identity = (key: string): string => key;\n\nfunction joinStorageKey(prefix: string | undefined, key: string): string {\n if (prefix === undefined || prefix.length === 0) {\n return key;\n }\n const normalizedPrefix = prefix.replace(/\\/+$/u, '');\n for (const [label, value] of [\n ['destinationPrefix', normalizedPrefix],\n ['transformed destination key', key],\n ] as const) {\n if (\n value.length === 0 ||\n value.startsWith('/') ||\n value.includes('\\\\') ||\n value.includes('\\0') ||\n value\n .split('/')\n .some(\n (segment) =>\n segment.length === 0 || segment === '.' || segment === '..',\n )\n ) {\n throw new StorageError(\n `${label} must be a canonical relative POSIX storage key.`,\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n },\n );\n }\n }\n return `${normalizedPrefix}/${key}`;\n}\n\nfunction assertDifferentStores(from: string, to: string): void {\n if (from === to) {\n throw new StorageError(\n 'Cross-store transfer and sync require different source and destination stores.',\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n store: from,\n },\n );\n }\n}\n\nfunction unchanged(\n source: StorageObjectMetadata,\n destination: StorageObjectMetadata,\n compare: StorageSyncCompare,\n): boolean {\n if (typeof compare === 'function') {\n return compare(source, destination);\n }\n if (compare === 'size') {\n return source.size === destination.size;\n }\n return (\n source.size === destination.size &&\n source.etag !== undefined &&\n destination.etag !== undefined &&\n source.etag === destination.etag\n );\n}\n\nasync function walk(\n client: StorageClient,\n options: {\n prefix?: string;\n limit?: number;\n signal?: AbortSignal;\n },\n): Promise<StorageObjectMetadata[]> {\n const objects: StorageObjectMetadata[] = [];\n for await (const object of client.listAll({\n ...(options.limit !== undefined && { limit: options.limit }),\n ...(options.prefix !== undefined && { prefix: options.prefix }),\n ...(options.signal !== undefined && { signal: options.signal }),\n })) {\n objects.push(object);\n }\n return objects;\n}\n\nexport class StorageService {\n readonly #clients: ReadonlyMap<string, StorageClient>;\n\n constructor(\n clients: ReadonlyMap<string, StorageClient>,\n private readonly defaultName: string | null,\n ) {\n this.#clients = new Map(clients);\n }\n\n get names(): readonly string[] {\n return [...this.#clients.keys()].sort();\n }\n\n use(name?: string): StorageClient {\n const resolved =\n name === undefined ? this.defaultName : normalizeStorageName(name);\n\n if (resolved === null) {\n throw new StorageError(\n 'No default storage store is configured; call storage.use(name).',\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n },\n );\n }\n\n const client = this.#clients.get(resolved);\n if (client === undefined) {\n const available = this.names;\n throw new StorageError(\n available.length === 0\n ? `Storage store \"${resolved}\" is not registered.`\n : `Storage store \"${resolved}\" is not registered. Available stores: ${available.join(', ')}.`,\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n store: resolved,\n },\n );\n }\n return client;\n }\n\n async transfer(\n options: StorageTransferOptions,\n ): Promise<StorageTransferResult> {\n const fromName = normalizeStorageName(options.from);\n const toName = normalizeStorageName(options.to);\n assertDifferentStores(fromName, toName);\n const source = this.use(fromName);\n const destination = this.use(toName);\n const transformKey = options.transformKey ?? identity;\n const overwrite = options.overwrite ?? true;\n const objects = await walk(source, options);\n const total = objects.length;\n let done = 0;\n const skipped = new Set<string>();\n\n const report = (\n key: string,\n status: StorageTransferProgress['status'],\n ): void => {\n done += 1;\n options.onProgress?.({ done, key, status, total });\n };\n\n const settled = await settleMany(\n objects,\n (object) => object.key,\n async (object) => {\n const destinationKey = transformKey(object.key);\n if (\n !overwrite &&\n (await destination.exists(destinationKey, {\n ...(options.signal !== undefined && {\n signal: options.signal,\n }),\n }))\n ) {\n skipped.add(object.key);\n report(object.key, 'skipped');\n return object.key;\n }\n\n const downloaded = await source.downloadStream(object.key, {\n ...(options.signal !== undefined && {\n signal: options.signal,\n }),\n });\n try {\n await destination.upload(destinationKey, downloaded.body, {\n contentType: downloaded.contentType,\n ...(downloaded.metadata !== undefined && {\n metadata: downloaded.metadata,\n }),\n ...(options.signal !== undefined && {\n signal: options.signal,\n }),\n });\n } catch (error) {\n if (!downloaded.body.locked) {\n await downloaded.body.cancel().catch(() => undefined);\n }\n throw error;\n }\n report(object.key, 'transferred');\n return object.key;\n },\n options,\n );\n\n const transferred: string[] = [];\n const skippedKeys: string[] = [];\n for (const key of settled.results) {\n (skipped.has(key) ? skippedKeys : transferred).push(key);\n }\n\n return {\n transferred,\n ...(skippedKeys.length > 0 && { skipped: skippedKeys }),\n ...(settled.errors.length > 0 && { errors: settled.errors }),\n };\n }\n\n async sync(options: StorageSyncOptions): Promise<StorageSyncResult> {\n const fromName = normalizeStorageName(options.from);\n const toName = normalizeStorageName(options.to);\n assertDifferentStores(fromName, toName);\n const source = this.use(fromName);\n const destination = this.use(toName);\n const transformKey = options.transformKey ?? identity;\n const destinationKeyOf = (key: string): string =>\n joinStorageKey(options.destinationPrefix, transformKey(key));\n const compare = options.compare ?? 'etag';\n const sourceObjects = await walk(source, options);\n const destinationObjects = await walk(destination, {\n ...(options.destinationPrefix !== undefined\n ? { prefix: options.destinationPrefix }\n : options.prefix !== undefined\n ? { prefix: options.prefix }\n : {}),\n ...(options.limit !== undefined && { limit: options.limit }),\n ...(options.signal !== undefined && { signal: options.signal }),\n });\n const destinationIndex = new Map(\n destinationObjects.map((object) => [object.key, object]),\n );\n const desiredDestinationKeys = new Set(\n sourceObjects.map((object) => destinationKeyOf(object.key)),\n );\n const deleteKeys =\n (options.prune ?? false)\n ? destinationObjects\n .map((object) => object.key)\n .filter((key) => !desiredDestinationKeys.has(key))\n : [];\n\n const plannedUploads: string[] = [];\n const plannedSkips: string[] = [];\n for (const object of sourceObjects) {\n const existing = destinationIndex.get(destinationKeyOf(object.key));\n (existing && unchanged(object, existing, compare)\n ? plannedSkips\n : plannedUploads\n ).push(object.key);\n }\n\n if (options.dryRun) {\n return {\n uploaded: plannedUploads,\n skipped: plannedSkips,\n ...(options.prune && { deleted: deleteKeys }),\n };\n }\n\n const total =\n sourceObjects.length + (options.prune ? deleteKeys.length : 0);\n let done = 0;\n const report = (\n key: string,\n status: StorageSyncProgress['status'],\n ): void => {\n done += 1;\n options.onProgress?.({ done, key, status, total });\n };\n const skipped = new Set<string>();\n\n const settled = await settleMany(\n sourceObjects,\n (object) => object.key,\n async (object) => {\n const destinationKey = destinationKeyOf(object.key);\n const existing = destinationIndex.get(destinationKey);\n if (existing && unchanged(object, existing, compare)) {\n skipped.add(object.key);\n report(object.key, 'skipped');\n return object.key;\n }\n const downloaded = await source.downloadStream(object.key, {\n ...(options.signal !== undefined && {\n signal: options.signal,\n }),\n });\n try {\n await destination.upload(destinationKey, downloaded.body, {\n contentType: downloaded.contentType,\n ...(downloaded.metadata !== undefined && {\n metadata: downloaded.metadata,\n }),\n ...(options.signal !== undefined && {\n signal: options.signal,\n }),\n });\n } catch (error) {\n if (!downloaded.body.locked) {\n await downloaded.body.cancel().catch(() => undefined);\n }\n throw error;\n }\n report(object.key, 'uploaded');\n return object.key;\n },\n options,\n );\n\n const uploaded: string[] = [];\n const skippedKeys: string[] = [];\n for (const key of settled.results) {\n (skipped.has(key) ? skippedKeys : uploaded).push(key);\n }\n\n let deleted: string[] | undefined;\n let deleteErrors: StorageBulkError[] = [];\n const canPrune =\n options.prune && !(options.stopOnError && settled.errors.length > 0);\n if (canPrune) {\n const deleteResult = await destination.deleteMany(deleteKeys, {\n ...(options.concurrency !== undefined && {\n concurrency: options.concurrency,\n }),\n ...(options.signal !== undefined && { signal: options.signal }),\n ...(options.stopOnError !== undefined && {\n stopOnError: options.stopOnError,\n }),\n });\n deleted = deleteResult.deleted;\n deleteErrors = deleteResult.errors ?? [];\n for (const key of deleted) {\n report(key, 'deleted');\n }\n }\n\n const errors = [...settled.errors, ...deleteErrors];\n return {\n uploaded,\n skipped: skippedKeys,\n ...(options.prune && { deleted: deleted ?? [] }),\n ...(errors.length > 0 && { errors }),\n };\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.tokens.js","sourceRoot":"","sources":["../src/storage.tokens.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAS,CAAC;AAE9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;AAE9E,MAAM,UAAU,oBAAoB,CAClC,
|
|
1
|
+
{"version":3,"file":"storage.tokens.js","sourceRoot":"","sources":["../src/storage.tokens.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAS,CAAC;AAE9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;AAE9E,MAAM,UAAU,oBAAoB,CAClC,IAAI,GAAW,oBAAoB;IAEnC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAC1E,MAAM,IAAI,SAAS,CACjB,uFAAuF,CACxF,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAI,GAAW,oBAAoB;IACjE,OAAO,MAAM,CAAC,GAAG,CAAC,wBAAwB,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC","sourcesContent":["export const DEFAULT_STORAGE_NAME = 'default';\n\nexport const STORAGE_DEFAULT_NAME = Symbol.for('@nestm/storage/default-name');\n\nexport function normalizeStorageName(\n name: string = DEFAULT_STORAGE_NAME,\n): string {\n if (typeof name !== 'string' || name.length === 0 || name.trim() !== name) {\n throw new TypeError(\n 'Storage store names must be non-empty strings without leading or trailing whitespace.',\n );\n }\n return name;\n}\n\nexport function getStorageToken(name: string = DEFAULT_STORAGE_NAME): symbol {\n return Symbol.for(`@nestm/storage/store/${normalizeStorageName(name)}`);\n}\n\nexport const STORAGE = getStorageToken();\n"]}
|