@dimah-s3/server 0.1.0

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 (77) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +46 -0
  3. package/dist/adapters/next.d.ts +18 -0
  4. package/dist/adapters/next.d.ts.map +1 -0
  5. package/dist/adapters/next.js +12 -0
  6. package/dist/adapters/next.js.map +1 -0
  7. package/dist/adapters/node.d.ts +16 -0
  8. package/dist/adapters/node.d.ts.map +1 -0
  9. package/dist/adapters/node.js +116 -0
  10. package/dist/adapters/node.js.map +1 -0
  11. package/dist/api.d.ts +5 -0
  12. package/dist/api.d.ts.map +1 -0
  13. package/dist/dimah-s3.d.ts +36 -0
  14. package/dist/dimah-s3.d.ts.map +1 -0
  15. package/dist/errors.d.ts +34 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/handler.d.ts +5 -0
  18. package/dist/handler.d.ts.map +1 -0
  19. package/dist/helpers/index.d.ts +3 -0
  20. package/dist/helpers/index.d.ts.map +1 -0
  21. package/dist/helpers/is-aws-not-found.d.ts +3 -0
  22. package/dist/helpers/is-aws-not-found.d.ts.map +1 -0
  23. package/dist/helpers/is-aws-not-found.test.d.ts +2 -0
  24. package/dist/helpers/is-aws-not-found.test.d.ts.map +1 -0
  25. package/dist/helpers/resolve-object-acl.d.ts +10 -0
  26. package/dist/helpers/resolve-object-acl.d.ts.map +1 -0
  27. package/dist/index.d.ts +9 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +1047 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/internal-helpers.d.ts +23 -0
  32. package/dist/internal-helpers.d.ts.map +1 -0
  33. package/dist/internal-helpers.test.d.ts +2 -0
  34. package/dist/internal-helpers.test.d.ts.map +1 -0
  35. package/dist/plugin/apply-plugins.d.ts +11 -0
  36. package/dist/plugin/apply-plugins.d.ts.map +1 -0
  37. package/dist/plugin/apply-plugins.test.d.ts +2 -0
  38. package/dist/plugin/apply-plugins.test.d.ts.map +1 -0
  39. package/dist/plugin/chain-hooks.d.ts +18 -0
  40. package/dist/plugin/chain-hooks.d.ts.map +1 -0
  41. package/dist/plugin/create-endpoint.d.ts +20 -0
  42. package/dist/plugin/create-endpoint.d.ts.map +1 -0
  43. package/dist/plugin/define-plugin.d.ts +17 -0
  44. package/dist/plugin/define-plugin.d.ts.map +1 -0
  45. package/dist/plugin/hook-registry.d.ts +12 -0
  46. package/dist/plugin/hook-registry.d.ts.map +1 -0
  47. package/dist/plugin/index.d.ts +8 -0
  48. package/dist/plugin/index.d.ts.map +1 -0
  49. package/dist/plugin/types.d.ts +101 -0
  50. package/dist/plugin/types.d.ts.map +1 -0
  51. package/dist/procedures/confirm.d.ts +8 -0
  52. package/dist/procedures/confirm.d.ts.map +1 -0
  53. package/dist/procedures/delete.d.ts +8 -0
  54. package/dist/procedures/delete.d.ts.map +1 -0
  55. package/dist/procedures/download.d.ts +10 -0
  56. package/dist/procedures/download.d.ts.map +1 -0
  57. package/dist/procedures/multipart/abort.d.ts +13 -0
  58. package/dist/procedures/multipart/abort.d.ts.map +1 -0
  59. package/dist/procedures/multipart/complete.d.ts +12 -0
  60. package/dist/procedures/multipart/complete.d.ts.map +1 -0
  61. package/dist/procedures/multipart/init.d.ts +13 -0
  62. package/dist/procedures/multipart/init.d.ts.map +1 -0
  63. package/dist/procedures/multipart/list-parts.d.ts +9 -0
  64. package/dist/procedures/multipart/list-parts.d.ts.map +1 -0
  65. package/dist/procedures/multipart/part.d.ts +12 -0
  66. package/dist/procedures/multipart/part.d.ts.map +1 -0
  67. package/dist/procedures/registry.d.ts +78 -0
  68. package/dist/procedures/registry.d.ts.map +1 -0
  69. package/dist/procedures/upload.d.ts +14 -0
  70. package/dist/procedures/upload.d.ts.map +1 -0
  71. package/dist/types/config.d.ts +87 -0
  72. package/dist/types/config.d.ts.map +1 -0
  73. package/dist/types/hook-contexts.d.ts +147 -0
  74. package/dist/types/hook-contexts.d.ts.map +1 -0
  75. package/dist/types/index.d.ts +3 -0
  76. package/dist/types/index.d.ts.map +1 -0
  77. package/package.json +72 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/internal-helpers.ts","../src/helpers/is-aws-not-found.ts","../src/helpers/resolve-object-acl.ts","../src/procedures/confirm.ts","../src/procedures/delete.ts","../src/procedures/download.ts","../src/procedures/multipart/abort.ts","../src/procedures/multipart/complete.ts","../src/procedures/multipart/init.ts","../src/procedures/multipart/list-parts.ts","../src/procedures/multipart/part.ts","../src/procedures/upload.ts","../src/procedures/registry.ts","../src/api.ts","../src/handler.ts","../src/plugin/chain-hooks.ts","../src/plugin/hook-registry.ts","../src/plugin/types.ts","../src/plugin/apply-plugins.ts","../src/plugin/create-endpoint.ts","../src/plugin/define-plugin.ts","../src/dimah-s3.ts"],"names":["DimahS3Error","HeadObjectCommand","parseFileName","buildContentDisposition","ListPartsCommand","getSignedUrl","url","S3_API_ROUTES","pluginEndpointPath","S3_API_BASE_PATH"],"mappings":"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","file":"index.js","sourcesContent":["import { DimahS3Error, S3_ERROR_CODES, type S3ErrorCode } from \"@dimah-s3/core\";\n\nexport { DimahS3Error };\n\n/** English API errors with stable codes for client-side localization. */\nexport const errors = {\n notFound: () =>\n new DimahS3Error(\"Not Found\", 404, { code: S3_ERROR_CODES.NOT_FOUND }),\n\n invalidJson: () =>\n new DimahS3Error(\"Invalid JSON payload\", 400, {\n code: S3_ERROR_CODES.INVALID_JSON,\n }),\n\n forbidden: () =>\n new DimahS3Error(\"Forbidden\", 403, { code: S3_ERROR_CODES.FORBIDDEN }),\n\n internalError: () =>\n new DimahS3Error(\"Internal server error\", 500, {\n code: S3_ERROR_CODES.INTERNAL_ERROR,\n }),\n\n objectNotFound: () =>\n new DimahS3Error(\"Object not found\", 404, {\n code: S3_ERROR_CODES.OBJECT_NOT_FOUND,\n }),\n\n s3NetworkError: (code: string) =>\n new DimahS3Error(\n `S3 endpoint unreachable (${code}): check your endpoint URL and network connectivity`,\n 502,\n { code: S3_ERROR_CODES.S3_NETWORK_ERROR, params: { code } },\n ),\n\n fieldRequired: (name: string) =>\n new DimahS3Error(`${name} is required`, 400, {\n code: S3_ERROR_CODES.FIELD_REQUIRED,\n params: { name },\n }),\n\n /** Missing `key` on query-string routes (download / delete / list-parts). */\n keyRequired: () =>\n new DimahS3Error(\"key query parameter is required\", 400, {\n code: S3_ERROR_CODES.KEY_REQUIRED,\n }),\n\n uploadIdRequired: () =>\n new DimahS3Error(\"uploadId is required\", 400, {\n code: S3_ERROR_CODES.UPLOAD_ID_REQUIRED,\n }),\n\n partNumberInvalid: () =>\n new DimahS3Error(\"partNumber must be a positive integer\", 400, {\n code: S3_ERROR_CODES.PART_NUMBER_INVALID,\n }),\n\n partsRequired: () =>\n new DimahS3Error(\"At least one valid part is required\", 400, {\n code: S3_ERROR_CODES.PARTS_REQUIRED,\n }),\n\n fileSizeRequiredUpload: () =>\n new DimahS3Error(\n \"fileSize is required when upload.requireFileSize is enabled\",\n 400,\n { code: S3_ERROR_CODES.FILE_SIZE_REQUIRED_UPLOAD },\n ),\n\n fileSizeRequiredMultipart: () =>\n new DimahS3Error(\n \"fileSize is required when multipart.requireFileSize is enabled\",\n 400,\n { code: S3_ERROR_CODES.FILE_SIZE_REQUIRED_MULTIPART },\n ),\n} as const;\n\nexport type ServerErrors = typeof errors;\n\n/** Trim and require a non-empty string; throws {@link errors.fieldRequired}. */\nexport function requireString(value: unknown, name: string): string {\n const trimmed = typeof value === \"string\" ? value.trim() : \"\";\n if (!trimmed) throw errors.fieldRequired(name);\n return trimmed;\n}\n\nfunction statusOf(err: unknown, fallback: number): number {\n return typeof (err as { status?: unknown })?.status === \"number\"\n ? (err as { status: number }).status\n : fallback;\n}\n\n/**\n * Convert hook/S3 throws into {@link DimahS3Error}.\n *\n * - Existing {@link DimahS3Error} instances are preserved (including subclasses).\n * - Plain `Error`s keep their message; `code` is only applied when provided\n * (omit it so clients show the custom English message instead of a mapped\n * library string).\n */\nexport function toDimahS3Error(\n err: unknown,\n fallbackMessage: string,\n fallbackStatus = 403,\n options?: { code?: S3ErrorCode | string },\n): DimahS3Error {\n if (err instanceof DimahS3Error) return err;\n\n const message =\n err instanceof Error && err.message.trim() ? err.message : fallbackMessage;\n const status = statusOf(err, fallbackStatus);\n\n return new DimahS3Error(message, status, {\n cause: err instanceof Error ? err : undefined,\n ...(options?.code !== undefined ? { code: options.code } : {}),\n });\n}\n","import { DimahS3Error } from \"@dimah-s3/core\";\nimport { errors, toDimahS3Error } from \"./errors\";\n\nexport async function parseBody<T extends Record<string, unknown>>(\n request: Request,\n): Promise<T | null> {\n try {\n const body = await request.json();\n return body && typeof body === \"object\" ? (body as T) : null;\n } catch {\n return null;\n }\n}\n\nfunction errorJson(err: DimahS3Error): Response {\n return Response.json(\n {\n message: err.message,\n ...(err.code !== undefined ? { code: err.code } : {}),\n ...(err.params !== undefined ? { params: err.params } : {}),\n },\n { status: err.status },\n );\n}\n\nconst NETWORK_CODES = new Set([\n \"EAI_AGAIN\",\n \"ECONNREFUSED\",\n \"ECONNRESET\",\n \"ETIMEDOUT\",\n \"ENOTFOUND\",\n]);\n\n/** Map uncaught procedure errors to a JSON {@link Response}. */\nexport function toErrorResponse(err: unknown): Response {\n if (err instanceof DimahS3Error) {\n return errorJson(err);\n }\n\n const code = (err as { code?: string })?.code;\n if (typeof code === \"string\" && NETWORK_CODES.has(code)) {\n const networkErr = errors.s3NetworkError(code);\n console.error(\"[S3 API]\", networkErr.message, err);\n return errorJson(networkErr);\n }\n\n // Never leak raw SDK / stack messages — clients localize via `code`.\n console.error(\"[S3 API]\", err);\n return errorJson(errors.internalError());\n}\n\nexport function wrapHandler(handler: (request: Request) => Promise<Response>) {\n return async (request: Request) => {\n try {\n return await handler(request);\n } catch (err) {\n return toErrorResponse(err);\n }\n };\n}\n\n/**\n * Run a guard hook. {@link DimahS3Error} is preserved; plain Errors keep their\n * English message without a library `code` so client `useFormatDimahError` does\n * not replace them with a generic mapped string.\n */\nexport async function runHook<T extends { request: Request }>(\n hook: ((context: T) => Promise<void> | void) | undefined,\n context: T,\n): Promise<void> {\n if (!hook) return;\n try {\n await hook(context);\n } catch (err) {\n if (err instanceof DimahS3Error) throw err;\n if (err instanceof Error && err.message.trim()) {\n // No library `code` — client shows this English message as-is.\n throw toDimahS3Error(err, errors.forbidden().message, 403);\n }\n throw errors.forbidden();\n }\n}\n\n/**\n * Run a lifecycle `on*` hook. Failures become {@link errors.internalError}\n * (or preserve an existing {@link DimahS3Error}).\n */\nexport async function runLifecycleHook<T extends { request: Request }>(\n hook: ((context: T) => Promise<void> | void) | undefined,\n context: T,\n): Promise<void> {\n if (!hook) return;\n try {\n await hook(context);\n } catch (err) {\n if (err instanceof DimahS3Error) throw err;\n console.error(\"[S3 API] lifecycle hook failed\", err);\n throw errors.internalError();\n }\n}\n\nexport function normalizeExpiresIn(value: unknown): number {\n const n = Number(value);\n return Number.isFinite(n) && n > 0 ? Math.floor(n) : 600;\n}\n\n/** Build a synthetic Request for server-side `api` calls. */\nexport function requestFromHeaders(headers?: HeadersInit): Request {\n return new Request(\"http://dimah-s3.local\", { headers });\n}\n","/** True when an AWS SDK throw means the object (or key) does not exist. */\nexport function isAwsNotFound(err: unknown): boolean {\n const e = err as {\n name?: string;\n Code?: string;\n $metadata?: { httpStatusCode?: number };\n };\n return (\n e?.name === \"NoSuchKey\" ||\n e?.name === \"NotFound\" ||\n e?.Code === \"NoSuchKey\" ||\n e?.Code === \"NotFound\" ||\n e?.$metadata?.httpStatusCode === 404\n );\n}\n","import { GetObjectAclCommand, type S3Client } from \"@aws-sdk/client-s3\";\n\nconst DEFAULT_ACL_LOOKUP_TIMEOUT_MS = 1_500;\n\n/**\n * Determines the ACL of an S3 object by querying `GetObjectAcl`.\n *\n * Returns `\"public-read\"` when the `AllUsers` grantee has `READ` or\n * `FULL_CONTROL` permission, `\"private\"` when ACL is resolvable but not public,\n * and `undefined` when ACL cannot be resolved (e.g. unsupported providers).\n */\nexport async function resolveObjectAcl(\n s3: S3Client,\n bucket: string,\n key: string,\n timeoutMs: number = DEFAULT_ACL_LOOKUP_TIMEOUT_MS,\n): Promise<\"public-read\" | \"private\" | undefined> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const result = await s3.send(\n new GetObjectAclCommand({ Bucket: bucket, Key: key }),\n { abortSignal: controller.signal },\n );\n const isPublic = result.Grants?.some(\n (g) =>\n g.Grantee?.URI === \"http://acs.amazonaws.com/groups/global/AllUsers\" &&\n (g.Permission === \"READ\" || g.Permission === \"FULL_CONTROL\"),\n );\n return isPublic ? \"public-read\" : \"private\";\n } catch {\n return undefined;\n } finally {\n clearTimeout(timeout);\n }\n}\n","import { HeadObjectCommand } from \"@aws-sdk/client-s3\";\nimport type { UploadConfirmResponse } from \"@dimah-s3/core\";\nimport { parseFileName } from \"@dimah-s3/core\";\nimport { requireString } from \"../errors\";\nimport { resolveObjectAcl } from \"../helpers\";\nimport { runHook, runLifecycleHook } from \"../internal-helpers\";\nimport type { DimahS3Config } from \"../types\";\n\nexport type ConfirmInput = {\n key: string;\n bucket?: string;\n};\n\nexport async function confirm(\n config: DimahS3Config,\n input: ConfirmInput,\n request: Request,\n): Promise<UploadConfirmResponse> {\n const key = requireString(input.key, \"key\");\n const bucket = input.bucket?.trim() || config.defaultBucket;\n\n await runHook(config.upload?.confirmGuard, {\n request,\n key,\n bucket,\n });\n\n const head = await config.s3.send(\n new HeadObjectCommand({ Bucket: bucket, Key: key }),\n );\n\n const acl = config.resolveObjectAcl\n ? await resolveObjectAcl(config.s3, bucket, key)\n : undefined;\n const fileName = parseFileName(head.ContentDisposition);\n\n const context = {\n request,\n key,\n bucket,\n contentType: head.ContentType,\n contentLength: head.ContentLength ?? 0,\n eTag: head.ETag?.replace(/\"/g, \"\"),\n metadata: head.Metadata,\n acl,\n fileName,\n versionId: head.VersionId,\n lastModified: head.LastModified?.toISOString(),\n };\n\n await runLifecycleHook(config.upload?.onConfirmed, context);\n\n return {\n key,\n bucket,\n contentType: context.contentType,\n contentLength: context.contentLength,\n eTag: context.eTag,\n metadata: context.metadata ?? {},\n acl,\n fileName,\n versionId: context.versionId,\n lastModified: context.lastModified,\n };\n}\n","import { DeleteObjectCommand, HeadObjectCommand } from \"@aws-sdk/client-s3\";\nimport type { DeleteResponse } from \"@dimah-s3/core\";\nimport { errors } from \"../errors\";\nimport { isAwsNotFound } from \"../helpers\";\nimport { runHook, runLifecycleHook } from \"../internal-helpers\";\nimport type { DimahS3Config } from \"../types\";\n\nexport type DeleteInput = {\n key: string;\n bucket?: string;\n};\n\nexport async function deleteObject(\n config: DimahS3Config,\n input: DeleteInput,\n request: Request,\n): Promise<DeleteResponse> {\n const key = input.key?.trim();\n if (!key) {\n throw errors.keyRequired();\n }\n\n const bucket = input.bucket?.trim() || config.defaultBucket;\n\n await runHook(config.delete?.guard, {\n request,\n key,\n bucket,\n });\n\n try {\n await config.s3.send(new HeadObjectCommand({ Bucket: bucket, Key: key }));\n } catch (err: unknown) {\n if (isAwsNotFound(err)) {\n throw errors.objectNotFound();\n }\n throw err;\n }\n\n await config.s3.send(new DeleteObjectCommand({ Bucket: bucket, Key: key }));\n\n await runLifecycleHook(config.delete?.onDeleted, { request, key, bucket });\n\n return { success: true, bucket, key };\n}\n","import { GetObjectCommand, HeadObjectCommand } from \"@aws-sdk/client-s3\";\nimport { getSignedUrl } from \"@aws-sdk/s3-request-presigner\";\nimport type { PresignResponse } from \"@dimah-s3/core\";\nimport { buildContentDisposition } from \"@dimah-s3/core\";\nimport { errors } from \"../errors\";\nimport { isAwsNotFound } from \"../helpers\";\nimport {\n normalizeExpiresIn,\n runHook,\n runLifecycleHook,\n} from \"../internal-helpers\";\nimport type { DimahS3Config } from \"../types\";\n\nexport type DownloadInput = {\n key: string;\n bucket?: string;\n fileName?: string;\n expiresIn?: number;\n};\n\nexport async function download(\n config: DimahS3Config,\n input: DownloadInput,\n request: Request,\n): Promise<PresignResponse> {\n const key = input.key?.trim();\n if (!key) {\n throw errors.keyRequired();\n }\n\n const bucket = input.bucket?.trim() || config.defaultBucket;\n const expiresIn = normalizeExpiresIn(input.expiresIn);\n const fileName = input.fileName?.trim();\n\n await runHook(config.download?.presignGuard, {\n request,\n key,\n bucket,\n fileName: fileName || undefined,\n });\n\n try {\n await config.s3.send(new HeadObjectCommand({ Bucket: bucket, Key: key }));\n } catch (err: unknown) {\n if (isAwsNotFound(err)) {\n throw errors.objectNotFound();\n }\n throw err;\n }\n\n const url = await getSignedUrl(\n config.s3,\n new GetObjectCommand({\n Bucket: bucket,\n Key: key,\n ResponseContentDisposition: fileName\n ? buildContentDisposition(fileName)\n : \"attachment\",\n }),\n { expiresIn },\n );\n\n await runLifecycleHook(config.download?.onPresigned, {\n request,\n key,\n bucket,\n fileName: fileName || undefined,\n url,\n expiresIn,\n });\n\n return { bucket, key, url, expiresIn };\n}\n","import { AbortMultipartUploadCommand } from \"@aws-sdk/client-s3\";\nimport type { MultipartAbortResponse } from \"@dimah-s3/core\";\nimport { requireString } from \"../../errors\";\nimport { runHook, runLifecycleHook } from \"../../internal-helpers\";\nimport type { DimahS3Config } from \"../../types\";\n\nexport type MultipartAbortInput = {\n key: string;\n uploadId: string;\n bucket?: string;\n};\n\nexport async function multipartAbort(\n config: DimahS3Config,\n input: MultipartAbortInput,\n request: Request,\n): Promise<\n MultipartAbortResponse & { bucket: string; key: string; uploadId: string }\n> {\n const key = requireString(input.key, \"key\");\n const uploadId = requireString(input.uploadId, \"uploadId\");\n const bucket = input.bucket?.trim() || config.defaultBucket;\n\n await runHook(config.multipart?.abortGuard, {\n request,\n key,\n bucket,\n uploadId,\n });\n\n await config.s3.send(\n new AbortMultipartUploadCommand({\n Bucket: bucket,\n Key: key,\n UploadId: uploadId,\n }),\n );\n\n await runLifecycleHook(config.multipart?.onAbort, {\n request,\n key,\n bucket,\n uploadId,\n });\n\n return { bucket, key, uploadId, aborted: true };\n}\n","import {\n CompleteMultipartUploadCommand,\n HeadObjectCommand,\n ListPartsCommand,\n} from \"@aws-sdk/client-s3\";\nimport type { MultipartCompleteResponse } from \"@dimah-s3/core\";\nimport { parseFileName } from \"@dimah-s3/core\";\nimport { errors, requireString } from \"../../errors\";\nimport { resolveObjectAcl } from \"../../helpers\";\nimport { runHook, runLifecycleHook } from \"../../internal-helpers\";\nimport type { DimahS3Config } from \"../../types\";\n\nexport type MultipartCompleteInput = {\n key: string;\n uploadId: string;\n bucket?: string;\n parts: { partNumber: number }[];\n};\n\nexport async function multipartComplete(\n config: DimahS3Config,\n input: MultipartCompleteInput,\n request: Request,\n): Promise<MultipartCompleteResponse> {\n const key = requireString(input.key, \"key\");\n const uploadId = requireString(input.uploadId, \"uploadId\");\n\n const parts = (Array.isArray(input.parts) ? input.parts : [])\n .map(({ partNumber }) => Number(partNumber))\n .filter((n) => Number.isInteger(n) && n > 0)\n .sort((a, b) => a - b);\n\n if (!parts.length) {\n throw errors.partsRequired();\n }\n\n const bucket = input.bucket?.trim() || config.defaultBucket;\n const partRefs = parts.map((partNumber) => ({ partNumber }));\n\n await runHook(config.multipart?.completeGuard, {\n request,\n key,\n bucket,\n uploadId,\n parts: partRefs,\n });\n\n const listed = await config.s3.send(\n new ListPartsCommand({ Bucket: bucket, Key: key, UploadId: uploadId }),\n );\n const listedParts = listed.Parts ?? [];\n\n const completeParts = parts.map((partNumber) => {\n const found = listedParts.find((p) => p.PartNumber === partNumber);\n return { PartNumber: partNumber, ETag: found?.ETag ?? \"\" };\n });\n\n const completeResult = await config.s3.send(\n new CompleteMultipartUploadCommand({\n Bucket: bucket,\n Key: key,\n UploadId: uploadId,\n MultipartUpload: { Parts: completeParts },\n }),\n );\n\n let head = await config.s3.send(\n new HeadObjectCommand({ Bucket: bucket, Key: key }),\n );\n for (let attempt = 0; attempt < 4 && !head.ContentLength; attempt++) {\n await new Promise((r) => setTimeout(r, 250 * 2 ** attempt));\n head = await config.s3.send(\n new HeadObjectCommand({ Bucket: bucket, Key: key }),\n );\n }\n const contentLength = head.ContentLength ?? 0;\n const contentType = head.ContentType;\n const eTag = (head.ETag ?? completeResult.ETag ?? \"\").replace(/\"/g, \"\");\n const metadata = head.Metadata ?? {};\n const versionId = head.VersionId;\n const lastModified = head.LastModified?.toISOString();\n\n const acl = config.resolveObjectAcl\n ? await resolveObjectAcl(config.s3, bucket, key)\n : undefined;\n const fileName = parseFileName(head.ContentDisposition);\n\n await runLifecycleHook(config.multipart?.onComplete, {\n request,\n key,\n bucket,\n uploadId,\n contentLength,\n contentType,\n eTag,\n metadata,\n acl,\n fileName,\n versionId,\n lastModified,\n });\n\n return {\n bucket,\n key,\n uploadId,\n contentLength,\n contentType,\n eTag,\n metadata,\n acl,\n fileName,\n versionId,\n lastModified,\n };\n}\n","import { CreateMultipartUploadCommand } from \"@aws-sdk/client-s3\";\nimport type { MultipartInitResponse } from \"@dimah-s3/core\";\nimport { buildContentDisposition } from \"@dimah-s3/core\";\nimport { errors, requireString } from \"../../errors\";\nimport { runHook, runLifecycleHook } from \"../../internal-helpers\";\nimport type { DimahS3Config } from \"../../types\";\n\nexport type MultipartInitInput = {\n key: string;\n bucket?: string;\n contentType?: string;\n fileSize?: number;\n metadata?: Record<string, string>;\n acl?: \"private\" | \"public-read\";\n fileName?: string;\n};\n\nexport async function multipartInit(\n config: DimahS3Config,\n input: MultipartInitInput,\n request: Request,\n): Promise<MultipartInitResponse> {\n const key = requireString(input.key, \"key\");\n const bucket = input.bucket?.trim() || config.defaultBucket;\n const acl = input.acl === \"public-read\" ? \"public-read\" : \"private\";\n const fileSize =\n typeof input.fileSize === \"number\" && input.fileSize > 0\n ? Math.floor(input.fileSize)\n : undefined;\n\n if (config.multipart?.requireFileSize && fileSize === undefined) {\n throw errors.fileSizeRequiredMultipart();\n }\n\n await runHook(config.multipart?.initGuard, {\n request,\n key,\n bucket,\n fileSize,\n });\n\n const { UploadId } = await config.s3.send(\n new CreateMultipartUploadCommand({\n Bucket: bucket,\n Key: key,\n ContentType: input.contentType,\n ContentDisposition: input.fileName\n ? buildContentDisposition(input.fileName)\n : undefined,\n Metadata: input.metadata,\n ACL: acl,\n }),\n );\n\n await runLifecycleHook(config.multipart?.onInit, {\n request,\n key,\n bucket,\n uploadId: UploadId!,\n contentType: input.contentType,\n fileSize,\n metadata: input.metadata,\n acl,\n fileName: input.fileName,\n });\n\n return { bucket, key, uploadId: UploadId! };\n}\n","import { ListPartsCommand } from \"@aws-sdk/client-s3\";\nimport type { MultipartListPartsResponse } from \"@dimah-s3/core\";\nimport { errors } from \"../../errors\";\nimport { runHook, runLifecycleHook } from \"../../internal-helpers\";\nimport type { DimahS3Config } from \"../../types\";\n\nexport type MultipartListPartsInput = {\n key: string;\n uploadId: string;\n bucket?: string;\n};\n\nexport async function multipartListParts(\n config: DimahS3Config,\n input: MultipartListPartsInput,\n request: Request,\n): Promise<MultipartListPartsResponse> {\n const key = input.key?.trim() ?? \"\";\n const uploadId = input.uploadId?.trim() ?? \"\";\n const bucketParam = input.bucket?.trim();\n\n if (!key) {\n throw errors.keyRequired();\n }\n if (!uploadId) {\n throw errors.uploadIdRequired();\n }\n\n const bucket = bucketParam || config.defaultBucket;\n\n await runHook(config.multipart?.listGuard, {\n request,\n key,\n bucket,\n uploadId,\n });\n\n const response = await config.s3.send(\n new ListPartsCommand({\n Bucket: bucket,\n Key: key,\n UploadId: uploadId,\n }),\n );\n\n const parts = (response.Parts ?? []).map((p) => ({\n partNumber: p.PartNumber ?? 0,\n size: p.Size ?? 0,\n eTag: (p.ETag ?? \"\").replace(/\"/g, \"\"),\n }));\n\n await runLifecycleHook(config.multipart?.onList, {\n request,\n key,\n bucket,\n uploadId,\n parts,\n });\n\n return { parts };\n}\n","import { UploadPartCommand } from \"@aws-sdk/client-s3\";\nimport { getSignedUrl } from \"@aws-sdk/s3-request-presigner\";\nimport type { MultipartPartResponse } from \"@dimah-s3/core\";\nimport { errors, requireString } from \"../../errors\";\nimport { normalizeExpiresIn, runHook } from \"../../internal-helpers\";\nimport type { DimahS3Config } from \"../../types\";\n\nexport type MultipartSignPartInput = {\n key: string;\n uploadId: string;\n partNumber: number;\n partSize?: number;\n bucket?: string;\n expiresIn?: number;\n};\n\nexport async function multipartSignPart(\n config: DimahS3Config,\n input: MultipartSignPartInput,\n request: Request,\n): Promise<MultipartPartResponse> {\n const key = requireString(input.key, \"key\");\n const uploadId = requireString(input.uploadId, \"uploadId\");\n const partNumber = Number(input.partNumber);\n if (!Number.isInteger(partNumber) || partNumber <= 0) {\n throw errors.partNumberInvalid();\n }\n\n const bucket = input.bucket?.trim() || config.defaultBucket;\n const expiresIn = normalizeExpiresIn(input.expiresIn);\n const partSize =\n typeof input.partSize === \"number\" && input.partSize > 0\n ? Math.floor(input.partSize)\n : null;\n\n await runHook(config.multipart?.partGuard, {\n request,\n key,\n bucket,\n uploadId,\n partNumber,\n partSize: partSize ?? undefined,\n });\n\n const presignedUrl = await getSignedUrl(\n config.s3,\n new UploadPartCommand({\n Bucket: bucket,\n Key: key,\n UploadId: uploadId,\n PartNumber: partNumber,\n ...(partSize !== null ? { ContentLength: partSize } : {}),\n }),\n {\n expiresIn,\n ...(partSize !== null\n ? { signableHeaders: new Set([\"content-length\"]) }\n : {}),\n },\n );\n\n return {\n presignedUrl,\n partNumber,\n uploadId,\n bucket,\n expiresIn,\n ...(partSize !== null ? { partSize } : {}),\n };\n}\n","import { createPresignedPost } from \"@aws-sdk/s3-presigned-post\";\nimport { getSignedUrl } from \"@aws-sdk/s3-request-presigner\";\nimport { PutObjectCommand } from \"@aws-sdk/client-s3\";\nimport type { UploadPresignResponse } from \"@dimah-s3/core\";\nimport { buildContentDisposition } from \"@dimah-s3/core\";\nimport { errors, requireString } from \"../errors\";\nimport {\n normalizeExpiresIn,\n runHook,\n runLifecycleHook,\n} from \"../internal-helpers\";\nimport type { DimahS3Config } from \"../types\";\n\nexport type UploadInput = {\n key: string;\n contentType?: string;\n fileSize?: number;\n metadata?: Record<string, string>;\n bucket?: string;\n expiresIn?: number;\n acl?: \"private\" | \"public-read\";\n fileName?: string;\n};\n\nexport async function upload(\n config: DimahS3Config,\n input: UploadInput,\n request: Request,\n): Promise<UploadPresignResponse> {\n const key = requireString(input.key, \"key\");\n const bucket = input.bucket?.trim() || config.defaultBucket;\n const expiresIn = normalizeExpiresIn(input.expiresIn);\n const acl = input.acl === \"public-read\" ? \"public-read\" : \"private\";\n const contentType = input.contentType?.trim() || \"application/octet-stream\";\n const fileSize =\n typeof input.fileSize === \"number\" && input.fileSize > 0\n ? Math.floor(input.fileSize)\n : null;\n\n await runHook(config.upload?.presignGuard, {\n request,\n key,\n bucket,\n contentType: input.contentType,\n fileSize: fileSize ?? undefined,\n metadata: input.metadata,\n acl,\n fileName: input.fileName,\n });\n\n const method = config.upload?.method ?? \"POST\";\n\n if (method === \"PUT\" && config.upload?.requireFileSize && fileSize === null) {\n throw errors.fileSizeRequiredUpload();\n }\n\n if (method === \"PUT\") {\n const putHeaders: Record<string, string> = {\n \"Content-Type\": contentType,\n };\n if (input.fileName) {\n putHeaders[\"Content-Disposition\"] = buildContentDisposition(\n input.fileName,\n );\n }\n\n const url = await getSignedUrl(\n config.s3,\n new PutObjectCommand({\n Bucket: bucket,\n Key: key,\n ContentType: contentType,\n ACL: acl,\n ...(input.fileName\n ? { ContentDisposition: buildContentDisposition(input.fileName) }\n : {}),\n ...(fileSize !== null ? { ContentLength: fileSize } : {}),\n }),\n {\n expiresIn,\n ...(fileSize !== null\n ? { signableHeaders: new Set([\"content-length\"]) }\n : {}),\n },\n );\n\n await runLifecycleHook(config.upload?.onPresigned, {\n request,\n key,\n bucket,\n contentType: input.contentType,\n fileSize: fileSize ?? undefined,\n metadata: input.metadata,\n acl,\n fileName: input.fileName,\n url,\n expiresIn,\n });\n\n return {\n bucket,\n key,\n url,\n headers: putHeaders,\n expiresIn,\n method: \"PUT\",\n };\n }\n\n const fields: Record<string, string> = { acl, \"Content-Type\": contentType };\n\n if (input.fileName) {\n fields[\"Content-Disposition\"] = buildContentDisposition(input.fileName);\n }\n\n if (input.metadata) {\n for (const [k, v] of Object.entries(input.metadata)) {\n fields[`x-amz-meta-${k}`] = v;\n }\n }\n\n const rangeMin = fileSize ?? 1;\n const rangeMax = fileSize ?? undefined;\n\n const { url, fields: signedFields } = await createPresignedPost(config.s3, {\n Bucket: bucket,\n Key: key,\n Conditions:\n rangeMax !== undefined\n ? [[\"content-length-range\", rangeMin, rangeMax]]\n : [[\"content-length-range\", rangeMin, Number.MAX_SAFE_INTEGER]],\n Fields: fields,\n Expires: expiresIn,\n });\n\n await runLifecycleHook(config.upload?.onPresigned, {\n request,\n key,\n bucket,\n contentType: input.contentType,\n fileSize: fileSize ?? undefined,\n metadata: input.metadata,\n acl,\n fileName: input.fileName,\n url,\n expiresIn,\n });\n\n return {\n bucket,\n key,\n url,\n fields: signedFields,\n expiresIn,\n method: \"POST\",\n };\n}\n","import { S3_API_ROUTES } from \"@dimah-s3/core\";\nimport type { DimahS3Config } from \"../types\";\nimport { confirm } from \"./confirm\";\nimport { deleteObject } from \"./delete\";\nimport { download } from \"./download\";\nimport { multipartAbort } from \"./multipart/abort\";\nimport { multipartComplete } from \"./multipart/complete\";\nimport { multipartInit } from \"./multipart/init\";\nimport { multipartListParts } from \"./multipart/list-parts\";\nimport { multipartSignPart } from \"./multipart/part\";\nimport { upload } from \"./upload\";\n\n/**\n * Single source of truth for core procedures shared by the HTTP handler and\n * direct `createServerApi`. Keys match {@link S3_API_ROUTES}.\n */\nexport type ProcedureEntry = {\n /** Relative path under `basePath` (same as `S3_API_ROUTES` values). */\n path: string;\n method: \"GET\" | \"POST\" | \"DELETE\";\n /** Optional HTTP status for successful JSON responses. */\n status?: number;\n /** Feature flag — disabled → 404 from both handler and `api`. */\n isEnabled: (config: DimahS3Config) => boolean | undefined;\n run: (\n config: DimahS3Config,\n input: unknown,\n request: Request,\n ) => Promise<unknown>;\n};\n\nexport const PROCEDURE_REGISTRY = {\n upload: {\n path: S3_API_ROUTES.upload,\n method: \"POST\",\n isEnabled: (c) => c.upload?.enabled,\n run: (config, input, request) =>\n upload(config, input as Parameters<typeof upload>[1], request),\n },\n uploadConfirm: {\n path: S3_API_ROUTES.uploadConfirm,\n method: \"POST\",\n isEnabled: (c) => c.upload?.enabled,\n run: (config, input, request) =>\n confirm(config, input as Parameters<typeof confirm>[1], request),\n },\n download: {\n path: S3_API_ROUTES.download,\n method: \"GET\",\n isEnabled: (c) => c.download?.enabled,\n run: (config, input, request) =>\n download(config, input as Parameters<typeof download>[1], request),\n },\n delete: {\n path: S3_API_ROUTES.delete,\n method: \"DELETE\",\n isEnabled: (c) => c.delete?.enabled,\n run: (config, input, request) =>\n deleteObject(\n config,\n input as Parameters<typeof deleteObject>[1],\n request,\n ),\n },\n multipartInit: {\n path: S3_API_ROUTES.multipartInit,\n method: \"POST\",\n status: 201,\n isEnabled: (c) => c.multipart?.enabled,\n run: (config, input, request) =>\n multipartInit(\n config,\n input as Parameters<typeof multipartInit>[1],\n request,\n ),\n },\n multipartPart: {\n path: S3_API_ROUTES.multipartPart,\n method: \"POST\",\n isEnabled: (c) => c.multipart?.enabled,\n run: (config, input, request) =>\n multipartSignPart(\n config,\n input as Parameters<typeof multipartSignPart>[1],\n request,\n ),\n },\n multipartComplete: {\n path: S3_API_ROUTES.multipartComplete,\n method: \"POST\",\n isEnabled: (c) => c.multipart?.enabled,\n run: (config, input, request) =>\n multipartComplete(\n config,\n input as Parameters<typeof multipartComplete>[1],\n request,\n ),\n },\n multipartAbort: {\n path: S3_API_ROUTES.multipartAbort,\n method: \"POST\",\n isEnabled: (c) => c.multipart?.enabled,\n run: (config, input, request) =>\n multipartAbort(\n config,\n input as Parameters<typeof multipartAbort>[1],\n request,\n ),\n },\n multipartListParts: {\n path: S3_API_ROUTES.multipartListParts,\n method: \"GET\",\n isEnabled: (c) => c.multipart?.enabled,\n run: (config, input, request) =>\n multipartListParts(\n config,\n input as Parameters<typeof multipartListParts>[1],\n request,\n ),\n },\n} as const satisfies Record<keyof typeof S3_API_ROUTES, ProcedureEntry>;\n\nexport type ProcedureKey = keyof typeof PROCEDURE_REGISTRY;\n","import type { S3Api } from \"@dimah-s3/core\";\nimport { errors } from \"./errors\";\nimport { requestFromHeaders, runHook } from \"./internal-helpers\";\nimport { PROCEDURE_REGISTRY } from \"./procedures/registry\";\nimport type { DimahS3Config } from \"./types\";\n\nasync function runProcedure<T>(\n config: DimahS3Config,\n entry: (typeof PROCEDURE_REGISTRY)[keyof typeof PROCEDURE_REGISTRY],\n headers: HeadersInit | undefined,\n input: unknown,\n): Promise<T> {\n const request = requestFromHeaders(headers);\n await runHook(config.guard, { request });\n\n if (!entry.isEnabled(config)) {\n throw errors.notFound();\n }\n\n return entry.run(config, input, request) as Promise<T>;\n}\n\n/** Direct `S3Api` backed by the same procedures as the HTTP handler. */\nexport function createServerApi(config: DimahS3Config): S3Api {\n return {\n upload: (payload) => {\n const { headers, ...input } = payload;\n return runProcedure(config, PROCEDURE_REGISTRY.upload, headers, input);\n },\n\n confirm: (payload) => {\n const { headers, ...input } = payload;\n return runProcedure(\n config,\n PROCEDURE_REGISTRY.uploadConfirm,\n headers,\n input,\n );\n },\n\n download: (key, options) => {\n const { headers, ...rest } = options ?? {};\n return runProcedure(config, PROCEDURE_REGISTRY.download, headers, {\n key,\n ...rest,\n });\n },\n\n delete: (key, options) => {\n const { headers, ...rest } = options ?? {};\n return runProcedure(config, PROCEDURE_REGISTRY.delete, headers, {\n key,\n ...rest,\n });\n },\n\n multipart: {\n init: (payload) => {\n const { headers, ...input } = payload;\n return runProcedure(\n config,\n PROCEDURE_REGISTRY.multipartInit,\n headers,\n input,\n );\n },\n\n signPart: (payload) => {\n const { headers, ...input } = payload;\n return runProcedure(\n config,\n PROCEDURE_REGISTRY.multipartPart,\n headers,\n input,\n );\n },\n\n listParts: (payload) => {\n const { headers, ...input } = payload;\n return runProcedure(\n config,\n PROCEDURE_REGISTRY.multipartListParts,\n headers,\n input,\n );\n },\n\n complete: (payload) => {\n const { headers, ...input } = payload;\n return runProcedure(\n config,\n PROCEDURE_REGISTRY.multipartComplete,\n headers,\n input,\n );\n },\n\n abort: (payload) => {\n const { headers, ...input } = payload;\n return runProcedure(\n config,\n PROCEDURE_REGISTRY.multipartAbort,\n headers,\n input,\n );\n },\n },\n };\n}\n","import {\n normalizeS3ApiBasePath,\n pluginEndpointPath,\n S3_API_BASE_PATH,\n} from \"@dimah-s3/core\";\nimport { errors, type ServerErrors } from \"./errors\";\nimport { parseBody, runHook, wrapHandler } from \"./internal-helpers\";\nimport type { ResolvedPluginEndpoint } from \"./plugin/types\";\nimport { PROCEDURE_REGISTRY, type ProcedureEntry } from \"./procedures/registry\";\nimport type { DimahS3Config } from \"./types\";\n\ntype HandlerContext = {\n config: DimahS3Config;\n request: Request;\n url: URL;\n errors: ServerErrors;\n};\n\nasync function requireJson(request: Request): Promise<Record<string, unknown>> {\n const body = await parseBody<Record<string, unknown>>(request);\n if (!body) {\n throw errors.invalidJson();\n }\n return body;\n}\n\ntype Route = {\n method: string;\n path: string;\n enabled: (config: DimahS3Config) => boolean | undefined;\n status?: number;\n run: (ctx: HandlerContext) => Promise<unknown>;\n};\n\n/** Decode HTTP-specific input, then call the shared procedure. */\nfunction decodeInput(\n entry: ProcedureEntry,\n ctx: HandlerContext,\n): Promise<unknown> {\n const { request, url } = ctx;\n const { searchParams } = url;\n\n switch (entry.path) {\n case PROCEDURE_REGISTRY.download.path: {\n const expiresRaw = searchParams.get(\"expiresIn\");\n return Promise.resolve({\n key: searchParams.get(\"key\")?.trim() ?? \"\",\n bucket: searchParams.get(\"bucket\")?.trim() || undefined,\n fileName: searchParams.get(\"fileName\")?.trim() || undefined,\n expiresIn: expiresRaw != null ? Number(expiresRaw) : undefined,\n });\n }\n case PROCEDURE_REGISTRY.delete.path:\n return Promise.resolve({\n key: searchParams.get(\"key\")?.trim() ?? \"\",\n bucket: searchParams.get(\"bucket\")?.trim() || undefined,\n });\n case PROCEDURE_REGISTRY.multipartListParts.path:\n return Promise.resolve({\n key: searchParams.get(\"key\")?.trim() ?? \"\",\n uploadId: searchParams.get(\"uploadId\")?.trim() ?? \"\",\n bucket: searchParams.get(\"bucket\")?.trim() || undefined,\n });\n default:\n return requireJson(request);\n }\n}\n\nconst routes: Route[] = Object.values(PROCEDURE_REGISTRY).map((entry) => ({\n method: entry.method,\n path: entry.path,\n enabled: entry.isEnabled,\n status: \"status\" in entry ? entry.status : undefined,\n run: async (ctx) => {\n const input = await decodeInput(entry, ctx);\n return entry.run(ctx.config, input, ctx.request);\n },\n}));\n\n/** Framework-agnostic HTTP router (`Request` → `Response`). */\nexport function createHandler(\n config: DimahS3Config,\n basePath: string = S3_API_BASE_PATH,\n pluginEndpoints: ResolvedPluginEndpoint[] = [],\n) {\n const base = normalizeS3ApiBasePath(basePath);\n\n const pluginRoutes: Route[] = pluginEndpoints.map((e) => ({\n method: e.method,\n path: pluginEndpointPath(e.pluginId, e.path),\n status: e.status,\n enabled: () => true,\n run: ({ config: cfg, request, url }) =>\n e.handler({\n request,\n url,\n config: cfg,\n errors,\n json: () => parseBody(request),\n }),\n }));\n\n const allRoutes = [...routes, ...pluginRoutes];\n\n return wrapHandler(async (request: Request) => {\n await runHook(config.guard, { request });\n\n const url = new URL(request.url);\n const subpath = url.pathname.slice(base.length).replace(/^\\//, \"\");\n\n const route = allRoutes.find(\n (r) => r.method === request.method && r.path === subpath,\n );\n\n if (!route || !route.enabled(config)) {\n throw errors.notFound();\n }\n\n const data = await route.run({ config, request, url, errors });\n return Response.json(\n data,\n route.status ? { status: route.status } : undefined,\n );\n });\n}\n","type Hook<Context> = (context: Context) => Promise<void> | void;\n\n/**\n * Compose hooks into one that awaits each in order.\n *\n * Used by {@link dimahS3} when merging plugin + user hooks, and by consumers\n * to stack extras (quota, audit) beside plugin hooks:\n *\n * ```ts\n * upload: {\n * presignGuard: chainHooks(myQuotaGuard, myAuditGuard),\n * }\n * ```\n *\n * `undefined` entries are skipped, so optional hooks compose cleanly.\n */\nexport function chainHooks<Context>(\n ...hooks: (Hook<Context> | undefined)[]\n): (context: Context) => Promise<void> {\n return async (context) => {\n for (const hook of hooks) {\n if (hook) await hook(context);\n }\n };\n}\n","/**\n * Single source of truth for which hook keys plugins may contribute per\n * feature. {@link applyPlugins} merges these ahead of user config hooks.\n */\nexport const FEATURE_HOOK_KEYS = {\n upload: [\"presignGuard\", \"onPresigned\", \"confirmGuard\", \"onConfirmed\"],\n download: [\"presignGuard\", \"onPresigned\"],\n delete: [\"guard\", \"onDeleted\"],\n multipart: [\n \"initGuard\",\n \"partGuard\",\n \"completeGuard\",\n \"abortGuard\",\n \"listGuard\",\n \"onInit\",\n \"onComplete\",\n \"onAbort\",\n \"onList\",\n ],\n} as const;\n\nexport type FeatureName = keyof typeof FEATURE_HOOK_KEYS;\n","import type { ServerErrors } from \"../errors\";\nimport type {\n DeleteConfig,\n DownloadConfig,\n MultipartConfig,\n UploadConfig,\n DimahS3Config,\n} from \"../types/config\";\n\nexport type { ServerErrors };\n\n/**\n * Hook fields a plugin may contribute. Scalars like `enabled` / `method`\n * stay user-owned on {@link DimahS3Config}.\n */\nexport type DimahS3PluginHooks = {\n guard?: DimahS3Config[\"guard\"];\n upload?: Pick<\n UploadConfig,\n \"presignGuard\" | \"onPresigned\" | \"confirmGuard\" | \"onConfirmed\"\n >;\n download?: Pick<DownloadConfig, \"presignGuard\" | \"onPresigned\">;\n delete?: Pick<DeleteConfig, \"guard\" | \"onDeleted\">;\n multipart?: Pick<\n MultipartConfig,\n | \"initGuard\"\n | \"partGuard\"\n | \"completeGuard\"\n | \"abortGuard\"\n | \"listGuard\"\n | \"onInit\"\n | \"onComplete\"\n | \"onAbort\"\n | \"onList\"\n >;\n};\n\n/**\n * Context passed to a plugin endpoint handler.\n * Global `config.guard` already ran before this is invoked.\n */\nexport type PluginEndpointContext = {\n request: Request;\n url: URL;\n config: Readonly<DimahS3Config>;\n /** English error factories with stable `code` for client localization. */\n errors: ServerErrors;\n /** Parse the request JSON body (returns `null` when missing/invalid). */\n json: <T extends Record<string, unknown>>() => Promise<T | null>;\n};\n\n/** HTTP endpoint contributed by a server plugin. */\nexport type PluginEndpoint = {\n /** Relative path under `plugins/{id}/` (e.g. `\"objects\"` → `plugins/db/objects`). */\n path: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n /** Optional HTTP status for successful JSON responses. */\n status?: number;\n handler: (ctx: PluginEndpointContext) => Promise<unknown>;\n};\n\n/** Endpoint after plugin id is attached for mounting. */\nexport type ResolvedPluginEndpoint = PluginEndpoint & { pluginId: string };\n\n/**\n * Environment passed to {@link DimahS3Plugin.init}.\n * Config is pre-merge (user config only) — use for feature-flag checks.\n */\nexport type PluginInitEnv = {\n /** User config before plugin hooks are merged — read-only. */\n config: Readonly<DimahS3Config>;\n /** Lookup another registered plugin by id. */\n getPlugin: (id: string) => DimahS3Plugin | undefined;\n};\n\n/**\n * Server plugin contract. Feature packages (e.g. `@dimah-s3/db`) return\n * these from factories like `db()` / `definePlugin()`.\n *\n * @typeParam Id — unique plugin id; becomes the key on `s3.context` and the\n * flattened instance (`s3[id]`).\n * @typeParam TContext — exposed on `s3.context[id]` and `s3[id]` after\n * `dimahS3()`.\n */\nexport type DimahS3Plugin<\n Id extends string = string,\n TContext extends Record<string, unknown> = Record<string, unknown>,\n> = {\n /** Unique id — duplicate ids throw at init. */\n id: Id;\n /**\n * Other plugin ids that must be registered. Validated when `dimahS3()`\n * runs — missing deps throw with a clear message.\n * Merge order remains plugins-array order (not topological).\n */\n dependsOn?: readonly string[];\n /**\n * Runs once after the context map is built and before hooks are merged.\n * Synchronous so `dimahS3()` stays a sync factory — validate options /\n * required feature flags here.\n */\n init?: (env: PluginInitEnv) => void;\n /** Lifecycle / guard hooks merged ahead of user config hooks. */\n hooks?: DimahS3PluginHooks;\n /**\n * Extra HTTP routes mounted under `plugins/{id}/{path}` on the shared\n * handler. Use {@link createEndpoint} to build entries.\n */\n endpoints?: Record<string, PluginEndpoint>;\n /** Opaque context keyed by `id` on the dimahS3 instance. */\n context?: TContext;\n};\n\nexport type AppliedPlugins<\n C extends Record<string, unknown> = Record<string, unknown>,\n> = {\n /** Config with plugin hooks chained ahead of user hooks. */\n config: DimahS3Config;\n /** Plugin contexts keyed by plugin id. */\n context: C;\n getPlugin: (id: string) => DimahS3Plugin | undefined;\n /** Plugin HTTP endpoints ready to mount on the handler. */\n endpoints: ResolvedPluginEndpoint[];\n};\n\n/** Map plugin ids → their `context` types. */\nexport type PluginContextMap<P extends readonly DimahS3Plugin[]> = {\n [K in P[number] as K[\"id\"]]: K extends DimahS3Plugin<string, infer Ctx>\n ? Ctx\n : never;\n};\n\n/** Keys reserved on the dimahS3 instance — plugins may not use these as ids. */\nexport const RESERVED_PLUGIN_IDS = [\n \"handler\",\n \"api\",\n \"context\",\n \"getPlugin\",\n] as const;\n\nexport type ReservedPluginId = (typeof RESERVED_PLUGIN_IDS)[number];\n","import { pluginEndpointPath, S3_API_ROUTES } from \"@dimah-s3/core\";\nimport { chainHooks } from \"./chain-hooks\";\nimport { FEATURE_HOOK_KEYS, type FeatureName } from \"./hook-registry\";\nimport type { DimahS3Config } from \"../types/config\";\nimport {\n RESERVED_PLUGIN_IDS,\n type AppliedPlugins,\n type DimahS3Plugin,\n type PluginContextMap,\n type ResolvedPluginEndpoint,\n} from \"./types\";\n\ntype HookFn = ((context: never) => Promise<void> | void) | undefined;\n\nfunction mergeHookField(\n pluginHooks: HookFn[],\n userHook: HookFn,\n): HookFn | undefined {\n const present = [...pluginHooks, userHook].filter(\n (h): h is NonNullable<HookFn> => h != null,\n );\n if (present.length === 0) return undefined;\n if (present.length === 1) return present[0];\n return chainHooks(...present) as HookFn;\n}\n\nfunction mergeFeatureHooks<F extends FeatureName>(\n feature: F,\n keys: readonly (typeof FEATURE_HOOK_KEYS)[F][number][],\n plugins: readonly DimahS3Plugin[],\n userFeature: DimahS3Config[F] | undefined,\n): DimahS3Config[F] | undefined {\n if (!userFeature && plugins.every((p) => !p.hooks?.[feature])) {\n return userFeature;\n }\n\n const merged: Record<string, unknown> = { ...userFeature };\n\n for (const key of keys) {\n const fromPlugins = plugins.map(\n (p) => (p.hooks?.[feature] as Record<string, HookFn> | undefined)?.[key],\n );\n const userHook = (userFeature as Record<string, HookFn> | undefined)?.[key];\n const next = mergeHookField(fromPlugins, userHook);\n if (next !== undefined) {\n merged[key] = next;\n }\n }\n\n return merged as DimahS3Config[F];\n}\n\n/**\n * Validate plugins, build context map, collect endpoints, run `init`,\n * and merge hooks into config.\n * Plugin hooks run in array order; user hooks run last.\n */\nexport function applyPlugins<\n const P extends readonly DimahS3Plugin[],\n C extends Record<string, unknown> = PluginContextMap<P>,\n>(config: DimahS3Config & { plugins?: P }): AppliedPlugins<C> {\n const plugins = config.plugins ?? [];\n const seen = new Set<string>();\n const byId = new Map<string, DimahS3Plugin>();\n const context = {} as C;\n const getPlugin = (id: string) => byId.get(id);\n\n for (const plugin of plugins) {\n if ((RESERVED_PLUGIN_IDS as readonly string[]).includes(plugin.id)) {\n throw new Error(\n `Plugin id \"${plugin.id}\" is reserved on the dimahS3 instance. Choose a different id.`,\n );\n }\n if (seen.has(plugin.id)) {\n throw new Error(\n `Duplicate dimah-s3 plugin id \"${plugin.id}\". Each plugin id must be unique.`,\n );\n }\n seen.add(plugin.id);\n byId.set(plugin.id, plugin);\n }\n\n for (const plugin of plugins) {\n for (const dep of plugin.dependsOn ?? []) {\n if (!seen.has(dep)) {\n throw new Error(\n `Plugin \"${plugin.id}\" depends on \"${dep}\", which is not registered.`,\n );\n }\n }\n }\n\n // Detect circular dependsOn chains (DFS).\n const visiting = new Set<string>();\n const visited = new Set<string>();\n function visit(id: string, stack: string[]) {\n if (visited.has(id)) return;\n if (visiting.has(id)) {\n throw new Error(\n `Circular plugin dependency detected: ${[...stack, id].join(\" -> \")}.`,\n );\n }\n visiting.add(id);\n const plugin = byId.get(id);\n for (const dep of plugin?.dependsOn ?? []) {\n visit(dep, [...stack, id]);\n }\n visiting.delete(id);\n visited.add(id);\n }\n for (const plugin of plugins) {\n visit(plugin.id, []);\n }\n\n for (const plugin of plugins) {\n if (plugin.context !== undefined) {\n (context as Record<string, unknown>)[plugin.id] = plugin.context;\n }\n }\n\n const reservedRoutePaths = new Set<string>(Object.values(S3_API_ROUTES));\n const seenEndpointKeys = new Set<string>();\n const endpoints: ResolvedPluginEndpoint[] = [];\n\n for (const plugin of plugins) {\n for (const [name, endpoint] of Object.entries(plugin.endpoints ?? {})) {\n const mounted = pluginEndpointPath(plugin.id, endpoint.path);\n if (reservedRoutePaths.has(mounted)) {\n throw new Error(\n `Plugin \"${plugin.id}\" endpoint \"${name}\" collides with a core route.`,\n );\n }\n const routeKey = `${endpoint.method} ${mounted}`;\n if (seenEndpointKeys.has(routeKey)) {\n throw new Error(`Duplicate plugin endpoint ${routeKey}.`);\n }\n seenEndpointKeys.add(routeKey);\n endpoints.push({ ...endpoint, pluginId: plugin.id });\n }\n }\n\n const { plugins: _omit, ...rest } = config;\n\n for (const plugin of plugins) {\n plugin.init?.({ config: rest, getPlugin });\n }\n\n const guard = mergeHookField(\n plugins.map((p) => p.hooks?.guard as HookFn),\n rest.guard as HookFn,\n ) as DimahS3Config[\"guard\"];\n\n const merged: DimahS3Config = {\n ...rest,\n ...(guard !== undefined ? { guard } : {}),\n };\n\n for (const feature of Object.keys(FEATURE_HOOK_KEYS) as FeatureName[]) {\n merged[feature] = mergeFeatureHooks(\n feature,\n FEATURE_HOOK_KEYS[feature],\n plugins,\n rest[feature],\n );\n }\n\n return {\n config: merged,\n context,\n getPlugin,\n endpoints,\n };\n}\n","import type { PluginEndpoint } from \"./types\";\n\n/**\n * Build a plugin HTTP endpoint for {@link DimahS3Plugin.endpoints}.\n *\n * Paths are relative under `plugins/{pluginId}/` — use the same relative\n * segment with {@link pluginEndpointPath} on the client.\n *\n * ```ts\n * endpoints: {\n * objects: createEndpoint(\"objects\", { method: \"GET\" }, async (ctx) => {\n * return { objects: [] };\n * }),\n * }\n * ```\n */\nexport function createEndpoint(\n path: string,\n options: { method: PluginEndpoint[\"method\"]; status?: number },\n handler: PluginEndpoint[\"handler\"],\n): PluginEndpoint {\n return {\n path,\n method: options.method,\n status: options.status,\n handler,\n };\n}\n","import type { DimahS3Plugin } from \"./types\";\n\n/**\n * Identity helper that preserves literal `id` and context types for\n * {@link dimahS3} inference (`s3.context[id]` / flattened `s3[id]`).\n *\n * ```ts\n * export function db(options: DbPluginOptions) {\n * return definePlugin({\n * id: \"db\",\n * hooks: { ... },\n * context: { objects, client },\n * });\n * }\n * ```\n */\nexport function definePlugin<\n Id extends string,\n TContext extends Record<string, unknown> = Record<string, unknown>,\n>(plugin: DimahS3Plugin<Id, TContext>): DimahS3Plugin<Id, TContext> {\n return plugin;\n}\n","import type { S3Api } from \"@dimah-s3/core\";\nimport { S3_API_BASE_PATH } from \"@dimah-s3/core\";\nimport { createServerApi } from \"./api\";\nimport { createHandler } from \"./handler\";\nimport {\n applyPlugins,\n type DimahS3Plugin,\n type PluginContextMap,\n} from \"./plugin\";\nimport type { DimahS3Config } from \"./types\";\n\nexport type DimahS3<\n C extends Record<string, unknown> = Record<string, unknown>,\n> = {\n /** Framework-agnostic HTTP handler (`Request` → `Response`). */\n handler: (request: Request) => Promise<Response>;\n /** Same `S3Api` as the browser client — call from Server Actions / RSC without HTTP. */\n api: S3Api;\n /** Plugin contexts keyed by plugin id. */\n context: C;\n /** Lookup a registered plugin by id. */\n getPlugin: (id: string) => DimahS3Plugin | undefined;\n} & C;\n\n/**\n * Create a dimah-s3 server instance.\n *\n * Plugin contexts are available on `s3.context[id]` and flattened onto the\n * instance itself (`s3.db` when the `db` plugin is registered, etc.).\n *\n * @example\n * ```ts\n * export const s3 = dimahS3({\n * s3: s3Client,\n * defaultBucket: \"my-bucket\",\n * upload: { enabled: true },\n * });\n *\n * export const { GET, POST, DELETE } = toNextJsHandler(s3);\n *\n * await s3.api.download(key, { headers: await headers() });\n * ```\n */\nexport function dimahS3<const P extends readonly DimahS3Plugin[] = []>(\n config: DimahS3Config & { plugins?: P },\n): DimahS3<PluginContextMap<P>> {\n const {\n config: resolved,\n context,\n getPlugin,\n endpoints,\n } = applyPlugins(config);\n const basePath = resolved.basePath ?? S3_API_BASE_PATH;\n\n return {\n handler: createHandler(resolved, basePath, endpoints),\n api: createServerApi(resolved),\n context,\n getPlugin,\n ...context,\n } as DimahS3<PluginContextMap<P>>;\n}\n"]}
@@ -0,0 +1,23 @@
1
+ export declare function parseBody<T extends Record<string, unknown>>(request: Request): Promise<T | null>;
2
+ /** Map uncaught procedure errors to a JSON {@link Response}. */
3
+ export declare function toErrorResponse(err: unknown): Response;
4
+ export declare function wrapHandler(handler: (request: Request) => Promise<Response>): (request: Request) => Promise<Response>;
5
+ /**
6
+ * Run a guard hook. {@link DimahS3Error} is preserved; plain Errors keep their
7
+ * English message without a library `code` so client `useFormatDimahError` does
8
+ * not replace them with a generic mapped string.
9
+ */
10
+ export declare function runHook<T extends {
11
+ request: Request;
12
+ }>(hook: ((context: T) => Promise<void> | void) | undefined, context: T): Promise<void>;
13
+ /**
14
+ * Run a lifecycle `on*` hook. Failures become {@link errors.internalError}
15
+ * (or preserve an existing {@link DimahS3Error}).
16
+ */
17
+ export declare function runLifecycleHook<T extends {
18
+ request: Request;
19
+ }>(hook: ((context: T) => Promise<void> | void) | undefined, context: T): Promise<void>;
20
+ export declare function normalizeExpiresIn(value: unknown): number;
21
+ /** Build a synthetic Request for server-side `api` calls. */
22
+ export declare function requestFromHeaders(headers?: HeadersInit): Request;
23
+ //# sourceMappingURL=internal-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-helpers.d.ts","sourceRoot":"","sources":["../src/internal-helpers.ts"],"names":[],"mappings":"AAGA,wBAAsB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/D,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAOnB;AAqBD,gEAAgE;AAChE,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,CAetD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,aACnD,OAAO,uBAO/B;AAED;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,CAAC,SAAS;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,EAC1D,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,SAAS,EACxD,OAAO,EAAE,CAAC,GACT,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,SAAS;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,EACnE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,SAAS,EACxD,OAAO,EAAE,CAAC,GACT,OAAO,CAAC,IAAI,CAAC,CASf;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGzD;AAED,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAEjE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=internal-helpers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-helpers.test.d.ts","sourceRoot":"","sources":["../src/internal-helpers.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import type { DimahS3Config } from "../types/config";
2
+ import { type AppliedPlugins, type DimahS3Plugin, type PluginContextMap } from "./types";
3
+ /**
4
+ * Validate plugins, build context map, collect endpoints, run `init`,
5
+ * and merge hooks into config.
6
+ * Plugin hooks run in array order; user hooks run last.
7
+ */
8
+ export declare function applyPlugins<const P extends readonly DimahS3Plugin[], C extends Record<string, unknown> = PluginContextMap<P>>(config: DimahS3Config & {
9
+ plugins?: P;
10
+ }): AppliedPlugins<C>;
11
+ //# sourceMappingURL=apply-plugins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-plugins.d.ts","sourceRoot":"","sources":["../../src/plugin/apply-plugins.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EAEtB,MAAM,SAAS,CAAC;AA0CjB;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,KAAK,CAAC,CAAC,SAAS,SAAS,aAAa,EAAE,EACxC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,EACvD,MAAM,EAAE,aAAa,GAAG;IAAE,OAAO,CAAC,EAAE,CAAC,CAAA;CAAE,GAAG,cAAc,CAAC,CAAC,CAAC,CAgH5D"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=apply-plugins.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-plugins.test.d.ts","sourceRoot":"","sources":["../../src/plugin/apply-plugins.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ type Hook<Context> = (context: Context) => Promise<void> | void;
2
+ /**
3
+ * Compose hooks into one that awaits each in order.
4
+ *
5
+ * Used by {@link dimahS3} when merging plugin + user hooks, and by consumers
6
+ * to stack extras (quota, audit) beside plugin hooks:
7
+ *
8
+ * ```ts
9
+ * upload: {
10
+ * presignGuard: chainHooks(myQuotaGuard, myAuditGuard),
11
+ * }
12
+ * ```
13
+ *
14
+ * `undefined` entries are skipped, so optional hooks compose cleanly.
15
+ */
16
+ export declare function chainHooks<Context>(...hooks: (Hook<Context> | undefined)[]): (context: Context) => Promise<void>;
17
+ export {};
18
+ //# sourceMappingURL=chain-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain-hooks.d.ts","sourceRoot":"","sources":["../../src/plugin/chain-hooks.ts"],"names":[],"mappings":"AAAA,KAAK,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEhE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAChC,GAAG,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,EAAE,GACtC,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAMrC"}
@@ -0,0 +1,20 @@
1
+ import type { PluginEndpoint } from "./types";
2
+ /**
3
+ * Build a plugin HTTP endpoint for {@link DimahS3Plugin.endpoints}.
4
+ *
5
+ * Paths are relative under `plugins/{pluginId}/` — use the same relative
6
+ * segment with {@link pluginEndpointPath} on the client.
7
+ *
8
+ * ```ts
9
+ * endpoints: {
10
+ * objects: createEndpoint("objects", { method: "GET" }, async (ctx) => {
11
+ * return { objects: [] };
12
+ * }),
13
+ * }
14
+ * ```
15
+ */
16
+ export declare function createEndpoint(path: string, options: {
17
+ method: PluginEndpoint["method"];
18
+ status?: number;
19
+ }, handler: PluginEndpoint["handler"]): PluginEndpoint;
20
+ //# sourceMappingURL=create-endpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-endpoint.d.ts","sourceRoot":"","sources":["../../src/plugin/create-endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAC9D,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,GACjC,cAAc,CAOhB"}
@@ -0,0 +1,17 @@
1
+ import type { DimahS3Plugin } from "./types";
2
+ /**
3
+ * Identity helper that preserves literal `id` and context types for
4
+ * {@link dimahS3} inference (`s3.context[id]` / flattened `s3[id]`).
5
+ *
6
+ * ```ts
7
+ * export function db(options: DbPluginOptions) {
8
+ * return definePlugin({
9
+ * id: "db",
10
+ * hooks: { ... },
11
+ * context: { objects, client },
12
+ * });
13
+ * }
14
+ * ```
15
+ */
16
+ export declare function definePlugin<Id extends string, TContext extends Record<string, unknown> = Record<string, unknown>>(plugin: DimahS3Plugin<Id, TContext>): DimahS3Plugin<Id, TContext>;
17
+ //# sourceMappingURL=define-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-plugin.d.ts","sourceRoot":"","sources":["../../src/plugin/define-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAC1B,EAAE,SAAS,MAAM,EACjB,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClE,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,GAAG,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,CAElE"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Single source of truth for which hook keys plugins may contribute per
3
+ * feature. {@link applyPlugins} merges these ahead of user config hooks.
4
+ */
5
+ export declare const FEATURE_HOOK_KEYS: {
6
+ readonly upload: readonly ["presignGuard", "onPresigned", "confirmGuard", "onConfirmed"];
7
+ readonly download: readonly ["presignGuard", "onPresigned"];
8
+ readonly delete: readonly ["guard", "onDeleted"];
9
+ readonly multipart: readonly ["initGuard", "partGuard", "completeGuard", "abortGuard", "listGuard", "onInit", "onComplete", "onAbort", "onList"];
10
+ };
11
+ export type FeatureName = keyof typeof FEATURE_HOOK_KEYS;
12
+ //# sourceMappingURL=hook-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-registry.d.ts","sourceRoot":"","sources":["../../src/plugin/hook-registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,iBAAiB;aAC5B,MAAM,YAAG,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa;aACrE,QAAQ,YAAG,cAAc,EAAE,aAAa;aACxC,MAAM,YAAG,OAAO,EAAE,WAAW;aAC7B,SAAS,YACP,WAAW,EACX,WAAW,EACX,eAAe,EACf,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,QAAQ;CAEF,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,iBAAiB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { applyPlugins } from "./apply-plugins";
2
+ export { chainHooks } from "./chain-hooks";
3
+ export { createEndpoint } from "./create-endpoint";
4
+ export { definePlugin } from "./define-plugin";
5
+ export { FEATURE_HOOK_KEYS } from "./hook-registry";
6
+ export type { FeatureName } from "./hook-registry";
7
+ export { RESERVED_PLUGIN_IDS, type AppliedPlugins, type DimahS3Plugin, type DimahS3PluginHooks, type PluginContextMap, type PluginEndpoint, type PluginEndpointContext, type PluginInitEnv, type ReservedPluginId, type ResolvedPluginEndpoint, } from "./types";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EACL,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,GAC5B,MAAM,SAAS,CAAC"}
@@ -0,0 +1,101 @@
1
+ import type { ServerErrors } from "../errors";
2
+ import type { DeleteConfig, DownloadConfig, MultipartConfig, UploadConfig, DimahS3Config } from "../types/config";
3
+ export type { ServerErrors };
4
+ /**
5
+ * Hook fields a plugin may contribute. Scalars like `enabled` / `method`
6
+ * stay user-owned on {@link DimahS3Config}.
7
+ */
8
+ export type DimahS3PluginHooks = {
9
+ guard?: DimahS3Config["guard"];
10
+ upload?: Pick<UploadConfig, "presignGuard" | "onPresigned" | "confirmGuard" | "onConfirmed">;
11
+ download?: Pick<DownloadConfig, "presignGuard" | "onPresigned">;
12
+ delete?: Pick<DeleteConfig, "guard" | "onDeleted">;
13
+ multipart?: Pick<MultipartConfig, "initGuard" | "partGuard" | "completeGuard" | "abortGuard" | "listGuard" | "onInit" | "onComplete" | "onAbort" | "onList">;
14
+ };
15
+ /**
16
+ * Context passed to a plugin endpoint handler.
17
+ * Global `config.guard` already ran before this is invoked.
18
+ */
19
+ export type PluginEndpointContext = {
20
+ request: Request;
21
+ url: URL;
22
+ config: Readonly<DimahS3Config>;
23
+ /** English error factories with stable `code` for client localization. */
24
+ errors: ServerErrors;
25
+ /** Parse the request JSON body (returns `null` when missing/invalid). */
26
+ json: <T extends Record<string, unknown>>() => Promise<T | null>;
27
+ };
28
+ /** HTTP endpoint contributed by a server plugin. */
29
+ export type PluginEndpoint = {
30
+ /** Relative path under `plugins/{id}/` (e.g. `"objects"` → `plugins/db/objects`). */
31
+ path: string;
32
+ method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
33
+ /** Optional HTTP status for successful JSON responses. */
34
+ status?: number;
35
+ handler: (ctx: PluginEndpointContext) => Promise<unknown>;
36
+ };
37
+ /** Endpoint after plugin id is attached for mounting. */
38
+ export type ResolvedPluginEndpoint = PluginEndpoint & {
39
+ pluginId: string;
40
+ };
41
+ /**
42
+ * Environment passed to {@link DimahS3Plugin.init}.
43
+ * Config is pre-merge (user config only) — use for feature-flag checks.
44
+ */
45
+ export type PluginInitEnv = {
46
+ /** User config before plugin hooks are merged — read-only. */
47
+ config: Readonly<DimahS3Config>;
48
+ /** Lookup another registered plugin by id. */
49
+ getPlugin: (id: string) => DimahS3Plugin | undefined;
50
+ };
51
+ /**
52
+ * Server plugin contract. Feature packages (e.g. `@dimah-s3/db`) return
53
+ * these from factories like `db()` / `definePlugin()`.
54
+ *
55
+ * @typeParam Id — unique plugin id; becomes the key on `s3.context` and the
56
+ * flattened instance (`s3[id]`).
57
+ * @typeParam TContext — exposed on `s3.context[id]` and `s3[id]` after
58
+ * `dimahS3()`.
59
+ */
60
+ export type DimahS3Plugin<Id extends string = string, TContext extends Record<string, unknown> = Record<string, unknown>> = {
61
+ /** Unique id — duplicate ids throw at init. */
62
+ id: Id;
63
+ /**
64
+ * Other plugin ids that must be registered. Validated when `dimahS3()`
65
+ * runs — missing deps throw with a clear message.
66
+ * Merge order remains plugins-array order (not topological).
67
+ */
68
+ dependsOn?: readonly string[];
69
+ /**
70
+ * Runs once after the context map is built and before hooks are merged.
71
+ * Synchronous so `dimahS3()` stays a sync factory — validate options /
72
+ * required feature flags here.
73
+ */
74
+ init?: (env: PluginInitEnv) => void;
75
+ /** Lifecycle / guard hooks merged ahead of user config hooks. */
76
+ hooks?: DimahS3PluginHooks;
77
+ /**
78
+ * Extra HTTP routes mounted under `plugins/{id}/{path}` on the shared
79
+ * handler. Use {@link createEndpoint} to build entries.
80
+ */
81
+ endpoints?: Record<string, PluginEndpoint>;
82
+ /** Opaque context keyed by `id` on the dimahS3 instance. */
83
+ context?: TContext;
84
+ };
85
+ export type AppliedPlugins<C extends Record<string, unknown> = Record<string, unknown>> = {
86
+ /** Config with plugin hooks chained ahead of user hooks. */
87
+ config: DimahS3Config;
88
+ /** Plugin contexts keyed by plugin id. */
89
+ context: C;
90
+ getPlugin: (id: string) => DimahS3Plugin | undefined;
91
+ /** Plugin HTTP endpoints ready to mount on the handler. */
92
+ endpoints: ResolvedPluginEndpoint[];
93
+ };
94
+ /** Map plugin ids → their `context` types. */
95
+ export type PluginContextMap<P extends readonly DimahS3Plugin[]> = {
96
+ [K in P[number] as K["id"]]: K extends DimahS3Plugin<string, infer Ctx> ? Ctx : never;
97
+ };
98
+ /** Keys reserved on the dimahS3 instance — plugins may not use these as ids. */
99
+ export declare const RESERVED_PLUGIN_IDS: readonly ["handler", "api", "context", "getPlugin"];
100
+ export type ReservedPluginId = (typeof RESERVED_PLUGIN_IDS)[number];
101
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/plugin/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,eAAe,EACf,YAAY,EACZ,aAAa,EACd,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EAAE,YAAY,EAAE,CAAC;AAE7B;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,IAAI,CACX,YAAY,EACZ,cAAc,GAAG,aAAa,GAAG,cAAc,GAAG,aAAa,CAChE,CAAC;IACF,QAAQ,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,cAAc,GAAG,aAAa,CAAC,CAAC;IAChE,MAAM,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC;IACnD,SAAS,CAAC,EAAE,IAAI,CACd,eAAe,EACb,WAAW,GACX,WAAW,GACX,eAAe,GACf,YAAY,GACZ,WAAW,GACX,QAAQ,GACR,YAAY,GACZ,SAAS,GACT,QAAQ,CACX,CAAC;CACH,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IAChC,0EAA0E;IAC1E,MAAM,EAAE,YAAY,CAAC;IACrB,yEAAyE;IACzE,IAAI,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;CAClE,CAAC;AAEF,oDAAoD;AACpD,MAAM,MAAM,cAAc,GAAG;IAC3B,qFAAqF;IACrF,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpD,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,CAAC,GAAG,EAAE,qBAAqB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3D,CAAC;AAEF,yDAAyD;AACzD,MAAM,MAAM,sBAAsB,GAAG,cAAc,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3E;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,8DAA8D;IAC9D,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IAChC,8CAA8C;IAC9C,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,CAAC;CACtD,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,CACvB,EAAE,SAAS,MAAM,GAAG,MAAM,EAC1B,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAChE;IACF,+CAA+C;IAC/C,EAAE,EAAE,EAAE,CAAC;IACP;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B;;;;OAIG;IACH,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;IACpC,iEAAiE;IACjE,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC3C,4DAA4D;IAC5D,OAAO,CAAC,EAAE,QAAQ,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,cAAc,CACxB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IACzD;IACF,4DAA4D;IAC5D,MAAM,EAAE,aAAa,CAAC;IACtB,0CAA0C;IAC1C,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,CAAC;IACrD,2DAA2D;IAC3D,SAAS,EAAE,sBAAsB,EAAE,CAAC;CACrC,CAAC;AAEF,8CAA8C;AAC9C,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,SAAS,aAAa,EAAE,IAAI;KAChE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,GACnE,GAAG,GACH,KAAK;CACV,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,mBAAmB,YAC9B,SAAS,EACT,KAAK,EACL,SAAS,EACT,WAAW,CACH,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { UploadConfirmResponse } from "@dimah-s3/core";
2
+ import type { DimahS3Config } from "../types";
3
+ export type ConfirmInput = {
4
+ key: string;
5
+ bucket?: string;
6
+ };
7
+ export declare function confirm(config: DimahS3Config, input: ConfirmInput, request: Request): Promise<UploadConfirmResponse>;
8
+ //# sourceMappingURL=confirm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm.d.ts","sourceRoot":"","sources":["../../src/procedures/confirm.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAK5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAsB,OAAO,CAC3B,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,qBAAqB,CAAC,CA+ChC"}
@@ -0,0 +1,8 @@
1
+ import type { DeleteResponse } from "@dimah-s3/core";
2
+ import type { DimahS3Config } from "../types";
3
+ export type DeleteInput = {
4
+ key: string;
5
+ bucket?: string;
6
+ };
7
+ export declare function deleteObject(config: DimahS3Config, input: DeleteInput, request: Request): Promise<DeleteResponse>;
8
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/procedures/delete.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAsB,YAAY,CAChC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,cAAc,CAAC,CA4BzB"}
@@ -0,0 +1,10 @@
1
+ import type { PresignResponse } from "@dimah-s3/core";
2
+ import type { DimahS3Config } from "../types";
3
+ export type DownloadInput = {
4
+ key: string;
5
+ bucket?: string;
6
+ fileName?: string;
7
+ expiresIn?: number;
8
+ };
9
+ export declare function download(config: DimahS3Config, input: DownloadInput, request: Request): Promise<PresignResponse>;
10
+ //# sourceMappingURL=download.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/procedures/download.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAStD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,eAAe,CAAC,CAgD1B"}
@@ -0,0 +1,13 @@
1
+ import type { MultipartAbortResponse } from "@dimah-s3/core";
2
+ import type { DimahS3Config } from "../../types";
3
+ export type MultipartAbortInput = {
4
+ key: string;
5
+ uploadId: string;
6
+ bucket?: string;
7
+ };
8
+ export declare function multipartAbort(config: DimahS3Config, input: MultipartAbortInput, request: Request): Promise<MultipartAbortResponse & {
9
+ bucket: string;
10
+ key: string;
11
+ uploadId: string;
12
+ }>;
13
+ //# sourceMappingURL=abort.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abort.d.ts","sourceRoot":"","sources":["../../../src/procedures/multipart/abort.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAG7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,mBAAmB,GAAG;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAsB,cAAc,CAClC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,mBAAmB,EAC1B,OAAO,EAAE,OAAO,GACf,OAAO,CACR,sBAAsB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAC3E,CA4BA"}
@@ -0,0 +1,12 @@
1
+ import type { MultipartCompleteResponse } from "@dimah-s3/core";
2
+ import type { DimahS3Config } from "../../types";
3
+ export type MultipartCompleteInput = {
4
+ key: string;
5
+ uploadId: string;
6
+ bucket?: string;
7
+ parts: {
8
+ partNumber: number;
9
+ }[];
10
+ };
11
+ export declare function multipartComplete(config: DimahS3Config, input: MultipartCompleteInput, request: Request): Promise<MultipartCompleteResponse>;
12
+ //# sourceMappingURL=complete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complete.d.ts","sourceRoot":"","sources":["../../../src/procedures/multipart/complete.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAKhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,sBAAsB,GAAG;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACjC,CAAC;AAEF,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,sBAAsB,EAC7B,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,yBAAyB,CAAC,CA4FpC"}
@@ -0,0 +1,13 @@
1
+ import type { MultipartInitResponse } from "@dimah-s3/core";
2
+ import type { DimahS3Config } from "../../types";
3
+ export type MultipartInitInput = {
4
+ key: string;
5
+ bucket?: string;
6
+ contentType?: string;
7
+ fileSize?: number;
8
+ metadata?: Record<string, string>;
9
+ acl?: "private" | "public-read";
10
+ fileName?: string;
11
+ };
12
+ export declare function multipartInit(config: DimahS3Config, input: MultipartInitInput, request: Request): Promise<MultipartInitResponse>;
13
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/procedures/multipart/init.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAI5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,GAAG,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAsB,aAAa,CACjC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,qBAAqB,CAAC,CA8ChC"}
@@ -0,0 +1,9 @@
1
+ import type { MultipartListPartsResponse } from "@dimah-s3/core";
2
+ import type { DimahS3Config } from "../../types";
3
+ export type MultipartListPartsInput = {
4
+ key: string;
5
+ uploadId: string;
6
+ bucket?: string;
7
+ };
8
+ export declare function multipartListParts(config: DimahS3Config, input: MultipartListPartsInput, request: Request): Promise<MultipartListPartsResponse>;
9
+ //# sourceMappingURL=list-parts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-parts.d.ts","sourceRoot":"","sources":["../../../src/procedures/multipart/list-parts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAGjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,uBAAuB,EAC9B,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,0BAA0B,CAAC,CA4CrC"}