cojson 0.8.0 → 0.8.5

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 (210) hide show
  1. package/.turbo/turbo-build.log +11 -3
  2. package/CHANGELOG.md +13 -0
  3. package/dist/native/PeerState.js.map +1 -0
  4. package/dist/native/PriorityBasedMessageQueue.js.map +1 -0
  5. package/dist/native/base64url.js.map +1 -0
  6. package/dist/native/base64url.test.js.map +1 -0
  7. package/dist/native/coValue.js.map +1 -0
  8. package/dist/native/coValueCore.js.map +1 -0
  9. package/dist/native/coValues/account.js.map +1 -0
  10. package/dist/native/coValues/coList.js.map +1 -0
  11. package/dist/native/coValues/coMap.js.map +1 -0
  12. package/dist/native/coValues/coStream.js.map +1 -0
  13. package/dist/native/coValues/group.js.map +1 -0
  14. package/dist/native/coreToCoValue.js.map +1 -0
  15. package/dist/{crypto → native/crypto}/PureJSCrypto.js +4 -0
  16. package/dist/native/crypto/PureJSCrypto.js.map +1 -0
  17. package/dist/{crypto → native/crypto}/crypto.js +1 -1
  18. package/dist/native/crypto/crypto.js.map +1 -0
  19. package/dist/native/ids.js.map +1 -0
  20. package/dist/{index.js → native/index.native.js} +3 -4
  21. package/dist/native/index.native.js.map +1 -0
  22. package/dist/native/jsonStringify.js.map +1 -0
  23. package/dist/{jsonValue.js.map → native/jsonValue.js.map} +1 -1
  24. package/dist/{localNode.js → native/localNode.js} +50 -33
  25. package/dist/native/localNode.js.map +1 -0
  26. package/dist/native/media.js.map +1 -0
  27. package/dist/native/permissions.js.map +1 -0
  28. package/dist/native/priority.js.map +1 -0
  29. package/dist/native/storage/FileSystem.js.map +1 -0
  30. package/dist/{storage → native/storage}/chunksAndKnownStates.js +1 -1
  31. package/dist/native/storage/chunksAndKnownStates.js.map +1 -0
  32. package/dist/native/storage/index.js.map +1 -0
  33. package/dist/native/streamUtils.js.map +1 -0
  34. package/dist/native/sync.js.map +1 -0
  35. package/dist/native/typeUtils/accountOrAgentIDfromSessionID.js.map +1 -0
  36. package/dist/native/typeUtils/expectGroup.js.map +1 -0
  37. package/dist/native/typeUtils/isAccountID.js.map +1 -0
  38. package/dist/native/typeUtils/isCoValue.js.map +1 -0
  39. package/dist/web/PeerState.js +66 -0
  40. package/dist/web/PeerState.js.map +1 -0
  41. package/dist/web/PriorityBasedMessageQueue.js +51 -0
  42. package/dist/web/PriorityBasedMessageQueue.js.map +1 -0
  43. package/dist/web/base64url.js +59 -0
  44. package/dist/web/base64url.js.map +1 -0
  45. package/dist/web/base64url.test.js +25 -0
  46. package/dist/web/base64url.test.js.map +1 -0
  47. package/dist/web/coValue.js +19 -0
  48. package/dist/web/coValue.js.map +1 -0
  49. package/dist/web/coValueCore.js +693 -0
  50. package/dist/web/coValueCore.js.map +1 -0
  51. package/dist/web/coValues/account.js +96 -0
  52. package/dist/web/coValues/account.js.map +1 -0
  53. package/dist/web/coValues/coList.js +393 -0
  54. package/dist/web/coValues/coList.js.map +1 -0
  55. package/dist/web/coValues/coMap.js +197 -0
  56. package/dist/web/coValues/coMap.js.map +1 -0
  57. package/dist/web/coValues/coStream.js +220 -0
  58. package/dist/web/coValues/coStream.js.map +1 -0
  59. package/dist/web/coValues/group.js +250 -0
  60. package/dist/web/coValues/group.js.map +1 -0
  61. package/dist/web/coreToCoValue.js +42 -0
  62. package/dist/web/coreToCoValue.js.map +1 -0
  63. package/dist/web/crypto/PureJSCrypto.js +93 -0
  64. package/dist/web/crypto/PureJSCrypto.js.map +1 -0
  65. package/dist/{crypto → web/crypto}/WasmCrypto.js +3 -0
  66. package/dist/web/crypto/WasmCrypto.js.map +1 -0
  67. package/dist/web/crypto/crypto.js +154 -0
  68. package/dist/web/crypto/crypto.js.map +1 -0
  69. package/dist/web/ids.js +17 -0
  70. package/dist/web/ids.js.map +1 -0
  71. package/dist/web/index.web.js +40 -0
  72. package/dist/web/index.web.js.map +1 -0
  73. package/dist/web/jsonStringify.js +57 -0
  74. package/dist/web/jsonStringify.js.map +1 -0
  75. package/dist/web/jsonValue.js +2 -0
  76. package/dist/web/jsonValue.js.map +1 -0
  77. package/dist/web/localNode.js +453 -0
  78. package/dist/web/localNode.js.map +1 -0
  79. package/dist/web/media.js +2 -0
  80. package/dist/web/media.js.map +1 -0
  81. package/dist/web/permissions.js +206 -0
  82. package/dist/web/permissions.js.map +1 -0
  83. package/dist/web/priority.js +31 -0
  84. package/dist/web/priority.js.map +1 -0
  85. package/dist/web/storage/FileSystem.js +58 -0
  86. package/dist/web/storage/FileSystem.js.map +1 -0
  87. package/dist/web/storage/chunksAndKnownStates.js +100 -0
  88. package/dist/web/storage/chunksAndKnownStates.js.map +1 -0
  89. package/dist/web/storage/index.js +348 -0
  90. package/dist/web/storage/index.js.map +1 -0
  91. package/dist/web/streamUtils.js +41 -0
  92. package/dist/web/streamUtils.js.map +1 -0
  93. package/dist/web/sync.js +504 -0
  94. package/dist/web/sync.js.map +1 -0
  95. package/dist/web/typeUtils/accountOrAgentIDfromSessionID.js +5 -0
  96. package/dist/web/typeUtils/accountOrAgentIDfromSessionID.js.map +1 -0
  97. package/dist/web/typeUtils/expectGroup.js +13 -0
  98. package/dist/web/typeUtils/expectGroup.js.map +1 -0
  99. package/dist/web/typeUtils/isAccountID.js +4 -0
  100. package/dist/web/typeUtils/isAccountID.js.map +1 -0
  101. package/dist/web/typeUtils/isCoValue.js +11 -0
  102. package/dist/web/typeUtils/isCoValue.js.map +1 -0
  103. package/package.json +25 -8
  104. package/src/coValue.ts +1 -1
  105. package/src/coValueCore.ts +4 -1
  106. package/src/coValues/account.ts +9 -3
  107. package/src/crypto/PureJSCrypto.ts +5 -0
  108. package/src/crypto/WasmCrypto.ts +4 -0
  109. package/src/crypto/crypto.ts +7 -2
  110. package/src/{index.ts → index.native.ts} +4 -5
  111. package/src/index.web.ts +152 -0
  112. package/src/jsonValue.ts +25 -0
  113. package/src/localNode.ts +74 -55
  114. package/src/storage/chunksAndKnownStates.ts +1 -1
  115. package/src/storage/index.ts +1 -1
  116. package/src/tests/coList.test.ts +1 -1
  117. package/src/tests/coMap.test.ts +1 -1
  118. package/src/tests/coStream.test.ts +2 -1
  119. package/src/tests/cryptoImpl.test.ts +24 -2
  120. package/src/tests/group.test.ts +6 -8
  121. package/src/tests/permissions.test.ts +66 -18
  122. package/src/tests/priority.test.ts +44 -15
  123. package/tsconfig.json +5 -4
  124. package/tsconfig.native.json +12 -0
  125. package/tsconfig.web.json +11 -0
  126. package/dist/PeerState.js.map +0 -1
  127. package/dist/PriorityBasedMessageQueue.js.map +0 -1
  128. package/dist/base64url.js.map +0 -1
  129. package/dist/base64url.test.js.map +0 -1
  130. package/dist/coValue.js.map +0 -1
  131. package/dist/coValueCore.js.map +0 -1
  132. package/dist/coValues/account.js.map +0 -1
  133. package/dist/coValues/coList.js.map +0 -1
  134. package/dist/coValues/coMap.js.map +0 -1
  135. package/dist/coValues/coStream.js.map +0 -1
  136. package/dist/coValues/group.js.map +0 -1
  137. package/dist/coreToCoValue.js.map +0 -1
  138. package/dist/crypto/PureJSCrypto.js.map +0 -1
  139. package/dist/crypto/WasmCrypto.js.map +0 -1
  140. package/dist/crypto/crypto.js.map +0 -1
  141. package/dist/ids.js.map +0 -1
  142. package/dist/index.js.map +0 -1
  143. package/dist/jsonStringify.js.map +0 -1
  144. package/dist/localNode.js.map +0 -1
  145. package/dist/media.js.map +0 -1
  146. package/dist/permissions.js.map +0 -1
  147. package/dist/priority.js.map +0 -1
  148. package/dist/storage/FileSystem.js.map +0 -1
  149. package/dist/storage/chunksAndKnownStates.js.map +0 -1
  150. package/dist/storage/index.js.map +0 -1
  151. package/dist/streamUtils.js.map +0 -1
  152. package/dist/sync.js.map +0 -1
  153. package/dist/tests/PeerState.test.js +0 -80
  154. package/dist/tests/PeerState.test.js.map +0 -1
  155. package/dist/tests/PriorityBasedMessageQueue.test.js +0 -97
  156. package/dist/tests/PriorityBasedMessageQueue.test.js.map +0 -1
  157. package/dist/tests/account.test.js +0 -58
  158. package/dist/tests/account.test.js.map +0 -1
  159. package/dist/tests/coList.test.js +0 -76
  160. package/dist/tests/coList.test.js.map +0 -1
  161. package/dist/tests/coMap.test.js +0 -136
  162. package/dist/tests/coMap.test.js.map +0 -1
  163. package/dist/tests/coStream.test.js +0 -205
  164. package/dist/tests/coStream.test.js.map +0 -1
  165. package/dist/tests/coValueCore.test.js +0 -124
  166. package/dist/tests/coValueCore.test.js.map +0 -1
  167. package/dist/tests/crypto.test.js +0 -118
  168. package/dist/tests/crypto.test.js.map +0 -1
  169. package/dist/tests/cryptoImpl.test.js +0 -113
  170. package/dist/tests/cryptoImpl.test.js.map +0 -1
  171. package/dist/tests/group.test.js +0 -34
  172. package/dist/tests/group.test.js.map +0 -1
  173. package/dist/tests/permissions.test.js +0 -1059
  174. package/dist/tests/permissions.test.js.map +0 -1
  175. package/dist/tests/priority.test.js +0 -61
  176. package/dist/tests/priority.test.js.map +0 -1
  177. package/dist/tests/sync.test.js +0 -1186
  178. package/dist/tests/sync.test.js.map +0 -1
  179. package/dist/tests/testUtils.js +0 -59
  180. package/dist/tests/testUtils.js.map +0 -1
  181. package/dist/typeUtils/accountOrAgentIDfromSessionID.js.map +0 -1
  182. package/dist/typeUtils/expectGroup.js.map +0 -1
  183. package/dist/typeUtils/isAccountID.js.map +0 -1
  184. package/dist/typeUtils/isCoValue.js.map +0 -1
  185. /package/dist/{PeerState.js → native/PeerState.js} +0 -0
  186. /package/dist/{PriorityBasedMessageQueue.js → native/PriorityBasedMessageQueue.js} +0 -0
  187. /package/dist/{base64url.js → native/base64url.js} +0 -0
  188. /package/dist/{base64url.test.js → native/base64url.test.js} +0 -0
  189. /package/dist/{coValue.js → native/coValue.js} +0 -0
  190. /package/dist/{coValueCore.js → native/coValueCore.js} +0 -0
  191. /package/dist/{coValues → native/coValues}/account.js +0 -0
  192. /package/dist/{coValues → native/coValues}/coList.js +0 -0
  193. /package/dist/{coValues → native/coValues}/coMap.js +0 -0
  194. /package/dist/{coValues → native/coValues}/coStream.js +0 -0
  195. /package/dist/{coValues → native/coValues}/group.js +0 -0
  196. /package/dist/{coreToCoValue.js → native/coreToCoValue.js} +0 -0
  197. /package/dist/{ids.js → native/ids.js} +0 -0
  198. /package/dist/{jsonStringify.js → native/jsonStringify.js} +0 -0
  199. /package/dist/{jsonValue.js → native/jsonValue.js} +0 -0
  200. /package/dist/{media.js → native/media.js} +0 -0
  201. /package/dist/{permissions.js → native/permissions.js} +0 -0
  202. /package/dist/{priority.js → native/priority.js} +0 -0
  203. /package/dist/{storage → native/storage}/FileSystem.js +0 -0
  204. /package/dist/{storage → native/storage}/index.js +0 -0
  205. /package/dist/{streamUtils.js → native/streamUtils.js} +0 -0
  206. /package/dist/{sync.js → native/sync.js} +0 -0
  207. /package/dist/{typeUtils → native/typeUtils}/accountOrAgentIDfromSessionID.js +0 -0
  208. /package/dist/{typeUtils → native/typeUtils}/expectGroup.js +0 -0
  209. /package/dist/{typeUtils → native/typeUtils}/isAccountID.js +0 -0
  210. /package/dist/{typeUtils → native/typeUtils}/isCoValue.js +0 -0
@@ -0,0 +1,504 @@
1
+ import { CoValueCore } from "./coValueCore.js";
2
+ import { newLoadingState } from "./localNode.js";
3
+ import { PeerState } from "./PeerState.js";
4
+ export function emptyKnownState(id) {
5
+ return {
6
+ id,
7
+ header: false,
8
+ sessions: {},
9
+ };
10
+ }
11
+ export function combinedKnownStates(stateA, stateB) {
12
+ const sessionStates = {};
13
+ const allSessions = new Set([
14
+ ...Object.keys(stateA.sessions),
15
+ ...Object.keys(stateB.sessions),
16
+ ]);
17
+ for (const sessionID of allSessions) {
18
+ const stateAValue = stateA.sessions[sessionID];
19
+ const stateBValue = stateB.sessions[sessionID];
20
+ sessionStates[sessionID] = Math.max(stateAValue || 0, stateBValue || 0);
21
+ }
22
+ return {
23
+ id: stateA.id,
24
+ header: stateA.header || stateB.header,
25
+ sessions: sessionStates,
26
+ };
27
+ }
28
+ export class SyncManager {
29
+ constructor(local) {
30
+ this.peers = {};
31
+ this.requestedSyncs = {};
32
+ this.local = local;
33
+ }
34
+ peersInPriorityOrder() {
35
+ return Object.values(this.peers).sort((a, b) => {
36
+ const aPriority = a.priority || 0;
37
+ const bPriority = b.priority || 0;
38
+ return bPriority - aPriority;
39
+ });
40
+ }
41
+ async loadFromPeers(id, forPeer) {
42
+ const eligiblePeers = this.peersInPriorityOrder().filter((peer) => peer.id !== forPeer && peer.role === "server");
43
+ for (const peer of eligiblePeers) {
44
+ // console.log("loading", id, "from", peer.id);
45
+ await peer.pushOutgoingMessage({
46
+ action: "load",
47
+ id: id,
48
+ header: false,
49
+ sessions: {},
50
+ });
51
+ const coValueEntry = this.local.coValues[id];
52
+ if (coValueEntry?.state !== "loading") {
53
+ continue;
54
+ }
55
+ const firstStateEntry = coValueEntry.firstPeerState[peer.id];
56
+ if (firstStateEntry?.type !== "waiting") {
57
+ throw new Error("Expected firstPeerState to be waiting " + id);
58
+ }
59
+ await new Promise((resolve) => {
60
+ // const timeout = setTimeout(() => {
61
+ // if (this.local.coValues[id]?.state === "loading") {
62
+ // console.warn(
63
+ // "Timeout waiting for peer to load",
64
+ // id,
65
+ // "from",
66
+ // peer.id,
67
+ // "and it hasn't loaded from other peers yet"
68
+ // );
69
+ // }
70
+ // resolve();
71
+ // }, 1000);
72
+ firstStateEntry.done
73
+ .then(() => {
74
+ // clearTimeout(timeout);
75
+ resolve();
76
+ })
77
+ .catch((e) => {
78
+ // clearTimeout(timeout);
79
+ console.error("Error waiting for peer to load", id, "from", peer.id, e);
80
+ resolve();
81
+ });
82
+ });
83
+ }
84
+ }
85
+ async handleSyncMessage(msg, peer) {
86
+ // TODO: validate
87
+ switch (msg.action) {
88
+ case "load":
89
+ return await this.handleLoad(msg, peer);
90
+ case "known":
91
+ if (msg.isCorrection) {
92
+ return await this.handleCorrection(msg, peer);
93
+ }
94
+ else {
95
+ return await this.handleKnownState(msg, peer);
96
+ }
97
+ case "content":
98
+ // await new Promise<void>((resolve) => setTimeout(resolve, 0));
99
+ return await this.handleNewContent(msg, peer);
100
+ case "done":
101
+ return await this.handleUnsubscribe(msg);
102
+ default:
103
+ throw new Error(`Unknown message type ${msg.action}`);
104
+ }
105
+ }
106
+ async subscribeToIncludingDependencies(id, peer) {
107
+ const entry = this.local.coValues[id];
108
+ if (!entry) {
109
+ throw new Error("Expected coValue entry on subscribe");
110
+ }
111
+ if (entry.state === "loading") {
112
+ this.trySendToPeer(peer, {
113
+ action: "load",
114
+ id,
115
+ header: false,
116
+ sessions: {},
117
+ }).catch((e) => {
118
+ console.error("Error sending load", e);
119
+ });
120
+ return;
121
+ }
122
+ const coValue = entry.coValue;
123
+ for (const id of coValue.getDependedOnCoValues()) {
124
+ await this.subscribeToIncludingDependencies(id, peer);
125
+ }
126
+ if (!peer.toldKnownState.has(id)) {
127
+ peer.toldKnownState.add(id);
128
+ this.trySendToPeer(peer, {
129
+ action: "load",
130
+ ...coValue.knownState(),
131
+ }).catch((e) => {
132
+ console.error("Error sending load", e);
133
+ });
134
+ }
135
+ }
136
+ async tellUntoldKnownStateIncludingDependencies(id, peer, asDependencyOf) {
137
+ const coValue = this.local.expectCoValueLoaded(id);
138
+ await Promise.all(coValue
139
+ .getDependedOnCoValues()
140
+ .map((dependentCoID) => this.tellUntoldKnownStateIncludingDependencies(dependentCoID, peer, asDependencyOf || id)));
141
+ if (!peer.toldKnownState.has(id)) {
142
+ this.trySendToPeer(peer, {
143
+ action: "known",
144
+ asDependencyOf,
145
+ ...coValue.knownState(),
146
+ }).catch((e) => {
147
+ console.error("Error sending known state", e);
148
+ });
149
+ peer.toldKnownState.add(id);
150
+ }
151
+ }
152
+ async sendNewContentIncludingDependencies(id, peer) {
153
+ const coValue = this.local.expectCoValueLoaded(id);
154
+ await Promise.all(coValue
155
+ .getDependedOnCoValues()
156
+ .map((id) => this.sendNewContentIncludingDependencies(id, peer)));
157
+ const newContentPieces = coValue.newContentSince(peer.optimisticKnownStates[id]);
158
+ if (newContentPieces) {
159
+ const optimisticKnownStateBefore = peer.optimisticKnownStates[id] || emptyKnownState(id);
160
+ const sendPieces = async () => {
161
+ let lastYield = performance.now();
162
+ for (const [_i, piece] of newContentPieces.entries()) {
163
+ // console.log(
164
+ // `${id} -> ${peer.id}: Sending content piece ${i + 1}/${
165
+ // newContentPieces.length
166
+ // } header: ${!!piece.header}`,
167
+ // // Object.values(piece.new).map((s) => s.newTransactions)
168
+ // );
169
+ this.trySendToPeer(peer, piece).catch((e) => {
170
+ console.error("Error sending content piece", e);
171
+ });
172
+ if (performance.now() - lastYield > 10) {
173
+ await new Promise((resolve) => {
174
+ setTimeout(resolve, 0);
175
+ });
176
+ lastYield = performance.now();
177
+ }
178
+ }
179
+ };
180
+ sendPieces().catch((e) => {
181
+ console.error("Error sending new content piece, retrying", e);
182
+ peer.optimisticKnownStates[id] = optimisticKnownStateBefore;
183
+ return this.sendNewContentIncludingDependencies(id, peer);
184
+ });
185
+ peer.optimisticKnownStates[id] = combinedKnownStates(optimisticKnownStateBefore, coValue.knownState());
186
+ }
187
+ }
188
+ addPeer(peer) {
189
+ const peerState = new PeerState(peer);
190
+ this.peers[peer.id] = peerState;
191
+ if (peer.role === "server") {
192
+ const initialSync = async () => {
193
+ for (const id of Object.keys(this.local.coValues)) {
194
+ // console.log("subscribing to after peer added", id, peer.id)
195
+ await this.subscribeToIncludingDependencies(id, peerState);
196
+ peerState.optimisticKnownStates[id] = {
197
+ id: id,
198
+ header: false,
199
+ sessions: {},
200
+ };
201
+ }
202
+ };
203
+ void initialSync();
204
+ }
205
+ const processMessages = async () => {
206
+ for await (const msg of peerState.incoming) {
207
+ if (msg === "Disconnected") {
208
+ return;
209
+ }
210
+ if (msg === "PingTimeout") {
211
+ console.error("Ping timeout from peer", peer.id);
212
+ return;
213
+ }
214
+ try {
215
+ await this.handleSyncMessage(msg, peerState);
216
+ }
217
+ catch (e) {
218
+ throw new Error(`Error reading from peer ${peer.id}, handling msg\n\n${JSON.stringify(msg, (k, v) => k === "changes" || k === "encryptedChanges"
219
+ ? v.slice(0, 20) + "..."
220
+ : v)}`, { cause: e });
221
+ }
222
+ }
223
+ };
224
+ processMessages()
225
+ .then(() => {
226
+ if (peer.crashOnClose) {
227
+ console.error("Unexepcted close from peer", peer.id);
228
+ this.local.crashed = new Error("Unexpected close from peer");
229
+ throw new Error("Unexpected close from peer");
230
+ }
231
+ })
232
+ .catch((e) => {
233
+ console.error("Error processing messages from peer", peer.id, e);
234
+ if (peer.crashOnClose) {
235
+ this.local.crashed = e;
236
+ throw new Error(e);
237
+ }
238
+ })
239
+ .finally(() => {
240
+ peer.outgoing.close();
241
+ delete this.peers[peer.id];
242
+ });
243
+ }
244
+ trySendToPeer(peer, msg) {
245
+ return peer.pushOutgoingMessage(msg);
246
+ }
247
+ async handleLoad(msg, peer) {
248
+ peer.optimisticKnownStates[msg.id] = knownStateIn(msg);
249
+ let entry = this.local.coValues[msg.id];
250
+ if (!entry) {
251
+ // console.log(`Loading ${msg.id} from all peers except ${peer.id}`);
252
+ // special case: we should be able to solve this much more neatly
253
+ // with an explicit state machine in the future
254
+ const eligiblePeers = this.peersInPriorityOrder().filter((other) => other.id !== peer.id && other.role === "server");
255
+ if (eligiblePeers.length === 0) {
256
+ if (msg.header || Object.keys(msg.sessions).length > 0) {
257
+ this.local.coValues[msg.id] = newLoadingState(new Set([peer.id]));
258
+ this.trySendToPeer(peer, {
259
+ action: "known",
260
+ id: msg.id,
261
+ header: false,
262
+ sessions: {},
263
+ }).catch((e) => {
264
+ console.error("Error sending known state", e);
265
+ });
266
+ }
267
+ return;
268
+ }
269
+ else {
270
+ this.local
271
+ .loadCoValueCore(msg.id, {
272
+ dontLoadFrom: peer.id,
273
+ dontWaitFor: peer.id,
274
+ })
275
+ .catch((e) => {
276
+ console.error("Error loading coValue in handleLoad", e);
277
+ });
278
+ }
279
+ entry = this.local.coValues[msg.id];
280
+ }
281
+ if (entry.state === "loading") {
282
+ // console.debug(
283
+ // "Waiting for loaded",
284
+ // msg.id,
285
+ // "after message from",
286
+ // peer.id,
287
+ // );
288
+ const loaded = await entry.done;
289
+ // console.log("Loaded", msg.id, loaded);
290
+ if (loaded === "unavailable") {
291
+ peer.optimisticKnownStates[msg.id] = knownStateIn(msg);
292
+ peer.toldKnownState.add(msg.id);
293
+ this.trySendToPeer(peer, {
294
+ action: "known",
295
+ id: msg.id,
296
+ header: false,
297
+ sessions: {},
298
+ }).catch((e) => {
299
+ console.error("Error sending known state back", e);
300
+ });
301
+ return;
302
+ }
303
+ }
304
+ await this.tellUntoldKnownStateIncludingDependencies(msg.id, peer);
305
+ await this.sendNewContentIncludingDependencies(msg.id, peer);
306
+ }
307
+ async handleKnownState(msg, peer) {
308
+ let entry = this.local.coValues[msg.id];
309
+ peer.optimisticKnownStates[msg.id] = combinedKnownStates(peer.optimisticKnownStates[msg.id] || emptyKnownState(msg.id), knownStateIn(msg));
310
+ if (!entry) {
311
+ if (msg.asDependencyOf) {
312
+ if (this.local.coValues[msg.asDependencyOf]) {
313
+ this.local
314
+ .loadCoValueCore(msg.id, { dontLoadFrom: peer.id })
315
+ .catch((e) => {
316
+ console.error(`Error loading coValue ${msg.id} to create loading state, as dependency of ${msg.asDependencyOf}`, e);
317
+ });
318
+ entry = this.local.coValues[msg.id]; // must exist after loadCoValueCore
319
+ }
320
+ else {
321
+ throw new Error("Expected coValue dependency entry to be created, missing subscribe?");
322
+ }
323
+ }
324
+ else {
325
+ throw new Error(`Expected coValue entry for ${msg.id} to be created on known state, missing subscribe?`);
326
+ }
327
+ }
328
+ if (entry.state === "loading") {
329
+ const availableOnPeer = peer.optimisticKnownStates[msg.id]?.header;
330
+ const firstPeerStateEntry = entry.firstPeerState[peer.id];
331
+ if (firstPeerStateEntry?.type === "waiting") {
332
+ firstPeerStateEntry.resolve();
333
+ }
334
+ entry.firstPeerState[peer.id] = availableOnPeer
335
+ ? { type: "available" }
336
+ : { type: "unavailable" };
337
+ // console.log(
338
+ // "Marking",
339
+ // msg.id,
340
+ // "as",
341
+ // entry.firstPeerState[peer.id]?.type,
342
+ // "from",
343
+ // peer.id
344
+ // );
345
+ if (Object.values(entry.firstPeerState).every((s) => s.type === "unavailable")) {
346
+ entry.resolve("unavailable");
347
+ }
348
+ return [];
349
+ }
350
+ await this.tellUntoldKnownStateIncludingDependencies(msg.id, peer);
351
+ await this.sendNewContentIncludingDependencies(msg.id, peer);
352
+ }
353
+ async handleNewContent(msg, peer) {
354
+ let entry = this.local.coValues[msg.id];
355
+ if (!entry) {
356
+ console.error(`Expected coValue entry for ${msg.id} to be created on new content, missing subscribe?`);
357
+ return;
358
+ }
359
+ let resolveAfterDone;
360
+ const peerOptimisticKnownState = peer.optimisticKnownStates[msg.id];
361
+ if (!peerOptimisticKnownState) {
362
+ console.error("Expected optimisticKnownState to be set for coValue we receive new content for");
363
+ return;
364
+ }
365
+ if (entry.state === "loading") {
366
+ if (!msg.header) {
367
+ console.error("Expected header to be sent in first message");
368
+ return;
369
+ }
370
+ const firstPeerStateEntry = entry.firstPeerState[peer.id];
371
+ if (firstPeerStateEntry?.type === "waiting") {
372
+ firstPeerStateEntry.resolve();
373
+ entry.firstPeerState[peer.id] = { type: "available" };
374
+ }
375
+ peerOptimisticKnownState.header = true;
376
+ const coValue = new CoValueCore(msg.header, this.local);
377
+ resolveAfterDone = entry.resolve;
378
+ entry = {
379
+ state: "loaded",
380
+ coValue: coValue,
381
+ onProgress: entry.onProgress,
382
+ };
383
+ this.local.coValues[msg.id] = entry;
384
+ }
385
+ const coValue = entry.coValue;
386
+ let invalidStateAssumed = false;
387
+ for (const [sessionID, newContentForSession] of Object.entries(msg.new)) {
388
+ const ourKnownTxIdx = coValue.sessionLogs.get(sessionID)?.transactions.length;
389
+ const theirFirstNewTxIdx = newContentForSession.after;
390
+ if ((ourKnownTxIdx || 0) < theirFirstNewTxIdx) {
391
+ invalidStateAssumed = true;
392
+ continue;
393
+ }
394
+ const alreadyKnownOffset = ourKnownTxIdx
395
+ ? ourKnownTxIdx - theirFirstNewTxIdx
396
+ : 0;
397
+ const newTransactions = newContentForSession.newTransactions.slice(alreadyKnownOffset);
398
+ if (newTransactions.length === 0) {
399
+ continue;
400
+ }
401
+ const before = performance.now();
402
+ // eslint-disable-next-line neverthrow/must-use-result
403
+ const result = coValue.tryAddTransactions(sessionID, newTransactions, undefined, newContentForSession.lastSignature);
404
+ const after = performance.now();
405
+ if (after - before > 80) {
406
+ const totalTxLength = newTransactions
407
+ .map((t) => t.privacy === "private"
408
+ ? t.encryptedChanges.length
409
+ : t.changes.length)
410
+ .reduce((a, b) => a + b, 0);
411
+ console.log(`Adding incoming transactions took ${(after - before).toFixed(2)}ms for ${totalTxLength} bytes = bandwidth: ${((1000 * totalTxLength) /
412
+ (after - before) /
413
+ (1024 * 1024)).toFixed(2)} MB/s`);
414
+ }
415
+ const theirTotalnTxs = Object.values(peer.optimisticKnownStates[msg.id]?.sessions || {}).reduce((sum, nTxs) => sum + nTxs, 0);
416
+ const ourTotalnTxs = [...coValue.sessionLogs.values()].reduce((sum, session) => sum + session.transactions.length, 0);
417
+ entry.onProgress?.(ourTotalnTxs / theirTotalnTxs);
418
+ if (result.isErr()) {
419
+ console.error("Failed to add transactions from", peer.id, result.error, msg.id, newTransactions.length + " new transactions", "after: " + newContentForSession.after, "our last known tx idx initially: " + ourKnownTxIdx, "our last known tx idx now: " +
420
+ coValue.sessionLogs.get(sessionID)?.transactions.length);
421
+ continue;
422
+ }
423
+ peerOptimisticKnownState.sessions[sessionID] = Math.max(peerOptimisticKnownState.sessions[sessionID] || 0, newContentForSession.after +
424
+ newContentForSession.newTransactions.length);
425
+ }
426
+ if (resolveAfterDone) {
427
+ resolveAfterDone(coValue);
428
+ }
429
+ await this.syncCoValue(coValue);
430
+ if (invalidStateAssumed) {
431
+ this.trySendToPeer(peer, {
432
+ action: "known",
433
+ isCorrection: true,
434
+ ...coValue.knownState(),
435
+ }).catch((e) => {
436
+ console.error("Error sending known state correction", e);
437
+ });
438
+ }
439
+ }
440
+ async handleCorrection(msg, peer) {
441
+ peer.optimisticKnownStates[msg.id] = msg;
442
+ return this.sendNewContentIncludingDependencies(msg.id, peer);
443
+ }
444
+ handleUnsubscribe(_msg) {
445
+ throw new Error("Method not implemented.");
446
+ }
447
+ async syncCoValue(coValue) {
448
+ if (this.requestedSyncs[coValue.id]) {
449
+ this.requestedSyncs[coValue.id].nRequestsThisTick++;
450
+ return this.requestedSyncs[coValue.id].done;
451
+ }
452
+ else {
453
+ const done = new Promise((resolve) => {
454
+ queueMicrotask(async () => {
455
+ delete this.requestedSyncs[coValue.id];
456
+ // if (entry.nRequestsThisTick >= 2) {
457
+ // console.log("Syncing", coValue.id, "for", entry.nRequestsThisTick, "requests");
458
+ // }
459
+ await this.actuallySyncCoValue(coValue);
460
+ resolve();
461
+ });
462
+ });
463
+ const entry = {
464
+ done,
465
+ nRequestsThisTick: 1,
466
+ };
467
+ this.requestedSyncs[coValue.id] = entry;
468
+ return done;
469
+ }
470
+ }
471
+ async actuallySyncCoValue(coValue) {
472
+ // let blockingSince = performance.now();
473
+ for (const peer of this.peersInPriorityOrder()) {
474
+ // if (performance.now() - blockingSince > 5) {
475
+ // await new Promise<void>((resolve) => {
476
+ // setTimeout(resolve, 0);
477
+ // });
478
+ // blockingSince = performance.now();
479
+ // }
480
+ const optimisticKnownState = peer.optimisticKnownStates[coValue.id];
481
+ if (optimisticKnownState) {
482
+ await this.tellUntoldKnownStateIncludingDependencies(coValue.id, peer);
483
+ await this.sendNewContentIncludingDependencies(coValue.id, peer);
484
+ }
485
+ else if (peer.role === "server") {
486
+ await this.subscribeToIncludingDependencies(coValue.id, peer);
487
+ await this.sendNewContentIncludingDependencies(coValue.id, peer);
488
+ }
489
+ }
490
+ }
491
+ gracefulShutdown() {
492
+ for (const peer of Object.values(this.peers)) {
493
+ peer.gracefulShutdown();
494
+ }
495
+ }
496
+ }
497
+ function knownStateIn(msg) {
498
+ return {
499
+ id: msg.id,
500
+ header: msg.header,
501
+ sessions: msg.sessions,
502
+ };
503
+ }
504
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export function accountOrAgentIDfromSessionID(sessionID) {
2
+ const until = sessionID.indexOf("_session");
3
+ return sessionID.slice(0, until);
4
+ }
5
+ //# sourceMappingURL=accountOrAgentIDfromSessionID.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accountOrAgentIDfromSessionID.js","sourceRoot":"","sources":["../../../src/typeUtils/accountOrAgentIDfromSessionID.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,6BAA6B,CACzC,SAAoB;IAEpB,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAA2B,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { expectMap } from "../coValue.js";
2
+ import { RawGroup } from "../coValues/group.js";
3
+ export function expectGroup(content) {
4
+ const map = expectMap(content);
5
+ if (map.core.header.ruleset.type !== "group") {
6
+ throw new Error("Expected group ruleset in group");
7
+ }
8
+ if (!(map instanceof RawGroup)) {
9
+ throw new Error("Expected group");
10
+ }
11
+ return map;
12
+ }
13
+ //# sourceMappingURL=expectGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expectGroup.js","sourceRoot":"","sources":["../../../src/typeUtils/expectGroup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmB,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,MAAM,UAAU,WAAW,CAAC,OAAmB;IAC3C,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,CAAC,CAAC,GAAG,YAAY,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,GAAG,CAAC;AACf,CAAC"}
@@ -0,0 +1,4 @@
1
+ export function isAccountID(id) {
2
+ return id.startsWith("co_");
3
+ }
4
+ //# sourceMappingURL=isAccountID.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isAccountID.js","sourceRoot":"","sources":["../../../src/typeUtils/isAccountID.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,WAAW,CAAC,EAA0B;IAClD,OAAO,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { RawCoMap } from "../coValues/coMap.js";
2
+ import { RawCoList } from "../coValues/coList.js";
3
+ import { RawCoStream } from "../coValues/coStream.js";
4
+ import { RawBinaryCoStream } from "../coValues/coStream.js";
5
+ export function isCoValue(value) {
6
+ return (value instanceof RawCoMap ||
7
+ value instanceof RawCoList ||
8
+ value instanceof RawCoStream ||
9
+ value instanceof RawBinaryCoStream);
10
+ }
11
+ //# sourceMappingURL=isCoValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isCoValue.js","sourceRoot":"","sources":["../../../src/typeUtils/isCoValue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,UAAU,SAAS,CACrB,KAAyC;IAEzC,OAAO,CACH,KAAK,YAAY,QAAQ;QACzB,KAAK,YAAY,SAAS;QAC1B,KAAK,YAAY,WAAW;QAC5B,KAAK,YAAY,iBAAiB,CACrC,CAAC;AACN,CAAC"}
package/package.json CHANGED
@@ -1,11 +1,25 @@
1
1
  {
2
2
  "name": "cojson",
3
- "module": "dist/index.js",
4
- "main": "dist/index.js",
5
- "types": "src/index.ts",
3
+ "module": "dist/web/index.web.js",
4
+ "main": "dist/web/index.web.js",
5
+ "types": "src/index.web.ts",
6
+ "react-native": "dist/native/index.native.js",
7
+ "exports": {
8
+ ".": {
9
+ "react-native": "./dist/native/index.native.js",
10
+ "types": "./src/index.web.ts",
11
+ "default": "./dist/web/index.web.js"
12
+ },
13
+ "./native": {
14
+ "react-native": "./dist/native/index.native.js",
15
+ "types": "./src/index.native.ts",
16
+ "default": "./dist/native/index.native.js"
17
+ },
18
+ "./src/*": "./src/*"
19
+ },
6
20
  "type": "module",
7
21
  "license": "MIT",
8
- "version": "0.8.0",
22
+ "version": "0.8.5",
9
23
  "devDependencies": {
10
24
  "@types/jest": "^29.5.3",
11
25
  "@typescript-eslint/eslint-plugin": "^6.2.1",
@@ -33,11 +47,14 @@
33
47
  },
34
48
  "gitHead": "33c27053293b4801b968c61d5c4c989f93a67d13",
35
49
  "scripts": {
36
- "dev": "tsc --watch --sourceMap --outDir dist",
37
- "test": "vitest --run",
38
- "test-watch": "vitest",
50
+ "dev": "tsc --watch --sourceMap --outDir dist/web -p tsconfig.web.json",
51
+ "dev:native": "tsc --watch --sourceMap --outDir dist/native -p tsconfig.native.json",
52
+ "test": "vitest --run --root ../../ --project cojson",
53
+ "test:watch": "vitest --watch --root ../../ --project cojson",
39
54
  "lint": "eslint . --ext ts,tsx",
40
55
  "format": "prettier --write './src/**/*.{ts,tsx}'",
41
- "build": "npm run lint && rm -rf ./dist && tsc --sourceMap --outDir dist"
56
+ "build:web": "tsc --sourceMap --outDir dist/web -p tsconfig.web.json",
57
+ "build:native": "tsc --sourceMap --outDir dist/native -p tsconfig.native.json",
58
+ "build": "npm run lint && rm -rf ./dist && pnpm run build:native && pnpm run build:web"
42
59
  }
43
60
  }
package/src/coValue.ts CHANGED
@@ -5,7 +5,7 @@ import { RawBinaryCoStream, RawCoStream } from "./coValues/coStream.js";
5
5
  import { RawCoList } from "./coValues/coList.js";
6
6
  import { CoValueCore } from "./coValueCore.js";
7
7
  import { RawGroup } from "./coValues/group.js";
8
- import { RawAccount, Profile } from "./index.js";
8
+ import { RawAccount, RawProfile as Profile } from "./coValues/account.js";
9
9
 
10
10
  export type CoID<T extends RawCoValue> = RawCoID & {
11
11
  readonly __type: T;