@dimah-s3/server 1.0.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +7 -3
  2. package/dist/adapters/express.js +16 -9
  3. package/dist/adapters/express.js.map +1 -1
  4. package/dist/adapters/fastify.js +16 -9
  5. package/dist/adapters/fastify.js.map +1 -1
  6. package/dist/adapters/hono.d.ts +1 -1
  7. package/dist/adapters/hono.js.map +1 -1
  8. package/dist/adapters/node.d.ts +1 -1
  9. package/dist/adapters/node.js +16 -9
  10. package/dist/adapters/node.js.map +1 -1
  11. package/dist/api/index.js +742 -388
  12. package/dist/api/index.js.map +1 -1
  13. package/dist/api/router.d.ts.map +1 -1
  14. package/dist/api/routes/catalog.d.ts +9 -0
  15. package/dist/api/routes/catalog.d.ts.map +1 -0
  16. package/dist/api/routes/confirm.d.ts +3 -4
  17. package/dist/api/routes/confirm.d.ts.map +1 -1
  18. package/dist/api/routes/delete-batch.d.ts +14 -0
  19. package/dist/api/routes/delete-batch.d.ts.map +1 -0
  20. package/dist/api/routes/delete.d.ts +2 -2
  21. package/dist/api/routes/delete.d.ts.map +1 -1
  22. package/dist/api/routes/download.d.ts +8 -8
  23. package/dist/api/routes/download.d.ts.map +1 -1
  24. package/dist/api/routes/file.d.ts +20 -0
  25. package/dist/api/routes/file.d.ts.map +1 -0
  26. package/dist/api/routes/index.d.ts +76 -50
  27. package/dist/api/routes/index.d.ts.map +1 -1
  28. package/dist/api/routes/multipart/abort.d.ts +2 -2
  29. package/dist/api/routes/multipart/abort.d.ts.map +1 -1
  30. package/dist/api/routes/multipart/complete.d.ts +2 -2
  31. package/dist/api/routes/multipart/complete.d.ts.map +1 -1
  32. package/dist/api/routes/multipart/init.d.ts +10 -12
  33. package/dist/api/routes/multipart/init.d.ts.map +1 -1
  34. package/dist/api/routes/multipart/list-parts.d.ts +2 -2
  35. package/dist/api/routes/multipart/list-parts.d.ts.map +1 -1
  36. package/dist/api/routes/multipart/part.d.ts +4 -6
  37. package/dist/api/routes/multipart/part.d.ts.map +1 -1
  38. package/dist/api/routes/upload.d.ts +10 -14
  39. package/dist/api/routes/upload.d.ts.map +1 -1
  40. package/dist/dimah-s3.d.ts +19 -8
  41. package/dist/dimah-s3.d.ts.map +1 -1
  42. package/dist/errors.d.ts +5 -4
  43. package/dist/errors.d.ts.map +1 -1
  44. package/dist/helpers/best-effort.d.ts +6 -0
  45. package/dist/helpers/best-effort.d.ts.map +1 -0
  46. package/dist/helpers/constraints.d.ts +16 -0
  47. package/dist/helpers/constraints.d.ts.map +1 -0
  48. package/dist/helpers/expires.d.ts +2 -2
  49. package/dist/helpers/features.d.ts +12 -29
  50. package/dist/helpers/features.d.ts.map +1 -1
  51. package/dist/helpers/finalize-confirmed.d.ts +19 -0
  52. package/dist/helpers/finalize-confirmed.d.ts.map +1 -0
  53. package/dist/helpers/head-object.d.ts.map +1 -1
  54. package/dist/helpers/hooks.d.ts +7 -1
  55. package/dist/helpers/hooks.d.ts.map +1 -1
  56. package/dist/helpers/index.d.ts +12 -9
  57. package/dist/helpers/index.d.ts.map +1 -1
  58. package/dist/helpers/list-parts.d.ts +5 -0
  59. package/dist/helpers/list-parts.d.ts.map +1 -1
  60. package/dist/helpers/logger.d.ts +4 -0
  61. package/dist/helpers/logger.d.ts.map +1 -0
  62. package/dist/helpers/previous-key.d.ts +5 -0
  63. package/dist/helpers/previous-key.d.ts.map +1 -0
  64. package/dist/helpers/resolve-route.d.ts +36 -0
  65. package/dist/helpers/resolve-route.d.ts.map +1 -0
  66. package/dist/helpers/resolve-target.d.ts +25 -14
  67. package/dist/helpers/resolve-target.d.ts.map +1 -1
  68. package/dist/index.d.ts +7 -2
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +1017 -477
  71. package/dist/index.js.map +1 -1
  72. package/dist/plugin/apply-plugins.d.ts +9 -4
  73. package/dist/plugin/apply-plugins.d.ts.map +1 -1
  74. package/dist/plugin/hook-registry.d.ts +13 -4
  75. package/dist/plugin/hook-registry.d.ts.map +1 -1
  76. package/dist/plugin/index.d.ts +1 -2
  77. package/dist/plugin/index.d.ts.map +1 -1
  78. package/dist/plugin/types.d.ts +12 -7
  79. package/dist/plugin/types.d.ts.map +1 -1
  80. package/dist/plugins.d.ts +5 -3
  81. package/dist/plugins.d.ts.map +1 -1
  82. package/dist/plugins.js +951 -475
  83. package/dist/plugins.js.map +1 -1
  84. package/dist/put.d.ts +15 -0
  85. package/dist/put.d.ts.map +1 -0
  86. package/dist/route.d.ts +13 -0
  87. package/dist/route.d.ts.map +1 -0
  88. package/dist/types/config.d.ts +190 -95
  89. package/dist/types/config.d.ts.map +1 -1
  90. package/dist/types/hook-contexts.d.ts +124 -87
  91. package/dist/types/hook-contexts.d.ts.map +1 -1
  92. package/dist/types/index.d.ts +3 -2
  93. package/dist/types/index.d.ts.map +1 -1
  94. package/package.json +11 -11
  95. package/dist/api/assert-feature-enabled.d.ts +0 -5
  96. package/dist/api/assert-feature-enabled.d.ts.map +0 -1
  97. package/dist/helpers/resolve-object-acl.d.ts +0 -10
  98. package/dist/helpers/resolve-object-acl.d.ts.map +0 -1
  99. package/dist/helpers/resolve-request-acl.d.ts +0 -10
  100. package/dist/helpers/resolve-request-acl.d.ts.map +0 -1
@@ -0,0 +1,19 @@
1
+ import type { ConfirmedObjectResponse, S3ObjectAcl } from "@dimah-s3/core";
2
+ import type { HeadObjectCommandOutput, S3Client } from "@aws-sdk/client-s3";
3
+ import type { OpenedRoute, ResolvedDimahS3Config, StoredObjectContext } from "../types";
4
+ export type FinalizeConfirmedInput = {
5
+ config: ResolvedDimahS3Config;
6
+ route: OpenedRoute<"upload" | "multipart">;
7
+ stored: StoredObjectContext;
8
+ head: HeadObjectCommandOutput;
9
+ uploadId?: string;
10
+ /** ACL from the upload policy, not GetObjectAcl. */
11
+ acl?: S3ObjectAcl;
12
+ };
13
+ /**
14
+ * HeadObject constraints, `onConfirmed`, then compensating `DeleteObject`
15
+ * (and `previousKey` cleanup) so a thrown lifecycle hook cannot leave an
16
+ * orphan object.
17
+ */
18
+ export declare function finalizeConfirmedObject(client: S3Client, bucket: string, key: string, input: FinalizeConfirmedInput): Promise<ConfirmedObjectResponse>;
19
+ //# sourceMappingURL=finalize-confirmed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finalize-confirmed.d.ts","sourceRoot":"","sources":["../../src/helpers/finalize-confirmed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE3E,OAAO,KAAK,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAU5E,OAAO,KAAK,EACV,WAAW,EACX,qBAAqB,EACrB,mBAAmB,EAEpB,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,qBAAqB,CAAC;IAC9B,KAAK,EAAE,WAAW,CAAC,QAAQ,GAAG,WAAW,CAAC,CAAC;IAC3C,MAAM,EAAE,mBAAmB,CAAC;IAC5B,IAAI,EAAE,uBAAuB,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,GAAG,CAAC,EAAE,WAAW,CAAC;CACnB,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,uBAAuB,CAAC,CA4DlC"}
@@ -1 +1 @@
1
- {"version":3,"file":"head-object.d.ts","sourceRoot":"","sources":["../../src/helpers/head-object.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAC;AAI5B,+DAA+D;AAC/D,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,uBAAuB,CAAC,CAIlC;AAED;;;GAGG;AACH,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,uBAAuB,CAAC,CAYlC;AAED,yEAAyE;AACzE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,uBAAuB,GAAG,MAAM,CAK1E"}
1
+ {"version":3,"file":"head-object.d.ts","sourceRoot":"","sources":["../../src/helpers/head-object.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAC;AAI5B,+DAA+D;AAC/D,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,uBAAuB,CAAC,CAIlC;AAED;;;GAGG;AACH,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,uBAAuB,CAAC,CAgBlC;AAED,yEAAyE;AACzE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,uBAAuB,GAAG,MAAM,CAK1E"}
@@ -1,3 +1,4 @@
1
+ import type { ResolvedDimahS3Config, UploadConfig, UploadObjectContext, UploadObjectInfo } from "../types";
1
2
  /**
2
3
  * Run a guard hook. {@link isAPIError} values are preserved; plain Errors keep
3
4
  * their English message without a library `code` so client
@@ -6,11 +7,16 @@
6
7
  export declare function runHook<T extends {
7
8
  request: Request;
8
9
  }>(hook: ((context: T) => Promise<void> | void) | undefined, context: T): Promise<void>;
10
+ /**
11
+ * Run `upload.object`. Same rejection mapping as {@link runHook}
12
+ * (plain `Error` → 403) so auth throws in `object` match `guard`.
13
+ */
14
+ export declare function runObjectHook(hook: UploadConfig["object"], context: UploadObjectContext): Promise<UploadObjectInfo | void>;
9
15
  /**
10
16
  * Run a lifecycle `on*` hook. Failures become {@link errors.internalError}
11
17
  * (or preserve an existing APIError).
12
18
  */
13
19
  export declare function runLifecycleHook<T extends {
14
20
  request: Request;
15
- }>(hook: ((context: T) => Promise<void> | void) | undefined, context: T): Promise<void>;
21
+ }>(hook: ((context: T) => Promise<void> | void) | undefined, context: T, config?: Pick<ResolvedDimahS3Config, "logger" | "onError">): Promise<void>;
16
22
  //# sourceMappingURL=hooks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/helpers/hooks.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,CAAC,SAAS;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,EAC1D,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,SAAS,EACxD,OAAO,EAAE,CAAC,GACT,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,SAAS;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,EACnE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,SAAS,EACxD,OAAO,EAAE,CAAC,GACT,OAAO,CAAC,IAAI,CAAC,CASf"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/helpers/hooks.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,qBAAqB,EACrB,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAajB;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,CAAC,SAAS;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,EAC1D,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,SAAS,EACxD,OAAO,EAAE,CAAC,GACT,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,YAAY,CAAC,QAAQ,CAAC,EAC5B,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAOlC;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,SAAS;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,EACnE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,SAAS,EACxD,OAAO,EAAE,CAAC,EACV,MAAM,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,QAAQ,GAAG,SAAS,CAAC,GACzD,OAAO,CAAC,IAAI,CAAC,CAUf"}
@@ -1,14 +1,17 @@
1
+ export { abortMultipartBestEffort, deleteObjectBestEffort, } from "./best-effort";
1
2
  export { isAwsNotFound, sendOrObjectNotFound } from "./is-aws-not-found";
2
- export { resolveObjectAcl } from "./resolve-object-acl";
3
- export { resolveRequestAcl } from "./resolve-request-acl";
4
- export type { AclPolicy } from "./resolve-request-acl";
5
3
  export { normalizeExpiresIn } from "./expires";
6
- export { runHook, runLifecycleHook } from "./hooks";
4
+ export { runHook, runLifecycleHook, runObjectHook } from "./hooks";
5
+ export { isEnabled, isFeatureOn, normalizeFeature, normalizeRoute, normalizeRoutes, } from "./features";
7
6
  export { requestFromHeaders } from "./request";
8
- export { assertSafeObjectKey, resolveBucket, resolveObjectKey, resolveRequestTarget, } from "./resolve-target";
9
- export type { KeyPolicy } from "./resolve-target";
7
+ export { assertSafeObjectKey, assertStoredKey, generateObjectKey, nestKeyUnderPrefix, normalizeObjectKey, resolveStoredTarget, resolveUploadTarget, } from "./resolve-target";
8
+ export type { ResolvedObject } from "./resolve-target";
9
+ export { assertFeatureEnabled, getResolvedRoute, openRoute, openStoredTarget, openUploadTarget, storedObjectContext, } from "./resolve-route";
10
+ export type { OpenedTarget, OpenedUploadTarget, OpenUploadInput, } from "./resolve-route";
11
+ export { assertDeclaredConstraints, assertVerifiedConstraints, assertWithinMaxFileSize, } from "./constraints";
10
12
  export { headObjectAfterMultipartComplete, headObjectOrNotFound, requireContentLength, } from "./head-object";
11
- export { listAllParts } from "./list-parts";
12
- export { applyMultipartDefault, assertExclusiveBucketFlags, isFeatureEnabled, normalizeFeature, normalizeFeatures, } from "./features";
13
- export type { NormalizedFeatures } from "./features";
13
+ export { listAllParts, listedPartsByteSize } from "./list-parts";
14
+ export { resolveLogger, defaultLogger } from "./logger";
15
+ export { finalizeConfirmedObject } from "./finalize-confirmed";
16
+ export { DIMAH_PREVIOUS_KEY_META, previousKeyFromMetadata, stripPreviousKeyMeta, } from "./previous-key";
14
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EACL,gCAAgC,EAChC,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EACL,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,gCAAgC,EAChC,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC"}
@@ -5,4 +5,9 @@ export declare function listAllParts(client: S3Client, input: {
5
5
  key: string;
6
6
  uploadId: string;
7
7
  }): Promise<Part[]>;
8
+ /** Sum `Size` on listed parts. Pass `excludePartNumber` when replacing a part. */
9
+ export declare function listedPartsByteSize(parts: readonly {
10
+ PartNumber?: number;
11
+ Size?: number;
12
+ }[], excludePartNumber?: number): number;
8
13
  //# sourceMappingURL=list-parts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"list-parts.d.ts","sourceRoot":"","sources":["../../src/helpers/list-parts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAGhF,6DAA6D;AAC7D,wBAAsB,YAAY,CAChC,MAAM,EAAE,QAAQ,EAChB,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACvD,OAAO,CAAC,IAAI,EAAE,CAAC,CAsBjB"}
1
+ {"version":3,"file":"list-parts.d.ts","sourceRoot":"","sources":["../../src/helpers/list-parts.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,IAAI,EACT,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAC;AAG5B,6DAA6D;AAC7D,wBAAsB,YAAY,CAChC,MAAM,EAAE,QAAQ,EAChB,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACvD,OAAO,CAAC,IAAI,EAAE,CAAC,CAsBjB;AAED,kFAAkF;AAClF,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,EACxD,iBAAiB,CAAC,EAAE,MAAM,GACzB,MAAM,CAYR"}
@@ -0,0 +1,4 @@
1
+ import type { DimahS3Logger } from "../types";
2
+ export declare const defaultLogger: DimahS3Logger;
3
+ export declare function resolveLogger(logger: DimahS3Logger | false | undefined): DimahS3Logger;
4
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/helpers/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,eAAO,MAAM,aAAa,EAAE,aAO3B,CAAC;AAEF,wBAAgB,aAAa,CAC3B,MAAM,EAAE,aAAa,GAAG,KAAK,GAAG,SAAS,GACxC,aAAa,CAIf"}
@@ -0,0 +1,5 @@
1
+ /** S3 user-metadata key for `upload.object().previousKey`. */
2
+ export declare const DIMAH_PREVIOUS_KEY_META = "dimah-previous-key";
3
+ export declare function stripPreviousKeyMeta(metadata: Record<string, string> | undefined): Record<string, string>;
4
+ export declare function previousKeyFromMetadata(metadata: Record<string, string> | undefined): string | undefined;
5
+ //# sourceMappingURL=previous-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"previous-key.d.ts","sourceRoot":"","sources":["../../src/helpers/previous-key.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,eAAO,MAAM,uBAAuB,uBAAuB,CAAC;AAE5D,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAC3C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIxB;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAC3C,MAAM,GAAG,SAAS,CAGpB"}
@@ -0,0 +1,36 @@
1
+ import type { S3ObjectAcl } from "@dimah-s3/core";
2
+ import type { OpenedRoute, ResolvedDimahS3Config, ResolvedRoute, RouteOperation, StoredObjectContext } from "../types";
3
+ export type OpenedTarget<F extends RouteOperation> = {
4
+ route: OpenedRoute<F>;
5
+ key: string;
6
+ bucket: string;
7
+ stored: StoredObjectContext;
8
+ };
9
+ export type OpenedUploadTarget<F extends "upload" | "multipart"> = OpenedTarget<F> & {
10
+ metadata?: Record<string, string>;
11
+ acl: S3ObjectAcl;
12
+ };
13
+ export type OpenUploadInput = {
14
+ route: string;
15
+ fileName: string;
16
+ fileSize: number;
17
+ contentType?: string;
18
+ metadata?: Record<string, string>;
19
+ };
20
+ export declare function getResolvedRoute(config: ResolvedDimahS3Config, name: string): ResolvedRoute;
21
+ /** Disabled features respond 404 (`FEATURE_DISABLED`) from both HTTP and `s3.api`. */
22
+ export declare function assertFeatureEnabled<F extends RouteOperation>(route: ResolvedRoute, feature: F): asserts route is OpenedRoute<F>;
23
+ /** Lookup the named route, reject a disabled feature, run the route `guard`. */
24
+ export declare function openRoute<F extends RouteOperation>(config: ResolvedDimahS3Config, name: string, request: Request, feature: F): Promise<OpenedRoute<F>>;
25
+ export declare function storedObjectContext(request: Request, route: Pick<ResolvedRoute, "name" | "bucket">, key: string): StoredObjectContext;
26
+ /**
27
+ * {@link openRoute} plus file constraints and server-owned key generation.
28
+ * Used by upload presign and multipart init.
29
+ */
30
+ export declare function openUploadTarget<F extends "upload" | "multipart">(config: ResolvedDimahS3Config, input: OpenUploadInput, request: Request, feature: F): Promise<OpenedUploadTarget<F>>;
31
+ /** {@link openRoute} plus the stored-key namespace check. */
32
+ export declare function openStoredTarget<F extends RouteOperation>(config: ResolvedDimahS3Config, input: {
33
+ route: string;
34
+ key: string;
35
+ }, request: Request, feature: F): Promise<OpenedTarget<F>>;
36
+ //# sourceMappingURL=resolve-route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-route.d.ts","sourceRoot":"","sources":["../../src/helpers/resolve-route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAQlD,OAAO,KAAK,EACV,WAAW,EACX,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,cAAc,IAAI;IACnD,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,mBAAmB,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,QAAQ,GAAG,WAAW,IAC7D,YAAY,CAAC,CAAC,CAAC,GAAG;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,GAAG,EAAE,WAAW,CAAC;CAClB,CAAC;AAEJ,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC,CAAC;AAEF,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,qBAAqB,EAC7B,IAAI,EAAE,MAAM,GACX,aAAa,CAMf;AAUD,sFAAsF;AACtF,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,cAAc,EAC3D,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,CAAC,GACT,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAIjC;AAED,gFAAgF;AAChF,wBAAsB,SAAS,CAAC,CAAC,SAAS,cAAc,EACtD,MAAM,EAAE,qBAAqB,EAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,CAAC,GACT,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAKzB;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,QAAQ,CAAC,EAC7C,GAAG,EAAE,MAAM,GACV,mBAAmB,CAErB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,SAAS,QAAQ,GAAG,WAAW,EACrE,MAAM,EAAE,qBAAqB,EAC7B,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,CAAC,GACT,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAwBhC;AAED,6DAA6D;AAC7D,wBAAsB,gBAAgB,CAAC,CAAC,SAAS,cAAc,EAC7D,MAAM,EAAE,qBAAqB,EAC7B,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EACrC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,CAAC,GACT,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAQ1B"}
@@ -1,20 +1,31 @@
1
- import type { KeyPolicy, ResolvedDimahS3Config, ResolveKeyContext } from "../types";
2
- export type { KeyPolicy };
1
+ import { normalizeObjectKey, type S3ObjectAcl } from "@dimah-s3/core";
2
+ import type { OpenedRoute, ResolvedRoute, UploadObjectContext } from "../types";
3
+ export type ResolvedObject = {
4
+ key: string;
5
+ bucket: string;
6
+ metadata?: Record<string, string>;
7
+ acl: S3ObjectAcl;
8
+ };
9
+ type RouteKeyPrefix = ResolvedRoute["keyPrefix"];
3
10
  /**
4
- * Normalize a client-proposed object key: strip leading slashes, reject
5
- * `.` / `..` segments, NUL, and backslashes.
11
+ * Strip leading/trailing slashes and reject `.` / `..` / empty segments,
12
+ * NUL, and backslashes. Returns `null` when the key is unsafe.
13
+ */
14
+ export { normalizeObjectKey };
15
+ /**
16
+ * Normalize an object key: strip leading slashes, reject `.` / `..` segments,
17
+ * NUL, and backslashes.
6
18
  */
7
19
  export declare function assertSafeObjectKey(key: string): string;
8
- export declare function resolveObjectKey(policy: KeyPolicy | undefined, context: ResolveKeyContext): Promise<string>;
9
- export declare function resolveBucket(config: ResolvedDimahS3Config, requested?: string): string;
10
- export declare function resolveRequestTarget(config: ResolvedDimahS3Config, policy: KeyPolicy | undefined, input: {
11
- request: Request;
12
- key: string;
13
- bucket?: string;
14
- fileName?: string;
15
- contentType?: string;
16
- }): Promise<{
20
+ /** Nest `key` under `keyPrefix`. `false` leaves a safe key unchanged. */
21
+ export declare function nestKeyUnderPrefix(keyPrefix: RouteKeyPrefix, key: string): string;
22
+ /** Confirm / download / delete / multipart follow-ups: stored key + namespace. */
23
+ export declare function assertStoredKey(key: string, keyPrefix: RouteKeyPrefix): string;
24
+ /** `{folder}/{uuid}/{sanitizedName}` — omit `folder` (`false`) for `{uuid}/{name}`. */
25
+ export declare function generateObjectKey(folder: string | false, fileName: string): string;
26
+ export declare function resolveUploadTarget(route: OpenedRoute<"upload" | "multipart">, context: Omit<UploadObjectContext, "bucket" | "keyPrefix">): Promise<ResolvedObject>;
27
+ export declare function resolveStoredTarget(route: ResolvedRoute, key: string): {
17
28
  key: string;
18
29
  bucket: string;
19
- }>;
30
+ };
20
31
  //# sourceMappingURL=resolve-target.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-target.d.ts","sourceRoot":"","sources":["../../src/helpers/resolve-target.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EACT,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAavD;AASD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,SAAS,GAAG,SAAS,EAC7B,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,qBAAqB,EAC7B,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAQR;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,qBAAqB,EAC7B,MAAM,EAAE,SAAS,GAAG,SAAS,EAC7B,KAAK,EAAE;IACL,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GACA,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAU1C"}
1
+ {"version":3,"file":"resolve-target.d.ts","sourceRoot":"","sources":["../../src/helpers/resolve-target.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAElB,KAAK,WAAW,EACjB,MAAM,gBAAgB,CAAC;AAIxB,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,mBAAmB,EAEpB,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,GAAG,EAAE,WAAW,CAAC;CAClB,CAAC;AAEF,KAAK,cAAc,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;AAEjD;;;GAGG;AACH,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIvD;AAUD,yEAAyE;AACzE,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,cAAc,EACzB,GAAG,EAAE,MAAM,GACV,MAAM,CAIR;AAED,kFAAkF;AAClF,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,cAAc,GACxB,MAAM,CAMR;AAgBD,uFAAuF;AACvF,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,GAAG,KAAK,EACtB,QAAQ,EAAE,MAAM,GACf,MAAM,CAIR;AASD,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,WAAW,CAAC,QAAQ,GAAG,WAAW,CAAC,EAC1C,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,QAAQ,GAAG,WAAW,CAAC,GACzD,OAAO,CAAC,cAAc,CAAC,CAgCzB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,MAAM,GACV;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAKjC"}
package/dist/index.d.ts CHANGED
@@ -1,10 +1,15 @@
1
1
  export { dimahS3 } from "./dimah-s3";
2
+ export { putObject } from "./put";
3
+ export type { PutObjectInput } from "./put";
2
4
  export type { DimahS3, DimahS3Api, MultipartAliasApi } from "./dimah-s3";
5
+ export { route } from "./route";
3
6
  export { DimahS3Error, errors, isAPIError, isDimahS3Error, isS3ErrorCode, S3_ERROR_CODES, } from "./errors";
4
7
  export type { ServerErrors } from "./errors";
5
8
  export { createS3Endpoint, createS3Middleware } from "./api";
6
9
  export type { S3EndpointContext } from "./api";
7
- export { definePlugin } from "./plugin";
10
+ export { chainHooks, definePlugin } from "./plugin";
8
11
  export type { DimahS3Plugin, DimahS3PluginHooks, PluginContextMap, PluginEndpointMap, PluginInitEnv, } from "./plugin";
9
- export type { DimahS3Config, DownloadConfig, DeleteConfig, FeatureToggle, KeyPolicy, KeyPrefix, MultipartConfig, ResolveKeyContext, ResolvedDimahS3Config, UploadConfig, } from "./types";
12
+ export { ROUTE_FEATURES, ROUTE_OPERATIONS } from "./types";
13
+ export { isFeatureOn } from "./helpers";
14
+ export type { DeleteConfig, DeleteGuardContext, DeleteOnDeletedContext, DimahS3Config, DimahS3Logger, DimahS3RouteConfig, DisabledFeature, DownloadConfig, DownloadGuardContext, DownloadOnPresignedContext, DownloadResolveInfo, EnabledFeature, EnabledUploadConfig, FeatureToggle, GuardContext, MultipartConfig, MultipartOnAbortContext, MultipartOnInitContext, MultipartOnListContext, MultipartGuardContext, MultipartUploadContext, ObjectFile, OpenedRoute, ResolvedDimahS3Config, ResolvedFeature, ResolvedRoute, ResolvedUploadConfig, RouteFeature, RouteGuardContext, RouteOperation, StoredObjectContext, UploadConfig, UploadConfirmGuardContext, UploadGuardContext, UploadObjectContext, UploadObjectInfo, UploadOnConfirmedContext, UploadOnPresignedContext, } from "./types";
10
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,EACL,YAAY,EACZ,MAAM,EACN,UAAU,EACV,cAAc,EACd,aAAa,EACb,cAAc,GACf,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAC7D,YAAY,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,GACd,MAAM,UAAU,CAAC;AAElB,YAAY,EACV,aAAa,EACb,cAAc,EACd,YAAY,EACZ,aAAa,EACb,SAAS,EACT,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,GACb,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,YAAY,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAC5C,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EACL,YAAY,EACZ,MAAM,EACN,UAAU,EACV,cAAc,EACd,aAAa,EACb,cAAc,GACf,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAC7D,YAAY,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACpD,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,GACd,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,eAAe,EACf,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,UAAU,EACV,WAAW,EACX,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,YAAY,EACZ,yBAAyB,EACzB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,SAAS,CAAC"}