@dxos/merkle-search-tree 0.8.4-main.5ea62a8 → 0.8.4-main.66e292d
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/dist/lib/browser/index.mjs +238 -467
- package/dist/lib/browser/index.mjs.map +2 -2
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +238 -467
- package/dist/lib/node-esm/index.mjs.map +2 -2
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
|
@@ -61,77 +61,11 @@ var textEncoder = new TextEncoder();
|
|
|
61
61
|
// src/forest.ts
|
|
62
62
|
import { invariant } from "@dxos/invariant";
|
|
63
63
|
import { arrayToHex as arrayToHex2, arraysEqual } from "@dxos/util";
|
|
64
|
-
function _check_private_redeclaration(obj, privateCollection) {
|
|
65
|
-
if (privateCollection.has(obj)) {
|
|
66
|
-
throw new TypeError("Cannot initialize the same private elements twice on an object");
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
function _class_apply_descriptor_get(receiver, descriptor) {
|
|
70
|
-
if (descriptor.get) {
|
|
71
|
-
return descriptor.get.call(receiver);
|
|
72
|
-
}
|
|
73
|
-
return descriptor.value;
|
|
74
|
-
}
|
|
75
|
-
function _class_apply_descriptor_set(receiver, descriptor, value) {
|
|
76
|
-
if (descriptor.set) {
|
|
77
|
-
descriptor.set.call(receiver, value);
|
|
78
|
-
} else {
|
|
79
|
-
if (!descriptor.writable) {
|
|
80
|
-
throw new TypeError("attempted to set read only private field");
|
|
81
|
-
}
|
|
82
|
-
descriptor.value = value;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
function _class_extract_field_descriptor(receiver, privateMap, action) {
|
|
86
|
-
if (!privateMap.has(receiver)) {
|
|
87
|
-
throw new TypeError("attempted to " + action + " private field on non-instance");
|
|
88
|
-
}
|
|
89
|
-
return privateMap.get(receiver);
|
|
90
|
-
}
|
|
91
|
-
function _class_private_field_get(receiver, privateMap) {
|
|
92
|
-
var descriptor = _class_extract_field_descriptor(receiver, privateMap, "get");
|
|
93
|
-
return _class_apply_descriptor_get(receiver, descriptor);
|
|
94
|
-
}
|
|
95
|
-
function _class_private_field_init(obj, privateMap, value) {
|
|
96
|
-
_check_private_redeclaration(obj, privateMap);
|
|
97
|
-
privateMap.set(obj, value);
|
|
98
|
-
}
|
|
99
|
-
function _class_private_field_set(receiver, privateMap, value) {
|
|
100
|
-
var descriptor = _class_extract_field_descriptor(receiver, privateMap, "set");
|
|
101
|
-
_class_apply_descriptor_set(receiver, descriptor, value);
|
|
102
|
-
return value;
|
|
103
|
-
}
|
|
104
|
-
function _class_private_method_get(receiver, privateSet, fn) {
|
|
105
|
-
if (!privateSet.has(receiver)) {
|
|
106
|
-
throw new TypeError("attempted to get private field on non-instance");
|
|
107
|
-
}
|
|
108
|
-
return fn;
|
|
109
|
-
}
|
|
110
|
-
function _class_private_method_init(obj, privateSet) {
|
|
111
|
-
_check_private_redeclaration(obj, privateSet);
|
|
112
|
-
privateSet.add(obj);
|
|
113
|
-
}
|
|
114
|
-
function _define_property(obj, key, value) {
|
|
115
|
-
if (key in obj) {
|
|
116
|
-
Object.defineProperty(obj, key, {
|
|
117
|
-
value,
|
|
118
|
-
enumerable: true,
|
|
119
|
-
configurable: true,
|
|
120
|
-
writable: true
|
|
121
|
-
});
|
|
122
|
-
} else {
|
|
123
|
-
obj[key] = value;
|
|
124
|
-
}
|
|
125
|
-
return obj;
|
|
126
|
-
}
|
|
127
64
|
var __dxlog_file = "/__w/dxos/dxos/packages/common/merkle-search-tree/src/forest.ts";
|
|
128
|
-
var _nodes = /* @__PURE__ */ new WeakMap();
|
|
129
|
-
var _requireNode = /* @__PURE__ */ new WeakSet();
|
|
130
|
-
var _mergeItem = /* @__PURE__ */ new WeakSet();
|
|
131
|
-
var _emptyNodeCache = /* @__PURE__ */ new WeakMap();
|
|
132
|
-
var _makeNode = /* @__PURE__ */ new WeakSet();
|
|
133
|
-
var _splitAtKey = /* @__PURE__ */ new WeakSet();
|
|
134
65
|
var Forest = class {
|
|
66
|
+
#nodes = /* @__PURE__ */ new Map();
|
|
67
|
+
itemHashOps = 0;
|
|
68
|
+
nodeHashOps = 0;
|
|
135
69
|
async createTree(pairs) {
|
|
136
70
|
const items = await Promise.all([
|
|
137
71
|
...pairs
|
|
@@ -144,7 +78,7 @@ var Forest = class {
|
|
|
144
78
|
}
|
|
145
79
|
}
|
|
146
80
|
if (items.length === 0) {
|
|
147
|
-
return
|
|
81
|
+
return this.#makeNode(0, [], []);
|
|
148
82
|
}
|
|
149
83
|
const buildLevel = async (level, from, to) => {
|
|
150
84
|
invariant(level >= 0, void 0, {
|
|
@@ -157,7 +91,7 @@ var Forest = class {
|
|
|
157
91
|
]
|
|
158
92
|
});
|
|
159
93
|
if (level === 0) {
|
|
160
|
-
return
|
|
94
|
+
return this.#makeNode(0, items.slice(from, to), []);
|
|
161
95
|
}
|
|
162
96
|
let rangeBegin = from;
|
|
163
97
|
const childItems = [];
|
|
@@ -174,7 +108,7 @@ var Forest = class {
|
|
|
174
108
|
}
|
|
175
109
|
}
|
|
176
110
|
childNodes.push(await buildLevel(level - 1, rangeBegin, to));
|
|
177
|
-
return
|
|
111
|
+
return this.#makeNode(level, childItems, childNodes);
|
|
178
112
|
};
|
|
179
113
|
const maxLevel = Math.max(...items.map((item) => item.level));
|
|
180
114
|
const root = await buildLevel(maxLevel, 0, items.length);
|
|
@@ -182,7 +116,7 @@ var Forest = class {
|
|
|
182
116
|
}
|
|
183
117
|
async get(root, key) {
|
|
184
118
|
const keyLevel = await getKeyLevel(key);
|
|
185
|
-
let node =
|
|
119
|
+
let node = this.#nodes.get(root);
|
|
186
120
|
if (node !== void 0 && node.level < keyLevel) {
|
|
187
121
|
return {
|
|
188
122
|
kind: "missing"
|
|
@@ -205,7 +139,7 @@ var Forest = class {
|
|
|
205
139
|
let found = false;
|
|
206
140
|
for (let i = 0; i < node.items.length; i++) {
|
|
207
141
|
if (node.items[i].key > key) {
|
|
208
|
-
node =
|
|
142
|
+
node = this.#nodes.get(node.children[i]);
|
|
209
143
|
found = true;
|
|
210
144
|
break;
|
|
211
145
|
}
|
|
@@ -220,7 +154,7 @@ var Forest = class {
|
|
|
220
154
|
""
|
|
221
155
|
]
|
|
222
156
|
});
|
|
223
|
-
node =
|
|
157
|
+
node = this.#nodes.get(node.children[node.items.length]);
|
|
224
158
|
}
|
|
225
159
|
}
|
|
226
160
|
}
|
|
@@ -232,14 +166,14 @@ var Forest = class {
|
|
|
232
166
|
if (digest1 === digest2) {
|
|
233
167
|
return digest1;
|
|
234
168
|
}
|
|
235
|
-
const node1 =
|
|
236
|
-
const node2 =
|
|
169
|
+
const node1 = this.#requireNode(digest1);
|
|
170
|
+
const node2 = this.#requireNode(digest2);
|
|
237
171
|
if (node2.level < node1.level) {
|
|
238
|
-
return await this.merge(digest1, await
|
|
172
|
+
return await this.merge(digest1, await this.#makeNode(node2.level + 1, [], [
|
|
239
173
|
digest2
|
|
240
174
|
]), mergeFn);
|
|
241
175
|
} else if (node1.level < node2.level) {
|
|
242
|
-
return await this.merge(await
|
|
176
|
+
return await this.merge(await this.#makeNode(node1.level + 1, [], [
|
|
243
177
|
digest1
|
|
244
178
|
]), digest2, mergeFn);
|
|
245
179
|
}
|
|
@@ -312,7 +246,7 @@ var Forest = class {
|
|
|
312
246
|
if (node1.level > 0) {
|
|
313
247
|
resultChildren.push(await this.merge(child1, child2, mergeFn));
|
|
314
248
|
}
|
|
315
|
-
resultItems.push(await
|
|
249
|
+
resultItems.push(await this.#mergeItem(mergeFn, node1.items[i1], node2.items[i2]));
|
|
316
250
|
carry1 = null;
|
|
317
251
|
carry2 = null;
|
|
318
252
|
i1++;
|
|
@@ -327,9 +261,9 @@ var Forest = class {
|
|
|
327
261
|
""
|
|
328
262
|
]
|
|
329
263
|
});
|
|
330
|
-
resultItems.push(await
|
|
264
|
+
resultItems.push(await this.#mergeItem(mergeFn, null, node2.items[i2]));
|
|
331
265
|
if (node1.level > 0) {
|
|
332
|
-
const [left, right] = await
|
|
266
|
+
const [left, right] = await this.#splitAtKey(child1, key2);
|
|
333
267
|
resultChildren.push(await this.merge(left, child2, mergeFn));
|
|
334
268
|
carry1 = right;
|
|
335
269
|
carry2 = null;
|
|
@@ -345,9 +279,9 @@ var Forest = class {
|
|
|
345
279
|
""
|
|
346
280
|
]
|
|
347
281
|
});
|
|
348
|
-
resultItems.push(await
|
|
282
|
+
resultItems.push(await this.#mergeItem(mergeFn, node1.items[i1], null));
|
|
349
283
|
if (node1.level > 0) {
|
|
350
|
-
const [left, right] = await
|
|
284
|
+
const [left, right] = await this.#splitAtKey(child2, key1);
|
|
351
285
|
resultChildren.push(await this.merge(child1, left, mergeFn));
|
|
352
286
|
carry1 = null;
|
|
353
287
|
carry2 = right;
|
|
@@ -360,7 +294,7 @@ var Forest = class {
|
|
|
360
294
|
const child2 = carry2 !== null ? carry2 : node2.children[node2.items.length];
|
|
361
295
|
resultChildren.push(await this.merge(child1, child2, mergeFn));
|
|
362
296
|
}
|
|
363
|
-
return await
|
|
297
|
+
return await this.#makeNode(node1.level, resultItems, resultChildren);
|
|
364
298
|
}
|
|
365
299
|
async setBatch(root, pairs) {
|
|
366
300
|
const newTree = await this.createTree(pairs);
|
|
@@ -375,7 +309,7 @@ var Forest = class {
|
|
|
375
309
|
]);
|
|
376
310
|
}
|
|
377
311
|
*missingNodes(digest) {
|
|
378
|
-
const node =
|
|
312
|
+
const node = this.#nodes.get(digest);
|
|
379
313
|
if (!node) {
|
|
380
314
|
yield digest;
|
|
381
315
|
} else {
|
|
@@ -388,7 +322,7 @@ var Forest = class {
|
|
|
388
322
|
const result = [];
|
|
389
323
|
for (const node of nodes) {
|
|
390
324
|
const items = await Promise.all(node.items.map((item) => makeItem2(item.key, item.value)));
|
|
391
|
-
const { digest } = await
|
|
325
|
+
const { digest } = await makeNode(node.level, items, node.children);
|
|
392
326
|
invariant(digest === node.digest, void 0, {
|
|
393
327
|
F: __dxlog_file,
|
|
394
328
|
L: 218,
|
|
@@ -398,7 +332,7 @@ var Forest = class {
|
|
|
398
332
|
""
|
|
399
333
|
]
|
|
400
334
|
});
|
|
401
|
-
|
|
335
|
+
this.#nodes.set(node.digest, {
|
|
402
336
|
level: node.level,
|
|
403
337
|
digest: node.digest,
|
|
404
338
|
items,
|
|
@@ -411,7 +345,7 @@ var Forest = class {
|
|
|
411
345
|
async getNodes(digests) {
|
|
412
346
|
const result = [];
|
|
413
347
|
for (const digest of digests) {
|
|
414
|
-
const node =
|
|
348
|
+
const node = this.#nodes.get(digest);
|
|
415
349
|
if (!node) {
|
|
416
350
|
continue;
|
|
417
351
|
}
|
|
@@ -432,7 +366,7 @@ var Forest = class {
|
|
|
432
366
|
}
|
|
433
367
|
formatToString(digest, { pad = 0 } = {}) {
|
|
434
368
|
const padStr = " ".repeat(pad);
|
|
435
|
-
const node =
|
|
369
|
+
const node = this.#nodes.get(digest);
|
|
436
370
|
if (!node) {
|
|
437
371
|
return `${padStr} o (${digest.slice(0, 8)}) NOT AVAILABLE`;
|
|
438
372
|
}
|
|
@@ -458,7 +392,7 @@ var Forest = class {
|
|
|
458
392
|
* Items iterator ordered by key.
|
|
459
393
|
*/
|
|
460
394
|
*items(digest) {
|
|
461
|
-
const node =
|
|
395
|
+
const node = this.#requireNode(digest);
|
|
462
396
|
for (let i = 0; i < node.items.length; i++) {
|
|
463
397
|
if (node.level > 0) {
|
|
464
398
|
yield* this.items(node.children[i]);
|
|
@@ -469,163 +403,140 @@ var Forest = class {
|
|
|
469
403
|
yield* this.items(node.children[node.items.length]);
|
|
470
404
|
}
|
|
471
405
|
}
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
_define_property(this, "itemHashOps", 0);
|
|
482
|
-
_define_property(this, "nodeHashOps", 0);
|
|
483
|
-
_class_private_field_init(this, _emptyNodeCache, {
|
|
484
|
-
writable: true,
|
|
485
|
-
value: void 0
|
|
406
|
+
#requireNode(digest) {
|
|
407
|
+
invariant(validDigest(digest), void 0, {
|
|
408
|
+
F: __dxlog_file,
|
|
409
|
+
L: 295,
|
|
410
|
+
S: this,
|
|
411
|
+
A: [
|
|
412
|
+
"validDigest(digest)",
|
|
413
|
+
""
|
|
414
|
+
]
|
|
486
415
|
});
|
|
416
|
+
const node = this.#nodes.get(digest);
|
|
417
|
+
if (!node) {
|
|
418
|
+
throw new Error(`Node not available: ${digest}`);
|
|
419
|
+
}
|
|
420
|
+
return node;
|
|
487
421
|
}
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
if (!node) {
|
|
501
|
-
throw new Error(`Node not available: ${digest}`);
|
|
502
|
-
}
|
|
503
|
-
return node;
|
|
504
|
-
}
|
|
505
|
-
async function mergeItem(mergeFn, item1, item2) {
|
|
506
|
-
invariant(item1 !== null || item2 !== null, void 0, {
|
|
507
|
-
F: __dxlog_file,
|
|
508
|
-
L: 304,
|
|
509
|
-
S: this,
|
|
510
|
-
A: [
|
|
511
|
-
"item1 !== null || item2 !== null",
|
|
512
|
-
""
|
|
513
|
-
]
|
|
514
|
-
});
|
|
515
|
-
const key = item1?.key ?? item2?.key;
|
|
516
|
-
if (item1 !== null && item2 !== null && arraysEqual(item1.value, item2.value)) {
|
|
517
|
-
return item1;
|
|
518
|
-
} else {
|
|
519
|
-
const mergeResult = await mergeFn(key, item1?.value ?? null, item2?.value ?? null);
|
|
520
|
-
if (item1 !== null && arraysEqual(item1.value, mergeResult)) {
|
|
422
|
+
async #mergeItem(mergeFn, item1, item2) {
|
|
423
|
+
invariant(item1 !== null || item2 !== null, void 0, {
|
|
424
|
+
F: __dxlog_file,
|
|
425
|
+
L: 304,
|
|
426
|
+
S: this,
|
|
427
|
+
A: [
|
|
428
|
+
"item1 !== null || item2 !== null",
|
|
429
|
+
""
|
|
430
|
+
]
|
|
431
|
+
});
|
|
432
|
+
const key = item1?.key ?? item2?.key;
|
|
433
|
+
if (item1 !== null && item2 !== null && arraysEqual(item1.value, item2.value)) {
|
|
521
434
|
return item1;
|
|
522
|
-
} else if (item2 !== null && arraysEqual(item2.value, mergeResult)) {
|
|
523
|
-
return item2;
|
|
524
435
|
} else {
|
|
525
|
-
|
|
526
|
-
|
|
436
|
+
const mergeResult = await mergeFn(key, item1?.value ?? null, item2?.value ?? null);
|
|
437
|
+
if (item1 !== null && arraysEqual(item1.value, mergeResult)) {
|
|
438
|
+
return item1;
|
|
439
|
+
} else if (item2 !== null && arraysEqual(item2.value, mergeResult)) {
|
|
440
|
+
return item2;
|
|
441
|
+
} else {
|
|
442
|
+
this.itemHashOps++;
|
|
443
|
+
return await makeItem2(key, mergeResult);
|
|
444
|
+
}
|
|
527
445
|
}
|
|
528
446
|
}
|
|
529
|
-
|
|
530
|
-
async
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
}
|
|
547
|
-
if (!_class_private_field_get(this, _nodes).has(node.digest)) {
|
|
548
|
-
_class_private_field_get(this, _nodes).set(node.digest, node);
|
|
549
|
-
}
|
|
550
|
-
return node.digest;
|
|
551
|
-
}
|
|
552
|
-
async function splitAtKey(digest, key) {
|
|
553
|
-
const node = _class_private_method_get(this, _requireNode, requireNode).call(this, digest);
|
|
554
|
-
let splitIndex = node.items.length;
|
|
555
|
-
for (let i = 0; i < node.items.length; i++) {
|
|
556
|
-
if (node.items[i].key === key) {
|
|
557
|
-
return [
|
|
558
|
-
await _class_private_method_get(this, _makeNode, makeNode).call(this, node.level, node.items.slice(0, i), node.children.slice(0, i + 1)),
|
|
559
|
-
await _class_private_method_get(this, _makeNode, makeNode).call(this, node.level, node.items.slice(i + 1), node.children.slice(i + 2))
|
|
560
|
-
];
|
|
447
|
+
#emptyNodeCache = void 0;
|
|
448
|
+
async #makeNode(level, items, children) {
|
|
449
|
+
invariant(level > 0 ? items.length + 1 === children.length : children.length === 0, void 0, {
|
|
450
|
+
F: __dxlog_file,
|
|
451
|
+
L: 328,
|
|
452
|
+
S: this,
|
|
453
|
+
A: [
|
|
454
|
+
"level > 0 ? items.length + 1 === children.length : children.length === 0",
|
|
455
|
+
""
|
|
456
|
+
]
|
|
457
|
+
});
|
|
458
|
+
let node;
|
|
459
|
+
if (level === 0 && items.length === 0) {
|
|
460
|
+
node = await (this.#emptyNodeCache ??= makeNode(0, [], []));
|
|
461
|
+
} else {
|
|
462
|
+
node = await makeNode(level, items, children);
|
|
463
|
+
this.nodeHashOps++;
|
|
561
464
|
}
|
|
562
|
-
if (node.
|
|
563
|
-
|
|
564
|
-
break;
|
|
465
|
+
if (!this.#nodes.has(node.digest)) {
|
|
466
|
+
this.#nodes.set(node.digest, node);
|
|
565
467
|
}
|
|
468
|
+
return node.digest;
|
|
566
469
|
}
|
|
567
|
-
|
|
568
|
-
|
|
470
|
+
async #splitAtKey(digest, key) {
|
|
471
|
+
const node = this.#requireNode(digest);
|
|
472
|
+
let splitIndex = node.items.length;
|
|
473
|
+
for (let i = 0; i < node.items.length; i++) {
|
|
474
|
+
if (node.items[i].key === key) {
|
|
475
|
+
return [
|
|
476
|
+
await this.#makeNode(node.level, node.items.slice(0, i), node.children.slice(0, i + 1)),
|
|
477
|
+
await this.#makeNode(node.level, node.items.slice(i + 1), node.children.slice(i + 2))
|
|
478
|
+
];
|
|
479
|
+
}
|
|
480
|
+
if (node.items[i].key > key) {
|
|
481
|
+
splitIndex = i;
|
|
482
|
+
break;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
if (node.level === 0) {
|
|
486
|
+
if (splitIndex === 0) {
|
|
487
|
+
return [
|
|
488
|
+
await this.#makeNode(0, [], []),
|
|
489
|
+
digest
|
|
490
|
+
];
|
|
491
|
+
} else if (splitIndex === node.items.length) {
|
|
492
|
+
return [
|
|
493
|
+
digest,
|
|
494
|
+
await this.#makeNode(0, [], [])
|
|
495
|
+
];
|
|
496
|
+
}
|
|
569
497
|
return [
|
|
570
|
-
await
|
|
571
|
-
|
|
498
|
+
await this.#makeNode(node.level, node.items.slice(0, splitIndex), []),
|
|
499
|
+
await this.#makeNode(node.level, node.items.slice(splitIndex), [])
|
|
572
500
|
];
|
|
573
|
-
} else
|
|
501
|
+
} else {
|
|
502
|
+
const [left, right] = await this.#splitAtKey(node.children[splitIndex], key);
|
|
574
503
|
return [
|
|
575
|
-
|
|
576
|
-
|
|
504
|
+
await this.#makeNode(node.level, node.items.slice(0, splitIndex), [
|
|
505
|
+
...node.children.slice(0, splitIndex),
|
|
506
|
+
left
|
|
507
|
+
]),
|
|
508
|
+
await this.#makeNode(node.level, node.items.slice(splitIndex), [
|
|
509
|
+
right,
|
|
510
|
+
...node.children.slice(splitIndex + 1)
|
|
511
|
+
])
|
|
577
512
|
];
|
|
578
513
|
}
|
|
579
|
-
return [
|
|
580
|
-
await _class_private_method_get(this, _makeNode, makeNode).call(this, node.level, node.items.slice(0, splitIndex), []),
|
|
581
|
-
await _class_private_method_get(this, _makeNode, makeNode).call(this, node.level, node.items.slice(splitIndex), [])
|
|
582
|
-
];
|
|
583
|
-
} else {
|
|
584
|
-
const [left, right] = await _class_private_method_get(this, _splitAtKey, splitAtKey).call(this, node.children[splitIndex], key);
|
|
585
|
-
return [
|
|
586
|
-
await _class_private_method_get(this, _makeNode, makeNode).call(this, node.level, node.items.slice(0, splitIndex), [
|
|
587
|
-
...node.children.slice(0, splitIndex),
|
|
588
|
-
left
|
|
589
|
-
]),
|
|
590
|
-
await _class_private_method_get(this, _makeNode, makeNode).call(this, node.level, node.items.slice(splitIndex), [
|
|
591
|
-
right,
|
|
592
|
-
...node.children.slice(splitIndex + 1)
|
|
593
|
-
])
|
|
594
|
-
];
|
|
595
514
|
}
|
|
596
|
-
}
|
|
597
|
-
var _forest = /* @__PURE__ */ new WeakMap();
|
|
598
|
-
var _root = /* @__PURE__ */ new WeakMap();
|
|
515
|
+
};
|
|
599
516
|
var TreeMut = class {
|
|
517
|
+
#forest;
|
|
518
|
+
#root;
|
|
519
|
+
constructor(forest, root) {
|
|
520
|
+
this.#forest = forest;
|
|
521
|
+
this.#root = root;
|
|
522
|
+
}
|
|
600
523
|
get root() {
|
|
601
|
-
return
|
|
524
|
+
return this.#root;
|
|
602
525
|
}
|
|
603
526
|
async get(key) {
|
|
604
|
-
return
|
|
527
|
+
return this.#forest.get(this.#root, key);
|
|
605
528
|
}
|
|
606
529
|
async setBatch(pairs) {
|
|
607
|
-
|
|
530
|
+
this.#root = await this.#forest.setBatch(this.#root, pairs);
|
|
608
531
|
}
|
|
609
532
|
async set(key, value) {
|
|
610
|
-
|
|
533
|
+
this.#root = await this.#forest.set(this.#root, key, value);
|
|
611
534
|
}
|
|
612
535
|
items() {
|
|
613
|
-
return
|
|
614
|
-
}
|
|
615
|
-
constructor(forest, root) {
|
|
616
|
-
_class_private_field_init(this, _forest, {
|
|
617
|
-
writable: true,
|
|
618
|
-
value: void 0
|
|
619
|
-
});
|
|
620
|
-
_class_private_field_init(this, _root, {
|
|
621
|
-
writable: true,
|
|
622
|
-
value: void 0
|
|
623
|
-
});
|
|
624
|
-
_class_private_field_set(this, _forest, forest);
|
|
625
|
-
_class_private_field_set(this, _root, root);
|
|
536
|
+
return this.#forest.items(this.root);
|
|
626
537
|
}
|
|
627
538
|
};
|
|
628
|
-
var
|
|
539
|
+
var makeNode = async (level, items, children) => {
|
|
629
540
|
invariant(level > 0 ? items.length + 1 === children.length : children.length === 0, void 0, {
|
|
630
541
|
F: __dxlog_file,
|
|
631
542
|
L: 479,
|
|
@@ -696,88 +607,37 @@ var textEncoder2 = new TextEncoder();
|
|
|
696
607
|
var validDigest = (digest) => typeof digest === "string" && digest.length > 0;
|
|
697
608
|
|
|
698
609
|
// src/lww-tree.ts
|
|
699
|
-
function _check_private_redeclaration2(obj, privateCollection) {
|
|
700
|
-
if (privateCollection.has(obj)) {
|
|
701
|
-
throw new TypeError("Cannot initialize the same private elements twice on an object");
|
|
702
|
-
}
|
|
703
|
-
}
|
|
704
|
-
function _class_apply_descriptor_get2(receiver, descriptor) {
|
|
705
|
-
if (descriptor.get) {
|
|
706
|
-
return descriptor.get.call(receiver);
|
|
707
|
-
}
|
|
708
|
-
return descriptor.value;
|
|
709
|
-
}
|
|
710
|
-
function _class_apply_descriptor_set2(receiver, descriptor, value) {
|
|
711
|
-
if (descriptor.set) {
|
|
712
|
-
descriptor.set.call(receiver, value);
|
|
713
|
-
} else {
|
|
714
|
-
if (!descriptor.writable) {
|
|
715
|
-
throw new TypeError("attempted to set read only private field");
|
|
716
|
-
}
|
|
717
|
-
descriptor.value = value;
|
|
718
|
-
}
|
|
719
|
-
}
|
|
720
|
-
function _class_extract_field_descriptor2(receiver, privateMap, action) {
|
|
721
|
-
if (!privateMap.has(receiver)) {
|
|
722
|
-
throw new TypeError("attempted to " + action + " private field on non-instance");
|
|
723
|
-
}
|
|
724
|
-
return privateMap.get(receiver);
|
|
725
|
-
}
|
|
726
|
-
function _class_private_field_get2(receiver, privateMap) {
|
|
727
|
-
var descriptor = _class_extract_field_descriptor2(receiver, privateMap, "get");
|
|
728
|
-
return _class_apply_descriptor_get2(receiver, descriptor);
|
|
729
|
-
}
|
|
730
|
-
function _class_private_field_init2(obj, privateMap, value) {
|
|
731
|
-
_check_private_redeclaration2(obj, privateMap);
|
|
732
|
-
privateMap.set(obj, value);
|
|
733
|
-
}
|
|
734
|
-
function _class_private_field_set2(receiver, privateMap, value) {
|
|
735
|
-
var descriptor = _class_extract_field_descriptor2(receiver, privateMap, "set");
|
|
736
|
-
_class_apply_descriptor_set2(receiver, descriptor, value);
|
|
737
|
-
return value;
|
|
738
|
-
}
|
|
739
|
-
function _class_private_method_get2(receiver, privateSet, fn) {
|
|
740
|
-
if (!privateSet.has(receiver)) {
|
|
741
|
-
throw new TypeError("attempted to get private field on non-instance");
|
|
742
|
-
}
|
|
743
|
-
return fn;
|
|
744
|
-
}
|
|
745
|
-
function _class_private_method_init2(obj, privateSet) {
|
|
746
|
-
_check_private_redeclaration2(obj, privateSet);
|
|
747
|
-
privateSet.add(obj);
|
|
748
|
-
}
|
|
749
|
-
var _actor = /* @__PURE__ */ new WeakMap();
|
|
750
|
-
var _forest2 = /* @__PURE__ */ new WeakMap();
|
|
751
|
-
var _currentRoot = /* @__PURE__ */ new WeakMap();
|
|
752
|
-
var _getData = /* @__PURE__ */ new WeakSet();
|
|
753
|
-
var _merge = /* @__PURE__ */ new WeakSet();
|
|
754
|
-
var _decode = /* @__PURE__ */ new WeakSet();
|
|
755
|
-
var _encode = /* @__PURE__ */ new WeakSet();
|
|
756
610
|
var LWWTree = class _LWWTree {
|
|
757
611
|
static async new(params) {
|
|
758
612
|
const tree = new _LWWTree(params);
|
|
759
|
-
|
|
613
|
+
tree.#currentRoot = await tree.#forest.createTree([]);
|
|
760
614
|
return tree;
|
|
761
615
|
}
|
|
616
|
+
#actor;
|
|
617
|
+
#forest = new Forest();
|
|
618
|
+
#currentRoot;
|
|
762
619
|
get currentRoot() {
|
|
763
|
-
return
|
|
620
|
+
return this.#currentRoot;
|
|
621
|
+
}
|
|
622
|
+
constructor(params) {
|
|
623
|
+
this.#actor = params.actor;
|
|
764
624
|
}
|
|
765
625
|
async get(key) {
|
|
766
|
-
const data = await
|
|
626
|
+
const data = await this.#getData(key);
|
|
767
627
|
return data?.value;
|
|
768
628
|
}
|
|
769
629
|
async setBatch(pairs) {
|
|
770
|
-
const prevDataBatch = await Promise.all(pairs.map(([key]) =>
|
|
630
|
+
const prevDataBatch = await Promise.all(pairs.map(([key]) => this.#getData(key)));
|
|
771
631
|
const updates = pairs.map(([key, value], i) => {
|
|
772
632
|
const prevData = prevDataBatch[i];
|
|
773
633
|
const newClock = !prevData ? [
|
|
774
|
-
|
|
634
|
+
this.#actor,
|
|
775
635
|
0
|
|
776
636
|
] : [
|
|
777
|
-
|
|
637
|
+
this.#actor,
|
|
778
638
|
prevData.clock[1] + 1
|
|
779
639
|
];
|
|
780
|
-
const data =
|
|
640
|
+
const data = this.#encode({
|
|
781
641
|
clock: newClock,
|
|
782
642
|
value
|
|
783
643
|
});
|
|
@@ -786,7 +646,7 @@ var LWWTree = class _LWWTree {
|
|
|
786
646
|
data
|
|
787
647
|
];
|
|
788
648
|
});
|
|
789
|
-
|
|
649
|
+
this.#currentRoot = await this.#forest.setBatch(this.#currentRoot, updates);
|
|
790
650
|
}
|
|
791
651
|
async set(key, value) {
|
|
792
652
|
await this.setBatch([
|
|
@@ -797,25 +657,25 @@ var LWWTree = class _LWWTree {
|
|
|
797
657
|
]);
|
|
798
658
|
}
|
|
799
659
|
async receiveSyncMessage(state, message) {
|
|
800
|
-
await
|
|
660
|
+
await this.#forest.insertNodes(message.nodes);
|
|
801
661
|
const remoteRoot = message.root ?? state.remoteRoot;
|
|
802
662
|
if (remoteRoot !== null) {
|
|
803
663
|
const missing = [
|
|
804
|
-
...await
|
|
664
|
+
...await this.#forest.missingNodes(remoteRoot)
|
|
805
665
|
];
|
|
806
666
|
if (missing.length === 0) {
|
|
807
|
-
|
|
667
|
+
this.#currentRoot = await this.#forest.merge(remoteRoot, this.#currentRoot, this.#merge.bind(this));
|
|
808
668
|
} else if (state.remoteRoot !== null && state.remoteRoot !== remoteRoot) {
|
|
809
669
|
const missingFromPrevRoot = [
|
|
810
|
-
...await
|
|
670
|
+
...await this.#forest.missingNodes(state.remoteRoot)
|
|
811
671
|
];
|
|
812
672
|
if (missingFromPrevRoot.length === 0) {
|
|
813
|
-
await
|
|
673
|
+
await this.#forest.merge(state.remoteRoot, this.#currentRoot, this.#merge.bind(this));
|
|
814
674
|
const missing2 = [
|
|
815
|
-
...await
|
|
675
|
+
...await this.#forest.missingNodes(remoteRoot)
|
|
816
676
|
];
|
|
817
677
|
if (missing2.length === 0) {
|
|
818
|
-
|
|
678
|
+
this.#currentRoot = await this.#forest.merge(remoteRoot, this.#currentRoot, this.#merge.bind(this));
|
|
819
679
|
}
|
|
820
680
|
}
|
|
821
681
|
}
|
|
@@ -827,15 +687,15 @@ var LWWTree = class _LWWTree {
|
|
|
827
687
|
};
|
|
828
688
|
}
|
|
829
689
|
async generateSyncMessage(state) {
|
|
830
|
-
if (state.remoteRoot ===
|
|
690
|
+
if (state.remoteRoot === this.#currentRoot && state.remoteWant.length === 0 && !state.needsAck) {
|
|
831
691
|
return [
|
|
832
692
|
state,
|
|
833
693
|
null
|
|
834
694
|
];
|
|
835
695
|
}
|
|
836
|
-
const nodes = await
|
|
696
|
+
const nodes = await this.#forest.getNodes(state.remoteWant);
|
|
837
697
|
const want = state.remoteRoot === null ? [] : [
|
|
838
|
-
...await
|
|
698
|
+
...await this.#forest.missingNodes(state.remoteRoot)
|
|
839
699
|
];
|
|
840
700
|
return [
|
|
841
701
|
{
|
|
@@ -844,70 +704,51 @@ var LWWTree = class _LWWTree {
|
|
|
844
704
|
needsAck: false
|
|
845
705
|
},
|
|
846
706
|
{
|
|
847
|
-
root:
|
|
707
|
+
root: this.#currentRoot,
|
|
848
708
|
want,
|
|
849
709
|
nodes
|
|
850
710
|
}
|
|
851
711
|
];
|
|
852
712
|
}
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
writable: true,
|
|
864
|
-
value: new Forest()
|
|
865
|
-
});
|
|
866
|
-
_class_private_field_init2(this, _currentRoot, {
|
|
867
|
-
writable: true,
|
|
868
|
-
value: void 0
|
|
869
|
-
});
|
|
870
|
-
_class_private_field_set2(this, _actor, params.actor);
|
|
871
|
-
}
|
|
872
|
-
};
|
|
873
|
-
async function getData(key) {
|
|
874
|
-
const res = await _class_private_field_get2(this, _forest2).get(_class_private_field_get2(this, _currentRoot), key);
|
|
875
|
-
switch (res.kind) {
|
|
876
|
-
case "present": {
|
|
877
|
-
return _class_private_method_get2(this, _decode, decode).call(this, res.value);
|
|
713
|
+
async #getData(key) {
|
|
714
|
+
const res = await this.#forest.get(this.#currentRoot, key);
|
|
715
|
+
switch (res.kind) {
|
|
716
|
+
case "present": {
|
|
717
|
+
return this.#decode(res.value);
|
|
718
|
+
}
|
|
719
|
+
case "missing":
|
|
720
|
+
return void 0;
|
|
721
|
+
case "not-available":
|
|
722
|
+
throw new Error("Key not available");
|
|
878
723
|
}
|
|
879
|
-
case "missing":
|
|
880
|
-
return void 0;
|
|
881
|
-
case "not-available":
|
|
882
|
-
throw new Error("Key not available");
|
|
883
724
|
}
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
725
|
+
async #merge(key, left, right) {
|
|
726
|
+
if (!left) {
|
|
727
|
+
return right;
|
|
728
|
+
}
|
|
729
|
+
if (!right) {
|
|
730
|
+
return left;
|
|
731
|
+
}
|
|
732
|
+
const leftData = this.#decode(left);
|
|
733
|
+
const rightData = this.#decode(right);
|
|
734
|
+
const cmp = leftData.clock[1] === rightData.clock[1] ? leftData.clock[0].localeCompare(rightData.clock[0]) : leftData.clock[1] - rightData.clock[1];
|
|
735
|
+
if (cmp >= 0) {
|
|
736
|
+
return left;
|
|
737
|
+
} else {
|
|
738
|
+
return right;
|
|
739
|
+
}
|
|
888
740
|
}
|
|
889
|
-
|
|
890
|
-
return
|
|
741
|
+
#decode(value) {
|
|
742
|
+
return JSON.parse(textDecoder.decode(value));
|
|
891
743
|
}
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
return right;
|
|
744
|
+
#encode(data) {
|
|
745
|
+
const { clock, value } = data;
|
|
746
|
+
return textEncoder3.encode(JSON.stringify({
|
|
747
|
+
clock,
|
|
748
|
+
value
|
|
749
|
+
}));
|
|
899
750
|
}
|
|
900
|
-
}
|
|
901
|
-
function decode(value) {
|
|
902
|
-
return JSON.parse(textDecoder.decode(value));
|
|
903
|
-
}
|
|
904
|
-
function encode(data) {
|
|
905
|
-
const { clock, value } = data;
|
|
906
|
-
return textEncoder3.encode(JSON.stringify({
|
|
907
|
-
clock,
|
|
908
|
-
value
|
|
909
|
-
}));
|
|
910
|
-
}
|
|
751
|
+
};
|
|
911
752
|
var initLWWTreeSyncState = () => ({
|
|
912
753
|
remoteRoot: null,
|
|
913
754
|
remoteWant: [],
|
|
@@ -918,82 +759,33 @@ var textEncoder3 = new TextEncoder();
|
|
|
918
759
|
|
|
919
760
|
// src/mirror-multi-map.ts
|
|
920
761
|
import { arraysEqual as arraysEqual2 } from "@dxos/util";
|
|
921
|
-
function _check_private_redeclaration3(obj, privateCollection) {
|
|
922
|
-
if (privateCollection.has(obj)) {
|
|
923
|
-
throw new TypeError("Cannot initialize the same private elements twice on an object");
|
|
924
|
-
}
|
|
925
|
-
}
|
|
926
|
-
function _class_apply_descriptor_get3(receiver, descriptor) {
|
|
927
|
-
if (descriptor.get) {
|
|
928
|
-
return descriptor.get.call(receiver);
|
|
929
|
-
}
|
|
930
|
-
return descriptor.value;
|
|
931
|
-
}
|
|
932
|
-
function _class_apply_descriptor_set3(receiver, descriptor, value) {
|
|
933
|
-
if (descriptor.set) {
|
|
934
|
-
descriptor.set.call(receiver, value);
|
|
935
|
-
} else {
|
|
936
|
-
if (!descriptor.writable) {
|
|
937
|
-
throw new TypeError("attempted to set read only private field");
|
|
938
|
-
}
|
|
939
|
-
descriptor.value = value;
|
|
940
|
-
}
|
|
941
|
-
}
|
|
942
|
-
function _class_extract_field_descriptor3(receiver, privateMap, action) {
|
|
943
|
-
if (!privateMap.has(receiver)) {
|
|
944
|
-
throw new TypeError("attempted to " + action + " private field on non-instance");
|
|
945
|
-
}
|
|
946
|
-
return privateMap.get(receiver);
|
|
947
|
-
}
|
|
948
|
-
function _class_private_field_get3(receiver, privateMap) {
|
|
949
|
-
var descriptor = _class_extract_field_descriptor3(receiver, privateMap, "get");
|
|
950
|
-
return _class_apply_descriptor_get3(receiver, descriptor);
|
|
951
|
-
}
|
|
952
|
-
function _class_private_field_init3(obj, privateMap, value) {
|
|
953
|
-
_check_private_redeclaration3(obj, privateMap);
|
|
954
|
-
privateMap.set(obj, value);
|
|
955
|
-
}
|
|
956
|
-
function _class_private_field_set3(receiver, privateMap, value) {
|
|
957
|
-
var descriptor = _class_extract_field_descriptor3(receiver, privateMap, "set");
|
|
958
|
-
_class_apply_descriptor_set3(receiver, descriptor, value);
|
|
959
|
-
return value;
|
|
960
|
-
}
|
|
961
|
-
function _class_private_method_get3(receiver, privateSet, fn) {
|
|
962
|
-
if (!privateSet.has(receiver)) {
|
|
963
|
-
throw new TypeError("attempted to get private field on non-instance");
|
|
964
|
-
}
|
|
965
|
-
return fn;
|
|
966
|
-
}
|
|
967
|
-
function _class_private_method_init3(obj, privateSet) {
|
|
968
|
-
_check_private_redeclaration3(obj, privateSet);
|
|
969
|
-
privateSet.add(obj);
|
|
970
|
-
}
|
|
971
|
-
var _forest3 = /* @__PURE__ */ new WeakMap();
|
|
972
|
-
var _actor2 = /* @__PURE__ */ new WeakMap();
|
|
973
|
-
var _currentRoot2 = /* @__PURE__ */ new WeakMap();
|
|
974
|
-
var _remoteStates = /* @__PURE__ */ new WeakMap();
|
|
975
|
-
var _decode2 = /* @__PURE__ */ new WeakSet();
|
|
976
|
-
var _encode2 = /* @__PURE__ */ new WeakSet();
|
|
977
762
|
var MirrorMultiMap = class _MirrorMultiMap {
|
|
978
763
|
static async new(params) {
|
|
979
764
|
const tree = new _MirrorMultiMap(params);
|
|
980
|
-
|
|
765
|
+
tree.#currentRoot = await tree.#forest.createTree([]);
|
|
981
766
|
return tree;
|
|
982
767
|
}
|
|
768
|
+
#forest = new Forest();
|
|
769
|
+
#actor;
|
|
770
|
+
#currentRoot;
|
|
771
|
+
#remoteStates = /* @__PURE__ */ new Map();
|
|
772
|
+
constructor(params) {
|
|
773
|
+
this.#actor = params.actor;
|
|
774
|
+
}
|
|
983
775
|
get localActorId() {
|
|
984
|
-
return
|
|
776
|
+
return this.#actor;
|
|
985
777
|
}
|
|
986
778
|
get currentRoot() {
|
|
987
|
-
return
|
|
779
|
+
return this.#currentRoot;
|
|
988
780
|
}
|
|
989
781
|
get forest() {
|
|
990
|
-
return
|
|
782
|
+
return this.#forest;
|
|
991
783
|
}
|
|
992
784
|
async getLocal(key) {
|
|
993
|
-
const entry = await
|
|
785
|
+
const entry = await this.#forest.get(this.#currentRoot, key);
|
|
994
786
|
switch (entry?.kind) {
|
|
995
787
|
case "present":
|
|
996
|
-
return
|
|
788
|
+
return this.#decode(entry.value);
|
|
997
789
|
case "missing":
|
|
998
790
|
return void 0;
|
|
999
791
|
case "not-available":
|
|
@@ -1003,22 +795,22 @@ var MirrorMultiMap = class _MirrorMultiMap {
|
|
|
1003
795
|
async setLocalBatch(pairs) {
|
|
1004
796
|
const updates = pairs.map(([key, value]) => [
|
|
1005
797
|
key,
|
|
1006
|
-
|
|
798
|
+
this.#encode(value)
|
|
1007
799
|
]);
|
|
1008
|
-
|
|
800
|
+
this.#currentRoot = await this.#forest.setBatch(this.#currentRoot, updates);
|
|
1009
801
|
}
|
|
1010
802
|
async getFor(actorId, key) {
|
|
1011
|
-
const state =
|
|
803
|
+
const state = this.#remoteStates.get(actorId);
|
|
1012
804
|
if (!state) {
|
|
1013
805
|
throw new Error(`Unknown actorId: ${actorId}`);
|
|
1014
806
|
}
|
|
1015
807
|
if (!state.remoteRoot) {
|
|
1016
808
|
return void 0;
|
|
1017
809
|
}
|
|
1018
|
-
const entry = await
|
|
810
|
+
const entry = await this.#forest.get(state.remoteRoot, key);
|
|
1019
811
|
switch (entry?.kind) {
|
|
1020
812
|
case "present":
|
|
1021
|
-
return
|
|
813
|
+
return this.#decode(entry.value);
|
|
1022
814
|
case "missing":
|
|
1023
815
|
return void 0;
|
|
1024
816
|
case "not-available":
|
|
@@ -1026,14 +818,14 @@ var MirrorMultiMap = class _MirrorMultiMap {
|
|
|
1026
818
|
}
|
|
1027
819
|
}
|
|
1028
820
|
async setForBatch(actorId, pairs) {
|
|
1029
|
-
const remoteState =
|
|
821
|
+
const remoteState = this.#remoteStates.get(actorId) ?? initSyncState();
|
|
1030
822
|
const updates = pairs.map(([key, value]) => [
|
|
1031
823
|
key,
|
|
1032
|
-
|
|
824
|
+
this.#encode(value)
|
|
1033
825
|
]);
|
|
1034
|
-
const prevRoot = remoteState.remoteRoot ?? await
|
|
1035
|
-
const nextRoot = await
|
|
1036
|
-
|
|
826
|
+
const prevRoot = remoteState.remoteRoot ?? await this.#forest.createTree([]);
|
|
827
|
+
const nextRoot = await this.#forest.setBatch(prevRoot, updates);
|
|
828
|
+
this.#remoteStates.set(actorId, {
|
|
1037
829
|
remoteRoot: nextRoot,
|
|
1038
830
|
myRoot: null,
|
|
1039
831
|
remoteWant: remoteState.remoteWant,
|
|
@@ -1042,8 +834,8 @@ var MirrorMultiMap = class _MirrorMultiMap {
|
|
|
1042
834
|
}
|
|
1043
835
|
async getAll(key) {
|
|
1044
836
|
const result = /* @__PURE__ */ new Map();
|
|
1045
|
-
result.set(
|
|
1046
|
-
for (const [actorId, _state] of
|
|
837
|
+
result.set(this.#actor, await this.getLocal(key));
|
|
838
|
+
for (const [actorId, _state] of this.#remoteStates) {
|
|
1047
839
|
result.set(actorId, await this.getFor(actorId, key));
|
|
1048
840
|
}
|
|
1049
841
|
return result;
|
|
@@ -1051,20 +843,20 @@ var MirrorMultiMap = class _MirrorMultiMap {
|
|
|
1051
843
|
async getDifferent() {
|
|
1052
844
|
const resultByKey = /* @__PURE__ */ new Map();
|
|
1053
845
|
const actors = /* @__PURE__ */ new Set([
|
|
1054
|
-
|
|
1055
|
-
...
|
|
846
|
+
this.#actor,
|
|
847
|
+
...this.#remoteStates.keys()
|
|
1056
848
|
]);
|
|
1057
849
|
for (const actor of actors) {
|
|
1058
850
|
let root;
|
|
1059
|
-
if (actor ===
|
|
1060
|
-
root =
|
|
851
|
+
if (actor === this.#actor) {
|
|
852
|
+
root = this.#currentRoot;
|
|
1061
853
|
} else {
|
|
1062
|
-
root =
|
|
854
|
+
root = this.#remoteStates.get(actor)?.remoteRoot;
|
|
1063
855
|
}
|
|
1064
856
|
if (!root) {
|
|
1065
857
|
continue;
|
|
1066
858
|
}
|
|
1067
|
-
for (const item of
|
|
859
|
+
for (const item of this.#forest.items(root)) {
|
|
1068
860
|
let subMap = resultByKey.get(item.key);
|
|
1069
861
|
if (!subMap) {
|
|
1070
862
|
subMap = /* @__PURE__ */ new Map();
|
|
@@ -1088,7 +880,7 @@ var MirrorMultiMap = class _MirrorMultiMap {
|
|
|
1088
880
|
if (!allEqual) {
|
|
1089
881
|
const resultSubMap = /* @__PURE__ */ new Map();
|
|
1090
882
|
for (const [actorId, value] of subMap) {
|
|
1091
|
-
resultSubMap.set(actorId,
|
|
883
|
+
resultSubMap.set(actorId, this.#decode(value));
|
|
1092
884
|
}
|
|
1093
885
|
result.set(key, resultSubMap);
|
|
1094
886
|
}
|
|
@@ -1096,11 +888,11 @@ var MirrorMultiMap = class _MirrorMultiMap {
|
|
|
1096
888
|
return result;
|
|
1097
889
|
}
|
|
1098
890
|
clearActorState(actorId) {
|
|
1099
|
-
|
|
891
|
+
this.#remoteStates.delete(actorId);
|
|
1100
892
|
}
|
|
1101
893
|
async receiveSyncMessage(actorId, message) {
|
|
1102
|
-
await
|
|
1103
|
-
const state =
|
|
894
|
+
await this.#forest.insertNodes(message.nodes);
|
|
895
|
+
const state = this.#remoteStates.get(actorId) ?? initSyncState();
|
|
1104
896
|
const remoteRoot = message.root ?? state.remoteRoot;
|
|
1105
897
|
const newState = {
|
|
1106
898
|
remoteRoot,
|
|
@@ -1108,58 +900,37 @@ var MirrorMultiMap = class _MirrorMultiMap {
|
|
|
1108
900
|
remoteWant: message.want,
|
|
1109
901
|
needsAck: message.nodes.length > 0
|
|
1110
902
|
};
|
|
1111
|
-
|
|
903
|
+
this.#remoteStates.set(actorId, newState);
|
|
1112
904
|
}
|
|
1113
905
|
async generateSyncMessage(actorId) {
|
|
1114
|
-
const state =
|
|
1115
|
-
if (state.myRoot ===
|
|
906
|
+
const state = this.#remoteStates.get(actorId) ?? initSyncState();
|
|
907
|
+
if (state.myRoot === this.#currentRoot && state.remoteWant.length === 0 && !state.needsAck) {
|
|
1116
908
|
return null;
|
|
1117
909
|
}
|
|
1118
|
-
const nodes = await
|
|
910
|
+
const nodes = await this.#forest.getNodes(state.remoteWant);
|
|
1119
911
|
const want = state.remoteRoot === null ? [] : [
|
|
1120
|
-
...await
|
|
912
|
+
...await this.#forest.missingNodes(state.remoteRoot)
|
|
1121
913
|
];
|
|
1122
|
-
|
|
914
|
+
this.#remoteStates.set(actorId, {
|
|
1123
915
|
remoteRoot: state.remoteRoot,
|
|
1124
916
|
myRoot: state.myRoot,
|
|
1125
917
|
remoteWant: state.remoteWant,
|
|
1126
918
|
needsAck: false
|
|
1127
919
|
});
|
|
1128
920
|
return {
|
|
1129
|
-
root:
|
|
921
|
+
root: this.#currentRoot,
|
|
1130
922
|
remoteRoot: state.remoteRoot,
|
|
1131
923
|
want,
|
|
1132
924
|
nodes
|
|
1133
925
|
};
|
|
1134
926
|
}
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
value: new Forest()
|
|
1141
|
-
});
|
|
1142
|
-
_class_private_field_init3(this, _actor2, {
|
|
1143
|
-
writable: true,
|
|
1144
|
-
value: void 0
|
|
1145
|
-
});
|
|
1146
|
-
_class_private_field_init3(this, _currentRoot2, {
|
|
1147
|
-
writable: true,
|
|
1148
|
-
value: void 0
|
|
1149
|
-
});
|
|
1150
|
-
_class_private_field_init3(this, _remoteStates, {
|
|
1151
|
-
writable: true,
|
|
1152
|
-
value: /* @__PURE__ */ new Map()
|
|
1153
|
-
});
|
|
1154
|
-
_class_private_field_set3(this, _actor2, params.actor);
|
|
927
|
+
#decode(value) {
|
|
928
|
+
return JSON.parse(textDecoder2.decode(value));
|
|
929
|
+
}
|
|
930
|
+
#encode(data) {
|
|
931
|
+
return textEncoder4.encode(JSON.stringify(data));
|
|
1155
932
|
}
|
|
1156
933
|
};
|
|
1157
|
-
function decode2(value) {
|
|
1158
|
-
return JSON.parse(textDecoder2.decode(value));
|
|
1159
|
-
}
|
|
1160
|
-
function encode2(data) {
|
|
1161
|
-
return textEncoder4.encode(JSON.stringify(data));
|
|
1162
|
-
}
|
|
1163
934
|
var initSyncState = () => ({
|
|
1164
935
|
remoteRoot: null,
|
|
1165
936
|
myRoot: null,
|