cojson 0.18.1 → 0.18.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"sync.upload.test.js","sourceRoot":"","sources":["../../src/tests/sync.upload.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.upload.test.js","sourceRoot":"","sources":["../../src/tests/sync.upload.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -25,7 +25,7 @@
25
25
  },
26
26
  "type": "module",
27
27
  "license": "MIT",
28
- "version": "0.18.1",
28
+ "version": "0.18.2",
29
29
  "devDependencies": {
30
30
  "@opentelemetry/sdk-metrics": "^2.0.0",
31
31
  "libsql": "^0.5.13",
@@ -39,7 +39,7 @@
39
39
  "@scure/base": "1.2.1",
40
40
  "neverthrow": "^7.0.1",
41
41
  "unicode-segmenter": "^0.12.0",
42
- "cojson-core-wasm": "0.18.1"
42
+ "cojson-core-wasm": "0.18.2"
43
43
  },
44
44
  "gitHead": "33c27053293b4801b968c61d5c4c989f93a67d13",
45
45
  "scripts": {
@@ -52,6 +52,10 @@ export function getDependedOnCoValuesFromRawData(
52
52
  deps.add(header.ruleset.group);
53
53
  }
54
54
 
55
+ if (header.meta?.source) {
56
+ deps.add(header.meta.source as RawCoID);
57
+ }
58
+
55
59
  return deps;
56
60
  }
57
61
 
package/src/localNode.ts CHANGED
@@ -457,6 +457,46 @@ export class LocalNode {
457
457
  return core.getCurrentContent() as T;
458
458
  }
459
459
 
460
+ /**
461
+ * Loads a branch from a group coValue, creating a new one if it doesn't exist.
462
+ *
463
+ * Returns "unavailable" in case of errors or missing source.
464
+ */
465
+ async checkoutBranch<T extends RawCoValue>(
466
+ id: CoID<T>,
467
+ branch: string,
468
+ branchOwnerID?: RawCoID,
469
+ ): Promise<T | "unavailable"> {
470
+ const source = await this.loadCoValueCore(id);
471
+
472
+ if (!source.isAvailable()) {
473
+ return "unavailable";
474
+ }
475
+
476
+ const header = source.verified.header;
477
+
478
+ // Group and account coValues can't have branches
479
+ if (header.ruleset.type !== "ownedByGroup") {
480
+ logger.error("Can't checkout a branch from a group coValue", {
481
+ id,
482
+ });
483
+ return "unavailable";
484
+ }
485
+
486
+ const ownerID = branchOwnerID || header.ruleset.group;
487
+
488
+ const branchID = source.getBranchId(branch, ownerID);
489
+
490
+ // Passing skipRetry to true because otherwise creating a new branch would always take 1 retry delay
491
+ let branchCoValue = await this.loadCoValueCore(branchID, undefined, true);
492
+
493
+ if (!branchCoValue.isAvailable()) {
494
+ branchCoValue = source.createBranch(branch, ownerID);
495
+ }
496
+
497
+ return branchCoValue.getCurrentContent() as T;
498
+ }
499
+
460
500
  getLoaded<T extends RawCoValue>(id: CoID<T>): T | undefined {
461
501
  const coValue = this.getCoValue(id);
462
502
 
@@ -435,7 +435,9 @@ function determineValidTransactionsForGroup(
435
435
  const currentAccountId = coValue.node.getCurrentAccountOrAgentID();
436
436
 
437
437
  const isSelfRevoke =
438
- currentAccountId === change.key && change.value === "revoked";
438
+ currentAccountId === change.key &&
439
+ transactor === currentAccountId &&
440
+ change.value === "revoked";
439
441
 
440
442
  if (!isFirstSelfAppointment && !isSelfRevoke) {
441
443
  if (memberState[transactor] === "admin") {
@@ -1,16 +1,26 @@
1
- import { describe, expect, test } from "vitest";
2
- import { createTestNode } from "./testUtils.js";
1
+ import { beforeEach, describe, expect, test } from "vitest";
2
+ import {
3
+ createTestNode,
4
+ setupTestNode,
5
+ loadCoValueOrFail,
6
+ } from "./testUtils.js";
3
7
  import { expectMap } from "../coValue.js";
4
8
 
9
+ let jazzCloud: ReturnType<typeof setupTestNode>;
10
+
11
+ beforeEach(async () => {
12
+ jazzCloud = setupTestNode({ isSyncServer: true });
13
+ });
14
+
5
15
  describe("Branching Logic", () => {
6
16
  describe("Branch Operations with Transactions", () => {
7
- test("should maintain separate transaction histories", async () => {
17
+ test("should maintain separate transaction histories between original and branch", async () => {
8
18
  const node = createTestNode();
9
19
  const group = node.createGroup();
10
20
  const originalMap = group.createMap();
11
21
  const branchName = "feature-branch";
12
22
 
13
- // Add transactions to original map
23
+ // Add initial transactions to original map
14
24
  originalMap.set("originalKey1", "value1", "trusting");
15
25
  originalMap.set("originalKey2", "value2", "trusting");
16
26
 
@@ -18,12 +28,15 @@ describe("Branching Logic", () => {
18
28
  originalMap.core.createBranch(branchName, group.id).getCurrentContent(),
19
29
  );
20
30
 
21
- // Add transactions to branch
31
+ // Add new transactions to branch
22
32
  branch.set("branchKey1", "branchValue1", "trusting");
23
33
  branch.set("branchKey2", "branchValue2", "trusting");
24
34
 
35
+ // Verify original map doesn't have branch transactions
25
36
  expect(originalMap.get("branchKey1")).toBe(undefined);
26
37
  expect(originalMap.get("branchKey2")).toBe(undefined);
38
+
39
+ // Verify branch has both original and new transactions
27
40
  expect(branch.get("branchKey2")).toBe("branchValue2");
28
41
  expect(branch.get("branchKey1")).toBe("branchValue1");
29
42
  expect(branch.get("originalKey1")).toBe("value1");
@@ -32,88 +45,91 @@ describe("Branching Logic", () => {
32
45
  });
33
46
 
34
47
  describe("Branch Merging", () => {
35
- test("should merge branch transactions back to source", () => {
48
+ test("should merge branch transactions back to source map", () => {
36
49
  const node = createTestNode();
37
50
  const group = node.createGroup();
38
51
  const originalMap = group.createMap();
39
52
  const branchName = "feature-branch";
40
53
 
41
- // Add transactions to original map
54
+ // Add initial transactions to original map
42
55
  originalMap.set("key1", "value1", "trusting");
43
56
  originalMap.set("key2", "value2", "trusting");
44
57
 
45
- // Create branch
58
+ // Create branch from original map
46
59
  const branch = expectMap(
47
60
  originalMap.core.createBranch(branchName, group.id).getCurrentContent(),
48
61
  );
49
62
 
50
- // Add transactions to branch
63
+ // Add new transaction to branch
51
64
  branch.set("key1", "branchValue1", "trusting");
52
65
 
53
- // Merge branch
66
+ // Merge branch back to source
54
67
  const result = expectMap(branch.core.mergeBranch().getCurrentContent());
55
68
 
56
- // Check that source now has branch transactions
69
+ // Verify source now contains branch transactions
57
70
  expect(result.get("key1")).toBe("branchValue1");
58
71
  expect(result.get("key2")).toBe("value2");
59
72
  });
60
73
 
61
- test("should not merge branch transactions back to source if they are already merged", () => {
74
+ test("should not create duplicate merge commits when merging already merged branch", () => {
62
75
  const node = createTestNode();
63
76
  const group = node.createGroup();
64
77
  const originalMap = group.createMap();
65
78
  const branchName = "feature-branch";
66
79
 
67
- // Add transactions to original map
80
+ // Add initial transactions to original map
68
81
  originalMap.set("key1", "value1", "trusting");
69
82
  originalMap.set("key2", "value2", "trusting");
70
83
 
71
- // Create branch
84
+ // Create branch from original map
72
85
  const branch = expectMap(
73
86
  originalMap.core.createBranch(branchName, group.id).getCurrentContent(),
74
87
  );
75
88
 
76
- // Add transactions to branch
89
+ // Add new transaction to branch
77
90
  branch.set("key1", "branchValue1", "trusting");
78
91
 
79
- // Merge branch twice
92
+ // Merge branch twice - second merge should not create new commit
80
93
  expectMap(branch.core.mergeBranch().getCurrentContent());
81
94
  const result = expectMap(branch.core.mergeBranch().getCurrentContent());
82
95
 
96
+ // Verify only one merge commit was created
83
97
  expect(result.core.mergeCommits.length).toBe(1);
84
98
 
85
- // Check that source now has branch transactions
99
+ // Verify source contains branch transactions
86
100
  expect(result.get("key1")).toBe("branchValue1");
87
101
  expect(result.get("key2")).toBe("value2");
88
102
  });
89
103
 
90
- test("should not create a merge commit if the branch is empty", () => {
104
+ test("should not create merge commit when merging empty branch", () => {
91
105
  const node = createTestNode();
92
106
  const group = node.createGroup();
93
107
  const originalMap = group.createMap();
94
108
  const branchName = "feature-branch";
95
109
 
96
- // Add transactions to original map
110
+ // Add initial transactions to original map
97
111
  originalMap.set("key1", "value1", "trusting");
98
112
  originalMap.set("key2", "value2", "trusting");
99
113
 
100
- // Create branch
114
+ // Create branch from original map (no changes made)
101
115
  const branch = expectMap(
102
116
  originalMap.core.createBranch(branchName, group.id).getCurrentContent(),
103
117
  );
104
118
 
105
- // Merge branch twice
119
+ // Merge empty branch
106
120
  const result = expectMap(branch.core.mergeBranch().getCurrentContent());
107
121
 
122
+ // Verify no merge commit was created
108
123
  expect(result.core.mergeCommits.length).toBe(0);
109
124
  });
110
125
 
111
- test("should merge the new changes from the branch after the last merge", () => {
126
+ test("should merge only new changes from branch after previous merge", () => {
112
127
  const node = createTestNode();
113
128
  const group = node.createGroup();
114
129
  const originalMap = group.createMap();
115
130
  const branchName = "feature-branch";
116
131
 
132
+ // Add initial transactions to original map
117
133
  originalMap.set("key1", "value1", "trusting");
118
134
  originalMap.set("key2", "value2", "trusting");
119
135
 
@@ -121,21 +137,289 @@ describe("Branching Logic", () => {
121
137
  originalMap.core.createBranch(branchName, group.id).getCurrentContent(),
122
138
  );
123
139
 
140
+ // Add first change to branch
124
141
  branch.set("key1", "branchValue1", "trusting");
125
142
 
143
+ // Merge first change
126
144
  branch.core.mergeBranch();
127
145
 
146
+ // Verify first change was merged
128
147
  expect(originalMap.get("key1")).toBe("branchValue1");
129
148
  expect(originalMap.get("key2")).toBe("value2");
130
149
 
150
+ // Add second change to branch
131
151
  branch.set("key2", "branchValue2", "trusting");
132
152
 
153
+ // Merge second change
133
154
  branch.core.mergeBranch();
134
155
 
156
+ // Verify two merge commits exist
135
157
  expect(originalMap.core.mergeCommits.length).toBe(2);
136
158
 
159
+ // Verify both changes are now in original map
137
160
  expect(originalMap.get("key1")).toBe("branchValue1");
138
161
  expect(originalMap.get("key2")).toBe("branchValue2");
139
162
  });
140
163
  });
164
+
165
+ describe("Branch Loading and Checkout", () => {
166
+ test("should create new branch when checking out non-existent branch", async () => {
167
+ const client = setupTestNode({
168
+ connected: true,
169
+ });
170
+ const group = jazzCloud.node.createGroup();
171
+ group.addMember("everyone", "writer");
172
+
173
+ const originalMap = group.createMap();
174
+ const branchName = "feature-branch";
175
+
176
+ // Add initial data to original map
177
+ originalMap.set("key1", "value1");
178
+ originalMap.set("key2", "value2");
179
+
180
+ // Checkout non-existent branch - should create new one
181
+ const branch = await client.node.checkoutBranch(
182
+ originalMap.id,
183
+ branchName,
184
+ );
185
+
186
+ expect(branch).not.toBe("unavailable");
187
+
188
+ if (branch !== "unavailable") {
189
+ // Verify branch inherits original data
190
+ expect(branch.get("key1")).toBe("value1");
191
+ expect(branch.get("key2")).toBe("value2");
192
+
193
+ // Add new data to branch
194
+ branch.set("branchKey", "branchValue");
195
+
196
+ await branch.core.waitForSync();
197
+
198
+ // Verify original map doesn't have branch data
199
+ expect(originalMap.get("branchKey")).toBe(undefined);
200
+ expect(branch.get("branchKey")).toBe("branchValue");
201
+ }
202
+ });
203
+
204
+ test("should load existing branch when checking out created branch", async () => {
205
+ const client = setupTestNode({
206
+ connected: true,
207
+ });
208
+ const group = jazzCloud.node.createGroup();
209
+ group.addMember("everyone", "writer");
210
+
211
+ const originalMap = group.createMap();
212
+ const branchName = "feature-branch";
213
+
214
+ // Add initial data to original map
215
+ originalMap.set("key1", "value1");
216
+ originalMap.set("key2", "value2");
217
+
218
+ // Create branch with some data
219
+ const originalBranch = expectMap(
220
+ originalMap.core.createBranch(branchName, group.id).getCurrentContent(),
221
+ );
222
+
223
+ originalBranch.set("branchKey", "branchValue");
224
+
225
+ // Checkout existing branch - should return created branch
226
+ const branch = await client.node.checkoutBranch(
227
+ originalMap.id,
228
+ branchName,
229
+ );
230
+
231
+ expect(branch).not.toBe("unavailable");
232
+
233
+ if (branch !== "unavailable") {
234
+ // Verify branch contains both original and new data
235
+ expect(branch.get("key1")).toBe("value1");
236
+ expect(branch.get("key2")).toBe("value2");
237
+ expect(branch.get("branchKey")).toBe("branchValue");
238
+ }
239
+ });
240
+
241
+ test("should successfully load existing branch via node.load", async () => {
242
+ const client = setupTestNode({
243
+ connected: true,
244
+ });
245
+ const group = jazzCloud.node.createGroup();
246
+ group.addMember("everyone", "writer");
247
+
248
+ const originalMap = group.createMap();
249
+ const branchName = "feature-branch";
250
+
251
+ // Add initial data to original map
252
+ originalMap.set("key1", "value1");
253
+ originalMap.set("key2", "value2");
254
+
255
+ // Create branch with some data
256
+ const originalBranch = expectMap(
257
+ originalMap.core.createBranch(branchName, group.id).getCurrentContent(),
258
+ );
259
+
260
+ originalBranch.set("branchKey", "branchValue");
261
+
262
+ // Load existing branch via node.load
263
+ const branch = await client.node.load(originalBranch.id);
264
+
265
+ expect(branch).not.toBe("unavailable");
266
+
267
+ if (branch !== "unavailable") {
268
+ // Verify branch contains all expected data
269
+ expect(branch.get("key1")).toBe("value1");
270
+ expect(branch.get("key2")).toBe("value2");
271
+ expect(branch.get("branchKey")).toBe("branchValue");
272
+ }
273
+ });
274
+
275
+ test("should create branch with different group owner when specified", async () => {
276
+ const client = setupTestNode({
277
+ connected: true,
278
+ });
279
+ const group = jazzCloud.node.createGroup();
280
+ group.addMember("everyone", "writer");
281
+
282
+ const originalMap = group.createMap();
283
+ const branchName = "feature-branch";
284
+
285
+ // Add initial data to original map
286
+ originalMap.set("key1", "value1");
287
+ originalMap.set("key2", "value2");
288
+
289
+ // Create different group to own the branch
290
+ const branchGroup = client.node.createGroup();
291
+
292
+ // Checkout branch with different group as owner
293
+ const branch = await client.node.checkoutBranch(
294
+ originalMap.id,
295
+ branchName,
296
+ branchGroup.id,
297
+ );
298
+
299
+ expect(branch).not.toBe("unavailable");
300
+
301
+ if (branch !== "unavailable") {
302
+ // Verify branch inherits original data
303
+ expect(branch.get("key1")).toBe("value1");
304
+ expect(branch.get("key2")).toBe("value2");
305
+
306
+ // Add new data to branch
307
+ branch.set("branchKey", "branchValue");
308
+
309
+ await branch.core.waitForSync();
310
+
311
+ // Verify original map doesn't have branch data
312
+ expect(originalMap.get("branchKey")).toBe(undefined);
313
+ expect(branch.get("branchKey")).toBe("branchValue");
314
+ }
315
+
316
+ // Verify that the sync server can't read the branch content
317
+ const branchOnTheServer = await jazzCloud.node.checkoutBranch(
318
+ originalMap.id,
319
+ branchName,
320
+ branchGroup.id,
321
+ );
322
+
323
+ expect(branchOnTheServer).not.toBe("unavailable");
324
+
325
+ if (branchOnTheServer !== "unavailable") {
326
+ expect(branchOnTheServer.get("branchKey")).toBe(undefined);
327
+ expect(branchOnTheServer.get("key1")).toBe(undefined);
328
+ expect(branchOnTheServer.get("key2")).toBe(undefined);
329
+ }
330
+ });
331
+
332
+ test("should return unavailable when trying to checkout branch from group", async () => {
333
+ const client = setupTestNode({
334
+ connected: true,
335
+ });
336
+ const group = jazzCloud.node.createGroup();
337
+ group.addMember("everyone", "writer");
338
+
339
+ // Try to checkout branch from group (groups don't support branching)
340
+ const branch = await client.node.checkoutBranch(
341
+ group.id,
342
+ "feature-branch",
343
+ );
344
+
345
+ // Should return unavailable since groups don't support branching
346
+ expect(branch).toBe("unavailable");
347
+ });
348
+
349
+ test("should return unavailable when source value is unreachable", async () => {
350
+ // Create client without sync server connection
351
+ const client = setupTestNode();
352
+
353
+ const group = jazzCloud.node.createGroup();
354
+ group.addMember("everyone", "writer");
355
+
356
+ // Create map on sync server (unreachable from client)
357
+ const originalMap = group.createMap();
358
+ originalMap.set("key1", "value1");
359
+
360
+ // Try to checkout branch on unreachable map
361
+ const branch = await client.node.checkoutBranch(
362
+ originalMap.id,
363
+ "feature-branch",
364
+ );
365
+
366
+ // Should return unavailable since checkout failed
367
+ expect(branch).toBe("unavailable");
368
+ });
369
+ });
370
+
371
+ describe("Branch Conflict Resolution", () => {
372
+ test("should successfully handle concurrent branch creation on different nodes", async () => {
373
+ const bob = setupTestNode();
374
+ const { peer: bobPeer } = bob.connectToSyncServer();
375
+ const alice = setupTestNode({
376
+ connected: true,
377
+ });
378
+
379
+ const client = setupTestNode();
380
+ const group = jazzCloud.node.createGroup();
381
+ group.addMember("everyone", "writer");
382
+
383
+ // Create map without any branches
384
+ const originalMap = group.createMap();
385
+
386
+ const originalMapOnBob = await loadCoValueOrFail(
387
+ bob.node,
388
+ originalMap.id,
389
+ );
390
+
391
+ // Disconnect bob from sync server to create isolation
392
+ bobPeer.outgoing.close();
393
+
394
+ // Create branches on different nodes
395
+ const aliceBranch = await alice.node.checkoutBranch(
396
+ originalMap.id,
397
+ "feature-branch",
398
+ );
399
+ const bobBranch = expectMap(
400
+ originalMapOnBob.core
401
+ .createBranch("feature-branch", group.id)
402
+ .getCurrentContent(),
403
+ );
404
+
405
+ if (aliceBranch === "unavailable") {
406
+ throw new Error("Alice branch is unavailable");
407
+ }
408
+
409
+ // Add different data to each branch
410
+ bobBranch.set("bob", true);
411
+ aliceBranch.set("alice", true);
412
+
413
+ // Reconnect bob to sync server
414
+ bob.connectToSyncServer();
415
+
416
+ // Wait for sync to complete
417
+ await bobBranch.core.waitForSync();
418
+ await aliceBranch.core.waitForSync();
419
+
420
+ // Verify both branches now contain data from the other
421
+ expect(bobBranch.get("alice")).toBe(true);
422
+ expect(aliceBranch.get("bob")).toBe(true);
423
+ });
424
+ });
141
425
  });