@dimah-s3/server 0.8.6 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/express.js +13 -1
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/fastify.js +13 -1
- package/dist/adapters/fastify.js.map +1 -1
- package/dist/adapters/node.js +13 -1
- package/dist/adapters/node.js.map +1 -1
- package/dist/adapters/svelte-kit.d.ts +2 -0
- package/dist/adapters/svelte-kit.d.ts.map +1 -1
- package/dist/adapters/svelte-kit.js.map +1 -1
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/api/assert-feature-enabled.d.ts.map +1 -1
- package/dist/api/bind-endpoints.d.ts.map +1 -1
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/index.d.ts +2 -2
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +218 -147
- package/dist/api/index.js.map +1 -1
- package/dist/{router.d.ts → api/router.d.ts} +3 -2
- package/dist/api/router.d.ts.map +1 -0
- package/dist/api/routes/confirm.d.ts.map +1 -1
- package/dist/api/routes/delete.d.ts.map +1 -1
- package/dist/api/routes/download.d.ts.map +1 -1
- package/dist/api/routes/index.d.ts +1 -7
- package/dist/api/routes/index.d.ts.map +1 -1
- package/dist/api/routes/multipart/abort.d.ts +1 -5
- package/dist/api/routes/multipart/abort.d.ts.map +1 -1
- package/dist/api/routes/multipart/complete.d.ts.map +1 -1
- package/dist/api/routes/multipart/init.d.ts +0 -2
- package/dist/api/routes/multipart/init.d.ts.map +1 -1
- package/dist/api/routes/multipart/list-parts.d.ts.map +1 -1
- package/dist/api/routes/multipart/part.d.ts.map +1 -1
- package/dist/api/routes/upload.d.ts.map +1 -1
- package/dist/errors.d.ts +4 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/helpers/expires.d.ts +6 -0
- package/dist/helpers/expires.d.ts.map +1 -0
- package/dist/helpers/features.d.ts +34 -0
- package/dist/helpers/features.d.ts.map +1 -0
- package/dist/helpers/head-object.d.ts +11 -0
- package/dist/helpers/head-object.d.ts.map +1 -0
- package/dist/{internal-helpers.d.ts → helpers/hooks.d.ts} +1 -4
- package/dist/helpers/hooks.d.ts.map +1 -0
- package/dist/helpers/index.d.ts +12 -1
- package/dist/helpers/index.d.ts.map +1 -1
- package/dist/helpers/is-aws-not-found.d.ts +3 -1
- package/dist/helpers/is-aws-not-found.d.ts.map +1 -1
- package/dist/helpers/list-parts.d.ts +8 -0
- package/dist/helpers/list-parts.d.ts.map +1 -0
- package/dist/helpers/request.d.ts +3 -0
- package/dist/helpers/request.d.ts.map +1 -0
- package/dist/helpers/resolve-request-acl.d.ts +10 -0
- package/dist/helpers/resolve-request-acl.d.ts.map +1 -0
- package/dist/helpers/resolve-target.d.ts +2 -33
- package/dist/helpers/resolve-target.d.ts.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +188 -111
- package/dist/index.js.map +1 -1
- package/dist/plugin/apply-plugins.d.ts.map +1 -1
- package/dist/plugin/types.d.ts +5 -5
- package/dist/plugin/types.d.ts.map +1 -1
- package/dist/plugins.js +184 -104
- package/dist/plugins.js.map +1 -1
- package/dist/types/config.d.ts +27 -9
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/hook-contexts.d.ts +8 -8
- package/dist/types/hook-contexts.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +8 -8
- package/dist/internal-helpers.d.ts.map +0 -1
- package/dist/router.d.ts.map +0 -1
package/dist/plugins.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/helpers/is-aws-not-found.ts","../src/helpers/resolve-object-acl.ts","../src/errors.ts","../src/internal-helpers.ts","../src/helpers/resolve-target.ts","../src/api/assert-feature-enabled.ts","../src/api/create-s3-middleware.ts","../src/api/create-s3-endpoint.ts","../src/api/routes/confirm.ts","../src/api/routes/delete.ts","../src/api/routes/download.ts","../src/api/routes/multipart/abort.ts","../src/api/routes/multipart/complete.ts","../src/api/routes/multipart/init.ts","../src/api/routes/multipart/list-parts.ts","../src/api/routes/multipart/part.ts","../src/api/routes/upload.ts","../src/api/routes/index.ts","../src/plugin/chain-hooks.ts","../src/plugin/hook-registry.ts","../src/plugin/types.ts","../src/plugin/apply-plugins.ts","../src/plugin/define-plugin.ts"],"names":["isAPIError","DimahS3Error","HeadObjectCommand","S3_API_ROUTES","parseFileName","buildContentDisposition","ListPartsCommand","getSignedUrl","url"],"mappings":"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","file":"plugins.js","sourcesContent":["/** 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 {\n DimahS3Error,\n S3_ERROR_CODES,\n isAPIError,\n isDimahS3Error,\n isS3ErrorCode,\n} from \"@dimah-s3/core\";\n\nexport { DimahS3Error, isAPIError, isDimahS3Error, isS3ErrorCode };\n\n/** English API errors with stable codes for client-side localization. */\nexport const errors = {\n notFound: () => DimahS3Error.from(\"NOT_FOUND\", S3_ERROR_CODES.NOT_FOUND),\n\n unauthorized: () =>\n DimahS3Error.from(\"UNAUTHORIZED\", S3_ERROR_CODES.UNAUTHORIZED),\n\n forbidden: () => DimahS3Error.from(\"FORBIDDEN\", S3_ERROR_CODES.FORBIDDEN),\n\n conflict: () => DimahS3Error.from(\"CONFLICT\", S3_ERROR_CODES.CONFLICT),\n\n internalError: () =>\n DimahS3Error.from(\"INTERNAL_SERVER_ERROR\", S3_ERROR_CODES.INTERNAL_ERROR),\n\n objectNotFound: () =>\n DimahS3Error.from(\"NOT_FOUND\", S3_ERROR_CODES.OBJECT_NOT_FOUND),\n\n featureDisabled: (feature: string) =>\n DimahS3Error.from(\"NOT_FOUND\", {\n code: S3_ERROR_CODES.FEATURE_DISABLED.code,\n message: S3_ERROR_CODES.FEATURE_DISABLED.message.replaceAll(\n \"{feature}\",\n feature,\n ),\n params: { feature },\n }),\n\n invalidKey: () =>\n DimahS3Error.from(\"BAD_REQUEST\", S3_ERROR_CODES.INVALID_KEY),\n\n invalidBucket: (bucket: string) =>\n DimahS3Error.from(\"FORBIDDEN\", {\n code: S3_ERROR_CODES.INVALID_BUCKET.code,\n message: S3_ERROR_CODES.INVALID_BUCKET.message,\n params: { bucket },\n }),\n\n s3NetworkError: (code: string) =>\n DimahS3Error.from(\"BAD_GATEWAY\", {\n code: S3_ERROR_CODES.S3_NETWORK_ERROR.code,\n message: S3_ERROR_CODES.S3_NETWORK_ERROR.message.replaceAll(\n \"{code}\",\n code,\n ),\n params: { code },\n }),\n\n fileSizeRequiredUpload: () =>\n DimahS3Error.from(\"BAD_REQUEST\", S3_ERROR_CODES.FILE_SIZE_REQUIRED_UPLOAD),\n\n fileSizeRequiredMultipart: () =>\n DimahS3Error.from(\n \"BAD_REQUEST\",\n S3_ERROR_CODES.FILE_SIZE_REQUIRED_MULTIPART,\n ),\n\n validationError: (message: string) =>\n DimahS3Error.from(\"BAD_REQUEST\", {\n code: S3_ERROR_CODES.VALIDATION_ERROR.code,\n message,\n }),\n} as const;\n\nexport type ServerErrors = typeof errors;\n","import { DimahS3Error, isAPIError } from \"@dimah-s3/core\";\nimport { errors } from \"./errors\";\n\n/**\n * Run a guard hook. {@link isAPIError} values are preserved; plain Errors keep\n * their English message without a library `code` so client\n * `useFormatDimahError` does 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 (isAPIError(err)) throw err;\n if (err instanceof Error && err.message.trim()) {\n throw new DimahS3Error(\"FORBIDDEN\", {\n message: err.message,\n cause: err,\n });\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 APIError).\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 (isAPIError(err)) 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","import { errors } from \"../errors\";\nimport type {\n DownloadConfig,\n DeleteConfig,\n FeatureToggle,\n KeyPrefix,\n MultipartConfig,\n ResolvedDimahS3Config,\n ResolveKeyContext,\n UploadConfig,\n} from \"../types\";\n\ntype KeyPolicy = {\n prefix?: KeyPrefix;\n resolveKey?: (context: ResolveKeyContext) => string | Promise<string>;\n};\n\n/**\n * Normalize a client-proposed object key: strip leading slashes, reject\n * `.` / `..` segments, NUL, and backslashes.\n */\nexport function assertSafeObjectKey(key: string): string {\n const trimmed = key.replace(/^\\/+/u, \"\").replace(/\\/+$/u, \"\");\n if (!trimmed) {\n throw errors.invalidKey();\n }\n if (trimmed.includes(\"\\\\\") || trimmed.includes(\"\\0\")) {\n throw errors.invalidKey();\n }\n const parts = trimmed.split(\"/\");\n if (parts.some((part) => part === \"\" || part === \".\" || part === \"..\")) {\n throw errors.invalidKey();\n }\n return parts.join(\"/\");\n}\n\nfunction applyPrefix(prefix: string, key: string): string {\n const p = assertSafeObjectKey(prefix);\n const k = assertSafeObjectKey(key);\n if (k === p || k.startsWith(`${p}/`)) return k;\n return `${p}/${k}`;\n}\n\nexport async function resolveObjectKey(\n policy: KeyPolicy | undefined,\n context: ResolveKeyContext,\n): Promise<string> {\n if (policy?.resolveKey) {\n return assertSafeObjectKey(await policy.resolveKey(context));\n }\n const prefix =\n typeof policy?.prefix === \"function\"\n ? await policy.prefix(context)\n : policy?.prefix;\n if (prefix) {\n return applyPrefix(prefix, context.proposedKey);\n }\n return assertSafeObjectKey(context.proposedKey);\n}\n\nexport function resolveBucket(\n config: ResolvedDimahS3Config,\n requested?: string,\n): string {\n if (!requested) return config.bucket;\n if (config.allowClientBucket) return requested;\n if (config.buckets?.length) {\n if (config.buckets.includes(requested)) return requested;\n throw errors.invalidBucket(requested);\n }\n return config.bucket;\n}\n\nexport async function resolveRequestTarget(\n config: ResolvedDimahS3Config,\n policy: KeyPolicy | undefined,\n input: {\n request: Request;\n key: string;\n bucket?: string;\n fileName?: string;\n contentType?: string;\n },\n): Promise<{ key: string; bucket: string }> {\n const bucket = resolveBucket(config, input.bucket);\n const key = await resolveObjectKey(policy, {\n request: input.request,\n proposedKey: input.key,\n fileName: input.fileName,\n contentType: input.contentType,\n bucket,\n });\n return { key, bucket };\n}\n\nexport function normalizeFeature<T extends { enabled?: boolean }>(\n value: FeatureToggle<T> | undefined,\n): (T & { enabled: boolean }) | undefined {\n if (value === undefined) return undefined;\n if (value === false) return { enabled: false } as T & { enabled: boolean };\n if (value === true) return { enabled: true } as T & { enabled: boolean };\n return { ...value, enabled: value.enabled ?? true };\n}\n\nexport function isFeatureEnabled(\n config: ResolvedDimahS3Config,\n feature: \"upload\" | \"download\" | \"delete\" | \"multipart\",\n): boolean {\n return config[feature]?.enabled === true;\n}\n\nexport function applyMultipartDefault(\n config: ResolvedDimahS3Config,\n multipartInput: FeatureToggle<MultipartConfig> | undefined,\n): ResolvedDimahS3Config {\n let next = config;\n if (multipartInput === undefined && config.upload?.enabled) {\n next = {\n ...config,\n multipart: { ...config.multipart, enabled: true },\n };\n }\n if (next.multipart && next.upload) {\n next = {\n ...next,\n multipart: {\n ...next.multipart,\n prefix: next.multipart.prefix ?? next.upload.prefix,\n resolveKey: next.multipart.resolveKey ?? next.upload.resolveKey,\n },\n };\n }\n return next;\n}\n\nexport type NormalizedFeatures = {\n upload?: UploadConfig & { enabled: boolean };\n download?: DownloadConfig & { enabled: boolean };\n delete?: DeleteConfig & { enabled: boolean };\n multipart?: MultipartConfig & { enabled: boolean };\n};\n\nexport function normalizeFeatures(config: {\n upload?: FeatureToggle<UploadConfig>;\n download?: FeatureToggle<DownloadConfig>;\n delete?: FeatureToggle<DeleteConfig>;\n multipart?: FeatureToggle<MultipartConfig>;\n}): NormalizedFeatures {\n return {\n upload: normalizeFeature(config.upload),\n download: normalizeFeature(config.download),\n delete: normalizeFeature(config.delete),\n multipart: normalizeFeature(config.multipart),\n };\n}\n","import { errors } from \"../errors\";\nimport { isFeatureEnabled } from \"../helpers/resolve-target\";\nimport type { ResolvedDimahS3Config } from \"../types\";\n\nexport type FeatureFlag = \"upload\" | \"download\" | \"delete\" | \"multipart\";\n\n/** Disabled features respond 404 (`FEATURE_DISABLED`) from both HTTP and `s3.api`. */\nexport function assertFeatureEnabled(\n config: ResolvedDimahS3Config,\n feature: FeatureFlag,\n): void {\n if (!isFeatureEnabled(config, feature)) {\n throw errors.featureDisabled(feature);\n }\n}\n","import { createMiddleware } from \"better-call\";\nimport { requestFromHeaders, runHook } from \"../internal-helpers\";\nimport type { S3EndpointContext } from \"./context\";\n\n/**\n * Injects `config` / `request` and runs the global `guard`.\n * Used by {@link createS3Endpoint} so HTTP and `s3.api` share the same path.\n */\nexport const s3ContextMiddleware = createMiddleware(async (ctx) => {\n const injected = ctx.context as Partial<S3EndpointContext> | undefined;\n if (!injected?.config) {\n throw new Error(\n \"createS3Endpoint requires dimahS3 router context. Call endpoints through dimahS3().api or the HTTP handler.\",\n );\n }\n\n const request =\n ctx.request ??\n injected.request ??\n requestFromHeaders(ctx.headers as HeadersInit | undefined);\n\n await runHook(injected.config.guard, { request });\n\n return {\n config: injected.config,\n request,\n } satisfies S3EndpointContext;\n});\n\n/**\n * Middleware factory with dimah-s3 context already applied — same idea as\n * Better Auth `createAuthMiddleware`.\n */\nexport const createS3Middleware = createMiddleware.create({\n use: [s3ContextMiddleware],\n});\n","import { createEndpoint, type EndpointOptions } from \"better-call\";\nimport { errors } from \"../errors\";\nimport { s3ContextMiddleware } from \"./create-s3-middleware\";\n\nconst createEndpointWithContext = createEndpoint.create({\n use: [s3ContextMiddleware],\n});\n\nfunction withS3Validation<O extends EndpointOptions>(options: O): O {\n return {\n ...options,\n onValidationError:\n options.onValidationError ??\n (({ message }: { message: string }) => {\n throw errors.validationError(message);\n }),\n };\n}\n\ntype CreateS3Endpoint = typeof createEndpointWithContext;\n\n/**\n * Typed endpoint for dimah-s3 plugins and core routes.\n *\n * Paths are absolute under `basePath` (e.g. `/db/objects`). Context\n * (`config`, `request`) is injected by the router / `s3.api`.\n * Zod failures throw `DimahS3Error` (`VALIDATION_ERROR`) via\n * better-call `onValidationError`.\n *\n * ```ts\n * endpoints: {\n * recent: createS3Endpoint(\"/audit/recent\", { method: \"GET\" }, async (ctx) => {\n * return { events: [] };\n * }),\n * }\n * ```\n */\nexport const createS3Endpoint: CreateS3Endpoint = ((\n pathOrOptions: string | EndpointOptions,\n optionsOrHandler: EndpointOptions | ((...args: never[]) => unknown),\n maybeHandler?: (...args: never[]) => unknown,\n) => {\n if (typeof pathOrOptions === \"string\") {\n return createEndpointWithContext(\n pathOrOptions,\n withS3Validation(optionsOrHandler as EndpointOptions),\n maybeHandler as never,\n );\n }\n return createEndpointWithContext(\n withS3Validation(pathOrOptions),\n optionsOrHandler as never,\n );\n}) as unknown as CreateS3Endpoint;\n","import { HeadObjectCommand } from \"@aws-sdk/client-s3\";\nimport {\n confirmBodySchema,\n parseFileName,\n S3_API_ROUTES,\n type UploadConfirmResponse,\n} from \"@dimah-s3/core\";\nimport { resolveObjectAcl } from \"../../helpers\";\nimport { runHook, runLifecycleHook } from \"../../internal-helpers\";\nimport type { ResolvedDimahS3Config } from \"../../types\";\nimport { resolveRequestTarget } from \"../../helpers/resolve-target\";\nimport { assertFeatureEnabled } from \"../assert-feature-enabled\";\nimport { createS3Endpoint } from \"../create-s3-endpoint\";\n\nasync function handleConfirm(\n config: ResolvedDimahS3Config,\n input: typeof confirmBodySchema._output,\n request: Request,\n): Promise<UploadConfirmResponse> {\n const { key, bucket } = await resolveRequestTarget(config, config.upload, {\n request,\n key: input.key,\n bucket: input.bucket,\n });\n\n await runHook(config.upload?.confirmGuard, {\n request,\n key,\n bucket,\n });\n\n const head = await config.client.send(\n new HeadObjectCommand({ Bucket: bucket, Key: key }),\n );\n\n const acl = config.resolveObjectAcl\n ? await resolveObjectAcl(config.client, 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\nexport const confirm = createS3Endpoint(\n S3_API_ROUTES.uploadConfirm,\n { method: \"POST\", body: confirmBodySchema },\n async (ctx) => {\n assertFeatureEnabled(ctx.context.config, \"upload\");\n return handleConfirm(ctx.context.config, ctx.body, ctx.context.request);\n },\n);\n","import { DeleteObjectCommand, HeadObjectCommand } from \"@aws-sdk/client-s3\";\nimport {\n deleteQuerySchema,\n S3_API_ROUTES,\n type DeleteResponse,\n} from \"@dimah-s3/core\";\nimport { errors } from \"../../errors\";\nimport { isAwsNotFound } from \"../../helpers\";\nimport { runHook, runLifecycleHook } from \"../../internal-helpers\";\nimport type { ResolvedDimahS3Config } from \"../../types\";\nimport { resolveRequestTarget } from \"../../helpers/resolve-target\";\nimport { assertFeatureEnabled } from \"../assert-feature-enabled\";\nimport { createS3Endpoint } from \"../create-s3-endpoint\";\n\nasync function handleDelete(\n config: ResolvedDimahS3Config,\n input: typeof deleteQuerySchema._output,\n request: Request,\n): Promise<DeleteResponse> {\n const { key, bucket } = await resolveRequestTarget(config, config.delete, {\n request,\n key: input.key,\n bucket: input.bucket,\n });\n\n await runHook(config.delete?.guard, {\n request,\n key,\n bucket,\n });\n\n try {\n await config.client.send(\n new HeadObjectCommand({ Bucket: bucket, Key: key }),\n );\n } catch (err: unknown) {\n if (isAwsNotFound(err)) {\n throw errors.objectNotFound();\n }\n throw err;\n }\n\n await config.client.send(\n new DeleteObjectCommand({ Bucket: bucket, Key: key }),\n );\n\n await runLifecycleHook(config.delete?.onDeleted, { request, key, bucket });\n\n return { success: true, bucket, key };\n}\n\nexport const deleteObject = createS3Endpoint(\n S3_API_ROUTES.delete,\n { method: \"DELETE\", query: deleteQuerySchema },\n async (ctx) => {\n assertFeatureEnabled(ctx.context.config, \"delete\");\n return handleDelete(ctx.context.config, ctx.query, ctx.context.request);\n },\n);\n","import { GetObjectCommand, HeadObjectCommand } from \"@aws-sdk/client-s3\";\nimport { getSignedUrl } from \"@aws-sdk/s3-request-presigner\";\nimport {\n buildContentDisposition,\n downloadQuerySchema,\n S3_API_ROUTES,\n type PresignResponse,\n} 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 { ResolvedDimahS3Config } from \"../../types\";\nimport { resolveRequestTarget } from \"../../helpers/resolve-target\";\nimport { assertFeatureEnabled } from \"../assert-feature-enabled\";\nimport { createS3Endpoint } from \"../create-s3-endpoint\";\n\nasync function handleDownload(\n config: ResolvedDimahS3Config,\n input: typeof downloadQuerySchema._output,\n request: Request,\n): Promise<PresignResponse> {\n const { key, bucket } = await resolveRequestTarget(config, config.download, {\n request,\n key: input.key,\n bucket: input.bucket,\n fileName: input.fileName,\n });\n const expiresIn = normalizeExpiresIn(input.expiresIn);\n const fileName = input.fileName;\n\n await runHook(config.download?.guard, {\n request,\n key,\n bucket,\n fileName,\n });\n\n try {\n await config.client.send(\n new HeadObjectCommand({ Bucket: bucket, Key: key }),\n );\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.client,\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,\n url,\n expiresIn,\n });\n\n return { bucket, key, url, expiresIn };\n}\n\nexport const download = createS3Endpoint(\n S3_API_ROUTES.download,\n { method: \"GET\", query: downloadQuerySchema },\n async (ctx) => {\n assertFeatureEnabled(ctx.context.config, \"download\");\n return handleDownload(ctx.context.config, ctx.query, ctx.context.request);\n },\n);\n","import { AbortMultipartUploadCommand } from \"@aws-sdk/client-s3\";\nimport {\n multipartAbortBodySchema,\n S3_API_ROUTES,\n type MultipartAbortResponse,\n} from \"@dimah-s3/core\";\nimport { runHook, runLifecycleHook } from \"../../../internal-helpers\";\nimport type { ResolvedDimahS3Config } from \"../../../types\";\nimport { resolveRequestTarget } from \"../../../helpers/resolve-target\";\nimport { assertFeatureEnabled } from \"../../assert-feature-enabled\";\nimport { createS3Endpoint } from \"../../create-s3-endpoint\";\n\nasync function handleAbort(\n config: ResolvedDimahS3Config,\n input: typeof multipartAbortBodySchema._output,\n request: Request,\n): Promise<\n MultipartAbortResponse & { bucket: string; key: string; uploadId: string }\n> {\n const { key, bucket } = await resolveRequestTarget(config, config.multipart, {\n request,\n key: input.key,\n bucket: input.bucket,\n });\n const uploadId = input.uploadId;\n\n await runHook(config.multipart?.abortGuard, {\n request,\n key,\n bucket,\n uploadId,\n });\n\n await config.client.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\nexport const multipartAbort = createS3Endpoint(\n S3_API_ROUTES.multipartAbort,\n { method: \"POST\", body: multipartAbortBodySchema },\n async (ctx) => {\n assertFeatureEnabled(ctx.context.config, \"multipart\");\n return handleAbort(ctx.context.config, ctx.body, ctx.context.request);\n },\n);\n","import {\n CompleteMultipartUploadCommand,\n HeadObjectCommand,\n ListPartsCommand,\n} from \"@aws-sdk/client-s3\";\nimport {\n multipartCompleteBodySchema,\n parseFileName,\n S3_API_ROUTES,\n type MultipartCompleteResponse,\n} from \"@dimah-s3/core\";\nimport { resolveObjectAcl } from \"../../../helpers\";\nimport { runHook, runLifecycleHook } from \"../../../internal-helpers\";\nimport type { ResolvedDimahS3Config } from \"../../../types\";\nimport { resolveRequestTarget } from \"../../../helpers/resolve-target\";\nimport { assertFeatureEnabled } from \"../../assert-feature-enabled\";\nimport { createS3Endpoint } from \"../../create-s3-endpoint\";\n\nasync function handleComplete(\n config: ResolvedDimahS3Config,\n input: typeof multipartCompleteBodySchema._output,\n request: Request,\n): Promise<MultipartCompleteResponse> {\n const { key, bucket } = await resolveRequestTarget(config, config.multipart, {\n request,\n key: input.key,\n bucket: input.bucket,\n });\n const uploadId = input.uploadId;\n const parts = input.parts\n .map(({ partNumber }) => partNumber)\n .sort((a, b) => a - b);\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.client.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.client.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.client.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.client.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.client, 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\nexport const multipartComplete = createS3Endpoint(\n S3_API_ROUTES.multipartComplete,\n { method: \"POST\", body: multipartCompleteBodySchema },\n async (ctx) => {\n assertFeatureEnabled(ctx.context.config, \"multipart\");\n return handleComplete(ctx.context.config, ctx.body, ctx.context.request);\n },\n);\n","import { CreateMultipartUploadCommand } from \"@aws-sdk/client-s3\";\nimport {\n buildContentDisposition,\n multipartInitBodySchema,\n S3_API_ROUTES,\n type MultipartInitResponse,\n} from \"@dimah-s3/core\";\nimport { errors } from \"../../../errors\";\nimport { runHook, runLifecycleHook } from \"../../../internal-helpers\";\nimport type { ResolvedDimahS3Config } from \"../../../types\";\nimport { resolveRequestTarget } from \"../../../helpers/resolve-target\";\nimport { assertFeatureEnabled } from \"../../assert-feature-enabled\";\nimport { createS3Endpoint } from \"../../create-s3-endpoint\";\n\nasync function handleMultipartInit(\n config: ResolvedDimahS3Config,\n input: typeof multipartInitBodySchema._output,\n request: Request,\n): Promise<MultipartInitResponse> {\n const { key, bucket } = await resolveRequestTarget(config, config.multipart, {\n request,\n key: input.key,\n bucket: input.bucket,\n fileName: input.fileName,\n contentType: input.contentType,\n });\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.client.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\nexport const multipartInit = createS3Endpoint(\n S3_API_ROUTES.multipartInit,\n { method: \"POST\", body: multipartInitBodySchema },\n async (ctx) => {\n assertFeatureEnabled(ctx.context.config, \"multipart\");\n ctx.setStatus(201);\n return handleMultipartInit(\n ctx.context.config,\n ctx.body,\n ctx.context.request,\n );\n },\n);\n","import { ListPartsCommand } from \"@aws-sdk/client-s3\";\nimport {\n multipartListPartsQuerySchema,\n S3_API_ROUTES,\n type MultipartListPartsResponse,\n} from \"@dimah-s3/core\";\nimport { runHook, runLifecycleHook } from \"../../../internal-helpers\";\nimport type { ResolvedDimahS3Config } from \"../../../types\";\nimport { resolveRequestTarget } from \"../../../helpers/resolve-target\";\nimport { assertFeatureEnabled } from \"../../assert-feature-enabled\";\nimport { createS3Endpoint } from \"../../create-s3-endpoint\";\n\nasync function handleListParts(\n config: ResolvedDimahS3Config,\n input: typeof multipartListPartsQuerySchema._output,\n request: Request,\n): Promise<MultipartListPartsResponse> {\n const { key, bucket } = await resolveRequestTarget(config, config.multipart, {\n request,\n key: input.key,\n bucket: input.bucket,\n });\n const uploadId = input.uploadId;\n\n await runHook(config.multipart?.listGuard, {\n request,\n key,\n bucket,\n uploadId,\n });\n\n const response = await config.client.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\nexport const multipartListParts = createS3Endpoint(\n S3_API_ROUTES.multipartListParts,\n { method: \"GET\", query: multipartListPartsQuerySchema },\n async (ctx) => {\n assertFeatureEnabled(ctx.context.config, \"multipart\");\n return handleListParts(ctx.context.config, ctx.query, ctx.context.request);\n },\n);\n","import { UploadPartCommand } from \"@aws-sdk/client-s3\";\nimport { getSignedUrl } from \"@aws-sdk/s3-request-presigner\";\nimport {\n multipartSignPartBodySchema,\n S3_API_ROUTES,\n type MultipartPartResponse,\n} from \"@dimah-s3/core\";\nimport { normalizeExpiresIn, runHook } from \"../../../internal-helpers\";\nimport type { ResolvedDimahS3Config } from \"../../../types\";\nimport { resolveRequestTarget } from \"../../../helpers/resolve-target\";\nimport { assertFeatureEnabled } from \"../../assert-feature-enabled\";\nimport { createS3Endpoint } from \"../../create-s3-endpoint\";\n\nasync function handleSignPart(\n config: ResolvedDimahS3Config,\n input: typeof multipartSignPartBodySchema._output,\n request: Request,\n): Promise<MultipartPartResponse> {\n const { key, bucket } = await resolveRequestTarget(config, config.multipart, {\n request,\n key: input.key,\n bucket: input.bucket,\n });\n const uploadId = input.uploadId;\n const partNumber = input.partNumber;\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.client,\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\nexport const multipartPart = createS3Endpoint(\n S3_API_ROUTES.multipartPart,\n { method: \"POST\", body: multipartSignPartBodySchema },\n async (ctx) => {\n assertFeatureEnabled(ctx.context.config, \"multipart\");\n return handleSignPart(ctx.context.config, ctx.body, ctx.context.request);\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 {\n buildContentDisposition,\n S3_API_ROUTES,\n uploadBodySchema,\n type UploadPresignResponse,\n} from \"@dimah-s3/core\";\nimport { errors } from \"../../errors\";\nimport {\n normalizeExpiresIn,\n runHook,\n runLifecycleHook,\n} from \"../../internal-helpers\";\nimport type { ResolvedDimahS3Config } from \"../../types\";\nimport { resolveRequestTarget } from \"../../helpers/resolve-target\";\nimport { assertFeatureEnabled } from \"../assert-feature-enabled\";\nimport { createS3Endpoint } from \"../create-s3-endpoint\";\n\nasync function handleUpload(\n config: ResolvedDimahS3Config,\n input: typeof uploadBodySchema._output,\n request: Request,\n): Promise<UploadPresignResponse> {\n const { key, bucket } = await resolveRequestTarget(config, config.upload, {\n request,\n key: input.key,\n bucket: input.bucket,\n fileName: input.fileName,\n contentType: input.contentType,\n });\n const expiresIn = normalizeExpiresIn(input.expiresIn);\n const acl = input.acl === \"public-read\" ? \"public-read\" : \"private\";\n const contentType = input.contentType ?? \"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?.guard, {\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.client,\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(\n config.client,\n {\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\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\nexport const upload = createS3Endpoint(\n S3_API_ROUTES.upload,\n { method: \"POST\", body: uploadBodySchema },\n async (ctx) => {\n assertFeatureEnabled(ctx.context.config, \"upload\");\n return handleUpload(ctx.context.config, ctx.body, ctx.context.request);\n },\n);\n","import { 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 { multipartPart } from \"./multipart/part\";\nimport { upload } from \"./upload\";\n\n/** Core better-call endpoints — keys become `s3.api.*`. */\nexport const coreEndpoints = {\n upload,\n confirm,\n download,\n delete: deleteObject,\n multipartInit,\n multipartPart,\n multipartListParts,\n multipartComplete,\n multipartAbort,\n};\n\nexport type CoreEndpoints = typeof coreEndpoints;\n\nexport const CORE_ENDPOINT_NAMES = Object.keys(\n coreEndpoints,\n) as (keyof CoreEndpoints)[];\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 * guard: 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: [\"guard\", \"onPresigned\", \"confirmGuard\", \"onConfirmed\"],\n download: [\"guard\", \"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 { Endpoint } from \"better-call\";\nimport type {\n DeleteConfig,\n DownloadConfig,\n MultipartConfig,\n UploadConfig,\n DimahS3Config,\n ResolvedDimahS3Config,\n} from \"../types/config\";\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 | \"guard\"\n | \"onPresigned\"\n | \"confirmGuard\"\n | \"onConfirmed\"\n | \"prefix\"\n | \"resolveKey\"\n >;\n download?: Pick<\n DownloadConfig,\n \"guard\" | \"onPresigned\" | \"prefix\" | \"resolveKey\"\n >;\n delete?: Pick<DeleteConfig, \"guard\" | \"onDeleted\" | \"prefix\" | \"resolveKey\">;\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 * 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 * @typeParam TEndpoints — better-call endpoints merged onto `s3.api`.\n */\nexport type DimahS3Plugin<\n Id extends string = string,\n TContext extends Record<string, unknown> = Record<string, unknown>,\n TEndpoints extends Record<string, Endpoint> = Record<string, Endpoint>,\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 on the shared handler. Use {@link createS3Endpoint}.\n * Paths are absolute under `basePath` (e.g. `/db/objects`).\n */\n endpoints?: TEndpoints;\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 E extends Record<string, Endpoint> = Record<string, Endpoint>,\n> = {\n /** Config with plugin hooks chained ahead of user hooks. */\n config: ResolvedDimahS3Config;\n /** Plugin contexts keyed by plugin id. */\n context: C;\n getPlugin: (id: string) => DimahS3Plugin | undefined;\n /** Plugin HTTP endpoints merged onto `s3.api` and the router. */\n endpoints: E;\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/** Map plugin endpoint names → better-call endpoints. */\nexport type PluginEndpointMap<P extends readonly DimahS3Plugin[]> =\n P extends readonly []\n ? Record<string, never>\n : UnionToIntersection<\n P[number] extends { endpoints?: infer E }\n ? E extends Record<string, Endpoint>\n ? E\n : Record<string, never>\n : Record<string, never>\n >;\n\ntype UnionToIntersection<U> = (\n U extends unknown ? (k: U) => void : never\n) extends (k: infer I) => void\n ? I\n : Record<string, never>;\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 \"$ERROR_CODES\",\n \"$Infer\",\n] as const;\n\nexport type ReservedPluginId = (typeof RESERVED_PLUGIN_IDS)[number];\n","import { S3_API_ROUTES } from \"@dimah-s3/core\";\nimport type { Endpoint } from \"better-call\";\nimport { CORE_ENDPOINT_NAMES } from \"../api/routes\";\nimport {\n applyMultipartDefault,\n normalizeFeatures,\n} from \"../helpers/resolve-target\";\nimport type { DimahS3Config, ResolvedDimahS3Config } from \"../types/config\";\nimport { chainHooks } from \"./chain-hooks\";\nimport { FEATURE_HOOK_KEYS, type FeatureName } from \"./hook-registry\";\nimport {\n RESERVED_PLUGIN_IDS,\n type AppliedPlugins,\n type DimahS3Plugin,\n type PluginContextMap,\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: ResolvedDimahS3Config[F],\n): ResolvedDimahS3Config[F] {\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 ResolvedDimahS3Config[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 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 reservedNames = new Set<string>([...CORE_ENDPOINT_NAMES, \"multipart\"]);\n const seenEndpointKeys = new Set<string>();\n const endpoints: Record<string, Endpoint> = {};\n\n for (const plugin of plugins) {\n for (const [name, endpoint] of Object.entries(plugin.endpoints ?? {})) {\n if (reservedNames.has(name) || name in endpoints) {\n throw new Error(\n `Plugin \"${plugin.id}\" endpoint \"${name}\" collides with an existing endpoint.`,\n );\n }\n const path = endpoint.path;\n if (typeof path !== \"string\" || !path.startsWith(\"/\")) {\n throw new Error(\n `Plugin \"${plugin.id}\" endpoint \"${name}\" path must start with \"/\".`,\n );\n }\n if (reservedRoutePaths.has(path)) {\n throw new Error(\n `Plugin \"${plugin.id}\" endpoint \"${name}\" collides with a core route.`,\n );\n }\n const methods = Array.isArray(endpoint.options.method)\n ? endpoint.options.method\n : [endpoint.options.method];\n for (const method of methods) {\n const routeKey = `${method} ${path}`;\n if (seenEndpointKeys.has(routeKey)) {\n throw new Error(`Duplicate plugin endpoint ${routeKey}.`);\n }\n seenEndpointKeys.add(routeKey);\n }\n endpoints[name] = endpoint;\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 features = normalizeFeatures(rest);\n const {\n upload: _upload,\n download: _download,\n delete: _delete,\n multipart: _multipart,\n ...base\n } = rest;\n const guard = mergeHookField(\n plugins.map((p) => p.hooks?.guard as HookFn),\n rest.guard as HookFn,\n ) as ResolvedDimahS3Config[\"guard\"];\n\n const merged: ResolvedDimahS3Config = {\n ...base,\n ...features,\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 merged[feature],\n );\n }\n\n return {\n config: applyMultipartDefault(merged, rest.multipart),\n context,\n getPlugin,\n endpoints,\n };\n}\n","import type { Endpoint } from \"better-call\";\nimport type { DimahS3Plugin } from \"./types\";\n\n/**\n * Identity helper that preserves literal `id`, context, and endpoint types\n * for {@link dimahS3} inference (`s3.context[id]` / `s3.api`).\n */\nexport function definePlugin<\n Id extends string,\n TContext extends Record<string, unknown> = Record<string, unknown>,\n TEndpoints extends Record<string, Endpoint> = Record<string, Endpoint>,\n>(\n plugin: DimahS3Plugin<Id, TContext, TEndpoints>,\n): DimahS3Plugin<Id, TContext, TEndpoints> {\n return plugin;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/helpers/is-aws-not-found.ts","../src/helpers/resolve-object-acl.ts","../src/helpers/resolve-request-acl.ts","../src/helpers/expires.ts","../src/helpers/hooks.ts","../src/helpers/request.ts","../src/helpers/resolve-target.ts","../src/helpers/head-object.ts","../src/helpers/list-parts.ts","../src/helpers/features.ts","../src/api/assert-feature-enabled.ts","../src/api/create-s3-middleware.ts","../src/api/create-s3-endpoint.ts","../src/api/routes/confirm.ts","../src/api/routes/delete.ts","../src/api/routes/download.ts","../src/api/routes/multipart/abort.ts","../src/api/routes/multipart/complete.ts","../src/api/routes/multipart/init.ts","../src/api/routes/multipart/list-parts.ts","../src/api/routes/multipart/part.ts","../src/api/routes/upload.ts","../src/api/routes/index.ts","../src/plugin/chain-hooks.ts","../src/plugin/hook-registry.ts","../src/plugin/types.ts","../src/plugin/apply-plugins.ts","../src/plugin/define-plugin.ts"],"names":["isAPIError","DimahS3Error","S3_API_ROUTES","parseFileName","buildContentDisposition","getSignedUrl","url"],"mappings":"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","file":"plugins.js","sourcesContent":["import {\n DimahS3Error,\n S3_ERROR_CODES,\n isAPIError,\n isDimahS3Error,\n isS3ErrorCode,\n} from \"@dimah-s3/core\";\n\nexport {\n DimahS3Error,\n S3_ERROR_CODES,\n isAPIError,\n isDimahS3Error,\n isS3ErrorCode,\n};\n\n/** English API errors with stable codes for client-side localization. */\nexport const errors = {\n notFound: () => DimahS3Error.from(\"NOT_FOUND\", S3_ERROR_CODES.NOT_FOUND),\n\n unauthorized: () =>\n DimahS3Error.from(\"UNAUTHORIZED\", S3_ERROR_CODES.UNAUTHORIZED),\n\n forbidden: () => DimahS3Error.from(\"FORBIDDEN\", S3_ERROR_CODES.FORBIDDEN),\n\n conflict: () => DimahS3Error.from(\"CONFLICT\", S3_ERROR_CODES.CONFLICT),\n\n internalError: () =>\n DimahS3Error.from(\"INTERNAL_SERVER_ERROR\", S3_ERROR_CODES.INTERNAL_ERROR),\n\n objectNotFound: () =>\n DimahS3Error.from(\"NOT_FOUND\", S3_ERROR_CODES.OBJECT_NOT_FOUND),\n\n featureDisabled: (feature: string) =>\n DimahS3Error.from(\"NOT_FOUND\", {\n code: S3_ERROR_CODES.FEATURE_DISABLED.code,\n message: S3_ERROR_CODES.FEATURE_DISABLED.message.replaceAll(\n \"{feature}\",\n feature,\n ),\n params: { feature },\n }),\n\n invalidKey: () =>\n DimahS3Error.from(\"BAD_REQUEST\", S3_ERROR_CODES.INVALID_KEY),\n\n invalidBucket: (bucket: string) =>\n DimahS3Error.from(\"FORBIDDEN\", {\n code: S3_ERROR_CODES.INVALID_BUCKET.code,\n message: S3_ERROR_CODES.INVALID_BUCKET.message,\n params: { bucket },\n }),\n\n s3NetworkError: (code: string) =>\n DimahS3Error.from(\"BAD_GATEWAY\", {\n code: S3_ERROR_CODES.S3_NETWORK_ERROR.code,\n message: S3_ERROR_CODES.S3_NETWORK_ERROR.message.replaceAll(\n \"{code}\",\n code,\n ),\n params: { code },\n }),\n\n fileSizeRequiredUpload: () =>\n DimahS3Error.from(\"BAD_REQUEST\", S3_ERROR_CODES.FILE_SIZE_REQUIRED_UPLOAD),\n\n fileSizeRequiredMultipart: () =>\n DimahS3Error.from(\n \"BAD_REQUEST\",\n S3_ERROR_CODES.FILE_SIZE_REQUIRED_MULTIPART,\n ),\n\n multipartPartMissing: (partNumber: number) =>\n DimahS3Error.from(\"BAD_REQUEST\", {\n code: S3_ERROR_CODES.MULTIPART_PART_MISSING.code,\n message: S3_ERROR_CODES.MULTIPART_PART_MISSING.message.replaceAll(\n \"{partNumber}\",\n String(partNumber),\n ),\n params: { partNumber },\n }),\n\n payloadTooLarge: (\n message: string = S3_ERROR_CODES.PAYLOAD_TOO_LARGE.message,\n ) =>\n DimahS3Error.from(\"PAYLOAD_TOO_LARGE\", {\n ...S3_ERROR_CODES.PAYLOAD_TOO_LARGE,\n message,\n }),\n\n validationError: (message: string) =>\n DimahS3Error.from(\"BAD_REQUEST\", {\n code: S3_ERROR_CODES.VALIDATION_ERROR.code,\n message,\n }),\n} as const;\n\nexport type ServerErrors = typeof errors;\n","import { errors } from \"@/errors\";\n\n/** True when an AWS SDK throw means the object or multipart upload 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?.name === \"NoSuchUpload\" ||\n e?.Code === \"NoSuchKey\" ||\n e?.Code === \"NotFound\" ||\n e?.Code === \"NoSuchUpload\" ||\n e?.$metadata?.httpStatusCode === 404\n );\n}\n\n/** Run an AWS call and map not-found errors to `OBJECT_NOT_FOUND`. */\nexport async function sendOrObjectNotFound<T>(\n send: () => Promise<T>,\n): Promise<T> {\n try {\n return await send();\n } catch (err: unknown) {\n if (isAwsNotFound(err)) throw errors.objectNotFound();\n throw err;\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 type { S3ObjectAcl } from \"@dimah-s3/core\";\nimport type { AclPolicy } from \"@/types/config\";\n\nexport type { AclPolicy };\n\n/**\n * Resolve object ACL. Default is `private`. A server `acl` is forced.\n * Client `acl` is used only when `allowClientAcl` is set and no server ACL\n * is configured.\n */\nexport function resolveRequestAcl(\n policy: AclPolicy | undefined,\n requested?: S3ObjectAcl,\n): S3ObjectAcl {\n if (policy?.acl) return policy.acl;\n if (policy?.allowClientAcl && requested) return requested;\n return \"private\";\n}\n","import { S3_DEFAULT_EXPIRES_IN, S3_MAX_EXPIRES_IN } from \"@dimah-s3/core\";\n\n/**\n * Coerce a client `expiresIn` to a positive integer, then clamp to\n * {@link maxExpiresIn} (SigV4 max by default).\n */\nexport function normalizeExpiresIn(\n value: unknown,\n maxExpiresIn: number = S3_MAX_EXPIRES_IN,\n): number {\n const n = Number(value);\n const expires =\n Number.isFinite(n) && n > 0 ? Math.floor(n) : S3_DEFAULT_EXPIRES_IN;\n const max =\n Number.isFinite(maxExpiresIn) && maxExpiresIn > 0\n ? Math.floor(maxExpiresIn)\n : S3_MAX_EXPIRES_IN;\n return Math.min(expires, max);\n}\n","import { DimahS3Error, isAPIError } from \"@dimah-s3/core\";\nimport { errors } from \"@/errors\";\n\n/**\n * Run a guard hook. {@link isAPIError} values are preserved; plain Errors keep\n * their English message without a library `code` so client\n * `useFormatDimahError` does 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 (isAPIError(err)) throw err;\n if (err instanceof Error && err.message.trim()) {\n throw new DimahS3Error(\"FORBIDDEN\", {\n message: err.message,\n cause: err,\n });\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 APIError).\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 (isAPIError(err)) throw err;\n console.error(\"[S3 API] lifecycle hook failed\", err);\n throw errors.internalError();\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","import { errors } from \"@/errors\";\nimport type {\n KeyPolicy,\n ResolvedDimahS3Config,\n ResolveKeyContext,\n} from \"@/types\";\n\nexport type { KeyPolicy };\n\n/**\n * Normalize a client-proposed object key: strip leading slashes, reject\n * `.` / `..` segments, NUL, and backslashes.\n */\nexport function assertSafeObjectKey(key: string): string {\n const trimmed = key.replace(/^\\/+/u, \"\").replace(/\\/+$/u, \"\");\n if (!trimmed) {\n throw errors.invalidKey();\n }\n if (trimmed.includes(\"\\\\\") || trimmed.includes(\"\\0\")) {\n throw errors.invalidKey();\n }\n const parts = trimmed.split(\"/\");\n if (parts.some((part) => part === \"\" || part === \".\" || part === \"..\")) {\n throw errors.invalidKey();\n }\n return parts.join(\"/\");\n}\n\nfunction applyPrefix(prefix: string, key: string): string {\n const p = assertSafeObjectKey(prefix);\n const k = assertSafeObjectKey(key);\n if (k === p || k.startsWith(`${p}/`)) return k;\n return `${p}/${k}`;\n}\n\nexport async function resolveObjectKey(\n policy: KeyPolicy | undefined,\n context: ResolveKeyContext,\n): Promise<string> {\n if (policy?.resolveKey) {\n return assertSafeObjectKey(await policy.resolveKey(context));\n }\n const prefix =\n typeof policy?.prefix === \"function\"\n ? await policy.prefix(context)\n : policy?.prefix;\n if (prefix) {\n return applyPrefix(prefix, context.proposedKey);\n }\n return assertSafeObjectKey(context.proposedKey);\n}\n\nexport function resolveBucket(\n config: ResolvedDimahS3Config,\n requested?: string,\n): string {\n if (!requested) return config.bucket;\n if (config.allowClientBucket) return requested;\n if (config.buckets?.length) {\n if (config.buckets.includes(requested)) return requested;\n throw errors.invalidBucket(requested);\n }\n return config.bucket;\n}\n\nexport async function resolveRequestTarget(\n config: ResolvedDimahS3Config,\n policy: KeyPolicy | undefined,\n input: {\n request: Request;\n key: string;\n bucket?: string;\n fileName?: string;\n contentType?: string;\n },\n): Promise<{ key: string; bucket: string }> {\n const bucket = resolveBucket(config, input.bucket);\n const key = await resolveObjectKey(policy, {\n request: input.request,\n proposedKey: input.key,\n fileName: input.fileName,\n contentType: input.contentType,\n bucket,\n });\n return { key, bucket };\n}\n","import {\n HeadObjectCommand,\n type HeadObjectCommandOutput,\n type S3Client,\n} from \"@aws-sdk/client-s3\";\nimport { errors } from \"@/errors\";\nimport { sendOrObjectNotFound } from \"./is-aws-not-found\";\n\n/** HeadObject, mapping AWS not-found to `OBJECT_NOT_FOUND`. */\nexport async function headObjectOrNotFound(\n client: S3Client,\n bucket: string,\n key: string,\n): Promise<HeadObjectCommandOutput> {\n return sendOrObjectNotFound(() =>\n client.send(new HeadObjectCommand({ Bucket: bucket, Key: key })),\n );\n}\n\n/**\n * HeadObject after CompleteMultipartUpload. Some providers briefly omit\n * `ContentLength`; retry a few times with exponential backoff.\n */\nexport async function headObjectAfterMultipartComplete(\n client: S3Client,\n bucket: string,\n key: string,\n): Promise<HeadObjectCommandOutput> {\n const send = () =>\n sendOrObjectNotFound(() =>\n client.send(new HeadObjectCommand({ Bucket: bucket, Key: key })),\n );\n\n let head = await send();\n for (let attempt = 0; attempt < 4 && !head.ContentLength; attempt++) {\n await new Promise((r) => setTimeout(r, 250 * 2 ** attempt));\n head = await send();\n }\n return head;\n}\n\n/** Verified size from HeadObject — never invent `0` when S3 omits it. */\nexport function requireContentLength(head: HeadObjectCommandOutput): number {\n if (typeof head.ContentLength !== \"number\") {\n throw errors.internalError();\n }\n return head.ContentLength;\n}\n","import { ListPartsCommand, type Part, type S3Client } from \"@aws-sdk/client-s3\";\nimport { sendOrObjectNotFound } from \"./is-aws-not-found\";\n\n/** Page through ListParts until S3 reports no more parts. */\nexport async function listAllParts(\n client: S3Client,\n input: { bucket: string; key: string; uploadId: string },\n): Promise<Part[]> {\n const parts: Part[] = [];\n let partNumberMarker: string | undefined;\n let isTruncated = true;\n\n while (isTruncated) {\n const response = await sendOrObjectNotFound(() =>\n client.send(\n new ListPartsCommand({\n Bucket: input.bucket,\n Key: input.key,\n UploadId: input.uploadId,\n ...(partNumberMarker ? { PartNumberMarker: partNumberMarker } : {}),\n }),\n ),\n );\n parts.push(...(response.Parts ?? []));\n isTruncated = response.IsTruncated === true;\n partNumberMarker = isTruncated ? response.NextPartNumberMarker : undefined;\n }\n\n return parts;\n}\n","import type {\n DownloadConfig,\n DeleteConfig,\n FeatureToggle,\n MultipartConfig,\n ResolvedDimahS3Config,\n UploadConfig,\n} from \"@/types\";\n\nexport function normalizeFeature<T extends object>(\n value: FeatureToggle<T> | undefined,\n): (T & { enabled: boolean }) | undefined {\n if (value === undefined) return undefined;\n if (value === false) return { enabled: false } as T & { enabled: boolean };\n if (value === true) return { enabled: true } as T & { enabled: boolean };\n return { ...value, enabled: true };\n}\n\nexport function isFeatureEnabled(\n config: ResolvedDimahS3Config,\n feature: \"upload\" | \"download\" | \"delete\" | \"multipart\",\n): boolean {\n return config[feature]?.enabled === true;\n}\n\nexport function applyMultipartDefault(\n config: ResolvedDimahS3Config,\n multipartInput: FeatureToggle<MultipartConfig> | undefined,\n): ResolvedDimahS3Config {\n let next = config;\n if (multipartInput === undefined && config.upload?.enabled) {\n next = {\n ...config,\n multipart: { ...config.multipart, enabled: true },\n };\n }\n if (next.multipart && next.upload) {\n next = {\n ...next,\n multipart: {\n ...next.multipart,\n prefix: next.multipart.prefix ?? next.upload.prefix,\n resolveKey: next.multipart.resolveKey ?? next.upload.resolveKey,\n acl: next.multipart.acl ?? next.upload.acl,\n allowClientAcl:\n next.multipart.allowClientAcl ?? next.upload.allowClientAcl,\n requireFileSize:\n next.multipart.requireFileSize ?? next.upload.requireFileSize,\n },\n };\n }\n return next;\n}\n\nexport type NormalizedFeatures = {\n upload?: UploadConfig & { enabled: boolean };\n download?: DownloadConfig & { enabled: boolean };\n delete?: DeleteConfig & { enabled: boolean };\n multipart?: MultipartConfig & { enabled: boolean };\n};\n\nexport function normalizeFeatures(config: {\n upload?: FeatureToggle<UploadConfig>;\n download?: FeatureToggle<DownloadConfig>;\n delete?: FeatureToggle<DeleteConfig>;\n multipart?: FeatureToggle<MultipartConfig>;\n}): NormalizedFeatures {\n return {\n upload: normalizeFeature(config.upload),\n download: normalizeFeature(config.download),\n delete: normalizeFeature(config.delete),\n multipart: normalizeFeature(config.multipart),\n };\n}\n\n/**\n * `allowClientBucket` (any bucket) and `buckets` (allowlist) are exclusive.\n */\nexport function assertExclusiveBucketFlags(config: {\n allowClientBucket?: boolean;\n buckets?: string[];\n}): void {\n if (config.allowClientBucket && config.buckets?.length) {\n throw new Error(\n \"dimahS3: set either allowClientBucket or buckets, not both. allowClientBucket honors any client-sent bucket; buckets is an allowlist.\",\n );\n }\n}\n","import { errors } from \"@/errors\";\nimport { isFeatureEnabled } from \"@/helpers/features\";\nimport type { ResolvedDimahS3Config } from \"@/types\";\n\nexport type FeatureFlag = \"upload\" | \"download\" | \"delete\" | \"multipart\";\n\n/** Disabled features respond 404 (`FEATURE_DISABLED`) from both HTTP and `s3.api`. */\nexport function assertFeatureEnabled(\n config: ResolvedDimahS3Config,\n feature: FeatureFlag,\n): void {\n if (!isFeatureEnabled(config, feature)) {\n throw errors.featureDisabled(feature);\n }\n}\n","import { createMiddleware } from \"better-call\";\nimport { requestFromHeaders, runHook } from \"@/helpers\";\nimport type { S3EndpointContext } from \"./context\";\n\n/**\n * Injects `config` / `request` and runs the global `guard`.\n * Used by {@link createS3Endpoint} so HTTP and `s3.api` share the same path.\n */\nexport const s3ContextMiddleware = createMiddleware(async (ctx) => {\n const injected = ctx.context as Partial<S3EndpointContext> | undefined;\n if (!injected?.config) {\n throw new Error(\n \"createS3Endpoint requires dimahS3 router context. Call endpoints through dimahS3().api or the HTTP handler.\",\n );\n }\n\n const request =\n ctx.request ??\n injected.request ??\n requestFromHeaders(ctx.headers as HeadersInit | undefined);\n\n await runHook(injected.config.guard, { request });\n\n return {\n config: injected.config,\n request,\n } satisfies S3EndpointContext;\n});\n\n/**\n * Middleware factory with dimah-s3 context already applied — same idea as\n * Better Auth `createAuthMiddleware`.\n */\nexport const createS3Middleware = createMiddleware.create({\n use: [s3ContextMiddleware],\n});\n","import { createEndpoint, type EndpointOptions } from \"better-call\";\nimport { errors } from \"@/errors\";\nimport { s3ContextMiddleware } from \"./create-s3-middleware\";\n\nconst createEndpointWithContext = createEndpoint.create({\n use: [s3ContextMiddleware],\n});\n\nfunction withS3Validation<O extends EndpointOptions>(options: O): O {\n return {\n ...options,\n onValidationError:\n options.onValidationError ??\n (({ message }: { message: string }) => {\n throw errors.validationError(message);\n }),\n };\n}\n\ntype CreateS3Endpoint = typeof createEndpointWithContext;\n\n/**\n * Typed endpoint for dimah-s3 plugins and core routes.\n *\n * Paths are absolute under `basePath` (e.g. `/db/objects`). Context\n * (`config`, `request`) is injected by the router / `s3.api`.\n * Zod failures throw `DimahS3Error` (`VALIDATION_ERROR`) via\n * better-call `onValidationError`.\n *\n * ```ts\n * endpoints: {\n * recent: createS3Endpoint(\"/audit/recent\", { method: \"GET\" }, async (ctx) => {\n * return { events: [] };\n * }),\n * }\n * ```\n */\nexport const createS3Endpoint: CreateS3Endpoint = ((\n pathOrOptions: string | EndpointOptions,\n optionsOrHandler: EndpointOptions | ((...args: never[]) => unknown),\n maybeHandler?: (...args: never[]) => unknown,\n) => {\n if (typeof pathOrOptions === \"string\") {\n return createEndpointWithContext(\n pathOrOptions,\n withS3Validation(optionsOrHandler as EndpointOptions),\n maybeHandler as never,\n );\n }\n return createEndpointWithContext(\n withS3Validation(pathOrOptions),\n optionsOrHandler as never,\n );\n}) as unknown as CreateS3Endpoint;\n","import {\n confirmBodySchema,\n parseFileName,\n S3_API_ROUTES,\n type UploadConfirmResponse,\n} from \"@dimah-s3/core\";\nimport {\n headObjectOrNotFound,\n requireContentLength,\n resolveObjectAcl,\n resolveRequestTarget,\n runHook,\n runLifecycleHook,\n} from \"@/helpers\";\nimport type { ResolvedDimahS3Config } from \"@/types\";\nimport { assertFeatureEnabled } from \"@/api/assert-feature-enabled\";\nimport { createS3Endpoint } from \"@/api/create-s3-endpoint\";\n\nasync function handleConfirm(\n config: ResolvedDimahS3Config,\n input: typeof confirmBodySchema._output,\n request: Request,\n): Promise<UploadConfirmResponse> {\n const { key, bucket } = await resolveRequestTarget(config, config.upload, {\n request,\n key: input.key,\n bucket: input.bucket,\n });\n\n await runHook(config.upload?.confirmGuard, {\n request,\n key,\n bucket,\n });\n\n const head = await headObjectOrNotFound(config.client, bucket, key);\n\n const acl = config.resolveObjectAcl\n ? await resolveObjectAcl(config.client, 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: requireContentLength(head),\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\nexport const confirm = createS3Endpoint(\n S3_API_ROUTES.uploadConfirm,\n { method: \"POST\", body: confirmBodySchema },\n async (ctx) => {\n assertFeatureEnabled(ctx.context.config, \"upload\");\n return handleConfirm(ctx.context.config, ctx.body, ctx.context.request);\n },\n);\n","import { DeleteObjectCommand } from \"@aws-sdk/client-s3\";\nimport {\n deleteQuerySchema,\n S3_API_ROUTES,\n type DeleteResponse,\n} from \"@dimah-s3/core\";\nimport {\n headObjectOrNotFound,\n resolveRequestTarget,\n runHook,\n runLifecycleHook,\n} from \"@/helpers\";\nimport type { ResolvedDimahS3Config } from \"@/types\";\nimport { assertFeatureEnabled } from \"@/api/assert-feature-enabled\";\nimport { createS3Endpoint } from \"@/api/create-s3-endpoint\";\n\nasync function handleDelete(\n config: ResolvedDimahS3Config,\n input: typeof deleteQuerySchema._output,\n request: Request,\n): Promise<DeleteResponse> {\n const { key, bucket } = await resolveRequestTarget(config, config.delete, {\n request,\n key: input.key,\n bucket: input.bucket,\n });\n\n await runHook(config.delete?.guard, {\n request,\n key,\n bucket,\n });\n\n await headObjectOrNotFound(config.client, bucket, key);\n\n await config.client.send(\n new DeleteObjectCommand({ Bucket: bucket, Key: key }),\n );\n\n await runLifecycleHook(config.delete?.onDeleted, { request, key, bucket });\n\n return { success: true, bucket, key };\n}\n\nexport const deleteObject = createS3Endpoint(\n S3_API_ROUTES.delete,\n { method: \"DELETE\", query: deleteQuerySchema },\n async (ctx) => {\n assertFeatureEnabled(ctx.context.config, \"delete\");\n return handleDelete(ctx.context.config, ctx.query, ctx.context.request);\n },\n);\n","import { GetObjectCommand } from \"@aws-sdk/client-s3\";\nimport { getSignedUrl } from \"@aws-sdk/s3-request-presigner\";\nimport {\n buildContentDisposition,\n downloadQuerySchema,\n S3_API_ROUTES,\n type PresignResponse,\n} from \"@dimah-s3/core\";\nimport {\n headObjectOrNotFound,\n normalizeExpiresIn,\n resolveRequestTarget,\n runHook,\n runLifecycleHook,\n} from \"@/helpers\";\nimport type { ResolvedDimahS3Config } from \"@/types\";\nimport { assertFeatureEnabled } from \"@/api/assert-feature-enabled\";\nimport { createS3Endpoint } from \"@/api/create-s3-endpoint\";\n\nasync function handleDownload(\n config: ResolvedDimahS3Config,\n input: typeof downloadQuerySchema._output,\n request: Request,\n): Promise<PresignResponse> {\n const { key, bucket } = await resolveRequestTarget(config, config.download, {\n request,\n key: input.key,\n bucket: input.bucket,\n fileName: input.fileName,\n });\n const expiresIn = normalizeExpiresIn(input.expiresIn, config.maxExpiresIn);\n const fileName = input.fileName;\n\n await runHook(config.download?.guard, {\n request,\n key,\n bucket,\n fileName,\n });\n\n await headObjectOrNotFound(config.client, bucket, key);\n\n const url = await getSignedUrl(\n config.client,\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,\n url,\n expiresIn,\n });\n\n return { bucket, key, url, expiresIn };\n}\n\nexport const download = createS3Endpoint(\n S3_API_ROUTES.download,\n { method: \"GET\", query: downloadQuerySchema },\n async (ctx) => {\n assertFeatureEnabled(ctx.context.config, \"download\");\n return handleDownload(ctx.context.config, ctx.query, ctx.context.request);\n },\n);\n","import { AbortMultipartUploadCommand } from \"@aws-sdk/client-s3\";\nimport {\n multipartAbortBodySchema,\n S3_API_ROUTES,\n type MultipartAbortResponse,\n} from \"@dimah-s3/core\";\nimport {\n resolveRequestTarget,\n runHook,\n runLifecycleHook,\n sendOrObjectNotFound,\n} from \"@/helpers\";\nimport type { ResolvedDimahS3Config } from \"@/types\";\nimport { assertFeatureEnabled } from \"@/api/assert-feature-enabled\";\nimport { createS3Endpoint } from \"@/api/create-s3-endpoint\";\n\nasync function handleAbort(\n config: ResolvedDimahS3Config,\n input: typeof multipartAbortBodySchema._output,\n request: Request,\n): Promise<MultipartAbortResponse> {\n const { key, bucket } = await resolveRequestTarget(config, config.multipart, {\n request,\n key: input.key,\n bucket: input.bucket,\n });\n const uploadId = input.uploadId;\n\n await runHook(config.multipart?.abortGuard, {\n request,\n key,\n bucket,\n uploadId,\n });\n\n await sendOrObjectNotFound(() =>\n config.client.send(\n new AbortMultipartUploadCommand({\n Bucket: bucket,\n Key: key,\n UploadId: uploadId,\n }),\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\nexport const multipartAbort = createS3Endpoint(\n S3_API_ROUTES.multipartAbort,\n { method: \"POST\", body: multipartAbortBodySchema },\n async (ctx) => {\n assertFeatureEnabled(ctx.context.config, \"multipart\");\n return handleAbort(ctx.context.config, ctx.body, ctx.context.request);\n },\n);\n","import { CompleteMultipartUploadCommand } from \"@aws-sdk/client-s3\";\nimport {\n multipartCompleteBodySchema,\n parseFileName,\n S3_API_ROUTES,\n type MultipartCompleteResponse,\n} from \"@dimah-s3/core\";\nimport { errors } from \"@/errors\";\nimport {\n headObjectAfterMultipartComplete,\n listAllParts,\n requireContentLength,\n resolveObjectAcl,\n resolveRequestTarget,\n runHook,\n runLifecycleHook,\n sendOrObjectNotFound,\n} from \"@/helpers\";\nimport type { ResolvedDimahS3Config } from \"@/types\";\nimport { assertFeatureEnabled } from \"@/api/assert-feature-enabled\";\nimport { createS3Endpoint } from \"@/api/create-s3-endpoint\";\n\nasync function handleComplete(\n config: ResolvedDimahS3Config,\n input: typeof multipartCompleteBodySchema._output,\n request: Request,\n): Promise<MultipartCompleteResponse> {\n const { key, bucket } = await resolveRequestTarget(config, config.multipart, {\n request,\n key: input.key,\n bucket: input.bucket,\n });\n const uploadId = input.uploadId;\n const parts = input.parts\n .map(({ partNumber }) => partNumber)\n .sort((a, b) => a - b);\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 listedParts = await listAllParts(config.client, {\n bucket,\n key,\n uploadId,\n });\n\n const completeParts = parts.map((partNumber) => {\n const found = listedParts.find((p) => p.PartNumber === partNumber);\n if (!found?.ETag) {\n throw errors.multipartPartMissing(partNumber);\n }\n return { PartNumber: partNumber, ETag: found.ETag };\n });\n\n const completeResult = await sendOrObjectNotFound(() =>\n config.client.send(\n new CompleteMultipartUploadCommand({\n Bucket: bucket,\n Key: key,\n UploadId: uploadId,\n MultipartUpload: { Parts: completeParts },\n }),\n ),\n );\n\n const head = await headObjectAfterMultipartComplete(\n config.client,\n bucket,\n key,\n );\n const contentLength = requireContentLength(head);\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.client, 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\nexport const multipartComplete = createS3Endpoint(\n S3_API_ROUTES.multipartComplete,\n { method: \"POST\", body: multipartCompleteBodySchema },\n async (ctx) => {\n assertFeatureEnabled(ctx.context.config, \"multipart\");\n return handleComplete(ctx.context.config, ctx.body, ctx.context.request);\n },\n);\n","import { CreateMultipartUploadCommand } from \"@aws-sdk/client-s3\";\nimport {\n buildContentDisposition,\n multipartInitBodySchema,\n S3_API_ROUTES,\n type MultipartInitResponse,\n} from \"@dimah-s3/core\";\nimport { errors } from \"@/errors\";\nimport {\n resolveRequestAcl,\n resolveRequestTarget,\n runHook,\n runLifecycleHook,\n} from \"@/helpers\";\nimport type { ResolvedDimahS3Config } from \"@/types\";\nimport { assertFeatureEnabled } from \"@/api/assert-feature-enabled\";\nimport { createS3Endpoint } from \"@/api/create-s3-endpoint\";\n\nasync function handleMultipartInit(\n config: ResolvedDimahS3Config,\n input: typeof multipartInitBodySchema._output,\n request: Request,\n): Promise<MultipartInitResponse> {\n const { key, bucket } = await resolveRequestTarget(config, config.multipart, {\n request,\n key: input.key,\n bucket: input.bucket,\n fileName: input.fileName,\n contentType: input.contentType,\n });\n const acl = resolveRequestAcl(config.multipart, input.acl);\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 contentType: input.contentType,\n metadata: input.metadata,\n acl,\n fileName: input.fileName,\n });\n\n const { UploadId } = await config.client.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 if (!UploadId) {\n throw errors.internalError();\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\nexport const multipartInit = createS3Endpoint(\n S3_API_ROUTES.multipartInit,\n { method: \"POST\", body: multipartInitBodySchema },\n async (ctx) => {\n assertFeatureEnabled(ctx.context.config, \"multipart\");\n ctx.setStatus(201);\n return handleMultipartInit(\n ctx.context.config,\n ctx.body,\n ctx.context.request,\n );\n },\n);\n","import {\n multipartListPartsQuerySchema,\n S3_API_ROUTES,\n type MultipartListPartsResponse,\n} from \"@dimah-s3/core\";\nimport {\n listAllParts,\n resolveRequestTarget,\n runHook,\n runLifecycleHook,\n} from \"@/helpers\";\nimport type { ResolvedDimahS3Config } from \"@/types\";\nimport { assertFeatureEnabled } from \"@/api/assert-feature-enabled\";\nimport { createS3Endpoint } from \"@/api/create-s3-endpoint\";\n\nasync function handleListParts(\n config: ResolvedDimahS3Config,\n input: typeof multipartListPartsQuerySchema._output,\n request: Request,\n): Promise<MultipartListPartsResponse> {\n const { key, bucket } = await resolveRequestTarget(config, config.multipart, {\n request,\n key: input.key,\n bucket: input.bucket,\n });\n const uploadId = input.uploadId;\n\n await runHook(config.multipart?.listGuard, {\n request,\n key,\n bucket,\n uploadId,\n });\n\n const listed = await listAllParts(config.client, { bucket, key, uploadId });\n\n const parts = listed.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\nexport const multipartListParts = createS3Endpoint(\n S3_API_ROUTES.multipartListParts,\n { method: \"GET\", query: multipartListPartsQuerySchema },\n async (ctx) => {\n assertFeatureEnabled(ctx.context.config, \"multipart\");\n return handleListParts(ctx.context.config, ctx.query, ctx.context.request);\n },\n);\n","import { UploadPartCommand } from \"@aws-sdk/client-s3\";\nimport { getSignedUrl } from \"@aws-sdk/s3-request-presigner\";\nimport {\n multipartSignPartBodySchema,\n S3_API_ROUTES,\n type MultipartPartResponse,\n} from \"@dimah-s3/core\";\nimport { normalizeExpiresIn, resolveRequestTarget, runHook } from \"@/helpers\";\nimport type { ResolvedDimahS3Config } from \"@/types\";\nimport { assertFeatureEnabled } from \"@/api/assert-feature-enabled\";\nimport { createS3Endpoint } from \"@/api/create-s3-endpoint\";\n\nasync function handleSignPart(\n config: ResolvedDimahS3Config,\n input: typeof multipartSignPartBodySchema._output,\n request: Request,\n): Promise<MultipartPartResponse> {\n const { key, bucket } = await resolveRequestTarget(config, config.multipart, {\n request,\n key: input.key,\n bucket: input.bucket,\n });\n const uploadId = input.uploadId;\n const partNumber = input.partNumber;\n const expiresIn = normalizeExpiresIn(input.expiresIn, config.maxExpiresIn);\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.client,\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\nexport const multipartPart = createS3Endpoint(\n S3_API_ROUTES.multipartPart,\n { method: \"POST\", body: multipartSignPartBodySchema },\n async (ctx) => {\n assertFeatureEnabled(ctx.context.config, \"multipart\");\n return handleSignPart(ctx.context.config, ctx.body, ctx.context.request);\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 {\n buildContentDisposition,\n S3_API_ROUTES,\n S3_MAX_POST_OBJECT_BYTES,\n uploadBodySchema,\n type UploadPresignResponse,\n} from \"@dimah-s3/core\";\nimport { errors } from \"@/errors\";\nimport {\n normalizeExpiresIn,\n resolveRequestAcl,\n resolveRequestTarget,\n runHook,\n runLifecycleHook,\n} from \"@/helpers\";\nimport type { ResolvedDimahS3Config } from \"@/types\";\nimport { assertFeatureEnabled } from \"@/api/assert-feature-enabled\";\nimport { createS3Endpoint } from \"@/api/create-s3-endpoint\";\n\nfunction putMetadataHeaders(\n metadata: Record<string, string> | undefined,\n): Record<string, string> {\n if (!metadata) return {};\n const headers: Record<string, string> = {};\n for (const [k, v] of Object.entries(metadata)) {\n headers[`x-amz-meta-${k}`] = v;\n }\n return headers;\n}\n\nasync function handleUpload(\n config: ResolvedDimahS3Config,\n input: typeof uploadBodySchema._output,\n request: Request,\n): Promise<UploadPresignResponse> {\n const { key, bucket } = await resolveRequestTarget(config, config.upload, {\n request,\n key: input.key,\n bucket: input.bucket,\n fileName: input.fileName,\n contentType: input.contentType,\n });\n const expiresIn = normalizeExpiresIn(input.expiresIn, config.maxExpiresIn);\n const acl = resolveRequestAcl(config.upload, input.acl);\n const contentType = input.contentType ?? \"application/octet-stream\";\n const fileSize =\n typeof input.fileSize === \"number\" && input.fileSize > 0\n ? Math.floor(input.fileSize)\n : null;\n\n if (config.upload?.requireFileSize && fileSize === null) {\n throw errors.fileSizeRequiredUpload();\n }\n\n await runHook(config.upload?.guard, {\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\") {\n const putHeaders: Record<string, string> = {\n \"Content-Type\": contentType,\n ...putMetadataHeaders(input.metadata),\n };\n if (input.fileName) {\n putHeaders[\"Content-Disposition\"] = buildContentDisposition(\n input.fileName,\n );\n }\n\n const url = await getSignedUrl(\n config.client,\n new PutObjectCommand({\n Bucket: bucket,\n Key: key,\n ContentType: contentType,\n ACL: acl,\n Metadata: input.metadata,\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(\n config.client,\n {\n Bucket: bucket,\n Key: key,\n Conditions:\n rangeMax !== undefined\n ? [[\"content-length-range\", rangeMin, rangeMax]]\n : [[\"content-length-range\", rangeMin, S3_MAX_POST_OBJECT_BYTES]],\n Fields: fields,\n Expires: expiresIn,\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 fields: signedFields,\n expiresIn,\n method: \"POST\",\n };\n}\n\nexport const upload = createS3Endpoint(\n S3_API_ROUTES.upload,\n { method: \"POST\", body: uploadBodySchema },\n async (ctx) => {\n assertFeatureEnabled(ctx.context.config, \"upload\");\n return handleUpload(ctx.context.config, ctx.body, ctx.context.request);\n },\n);\n","import { 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 { multipartPart } from \"./multipart/part\";\nimport { upload } from \"./upload\";\n\n/** Core better-call endpoints — keys become `s3.api.*`. */\nexport const coreEndpoints = {\n upload,\n confirm,\n download,\n delete: deleteObject,\n multipartInit,\n multipartPart,\n multipartListParts,\n multipartComplete,\n multipartAbort,\n};\n\nexport type CoreEndpoints = typeof coreEndpoints;\n\nexport const CORE_ENDPOINT_NAMES = Object.keys(\n coreEndpoints,\n) as (keyof CoreEndpoints)[];\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 * guard: 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: [\"guard\", \"onPresigned\", \"confirmGuard\", \"onConfirmed\"],\n download: [\"guard\", \"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 { Endpoint } from \"better-call\";\nimport type {\n DeleteConfig,\n DownloadConfig,\n MultipartConfig,\n UploadConfig,\n DimahS3Config,\n ResolvedDimahS3Config,\n} from \"@/types/config\";\n\n/**\n * Hook fields a plugin may contribute. Scalars like `method` /\n * `prefix` / `resolveKey` / `acl` stay user-owned on {@link DimahS3Config}.\n */\nexport type DimahS3PluginHooks = {\n guard?: DimahS3Config[\"guard\"];\n upload?: Pick<\n UploadConfig,\n \"guard\" | \"onPresigned\" | \"confirmGuard\" | \"onConfirmed\"\n >;\n download?: Pick<DownloadConfig, \"guard\" | \"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 * 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 * @typeParam TEndpoints — better-call endpoints merged onto `s3.api`.\n */\nexport type DimahS3Plugin<\n Id extends string = string,\n TContext extends Record<string, unknown> = Record<string, unknown>,\n TEndpoints extends Record<string, Endpoint> = Record<string, Endpoint>,\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 on the shared handler. Use {@link createS3Endpoint}.\n * Paths are absolute under `basePath` (e.g. `/db/objects`).\n */\n endpoints?: TEndpoints;\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 E extends Record<string, Endpoint> = Record<string, Endpoint>,\n> = {\n /** Config with plugin hooks chained ahead of user hooks. */\n config: ResolvedDimahS3Config;\n /** Plugin contexts keyed by plugin id. */\n context: C;\n getPlugin: (id: string) => DimahS3Plugin | undefined;\n /** Plugin HTTP endpoints merged onto `s3.api` and the router. */\n endpoints: E;\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/** Map plugin endpoint names → better-call endpoints. */\nexport type PluginEndpointMap<P extends readonly DimahS3Plugin[]> =\n P extends readonly []\n ? Record<string, never>\n : UnionToIntersection<\n P[number] extends { endpoints?: infer E }\n ? E extends Record<string, Endpoint>\n ? E\n : Record<string, never>\n : Record<string, never>\n >;\n\ntype UnionToIntersection<U> = (\n U extends unknown ? (k: U) => void : never\n) extends (k: infer I) => void\n ? I\n : Record<string, never>;\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 \"$ERROR_CODES\",\n \"$Infer\",\n] as const;\n\nexport type ReservedPluginId = (typeof RESERVED_PLUGIN_IDS)[number];\n","import { S3_API_ROUTES } from \"@dimah-s3/core\";\nimport type { Endpoint } from \"better-call\";\nimport { CORE_ENDPOINT_NAMES } from \"@/api/routes\";\nimport {\n applyMultipartDefault,\n assertExclusiveBucketFlags,\n normalizeFeatures,\n} from \"@/helpers/features\";\nimport type { DimahS3Config, ResolvedDimahS3Config } from \"@/types/config\";\nimport { chainHooks } from \"./chain-hooks\";\nimport { FEATURE_HOOK_KEYS, type FeatureName } from \"./hook-registry\";\nimport {\n RESERVED_PLUGIN_IDS,\n type AppliedPlugins,\n type DimahS3Plugin,\n type PluginContextMap,\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: ResolvedDimahS3Config[F],\n): ResolvedDimahS3Config[F] {\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 ResolvedDimahS3Config[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 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 reservedNames = new Set<string>([...CORE_ENDPOINT_NAMES, \"multipart\"]);\n const seenEndpointKeys = new Set<string>();\n const endpoints: Record<string, Endpoint> = {};\n\n for (const plugin of plugins) {\n for (const [name, endpoint] of Object.entries(plugin.endpoints ?? {})) {\n if (reservedNames.has(name) || name in endpoints) {\n throw new Error(\n `Plugin \"${plugin.id}\" endpoint \"${name}\" collides with an existing endpoint.`,\n );\n }\n const path = endpoint.path;\n if (typeof path !== \"string\" || !path.startsWith(\"/\")) {\n throw new Error(\n `Plugin \"${plugin.id}\" endpoint \"${name}\" path must start with \"/\".`,\n );\n }\n if (reservedRoutePaths.has(path)) {\n throw new Error(\n `Plugin \"${plugin.id}\" endpoint \"${name}\" collides with a core route.`,\n );\n }\n const methods = Array.isArray(endpoint.options.method)\n ? endpoint.options.method\n : [endpoint.options.method];\n for (const method of methods) {\n const routeKey = `${method} ${path}`;\n if (seenEndpointKeys.has(routeKey)) {\n throw new Error(`Duplicate plugin endpoint ${routeKey}.`);\n }\n seenEndpointKeys.add(routeKey);\n }\n endpoints[name] = endpoint;\n }\n }\n\n const { plugins: _omit, ...rest } = config;\n\n assertExclusiveBucketFlags(rest);\n\n for (const plugin of plugins) {\n plugin.init?.({ config: rest, getPlugin });\n }\n\n const features = normalizeFeatures(rest);\n const {\n upload: _upload,\n download: _download,\n delete: _delete,\n multipart: _multipart,\n ...base\n } = rest;\n const guard = mergeHookField(\n plugins.map((p) => p.hooks?.guard as HookFn),\n rest.guard as HookFn,\n ) as ResolvedDimahS3Config[\"guard\"];\n\n const merged: ResolvedDimahS3Config = {\n ...base,\n ...features,\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 merged[feature],\n );\n }\n\n return {\n config: applyMultipartDefault(merged, rest.multipart),\n context,\n getPlugin,\n endpoints,\n };\n}\n","import type { Endpoint } from \"better-call\";\nimport type { DimahS3Plugin } from \"./types\";\n\n/**\n * Identity helper that preserves literal `id`, context, and endpoint types\n * for {@link dimahS3} inference (`s3.context[id]` / `s3.api`).\n */\nexport function definePlugin<\n Id extends string,\n TContext extends Record<string, unknown> = Record<string, unknown>,\n TEndpoints extends Record<string, Endpoint> = Record<string, Endpoint>,\n>(\n plugin: DimahS3Plugin<Id, TContext, TEndpoints>,\n): DimahS3Plugin<Id, TContext, TEndpoints> {\n return plugin;\n}\n"]}
|
package/dist/types/config.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { S3Client } from "@aws-sdk/client-s3";
|
|
2
|
-
import type { UploadPresignMethod } from "@dimah-s3/core";
|
|
2
|
+
import type { S3ObjectAcl, UploadPresignMethod } from "@dimah-s3/core";
|
|
3
3
|
import type { DeleteGuardContext, DeleteOnDeletedContext, DownloadOnPresignedContext, DownloadPresignGuardContext, GuardContext, MultipartAbortGuardContext, MultipartCompleteGuardContext, MultipartInitGuardContext, MultipartListGuardContext, MultipartOnAbortContext, MultipartOnCompleteContext, MultipartOnInitContext, MultipartOnListContext, MultipartPartGuardContext, ResolveKeyContext, UploadConfirmGuardContext, UploadOnConfirmedContext, UploadOnPresignedContext, UploadPresignGuardContext } from "./hook-contexts";
|
|
4
4
|
import type { DimahS3Plugin } from "../plugin/types";
|
|
5
5
|
export type { ResolveKeyContext };
|
|
6
6
|
/** String prefix or async factory used by {@link resolveObjectKey}. */
|
|
7
7
|
export type KeyPrefix = string | ((context: ResolveKeyContext) => string | Promise<string>);
|
|
8
|
-
type KeyPolicy = {
|
|
8
|
+
export type KeyPolicy = {
|
|
9
9
|
/**
|
|
10
10
|
* Prepended to the client-proposed key. Already-prefixed keys are left
|
|
11
11
|
* unchanged so confirm / download of the stored key still work.
|
|
@@ -14,9 +14,20 @@ type KeyPolicy = {
|
|
|
14
14
|
/** Full control over the object key. Wins over {@link prefix}. */
|
|
15
15
|
resolveKey?: (context: ResolveKeyContext) => string | Promise<string>;
|
|
16
16
|
};
|
|
17
|
+
export type AclPolicy = {
|
|
18
|
+
/**
|
|
19
|
+
* Server-forced ACL. When set, the client `acl` is ignored.
|
|
20
|
+
* @default "private" (when omitted)
|
|
21
|
+
*/
|
|
22
|
+
acl?: S3ObjectAcl;
|
|
23
|
+
/**
|
|
24
|
+
* Honor a client-sent `acl` (`private` | `public-read`). Off by default —
|
|
25
|
+
* uploads are `private` unless {@link acl} is set.
|
|
26
|
+
*/
|
|
27
|
+
allowClientAcl?: boolean;
|
|
28
|
+
};
|
|
17
29
|
/** Upload feature. A config object (or `true`) enables the feature. */
|
|
18
|
-
export type UploadConfig = KeyPolicy & {
|
|
19
|
-
enabled?: boolean;
|
|
30
|
+
export type UploadConfig = KeyPolicy & AclPolicy & {
|
|
20
31
|
method?: UploadPresignMethod;
|
|
21
32
|
requireFileSize?: boolean;
|
|
22
33
|
guard?: (context: UploadPresignGuardContext) => Promise<void> | void;
|
|
@@ -26,19 +37,16 @@ export type UploadConfig = KeyPolicy & {
|
|
|
26
37
|
};
|
|
27
38
|
/** Download feature. A config object (or `true`) enables the feature. */
|
|
28
39
|
export type DownloadConfig = KeyPolicy & {
|
|
29
|
-
enabled?: boolean;
|
|
30
40
|
guard?: (context: DownloadPresignGuardContext) => Promise<void> | void;
|
|
31
41
|
onPresigned?: (context: DownloadOnPresignedContext) => Promise<void> | void;
|
|
32
42
|
};
|
|
33
43
|
/** Delete feature. A config object (or `true`) enables the feature. */
|
|
34
44
|
export type DeleteConfig = KeyPolicy & {
|
|
35
|
-
enabled?: boolean;
|
|
36
45
|
guard?: (context: DeleteGuardContext) => Promise<void> | void;
|
|
37
46
|
onDeleted?: (context: DeleteOnDeletedContext) => Promise<void> | void;
|
|
38
47
|
};
|
|
39
48
|
/** Multipart feature. On automatically when upload is on, unless set to `false`. */
|
|
40
|
-
export type MultipartConfig = KeyPolicy & {
|
|
41
|
-
enabled?: boolean;
|
|
49
|
+
export type MultipartConfig = KeyPolicy & AclPolicy & {
|
|
42
50
|
requireFileSize?: boolean;
|
|
43
51
|
initGuard?: (context: MultipartInitGuardContext) => Promise<void> | void;
|
|
44
52
|
partGuard?: (context: MultipartPartGuardContext) => Promise<void> | void;
|
|
@@ -50,7 +58,7 @@ export type MultipartConfig = KeyPolicy & {
|
|
|
50
58
|
onAbort?: (context: MultipartOnAbortContext) => Promise<void> | void;
|
|
51
59
|
onList?: (context: MultipartOnListContext) => Promise<void> | void;
|
|
52
60
|
};
|
|
53
|
-
/** `true` enables the feature; `false` disables it
|
|
61
|
+
/** `true` or an options object enables the feature; omit or `false` disables it. */
|
|
54
62
|
export type FeatureToggle<T> = boolean | T;
|
|
55
63
|
/**
|
|
56
64
|
* Options for {@link dimahS3}.
|
|
@@ -93,13 +101,23 @@ export type DimahS3Config = {
|
|
|
93
101
|
/**
|
|
94
102
|
* Allow the client to pick any bucket. Off by default — the request `bucket`
|
|
95
103
|
* is ignored and {@link bucket} is used.
|
|
104
|
+
*
|
|
105
|
+
* Mutually exclusive with {@link buckets}.
|
|
96
106
|
*/
|
|
97
107
|
allowClientBucket?: boolean;
|
|
98
108
|
/**
|
|
99
109
|
* Allowlist of buckets the client may send. When set, a request bucket
|
|
100
110
|
* outside this list is rejected. {@link bucket} should be included.
|
|
111
|
+
*
|
|
112
|
+
* Mutually exclusive with {@link allowClientBucket}.
|
|
101
113
|
*/
|
|
102
114
|
buckets?: string[];
|
|
115
|
+
/**
|
|
116
|
+
* Upper bound for client `expiresIn` (seconds). Requests above this are
|
|
117
|
+
* clamped. The protocol maximum is 7 days (604800).
|
|
118
|
+
* @default 604800
|
|
119
|
+
*/
|
|
120
|
+
maxExpiresIn?: number;
|
|
103
121
|
/** Runs before every operation. Throw to reject. */
|
|
104
122
|
guard?: (context: GuardContext) => Promise<void> | void;
|
|
105
123
|
upload?: FeatureToggle<UploadConfig>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -92,6 +92,14 @@ export type MultipartUploadContext = ObjectContext & {
|
|
|
92
92
|
export type MultipartInitGuardContext = ObjectContext & {
|
|
93
93
|
/** Declared byte size of the file — available during init only. */
|
|
94
94
|
fileSize?: number;
|
|
95
|
+
/** MIME type the client sent — not verified until `onComplete`. */
|
|
96
|
+
contentType?: string;
|
|
97
|
+
/** Custom object metadata. */
|
|
98
|
+
metadata?: Record<string, string>;
|
|
99
|
+
/** Resolved ACL that will be applied at init. */
|
|
100
|
+
acl?: S3ObjectAcl;
|
|
101
|
+
/** Original filename for `Content-Disposition`. */
|
|
102
|
+
fileName?: string;
|
|
95
103
|
};
|
|
96
104
|
/** Context for `multipart.partGuard`. */
|
|
97
105
|
export type MultipartPartGuardContext = MultipartUploadContext & {
|
|
@@ -113,14 +121,6 @@ export type MultipartListGuardContext = MultipartUploadContext;
|
|
|
113
121
|
export type MultipartOnInitContext = MultipartInitGuardContext & {
|
|
114
122
|
/** Multipart upload ID. */
|
|
115
123
|
uploadId: string;
|
|
116
|
-
/** Declared MIME type. */
|
|
117
|
-
contentType?: string;
|
|
118
|
-
/** Custom object metadata. */
|
|
119
|
-
metadata?: Record<string, string>;
|
|
120
|
-
/** Requested ACL. */
|
|
121
|
-
acl?: S3ObjectAcl;
|
|
122
|
-
/** Original filename for `Content-Disposition`. */
|
|
123
|
-
fileName?: string;
|
|
124
124
|
};
|
|
125
125
|
/** Context for `multipart.onComplete`. */
|
|
126
126
|
export type MultipartOnCompleteContext = MultipartUploadContext & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-contexts.d.ts","sourceRoot":"","sources":["../../src/types/hook-contexts.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"hook-contexts.d.ts","sourceRoot":"","sources":["../../src/types/hook-contexts.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export type { GuardContext, ResolveKeyContext, UploadPresignGuardContext, UploadOnPresignedContext, UploadConfirmGuardContext, UploadOnConfirmedContext, DownloadPresignGuardContext, DownloadOnPresignedContext, DeleteGuardContext, DeleteOnDeletedContext, MultipartUploadContext, MultipartInitGuardContext, MultipartPartGuardContext, MultipartCompleteGuardContext, MultipartAbortGuardContext, MultipartListGuardContext, MultipartOnInitContext, MultipartOnCompleteContext, MultipartOnAbortContext, MultipartOnListContext, } from "./hook-contexts";
|
|
2
|
-
export type { DimahS3Config, DownloadConfig, DeleteConfig, FeatureToggle, KeyPrefix, MultipartConfig, ResolvedDimahS3Config, UploadConfig, } from "./config";
|
|
2
|
+
export type { AclPolicy, DimahS3Config, DownloadConfig, DeleteConfig, FeatureToggle, KeyPolicy, KeyPrefix, MultipartConfig, ResolvedDimahS3Config, UploadConfig, } from "./config";
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EACxB,2BAA2B,EAC3B,0BAA0B,EAC1B,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,yBAAyB,EACzB,yBAAyB,EACzB,6BAA6B,EAC7B,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,EAC1B,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,aAAa,EACb,cAAc,EACd,YAAY,EACZ,aAAa,EACb,SAAS,EACT,eAAe,EACf,qBAAqB,EACrB,YAAY,GACb,MAAM,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EACxB,2BAA2B,EAC3B,0BAA0B,EAC1B,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,yBAAyB,EACzB,yBAAyB,EACzB,6BAA6B,EAC7B,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,EAC1B,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,SAAS,EACT,aAAa,EACb,cAAc,EACd,YAAY,EACZ,aAAa,EACb,SAAS,EACT,SAAS,EACT,eAAe,EACf,qBAAqB,EACrB,YAAY,GACb,MAAM,UAAU,CAAC"}
|