@nestm/storage 0.1.0-alpha.7 → 0.1.0-alpha.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +135 -0
  2. package/README.md +302 -18
  3. package/SECURITY.md +34 -5
  4. package/dist/ai-sdk/ai-sdk-workspace-tools.d.ts +21 -3
  5. package/dist/ai-sdk/ai-sdk-workspace-tools.d.ts.map +1 -1
  6. package/dist/ai-sdk/ai-sdk-workspace-tools.js +163 -73
  7. package/dist/ai-sdk/ai-sdk-workspace-tools.js.map +1 -1
  8. package/dist/ai-sdk/index.d.ts +1 -1
  9. package/dist/ai-sdk/index.d.ts.map +1 -1
  10. package/dist/ai-sdk/index.js.map +1 -1
  11. package/dist/files-sdk/files-sdk.driver.d.ts +54 -10
  12. package/dist/files-sdk/files-sdk.driver.d.ts.map +1 -1
  13. package/dist/files-sdk/files-sdk.driver.js +831 -63
  14. package/dist/files-sdk/files-sdk.driver.js.map +1 -1
  15. package/dist/files-sdk/fs/index.d.ts +4 -4
  16. package/dist/files-sdk/fs/index.d.ts.map +1 -1
  17. package/dist/files-sdk/fs/index.js +242 -9
  18. package/dist/files-sdk/fs/index.js.map +1 -1
  19. package/dist/files-sdk/index.d.ts +1 -1
  20. package/dist/files-sdk/index.d.ts.map +1 -1
  21. package/dist/files-sdk/index.js.map +1 -1
  22. package/dist/files-sdk/provider/index.d.ts +9 -5
  23. package/dist/files-sdk/provider/index.d.ts.map +1 -1
  24. package/dist/files-sdk/provider/index.js +53 -15
  25. package/dist/files-sdk/provider/index.js.map +1 -1
  26. package/dist/files-sdk/s3/construction-metadata.d.ts +7 -0
  27. package/dist/files-sdk/s3/construction-metadata.d.ts.map +1 -0
  28. package/dist/files-sdk/s3/construction-metadata.js +13 -0
  29. package/dist/files-sdk/s3/construction-metadata.js.map +1 -0
  30. package/dist/files-sdk/s3/index.d.ts +39 -19
  31. package/dist/files-sdk/s3/index.d.ts.map +1 -1
  32. package/dist/files-sdk/s3/index.js +936 -113
  33. package/dist/files-sdk/s3/index.js.map +1 -1
  34. package/dist/gateway/storage-gateway.controller.d.ts.map +1 -1
  35. package/dist/gateway/storage-gateway.controller.js +25 -5
  36. package/dist/gateway/storage-gateway.controller.js.map +1 -1
  37. package/dist/storage-etag.d.ts +13 -0
  38. package/dist/storage-etag.d.ts.map +1 -0
  39. package/dist/storage-etag.js +31 -0
  40. package/dist/storage-etag.js.map +1 -0
  41. package/dist/storage.client.d.ts +3 -1
  42. package/dist/storage.client.d.ts.map +1 -1
  43. package/dist/storage.client.js +87 -22
  44. package/dist/storage.client.js.map +1 -1
  45. package/dist/storage.driver.d.ts +21 -1
  46. package/dist/storage.driver.d.ts.map +1 -1
  47. package/dist/storage.driver.js.map +1 -1
  48. package/dist/storage.types.d.ts +90 -19
  49. package/dist/storage.types.d.ts.map +1 -1
  50. package/dist/storage.types.js.map +1 -1
  51. package/dist/testing/index.d.ts +1 -0
  52. package/dist/testing/index.d.ts.map +1 -1
  53. package/dist/testing/index.js +1 -0
  54. package/dist/testing/index.js.map +1 -1
  55. package/dist/testing/provider-conformance.d.ts +65 -0
  56. package/dist/testing/provider-conformance.d.ts.map +1 -0
  57. package/dist/testing/provider-conformance.js +853 -0
  58. package/dist/testing/provider-conformance.js.map +1 -0
  59. package/dist/workspace/index.d.ts +2 -1
  60. package/dist/workspace/index.d.ts.map +1 -1
  61. package/dist/workspace/index.js +1 -0
  62. package/dist/workspace/index.js.map +1 -1
  63. package/dist/workspace/storage-workspace.cursor.d.ts +68 -3
  64. package/dist/workspace/storage-workspace.cursor.d.ts.map +1 -1
  65. package/dist/workspace/storage-workspace.cursor.js +402 -39
  66. package/dist/workspace/storage-workspace.cursor.js.map +1 -1
  67. package/dist/workspace/storage-workspace.d.ts.map +1 -1
  68. package/dist/workspace/storage-workspace.js +162 -62
  69. package/dist/workspace/storage-workspace.js.map +1 -1
  70. package/dist/workspace/storage-workspace.types.d.ts +31 -5
  71. package/dist/workspace/storage-workspace.types.d.ts.map +1 -1
  72. package/dist/workspace/storage-workspace.types.js +2 -0
  73. package/dist/workspace/storage-workspace.types.js.map +1 -1
  74. package/package.json +3 -3
@@ -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"]}
@@ -0,0 +1,13 @@
1
+ /** Maximum UTF-8 byte length of a normalized storage ETag. */
2
+ export declare const MAX_STORAGE_ETAG_BYTES = 1024;
3
+ /** Returns whether a value is the package's canonical bare ETag form. */
4
+ export declare function isCanonicalStorageEtag(value: unknown): value is string;
5
+ /**
6
+ * Normalizes one provider-returned strong entity tag to the canonical bare
7
+ * form. Providers may return either the HTTP-quoted representation or an
8
+ * already-normalized value; lists, weak tags, and malformed values fail.
9
+ */
10
+ export declare function normalizeProviderStorageEtag(value: unknown): string | undefined;
11
+ /** Serializes one canonical bare ETag as exactly one HTTP entity tag. */
12
+ export declare function storageEtagHeader(value: unknown): string | undefined;
13
+ //# sourceMappingURL=storage-etag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-etag.d.ts","sourceRoot":"","sources":["../src/storage-etag.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAQ3C,yEAAyE;AACzE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAMtE;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,OAAO,GACb,MAAM,GAAG,SAAS,CASpB;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAEpE"}
@@ -0,0 +1,31 @@
1
+ /** Maximum UTF-8 byte length of a normalized storage ETag. */
2
+ export const MAX_STORAGE_ETAG_BYTES = 1024;
3
+ // Deliberately narrower than RFC 9110's etagc grammar. Commas and backslashes
4
+ // are excluded so a normalized value cannot be confused with an entity-tag
5
+ // list or be interpreted differently by legacy HTTP implementations.
6
+ const canonicalStorageEtag = /^(?!\*$)(?![Ww]\/)[\x21\x23-\x2B\x2D-\x5B\x5D-\x7E]+$/u;
7
+ /** Returns whether a value is the package's canonical bare ETag form. */
8
+ export function isCanonicalStorageEtag(value) {
9
+ return (typeof value === 'string' &&
10
+ value.length <= MAX_STORAGE_ETAG_BYTES &&
11
+ canonicalStorageEtag.test(value));
12
+ }
13
+ /**
14
+ * Normalizes one provider-returned strong entity tag to the canonical bare
15
+ * form. Providers may return either the HTTP-quoted representation or an
16
+ * already-normalized value; lists, weak tags, and malformed values fail.
17
+ */
18
+ export function normalizeProviderStorageEtag(value) {
19
+ if (typeof value !== 'string') {
20
+ return undefined;
21
+ }
22
+ const opaque = value.startsWith('"') && value.endsWith('"') && value.length >= 3
23
+ ? value.slice(1, -1)
24
+ : value;
25
+ return isCanonicalStorageEtag(opaque) ? opaque : undefined;
26
+ }
27
+ /** Serializes one canonical bare ETag as exactly one HTTP entity tag. */
28
+ export function storageEtagHeader(value) {
29
+ return isCanonicalStorageEtag(value) ? `"${value}"` : undefined;
30
+ }
31
+ //# sourceMappingURL=storage-etag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-etag.js","sourceRoot":"","sources":["../src/storage-etag.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAE3C,8EAA8E;AAC9E,2EAA2E;AAC3E,qEAAqE;AACrE,MAAM,oBAAoB,GACxB,wDAAwD,CAAC;AAE3D,yEAAyE;AACzE,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,CAAC,MAAM,IAAI,sBAAsB;QACtC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CACjC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAC1C,KAAc;IAEd,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GACV,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAC/D,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpB,CAAC,CAAC,KAAK,CAAC;IACZ,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7D,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AAClE,CAAC","sourcesContent":["/** Maximum UTF-8 byte length of a normalized storage ETag. */\nexport const MAX_STORAGE_ETAG_BYTES = 1024;\n\n// Deliberately narrower than RFC 9110's etagc grammar. Commas and backslashes\n// are excluded so a normalized value cannot be confused with an entity-tag\n// list or be interpreted differently by legacy HTTP implementations.\nconst canonicalStorageEtag =\n /^(?!\\*$)(?![Ww]\\/)[\\x21\\x23-\\x2B\\x2D-\\x5B\\x5D-\\x7E]+$/u;\n\n/** Returns whether a value is the package's canonical bare ETag form. */\nexport function isCanonicalStorageEtag(value: unknown): value is string {\n return (\n typeof value === 'string' &&\n value.length <= MAX_STORAGE_ETAG_BYTES &&\n canonicalStorageEtag.test(value)\n );\n}\n\n/**\n * Normalizes one provider-returned strong entity tag to the canonical bare\n * form. Providers may return either the HTTP-quoted representation or an\n * already-normalized value; lists, weak tags, and malformed values fail.\n */\nexport function normalizeProviderStorageEtag(\n value: unknown,\n): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n const opaque =\n value.startsWith('\"') && value.endsWith('\"') && value.length >= 3\n ? value.slice(1, -1)\n : value;\n return isCanonicalStorageEtag(opaque) ? opaque : undefined;\n}\n\n/** Serializes one canonical bare ETag as exactly one HTTP entity tag. */\nexport function storageEtagHeader(value: unknown): string | undefined {\n return isCanonicalStorageEtag(value) ? `\"${value}\"` : undefined;\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { StorageDriver } from './storage.driver.js';
2
- import type { StorageBody, StorageBufferedDownloadOptions, StorageBulkOptions, StorageCapabilities, StorageConditionalDeleteOptions, StorageConditionalUploadOptions, StorageDeleteManyResult, StorageDownloadManyResult, StorageDownloadOptions, StorageExistsManyResult, StorageHeadManyResult, StorageListOptions, StorageListResult, StorageObject, StorageObjectMetadata, StorageOperationOptions, StoragePlugin, StoragePromotionOptions, StorageSearchOptions, StorageSignedDownloadOptions, StorageSignedUpload, StorageSignedUploadOptions, StorageUploadManyItem, StorageUploadManyOptions, StorageUploadManyResult, StorageUploadOptions, StorageUploadResult } from './storage.types.js';
2
+ import type { StorageBody, StorageBufferedDownloadOptions, StorageBulkOptions, StorageCapabilities, StorageConditionalDeleteOptions, StorageConditionalReadOptions, StorageConditionalUploadOptions, StorageDeleteManyResult, StorageDownloadManyResult, StorageDownloadOptions, StorageExistsManyResult, StorageHeadManyResult, StorageListOptions, StorageListResult, StorageObject, StorageObjectMetadata, StorageOperationOptions, StoragePlugin, StoragePromotionOptions, StorageSearchOptions, StorageSignedDownloadOptions, StorageSignedUpload, StorageSignedUploadOptions, StorageUploadManyItem, StorageUploadManyOptions, StorageUploadManyResult, StorageUploadOptions, StorageUploadResult } from './storage.types.js';
3
3
  export declare const DEFAULT_BUFFER_LIMIT: number;
4
4
  type BulkOperationOptions = StorageBulkOptions & StorageOperationOptions;
5
5
  type DownloadManyOptions = StorageBulkOptions & StorageDownloadOptions;
@@ -8,6 +8,7 @@ export interface StorageFileHandle {
8
8
  upload(body: StorageBody, options?: StorageUploadOptions): Promise<StorageUploadResult>;
9
9
  uploadConditional(body: StorageBody, options: StorageConditionalUploadOptions): Promise<StorageUploadResult>;
10
10
  download(options?: StorageDownloadOptions): Promise<StorageObject>;
11
+ downloadConditional(options: StorageConditionalReadOptions): Promise<StorageObject>;
11
12
  bytes(options?: StorageBufferedDownloadOptions): Promise<Uint8Array>;
12
13
  text(options?: StorageBufferedDownloadOptions): Promise<string>;
13
14
  head(options?: StorageOperationOptions): Promise<StorageObjectMetadata>;
@@ -31,6 +32,7 @@ export declare class StorageClient {
31
32
  upload(key: string, body: StorageBody, options?: StorageUploadOptions): Promise<StorageUploadResult>;
32
33
  uploadConditional(key: string, body: StorageBody, options: StorageConditionalUploadOptions): Promise<StorageUploadResult>;
33
34
  downloadStream(key: string, options?: StorageDownloadOptions): Promise<StorageObject>;
35
+ downloadConditional(key: string, options: StorageConditionalReadOptions): Promise<StorageObject>;
34
36
  downloadBytes(key: string, options?: StorageBufferedDownloadOptions): Promise<Uint8Array>;
35
37
  downloadText(key: string, options?: StorageBufferedDownloadOptions): Promise<string>;
36
38
  downloadJson<Result = unknown>(key: string, options?: StorageBufferedDownloadOptions): Promise<Result>;
@@ -1 +1 @@
1
- {"version":3,"file":"storage.client.d.ts","sourceRoot":"","sources":["../src/storage.client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.client.d.ts","sourceRoot":"","sources":["../src/storage.client.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { settleMany } from './internal/settle-many.js';
2
+ import { isCanonicalStorageEtag } from './storage-etag.js';
2
3
  import { StorageError, StorageErrorCode, normalizeStorageError, } from './storage.error.js';
3
4
  export const DEFAULT_BUFFER_LIMIT = 10 * 1024 * 1024;
4
5
  function assertKey(key, label = 'key') {
@@ -148,6 +149,7 @@ export class StorageClient {
148
149
  delete: (options) => this.delete(key, options),
149
150
  deleteConditional: (options) => this.deleteConditional(key, options),
150
151
  download: (options) => this.downloadStream(key, options),
152
+ downloadConditional: (options) => this.downloadConditional(key, options),
151
153
  exists: (options) => this.exists(key, options),
152
154
  head: (options) => this.head(key, options),
153
155
  key,
@@ -173,15 +175,22 @@ export class StorageClient {
173
175
  invalidArgument('condition.type must be "create" or "replace".');
174
176
  }
175
177
  if (condition.type === 'replace' &&
176
- (typeof condition.etag !== 'string' || condition.etag.length === 0)) {
177
- invalidArgument('condition.etag must be a non-empty string.');
178
+ !isCanonicalStorageEtag(condition.etag)) {
179
+ invalidArgument('condition.etag must be a canonical storage ETag.');
178
180
  }
179
- const capability = this.#driver.capabilities.conditionalMutation;
181
+ const capability = condition.type === 'create'
182
+ ? this.#driver.capabilities.conditionalCreate
183
+ : this.#driver.capabilities.conditionalReplace;
180
184
  const uploadConditional = this.#driver.uploadConditional;
181
- const supported = condition.type === 'create'
182
- ? capability?.create === true
183
- : capability?.replace === true;
184
- if (!supported || uploadConditional === undefined) {
185
+ const multipartRequested = options.multipart !== undefined && options.multipart !== false;
186
+ const multipartCapability = this.#driver.capabilities.conditionalMultipartCompletion;
187
+ const multipartSupported = !multipartRequested ||
188
+ (condition.type === 'create'
189
+ ? multipartCapability?.create === true
190
+ : multipartCapability?.replace === true);
191
+ if (capability === undefined ||
192
+ !multipartSupported ||
193
+ uploadConditional === undefined) {
185
194
  throw new StorageError(`Store "${this.name}" does not support the requested conditional upload.`, {
186
195
  code: StorageErrorCode.NOT_SUPPORTED,
187
196
  key,
@@ -197,6 +206,42 @@ export class StorageClient {
197
206
  assertDownloadOptions(options);
198
207
  return this.#execute({ key, operation: 'download', store: this.name }, () => this.#driver.download(key, options));
199
208
  }
209
+ downloadConditional(key, options) {
210
+ assertKey(key);
211
+ assertDownloadOptions(options);
212
+ if (options === undefined ||
213
+ options.condition === undefined ||
214
+ typeof options.condition !== 'object' ||
215
+ options.condition === null) {
216
+ invalidArgument('conditional read requires a condition object.');
217
+ }
218
+ const { etag, version } = options.condition;
219
+ if (etag !== undefined && !isCanonicalStorageEtag(etag)) {
220
+ invalidArgument('condition.etag must be a canonical storage ETag.');
221
+ }
222
+ if (version !== undefined &&
223
+ (typeof version !== 'string' || version.length === 0)) {
224
+ invalidArgument('condition.version must be a non-empty string.');
225
+ }
226
+ if (etag === undefined && version === undefined) {
227
+ invalidArgument('conditional read requires an etag, version, or both.');
228
+ }
229
+ const capability = this.#driver.capabilities.conditionalRead;
230
+ const downloadConditional = this.#driver.downloadConditional;
231
+ if (downloadConditional === undefined ||
232
+ capability === undefined ||
233
+ (etag !== undefined && !capability.etag) ||
234
+ (version !== undefined && !capability.version)) {
235
+ throw new StorageError(`Store "${this.name}" does not support the requested conditional read.`, {
236
+ code: StorageErrorCode.NOT_SUPPORTED,
237
+ key,
238
+ operation: 'download',
239
+ permanent: true,
240
+ store: this.name,
241
+ });
242
+ }
243
+ return this.#execute({ key, operation: 'download', store: this.name }, () => downloadConditional.call(this.#driver, key, options));
244
+ }
200
245
  async downloadBytes(key, options) {
201
246
  const { maxBytes = DEFAULT_BUFFER_LIMIT, ...download } = options ?? {};
202
247
  const object = await this.downloadStream(key, download);
@@ -236,13 +281,12 @@ export class StorageClient {
236
281
  deleteConditional(key, options) {
237
282
  assertKey(key);
238
283
  if (options.condition === undefined ||
239
- typeof options.condition.etag !== 'string' ||
240
- options.condition.etag.length === 0) {
241
- invalidArgument('condition.etag must be a non-empty string.');
284
+ !isCanonicalStorageEtag(options.condition.etag)) {
285
+ invalidArgument('condition.etag must be a canonical storage ETag.');
242
286
  }
243
- const capability = this.#driver.capabilities.conditionalMutation;
287
+ const capability = this.#driver.capabilities.conditionalDelete;
244
288
  const deleteConditional = this.#driver.deleteConditional;
245
- if (capability?.delete !== true || deleteConditional === undefined) {
289
+ if (capability?.etag !== true || deleteConditional === undefined) {
246
290
  throw new StorageError(`Store "${this.name}" does not support conditional delete.`, {
247
291
  code: StorageErrorCode.NOT_SUPPORTED,
248
292
  key,
@@ -282,21 +326,42 @@ export class StorageClient {
282
326
  assertKey(destinationKey, 'destination key');
283
327
  const sourceEtag = options.sourceEtag;
284
328
  const sourceVersion = options.sourceVersion;
285
- if (sourceEtag !== undefined && sourceEtag.length === 0) {
286
- invalidArgument('sourceEtag must be a non-empty string.');
329
+ if (sourceEtag !== undefined && !isCanonicalStorageEtag(sourceEtag)) {
330
+ invalidArgument('sourceEtag must be a canonical storage ETag.');
287
331
  }
288
- if (sourceVersion !== undefined && sourceVersion.length === 0) {
332
+ if (sourceVersion !== undefined &&
333
+ (typeof sourceVersion !== 'string' || sourceVersion.length === 0)) {
289
334
  invalidArgument('sourceVersion must be a non-empty string.');
290
335
  }
291
- if (sourceEtag === undefined && sourceVersion === undefined) {
292
- invalidArgument('promote requires sourceEtag, sourceVersion, or both.');
336
+ const destination = options.destination;
337
+ if (destination !== undefined &&
338
+ (typeof destination !== 'object' ||
339
+ destination === null ||
340
+ (destination.type !== 'create' && destination.type !== 'replace'))) {
341
+ invalidArgument('destination.type must be "create" or "replace".');
342
+ }
343
+ if (sourceEtag === undefined &&
344
+ sourceVersion === undefined &&
345
+ destination === undefined) {
346
+ invalidArgument('promote requires a source or destination precondition.');
347
+ }
348
+ if (destination?.type === 'replace' &&
349
+ !isCanonicalStorageEtag(destination.etag)) {
350
+ invalidArgument('destination.etag must be a canonical storage ETag.');
293
351
  }
294
- const capability = this.#driver.capabilities.conditionalCopy;
352
+ const sourceCapability = this.#driver.capabilities.conditionalCopySource;
353
+ const destinationCapability = this.#driver.capabilities.conditionalCopyDestination;
295
354
  const promote = this.#driver.promote;
296
- if (capability?.supported !== true ||
297
- promote === undefined ||
298
- (sourceEtag !== undefined && !capability.etag) ||
299
- (sourceVersion !== undefined && !capability.version)) {
355
+ if (promote === undefined ||
356
+ (sourceEtag !== undefined && sourceCapability?.etag !== true) ||
357
+ (sourceVersion !== undefined && sourceCapability?.version !== true) ||
358
+ (destination?.type === 'create' &&
359
+ destinationCapability?.create !== true) ||
360
+ (destination?.type === 'replace' &&
361
+ destinationCapability?.replace !== true) ||
362
+ (destination !== undefined &&
363
+ (sourceEtag !== undefined || sourceVersion !== undefined) &&
364
+ destinationCapability?.atomicWithSource !== true)) {
300
365
  throw new StorageError(`Store "${this.name}" does not support the requested conditional promotion.`, {
301
366
  code: StorageErrorCode.NOT_SUPPORTED,
302
367
  key: sourceKey,