reeflog-client 0.7.22 → 0.7.23

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 (2) hide show
  1. package/README.md +23 -6
  2. package/package.json +2 -2
package/README.md CHANGED
@@ -5,7 +5,7 @@ they did to account balances for selected programs into a cursor-addressed
5
5
  append-only log, so a consumer resumes without gaps after a crash,
6
6
  disconnect, or reorg.
7
7
 
8
- **Status: v0.7.22 shipped (2026-11-13), v0 working.** Live against mainnet-beta: see *Measured results* below. Install the binary without a Rust toolchain: `npm install reeflog-client` then `import { bootstrap } from 'reeflog-client'; await bootstrap()` (downloads the prebuilt release archive and verifies its sha256; the archive digests are `6bfec083…` linux / `303d0836…` macos, both equal what the release API publishes). The same install from the tagged release: `npm install github:auroraxo/reeflog#v0.7.22`. Or from source: `cargo install --git https://github.com/auroraxo/reeflog --tag v0.7.22`. The full event envelope (logs, balances, instructions, account list with owners, the bytes each account held, and the authority each token account had at the moment of the event), the Node client (see *The Node client*), webhook fan-out, a dead-letter queue, and archive backfill ship in this tree; Yellowstone as a second transport does not.
8
+ **Status: v0.7.23 shipped (2026-11-13), v0 working.** Live against mainnet-beta: see *Measured results* below. Install the binary without a Rust toolchain: `npm install reeflog-client` then `import { bootstrap } from 'reeflog-client'; await bootstrap()` (downloads the prebuilt release archive and verifies its sha256; the archive digests are `747e2db8…` linux / `fc2bcecc…` macos, both equal what the release API publishes). The same install from the tagged release: `npm install github:auroraxo/reeflog#v0.7.23`. Or from source: `cargo install --git https://github.com/auroraxo/reeflog --tag v0.7.23`. The full event envelope (logs, balances, instructions, account list with owners, the bytes each account held, and the authority each token account had at the moment of the event), the Node client (see *The Node client*), webhook fan-out, a dead-letter queue, and archive backfill ship in this tree; Yellowstone as a second transport does not.
9
9
 
10
10
  ## The idea
11
11
 
@@ -883,7 +883,24 @@ reeflog start --db reeflog.db --webhook-config webhooks.json --webhook-every 5
883
883
  in chain order and never with a hole in front of it. It may see one
884
884
  twice; the stable id (`X-Reeflog-Event-Id: <target>:<kind>:<seq>`) is
885
885
  what a consumer dedups on for exactly-once.
886
- 3. **The payload is authenticated.** Every request carries
886
+ 3. **A payload the journal still owes is not delivered.** A row whose
887
+ content the journal owes (`logs IS NULL AND payload_state IS NULL`) is a
888
+ signature, not an event — since v0.7.23 the event queue HOLDS at it:
889
+ rows before it are delivered, the target's cursor stays behind the owed
890
+ row, no receipt is written, `push` exits 3 naming `hydrate`, and once the
891
+ debt is paid the SAME target receives the row complete. Measured on the
892
+ published v0.7.22 asset (`research/webhook-payload-hold-baseline-v0722-
893
+ 2026-11-13.json`, verdict `webhook-payload-hold-defect-present`): the
894
+ receiver got the owed row as a signed body with `logs: null`, `next_seq`
895
+ moved 0 → 1, a receipt was written, and the second pass after `hydrate`
896
+ delivered nothing — the finished event was permanently unreachable for
897
+ that consumer while a fresh target read it. This is the same rule
898
+ `tail` holds since v0.7.22, one channel over: the webhook body is
899
+ SIGNED, so a receiver cannot tell a signature without content from a
900
+ real event. A recorded outcome (`unavailable` / `invalid` / `no_metadata`)
901
+ is never held — it is an answer, not a debt — and retractions are never
902
+ held by this rule either.
903
+ 4. **The payload is authenticated.** Every request carries
887
904
  `X-Reeflog-Signature: sha256=<hex>` = HMAC-SHA256(secret, body) over the
888
905
  exact bytes sent (canonical JSON — `serde_json`'s sorted keys, so the same
889
906
  event always produces the same signature). The receiver checks it with
@@ -893,14 +910,14 @@ reeflog start --db reeflog.db --webhook-config webhooks.json --webhook-every 5
893
910
  import hmac, hashlib
894
911
  want = "sha256=" + hmac.new(secret, body, hashlib.sha256).hexdigest()
895
912
  ```
896
- 4. **A retraction is delivered too**, on its own cursor, and it is delivered
913
+ 5. **A retraction is delivered too**, on its own cursor, and it is delivered
897
914
  *even when the event queue is blocked behind a refusal* — a retraction is
898
915
  the one message whose lateness costs money.
899
- 5. **Receipts make the crash window safe.** The state (per-target cursor)
916
+ 6. **Receipts make the crash window safe.** The state (per-target cursor)
900
917
  and the receipts (which exact body was accepted, by sha256) live in the
901
918
  journal. A daemon that dies between "POST succeeded" and "cursor advanced"
902
919
  does not deliver the event twice on the next pass.
903
- 6. **A refusal stops being a verdict only when it stops repeating.** One
920
+ 7. **A refusal stops being a verdict only when it stops repeating.** One
904
921
  4xx can be an accident (mid-deploy, a config reload), so the refusal is
905
922
  counted. After `dead_letter_after` refused attempts on the same event
906
923
  (default 5, `0` disables it) the event moves to the **dead-letter queue**:
@@ -1671,7 +1688,7 @@ contract, and a library's idea of the schema cannot drift from the daemon's.
1671
1688
 
1672
1689
  ```bash
1673
1690
  npm install reeflog-client # the registry; this version, no Rust toolchain
1674
- npm install github:auroraxo/reeflog#v0.7.22 # the same client from the tagged release
1691
+ npm install github:auroraxo/reeflog#v0.7.23 # the same client from the tagged release
1675
1692
  ```
1676
1693
 
1677
1694
  The client needs the `reeflog` binary. `bootstrap()` gets it **without a
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reeflog-client",
3
- "version": "0.7.22",
3
+ "version": "0.7.23",
4
4
  "description": "Node client for reeflog, the durable local mailbox for Solana events: cursor-based event delivery, retractions, health and repair.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -31,6 +31,6 @@
31
31
  "test": "node --test"
32
32
  },
33
33
  "dependencies": {
34
- "reeflog-client": "github:auroraxo/reeflog#v0.7.21"
34
+ "reeflog-client": "github:auroraxo/reeflog#v0.7.22"
35
35
  }
36
36
  }