cojson 0.18.26 → 0.18.28
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +17 -0
- package/dist/PeerKnownStates.d.ts +4 -3
- package/dist/PeerKnownStates.d.ts.map +1 -1
- package/dist/PeerKnownStates.js +27 -18
- package/dist/PeerKnownStates.js.map +1 -1
- package/dist/PeerState.d.ts +3 -2
- package/dist/PeerState.d.ts.map +1 -1
- package/dist/PeerState.js.map +1 -1
- package/dist/SyncStateManager.d.ts +2 -2
- package/dist/SyncStateManager.d.ts.map +1 -1
- package/dist/SyncStateManager.js +2 -10
- package/dist/SyncStateManager.js.map +1 -1
- package/dist/coValueContentMessage.d.ts +1 -1
- package/dist/coValueContentMessage.d.ts.map +1 -1
- package/dist/coValueContentMessage.js +1 -1
- package/dist/coValueContentMessage.js.map +1 -1
- package/dist/coValueCore/SessionMap.d.ts +6 -3
- package/dist/coValueCore/SessionMap.d.ts.map +1 -1
- package/dist/coValueCore/SessionMap.js +41 -8
- package/dist/coValueCore/SessionMap.js.map +1 -1
- package/dist/coValueCore/branching.d.ts +5 -4
- package/dist/coValueCore/branching.d.ts.map +1 -1
- package/dist/coValueCore/branching.js +22 -4
- package/dist/coValueCore/branching.js.map +1 -1
- package/dist/coValueCore/coValueCore.d.ts +29 -25
- package/dist/coValueCore/coValueCore.d.ts.map +1 -1
- package/dist/coValueCore/coValueCore.js +163 -126
- package/dist/coValueCore/coValueCore.js.map +1 -1
- package/dist/coValueCore/decryptTransactionChangesAndMeta.d.ts +3 -0
- package/dist/coValueCore/decryptTransactionChangesAndMeta.d.ts.map +1 -0
- package/dist/coValueCore/decryptTransactionChangesAndMeta.js +34 -0
- package/dist/coValueCore/decryptTransactionChangesAndMeta.js.map +1 -0
- package/dist/coValueCore/verifiedState.d.ts +12 -6
- package/dist/coValueCore/verifiedState.d.ts.map +1 -1
- package/dist/coValueCore/verifiedState.js +28 -56
- package/dist/coValueCore/verifiedState.js.map +1 -1
- package/dist/coValues/coMap.d.ts.map +1 -1
- package/dist/coValues/coMap.js.map +1 -1
- package/dist/coValues/coStream.d.ts.map +1 -1
- package/dist/coValues/coStream.js.map +1 -1
- package/dist/exports.d.ts +3 -2
- package/dist/exports.d.ts.map +1 -1
- package/dist/exports.js +2 -1
- package/dist/exports.js.map +1 -1
- package/dist/knownState.d.ts +58 -2
- package/dist/knownState.d.ts.map +1 -1
- package/dist/knownState.js +79 -5
- package/dist/knownState.js.map +1 -1
- package/dist/localNode.js +1 -1
- package/dist/localNode.js.map +1 -1
- package/dist/permissions.d.ts.map +1 -1
- package/dist/permissions.js +18 -20
- package/dist/permissions.js.map +1 -1
- package/dist/storage/knownState.d.ts +1 -1
- package/dist/storage/knownState.d.ts.map +1 -1
- package/dist/storage/knownState.js +2 -3
- package/dist/storage/knownState.js.map +1 -1
- package/dist/storage/storageAsync.d.ts +2 -1
- package/dist/storage/storageAsync.d.ts.map +1 -1
- package/dist/storage/storageAsync.js +5 -6
- package/dist/storage/storageAsync.js.map +1 -1
- package/dist/storage/storageSync.d.ts +2 -1
- package/dist/storage/storageSync.d.ts.map +1 -1
- package/dist/storage/storageSync.js +5 -5
- package/dist/storage/storageSync.js.map +1 -1
- package/dist/storage/types.d.ts +2 -1
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/sync.d.ts +2 -12
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +9 -38
- package/dist/sync.js.map +1 -1
- package/dist/tests/PeerKnownStates.test.js +1 -1
- package/dist/tests/PeerKnownStates.test.js.map +1 -1
- package/dist/tests/PeerState.test.js +19 -0
- package/dist/tests/PeerState.test.js.map +1 -1
- package/dist/tests/PureJSCrypto.test.js.map +1 -1
- package/dist/tests/StorageApiAsync.test.js +1 -1
- package/dist/tests/StorageApiAsync.test.js.map +1 -1
- package/dist/tests/StorageApiSync.test.js +1 -2
- package/dist/tests/StorageApiSync.test.js.map +1 -1
- package/dist/tests/StoreQueue.test.js.map +1 -1
- package/dist/tests/SyncStateManager.test.js +1 -1
- package/dist/tests/SyncStateManager.test.js.map +1 -1
- package/dist/tests/branching.test.js +237 -28
- package/dist/tests/branching.test.js.map +1 -1
- package/dist/tests/coValueContentMessage.test.js +1 -1
- package/dist/tests/coValueContentMessage.test.js.map +1 -1
- package/dist/tests/coValueCore.loadFromStorage.test.d.ts +2 -0
- package/dist/tests/coValueCore.loadFromStorage.test.d.ts.map +1 -0
- package/dist/tests/coValueCore.loadFromStorage.test.js +395 -0
- package/dist/tests/coValueCore.loadFromStorage.test.js.map +1 -0
- package/dist/tests/coValueCore.loadingState.test.d.ts +2 -0
- package/dist/tests/coValueCore.loadingState.test.d.ts.map +1 -0
- package/dist/tests/{coValueCoreLoadingState.test.js → coValueCore.loadingState.test.js} +4 -12
- package/dist/tests/coValueCore.loadingState.test.js.map +1 -0
- package/dist/tests/coValueCore.test.js +30 -5
- package/dist/tests/coValueCore.test.js.map +1 -1
- package/dist/tests/knownState.test.d.ts +2 -0
- package/dist/tests/knownState.test.d.ts.map +1 -0
- package/dist/tests/knownState.test.js +510 -0
- package/dist/tests/knownState.test.js.map +1 -0
- package/dist/tests/messagesTestUtils.d.ts.map +1 -1
- package/dist/tests/messagesTestUtils.js.map +1 -1
- package/dist/tests/priority.test.js.map +1 -1
- package/dist/tests/sync.mesh.test.js +4 -34
- package/dist/tests/sync.mesh.test.js.map +1 -1
- package/dist/tests/sync.storage.test.js.map +1 -1
- package/dist/tests/sync.upload.test.js.map +1 -1
- package/dist/tests/testUtils.d.ts +7 -1
- package/dist/tests/testUtils.d.ts.map +1 -1
- package/dist/tests/testUtils.js +12 -0
- package/dist/tests/testUtils.js.map +1 -1
- package/package.json +3 -3
- package/src/PeerKnownStates.ts +36 -22
- package/src/PeerState.ts +2 -1
- package/src/SyncStateManager.ts +4 -17
- package/src/coValueContentMessage.ts +2 -1
- package/src/coValueCore/SessionMap.ts +66 -11
- package/src/coValueCore/branching.ts +37 -13
- package/src/coValueCore/coValueCore.ts +224 -177
- package/src/coValueCore/decryptTransactionChangesAndMeta.ts +56 -0
- package/src/coValueCore/verifiedState.ts +32 -64
- package/src/coValues/coMap.ts +1 -5
- package/src/coValues/coStream.ts +1 -5
- package/src/exports.ts +2 -2
- package/src/knownState.ts +118 -12
- package/src/localNode.ts +1 -1
- package/src/permissions.ts +21 -22
- package/src/storage/knownState.ts +9 -3
- package/src/storage/storageAsync.ts +15 -7
- package/src/storage/storageSync.ts +16 -8
- package/src/storage/types.ts +2 -1
- package/src/sync.ts +14 -60
- package/src/tests/PeerKnownStates.test.ts +1 -1
- package/src/tests/PeerState.test.ts +29 -3
- package/src/tests/PureJSCrypto.test.ts +0 -1
- package/src/tests/StorageApiAsync.test.ts +3 -6
- package/src/tests/StorageApiSync.test.ts +2 -6
- package/src/tests/StoreQueue.test.ts +3 -2
- package/src/tests/SyncStateManager.test.ts +1 -1
- package/src/tests/branching.test.ts +392 -45
- package/src/tests/coValueContentMessage.test.ts +2 -2
- package/src/tests/coValueCore.loadFromStorage.test.ts +540 -0
- package/src/tests/{coValueCoreLoadingState.test.ts → coValueCore.loadingState.test.ts} +3 -16
- package/src/tests/coValueCore.test.ts +40 -5
- package/src/tests/knownState.test.ts +665 -0
- package/src/tests/messagesTestUtils.ts +2 -1
- package/src/tests/priority.test.ts +0 -2
- package/src/tests/sync.mesh.test.ts +11 -38
- package/src/tests/sync.storage.test.ts +0 -1
- package/src/tests/sync.upload.test.ts +0 -1
- package/src/tests/testUtils.ts +22 -2
- package/dist/coValueCore/decodeTransactionChangesAndMeta.d.ts +0 -3
- package/dist/coValueCore/decodeTransactionChangesAndMeta.d.ts.map +0 -1
- package/dist/coValueCore/decodeTransactionChangesAndMeta.js +0 -59
- package/dist/coValueCore/decodeTransactionChangesAndMeta.js.map +0 -1
- package/dist/tests/coValueCoreLoadingState.test.d.ts +0 -2
- package/dist/tests/coValueCoreLoadingState.test.d.ts.map +0 -1
- package/dist/tests/coValueCoreLoadingState.test.js.map +0 -1
- package/src/coValueCore/decodeTransactionChangesAndMeta.ts +0 -81
|
@@ -7,30 +7,39 @@ import { CryptoProvider, Hash, KeyID, KeySecret, Signature, SignerID } from "../
|
|
|
7
7
|
import { AgentID, RawCoID, SessionID, TransactionID } from "../ids.js";
|
|
8
8
|
import { JsonObject, JsonValue } from "../jsonValue.js";
|
|
9
9
|
import { LocalNode, ResolveAccountAgentError } from "../localNode.js";
|
|
10
|
-
import {
|
|
10
|
+
import { NewContentMessage, PeerID } from "../sync.js";
|
|
11
11
|
import { CoValueHeader, Transaction, VerifiedState } from "./verifiedState.js";
|
|
12
12
|
import { MergeCommit, BranchPointerCommit, BranchStartCommit } from "./branching.js";
|
|
13
13
|
import { type RawAccountID } from "../coValues/account.js";
|
|
14
|
+
import { CoValueKnownState, KnownStateSessions } from "../knownState.js";
|
|
14
15
|
export declare function idforHeader(header: CoValueHeader, crypto: CryptoProvider): RawCoID;
|
|
15
|
-
export
|
|
16
|
+
export declare class VerifiedTransaction {
|
|
16
17
|
author: RawAccountID | AgentID;
|
|
17
|
-
|
|
18
|
+
currentTxID: TransactionID;
|
|
19
|
+
sourceTxID: TransactionID | undefined;
|
|
18
20
|
tx: Transaction;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
currentMadeAt: number;
|
|
22
|
+
sourceTxMadeAt: number | undefined;
|
|
21
23
|
changes: JsonValue[] | undefined;
|
|
22
24
|
meta: JsonObject | undefined;
|
|
23
25
|
isValid: boolean;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
+
isValidated: boolean;
|
|
27
|
+
isDecrypted: boolean;
|
|
26
28
|
hasMetaBeenParsed: boolean;
|
|
27
29
|
previous: VerifiedTransaction | undefined;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
constructor(sessionID: SessionID, txIndex: number, tx: Transaction, branchId: RawCoID | undefined, parsingCache: {
|
|
31
|
+
changes: JsonValue[];
|
|
32
|
+
meta: JsonObject | undefined;
|
|
33
|
+
} | undefined, previous: VerifiedTransaction | undefined);
|
|
34
|
+
get txID(): TransactionID;
|
|
35
|
+
get madeAt(): number;
|
|
36
|
+
isValidTransactionWithChanges(): this is {
|
|
37
|
+
changes: JsonValue[];
|
|
38
|
+
isValid: true;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export type DecryptedTransaction = Omit<VerifiedTransaction, "changes"> & {
|
|
31
42
|
changes: JsonValue[];
|
|
32
|
-
madeAt: number;
|
|
33
|
-
tx: Transaction;
|
|
34
43
|
};
|
|
35
44
|
export type AvailableCoValueCore = CoValueCore & {
|
|
36
45
|
verified: VerifiedState;
|
|
@@ -53,27 +62,21 @@ export declare class CoValueCore {
|
|
|
53
62
|
* In this case, it acts as a centralised entry to keep track of peer loading
|
|
54
63
|
* state and to subscribe to its content when it does become available. */
|
|
55
64
|
get verified(): VerifiedState | null;
|
|
56
|
-
private readonly
|
|
65
|
+
private readonly loadingStatuses;
|
|
57
66
|
private _cachedContent?;
|
|
58
67
|
readonly listeners: Set<(core: CoValueCore, unsub: () => void) => void>;
|
|
59
68
|
private counter;
|
|
60
|
-
|
|
61
|
-
static fromID(id: RawCoID, node: LocalNode): CoValueCore;
|
|
62
|
-
static fromHeader(header: CoValueHeader, node: LocalNode): AvailableCoValueCore;
|
|
69
|
+
constructor(id: RawCoID, node: LocalNode);
|
|
63
70
|
get loadingState(): "unavailable" | "available" | "unknown" | "loading";
|
|
64
71
|
hasMissingDependencies(): boolean;
|
|
65
72
|
isAvailable(): this is AvailableCoValueCore;
|
|
66
73
|
hasVerifiedContent(): this is AvailableCoValueCore;
|
|
67
74
|
isErroredInPeer(peerId: PeerID): boolean;
|
|
75
|
+
waitFor(callback: (value: CoValueCore) => boolean): Promise<CoValueCore>;
|
|
68
76
|
waitForAvailableOrUnavailable(): Promise<CoValueCore>;
|
|
69
77
|
waitForAvailable(): Promise<CoValueCore>;
|
|
70
78
|
waitForFullStreaming(): Promise<CoValueCore>;
|
|
71
|
-
|
|
72
|
-
type: "unknown" | "pending" | "available" | "unavailable";
|
|
73
|
-
} | {
|
|
74
|
-
type: "errored";
|
|
75
|
-
error: TryAddTransactionsError;
|
|
76
|
-
} | undefined;
|
|
79
|
+
getLoadingStateForPeer(peerId: PeerID): "unavailable" | "available" | "unknown" | "pending" | "errored";
|
|
77
80
|
private updateCounter;
|
|
78
81
|
unmount(garbageCollectGroups?: boolean): boolean;
|
|
79
82
|
markNotFoundInPeer(peerId: PeerID): void;
|
|
@@ -90,7 +93,7 @@ export declare class CoValueCore {
|
|
|
90
93
|
*/
|
|
91
94
|
addNewContentToQueue(msg: NewContentMessage, from: PeerState | "storage" | "import"): void;
|
|
92
95
|
addDependencyFromHeader(header: CoValueHeader): void;
|
|
93
|
-
provideHeader(header: CoValueHeader, streamingKnownState?:
|
|
96
|
+
provideHeader(header: CoValueHeader, streamingKnownState?: KnownStateSessions, skipVerify?: boolean): boolean;
|
|
94
97
|
markErrored(peerId: PeerID, error: TryAddTransactionsError): void;
|
|
95
98
|
markPending(peerId: PeerID): void;
|
|
96
99
|
groupInvalidationSubscription?: () => void;
|
|
@@ -172,13 +175,14 @@ export declare class CoValueCore {
|
|
|
172
175
|
ignorePrivateTransactions: boolean;
|
|
173
176
|
knownTransactions?: Set<Transaction>;
|
|
174
177
|
}): DecryptedTransaction[];
|
|
175
|
-
compareTransactions(a: Pick<
|
|
178
|
+
compareTransactions(a: Pick<VerifiedTransaction, "madeAt" | "txID">, b: Pick<VerifiedTransaction, "madeAt" | "txID">): number;
|
|
176
179
|
getCurrentReadKey(): {
|
|
177
180
|
secret: KeySecret | undefined;
|
|
178
181
|
id: KeyID;
|
|
179
182
|
};
|
|
180
183
|
readKeyCache: Map<`key_z${string}`, `keySecret_z${string}`>;
|
|
181
184
|
getReadKey(keyID: KeyID): KeySecret | undefined;
|
|
185
|
+
safeGetGroup(): RawGroup | undefined;
|
|
182
186
|
getGroup(): RawGroup;
|
|
183
187
|
getTx(txID: TransactionID): Transaction | undefined;
|
|
184
188
|
getDependedOnCoValues(): Set<RawCoID>;
|
|
@@ -188,7 +192,7 @@ export declare class CoValueCore {
|
|
|
188
192
|
load(peers: PeerState[]): void;
|
|
189
193
|
loadFromStorage(done?: (found: boolean) => void): void;
|
|
190
194
|
loadFromPeers(peers: PeerState[]): void;
|
|
191
|
-
internalLoadFromPeer(peer: PeerState):
|
|
195
|
+
internalLoadFromPeer(peer: PeerState): void;
|
|
192
196
|
}
|
|
193
197
|
export type InvalidHashError = {
|
|
194
198
|
type: "InvalidHash";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coValueCore.d.ts","sourceRoot":"","sources":["../../src/coValueCore/coValueCore.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAW,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIrD,OAAO,EACL,cAAc,EACd,IAAI,EACJ,KAAK,EACL,SAAS,EACT,SAAS,EACT,QAAQ,EACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAGtE,OAAO,
|
|
1
|
+
{"version":3,"file":"coValueCore.d.ts","sourceRoot":"","sources":["../../src/coValueCore/coValueCore.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,19 +17,75 @@ import { validateTxSizeLimitInBytes } from "../coValueContentMessage.js";
|
|
|
17
17
|
import { coreToCoValue } from "../coreToCoValue.js";
|
|
18
18
|
import { logger } from "../logger.js";
|
|
19
19
|
import { determineValidTransactions } from "../permissions.js";
|
|
20
|
-
import { emptyKnownState, } from "../sync.js";
|
|
21
20
|
import { accountOrAgentIDfromSessionID } from "../typeUtils/accountOrAgentIDfromSessionID.js";
|
|
22
21
|
import { expectGroup } from "../typeUtils/expectGroup.js";
|
|
23
22
|
import { getDependenciesFromContentMessage, getDependenciesFromGroupRawTransactions, getDependenciesFromHeader, } from "./utils.js";
|
|
24
23
|
import { VerifiedState } from "./verifiedState.js";
|
|
25
24
|
import { SessionMap } from "./SessionMap.js";
|
|
26
25
|
import { createBranch, getBranchId, getBranchOwnerId, getBranchSource, mergeBranch, } from "./branching.js";
|
|
27
|
-
import {
|
|
28
|
-
import { combineKnownStateSessions } from "../knownState.js";
|
|
26
|
+
import { decryptTransactionChangesAndMeta } from "./decryptTransactionChangesAndMeta.js";
|
|
27
|
+
import { combineKnownStateSessions, emptyKnownState, } from "../knownState.js";
|
|
28
|
+
import { safeParseJSON } from "../jsonStringify.js";
|
|
29
29
|
export function idforHeader(header, crypto) {
|
|
30
30
|
const hash = crypto.shortHash(header);
|
|
31
31
|
return `co_z${hash.slice("shortHash_z".length)}`;
|
|
32
32
|
}
|
|
33
|
+
export class VerifiedTransaction {
|
|
34
|
+
constructor(sessionID, txIndex, tx, branchId, parsingCache, previous) {
|
|
35
|
+
// Whether the transaction is valid, as per membership rules
|
|
36
|
+
this.isValid = false;
|
|
37
|
+
// Whether the transaction has been validated, used to track if determinedValidTransactions needs to check this
|
|
38
|
+
this.isValidated = false;
|
|
39
|
+
// True if the transaction has been decrypted
|
|
40
|
+
this.isDecrypted = false;
|
|
41
|
+
// True if the meta information has been parsed and loaded in the CoValueCore
|
|
42
|
+
this.hasMetaBeenParsed = false;
|
|
43
|
+
this.author = accountOrAgentIDfromSessionID(sessionID);
|
|
44
|
+
const txID = branchId
|
|
45
|
+
? {
|
|
46
|
+
sessionID,
|
|
47
|
+
txIndex,
|
|
48
|
+
branch: branchId,
|
|
49
|
+
}
|
|
50
|
+
: {
|
|
51
|
+
sessionID,
|
|
52
|
+
txIndex,
|
|
53
|
+
};
|
|
54
|
+
this.currentTxID = txID;
|
|
55
|
+
this.sourceTxID = undefined;
|
|
56
|
+
this.tx = tx;
|
|
57
|
+
this.currentMadeAt = tx.madeAt;
|
|
58
|
+
this.sourceTxMadeAt = undefined;
|
|
59
|
+
this.isValidated = false;
|
|
60
|
+
this.previous = previous;
|
|
61
|
+
if (parsingCache) {
|
|
62
|
+
this.changes = parsingCache.changes;
|
|
63
|
+
this.meta = parsingCache.meta;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
// Decoding the trusting transactions here because they might be useful in the permissions checks
|
|
67
|
+
if (this.tx.privacy === "trusting") {
|
|
68
|
+
this.changes = safeParseJSON(this.tx.changes);
|
|
69
|
+
if (this.tx.meta) {
|
|
70
|
+
this.meta = safeParseJSON(this.tx.meta);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// The TxID that refers to the current position in the session map
|
|
76
|
+
// If this is a merged transaction, the txID is the TxID of the merged transaction
|
|
77
|
+
get txID() {
|
|
78
|
+
return this.sourceTxID ?? this.currentTxID;
|
|
79
|
+
}
|
|
80
|
+
// The madeAt that refers to the time when the transaction was made
|
|
81
|
+
// If this is a merged transaction, the madeAt is the time when the transaction has been made in the branch
|
|
82
|
+
get madeAt() {
|
|
83
|
+
return this.sourceTxMadeAt ?? this.currentMadeAt;
|
|
84
|
+
}
|
|
85
|
+
isValidTransactionWithChanges() {
|
|
86
|
+
return Boolean(this.isValid && this.changes);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
33
89
|
export class CoValueCore {
|
|
34
90
|
/** Holds the fundamental syncable content of a CoValue,
|
|
35
91
|
* consisting of the header (verified by hash -> RawCoID)
|
|
@@ -45,8 +101,8 @@ export class CoValueCore {
|
|
|
45
101
|
get verified() {
|
|
46
102
|
return this._verified;
|
|
47
103
|
}
|
|
48
|
-
constructor(
|
|
49
|
-
this.
|
|
104
|
+
constructor(id, node) {
|
|
105
|
+
this.loadingStatuses = new Map();
|
|
50
106
|
this.listeners = new Set();
|
|
51
107
|
this.missingDependencies = new Set();
|
|
52
108
|
this.newContentQueue = [];
|
|
@@ -65,14 +121,8 @@ export class CoValueCore {
|
|
|
65
121
|
this.dependencies = new Set();
|
|
66
122
|
this.readKeyCache = new Map();
|
|
67
123
|
this.crypto = node.crypto;
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
this._verified = new VerifiedState(this.id, node.crypto, init.header);
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
this.id = init.id;
|
|
74
|
-
this._verified = null;
|
|
75
|
-
}
|
|
124
|
+
this.id = id;
|
|
125
|
+
this._verified = null;
|
|
76
126
|
this.node = node;
|
|
77
127
|
this.counter = metrics
|
|
78
128
|
.getMeter("cojson")
|
|
@@ -83,20 +133,14 @@ export class CoValueCore {
|
|
|
83
133
|
});
|
|
84
134
|
this.updateCounter(null);
|
|
85
135
|
}
|
|
86
|
-
static fromID(id, node) {
|
|
87
|
-
return new CoValueCore({ id }, node);
|
|
88
|
-
}
|
|
89
|
-
static fromHeader(header, node) {
|
|
90
|
-
return new CoValueCore({ header }, node);
|
|
91
|
-
}
|
|
92
136
|
get loadingState() {
|
|
93
137
|
if (this.verified) {
|
|
94
138
|
return "available";
|
|
95
139
|
}
|
|
96
|
-
else if (this.
|
|
140
|
+
else if (this.loadingStatuses.size === 0) {
|
|
97
141
|
return "unknown";
|
|
98
142
|
}
|
|
99
|
-
for (const peer of this.
|
|
143
|
+
for (const peer of this.loadingStatuses.values()) {
|
|
100
144
|
if (peer.type === "pending") {
|
|
101
145
|
return "loading";
|
|
102
146
|
}
|
|
@@ -116,46 +160,29 @@ export class CoValueCore {
|
|
|
116
160
|
return !!this.verified;
|
|
117
161
|
}
|
|
118
162
|
isErroredInPeer(peerId) {
|
|
119
|
-
return this.
|
|
163
|
+
return this.getLoadingStateForPeer(peerId) === "errored";
|
|
120
164
|
}
|
|
121
|
-
|
|
165
|
+
waitFor(callback) {
|
|
122
166
|
return new Promise((resolve) => {
|
|
123
|
-
|
|
124
|
-
if (
|
|
167
|
+
this.subscribe((core, unsubscribe) => {
|
|
168
|
+
if (callback(core)) {
|
|
169
|
+
unsubscribe();
|
|
125
170
|
resolve(core);
|
|
126
|
-
this.listeners.delete(listener);
|
|
127
171
|
}
|
|
128
|
-
};
|
|
129
|
-
this.listeners.add(listener);
|
|
130
|
-
listener(this);
|
|
172
|
+
}, true);
|
|
131
173
|
});
|
|
132
174
|
}
|
|
175
|
+
waitForAvailableOrUnavailable() {
|
|
176
|
+
return this.waitFor((core) => core.isAvailable() || core.loadingState === "unavailable");
|
|
177
|
+
}
|
|
133
178
|
waitForAvailable() {
|
|
134
|
-
return
|
|
135
|
-
const listener = (core) => {
|
|
136
|
-
if (core.isAvailable()) {
|
|
137
|
-
resolve(core);
|
|
138
|
-
this.listeners.delete(listener);
|
|
139
|
-
}
|
|
140
|
-
};
|
|
141
|
-
this.listeners.add(listener);
|
|
142
|
-
listener(this);
|
|
143
|
-
});
|
|
179
|
+
return this.waitFor((core) => core.isAvailable());
|
|
144
180
|
}
|
|
145
181
|
waitForFullStreaming() {
|
|
146
|
-
return
|
|
147
|
-
const listener = (core) => {
|
|
148
|
-
if (core.isAvailable() && !core.verified.isStreaming()) {
|
|
149
|
-
resolve(core);
|
|
150
|
-
this.listeners.delete(listener);
|
|
151
|
-
}
|
|
152
|
-
};
|
|
153
|
-
this.listeners.add(listener);
|
|
154
|
-
listener(this);
|
|
155
|
-
});
|
|
182
|
+
return this.waitFor((core) => core.isAvailable() && !core.verified.isStreaming());
|
|
156
183
|
}
|
|
157
|
-
|
|
158
|
-
return this.
|
|
184
|
+
getLoadingStateForPeer(peerId) {
|
|
185
|
+
return this.loadingStatuses.get(peerId)?.type ?? "unknown";
|
|
159
186
|
}
|
|
160
187
|
updateCounter(previousState) {
|
|
161
188
|
const newState = this.loadingState;
|
|
@@ -184,12 +211,12 @@ export class CoValueCore {
|
|
|
184
211
|
}
|
|
185
212
|
markNotFoundInPeer(peerId) {
|
|
186
213
|
const previousState = this.loadingState;
|
|
187
|
-
this.
|
|
214
|
+
this.loadingStatuses.set(peerId, { type: "unavailable" });
|
|
188
215
|
this.updateCounter(previousState);
|
|
189
216
|
this.scheduleNotifyUpdate();
|
|
190
217
|
}
|
|
191
218
|
markFoundInPeer(peerId, previousState) {
|
|
192
|
-
this.
|
|
219
|
+
this.loadingStatuses.set(peerId, { type: "available" });
|
|
193
220
|
this.updateCounter(previousState);
|
|
194
221
|
this.scheduleNotifyUpdate();
|
|
195
222
|
}
|
|
@@ -255,18 +282,18 @@ export class CoValueCore {
|
|
|
255
282
|
if (this._verified?.sessions.size) {
|
|
256
283
|
throw new Error("CoValueCore: provideHeader called on coValue with verified sessions present!");
|
|
257
284
|
}
|
|
258
|
-
this._verified = new VerifiedState(this.id, this.node.crypto, header, new SessionMap(this.id, this.node.crypto
|
|
285
|
+
this._verified = new VerifiedState(this.id, this.node.crypto, header, new SessionMap(this.id, this.node.crypto, streamingKnownState));
|
|
259
286
|
return true;
|
|
260
287
|
}
|
|
261
288
|
markErrored(peerId, error) {
|
|
262
289
|
const previousState = this.loadingState;
|
|
263
|
-
this.
|
|
290
|
+
this.loadingStatuses.set(peerId, { type: "errored", error });
|
|
264
291
|
this.updateCounter(previousState);
|
|
265
292
|
this.scheduleNotifyUpdate();
|
|
266
293
|
}
|
|
267
294
|
markPending(peerId) {
|
|
268
295
|
const previousState = this.loadingState;
|
|
269
|
-
this.
|
|
296
|
+
this.loadingStatuses.set(peerId, { type: "pending" });
|
|
270
297
|
this.updateCounter(previousState);
|
|
271
298
|
this.scheduleNotifyUpdate();
|
|
272
299
|
}
|
|
@@ -518,34 +545,11 @@ export class CoValueCore {
|
|
|
518
545
|
if (!tx) {
|
|
519
546
|
continue;
|
|
520
547
|
}
|
|
521
|
-
const txID = isBranched
|
|
522
|
-
? {
|
|
523
|
-
sessionID,
|
|
524
|
-
txIndex,
|
|
525
|
-
branch: this.id,
|
|
526
|
-
}
|
|
527
|
-
: {
|
|
528
|
-
sessionID,
|
|
529
|
-
txIndex,
|
|
530
|
-
};
|
|
531
548
|
const cache = this.parsingCache.get(tx);
|
|
532
549
|
if (cache) {
|
|
533
550
|
this.parsingCache.delete(tx);
|
|
534
551
|
}
|
|
535
|
-
const verifiedTransaction =
|
|
536
|
-
author: accountOrAgentIDfromSessionID(sessionID),
|
|
537
|
-
txID,
|
|
538
|
-
madeAt: tx.madeAt,
|
|
539
|
-
isValidated: false,
|
|
540
|
-
isValid: false,
|
|
541
|
-
changes: cache?.changes,
|
|
542
|
-
meta: cache?.meta,
|
|
543
|
-
hasInvalidChanges: false,
|
|
544
|
-
hasInvalidMeta: false,
|
|
545
|
-
hasMetaBeenParsed: false,
|
|
546
|
-
tx,
|
|
547
|
-
previous: this.lastVerifiedTransactionBySessionID[sessionID],
|
|
548
|
-
};
|
|
552
|
+
const verifiedTransaction = new VerifiedTransaction(sessionID, txIndex, tx, isBranched ? this.id : undefined, cache, this.lastVerifiedTransactionBySessionID[sessionID]);
|
|
549
553
|
if (verifiedTransaction.madeAt > this.latestTxMadeAt) {
|
|
550
554
|
this.latestTxMadeAt = verifiedTransaction.madeAt;
|
|
551
555
|
}
|
|
@@ -603,19 +607,30 @@ export class CoValueCore {
|
|
|
603
607
|
if ("mi" in transaction.meta) {
|
|
604
608
|
const meta = transaction.meta;
|
|
605
609
|
// Check if the transaction is a merge commit
|
|
606
|
-
const previousTransaction = transaction.previous
|
|
607
|
-
const sessionID = meta.s ?? previousTransaction?.sessionID;
|
|
610
|
+
const previousTransaction = transaction.previous;
|
|
611
|
+
const sessionID = meta.s ?? previousTransaction?.txID.sessionID;
|
|
612
|
+
if (meta.t) {
|
|
613
|
+
transaction.sourceTxMadeAt = transaction.currentMadeAt - meta.t;
|
|
614
|
+
}
|
|
615
|
+
else if (previousTransaction) {
|
|
616
|
+
transaction.sourceTxMadeAt = previousTransaction.madeAt;
|
|
617
|
+
}
|
|
618
|
+
// Check against tampering of the meta.t value to write transaction after the access revocation
|
|
619
|
+
if (transaction.sourceTxMadeAt &&
|
|
620
|
+
transaction.sourceTxMadeAt > transaction.currentMadeAt) {
|
|
621
|
+
transaction.isValid = false;
|
|
622
|
+
}
|
|
608
623
|
if (sessionID) {
|
|
609
|
-
transaction.
|
|
624
|
+
transaction.sourceTxID = {
|
|
610
625
|
sessionID,
|
|
611
626
|
txIndex: meta.mi,
|
|
612
|
-
branch: meta.b ?? previousTransaction?.branch,
|
|
627
|
+
branch: meta.b ?? previousTransaction?.txID.branch,
|
|
613
628
|
};
|
|
614
629
|
}
|
|
615
630
|
else {
|
|
616
631
|
logger.error("Merge commit without session ID", {
|
|
617
632
|
txID: transaction.txID,
|
|
618
|
-
|
|
633
|
+
prevTxID: previousTransaction?.txID ?? null,
|
|
619
634
|
});
|
|
620
635
|
}
|
|
621
636
|
}
|
|
@@ -633,7 +648,9 @@ export class CoValueCore {
|
|
|
633
648
|
this.loadVerifiedTransactionsFromLogs();
|
|
634
649
|
this.determineValidTransactions();
|
|
635
650
|
for (const transaction of this.verifiedTransactions) {
|
|
636
|
-
|
|
651
|
+
if (!ignorePrivateTransactions) {
|
|
652
|
+
decryptTransactionChangesAndMeta(this, transaction);
|
|
653
|
+
}
|
|
637
654
|
this.parseMetaInformation(transaction);
|
|
638
655
|
}
|
|
639
656
|
}
|
|
@@ -648,14 +665,15 @@ export class CoValueCore {
|
|
|
648
665
|
const matchingTransactions = [];
|
|
649
666
|
const source = getBranchSource(this);
|
|
650
667
|
for (const transaction of this.verifiedTransactions) {
|
|
651
|
-
if (!isValidTransactionWithChanges(
|
|
668
|
+
if (!transaction.isValidTransactionWithChanges()) {
|
|
652
669
|
continue;
|
|
653
670
|
}
|
|
654
671
|
if (options?.knownTransactions?.has(transaction.tx)) {
|
|
655
672
|
continue;
|
|
656
673
|
}
|
|
657
674
|
options?.knownTransactions?.add(transaction.tx);
|
|
658
|
-
|
|
675
|
+
// Using the currentTxID to filter the transactions, because the TxID is modified by the merge meta
|
|
676
|
+
const txID = transaction.currentTxID;
|
|
659
677
|
const from = options?.from?.[txID.sessionID] ?? -1;
|
|
660
678
|
// Load the to filter index. Sessions that are not in the to filter will be skipped
|
|
661
679
|
const to = options?.to ? (options.to[txID.sessionID] ?? -1) : Infinity;
|
|
@@ -793,17 +811,24 @@ export class CoValueCore {
|
|
|
793
811
|
throw new Error("Only groups or values owned by groups have read secrets");
|
|
794
812
|
}
|
|
795
813
|
}
|
|
796
|
-
|
|
814
|
+
safeGetGroup() {
|
|
797
815
|
if (!this.verified) {
|
|
798
816
|
throw new Error("CoValueCore: getGroup called on coValue without verified state");
|
|
799
817
|
}
|
|
800
818
|
if (this.verified.header.ruleset.type !== "ownedByGroup") {
|
|
801
|
-
|
|
819
|
+
return undefined;
|
|
802
820
|
}
|
|
803
821
|
return expectGroup(this.node
|
|
804
822
|
.expectCoValueLoaded(this.verified.header.ruleset.group)
|
|
805
823
|
.getCurrentContent());
|
|
806
824
|
}
|
|
825
|
+
getGroup() {
|
|
826
|
+
const group = this.safeGetGroup();
|
|
827
|
+
if (!group) {
|
|
828
|
+
throw new Error("Only values owned by groups have groups");
|
|
829
|
+
}
|
|
830
|
+
return group;
|
|
831
|
+
}
|
|
807
832
|
getTx(txID) {
|
|
808
833
|
return this.verified?.sessions.get(txID.sessionID)?.transactions[txID.txIndex];
|
|
809
834
|
}
|
|
@@ -827,9 +852,29 @@ export class CoValueCore {
|
|
|
827
852
|
done?.(false);
|
|
828
853
|
return;
|
|
829
854
|
}
|
|
830
|
-
const currentState = this.
|
|
831
|
-
if (currentState
|
|
832
|
-
done
|
|
855
|
+
const currentState = this.getLoadingStateForPeer("storage");
|
|
856
|
+
if (currentState === "pending") {
|
|
857
|
+
if (!done) {
|
|
858
|
+
// We don't need to notify the result to anyone, so we can return early
|
|
859
|
+
return;
|
|
860
|
+
}
|
|
861
|
+
// Loading the value
|
|
862
|
+
this.subscribe((state, unsubscribe) => {
|
|
863
|
+
const updatedState = state.getLoadingStateForPeer("storage");
|
|
864
|
+
if (updatedState === "available" || state.isAvailable()) {
|
|
865
|
+
unsubscribe();
|
|
866
|
+
done(true);
|
|
867
|
+
}
|
|
868
|
+
else if (updatedState === "errored" ||
|
|
869
|
+
updatedState === "unavailable") {
|
|
870
|
+
unsubscribe();
|
|
871
|
+
done(false);
|
|
872
|
+
}
|
|
873
|
+
});
|
|
874
|
+
return;
|
|
875
|
+
}
|
|
876
|
+
if (currentState !== "unknown") {
|
|
877
|
+
done?.(currentState === "available");
|
|
833
878
|
return;
|
|
834
879
|
}
|
|
835
880
|
this.markPending("storage");
|
|
@@ -847,7 +892,7 @@ export class CoValueCore {
|
|
|
847
892
|
return;
|
|
848
893
|
}
|
|
849
894
|
for (const peer of peers) {
|
|
850
|
-
const currentState = this.
|
|
895
|
+
const currentState = this.getLoadingStateForPeer(peer.id);
|
|
851
896
|
if (currentState === "unknown" || currentState === "unavailable") {
|
|
852
897
|
this.markPending(peer.id);
|
|
853
898
|
this.internalLoadFromPeer(peer);
|
|
@@ -870,39 +915,31 @@ export class CoValueCore {
|
|
|
870
915
|
});
|
|
871
916
|
peer.trackLoadRequestSent(this.id);
|
|
872
917
|
}
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
const
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
}
|
|
898
|
-
};
|
|
899
|
-
this.listeners.add(listener);
|
|
900
|
-
listener(this);
|
|
901
|
-
});
|
|
918
|
+
const markNotFound = () => {
|
|
919
|
+
if (this.getLoadingStateForPeer(peer.id) === "pending") {
|
|
920
|
+
logger.warn("Timeout waiting for peer to load coValue", {
|
|
921
|
+
id: this.id,
|
|
922
|
+
peerID: peer.id,
|
|
923
|
+
});
|
|
924
|
+
this.markNotFoundInPeer(peer.id);
|
|
925
|
+
}
|
|
926
|
+
};
|
|
927
|
+
const timeout = setTimeout(markNotFound, CO_VALUE_LOADING_CONFIG.TIMEOUT);
|
|
928
|
+
const removeCloseListener = peer.persistent
|
|
929
|
+
? undefined
|
|
930
|
+
: peer.addCloseListener(markNotFound);
|
|
931
|
+
this.subscribe((state, unsubscribe) => {
|
|
932
|
+
const peerState = state.getLoadingStateForPeer(peer.id);
|
|
933
|
+
if (state.isAvailable() || // might have become available from another peer e.g. through handleNewContent
|
|
934
|
+
peerState === "available" ||
|
|
935
|
+
peerState === "errored" ||
|
|
936
|
+
peerState === "unavailable") {
|
|
937
|
+
unsubscribe();
|
|
938
|
+
removeCloseListener?.();
|
|
939
|
+
clearTimeout(timeout);
|
|
940
|
+
}
|
|
941
|
+
}, true);
|
|
902
942
|
}
|
|
903
943
|
}
|
|
904
944
|
_CoValueCore_isNotificationScheduled = new WeakMap(), _CoValueCore_batchedUpdates = new WeakMap(), _CoValueCore_isNotifyUpdatePaused = new WeakMap();
|
|
905
|
-
function isValidTransactionWithChanges(transaction) {
|
|
906
|
-
return Boolean(transaction.isValid && transaction.changes);
|
|
907
|
-
}
|
|
908
945
|
//# sourceMappingURL=coValueCore.js.map
|