@nestm/storage 0.1.0-alpha.1 → 0.1.0-alpha.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/CHANGELOG.md +271 -0
  2. package/README.md +877 -25
  3. package/SECURITY.md +128 -0
  4. package/dist/ai-sdk/ai-sdk-file-workflow-tools.d.ts +37 -0
  5. package/dist/ai-sdk/ai-sdk-file-workflow-tools.d.ts.map +1 -0
  6. package/dist/ai-sdk/ai-sdk-file-workflow-tools.js +258 -0
  7. package/dist/ai-sdk/ai-sdk-file-workflow-tools.js.map +1 -0
  8. package/dist/ai-sdk/ai-sdk-workspace-tools.d.ts +91 -0
  9. package/dist/ai-sdk/ai-sdk-workspace-tools.d.ts.map +1 -0
  10. package/dist/ai-sdk/ai-sdk-workspace-tools.js +491 -0
  11. package/dist/ai-sdk/ai-sdk-workspace-tools.js.map +1 -0
  12. package/dist/ai-sdk/index.d.ts +3 -0
  13. package/dist/ai-sdk/index.d.ts.map +1 -0
  14. package/dist/ai-sdk/index.js +3 -0
  15. package/dist/ai-sdk/index.js.map +1 -0
  16. package/dist/bytes/index.d.ts +30 -0
  17. package/dist/bytes/index.d.ts.map +1 -0
  18. package/dist/bytes/index.js +96 -0
  19. package/dist/bytes/index.js.map +1 -0
  20. package/dist/core/index.d.ts +9 -0
  21. package/dist/core/index.d.ts.map +1 -0
  22. package/dist/core/index.js +7 -0
  23. package/dist/core/index.js.map +1 -0
  24. package/dist/core/storage-staged-content.d.ts +37 -0
  25. package/dist/core/storage-staged-content.d.ts.map +1 -0
  26. package/dist/core/storage-staged-content.js +94 -0
  27. package/dist/core/storage-staged-content.js.map +1 -0
  28. package/dist/core/storage-streams.d.ts +19 -0
  29. package/dist/core/storage-streams.d.ts.map +1 -0
  30. package/dist/core/storage-streams.js +95 -0
  31. package/dist/core/storage-streams.js.map +1 -0
  32. package/dist/core/storage-text.d.ts +33 -0
  33. package/dist/core/storage-text.d.ts.map +1 -0
  34. package/dist/core/storage-text.js +98 -0
  35. package/dist/core/storage-text.js.map +1 -0
  36. package/dist/files-sdk/files-sdk.driver.d.ts +85 -3
  37. package/dist/files-sdk/files-sdk.driver.d.ts.map +1 -1
  38. package/dist/files-sdk/files-sdk.driver.js +1437 -37
  39. package/dist/files-sdk/files-sdk.driver.js.map +1 -1
  40. package/dist/files-sdk/fs/index.d.ts +42 -0
  41. package/dist/files-sdk/fs/index.d.ts.map +1 -0
  42. package/dist/files-sdk/fs/index.js +1117 -0
  43. package/dist/files-sdk/fs/index.js.map +1 -0
  44. package/dist/files-sdk/index.d.ts +1 -1
  45. package/dist/files-sdk/index.d.ts.map +1 -1
  46. package/dist/files-sdk/index.js.map +1 -1
  47. package/dist/files-sdk/memory.d.ts +7 -0
  48. package/dist/files-sdk/memory.d.ts.map +1 -0
  49. package/dist/files-sdk/memory.js +72 -0
  50. package/dist/files-sdk/memory.js.map +1 -0
  51. package/dist/files-sdk/provider/index.d.ts +58 -0
  52. package/dist/files-sdk/provider/index.d.ts.map +1 -0
  53. package/dist/files-sdk/provider/index.js +151 -0
  54. package/dist/files-sdk/provider/index.js.map +1 -0
  55. package/dist/files-sdk/s3/construction-metadata.d.ts +9 -0
  56. package/dist/files-sdk/s3/construction-metadata.d.ts.map +1 -0
  57. package/dist/files-sdk/s3/construction-metadata.js +24 -0
  58. package/dist/files-sdk/s3/construction-metadata.js.map +1 -0
  59. package/dist/files-sdk/s3/index.d.ts +54 -0
  60. package/dist/files-sdk/s3/index.d.ts.map +1 -0
  61. package/dist/files-sdk/s3/index.js +1505 -0
  62. package/dist/files-sdk/s3/index.js.map +1 -0
  63. package/dist/gateway/index.d.ts +1 -1
  64. package/dist/gateway/index.d.ts.map +1 -1
  65. package/dist/gateway/index.js.map +1 -1
  66. package/dist/gateway/storage-gateway-fastify-parser.d.ts.map +1 -1
  67. package/dist/gateway/storage-gateway-fastify-parser.js.map +1 -1
  68. package/dist/gateway/storage-gateway.controller.d.ts +12 -11
  69. package/dist/gateway/storage-gateway.controller.d.ts.map +1 -1
  70. package/dist/gateway/storage-gateway.controller.js +240 -70
  71. package/dist/gateway/storage-gateway.controller.js.map +1 -1
  72. package/dist/gateway/storage-gateway.guard.d.ts.map +1 -1
  73. package/dist/gateway/storage-gateway.guard.js.map +1 -1
  74. package/dist/gateway/storage-gateway.module.d.ts.map +1 -1
  75. package/dist/gateway/storage-gateway.module.js +60 -1
  76. package/dist/gateway/storage-gateway.module.js.map +1 -1
  77. package/dist/gateway/storage-gateway.tokens.d.ts +1 -0
  78. package/dist/gateway/storage-gateway.tokens.d.ts.map +1 -1
  79. package/dist/gateway/storage-gateway.tokens.js +1 -0
  80. package/dist/gateway/storage-gateway.tokens.js.map +1 -1
  81. package/dist/gateway/storage-gateway.types.d.ts +53 -10
  82. package/dist/gateway/storage-gateway.types.d.ts.map +1 -1
  83. package/dist/gateway/storage-gateway.types.js.map +1 -1
  84. package/dist/index.d.ts +1 -5
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +1 -3
  87. package/dist/index.js.map +1 -1
  88. package/dist/inject-storage.decorator.js.map +1 -1
  89. package/dist/storage-etag.d.ts +13 -0
  90. package/dist/storage-etag.d.ts.map +1 -0
  91. package/dist/storage-etag.js +31 -0
  92. package/dist/storage-etag.js.map +1 -0
  93. package/dist/storage-upload-control.d.ts.map +1 -1
  94. package/dist/storage.client.d.ts +15 -3
  95. package/dist/storage.client.d.ts.map +1 -1
  96. package/dist/storage.client.js +204 -2
  97. package/dist/storage.client.js.map +1 -1
  98. package/dist/storage.driver.d.ts +28 -1
  99. package/dist/storage.driver.d.ts.map +1 -1
  100. package/dist/storage.driver.js.map +1 -1
  101. package/dist/storage.error.d.ts +17 -10
  102. package/dist/storage.error.d.ts.map +1 -1
  103. package/dist/storage.error.js +47 -1
  104. package/dist/storage.error.js.map +1 -1
  105. package/dist/storage.module.d.ts.map +1 -1
  106. package/dist/storage.module.js.map +1 -1
  107. package/dist/storage.service.d.ts.map +1 -1
  108. package/dist/storage.service.js +28 -3
  109. package/dist/storage.service.js.map +1 -1
  110. package/dist/storage.tokens.js.map +1 -1
  111. package/dist/storage.types.d.ts +150 -1
  112. package/dist/storage.types.d.ts.map +1 -1
  113. package/dist/storage.types.js.map +1 -1
  114. package/dist/testing/index.d.ts +1 -0
  115. package/dist/testing/index.d.ts.map +1 -1
  116. package/dist/testing/index.js +3 -1
  117. package/dist/testing/index.js.map +1 -1
  118. package/dist/testing/provider-conformance.d.ts +65 -0
  119. package/dist/testing/provider-conformance.d.ts.map +1 -0
  120. package/dist/testing/provider-conformance.js +869 -0
  121. package/dist/testing/provider-conformance.js.map +1 -0
  122. package/dist/workspace/index.d.ts +10 -0
  123. package/dist/workspace/index.d.ts.map +1 -0
  124. package/dist/workspace/index.js +8 -0
  125. package/dist/workspace/index.js.map +1 -0
  126. package/dist/workspace/storage-file-catalog.types.d.ts +65 -0
  127. package/dist/workspace/storage-file-catalog.types.d.ts.map +1 -0
  128. package/dist/workspace/storage-file-catalog.types.js +2 -0
  129. package/dist/workspace/storage-file-catalog.types.js.map +1 -0
  130. package/dist/workspace/storage-file-workflow.d.ts +7 -0
  131. package/dist/workspace/storage-file-workflow.d.ts.map +1 -0
  132. package/dist/workspace/storage-file-workflow.js +440 -0
  133. package/dist/workspace/storage-file-workflow.js.map +1 -0
  134. package/dist/workspace/storage-file-workflow.protection.d.ts +31 -0
  135. package/dist/workspace/storage-file-workflow.protection.d.ts.map +1 -0
  136. package/dist/workspace/storage-file-workflow.protection.js +258 -0
  137. package/dist/workspace/storage-file-workflow.protection.js.map +1 -0
  138. package/dist/workspace/storage-file-workflow.types.d.ts +128 -0
  139. package/dist/workspace/storage-file-workflow.types.d.ts.map +1 -0
  140. package/dist/workspace/storage-file-workflow.types.js +8 -0
  141. package/dist/workspace/storage-file-workflow.types.js.map +1 -0
  142. package/dist/workspace/storage-workspace.cursor.d.ts +71 -0
  143. package/dist/workspace/storage-workspace.cursor.d.ts.map +1 -0
  144. package/dist/workspace/storage-workspace.cursor.js +408 -0
  145. package/dist/workspace/storage-workspace.cursor.js.map +1 -0
  146. package/dist/workspace/storage-workspace.d.ts +6 -0
  147. package/dist/workspace/storage-workspace.d.ts.map +1 -0
  148. package/dist/workspace/storage-workspace.error.d.ts +32 -0
  149. package/dist/workspace/storage-workspace.error.d.ts.map +1 -0
  150. package/dist/workspace/storage-workspace.error.js +75 -0
  151. package/dist/workspace/storage-workspace.error.js.map +1 -0
  152. package/dist/workspace/storage-workspace.js +849 -0
  153. package/dist/workspace/storage-workspace.js.map +1 -0
  154. package/dist/workspace/storage-workspace.path.d.ts +9 -0
  155. package/dist/workspace/storage-workspace.path.d.ts.map +1 -0
  156. package/dist/workspace/storage-workspace.path.js +68 -0
  157. package/dist/workspace/storage-workspace.path.js.map +1 -0
  158. package/dist/workspace/storage-workspace.types.d.ts +123 -0
  159. package/dist/workspace/storage-workspace.types.d.ts.map +1 -0
  160. package/dist/workspace/storage-workspace.types.js +22 -0
  161. package/dist/workspace/storage-workspace.types.js.map +1 -0
  162. package/package.json +94 -20
@@ -1 +1 @@
1
- {"version":3,"file":"storage.client.js","sourceRoot":"","sources":["../src/storage.client.ts"],"names":[],"mappings":"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","sourcesContent":["import type { OnApplicationShutdown } from '@nestjs/common';\n\nimport { settleMany } from './internal/settle-many.js';\nimport {\n StorageError,\n StorageErrorCode,\n normalizeStorageError,\n} from './storage.error.js';\nimport type { StorageDriver } from './storage.driver.js';\nimport type {\n StorageBody,\n StorageBufferedDownloadOptions,\n StorageBulkOptions,\n StorageCapabilities,\n StorageDeleteManyResult,\n StorageDownloadManyResult,\n StorageDownloadOptions,\n StorageExistsManyResult,\n StorageHeadManyResult,\n StorageListOptions,\n StorageListResult,\n StorageObject,\n StorageObjectMetadata,\n StorageOperationContext,\n StorageOperationOptions,\n StoragePlugin,\n StorageSearchOptions,\n StorageSignedDownloadOptions,\n StorageSignedUpload,\n StorageSignedUploadOptions,\n StorageUploadManyItem,\n StorageUploadManyOptions,\n StorageUploadManyResult,\n StorageUploadOptions,\n StorageUploadResult,\n} from './storage.types.js';\n\nexport const DEFAULT_BUFFER_LIMIT = 10 * 1024 * 1024;\n\ntype BulkOperationOptions = StorageBulkOptions & StorageOperationOptions;\ntype DownloadManyOptions = StorageBulkOptions & StorageDownloadOptions;\n\nfunction assertKey(key: string, label = 'key'): void {\n if (typeof key !== 'string' || key.length === 0) {\n throw new StorageError(`${label} must be a non-empty string.`, {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n });\n }\n}\n\nfunction invalidArgument(message: string): never {\n throw new StorageError(message, {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n });\n}\n\nfunction assertPositiveSafeInteger(\n value: number | undefined,\n label: string,\n): void {\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {\n invalidArgument(`${label} must be a positive safe integer.`);\n }\n}\n\nfunction assertDownloadOptions(options?: StorageDownloadOptions): void {\n const range = options?.range;\n if (range === undefined) {\n return;\n }\n if (!Number.isSafeInteger(range.start) || range.start < 0) {\n invalidArgument('range.start must be a non-negative safe integer.');\n }\n if (\n range.end !== undefined &&\n (!Number.isSafeInteger(range.end) || range.end < range.start)\n ) {\n invalidArgument(\n 'range.end must be a safe integer greater than or equal to range.start.',\n );\n }\n}\n\nfunction assertListOptions(options?: StorageListOptions): void {\n if (options?.delimiter !== undefined && options.delimiter.length === 0) {\n invalidArgument('delimiter must be a non-empty string.');\n }\n assertPositiveSafeInteger(options?.limit, 'limit');\n}\n\nfunction assertSearchOptions(options?: StorageSearchOptions): void {\n assertPositiveSafeInteger(options?.limit, 'limit');\n assertPositiveSafeInteger(options?.maxResults, 'maxResults');\n}\n\nfunction assertSignedUploadOptions(options: StorageSignedUploadOptions): void {\n assertPositiveSafeInteger(options.expiresIn, 'expiresIn');\n assertPositiveSafeInteger(options.maxSize, 'maxSize');\n if (\n options.minSize !== undefined &&\n (!Number.isSafeInteger(options.minSize) || options.minSize < 0)\n ) {\n invalidArgument('minSize must be a non-negative safe integer.');\n }\n if (\n options.minSize !== undefined &&\n options.maxSize !== undefined &&\n options.minSize > options.maxSize\n ) {\n invalidArgument('minSize cannot be greater than maxSize.');\n }\n}\n\nfunction operationOptions(\n options?: BulkOperationOptions,\n): StorageOperationOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return {\n ...(options.retries !== undefined && { retries: options.retries }),\n ...(options.signal !== undefined && { signal: options.signal }),\n ...(options.timeout !== undefined && { timeout: options.timeout }),\n };\n}\n\nfunction downloadOptions(\n options?: DownloadManyOptions,\n): StorageDownloadOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return {\n ...operationOptions(options),\n ...(options.range !== undefined && { range: options.range }),\n };\n}\n\nasync function collectBody(\n object: StorageObject,\n maxBytes: number,\n): Promise<Uint8Array> {\n if (maxBytes !== Infinity && (!Number.isFinite(maxBytes) || maxBytes < 0)) {\n await object.body.cancel().catch(() => undefined);\n throw new StorageError(\n 'maxBytes must be a non-negative finite number or Infinity.',\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n key: object.key,\n permanent: true,\n },\n );\n }\n\n if (maxBytes !== Infinity && object.size > maxBytes) {\n await object.body.cancel().catch(() => undefined);\n throw new StorageError(\n `Object \"${object.key}\" is ${object.size} bytes, exceeding the ${maxBytes}-byte buffer limit.`,\n {\n code: StorageErrorCode.LIMIT_EXCEEDED,\n key: object.key,\n permanent: true,\n },\n );\n }\n\n const chunks: Uint8Array[] = [];\n let total = 0;\n const reader = object.body.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n total += value.byteLength;\n if (maxBytes !== Infinity && total > maxBytes) {\n await reader.cancel().catch(() => undefined);\n throw new StorageError(\n `Object \"${object.key}\" exceeded the ${maxBytes}-byte buffer limit while downloading.`,\n {\n code: StorageErrorCode.LIMIT_EXCEEDED,\n key: object.key,\n permanent: true,\n },\n );\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n\n const bytes = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n}\n\nexport interface StorageFileHandle {\n readonly key: string;\n upload(\n body: StorageBody,\n options?: StorageUploadOptions,\n ): Promise<StorageUploadResult>;\n download(options?: StorageDownloadOptions): Promise<StorageObject>;\n bytes(options?: StorageBufferedDownloadOptions): Promise<Uint8Array>;\n text(options?: StorageBufferedDownloadOptions): Promise<string>;\n head(options?: StorageOperationOptions): Promise<StorageObjectMetadata>;\n exists(options?: StorageOperationOptions): Promise<boolean>;\n delete(options?: StorageOperationOptions): Promise<void>;\n signDownload(options?: StorageSignedDownloadOptions): Promise<string>;\n signUpload(options: StorageSignedUploadOptions): Promise<StorageSignedUpload>;\n copyTo(\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void>;\n moveTo(\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void>;\n}\n\nexport class StorageClient implements OnApplicationShutdown {\n readonly #driver: StorageDriver;\n readonly #plugins: readonly StoragePlugin[];\n #closed = false;\n\n constructor(\n readonly name: string,\n driver: StorageDriver,\n plugins: readonly StoragePlugin[] = [],\n ) {\n assertKey(name, 'store name');\n this.#driver = driver;\n this.#plugins = [...plugins];\n }\n\n get driverName(): string {\n return this.#driver.name;\n }\n\n get capabilities(): Readonly<StorageCapabilities> {\n return this.#driver.capabilities;\n }\n\n file(key: string): StorageFileHandle {\n assertKey(key);\n return {\n copyTo: (destinationKey, options) =>\n this.copy(key, destinationKey, options),\n delete: (options) => this.delete(key, options),\n download: (options) => this.downloadStream(key, options),\n exists: (options) => this.exists(key, options),\n head: (options) => this.head(key, options),\n key,\n moveTo: (destinationKey, options) =>\n this.move(key, destinationKey, options),\n signDownload: (options) => this.signDownload(key, options),\n signUpload: (options) => this.signUpload(key, options),\n bytes: (options) => this.downloadBytes(key, options),\n text: (options) => this.downloadText(key, options),\n upload: (body, options) => this.upload(key, body, options),\n };\n }\n\n upload(\n key: string,\n body: StorageBody,\n options?: StorageUploadOptions,\n ): Promise<StorageUploadResult> {\n assertKey(key);\n return this.#execute({ key, operation: 'upload', store: this.name }, () =>\n this.#driver.upload(key, body, options),\n );\n }\n\n downloadStream(\n key: string,\n options?: StorageDownloadOptions,\n ): Promise<StorageObject> {\n assertKey(key);\n assertDownloadOptions(options);\n return this.#execute({ key, operation: 'download', store: this.name }, () =>\n this.#driver.download(key, options),\n );\n }\n\n async downloadBytes(\n key: string,\n options?: StorageBufferedDownloadOptions,\n ): Promise<Uint8Array> {\n const { maxBytes = DEFAULT_BUFFER_LIMIT, ...download } = options ?? {};\n const object = await this.downloadStream(key, download);\n return collectBody(object, maxBytes);\n }\n\n async downloadText(\n key: string,\n options?: StorageBufferedDownloadOptions,\n ): Promise<string> {\n return new TextDecoder().decode(await this.downloadBytes(key, options));\n }\n\n async downloadJson<Result = unknown>(\n key: string,\n options?: StorageBufferedDownloadOptions,\n ): Promise<Result> {\n const text = await this.downloadText(key, options);\n try {\n return JSON.parse(text) as Result;\n } catch (error) {\n throw new StorageError(`Object \"${key}\" does not contain valid JSON.`, {\n cause: error,\n code: StorageErrorCode.INVALID_ARGUMENT,\n key,\n operation: 'download',\n permanent: true,\n store: this.name,\n });\n }\n }\n\n head(\n key: string,\n options?: StorageOperationOptions,\n ): Promise<StorageObjectMetadata> {\n assertKey(key);\n return this.#execute({ key, operation: 'head', store: this.name }, () =>\n this.#driver.head(key, options),\n );\n }\n\n exists(key: string, options?: StorageOperationOptions): Promise<boolean> {\n assertKey(key);\n return this.#execute({ key, operation: 'exists', store: this.name }, () =>\n this.#driver.exists(key, options),\n );\n }\n\n delete(key: string, options?: StorageOperationOptions): Promise<void> {\n assertKey(key);\n return this.#execute({ key, operation: 'delete', store: this.name }, () =>\n this.#driver.delete(key, options),\n );\n }\n\n copy(\n sourceKey: string,\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void> {\n assertKey(sourceKey, 'source key');\n assertKey(destinationKey, 'destination key');\n return this.#execute(\n {\n from: sourceKey,\n operation: 'copy',\n store: this.name,\n to: destinationKey,\n },\n () => this.#driver.copy(sourceKey, destinationKey, options),\n );\n }\n\n move(\n sourceKey: string,\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void> {\n assertKey(sourceKey, 'source key');\n assertKey(destinationKey, 'destination key');\n return this.#execute(\n {\n from: sourceKey,\n operation: 'move',\n store: this.name,\n to: destinationKey,\n },\n () => this.#driver.move(sourceKey, destinationKey, options),\n );\n }\n\n list(options?: StorageListOptions): Promise<StorageListResult> {\n assertListOptions(options);\n return this.#execute({ operation: 'list', store: this.name }, () =>\n this.#driver.list(options),\n );\n }\n\n async *listAll(\n options?: StorageListOptions,\n ): AsyncGenerator<StorageObjectMetadata, void> {\n const { delimiter: _delimiter, ...walkOptions } = options ?? {};\n void _delimiter;\n let cursor = walkOptions.cursor;\n const seen = new Set<string>();\n\n do {\n const page = await this.list({\n ...walkOptions,\n ...(cursor !== undefined && { cursor }),\n });\n yield* page.items;\n cursor = page.cursor;\n if (cursor !== undefined) {\n if (seen.has(cursor)) {\n throw new StorageError(\n `Store \"${this.name}\" returned a repeated pagination cursor.`,\n {\n code: StorageErrorCode.PROVIDER,\n operation: 'list',\n permanent: true,\n store: this.name,\n },\n );\n }\n seen.add(cursor);\n }\n } while (cursor !== undefined);\n }\n\n search(\n pattern: string | RegExp,\n options?: StorageSearchOptions,\n ): AsyncIterable<StorageObjectMetadata> {\n assertSearchOptions(options);\n return this.#search(pattern, options);\n }\n\n async *#search(\n pattern: string | RegExp,\n options?: StorageSearchOptions,\n ): AsyncGenerator<StorageObjectMetadata, void> {\n const context: StorageOperationContext = {\n operation: 'search',\n store: this.name,\n };\n try {\n for (const plugin of this.#plugins) {\n await plugin.beforeOperation?.(context);\n }\n for await (const object of this.#driver.search(pattern, options)) {\n yield object;\n }\n for (const plugin of this.#plugins) {\n await plugin.afterOperation?.(context, undefined);\n }\n } catch (error) {\n const normalized = normalizeStorageError(error, {\n operation: 'search',\n store: this.name,\n });\n for (const plugin of this.#plugins) {\n try {\n await plugin.onError?.(context, normalized);\n } catch {\n // Preserve the original storage error.\n }\n }\n throw normalized;\n }\n }\n\n signDownload(\n key: string,\n options?: StorageSignedDownloadOptions,\n ): Promise<string> {\n assertKey(key);\n return this.#execute(\n { key, operation: 'signDownload', store: this.name },\n () => this.#driver.signDownload(key, options),\n );\n }\n\n signUpload(\n key: string,\n options: StorageSignedUploadOptions,\n ): Promise<StorageSignedUpload> {\n assertKey(key);\n assertSignedUploadOptions(options);\n return this.#execute(\n { key, operation: 'signUpload', store: this.name },\n () => this.#driver.signUpload(key, options),\n );\n }\n\n async uploadMany(\n items: readonly StorageUploadManyItem[],\n options?: StorageUploadManyOptions,\n ): Promise<StorageUploadManyResult> {\n const settled = await settleMany(\n items,\n (item) => item.key,\n (item) =>\n this.upload(item.key, item.body, {\n ...operationOptions(options),\n ...(item.cacheControl !== undefined && {\n cacheControl: item.cacheControl,\n }),\n ...(item.contentType !== undefined && {\n contentType: item.contentType,\n }),\n ...(item.metadata !== undefined && { metadata: item.metadata }),\n ...(item.multipart !== undefined && {\n multipart: item.multipart,\n }),\n ...(options?.onProgress !== undefined && {\n onProgress: (progress) =>\n options.onProgress?.({ ...progress, key: item.key }),\n }),\n }),\n options,\n );\n\n return {\n uploaded: settled.results,\n ...(settled.errors.length > 0 && { errors: settled.errors }),\n };\n }\n\n async downloadMany(\n keys: readonly string[],\n options?: DownloadManyOptions,\n ): Promise<StorageDownloadManyResult> {\n const settled = await settleMany(\n keys,\n (key) => key,\n (key) => this.downloadStream(key, downloadOptions(options)),\n options,\n );\n return {\n downloaded: settled.results,\n ...(settled.errors.length > 0 && { errors: settled.errors }),\n };\n }\n\n async headMany(\n keys: readonly string[],\n options?: BulkOperationOptions,\n ): Promise<StorageHeadManyResult> {\n const settled = await settleMany(\n keys,\n (key) => key,\n (key) => this.head(key, operationOptions(options)),\n options,\n );\n return {\n objects: settled.results,\n ...(settled.errors.length > 0 && { errors: settled.errors }),\n };\n }\n\n async existsMany(\n keys: readonly string[],\n options?: BulkOperationOptions,\n ): Promise<StorageExistsManyResult> {\n const settled = await settleMany(\n keys,\n (key) => key,\n async (key) => ({ exists: await this.exists(key, options), key }),\n options,\n );\n const existing: string[] = [];\n const missing: string[] = [];\n for (const result of settled.results) {\n (result.exists ? existing : missing).push(result.key);\n }\n return {\n existing,\n missing,\n ...(settled.errors.length > 0 && { errors: settled.errors }),\n };\n }\n\n async deleteMany(\n keys: readonly string[],\n options?: BulkOperationOptions,\n ): Promise<StorageDeleteManyResult> {\n const settled = await settleMany(\n keys,\n (key) => key,\n async (key) => {\n await this.delete(key, operationOptions(options));\n return key;\n },\n options,\n );\n return {\n deleted: settled.results,\n ...(settled.errors.length > 0 && { errors: settled.errors }),\n };\n }\n\n async onApplicationShutdown(): Promise<void> {\n if (this.#closed) {\n return;\n }\n this.#closed = true;\n await this.#driver.close?.();\n }\n\n async #execute<Result>(\n context: StorageOperationContext,\n operation: () => Promise<Result>,\n ): Promise<Result> {\n try {\n for (const plugin of this.#plugins) {\n await plugin.beforeOperation?.(context);\n }\n const result = await operation();\n for (const plugin of this.#plugins) {\n await plugin.afterOperation?.(context, result);\n }\n return result;\n } catch (error) {\n const normalized = normalizeStorageError(error, {\n ...(context.key !== undefined && { key: context.key }),\n operation: context.operation,\n store: this.name,\n });\n for (const plugin of this.#plugins) {\n try {\n await plugin.onError?.(context, normalized);\n } catch {\n // Preserve the original storage error.\n }\n }\n throw normalized;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"storage.client.js","sourceRoot":"","sources":["../src/storage.client.ts"],"names":[],"mappings":"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","sourcesContent":["import { settleMany } from './internal/settle-many.js';\nimport { isCanonicalStorageEtag } from './storage-etag.js';\nimport {\n StorageError,\n StorageErrorCode,\n normalizeStorageError,\n} from './storage.error.js';\nimport type { StorageDriver } from './storage.driver.js';\nimport type {\n StorageBody,\n StorageBufferedDownloadOptions,\n StorageBulkOptions,\n StorageCapabilities,\n StorageConditionalDeleteOptions,\n StorageConditionalReadOptions,\n StorageConditionalUploadOptions,\n StorageDeleteManyResult,\n StorageDownloadManyResult,\n StorageDownloadOptions,\n StorageExistsManyResult,\n StorageHeadManyResult,\n StorageListOptions,\n StorageListResult,\n StorageObject,\n StorageObjectMetadata,\n StorageOperationContext,\n StorageOperationOptions,\n StoragePlugin,\n StoragePromotionOptions,\n StorageSearchOptions,\n StorageSignedDownloadOptions,\n StorageSignedUpload,\n StorageSignedUploadOptions,\n StorageUploadManyItem,\n StorageUploadManyOptions,\n StorageUploadManyResult,\n StorageUploadOptions,\n StorageUploadResult,\n} from './storage.types.js';\n\nexport const DEFAULT_BUFFER_LIMIT = 10 * 1024 * 1024;\n\ntype BulkOperationOptions = StorageBulkOptions & StorageOperationOptions;\ntype DownloadManyOptions = StorageBulkOptions & StorageDownloadOptions;\n\ninterface AppliedMutationSettlement {\n readonly appliedEtag?: string;\n}\n\nfunction assertKey(key: string, label = 'key'): void {\n if (typeof key !== 'string' || key.length === 0) {\n throw new StorageError(`${label} must be a non-empty string.`, {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n });\n }\n}\n\nfunction invalidArgument(message: string): never {\n throw new StorageError(message, {\n code: StorageErrorCode.INVALID_ARGUMENT,\n permanent: true,\n });\n}\n\nfunction assertPositiveSafeInteger(\n value: number | undefined,\n label: string,\n): void {\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {\n invalidArgument(`${label} must be a positive safe integer.`);\n }\n}\n\nfunction assertDownloadOptions(options?: StorageDownloadOptions): void {\n const range = options?.range;\n if (range === undefined) {\n return;\n }\n if (!Number.isSafeInteger(range.start) || range.start < 0) {\n invalidArgument('range.start must be a non-negative safe integer.');\n }\n if (\n range.end !== undefined &&\n (!Number.isSafeInteger(range.end) || range.end < range.start)\n ) {\n invalidArgument(\n 'range.end must be a safe integer greater than or equal to range.start.',\n );\n }\n}\n\nfunction assertListOptions(options?: StorageListOptions): void {\n if (options?.delimiter !== undefined && options.delimiter.length === 0) {\n invalidArgument('delimiter must be a non-empty string.');\n }\n assertPositiveSafeInteger(options?.limit, 'limit');\n}\n\nfunction assertSearchOptions(options?: StorageSearchOptions): void {\n assertPositiveSafeInteger(options?.limit, 'limit');\n assertPositiveSafeInteger(options?.maxResults, 'maxResults');\n}\n\nfunction assertSignedUploadOptions(options: StorageSignedUploadOptions): void {\n assertPositiveSafeInteger(options.expiresIn, 'expiresIn');\n assertPositiveSafeInteger(options.maxSize, 'maxSize');\n if (\n options.minSize !== undefined &&\n (!Number.isSafeInteger(options.minSize) || options.minSize < 0)\n ) {\n invalidArgument('minSize must be a non-negative safe integer.');\n }\n if (\n options.minSize !== undefined &&\n options.maxSize !== undefined &&\n options.minSize > options.maxSize\n ) {\n invalidArgument('minSize cannot be greater than maxSize.');\n }\n}\n\nfunction operationOptions(\n options?: BulkOperationOptions,\n): StorageOperationOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return {\n ...(options.retries !== undefined && { retries: options.retries }),\n ...(options.signal !== undefined && { signal: options.signal }),\n ...(options.timeout !== undefined && { timeout: options.timeout }),\n };\n}\n\nfunction downloadOptions(\n options?: DownloadManyOptions,\n): StorageDownloadOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return {\n ...operationOptions(options),\n ...(options.range !== undefined && { range: options.range }),\n };\n}\n\nasync function collectBody(\n object: StorageObject,\n maxBytes: number,\n): Promise<Uint8Array> {\n if (maxBytes !== Infinity && (!Number.isFinite(maxBytes) || maxBytes < 0)) {\n await object.body.cancel().catch(() => undefined);\n throw new StorageError(\n 'maxBytes must be a non-negative finite number or Infinity.',\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n key: object.key,\n permanent: true,\n },\n );\n }\n\n if (maxBytes !== Infinity && object.size > maxBytes) {\n await object.body.cancel().catch(() => undefined);\n throw new StorageError(\n `Object \"${object.key}\" is ${object.size} bytes, exceeding the ${maxBytes}-byte buffer limit.`,\n {\n code: StorageErrorCode.LIMIT_EXCEEDED,\n key: object.key,\n permanent: true,\n },\n );\n }\n\n const chunks: Uint8Array[] = [];\n let total = 0;\n const reader = object.body.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n total += value.byteLength;\n if (maxBytes !== Infinity && total > maxBytes) {\n await reader.cancel().catch(() => undefined);\n throw new StorageError(\n `Object \"${object.key}\" exceeded the ${maxBytes}-byte buffer limit while downloading.`,\n {\n code: StorageErrorCode.LIMIT_EXCEEDED,\n key: object.key,\n permanent: true,\n },\n );\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n\n const bytes = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n}\n\nexport interface StorageFileHandle {\n readonly key: string;\n upload(\n body: StorageBody,\n options?: StorageUploadOptions,\n ): Promise<StorageUploadResult>;\n uploadConditional(\n body: StorageBody,\n options: StorageConditionalUploadOptions,\n ): Promise<StorageUploadResult>;\n download(options?: StorageDownloadOptions): Promise<StorageObject>;\n downloadConditional(\n options: StorageConditionalReadOptions,\n ): Promise<StorageObject>;\n bytes(options?: StorageBufferedDownloadOptions): Promise<Uint8Array>;\n text(options?: StorageBufferedDownloadOptions): Promise<string>;\n head(options?: StorageOperationOptions): Promise<StorageObjectMetadata>;\n exists(options?: StorageOperationOptions): Promise<boolean>;\n delete(options?: StorageOperationOptions): Promise<void>;\n deleteConditional(options: StorageConditionalDeleteOptions): Promise<void>;\n signDownload(options?: StorageSignedDownloadOptions): Promise<string>;\n signUpload(options: StorageSignedUploadOptions): Promise<StorageSignedUpload>;\n copyTo(\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void>;\n moveTo(\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void>;\n /** Conditionally copies this staged object and deliberately retains it. */\n promoteTo(\n destinationKey: string,\n options: StoragePromotionOptions,\n ): Promise<void>;\n}\n\nexport class StorageClient {\n readonly #driver: StorageDriver;\n readonly #plugins: readonly StoragePlugin[];\n #closed = false;\n\n constructor(\n readonly name: string,\n driver: StorageDriver,\n plugins: readonly StoragePlugin[] = [],\n ) {\n assertKey(name, 'store name');\n this.#driver = driver;\n this.#plugins = [...plugins];\n }\n\n get driverName(): string {\n return this.#driver.name;\n }\n\n get capabilities(): Readonly<StorageCapabilities> {\n return this.#driver.capabilities;\n }\n\n file(key: string): StorageFileHandle {\n assertKey(key);\n return {\n copyTo: (destinationKey, options) =>\n this.copy(key, destinationKey, options),\n delete: (options) => this.delete(key, options),\n deleteConditional: (options) => this.deleteConditional(key, options),\n download: (options) => this.downloadStream(key, options),\n downloadConditional: (options) => this.downloadConditional(key, options),\n exists: (options) => this.exists(key, options),\n head: (options) => this.head(key, options),\n key,\n moveTo: (destinationKey, options) =>\n this.move(key, destinationKey, options),\n promoteTo: (destinationKey, options) =>\n this.promote(key, destinationKey, options),\n signDownload: (options) => this.signDownload(key, options),\n signUpload: (options) => this.signUpload(key, options),\n bytes: (options) => this.downloadBytes(key, options),\n text: (options) => this.downloadText(key, options),\n upload: (body, options) => this.upload(key, body, options),\n uploadConditional: (body, options) =>\n this.uploadConditional(key, body, options),\n };\n }\n\n upload(\n key: string,\n body: StorageBody,\n options?: StorageUploadOptions,\n ): Promise<StorageUploadResult> {\n assertKey(key);\n return this.#execute({ key, operation: 'upload', store: this.name }, () =>\n this.#driver.upload(key, body, options),\n );\n }\n\n uploadConditional(\n key: string,\n body: StorageBody,\n options: StorageConditionalUploadOptions,\n ): Promise<StorageUploadResult> {\n assertKey(key);\n const condition = options.condition;\n if (\n condition === undefined ||\n (condition.type !== 'create' && condition.type !== 'replace')\n ) {\n invalidArgument('condition.type must be \"create\" or \"replace\".');\n }\n if (\n condition.type === 'replace' &&\n !isCanonicalStorageEtag(condition.etag)\n ) {\n invalidArgument('condition.etag must be a canonical storage ETag.');\n }\n\n const capability =\n condition.type === 'create'\n ? this.#driver.capabilities.conditionalCreate\n : this.#driver.capabilities.conditionalReplace;\n const uploadConditional = this.#driver.uploadConditional;\n const multipartRequested =\n options.multipart !== undefined && options.multipart !== false;\n const multipartCapability =\n this.#driver.capabilities.conditionalMultipartCompletion;\n const multipartSupported =\n !multipartRequested ||\n (condition.type === 'create'\n ? multipartCapability?.create === true\n : multipartCapability?.replace === true);\n if (\n capability === undefined ||\n !multipartSupported ||\n uploadConditional === undefined\n ) {\n throw new StorageError(\n `Store \"${this.name}\" does not support the requested conditional upload.`,\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n key,\n operation: 'upload',\n permanent: true,\n store: this.name,\n },\n );\n }\n\n return this.#execute(\n { key, operation: 'upload', store: this.name },\n () => uploadConditional.call(this.#driver, key, body, options),\n (result) => {\n if (capability.resultEtag && !isCanonicalStorageEtag(result.etag)) {\n throw new StorageError(\n `Store \"${this.name}\" committed a conditional upload without the advertised result ETag.`,\n {\n code: StorageErrorCode.PROVIDER,\n key,\n operation: 'upload',\n permanent: true,\n store: this.name,\n },\n );\n }\n return {\n ...(isCanonicalStorageEtag(result.etag) && {\n appliedEtag: result.etag,\n }),\n };\n },\n );\n }\n\n downloadStream(\n key: string,\n options?: StorageDownloadOptions,\n ): Promise<StorageObject> {\n assertKey(key);\n assertDownloadOptions(options);\n return this.#execute({ key, operation: 'download', store: this.name }, () =>\n this.#driver.download(key, options),\n );\n }\n\n downloadConditional(\n key: string,\n options: StorageConditionalReadOptions,\n ): Promise<StorageObject> {\n assertKey(key);\n assertDownloadOptions(options);\n if (\n options === undefined ||\n options.condition === undefined ||\n typeof options.condition !== 'object' ||\n options.condition === null\n ) {\n invalidArgument('conditional read requires a condition object.');\n }\n const { etag, version } = options.condition;\n if (etag !== undefined && !isCanonicalStorageEtag(etag)) {\n invalidArgument('condition.etag must be a canonical storage ETag.');\n }\n if (\n version !== undefined &&\n (typeof version !== 'string' || version.length === 0)\n ) {\n invalidArgument('condition.version must be a non-empty string.');\n }\n if (etag === undefined && version === undefined) {\n invalidArgument('conditional read requires an etag, version, or both.');\n }\n\n const capability = this.#driver.capabilities.conditionalRead;\n const downloadConditional = this.#driver.downloadConditional;\n if (\n downloadConditional === undefined ||\n capability === undefined ||\n (etag !== undefined && !capability.etag) ||\n (version !== undefined && !capability.version)\n ) {\n throw new StorageError(\n `Store \"${this.name}\" does not support the requested conditional read.`,\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n key,\n operation: 'download',\n permanent: true,\n store: this.name,\n },\n );\n }\n\n return this.#execute({ key, operation: 'download', store: this.name }, () =>\n downloadConditional.call(this.#driver, key, options),\n );\n }\n\n async downloadBytes(\n key: string,\n options?: StorageBufferedDownloadOptions,\n ): Promise<Uint8Array> {\n const { maxBytes = DEFAULT_BUFFER_LIMIT, ...download } = options ?? {};\n const object = await this.downloadStream(key, download);\n return collectBody(object, maxBytes);\n }\n\n async downloadText(\n key: string,\n options?: StorageBufferedDownloadOptions,\n ): Promise<string> {\n return new TextDecoder().decode(await this.downloadBytes(key, options));\n }\n\n async downloadJson<Result = unknown>(\n key: string,\n options?: StorageBufferedDownloadOptions,\n ): Promise<Result> {\n const text = await this.downloadText(key, options);\n try {\n return JSON.parse(text) as Result;\n } catch (error) {\n throw new StorageError(`Object \"${key}\" does not contain valid JSON.`, {\n cause: error,\n code: StorageErrorCode.INVALID_ARGUMENT,\n key,\n operation: 'download',\n permanent: true,\n store: this.name,\n });\n }\n }\n\n head(\n key: string,\n options?: StorageOperationOptions,\n ): Promise<StorageObjectMetadata> {\n assertKey(key);\n return this.#execute({ key, operation: 'head', store: this.name }, () =>\n this.#driver.head(key, options),\n );\n }\n\n exists(key: string, options?: StorageOperationOptions): Promise<boolean> {\n assertKey(key);\n return this.#execute({ key, operation: 'exists', store: this.name }, () =>\n this.#driver.exists(key, options),\n );\n }\n\n delete(key: string, options?: StorageOperationOptions): Promise<void> {\n assertKey(key);\n return this.#execute({ key, operation: 'delete', store: this.name }, () =>\n this.#driver.delete(key, options),\n );\n }\n\n deleteConditional(\n key: string,\n options: StorageConditionalDeleteOptions,\n ): Promise<void> {\n assertKey(key);\n if (\n options.condition === undefined ||\n !isCanonicalStorageEtag(options.condition.etag)\n ) {\n invalidArgument('condition.etag must be a canonical storage ETag.');\n }\n\n const capability = this.#driver.capabilities.conditionalDelete;\n const deleteConditional = this.#driver.deleteConditional;\n if (capability?.etag !== true || deleteConditional === undefined) {\n throw new StorageError(\n `Store \"${this.name}\" does not support conditional delete.`,\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n key,\n operation: 'delete',\n permanent: true,\n store: this.name,\n },\n );\n }\n\n return this.#execute(\n { key, operation: 'delete', store: this.name },\n () => deleteConditional.call(this.#driver, key, options),\n () => ({}),\n );\n }\n\n copy(\n sourceKey: string,\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void> {\n assertKey(sourceKey, 'source key');\n assertKey(destinationKey, 'destination key');\n return this.#execute(\n {\n from: sourceKey,\n operation: 'copy',\n store: this.name,\n to: destinationKey,\n },\n () => this.#driver.copy(sourceKey, destinationKey, options),\n );\n }\n\n move(\n sourceKey: string,\n destinationKey: string,\n options?: StorageOperationOptions,\n ): Promise<void> {\n assertKey(sourceKey, 'source key');\n assertKey(destinationKey, 'destination key');\n return this.#execute(\n {\n from: sourceKey,\n operation: 'move',\n store: this.name,\n to: destinationKey,\n },\n () => this.#driver.move(sourceKey, destinationKey, options),\n );\n }\n\n /**\n * Conditionally copies a staged object to a final key. This operation does\n * not delete the source; delete it after the application commit succeeds.\n */\n promote(\n sourceKey: string,\n destinationKey: string,\n options: StoragePromotionOptions,\n ): Promise<void> {\n assertKey(sourceKey, 'source key');\n assertKey(destinationKey, 'destination key');\n const sourceEtag = options.sourceEtag;\n const sourceVersion = options.sourceVersion;\n if (sourceEtag !== undefined && !isCanonicalStorageEtag(sourceEtag)) {\n invalidArgument('sourceEtag must be a canonical storage ETag.');\n }\n if (\n sourceVersion !== undefined &&\n (typeof sourceVersion !== 'string' || sourceVersion.length === 0)\n ) {\n invalidArgument('sourceVersion must be a non-empty string.');\n }\n const destination = options.destination;\n if (\n destination !== undefined &&\n (typeof destination !== 'object' ||\n destination === null ||\n (destination.type !== 'create' && destination.type !== 'replace'))\n ) {\n invalidArgument('destination.type must be \"create\" or \"replace\".');\n }\n if (\n sourceEtag === undefined &&\n sourceVersion === undefined &&\n destination === undefined\n ) {\n invalidArgument('promote requires a source or destination precondition.');\n }\n if (\n destination?.type === 'replace' &&\n !isCanonicalStorageEtag(destination.etag)\n ) {\n invalidArgument('destination.etag must be a canonical storage ETag.');\n }\n\n const sourceCapability = this.#driver.capabilities.conditionalCopySource;\n const destinationCapability =\n this.#driver.capabilities.conditionalCopyDestination;\n const promote = this.#driver.promote;\n const hasSourcePredicate =\n sourceEtag !== undefined || sourceVersion !== undefined;\n if (\n promote === undefined ||\n (sourceEtag !== undefined && sourceCapability?.etag !== true) ||\n (sourceVersion !== undefined && sourceCapability?.version !== true) ||\n (hasSourcePredicate &&\n destination === undefined &&\n sourceCapability?.requiresDestinationPredicate === true) ||\n (destination?.type === 'create' &&\n destinationCapability?.create !== true) ||\n (destination?.type === 'replace' &&\n destinationCapability?.replace !== true) ||\n (destination !== undefined &&\n !hasSourcePredicate &&\n destinationCapability?.requiresSourcePredicate === true) ||\n (destination !== undefined &&\n hasSourcePredicate &&\n destinationCapability?.atomicWithSource !== true)\n ) {\n throw new StorageError(\n `Store \"${this.name}\" does not support the requested conditional promotion.`,\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n key: sourceKey,\n operation: 'promote',\n permanent: true,\n store: this.name,\n },\n );\n }\n\n return this.#execute(\n {\n from: sourceKey,\n operation: 'promote',\n store: this.name,\n to: destinationKey,\n },\n () => promote.call(this.#driver, sourceKey, destinationKey, options),\n () => ({}),\n );\n }\n\n list(options?: StorageListOptions): Promise<StorageListResult> {\n assertListOptions(options);\n return this.#execute({ operation: 'list', store: this.name }, () =>\n this.#driver.list(options),\n );\n }\n\n async *listAll(\n options?: StorageListOptions,\n ): AsyncGenerator<StorageObjectMetadata, void> {\n const { delimiter: _delimiter, ...walkOptions } = options ?? {};\n void _delimiter;\n let cursor = walkOptions.cursor;\n const seen = new Set<string>();\n\n do {\n const page = await this.list({\n ...walkOptions,\n ...(cursor !== undefined && { cursor }),\n });\n yield* page.items;\n cursor = page.cursor;\n if (cursor !== undefined) {\n if (seen.has(cursor)) {\n throw new StorageError(\n `Store \"${this.name}\" returned a repeated pagination cursor.`,\n {\n code: StorageErrorCode.PROVIDER,\n operation: 'list',\n permanent: true,\n store: this.name,\n },\n );\n }\n seen.add(cursor);\n }\n } while (cursor !== undefined);\n }\n\n search(\n pattern: string | RegExp,\n options?: StorageSearchOptions,\n ): AsyncIterable<StorageObjectMetadata> {\n assertSearchOptions(options);\n return this.#search(pattern, options);\n }\n\n async *#search(\n pattern: string | RegExp,\n options?: StorageSearchOptions,\n ): AsyncGenerator<StorageObjectMetadata, void> {\n const context: StorageOperationContext = {\n operation: 'search',\n store: this.name,\n };\n try {\n for (const plugin of this.#plugins) {\n await plugin.beforeOperation?.(context);\n }\n for await (const object of this.#driver.search(pattern, options)) {\n yield object;\n }\n for (const plugin of this.#plugins) {\n await plugin.afterOperation?.(context, undefined);\n }\n } catch (error) {\n const normalized = normalizeStorageError(error, {\n operation: 'search',\n store: this.name,\n });\n for (const plugin of this.#plugins) {\n try {\n await plugin.onError?.(context, normalized);\n } catch {\n // Preserve the original storage error.\n }\n }\n throw normalized;\n }\n }\n\n signDownload(\n key: string,\n options?: StorageSignedDownloadOptions,\n ): Promise<string> {\n assertKey(key);\n return this.#execute(\n { key, operation: 'signDownload', store: this.name },\n () => this.#driver.signDownload(key, options),\n );\n }\n\n signUpload(\n key: string,\n options: StorageSignedUploadOptions,\n ): Promise<StorageSignedUpload> {\n assertKey(key);\n assertSignedUploadOptions(options);\n return this.#execute(\n { key, operation: 'signUpload', store: this.name },\n () => this.#driver.signUpload(key, options),\n );\n }\n\n async uploadMany(\n items: readonly StorageUploadManyItem[],\n options?: StorageUploadManyOptions,\n ): Promise<StorageUploadManyResult> {\n const settled = await settleMany(\n items,\n (item) => item.key,\n (item) =>\n this.upload(item.key, item.body, {\n ...operationOptions(options),\n ...(item.cacheControl !== undefined && {\n cacheControl: item.cacheControl,\n }),\n ...(item.contentType !== undefined && {\n contentType: item.contentType,\n }),\n ...(item.metadata !== undefined && { metadata: item.metadata }),\n ...(item.multipart !== undefined && {\n multipart: item.multipart,\n }),\n ...(options?.onProgress !== undefined && {\n onProgress: (progress) =>\n options.onProgress?.({ ...progress, key: item.key }),\n }),\n }),\n options,\n );\n\n return {\n uploaded: settled.results,\n ...(settled.errors.length > 0 && { errors: settled.errors }),\n };\n }\n\n async downloadMany(\n keys: readonly string[],\n options?: DownloadManyOptions,\n ): Promise<StorageDownloadManyResult> {\n const settled = await settleMany(\n keys,\n (key) => key,\n (key) => this.downloadStream(key, downloadOptions(options)),\n options,\n );\n return {\n downloaded: settled.results,\n ...(settled.errors.length > 0 && { errors: settled.errors }),\n };\n }\n\n async headMany(\n keys: readonly string[],\n options?: BulkOperationOptions,\n ): Promise<StorageHeadManyResult> {\n const settled = await settleMany(\n keys,\n (key) => key,\n (key) => this.head(key, operationOptions(options)),\n options,\n );\n return {\n objects: settled.results,\n ...(settled.errors.length > 0 && { errors: settled.errors }),\n };\n }\n\n async existsMany(\n keys: readonly string[],\n options?: BulkOperationOptions,\n ): Promise<StorageExistsManyResult> {\n const settled = await settleMany(\n keys,\n (key) => key,\n async (key) => ({ exists: await this.exists(key, options), key }),\n options,\n );\n const existing: string[] = [];\n const missing: string[] = [];\n for (const result of settled.results) {\n (result.exists ? existing : missing).push(result.key);\n }\n return {\n existing,\n missing,\n ...(settled.errors.length > 0 && { errors: settled.errors }),\n };\n }\n\n async deleteMany(\n keys: readonly string[],\n options?: BulkOperationOptions,\n ): Promise<StorageDeleteManyResult> {\n const settled = await settleMany(\n keys,\n (key) => key,\n async (key) => {\n await this.delete(key, operationOptions(options));\n return key;\n },\n options,\n );\n return {\n deleted: settled.results,\n ...(settled.errors.length > 0 && { errors: settled.errors }),\n };\n }\n\n async onApplicationShutdown(): Promise<void> {\n if (this.#closed) {\n return;\n }\n this.#closed = true;\n await this.#driver.close?.();\n }\n\n async #execute<Result>(\n context: StorageOperationContext,\n operation: () => Promise<Result>,\n appliedMutation?: (result: Result) => AppliedMutationSettlement,\n ): Promise<Result> {\n let appliedSettlement: AppliedMutationSettlement | undefined;\n try {\n for (const plugin of this.#plugins) {\n await plugin.beforeOperation?.(context);\n }\n const result = await operation();\n if (appliedMutation !== undefined) {\n // Settle before describing the result so even an unexpected local\n // result-validation failure cannot turn a committed mutation into a\n // safe-to-retry error.\n appliedSettlement = {};\n appliedSettlement = appliedMutation(result);\n }\n for (const plugin of this.#plugins) {\n await plugin.afterOperation?.(context, result);\n }\n return result;\n } catch (error) {\n let normalized = normalizeStorageError(error, {\n ...(context.key !== undefined && { key: context.key }),\n operation: context.operation,\n store: this.name,\n });\n if (appliedSettlement !== undefined) {\n normalized = new StorageError(normalized.message, {\n aborted: normalized.aborted,\n applied: true,\n ...(isCanonicalStorageEtag(appliedSettlement.appliedEtag) && {\n appliedEtag: appliedSettlement.appliedEtag,\n }),\n cause: normalized.cause,\n code: normalized.code,\n ...(normalized.key !== undefined && { key: normalized.key }),\n ...(normalized.operation !== undefined && {\n operation: normalized.operation,\n }),\n permanent: normalized.permanent,\n ...(normalized.store !== undefined && { store: normalized.store }),\n timedOut: normalized.timedOut,\n });\n }\n for (const plugin of this.#plugins) {\n try {\n await plugin.onError?.(context, normalized);\n } catch {\n // Preserve the original storage error.\n }\n }\n throw normalized;\n }\n }\n}\n"]}
@@ -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"]}
@@ -1,16 +1,17 @@
1
1
  export declare const StorageErrorCode: {
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";
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":"AAAA,eAAO,MAAM,gBAAgB;;;;;;;;;;;CAWnB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAC1B,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAC;AAE3D,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,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,YAAa,SAAQ,KAAK;IACrC,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,SAAkB,KAAK,CAAC,EAAE,OAAO,CAAC;gBAEtB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB;CAY1D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE;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"}
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"}
@@ -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
- return error instanceof StorageError;
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;AAgBX,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,IAAI,CAAmB;IACvB,KAAK,CAAqB;IAC1B,SAAS,CAAqB;IAC9B,GAAG,CAAqB;IACxB,OAAO,CAAU;IACjB,QAAQ,CAAU;IAClB,SAAS,CAAU;IACV,KAAK,CAAW;IAElC,YAAY,OAAe,EAAE,OAA4B;QACvD,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC;QAC5C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,KAAK,YAAY,YAAY,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,KAAc,EACd,UAEI,EAAE;IAEN,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEvE,OAAO,IAAI,YAAY,CAAC,OAAO,EAAE;QAC/B,GAAG,OAAO;QACV,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,gBAAgB,CAAC,QAAQ;KAChD,CAAC,CAAC;AACL,CAAC","sourcesContent":["export 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\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 cause?: unknown;\n}\n\nexport class StorageError extends Error {\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 override readonly cause?: unknown;\n\n constructor(message: string, options: StorageErrorOptions) {\n super(message, { cause: options.cause });\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.cause = options.cause;\n }\n}\n\nexport function isStorageError(error: unknown): error is StorageError {\n return error instanceof StorageError;\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
+ {"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;IAc5D,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,yBAAyB,GAAG,aAAa;IAetE,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa;IAYhE,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,0BAA0B,GAAG,aAAa;CAW3E"}
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;AAuD5B,qBAAa,cAAc;;IAKvB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAD5B,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,EAC1B,WAAW,EAAE,MAAM,GAAG,IAAI;IAK7C,IAAI,KAAK,IAAI,SAAS,MAAM,EAAE,CAE7B;IAED,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa;IA+B3B,QAAQ,CACZ,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC;IA+E3B,IAAI,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAsIpE"}
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"}
@@ -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) => transformKey(object.key)));
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(transformKey(object.key));
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 = transformKey(object.key);
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);