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.
Files changed (161) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +17 -0
  3. package/dist/PeerKnownStates.d.ts +4 -3
  4. package/dist/PeerKnownStates.d.ts.map +1 -1
  5. package/dist/PeerKnownStates.js +27 -18
  6. package/dist/PeerKnownStates.js.map +1 -1
  7. package/dist/PeerState.d.ts +3 -2
  8. package/dist/PeerState.d.ts.map +1 -1
  9. package/dist/PeerState.js.map +1 -1
  10. package/dist/SyncStateManager.d.ts +2 -2
  11. package/dist/SyncStateManager.d.ts.map +1 -1
  12. package/dist/SyncStateManager.js +2 -10
  13. package/dist/SyncStateManager.js.map +1 -1
  14. package/dist/coValueContentMessage.d.ts +1 -1
  15. package/dist/coValueContentMessage.d.ts.map +1 -1
  16. package/dist/coValueContentMessage.js +1 -1
  17. package/dist/coValueContentMessage.js.map +1 -1
  18. package/dist/coValueCore/SessionMap.d.ts +6 -3
  19. package/dist/coValueCore/SessionMap.d.ts.map +1 -1
  20. package/dist/coValueCore/SessionMap.js +41 -8
  21. package/dist/coValueCore/SessionMap.js.map +1 -1
  22. package/dist/coValueCore/branching.d.ts +5 -4
  23. package/dist/coValueCore/branching.d.ts.map +1 -1
  24. package/dist/coValueCore/branching.js +22 -4
  25. package/dist/coValueCore/branching.js.map +1 -1
  26. package/dist/coValueCore/coValueCore.d.ts +29 -25
  27. package/dist/coValueCore/coValueCore.d.ts.map +1 -1
  28. package/dist/coValueCore/coValueCore.js +163 -126
  29. package/dist/coValueCore/coValueCore.js.map +1 -1
  30. package/dist/coValueCore/decryptTransactionChangesAndMeta.d.ts +3 -0
  31. package/dist/coValueCore/decryptTransactionChangesAndMeta.d.ts.map +1 -0
  32. package/dist/coValueCore/decryptTransactionChangesAndMeta.js +34 -0
  33. package/dist/coValueCore/decryptTransactionChangesAndMeta.js.map +1 -0
  34. package/dist/coValueCore/verifiedState.d.ts +12 -6
  35. package/dist/coValueCore/verifiedState.d.ts.map +1 -1
  36. package/dist/coValueCore/verifiedState.js +28 -56
  37. package/dist/coValueCore/verifiedState.js.map +1 -1
  38. package/dist/coValues/coMap.d.ts.map +1 -1
  39. package/dist/coValues/coMap.js.map +1 -1
  40. package/dist/coValues/coStream.d.ts.map +1 -1
  41. package/dist/coValues/coStream.js.map +1 -1
  42. package/dist/exports.d.ts +3 -2
  43. package/dist/exports.d.ts.map +1 -1
  44. package/dist/exports.js +2 -1
  45. package/dist/exports.js.map +1 -1
  46. package/dist/knownState.d.ts +58 -2
  47. package/dist/knownState.d.ts.map +1 -1
  48. package/dist/knownState.js +79 -5
  49. package/dist/knownState.js.map +1 -1
  50. package/dist/localNode.js +1 -1
  51. package/dist/localNode.js.map +1 -1
  52. package/dist/permissions.d.ts.map +1 -1
  53. package/dist/permissions.js +18 -20
  54. package/dist/permissions.js.map +1 -1
  55. package/dist/storage/knownState.d.ts +1 -1
  56. package/dist/storage/knownState.d.ts.map +1 -1
  57. package/dist/storage/knownState.js +2 -3
  58. package/dist/storage/knownState.js.map +1 -1
  59. package/dist/storage/storageAsync.d.ts +2 -1
  60. package/dist/storage/storageAsync.d.ts.map +1 -1
  61. package/dist/storage/storageAsync.js +5 -6
  62. package/dist/storage/storageAsync.js.map +1 -1
  63. package/dist/storage/storageSync.d.ts +2 -1
  64. package/dist/storage/storageSync.d.ts.map +1 -1
  65. package/dist/storage/storageSync.js +5 -5
  66. package/dist/storage/storageSync.js.map +1 -1
  67. package/dist/storage/types.d.ts +2 -1
  68. package/dist/storage/types.d.ts.map +1 -1
  69. package/dist/sync.d.ts +2 -12
  70. package/dist/sync.d.ts.map +1 -1
  71. package/dist/sync.js +9 -38
  72. package/dist/sync.js.map +1 -1
  73. package/dist/tests/PeerKnownStates.test.js +1 -1
  74. package/dist/tests/PeerKnownStates.test.js.map +1 -1
  75. package/dist/tests/PeerState.test.js +19 -0
  76. package/dist/tests/PeerState.test.js.map +1 -1
  77. package/dist/tests/PureJSCrypto.test.js.map +1 -1
  78. package/dist/tests/StorageApiAsync.test.js +1 -1
  79. package/dist/tests/StorageApiAsync.test.js.map +1 -1
  80. package/dist/tests/StorageApiSync.test.js +1 -2
  81. package/dist/tests/StorageApiSync.test.js.map +1 -1
  82. package/dist/tests/StoreQueue.test.js.map +1 -1
  83. package/dist/tests/SyncStateManager.test.js +1 -1
  84. package/dist/tests/SyncStateManager.test.js.map +1 -1
  85. package/dist/tests/branching.test.js +237 -28
  86. package/dist/tests/branching.test.js.map +1 -1
  87. package/dist/tests/coValueContentMessage.test.js +1 -1
  88. package/dist/tests/coValueContentMessage.test.js.map +1 -1
  89. package/dist/tests/coValueCore.loadFromStorage.test.d.ts +2 -0
  90. package/dist/tests/coValueCore.loadFromStorage.test.d.ts.map +1 -0
  91. package/dist/tests/coValueCore.loadFromStorage.test.js +395 -0
  92. package/dist/tests/coValueCore.loadFromStorage.test.js.map +1 -0
  93. package/dist/tests/coValueCore.loadingState.test.d.ts +2 -0
  94. package/dist/tests/coValueCore.loadingState.test.d.ts.map +1 -0
  95. package/dist/tests/{coValueCoreLoadingState.test.js → coValueCore.loadingState.test.js} +4 -12
  96. package/dist/tests/coValueCore.loadingState.test.js.map +1 -0
  97. package/dist/tests/coValueCore.test.js +30 -5
  98. package/dist/tests/coValueCore.test.js.map +1 -1
  99. package/dist/tests/knownState.test.d.ts +2 -0
  100. package/dist/tests/knownState.test.d.ts.map +1 -0
  101. package/dist/tests/knownState.test.js +510 -0
  102. package/dist/tests/knownState.test.js.map +1 -0
  103. package/dist/tests/messagesTestUtils.d.ts.map +1 -1
  104. package/dist/tests/messagesTestUtils.js.map +1 -1
  105. package/dist/tests/priority.test.js.map +1 -1
  106. package/dist/tests/sync.mesh.test.js +4 -34
  107. package/dist/tests/sync.mesh.test.js.map +1 -1
  108. package/dist/tests/sync.storage.test.js.map +1 -1
  109. package/dist/tests/sync.upload.test.js.map +1 -1
  110. package/dist/tests/testUtils.d.ts +7 -1
  111. package/dist/tests/testUtils.d.ts.map +1 -1
  112. package/dist/tests/testUtils.js +12 -0
  113. package/dist/tests/testUtils.js.map +1 -1
  114. package/package.json +3 -3
  115. package/src/PeerKnownStates.ts +36 -22
  116. package/src/PeerState.ts +2 -1
  117. package/src/SyncStateManager.ts +4 -17
  118. package/src/coValueContentMessage.ts +2 -1
  119. package/src/coValueCore/SessionMap.ts +66 -11
  120. package/src/coValueCore/branching.ts +37 -13
  121. package/src/coValueCore/coValueCore.ts +224 -177
  122. package/src/coValueCore/decryptTransactionChangesAndMeta.ts +56 -0
  123. package/src/coValueCore/verifiedState.ts +32 -64
  124. package/src/coValues/coMap.ts +1 -5
  125. package/src/coValues/coStream.ts +1 -5
  126. package/src/exports.ts +2 -2
  127. package/src/knownState.ts +118 -12
  128. package/src/localNode.ts +1 -1
  129. package/src/permissions.ts +21 -22
  130. package/src/storage/knownState.ts +9 -3
  131. package/src/storage/storageAsync.ts +15 -7
  132. package/src/storage/storageSync.ts +16 -8
  133. package/src/storage/types.ts +2 -1
  134. package/src/sync.ts +14 -60
  135. package/src/tests/PeerKnownStates.test.ts +1 -1
  136. package/src/tests/PeerState.test.ts +29 -3
  137. package/src/tests/PureJSCrypto.test.ts +0 -1
  138. package/src/tests/StorageApiAsync.test.ts +3 -6
  139. package/src/tests/StorageApiSync.test.ts +2 -6
  140. package/src/tests/StoreQueue.test.ts +3 -2
  141. package/src/tests/SyncStateManager.test.ts +1 -1
  142. package/src/tests/branching.test.ts +392 -45
  143. package/src/tests/coValueContentMessage.test.ts +2 -2
  144. package/src/tests/coValueCore.loadFromStorage.test.ts +540 -0
  145. package/src/tests/{coValueCoreLoadingState.test.ts → coValueCore.loadingState.test.ts} +3 -16
  146. package/src/tests/coValueCore.test.ts +40 -5
  147. package/src/tests/knownState.test.ts +665 -0
  148. package/src/tests/messagesTestUtils.ts +2 -1
  149. package/src/tests/priority.test.ts +0 -2
  150. package/src/tests/sync.mesh.test.ts +11 -38
  151. package/src/tests/sync.storage.test.ts +0 -1
  152. package/src/tests/sync.upload.test.ts +0 -1
  153. package/src/tests/testUtils.ts +22 -2
  154. package/dist/coValueCore/decodeTransactionChangesAndMeta.d.ts +0 -3
  155. package/dist/coValueCore/decodeTransactionChangesAndMeta.d.ts.map +0 -1
  156. package/dist/coValueCore/decodeTransactionChangesAndMeta.js +0 -59
  157. package/dist/coValueCore/decodeTransactionChangesAndMeta.js.map +0 -1
  158. package/dist/tests/coValueCoreLoadingState.test.d.ts +0 -2
  159. package/dist/tests/coValueCoreLoadingState.test.d.ts.map +0 -1
  160. package/dist/tests/coValueCoreLoadingState.test.js.map +0 -1
  161. package/src/coValueCore/decodeTransactionChangesAndMeta.ts +0 -81
package/src/sync.ts CHANGED
@@ -16,20 +16,11 @@ import { logger } from "./logger.js";
16
16
  import { CoValuePriority } from "./priority.js";
17
17
  import { IncomingMessagesQueue } from "./queue/IncomingMessagesQueue.js";
18
18
  import { LocalTransactionsSyncQueue } from "./queue/LocalTransactionsSyncQueue.js";
19
-
20
- export type CoValueKnownState = {
21
- id: RawCoID;
22
- header: boolean;
23
- sessions: { [sessionID: SessionID]: number };
24
- };
25
-
26
- export function emptyKnownState(id: RawCoID): CoValueKnownState {
27
- return {
28
- id,
29
- header: false,
30
- sessions: {},
31
- };
32
- }
19
+ import {
20
+ CoValueKnownState,
21
+ knownStateFrom,
22
+ KnownStateSessions,
23
+ } from "./knownState.js";
33
24
 
34
25
  export type SyncMessage =
35
26
  | LoadMessage
@@ -55,9 +46,7 @@ export type NewContentMessage = {
55
46
  new: {
56
47
  [sessionID: SessionID]: SessionNewContent;
57
48
  };
58
- expectContentUntil?: {
59
- [sessionID: SessionID]: number;
60
- };
49
+ expectContentUntil?: KnownStateSessions;
61
50
  };
62
51
 
63
52
  export type SessionNewContent = {
@@ -97,31 +86,6 @@ export interface Peer {
97
86
  persistent?: boolean;
98
87
  }
99
88
 
100
- export function combinedKnownStates(
101
- stateA: CoValueKnownState,
102
- stateB: CoValueKnownState,
103
- ): CoValueKnownState {
104
- const sessionStates: CoValueKnownState["sessions"] = {};
105
-
106
- const allSessions = new Set([
107
- ...Object.keys(stateA.sessions),
108
- ...Object.keys(stateB.sessions),
109
- ] as SessionID[]);
110
-
111
- for (const sessionID of allSessions) {
112
- const stateAValue = stateA.sessions[sessionID];
113
- const stateBValue = stateB.sessions[sessionID];
114
-
115
- sessionStates[sessionID] = Math.max(stateAValue || 0, stateBValue || 0);
116
- }
117
-
118
- return {
119
- id: stateA.id,
120
- header: stateA.header || stateB.header,
121
- sessions: sessionStates,
122
- };
123
- }
124
-
125
89
  export type ServerPeerSelector = (
126
90
  id: RawCoID,
127
91
  serverPeers: PeerState[],
@@ -446,7 +410,7 @@ export class SyncManager {
446
410
  * This way we can track part of the data loss that may occur when the other peer is restarted
447
411
  *
448
412
  */
449
- peer.setKnownState(msg.id, knownStateIn(msg));
413
+ peer.setKnownState(msg.id, knownStateFrom(msg));
450
414
  const coValue = this.local.getCoValue(msg.id);
451
415
 
452
416
  if (coValue.isAvailable()) {
@@ -482,7 +446,7 @@ export class SyncManager {
482
446
  handleKnownState(msg: KnownStateMessage, peer: PeerState) {
483
447
  const coValue = this.local.getCoValue(msg.id);
484
448
 
485
- peer.combineWith(msg.id, knownStateIn(msg));
449
+ peer.combineWith(msg.id, knownStateFrom(msg));
486
450
 
487
451
  // The header is a boolean value that tells us if the other peer do have information about the header.
488
452
  // If it's false in this point it means that the coValue is unavailable on the other peer.
@@ -706,12 +670,10 @@ export class SyncManager {
706
670
  contentToStore.new[sessionID] = newContentForSession;
707
671
  }
708
672
 
709
- peer?.updateSessionCounter(
710
- msg.id,
711
- sessionID,
673
+ const transactionsCount =
712
674
  newContentForSession.after +
713
- newContentForSession.newTransactions.length,
714
- );
675
+ newContentForSession.newTransactions.length;
676
+ peer?.updateSessionCounter(msg.id, sessionID, transactionsCount);
715
677
  }
716
678
 
717
679
  /**
@@ -778,11 +740,11 @@ export class SyncManager {
778
740
  peer.role === "server" &&
779
741
  !peer.loadRequestSent.has(coValue.id)
780
742
  ) {
781
- const state = coValue.getStateForPeer(peer.id)?.type;
743
+ const state = coValue.getLoadingStateForPeer(peer.id);
782
744
 
783
745
  // Check if there is a inflight load operation and we
784
746
  // are waiting for other peers to send the load request
785
- if (state === "unknown" || state === undefined) {
747
+ if (state === "unknown") {
786
748
  // Sending a load message to the peer to get to know how much content is missing
787
749
  // before sending the new content
788
750
  this.trySendToPeer(peer, {
@@ -804,7 +766,7 @@ export class SyncManager {
804
766
  }
805
767
 
806
768
  handleCorrection(msg: KnownStateMessage, peer: PeerState) {
807
- peer.setKnownState(msg.id, knownStateIn(msg));
769
+ peer.setKnownState(msg.id, knownStateFrom(msg));
808
770
 
809
771
  return this.sendNewContent(msg.id, peer);
810
772
  }
@@ -952,14 +914,6 @@ export class SyncManager {
952
914
  }
953
915
  }
954
916
 
955
- function knownStateIn(msg: LoadMessage | KnownStateMessage) {
956
- return {
957
- id: msg.id,
958
- header: msg.header,
959
- sessions: msg.sessions,
960
- };
961
- }
962
-
963
917
  /**
964
918
  * Returns a ServerPeerSelector that implements the Highest Weighted Random (HWR) algorithm.
965
919
  *
@@ -1,7 +1,7 @@
1
1
  import { describe, expect, test, vi } from "vitest";
2
2
  import { PeerKnownStates } from "../PeerKnownStates.js";
3
3
  import { RawCoID, SessionID } from "../ids.js";
4
- import { CoValueKnownState, emptyKnownState } from "../sync.js";
4
+ import { CoValueKnownState, emptyKnownState } from "../knownState.js";
5
5
 
6
6
  describe("PeerKnownStates", () => {
7
7
  test("should set and get a known state", () => {
@@ -1,9 +1,8 @@
1
1
  import { describe, expect, test, vi } from "vitest";
2
2
  import { PeerState } from "../PeerState.js";
3
- import { CO_VALUE_PRIORITY } from "../priority.js";
4
3
  import { ConnectedPeerChannel } from "../streamUtils.js";
5
- import { CoValueKnownState, Peer, SyncMessage } from "../sync.js";
6
- import { waitFor } from "./testUtils.js";
4
+ import { Peer, SyncMessage } from "../sync.js";
5
+ import { CoValueKnownState, KnownStateSessions } from "../knownState.js";
7
6
 
8
7
  function setup() {
9
8
  const mockPeer: Peer = {
@@ -80,6 +79,33 @@ describe("PeerState", () => {
80
79
  expect(optimisticKnownStatesSpy).toHaveBeenCalledWith("co_z1", state);
81
80
  });
82
81
 
82
+ test("dispatching an optimistic update should not affect the known states", () => {
83
+ const { peerState } = setup();
84
+
85
+ const state: CoValueKnownState = {
86
+ id: "co_z1",
87
+ header: false,
88
+ sessions: {},
89
+ };
90
+
91
+ peerState.setKnownState("co_z1", state);
92
+
93
+ const optimisticState: CoValueKnownState = {
94
+ id: "co_z1",
95
+ header: false,
96
+ sessions: {
97
+ "session-1": 1,
98
+ } as KnownStateSessions,
99
+ };
100
+
101
+ peerState.combineOptimisticWith("co_z1", optimisticState);
102
+
103
+ expect(peerState.knownStates.get("co_z1")).not.toEqual(optimisticState);
104
+ expect(peerState.optimisticKnownStates.get("co_z1")).toEqual(
105
+ optimisticState,
106
+ );
107
+ });
108
+
83
109
  test("should use separate references for knownStates and optimisticKnownStates for non-storage peers", () => {
84
110
  const { peerState } = setup(); // Uses a regular peer
85
111
 
@@ -4,7 +4,6 @@ import {
4
4
  setCurrentTestCryptoProvider,
5
5
  setupTestNode,
6
6
  setupTestAccount,
7
- randomAgentAndSessionID,
8
7
  } from "./testUtils";
9
8
  import { PureJSCrypto } from "../crypto/PureJSCrypto";
10
9
  import { stableStringify } from "../jsonStringify";
@@ -4,13 +4,9 @@ import { tmpdir } from "node:os";
4
4
  import { join } from "node:path";
5
5
  import { afterEach, describe, expect, onTestFinished, test, vi } from "vitest";
6
6
  import { WasmCrypto } from "../crypto/WasmCrypto.js";
7
- import { CoID, LocalNode, RawCoID, RawCoMap, logger } from "../exports.js";
7
+ import { CoID, LocalNode, RawCoMap, logger } from "../exports.js";
8
8
  import { CoValueCore } from "../exports.js";
9
- import {
10
- CoValueKnownState,
11
- NewContentMessage,
12
- emptyKnownState,
13
- } from "../sync.js";
9
+ import { NewContentMessage } from "../sync.js";
14
10
  import { createAsyncStorage } from "./testStorage.js";
15
11
  import {
16
12
  SyncMessagesLog,
@@ -18,6 +14,7 @@ import {
18
14
  randomAgentAndSessionID,
19
15
  waitFor,
20
16
  } from "./testUtils.js";
17
+ import { CoValueKnownState, emptyKnownState } from "../knownState.js";
21
18
 
22
19
  const crypto = await WasmCrypto.create();
23
20
 
@@ -6,11 +6,8 @@ import { describe, expect, onTestFinished, test, vi } from "vitest";
6
6
  import { WasmCrypto } from "../crypto/WasmCrypto.js";
7
7
  import { CoID, LocalNode, RawCoID, RawCoMap, logger } from "../exports.js";
8
8
  import { CoValueCore } from "../exports.js";
9
- import {
10
- CoValueKnownState,
11
- NewContentMessage,
12
- emptyKnownState,
13
- } from "../sync.js";
9
+ import { NewContentMessage } from "../sync.js";
10
+ import { CoValueKnownState, emptyKnownState } from "../knownState.js";
14
11
  import { createSyncStorage } from "./testStorage.js";
15
12
  import { loadCoValueOrFail, randomAgentAndSessionID } from "./testUtils.js";
16
13
 
@@ -240,7 +237,6 @@ describe("StorageApiSync", () => {
240
237
 
241
238
  // Create a real group and add a member to create transactions
242
239
  const group = fixturesNode.createGroup();
243
- const knownState = group.core.verified.knownState();
244
240
 
245
241
  group.addMember("everyone", "reader");
246
242
 
@@ -1,6 +1,7 @@
1
- import { beforeEach, describe, expect, test, vi } from "vitest";
1
+ import { describe, expect, test, vi } from "vitest";
2
2
  import { StoreQueue } from "../queue/StoreQueue.js";
3
- import type { CoValueKnownState, NewContentMessage } from "../sync.js";
3
+ import { NewContentMessage } from "../sync.js";
4
+ import { CoValueKnownState } from "../knownState.js";
4
5
 
5
6
  function createMockNewContentMessage(id: string): NewContentMessage {
6
7
  return {
@@ -4,7 +4,7 @@ import {
4
4
  PeerSyncStateListenerCallback,
5
5
  } from "../SyncStateManager.js";
6
6
  import { connectedPeers } from "../streamUtils.js";
7
- import { emptyKnownState } from "../sync.js";
7
+ import { emptyKnownState } from "../exports.js";
8
8
  import {
9
9
  SyncMessagesLog,
10
10
  loadCoValueOrFail,