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