@nestm/storage 0.1.0-alpha.6 → 0.1.0-alpha.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +128 -0
- package/README.md +398 -19
- package/SECURITY.md +69 -0
- package/dist/ai-sdk/ai-sdk-workspace-tools.d.ts +74 -0
- package/dist/ai-sdk/ai-sdk-workspace-tools.d.ts.map +1 -0
- package/dist/ai-sdk/ai-sdk-workspace-tools.js +414 -0
- package/dist/ai-sdk/ai-sdk-workspace-tools.js.map +1 -0
- package/dist/ai-sdk/index.d.ts +2 -0
- package/dist/ai-sdk/index.d.ts.map +1 -0
- package/dist/ai-sdk/index.js +2 -0
- package/dist/ai-sdk/index.js.map +1 -0
- package/dist/files-sdk/files-sdk.driver.d.ts +64 -6
- package/dist/files-sdk/files-sdk.driver.d.ts.map +1 -1
- package/dist/files-sdk/files-sdk.driver.js +918 -38
- package/dist/files-sdk/files-sdk.driver.js.map +1 -1
- package/dist/files-sdk/fs/index.d.ts +21 -2
- package/dist/files-sdk/fs/index.d.ts.map +1 -1
- package/dist/files-sdk/fs/index.js +833 -1
- package/dist/files-sdk/fs/index.js.map +1 -1
- package/dist/files-sdk/index.d.ts +1 -1
- package/dist/files-sdk/index.d.ts.map +1 -1
- package/dist/files-sdk/index.js.map +1 -1
- package/dist/files-sdk/provider/index.d.ts +9 -5
- package/dist/files-sdk/provider/index.d.ts.map +1 -1
- package/dist/files-sdk/provider/index.js +60 -15
- package/dist/files-sdk/provider/index.js.map +1 -1
- package/dist/files-sdk/s3/construction-metadata.d.ts +7 -0
- package/dist/files-sdk/s3/construction-metadata.d.ts.map +1 -0
- package/dist/files-sdk/s3/construction-metadata.js +13 -0
- package/dist/files-sdk/s3/construction-metadata.js.map +1 -0
- package/dist/files-sdk/s3/index.d.ts +43 -14
- package/dist/files-sdk/s3/index.d.ts.map +1 -1
- package/dist/files-sdk/s3/index.js +1046 -57
- package/dist/files-sdk/s3/index.js.map +1 -1
- package/dist/gateway/storage-gateway.controller.d.ts.map +1 -1
- package/dist/gateway/storage-gateway.controller.js +25 -5
- package/dist/gateway/storage-gateway.controller.js.map +1 -1
- package/dist/storage-etag.d.ts +13 -0
- package/dist/storage-etag.d.ts.map +1 -0
- package/dist/storage-etag.js +31 -0
- package/dist/storage-etag.js.map +1 -0
- package/dist/storage.client.d.ts +7 -1
- package/dist/storage.client.d.ts.map +1 -1
- package/dist/storage.client.js +124 -10
- package/dist/storage.client.js.map +1 -1
- package/dist/storage.driver.d.ts +23 -1
- package/dist/storage.driver.d.ts.map +1 -1
- package/dist/storage.driver.js.map +1 -1
- package/dist/storage.service.d.ts.map +1 -1
- package/dist/storage.service.js +28 -3
- package/dist/storage.service.js.map +1 -1
- package/dist/storage.types.d.ts +113 -6
- package/dist/storage.types.d.ts.map +1 -1
- package/dist/storage.types.js.map +1 -1
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1 -0
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/provider-conformance.d.ts +65 -0
- package/dist/testing/provider-conformance.d.ts.map +1 -0
- package/dist/testing/provider-conformance.js +853 -0
- package/dist/testing/provider-conformance.js.map +1 -0
- package/dist/workspace/index.d.ts +5 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +5 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/storage-workspace.cursor.d.ts +71 -0
- package/dist/workspace/storage-workspace.cursor.d.ts.map +1 -0
- package/dist/workspace/storage-workspace.cursor.js +408 -0
- package/dist/workspace/storage-workspace.cursor.js.map +1 -0
- package/dist/workspace/storage-workspace.d.ts +6 -0
- package/dist/workspace/storage-workspace.d.ts.map +1 -0
- package/dist/workspace/storage-workspace.error.d.ts +28 -0
- package/dist/workspace/storage-workspace.error.d.ts.map +1 -0
- package/dist/workspace/storage-workspace.error.js +67 -0
- package/dist/workspace/storage-workspace.error.js.map +1 -0
- package/dist/workspace/storage-workspace.js +755 -0
- package/dist/workspace/storage-workspace.js.map +1 -0
- package/dist/workspace/storage-workspace.path.d.ts +9 -0
- package/dist/workspace/storage-workspace.path.d.ts.map +1 -0
- package/dist/workspace/storage-workspace.path.js +68 -0
- package/dist/workspace/storage-workspace.path.js.map +1 -0
- package/dist/workspace/storage-workspace.types.d.ts +105 -0
- package/dist/workspace/storage-workspace.types.d.ts.map +1 -0
- package/dist/workspace/storage-workspace.types.js +21 -0
- package/dist/workspace/storage-workspace.types.js.map +1 -0
- package/package.json +24 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/files-sdk/s3/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { CopyObjectCommand } from '@aws-sdk/client-s3';\nimport {\n mapS3Error,\n s3,\n type S3Adapter,\n type S3AdapterOptions,\n} from 'files-sdk/s3';\n\nimport type { StoragePromotionOptions } from '../../storage.types.js';\nimport {\n createFilesSdkDriver,\n type FilesSdkConditionalCopyAdapter,\n type FilesSdkDriverOptions,\n type FilesSdkSignedUploadPolicyAdapter,\n type FilesSdkSignedDownloadPolicyAdapter,\n type FilesSdkStorageDriver,\n mapFilesSdkError,\n} from '../files-sdk.driver.js';\n\nexport interface S3StorageDriverOptions extends Omit<\n FilesSdkDriverOptions<S3Adapter>,\n 'adapter'\n> {\n adapter: S3AdapterOptions;\n}\n\nexport type S3StorageAdapter = S3Adapter &\n FilesSdkConditionalCopyAdapter &\n FilesSdkSignedDownloadPolicyAdapter &\n FilesSdkSignedUploadPolicyAdapter;\n\nfunction copySource(\n bucket: string,\n key: string,\n version: string | undefined,\n): string {\n const source = `${encodeURIComponent(bucket)}/${encodeURIComponent(key)}`;\n return version === undefined\n ? source\n : `${source}?versionId=${encodeURIComponent(version)}`;\n}\n\nfunction operationSignal(\n options: StoragePromotionOptions,\n): AbortSignal | undefined {\n const timeoutSignal =\n options.timeout === undefined || options.timeout <= 0\n ? undefined\n : AbortSignal.timeout(options.timeout);\n if (options.signal === undefined) {\n return timeoutSignal;\n }\n return timeoutSignal === undefined\n ? options.signal\n : AbortSignal.any([options.signal, timeoutSignal]);\n}\n\nfunction maxRetries(options: StoragePromotionOptions): number {\n const configured =\n typeof options.retries === 'number'\n ? options.retries\n : options.retries?.max;\n return Math.max(0, Math.floor(configured ?? 0));\n}\n\nasync function waitForRetry(\n milliseconds: number,\n signal: AbortSignal | undefined,\n): Promise<void> {\n if (signal?.aborted === true) {\n throw signal.reason;\n }\n await new Promise<void>((resolve, reject) => {\n const cleanup = (): void => signal?.removeEventListener('abort', abort);\n const timer = setTimeout(\n () => {\n cleanup();\n resolve();\n },\n Math.max(0, milliseconds),\n );\n const abort = (): void => {\n clearTimeout(timer);\n cleanup();\n reject(signal?.reason);\n };\n signal?.addEventListener('abort', abort, { once: true });\n });\n}\n\n/**\n * Adds the S3-only capabilities to an adapter already built by `s3(...)`: an\n * ETag/version-conditional server-side promotion, and the signed upload and\n * download policies the bridge advertises through `capabilities`.\n *\n * Exported so the provider factory can apply them to the adapter `loadFiles`\n * resolved for the `s3` slug instead of re-deriving {@link S3AdapterOptions}\n * from flat provider config. It expects an adapter whose `raw` is an `S3Client`\n * — pass one built by `s3(...)`, not an S3-compatible wrapper.\n */\nexport function withS3Capabilities(\n base: S3Adapter,\n options: Pick<S3AdapterOptions, 'publicBaseUrl'> = {},\n): S3StorageAdapter {\n return Object.assign(base, {\n conditionalCopy: Object.freeze({\n etag: true,\n supported: true,\n version: true,\n }),\n signedUploadPolicy: Object.freeze({\n contentType: true,\n sizeRange: true,\n }),\n signedDownloadPolicy: Object.freeze({\n expiresIn: options.publicBaseUrl === undefined,\n }),\n async promote(\n sourceKey: string,\n destinationKey: string,\n promotion: StoragePromotionOptions,\n ): Promise<void> {\n const retries = maxRetries(promotion);\n for (let attempt = 0; ; attempt += 1) {\n const signal = operationSignal(promotion);\n try {\n await base.raw.send(\n new CopyObjectCommand({\n Bucket: base.bucket,\n CopySource: copySource(\n base.bucket,\n sourceKey,\n promotion.sourceVersion,\n ),\n ...(promotion.sourceEtag !== undefined && {\n CopySourceIfMatch: promotion.sourceEtag,\n }),\n Key: destinationKey,\n }),\n signal === undefined ? undefined : { abortSignal: signal },\n );\n return;\n } catch (error) {\n const mapped = mapS3Error(error);\n if (\n attempt >= retries ||\n mapped.code !== 'Provider' ||\n mapped.aborted ||\n mapped.permanent ||\n signal?.aborted === true\n ) {\n throw mapped;\n }\n const storageError = mapFilesSdkError(mapped);\n const delay =\n typeof promotion.retries === 'object' &&\n promotion.retries.backoff !== undefined\n ? promotion.retries.backoff({\n attempt: attempt + 1,\n error: storageError,\n })\n : Math.min(1000, 100 * 2 ** attempt);\n await waitForRetry(delay, promotion.signal);\n }\n }\n },\n } satisfies FilesSdkConditionalCopyAdapter &\n FilesSdkSignedDownloadPolicyAdapter &\n FilesSdkSignedUploadPolicyAdapter);\n}\n\n/**\n * Creates the files-sdk S3 driver from the storage package's own dependency\n * context and adds an ETag/version-conditional server-side promotion.\n */\nexport function createS3StorageDriver(\n options: S3StorageDriverOptions,\n): FilesSdkStorageDriver<S3StorageAdapter> {\n const { adapter: adapterOptions, ...filesOptions } = options;\n return createFilesSdkDriver({\n ...filesOptions,\n adapter: withS3Capabilities(s3(adapterOptions), adapterOptions),\n });\n}\n\nexport { mapS3Error, s3 } from 'files-sdk/s3';\nexport type { S3Adapter, S3AdapterOptions, S3Sdk } from 'files-sdk/s3';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/files-sdk/s3/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AbortMultipartUploadCommand,\n CompleteMultipartUploadCommand,\n CopyObjectCommand,\n CreateMultipartUploadCommand,\n DeleteObjectCommand,\n GetObjectCommand,\n PutObjectCommand,\n UploadPartCommand,\n} from '@aws-sdk/client-s3';\nimport {\n createPresignedPost,\n type PresignedPostOptions,\n} from '@aws-sdk/s3-presigned-post';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport { Readable } from 'node:stream';\nimport {\n mapS3Error,\n s3 as createFilesSdkS3Adapter,\n type S3Adapter,\n type S3AdapterOptions,\n} from 'files-sdk/s3';\n\nimport type {\n StorageBody,\n StorageCapabilities,\n StorageConditionalDeleteOptions,\n StorageConditionalReadOptions,\n StorageConditionalUploadOptions,\n StorageObject,\n StorageOperationOptions,\n StoragePromotionOptions,\n StorageUploadResult,\n} from '../../storage.types.js';\nimport {\n StorageError,\n StorageErrorCode,\n isStorageError,\n} from '../../storage.error.js';\nimport {\n normalizeProviderStorageEtag,\n storageEtagHeader,\n} from '../../storage-etag.js';\nimport {\n assertFilesSdkS3AdapterHasNoReservedExtensions,\n createFilesSdkDriver,\n markFilesSdkS3AdapterUndecorated,\n markFilesSdkS3RawClientProvenance,\n type FilesSdkConditionalCopyAdapter,\n type FilesSdkConditionalDeleteAdapter,\n type FilesSdkConditionalReadAdapter,\n type FilesSdkConditionalUploadAdapter,\n type FilesSdkDriverOptions,\n type FilesSdkPhysicalKeyAdapter,\n type FilesSdkSignedUploadPolicyAdapter,\n type FilesSdkSignedDownloadPolicyAdapter,\n type FilesSdkStorageDriver,\n mapFilesSdkError,\n} from '../files-sdk.driver.js';\nimport {\n getS3ConstructionMetadata,\n recordS3ConstructionMetadata,\n} from './construction-metadata.js';\n\nexport interface S3StorageDriverOptions extends Omit<\n FilesSdkDriverOptions<S3Adapter>,\n 'adapter'\n> {\n adapter: S3AdapterOptions;\n /**\n * Exact, conformance-verified provider behavior. Native AWS S3 uses the\n * built-in AWS profile when no endpoint override is present; an explicit\n * native profile may only narrow that immutable ceiling. Endpoint overrides\n * without an explicit profile force the whole driver read-only.\n */\n providerProfile?: S3ProviderProfile;\n}\n\ntype S3ProfileCapabilities = Pick<\n StorageCapabilities,\n | 'conditionalCreate'\n | 'conditionalReplace'\n | 'conditionalDelete'\n | 'conditionalRead'\n | 'conditionalCopySource'\n | 'conditionalCopyDestination'\n | 'conditionalMultipartCompletion'\n | 'physicalKey'\n | 'signedUploadPolicy'\n>;\n\nconst verifiedS3ProviderProfile = Symbol('verifiedS3ProviderProfile');\nconst verifiedS3ProviderProfiles = new WeakSet<object>();\n\nexport interface S3ProviderProfileInput extends S3ProfileCapabilities {\n /** Stable profile identity for configuration, diagnostics, and audit. */\n readonly name: string;\n /** Every S3-compatible profile must declare its complete-key byte budget. */\n readonly physicalKey: NonNullable<S3ProfileCapabilities['physicalKey']>;\n /** Constraints the provider proves; omission defaults both claims to false. */\n readonly signedUploadPolicy?: NonNullable<\n S3ProfileCapabilities['signedUploadPolicy']\n >;\n}\n\n/** A validated profile created by {@link defineS3ProviderProfile}. */\nexport type S3ProviderProfile = Readonly<\n Omit<S3ProviderProfileInput, 'signedUploadPolicy'> & {\n readonly signedUploadPolicy: NonNullable<\n S3ProfileCapabilities['signedUploadPolicy']\n >;\n }\n> & {\n readonly [verifiedS3ProviderProfile]: true;\n};\n\nfunction assertCapabilityBoolean(\n value: unknown,\n label: string,\n): asserts value is boolean {\n if (typeof value !== 'boolean') {\n throw new TypeError(`${label} must be a boolean.`);\n }\n}\n\n/** Validates and deeply freezes an explicitly verified S3-compatible profile. */\nexport function defineS3ProviderProfile(\n profile: S3ProviderProfileInput,\n): S3ProviderProfile {\n if (typeof profile.name !== 'string' || profile.name.trim().length === 0) {\n throw new TypeError('S3 provider profile name must be a non-empty string.');\n }\n if (\n !Number.isSafeInteger(profile.physicalKey.maxBytes) ||\n profile.physicalKey.maxBytes <= 0\n ) {\n throw new TypeError(\n 'S3 provider profile physicalKey.maxBytes must be a positive safe integer.',\n );\n }\n\n const booleanFields = [\n [\n profile.signedUploadPolicy !== undefined,\n 'signedUploadPolicy.contentType',\n profile.signedUploadPolicy?.contentType,\n ],\n [\n profile.signedUploadPolicy !== undefined,\n 'signedUploadPolicy.sizeRange',\n profile.signedUploadPolicy?.sizeRange,\n ],\n [\n profile.conditionalCreate !== undefined,\n 'conditionalCreate.resultEtag',\n profile.conditionalCreate?.resultEtag,\n ],\n [\n profile.conditionalReplace !== undefined,\n 'conditionalReplace.resultEtag',\n profile.conditionalReplace?.resultEtag,\n ],\n [\n profile.conditionalDelete !== undefined,\n 'conditionalDelete.etag',\n profile.conditionalDelete?.etag,\n ],\n [\n profile.conditionalRead !== undefined,\n 'conditionalRead.etag',\n profile.conditionalRead?.etag,\n ],\n [\n profile.conditionalRead !== undefined,\n 'conditionalRead.version',\n profile.conditionalRead?.version,\n ],\n [\n profile.conditionalCopySource !== undefined,\n 'conditionalCopySource.etag',\n profile.conditionalCopySource?.etag,\n ],\n [\n profile.conditionalCopySource !== undefined,\n 'conditionalCopySource.version',\n profile.conditionalCopySource?.version,\n ],\n [\n profile.conditionalCopyDestination !== undefined,\n 'conditionalCopyDestination.create',\n profile.conditionalCopyDestination?.create,\n ],\n [\n profile.conditionalCopyDestination !== undefined,\n 'conditionalCopyDestination.replace',\n profile.conditionalCopyDestination?.replace,\n ],\n [\n profile.conditionalCopyDestination !== undefined,\n 'conditionalCopyDestination.atomicWithSource',\n profile.conditionalCopyDestination?.atomicWithSource,\n ],\n [\n profile.conditionalMultipartCompletion !== undefined,\n 'conditionalMultipartCompletion.create',\n profile.conditionalMultipartCompletion?.create,\n ],\n [\n profile.conditionalMultipartCompletion !== undefined,\n 'conditionalMultipartCompletion.replace',\n profile.conditionalMultipartCompletion?.replace,\n ],\n ] as const;\n for (const [declared, label, value] of booleanFields) {\n if (declared) assertCapabilityBoolean(value, label);\n }\n if (\n profile.conditionalCopyDestination?.atomicWithSource === true &&\n profile.conditionalCopySource?.etag !== true &&\n profile.conditionalCopySource?.version !== true\n ) {\n throw new TypeError(\n 'An atomic destination-copy profile must enable at least one source-copy condition.',\n );\n }\n if (\n profile.conditionalCopyDestination?.atomicWithSource === true &&\n profile.conditionalCopyDestination.create !== true &&\n profile.conditionalCopyDestination.replace !== true\n ) {\n throw new TypeError(\n 'An atomic destination-copy profile must declare create or replace support.',\n );\n }\n if (\n profile.conditionalMultipartCompletion?.create === true &&\n profile.conditionalCreate === undefined\n ) {\n throw new TypeError(\n 'Conditional multipart create requires conditional create support.',\n );\n }\n if (\n profile.conditionalMultipartCompletion?.replace === true &&\n profile.conditionalReplace === undefined\n ) {\n throw new TypeError(\n 'Conditional multipart replace requires conditional replace support.',\n );\n }\n\n const clone: Omit<S3ProviderProfileInput, 'signedUploadPolicy'> & {\n readonly signedUploadPolicy: NonNullable<\n S3ProfileCapabilities['signedUploadPolicy']\n >;\n } = {\n name: profile.name.trim(),\n physicalKey: Object.freeze({ ...profile.physicalKey }),\n signedUploadPolicy: Object.freeze(\n profile.signedUploadPolicy === undefined\n ? { contentType: false, sizeRange: false }\n : { ...profile.signedUploadPolicy },\n ),\n ...(profile.conditionalCreate !== undefined && {\n conditionalCreate: Object.freeze({ ...profile.conditionalCreate }),\n }),\n ...(profile.conditionalReplace !== undefined && {\n conditionalReplace: Object.freeze({ ...profile.conditionalReplace }),\n }),\n ...(profile.conditionalDelete !== undefined && {\n conditionalDelete: Object.freeze({ ...profile.conditionalDelete }),\n }),\n ...(profile.conditionalRead !== undefined && {\n conditionalRead: Object.freeze({ ...profile.conditionalRead }),\n }),\n ...(profile.conditionalCopySource !== undefined && {\n conditionalCopySource: Object.freeze({\n ...profile.conditionalCopySource,\n }),\n }),\n ...(profile.conditionalCopyDestination !== undefined && {\n conditionalCopyDestination: Object.freeze({\n ...profile.conditionalCopyDestination,\n }),\n }),\n ...(profile.conditionalMultipartCompletion !== undefined && {\n conditionalMultipartCompletion: Object.freeze({\n ...profile.conditionalMultipartCompletion,\n }),\n }),\n };\n Object.defineProperty(clone, verifiedS3ProviderProfile, {\n configurable: false,\n enumerable: false,\n value: true,\n writable: false,\n });\n const verified = Object.freeze(clone) as S3ProviderProfile;\n verifiedS3ProviderProfiles.add(verified);\n return verified;\n}\n\nfunction assertVerifiedS3ProviderProfile(profile: S3ProviderProfile): void {\n if (\n typeof profile !== 'object' ||\n profile === null ||\n !verifiedS3ProviderProfiles.has(profile)\n ) {\n throw new TypeError(\n 'providerProfile must be created with defineS3ProviderProfile().',\n );\n }\n}\n\nfunction assertS3ProviderProfileContainedBy(\n profile: S3ProviderProfile,\n ceiling: S3ProviderProfile,\n): void {\n if (profile.physicalKey.maxBytes > ceiling.physicalKey.maxBytes) {\n throw new TypeError(\n `S3 provider profile \"${profile.name}\" cannot widen ${ceiling.name} physicalKey.maxBytes beyond ${ceiling.physicalKey.maxBytes}.`,\n );\n }\n\n const operationCapabilities = [\n ['conditionalCreate', profile.conditionalCreate, ceiling.conditionalCreate],\n [\n 'conditionalReplace',\n profile.conditionalReplace,\n ceiling.conditionalReplace,\n ],\n ['conditionalDelete', profile.conditionalDelete, ceiling.conditionalDelete],\n ['conditionalRead', profile.conditionalRead, ceiling.conditionalRead],\n [\n 'conditionalCopySource',\n profile.conditionalCopySource,\n ceiling.conditionalCopySource,\n ],\n [\n 'conditionalCopyDestination',\n profile.conditionalCopyDestination,\n ceiling.conditionalCopyDestination,\n ],\n [\n 'conditionalMultipartCompletion',\n profile.conditionalMultipartCompletion,\n ceiling.conditionalMultipartCompletion,\n ],\n ] as const;\n for (const [name, declared, supported] of operationCapabilities) {\n if (declared !== undefined && supported === undefined) {\n throw new TypeError(\n `S3 provider profile \"${profile.name}\" cannot widen ${ceiling.name} with ${name}.`,\n );\n }\n }\n\n const booleanClaims = [\n [\n 'signedUploadPolicy.contentType',\n profile.signedUploadPolicy.contentType,\n ceiling.signedUploadPolicy.contentType,\n ],\n [\n 'signedUploadPolicy.sizeRange',\n profile.signedUploadPolicy.sizeRange,\n ceiling.signedUploadPolicy.sizeRange,\n ],\n [\n 'conditionalCreate.resultEtag',\n profile.conditionalCreate?.resultEtag,\n ceiling.conditionalCreate?.resultEtag,\n ],\n [\n 'conditionalReplace.resultEtag',\n profile.conditionalReplace?.resultEtag,\n ceiling.conditionalReplace?.resultEtag,\n ],\n [\n 'conditionalDelete.etag',\n profile.conditionalDelete?.etag,\n ceiling.conditionalDelete?.etag,\n ],\n [\n 'conditionalRead.etag',\n profile.conditionalRead?.etag,\n ceiling.conditionalRead?.etag,\n ],\n [\n 'conditionalRead.version',\n profile.conditionalRead?.version,\n ceiling.conditionalRead?.version,\n ],\n [\n 'conditionalCopySource.etag',\n profile.conditionalCopySource?.etag,\n ceiling.conditionalCopySource?.etag,\n ],\n [\n 'conditionalCopySource.version',\n profile.conditionalCopySource?.version,\n ceiling.conditionalCopySource?.version,\n ],\n [\n 'conditionalCopyDestination.create',\n profile.conditionalCopyDestination?.create,\n ceiling.conditionalCopyDestination?.create,\n ],\n [\n 'conditionalCopyDestination.replace',\n profile.conditionalCopyDestination?.replace,\n ceiling.conditionalCopyDestination?.replace,\n ],\n [\n 'conditionalCopyDestination.atomicWithSource',\n profile.conditionalCopyDestination?.atomicWithSource,\n ceiling.conditionalCopyDestination?.atomicWithSource,\n ],\n [\n 'conditionalMultipartCompletion.create',\n profile.conditionalMultipartCompletion?.create,\n ceiling.conditionalMultipartCompletion?.create,\n ],\n [\n 'conditionalMultipartCompletion.replace',\n profile.conditionalMultipartCompletion?.replace,\n ceiling.conditionalMultipartCompletion?.replace,\n ],\n ] as const;\n for (const [name, declared, supported] of booleanClaims) {\n if (declared === true && supported !== true) {\n throw new TypeError(\n `S3 provider profile \"${profile.name}\" cannot widen ${ceiling.name} with ${name}.`,\n );\n }\n }\n}\n\nexport const AWS_S3_PROVIDER_PROFILE = defineS3ProviderProfile({\n name: 'aws-s3-general-purpose',\n physicalKey: { maxBytes: 1024 },\n signedUploadPolicy: { contentType: true, sizeRange: true },\n conditionalCreate: { resultEtag: true },\n conditionalReplace: { resultEtag: true },\n conditionalDelete: { etag: true },\n conditionalRead: { etag: true, version: true },\n conditionalCopySource: { etag: true, version: true },\n conditionalCopyDestination: {\n atomicWithSource: true,\n create: true,\n replace: true,\n },\n conditionalMultipartCompletion: { create: true, replace: true },\n});\n\nexport const CLOUDFLARE_R2_PROVIDER_PROFILE = defineS3ProviderProfile({\n name: 'cloudflare-r2-stable',\n physicalKey: { maxBytes: 1024 },\n signedUploadPolicy: { contentType: true, sizeRange: false },\n conditionalCreate: { resultEtag: true },\n conditionalReplace: { resultEtag: true },\n conditionalRead: { etag: true, version: false },\n conditionalCopySource: { etag: true, version: false },\n});\n\nconst UNVERIFIED_S3_PROVIDER_PROFILE = defineS3ProviderProfile({\n name: 'unverified-s3-compatible',\n physicalKey: { maxBytes: 1024 },\n signedUploadPolicy: { contentType: false, sizeRange: false },\n});\n\ntype S3StorageAdapterBase = S3Adapter &\n FilesSdkPhysicalKeyAdapter &\n FilesSdkSignedDownloadPolicyAdapter &\n FilesSdkSignedUploadPolicyAdapter;\n\nexport type S3StorageAdapter = S3StorageAdapterBase &\n Partial<\n FilesSdkConditionalCopyAdapter &\n FilesSdkConditionalDeleteAdapter &\n FilesSdkConditionalReadAdapter &\n FilesSdkConditionalUploadAdapter\n >;\n\nfunction copySource(\n bucket: string,\n key: string,\n version: string | undefined,\n): string {\n const source = `${encodeURIComponent(bucket)}/${encodeURIComponent(key)}`;\n return version === undefined\n ? source\n : `${source}?versionId=${encodeURIComponent(version)}`;\n}\n\nfunction operationSignal(\n options: StorageOperationOptions,\n): AbortSignal | undefined {\n const timeoutSignal =\n options.timeout === undefined || options.timeout <= 0\n ? undefined\n : AbortSignal.timeout(options.timeout);\n if (options.signal === undefined) {\n return timeoutSignal;\n }\n return timeoutSignal === undefined\n ? options.signal\n : AbortSignal.any([options.signal, timeoutSignal]);\n}\n\nfunction maxRetries(options: StorageOperationOptions): number {\n const configured =\n typeof options.retries === 'number'\n ? options.retries\n : options.retries?.max;\n return Math.max(0, Math.floor(configured ?? 0));\n}\n\nfunction etagHeader(\n etag: string,\n key: string,\n operation: 'copy' | 'delete' | 'download' | 'upload',\n label: string,\n): string {\n const header = storageEtagHeader(etag);\n if (header === undefined) {\n throw new StorageError(`${label} must be a canonical storage ETag.`, {\n code: StorageErrorCode.INVALID_ARGUMENT,\n key,\n operation,\n permanent: true,\n });\n }\n return header;\n}\n\nfunction providerEtag(\n etag: unknown,\n key: string,\n operation: 'download' | 'upload',\n): string | undefined {\n if (etag === undefined) {\n return undefined;\n }\n const normalized = normalizeProviderStorageEtag(etag);\n if (normalized === undefined) {\n throw new StorageError('S3 returned an invalid ETag.', {\n code: StorageErrorCode.PROVIDER,\n key,\n operation,\n permanent: true,\n });\n }\n return normalized;\n}\n\nfunction contentTypeOf(\n body: StorageBody,\n override: string | undefined,\n): string {\n if (override !== undefined) {\n return override;\n }\n if (typeof body === 'string') {\n return 'text/plain; charset=utf-8';\n }\n if (body instanceof Blob && body.type.length > 0) {\n return body.type;\n }\n return 'application/octet-stream';\n}\n\nasync function normalizeConditionalBody(\n body: StorageBody,\n onProgress: StorageConditionalUploadOptions['onProgress'],\n): Promise<{\n body: Uint8Array | ReadableStream<Uint8Array>;\n size: () => number;\n contentLength?: number;\n}> {\n let bytes: Uint8Array | undefined;\n if (typeof body === 'string') {\n bytes = new TextEncoder().encode(body);\n } else if (body instanceof Uint8Array) {\n bytes = body;\n } else if (body instanceof ArrayBuffer) {\n bytes = new Uint8Array(body);\n } else if (ArrayBuffer.isView(body)) {\n bytes = new Uint8Array(body.buffer, body.byteOffset, body.byteLength);\n } else if (body instanceof Blob) {\n bytes = new Uint8Array(await body.arrayBuffer());\n }\n\n if (bytes !== undefined) {\n const total = bytes.byteLength;\n onProgress?.({ loaded: 0, total });\n return { body: bytes, contentLength: total, size: () => total };\n }\n\n const stream =\n body instanceof Readable\n ? (Readable.toWeb(body) as ReadableStream<Uint8Array>)\n : body;\n if (!(stream instanceof ReadableStream)) {\n throw new StorageError('Unsupported conditional upload body.', {\n code: StorageErrorCode.INVALID_ARGUMENT,\n operation: 'upload',\n permanent: true,\n });\n }\n const reader = stream.getReader();\n let loaded = 0;\n return {\n body: new ReadableStream<Uint8Array>({\n cancel(reason) {\n return reader.cancel(reason);\n },\n async pull(controller) {\n const result = await reader.read();\n if (result.done) {\n controller.close();\n return;\n }\n loaded += result.value.byteLength;\n controller.enqueue(result.value);\n onProgress?.({ loaded });\n },\n }),\n size: () => loaded,\n };\n}\n\nfunction s3ErrorIdentity(error: unknown): {\n code: string | undefined;\n status: number | undefined;\n} {\n if (typeof error !== 'object' || error === null) {\n return { code: undefined, status: undefined };\n }\n const candidate = error as {\n readonly name?: unknown;\n readonly Code?: unknown;\n readonly code?: unknown;\n readonly $metadata?: { readonly httpStatusCode?: unknown };\n };\n const serviceCode = candidate.name ?? candidate.Code ?? candidate.code;\n const status = candidate.$metadata?.httpStatusCode;\n return {\n code: typeof serviceCode === 'string' ? serviceCode : undefined,\n status: typeof status === 'number' ? status : undefined,\n };\n}\n\nfunction mapS3ConditionalError(\n error: unknown,\n operation: 'copy' | 'delete' | 'download' | 'upload',\n): StorageError {\n if (isStorageError(error)) {\n return error;\n }\n const identity = s3ErrorIdentity(error);\n const provider = mapFilesSdkError(mapS3Error(error));\n const precondition =\n identity.status === 412 || identity.code === 'PreconditionFailed';\n const conditionalConflict =\n identity.status === 409 || identity.code === 'ConditionalRequestConflict';\n const notFound =\n identity.status === 404 ||\n identity.code === 'NoSuchKey' ||\n identity.code === 'NoSuchUpload' ||\n provider.code === StorageErrorCode.NOT_FOUND;\n const code =\n precondition || conditionalConflict\n ? StorageErrorCode.CONFLICT\n : notFound\n ? StorageErrorCode.NOT_FOUND\n : provider.code;\n return new StorageError(`Conditional S3 ${operation} failed.`, {\n aborted: provider.aborted,\n code,\n operation,\n permanent:\n precondition || notFound\n ? true\n : conditionalConflict\n ? false\n : provider.permanent,\n timedOut: provider.timedOut,\n });\n}\n\nasync function withS3Retry<Result>(\n options: StorageOperationOptions,\n operationName: 'copy' | 'delete' | 'download' | 'upload',\n operation: (signal: AbortSignal | undefined) => Promise<Result>,\n): Promise<Result> {\n const retries = maxRetries(options);\n for (let attempt = 0; ; attempt += 1) {\n const signal = operationSignal(options);\n try {\n return await operation(signal);\n } catch (error) {\n const mapped = mapS3ConditionalError(error, operationName);\n if (\n attempt >= retries ||\n mapped.code !== StorageErrorCode.PROVIDER ||\n mapped.aborted ||\n mapped.permanent ||\n signal?.aborted === true\n ) {\n throw mapped;\n }\n const delay =\n typeof options.retries === 'object' &&\n options.retries.backoff !== undefined\n ? options.retries.backoff({\n attempt: attempt + 1,\n error: mapped,\n })\n : Math.min(1000, 100 * 2 ** attempt);\n await waitForRetry(delay, options.signal);\n }\n }\n}\n\nasync function waitForRetry(\n milliseconds: number,\n signal: AbortSignal | undefined,\n): Promise<void> {\n if (signal?.aborted === true) {\n throw signal.reason;\n }\n await new Promise<void>((resolve, reject) => {\n const cleanup = (): void => signal?.removeEventListener('abort', abort);\n const timer = setTimeout(\n () => {\n cleanup();\n resolve();\n },\n Math.max(0, milliseconds),\n );\n const abort = (): void => {\n clearTimeout(timer);\n cleanup();\n reject(signal?.reason);\n };\n signal?.addEventListener('abort', abort, { once: true });\n });\n}\n\nconst S3_MIN_MULTIPART_PART_BYTES = 5 * 1024 * 1024;\nconst S3_MAX_MULTIPART_PARTS = 10_000;\n\nfunction conditionalHeaders(\n condition: StorageConditionalUploadOptions['condition'],\n key: string,\n): { IfMatch?: string; IfNoneMatch?: string } {\n return condition.type === 'create'\n ? { IfNoneMatch: '*' }\n : {\n IfMatch: etagHeader(condition.etag, key, 'upload', 'condition.etag'),\n };\n}\n\nfunction rangeHeader(\n range: StorageConditionalReadOptions['range'],\n): string | undefined {\n if (range === undefined) return undefined;\n return `bytes=${range.start}-${range.end ?? ''}`;\n}\n\nfunction s3ResponseStream(body: unknown): ReadableStream<Uint8Array> {\n let stream: ReadableStream<Uint8Array>;\n if (body instanceof ReadableStream) {\n stream = body;\n } else if (body instanceof Readable) {\n stream = Readable.toWeb(body) as ReadableStream<Uint8Array>;\n } else if (\n typeof body === 'object' &&\n body !== null &&\n 'transformToWebStream' in body &&\n typeof body.transformToWebStream === 'function'\n ) {\n stream = body.transformToWebStream() as ReadableStream<Uint8Array>;\n } else {\n throw new StorageError('Conditional S3 download returned no body stream.', {\n code: StorageErrorCode.PROVIDER,\n operation: 'download',\n permanent: true,\n });\n }\n\n const reader = stream.getReader();\n return new ReadableStream<Uint8Array>({\n async cancel(reason) {\n try {\n await reader.cancel(reason);\n } catch (error) {\n throw mapS3ConditionalError(error, 'download');\n } finally {\n reader.releaseLock();\n }\n },\n async pull(controller) {\n try {\n const result = await reader.read();\n if (result.done) {\n reader.releaseLock();\n controller.close();\n return;\n }\n controller.enqueue(result.value);\n } catch (error) {\n reader.releaseLock();\n controller.error(mapS3ConditionalError(error, 'download'));\n }\n },\n });\n}\n\nasync function* multipartParts(\n source: Uint8Array | ReadableStream<Uint8Array>,\n partSize: number,\n): AsyncGenerator<Uint8Array> {\n if (source instanceof Uint8Array) {\n for (let offset = 0; offset < source.byteLength; offset += partSize) {\n yield source.subarray(\n offset,\n Math.min(offset + partSize, source.byteLength),\n );\n }\n return;\n }\n\n const reader = source.getReader();\n let buffered = new Uint8Array(0);\n try {\n for (;;) {\n const result = await reader.read();\n if (result.done) break;\n const combined = new Uint8Array(\n buffered.byteLength + result.value.byteLength,\n );\n combined.set(buffered);\n combined.set(result.value, buffered.byteLength);\n buffered = combined;\n while (buffered.byteLength >= partSize) {\n yield buffered.slice(0, partSize);\n buffered = buffered.slice(partSize);\n }\n }\n if (buffered.byteLength > 0) yield buffered;\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction missingResultEtag(key: string): StorageError {\n return new StorageError(\n 'S3 committed a conditional upload without returning the ETag required to identify its result; reconcile the destination before retrying.',\n {\n code: StorageErrorCode.PROVIDER,\n key,\n operation: 'upload',\n permanent: true,\n },\n );\n}\n\ntype S3RequestAdapter = Pick<S3Adapter, 'bucket' | 'raw'>;\n\nasync function uploadConditionalSingle(\n base: S3RequestAdapter,\n key: string,\n body: StorageBody,\n conditional: StorageConditionalUploadOptions,\n): Promise<StorageUploadResult> {\n const normalized = await normalizeConditionalBody(\n body,\n conditional.onProgress,\n );\n const contentType = contentTypeOf(body, conditional.contentType);\n const retryOptions: StorageOperationOptions =\n normalized.contentLength === undefined\n ? { ...conditional, retries: 0 }\n : conditional;\n const result = await withS3Retry(retryOptions, 'upload', (signal) =>\n base.raw.send(\n new PutObjectCommand({\n Body: normalized.body,\n Bucket: base.bucket,\n ...(conditional.cacheControl !== undefined && {\n CacheControl: conditional.cacheControl,\n }),\n ...(normalized.contentLength !== undefined && {\n ContentLength: normalized.contentLength,\n }),\n ContentType: contentType,\n ...conditionalHeaders(conditional.condition, key),\n Key: key,\n ...(conditional.metadata !== undefined && {\n Metadata: conditional.metadata,\n }),\n }),\n signal === undefined ? undefined : { abortSignal: signal },\n ),\n );\n const size = normalized.size();\n conditional.onProgress?.({\n loaded: size,\n ...(normalized.contentLength !== undefined && {\n total: normalized.contentLength,\n }),\n });\n const etag = providerEtag(result.ETag, key, 'upload');\n if (etag === undefined) throw missingResultEtag(key);\n return { contentType, etag, key, size };\n}\n\nasync function uploadConditionalMultipart(\n base: S3RequestAdapter,\n key: string,\n body: StorageBody,\n conditional: StorageConditionalUploadOptions,\n): Promise<StorageUploadResult> {\n const configuredPartSize =\n typeof conditional.multipart === 'object'\n ? conditional.multipart.partSize\n : undefined;\n if (\n configuredPartSize !== undefined &&\n (!Number.isSafeInteger(configuredPartSize) || configuredPartSize <= 0)\n ) {\n throw new StorageError(\n 'multipart.partSize must be a positive safe integer.',\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n key,\n operation: 'upload',\n permanent: true,\n },\n );\n }\n const partSize = Math.max(\n S3_MIN_MULTIPART_PART_BYTES,\n configuredPartSize ?? S3_MIN_MULTIPART_PART_BYTES,\n );\n const normalized = await normalizeConditionalBody(body, undefined);\n if (normalized.contentLength === 0) {\n return uploadConditionalSingle(base, key, new Uint8Array(), {\n ...conditional,\n multipart: false,\n });\n }\n const contentType = contentTypeOf(body, conditional.contentType);\n let uploadId: string | undefined;\n let size = 0;\n try {\n const created = await withS3Retry(conditional, 'upload', (signal) =>\n base.raw.send(\n new CreateMultipartUploadCommand({\n Bucket: base.bucket,\n ...(conditional.cacheControl !== undefined && {\n CacheControl: conditional.cacheControl,\n }),\n ContentType: contentType,\n Key: key,\n ...(conditional.metadata !== undefined && {\n Metadata: conditional.metadata,\n }),\n }),\n signal === undefined ? undefined : { abortSignal: signal },\n ),\n );\n uploadId = created.UploadId;\n if (uploadId === undefined || uploadId.length === 0) {\n throw new StorageError('S3 did not return a multipart upload ID.', {\n code: StorageErrorCode.PROVIDER,\n key,\n operation: 'upload',\n permanent: true,\n });\n }\n\n const completedParts: Array<{ ETag: string; PartNumber: number }> = [];\n let partNumber = 0;\n for await (const part of multipartParts(normalized.body, partSize)) {\n partNumber += 1;\n if (partNumber > S3_MAX_MULTIPART_PARTS) {\n throw new StorageError(\n `Conditional multipart upload exceeds the ${S3_MAX_MULTIPART_PARTS}-part S3 limit.`,\n {\n code: StorageErrorCode.LIMIT_EXCEEDED,\n key,\n operation: 'upload',\n permanent: true,\n },\n );\n }\n const uploaded = await withS3Retry(conditional, 'upload', (signal) =>\n base.raw.send(\n new UploadPartCommand({\n Body: part,\n Bucket: base.bucket,\n ContentLength: part.byteLength,\n Key: key,\n PartNumber: partNumber,\n UploadId: uploadId,\n }),\n signal === undefined ? undefined : { abortSignal: signal },\n ),\n );\n const partEtag = providerEtag(uploaded.ETag, key, 'upload');\n if (partEtag === undefined) {\n throw new StorageError('S3 upload part returned no ETag.', {\n code: StorageErrorCode.PROVIDER,\n key,\n operation: 'upload',\n permanent: true,\n });\n }\n completedParts.push({\n ETag: storageEtagHeader(partEtag)!,\n PartNumber: partNumber,\n });\n size += part.byteLength;\n conditional.onProgress?.({\n loaded: size,\n ...(normalized.contentLength !== undefined && {\n total: normalized.contentLength,\n }),\n });\n }\n if (completedParts.length === 0) {\n await base.raw.send(\n new AbortMultipartUploadCommand({\n Bucket: base.bucket,\n Key: key,\n UploadId: uploadId,\n }),\n );\n uploadId = undefined;\n return uploadConditionalSingle(base, key, new Uint8Array(), {\n ...conditional,\n multipart: false,\n });\n }\n\n const completed = await withS3Retry(conditional, 'upload', (signal) =>\n base.raw.send(\n new CompleteMultipartUploadCommand({\n Bucket: base.bucket,\n ...conditionalHeaders(conditional.condition, key),\n Key: key,\n MultipartUpload: { Parts: completedParts },\n UploadId: uploadId,\n }),\n signal === undefined ? undefined : { abortSignal: signal },\n ),\n );\n const etag = providerEtag(completed.ETag, key, 'upload');\n if (etag === undefined) throw missingResultEtag(key);\n uploadId = undefined;\n return { contentType, etag, key, size };\n } catch (error) {\n if (uploadId !== undefined) {\n await base.raw\n .send(\n new AbortMultipartUploadCommand({\n Bucket: base.bucket,\n Key: key,\n UploadId: uploadId,\n }),\n )\n .catch(() => undefined);\n }\n throw error;\n }\n}\n\nconst configuredS3Clients = new WeakSet<S3Adapter['raw']>();\n\n/** Constructs the upstream S3 adapter while retaining security-relevant metadata. */\nexport function s3(options: S3AdapterOptions): S3Adapter {\n const adapter = createFilesSdkS3Adapter(options);\n markFilesSdkS3AdapterUndecorated(adapter);\n recordS3ConstructionMetadata(adapter.raw, {\n publicBaseUrlConfigured: options.publicBaseUrl !== undefined,\n });\n return adapter;\n}\n\n/**\n * Adds only the exact operations declared by one verified provider profile.\n * Each raw adapter may be decorated once so capability state cannot depend on\n * profile application order. A native AWS SDK endpoint also bounds every\n * explicit profile by the built-in AWS capability ceiling.\n */\nexport function withS3Capabilities(\n base: S3Adapter,\n options: Pick<S3AdapterOptions, 'endpoint' | 'publicBaseUrl'> & {\n providerProfile?: S3ProviderProfile;\n } = {},\n): S3StorageAdapter {\n const raw = base.raw;\n if (configuredS3Clients.has(raw)) {\n throw new TypeError(\n 'withS3Capabilities may only be applied once to an S3 adapter.',\n );\n }\n assertFilesSdkS3AdapterHasNoReservedExtensions(base);\n const sdkHasCustomEndpoint = raw.config.isCustomEndpoint === true;\n if (options.endpoint !== undefined && !sdkHasCustomEndpoint) {\n throw new TypeError(\n 'The declared S3 endpoint does not match the SDK client endpoint provenance.',\n );\n }\n if (!sdkHasCustomEndpoint) {\n // files-sdk does not expose this S3Client constructor option. Endpoint\n // resolution is lazy, so fixing the resolved SDK config before the adapter\n // is exposed prevents environment and shared-config endpoint redirection.\n raw.config.ignoreConfiguredEndpointUrls = true;\n }\n const inferredNativeAws = base.name === 's3' && !sdkHasCustomEndpoint;\n const profile =\n options.providerProfile ??\n (inferredNativeAws\n ? AWS_S3_PROVIDER_PROFILE\n : UNVERIFIED_S3_PROVIDER_PROFILE);\n assertVerifiedS3ProviderProfile(profile);\n if (!sdkHasCustomEndpoint) {\n assertS3ProviderProfileContainedBy(profile, AWS_S3_PROVIDER_PROFILE);\n }\n const provenance =\n options.providerProfile === undefined\n ? inferredNativeAws\n ? 'native'\n : 'unverified'\n : inferredNativeAws\n ? 'native'\n : 'verified';\n const constructionMetadata = getS3ConstructionMetadata(raw);\n const publicBaseUrlConfigured =\n options.publicBaseUrl !== undefined ||\n constructionMetadata?.publicBaseUrlConfigured === true;\n const bucket = base.bucket;\n const requestAdapter: S3RequestAdapter = { bucket, raw };\n const signedUploadUrl: S3Adapter['signedUploadUrl'] = async (\n key,\n signOptions,\n ) => {\n if (\n signOptions.minSize !== undefined &&\n signOptions.maxSize === undefined\n ) {\n throw new StorageError(\n 'S3 signed uploads cannot enforce minSize without maxSize.',\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n key,\n operation: 'signUpload',\n permanent: true,\n },\n );\n }\n if (signOptions.maxSize !== undefined && key.endsWith('${filename}')) {\n throw new StorageError(\n 'Signed POST keys must not end with the AWS ${filename} template.',\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n key,\n operation: 'signUpload',\n permanent: true,\n },\n );\n }\n if (\n signOptions.contentType !== undefined &&\n profile.signedUploadPolicy.contentType !== true\n ) {\n throw new StorageError(\n `S3 provider profile \"${profile.name}\" cannot enforce signed-upload contentType.`,\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n key,\n operation: 'signUpload',\n permanent: true,\n },\n );\n }\n if (\n signOptions.maxSize !== undefined &&\n profile.signedUploadPolicy.sizeRange !== true\n ) {\n throw new StorageError(\n `S3 provider profile \"${profile.name}\" cannot enforce signed-upload sizeRange.`,\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n key,\n operation: 'signUpload',\n permanent: true,\n },\n );\n }\n\n try {\n if (signOptions.maxSize !== undefined) {\n const conditions: NonNullable<PresignedPostOptions['Conditions']> = [\n [\n 'content-length-range',\n signOptions.minSize ?? 1,\n signOptions.maxSize,\n ],\n ];\n if (signOptions.contentType !== undefined) {\n conditions.push(['eq', '$Content-Type', signOptions.contentType]);\n }\n const post = await createPresignedPost(raw, {\n Bucket: bucket,\n Conditions: conditions,\n Expires: signOptions.expiresIn,\n Key: key,\n ...(signOptions.contentType !== undefined && {\n Fields: { 'Content-Type': signOptions.contentType },\n }),\n });\n return { fields: post.fields, method: 'POST', url: post.url };\n }\n\n const url = await getSignedUrl(\n raw,\n new PutObjectCommand({\n Bucket: bucket,\n Key: key,\n ...(signOptions.contentType !== undefined && {\n ContentType: signOptions.contentType,\n }),\n }),\n {\n expiresIn: signOptions.expiresIn,\n ...(signOptions.contentType !== undefined && {\n signableHeaders: new Set(['content-type']),\n }),\n },\n );\n return {\n ...(signOptions.contentType !== undefined && {\n headers: { 'Content-Type': signOptions.contentType },\n }),\n method: 'PUT',\n url,\n };\n } catch (error: unknown) {\n throw mapS3Error(error);\n }\n };\n const adapter = Object.assign(base, {\n physicalKey: profile.physicalKey,\n signedUploadPolicy: profile.signedUploadPolicy,\n signedUploadUrl,\n signedDownloadPolicy: Object.freeze({\n expiresIn: constructionMetadata !== undefined && !publicBaseUrlConfigured,\n }),\n } satisfies FilesSdkPhysicalKeyAdapter &\n FilesSdkSignedDownloadPolicyAdapter &\n FilesSdkSignedUploadPolicyAdapter &\n Pick<S3Adapter, 'signedUploadUrl'>) as S3StorageAdapter;\n\n if (\n profile.conditionalCopySource !== undefined ||\n profile.conditionalCopyDestination !== undefined\n ) {\n Object.assign(adapter, {\n ...(profile.conditionalCopySource !== undefined && {\n conditionalCopySource: profile.conditionalCopySource,\n }),\n ...(profile.conditionalCopyDestination !== undefined && {\n conditionalCopyDestination: profile.conditionalCopyDestination,\n }),\n async promote(\n sourceKey: string,\n destinationKey: string,\n promotion: StoragePromotionOptions,\n ): Promise<void> {\n const destination = promotion.destination;\n if (\n destination !== undefined &&\n (typeof destination !== 'object' ||\n destination === null ||\n (destination.type !== 'create' && destination.type !== 'replace'))\n ) {\n throw new StorageError(\n 'destination.type must be \"create\" or \"replace\".',\n {\n code: StorageErrorCode.INVALID_ARGUMENT,\n key: destinationKey,\n operation: 'promote',\n permanent: true,\n },\n );\n }\n if (\n (promotion.sourceEtag !== undefined &&\n profile.conditionalCopySource?.etag !== true) ||\n (promotion.sourceVersion !== undefined &&\n profile.conditionalCopySource?.version !== true) ||\n (promotion.destination?.type === 'create' &&\n profile.conditionalCopyDestination?.create !== true) ||\n (promotion.destination?.type === 'replace' &&\n profile.conditionalCopyDestination?.replace !== true) ||\n (promotion.destination !== undefined &&\n (promotion.sourceEtag !== undefined ||\n promotion.sourceVersion !== undefined) &&\n profile.conditionalCopyDestination?.atomicWithSource !== true)\n ) {\n throw new StorageError(\n `S3 provider profile \"${profile.name}\" does not support the requested conditional promotion.`,\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n key: sourceKey,\n operation: 'promote',\n permanent: true,\n },\n );\n }\n await withS3Retry(promotion, 'copy', async (signal) => {\n await raw.send(\n new CopyObjectCommand({\n Bucket: bucket,\n CopySource: copySource(\n bucket,\n sourceKey,\n promotion.sourceVersion,\n ),\n ...(promotion.sourceEtag !== undefined && {\n CopySourceIfMatch: etagHeader(\n promotion.sourceEtag,\n sourceKey,\n 'copy',\n 'sourceEtag',\n ),\n }),\n ...(promotion.destination?.type === 'create'\n ? { IfNoneMatch: '*' }\n : promotion.destination?.type === 'replace'\n ? {\n IfMatch: etagHeader(\n promotion.destination.etag,\n destinationKey,\n 'copy',\n 'destination.etag',\n ),\n }\n : {}),\n Key: destinationKey,\n }),\n signal === undefined ? undefined : { abortSignal: signal },\n );\n });\n },\n } satisfies FilesSdkConditionalCopyAdapter);\n }\n\n if (profile.conditionalRead !== undefined) {\n Object.assign(adapter, {\n conditionalRead: profile.conditionalRead,\n async downloadConditional(\n key: string,\n options: StorageConditionalReadOptions,\n ): Promise<StorageObject> {\n if (\n (options.condition.etag !== undefined &&\n profile.conditionalRead?.etag !== true) ||\n (options.condition.version !== undefined &&\n profile.conditionalRead?.version !== true)\n ) {\n throw new StorageError(\n `S3 provider profile \"${profile.name}\" does not support the requested conditional read.`,\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n key,\n operation: 'download',\n permanent: true,\n },\n );\n }\n const result = await withS3Retry(options, 'download', (signal) =>\n raw.send(\n new GetObjectCommand({\n Bucket: bucket,\n ...(options.condition.etag !== undefined && {\n IfMatch: etagHeader(\n options.condition.etag,\n key,\n 'download',\n 'condition.etag',\n ),\n }),\n Key: key,\n ...(rangeHeader(options.range) !== undefined && {\n Range: rangeHeader(options.range),\n }),\n ...(options.condition.version !== undefined && {\n VersionId: options.condition.version,\n }),\n }),\n signal === undefined ? undefined : { abortSignal: signal },\n ),\n );\n const etag = providerEtag(result.ETag, key, 'download');\n return {\n body: s3ResponseStream(result.Body),\n contentType: result.ContentType ?? 'application/octet-stream',\n ...(etag !== undefined && { etag }),\n key,\n ...(result.LastModified !== undefined && {\n lastModified: result.LastModified,\n }),\n ...(result.Metadata !== undefined && { metadata: result.Metadata }),\n name: key.split('/').at(-1) ?? key,\n size: Number(result.ContentLength ?? 0),\n };\n },\n } satisfies FilesSdkConditionalReadAdapter);\n }\n\n if (profile.conditionalDelete !== undefined) {\n Object.assign(adapter, {\n conditionalDelete: profile.conditionalDelete,\n async deleteConditional(\n key: string,\n options: StorageConditionalDeleteOptions,\n ): Promise<void> {\n await withS3Retry(options, 'delete', async (signal) => {\n await raw.send(\n new DeleteObjectCommand({\n Bucket: bucket,\n IfMatch: etagHeader(\n options.condition.etag,\n key,\n 'delete',\n 'condition.etag',\n ),\n Key: key,\n }),\n signal === undefined ? undefined : { abortSignal: signal },\n );\n });\n },\n } satisfies FilesSdkConditionalDeleteAdapter);\n }\n\n if (\n profile.conditionalCreate !== undefined ||\n profile.conditionalReplace !== undefined\n ) {\n Object.assign(adapter, {\n ...(profile.conditionalCreate !== undefined && {\n conditionalCreate: profile.conditionalCreate,\n }),\n ...(profile.conditionalReplace !== undefined && {\n conditionalReplace: profile.conditionalReplace,\n }),\n ...(profile.conditionalMultipartCompletion !== undefined && {\n conditionalMultipartCompletion: profile.conditionalMultipartCompletion,\n }),\n async uploadConditional(\n key: string,\n body: StorageBody,\n conditional: StorageConditionalUploadOptions,\n ): Promise<StorageUploadResult> {\n if (conditional.condition.type === 'replace') {\n etagHeader(\n conditional.condition.etag,\n key,\n 'upload',\n 'condition.etag',\n );\n }\n const supported =\n conditional.condition.type === 'create'\n ? profile.conditionalCreate !== undefined\n : profile.conditionalReplace !== undefined;\n const multipartRequested =\n conditional.multipart !== undefined &&\n conditional.multipart !== false;\n const multipartSupported =\n !multipartRequested ||\n (conditional.condition.type === 'create'\n ? profile.conditionalMultipartCompletion?.create === true\n : profile.conditionalMultipartCompletion?.replace === true);\n if (!supported || !multipartSupported) {\n throw new StorageError(\n `S3 provider profile \"${profile.name}\" does not support the requested conditional upload.`,\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n key,\n operation: 'upload',\n permanent: true,\n },\n );\n }\n if (conditional.control !== undefined) {\n throw new StorageError(\n 'Conditional S3 uploads do not support resumable control.',\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n key,\n operation: 'upload',\n permanent: true,\n },\n );\n }\n return multipartRequested\n ? uploadConditionalMultipart(requestAdapter, key, body, conditional)\n : uploadConditionalSingle(requestAdapter, key, body, conditional);\n },\n } satisfies FilesSdkConditionalUploadAdapter);\n }\n\n Object.freeze(adapter);\n markFilesSdkS3RawClientProvenance(raw, adapter, provenance);\n configuredS3Clients.add(raw);\n return adapter;\n}\n\n/**\n * Creates the files-sdk S3 driver from the storage package's own dependency\n * context and exposes only the operations in its verified provider profile.\n */\nexport function createS3StorageDriver(\n options: S3StorageDriverOptions,\n): FilesSdkStorageDriver<S3StorageAdapter> {\n const { adapter: adapterOptions, ...filesOptions } = options;\n const { providerProfile, ...plainFilesOptions } = filesOptions;\n const unverifiedCustomEndpoint =\n adapterOptions.endpoint !== undefined && providerProfile === undefined;\n return createFilesSdkDriver({\n ...plainFilesOptions,\n ...(unverifiedCustomEndpoint && { readonly: true }),\n adapter: withS3Capabilities(s3(adapterOptions), {\n ...adapterOptions,\n ...(providerProfile !== undefined && { providerProfile }),\n }),\n });\n}\n\nexport { mapS3Error };\nexport type { S3Adapter, S3AdapterOptions, S3Sdk } from 'files-sdk/s3';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-gateway.controller.d.ts","sourceRoot":"","sources":["../../src/gateway/storage-gateway.controller.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"storage-gateway.controller.d.ts","sourceRoot":"","sources":["../../src/gateway/storage-gateway.controller.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAcvD,OAAO,EAGL,KAAK,6BAA6B,EAClC,KAAK,uBAAuB,EAG7B,MAAM,4BAA4B,CAAC;AAEpC,UAAU,gBAAgB,CAAC,MAAM;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAmXD,qBAEa,wBAAwB;;IAEjC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAExB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAExB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAL5B,YACmB,OAAO,EAAE,cAAc,EAEvB,OAAO,EAAE,6BAA6B,EAEtC,SAAS,EAAE,uBAAuB,EACjD;IAGE,QAAQ,CACE,GAAG,EAAE,MAAM,GAAG,SAAS,EACrB,KAAK,EAAE,MAAM,GAAG,SAAS,EACpB,UAAU,EAAE,MAAM,GAAG,SAAS,EAChC,QAAQ,EAAE,MAAM,GAAG,SAAS,EACzB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC9C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,GACvB,OAAO,CAAC,IAAI,CAAC,CAwHf;IAMK,MAAM,CACI,GAAG,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,OAAO,GACtB,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CA2DpC;IAGK,IAAI,CACM,GAAG,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,GACvB,OAAO,CAAC,IAAI,CAAC,CAkBf;IAGK,MAAM,CACI,GAAG,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,OAAO,GACtB,OAAO,CAAC,gBAAgB,CAAC;QAAE,OAAO,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC,CAY9C;IAGK,IAAI,CACS,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC3B,KAAK,EAAE,MAAM,GAAG,SAAS,EACrB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC1C,OAAO,EAAE,OAAO,GACtB,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAwBpC;IAGK,MAAM,CACQ,OAAO,EAAE,MAAM,GAAG,SAAS,EAC5B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC3B,KAAK,EAAE,MAAM,GAAG,SAAS,EACpB,UAAU,EAAE,MAAM,GAAG,SAAS,EACnC,KAAK,EAAE,MAAM,GAAG,SAAS,EACf,eAAe,EAAE,MAAM,GAAG,SAAS,EACtD,OAAO,EAAE,OAAO,GACtB,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CA+DpC;IAGK,YAAY,CACR,IAAI,EAAE,OAAO,EACd,OAAO,EAAE,OAAO,GACtB,OAAO,CAAC,gBAAgB,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CA2C5C;IAGK,UAAU,CACN,IAAI,EAAE,OAAO,EACd,OAAO,EAAE,OAAO,GACtB,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CA4EpC;IAGK,IAAI,CACA,IAAI,EAAE,OAAO,EACd,OAAO,EAAE,OAAO,GACtB,OAAO,CAAC,gBAAgB,CAAC;QAAE,MAAM,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC,CAqB7C;IAGK,IAAI,CACA,IAAI,EAAE,OAAO,EACd,OAAO,EAAE,OAAO,GACtB,OAAO,CAAC,gBAAgB,CAAC;QAAE,KAAK,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC,CAqB5C;CA8DF"}
|
|
@@ -15,6 +15,7 @@ import { ServerResponse } from 'node:http';
|
|
|
15
15
|
import { Readable } from 'node:stream';
|
|
16
16
|
import { pipeline } from 'node:stream/promises';
|
|
17
17
|
import { StorageError, StorageErrorCode, isStorageError, } from '../storage.error.js';
|
|
18
|
+
import { storageEtagHeader } from '../storage-etag.js';
|
|
18
19
|
import { StorageService } from '../storage.service.js';
|
|
19
20
|
import { StorageGatewayGuard } from './storage-gateway.guard.js';
|
|
20
21
|
import { FASTIFY_STORAGE_UPLOAD_CONFIG } from './storage-gateway-fastify-parser.js';
|
|
@@ -212,11 +213,21 @@ async function* enforceUploadLimit(source, maxBytes) {
|
|
|
212
213
|
yield bytes;
|
|
213
214
|
}
|
|
214
215
|
}
|
|
215
|
-
function
|
|
216
|
+
function providerEtagHeader(object) {
|
|
217
|
+
const etag = object.etag === undefined ? undefined : storageEtagHeader(object.etag);
|
|
218
|
+
if (object.etag !== undefined && etag === undefined) {
|
|
219
|
+
throw new StorageError('Storage provider returned a malformed ETag.', {
|
|
220
|
+
code: StorageErrorCode.PROVIDER,
|
|
221
|
+
permanent: true,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
return etag;
|
|
225
|
+
}
|
|
226
|
+
function setObjectHeaders(response, object, etag) {
|
|
216
227
|
response.setHeader('content-length', String(object.size));
|
|
217
228
|
response.setHeader('content-type', object.contentType);
|
|
218
|
-
if (
|
|
219
|
-
response.setHeader('etag',
|
|
229
|
+
if (etag !== undefined) {
|
|
230
|
+
response.setHeader('etag', etag);
|
|
220
231
|
}
|
|
221
232
|
if (object.lastModified !== undefined) {
|
|
222
233
|
response.setHeader('last-modified', object.lastModified.toUTCString());
|
|
@@ -335,10 +346,18 @@ let StorageGatewayController = class StorageGatewayController {
|
|
|
335
346
|
const object = await client.downloadStream(objectKey, {
|
|
336
347
|
...(range !== undefined && { range }),
|
|
337
348
|
});
|
|
349
|
+
let etag;
|
|
350
|
+
try {
|
|
351
|
+
etag = providerEtagHeader(object);
|
|
352
|
+
}
|
|
353
|
+
catch (error) {
|
|
354
|
+
await object.body.cancel(error).catch(() => undefined);
|
|
355
|
+
throw error;
|
|
356
|
+
}
|
|
338
357
|
const raw = rawResponseOf(response);
|
|
339
358
|
raw.statusCode =
|
|
340
359
|
range === undefined ? HttpStatus.OK : HttpStatus.PARTIAL_CONTENT;
|
|
341
|
-
setObjectHeaders(raw, object);
|
|
360
|
+
setObjectHeaders(raw, object, etag);
|
|
342
361
|
const baseContentType = object.contentType
|
|
343
362
|
.split(';', 1)[0]
|
|
344
363
|
?.trim()
|
|
@@ -412,9 +431,10 @@ let StorageGatewayController = class StorageGatewayController {
|
|
|
412
431
|
const metadata = await this.storage
|
|
413
432
|
.use(this.options.store)
|
|
414
433
|
.head(objectKey);
|
|
434
|
+
const etag = providerEtagHeader(metadata);
|
|
415
435
|
const raw = rawResponseOf(response);
|
|
416
436
|
raw.statusCode = HttpStatus.OK;
|
|
417
|
-
setObjectHeaders(raw, metadata);
|
|
437
|
+
setObjectHeaders(raw, metadata, etag);
|
|
418
438
|
raw.end();
|
|
419
439
|
});
|
|
420
440
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-gateway.controller.js","sourceRoot":"","sources":["../../src/gateway/storage-gateway.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BadRequestException,\n Body,\n Controller,\n Delete,\n Get,\n Head,\n HttpException,\n HttpStatus,\n Inject,\n Post,\n Put,\n Query,\n Req,\n Res,\n SetMetadata,\n UseGuards,\n} from '@nestjs/common';\nimport { ServerResponse } from 'node:http';\nimport { Readable } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\nimport type { ReadableStream as NodeReadableStream } from 'node:stream/web';\n\nimport {\n StorageError,\n StorageErrorCode,\n isStorageError,\n} from '../storage.error.js';\nimport { StorageService } from '../storage.service.js';\nimport type {\n StorageByteRange,\n StorageObject,\n StorageObjectMetadata,\n StorageSignedDownloadOptions,\n StorageSignedUploadOptions,\n} from '../storage.types.js';\nimport { StorageGatewayGuard } from './storage-gateway.guard.js';\nimport { FASTIFY_STORAGE_UPLOAD_CONFIG } from './storage-gateway-fastify-parser.js';\nimport {\n STORAGE_GATEWAY_KEY_POLICY,\n STORAGE_GATEWAY_OPTIONS,\n} from './storage-gateway.tokens.js';\nimport {\n StorageGatewayOperation,\n type ParsedStorageGatewayKey,\n type ResolvedStorageGatewayOptions,\n type StorageGatewayKeyPolicy,\n type StorageGatewayKeyTarget,\n type StorageGatewayOperation as StorageGatewayOperationName,\n} from './storage-gateway.types.js';\n\ninterface ResponseEnvelope<Result> {\n data: Result;\n}\n\ninterface ResponseWrapper {\n raw?: unknown;\n hijack?: () => void;\n}\n\ninterface RequestWrapper {\n raw?: unknown;\n body?: unknown;\n headers?: Record<string, string | string[] | undefined>;\n}\n\nconst MAX_GATEWAY_PATH_LENGTH = 1024;\n\nfunction parseGatewayPath(\n value: string | undefined,\n target: StorageGatewayKeyTarget,\n): ParsedStorageGatewayKey | undefined {\n if (value === undefined) {\n if (target === 'prefix') {\n return undefined;\n }\n throw new BadRequestException(`${target} is required.`);\n }\n if (value.length > MAX_GATEWAY_PATH_LENGTH) {\n throw new BadRequestException(\n `${target} cannot exceed ${MAX_GATEWAY_PATH_LENGTH} characters.`,\n );\n }\n if (value.length === 0) {\n if (target === 'prefix') {\n return Object.freeze({\n segments: Object.freeze([]),\n trailingSlash: false,\n value,\n });\n }\n throw new BadRequestException(`${target} must be a non-empty string.`);\n }\n if (\n [...value].some((character) => {\n const codePoint = character.codePointAt(0);\n return (\n character === '\\\\' ||\n codePoint === undefined ||\n codePoint <= 0x1f ||\n codePoint === 0x7f\n );\n })\n ) {\n throw new BadRequestException(\n `${target} cannot contain control characters or backslashes.`,\n );\n }\n if (target === 'pattern') {\n return Object.freeze({\n segments: Object.freeze(value.split('/')),\n trailingSlash: value.endsWith('/'),\n value,\n });\n }\n if (value.startsWith('/') || value.trim() !== value) {\n throw new BadRequestException(\n `${target} must be a relative object path without surrounding whitespace.`,\n );\n }\n const trailingSlash = value.endsWith('/');\n const segments = value.split('/');\n if (trailingSlash) {\n segments.pop();\n }\n if (\n segments.some(\n (segment) => segment.length === 0 || segment === '.' || segment === '..',\n )\n ) {\n throw new BadRequestException(\n `${target} cannot contain empty, dot, or parent path segments.`,\n );\n }\n return Object.freeze({\n segments: Object.freeze(segments),\n trailingSlash,\n value,\n });\n}\n\nfunction exactContentType(value: string, field: string): string {\n const normalized = value.toLowerCase();\n if (\n value !== normalized ||\n !/^[a-z0-9][a-z0-9!#$&^_.+-]*\\/[a-z0-9][a-z0-9!#$&^_.+-]*$/u.test(value)\n ) {\n throw new BadRequestException(\n `${field} must be a lowercase exact MIME type without parameters.`,\n );\n }\n return normalized;\n}\n\nfunction safeContentDisposition(value: string | undefined): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (value !== 'attachment' && value !== 'inline') {\n throw new BadRequestException(\n 'responseContentDisposition must be either \"attachment\" or \"inline\".',\n );\n }\n return value;\n}\n\nfunction recordOf(value: unknown, label: string): Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new BadRequestException(`${label} must be a JSON object.`);\n }\n return value as Record<string, unknown>;\n}\n\nfunction requiredString(\n record: Record<string, unknown>,\n field: string,\n): string {\n const value = record[field];\n if (typeof value !== 'string' || value.length === 0) {\n throw new BadRequestException(`${field} must be a non-empty string.`);\n }\n return value;\n}\n\nfunction optionalString(\n record: Record<string, unknown>,\n field: string,\n): string | undefined {\n const value = record[field];\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== 'string') {\n throw new BadRequestException(`${field} must be a string.`);\n }\n return value;\n}\n\nfunction optionalNumber(\n record: Record<string, unknown>,\n field: string,\n): number | undefined {\n const value = record[field];\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new BadRequestException(`${field} must be a finite number.`);\n }\n return value;\n}\n\nfunction optionalPositiveInteger(\n record: Record<string, unknown>,\n field: string,\n): number | undefined {\n const value = optionalNumber(record, field);\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {\n throw new BadRequestException(`${field} must be a positive safe integer.`);\n }\n return value;\n}\n\nfunction optionalNonNegativeInteger(\n record: Record<string, unknown>,\n field: string,\n): number | undefined {\n const value = optionalNumber(record, field);\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 0)) {\n throw new BadRequestException(\n `${field} must be a non-negative safe integer.`,\n );\n }\n return value;\n}\n\nfunction queryInteger(\n value: string | undefined,\n field: string,\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!/^[0-9]+$/u.test(value)) {\n throw new BadRequestException(`${field} must be a non-negative integer.`);\n }\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed)) {\n throw new BadRequestException(`${field} must be a safe integer.`);\n }\n return parsed;\n}\n\nfunction rawResponseOf(response: unknown): ServerResponse {\n if (response instanceof ServerResponse) {\n return response;\n }\n if (typeof response === 'object' && response !== null) {\n const wrapper = response as ResponseWrapper;\n wrapper.hijack?.();\n if (wrapper.raw instanceof ServerResponse) {\n return wrapper.raw;\n }\n }\n throw new Error('Unsupported Nest HTTP response adapter.');\n}\n\nfunction requestWrapperOf(request: unknown): RequestWrapper {\n if (typeof request !== 'object' || request === null) {\n throw new BadRequestException('Unsupported Nest HTTP request adapter.');\n }\n return request as RequestWrapper;\n}\n\nfunction requestHeader(request: unknown, name: string): string | undefined {\n const headers = requestWrapperOf(request).headers;\n const value = headers?.[name];\n return Array.isArray(value) ? value[0] : value;\n}\n\nfunction uploadSourceOf(request: unknown): Readable {\n const wrapper = requestWrapperOf(request);\n if (wrapper.body instanceof Readable) {\n return wrapper.body;\n }\n if (wrapper.body instanceof Uint8Array) {\n return Readable.from([wrapper.body]);\n }\n if (request instanceof Readable && !request.readableEnded) {\n return request;\n }\n if (wrapper.raw instanceof Readable && !wrapper.raw.readableEnded) {\n return wrapper.raw;\n }\n throw new BadRequestException(\n 'Proxy uploads require an application/octet-stream request body.',\n );\n}\n\nasync function* enforceUploadLimit(\n source: Readable,\n maxBytes: number,\n): AsyncGenerator<Uint8Array> {\n let received = 0;\n for await (const chunk of source) {\n const bytes =\n typeof chunk === 'string'\n ? new TextEncoder().encode(chunk)\n : chunk instanceof Uint8Array\n ? chunk\n : undefined;\n if (bytes === undefined) {\n throw new BadRequestException(\n 'Upload streams must contain byte or string chunks.',\n );\n }\n received += bytes.byteLength;\n if (received > maxBytes) {\n throw new StorageError(\n `Proxy upload exceeds the ${maxBytes}-byte gateway limit.`,\n {\n code: StorageErrorCode.LIMIT_EXCEEDED,\n permanent: true,\n },\n );\n }\n yield bytes;\n }\n}\n\nfunction setObjectHeaders(\n response: ServerResponse,\n object: StorageObject | StorageObjectMetadata,\n): void {\n response.setHeader('content-length', String(object.size));\n response.setHeader('content-type', object.contentType);\n if (object.etag !== undefined) {\n response.setHeader('etag', object.etag);\n }\n if (object.lastModified !== undefined) {\n response.setHeader('last-modified', object.lastModified.toUTCString());\n }\n}\n\nconst publicStorageMessages: Record<StorageErrorCode, string> = {\n [StorageErrorCode.NOT_FOUND]: 'Storage object was not found.',\n [StorageErrorCode.UNAUTHORIZED]: 'Storage operation is not permitted.',\n [StorageErrorCode.CONFLICT]: 'Storage object conflict.',\n [StorageErrorCode.READ_ONLY]: 'Storage operation is not permitted.',\n [StorageErrorCode.INVALID_ARGUMENT]: 'Invalid storage request.',\n [StorageErrorCode.NOT_SUPPORTED]: 'Storage operation is not supported.',\n [StorageErrorCode.ABORTED]: 'Storage operation was aborted.',\n [StorageErrorCode.TIMEOUT]: 'Storage operation timed out.',\n [StorageErrorCode.LIMIT_EXCEEDED]: 'Storage request limit exceeded.',\n [StorageErrorCode.PROVIDER]: 'Storage provider operation failed.',\n};\n\nfunction storageHttpStatus(error: StorageError): number {\n switch (error.code) {\n case StorageErrorCode.NOT_FOUND:\n return HttpStatus.NOT_FOUND;\n case StorageErrorCode.UNAUTHORIZED:\n case StorageErrorCode.READ_ONLY:\n return HttpStatus.FORBIDDEN;\n case StorageErrorCode.CONFLICT:\n return HttpStatus.CONFLICT;\n case StorageErrorCode.INVALID_ARGUMENT:\n return HttpStatus.BAD_REQUEST;\n case StorageErrorCode.NOT_SUPPORTED:\n return HttpStatus.NOT_IMPLEMENTED;\n case StorageErrorCode.LIMIT_EXCEEDED:\n return HttpStatus.PAYLOAD_TOO_LARGE;\n case StorageErrorCode.ABORTED:\n return HttpStatus.REQUEST_TIMEOUT;\n case StorageErrorCode.TIMEOUT:\n return HttpStatus.GATEWAY_TIMEOUT;\n case StorageErrorCode.PROVIDER:\n return HttpStatus.BAD_GATEWAY;\n }\n}\n\nfunction toHttpException(error: unknown): HttpException {\n if (error instanceof HttpException) {\n return error;\n }\n if (isStorageError(error)) {\n return new HttpException(\n {\n error: {\n code: error.code,\n message: publicStorageMessages[error.code],\n },\n },\n storageHttpStatus(error),\n { cause: error },\n );\n }\n return new HttpException(\n {\n error: {\n code: StorageErrorCode.PROVIDER,\n message: 'Storage gateway operation failed.',\n },\n },\n HttpStatus.BAD_GATEWAY,\n { cause: error },\n );\n}\n\n@Controller('storage')\n@UseGuards(StorageGatewayGuard)\nexport class StorageGatewayController {\n constructor(\n private readonly storage: StorageService,\n @Inject(STORAGE_GATEWAY_OPTIONS)\n private readonly options: ResolvedStorageGatewayOptions,\n @Inject(STORAGE_GATEWAY_KEY_POLICY)\n private readonly keyPolicy: StorageGatewayKeyPolicy,\n ) {}\n\n @Get('object')\n async download(\n @Query('key') key: string | undefined,\n @Query('proxy') proxy: string | undefined,\n @Query('rangeStart') rangeStart: string | undefined,\n @Query('rangeEnd') rangeEnd: string | undefined,\n @Query('disposition') disposition: string | undefined,\n @Req() request: unknown,\n @Res() response: unknown,\n ): Promise<void> {\n await this.#run(async () => {\n this.#assertAllowed(StorageGatewayOperation.DOWNLOAD);\n const responseContentDisposition = safeContentDisposition(disposition);\n const client = this.storage.use(this.options.store);\n const forceProxy = proxy === 'true' || proxy === '1';\n const canSign =\n this.options.operations.has(StorageGatewayOperation.SIGN_DOWNLOAD) &&\n client.capabilities.signedDownload.supported &&\n client.capabilities.signedDownloadPolicy?.expiresIn === true;\n\n if (!forceProxy && this.options.mode !== 'proxy' && canSign) {\n try {\n const signedObjectKey = await this.#resolvePath(\n request,\n StorageGatewayOperation.SIGN_DOWNLOAD,\n 'key',\n key,\n );\n const url = await client.signDownload(signedObjectKey, {\n expiresIn: this.options.defaultSignedUrlExpiresIn,\n ...(responseContentDisposition !== undefined && {\n responseContentDisposition,\n }),\n });\n const raw = rawResponseOf(response);\n raw.statusCode = HttpStatus.TEMPORARY_REDIRECT;\n raw.setHeader('location', url);\n raw.end();\n return;\n } catch (error) {\n if (\n this.options.mode !== 'hybrid' ||\n !isStorageError(error) ||\n error.code !== StorageErrorCode.NOT_SUPPORTED\n ) {\n throw error;\n }\n }\n }\n\n if (this.options.mode === 'signed') {\n throw new StorageError(\n 'Signed downloads are unavailable for this store.',\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n permanent: true,\n },\n );\n }\n\n const objectKey = await this.#resolvePath(\n request,\n StorageGatewayOperation.DOWNLOAD,\n 'key',\n key,\n );\n\n const start = queryInteger(rangeStart, 'rangeStart');\n const end = queryInteger(rangeEnd, 'rangeEnd');\n if (end !== undefined && start === undefined) {\n throw new BadRequestException(\n 'rangeStart is required when rangeEnd is provided.',\n );\n }\n const range: StorageByteRange | undefined =\n start === undefined\n ? undefined\n : { start, ...(end !== undefined && { end }) };\n const object = await client.downloadStream(objectKey, {\n ...(range !== undefined && { range }),\n });\n const raw = rawResponseOf(response);\n raw.statusCode =\n range === undefined ? HttpStatus.OK : HttpStatus.PARTIAL_CONTENT;\n setObjectHeaders(raw, object);\n const baseContentType = object.contentType\n .split(';', 1)[0]\n ?.trim()\n .toLowerCase();\n raw.setHeader(\n 'content-disposition',\n baseContentType !== undefined &&\n this.options.proxyInlineContentTypes.has(baseContentType)\n ? 'inline'\n : 'attachment',\n );\n raw.setHeader('x-content-type-options', 'nosniff');\n if (range !== undefined) {\n raw.setHeader(\n 'content-range',\n `bytes ${range.start}-${range.start + object.size - 1}/*`,\n );\n }\n if (client.capabilities.rangeRead) {\n raw.setHeader('accept-ranges', 'bytes');\n }\n\n try {\n await pipeline(\n Readable.fromWeb(\n object.body as unknown as NodeReadableStream<Uint8Array>,\n ),\n raw,\n );\n } catch (error) {\n if (raw.headersSent) {\n raw.destroy(error instanceof Error ? error : undefined);\n return;\n }\n throw error;\n }\n });\n }\n\n @SetMetadata('__fastify_route_config__', {\n [FASTIFY_STORAGE_UPLOAD_CONFIG]: true,\n })\n @Put('object')\n async upload(\n @Query('key') key: string | undefined,\n @Req() request: unknown,\n ): Promise<ResponseEnvelope<unknown>> {\n return this.#run(async () => {\n this.#assertAllowed(StorageGatewayOperation.UPLOAD);\n if (this.options.mode === 'signed') {\n throw new StorageError(\n 'Proxy uploads are disabled in signed gateway mode.',\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n permanent: true,\n },\n );\n }\n const objectKey = await this.#resolvePath(\n request,\n StorageGatewayOperation.UPLOAD,\n 'key',\n key,\n );\n const transportContentType = requestHeader(request, 'content-type')\n ?.split(';', 1)[0]\n ?.trim()\n .toLowerCase();\n if (transportContentType !== 'application/octet-stream') {\n throw new BadRequestException(\n 'Proxy uploads require Content-Type: application/octet-stream.',\n );\n }\n const lengthHeader = requestHeader(request, 'content-length');\n const contentLength =\n lengthHeader === undefined\n ? undefined\n : queryInteger(lengthHeader, 'content-length');\n if (\n contentLength !== undefined &&\n contentLength > this.options.maxUploadBytes\n ) {\n throw new StorageError(\n `Proxy upload exceeds the ${this.options.maxUploadBytes}-byte gateway limit.`,\n {\n code: StorageErrorCode.LIMIT_EXCEEDED,\n key: objectKey,\n permanent: true,\n },\n );\n }\n const source = uploadSourceOf(request);\n const body = Readable.toWeb(\n Readable.from(enforceUploadLimit(source, this.options.maxUploadBytes)),\n ) as ReadableStream<Uint8Array>;\n const contentType = exactContentType(\n requestHeader(request, 'x-storage-content-type') ??\n 'application/octet-stream',\n 'x-storage-content-type',\n );\n const result = await this.storage\n .use(this.options.store)\n .upload(objectKey, body, { contentType, multipart: true });\n return { data: result };\n });\n }\n\n @Head('metadata')\n async head(\n @Query('key') key: string | undefined,\n @Req() request: unknown,\n @Res() response: unknown,\n ): Promise<void> {\n await this.#run(async () => {\n this.#assertAllowed(StorageGatewayOperation.HEAD);\n const objectKey = await this.#resolvePath(\n request,\n StorageGatewayOperation.HEAD,\n 'key',\n key,\n );\n const metadata = await this.storage\n .use(this.options.store)\n .head(objectKey);\n const raw = rawResponseOf(response);\n raw.statusCode = HttpStatus.OK;\n setObjectHeaders(raw, metadata);\n raw.end();\n });\n }\n\n @Delete('object')\n async delete(\n @Query('key') key: string | undefined,\n @Req() request: unknown,\n ): Promise<ResponseEnvelope<{ deleted: true }>> {\n return this.#run(async () => {\n this.#assertAllowed(StorageGatewayOperation.DELETE);\n const objectKey = await this.#resolvePath(\n request,\n StorageGatewayOperation.DELETE,\n 'key',\n key,\n );\n await this.storage.use(this.options.store).delete(objectKey);\n return { data: { deleted: true } };\n });\n }\n\n @Get('list')\n async list(\n @Query('prefix') prefix: string | undefined,\n @Query('cursor') cursor: string | undefined,\n @Query('limit') limit: string | undefined,\n @Query('delimiter') delimiter: string | undefined,\n @Req() request: unknown,\n ): Promise<ResponseEnvelope<unknown>> {\n return this.#run(async () => {\n this.#assertAllowed(StorageGatewayOperation.LIST);\n const parsedLimit =\n queryInteger(limit, 'limit') ?? this.options.maxListResults;\n if (parsedLimit === 0 || parsedLimit > this.options.maxListResults) {\n throw new BadRequestException(\n `limit must be between 1 and ${this.options.maxListResults}.`,\n );\n }\n const resolvedPrefix = await this.#resolvePath(\n request,\n StorageGatewayOperation.LIST,\n 'prefix',\n prefix,\n );\n const result = await this.storage.use(this.options.store).list({\n ...(cursor !== undefined && { cursor }),\n ...(delimiter !== undefined && { delimiter }),\n limit: parsedLimit,\n prefix: resolvedPrefix,\n });\n return { data: result };\n });\n }\n\n @Get('search')\n async search(\n @Query('pattern') pattern: string | undefined,\n @Query('prefix') prefix: string | undefined,\n @Query('limit') limit: string | undefined,\n @Query('maxResults') maxResults: string | undefined,\n @Query('match') match: string | undefined,\n @Query('caseInsensitive') caseInsensitive: string | undefined,\n @Req() request: unknown,\n ): Promise<ResponseEnvelope<unknown>> {\n return this.#run(async () => {\n this.#assertAllowed(StorageGatewayOperation.SEARCH);\n const searchPattern = await this.#resolvePath(\n request,\n StorageGatewayOperation.SEARCH,\n 'pattern',\n pattern,\n );\n const resolvedPrefix = await this.#resolvePath(\n request,\n StorageGatewayOperation.SEARCH,\n 'prefix',\n prefix,\n );\n if (\n match !== undefined &&\n !['glob', 'regex', 'substring', 'exact'].includes(match)\n ) {\n throw new BadRequestException('Invalid search match mode.');\n }\n const parsedLimit =\n limit === undefined ? undefined : queryInteger(limit, 'limit');\n if (\n parsedLimit !== undefined &&\n (parsedLimit === 0 || parsedLimit > this.options.maxSearchResults)\n ) {\n throw new BadRequestException(\n `limit must be between 1 and ${this.options.maxSearchResults}.`,\n );\n }\n const parsedMaxResults =\n queryInteger(maxResults, 'maxResults') ?? this.options.maxSearchResults;\n if (\n parsedMaxResults === 0 ||\n parsedMaxResults > this.options.maxSearchResults\n ) {\n throw new BadRequestException(\n `maxResults must be between 1 and ${this.options.maxSearchResults}.`,\n );\n }\n const objects: StorageObjectMetadata[] = [];\n for await (const object of this.storage\n .use(this.options.store)\n .search(searchPattern, {\n ...(caseInsensitive !== undefined && {\n caseInsensitive:\n caseInsensitive === 'true' || caseInsensitive === '1',\n }),\n ...(parsedLimit !== undefined && { limit: parsedLimit }),\n ...(match !== undefined && {\n match: match as 'glob' | 'regex' | 'substring' | 'exact',\n }),\n maxResults: parsedMaxResults,\n prefix: resolvedPrefix,\n })) {\n objects.push(object);\n if (objects.length === parsedMaxResults) {\n break;\n }\n }\n return { data: objects };\n });\n }\n\n @Post('sign-download')\n async signDownload(\n @Body() body: unknown,\n @Req() request: unknown,\n ): Promise<ResponseEnvelope<{ url: string }>> {\n return this.#run(async () => {\n this.#assertAllowed(StorageGatewayOperation.SIGN_DOWNLOAD);\n if (this.options.mode === 'proxy') {\n throw new StorageError(\n 'Signed downloads are disabled in proxy gateway mode.',\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n permanent: true,\n },\n );\n }\n const input = recordOf(body, 'body');\n const responseContentDisposition = safeContentDisposition(\n optionalString(input, 'responseContentDisposition'),\n );\n const options: StorageSignedDownloadOptions = {\n expiresIn: this.#signedExpiry(input),\n ...(responseContentDisposition !== undefined && {\n responseContentDisposition,\n }),\n };\n const objectKey = await this.#resolvePath(\n request,\n StorageGatewayOperation.SIGN_DOWNLOAD,\n 'key',\n requiredString(input, 'key'),\n );\n const client = this.storage.use(this.options.store);\n if (client.capabilities.signedDownloadPolicy?.expiresIn !== true) {\n throw new StorageError(\n 'This store cannot prove that signed-download expiry is provider-enforced.',\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n key: objectKey,\n operation: 'signDownload',\n permanent: true,\n },\n );\n }\n const url = await client.signDownload(objectKey, options);\n return { data: { url } };\n });\n }\n\n @Post('sign-upload')\n async signUpload(\n @Body() body: unknown,\n @Req() request: unknown,\n ): Promise<ResponseEnvelope<unknown>> {\n return this.#run(async () => {\n this.#assertAllowed(StorageGatewayOperation.SIGN_UPLOAD);\n if (this.options.mode === 'proxy') {\n throw new StorageError(\n 'Signed uploads are disabled in proxy gateway mode.',\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n permanent: true,\n },\n );\n }\n const input = recordOf(body, 'body');\n const rawContentType = optionalString(input, 'contentType');\n if (rawContentType === undefined) {\n throw new BadRequestException(\n 'contentType is required for signed uploads.',\n );\n }\n const contentType = exactContentType(rawContentType, 'contentType');\n if (!this.options.signedUploadContentTypes.has(contentType)) {\n throw new BadRequestException(\n `contentType \"${contentType}\" is not allowed for signed uploads.`,\n );\n }\n const requestedMaxSize = optionalPositiveInteger(input, 'maxSize');\n if (\n requestedMaxSize !== undefined &&\n requestedMaxSize > this.options.maxSignedUploadBytes\n ) {\n throw new StorageError(\n `Signed upload exceeds the ${this.options.maxSignedUploadBytes}-byte gateway limit.`,\n {\n code: StorageErrorCode.LIMIT_EXCEEDED,\n permanent: true,\n },\n );\n }\n const maxSize = requestedMaxSize ?? this.options.maxSignedUploadBytes;\n const minSize = optionalNonNegativeInteger(input, 'minSize');\n if (maxSize !== undefined && minSize !== undefined && minSize > maxSize) {\n throw new BadRequestException(\n 'minSize cannot be greater than maxSize.',\n );\n }\n const options: StorageSignedUploadOptions = {\n contentType,\n expiresIn: this.#signedExpiry(input),\n maxSize,\n ...(minSize !== undefined && { minSize }),\n };\n const objectKey = await this.#resolvePath(\n request,\n StorageGatewayOperation.SIGN_UPLOAD,\n 'key',\n requiredString(input, 'key'),\n );\n const client = this.storage.use(this.options.store);\n const policyCapability = client.capabilities.signedUploadPolicy;\n if (\n policyCapability?.contentType !== true ||\n policyCapability.sizeRange !== true\n ) {\n throw new StorageError(\n 'This store cannot prove that signed-upload MIME and size constraints are provider-enforced.',\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n key: objectKey,\n operation: 'signUpload',\n permanent: true,\n },\n );\n }\n const result = await client.signUpload(objectKey, options);\n return { data: result };\n });\n }\n\n @Post('copy')\n async copy(\n @Body() body: unknown,\n @Req() request: unknown,\n ): Promise<ResponseEnvelope<{ copied: true }>> {\n return this.#run(async () => {\n this.#assertAllowed(StorageGatewayOperation.COPY);\n const input = recordOf(body, 'body');\n const [from, to] = await Promise.all([\n this.#resolvePath(\n request,\n StorageGatewayOperation.COPY,\n 'from',\n requiredString(input, 'from'),\n ),\n this.#resolvePath(\n request,\n StorageGatewayOperation.COPY,\n 'to',\n requiredString(input, 'to'),\n ),\n ]);\n await this.storage.use(this.options.store).copy(from, to);\n return { data: { copied: true } };\n });\n }\n\n @Post('move')\n async move(\n @Body() body: unknown,\n @Req() request: unknown,\n ): Promise<ResponseEnvelope<{ moved: true }>> {\n return this.#run(async () => {\n this.#assertAllowed(StorageGatewayOperation.MOVE);\n const input = recordOf(body, 'body');\n const [from, to] = await Promise.all([\n this.#resolvePath(\n request,\n StorageGatewayOperation.MOVE,\n 'from',\n requiredString(input, 'from'),\n ),\n this.#resolvePath(\n request,\n StorageGatewayOperation.MOVE,\n 'to',\n requiredString(input, 'to'),\n ),\n ]);\n await this.storage.use(this.options.store).move(from, to);\n return { data: { moved: true } };\n });\n }\n\n #assertAllowed(operation: StorageGatewayOperationName): void {\n if (!this.options.operations.has(operation)) {\n throw new HttpException(\n {\n error: {\n code: 'OPERATION_NOT_ALLOWED',\n message: `Storage gateway operation \"${operation}\" is disabled.`,\n },\n },\n HttpStatus.FORBIDDEN,\n );\n }\n }\n\n async #resolvePath(\n request: unknown,\n operation: StorageGatewayOperationName,\n target: StorageGatewayKeyTarget,\n value: string | undefined,\n ): Promise<string> {\n const input = parseGatewayPath(value, target);\n const resolved = await this.keyPolicy.resolve({\n input,\n operation,\n request,\n target,\n });\n const parsed = parseGatewayPath(resolved, target);\n if (parsed === undefined) {\n throw new StorageError(\n `Storage gateway key policy did not resolve ${target}.`,\n {\n code: StorageErrorCode.UNAUTHORIZED,\n operation,\n permanent: true,\n },\n );\n }\n return parsed.value;\n }\n\n #signedExpiry(input: Record<string, unknown>): number {\n const expiresIn =\n optionalPositiveInteger(input, 'expiresIn') ??\n this.options.defaultSignedUrlExpiresIn;\n if (expiresIn > this.options.maxSignedUrlExpiresIn) {\n throw new BadRequestException(\n `expiresIn cannot exceed ${this.options.maxSignedUrlExpiresIn} seconds.`,\n );\n }\n return expiresIn;\n }\n\n async #run<Result>(operation: () => Promise<Result>): Promise<Result> {\n try {\n return await operation();\n } catch (error) {\n throw toHttpException(error);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"storage-gateway.controller.js","sourceRoot":"","sources":["../../src/gateway/storage-gateway.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BadRequestException,\n Body,\n Controller,\n Delete,\n Get,\n Head,\n HttpException,\n HttpStatus,\n Inject,\n Post,\n Put,\n Query,\n Req,\n Res,\n SetMetadata,\n UseGuards,\n} from '@nestjs/common';\nimport { ServerResponse } from 'node:http';\nimport { Readable } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\nimport type { ReadableStream as NodeReadableStream } from 'node:stream/web';\n\nimport {\n StorageError,\n StorageErrorCode,\n isStorageError,\n} from '../storage.error.js';\nimport { storageEtagHeader } from '../storage-etag.js';\nimport { StorageService } from '../storage.service.js';\nimport type {\n StorageByteRange,\n StorageObject,\n StorageObjectMetadata,\n StorageSignedDownloadOptions,\n StorageSignedUploadOptions,\n} from '../storage.types.js';\nimport { StorageGatewayGuard } from './storage-gateway.guard.js';\nimport { FASTIFY_STORAGE_UPLOAD_CONFIG } from './storage-gateway-fastify-parser.js';\nimport {\n STORAGE_GATEWAY_KEY_POLICY,\n STORAGE_GATEWAY_OPTIONS,\n} from './storage-gateway.tokens.js';\nimport {\n StorageGatewayOperation,\n type ParsedStorageGatewayKey,\n type ResolvedStorageGatewayOptions,\n type StorageGatewayKeyPolicy,\n type StorageGatewayKeyTarget,\n type StorageGatewayOperation as StorageGatewayOperationName,\n} from './storage-gateway.types.js';\n\ninterface ResponseEnvelope<Result> {\n data: Result;\n}\n\ninterface ResponseWrapper {\n raw?: unknown;\n hijack?: () => void;\n}\n\ninterface RequestWrapper {\n raw?: unknown;\n body?: unknown;\n headers?: Record<string, string | string[] | undefined>;\n}\n\nconst MAX_GATEWAY_PATH_LENGTH = 1024;\n\nfunction parseGatewayPath(\n value: string | undefined,\n target: StorageGatewayKeyTarget,\n): ParsedStorageGatewayKey | undefined {\n if (value === undefined) {\n if (target === 'prefix') {\n return undefined;\n }\n throw new BadRequestException(`${target} is required.`);\n }\n if (value.length > MAX_GATEWAY_PATH_LENGTH) {\n throw new BadRequestException(\n `${target} cannot exceed ${MAX_GATEWAY_PATH_LENGTH} characters.`,\n );\n }\n if (value.length === 0) {\n if (target === 'prefix') {\n return Object.freeze({\n segments: Object.freeze([]),\n trailingSlash: false,\n value,\n });\n }\n throw new BadRequestException(`${target} must be a non-empty string.`);\n }\n if (\n [...value].some((character) => {\n const codePoint = character.codePointAt(0);\n return (\n character === '\\\\' ||\n codePoint === undefined ||\n codePoint <= 0x1f ||\n codePoint === 0x7f\n );\n })\n ) {\n throw new BadRequestException(\n `${target} cannot contain control characters or backslashes.`,\n );\n }\n if (target === 'pattern') {\n return Object.freeze({\n segments: Object.freeze(value.split('/')),\n trailingSlash: value.endsWith('/'),\n value,\n });\n }\n if (value.startsWith('/') || value.trim() !== value) {\n throw new BadRequestException(\n `${target} must be a relative object path without surrounding whitespace.`,\n );\n }\n const trailingSlash = value.endsWith('/');\n const segments = value.split('/');\n if (trailingSlash) {\n segments.pop();\n }\n if (\n segments.some(\n (segment) => segment.length === 0 || segment === '.' || segment === '..',\n )\n ) {\n throw new BadRequestException(\n `${target} cannot contain empty, dot, or parent path segments.`,\n );\n }\n return Object.freeze({\n segments: Object.freeze(segments),\n trailingSlash,\n value,\n });\n}\n\nfunction exactContentType(value: string, field: string): string {\n const normalized = value.toLowerCase();\n if (\n value !== normalized ||\n !/^[a-z0-9][a-z0-9!#$&^_.+-]*\\/[a-z0-9][a-z0-9!#$&^_.+-]*$/u.test(value)\n ) {\n throw new BadRequestException(\n `${field} must be a lowercase exact MIME type without parameters.`,\n );\n }\n return normalized;\n}\n\nfunction safeContentDisposition(value: string | undefined): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (value !== 'attachment' && value !== 'inline') {\n throw new BadRequestException(\n 'responseContentDisposition must be either \"attachment\" or \"inline\".',\n );\n }\n return value;\n}\n\nfunction recordOf(value: unknown, label: string): Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new BadRequestException(`${label} must be a JSON object.`);\n }\n return value as Record<string, unknown>;\n}\n\nfunction requiredString(\n record: Record<string, unknown>,\n field: string,\n): string {\n const value = record[field];\n if (typeof value !== 'string' || value.length === 0) {\n throw new BadRequestException(`${field} must be a non-empty string.`);\n }\n return value;\n}\n\nfunction optionalString(\n record: Record<string, unknown>,\n field: string,\n): string | undefined {\n const value = record[field];\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== 'string') {\n throw new BadRequestException(`${field} must be a string.`);\n }\n return value;\n}\n\nfunction optionalNumber(\n record: Record<string, unknown>,\n field: string,\n): number | undefined {\n const value = record[field];\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new BadRequestException(`${field} must be a finite number.`);\n }\n return value;\n}\n\nfunction optionalPositiveInteger(\n record: Record<string, unknown>,\n field: string,\n): number | undefined {\n const value = optionalNumber(record, field);\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {\n throw new BadRequestException(`${field} must be a positive safe integer.`);\n }\n return value;\n}\n\nfunction optionalNonNegativeInteger(\n record: Record<string, unknown>,\n field: string,\n): number | undefined {\n const value = optionalNumber(record, field);\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 0)) {\n throw new BadRequestException(\n `${field} must be a non-negative safe integer.`,\n );\n }\n return value;\n}\n\nfunction queryInteger(\n value: string | undefined,\n field: string,\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!/^[0-9]+$/u.test(value)) {\n throw new BadRequestException(`${field} must be a non-negative integer.`);\n }\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed)) {\n throw new BadRequestException(`${field} must be a safe integer.`);\n }\n return parsed;\n}\n\nfunction rawResponseOf(response: unknown): ServerResponse {\n if (response instanceof ServerResponse) {\n return response;\n }\n if (typeof response === 'object' && response !== null) {\n const wrapper = response as ResponseWrapper;\n wrapper.hijack?.();\n if (wrapper.raw instanceof ServerResponse) {\n return wrapper.raw;\n }\n }\n throw new Error('Unsupported Nest HTTP response adapter.');\n}\n\nfunction requestWrapperOf(request: unknown): RequestWrapper {\n if (typeof request !== 'object' || request === null) {\n throw new BadRequestException('Unsupported Nest HTTP request adapter.');\n }\n return request as RequestWrapper;\n}\n\nfunction requestHeader(request: unknown, name: string): string | undefined {\n const headers = requestWrapperOf(request).headers;\n const value = headers?.[name];\n return Array.isArray(value) ? value[0] : value;\n}\n\nfunction uploadSourceOf(request: unknown): Readable {\n const wrapper = requestWrapperOf(request);\n if (wrapper.body instanceof Readable) {\n return wrapper.body;\n }\n if (wrapper.body instanceof Uint8Array) {\n return Readable.from([wrapper.body]);\n }\n if (request instanceof Readable && !request.readableEnded) {\n return request;\n }\n if (wrapper.raw instanceof Readable && !wrapper.raw.readableEnded) {\n return wrapper.raw;\n }\n throw new BadRequestException(\n 'Proxy uploads require an application/octet-stream request body.',\n );\n}\n\nasync function* enforceUploadLimit(\n source: Readable,\n maxBytes: number,\n): AsyncGenerator<Uint8Array> {\n let received = 0;\n for await (const chunk of source) {\n const bytes =\n typeof chunk === 'string'\n ? new TextEncoder().encode(chunk)\n : chunk instanceof Uint8Array\n ? chunk\n : undefined;\n if (bytes === undefined) {\n throw new BadRequestException(\n 'Upload streams must contain byte or string chunks.',\n );\n }\n received += bytes.byteLength;\n if (received > maxBytes) {\n throw new StorageError(\n `Proxy upload exceeds the ${maxBytes}-byte gateway limit.`,\n {\n code: StorageErrorCode.LIMIT_EXCEEDED,\n permanent: true,\n },\n );\n }\n yield bytes;\n }\n}\n\nfunction providerEtagHeader(\n object: StorageObject | StorageObjectMetadata,\n): string | undefined {\n const etag =\n object.etag === undefined ? undefined : storageEtagHeader(object.etag);\n if (object.etag !== undefined && etag === undefined) {\n throw new StorageError('Storage provider returned a malformed ETag.', {\n code: StorageErrorCode.PROVIDER,\n permanent: true,\n });\n }\n return etag;\n}\n\nfunction setObjectHeaders(\n response: ServerResponse,\n object: StorageObject | StorageObjectMetadata,\n etag: string | undefined,\n): void {\n response.setHeader('content-length', String(object.size));\n response.setHeader('content-type', object.contentType);\n if (etag !== undefined) {\n response.setHeader('etag', etag);\n }\n if (object.lastModified !== undefined) {\n response.setHeader('last-modified', object.lastModified.toUTCString());\n }\n}\n\nconst publicStorageMessages: Record<StorageErrorCode, string> = {\n [StorageErrorCode.NOT_FOUND]: 'Storage object was not found.',\n [StorageErrorCode.UNAUTHORIZED]: 'Storage operation is not permitted.',\n [StorageErrorCode.CONFLICT]: 'Storage object conflict.',\n [StorageErrorCode.READ_ONLY]: 'Storage operation is not permitted.',\n [StorageErrorCode.INVALID_ARGUMENT]: 'Invalid storage request.',\n [StorageErrorCode.NOT_SUPPORTED]: 'Storage operation is not supported.',\n [StorageErrorCode.ABORTED]: 'Storage operation was aborted.',\n [StorageErrorCode.TIMEOUT]: 'Storage operation timed out.',\n [StorageErrorCode.LIMIT_EXCEEDED]: 'Storage request limit exceeded.',\n [StorageErrorCode.PROVIDER]: 'Storage provider operation failed.',\n};\n\nfunction storageHttpStatus(error: StorageError): number {\n switch (error.code) {\n case StorageErrorCode.NOT_FOUND:\n return HttpStatus.NOT_FOUND;\n case StorageErrorCode.UNAUTHORIZED:\n case StorageErrorCode.READ_ONLY:\n return HttpStatus.FORBIDDEN;\n case StorageErrorCode.CONFLICT:\n return HttpStatus.CONFLICT;\n case StorageErrorCode.INVALID_ARGUMENT:\n return HttpStatus.BAD_REQUEST;\n case StorageErrorCode.NOT_SUPPORTED:\n return HttpStatus.NOT_IMPLEMENTED;\n case StorageErrorCode.LIMIT_EXCEEDED:\n return HttpStatus.PAYLOAD_TOO_LARGE;\n case StorageErrorCode.ABORTED:\n return HttpStatus.REQUEST_TIMEOUT;\n case StorageErrorCode.TIMEOUT:\n return HttpStatus.GATEWAY_TIMEOUT;\n case StorageErrorCode.PROVIDER:\n return HttpStatus.BAD_GATEWAY;\n }\n}\n\nfunction toHttpException(error: unknown): HttpException {\n if (error instanceof HttpException) {\n return error;\n }\n if (isStorageError(error)) {\n return new HttpException(\n {\n error: {\n code: error.code,\n message: publicStorageMessages[error.code],\n },\n },\n storageHttpStatus(error),\n { cause: error },\n );\n }\n return new HttpException(\n {\n error: {\n code: StorageErrorCode.PROVIDER,\n message: 'Storage gateway operation failed.',\n },\n },\n HttpStatus.BAD_GATEWAY,\n { cause: error },\n );\n}\n\n@Controller('storage')\n@UseGuards(StorageGatewayGuard)\nexport class StorageGatewayController {\n constructor(\n private readonly storage: StorageService,\n @Inject(STORAGE_GATEWAY_OPTIONS)\n private readonly options: ResolvedStorageGatewayOptions,\n @Inject(STORAGE_GATEWAY_KEY_POLICY)\n private readonly keyPolicy: StorageGatewayKeyPolicy,\n ) {}\n\n @Get('object')\n async download(\n @Query('key') key: string | undefined,\n @Query('proxy') proxy: string | undefined,\n @Query('rangeStart') rangeStart: string | undefined,\n @Query('rangeEnd') rangeEnd: string | undefined,\n @Query('disposition') disposition: string | undefined,\n @Req() request: unknown,\n @Res() response: unknown,\n ): Promise<void> {\n await this.#run(async () => {\n this.#assertAllowed(StorageGatewayOperation.DOWNLOAD);\n const responseContentDisposition = safeContentDisposition(disposition);\n const client = this.storage.use(this.options.store);\n const forceProxy = proxy === 'true' || proxy === '1';\n const canSign =\n this.options.operations.has(StorageGatewayOperation.SIGN_DOWNLOAD) &&\n client.capabilities.signedDownload.supported &&\n client.capabilities.signedDownloadPolicy?.expiresIn === true;\n\n if (!forceProxy && this.options.mode !== 'proxy' && canSign) {\n try {\n const signedObjectKey = await this.#resolvePath(\n request,\n StorageGatewayOperation.SIGN_DOWNLOAD,\n 'key',\n key,\n );\n const url = await client.signDownload(signedObjectKey, {\n expiresIn: this.options.defaultSignedUrlExpiresIn,\n ...(responseContentDisposition !== undefined && {\n responseContentDisposition,\n }),\n });\n const raw = rawResponseOf(response);\n raw.statusCode = HttpStatus.TEMPORARY_REDIRECT;\n raw.setHeader('location', url);\n raw.end();\n return;\n } catch (error) {\n if (\n this.options.mode !== 'hybrid' ||\n !isStorageError(error) ||\n error.code !== StorageErrorCode.NOT_SUPPORTED\n ) {\n throw error;\n }\n }\n }\n\n if (this.options.mode === 'signed') {\n throw new StorageError(\n 'Signed downloads are unavailable for this store.',\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n permanent: true,\n },\n );\n }\n\n const objectKey = await this.#resolvePath(\n request,\n StorageGatewayOperation.DOWNLOAD,\n 'key',\n key,\n );\n\n const start = queryInteger(rangeStart, 'rangeStart');\n const end = queryInteger(rangeEnd, 'rangeEnd');\n if (end !== undefined && start === undefined) {\n throw new BadRequestException(\n 'rangeStart is required when rangeEnd is provided.',\n );\n }\n const range: StorageByteRange | undefined =\n start === undefined\n ? undefined\n : { start, ...(end !== undefined && { end }) };\n const object = await client.downloadStream(objectKey, {\n ...(range !== undefined && { range }),\n });\n let etag: string | undefined;\n try {\n etag = providerEtagHeader(object);\n } catch (error) {\n await object.body.cancel(error).catch(() => undefined);\n throw error;\n }\n const raw = rawResponseOf(response);\n raw.statusCode =\n range === undefined ? HttpStatus.OK : HttpStatus.PARTIAL_CONTENT;\n setObjectHeaders(raw, object, etag);\n const baseContentType = object.contentType\n .split(';', 1)[0]\n ?.trim()\n .toLowerCase();\n raw.setHeader(\n 'content-disposition',\n baseContentType !== undefined &&\n this.options.proxyInlineContentTypes.has(baseContentType)\n ? 'inline'\n : 'attachment',\n );\n raw.setHeader('x-content-type-options', 'nosniff');\n if (range !== undefined) {\n raw.setHeader(\n 'content-range',\n `bytes ${range.start}-${range.start + object.size - 1}/*`,\n );\n }\n if (client.capabilities.rangeRead) {\n raw.setHeader('accept-ranges', 'bytes');\n }\n\n try {\n await pipeline(\n Readable.fromWeb(\n object.body as unknown as NodeReadableStream<Uint8Array>,\n ),\n raw,\n );\n } catch (error) {\n if (raw.headersSent) {\n raw.destroy(error instanceof Error ? error : undefined);\n return;\n }\n throw error;\n }\n });\n }\n\n @SetMetadata('__fastify_route_config__', {\n [FASTIFY_STORAGE_UPLOAD_CONFIG]: true,\n })\n @Put('object')\n async upload(\n @Query('key') key: string | undefined,\n @Req() request: unknown,\n ): Promise<ResponseEnvelope<unknown>> {\n return this.#run(async () => {\n this.#assertAllowed(StorageGatewayOperation.UPLOAD);\n if (this.options.mode === 'signed') {\n throw new StorageError(\n 'Proxy uploads are disabled in signed gateway mode.',\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n permanent: true,\n },\n );\n }\n const objectKey = await this.#resolvePath(\n request,\n StorageGatewayOperation.UPLOAD,\n 'key',\n key,\n );\n const transportContentType = requestHeader(request, 'content-type')\n ?.split(';', 1)[0]\n ?.trim()\n .toLowerCase();\n if (transportContentType !== 'application/octet-stream') {\n throw new BadRequestException(\n 'Proxy uploads require Content-Type: application/octet-stream.',\n );\n }\n const lengthHeader = requestHeader(request, 'content-length');\n const contentLength =\n lengthHeader === undefined\n ? undefined\n : queryInteger(lengthHeader, 'content-length');\n if (\n contentLength !== undefined &&\n contentLength > this.options.maxUploadBytes\n ) {\n throw new StorageError(\n `Proxy upload exceeds the ${this.options.maxUploadBytes}-byte gateway limit.`,\n {\n code: StorageErrorCode.LIMIT_EXCEEDED,\n key: objectKey,\n permanent: true,\n },\n );\n }\n const source = uploadSourceOf(request);\n const body = Readable.toWeb(\n Readable.from(enforceUploadLimit(source, this.options.maxUploadBytes)),\n ) as ReadableStream<Uint8Array>;\n const contentType = exactContentType(\n requestHeader(request, 'x-storage-content-type') ??\n 'application/octet-stream',\n 'x-storage-content-type',\n );\n const result = await this.storage\n .use(this.options.store)\n .upload(objectKey, body, { contentType, multipart: true });\n return { data: result };\n });\n }\n\n @Head('metadata')\n async head(\n @Query('key') key: string | undefined,\n @Req() request: unknown,\n @Res() response: unknown,\n ): Promise<void> {\n await this.#run(async () => {\n this.#assertAllowed(StorageGatewayOperation.HEAD);\n const objectKey = await this.#resolvePath(\n request,\n StorageGatewayOperation.HEAD,\n 'key',\n key,\n );\n const metadata = await this.storage\n .use(this.options.store)\n .head(objectKey);\n const etag = providerEtagHeader(metadata);\n const raw = rawResponseOf(response);\n raw.statusCode = HttpStatus.OK;\n setObjectHeaders(raw, metadata, etag);\n raw.end();\n });\n }\n\n @Delete('object')\n async delete(\n @Query('key') key: string | undefined,\n @Req() request: unknown,\n ): Promise<ResponseEnvelope<{ deleted: true }>> {\n return this.#run(async () => {\n this.#assertAllowed(StorageGatewayOperation.DELETE);\n const objectKey = await this.#resolvePath(\n request,\n StorageGatewayOperation.DELETE,\n 'key',\n key,\n );\n await this.storage.use(this.options.store).delete(objectKey);\n return { data: { deleted: true } };\n });\n }\n\n @Get('list')\n async list(\n @Query('prefix') prefix: string | undefined,\n @Query('cursor') cursor: string | undefined,\n @Query('limit') limit: string | undefined,\n @Query('delimiter') delimiter: string | undefined,\n @Req() request: unknown,\n ): Promise<ResponseEnvelope<unknown>> {\n return this.#run(async () => {\n this.#assertAllowed(StorageGatewayOperation.LIST);\n const parsedLimit =\n queryInteger(limit, 'limit') ?? this.options.maxListResults;\n if (parsedLimit === 0 || parsedLimit > this.options.maxListResults) {\n throw new BadRequestException(\n `limit must be between 1 and ${this.options.maxListResults}.`,\n );\n }\n const resolvedPrefix = await this.#resolvePath(\n request,\n StorageGatewayOperation.LIST,\n 'prefix',\n prefix,\n );\n const result = await this.storage.use(this.options.store).list({\n ...(cursor !== undefined && { cursor }),\n ...(delimiter !== undefined && { delimiter }),\n limit: parsedLimit,\n prefix: resolvedPrefix,\n });\n return { data: result };\n });\n }\n\n @Get('search')\n async search(\n @Query('pattern') pattern: string | undefined,\n @Query('prefix') prefix: string | undefined,\n @Query('limit') limit: string | undefined,\n @Query('maxResults') maxResults: string | undefined,\n @Query('match') match: string | undefined,\n @Query('caseInsensitive') caseInsensitive: string | undefined,\n @Req() request: unknown,\n ): Promise<ResponseEnvelope<unknown>> {\n return this.#run(async () => {\n this.#assertAllowed(StorageGatewayOperation.SEARCH);\n const searchPattern = await this.#resolvePath(\n request,\n StorageGatewayOperation.SEARCH,\n 'pattern',\n pattern,\n );\n const resolvedPrefix = await this.#resolvePath(\n request,\n StorageGatewayOperation.SEARCH,\n 'prefix',\n prefix,\n );\n if (\n match !== undefined &&\n !['glob', 'regex', 'substring', 'exact'].includes(match)\n ) {\n throw new BadRequestException('Invalid search match mode.');\n }\n const parsedLimit =\n limit === undefined ? undefined : queryInteger(limit, 'limit');\n if (\n parsedLimit !== undefined &&\n (parsedLimit === 0 || parsedLimit > this.options.maxSearchResults)\n ) {\n throw new BadRequestException(\n `limit must be between 1 and ${this.options.maxSearchResults}.`,\n );\n }\n const parsedMaxResults =\n queryInteger(maxResults, 'maxResults') ?? this.options.maxSearchResults;\n if (\n parsedMaxResults === 0 ||\n parsedMaxResults > this.options.maxSearchResults\n ) {\n throw new BadRequestException(\n `maxResults must be between 1 and ${this.options.maxSearchResults}.`,\n );\n }\n const objects: StorageObjectMetadata[] = [];\n for await (const object of this.storage\n .use(this.options.store)\n .search(searchPattern, {\n ...(caseInsensitive !== undefined && {\n caseInsensitive:\n caseInsensitive === 'true' || caseInsensitive === '1',\n }),\n ...(parsedLimit !== undefined && { limit: parsedLimit }),\n ...(match !== undefined && {\n match: match as 'glob' | 'regex' | 'substring' | 'exact',\n }),\n maxResults: parsedMaxResults,\n prefix: resolvedPrefix,\n })) {\n objects.push(object);\n if (objects.length === parsedMaxResults) {\n break;\n }\n }\n return { data: objects };\n });\n }\n\n @Post('sign-download')\n async signDownload(\n @Body() body: unknown,\n @Req() request: unknown,\n ): Promise<ResponseEnvelope<{ url: string }>> {\n return this.#run(async () => {\n this.#assertAllowed(StorageGatewayOperation.SIGN_DOWNLOAD);\n if (this.options.mode === 'proxy') {\n throw new StorageError(\n 'Signed downloads are disabled in proxy gateway mode.',\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n permanent: true,\n },\n );\n }\n const input = recordOf(body, 'body');\n const responseContentDisposition = safeContentDisposition(\n optionalString(input, 'responseContentDisposition'),\n );\n const options: StorageSignedDownloadOptions = {\n expiresIn: this.#signedExpiry(input),\n ...(responseContentDisposition !== undefined && {\n responseContentDisposition,\n }),\n };\n const objectKey = await this.#resolvePath(\n request,\n StorageGatewayOperation.SIGN_DOWNLOAD,\n 'key',\n requiredString(input, 'key'),\n );\n const client = this.storage.use(this.options.store);\n if (client.capabilities.signedDownloadPolicy?.expiresIn !== true) {\n throw new StorageError(\n 'This store cannot prove that signed-download expiry is provider-enforced.',\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n key: objectKey,\n operation: 'signDownload',\n permanent: true,\n },\n );\n }\n const url = await client.signDownload(objectKey, options);\n return { data: { url } };\n });\n }\n\n @Post('sign-upload')\n async signUpload(\n @Body() body: unknown,\n @Req() request: unknown,\n ): Promise<ResponseEnvelope<unknown>> {\n return this.#run(async () => {\n this.#assertAllowed(StorageGatewayOperation.SIGN_UPLOAD);\n if (this.options.mode === 'proxy') {\n throw new StorageError(\n 'Signed uploads are disabled in proxy gateway mode.',\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n permanent: true,\n },\n );\n }\n const input = recordOf(body, 'body');\n const rawContentType = optionalString(input, 'contentType');\n if (rawContentType === undefined) {\n throw new BadRequestException(\n 'contentType is required for signed uploads.',\n );\n }\n const contentType = exactContentType(rawContentType, 'contentType');\n if (!this.options.signedUploadContentTypes.has(contentType)) {\n throw new BadRequestException(\n `contentType \"${contentType}\" is not allowed for signed uploads.`,\n );\n }\n const requestedMaxSize = optionalPositiveInteger(input, 'maxSize');\n if (\n requestedMaxSize !== undefined &&\n requestedMaxSize > this.options.maxSignedUploadBytes\n ) {\n throw new StorageError(\n `Signed upload exceeds the ${this.options.maxSignedUploadBytes}-byte gateway limit.`,\n {\n code: StorageErrorCode.LIMIT_EXCEEDED,\n permanent: true,\n },\n );\n }\n const maxSize = requestedMaxSize ?? this.options.maxSignedUploadBytes;\n const minSize = optionalNonNegativeInteger(input, 'minSize');\n if (maxSize !== undefined && minSize !== undefined && minSize > maxSize) {\n throw new BadRequestException(\n 'minSize cannot be greater than maxSize.',\n );\n }\n const options: StorageSignedUploadOptions = {\n contentType,\n expiresIn: this.#signedExpiry(input),\n maxSize,\n ...(minSize !== undefined && { minSize }),\n };\n const objectKey = await this.#resolvePath(\n request,\n StorageGatewayOperation.SIGN_UPLOAD,\n 'key',\n requiredString(input, 'key'),\n );\n const client = this.storage.use(this.options.store);\n const policyCapability = client.capabilities.signedUploadPolicy;\n if (\n policyCapability?.contentType !== true ||\n policyCapability.sizeRange !== true\n ) {\n throw new StorageError(\n 'This store cannot prove that signed-upload MIME and size constraints are provider-enforced.',\n {\n code: StorageErrorCode.NOT_SUPPORTED,\n key: objectKey,\n operation: 'signUpload',\n permanent: true,\n },\n );\n }\n const result = await client.signUpload(objectKey, options);\n return { data: result };\n });\n }\n\n @Post('copy')\n async copy(\n @Body() body: unknown,\n @Req() request: unknown,\n ): Promise<ResponseEnvelope<{ copied: true }>> {\n return this.#run(async () => {\n this.#assertAllowed(StorageGatewayOperation.COPY);\n const input = recordOf(body, 'body');\n const [from, to] = await Promise.all([\n this.#resolvePath(\n request,\n StorageGatewayOperation.COPY,\n 'from',\n requiredString(input, 'from'),\n ),\n this.#resolvePath(\n request,\n StorageGatewayOperation.COPY,\n 'to',\n requiredString(input, 'to'),\n ),\n ]);\n await this.storage.use(this.options.store).copy(from, to);\n return { data: { copied: true } };\n });\n }\n\n @Post('move')\n async move(\n @Body() body: unknown,\n @Req() request: unknown,\n ): Promise<ResponseEnvelope<{ moved: true }>> {\n return this.#run(async () => {\n this.#assertAllowed(StorageGatewayOperation.MOVE);\n const input = recordOf(body, 'body');\n const [from, to] = await Promise.all([\n this.#resolvePath(\n request,\n StorageGatewayOperation.MOVE,\n 'from',\n requiredString(input, 'from'),\n ),\n this.#resolvePath(\n request,\n StorageGatewayOperation.MOVE,\n 'to',\n requiredString(input, 'to'),\n ),\n ]);\n await this.storage.use(this.options.store).move(from, to);\n return { data: { moved: true } };\n });\n }\n\n #assertAllowed(operation: StorageGatewayOperationName): void {\n if (!this.options.operations.has(operation)) {\n throw new HttpException(\n {\n error: {\n code: 'OPERATION_NOT_ALLOWED',\n message: `Storage gateway operation \"${operation}\" is disabled.`,\n },\n },\n HttpStatus.FORBIDDEN,\n );\n }\n }\n\n async #resolvePath(\n request: unknown,\n operation: StorageGatewayOperationName,\n target: StorageGatewayKeyTarget,\n value: string | undefined,\n ): Promise<string> {\n const input = parseGatewayPath(value, target);\n const resolved = await this.keyPolicy.resolve({\n input,\n operation,\n request,\n target,\n });\n const parsed = parseGatewayPath(resolved, target);\n if (parsed === undefined) {\n throw new StorageError(\n `Storage gateway key policy did not resolve ${target}.`,\n {\n code: StorageErrorCode.UNAUTHORIZED,\n operation,\n permanent: true,\n },\n );\n }\n return parsed.value;\n }\n\n #signedExpiry(input: Record<string, unknown>): number {\n const expiresIn =\n optionalPositiveInteger(input, 'expiresIn') ??\n this.options.defaultSignedUrlExpiresIn;\n if (expiresIn > this.options.maxSignedUrlExpiresIn) {\n throw new BadRequestException(\n `expiresIn cannot exceed ${this.options.maxSignedUrlExpiresIn} seconds.`,\n );\n }\n return expiresIn;\n }\n\n async #run<Result>(operation: () => Promise<Result>): Promise<Result> {\n try {\n return await operation();\n } catch (error) {\n throw toHttpException(error);\n }\n }\n}\n"]}
|