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.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +8 -0
- package/dist/coValueCore/utils.d.ts.map +1 -1
- package/dist/coValueCore/utils.js +3 -0
- package/dist/coValueCore/utils.js.map +1 -1
- package/dist/localNode.d.ts +6 -0
- package/dist/localNode.d.ts.map +1 -1
- package/dist/localNode.js +27 -0
- package/dist/localNode.js.map +1 -1
- package/dist/permissions.d.ts.map +1 -1
- package/dist/permissions.js +3 -1
- package/dist/permissions.js.map +1 -1
- package/dist/tests/branching.test.js +210 -22
- package/dist/tests/branching.test.js.map +1 -1
- package/dist/tests/group.removeMember.test.js +63 -116
- package/dist/tests/group.removeMember.test.js.map +1 -1
- package/dist/tests/sync.load.test.js +36 -0
- package/dist/tests/sync.load.test.js.map +1 -1
- package/dist/tests/sync.storage.test.js +38 -0
- package/dist/tests/sync.storage.test.js.map +1 -1
- package/dist/tests/sync.upload.test.js +38 -0
- package/dist/tests/sync.upload.test.js.map +1 -1
- package/package.json +2 -2
- package/src/coValueCore/utils.ts +4 -0
- package/src/localNode.ts +40 -0
- package/src/permissions.ts +3 -1
- package/src/tests/branching.test.ts +306 -22
- package/src/tests/group.removeMember.test.ts +116 -214
- package/src/tests/sync.load.test.ts +48 -0
- package/src/tests/sync.storage.test.ts +51 -0
- package/src/tests/sync.upload.test.ts +50 -0
|
@@ -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.
|
|
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.
|
|
42
|
+
"cojson-core-wasm": "0.18.2"
|
|
43
43
|
},
|
|
44
44
|
"gitHead": "33c27053293b4801b968c61d5c4c989f93a67d13",
|
|
45
45
|
"scripts": {
|
package/src/coValueCore/utils.ts
CHANGED
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
|
|
package/src/permissions.ts
CHANGED
|
@@ -435,7 +435,9 @@ function determineValidTransactionsForGroup(
|
|
|
435
435
|
const currentAccountId = coValue.node.getCurrentAccountOrAgentID();
|
|
436
436
|
|
|
437
437
|
const isSelfRevoke =
|
|
438
|
-
currentAccountId === change.key &&
|
|
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 {
|
|
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
|
|
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
|
-
//
|
|
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
|
|
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
|
|
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
|
-
//
|
|
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
|
|
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
|
|
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
|
|
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
|
});
|