@optimystic/db-core 0.21.0 → 0.22.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/btree/btree.d.ts +2 -1
- package/dist/src/btree/btree.d.ts.map +1 -1
- package/dist/src/btree/btree.js +1 -1
- package/dist/src/btree/btree.js.map +1 -1
- package/dist/src/chain/chain.d.ts +1 -1
- package/dist/src/chain/chain.d.ts.map +1 -1
- package/dist/src/chain/chain.js +1 -1
- package/dist/src/chain/chain.js.map +1 -1
- package/dist/src/collection/collection.d.ts +3 -1
- package/dist/src/collection/collection.d.ts.map +1 -1
- package/dist/src/collection/collection.js +7 -2
- package/dist/src/collection/collection.js.map +1 -1
- package/dist/src/collections/diary/diary.d.ts.map +1 -1
- package/dist/src/collections/diary/diary.js +2 -1
- package/dist/src/collections/diary/diary.js.map +1 -1
- package/dist/src/collections/diary/struct.js +1 -1
- package/dist/src/collections/diary/struct.js.map +1 -1
- package/dist/src/collections/tree/collection-trunk.js +1 -1
- package/dist/src/collections/tree/collection-trunk.js.map +1 -1
- package/dist/src/collections/tree/struct.d.ts +1 -1
- package/dist/src/collections/tree/struct.d.ts.map +1 -1
- package/dist/src/collections/tree/struct.js +2 -1
- package/dist/src/collections/tree/struct.js.map +1 -1
- package/dist/src/log/log.d.ts +1 -1
- package/dist/src/log/log.d.ts.map +1 -1
- package/dist/src/log/log.js +2 -2
- package/dist/src/log/log.js.map +1 -1
- package/dist/src/testing/test-transactor.d.ts +1 -1
- package/dist/src/testing/test-transactor.d.ts.map +1 -1
- package/dist/src/testing/test-transactor.js +12 -4
- package/dist/src/testing/test-transactor.js.map +1 -1
- package/dist/src/transaction/coordinator.d.ts.map +1 -1
- package/dist/src/transaction/coordinator.js +2 -1
- package/dist/src/transaction/coordinator.js.map +1 -1
- package/dist/src/transactor/network-transactor.d.ts.map +1 -1
- package/dist/src/transactor/network-transactor.js +9 -5
- package/dist/src/transactor/network-transactor.js.map +1 -1
- package/dist/src/transform/cache-source.js +1 -1
- package/dist/src/transform/cache-source.js.map +1 -1
- package/dist/src/transform/helpers.d.ts +6 -1
- package/dist/src/transform/helpers.d.ts.map +1 -1
- package/dist/src/transform/helpers.js +7 -6
- package/dist/src/transform/helpers.js.map +1 -1
- package/dist/src/transform/tracker.d.ts.map +1 -1
- package/dist/src/transform/tracker.js +2 -1
- package/dist/src/transform/tracker.js.map +1 -1
- package/package.json +1 -1
- package/src/btree/btree.ts +2 -1
- package/src/chain/chain.ts +2 -1
- package/src/collection/collection.ts +7 -2
- package/src/collections/diary/diary.ts +2 -1
- package/src/collections/diary/struct.ts +1 -1
- package/src/collections/tree/collection-trunk.ts +1 -1
- package/src/collections/tree/struct.ts +3 -1
- package/src/log/log.ts +2 -2
- package/src/testing/test-transactor.ts +16 -3
- package/src/transaction/coordinator.ts +2 -1
- package/src/transactor/network-transactor.ts +9 -5
- package/src/transform/cache-source.ts +1 -1
- package/src/transform/helpers.ts +7 -6
- package/src/transform/tracker.ts +2 -1
|
@@ -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,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"tracker.js","sourceRoot":"","sources":["../../../src/transform/tracker.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/btree/btree.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { Path, PathBranch
|
|
1
|
+
import { Path, PathBranch } from "./path.js";
|
|
2
|
+
import type { ITreeTrunk, KeyRange, getTrunkFunc } from "./index.js";
|
|
2
3
|
import type { BlockId, BlockStore } from "../blocks/index.js";
|
|
3
4
|
import { apply, get } from "../blocks/index.js";
|
|
4
5
|
import { TreeLeafBlockType, TreeBranchBlockType, entries$, nodes$, partitions$ } from "./nodes.js";
|
package/src/chain/chain.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { Atomic
|
|
1
|
+
import { Atomic } from "../transform/atomic.js";
|
|
2
|
+
import type { BlockStore, BlockId, IBlock } from "../index.js";
|
|
2
3
|
import { ChainDataBlockType, ChainHeaderBlockType, entries$, headId$, nextId$, priorId$, tailId$ } from "./chain-nodes.js";
|
|
3
4
|
import type { ChainDataNode, ChainHeaderNode } from "./chain-nodes.js";
|
|
4
5
|
import { apply } from "../blocks/index.js";
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import type { IBlock, Action, ActionType, ActionHandler, BlockId, ITransactor, BlockStore, Transforms, ActionId } from "../index.js";
|
|
2
|
-
import { Log
|
|
2
|
+
import { Log } from "../log/log.js";
|
|
3
|
+
import { Atomic } from "../transform/atomic.js";
|
|
4
|
+
import { Tracker } from "../transform/tracker.js";
|
|
5
|
+
import { CacheSource } from "../transform/cache-source.js";
|
|
6
|
+
import { copyTransforms, isTransformsEmpty } from "../transform/helpers.js";
|
|
7
|
+
import { TransactorSource } from "../transactor/transactor-source.js";
|
|
3
8
|
import { BlockUnavailableError } from "../network/struct.js";
|
|
4
9
|
import type { CollectionHeaderBlock, CollectionId, ICollection, SyncOptions } from "./index.js";
|
|
5
|
-
import { CollectionHeaderVanishedError, SyncRetryExhaustedError } from "./
|
|
10
|
+
import { CollectionHeaderVanishedError, SyncRetryExhaustedError } from "./struct.js";
|
|
6
11
|
import type { ActionContext } from "./action.js";
|
|
7
12
|
import type { ReadDependency } from "../transaction/transaction.js";
|
|
8
13
|
import { clampPriority } from "../transaction/transaction.js";
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { Collection
|
|
1
|
+
import { Collection } from "../../collection/collection.js";
|
|
2
2
|
import type { ITransactor, Action, BlockId, BlockStore, IBlock, CollectionInitOptions, CollectionId } from "../../index.js";
|
|
3
|
+
import { registerCollectionType } from "../../collection/collection-type-registry.js";
|
|
3
4
|
import { DiaryHeaderBlockType } from "./struct.js";
|
|
4
5
|
|
|
5
6
|
/** A diary keeps every entry in the log itself, so the header block is the whole structure
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { apply, get } from "../../
|
|
1
|
+
import { apply, get } from "../../blocks/helpers.js";
|
|
2
2
|
import type { BlockId, BlockStore, IBlock, ITreeTrunk } from "../../index.js";
|
|
3
3
|
import type { ITreeNode } from "../../btree/nodes.js";
|
|
4
4
|
import { rootId$, type TreeCollectionHeaderBlock } from "./struct.js";
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { BlockId, CollectionHeaderBlock } from "../../index.js";
|
|
2
|
+
import { registerBlockType } from "../../blocks/block-types.js";
|
|
3
|
+
import { registerCollectionType } from "../../collection/collection-type-registry.js";
|
|
2
4
|
import { nameof } from "../../utility/nameof.js";
|
|
3
5
|
|
|
4
6
|
export const TreeHeaderBlockType = registerBlockType("TRE", "TreeHeaderBlock");
|
package/src/log/log.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { sha256 } from 'multiformats/hashes/sha2'
|
|
2
|
-
import { Chain, entryAt } from "../
|
|
2
|
+
import { Chain, entryAt } from "../chain/chain.js";
|
|
3
3
|
import { nameof } from "../utility/nameof.js";
|
|
4
4
|
import type { IBlock, BlockId, ActionId, CollectionId, ChainPath, ActionRev, ActionContext, ChainInitOptions, BlockStore, ReadDependency } from "../index.js";
|
|
5
5
|
import type { ChainDataNode } from '../chain/chain-nodes.js';
|
|
6
6
|
import type { LogEntry, ActionEntry, DisputeResolutionProof, InvalidationEntry, RevertedBlock } from "./index.js";
|
|
7
|
-
import { LogDataBlockType, LogHeaderBlockType } from "./
|
|
7
|
+
import { LogDataBlockType, LogHeaderBlockType } from "./struct.js";
|
|
8
8
|
import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
|
|
9
9
|
import type { GetFromResult } from './struct.js';
|
|
10
10
|
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { ITransactor, GetBlockResults, ActionBlocks, BlockActionStatus, PendResult, CommitResult, PendRequest, BlockId, CommitRequest, BlockGets, IBlock, ActionId, ActionTransforms, Transform, Transforms, ClusterNomineesResult } from "../index.js";
|
|
2
|
+
import { ensuredMap } from "../utility/ensured.js";
|
|
3
|
+
import { Latches } from "../utility/latches.js";
|
|
2
4
|
import { applyTransform, blockIdsForTransforms, transformForBlockId, emptyTransforms, concatTransform, transformsFromTransform } from "../transform/index.js";
|
|
3
5
|
|
|
4
6
|
type RevisionNumber = number;
|
|
@@ -483,7 +485,18 @@ function latestMaterializedAt(blockState: BlockState, maxRev: number): { block:
|
|
|
483
485
|
return undefined;
|
|
484
486
|
}
|
|
485
487
|
|
|
488
|
+
/**
|
|
489
|
+
* `applyTransform` over cloned inputs, so a returned block never aliases stored state.
|
|
490
|
+
*
|
|
491
|
+
* An absent base is NOT a short circuit: an insert needs no base — `applyTransform` adopts it as
|
|
492
|
+
* the block. Bailing out on `!block` made this double silently drop a pending-only insert read
|
|
493
|
+
* through the pending overlay, the one shape `StorageRepo.get` serves with content but no
|
|
494
|
+
* `materializedRev` (see docs/internals.md § the `unavailable`/`materializedRev` bullets). A
|
|
495
|
+
* pending UPDATE over an absent base still resolves to undefined, matching the real repo.
|
|
496
|
+
*/
|
|
486
497
|
function applyTransformSafe(block: IBlock | undefined, transform: Transform): IBlock | undefined {
|
|
487
|
-
|
|
488
|
-
|
|
498
|
+
return applyTransform(
|
|
499
|
+
block ? structuredClone(block) : undefined,
|
|
500
|
+
transform.insert ? { ...transform, insert: structuredClone(transform.insert) } : transform
|
|
501
|
+
);
|
|
489
502
|
}
|
|
@@ -5,7 +5,8 @@ import { isConflictFailure } from "../network/stale-failure.js";
|
|
|
5
5
|
import type { Collection } from "../collection/collection.js";
|
|
6
6
|
import type { SyncOptions } from "../collection/index.js";
|
|
7
7
|
import { isTransactionExpired, clampPriority } from "./transaction.js";
|
|
8
|
-
import { Log
|
|
8
|
+
import { Log } from "../log/log.js";
|
|
9
|
+
import { blockIdsForTransforms } from "../transform/helpers.js";
|
|
9
10
|
import { collectOperations, hashOperations } from "./operations-hash.js";
|
|
10
11
|
import { CoordinatorPartialCommitError, CoordinatorStaleLossError } from "./errors.js";
|
|
11
12
|
import { jitteredBackoffMs, abortableDelay, makeAbortError } from "../utility/backoff.js";
|
|
@@ -4,7 +4,12 @@ import { highestStaleAt, isConflictFailure } from "../network/stale-failure.js";
|
|
|
4
4
|
import { BlockUnavailableError } from "../network/struct.js";
|
|
5
5
|
import type { ActionTransforms, ActionBlocks, BlockActionStatus, ITransactor, PendSuccess, StaleFailure, IKeyNetwork, BlockId, GetBlockResults, PendResult, CommitResult, PendRequest, IRepo, BlockGets, Transforms, CommitRequest, ActionId, RepoCommitRequest, ClusterNomineesResult, CollectionId, IBlock, CoordinatorIntent } from "../index.js";
|
|
6
6
|
import type { IBlockChangeNotifier, CollectionChangeListener } from "./change-notifier.js";
|
|
7
|
-
import { transformForBlockId,
|
|
7
|
+
import { transformForBlockId, concatTransforms, concatTransform, transformsFromTransform, blockIdsForTransforms } from "../transform/helpers.js";
|
|
8
|
+
import { Tracker } from "../transform/tracker.js";
|
|
9
|
+
import { CacheSource } from "../transform/cache-source.js";
|
|
10
|
+
import { TransactorSource } from "./transactor-source.js";
|
|
11
|
+
import { Log } from "../log/log.js";
|
|
12
|
+
import { groupBy } from "../utility/groupby.js";
|
|
8
13
|
import { blockIdToBytes } from "../utility/block-id-to-bytes.js";
|
|
9
14
|
import { isRecordEmpty } from "../utility/is-record-empty.js";
|
|
10
15
|
import { type CoordinatorBatch, makeBatchesByPeer, incompleteBatches, everyBatch, allBatches, mergeBlocks, processBatches, createBatchesForPayload } from "../utility/batch-coordinator.js";
|
|
@@ -641,7 +646,6 @@ export class NetworkTransactor implements ITransactor, IBlockChangeNotifier {
|
|
|
641
646
|
async commit(request: CommitRequest): Promise<CommitResult> {
|
|
642
647
|
const t0 = Date.now();
|
|
643
648
|
log('commit actionId=%s rev=%d blockIds=%d', request.actionId, request.rev, request.blockIds.length);
|
|
644
|
-
const allBlockIds = [...new Set([...request.blockIds, request.tailId])];
|
|
645
649
|
|
|
646
650
|
// Commit the header block if provided and not already in blockIds.
|
|
647
651
|
// `request.tailId` is threaded into every per-block commit so the coordinator carries it into the
|
|
@@ -649,14 +653,14 @@ export class NetworkTransactor implements ITransactor, IBlockChangeNotifier {
|
|
|
649
653
|
// CollectionChangeEvent (the reactivity topic anchor). Without this the per-block RepoCommitRequest
|
|
650
654
|
// drops the collection tail and reactivity origination is gated off (undefined tail → non-member).
|
|
651
655
|
if (request.headerId && !request.blockIds.includes(request.headerId)) {
|
|
652
|
-
const headerResult = await this.commitBlock(request.headerId,
|
|
656
|
+
const headerResult = await this.commitBlock(request.headerId, request.actionId, request.rev, request.tailId);
|
|
653
657
|
if (!headerResult.success) {
|
|
654
658
|
return headerResult;
|
|
655
659
|
}
|
|
656
660
|
}
|
|
657
661
|
|
|
658
662
|
// Commit the tail block
|
|
659
|
-
const tailResult = await this.commitBlock(request.tailId,
|
|
663
|
+
const tailResult = await this.commitBlock(request.tailId, request.actionId, request.rev, request.tailId);
|
|
660
664
|
if (!tailResult.success) {
|
|
661
665
|
return tailResult;
|
|
662
666
|
}
|
|
@@ -679,7 +683,7 @@ export class NetworkTransactor implements ITransactor, IBlockChangeNotifier {
|
|
|
679
683
|
return { success: true };
|
|
680
684
|
}
|
|
681
685
|
|
|
682
|
-
private async commitBlock(blockId: BlockId,
|
|
686
|
+
private async commitBlock(blockId: BlockId, actionId: ActionId, rev: number, tailId?: BlockId): Promise<CommitResult> {
|
|
683
687
|
const { batches: tailBatches, error: tailError } = await this.commitBlocks({ blockIds: [blockId], actionId, rev, tailId });
|
|
684
688
|
if (tailError) {
|
|
685
689
|
// commit is a pure attempt: stale → { success:false }, transient → throw. Cancellation
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { IBlock, BlockHeader, BlockId, BlockSource, BlockType, ReadPurpose, Transforms } from "../index.js";
|
|
2
|
-
import { applyOperation } from "
|
|
2
|
+
import { applyOperation } from "./helpers.js";
|
|
3
3
|
import { LruMap } from "../utility/lru-map.js";
|
|
4
4
|
import { createLogger } from "../logger.js";
|
|
5
5
|
import type { ReadDependencyCollector } from "../transaction/read-dependency-collector.js";
|
package/src/transform/helpers.ts
CHANGED
|
@@ -148,11 +148,12 @@ export function applyTransform(block: IBlock | undefined, transform: Transform):
|
|
|
148
148
|
return block;
|
|
149
149
|
}
|
|
150
150
|
|
|
151
|
-
/**
|
|
151
|
+
/**
|
|
152
|
+
* Concatenates a single block's transform onto the given transforms.
|
|
153
|
+
*
|
|
154
|
+
* Delegates to `mergeTransforms` so the two helpers cannot drift: updates for a shared
|
|
155
|
+
* block id concatenate (order-preserving), deletes dedupe, inserts stay last-wins.
|
|
156
|
+
*/
|
|
152
157
|
export function concatTransform(transforms: Transforms, blockId: BlockId, transform: Transform): Transforms {
|
|
153
|
-
return
|
|
154
|
-
inserts: { ...transforms.inserts, ...(transform.insert ? { [blockId]: transform.insert } : {}) },
|
|
155
|
-
updates: { ...transforms.updates, ...(transform.updates ? { [blockId]: transform.updates } : {}) },
|
|
156
|
-
deletes: [...(transforms.deletes ?? []), ...(transform.delete ? [blockId] : [])]
|
|
157
|
-
};
|
|
158
|
+
return mergeTransforms(transforms, transformsFromTransform(transform, blockId));
|
|
158
159
|
}
|
package/src/transform/tracker.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { IBlock, BlockId, BlockStore as IBlockStore, BlockHeader, BlockOperation, BlockType, BlockSource as IBlockSource, ReadPurpose } from "../index.js";
|
|
2
|
-
import { applyOperation, applyOperations, emptyTransforms, blockIdsForTransforms
|
|
2
|
+
import { applyOperation, applyOperations, emptyTransforms, blockIdsForTransforms } from "./helpers.js";
|
|
3
|
+
import { ensured } from "../utility/ensured.js";
|
|
3
4
|
|
|
4
5
|
/** A block store that collects transformations, without applying them to the underlying source.
|
|
5
6
|
* Transformations are also applied to the retrieved blocks, making it seem like the source has been modified.
|