@relkit/providers-local 0.0.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 (223) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +40 -0
  3. package/dist/buckets/index.d.ts +5 -0
  4. package/dist/buckets/index.d.ts.map +1 -0
  5. package/dist/buckets/index.js +5 -0
  6. package/dist/buckets/index.js.map +1 -0
  7. package/dist/buckets/keys.d.ts +7 -0
  8. package/dist/buckets/keys.d.ts.map +1 -0
  9. package/dist/buckets/keys.js +60 -0
  10. package/dist/buckets/keys.js.map +1 -0
  11. package/dist/buckets/operations.d.ts +11 -0
  12. package/dist/buckets/operations.d.ts.map +1 -0
  13. package/dist/buckets/operations.js +89 -0
  14. package/dist/buckets/operations.js.map +1 -0
  15. package/dist/buckets/pagination.d.ts +5 -0
  16. package/dist/buckets/pagination.d.ts.map +1 -0
  17. package/dist/buckets/pagination.js +34 -0
  18. package/dist/buckets/pagination.js.map +1 -0
  19. package/dist/buckets/policy.d.ts +8 -0
  20. package/dist/buckets/policy.d.ts.map +1 -0
  21. package/dist/buckets/policy.js +74 -0
  22. package/dist/buckets/policy.js.map +1 -0
  23. package/dist/buckets/provider.d.ts +4 -0
  24. package/dist/buckets/provider.d.ts.map +1 -0
  25. package/dist/buckets/provider.js +119 -0
  26. package/dist/buckets/provider.js.map +1 -0
  27. package/dist/buckets/storage.d.ts +12 -0
  28. package/dist/buckets/storage.d.ts.map +1 -0
  29. package/dist/buckets/storage.js +169 -0
  30. package/dist/buckets/storage.js.map +1 -0
  31. package/dist/buckets/types.d.ts +91 -0
  32. package/dist/buckets/types.d.ts.map +1 -0
  33. package/dist/buckets/types.js +34 -0
  34. package/dist/buckets/types.js.map +1 -0
  35. package/dist/cache/index.d.ts +8 -0
  36. package/dist/cache/index.d.ts.map +1 -0
  37. package/dist/cache/index.js +8 -0
  38. package/dist/cache/index.js.map +1 -0
  39. package/dist/cache/inspector.d.ts +4 -0
  40. package/dist/cache/inspector.d.ts.map +1 -0
  41. package/dist/cache/inspector.js +62 -0
  42. package/dist/cache/inspector.js.map +1 -0
  43. package/dist/cache/keys.d.ts +6 -0
  44. package/dist/cache/keys.d.ts.map +1 -0
  45. package/dist/cache/keys.js +34 -0
  46. package/dist/cache/keys.js.map +1 -0
  47. package/dist/cache/persistence.d.ts +5 -0
  48. package/dist/cache/persistence.d.ts.map +1 -0
  49. package/dist/cache/persistence.js +108 -0
  50. package/dist/cache/persistence.js.map +1 -0
  51. package/dist/cache/policy.d.ts +9 -0
  52. package/dist/cache/policy.d.ts.map +1 -0
  53. package/dist/cache/policy.js +64 -0
  54. package/dist/cache/policy.js.map +1 -0
  55. package/dist/cache/provider.d.ts +3 -0
  56. package/dist/cache/provider.d.ts.map +1 -0
  57. package/dist/cache/provider.js +164 -0
  58. package/dist/cache/provider.js.map +1 -0
  59. package/dist/cache/store.d.ts +44 -0
  60. package/dist/cache/store.d.ts.map +1 -0
  61. package/dist/cache/store.js +132 -0
  62. package/dist/cache/store.js.map +1 -0
  63. package/dist/cache/types.d.ts +100 -0
  64. package/dist/cache/types.d.ts.map +1 -0
  65. package/dist/cache/types.js +39 -0
  66. package/dist/cache/types.js.map +1 -0
  67. package/dist/cache/write.d.ts +5 -0
  68. package/dist/cache/write.d.ts.map +1 -0
  69. package/dist/cache/write.js +13 -0
  70. package/dist/cache/write.js.map +1 -0
  71. package/dist/events/admin-actions.d.ts +7 -0
  72. package/dist/events/admin-actions.d.ts.map +1 -0
  73. package/dist/events/admin-actions.js +28 -0
  74. package/dist/events/admin-actions.js.map +1 -0
  75. package/dist/events/admin-contracts.d.ts +132 -0
  76. package/dist/events/admin-contracts.d.ts.map +1 -0
  77. package/dist/events/admin-contracts.js +4 -0
  78. package/dist/events/admin-contracts.js.map +1 -0
  79. package/dist/events/admin-errors.d.ts +5 -0
  80. package/dist/events/admin-errors.d.ts.map +1 -0
  81. package/dist/events/admin-errors.js +9 -0
  82. package/dist/events/admin-errors.js.map +1 -0
  83. package/dist/events/admin-state.d.ts +8 -0
  84. package/dist/events/admin-state.d.ts.map +1 -0
  85. package/dist/events/admin-state.js +10 -0
  86. package/dist/events/admin-state.js.map +1 -0
  87. package/dist/events/admin-utils.d.ts +27 -0
  88. package/dist/events/admin-utils.d.ts.map +1 -0
  89. package/dist/events/admin-utils.js +153 -0
  90. package/dist/events/admin-utils.js.map +1 -0
  91. package/dist/events/admin.d.ts +22 -0
  92. package/dist/events/admin.d.ts.map +1 -0
  93. package/dist/events/admin.js +92 -0
  94. package/dist/events/admin.js.map +1 -0
  95. package/dist/events/delivery-types.d.ts +74 -0
  96. package/dist/events/delivery-types.d.ts.map +1 -0
  97. package/dist/events/delivery-types.js +9 -0
  98. package/dist/events/delivery-types.js.map +1 -0
  99. package/dist/events/delivery-utils.d.ts +17 -0
  100. package/dist/events/delivery-utils.d.ts.map +1 -0
  101. package/dist/events/delivery-utils.js +133 -0
  102. package/dist/events/delivery-utils.js.map +1 -0
  103. package/dist/events/delivery.d.ts +6 -0
  104. package/dist/events/delivery.d.ts.map +1 -0
  105. package/dist/events/delivery.js +159 -0
  106. package/dist/events/delivery.js.map +1 -0
  107. package/dist/events/ephemeral.d.ts +36 -0
  108. package/dist/events/ephemeral.d.ts.map +1 -0
  109. package/dist/events/ephemeral.js +61 -0
  110. package/dist/events/ephemeral.js.map +1 -0
  111. package/dist/events/log.d.ts +37 -0
  112. package/dist/events/log.d.ts.map +1 -0
  113. package/dist/events/log.js +121 -0
  114. package/dist/events/log.js.map +1 -0
  115. package/dist/events/provider.d.ts +9 -0
  116. package/dist/events/provider.d.ts.map +1 -0
  117. package/dist/events/provider.js +37 -0
  118. package/dist/events/provider.js.map +1 -0
  119. package/dist/events/router-inspection.d.ts +18 -0
  120. package/dist/events/router-inspection.d.ts.map +1 -0
  121. package/dist/events/router-inspection.js +110 -0
  122. package/dist/events/router-inspection.js.map +1 -0
  123. package/dist/events/router-records.d.ts +34 -0
  124. package/dist/events/router-records.d.ts.map +1 -0
  125. package/dist/events/router-records.js +98 -0
  126. package/dist/events/router-records.js.map +1 -0
  127. package/dist/events/router-types.d.ts +83 -0
  128. package/dist/events/router-types.d.ts.map +1 -0
  129. package/dist/events/router-types.js +2 -0
  130. package/dist/events/router-types.js.map +1 -0
  131. package/dist/events/router.d.ts +7 -0
  132. package/dist/events/router.d.ts.map +1 -0
  133. package/dist/events/router.js +148 -0
  134. package/dist/events/router.js.map +1 -0
  135. package/dist/factory.d.ts +26 -0
  136. package/dist/factory.d.ts.map +1 -0
  137. package/dist/factory.js +66 -0
  138. package/dist/factory.js.map +1 -0
  139. package/dist/index.d.ts +18 -0
  140. package/dist/index.d.ts.map +1 -0
  141. package/dist/index.js +15 -0
  142. package/dist/index.js.map +1 -0
  143. package/dist/jobs/admin-contracts.d.ts +66 -0
  144. package/dist/jobs/admin-contracts.d.ts.map +1 -0
  145. package/dist/jobs/admin-contracts.js +4 -0
  146. package/dist/jobs/admin-contracts.js.map +1 -0
  147. package/dist/jobs/admin-errors.d.ts +5 -0
  148. package/dist/jobs/admin-errors.d.ts.map +1 -0
  149. package/dist/jobs/admin-errors.js +9 -0
  150. package/dist/jobs/admin-errors.js.map +1 -0
  151. package/dist/jobs/admin-utils.d.ts +29 -0
  152. package/dist/jobs/admin-utils.d.ts.map +1 -0
  153. package/dist/jobs/admin-utils.js +138 -0
  154. package/dist/jobs/admin-utils.js.map +1 -0
  155. package/dist/jobs/admin.d.ts +25 -0
  156. package/dist/jobs/admin.d.ts.map +1 -0
  157. package/dist/jobs/admin.js +89 -0
  158. package/dist/jobs/admin.js.map +1 -0
  159. package/dist/jobs/cron.d.ts +10 -0
  160. package/dist/jobs/cron.d.ts.map +1 -0
  161. package/dist/jobs/cron.js +18 -0
  162. package/dist/jobs/cron.js.map +1 -0
  163. package/dist/jobs/idempotency.d.ts +18 -0
  164. package/dist/jobs/idempotency.d.ts.map +1 -0
  165. package/dist/jobs/idempotency.js +82 -0
  166. package/dist/jobs/idempotency.js.map +1 -0
  167. package/dist/jobs/lease-utils.d.ts +9 -0
  168. package/dist/jobs/lease-utils.d.ts.map +1 -0
  169. package/dist/jobs/lease-utils.js +31 -0
  170. package/dist/jobs/lease-utils.js.map +1 -0
  171. package/dist/jobs/queue-admin.d.ts +12 -0
  172. package/dist/jobs/queue-admin.d.ts.map +1 -0
  173. package/dist/jobs/queue-admin.js +42 -0
  174. package/dist/jobs/queue-admin.js.map +1 -0
  175. package/dist/jobs/queue-entry.d.ts +8 -0
  176. package/dist/jobs/queue-entry.d.ts.map +1 -0
  177. package/dist/jobs/queue-entry.js +130 -0
  178. package/dist/jobs/queue-entry.js.map +1 -0
  179. package/dist/jobs/queue-lease.d.ts +4 -0
  180. package/dist/jobs/queue-lease.d.ts.map +1 -0
  181. package/dist/jobs/queue-lease.js +12 -0
  182. package/dist/jobs/queue-lease.js.map +1 -0
  183. package/dist/jobs/queue-operations.d.ts +16 -0
  184. package/dist/jobs/queue-operations.d.ts.map +1 -0
  185. package/dist/jobs/queue-operations.js +107 -0
  186. package/dist/jobs/queue-operations.js.map +1 -0
  187. package/dist/jobs/queue-recovery.d.ts +5 -0
  188. package/dist/jobs/queue-recovery.d.ts.map +1 -0
  189. package/dist/jobs/queue-recovery.js +22 -0
  190. package/dist/jobs/queue-recovery.js.map +1 -0
  191. package/dist/jobs/queue-utils.d.ts +101 -0
  192. package/dist/jobs/queue-utils.d.ts.map +1 -0
  193. package/dist/jobs/queue-utils.js +28 -0
  194. package/dist/jobs/queue-utils.js.map +1 -0
  195. package/dist/jobs/queue.d.ts +7 -0
  196. package/dist/jobs/queue.d.ts.map +1 -0
  197. package/dist/jobs/queue.js +70 -0
  198. package/dist/jobs/queue.js.map +1 -0
  199. package/dist/jobs/retry.d.ts +25 -0
  200. package/dist/jobs/retry.d.ts.map +1 -0
  201. package/dist/jobs/retry.js +84 -0
  202. package/dist/jobs/retry.js.map +1 -0
  203. package/dist/jobs/scheduler.d.ts +52 -0
  204. package/dist/jobs/scheduler.d.ts.map +1 -0
  205. package/dist/jobs/scheduler.js +122 -0
  206. package/dist/jobs/scheduler.js.map +1 -0
  207. package/dist/jobs/store-files.d.ts +20 -0
  208. package/dist/jobs/store-files.d.ts.map +1 -0
  209. package/dist/jobs/store-files.js +177 -0
  210. package/dist/jobs/store-files.js.map +1 -0
  211. package/dist/jobs/store.d.ts +60 -0
  212. package/dist/jobs/store.d.ts.map +1 -0
  213. package/dist/jobs/store.js +97 -0
  214. package/dist/jobs/store.js.map +1 -0
  215. package/dist/runtime-capabilities.d.ts +17 -0
  216. package/dist/runtime-capabilities.d.ts.map +1 -0
  217. package/dist/runtime-capabilities.js +32 -0
  218. package/dist/runtime-capabilities.js.map +1 -0
  219. package/dist/state.d.ts +15 -0
  220. package/dist/state.d.ts.map +1 -0
  221. package/dist/state.js +69 -0
  222. package/dist/state.js.map +1 -0
  223. package/package.json +47 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 rel-kit
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,40 @@
1
+ # @relkit/providers-local
2
+
3
+ Local generations own `.relkit/state/buckets` and `.relkit/state/cache` (or the
4
+ configured state root). Bucket objects and cache snapshots use atomic commits;
5
+ malformed records are moved into a provider-owned `.relkit-quarantine` directory
6
+ and do not prevent the rest of the generation from starting.
7
+
8
+ The local cache remains bounded and generation-local. Direct construction
9
+ without `stateRoot` is memory-only; generation startup supplies a profile root,
10
+ enables restart recovery, and reports `persistence: "restart-recovery"`.
11
+ Canonical cache keys, deterministic clock expiry, LRU bounds, and the
12
+ metadata-only `onSnapshot` hook remain unchanged. Provider objects expose typed
13
+ bucket/cache operations only; application code does not receive file readers.
14
+
15
+ Durable job queue entries retain validated idempotency keys for their configured
16
+ retention. A duplicate enqueue returns the retained instance and acceptance
17
+ metadata; delivery remains at-least-once after the record expires or an
18
+ acknowledgement gap.
19
+
20
+ Ephemeral event delivery is memory-only and has no restart recovery. Each
21
+ trigger admits at most 100 simultaneous deliveries by default; the router can
22
+ configure the capacity, drops newest overflow, and reports the capacity/drop
23
+ policy instead of creating a hidden backlog or recovery claim.
24
+
25
+ Durable event delivery reuses the job store/queue/retry seams for one trigger
26
+ ledger. Accepted envelopes are available only after durable append, handler
27
+ success is acknowledged through a completed transition, expired leases recover
28
+ after restart, and retries become delayed or dead-lettered with safe failure
29
+ metadata. Delivery is at-least-once, exactly-once is false, and per-key
30
+ ordering is explicitly unsupported.
31
+
32
+ The local event admin contract is versioned and inspector-safe: queries expose
33
+ event contracts, selector expansions, publication metadata, delivery state,
34
+ dead letters, and honest capability flags without payload projection. Only a
35
+ validated local dead-letter retry is mutating; it is disabled in production and
36
+ records an audit action.
37
+
38
+ Agent tests use the `ai/test` `MockLanguageModelV3` surface with a finite script
39
+ of validated tool-call, final, error, or cancelled turns. Its recorded calls
40
+ make merge-blocking tests deterministic without model network calls.
@@ -0,0 +1,5 @@
1
+ export * from "./keys.js";
2
+ export * from "./pagination.js";
3
+ export * from "./provider.js";
4
+ export * from "./types.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/buckets/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from "./keys.js";
2
+ export * from "./pagination.js";
3
+ export * from "./provider.js";
4
+ export * from "./types.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/buckets/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,7 @@
1
+ /** Validates an object key without normalizing away an attempted escape. */
2
+ export declare function normalizeBucketKey(value: unknown): string;
3
+ /** Validates a list prefix while allowing the conventional trailing slash. */
4
+ export declare function normalizeBucketPrefix(value: unknown): string;
5
+ export declare function encodeBucketKey(key: string): string;
6
+ export declare function assertContainedPath(root: string, candidate: string): void;
7
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/buckets/keys.ts"],"names":[],"mappings":"AAMA,4EAA4E;AAC5E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAmBzD;AAED,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAwB5D;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAGzE"}
@@ -0,0 +1,60 @@
1
+ import { isAbsolute, relative, resolve } from "node:path";
2
+ import { LOCAL_BUCKET_RESERVED_PREFIXES, LocalBucketKeyError } from "./types.js";
3
+ const WINDOWS_DRIVE = /^[A-Za-z]:/;
4
+ const MAX_KEY_BYTES = 4_096;
5
+ /** Validates an object key without normalizing away an attempted escape. */
6
+ export function normalizeBucketKey(value) {
7
+ if (typeof value !== "string" || value.length === 0)
8
+ throw new LocalBucketKeyError();
9
+ if (value.includes("\0") ||
10
+ value.includes("\\") ||
11
+ isAbsolute(value) ||
12
+ WINDOWS_DRIVE.test(value)) {
13
+ throw new LocalBucketKeyError();
14
+ }
15
+ if (new TextEncoder().encode(value).byteLength > MAX_KEY_BYTES) {
16
+ throw new LocalBucketKeyError();
17
+ }
18
+ const segments = value.split("/");
19
+ if (segments.some((segment) => segment.length === 0 || segment === "." || segment === "..")) {
20
+ throw new LocalBucketKeyError();
21
+ }
22
+ if (isReserved(segments[0]))
23
+ throw new LocalBucketKeyError();
24
+ return value;
25
+ }
26
+ /** Validates a list prefix while allowing the conventional trailing slash. */
27
+ export function normalizeBucketPrefix(value) {
28
+ if (value === undefined || value === "")
29
+ return "";
30
+ if (typeof value !== "string")
31
+ throw new LocalBucketKeyError();
32
+ if (value.includes("\0") ||
33
+ value.includes("\\") ||
34
+ isAbsolute(value) ||
35
+ WINDOWS_DRIVE.test(value)) {
36
+ throw new LocalBucketKeyError();
37
+ }
38
+ const segments = value.split("/");
39
+ if (segments.some((segment, index) => (segment.length === 0 && index !== segments.length - 1) ||
40
+ segment === "." ||
41
+ segment === "..")) {
42
+ throw new LocalBucketKeyError();
43
+ }
44
+ if (isReserved(segments[0]))
45
+ throw new LocalBucketKeyError();
46
+ return value;
47
+ }
48
+ export function encodeBucketKey(key) {
49
+ return Buffer.from(key, "utf8").toString("base64url");
50
+ }
51
+ export function assertContainedPath(root, candidate) {
52
+ const path = relative(resolve(root), resolve(candidate));
53
+ if (path === "" || path.startsWith("..") || isAbsolute(path))
54
+ throw new LocalBucketKeyError();
55
+ }
56
+ function isReserved(segment) {
57
+ return (segment !== undefined &&
58
+ LOCAL_BUCKET_RESERVED_PREFIXES.some((prefix) => segment.startsWith(prefix)));
59
+ }
60
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/buckets/keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type BucketOperationContext, type BucketPutOptions } from "@relkit/buckets";
2
+ import type { LocalBucketStorage } from "./storage.js";
3
+ import { type LocalBucketObjectMetadata, type LocalBucketPolicy } from "./types.js";
4
+ export declare function putObject(storage: LocalBucketStorage, policy: Readonly<LocalBucketPolicy>, key: string, bytes: Uint8Array, options: BucketPutOptions | undefined, context: BucketOperationContext | undefined, open: () => void): Promise<void>;
5
+ export declare function getObject(storage: LocalBucketStorage, key: string, context: BucketOperationContext | undefined, open: () => void): Promise<Uint8Array | undefined>;
6
+ export declare function headObject(storage: LocalBucketStorage, key: string, context: BucketOperationContext | undefined, open: () => void): Promise<LocalBucketObjectMetadata | undefined>;
7
+ export declare function deleteObject(storage: LocalBucketStorage, key: string, context: BucketOperationContext | undefined, open: () => void): Promise<void>;
8
+ export declare function existsObject(storage: LocalBucketStorage, key: string, context: BucketOperationContext | undefined, open: () => void): Promise<boolean>;
9
+ export declare function listKeys(storage: LocalBucketStorage, prefix: string): Promise<string[]>;
10
+ export declare function assertActive(context?: BucketOperationContext): void;
11
+ //# sourceMappingURL=operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/buckets/operations.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACtB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAEL,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,EAEvB,MAAM,YAAY,CAAC;AAEpB,wBAAsB,SAAS,CAC7B,OAAO,EAAE,kBAAkB,EAC3B,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACnC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,gBAAgB,GAAG,SAAS,EACrC,OAAO,EAAE,sBAAsB,GAAG,SAAS,EAC3C,IAAI,EAAE,MAAM,IAAI,GACf,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,kBAAkB,EAC3B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,sBAAsB,GAAG,SAAS,EAC3C,IAAI,EAAE,MAAM,IAAI,GACf,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAGjC;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,kBAAkB,EAC3B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,sBAAsB,GAAG,SAAS,EAC3C,IAAI,EAAE,MAAM,IAAI,GACf,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC,CAWhD;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,kBAAkB,EAC3B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,sBAAsB,GAAG,SAAS,EAC3C,IAAI,EAAE,MAAM,IAAI,GACf,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,kBAAkB,EAC3B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,sBAAsB,GAAG,SAAS,EAC3C,IAAI,EAAE,MAAM,IAAI,GACf,OAAO,CAAC,OAAO,CAAC,CAElB;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAS7F;AAED,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAKnE"}
@@ -0,0 +1,89 @@
1
+ import { createHash } from "node:crypto";
2
+ import { BucketOperationCancelledError, BucketOperationTimeoutError, } from "@relkit/buckets";
3
+ import { normalizeBucketKey } from "./keys.js";
4
+ import { validatePut } from "./policy.js";
5
+ import { LocalBucketStateError, } from "./types.js";
6
+ export async function putObject(storage, policy, key, bytes, options, context, open) {
7
+ open();
8
+ const normalizedKey = normalizeBucketKey(key);
9
+ assertActive(context);
10
+ if (!(bytes instanceof Uint8Array))
11
+ throw new TypeError("Bucket bytes must be a Uint8Array");
12
+ const copy = new Uint8Array(bytes);
13
+ const prepared = validatePut(copy, options, policy);
14
+ const contentHash = hash(copy);
15
+ await storage.write({
16
+ version: 1,
17
+ key: normalizedKey,
18
+ size: copy.byteLength,
19
+ contentHash,
20
+ etag: contentHash,
21
+ ...prepared,
22
+ data: Buffer.from(copy).toString("base64"),
23
+ });
24
+ }
25
+ export async function getObject(storage, key, context, open) {
26
+ const object = await loadObject(storage, key, context, open);
27
+ return object === undefined ? undefined : decode(object);
28
+ }
29
+ export async function headObject(storage, key, context, open) {
30
+ const object = await loadObject(storage, key, context, open);
31
+ if (object === undefined)
32
+ return undefined;
33
+ decode(object);
34
+ return Object.freeze({
35
+ etag: object.etag,
36
+ contentHash: object.contentHash,
37
+ size: object.size,
38
+ ...(object.contentType === undefined ? {} : { contentType: object.contentType }),
39
+ ...(Object.keys(object.metadata).length === 0 ? {} : { metadata: object.metadata }),
40
+ });
41
+ }
42
+ export async function deleteObject(storage, key, context, open) {
43
+ open();
44
+ const normalizedKey = normalizeBucketKey(key);
45
+ assertActive(context);
46
+ await storage.remove(normalizedKey);
47
+ }
48
+ export async function existsObject(storage, key, context, open) {
49
+ return (await headObject(storage, key, context, open)) !== undefined;
50
+ }
51
+ export async function listKeys(storage, prefix) {
52
+ const objects = await storage.list();
53
+ return objects
54
+ .filter((object) => object.key.startsWith(prefix))
55
+ .map((object) => {
56
+ decode(object);
57
+ return object.key;
58
+ })
59
+ .sort((left, right) => left.localeCompare(right));
60
+ }
61
+ export function assertActive(context) {
62
+ if (context?.signal.aborted)
63
+ throw new BucketOperationCancelledError();
64
+ if (context?.deadlineMs !== undefined && context.deadlineMs <= Date.now()) {
65
+ throw new BucketOperationTimeoutError();
66
+ }
67
+ }
68
+ async function loadObject(storage, key, context, open) {
69
+ open();
70
+ const normalizedKey = normalizeBucketKey(key);
71
+ assertActive(context);
72
+ const object = await storage.read(normalizedKey);
73
+ if (object !== undefined)
74
+ decode(object);
75
+ return object;
76
+ }
77
+ function decode(object) {
78
+ const bytes = new Uint8Array(Buffer.from(object.data, "base64"));
79
+ if (bytes.byteLength !== object.size ||
80
+ hash(bytes) !== object.contentHash ||
81
+ object.etag !== object.contentHash) {
82
+ throw new LocalBucketStateError("Bucket object integrity check failed");
83
+ }
84
+ return bytes;
85
+ }
86
+ function hash(bytes) {
87
+ return `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
88
+ }
89
+ //# sourceMappingURL=operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/buckets/operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type LocalBucketListPage, type LocalBucketListOptions } from "./types.js";
2
+ export declare const DEFAULT_BUCKET_PAGE_SIZE = 100;
3
+ export declare const MAX_BUCKET_PAGE_SIZE = 1000;
4
+ export declare function paginateKeys(keys: readonly string[], prefix: string, options: LocalBucketListOptions | undefined): LocalBucketListPage;
5
+ //# sourceMappingURL=pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/buckets/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC5B,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,oBAAoB,OAAQ,CAAC;AAE1C,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,sBAAsB,GAAG,SAAS,GAC1C,mBAAmB,CAYrB"}
@@ -0,0 +1,34 @@
1
+ import { LocalBucketPaginationError, } from "./types.js";
2
+ export const DEFAULT_BUCKET_PAGE_SIZE = 100;
3
+ export const MAX_BUCKET_PAGE_SIZE = 1_000;
4
+ export function paginateKeys(keys, prefix, options) {
5
+ const limit = options?.limit ?? DEFAULT_BUCKET_PAGE_SIZE;
6
+ if (!Number.isSafeInteger(limit) || limit <= 0 || limit > MAX_BUCKET_PAGE_SIZE) {
7
+ throw new LocalBucketPaginationError();
8
+ }
9
+ const start = options?.cursor === undefined ? 0 : decodeCursor(options.cursor, prefix);
10
+ const items = keys.slice(start, start + limit);
11
+ const nextIndex = start + items.length;
12
+ return Object.freeze({
13
+ items: Object.freeze(items),
14
+ ...(nextIndex < keys.length ? { nextCursor: encodeCursor(prefix, nextIndex) } : {}),
15
+ });
16
+ }
17
+ function encodeCursor(prefix, index) {
18
+ return Buffer.from(JSON.stringify({ prefix, index }), "utf8").toString("base64url");
19
+ }
20
+ function decodeCursor(cursor, prefix) {
21
+ try {
22
+ const value = JSON.parse(Buffer.from(cursor, "base64url").toString("utf8"));
23
+ if (value.prefix !== prefix ||
24
+ !Number.isSafeInteger(value.index) ||
25
+ value.index < 0) {
26
+ throw new Error();
27
+ }
28
+ return value.index;
29
+ }
30
+ catch {
31
+ throw new LocalBucketPaginationError();
32
+ }
33
+ }
34
+ //# sourceMappingURL=pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/buckets/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,GAG3B,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAC5C,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAE1C,MAAM,UAAU,YAAY,CAC1B,IAAuB,EACvB,MAAc,EACd,OAA2C;IAE3C,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,wBAAwB,CAAC;IACzD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,oBAAoB,EAAE,CAAC;QAC/E,MAAM,IAAI,0BAA0B,EAAE,CAAC;IACzC,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IACvC,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QAC3B,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,MAAc,EAAE,KAAa;IACjD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACtF,CAAC;AAED,SAAS,YAAY,CAAC,MAAc,EAAE,MAAc;IAClD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAGzE,CAAC;QACF,IACE,KAAK,CAAC,MAAM,KAAK,MAAM;YACvB,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC;YACjC,KAAK,CAAC,KAAgB,GAAG,CAAC,EAC3B,CAAC;YACD,MAAM,IAAI,KAAK,EAAE,CAAC;QACpB,CAAC;QACD,OAAO,KAAK,CAAC,KAAe,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,0BAA0B,EAAE,CAAC;IACzC,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { BucketPutOptions } from "@relkit/buckets";
2
+ import { type LocalBucketPolicy, type LocalBucketProviderOptions } from "./types.js";
3
+ export declare function normalizePolicy(options: LocalBucketProviderOptions): Readonly<LocalBucketPolicy>;
4
+ export declare function validatePut(bytes: Uint8Array, options: BucketPutOptions | undefined, policy: Readonly<LocalBucketPolicy>): {
5
+ readonly contentType?: string;
6
+ readonly metadata: Readonly<Record<string, string>>;
7
+ };
8
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/buckets/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,0BAA0B,EAChC,MAAM,YAAY,CAAC;AAIpB,wBAAgB,eAAe,CAAC,OAAO,EAAE,0BAA0B,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAgBhG;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,gBAAgB,GAAG,SAAS,EACrC,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAClC;IAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,CAgBxF"}
@@ -0,0 +1,74 @@
1
+ import { LocalBucketPolicyError, } from "./types.js";
2
+ const CONTENT_TYPE = /^(?:[A-Za-z0-9!#$&^_.+-]+|\*)\/(?:[A-Za-z0-9!#$&^_.+-]+|\*)$/;
3
+ export function normalizePolicy(options) {
4
+ const source = options.policy ?? {};
5
+ const maxObjectBytes = options.maxObjectBytes ?? source.maxObjectBytes;
6
+ if (maxObjectBytes !== undefined &&
7
+ (!Number.isSafeInteger(maxObjectBytes) || maxObjectBytes <= 0)) {
8
+ throw new LocalBucketPolicyError("maxObjectBytes must be a positive safe integer");
9
+ }
10
+ const sourceTypes = options.allowedContentTypes ?? source.allowedContentTypes;
11
+ const allowedContentTypes = sourceTypes === undefined ? undefined : normalizeContentTypes(sourceTypes);
12
+ return Object.freeze({
13
+ ...(maxObjectBytes === undefined ? {} : { maxObjectBytes }),
14
+ ...(allowedContentTypes === undefined ? {} : { allowedContentTypes }),
15
+ });
16
+ }
17
+ export function validatePut(bytes, options, policy) {
18
+ const contentType = normalizeContentType(options?.contentType);
19
+ if (policy.maxObjectBytes !== undefined && bytes.byteLength > policy.maxObjectBytes) {
20
+ throw new LocalBucketPolicyError("Bucket object exceeds maxObjectBytes");
21
+ }
22
+ if (policy.allowedContentTypes !== undefined &&
23
+ (contentType === undefined ||
24
+ !policy.allowedContentTypes.some((allowed) => matchesContentType(contentType, allowed)))) {
25
+ throw new LocalBucketPolicyError("Bucket content type is not allowed");
26
+ }
27
+ return {
28
+ ...(contentType === undefined ? {} : { contentType }),
29
+ metadata: normalizeMetadata(options?.metadata),
30
+ };
31
+ }
32
+ function normalizeContentTypes(value) {
33
+ if (!Array.isArray(value) || value.length === 0) {
34
+ throw new LocalBucketPolicyError("allowedContentTypes must not be empty");
35
+ }
36
+ const result = value.map((entry) => {
37
+ if (typeof entry !== "string" || !CONTENT_TYPE.test(entry.trim())) {
38
+ throw new LocalBucketPolicyError("allowedContentTypes contains an invalid MIME type");
39
+ }
40
+ return entry.trim().toLowerCase();
41
+ });
42
+ if (new Set(result).size !== result.length) {
43
+ throw new LocalBucketPolicyError("allowedContentTypes must be unique");
44
+ }
45
+ return Object.freeze(result);
46
+ }
47
+ function normalizeContentType(value) {
48
+ if (value === undefined)
49
+ return undefined;
50
+ if (typeof value !== "string" || !CONTENT_TYPE.test(value.trim())) {
51
+ throw new LocalBucketPolicyError("contentType must be a valid MIME type");
52
+ }
53
+ return value.trim().toLowerCase();
54
+ }
55
+ function normalizeMetadata(value) {
56
+ if (value === undefined)
57
+ return Object.freeze({});
58
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
59
+ throw new LocalBucketPolicyError("metadata must be a string record");
60
+ }
61
+ const entries = Object.entries(value).map(([key, entry]) => {
62
+ if (key.length === 0 || key.includes("\0") || typeof entry !== "string") {
63
+ throw new LocalBucketPolicyError("metadata must contain non-empty string entries");
64
+ }
65
+ return [key, entry];
66
+ });
67
+ return Object.freeze(Object.fromEntries(entries.sort(([a], [b]) => a.localeCompare(b))));
68
+ }
69
+ function matchesContentType(value, allowed) {
70
+ return (allowed === "*/*" ||
71
+ allowed === value ||
72
+ (allowed.endsWith("/*") && value.startsWith(`${allowed.slice(0, -1)}`)));
73
+ }
74
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/buckets/policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type LocalBucketPolicy, type LocalBucketProvider, type LocalBucketProviderOptions } from "./types.js";
2
+ export declare function createLocalBucketProvider(optionsOrRoot: LocalBucketProviderOptions | string, policy?: LocalBucketPolicy): LocalBucketProvider;
3
+ export declare const createLocalBucketProviderForTest: typeof createLocalBucketProvider;
4
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/buckets/provider.ts"],"names":[],"mappings":"AASA,OAAO,EAKL,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAChC,MAAM,YAAY,CAAC;AAWpB,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,0BAA0B,GAAG,MAAM,EAClD,MAAM,CAAC,EAAE,iBAAiB,GACzB,mBAAmB,CAmHrB;AAED,eAAO,MAAM,gCAAgC,kCAA4B,CAAC"}
@@ -0,0 +1,119 @@
1
+ import { BucketCapabilityError, } from "@relkit/buckets";
2
+ import { normalizeBucketKey, normalizeBucketPrefix } from "./keys.js";
3
+ import { paginateKeys } from "./pagination.js";
4
+ import { normalizePolicy } from "./policy.js";
5
+ import { createBucketStorage } from "./storage.js";
6
+ import { LOCAL_BUCKET_CAPABILITIES, LocalBucketStateError, } from "./types.js";
7
+ import { deleteObject, existsObject, getObject, headObject, listKeys, putObject, assertActive, } from "./operations.js";
8
+ export function createLocalBucketProvider(optionsOrRoot, policy) {
9
+ const options = typeof optionsOrRoot === "string"
10
+ ? { root: optionsOrRoot, ...(policy === undefined ? {} : { policy }) }
11
+ : optionsOrRoot;
12
+ const root = options.root ?? options.stateRoot;
13
+ if (root === undefined || root.trim() === "") {
14
+ throw new LocalBucketStateError("Bucket root is required");
15
+ }
16
+ const normalizedPolicy = normalizePolicy(options);
17
+ const defaultPageSize = options.pageSize;
18
+ if (defaultPageSize !== undefined &&
19
+ (!Number.isSafeInteger(defaultPageSize) || defaultPageSize <= 0)) {
20
+ throw new LocalBucketStateError("Bucket pageSize must be a positive safe integer");
21
+ }
22
+ const storage = createBucketStorage(root);
23
+ let closed = false;
24
+ const listPage = async (prefix, options) => {
25
+ ensureOpen(closed);
26
+ const normalizedPrefix = normalizeBucketPrefix(prefix);
27
+ const keys = await listKeys(storage, normalizedPrefix);
28
+ const pageOptions = pageOptionsFor(options, defaultPageSize);
29
+ return paginateKeys(keys, normalizedPrefix, pageOptions);
30
+ };
31
+ const list = (async (prefix, options) => {
32
+ if (isOperationContext(options)) {
33
+ ensureOpen(closed);
34
+ const normalizedPrefix = normalizeBucketPrefix(prefix);
35
+ assertActive(options);
36
+ return Object.freeze(await listKeys(storage, normalizedPrefix));
37
+ }
38
+ if (options !== undefined)
39
+ return listPage(prefix, options);
40
+ ensureOpen(closed);
41
+ const normalizedPrefix = normalizeBucketPrefix(prefix);
42
+ return Object.freeze(await listKeys(storage, normalizedPrefix));
43
+ });
44
+ const close = async () => {
45
+ closed = true;
46
+ };
47
+ const ready = async () => {
48
+ ensureOpen(closed);
49
+ await storage.ready();
50
+ };
51
+ const open = () => ensureOpen(closed);
52
+ const inspector = Object.freeze({
53
+ list: async (request) => {
54
+ if (request.signal.aborted)
55
+ throw request.signal.reason;
56
+ const page = await listPage(request.prefix, {
57
+ limit: request.limit,
58
+ ...(request.cursor === undefined ? {} : { cursor: request.cursor }),
59
+ });
60
+ const items = await Promise.all(page.items.map(async (key) => {
61
+ const metadata = await headObject(storage, key, undefined, open);
62
+ return { key, ...(metadata === undefined ? {} : { metadata }) };
63
+ }));
64
+ return { ...page, items };
65
+ },
66
+ preview: async (request) => {
67
+ if (request.signal.aborted)
68
+ throw request.signal.reason;
69
+ const [metadata, bytes] = await Promise.all([
70
+ headObject(storage, request.key, undefined, open),
71
+ getObject(storage, request.key, undefined, open),
72
+ ]);
73
+ if (metadata === undefined || bytes === undefined)
74
+ return undefined;
75
+ return {
76
+ bytes: bytes.slice(request.offset, request.offset + request.limit),
77
+ metadata,
78
+ totalBytes: bytes.byteLength,
79
+ };
80
+ },
81
+ });
82
+ return Object.freeze({
83
+ capabilities: LOCAL_BUCKET_CAPABILITIES,
84
+ root: storage.root,
85
+ policy: normalizedPolicy,
86
+ put: (key, bytes, options, context) => putObject(storage, normalizedPolicy, key, bytes, options, context, open),
87
+ get: (key, context) => getObject(storage, key, context, open),
88
+ head: (key, context) => headObject(storage, key, context, open),
89
+ delete: (key, context) => deleteObject(storage, key, context, open),
90
+ exists: (key, context) => existsObject(storage, key, context, open),
91
+ list,
92
+ listPage,
93
+ createReadUrl: (key, context) => unsupported("signedReadUrl", "createReadUrl", key, context, open),
94
+ createWriteUrl: (key, context) => unsupported("signedWriteUrl", "createWriteUrl", key, context, open),
95
+ ready,
96
+ close,
97
+ inspector,
98
+ });
99
+ }
100
+ export const createLocalBucketProviderForTest = createLocalBucketProvider;
101
+ function pageOptionsFor(options, defaultPageSize) {
102
+ if (options !== undefined || defaultPageSize === undefined)
103
+ return options;
104
+ return { limit: defaultPageSize };
105
+ }
106
+ function unsupported(capability, operation, key, context, open) {
107
+ open();
108
+ normalizeBucketKey(key);
109
+ assertActive(context);
110
+ return Promise.reject(new BucketCapabilityError(capability, operation));
111
+ }
112
+ function ensureOpen(closed) {
113
+ if (closed)
114
+ throw new LocalBucketStateError("Bucket provider is closed");
115
+ }
116
+ function isOperationContext(value) {
117
+ return value !== null && typeof value === "object" && "operation" in value && "signal" in value;
118
+ }
119
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/buckets/provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type StoredLocalBucketObject } from "./types.js";
2
+ export interface LocalBucketStorage {
3
+ readonly root: string;
4
+ readonly objectRoot: string;
5
+ readonly read: (key: string) => Promise<StoredLocalBucketObject | undefined>;
6
+ readonly write: (value: StoredLocalBucketObject) => Promise<void>;
7
+ readonly remove: (key: string) => Promise<void>;
8
+ readonly list: () => Promise<readonly StoredLocalBucketObject[]>;
9
+ readonly ready: () => Promise<void>;
10
+ }
11
+ export declare function createBucketStorage(requestedRoot: string): LocalBucketStorage;
12
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/buckets/storage.ts"],"names":[],"mappings":"AAMA,OAAO,EAAyB,KAAK,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAKjF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC,CAAC;IAC7E,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,SAAS,uBAAuB,EAAE,CAAC,CAAC;IACjE,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,kBAAkB,CAmB7E"}