@optimystic/db-core 0.24.2 → 0.25.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/dist/src/blocks/helpers.d.ts +5 -0
- package/dist/src/blocks/helpers.d.ts.map +1 -1
- package/dist/src/blocks/helpers.js +12 -0
- package/dist/src/blocks/helpers.js.map +1 -1
- package/dist/src/cluster/membership.d.ts +7 -0
- package/dist/src/cluster/membership.d.ts.map +1 -1
- package/dist/src/cluster/membership.js +12 -8
- package/dist/src/cluster/membership.js.map +1 -1
- package/dist/src/cluster/structs.d.ts +27 -1
- package/dist/src/cluster/structs.d.ts.map +1 -1
- package/dist/src/cluster/structs.js.map +1 -1
- package/dist/src/collection/action.d.ts +14 -0
- package/dist/src/collection/action.d.ts.map +1 -1
- package/dist/src/collection/action.js +16 -1
- package/dist/src/collection/action.js.map +1 -1
- package/dist/src/collection/collection.d.ts +273 -4
- package/dist/src/collection/collection.d.ts.map +1 -1
- package/dist/src/collection/collection.js +427 -30
- package/dist/src/collection/collection.js.map +1 -1
- package/dist/src/collections/tree/tree.d.ts +16 -1
- package/dist/src/collections/tree/tree.d.ts.map +1 -1
- package/dist/src/collections/tree/tree.js +19 -0
- package/dist/src/collections/tree/tree.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/network/i-repo.d.ts +11 -1
- package/dist/src/network/i-repo.d.ts.map +1 -1
- package/dist/src/network/stale-failure.d.ts +21 -0
- package/dist/src/network/stale-failure.d.ts.map +1 -1
- package/dist/src/network/stale-failure.js +22 -0
- package/dist/src/network/stale-failure.js.map +1 -1
- package/dist/src/network/struct.d.ts +66 -21
- package/dist/src/network/struct.d.ts.map +1 -1
- package/dist/src/network/struct.js.map +1 -1
- package/dist/src/testing/test-transactor.d.ts +22 -0
- package/dist/src/testing/test-transactor.d.ts.map +1 -1
- package/dist/src/testing/test-transactor.js +44 -5
- package/dist/src/testing/test-transactor.js.map +1 -1
- package/dist/src/transaction/coordinator.d.ts +20 -0
- package/dist/src/transaction/coordinator.d.ts.map +1 -1
- package/dist/src/transaction/coordinator.js +256 -113
- package/dist/src/transaction/coordinator.js.map +1 -1
- package/dist/src/transaction/operations-hash.d.ts +1 -1
- package/dist/src/transaction/operations-hash.js +1 -1
- package/dist/src/transaction/transaction.d.ts +4 -2
- package/dist/src/transaction/transaction.d.ts.map +1 -1
- package/dist/src/transactor/network-transactor.d.ts +21 -1
- package/dist/src/transactor/network-transactor.d.ts.map +1 -1
- package/dist/src/transactor/network-transactor.js +122 -29
- package/dist/src/transactor/network-transactor.js.map +1 -1
- package/dist/src/transactor/transactor-source.d.ts +11 -5
- package/dist/src/transactor/transactor-source.d.ts.map +1 -1
- package/dist/src/transactor/transactor-source.js +16 -8
- package/dist/src/transactor/transactor-source.js.map +1 -1
- package/dist/src/transform/cache-source.d.ts +13 -0
- package/dist/src/transform/cache-source.d.ts.map +1 -1
- package/dist/src/transform/cache-source.js +18 -0
- package/dist/src/transform/cache-source.js.map +1 -1
- package/dist/src/transform/digest.d.ts +18 -0
- package/dist/src/transform/digest.d.ts.map +1 -0
- package/dist/src/transform/digest.js +65 -0
- package/dist/src/transform/digest.js.map +1 -0
- package/dist/src/transform/index.d.ts +1 -0
- package/dist/src/transform/index.d.ts.map +1 -1
- package/dist/src/transform/index.js +1 -0
- package/dist/src/transform/index.js.map +1 -1
- package/dist/src/transform/tracker.d.ts +16 -0
- package/dist/src/transform/tracker.d.ts.map +1 -1
- package/dist/src/transform/tracker.js +40 -1
- package/dist/src/transform/tracker.js.map +1 -1
- package/dist/src/utility/canonical-json.d.ts +11 -0
- package/dist/src/utility/canonical-json.d.ts.map +1 -0
- package/dist/src/utility/canonical-json.js +15 -0
- package/dist/src/utility/canonical-json.js.map +1 -0
- package/dist/src/utility/lru-map.d.ts +2 -0
- package/dist/src/utility/lru-map.d.ts.map +1 -1
- package/dist/src/utility/lru-map.js +4 -0
- package/dist/src/utility/lru-map.js.map +1 -1
- package/package.json +2 -1
- package/src/blocks/helpers.ts +26 -13
- package/src/cluster/membership.ts +87 -85
- package/src/cluster/structs.ts +28 -1
- package/src/collection/action.ts +17 -0
- package/src/collection/collection.ts +1129 -688
- package/src/collections/tree/tree.ts +341 -320
- package/src/index.ts +24 -23
- package/src/network/i-repo.ts +59 -46
- package/src/network/stale-failure.ts +67 -43
- package/src/network/struct.ts +332 -270
- package/src/testing/test-transactor.ts +680 -638
- package/src/transaction/coordinator.ts +1266 -1110
- package/src/transaction/operations-hash.ts +1 -1
- package/src/transaction/transaction.ts +4 -2
- package/src/transactor/network-transactor.ts +123 -32
- package/src/transactor/transactor-source.ts +17 -9
- package/src/transform/cache-source.ts +20 -0
- package/src/transform/digest.ts +72 -0
- package/src/transform/index.ts +1 -0
- package/src/transform/tracker.ts +42 -1
- package/src/utility/canonical-json.ts +16 -0
- package/src/utility/lru-map.ts +5 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IBlock, BlockId, BlockHeader, ITransactor, ActionId, StaleFailure, ActionContext, BlockType, BlockSource, ReadPurpose, Transforms } from "../index.js";
|
|
1
|
+
import type { IBlock, BlockId, BlockHeader, ITransactor, ActionId, StaleFailure, ActionContext, BlockType, BlockSource, ReadPurpose, Transforms, BlockContentDigests } from "../index.js";
|
|
2
2
|
import type { ReadDependency } from "../transaction/transaction.js";
|
|
3
3
|
import { ReadDependencyCollector } from "../transaction/read-dependency-collector.js";
|
|
4
4
|
export declare class TransactorSource<TBlock extends IBlock> implements BlockSource<TBlock> {
|
|
@@ -32,16 +32,22 @@ export declare class TransactorSource<TBlock extends IBlock> implements BlockSou
|
|
|
32
32
|
* @param transform - The transforms to apply.
|
|
33
33
|
* @param actionId - The action id.
|
|
34
34
|
* @param rev - The revision number.
|
|
35
|
-
* @param headerId - The Id of the collection's header block.
|
|
36
|
-
*
|
|
37
|
-
*
|
|
35
|
+
* @param headerId - The Id of the collection's header block. Forwarded to the commit only when the header is a
|
|
36
|
+
* fresh insert, which is the create-the-collection race this was meant to order. NOTE: that forwarding no longer
|
|
37
|
+
* has any effect — `NetworkTransactor.commit` runs its header-first step only for a header held OUT of `blockIds`,
|
|
38
|
+
* and an inserted id is always IN it, so the header commits inside the ordinary sweep (after the tail) like any
|
|
39
|
+
* other touched block. Wire it up or drop it: `tickets/backlog/debt-commit-header-first-branch-is-unreachable`.
|
|
38
40
|
* @param tailId - The Id of the collection's log tail block. If specified, this block's transform is performed next
|
|
39
41
|
* (prior to the rest of the block operations), to resolve the "winner" of a race to commit to the collection.
|
|
40
42
|
* @param priority - Aged, advisory retry priority (default 0). Rides on the pend so a repeatedly-losing
|
|
41
43
|
* single-collection sync out-ranks fresh rivals in a concurrent race (`resolveRace`); fairness-only, never
|
|
42
44
|
* affects validity. Omitted from the pend when 0 so the common first-attempt pend serializes exactly as before.
|
|
45
|
+
* @param blockDigests - Optional per-block content declarations for this commit (see {@link BlockContentDigests}),
|
|
46
|
+
* computed by the caller from the same tracker that produced `transform`. Omitted from the commit request when
|
|
47
|
+
* undefined, so a caller that declares nothing produces exactly the request shape as before — the field rides
|
|
48
|
+
* inside every cohort signature's hash preimage, so keeping the shape clean keeps those preimages clean.
|
|
43
49
|
* @returns A promise that resolves to undefined if the action is successful, or a StaleFailure if the action is stale.
|
|
44
50
|
*/
|
|
45
|
-
transact(transform: Transforms, actionId: ActionId, rev: number, headerId: BlockId, tailId: BlockId, priority?: number): Promise<undefined | StaleFailure>;
|
|
51
|
+
transact(transform: Transforms, actionId: ActionId, rev: number, headerId: BlockId, tailId: BlockId, priority?: number, blockDigests?: BlockContentDigests): Promise<undefined | StaleFailure>;
|
|
46
52
|
}
|
|
47
53
|
//# sourceMappingURL=transactor-source.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactor-source.d.ts","sourceRoot":"","sources":["../../../src/transactor/transactor-source.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"transactor-source.d.ts","sourceRoot":"","sources":["../../../src/transactor/transactor-source.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE1L,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AAGtF,qBAAa,gBAAgB,CAAC,MAAM,SAAS,MAAM,CAAE,YAAW,WAAW,CAAC,MAAM,CAAC;IAUjF,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU;IACpB,aAAa,EAAE,aAAa,GAAG,SAAS;IAXhD;;iDAE6C;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IACpD;uFACmF;IACnF,OAAO,CAAC,aAAa,CAA8B;gBAGjC,YAAY,EAAE,OAAO,EACrB,UAAU,EAAE,WAAW,EACjC,aAAa,EAAE,aAAa,GAAG,SAAS,EAC/C,SAAS,CAAC,EAAE,uBAAuB;IAKpC,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,WAAW;IAQhE,UAAU,IAAI,OAAO;IAKf,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,GAAE,WAAqB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IA+DtF;;+DAE2D;IAC3D,eAAe,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS;IAIhD,mBAAmB,IAAI,cAAc,EAAE;IAIvC;;;8EAG0E;IAC1E,YAAY,IAAI,uBAAuB;IAIvC,qBAAqB,IAAI,IAAI;IAI7B;;;;;;;;;;;;;;;;;;;;OAoBG;IACG,QAAQ,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,SAAI,EAAE,YAAY,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,SAAS,GAAG,YAAY,CAAC;CAwB/L"}
|
|
@@ -2,6 +2,7 @@ import { randomBytes } from '@noble/hashes/utils.js';
|
|
|
2
2
|
import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
|
|
3
3
|
import { BlockUnavailableError, BlockPossiblyStaleError } from "../network/struct.js";
|
|
4
4
|
import { ReadDependencyCollector } from "../transaction/read-dependency-collector.js";
|
|
5
|
+
import { blockDigestsField } from "../transform/digest.js";
|
|
5
6
|
export class TransactorSource {
|
|
6
7
|
collectionId;
|
|
7
8
|
transactor;
|
|
@@ -37,7 +38,7 @@ export class TransactorSource {
|
|
|
37
38
|
// `result[id]` is undefined. Destructuring that would throw a TypeError.
|
|
38
39
|
const entry = result?.[id];
|
|
39
40
|
if (entry) {
|
|
40
|
-
const { block, state,
|
|
41
|
+
const { block, state, materialized, unavailable, unconfirmedAheadRev } = entry;
|
|
41
42
|
// An entry flagged `unavailable` with no block is the repo saying "I could not find
|
|
42
43
|
// out whether this exists" — an answer that must not be read as absent. Throw rather
|
|
43
44
|
// than return undefined, and record no read dependency (dependencies are recorded
|
|
@@ -78,12 +79,12 @@ export class TransactorSource {
|
|
|
78
79
|
// read purpose (default `value`) so a purely-structural navigation read can later be
|
|
79
80
|
// dropped from the conflict set (see ReadDependencyCollector / Theorem 5).
|
|
80
81
|
// Record the revision the content was MATERIALIZED at, not the newest the repo holds —
|
|
81
|
-
// see {@link GetBlockResult.
|
|
82
|
+
// see {@link GetBlockResult.materialized} for why `state.latest` is the wrong number
|
|
82
83
|
// and why the fallback preserves today's behaviour for repos that omit the field.
|
|
83
84
|
// Both sinks must take the SAME value: CacheSource learns it via getReadRevision on a
|
|
84
85
|
// miss-load and re-emits it on every later hit, so a split would stamp the cache
|
|
85
86
|
// differently from the collector.
|
|
86
|
-
const rev =
|
|
87
|
+
const rev = materialized?.rev ?? state.latest?.rev ?? 0;
|
|
87
88
|
this.collector.record(id, rev, purpose);
|
|
88
89
|
this.readRevisions.set(id, rev);
|
|
89
90
|
}
|
|
@@ -116,17 +117,23 @@ export class TransactorSource {
|
|
|
116
117
|
* @param transform - The transforms to apply.
|
|
117
118
|
* @param actionId - The action id.
|
|
118
119
|
* @param rev - The revision number.
|
|
119
|
-
* @param headerId - The Id of the collection's header block.
|
|
120
|
-
*
|
|
121
|
-
*
|
|
120
|
+
* @param headerId - The Id of the collection's header block. Forwarded to the commit only when the header is a
|
|
121
|
+
* fresh insert, which is the create-the-collection race this was meant to order. NOTE: that forwarding no longer
|
|
122
|
+
* has any effect — `NetworkTransactor.commit` runs its header-first step only for a header held OUT of `blockIds`,
|
|
123
|
+
* and an inserted id is always IN it, so the header commits inside the ordinary sweep (after the tail) like any
|
|
124
|
+
* other touched block. Wire it up or drop it: `tickets/backlog/debt-commit-header-first-branch-is-unreachable`.
|
|
122
125
|
* @param tailId - The Id of the collection's log tail block. If specified, this block's transform is performed next
|
|
123
126
|
* (prior to the rest of the block operations), to resolve the "winner" of a race to commit to the collection.
|
|
124
127
|
* @param priority - Aged, advisory retry priority (default 0). Rides on the pend so a repeatedly-losing
|
|
125
128
|
* single-collection sync out-ranks fresh rivals in a concurrent race (`resolveRace`); fairness-only, never
|
|
126
129
|
* affects validity. Omitted from the pend when 0 so the common first-attempt pend serializes exactly as before.
|
|
130
|
+
* @param blockDigests - Optional per-block content declarations for this commit (see {@link BlockContentDigests}),
|
|
131
|
+
* computed by the caller from the same tracker that produced `transform`. Omitted from the commit request when
|
|
132
|
+
* undefined, so a caller that declares nothing produces exactly the request shape as before — the field rides
|
|
133
|
+
* inside every cohort signature's hash preimage, so keeping the shape clean keeps those preimages clean.
|
|
127
134
|
* @returns A promise that resolves to undefined if the action is successful, or a StaleFailure if the action is stale.
|
|
128
135
|
*/
|
|
129
|
-
async transact(transform, actionId, rev, headerId, tailId, priority = 0) {
|
|
136
|
+
async transact(transform, actionId, rev, headerId, tailId, priority = 0, blockDigests) {
|
|
130
137
|
const pendResult = await this.transactor.pend({ transforms: transform, actionId, rev, policy: 'r', ...(priority > 0 ? { priority } : {}) });
|
|
131
138
|
if (!pendResult.success) {
|
|
132
139
|
return pendResult;
|
|
@@ -138,7 +145,8 @@ export class TransactorSource {
|
|
|
138
145
|
tailId,
|
|
139
146
|
blockIds: pendResult.blockIds,
|
|
140
147
|
actionId,
|
|
141
|
-
rev
|
|
148
|
+
rev,
|
|
149
|
+
...blockDigestsField(blockDigests)
|
|
142
150
|
});
|
|
143
151
|
if (!commitResult.success) {
|
|
144
152
|
await this.transactor.cancel({ actionId, blockIds: pendResult.blockIds });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactor-source.js","sourceRoot":"","sources":["../../../src/transactor/transactor-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAEtE,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEtF,OAAO,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"transactor-source.js","sourceRoot":"","sources":["../../../src/transactor/transactor-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,19 @@ export declare class CacheSource<T extends IBlock> implements BlockSource<T> {
|
|
|
34
34
|
* the id changes (miss-load, clear, or transformCache). Stable across pure cache hits. */
|
|
35
35
|
getGeneration(id: BlockId): number;
|
|
36
36
|
tryGet(id: BlockId, purpose?: ReadPurpose): Promise<T | undefined>;
|
|
37
|
+
/** The block currently cached for `id`, without consulting the source. Cloned (callers apply ops
|
|
38
|
+
* to it) and recency-neutral ({@link LruMap.peek}) — an observation pass must neither pay a
|
|
39
|
+
* network read nor reshape eviction order. Records no read dependency: the caller that peeks
|
|
40
|
+
* already read the block through {@link tryGet} (that is how it got cached), so the dependency
|
|
41
|
+
* exists; a digest pass merely re-describes it. */
|
|
42
|
+
peek(id: BlockId): T | undefined;
|
|
43
|
+
/** The committed revision of the content currently cached for `id` — the source-reported
|
|
44
|
+
* materialized revision learned on miss-load (see {@link revisions}), NOT the block's own
|
|
45
|
+
* `state.latest.rev`. An LRU-evicted id can leave a stale entry here (see the NOTE on
|
|
46
|
+
* {@link revisions}); callers must therefore require BOTH {@link peek} and this to be present —
|
|
47
|
+
* {@link peek} returns `undefined` for the evicted id, so a stale revision never pairs with a
|
|
48
|
+
* peeked block. */
|
|
49
|
+
getCachedRevision(id: BlockId): number | undefined;
|
|
37
50
|
/** Upgrade an already-captured read of `id` to a `value` read in the shared collector,
|
|
38
51
|
* retaining it in the conflict set. The B-tree point-lookup descent calls this (through the
|
|
39
52
|
* Tracker, which forwards) to pin the terminal leaf after recording the interior nodes as
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-source.d.ts","sourceRoot":"","sources":["../../../src/transform/cache-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEjH,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AAc3F,qBAAa,WAAW,CAAC,CAAC,SAAS,MAAM,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;IAuBlE,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IAEzC;oGACgG;IAChG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IA1B5B,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpC;;;;4FAIwF;IAKxF,OAAO,CAAC,WAAW,CAA8B;IACjD;;;;6DAIyD;IAIzD,OAAO,CAAC,SAAS,CAA8B;gBAG3B,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EACzC,OAAO,SAAiB;IACxB;oGACgG;IAC/E,SAAS,CAAC,EAAE,uBAAuB,YAAA;IACpD;;;;oDAIgD;IAChD,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAW3C,OAAO,CAAC,IAAI;IAIZ;8FAC0F;IAC1F,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM;IAI5B,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,GAAE,WAAqB,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IA8BjF;;;;iGAI6F;IAC7F,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI;IAIhC,UAAU,IAAI,OAAO;IAIrB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,WAAW;IAIhE,KAAK,CAAC,QAAQ,GAAE,OAAO,EAAE,GAAG,SAAqB;IAgBjD;;;;qEAIiE;IACjE,eAAe,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAQ9C;;mGAE+F;IAC/F,cAAc,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM;CAsBtD"}
|
|
1
|
+
{"version":3,"file":"cache-source.d.ts","sourceRoot":"","sources":["../../../src/transform/cache-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEjH,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AAc3F,qBAAa,WAAW,CAAC,CAAC,SAAS,MAAM,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;IAuBlE,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IAEzC;oGACgG;IAChG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IA1B5B,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpC;;;;4FAIwF;IAKxF,OAAO,CAAC,WAAW,CAA8B;IACjD;;;;6DAIyD;IAIzD,OAAO,CAAC,SAAS,CAA8B;gBAG3B,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EACzC,OAAO,SAAiB;IACxB;oGACgG;IAC/E,SAAS,CAAC,EAAE,uBAAuB,YAAA;IACpD;;;;oDAIgD;IAChD,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAW3C,OAAO,CAAC,IAAI;IAIZ;8FAC0F;IAC1F,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM;IAI5B,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,GAAE,WAAqB,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IA8BjF;;;;wDAIoD;IACpD,IAAI,CAAC,EAAE,EAAE,OAAO,GAAG,CAAC,GAAG,SAAS;IAKhC;;;;;wBAKoB;IACpB,iBAAiB,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS;IAIlD;;;;iGAI6F;IAC7F,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI;IAIhC,UAAU,IAAI,OAAO;IAIrB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,WAAW;IAIhE,KAAK,CAAC,QAAQ,GAAE,OAAO,EAAE,GAAG,SAAqB;IAgBjD;;;;qEAIiE;IACjE,eAAe,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAQ9C;;mGAE+F;IAC/F,cAAc,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM;CAsBtD"}
|
|
@@ -93,6 +93,24 @@ export class CacheSource {
|
|
|
93
93
|
}
|
|
94
94
|
return structuredClone(block);
|
|
95
95
|
}
|
|
96
|
+
/** The block currently cached for `id`, without consulting the source. Cloned (callers apply ops
|
|
97
|
+
* to it) and recency-neutral ({@link LruMap.peek}) — an observation pass must neither pay a
|
|
98
|
+
* network read nor reshape eviction order. Records no read dependency: the caller that peeks
|
|
99
|
+
* already read the block through {@link tryGet} (that is how it got cached), so the dependency
|
|
100
|
+
* exists; a digest pass merely re-describes it. */
|
|
101
|
+
peek(id) {
|
|
102
|
+
const block = this.cache.peek(id);
|
|
103
|
+
return block === undefined ? undefined : structuredClone(block);
|
|
104
|
+
}
|
|
105
|
+
/** The committed revision of the content currently cached for `id` — the source-reported
|
|
106
|
+
* materialized revision learned on miss-load (see {@link revisions}), NOT the block's own
|
|
107
|
+
* `state.latest.rev`. An LRU-evicted id can leave a stale entry here (see the NOTE on
|
|
108
|
+
* {@link revisions}); callers must therefore require BOTH {@link peek} and this to be present —
|
|
109
|
+
* {@link peek} returns `undefined` for the evicted id, so a stale revision never pairs with a
|
|
110
|
+
* peeked block. */
|
|
111
|
+
getCachedRevision(id) {
|
|
112
|
+
return this.revisions.get(id);
|
|
113
|
+
}
|
|
96
114
|
/** Upgrade an already-captured read of `id` to a `value` read in the shared collector,
|
|
97
115
|
* retaining it in the conflict set. The B-tree point-lookup descent calls this (through the
|
|
98
116
|
* Tracker, which forwards) to pin the terminal leaf after recording the interior nodes as
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-source.js","sourceRoot":"","sources":["../../../src/transform/cache-source.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cache-source.js","sourceRoot":"","sources":["../../../src/transform/cache-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { BlockId, IBlock } from "../index.js";
|
|
2
|
+
import type { BlockContentDigests } from "../network/struct.js";
|
|
3
|
+
import type { Tracker } from "./tracker.js";
|
|
4
|
+
/** Digests for the blocks the tracker's staged transforms touch, computed WITHOUT loading anything
|
|
5
|
+
* from the source. An id whose base is not already cached is omitted rather than fetched — an
|
|
6
|
+
* omitted id never fails the commit, it only forfeits what a declaration buys (see the NOTE below).
|
|
7
|
+
* Each digest is the {@link canonicalBlockHash} of what {@link Tracker.peekMaterialized} says the
|
|
8
|
+
* block will contain at the committing revision; `baseRev` rides along except for base-independent
|
|
9
|
+
* (inserted) blocks. */
|
|
10
|
+
export declare function computeBlockContentDigests<T extends IBlock>(tracker: Tracker<T>, blockIds: BlockId[]): Promise<BlockContentDigests>;
|
|
11
|
+
/** Wraps `blockDigests` so it spreads onto a request only when there is something to declare. The
|
|
12
|
+
* empty map omits the key entirely rather than sending `{}`: the request is hashed verbatim into
|
|
13
|
+
* every cohort signature preimage, so a commit that declares nothing must serialize exactly as it
|
|
14
|
+
* did before this field existed. Every producer of the field goes through here. */
|
|
15
|
+
export declare function blockDigestsField(digests: BlockContentDigests | undefined): {
|
|
16
|
+
blockDigests?: BlockContentDigests;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=digest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../../../src/transform/digest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAIhE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAI5C;;;;;wBAKwB;AAkBxB,wBAAsB,0BAA0B,CAAC,CAAC,SAAS,MAAM,EAChE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,QAAQ,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,mBAAmB,CAAC,CAW9B;AAED;;;mFAGmF;AACnF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,SAAS,GAAG;IAAE,YAAY,CAAC,EAAE,mBAAmB,CAAA;CAAE,CAElH"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { canonicalBlockHash } from "../blocks/helpers.js";
|
|
2
|
+
import { createLogger } from "../logger.js";
|
|
3
|
+
import { isRecordEmpty } from "../utility/is-record-empty.js";
|
|
4
|
+
const log = createLogger('digest');
|
|
5
|
+
/** Digests for the blocks the tracker's staged transforms touch, computed WITHOUT loading anything
|
|
6
|
+
* from the source. An id whose base is not already cached is omitted rather than fetched — an
|
|
7
|
+
* omitted id never fails the commit, it only forfeits what a declaration buys (see the NOTE below).
|
|
8
|
+
* Each digest is the {@link canonicalBlockHash} of what {@link Tracker.peekMaterialized} says the
|
|
9
|
+
* block will contain at the committing revision; `baseRev` rides along except for base-independent
|
|
10
|
+
* (inserted) blocks. */
|
|
11
|
+
// NOTE: coverage is bounded by the read cache, not by the transaction. A commit whose update-carrying
|
|
12
|
+
// blocks outnumber the CacheSource capacity (default 128) silently digests only the ids still
|
|
13
|
+
// resident, and the declared count does not merely thin out — it CAPS. Measured through the
|
|
14
|
+
// production path (`Collection.act`/`sync`) in `test/digest-cache-coverage.spec.ts`: with N
|
|
15
|
+
// update-carrying blocks the declared count is 32/32 at N=32, then 126 at N=128, 200, 256 AND 512
|
|
16
|
+
// (126 = the 128 slots less the collection header and log tail), i.e. 100%, 98.4%, 63.0%, 49.2%,
|
|
17
|
+
// 24.6%. Coverage therefore decays as 1/N and an arbitrarily large commit declares an arbitrarily
|
|
18
|
+
// small fraction of itself. The survivors are the newest contiguous run, exactly as LRU eviction
|
|
19
|
+
// predicts.
|
|
20
|
+
// Omission also costs MORE than it used to: it still degrades gracefully on the read path, but an
|
|
21
|
+
// undeclared block retains no durable `BlockCommitProof` and so can never GAIN a holder by push.
|
|
22
|
+
// That consequence is stated once, canonically, at {@link CommitRequest.blockDigests} in
|
|
23
|
+
// `network/struct.ts`; do not restate it here.
|
|
24
|
+
// Still accepted here rather than fixed in place: both remedies are larger than this function —
|
|
25
|
+
// size the cache to the transaction, or carry the base revision alongside the staged updates instead
|
|
26
|
+
// of re-reading it here. Tracked as `debt-digest-coverage-capped-by-read-cache`. Revisit when a
|
|
27
|
+
// workload legitimately commits more update-carrying blocks than the cache holds.
|
|
28
|
+
export async function computeBlockContentDigests(tracker, blockIds) {
|
|
29
|
+
const digests = {};
|
|
30
|
+
for (const id of blockIds) {
|
|
31
|
+
const peeked = peekOrSkip(tracker, id);
|
|
32
|
+
if (!peeked)
|
|
33
|
+
continue;
|
|
34
|
+
digests[id] = {
|
|
35
|
+
digest: await canonicalBlockHash(peeked.block),
|
|
36
|
+
...(peeked.baseRev !== undefined ? { baseRev: peeked.baseRev } : {}),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return digests;
|
|
40
|
+
}
|
|
41
|
+
/** Wraps `blockDigests` so it spreads onto a request only when there is something to declare. The
|
|
42
|
+
* empty map omits the key entirely rather than sending `{}`: the request is hashed verbatim into
|
|
43
|
+
* every cohort signature preimage, so a commit that declares nothing must serialize exactly as it
|
|
44
|
+
* did before this field existed. Every producer of the field goes through here. */
|
|
45
|
+
export function blockDigestsField(digests) {
|
|
46
|
+
return digests && !isRecordEmpty(digests) ? { blockDigests: digests } : {};
|
|
47
|
+
}
|
|
48
|
+
/** {@link Tracker.peekMaterialized}, degraded to "undeclared" when materializing throws.
|
|
49
|
+
*
|
|
50
|
+
* Declaring content must never break committing it. Materializing replays the staged ops against the
|
|
51
|
+
* LOCALLY CACHED base, which can legitimately fail — e.g. another action's commit folded into the
|
|
52
|
+
* cache (`CacheSource.transformCache`) shrank an array a staged splice indexes into. That transaction
|
|
53
|
+
* is doomed, but it must die as a retryable stale failure from the pend/commit round trip, not as a
|
|
54
|
+
* TypeError thrown out of `sync()` before the pend. The failure is logged rather than silently eaten,
|
|
55
|
+
* because the same swallow would also hide a genuine `applyTransform` bug. */
|
|
56
|
+
function peekOrSkip(tracker, id) {
|
|
57
|
+
try {
|
|
58
|
+
return tracker.peekMaterialized(id);
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
log('block %s left undeclared: materializing against the cached base failed: %o', id, e);
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=digest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest.js","sourceRoot":"","sources":["../../../src/transform/digest.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAG9D,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;AAEnC;;;;;wBAKwB;AACxB,sGAAsG;AACtG,8FAA8F;AAC9F,4FAA4F;AAC5F,4FAA4F;AAC5F,kGAAkG;AAClG,iGAAiG;AACjG,kGAAkG;AAClG,iGAAiG;AACjG,YAAY;AACZ,kGAAkG;AAClG,iGAAiG;AACjG,yFAAyF;AACzF,+CAA+C;AAC/C,gGAAgG;AAChG,qGAAqG;AACrG,gGAAgG;AAChG,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC/C,OAAmB,EACnB,QAAmB;IAEnB,MAAM,OAAO,GAAwB,EAAE,CAAC;IACxC,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,OAAO,CAAC,EAAE,CAAC,GAAG;YACb,MAAM,EAAE,MAAM,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC;YAC9C,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpE,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED;;;mFAGmF;AACnF,MAAM,UAAU,iBAAiB,CAAC,OAAwC;IACzE,OAAO,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5E,CAAC;AAED;;;;;;;8EAO8E;AAC9E,SAAS,UAAU,CAAmB,OAAmB,EAAE,EAAW;IACrE,IAAI,CAAC;QACJ,OAAO,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,GAAG,CAAC,4EAA4E,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACzF,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/transform/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/transform/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transform/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transform/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
|
|
@@ -20,6 +20,22 @@ export declare class Tracker<T extends IBlock> implements IBlockStore<T> {
|
|
|
20
20
|
/** The source's generation for an id, or undefined if the source cannot report drift. */
|
|
21
21
|
private sourceGeneration;
|
|
22
22
|
tryGet(id: BlockId, purpose?: ReadPurpose): Promise<T | undefined>;
|
|
23
|
+
/** The block `id` materializes to under the staged transforms, computed WITHOUT loading from the
|
|
24
|
+
* source, plus the committed revision of the base used. `undefined` when not computable here —
|
|
25
|
+
* nothing staged for the id, the result is a delete, or an update's base is not locally cached
|
|
26
|
+
* (a commit must not pay a network round trip to describe itself).
|
|
27
|
+
*
|
|
28
|
+
* Materializes with the canonical {@link applyTransform} — the exact function the member side
|
|
29
|
+
* uses at commit — so client and member can never disagree on semantics (insert replaces the
|
|
30
|
+
* block, then updates apply, then delete wins). An insert makes the result base-independent, so
|
|
31
|
+
* `baseRev` is absent; updates-only returns the base's cached committed revision, probed from the
|
|
32
|
+
* source via `peek`/`getCachedRevision` (duck-typed like {@link sourceGeneration}, because Tracker
|
|
33
|
+
* layers over test doubles; `peek` must return a clone — CacheSource's does). Recency-neutral and
|
|
34
|
+
* memo-neutral: observably changes no tracker or source state. */
|
|
35
|
+
peekMaterialized(id: BlockId): {
|
|
36
|
+
block: IBlock;
|
|
37
|
+
baseRev?: number;
|
|
38
|
+
} | undefined;
|
|
23
39
|
/** Forward a leaf-value upgrade down to the source's read collector (duck-typed: only the
|
|
24
40
|
* CacheSource layer implements it). Lets the B-tree point-lookup descent, which reads through
|
|
25
41
|
* this tracker, pin its terminal leaf as a `value` read after tagging interior nodes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../../src/transform/tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,IAAI,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAIhK;;GAEG;AACH,qBAAa,OAAO,CAAC,CAAC,SAAS,MAAM,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;IAW9D,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,6EAA6E;IACtE,UAAU;IAZlB;;;;;;yDAMqD;IACrD,OAAO,CAAC,YAAY,CAAiD;gBAGnD,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IACxC,6EAA6E;IACtE,UAAU,mCAAoB;IAGtC,yFAAyF;IACzF,OAAO,CAAC,gBAAgB;IAKlB,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,GAAE,WAAqB,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAsCjF;;;+FAG2F;IAC3F,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI;IAIhC,UAAU,IAAI,OAAO;IAIrB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,WAAW;IAIhE,MAAM,CAAC,KAAK,EAAE,CAAC;IAYf,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,cAAc;IAkB3C,MAAM,CAAC,OAAO,EAAE,OAAO;IAQvB,KAAK,CAAC,YAAY,mCAAoB;IAOtC,mBAAmB,IAAI,OAAO,EAAE;IAIhC,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC;CAGhC"}
|
|
1
|
+
{"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../../src/transform/tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,IAAI,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAIhK;;GAEG;AACH,qBAAa,OAAO,CAAC,CAAC,SAAS,MAAM,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;IAW9D,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,6EAA6E;IACtE,UAAU;IAZlB;;;;;;yDAMqD;IACrD,OAAO,CAAC,YAAY,CAAiD;gBAGnD,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IACxC,6EAA6E;IACtE,UAAU,mCAAoB;IAGtC,yFAAyF;IACzF,OAAO,CAAC,gBAAgB;IAKlB,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,GAAE,WAAqB,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAsCjF;;;;;;;;;;;sEAWkE;IAClE,gBAAgB,CAAC,EAAE,EAAE,OAAO,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IA6B9E;;;+FAG2F;IAC3F,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI;IAIhC,UAAU,IAAI,OAAO;IAIrB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,WAAW;IAIhE,MAAM,CAAC,KAAK,EAAE,CAAC;IAYf,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,cAAc;IAkB3C,MAAM,CAAC,OAAO,EAAE,OAAO;IAQvB,KAAK,CAAC,YAAY,mCAAoB;IAOtC,mBAAmB,IAAI,OAAO,EAAE;IAIhC,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC;CAGhC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { applyOperation, applyOperations, emptyTransforms, blockIdsForTransforms } from "./helpers.js";
|
|
1
|
+
import { applyOperation, applyOperations, applyTransform, emptyTransforms, blockIdsForTransforms, transformForBlockId } from "./helpers.js";
|
|
2
2
|
import { ensured } from "../utility/ensured.js";
|
|
3
3
|
/** A block store that collects transformations, without applying them to the underlying source.
|
|
4
4
|
* Transformations are also applied to the retrieved blocks, making it seem like the source has been modified.
|
|
@@ -62,6 +62,45 @@ export class Tracker {
|
|
|
62
62
|
}
|
|
63
63
|
return block; // no-ops path unchanged (source already cloned)
|
|
64
64
|
}
|
|
65
|
+
/** The block `id` materializes to under the staged transforms, computed WITHOUT loading from the
|
|
66
|
+
* source, plus the committed revision of the base used. `undefined` when not computable here —
|
|
67
|
+
* nothing staged for the id, the result is a delete, or an update's base is not locally cached
|
|
68
|
+
* (a commit must not pay a network round trip to describe itself).
|
|
69
|
+
*
|
|
70
|
+
* Materializes with the canonical {@link applyTransform} — the exact function the member side
|
|
71
|
+
* uses at commit — so client and member can never disagree on semantics (insert replaces the
|
|
72
|
+
* block, then updates apply, then delete wins). An insert makes the result base-independent, so
|
|
73
|
+
* `baseRev` is absent; updates-only returns the base's cached committed revision, probed from the
|
|
74
|
+
* source via `peek`/`getCachedRevision` (duck-typed like {@link sourceGeneration}, because Tracker
|
|
75
|
+
* layers over test doubles; `peek` must return a clone — CacheSource's does). Recency-neutral and
|
|
76
|
+
* memo-neutral: observably changes no tracker or source state. */
|
|
77
|
+
peekMaterialized(id) {
|
|
78
|
+
const transform = transformForBlockId(this.transforms, id);
|
|
79
|
+
if (transform.insert === undefined && transform.updates === undefined && transform.delete === undefined) {
|
|
80
|
+
return undefined; // nothing staged for this id
|
|
81
|
+
}
|
|
82
|
+
if (transform.delete) {
|
|
83
|
+
return undefined; // delete-last-wins: materializes to nothing
|
|
84
|
+
}
|
|
85
|
+
if (transform.insert) {
|
|
86
|
+
// applyTransform mutates the insert in place when updates ride along; transformForBlockId
|
|
87
|
+
// clones `updates` but NOT `insert`, so clone here to keep the staged transform pristine.
|
|
88
|
+
transform.insert = structuredClone(transform.insert);
|
|
89
|
+
const block = applyTransform(undefined, transform);
|
|
90
|
+
return block ? { block } : undefined;
|
|
91
|
+
}
|
|
92
|
+
const src = this.source;
|
|
93
|
+
if (typeof src.peek !== 'function' || typeof src.getCachedRevision !== 'function')
|
|
94
|
+
return undefined;
|
|
95
|
+
const base = src.peek(id);
|
|
96
|
+
const baseRev = src.getCachedRevision(id);
|
|
97
|
+
// Require BOTH: an LRU-evicted id can leave a stale cached revision behind (see the NOTE on
|
|
98
|
+
// CacheSource's revisions map); peek returning undefined keeps it from pairing with a block.
|
|
99
|
+
if (base === undefined || baseRev === undefined)
|
|
100
|
+
return undefined;
|
|
101
|
+
const block = applyTransform(base, transform); // base already a clone (peek contract)
|
|
102
|
+
return block ? { block, baseRev } : undefined;
|
|
103
|
+
}
|
|
65
104
|
/** Forward a leaf-value upgrade down to the source's read collector (duck-typed: only the
|
|
66
105
|
* CacheSource layer implements it). Lets the B-tree point-lookup descent, which reads through
|
|
67
106
|
* this tracker, pin its terminal leaf as a `value` read after tagging interior nodes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracker.js","sourceRoot":"","sources":["../../../src/transform/tracker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"tracker.js","sourceRoot":"","sources":["../../../src/transform/tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic JSON: sorts object keys so the encoding — and therefore any hash over it — is
|
|
3
|
+
* independent of key insertion order. Arrays keep their order (position is meaning).
|
|
4
|
+
*
|
|
5
|
+
* The ONE implementation behind every db-core agreement hash: block content
|
|
6
|
+
* ({@link canonicalBlockHash}) and cluster record/membership hashes ({@link membershipDigest},
|
|
7
|
+
* `computeMessageHash` and friends). Two nodes that encode differently disagree on honest data, so
|
|
8
|
+
* a second copy is a correctness hazard, not a style nit — import this rather than re-deriving it.
|
|
9
|
+
*/
|
|
10
|
+
export declare function canonicalJson(value: unknown): string;
|
|
11
|
+
//# sourceMappingURL=canonical-json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical-json.d.ts","sourceRoot":"","sources":["../../../src/utility/canonical-json.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAMpD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic JSON: sorts object keys so the encoding — and therefore any hash over it — is
|
|
3
|
+
* independent of key insertion order. Arrays keep their order (position is meaning).
|
|
4
|
+
*
|
|
5
|
+
* The ONE implementation behind every db-core agreement hash: block content
|
|
6
|
+
* ({@link canonicalBlockHash}) and cluster record/membership hashes ({@link membershipDigest},
|
|
7
|
+
* `computeMessageHash` and friends). Two nodes that encode differently disagree on honest data, so
|
|
8
|
+
* a second copy is a correctness hazard, not a style nit — import this rather than re-deriving it.
|
|
9
|
+
*/
|
|
10
|
+
export function canonicalJson(value) {
|
|
11
|
+
return JSON.stringify(value, (_, v) => v && typeof v === 'object' && !Array.isArray(v)
|
|
12
|
+
? Object.keys(v).sort().reduce((o, k) => { o[k] = v[k]; return o; }, {})
|
|
13
|
+
: v);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=canonical-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical-json.js","sourceRoot":"","sources":["../../../src/utility/canonical-json.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACrC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAA0B,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACjG,CAAC,CAAC,CAAC,CACJ,CAAC;AACH,CAAC"}
|
|
@@ -8,6 +8,8 @@ export declare class LruMap<K, V> {
|
|
|
8
8
|
private readonly map;
|
|
9
9
|
constructor(maxSize: number);
|
|
10
10
|
get(key: K): V | undefined;
|
|
11
|
+
/** Read without refreshing recency — for observation passes that must not reshape eviction order. */
|
|
12
|
+
peek(key: K): V | undefined;
|
|
11
13
|
set(key: K, value: V): this;
|
|
12
14
|
has(key: K): boolean;
|
|
13
15
|
delete(key: K): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lru-map.d.ts","sourceRoot":"","sources":["../../../src/utility/lru-map.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,MAAM,CAAC,CAAC,EAAE,CAAC;IAGX,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAmB;gBAEV,OAAO,EAAE,MAAM;IAI5C,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAU1B,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAa3B,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAIpB,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAIvB,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAG7C"}
|
|
1
|
+
{"version":3,"file":"lru-map.d.ts","sourceRoot":"","sources":["../../../src/utility/lru-map.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,MAAM,CAAC,CAAC,EAAE,CAAC;IAGX,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAmB;gBAEV,OAAO,EAAE,MAAM;IAI5C,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAU1B,qGAAqG;IACrG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAI3B,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAa3B,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAIpB,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAIvB,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAG7C"}
|
|
@@ -20,6 +20,10 @@ export class LruMap {
|
|
|
20
20
|
}
|
|
21
21
|
return value;
|
|
22
22
|
}
|
|
23
|
+
/** Read without refreshing recency — for observation passes that must not reshape eviction order. */
|
|
24
|
+
peek(key) {
|
|
25
|
+
return this.map.get(key);
|
|
26
|
+
}
|
|
23
27
|
set(key, value) {
|
|
24
28
|
// If already present, delete first to refresh position
|
|
25
29
|
if (this.map.has(key)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lru-map.js","sourceRoot":"","sources":["../../../src/utility/lru-map.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,MAAM;IAGW;IAFZ,GAAG,GAAG,IAAI,GAAG,EAAQ,CAAC;IAEvC,YAA6B,OAAe;QAAf,YAAO,GAAP,OAAO,CAAQ;QAC3C,IAAI,OAAO,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjE,CAAC;IAED,GAAG,CAAC,GAAM;QACT,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACzB,6DAA6D;YAC7D,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IAED,GAAG,CAAC,GAAM,EAAE,KAAQ;QACnB,uDAAuD;QACvD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;aAAM,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1C,iCAAiC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC;YAC7C,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,GAAG,CAAC,GAAM;QACT,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,GAAM;QACZ,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAED,IAAI,IAAI;QACP,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACtB,CAAC;IAED,CAAC,MAAM,CAAC,QAAQ,CAAC;QAChB,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IACpC,CAAC;CACD"}
|
|
1
|
+
{"version":3,"file":"lru-map.js","sourceRoot":"","sources":["../../../src/utility/lru-map.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,MAAM;IAGW;IAFZ,GAAG,GAAG,IAAI,GAAG,EAAQ,CAAC;IAEvC,YAA6B,OAAe;QAAf,YAAO,GAAP,OAAO,CAAQ;QAC3C,IAAI,OAAO,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjE,CAAC;IAED,GAAG,CAAC,GAAM;QACT,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACzB,6DAA6D;YAC7D,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IAED,qGAAqG;IACrG,IAAI,CAAC,GAAM;QACV,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,GAAG,CAAC,GAAM,EAAE,KAAQ;QACnB,uDAAuD;QACvD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;aAAM,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1C,iCAAiC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC;YAC7C,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,GAAG,CAAC,GAAM;QACT,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,GAAM;QACZ,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAED,IAAI,IAAI;QACP,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACtB,CAAC;IAED,CAAC,MAAM,CAAC,QAAQ,CAAC;QAChB,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IACpC,CAAC;CACD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@optimystic/db-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.25.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Core database functionality for Optimystic",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
"scripts": {
|
|
43
43
|
"clean": "rimraf dist",
|
|
44
44
|
"build": "tsc",
|
|
45
|
+
"typecheck": "tsc --noEmit",
|
|
45
46
|
"test": "node --import ./register.mjs node_modules/mocha/bin/mocha.js \"test/**/*.spec.ts\" --colors --reporter min",
|
|
46
47
|
"test:verbose": "node --import ./register.mjs node_modules/mocha/bin/mocha.js \"test/**/*.spec.ts\" --colors --reporter spec"
|
|
47
48
|
},
|
package/src/blocks/helpers.ts
CHANGED
|
@@ -1,13 +1,26 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
import { sha256 } from "multiformats/hashes/sha2";
|
|
2
|
+
import { toString as uint8ArrayToString } from "uint8arrays";
|
|
3
|
+
import type { BlockOperation, IBlock, BlockId, BlockStore, ReadPurpose } from "../index.js";
|
|
4
|
+
import { applyOperation } from "../transform/helpers.js";
|
|
5
|
+
import { canonicalJson } from "../utility/canonical-json.js";
|
|
6
|
+
|
|
7
|
+
export async function get<T extends IBlock>(store: BlockStore<T>, id: BlockId, purpose?: ReadPurpose): Promise<T> {
|
|
8
|
+
const block = await store.tryGet(id, purpose);
|
|
9
|
+
if (!block) throw Error(`Missing block (${id})`);
|
|
10
|
+
return block;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function apply<T extends IBlock>(store: BlockStore<T>, block: IBlock, op: BlockOperation) {
|
|
14
|
+
applyOperation(block, op);
|
|
15
|
+
store.update(block.header.id, op);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Canonical sha256 of a block's content, base64url: `base64url(SHA256(canonicalJson(block)))`.
|
|
19
|
+
* The single hash used wherever two nodes must agree on what a block contains — quorum restoration
|
|
20
|
+
* content-agreement (db-p2p `selectQuorumBlock` candidates) and commit content digests. Keep ONE
|
|
21
|
+
* implementation: a drifted copy reports honest content as forged. */
|
|
22
|
+
export async function canonicalBlockHash(block: IBlock): Promise<string> {
|
|
23
|
+
const bytes = new TextEncoder().encode(canonicalJson(block));
|
|
24
|
+
const digest = await sha256.digest(bytes);
|
|
25
|
+
return uint8ArrayToString(digest.digest, 'base64url');
|
|
26
|
+
}
|