cojson 0.10.8 → 0.11.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.
Files changed (180) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +20 -0
  3. package/dist/CoValuesStore.d.ts +12 -0
  4. package/dist/CoValuesStore.d.ts.map +1 -0
  5. package/dist/PeerKnownStates.d.ts +38 -0
  6. package/dist/PeerKnownStates.d.ts.map +1 -0
  7. package/dist/PeerState.d.ts +46 -0
  8. package/dist/PeerState.d.ts.map +1 -0
  9. package/dist/PriorityBasedMessageQueue.d.ts +18 -0
  10. package/dist/PriorityBasedMessageQueue.d.ts.map +1 -0
  11. package/dist/SyncStateManager.d.ts +20 -0
  12. package/dist/SyncStateManager.d.ts.map +1 -0
  13. package/dist/base64url.d.ts +3 -0
  14. package/dist/base64url.d.ts.map +1 -0
  15. package/dist/base64url.test.d.ts +2 -0
  16. package/dist/base64url.test.d.ts.map +1 -0
  17. package/dist/coValue.d.ts +52 -0
  18. package/dist/coValue.d.ts.map +1 -0
  19. package/dist/coValueCore.d.ts +143 -0
  20. package/dist/coValueCore.d.ts.map +1 -0
  21. package/dist/coValueCore.js +3 -9
  22. package/dist/coValueCore.js.map +1 -1
  23. package/dist/coValueState.d.ts +58 -0
  24. package/dist/coValueState.d.ts.map +1 -0
  25. package/dist/coValues/account.d.ts +69 -0
  26. package/dist/coValues/account.d.ts.map +1 -0
  27. package/dist/coValues/account.js +9 -10
  28. package/dist/coValues/account.js.map +1 -1
  29. package/dist/coValues/coList.d.ts +163 -0
  30. package/dist/coValues/coList.d.ts.map +1 -0
  31. package/dist/coValues/coMap.d.ts +142 -0
  32. package/dist/coValues/coMap.d.ts.map +1 -0
  33. package/dist/coValues/coPlainText.d.ts +33 -0
  34. package/dist/coValues/coPlainText.d.ts.map +1 -0
  35. package/dist/coValues/coStream.d.ts +109 -0
  36. package/dist/coValues/coStream.d.ts.map +1 -0
  37. package/dist/coValues/group.d.ts +143 -0
  38. package/dist/coValues/group.d.ts.map +1 -0
  39. package/dist/coValues/group.js +52 -6
  40. package/dist/coValues/group.js.map +1 -1
  41. package/dist/coreToCoValue.d.ts +15 -0
  42. package/dist/coreToCoValue.d.ts.map +1 -0
  43. package/dist/crypto/PureJSCrypto.d.ts +50 -0
  44. package/dist/crypto/PureJSCrypto.d.ts.map +1 -0
  45. package/dist/crypto/WasmCrypto.d.ts +49 -0
  46. package/dist/crypto/WasmCrypto.d.ts.map +1 -0
  47. package/dist/crypto/crypto.d.ts +142 -0
  48. package/dist/crypto/crypto.d.ts.map +1 -0
  49. package/dist/exports.d.ts +84 -0
  50. package/dist/exports.d.ts.map +1 -0
  51. package/dist/ids.d.ts +23 -0
  52. package/dist/ids.d.ts.map +1 -0
  53. package/dist/index.d.ts +2 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/jsonStringify.d.ts +7 -0
  56. package/dist/jsonStringify.d.ts.map +1 -0
  57. package/dist/jsonValue.d.ts +45 -0
  58. package/dist/jsonValue.d.ts.map +1 -0
  59. package/dist/localNode.d.ts +111 -0
  60. package/dist/localNode.d.ts.map +1 -0
  61. package/dist/localNode.js +3 -5
  62. package/dist/localNode.js.map +1 -1
  63. package/dist/logger.d.ts +33 -0
  64. package/dist/logger.d.ts.map +1 -0
  65. package/dist/media.d.ts +8 -0
  66. package/dist/media.d.ts.map +1 -0
  67. package/dist/permissions.d.ts +24 -0
  68. package/dist/permissions.d.ts.map +1 -0
  69. package/dist/permissions.js +5 -9
  70. package/dist/permissions.js.map +1 -1
  71. package/dist/priority.d.ts +19 -0
  72. package/dist/priority.d.ts.map +1 -0
  73. package/dist/storage/FileSystem.d.ts +37 -0
  74. package/dist/storage/FileSystem.d.ts.map +1 -0
  75. package/dist/storage/chunksAndKnownStates.d.ts +7 -0
  76. package/dist/storage/chunksAndKnownStates.d.ts.map +1 -0
  77. package/dist/storage/index.d.ts +52 -0
  78. package/dist/storage/index.d.ts.map +1 -0
  79. package/dist/streamUtils.d.ts +13 -0
  80. package/dist/streamUtils.d.ts.map +1 -0
  81. package/dist/sync.d.ts +97 -0
  82. package/dist/sync.d.ts.map +1 -0
  83. package/dist/tests/PeerKnownStates.test.d.ts +2 -0
  84. package/dist/tests/PeerKnownStates.test.d.ts.map +1 -0
  85. package/dist/tests/PeerKnownStates.test.js +82 -0
  86. package/dist/tests/PeerKnownStates.test.js.map +1 -0
  87. package/dist/tests/PeerState.test.d.ts +2 -0
  88. package/dist/tests/PeerState.test.d.ts.map +1 -0
  89. package/dist/tests/PeerState.test.js +188 -0
  90. package/dist/tests/PeerState.test.js.map +1 -0
  91. package/dist/tests/PriorityBasedMessageQueue.test.d.ts +2 -0
  92. package/dist/tests/PriorityBasedMessageQueue.test.d.ts.map +1 -0
  93. package/dist/tests/PriorityBasedMessageQueue.test.js +120 -0
  94. package/dist/tests/PriorityBasedMessageQueue.test.js.map +1 -0
  95. package/dist/tests/SyncStateManager.test.d.ts +2 -0
  96. package/dist/tests/SyncStateManager.test.d.ts.map +1 -0
  97. package/dist/tests/SyncStateManager.test.js +127 -0
  98. package/dist/tests/SyncStateManager.test.js.map +1 -0
  99. package/dist/tests/account.test.d.ts +2 -0
  100. package/dist/tests/account.test.d.ts.map +1 -0
  101. package/dist/tests/account.test.js +66 -0
  102. package/dist/tests/account.test.js.map +1 -0
  103. package/dist/tests/coList.test.d.ts +2 -0
  104. package/dist/tests/coList.test.d.ts.map +1 -0
  105. package/dist/tests/coList.test.js +120 -0
  106. package/dist/tests/coList.test.js.map +1 -0
  107. package/dist/tests/coMap.test.d.ts +2 -0
  108. package/dist/tests/coMap.test.d.ts.map +1 -0
  109. package/dist/tests/coMap.test.js +164 -0
  110. package/dist/tests/coMap.test.js.map +1 -0
  111. package/dist/tests/coPlainText.test.d.ts +2 -0
  112. package/dist/tests/coPlainText.test.d.ts.map +1 -0
  113. package/dist/tests/coPlainText.test.js +99 -0
  114. package/dist/tests/coPlainText.test.js.map +1 -0
  115. package/dist/tests/coStream.test.d.ts +2 -0
  116. package/dist/tests/coStream.test.d.ts.map +1 -0
  117. package/dist/tests/coStream.test.js +206 -0
  118. package/dist/tests/coStream.test.js.map +1 -0
  119. package/dist/tests/coValueCore.test.d.ts +2 -0
  120. package/dist/tests/coValueCore.test.d.ts.map +1 -0
  121. package/dist/tests/coValueCore.test.js +164 -0
  122. package/dist/tests/coValueCore.test.js.map +1 -0
  123. package/dist/tests/coValueState.test.d.ts +2 -0
  124. package/dist/tests/coValueState.test.d.ts.map +1 -0
  125. package/dist/tests/coValueState.test.js +364 -0
  126. package/dist/tests/coValueState.test.js.map +1 -0
  127. package/dist/tests/crypto.test.d.ts +2 -0
  128. package/dist/tests/crypto.test.d.ts.map +1 -0
  129. package/dist/tests/crypto.test.js +144 -0
  130. package/dist/tests/crypto.test.js.map +1 -0
  131. package/dist/tests/cryptoImpl.test.d.ts +2 -0
  132. package/dist/tests/cryptoImpl.test.d.ts.map +1 -0
  133. package/dist/tests/cryptoImpl.test.js +144 -0
  134. package/dist/tests/cryptoImpl.test.js.map +1 -0
  135. package/dist/tests/group.test.d.ts +2 -0
  136. package/dist/tests/group.test.d.ts.map +1 -0
  137. package/dist/tests/group.test.js +576 -0
  138. package/dist/tests/group.test.js.map +1 -0
  139. package/dist/tests/logger.test.d.ts +2 -0
  140. package/dist/tests/logger.test.d.ts.map +1 -0
  141. package/dist/tests/logger.test.js +118 -0
  142. package/dist/tests/logger.test.js.map +1 -0
  143. package/dist/tests/permissions.test.d.ts +2 -0
  144. package/dist/tests/permissions.test.d.ts.map +1 -0
  145. package/dist/tests/permissions.test.js +2051 -0
  146. package/dist/tests/permissions.test.js.map +1 -0
  147. package/dist/tests/priority.test.d.ts +2 -0
  148. package/dist/tests/priority.test.d.ts.map +1 -0
  149. package/dist/tests/priority.test.js +61 -0
  150. package/dist/tests/priority.test.js.map +1 -0
  151. package/dist/tests/sync.test.d.ts +2 -0
  152. package/dist/tests/sync.test.d.ts.map +1 -0
  153. package/dist/tests/sync.test.js +1548 -0
  154. package/dist/tests/sync.test.js.map +1 -0
  155. package/dist/tests/testUtils.d.ts +142 -0
  156. package/dist/tests/testUtils.d.ts.map +1 -0
  157. package/dist/tests/testUtils.js +315 -0
  158. package/dist/tests/testUtils.js.map +1 -0
  159. package/dist/typeUtils/accountOrAgentIDfromSessionID.d.ts +4 -0
  160. package/dist/typeUtils/accountOrAgentIDfromSessionID.d.ts.map +1 -0
  161. package/dist/typeUtils/expectGroup.d.ts +4 -0
  162. package/dist/typeUtils/expectGroup.d.ts.map +1 -0
  163. package/dist/typeUtils/isAccountID.d.ts +4 -0
  164. package/dist/typeUtils/isAccountID.d.ts.map +1 -0
  165. package/dist/typeUtils/isCoValue.d.ts +4 -0
  166. package/dist/typeUtils/isCoValue.d.ts.map +1 -0
  167. package/dist/utils.d.ts +5 -0
  168. package/dist/utils.d.ts.map +1 -0
  169. package/package.json +6 -6
  170. package/src/coValueCore.ts +3 -9
  171. package/src/coValues/account.ts +15 -15
  172. package/src/coValues/group.ts +85 -12
  173. package/src/jsonValue.ts +9 -5
  174. package/src/localNode.ts +3 -5
  175. package/src/permissions.ts +5 -15
  176. package/src/tests/coValueCore.test.ts +2 -2
  177. package/src/tests/group.test.ts +187 -0
  178. package/src/tests/permissions.test.ts +330 -57
  179. package/src/tests/testUtils.ts +4 -1
  180. package/tsconfig.json +4 -2
@@ -0,0 +1,164 @@
1
+ import { expect, test, vi } from "vitest";
2
+ import { CoValueCore } from "../coValueCore.js";
3
+ import { WasmCrypto } from "../crypto/WasmCrypto.js";
4
+ import { stableStringify } from "../jsonStringify.js";
5
+ import { LocalNode } from "../localNode.js";
6
+ import { createTestNode, createTwoConnectedNodes, loadCoValueOrFail, randomAnonymousAccountAndSessionID, } from "./testUtils.js";
7
+ const Crypto = await WasmCrypto.create();
8
+ test("Can create coValue with new agent credentials and add transaction to it", () => {
9
+ const [account, sessionID] = randomAnonymousAccountAndSessionID();
10
+ const node = new LocalNode(account, sessionID, Crypto);
11
+ const coValue = node.createCoValue({
12
+ type: "costream",
13
+ ruleset: { type: "unsafeAllowAll" },
14
+ meta: null,
15
+ ...Crypto.createdNowUnique(),
16
+ });
17
+ const transaction = {
18
+ privacy: "trusting",
19
+ madeAt: Date.now(),
20
+ changes: stableStringify([
21
+ {
22
+ hello: "world",
23
+ },
24
+ ]),
25
+ };
26
+ const { expectedNewHash } = coValue.expectedNewHashAfter(node.currentSessionID, [transaction]);
27
+ expect(coValue
28
+ .tryAddTransactions(node.currentSessionID, [transaction], expectedNewHash, Crypto.sign(account.currentSignerSecret(), expectedNewHash))
29
+ ._unsafeUnwrap()).toBe(true);
30
+ });
31
+ test("transactions with wrong signature are rejected", () => {
32
+ const wrongAgent = Crypto.newRandomAgentSecret();
33
+ const [agentSecret, sessionID] = randomAnonymousAccountAndSessionID();
34
+ const node = new LocalNode(agentSecret, sessionID, Crypto);
35
+ const coValue = node.createCoValue({
36
+ type: "costream",
37
+ ruleset: { type: "unsafeAllowAll" },
38
+ meta: null,
39
+ ...Crypto.createdNowUnique(),
40
+ });
41
+ const transaction = {
42
+ privacy: "trusting",
43
+ madeAt: Date.now(),
44
+ changes: stableStringify([
45
+ {
46
+ hello: "world",
47
+ },
48
+ ]),
49
+ };
50
+ const { expectedNewHash } = coValue.expectedNewHashAfter(node.currentSessionID, [transaction]);
51
+ // eslint-disable-next-line neverthrow/must-use-result
52
+ coValue
53
+ .tryAddTransactions(node.currentSessionID, [transaction], expectedNewHash, Crypto.sign(Crypto.getAgentSignerSecret(wrongAgent), expectedNewHash))
54
+ ._unsafeUnwrapErr({ withStackTrace: true });
55
+ });
56
+ test("transactions with correctly signed, but wrong hash are rejected", () => {
57
+ const [account, sessionID] = randomAnonymousAccountAndSessionID();
58
+ const node = new LocalNode(account, sessionID, Crypto);
59
+ const coValue = node.createCoValue({
60
+ type: "costream",
61
+ ruleset: { type: "unsafeAllowAll" },
62
+ meta: null,
63
+ ...Crypto.createdNowUnique(),
64
+ });
65
+ const transaction = {
66
+ privacy: "trusting",
67
+ madeAt: Date.now(),
68
+ changes: stableStringify([
69
+ {
70
+ hello: "world",
71
+ },
72
+ ]),
73
+ };
74
+ const { expectedNewHash } = coValue.expectedNewHashAfter(node.currentSessionID, [
75
+ {
76
+ privacy: "trusting",
77
+ madeAt: Date.now(),
78
+ changes: stableStringify([
79
+ {
80
+ hello: "wrong",
81
+ },
82
+ ]),
83
+ },
84
+ ]);
85
+ // eslint-disable-next-line neverthrow/must-use-result
86
+ coValue
87
+ .tryAddTransactions(node.currentSessionID, [transaction], expectedNewHash, Crypto.sign(account.currentSignerSecret(), expectedNewHash))
88
+ ._unsafeUnwrapErr({ withStackTrace: true });
89
+ });
90
+ test("New transactions in a group correctly update owned values, including subscriptions", async () => {
91
+ const [account, sessionID] = randomAnonymousAccountAndSessionID();
92
+ const node = new LocalNode(account, sessionID, Crypto);
93
+ const group = node.createGroup();
94
+ const timeBeforeEdit = Date.now();
95
+ await new Promise((resolve) => setTimeout(resolve, 10));
96
+ const map = group.createMap();
97
+ map.set("hello", "world");
98
+ const listener = vi.fn();
99
+ map.subscribe(listener);
100
+ expect(listener.mock.calls[0]?.[0].get("hello")).toBe("world");
101
+ const resignationThatWeJustLearnedAbout = {
102
+ privacy: "trusting",
103
+ madeAt: timeBeforeEdit,
104
+ changes: stableStringify([
105
+ {
106
+ op: "set",
107
+ key: account.id,
108
+ value: "revoked",
109
+ },
110
+ ]),
111
+ };
112
+ const { expectedNewHash } = group.core.expectedNewHashAfter(sessionID, [
113
+ resignationThatWeJustLearnedAbout,
114
+ ]);
115
+ const signature = Crypto.sign(node.account.currentSignerSecret(), expectedNewHash);
116
+ expect(map.core.getValidSortedTransactions().length).toBe(1);
117
+ const manuallyAdddedTxSuccess = group.core
118
+ .tryAddTransactions(node.currentSessionID, [resignationThatWeJustLearnedAbout], expectedNewHash, signature)
119
+ ._unsafeUnwrap({ withStackTrace: true });
120
+ expect(manuallyAdddedTxSuccess).toBe(true);
121
+ expect(listener.mock.calls.length).toBe(2);
122
+ expect(listener.mock.calls[1]?.[0].get("hello")).toBe(undefined);
123
+ expect(map.core.getValidSortedTransactions().length).toBe(0);
124
+ });
125
+ test("creating a coValue with a group should't trigger automatically a content creation (performance)", () => {
126
+ const node = createTestNode();
127
+ const group = node.createGroup();
128
+ const getCurrentContentSpy = vi.spyOn(CoValueCore.prototype, "getCurrentContent");
129
+ const groupSpy = vi.spyOn(group.core, "getCurrentContent");
130
+ getCurrentContentSpy.mockClear();
131
+ node.createCoValue({
132
+ type: "comap",
133
+ ruleset: { type: "ownedByGroup", group: group.id },
134
+ meta: null,
135
+ ...Crypto.createdNowUnique(),
136
+ });
137
+ // It's called once for the group and never for the coValue
138
+ expect(getCurrentContentSpy).toHaveBeenCalledTimes(1);
139
+ expect(groupSpy).toHaveBeenCalledTimes(1);
140
+ getCurrentContentSpy.mockRestore();
141
+ });
142
+ test("listeners are notified even if the previous listener threw an error", async () => {
143
+ const { node1, node2 } = await createTwoConnectedNodes("server", "server");
144
+ const group = node1.node.createGroup();
145
+ group.addMember("everyone", "writer");
146
+ const coMap = group.createMap();
147
+ const spy1 = vi.fn();
148
+ const spy2 = vi.fn();
149
+ coMap.subscribe(spy1);
150
+ coMap.subscribe(spy2);
151
+ spy1.mockImplementation(() => {
152
+ throw new Error("test");
153
+ });
154
+ const errorLog = vi.spyOn(console, "error").mockImplementation(() => { });
155
+ coMap.set("hello", "world");
156
+ expect(spy1).toHaveBeenCalledTimes(2);
157
+ expect(spy2).toHaveBeenCalledTimes(2);
158
+ expect(errorLog).toHaveBeenCalledTimes(1);
159
+ await coMap.core.waitForSync();
160
+ const mapOnNode2 = await loadCoValueOrFail(node2.node, coMap.id);
161
+ expect(mapOnNode2.get("hello")).toBe("world");
162
+ errorLog.mockRestore();
163
+ });
164
+ //# sourceMappingURL=coValueCore.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coValueCore.test.js","sourceRoot":"","sources":["../../src/tests/coValueCore.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=coValueState.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coValueState.test.d.ts","sourceRoot":"","sources":["../../src/tests/coValueState.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,364 @@
1
+ import { beforeEach, describe, expect, onTestFinished, test, vi } from "vitest";
2
+ import { PeerState } from "../PeerState";
3
+ import { CO_VALUE_LOADING_CONFIG, CoValueState } from "../coValueState";
4
+ const initialMaxRetries = CO_VALUE_LOADING_CONFIG.MAX_RETRIES;
5
+ function mockMaxRetries(maxRetries) {
6
+ CO_VALUE_LOADING_CONFIG.MAX_RETRIES = maxRetries;
7
+ onTestFinished(() => {
8
+ CO_VALUE_LOADING_CONFIG.MAX_RETRIES = initialMaxRetries;
9
+ });
10
+ }
11
+ beforeEach(() => {
12
+ mockMaxRetries(5);
13
+ });
14
+ describe("CoValueState", () => {
15
+ const mockCoValueId = "co_test123";
16
+ test("should create unknown state", () => {
17
+ const state = CoValueState.Unknown(mockCoValueId);
18
+ expect(state.id).toBe(mockCoValueId);
19
+ expect(state.state.type).toBe("unknown");
20
+ });
21
+ test("should create loading state", () => {
22
+ const peerIds = ["peer1", "peer2"];
23
+ const state = CoValueState.Loading(mockCoValueId, peerIds);
24
+ expect(state.id).toBe(mockCoValueId);
25
+ expect(state.state.type).toBe("loading");
26
+ });
27
+ test("should create available state", async () => {
28
+ const mockCoValue = createMockCoValueCore(mockCoValueId);
29
+ const state = CoValueState.Available(mockCoValue);
30
+ expect(state.id).toBe(mockCoValueId);
31
+ expect(state.state.type).toBe("available");
32
+ expect(state.state.coValue).toBe(mockCoValue);
33
+ await expect(state.getCoValue()).resolves.toEqual(mockCoValue);
34
+ });
35
+ test("should handle found action", async () => {
36
+ const mockCoValue = createMockCoValueCore(mockCoValueId);
37
+ const state = CoValueState.Loading(mockCoValueId, ["peer1", "peer2"]);
38
+ const stateValuePromise = state.getCoValue();
39
+ state.dispatch({
40
+ type: "available",
41
+ coValue: mockCoValue,
42
+ });
43
+ const result = await state.getCoValue();
44
+ expect(result).toBe(mockCoValue);
45
+ await expect(stateValuePromise).resolves.toBe(mockCoValue);
46
+ });
47
+ test("should ignore actions when not in loading state", () => {
48
+ const state = CoValueState.Unknown(mockCoValueId);
49
+ state.dispatch({
50
+ type: "not-found-in-peer",
51
+ peerId: "peer1",
52
+ });
53
+ expect(state.state.type).toBe("unknown");
54
+ });
55
+ test("should retry loading from peers when unsuccessful", async () => {
56
+ vi.useFakeTimers();
57
+ const peer1 = createMockPeerState({
58
+ id: "peer1",
59
+ role: "server",
60
+ }, async () => {
61
+ state.dispatch({
62
+ type: "not-found-in-peer",
63
+ peerId: "peer1",
64
+ });
65
+ });
66
+ const peer2 = createMockPeerState({
67
+ id: "peer2",
68
+ role: "server",
69
+ }, async () => {
70
+ state.dispatch({
71
+ type: "not-found-in-peer",
72
+ peerId: "peer2",
73
+ });
74
+ });
75
+ const mockPeers = [peer1, peer2];
76
+ const state = CoValueState.Unknown(mockCoValueId);
77
+ const loadPromise = state.loadFromPeers(mockPeers);
78
+ // Should attempt CO_VALUE_LOADING_CONFIG.MAX_RETRIES retries
79
+ for (let i = 0; i < CO_VALUE_LOADING_CONFIG.MAX_RETRIES; i++) {
80
+ await vi.runAllTimersAsync();
81
+ }
82
+ await loadPromise;
83
+ expect(peer1.pushOutgoingMessage).toHaveBeenCalledTimes(CO_VALUE_LOADING_CONFIG.MAX_RETRIES);
84
+ expect(peer2.pushOutgoingMessage).toHaveBeenCalledTimes(CO_VALUE_LOADING_CONFIG.MAX_RETRIES);
85
+ expect(state.state.type).toBe("unavailable");
86
+ await expect(state.getCoValue()).resolves.toBe("unavailable");
87
+ vi.useRealTimers();
88
+ });
89
+ test("should skip errored coValues when loading from peers", async () => {
90
+ vi.useFakeTimers();
91
+ const peer1 = createMockPeerState({
92
+ id: "peer1",
93
+ role: "server",
94
+ }, async () => {
95
+ peer1.erroredCoValues.set(mockCoValueId, new Error("test"));
96
+ state.dispatch({
97
+ type: "not-found-in-peer",
98
+ peerId: "peer1",
99
+ });
100
+ });
101
+ const peer2 = createMockPeerState({
102
+ id: "peer2",
103
+ role: "server",
104
+ }, async () => {
105
+ state.dispatch({
106
+ type: "not-found-in-peer",
107
+ peerId: "peer2",
108
+ });
109
+ });
110
+ const mockPeers = [peer1, peer2];
111
+ const state = CoValueState.Unknown(mockCoValueId);
112
+ const loadPromise = state.loadFromPeers(mockPeers);
113
+ // Should attempt CO_VALUE_LOADING_CONFIG.MAX_RETRIES retries
114
+ for (let i = 0; i < CO_VALUE_LOADING_CONFIG.MAX_RETRIES; i++) {
115
+ await vi.runAllTimersAsync();
116
+ }
117
+ await loadPromise;
118
+ expect(peer1.pushOutgoingMessage).toHaveBeenCalledTimes(1);
119
+ expect(peer2.pushOutgoingMessage).toHaveBeenCalledTimes(CO_VALUE_LOADING_CONFIG.MAX_RETRIES);
120
+ expect(state.state.type).toBe("unavailable");
121
+ await expect(state.getCoValue()).resolves.toBe("unavailable");
122
+ vi.useRealTimers();
123
+ });
124
+ test("should retry only on server peers", async () => {
125
+ vi.useFakeTimers();
126
+ const peer1 = createMockPeerState({
127
+ id: "peer1",
128
+ role: "storage",
129
+ }, async () => {
130
+ state.dispatch({
131
+ type: "not-found-in-peer",
132
+ peerId: "peer1",
133
+ });
134
+ });
135
+ const peer2 = createMockPeerState({
136
+ id: "peer2",
137
+ role: "server",
138
+ }, async () => {
139
+ state.dispatch({
140
+ type: "not-found-in-peer",
141
+ peerId: "peer2",
142
+ });
143
+ });
144
+ const mockPeers = [peer1, peer2];
145
+ const state = CoValueState.Unknown(mockCoValueId);
146
+ const loadPromise = state.loadFromPeers(mockPeers);
147
+ // Should attempt CO_VALUE_LOADING_CONFIG.MAX_RETRIES retries
148
+ for (let i = 0; i < CO_VALUE_LOADING_CONFIG.MAX_RETRIES; i++) {
149
+ await vi.runAllTimersAsync();
150
+ }
151
+ await loadPromise;
152
+ expect(peer1.pushOutgoingMessage).toHaveBeenCalledTimes(1);
153
+ expect(peer2.pushOutgoingMessage).toHaveBeenCalledTimes(CO_VALUE_LOADING_CONFIG.MAX_RETRIES);
154
+ expect(state.state.type).toBe("unavailable");
155
+ await expect(state.getCoValue()).resolves.toEqual("unavailable");
156
+ vi.useRealTimers();
157
+ });
158
+ test("should handle the coValues that become available in between of the retries", async () => {
159
+ vi.useFakeTimers();
160
+ mockMaxRetries(5);
161
+ let retries = 0;
162
+ const peer1 = createMockPeerState({
163
+ id: "peer1",
164
+ role: "server",
165
+ }, async () => {
166
+ retries++;
167
+ state.dispatch({
168
+ type: "not-found-in-peer",
169
+ peerId: "peer1",
170
+ });
171
+ if (retries === 2) {
172
+ setTimeout(() => {
173
+ state.dispatch({
174
+ type: "available",
175
+ coValue: createMockCoValueCore(mockCoValueId),
176
+ });
177
+ }, 100);
178
+ }
179
+ });
180
+ const mockPeers = [peer1];
181
+ const state = CoValueState.Unknown(mockCoValueId);
182
+ const loadPromise = state.loadFromPeers(mockPeers);
183
+ // Should attempt CO_VALUE_LOADING_CONFIG.MAX_RETRIES retries
184
+ for (let i = 0; i < CO_VALUE_LOADING_CONFIG.MAX_RETRIES + 1; i++) {
185
+ await vi.runAllTimersAsync();
186
+ }
187
+ await loadPromise;
188
+ expect(peer1.pushOutgoingMessage).toHaveBeenCalledTimes(2);
189
+ expect(state.state.type).toBe("available");
190
+ await expect(state.getCoValue()).resolves.toEqual({ id: mockCoValueId });
191
+ vi.useRealTimers();
192
+ });
193
+ test("should have a coValue as value property when becomes available after that have been marked as unavailable", async () => {
194
+ vi.useFakeTimers();
195
+ const peer1 = createMockPeerState({
196
+ id: "peer1",
197
+ role: "server",
198
+ }, async () => {
199
+ state.dispatch({
200
+ type: "not-found-in-peer",
201
+ peerId: "peer1",
202
+ });
203
+ });
204
+ const mockPeers = [peer1];
205
+ const state = CoValueState.Unknown(mockCoValueId);
206
+ const loadPromise = state.loadFromPeers(mockPeers);
207
+ // Should attempt CO_VALUE_LOADING_CONFIG.MAX_RETRIES retries
208
+ for (let i = 0; i < CO_VALUE_LOADING_CONFIG.MAX_RETRIES; i++) {
209
+ await vi.runAllTimersAsync();
210
+ }
211
+ state.dispatch({
212
+ type: "available",
213
+ coValue: createMockCoValueCore(mockCoValueId),
214
+ });
215
+ await loadPromise;
216
+ expect(peer1.pushOutgoingMessage).toHaveBeenCalledTimes(CO_VALUE_LOADING_CONFIG.MAX_RETRIES);
217
+ expect(state.state.type).toBe("available");
218
+ await expect(state.getCoValue()).resolves.toEqual({ id: mockCoValueId });
219
+ vi.useRealTimers();
220
+ });
221
+ test("should stop retrying when value becomes available", async () => {
222
+ vi.useFakeTimers();
223
+ mockMaxRetries(5);
224
+ let run = 1;
225
+ const peer1 = createMockPeerState({
226
+ id: "peer1",
227
+ role: "server",
228
+ }, async () => {
229
+ if (run > 2) {
230
+ state.dispatch({
231
+ type: "available",
232
+ coValue: createMockCoValueCore(mockCoValueId),
233
+ });
234
+ }
235
+ state.dispatch({
236
+ type: "not-found-in-peer",
237
+ peerId: "peer1",
238
+ });
239
+ run++;
240
+ });
241
+ const mockPeers = [peer1];
242
+ const state = CoValueState.Unknown(mockCoValueId);
243
+ const loadPromise = state.loadFromPeers(mockPeers);
244
+ for (let i = 0; i < CO_VALUE_LOADING_CONFIG.MAX_RETRIES; i++) {
245
+ await vi.runAllTimersAsync();
246
+ }
247
+ await loadPromise;
248
+ expect(peer1.pushOutgoingMessage).toHaveBeenCalledTimes(3);
249
+ expect(state.state.type).toBe("available");
250
+ await expect(state.getCoValue()).resolves.toEqual({ id: mockCoValueId });
251
+ vi.useRealTimers();
252
+ });
253
+ test("should start sending the known state to peers when available", async () => {
254
+ vi.useFakeTimers();
255
+ const mockCoValue = createMockCoValueCore(mockCoValueId);
256
+ const peer1 = createMockPeerState({
257
+ id: "peer1",
258
+ role: "storage",
259
+ }, async () => {
260
+ state.dispatch({
261
+ type: "available",
262
+ coValue: mockCoValue,
263
+ });
264
+ });
265
+ const peer2 = createMockPeerState({
266
+ id: "peer1",
267
+ role: "server",
268
+ }, async () => {
269
+ state.dispatch({
270
+ type: "not-found-in-peer",
271
+ peerId: "peer2",
272
+ });
273
+ });
274
+ const state = CoValueState.Unknown(mockCoValueId);
275
+ const loadPromise = state.loadFromPeers([peer1, peer2]);
276
+ for (let i = 0; i < CO_VALUE_LOADING_CONFIG.MAX_RETRIES; i++) {
277
+ await vi.runAllTimersAsync();
278
+ }
279
+ await loadPromise;
280
+ expect(peer1.pushOutgoingMessage).toHaveBeenCalledTimes(1);
281
+ expect(peer2.pushOutgoingMessage).toHaveBeenCalledTimes(1);
282
+ expect(peer2.pushOutgoingMessage).toHaveBeenCalledWith({
283
+ action: "load",
284
+ ...mockCoValue.knownState(),
285
+ });
286
+ expect(state.state.type).toBe("available");
287
+ await expect(state.getCoValue()).resolves.toEqual({ id: mockCoValueId });
288
+ vi.useRealTimers();
289
+ });
290
+ test("should skip closed peers", async () => {
291
+ vi.useFakeTimers();
292
+ const mockCoValue = createMockCoValueCore(mockCoValueId);
293
+ const peer1 = createMockPeerState({
294
+ id: "peer1",
295
+ role: "storage",
296
+ }, async () => {
297
+ return new Promise(() => { });
298
+ });
299
+ const peer2 = createMockPeerState({
300
+ id: "peer1",
301
+ role: "server",
302
+ }, async () => {
303
+ state.dispatch({
304
+ type: "available",
305
+ coValue: mockCoValue,
306
+ });
307
+ });
308
+ peer1.closed = true;
309
+ const state = CoValueState.Unknown(mockCoValueId);
310
+ const loadPromise = state.loadFromPeers([peer1, peer2]);
311
+ for (let i = 0; i < CO_VALUE_LOADING_CONFIG.MAX_RETRIES; i++) {
312
+ await vi.runAllTimersAsync();
313
+ }
314
+ await loadPromise;
315
+ expect(peer1.pushOutgoingMessage).toHaveBeenCalledTimes(0);
316
+ expect(peer2.pushOutgoingMessage).toHaveBeenCalledTimes(1);
317
+ expect(state.state.type).toBe("available");
318
+ await expect(state.getCoValue()).resolves.toEqual({ id: mockCoValueId });
319
+ vi.useRealTimers();
320
+ });
321
+ test("should not be stuck in loading state when not getting a response", async () => {
322
+ vi.useFakeTimers();
323
+ const peer1 = createMockPeerState({
324
+ id: "peer1",
325
+ role: "server",
326
+ }, async () => { });
327
+ const state = CoValueState.Unknown(mockCoValueId);
328
+ const loadPromise = state.loadFromPeers([peer1]);
329
+ for (let i = 0; i < CO_VALUE_LOADING_CONFIG.MAX_RETRIES * 2; i++) {
330
+ await vi.runAllTimersAsync();
331
+ }
332
+ await loadPromise;
333
+ expect(peer1.pushOutgoingMessage).toHaveBeenCalledTimes(CO_VALUE_LOADING_CONFIG.MAX_RETRIES);
334
+ expect(state.state.type).toBe("unavailable");
335
+ await expect(state.getCoValue()).resolves.toEqual("unavailable");
336
+ vi.useRealTimers();
337
+ });
338
+ });
339
+ function createMockPeerState(peer, pushFn = () => Promise.resolve()) {
340
+ const peerState = new PeerState({
341
+ id: "peer",
342
+ role: "server",
343
+ outgoing: {
344
+ push: pushFn,
345
+ },
346
+ ...peer,
347
+ }, undefined);
348
+ vi.spyOn(peerState, "pushOutgoingMessage").mockImplementation(pushFn);
349
+ return peerState;
350
+ }
351
+ function createMockCoValueCore(mockCoValueId) {
352
+ // Setting the knownState as part of the prototype to simplify
353
+ // the equality checks
354
+ const mockCoValue = Object.create({
355
+ knownState: vi.fn().mockReturnValue({
356
+ id: mockCoValueId,
357
+ header: true,
358
+ sessions: {},
359
+ }),
360
+ });
361
+ mockCoValue.id = mockCoValueId;
362
+ return mockCoValue;
363
+ }
364
+ //# sourceMappingURL=coValueState.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coValueState.test.js","sourceRoot":"","sources":["../../src/tests/coValueState.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=crypto.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.test.d.ts","sourceRoot":"","sources":["../../src/tests/crypto.test.ts"],"names":[],"mappings":""}