@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.
- package/COOKBOOK.md +224 -95
- package/README.md +114 -45
- package/dist/alternatives.d.ts +5 -6
- package/dist/alternatives.d.ts.map +1 -1
- package/dist/alternatives.js +5 -6
- package/dist/alternatives.js.map +1 -1
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +85 -0
- package/dist/bin.js.map +1 -0
- package/dist/capacity.d.ts +14 -17
- package/dist/capacity.d.ts.map +1 -1
- package/dist/capacity.js +7 -7
- package/dist/capacity.js.map +1 -1
- package/dist/changes.d.ts +32 -41
- package/dist/changes.d.ts.map +1 -1
- package/dist/changes.js +86 -110
- package/dist/changes.js.map +1 -1
- package/dist/closed.d.ts +2 -2
- package/dist/closed.d.ts.map +1 -1
- package/dist/closed.js +5 -5
- package/dist/closed.js.map +1 -1
- package/dist/codec.d.ts +20 -27
- package/dist/codec.d.ts.map +1 -1
- package/dist/codec.js +48 -22
- package/dist/codec.js.map +1 -1
- package/dist/compile.d.ts +26 -50
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +75 -64
- package/dist/compile.js.map +1 -1
- package/dist/database/database.d.ts +98 -0
- package/dist/database/database.d.ts.map +1 -0
- package/dist/database/database.js +249 -0
- package/dist/database/database.js.map +1 -0
- package/dist/database/driver.d.ts +40 -0
- package/dist/database/driver.d.ts.map +1 -0
- package/dist/database/driver.js +68 -0
- package/dist/database/driver.js.map +1 -0
- package/dist/database/fs.d.ts +12 -0
- package/dist/database/fs.d.ts.map +1 -0
- package/dist/database/fs.js +120 -0
- package/dist/database/fs.js.map +1 -0
- package/dist/database/generate.d.ts +26 -0
- package/dist/database/generate.d.ts.map +1 -0
- package/dist/database/generate.js +102 -0
- package/dist/database/generate.js.map +1 -0
- package/dist/database/hosted.d.ts +32 -0
- package/dist/database/hosted.d.ts.map +1 -0
- package/dist/database/hosted.js +44 -0
- package/dist/database/hosted.js.map +1 -0
- package/dist/database/io.d.ts +94 -0
- package/dist/database/io.d.ts.map +1 -0
- package/dist/database/io.js +35 -0
- package/dist/database/io.js.map +1 -0
- package/dist/database/mem.d.ts +26 -0
- package/dist/database/mem.d.ts.map +1 -0
- package/dist/database/mem.js +67 -0
- package/dist/database/mem.js.map +1 -0
- package/dist/database/migration.d.ts +55 -0
- package/dist/database/migration.d.ts.map +1 -0
- package/dist/database/migration.js +46 -0
- package/dist/database/migration.js.map +1 -0
- package/dist/database/s3.d.ts +36 -0
- package/dist/database/s3.d.ts.map +1 -0
- package/dist/database/s3.js +141 -0
- package/dist/database/s3.js.map +1 -0
- package/dist/db.d.ts +44 -128
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +163 -287
- package/dist/db.js.map +1 -1
- package/dist/engine.d.ts +7 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +2 -0
- package/dist/engine.js.map +1 -0
- package/dist/errors.d.ts +152 -46
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +107 -19
- package/dist/errors.js.map +1 -1
- package/dist/face.d.ts +5 -5
- package/dist/face.d.ts.map +1 -1
- package/dist/face.js +6 -6
- package/dist/face.js.map +1 -1
- package/dist/fields.d.ts +4 -5
- package/dist/fields.d.ts.map +1 -1
- package/dist/fields.js +3 -3
- package/dist/fields.js.map +1 -1
- package/dist/index.d.ts +60 -58
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -29
- package/dist/index.js.map +1 -1
- package/dist/judgment.d.ts +1 -1
- package/dist/judgment.js +1 -1
- package/dist/law.d.ts +16 -68
- package/dist/law.d.ts.map +1 -1
- package/dist/law.js +3 -3
- package/dist/law.js.map +1 -1
- package/dist/lower.d.ts +3 -3
- package/dist/lower.d.ts.map +1 -1
- package/dist/lower.js +35 -39
- package/dist/lower.js.map +1 -1
- package/dist/native/addon.d.ts +23 -0
- package/dist/native/addon.d.ts.map +1 -0
- package/dist/native/addon.js +15 -0
- package/dist/native/addon.js.map +1 -0
- package/dist/native/binding.d.ts +996 -0
- package/dist/native/json.d.ts +14 -0
- package/dist/native/json.d.ts.map +1 -0
- package/dist/native/json.js +73 -0
- package/dist/native/json.js.map +1 -0
- package/dist/native/load.d.ts +9 -0
- package/dist/native/load.d.ts.map +1 -0
- package/dist/native/load.js +30 -0
- package/dist/native/load.js.map +1 -0
- package/dist/native/op.d.ts +29 -0
- package/dist/native/op.d.ts.map +1 -0
- package/dist/native/op.js +50 -0
- package/dist/native/op.js.map +1 -0
- package/dist/query/atom.d.ts +13 -14
- package/dist/query/atom.d.ts.map +1 -1
- package/dist/query/atom.js +2 -2
- package/dist/query/atom.js.map +1 -1
- package/dist/query/compute.d.ts +7 -7
- package/dist/query/compute.d.ts.map +1 -1
- package/dist/query/compute.js +7 -16
- package/dist/query/compute.js.map +1 -1
- package/dist/query/find.d.ts +8 -8
- package/dist/query/find.d.ts.map +1 -1
- package/dist/query/find.js +1 -1
- package/dist/query/lower.d.ts +31 -17
- package/dist/query/lower.d.ts.map +1 -1
- package/dist/query/lower.js +260 -368
- package/dist/query/lower.js.map +1 -1
- package/dist/query/run.d.ts +5 -5
- package/dist/query/run.d.ts.map +1 -1
- package/dist/query/run.js +32 -15
- package/dist/query/run.js.map +1 -1
- package/dist/query/scope.d.ts +20 -28
- package/dist/query/scope.d.ts.map +1 -1
- package/dist/query/scope.js +13 -8
- package/dist/query/scope.js.map +1 -1
- package/dist/query/segments.d.ts +2 -2
- package/dist/query/segments.d.ts.map +1 -1
- package/dist/query/segments.js +3 -3
- package/dist/query/segments.js.map +1 -1
- package/dist/relation.d.ts +1 -1
- package/dist/relation.d.ts.map +1 -1
- package/dist/relation.js +4 -4
- package/dist/relation.js.map +1 -1
- package/dist/result.d.ts +15 -22
- package/dist/result.d.ts.map +1 -1
- package/dist/result.js +30 -39
- package/dist/result.js.map +1 -1
- package/dist/rows.d.ts +9 -33
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +8 -12
- package/dist/rows.js.map +1 -1
- package/dist/runtime.d.ts +17 -43
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +41 -241
- package/dist/runtime.js.map +1 -1
- package/dist/scalar.d.ts +36 -106
- package/dist/scalar.d.ts.map +1 -1
- package/dist/scalar.js +36 -185
- package/dist/scalar.js.map +1 -1
- package/dist/schema.d.ts +7 -18
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +18 -228
- package/dist/schema.js.map +1 -1
- package/dist/selection.d.ts +4 -4
- package/dist/selection.d.ts.map +1 -1
- package/dist/selection.js +5 -5
- package/dist/selection.js.map +1 -1
- package/dist/shape.d.ts +5 -5
- package/dist/shape.d.ts.map +1 -1
- package/dist/spec.d.ts +7 -79
- package/dist/spec.d.ts.map +1 -1
- package/dist/spec.js.map +1 -1
- package/dist/statements.d.ts +3 -3
- package/dist/statements.d.ts.map +1 -1
- package/dist/statements.js +10 -10
- package/dist/statements.js.map +1 -1
- package/dist/uuid.d.ts +1 -1
- package/dist/uuid.d.ts.map +1 -1
- package/dist/uuid.js +1 -1
- package/dist/uuid.js.map +1 -1
- package/dist/values.d.ts +2 -2
- package/dist/values.d.ts.map +1 -1
- package/dist/values.js +2 -2
- package/dist/values.js.map +1 -1
- package/package.json +18 -18
- package/src/alternatives.ts +7 -8
- package/src/bin.ts +82 -0
- package/src/capacity.ts +20 -23
- package/src/changes.ts +134 -197
- package/src/closed.ts +5 -5
- package/src/codec.ts +77 -51
- package/src/compile.ts +91 -113
- package/src/database/database.ts +413 -0
- package/src/database/driver.ts +134 -0
- package/src/database/fs.ts +119 -0
- package/src/database/generate.ts +116 -0
- package/src/database/hosted.ts +102 -0
- package/src/database/io.ts +134 -0
- package/src/database/mem.ts +113 -0
- package/src/database/migration.ts +107 -0
- package/src/database/s3.ts +231 -0
- package/src/db.ts +290 -547
- package/src/engine.ts +14 -0
- package/src/errors.ts +118 -39
- package/src/face.ts +9 -9
- package/src/fields.ts +6 -7
- package/src/index.ts +102 -109
- package/src/judgment.ts +1 -1
- package/src/law.ts +18 -70
- package/src/lower.ts +61 -72
- package/src/native/addon.ts +54 -0
- package/src/native/binding.d.ts +996 -0
- package/src/native/json.ts +100 -0
- package/src/native/load.ts +31 -0
- package/src/native/op.ts +73 -0
- package/src/query/atom.ts +15 -16
- package/src/query/compute.ts +13 -22
- package/src/query/find.ts +8 -8
- package/src/query/lower.ts +323 -414
- package/src/query/run.ts +42 -21
- package/src/query/scope.ts +37 -38
- package/src/query/segments.ts +4 -4
- package/src/relation.ts +4 -4
- package/src/result.ts +53 -80
- package/src/rows.ts +18 -46
- package/src/runtime.ts +50 -346
- package/src/scalar.ts +76 -336
- package/src/schema.ts +23 -284
- package/src/selection.ts +6 -6
- package/src/shape.ts +5 -5
- package/src/spec.ts +7 -85
- package/src/statements.ts +11 -11
- package/src/uuid.ts +1 -1
- package/src/values.ts +4 -4
- package/dist/close.d.ts +0 -24
- package/dist/close.d.ts.map +0 -1
- package/dist/close.js +0 -34
- package/dist/close.js.map +0 -1
- package/dist/db-native.d.ts +0 -196
- package/dist/db-native.d.ts.map +0 -1
- package/dist/db-native.js +0 -13
- package/dist/db-native.js.map +0 -1
- package/dist/internal/log.d.ts +0 -26
- package/dist/internal/log.d.ts.map +0 -1
- package/dist/internal/log.js +0 -12
- package/dist/internal/log.js.map +0 -1
- package/dist/migration.d.ts +0 -31
- package/dist/migration.d.ts.map +0 -1
- package/dist/migration.js +0 -47
- package/dist/migration.js.map +0 -1
- package/dist/native.d.ts +0 -562
- package/dist/native.d.ts.map +0 -1
- package/dist/native.js +0 -123
- package/dist/native.js.map +0 -1
- package/dist/query/description.d.ts +0 -41
- package/dist/query/description.d.ts.map +0 -1
- package/dist/query/description.js +0 -311
- package/dist/query/description.js.map +0 -1
- package/dist/query/parse-ir.d.ts +0 -10
- package/dist/query/parse-ir.d.ts.map +0 -1
- package/dist/query/parse-ir.js +0 -280
- package/dist/query/parse-ir.js.map +0 -1
- package/dist/runtime-codes.d.ts +0 -2
- package/dist/runtime-codes.d.ts.map +0 -1
- package/dist/runtime-codes.js +0 -18
- package/dist/runtime-codes.js.map +0 -1
- package/dist/runtime-errors.d.ts +0 -118
- package/dist/runtime-errors.d.ts.map +0 -1
- package/dist/runtime-errors.js +0 -98
- package/dist/runtime-errors.js.map +0 -1
- package/dist/runtime-native.d.ts +0 -141
- package/dist/runtime-native.d.ts.map +0 -1
- package/dist/runtime-native.js +0 -5
- package/dist/runtime-native.js.map +0 -1
- package/pack-provenance.json +0 -7
- package/src/close.ts +0 -53
- package/src/db-native.ts +0 -243
- package/src/internal/log.ts +0 -48
- package/src/migration.ts +0 -61
- package/src/native.ts +0 -736
- package/src/query/description.ts +0 -424
- package/src/query/parse-ir.ts +0 -291
- package/src/runtime-codes.ts +0 -17
- package/src/runtime-errors.ts +0 -109
- 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 {
|
|
4
|
-
import type { SchemaId } from "./compile.
|
|
5
|
-
import
|
|
6
|
-
import type {
|
|
7
|
-
import type {
|
|
8
|
-
import type {
|
|
9
|
-
import type {
|
|
10
|
-
import type {
|
|
11
|
-
import {
|
|
12
|
-
import type {
|
|
13
|
-
import type {
|
|
14
|
-
import type {
|
|
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
|
|
17
|
-
*
|
|
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
|
|
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
|
-
*
|
|
97
|
-
*
|
|
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:
|
|
109
|
-
|
|
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
|
|
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
|
-
/**
|
|
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
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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
|
-
/**
|
|
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`
|
|
133
|
-
*
|
|
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,
|
|
139
|
-
open<S extends AnySchema>(path: string, schema: S): Effect.Effect<Db<S>, DbError,
|
|
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
|
-
|
|
143
|
-
|
|
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":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACvC,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
|