@bjornpagen/bumbledb 1.3.0 → 2.0.0-rc.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.
Files changed (290) hide show
  1. package/COOKBOOK.md +224 -95
  2. package/README.md +114 -45
  3. package/dist/alternatives.d.ts +5 -6
  4. package/dist/alternatives.d.ts.map +1 -1
  5. package/dist/alternatives.js +5 -6
  6. package/dist/alternatives.js.map +1 -1
  7. package/dist/bin.d.ts +3 -0
  8. package/dist/bin.d.ts.map +1 -0
  9. package/dist/bin.js +85 -0
  10. package/dist/bin.js.map +1 -0
  11. package/dist/capacity.d.ts +14 -17
  12. package/dist/capacity.d.ts.map +1 -1
  13. package/dist/capacity.js +7 -7
  14. package/dist/capacity.js.map +1 -1
  15. package/dist/changes.d.ts +32 -41
  16. package/dist/changes.d.ts.map +1 -1
  17. package/dist/changes.js +86 -110
  18. package/dist/changes.js.map +1 -1
  19. package/dist/closed.d.ts +2 -2
  20. package/dist/closed.d.ts.map +1 -1
  21. package/dist/closed.js +5 -5
  22. package/dist/closed.js.map +1 -1
  23. package/dist/codec.d.ts +20 -27
  24. package/dist/codec.d.ts.map +1 -1
  25. package/dist/codec.js +48 -22
  26. package/dist/codec.js.map +1 -1
  27. package/dist/compile.d.ts +26 -50
  28. package/dist/compile.d.ts.map +1 -1
  29. package/dist/compile.js +75 -64
  30. package/dist/compile.js.map +1 -1
  31. package/dist/database/database.d.ts +98 -0
  32. package/dist/database/database.d.ts.map +1 -0
  33. package/dist/database/database.js +249 -0
  34. package/dist/database/database.js.map +1 -0
  35. package/dist/database/driver.d.ts +40 -0
  36. package/dist/database/driver.d.ts.map +1 -0
  37. package/dist/database/driver.js +68 -0
  38. package/dist/database/driver.js.map +1 -0
  39. package/dist/database/fs.d.ts +12 -0
  40. package/dist/database/fs.d.ts.map +1 -0
  41. package/dist/database/fs.js +120 -0
  42. package/dist/database/fs.js.map +1 -0
  43. package/dist/database/generate.d.ts +26 -0
  44. package/dist/database/generate.d.ts.map +1 -0
  45. package/dist/database/generate.js +102 -0
  46. package/dist/database/generate.js.map +1 -0
  47. package/dist/database/hosted.d.ts +32 -0
  48. package/dist/database/hosted.d.ts.map +1 -0
  49. package/dist/database/hosted.js +44 -0
  50. package/dist/database/hosted.js.map +1 -0
  51. package/dist/database/io.d.ts +94 -0
  52. package/dist/database/io.d.ts.map +1 -0
  53. package/dist/database/io.js +35 -0
  54. package/dist/database/io.js.map +1 -0
  55. package/dist/database/mem.d.ts +26 -0
  56. package/dist/database/mem.d.ts.map +1 -0
  57. package/dist/database/mem.js +67 -0
  58. package/dist/database/mem.js.map +1 -0
  59. package/dist/database/migration.d.ts +55 -0
  60. package/dist/database/migration.d.ts.map +1 -0
  61. package/dist/database/migration.js +46 -0
  62. package/dist/database/migration.js.map +1 -0
  63. package/dist/database/s3.d.ts +36 -0
  64. package/dist/database/s3.d.ts.map +1 -0
  65. package/dist/database/s3.js +141 -0
  66. package/dist/database/s3.js.map +1 -0
  67. package/dist/db.d.ts +44 -128
  68. package/dist/db.d.ts.map +1 -1
  69. package/dist/db.js +163 -287
  70. package/dist/db.js.map +1 -1
  71. package/dist/engine.d.ts +7 -0
  72. package/dist/engine.d.ts.map +1 -0
  73. package/dist/engine.js +2 -0
  74. package/dist/engine.js.map +1 -0
  75. package/dist/errors.d.ts +152 -46
  76. package/dist/errors.d.ts.map +1 -1
  77. package/dist/errors.js +107 -19
  78. package/dist/errors.js.map +1 -1
  79. package/dist/face.d.ts +5 -5
  80. package/dist/face.d.ts.map +1 -1
  81. package/dist/face.js +6 -6
  82. package/dist/face.js.map +1 -1
  83. package/dist/fields.d.ts +4 -5
  84. package/dist/fields.d.ts.map +1 -1
  85. package/dist/fields.js +3 -3
  86. package/dist/fields.js.map +1 -1
  87. package/dist/index.d.ts +60 -58
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +27 -29
  90. package/dist/index.js.map +1 -1
  91. package/dist/judgment.d.ts +1 -1
  92. package/dist/judgment.js +1 -1
  93. package/dist/law.d.ts +16 -68
  94. package/dist/law.d.ts.map +1 -1
  95. package/dist/law.js +3 -3
  96. package/dist/law.js.map +1 -1
  97. package/dist/lower.d.ts +3 -3
  98. package/dist/lower.d.ts.map +1 -1
  99. package/dist/lower.js +35 -39
  100. package/dist/lower.js.map +1 -1
  101. package/dist/native/addon.d.ts +23 -0
  102. package/dist/native/addon.d.ts.map +1 -0
  103. package/dist/native/addon.js +15 -0
  104. package/dist/native/addon.js.map +1 -0
  105. package/dist/native/binding.d.ts +996 -0
  106. package/dist/native/json.d.ts +14 -0
  107. package/dist/native/json.d.ts.map +1 -0
  108. package/dist/native/json.js +73 -0
  109. package/dist/native/json.js.map +1 -0
  110. package/dist/native/load.d.ts +9 -0
  111. package/dist/native/load.d.ts.map +1 -0
  112. package/dist/native/load.js +30 -0
  113. package/dist/native/load.js.map +1 -0
  114. package/dist/native/op.d.ts +29 -0
  115. package/dist/native/op.d.ts.map +1 -0
  116. package/dist/native/op.js +50 -0
  117. package/dist/native/op.js.map +1 -0
  118. package/dist/query/atom.d.ts +13 -14
  119. package/dist/query/atom.d.ts.map +1 -1
  120. package/dist/query/atom.js +2 -2
  121. package/dist/query/atom.js.map +1 -1
  122. package/dist/query/compute.d.ts +7 -7
  123. package/dist/query/compute.d.ts.map +1 -1
  124. package/dist/query/compute.js +7 -16
  125. package/dist/query/compute.js.map +1 -1
  126. package/dist/query/find.d.ts +8 -8
  127. package/dist/query/find.d.ts.map +1 -1
  128. package/dist/query/find.js +1 -1
  129. package/dist/query/lower.d.ts +31 -17
  130. package/dist/query/lower.d.ts.map +1 -1
  131. package/dist/query/lower.js +260 -368
  132. package/dist/query/lower.js.map +1 -1
  133. package/dist/query/run.d.ts +5 -5
  134. package/dist/query/run.d.ts.map +1 -1
  135. package/dist/query/run.js +32 -15
  136. package/dist/query/run.js.map +1 -1
  137. package/dist/query/scope.d.ts +20 -28
  138. package/dist/query/scope.d.ts.map +1 -1
  139. package/dist/query/scope.js +13 -8
  140. package/dist/query/scope.js.map +1 -1
  141. package/dist/query/segments.d.ts +2 -2
  142. package/dist/query/segments.d.ts.map +1 -1
  143. package/dist/query/segments.js +3 -3
  144. package/dist/query/segments.js.map +1 -1
  145. package/dist/relation.d.ts +1 -1
  146. package/dist/relation.d.ts.map +1 -1
  147. package/dist/relation.js +4 -4
  148. package/dist/relation.js.map +1 -1
  149. package/dist/result.d.ts +15 -22
  150. package/dist/result.d.ts.map +1 -1
  151. package/dist/result.js +30 -39
  152. package/dist/result.js.map +1 -1
  153. package/dist/rows.d.ts +9 -33
  154. package/dist/rows.d.ts.map +1 -1
  155. package/dist/rows.js +8 -12
  156. package/dist/rows.js.map +1 -1
  157. package/dist/runtime.d.ts +17 -43
  158. package/dist/runtime.d.ts.map +1 -1
  159. package/dist/runtime.js +41 -241
  160. package/dist/runtime.js.map +1 -1
  161. package/dist/scalar.d.ts +36 -106
  162. package/dist/scalar.d.ts.map +1 -1
  163. package/dist/scalar.js +36 -185
  164. package/dist/scalar.js.map +1 -1
  165. package/dist/schema.d.ts +7 -18
  166. package/dist/schema.d.ts.map +1 -1
  167. package/dist/schema.js +18 -228
  168. package/dist/schema.js.map +1 -1
  169. package/dist/selection.d.ts +4 -4
  170. package/dist/selection.d.ts.map +1 -1
  171. package/dist/selection.js +5 -5
  172. package/dist/selection.js.map +1 -1
  173. package/dist/shape.d.ts +5 -5
  174. package/dist/shape.d.ts.map +1 -1
  175. package/dist/spec.d.ts +7 -79
  176. package/dist/spec.d.ts.map +1 -1
  177. package/dist/spec.js.map +1 -1
  178. package/dist/statements.d.ts +3 -3
  179. package/dist/statements.d.ts.map +1 -1
  180. package/dist/statements.js +10 -10
  181. package/dist/statements.js.map +1 -1
  182. package/dist/uuid.d.ts +1 -1
  183. package/dist/uuid.d.ts.map +1 -1
  184. package/dist/uuid.js +1 -1
  185. package/dist/uuid.js.map +1 -1
  186. package/dist/values.d.ts +2 -2
  187. package/dist/values.d.ts.map +1 -1
  188. package/dist/values.js +2 -2
  189. package/dist/values.js.map +1 -1
  190. package/package.json +18 -18
  191. package/src/alternatives.ts +7 -8
  192. package/src/bin.ts +82 -0
  193. package/src/capacity.ts +20 -23
  194. package/src/changes.ts +134 -197
  195. package/src/closed.ts +5 -5
  196. package/src/codec.ts +77 -51
  197. package/src/compile.ts +91 -113
  198. package/src/database/database.ts +413 -0
  199. package/src/database/driver.ts +134 -0
  200. package/src/database/fs.ts +119 -0
  201. package/src/database/generate.ts +116 -0
  202. package/src/database/hosted.ts +102 -0
  203. package/src/database/io.ts +134 -0
  204. package/src/database/mem.ts +113 -0
  205. package/src/database/migration.ts +107 -0
  206. package/src/database/s3.ts +231 -0
  207. package/src/db.ts +290 -547
  208. package/src/engine.ts +14 -0
  209. package/src/errors.ts +118 -39
  210. package/src/face.ts +9 -9
  211. package/src/fields.ts +6 -7
  212. package/src/index.ts +102 -109
  213. package/src/judgment.ts +1 -1
  214. package/src/law.ts +18 -70
  215. package/src/lower.ts +61 -72
  216. package/src/native/addon.ts +54 -0
  217. package/src/native/binding.d.ts +996 -0
  218. package/src/native/json.ts +100 -0
  219. package/src/native/load.ts +31 -0
  220. package/src/native/op.ts +73 -0
  221. package/src/query/atom.ts +15 -16
  222. package/src/query/compute.ts +13 -22
  223. package/src/query/find.ts +8 -8
  224. package/src/query/lower.ts +323 -414
  225. package/src/query/run.ts +42 -21
  226. package/src/query/scope.ts +37 -38
  227. package/src/query/segments.ts +4 -4
  228. package/src/relation.ts +4 -4
  229. package/src/result.ts +53 -80
  230. package/src/rows.ts +18 -46
  231. package/src/runtime.ts +50 -346
  232. package/src/scalar.ts +76 -336
  233. package/src/schema.ts +23 -284
  234. package/src/selection.ts +6 -6
  235. package/src/shape.ts +5 -5
  236. package/src/spec.ts +7 -85
  237. package/src/statements.ts +11 -11
  238. package/src/uuid.ts +1 -1
  239. package/src/values.ts +4 -4
  240. package/dist/close.d.ts +0 -24
  241. package/dist/close.d.ts.map +0 -1
  242. package/dist/close.js +0 -34
  243. package/dist/close.js.map +0 -1
  244. package/dist/db-native.d.ts +0 -196
  245. package/dist/db-native.d.ts.map +0 -1
  246. package/dist/db-native.js +0 -13
  247. package/dist/db-native.js.map +0 -1
  248. package/dist/internal/log.d.ts +0 -26
  249. package/dist/internal/log.d.ts.map +0 -1
  250. package/dist/internal/log.js +0 -12
  251. package/dist/internal/log.js.map +0 -1
  252. package/dist/migration.d.ts +0 -31
  253. package/dist/migration.d.ts.map +0 -1
  254. package/dist/migration.js +0 -47
  255. package/dist/migration.js.map +0 -1
  256. package/dist/native.d.ts +0 -562
  257. package/dist/native.d.ts.map +0 -1
  258. package/dist/native.js +0 -123
  259. package/dist/native.js.map +0 -1
  260. package/dist/query/description.d.ts +0 -41
  261. package/dist/query/description.d.ts.map +0 -1
  262. package/dist/query/description.js +0 -311
  263. package/dist/query/description.js.map +0 -1
  264. package/dist/query/parse-ir.d.ts +0 -10
  265. package/dist/query/parse-ir.d.ts.map +0 -1
  266. package/dist/query/parse-ir.js +0 -280
  267. package/dist/query/parse-ir.js.map +0 -1
  268. package/dist/runtime-codes.d.ts +0 -2
  269. package/dist/runtime-codes.d.ts.map +0 -1
  270. package/dist/runtime-codes.js +0 -18
  271. package/dist/runtime-codes.js.map +0 -1
  272. package/dist/runtime-errors.d.ts +0 -118
  273. package/dist/runtime-errors.d.ts.map +0 -1
  274. package/dist/runtime-errors.js +0 -98
  275. package/dist/runtime-errors.js.map +0 -1
  276. package/dist/runtime-native.d.ts +0 -141
  277. package/dist/runtime-native.d.ts.map +0 -1
  278. package/dist/runtime-native.js +0 -5
  279. package/dist/runtime-native.js.map +0 -1
  280. package/pack-provenance.json +0 -7
  281. package/src/close.ts +0 -53
  282. package/src/db-native.ts +0 -243
  283. package/src/internal/log.ts +0 -48
  284. package/src/migration.ts +0 -61
  285. package/src/native.ts +0 -736
  286. package/src/query/description.ts +0 -424
  287. package/src/query/parse-ir.ts +0 -291
  288. package/src/runtime-codes.ts +0 -17
  289. package/src/runtime-errors.ts +0 -109
  290. package/src/runtime-native.ts +0 -189
@@ -0,0 +1,36 @@
1
+ import type { ObjectStore } from "./io.ts";
2
+ /**
3
+ * The part of an AWS SDK v3 `S3Client` the store calls. Declared here so the package's types do not
4
+ * require the optional `@aws-sdk/client-s3` peer.
5
+ */
6
+ interface S3Sender {
7
+ send(command: never, options: {
8
+ readonly abortSignal: AbortSignal;
9
+ }): Promise<unknown>;
10
+ }
11
+ interface S3StoreOptions {
12
+ /**
13
+ * The application's own `S3Client`: it owns credentials, region, endpoint and SDK retries. Its
14
+ * connections resolve DNS on libuv's thread pool, 4 threads by default, which serializes a cold
15
+ * open's parallel reads where lookups are slow.
16
+ */
17
+ readonly client: S3Sender;
18
+ /** The commit log bucket, ideally an S3 Express directory bucket (`name--azid--x-s3`). */
19
+ readonly log: {
20
+ readonly bucket: string;
21
+ };
22
+ /** The checkpoint bucket: an S3 Standard bucket, whose LIST is lexicographic. */
23
+ readonly checkpoints: {
24
+ readonly bucket: string;
25
+ };
26
+ /** Prepended to every key; empty, or ending in `/`. */
27
+ readonly prefix: string;
28
+ }
29
+ /** A store over the application's AWS SDK v3 client. Every key lives under `prefix`. */
30
+ declare function make(options: S3StoreOptions): ObjectStore;
31
+ declare const S3Store: Readonly<{
32
+ make: typeof make;
33
+ }>;
34
+ export type { S3Sender, S3StoreOptions };
35
+ export { S3Store };
36
+ //# sourceMappingURL=s3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3.d.ts","sourceRoot":"","sources":["../../src/database/s3.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAA2D,WAAW,EAAiB,MAAM,SAAS,CAAA;AAMlH;;;GAGG;AACH,UAAU,QAAQ;IACjB,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;QAAE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACtF;AAED,UAAU,cAAc;IACvB;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAA;IACzB,0FAA0F;IAC1F,QAAQ,CAAC,GAAG,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IACzC,iFAAiF;IACjF,QAAQ,CAAC,WAAW,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IACjD,uDAAuD;IACvD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACvB;AA8ED,wFAAwF;AACxF,iBAAS,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,WAAW,CAiHlD;AAED,QAAA,MAAM,OAAO;;EAA0B,CAAA;AAEvC,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,CAAA"}
@@ -0,0 +1,141 @@
1
+ import { createReadStream, createWriteStream } from "node:fs";
2
+ import * as fs from "node:fs/promises";
3
+ import { pipeline } from "node:stream/promises";
4
+ import { Effect } from "effect";
5
+ import { DbError } from "../errors.js";
6
+ let sdk;
7
+ function dateOf(headers) {
8
+ if (typeof headers !== "object" || headers === null || !("date" in headers) || typeof headers.date !== "string") {
9
+ return null;
10
+ }
11
+ const millis = Date.parse(headers.date);
12
+ return Number.isNaN(millis) ? null : BigInt(millis);
13
+ }
14
+ function refusalOf(cause) {
15
+ if (typeof cause !== "object" || cause === null)
16
+ return { status: undefined, date: null };
17
+ const metadata = "$metadata" in cause ? cause.$metadata : undefined;
18
+ const response = "$response" in cause ? cause.$response : undefined;
19
+ return { status: metadata?.httpStatusCode, date: dateOf(response?.headers) };
20
+ }
21
+ /**
22
+ * Sends one command and reads the response's `Date` header, which the SDK does not surface on
23
+ * outputs. The middleware sits innermost in the deserialize step, so it sees every raw response.
24
+ */
25
+ async function send(client, command, signal) {
26
+ let date = null;
27
+ const capture = (next) => async (args) => {
28
+ const result = await next(args);
29
+ const response = result.response;
30
+ date = dateOf(response?.headers) ?? date;
31
+ return result;
32
+ };
33
+ const add = command.middlewareStack.add;
34
+ add(capture, { step: "deserialize", priority: "low", name: "bumbledbResponseDate" });
35
+ const output = (await client.send(command, { abortSignal: signal }));
36
+ return { output, date };
37
+ }
38
+ /**
39
+ * S3 answers a create-only PUT that overlaps another conditional write to its key with 409. The
40
+ * SDK would retry it with backoff into a late 412. A log slot being written is taken for the log's
41
+ * purposes (it reads ownership back itself), so there the 409 is answered at once, as a refusal.
42
+ */
43
+ const conflict = Symbol("bdb.conflict");
44
+ function answerConflicts(command) {
45
+ const add = command.middlewareStack.add;
46
+ add((next) => async (args) => {
47
+ try {
48
+ return await next(args);
49
+ }
50
+ catch (cause) {
51
+ if (refusalOf(cause).status !== 409)
52
+ throw cause;
53
+ const response = "$response" in cause ? cause.$response : undefined;
54
+ return { output: { [conflict]: refusalOf(cause) }, response };
55
+ }
56
+ }, { step: "deserialize", priority: "high", name: "bumbledbConflictAnswer" });
57
+ }
58
+ function millisOf(value) {
59
+ return BigInt(value?.getTime() ?? 0);
60
+ }
61
+ /** A store over the application's AWS SDK v3 client. Every key lives under `prefix`. */
62
+ function make(options) {
63
+ const { client, prefix } = options;
64
+ const bucketName = (bucket) => (bucket === "Log" ? options.log.bucket : options.checkpoints.bucket);
65
+ const load = () => {
66
+ sdk ??= import("@aws-sdk/client-s3");
67
+ return sdk;
68
+ };
69
+ function attempt(operation, run, refused) {
70
+ return Effect.tryPromise({
71
+ try: async (signal) => {
72
+ const module = await load();
73
+ try {
74
+ return await run(module, signal);
75
+ }
76
+ catch (cause) {
77
+ const answer = refused(refusalOf(cause));
78
+ if (answer !== undefined)
79
+ return answer;
80
+ throw cause;
81
+ }
82
+ },
83
+ catch: (cause) => new DbError({
84
+ operation,
85
+ reason: { _tag: "Io", kind: refusalOf(cause).status?.toString() ?? "Transport" }
86
+ })
87
+ });
88
+ }
89
+ return {
90
+ get: (bucket, key, target) => attempt("S3Store.get", async ({ GetObjectCommand }, signal) => {
91
+ const answer = await send(client, new GetObjectCommand({ Bucket: bucketName(bucket), Key: `${prefix}${key}` }), signal);
92
+ const body = answer.output.Body;
93
+ const lastModified = millisOf(answer.output.LastModified);
94
+ if (body === undefined)
95
+ throw new Error("GetObject returned no body");
96
+ if (target._tag === "Memory") {
97
+ return {
98
+ date: answer.date,
99
+ result: { _tag: "Body", bytes: await body.transformToByteArray(), lastModified }
100
+ };
101
+ }
102
+ await pipeline(body, createWriteStream(target.path));
103
+ return { date: answer.date, result: { _tag: "Saved", lastModified } };
104
+ }, (refusal) => (refusal.status === 404 ? { date: refusal.date, result: { _tag: "Missing" } } : undefined)),
105
+ putIfAbsent: (bucket, key, body) => attempt("S3Store.putIfAbsent", async ({ PutObjectCommand }, signal) => {
106
+ const payload = body._tag === "Bytes"
107
+ ? { Body: body.bytes, ContentLength: body.bytes.byteLength }
108
+ : { Body: createReadStream(body.path), ContentLength: (await fs.stat(body.path)).size };
109
+ const command = new PutObjectCommand({
110
+ Bucket: bucketName(bucket),
111
+ Key: `${prefix}${key}`,
112
+ IfNoneMatch: "*",
113
+ ...payload
114
+ });
115
+ if (bucket === "Log")
116
+ answerConflicts(command);
117
+ const answer = await send(client, command, signal);
118
+ const refused = answer.output[conflict];
119
+ if (refused !== undefined)
120
+ return { date: refused.date ?? answer.date, result: { _tag: "Occupied" } };
121
+ return { date: answer.date, result: { _tag: "Created" } };
122
+ }, (refusal) => (refusal.status === 412 ? { date: refusal.date, result: { _tag: "Occupied" } } : undefined)),
123
+ list: (keyPrefix, startAfter, maxKeys) => attempt("S3Store.list", async ({ ListObjectsV2Command }, signal) => {
124
+ const answer = await send(client, new ListObjectsV2Command({
125
+ Bucket: options.checkpoints.bucket,
126
+ Prefix: `${prefix}${keyPrefix}`,
127
+ MaxKeys: maxKeys,
128
+ ...(startAfter === null ? {} : { StartAfter: `${prefix}${startAfter}` })
129
+ }), signal);
130
+ const keys = (answer.output.Contents ?? []).flatMap((object) => object.Key?.startsWith(prefix) === true ? [object.Key.slice(prefix.length)] : []);
131
+ return { date: answer.date, result: { _tag: "Keys", keys } };
132
+ }, () => undefined),
133
+ delete: (key) => attempt("S3Store.delete", async ({ DeleteObjectCommand }, signal) => {
134
+ const answer = await send(client, new DeleteObjectCommand({ Bucket: options.checkpoints.bucket, Key: `${prefix}${key}` }), signal);
135
+ return { date: answer.date, result: { _tag: "Deleted" } };
136
+ }, () => undefined)
137
+ };
138
+ }
139
+ const S3Store = Object.freeze({ make });
140
+ export { S3Store };
141
+ //# sourceMappingURL=s3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3.js","sourceRoot":"","sources":["../../src/database/s3.ts"],"names":[],"mappings":"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"}
package/dist/db.d.ts CHANGED
@@ -1,103 +1,36 @@
1
+ /**
2
+ * The embedded engine surface. `Db.create`/`Db.open` own a database directory for the current
3
+ * scope; snapshots, prepared queries and results are scoped the same way, so every native
4
+ * resource is released by its scope and a release that does not drain cleanly is a
5
+ * `CloseFailure` defect. Every verb is a lazy Effect that runs on the shared native executor.
6
+ */
1
7
  import type { Scope } from "effect";
2
8
  import { Effect, Option } from "effect";
3
- import type { ChangeCounts, ChangeSet } from "./changes.js";
4
- import type { SchemaId } from "./compile.js";
5
- import type { Violation } from "./native.js";
6
- import type { ParamsRecord } from "./query/scope.js";
7
- import type { Fact } from "./relation.js";
8
- import type { CompleteResult } from "./result.js";
9
- import type { NativeRuntime } from "./runtime.js";
10
- import type { CloseReport } from "./runtime-errors.js";
11
- import { DbError } from "./runtime-errors.js";
12
- import type { AnySchema } from "./schema.js";
13
- import type { Key, QueryTemplate, Rel } from "./shape.js";
14
- import type { KeyStatement } from "./statements.js";
9
+ import type { ChangeSet } from "./changes.ts";
10
+ import type { SchemaId } from "./compile.ts";
11
+ import { DbError } from "./errors.ts";
12
+ import type { WitnessRef } from "./native/addon.ts";
13
+ import type { ApplyOutcome, DbInspection as DbInspectionOut, JudgeOutcome } from "./native/binding.d.ts";
14
+ import type { Start } from "./native/op.ts";
15
+ import type { ParamsRecord } from "./query/scope.ts";
16
+ import type { Fact } from "./relation.ts";
17
+ import type { CompleteResult } from "./result.ts";
18
+ import type { Bumble } from "./runtime.ts";
19
+ import type { AnySchema } from "./schema.ts";
20
+ import type { Key, QueryTemplate, Rel } from "./shape.ts";
21
+ import type { KeyStatement } from "./statements.ts";
15
22
  /**
16
- * The core surface: `Db.create`/`Db.open`, scoped coherent
17
- * `Snapshot`s, reusable `PreparedQuery`s, the shared `QueryReader`
18
- * capability, one immutable final-state `apply`, bounded `inspect` and
19
- * honest `close`. Effect-only: every method constructs a lazy effect; all
20
- * native work runs on the shared executor with cooperative cancellation.
21
- * Resources are scoped with `CloseFailure`-defect
22
- * finalizers. There is no Promise/sync/disposal twin, no transaction
23
- * callback, no per-row fiber and no Proxy row anywhere.
24
- *
25
- * Database open is the managed two-step handshake: acquire the kernel-held
26
- * directory owner and register its finalizer before the interruptible
27
- * child-open step. `Db.open` NEVER creates on missing/error; `Db.create`
28
- * refuses existing authority. Published log snapshots use this same
29
- * `QueryReader` literally — no second reader or adapter.
30
- */
31
- /** The core-local witness: catalog/store identity plus generation — never a log StateStamp. */
32
- interface CoreWitness {
33
- readonly store: string;
34
- readonly generation: bigint;
35
- }
36
- type WriteExpected = {
37
- readonly kind: "any";
38
- } | {
39
- readonly kind: "exact";
40
- readonly at: CoreWitness;
41
- };
42
- /** Expected-state intent shared by judgment and application. */
43
- type WriteOptions = {
44
- readonly expected: WriteExpected;
45
- };
46
- type ApplyOutcome = {
47
- readonly kind: "accepted";
48
- readonly witness: CoreWitness;
49
- } | {
50
- readonly kind: "no-change";
51
- readonly witness: CoreWitness;
52
- } | {
53
- readonly kind: "invariant-rejected";
54
- readonly violations: readonly Violation[];
55
- } | {
56
- readonly kind: "moved";
57
- readonly witnessed: CoreWitness;
58
- readonly current: CoreWitness;
59
- };
60
- /** A judgment against the actual current base, not a promise about a later apply.
61
- * A moved witness is unjudged and therefore carries no made-up change counts.
23
+ * The state one snapshot observed, as an opaque proof: a write given it applies only while that
24
+ * state is current. Only a snapshot mints one, and it is valid only for the database that did.
62
25
  */
63
- type JudgeOutcome = {
64
- readonly kind: "admitted";
65
- readonly base: CoreWitness;
66
- readonly changes: ChangeCounts;
67
- } | {
68
- readonly kind: "invariant-rejected";
69
- readonly base: CoreWitness;
70
- readonly changes: ChangeCounts;
71
- readonly violations: readonly Violation[];
72
- } | {
73
- readonly kind: "moved";
74
- readonly witnessed: CoreWitness;
75
- readonly current: CoreWitness;
76
- };
77
- /** Storage measurements, not heap usage or mapped-page residency. */
78
- interface StorageInspection {
79
- /** Reserved virtual address range for the LMDB mapping. */
80
- readonly virtualMapBytes: bigint;
81
- /** File length; may include sparse regions and free pages. */
82
- readonly populatedFileBytes: bigint;
83
- /** LMDB's non-free branch, leaf and overflow pages. Not resident RAM. */
84
- readonly nonFreePageBytes: bigint;
85
- /** Allocated filesystem blocks, or null when the OS cannot report them. */
86
- readonly allocatedDiskBytes: bigint | null;
87
- }
26
+ type Witness = WitnessRef;
88
27
  /** Database diagnostics: measurements, never retained rows. */
89
- interface DbInspection {
28
+ interface DbInspection extends DbInspectionOut {
90
29
  readonly schemaId: SchemaId;
91
- readonly generation: bigint;
92
- readonly storage: StorageInspection;
93
- readonly retainedOperations: bigint;
94
30
  }
95
31
  /**
96
- * The shared read capability: the same typed `get` and
97
- * `execute` on a core snapshot and on a log published snapshot, so a
98
- * cross-package read helper takes this interface with no adapter. Missing
99
- * key is `Option.none`, never a fake I/O error or nullable row. It carries
100
- * no writable authority — never a `Db`, an `apply`, or a raw transaction.
32
+ * Typed reads over one coherent snapshot. A missing key is `Option.none`. It carries no write
33
+ * authority.
101
34
  */
102
35
  interface QueryReader<S extends AnySchema> {
103
36
  get<K extends KeyStatement<Rel<S>, readonly string[]>>(key: K, value: NoInfer<Key<K>>): Effect.Effect<Option.Option<Fact<K["owner"]>>, DbError>;
@@ -105,55 +38,38 @@ interface QueryReader<S extends AnySchema> {
105
38
  prepare<P extends ParamsRecord, A>(query: QueryTemplate<S, P, A>): Effect.Effect<PreparedQuery<P, A>, DbError, Scope.Scope>;
106
39
  }
107
40
  interface Snapshot<S extends AnySchema> extends QueryReader<S> {
108
- readonly witness: CoreWitness;
109
- close(): Effect.Effect<CloseReport>;
41
+ readonly witness: Witness;
42
+ /** The committed generation the snapshot observed. */
43
+ readonly generation: bigint;
110
44
  }
111
- /** One compiled plan and its reusable buffers, pinned to the preparing snapshot.
112
- * Closing it releases its own state, not the snapshot or completed results.
113
- */
45
+ /** One compiled plan and its reusable buffers, pinned to the snapshot that prepared it. */
114
46
  interface PreparedQuery<P extends ParamsRecord, A> {
115
47
  execute(params: P): Effect.Effect<CompleteResult<A>, DbError, Scope.Scope>;
116
- /** Drop reusable execution buffers, keeping the compiled query and snapshot. */
48
+ /** Drops the reusable execution buffers, keeping the compiled plan. */
117
49
  releaseMemory(): Effect.Effect<void, DbError>;
118
- close(): Effect.Effect<CloseReport>;
119
50
  }
120
51
  interface Db<S extends AnySchema> {
121
52
  readonly schemaId: SchemaId;
122
53
  snapshot(): Effect.Effect<Snapshot<S>, DbError, Scope.Scope>;
123
- apply(changes: ChangeSet<S>, options: WriteOptions): Effect.Effect<ApplyOutcome, DbError>;
124
- /** Briefly acquires the writer, judges and aborts. Stores no facts or generation. */
125
- judge(changes: ChangeSet<S>, options: WriteOptions): Effect.Effect<JudgeOutcome, DbError>;
54
+ /** Applies `changes` atomically; with `expected`, only if the database is still at that state. */
55
+ apply(changes: ChangeSet<S>, expected?: Witness): Effect.Effect<ApplyOutcome, DbError>;
56
+ /** Judges `changes` against the current state (or `expected`) and stores nothing. */
57
+ judge(changes: ChangeSet<S>, expected?: Witness): Effect.Effect<JudgeOutcome, DbError>;
126
58
  inspect(): Effect.Effect<DbInspection, DbError>;
127
- /** Clear shared query caches without invalidating live snapshots or results. */
59
+ /** Clears shared query caches without invalidating live snapshots or results. */
128
60
  clearCache(): Effect.Effect<void, DbError>;
129
- close(): Effect.Effect<CloseReport>;
130
61
  }
62
+ /** A snapshot `start` pins, read through `theory` and released by the current scope. */
63
+ declare function scopedSnapshot<S extends AnySchema>(operation: string, theory: S, start: Start): Effect.Effect<Snapshot<S>, DbError, Scope.Scope>;
131
64
  /**
132
- * `Db.create` is the explicit constructor and refuses existing authority;
133
- * `Db.open` of a missing or unreadable database never creates an empty
134
- * replacement. Both compile the schema through the same
135
- * implementation as `Schema.compile` — prior compilation is optional.
65
+ * `Db.create` makes a new database and refuses an existing one; `Db.open` opens an existing one
66
+ * and never creates. Both compile the schema first.
136
67
  */
137
68
  declare const Db: Readonly<{
138
- create<S extends AnySchema>(path: string, schema: S): Effect.Effect<Db<S>, DbError, NativeRuntime | Scope.Scope>;
139
- open<S extends AnySchema>(path: string, schema: S): Effect.Effect<Db<S>, DbError, NativeRuntime | Scope.Scope>;
69
+ create<S extends AnySchema>(path: string, schema: S): Effect.Effect<Db<S>, DbError, Bumble | Scope.Scope>;
70
+ open<S extends AnySchema>(path: string, schema: S): Effect.Effect<Db<S>, DbError, Bumble | Scope.Scope>;
140
71
  }>;
141
- /**
142
- * Private log integration: wraps a published core snapshot
143
- * handle — minted by the internal log machine's native open/snapshot verbs
144
- * — in the exact core `QueryReader` plus the scoped session acquisition
145
- * (the log adds identity, stamps and freshness around this capability,
146
- * never a second reader).
147
- * The argument is the log package's branded handle for the same native
148
- * registry entry, so the one cast below is a cross-package respelling of
149
- * one native capability — the native side re-judges kind/generation/owner
150
- * on every verb, so a forged object refuses there, typed.
151
- */
152
- declare function internalPublishedReader<S extends AnySchema>(core: object, theory: S): {
153
- readonly get: QueryReader<S>["get"];
154
- readonly execute: QueryReader<S>["execute"];
155
- readonly prepare: QueryReader<S>["prepare"];
156
- };
157
- export type { ApplyOutcome, CoreWitness, DbInspection, JudgeOutcome, PreparedQuery, QueryReader, Snapshot, StorageInspection, WriteExpected, WriteOptions };
158
- export { Db, internalPublishedReader };
72
+ export type { ApplyOutcome, JudgeOutcome } from "./native/binding.d.ts";
73
+ export type { DbInspection, PreparedQuery, QueryReader, Snapshot, Witness };
74
+ export { Db, scopedSnapshot };
159
75
  //# sourceMappingURL=db.d.ts.map
package/dist/db.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}