approval-md 0.3.0 → 0.4.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.
- package/README.md +83 -914
- package/SPEC.md +98 -13
- package/cli.js +66 -7
- package/dist/src/adapters/smtp.d.ts +18 -0
- package/dist/src/adapters/smtp.js +24 -3
- package/dist/src/adapters/smtp.js.map +1 -1
- package/dist/src/channels/contract.d.ts +19 -0
- package/dist/src/channels/contract.js +105 -1
- package/dist/src/channels/contract.js.map +1 -1
- package/dist/src/channels/relay-server.d.ts +90 -0
- package/dist/src/channels/relay-server.js +295 -0
- package/dist/src/channels/relay-server.js.map +1 -0
- package/dist/src/channels/relay.d.ts +273 -0
- package/dist/src/channels/relay.js +564 -0
- package/dist/src/channels/relay.js.map +1 -0
- package/dist/src/channels/tagging.js +6 -1
- package/dist/src/channels/tagging.js.map +1 -1
- package/dist/src/channels/telegram-webhook.d.ts +273 -0
- package/dist/src/channels/telegram-webhook.js +536 -0
- package/dist/src/channels/telegram-webhook.js.map +1 -0
- package/dist/src/channels/telegram.d.ts +271 -1
- package/dist/src/channels/telegram.js +403 -45
- package/dist/src/channels/telegram.js.map +1 -1
- package/dist/src/cli/amend.js +350 -4
- package/dist/src/cli/amend.js.map +1 -1
- package/dist/src/cli/attest.js +43 -6
- package/dist/src/cli/attest.js.map +1 -1
- package/dist/src/cli/channel-relay.d.ts +108 -0
- package/dist/src/cli/channel-relay.js +334 -0
- package/dist/src/cli/channel-relay.js.map +1 -0
- package/dist/src/cli/channel-telegram-webhook.d.ts +273 -0
- package/dist/src/cli/channel-telegram-webhook.js +709 -0
- package/dist/src/cli/channel-telegram-webhook.js.map +1 -0
- package/dist/src/cli/channel-telegram.d.ts +272 -26
- package/dist/src/cli/channel-telegram.js +478 -41
- package/dist/src/cli/channel-telegram.js.map +1 -1
- package/dist/src/cli/channel.d.ts +1 -1
- package/dist/src/cli/channel.js +5 -1
- package/dist/src/cli/channel.js.map +1 -1
- package/dist/src/cli/daemon.js +37 -5
- package/dist/src/cli/daemon.js.map +1 -1
- package/dist/src/cli/doctor.d.ts +63 -0
- package/dist/src/cli/doctor.js +856 -111
- package/dist/src/cli/doctor.js.map +1 -1
- package/dist/src/cli/execute.d.ts +17 -1
- package/dist/src/cli/execute.js +341 -20
- package/dist/src/cli/execute.js.map +1 -1
- package/dist/src/cli/exit-codes.d.ts +12 -0
- package/dist/src/cli/exit-codes.js +13 -0
- package/dist/src/cli/exit-codes.js.map +1 -1
- package/dist/src/cli/gate.d.ts +2 -0
- package/dist/src/cli/gate.js +233 -2
- package/dist/src/cli/gate.js.map +1 -1
- package/dist/src/cli/help.d.ts +9 -1
- package/dist/src/cli/help.js +246 -38
- package/dist/src/cli/help.js.map +1 -1
- package/dist/src/cli/hook.d.ts +371 -3
- package/dist/src/cli/hook.js +1926 -44
- package/dist/src/cli/hook.js.map +1 -1
- package/dist/src/cli/init.js +16 -7
- package/dist/src/cli/init.js.map +1 -1
- package/dist/src/cli/instructions.js +24 -3
- package/dist/src/cli/instructions.js.map +1 -1
- package/dist/src/cli/log-anchor.d.ts +55 -0
- package/dist/src/cli/log-anchor.js +199 -60
- package/dist/src/cli/log-anchor.js.map +1 -1
- package/dist/src/cli/main.d.ts +0 -12
- package/dist/src/cli/main.js +51 -0
- package/dist/src/cli/main.js.map +1 -1
- package/dist/src/cli/muse.d.ts +2 -0
- package/dist/src/cli/muse.js +62 -0
- package/dist/src/cli/muse.js.map +1 -0
- package/dist/src/cli/payload.js +79 -1
- package/dist/src/cli/payload.js.map +1 -1
- package/dist/src/cli/scaffold.js +6 -0
- package/dist/src/cli/scaffold.js.map +1 -1
- package/dist/src/cli/serve.d.ts +53 -0
- package/dist/src/cli/serve.js +270 -0
- package/dist/src/cli/serve.js.map +1 -0
- package/dist/src/cli/up.js +21 -2
- package/dist/src/cli/up.js.map +1 -1
- package/dist/src/cli/verb-registry.d.ts +2 -0
- package/dist/src/cli/verb-registry.js +337 -39
- package/dist/src/cli/verb-registry.js.map +1 -1
- package/dist/src/cli/wordmark.d.ts +2 -2
- package/dist/src/cli/wordmark.js +2 -2
- package/dist/src/core/attest-bootstrap.d.ts +95 -0
- package/dist/src/core/attest-bootstrap.js +135 -0
- package/dist/src/core/attest-bootstrap.js.map +1 -0
- package/dist/src/core/attest.d.ts +20 -3
- package/dist/src/core/attest.js +25 -0
- package/dist/src/core/attest.js.map +1 -1
- package/dist/src/core/audit.d.ts +55 -3
- package/dist/src/core/audit.js +52 -5
- package/dist/src/core/audit.js.map +1 -1
- package/dist/src/core/channel-lease.d.ts +322 -0
- package/dist/src/core/channel-lease.js +663 -0
- package/dist/src/core/channel-lease.js.map +1 -0
- package/dist/src/core/command-class.d.ts +51 -0
- package/dist/src/core/command-class.js +760 -8
- package/dist/src/core/command-class.js.map +1 -1
- package/dist/src/core/daemon-host.d.ts +178 -0
- package/dist/src/core/daemon-host.js +228 -0
- package/dist/src/core/daemon-host.js.map +1 -0
- package/dist/src/core/daemon-identity.d.ts +238 -0
- package/dist/src/core/daemon-identity.js +252 -0
- package/dist/src/core/daemon-identity.js.map +1 -0
- package/dist/src/core/gate.d.ts +306 -5
- package/dist/src/core/gate.js +772 -24
- package/dist/src/core/gate.js.map +1 -1
- package/dist/src/core/harness-version.d.ts +128 -4
- package/dist/src/core/harness-version.js +179 -12
- package/dist/src/core/harness-version.js.map +1 -1
- package/dist/src/core/harness-wait.d.ts +82 -3
- package/dist/src/core/harness-wait.js +89 -3
- package/dist/src/core/harness-wait.js.map +1 -1
- package/dist/src/core/log-subscribe.d.ts +21 -0
- package/dist/src/core/log-subscribe.js +16 -6
- package/dist/src/core/log-subscribe.js.map +1 -1
- package/dist/src/core/log-write-layer.d.ts +55 -0
- package/dist/src/core/log-write-layer.js +91 -0
- package/dist/src/core/log-write-layer.js.map +1 -0
- package/dist/src/core/log.d.ts +50 -21
- package/dist/src/core/log.js +197 -19
- package/dist/src/core/log.js.map +1 -1
- package/dist/src/core/payload-census.d.ts +51 -0
- package/dist/src/core/payload-census.js +125 -2
- package/dist/src/core/payload-census.js.map +1 -1
- package/dist/src/core/payload-store.d.ts +31 -0
- package/dist/src/core/payload-store.js +113 -8
- package/dist/src/core/payload-store.js.map +1 -1
- package/dist/src/core/payload.d.ts +18 -3
- package/dist/src/core/payload.js +20 -4
- package/dist/src/core/payload.js.map +1 -1
- package/dist/src/core/policy-diff.d.ts +10 -0
- package/dist/src/core/policy-diff.js +10 -2
- package/dist/src/core/policy-diff.js.map +1 -1
- package/dist/src/core/policy-explain.d.ts +7 -1
- package/dist/src/core/policy-explain.js +16 -1
- package/dist/src/core/policy-explain.js.map +1 -1
- package/dist/src/core/policy-load.d.ts +24 -0
- package/dist/src/core/policy-load.js.map +1 -1
- package/dist/src/core/policy-match.d.ts +38 -0
- package/dist/src/core/policy-match.js +35 -0
- package/dist/src/core/policy-match.js.map +1 -1
- package/dist/src/core/policy-proposal.d.ts +23 -0
- package/dist/src/core/policy-proposal.js +8 -2
- package/dist/src/core/policy-proposal.js.map +1 -1
- package/dist/src/core/read-scope.d.ts +10 -0
- package/dist/src/core/read-scope.js +4 -0
- package/dist/src/core/read-scope.js.map +1 -1
- package/dist/src/core/run-payload.d.ts +160 -0
- package/dist/src/core/run-payload.js +304 -0
- package/dist/src/core/run-payload.js.map +1 -0
- package/dist/src/core/sender-identity.d.ts +35 -10
- package/dist/src/core/sender-identity.js +48 -11
- package/dist/src/core/sender-identity.js.map +1 -1
- package/dist/src/core/state.d.ts +52 -1
- package/dist/src/core/state.js +52 -6
- package/dist/src/core/state.js.map +1 -1
- package/dist/src/core/telegram-config.d.ts +79 -0
- package/dist/src/core/telegram-config.js +108 -0
- package/dist/src/core/telegram-config.js.map +1 -1
- package/dist/src/core/verify.d.ts +23 -1
- package/dist/src/core/verify.js +20 -2
- package/dist/src/core/verify.js.map +1 -1
- package/dist/src/daemon/audit.d.ts +80 -5
- package/dist/src/daemon/audit.js +126 -6
- package/dist/src/daemon/audit.js.map +1 -1
- package/dist/src/daemon/daemon.d.ts +174 -2
- package/dist/src/daemon/daemon.js +298 -7
- package/dist/src/daemon/daemon.js.map +1 -1
- package/dist/src/daemon/git-evidence.d.ts +2 -2
- package/dist/src/daemon/git-evidence.js +1 -1
- package/dist/src/daemon/projection.d.ts +13 -2
- package/dist/src/daemon/projection.js +39 -6
- package/dist/src/daemon/projection.js.map +1 -1
- package/dist/src/mcp/server.d.ts +39 -3
- package/dist/src/mcp/server.js +22 -3
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/muse/server.d.ts +16 -0
- package/dist/src/muse/server.js +238 -0
- package/dist/src/muse/server.js.map +1 -0
- package/dist/src/serve/archive.d.ts +158 -0
- package/dist/src/serve/archive.js +354 -0
- package/dist/src/serve/archive.js.map +1 -0
- package/dist/src/serve/arguments.d.ts +93 -0
- package/dist/src/serve/arguments.js +228 -0
- package/dist/src/serve/arguments.js.map +1 -0
- package/dist/src/serve/credentials.d.ts +91 -0
- package/dist/src/serve/credentials.js +143 -0
- package/dist/src/serve/credentials.js.map +1 -0
- package/dist/src/serve/follow.d.ts +86 -0
- package/dist/src/serve/follow.js +101 -0
- package/dist/src/serve/follow.js.map +1 -0
- package/dist/src/serve/hook-thread.d.ts +134 -0
- package/dist/src/serve/hook-thread.js +333 -0
- package/dist/src/serve/hook-thread.js.map +1 -0
- package/dist/src/serve/hook-worker.d.ts +134 -0
- package/dist/src/serve/hook-worker.js +173 -0
- package/dist/src/serve/hook-worker.js.map +1 -0
- package/dist/src/serve/server.d.ts +412 -0
- package/dist/src/serve/server.js +1251 -0
- package/dist/src/serve/server.js.map +1 -0
- package/docs/README-extended.md +766 -0
- package/docs/cli-reference.md +1633 -43
- package/package.json +4 -2
- package/schema/event.schema.json +59 -2
- package/schema/fixtures/event/invalid/daemon-id-malformed.json +15 -0
- package/schema/fixtures/event/invalid/execution-started-truncated-policy-sha256.json +18 -0
- package/schema/fixtures/event/invalid/harness-cap-at-margin.json +16 -0
- package/schema/fixtures/event/invalid/harness-cap-fractional.json +16 -0
- package/schema/fixtures/event/invalid/harness-cap-negative.json +16 -0
- package/schema/fixtures/event/invalid/harness-cap-string.json +16 -0
- package/schema/fixtures/event/invalid/harness-cap-without-harness-execution.json +16 -0
- package/schema/fixtures/event/invalid/harness-cap-zero.json +16 -0
- package/schema/fixtures/event/valid/approval-requested-harness-cap.json +18 -0
- package/schema/fixtures/event/valid/daemon-identity-declared.json +17 -0
- package/schema/fixtures/event/valid/daemon-identity.json +15 -0
- package/schema/fixtures/event/valid/execution-started-policy-sha256.json +18 -0
- package/schema/fixtures/event/valid/harness-kind-hermes.json +23 -0
- package/schema/fixtures/policy/invalid/daemons-malformed-id.json +10 -0
- package/schema/fixtures/policy/valid/daemons-allowlist.json +19 -0
- package/schema/fixtures/policy-md/invalid/schema-invalid-agent-may-request.md +21 -0
- package/schema/fixtures/policy-md/valid/agent-may-request.md +24 -0
- package/schema/policy.schema.json +50 -6
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The filesystem calls that put durable bytes on disk: `core/log.ts`'s append
|
|
3
|
+
* (APRV-440) and `core/payload-store.ts`'s atomic write (APRV-457). They are
|
|
4
|
+
* kept in their own module so that `core/log.ts`'s public surface stays what
|
|
5
|
+
* `tests/log.test.ts` pins: no mutation, no reorder, no truncate, and no way to
|
|
6
|
+
* change how its bytes reach the disk.
|
|
7
|
+
*
|
|
8
|
+
* Why a seam at all. The durability claim is "fsync after the write and before
|
|
9
|
+
* ok", and a page cache that was flushed reads back exactly like one that was
|
|
10
|
+
* not until the machine dies. Only a layer that records the ORDER of the calls
|
|
11
|
+
* can prove the claim, so `tests/log-fsync.test.ts` and
|
|
12
|
+
* `tests/payload-fsync.test.ts` install one that records every call and then
|
|
13
|
+
* delegates to the real one, which keeps each log they build a real log built
|
|
14
|
+
* through the real append path.
|
|
15
|
+
*
|
|
16
|
+
* One seam for both writers, deliberately. A log record is only as durable as
|
|
17
|
+
* the payload it binds: a record that survives a crash while its payload comes
|
|
18
|
+
* back NUL-filled verifies and points at nothing (APRV-457). Proving the two
|
|
19
|
+
* through one layer keeps one model of "what reached the disk" for both.
|
|
20
|
+
*
|
|
21
|
+
* Nothing in `src/` calls {@link setAppendWriteLayerForTests}. It changes how
|
|
22
|
+
* the bytes reach the disk and nothing about which bytes, so every check before
|
|
23
|
+
* the write (lock, tail, compare-and-append, schema, payload hashing) runs as in
|
|
24
|
+
* production.
|
|
25
|
+
*/
|
|
26
|
+
import { closeSync, constants as fsConstants, fsyncSync, openSync, renameSync, writeSync } from "node:fs";
|
|
27
|
+
/** Node's own `fs`, which is the only layer production ever runs. */
|
|
28
|
+
const NODE_WRITE_LAYER = {
|
|
29
|
+
open: (path, flags, mode) => openSync(path, flags, mode),
|
|
30
|
+
write: (fd, data) => writeSync(fd, data, 0, data.length),
|
|
31
|
+
fsync: (fd) => {
|
|
32
|
+
fsyncSync(fd);
|
|
33
|
+
},
|
|
34
|
+
close: (fd) => {
|
|
35
|
+
closeSync(fd);
|
|
36
|
+
},
|
|
37
|
+
rename: (from, to) => {
|
|
38
|
+
renameSync(from, to);
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
let current = NODE_WRITE_LAYER;
|
|
42
|
+
/** The layer the next append (or payload store write) uses. */
|
|
43
|
+
export function appendWriteLayer() {
|
|
44
|
+
return current;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Replace the append's write layer, or restore Node's with `null`. For tests
|
|
48
|
+
* and the opt-in benchmarks only.
|
|
49
|
+
*/
|
|
50
|
+
export function setAppendWriteLayerForTests(layer) {
|
|
51
|
+
current = layer ?? NODE_WRITE_LAYER;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The errors a directory fsync returns on a filesystem that cannot sync a
|
|
55
|
+
* directory at all (some FUSE, SMB and drvfs mounts). The same set `core/log.ts`
|
|
56
|
+
* tolerates for its first append (APRV-440); log.ts keeps its own copy so its
|
|
57
|
+
* append path stays exactly what APRV-440 shipped. EIO and everything else
|
|
58
|
+
* still fail.
|
|
59
|
+
*/
|
|
60
|
+
const DIRECTORY_FSYNC_UNSUPPORTED = new Set(["EINVAL", "EBADF", "ENOTSUP", "EOPNOTSUPP"]);
|
|
61
|
+
/**
|
|
62
|
+
* fsync a directory through the current layer, so a name created or renamed
|
|
63
|
+
* into it survives a crash. Skipped on Windows (a directory cannot be opened
|
|
64
|
+
* for this there, and its filesystems journal names themselves) and tolerated
|
|
65
|
+
* where the filesystem reports directory fsync as unsupported; every other
|
|
66
|
+
* failure throws for the caller to report. The read-only handle is closed even
|
|
67
|
+
* when the fsync throws.
|
|
68
|
+
*/
|
|
69
|
+
export function fsyncDirectory(dir) {
|
|
70
|
+
if (process.platform === "win32")
|
|
71
|
+
return;
|
|
72
|
+
const writeLayer = current;
|
|
73
|
+
const fd = writeLayer.open(dir, fsConstants.O_RDONLY, 0);
|
|
74
|
+
try {
|
|
75
|
+
writeLayer.fsync(fd);
|
|
76
|
+
}
|
|
77
|
+
catch (cause) {
|
|
78
|
+
if (!DIRECTORY_FSYNC_UNSUPPORTED.has(cause.code ?? ""))
|
|
79
|
+
throw cause;
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
try {
|
|
83
|
+
writeLayer.close(fd);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// The fsync above is what mattered; a failed close of a read-only
|
|
87
|
+
// directory handle changes nothing on disk.
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=log-write-layer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-write-layer.js","sourceRoot":"","sources":["../../../src/core/log-write-layer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,IAAI,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAiB1G,qEAAqE;AACrE,MAAM,gBAAgB,GAAqB;IACzC,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC;IACxD,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC;IACxD,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE;QACZ,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IACD,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE;QACZ,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IACD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE;QACnB,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvB,CAAC;CACF,CAAC;AAEF,IAAI,OAAO,GAAqB,gBAAgB,CAAC;AAEjD,+DAA+D;AAC/D,MAAM,UAAU,gBAAgB;IAC9B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CAAC,KAA8B;IACxE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAAC;AACtC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,2BAA2B,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;AAE1F;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO;IACzC,MAAM,UAAU,GAAG,OAAO,CAAC;IAC3B,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAE,KAA+B,CAAC,IAAI,IAAI,EAAE,CAAC;YAAE,MAAM,KAAK,CAAC;IACjG,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,kEAAkE;YAClE,4CAA4C;QAC9C,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/src/core/log.d.ts
CHANGED
|
@@ -42,10 +42,31 @@
|
|
|
42
42
|
* canonicalization minus the `hash` field. One scheme, two inputs — a
|
|
43
43
|
* verifier strips `hash` and re-derives. Appended with a single `write(2)`
|
|
44
44
|
* on a handle opened `O_APPEND`.
|
|
45
|
+
* 5b. **Durable before ok (APRV-440).** The write is followed by `fsync(2)` on
|
|
46
|
+
* the same descriptor, and only then does the append report ok. When this
|
|
47
|
+
* append created the file, the log directory is fsynced too (and the parent
|
|
48
|
+
* of every directory this call created), so the new name survives along with
|
|
49
|
+
* its bytes. Without this, an acknowledged record lived in the page cache
|
|
50
|
+
* only: a platform kill before writeback left the file extended over blocks
|
|
51
|
+
* that were never written, which reads back as a NUL-filled unterminated tail
|
|
52
|
+
* (observed on a hosted tenant on 2026-09-25: an acknowledged attestation
|
|
53
|
+
* lost, 456 NUL bytes in its place). Atomicity against concurrent writers
|
|
54
|
+
* was guarantee 5 all along; durability against the machine dying is this one.
|
|
55
|
+
*
|
|
56
|
+
* 6. **The writing daemon names itself, or is refused (APRV-383).** A record
|
|
57
|
+
* appended by a declaring daemon process carries `daemon`, the id of the
|
|
58
|
+
* instance that wrote it, so a tenant reading a log hosted by somebody else can
|
|
59
|
+
* tell which daemon acted on their behalf. The id comes from this process's own
|
|
60
|
+
* state (`core/daemon-identity.ts`) and never from the caller, and where the
|
|
61
|
+
* attested policy lists the ids that may write, an unlisted one is refused here
|
|
62
|
+
* with nothing written. Every earlier record, carrying no such field, validates
|
|
63
|
+
* and verifies unchanged.
|
|
45
64
|
*
|
|
46
65
|
* Determinism: `ts` is supplied by the caller. This module never reads the
|
|
47
66
|
* clock, because a hash-relevant field sourced from ambient state would make
|
|
48
|
-
* the log irreproducible.
|
|
67
|
+
* the log irreproducible. `daemon` is ambient in the same sense and is not a
|
|
68
|
+
* counter-example: a log is reproducible per WRITER, the field says which writer,
|
|
69
|
+
* and a verifier re-derives the hash from the record's own bytes either way.
|
|
49
70
|
*/
|
|
50
71
|
import { type ValidateOptions, type ValidationError } from "./validate.js";
|
|
51
72
|
/** SPEC.md §8: the hash scheme identifier stamped on every v0.1 record. */
|
|
@@ -159,7 +180,15 @@ export declare const GENESIS_PREV: null;
|
|
|
159
180
|
* backdate a sign-off could place it before bytes they never saw.
|
|
160
181
|
*/
|
|
161
182
|
export type EventType = "task.registered" | "route.proposed" | "route.accepted" | "approval.requested" | "approval.granted" | "approval.rejected" | "approval.expired" | "approval.revoked" | "approval.withdrawn" | "execution.started" | "execution.completed" | "execution.failed" | "execution.indeterminate" | "execution.reconciled" | "budget.exceeded" | "policy.updated" | "policy.proposed" | "policy.declined" | "envelope.drift" | "audit.sampled" | "audit.reviewed" | "audit.dark_session" | "audit.decision_refused" | "audit.gesture_refused" | "audit.question_preempted" | "reconciliation.required" | "reconciliation.satisfied" | "payload.pruned" | "gate.opened" | "gate.closed" | "gate.bypassed" | "gate.organ.attested" | "gate.path.signed_off" | "log.checkpoint";
|
|
162
|
-
/**
|
|
183
|
+
/**
|
|
184
|
+
* Caller-supplied content of an event. Chain fields are not accepted.
|
|
185
|
+
*
|
|
186
|
+
* Nor is `daemon` (APRV-383): which daemon wrote a record is a fact about the
|
|
187
|
+
* writing PROCESS, and a member here would be a field any caller could set. It is
|
|
188
|
+
* stamped by {@link buildRecord} from `core/daemon-identity.ts`'s process state,
|
|
189
|
+
* and a caller that puts the property on its input object anyway is ignored,
|
|
190
|
+
* because a record is composed field by field rather than spread.
|
|
191
|
+
*/
|
|
163
192
|
export interface EventInput {
|
|
164
193
|
/** RFC 3339 timestamp. Supplied by the caller; never read from the clock. */
|
|
165
194
|
ts: string;
|
|
@@ -177,6 +206,19 @@ export interface EventRecord extends EventInput {
|
|
|
177
206
|
alg: typeof ALG;
|
|
178
207
|
hash: string;
|
|
179
208
|
prev: string | null;
|
|
209
|
+
/**
|
|
210
|
+
* WHICH daemon instance appended this record (APRV-383), present exactly on the
|
|
211
|
+
* records a declaring daemon process wrote.
|
|
212
|
+
*
|
|
213
|
+
* OPTIONAL and additive: every record written before the field existed
|
|
214
|
+
* validates and verifies unchanged, and its absence means what it has always
|
|
215
|
+
* meant — nothing about this record says a daemon wrote it. It is a top-level
|
|
216
|
+
* field, so the record's own chain hash covers it the way it covers `actor`; it
|
|
217
|
+
* never reaches a payload hash or a token, and nothing in the runtime reads it
|
|
218
|
+
* as an input to a verdict (SPEC.md §11.1 invariant 4, and
|
|
219
|
+
* `core/daemon-identity.ts` for the whole of that argument).
|
|
220
|
+
*/
|
|
221
|
+
daemon?: string;
|
|
180
222
|
}
|
|
181
223
|
/** The hash input: a record with every field except `hash`. */
|
|
182
224
|
export type UnhashedRecord = Omit<EventRecord, "hash">;
|
|
@@ -188,24 +230,7 @@ export type UnhashedRecord = Omit<EventRecord, "hash">;
|
|
|
188
230
|
* breaking change. `head-moved` is the APRV-20 addition (finding B1), sanctioned
|
|
189
231
|
* by the human decision of 2026-08-07.
|
|
190
232
|
*/
|
|
191
|
-
export declare const APPEND_ERROR_CODES: readonly [
|
|
192
|
-
/** The lockfile was held by another writer for longer than the timeout. */
|
|
193
|
-
"lock-timeout",
|
|
194
|
-
/** The file's last line is truncated or unparseable; nothing may chain onto it. */
|
|
195
|
-
"corrupt-tail",
|
|
196
|
-
/** The complete record failed the `event` schema at the write boundary. */
|
|
197
|
-
"validation",
|
|
198
|
-
/** The record could not be canonicalized (RFC 8785). */
|
|
199
|
-
"canonicalization",
|
|
200
|
-
/** The log could not be created, opened, or written. */
|
|
201
|
-
"io",
|
|
202
|
-
/**
|
|
203
|
-
* The caller supplied {@link AppendOptions.expectedHead} and the log's actual
|
|
204
|
-
* tail, read under the lock, is a different `(seq, hash)`. Someone appended
|
|
205
|
-
* between the caller's read and this append, so every read-dependent check the
|
|
206
|
-
* caller made is stale. Nothing was written.
|
|
207
|
-
*/
|
|
208
|
-
"head-moved"];
|
|
233
|
+
export declare const APPEND_ERROR_CODES: readonly ["lock-timeout", "corrupt-tail", "validation", "canonicalization", "io", "head-moved", "daemon-id-invalid", "daemon-not-allowed"];
|
|
209
234
|
export type AppendErrorCode = (typeof APPEND_ERROR_CODES)[number];
|
|
210
235
|
export interface AppendError {
|
|
211
236
|
code: AppendErrorCode;
|
|
@@ -311,6 +336,10 @@ export declare function serializeRecord(record: EventRecord): string;
|
|
|
311
336
|
* guarantee that nobody else is appending while it works.
|
|
312
337
|
*/
|
|
313
338
|
export declare function withAppendLock<T>(logPath: string, run: () => T, options?: LockOptions): LockedResult<T>;
|
|
314
|
-
/**
|
|
339
|
+
/**
|
|
340
|
+
* Subscribe to appends that put bytes in the file: every successful one, and
|
|
341
|
+
* since APRV-440 one that wrote and then failed to confirm them durable (a
|
|
342
|
+
* short write, a failed fsync). Process-wide, memory-only, additive.
|
|
343
|
+
*/
|
|
315
344
|
export declare function onLogAppended(listener: (logPath: string) => void): void;
|
|
316
345
|
export declare function appendEvent(logPath: string, input: EventInput, options?: AppendOptions): AppendResult;
|
package/dist/src/core/log.js
CHANGED
|
@@ -42,15 +42,38 @@
|
|
|
42
42
|
* canonicalization minus the `hash` field. One scheme, two inputs — a
|
|
43
43
|
* verifier strips `hash` and re-derives. Appended with a single `write(2)`
|
|
44
44
|
* on a handle opened `O_APPEND`.
|
|
45
|
+
* 5b. **Durable before ok (APRV-440).** The write is followed by `fsync(2)` on
|
|
46
|
+
* the same descriptor, and only then does the append report ok. When this
|
|
47
|
+
* append created the file, the log directory is fsynced too (and the parent
|
|
48
|
+
* of every directory this call created), so the new name survives along with
|
|
49
|
+
* its bytes. Without this, an acknowledged record lived in the page cache
|
|
50
|
+
* only: a platform kill before writeback left the file extended over blocks
|
|
51
|
+
* that were never written, which reads back as a NUL-filled unterminated tail
|
|
52
|
+
* (observed on a hosted tenant on 2026-09-25: an acknowledged attestation
|
|
53
|
+
* lost, 456 NUL bytes in its place). Atomicity against concurrent writers
|
|
54
|
+
* was guarantee 5 all along; durability against the machine dying is this one.
|
|
55
|
+
*
|
|
56
|
+
* 6. **The writing daemon names itself, or is refused (APRV-383).** A record
|
|
57
|
+
* appended by a declaring daemon process carries `daemon`, the id of the
|
|
58
|
+
* instance that wrote it, so a tenant reading a log hosted by somebody else can
|
|
59
|
+
* tell which daemon acted on their behalf. The id comes from this process's own
|
|
60
|
+
* state (`core/daemon-identity.ts`) and never from the caller, and where the
|
|
61
|
+
* attested policy lists the ids that may write, an unlisted one is refused here
|
|
62
|
+
* with nothing written. Every earlier record, carrying no such field, validates
|
|
63
|
+
* and verifies unchanged.
|
|
45
64
|
*
|
|
46
65
|
* Determinism: `ts` is supplied by the caller. This module never reads the
|
|
47
66
|
* clock, because a hash-relevant field sourced from ambient state would make
|
|
48
|
-
* the log irreproducible.
|
|
67
|
+
* the log irreproducible. `daemon` is ambient in the same sense and is not a
|
|
68
|
+
* counter-example: a log is reproducible per WRITER, the field says which writer,
|
|
69
|
+
* and a verifier re-derives the hash from the record's own bytes either way.
|
|
49
70
|
*/
|
|
50
71
|
import { createHash } from "node:crypto";
|
|
51
|
-
import { closeSync, fstatSync, mkdirSync, openSync, readSync, unlinkSync,
|
|
72
|
+
import { closeSync, constants as fsConstants, fstatSync, mkdirSync, openSync, readSync, unlinkSync, } from "node:fs";
|
|
52
73
|
import { dirname } from "node:path";
|
|
74
|
+
import { DAEMON_APPEND_REFUSAL_CODES, daemonStampForAppend, } from "./daemon-identity.js";
|
|
53
75
|
import { canonicalize, JcsError } from "./jcs.js";
|
|
76
|
+
import { appendWriteLayer } from "./log-write-layer.js";
|
|
54
77
|
import { validate } from "./validate.js";
|
|
55
78
|
/** SPEC.md §8: the hash scheme identifier stamped on every v0.1 record. */
|
|
56
79
|
export const ALG = "sha256/jcs";
|
|
@@ -85,6 +108,15 @@ export const APPEND_ERROR_CODES = [
|
|
|
85
108
|
* caller made is stale. Nothing was written.
|
|
86
109
|
*/
|
|
87
110
|
"head-moved",
|
|
111
|
+
/**
|
|
112
|
+
* The two identity refusals of APRV-383, spread in from
|
|
113
|
+
* `core/daemon-identity.ts` where the logic that emits them lives: a daemon that
|
|
114
|
+
* declared an unusable id, and a daemon whose id the attested policy's `daemons`
|
|
115
|
+
* list does not admit. Both leave the file byte-identical, like every member
|
|
116
|
+
* above them, and both are additions to the closed union rather than renames of
|
|
117
|
+
* anything in it.
|
|
118
|
+
*/
|
|
119
|
+
...DAEMON_APPEND_REFUSAL_CODES,
|
|
88
120
|
];
|
|
89
121
|
const DEFAULT_LOCK_TIMEOUT_MS = 2_000;
|
|
90
122
|
const DEFAULT_LOCK_RETRY_MS = 20;
|
|
@@ -138,6 +170,82 @@ function sleepSync(ms) {
|
|
|
138
170
|
const buffer = new Int32Array(new SharedArrayBuffer(4));
|
|
139
171
|
Atomics.wait(buffer, 0, 0, ms);
|
|
140
172
|
}
|
|
173
|
+
/** `O_APPEND` writer flags; `O_EXCL` added for the first try, so creation is known. */
|
|
174
|
+
const APPEND_FLAGS = fsConstants.O_WRONLY | fsConstants.O_APPEND | fsConstants.O_CREAT;
|
|
175
|
+
/** The mode Node's `"a"` opens with; the umask applies as it always did. */
|
|
176
|
+
const APPEND_MODE = 0o666;
|
|
177
|
+
/**
|
|
178
|
+
* Open `logPath` for append and say whether this call created it. `O_EXCL`
|
|
179
|
+
* first: under the append lock no other sanctioned writer can race the create, so
|
|
180
|
+
* `EEXIST` means the file was already there and a plain append open follows.
|
|
181
|
+
*/
|
|
182
|
+
function openForAppend(logPath) {
|
|
183
|
+
const writeLayer = appendWriteLayer();
|
|
184
|
+
try {
|
|
185
|
+
return { fd: writeLayer.open(logPath, APPEND_FLAGS | fsConstants.O_EXCL, APPEND_MODE), created: true };
|
|
186
|
+
}
|
|
187
|
+
catch (cause) {
|
|
188
|
+
if (cause.code !== "EEXIST")
|
|
189
|
+
throw cause;
|
|
190
|
+
}
|
|
191
|
+
return { fd: writeLayer.open(logPath, APPEND_FLAGS, APPEND_MODE), created: false };
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* The errors a directory fsync returns on a filesystem that cannot sync a
|
|
195
|
+
* directory at all (some FUSE, SMB and drvfs mounts). PostgreSQL ignores the
|
|
196
|
+
* same set for the same reason: there, every first append would otherwise
|
|
197
|
+
* report io with record 1 already in the file, inviting a re-run and a
|
|
198
|
+
* duplicate. EIO and everything else still fail the append.
|
|
199
|
+
*/
|
|
200
|
+
const DIRECTORY_FSYNC_UNSUPPORTED = new Set(["EINVAL", "EBADF", "ENOTSUP", "EOPNOTSUPP"]);
|
|
201
|
+
/**
|
|
202
|
+
* fsync a directory, so a name created in it survives a crash. Windows cannot
|
|
203
|
+
* open a directory for this and its filesystems journal names themselves, so it
|
|
204
|
+
* is skipped there, as is a filesystem that reports directory fsync as
|
|
205
|
+
* unsupported; everywhere else a failure is the caller's to report.
|
|
206
|
+
*/
|
|
207
|
+
function fsyncDirectory(dir) {
|
|
208
|
+
if (process.platform === "win32")
|
|
209
|
+
return;
|
|
210
|
+
const writeLayer = appendWriteLayer();
|
|
211
|
+
const fd = writeLayer.open(dir, fsConstants.O_RDONLY, 0);
|
|
212
|
+
try {
|
|
213
|
+
writeLayer.fsync(fd);
|
|
214
|
+
}
|
|
215
|
+
catch (cause) {
|
|
216
|
+
if (!DIRECTORY_FSYNC_UNSUPPORTED.has(cause.code ?? ""))
|
|
217
|
+
throw cause;
|
|
218
|
+
}
|
|
219
|
+
finally {
|
|
220
|
+
try {
|
|
221
|
+
writeLayer.close(fd);
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
// The fsync above is what mattered; a failed close of a read-only
|
|
225
|
+
// directory handle changes nothing on disk.
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* The directories whose entries a first append made new: the log's own
|
|
231
|
+
* directory (which gained the file), and, when `withAppendLock` had to create
|
|
232
|
+
* directories, the parent of each one it created, up to and including the
|
|
233
|
+
* parent of the topmost. Ordered innermost first.
|
|
234
|
+
*/
|
|
235
|
+
function directoriesToSync(logPath, firstCreatedDir) {
|
|
236
|
+
const dirs = [dirname(logPath)];
|
|
237
|
+
if (firstCreatedDir === undefined)
|
|
238
|
+
return dirs;
|
|
239
|
+
const stop = dirname(firstCreatedDir);
|
|
240
|
+
for (let dir = dirs[0]; dir !== stop;) {
|
|
241
|
+
const parent = dirname(dir);
|
|
242
|
+
if (parent === dir)
|
|
243
|
+
break; // the filesystem root: nothing above to sync
|
|
244
|
+
dirs.push(parent);
|
|
245
|
+
dir = parent;
|
|
246
|
+
}
|
|
247
|
+
return dirs;
|
|
248
|
+
}
|
|
141
249
|
/**
|
|
142
250
|
* Acquire `<logPath>.lock` by `open(…, "wx")` — atomic create-or-fail, which
|
|
143
251
|
* needs no dependency and works on every platform Node supports. Retries with
|
|
@@ -385,8 +493,13 @@ function headPrecondition(logPath, expected, tail) {
|
|
|
385
493
|
* Build a complete record from caller content plus chain state. Property
|
|
386
494
|
* insertion order is irrelevant to the digest (JCS sorts keys) but is kept
|
|
387
495
|
* readable here for anyone eyeballing the code.
|
|
496
|
+
*
|
|
497
|
+
* `daemon` comes from the writing process and never from `input`, which is why it
|
|
498
|
+
* is a parameter here rather than a member of {@link EventInput}: this function
|
|
499
|
+
* composes a record field by field, so there is no spelling of a caller's input
|
|
500
|
+
* that can put a `daemon` on a record.
|
|
388
501
|
*/
|
|
389
|
-
function buildRecord(input, seq, prev) {
|
|
502
|
+
function buildRecord(input, seq, prev, daemon) {
|
|
390
503
|
const record = {
|
|
391
504
|
seq,
|
|
392
505
|
ts: input.ts,
|
|
@@ -396,6 +509,10 @@ function buildRecord(input, seq, prev) {
|
|
|
396
509
|
prev,
|
|
397
510
|
hash: "",
|
|
398
511
|
};
|
|
512
|
+
// Beside `actor`, because it answers the same question about a different layer:
|
|
513
|
+
// who caused the event, and which process wrote it down.
|
|
514
|
+
if (daemon !== null)
|
|
515
|
+
record.daemon = daemon;
|
|
399
516
|
if (input.task !== undefined)
|
|
400
517
|
record.task = input.task;
|
|
401
518
|
if (input.action_key !== undefined)
|
|
@@ -434,8 +551,17 @@ function buildRecord(input, seq, prev) {
|
|
|
434
551
|
* guarantee that nobody else is appending while it works.
|
|
435
552
|
*/
|
|
436
553
|
export function withAppendLock(logPath, run, options = {}) {
|
|
554
|
+
return lockedRun(logPath, () => run(), options);
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* {@link withAppendLock}, also telling `run` the first directory its `mkdir`
|
|
558
|
+
* created (`undefined` when the log's directory already existed), which the
|
|
559
|
+
* append needs to know which directory entries are new (APRV-440).
|
|
560
|
+
*/
|
|
561
|
+
function lockedRun(logPath, run, options) {
|
|
562
|
+
let firstCreatedDir;
|
|
437
563
|
try {
|
|
438
|
-
mkdirSync(dirname(logPath), { recursive: true });
|
|
564
|
+
firstCreatedDir = mkdirSync(dirname(logPath), { recursive: true });
|
|
439
565
|
}
|
|
440
566
|
catch (cause) {
|
|
441
567
|
return {
|
|
@@ -450,7 +576,7 @@ export function withAppendLock(logPath, run, options = {}) {
|
|
|
450
576
|
if (!lock.ok)
|
|
451
577
|
return { ok: false, error: lock.error };
|
|
452
578
|
try {
|
|
453
|
-
return { ok: true, value: run() };
|
|
579
|
+
return { ok: true, value: run(firstCreatedDir) };
|
|
454
580
|
}
|
|
455
581
|
finally {
|
|
456
582
|
releaseLock(lock.path);
|
|
@@ -467,7 +593,11 @@ export function withAppendLock(logPath, run, options = {}) {
|
|
|
467
593
|
* not turn a written record into a failed one, so throws are swallowed.
|
|
468
594
|
*/
|
|
469
595
|
const appendListeners = [];
|
|
470
|
-
/**
|
|
596
|
+
/**
|
|
597
|
+
* Subscribe to appends that put bytes in the file: every successful one, and
|
|
598
|
+
* since APRV-440 one that wrote and then failed to confirm them durable (a
|
|
599
|
+
* short write, a failed fsync). Process-wide, memory-only, additive.
|
|
600
|
+
*/
|
|
471
601
|
export function onLogAppended(listener) {
|
|
472
602
|
appendListeners.push(listener);
|
|
473
603
|
}
|
|
@@ -482,7 +612,22 @@ function noteAppend(logPath) {
|
|
|
482
612
|
}
|
|
483
613
|
}
|
|
484
614
|
export function appendEvent(logPath, input, options = {}) {
|
|
485
|
-
|
|
615
|
+
// Which daemon is writing, and whether it may (APRV-383). Asked of this
|
|
616
|
+
// process's own state rather than of the caller, and asked BEFORE the lock
|
|
617
|
+
// because it reads no log state: taking a lock only to refuse would make every
|
|
618
|
+
// other writer wait for an answer that was never going to touch the file. It is
|
|
619
|
+
// the write boundary in the sense that matters — one code path, nothing written
|
|
620
|
+
// on the refused branch, and the record's own schema pins the field's shape so a
|
|
621
|
+
// malformed id could not land even if this check were absent.
|
|
622
|
+
const stamp = daemonStampForAppend();
|
|
623
|
+
if (stamp.kind === "refuse")
|
|
624
|
+
return fail(stamp.code, stamp.message);
|
|
625
|
+
const daemon = stamp.kind === "stamp" ? stamp.id : null;
|
|
626
|
+
// Set once bytes may reach the file, success or not: the read cache
|
|
627
|
+
// must re-prove a log whose bytes changed even when the append then failed to
|
|
628
|
+
// confirm them durable.
|
|
629
|
+
let wrote = false;
|
|
630
|
+
const held = lockedRun(logPath, (firstCreatedDir) => {
|
|
486
631
|
const tail = readTail(logPath);
|
|
487
632
|
if (!tail.ok)
|
|
488
633
|
return { ok: false, error: tail.error };
|
|
@@ -497,7 +642,7 @@ export function appendEvent(logPath, input, options = {}) {
|
|
|
497
642
|
let record;
|
|
498
643
|
let line;
|
|
499
644
|
try {
|
|
500
|
-
record = buildRecord(input, tail.tail.seq + 1, tail.tail.hash);
|
|
645
|
+
record = buildRecord(input, tail.tail.seq + 1, tail.tail.hash, daemon);
|
|
501
646
|
// Stored line = JCS of the complete record; digest input excluded `hash`.
|
|
502
647
|
line = serializeRecord(record);
|
|
503
648
|
}
|
|
@@ -512,34 +657,67 @@ export function appendEvent(logPath, input, options = {}) {
|
|
|
512
657
|
if (!validation.ok) {
|
|
513
658
|
return fail("validation", `event failed schema validation at the write boundary; log left unchanged`, validation.errors);
|
|
514
659
|
}
|
|
515
|
-
let
|
|
660
|
+
let opened;
|
|
516
661
|
try {
|
|
517
|
-
|
|
662
|
+
opened = openForAppend(logPath);
|
|
518
663
|
}
|
|
519
664
|
catch (cause) {
|
|
520
665
|
return fail("io", `log ${logPath} could not be opened for append: ${errorMessage(cause)}`);
|
|
521
666
|
}
|
|
667
|
+
const { fd, created } = opened;
|
|
668
|
+
const writeLayer = appendWriteLayer();
|
|
669
|
+
const bytes = Buffer.from(`${line}\n`, "utf8");
|
|
522
670
|
try {
|
|
523
671
|
// Single write syscall on an O_APPEND handle: the line lands whole or not at all.
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
672
|
+
// Set BEFORE the write: one that throws may still have put bytes in the
|
|
673
|
+
// file, and a needless re-proof by the read cache costs only time.
|
|
674
|
+
wrote = true;
|
|
675
|
+
let written;
|
|
676
|
+
try {
|
|
677
|
+
written = writeLayer.write(fd, bytes);
|
|
678
|
+
}
|
|
679
|
+
catch (cause) {
|
|
680
|
+
return fail("io", `log ${logPath} could not be written: ${errorMessage(cause)}`);
|
|
681
|
+
}
|
|
682
|
+
if (written !== bytes.length) {
|
|
683
|
+
return fail("io", `log ${logPath} took ${String(written)} of ${String(bytes.length)} bytes of seq ${String(record.seq)}: the write was short, so the file now ends with a torn line and the record was not appended`);
|
|
684
|
+
}
|
|
685
|
+
// Durable before ok (guarantee 5b). Until this returns, the record exists
|
|
686
|
+
// in the page cache only, and a kill before writeback leaves the file
|
|
687
|
+
// extended over unwritten blocks: a NUL-filled tail where the record was.
|
|
688
|
+
try {
|
|
689
|
+
writeLayer.fsync(fd);
|
|
690
|
+
}
|
|
691
|
+
catch (cause) {
|
|
692
|
+
return fail("io", `log ${logPath}: seq ${String(record.seq)} was written but fsync failed (${errorMessage(cause)}), so it is not known to be durable: it may be in the file now and gone after a crash. Re-read the log before deciding anything from it.`);
|
|
693
|
+
}
|
|
528
694
|
}
|
|
529
695
|
finally {
|
|
530
696
|
try {
|
|
531
|
-
|
|
697
|
+
writeLayer.close(fd);
|
|
532
698
|
}
|
|
533
699
|
catch {
|
|
534
|
-
// Nothing actionable
|
|
700
|
+
// Nothing actionable: the bytes are written and, on the ok path, synced.
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
// A new file is a new directory entry, and fsync of the file does not make
|
|
704
|
+
// its NAME durable: without this a crash can keep the bytes and lose the file.
|
|
705
|
+
if (created) {
|
|
706
|
+
for (const dir of directoriesToSync(logPath, firstCreatedDir)) {
|
|
707
|
+
try {
|
|
708
|
+
fsyncDirectory(dir);
|
|
709
|
+
}
|
|
710
|
+
catch (cause) {
|
|
711
|
+
return fail("io", `log ${logPath}: seq ${String(record.seq)} was written and synced but its directory ${dir} could not be (${errorMessage(cause)}), so the newly created file is not known to survive a crash. Re-read the log before deciding anything from it.`);
|
|
712
|
+
}
|
|
535
713
|
}
|
|
536
714
|
}
|
|
537
715
|
return { ok: true, record, line };
|
|
538
716
|
}, options);
|
|
539
717
|
const result = held.ok ? held.value : { ok: false, error: held.error };
|
|
540
|
-
// After the lock is released
|
|
541
|
-
// reader cache must not serve a prefix proof anchored before this write.
|
|
542
|
-
if (
|
|
718
|
+
// After the lock is released, for every append that put bytes in the file:
|
|
719
|
+
// the reader cache must not serve a prefix proof anchored before this write.
|
|
720
|
+
if (wrote)
|
|
543
721
|
noteAppend(logPath);
|
|
544
722
|
return result;
|
|
545
723
|
}
|
package/dist/src/core/log.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../../src/core/log.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../../src/core/log.ts"],"names":[],"mappings":"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"}
|
|
@@ -72,3 +72,54 @@ export interface PayloadStoreCensus {
|
|
|
72
72
|
* them is a health verdict; a reader is being told what is there.
|
|
73
73
|
*/
|
|
74
74
|
export declare function payloadStoreCensus(records: EventRecord[], storeDir: string): PayloadStoreCensus;
|
|
75
|
+
/**
|
|
76
|
+
* One bound payload the store does not hold intact.
|
|
77
|
+
*
|
|
78
|
+
* - `torn`: the file is there and is empty or every byte is NUL. That is what a
|
|
79
|
+
* crash before writeback leaves (the name reached the disk, the data did
|
|
80
|
+
* not), and it is the only reading this module gives the crash signature. No
|
|
81
|
+
* valid payload can look like it: an RFC 8785 serialization is never empty
|
|
82
|
+
* and never carries a raw NUL byte.
|
|
83
|
+
* - `lost`: the file is absent although a record proves the store held it when
|
|
84
|
+
* the record was appended (see {@link heldAtAppend}). That is the other half of
|
|
85
|
+
* the same crash: the name never reached the disk.
|
|
86
|
+
* - `mismatch`: the file holds at least one non-NUL byte and does not verify
|
|
87
|
+
* against its name. Not the crash signature, by construction: a crash does not
|
|
88
|
+
* write bytes nobody wrote. Read as tampering or corruption.
|
|
89
|
+
* - `unreadable`: the file exists and could not be read (a permission, an I/O
|
|
90
|
+
* error); nothing about its bytes is known.
|
|
91
|
+
*/
|
|
92
|
+
export type PayloadDamage = {
|
|
93
|
+
kind: "torn";
|
|
94
|
+
hash: string;
|
|
95
|
+
seq: number;
|
|
96
|
+
bytes: number;
|
|
97
|
+
path: string;
|
|
98
|
+
} | {
|
|
99
|
+
kind: "lost";
|
|
100
|
+
hash: string;
|
|
101
|
+
seq: number;
|
|
102
|
+
event: string;
|
|
103
|
+
path: string;
|
|
104
|
+
} | {
|
|
105
|
+
kind: "mismatch";
|
|
106
|
+
hash: string;
|
|
107
|
+
seq: number;
|
|
108
|
+
detail: string;
|
|
109
|
+
path: string;
|
|
110
|
+
} | {
|
|
111
|
+
kind: "unreadable";
|
|
112
|
+
hash: string;
|
|
113
|
+
seq: number;
|
|
114
|
+
detail: string;
|
|
115
|
+
path: string;
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Every payload a verified record binds that the store does not hold intact,
|
|
119
|
+
* in log order. Reads files; writes, moves and deletes nothing.
|
|
120
|
+
*
|
|
121
|
+
* `records` must be the verified chain (doctor passes the records of its one
|
|
122
|
+
* verified walk). A hash a `payload.pruned` record names is skipped whatever
|
|
123
|
+
* its file holds: retention removed it on purpose and the log says so.
|
|
124
|
+
*/
|
|
125
|
+
export declare function payloadIntegrity(records: EventRecord[], storeDir: string): PayloadDamage[];
|