@dxos/merkle-search-tree 0.8.4-main.84f28bd → 0.8.4-main.a4bbb77
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 +467 -242
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +467 -242
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/lww-tree.d.ts.map +1 -1
- package/dist/types/src/mirror-multi-map.d.ts +1 -1
- package/dist/types/src/mirror-multi-map.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -3
- package/src/forest.test.ts +1 -1
- package/src/lww-tree.test.ts +1 -1
- package/src/lww-tree.ts +1 -1
- package/src/mirror-multi-map.test.ts +1 -0
- package/src/mirror-multi-map.ts +1 -1
|
@@ -61,15 +61,77 @@ 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
|
+
}
|
|
64
127
|
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();
|
|
65
134
|
var Forest = class {
|
|
66
|
-
constructor() {
|
|
67
|
-
this.#nodes = /* @__PURE__ */ new Map();
|
|
68
|
-
this.itemHashOps = 0;
|
|
69
|
-
this.nodeHashOps = 0;
|
|
70
|
-
this.#emptyNodeCache = void 0;
|
|
71
|
-
}
|
|
72
|
-
#nodes;
|
|
73
135
|
async createTree(pairs) {
|
|
74
136
|
const items = await Promise.all([
|
|
75
137
|
...pairs
|
|
@@ -82,7 +144,7 @@ var Forest = class {
|
|
|
82
144
|
}
|
|
83
145
|
}
|
|
84
146
|
if (items.length === 0) {
|
|
85
|
-
return this
|
|
147
|
+
return _class_private_method_get(this, _makeNode, makeNode).call(this, 0, [], []);
|
|
86
148
|
}
|
|
87
149
|
const buildLevel = async (level, from, to) => {
|
|
88
150
|
invariant(level >= 0, void 0, {
|
|
@@ -95,7 +157,7 @@ var Forest = class {
|
|
|
95
157
|
]
|
|
96
158
|
});
|
|
97
159
|
if (level === 0) {
|
|
98
|
-
return this
|
|
160
|
+
return _class_private_method_get(this, _makeNode, makeNode).call(this, 0, items.slice(from, to), []);
|
|
99
161
|
}
|
|
100
162
|
let rangeBegin = from;
|
|
101
163
|
const childItems = [];
|
|
@@ -112,7 +174,7 @@ var Forest = class {
|
|
|
112
174
|
}
|
|
113
175
|
}
|
|
114
176
|
childNodes.push(await buildLevel(level - 1, rangeBegin, to));
|
|
115
|
-
return this
|
|
177
|
+
return _class_private_method_get(this, _makeNode, makeNode).call(this, level, childItems, childNodes);
|
|
116
178
|
};
|
|
117
179
|
const maxLevel = Math.max(...items.map((item) => item.level));
|
|
118
180
|
const root = await buildLevel(maxLevel, 0, items.length);
|
|
@@ -120,7 +182,7 @@ var Forest = class {
|
|
|
120
182
|
}
|
|
121
183
|
async get(root, key) {
|
|
122
184
|
const keyLevel = await getKeyLevel(key);
|
|
123
|
-
let node = this
|
|
185
|
+
let node = _class_private_field_get(this, _nodes).get(root);
|
|
124
186
|
if (node !== void 0 && node.level < keyLevel) {
|
|
125
187
|
return {
|
|
126
188
|
kind: "missing"
|
|
@@ -143,7 +205,7 @@ var Forest = class {
|
|
|
143
205
|
let found = false;
|
|
144
206
|
for (let i = 0; i < node.items.length; i++) {
|
|
145
207
|
if (node.items[i].key > key) {
|
|
146
|
-
node = this
|
|
208
|
+
node = _class_private_field_get(this, _nodes).get(node.children[i]);
|
|
147
209
|
found = true;
|
|
148
210
|
break;
|
|
149
211
|
}
|
|
@@ -158,7 +220,7 @@ var Forest = class {
|
|
|
158
220
|
""
|
|
159
221
|
]
|
|
160
222
|
});
|
|
161
|
-
node = this
|
|
223
|
+
node = _class_private_field_get(this, _nodes).get(node.children[node.items.length]);
|
|
162
224
|
}
|
|
163
225
|
}
|
|
164
226
|
}
|
|
@@ -170,14 +232,14 @@ var Forest = class {
|
|
|
170
232
|
if (digest1 === digest2) {
|
|
171
233
|
return digest1;
|
|
172
234
|
}
|
|
173
|
-
const node1 = this
|
|
174
|
-
const node2 = this
|
|
235
|
+
const node1 = _class_private_method_get(this, _requireNode, requireNode).call(this, digest1);
|
|
236
|
+
const node2 = _class_private_method_get(this, _requireNode, requireNode).call(this, digest2);
|
|
175
237
|
if (node2.level < node1.level) {
|
|
176
|
-
return await this.merge(digest1, await this
|
|
238
|
+
return await this.merge(digest1, await _class_private_method_get(this, _makeNode, makeNode).call(this, node2.level + 1, [], [
|
|
177
239
|
digest2
|
|
178
240
|
]), mergeFn);
|
|
179
241
|
} else if (node1.level < node2.level) {
|
|
180
|
-
return await this.merge(await this
|
|
242
|
+
return await this.merge(await _class_private_method_get(this, _makeNode, makeNode).call(this, node1.level + 1, [], [
|
|
181
243
|
digest1
|
|
182
244
|
]), digest2, mergeFn);
|
|
183
245
|
}
|
|
@@ -250,7 +312,7 @@ var Forest = class {
|
|
|
250
312
|
if (node1.level > 0) {
|
|
251
313
|
resultChildren.push(await this.merge(child1, child2, mergeFn));
|
|
252
314
|
}
|
|
253
|
-
resultItems.push(await this
|
|
315
|
+
resultItems.push(await _class_private_method_get(this, _mergeItem, mergeItem).call(this, mergeFn, node1.items[i1], node2.items[i2]));
|
|
254
316
|
carry1 = null;
|
|
255
317
|
carry2 = null;
|
|
256
318
|
i1++;
|
|
@@ -265,9 +327,9 @@ var Forest = class {
|
|
|
265
327
|
""
|
|
266
328
|
]
|
|
267
329
|
});
|
|
268
|
-
resultItems.push(await this
|
|
330
|
+
resultItems.push(await _class_private_method_get(this, _mergeItem, mergeItem).call(this, mergeFn, null, node2.items[i2]));
|
|
269
331
|
if (node1.level > 0) {
|
|
270
|
-
const [left, right] = await this
|
|
332
|
+
const [left, right] = await _class_private_method_get(this, _splitAtKey, splitAtKey).call(this, child1, key2);
|
|
271
333
|
resultChildren.push(await this.merge(left, child2, mergeFn));
|
|
272
334
|
carry1 = right;
|
|
273
335
|
carry2 = null;
|
|
@@ -283,9 +345,9 @@ var Forest = class {
|
|
|
283
345
|
""
|
|
284
346
|
]
|
|
285
347
|
});
|
|
286
|
-
resultItems.push(await this
|
|
348
|
+
resultItems.push(await _class_private_method_get(this, _mergeItem, mergeItem).call(this, mergeFn, node1.items[i1], null));
|
|
287
349
|
if (node1.level > 0) {
|
|
288
|
-
const [left, right] = await this
|
|
350
|
+
const [left, right] = await _class_private_method_get(this, _splitAtKey, splitAtKey).call(this, child2, key1);
|
|
289
351
|
resultChildren.push(await this.merge(child1, left, mergeFn));
|
|
290
352
|
carry1 = null;
|
|
291
353
|
carry2 = right;
|
|
@@ -298,7 +360,7 @@ var Forest = class {
|
|
|
298
360
|
const child2 = carry2 !== null ? carry2 : node2.children[node2.items.length];
|
|
299
361
|
resultChildren.push(await this.merge(child1, child2, mergeFn));
|
|
300
362
|
}
|
|
301
|
-
return await this
|
|
363
|
+
return await _class_private_method_get(this, _makeNode, makeNode).call(this, node1.level, resultItems, resultChildren);
|
|
302
364
|
}
|
|
303
365
|
async setBatch(root, pairs) {
|
|
304
366
|
const newTree = await this.createTree(pairs);
|
|
@@ -313,7 +375,7 @@ var Forest = class {
|
|
|
313
375
|
]);
|
|
314
376
|
}
|
|
315
377
|
*missingNodes(digest) {
|
|
316
|
-
const node = this
|
|
378
|
+
const node = _class_private_field_get(this, _nodes).get(digest);
|
|
317
379
|
if (!node) {
|
|
318
380
|
yield digest;
|
|
319
381
|
} else {
|
|
@@ -326,7 +388,7 @@ var Forest = class {
|
|
|
326
388
|
const result = [];
|
|
327
389
|
for (const node of nodes) {
|
|
328
390
|
const items = await Promise.all(node.items.map((item) => makeItem2(item.key, item.value)));
|
|
329
|
-
const { digest } = await
|
|
391
|
+
const { digest } = await makeNode1(node.level, items, node.children);
|
|
330
392
|
invariant(digest === node.digest, void 0, {
|
|
331
393
|
F: __dxlog_file,
|
|
332
394
|
L: 218,
|
|
@@ -336,7 +398,7 @@ var Forest = class {
|
|
|
336
398
|
""
|
|
337
399
|
]
|
|
338
400
|
});
|
|
339
|
-
this
|
|
401
|
+
_class_private_field_get(this, _nodes).set(node.digest, {
|
|
340
402
|
level: node.level,
|
|
341
403
|
digest: node.digest,
|
|
342
404
|
items,
|
|
@@ -349,7 +411,7 @@ var Forest = class {
|
|
|
349
411
|
async getNodes(digests) {
|
|
350
412
|
const result = [];
|
|
351
413
|
for (const digest of digests) {
|
|
352
|
-
const node = this
|
|
414
|
+
const node = _class_private_field_get(this, _nodes).get(digest);
|
|
353
415
|
if (!node) {
|
|
354
416
|
continue;
|
|
355
417
|
}
|
|
@@ -370,7 +432,7 @@ var Forest = class {
|
|
|
370
432
|
}
|
|
371
433
|
formatToString(digest, { pad = 0 } = {}) {
|
|
372
434
|
const padStr = " ".repeat(pad);
|
|
373
|
-
const node = this
|
|
435
|
+
const node = _class_private_field_get(this, _nodes).get(digest);
|
|
374
436
|
if (!node) {
|
|
375
437
|
return `${padStr} o (${digest.slice(0, 8)}) NOT AVAILABLE`;
|
|
376
438
|
}
|
|
@@ -396,7 +458,7 @@ var Forest = class {
|
|
|
396
458
|
* Items iterator ordered by key.
|
|
397
459
|
*/
|
|
398
460
|
*items(digest) {
|
|
399
|
-
const node = this
|
|
461
|
+
const node = _class_private_method_get(this, _requireNode, requireNode).call(this, digest);
|
|
400
462
|
for (let i = 0; i < node.items.length; i++) {
|
|
401
463
|
if (node.level > 0) {
|
|
402
464
|
yield* this.items(node.children[i]);
|
|
@@ -407,140 +469,163 @@ var Forest = class {
|
|
|
407
469
|
yield* this.items(node.children[node.items.length]);
|
|
408
470
|
}
|
|
409
471
|
}
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
]
|
|
472
|
+
constructor() {
|
|
473
|
+
_class_private_method_init(this, _requireNode);
|
|
474
|
+
_class_private_method_init(this, _mergeItem);
|
|
475
|
+
_class_private_method_init(this, _makeNode);
|
|
476
|
+
_class_private_method_init(this, _splitAtKey);
|
|
477
|
+
_class_private_field_init(this, _nodes, {
|
|
478
|
+
writable: true,
|
|
479
|
+
value: /* @__PURE__ */ new Map()
|
|
419
480
|
});
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
}
|
|
426
|
-
async #mergeItem(mergeFn, item1, item2) {
|
|
427
|
-
invariant(item1 !== null || item2 !== null, void 0, {
|
|
428
|
-
F: __dxlog_file,
|
|
429
|
-
L: 304,
|
|
430
|
-
S: this,
|
|
431
|
-
A: [
|
|
432
|
-
"item1 !== null || item2 !== null",
|
|
433
|
-
""
|
|
434
|
-
]
|
|
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
|
|
435
486
|
});
|
|
436
|
-
|
|
437
|
-
|
|
487
|
+
}
|
|
488
|
+
};
|
|
489
|
+
function requireNode(digest) {
|
|
490
|
+
invariant(validDigest(digest), void 0, {
|
|
491
|
+
F: __dxlog_file,
|
|
492
|
+
L: 295,
|
|
493
|
+
S: this,
|
|
494
|
+
A: [
|
|
495
|
+
"validDigest(digest)",
|
|
496
|
+
""
|
|
497
|
+
]
|
|
498
|
+
});
|
|
499
|
+
const node = _class_private_field_get(this, _nodes).get(digest);
|
|
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)) {
|
|
438
521
|
return item1;
|
|
522
|
+
} else if (item2 !== null && arraysEqual(item2.value, mergeResult)) {
|
|
523
|
+
return item2;
|
|
439
524
|
} else {
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
return item1;
|
|
443
|
-
} else if (item2 !== null && arraysEqual(item2.value, mergeResult)) {
|
|
444
|
-
return item2;
|
|
445
|
-
} else {
|
|
446
|
-
this.itemHashOps++;
|
|
447
|
-
return await makeItem2(key, mergeResult);
|
|
448
|
-
}
|
|
525
|
+
this.itemHashOps++;
|
|
526
|
+
return await makeItem2(key, mergeResult);
|
|
449
527
|
}
|
|
450
528
|
}
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
529
|
+
}
|
|
530
|
+
async function makeNode(level, items, children) {
|
|
531
|
+
invariant(level > 0 ? items.length + 1 === children.length : children.length === 0, void 0, {
|
|
532
|
+
F: __dxlog_file,
|
|
533
|
+
L: 328,
|
|
534
|
+
S: this,
|
|
535
|
+
A: [
|
|
536
|
+
"level > 0 ? items.length + 1 === children.length : children.length === 0",
|
|
537
|
+
""
|
|
538
|
+
]
|
|
539
|
+
});
|
|
540
|
+
let node;
|
|
541
|
+
if (level === 0 && items.length === 0) {
|
|
542
|
+
node = await _class_private_field_set(this, _emptyNodeCache, _class_private_field_get(this, _emptyNodeCache) ?? makeNode1(0, [], []));
|
|
543
|
+
} else {
|
|
544
|
+
node = await makeNode1(level, items, children);
|
|
545
|
+
this.nodeHashOps++;
|
|
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
|
+
];
|
|
468
561
|
}
|
|
469
|
-
if (
|
|
470
|
-
|
|
562
|
+
if (node.items[i].key > key) {
|
|
563
|
+
splitIndex = i;
|
|
564
|
+
break;
|
|
471
565
|
}
|
|
472
|
-
return node.digest;
|
|
473
566
|
}
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
let splitIndex = node.items.length;
|
|
477
|
-
for (let i = 0; i < node.items.length; i++) {
|
|
478
|
-
if (node.items[i].key === key) {
|
|
479
|
-
return [
|
|
480
|
-
await this.#makeNode(node.level, node.items.slice(0, i), node.children.slice(0, i + 1)),
|
|
481
|
-
await this.#makeNode(node.level, node.items.slice(i + 1), node.children.slice(i + 2))
|
|
482
|
-
];
|
|
483
|
-
}
|
|
484
|
-
if (node.items[i].key > key) {
|
|
485
|
-
splitIndex = i;
|
|
486
|
-
break;
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
if (node.level === 0) {
|
|
490
|
-
if (splitIndex === 0) {
|
|
491
|
-
return [
|
|
492
|
-
await this.#makeNode(0, [], []),
|
|
493
|
-
digest
|
|
494
|
-
];
|
|
495
|
-
} else if (splitIndex === node.items.length) {
|
|
496
|
-
return [
|
|
497
|
-
digest,
|
|
498
|
-
await this.#makeNode(0, [], [])
|
|
499
|
-
];
|
|
500
|
-
}
|
|
567
|
+
if (node.level === 0) {
|
|
568
|
+
if (splitIndex === 0) {
|
|
501
569
|
return [
|
|
502
|
-
await this
|
|
503
|
-
|
|
570
|
+
await _class_private_method_get(this, _makeNode, makeNode).call(this, 0, [], []),
|
|
571
|
+
digest
|
|
504
572
|
];
|
|
505
|
-
} else {
|
|
506
|
-
const [left, right] = await this.#splitAtKey(node.children[splitIndex], key);
|
|
573
|
+
} else if (splitIndex === node.items.length) {
|
|
507
574
|
return [
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
left
|
|
511
|
-
]),
|
|
512
|
-
await this.#makeNode(node.level, node.items.slice(splitIndex), [
|
|
513
|
-
right,
|
|
514
|
-
...node.children.slice(splitIndex + 1)
|
|
515
|
-
])
|
|
575
|
+
digest,
|
|
576
|
+
await _class_private_method_get(this, _makeNode, makeNode).call(this, 0, [], [])
|
|
516
577
|
];
|
|
517
578
|
}
|
|
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
|
+
];
|
|
518
595
|
}
|
|
519
|
-
}
|
|
596
|
+
}
|
|
597
|
+
var _forest = /* @__PURE__ */ new WeakMap();
|
|
598
|
+
var _root = /* @__PURE__ */ new WeakMap();
|
|
520
599
|
var TreeMut = class {
|
|
521
|
-
#forest;
|
|
522
|
-
#root;
|
|
523
|
-
constructor(forest, root) {
|
|
524
|
-
this.#forest = forest;
|
|
525
|
-
this.#root = root;
|
|
526
|
-
}
|
|
527
600
|
get root() {
|
|
528
|
-
return this
|
|
601
|
+
return _class_private_field_get(this, _root);
|
|
529
602
|
}
|
|
530
603
|
async get(key) {
|
|
531
|
-
return this
|
|
604
|
+
return _class_private_field_get(this, _forest).get(_class_private_field_get(this, _root), key);
|
|
532
605
|
}
|
|
533
606
|
async setBatch(pairs) {
|
|
534
|
-
this
|
|
607
|
+
_class_private_field_set(this, _root, await _class_private_field_get(this, _forest).setBatch(_class_private_field_get(this, _root), pairs));
|
|
535
608
|
}
|
|
536
609
|
async set(key, value) {
|
|
537
|
-
this
|
|
610
|
+
_class_private_field_set(this, _root, await _class_private_field_get(this, _forest).set(_class_private_field_get(this, _root), key, value));
|
|
538
611
|
}
|
|
539
612
|
items() {
|
|
540
|
-
return this
|
|
613
|
+
return _class_private_field_get(this, _forest).items(this.root);
|
|
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);
|
|
541
626
|
}
|
|
542
627
|
};
|
|
543
|
-
var
|
|
628
|
+
var makeNode1 = async (level, items, children) => {
|
|
544
629
|
invariant(level > 0 ? items.length + 1 === children.length : children.length === 0, void 0, {
|
|
545
630
|
F: __dxlog_file,
|
|
546
631
|
L: 479,
|
|
@@ -611,37 +696,88 @@ var textEncoder2 = new TextEncoder();
|
|
|
611
696
|
var validDigest = (digest) => typeof digest === "string" && digest.length > 0;
|
|
612
697
|
|
|
613
698
|
// 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();
|
|
614
756
|
var LWWTree = class _LWWTree {
|
|
615
757
|
static async new(params) {
|
|
616
758
|
const tree = new _LWWTree(params);
|
|
617
|
-
tree
|
|
759
|
+
_class_private_field_set2(tree, _currentRoot, await _class_private_field_get2(tree, _forest2).createTree([]));
|
|
618
760
|
return tree;
|
|
619
761
|
}
|
|
620
|
-
#actor;
|
|
621
|
-
#forest = new Forest();
|
|
622
|
-
#currentRoot;
|
|
623
762
|
get currentRoot() {
|
|
624
|
-
return this
|
|
625
|
-
}
|
|
626
|
-
constructor(params) {
|
|
627
|
-
this.#actor = params.actor;
|
|
763
|
+
return _class_private_field_get2(this, _currentRoot);
|
|
628
764
|
}
|
|
629
765
|
async get(key) {
|
|
630
|
-
const data = await this
|
|
766
|
+
const data = await _class_private_method_get2(this, _getData, getData).call(this, key);
|
|
631
767
|
return data?.value;
|
|
632
768
|
}
|
|
633
769
|
async setBatch(pairs) {
|
|
634
|
-
const prevDataBatch = await Promise.all(pairs.map(([key]) => this
|
|
770
|
+
const prevDataBatch = await Promise.all(pairs.map(([key]) => _class_private_method_get2(this, _getData, getData).call(this, key)));
|
|
635
771
|
const updates = pairs.map(([key, value], i) => {
|
|
636
772
|
const prevData = prevDataBatch[i];
|
|
637
773
|
const newClock = !prevData ? [
|
|
638
|
-
this
|
|
774
|
+
_class_private_field_get2(this, _actor),
|
|
639
775
|
0
|
|
640
776
|
] : [
|
|
641
|
-
this
|
|
777
|
+
_class_private_field_get2(this, _actor),
|
|
642
778
|
prevData.clock[1] + 1
|
|
643
779
|
];
|
|
644
|
-
const data = this
|
|
780
|
+
const data = _class_private_method_get2(this, _encode, encode).call(this, {
|
|
645
781
|
clock: newClock,
|
|
646
782
|
value
|
|
647
783
|
});
|
|
@@ -650,7 +786,7 @@ var LWWTree = class _LWWTree {
|
|
|
650
786
|
data
|
|
651
787
|
];
|
|
652
788
|
});
|
|
653
|
-
this
|
|
789
|
+
_class_private_field_set2(this, _currentRoot, await _class_private_field_get2(this, _forest2).setBatch(_class_private_field_get2(this, _currentRoot), updates));
|
|
654
790
|
}
|
|
655
791
|
async set(key, value) {
|
|
656
792
|
await this.setBatch([
|
|
@@ -661,25 +797,25 @@ var LWWTree = class _LWWTree {
|
|
|
661
797
|
]);
|
|
662
798
|
}
|
|
663
799
|
async receiveSyncMessage(state, message) {
|
|
664
|
-
await this
|
|
800
|
+
await _class_private_field_get2(this, _forest2).insertNodes(message.nodes);
|
|
665
801
|
const remoteRoot = message.root ?? state.remoteRoot;
|
|
666
802
|
if (remoteRoot !== null) {
|
|
667
803
|
const missing = [
|
|
668
|
-
...await this
|
|
804
|
+
...await _class_private_field_get2(this, _forest2).missingNodes(remoteRoot)
|
|
669
805
|
];
|
|
670
806
|
if (missing.length === 0) {
|
|
671
|
-
this
|
|
807
|
+
_class_private_field_set2(this, _currentRoot, await _class_private_field_get2(this, _forest2).merge(remoteRoot, _class_private_field_get2(this, _currentRoot), _class_private_method_get2(this, _merge, merge).bind(this)));
|
|
672
808
|
} else if (state.remoteRoot !== null && state.remoteRoot !== remoteRoot) {
|
|
673
809
|
const missingFromPrevRoot = [
|
|
674
|
-
...await this
|
|
810
|
+
...await _class_private_field_get2(this, _forest2).missingNodes(state.remoteRoot)
|
|
675
811
|
];
|
|
676
812
|
if (missingFromPrevRoot.length === 0) {
|
|
677
|
-
await this
|
|
813
|
+
await _class_private_field_get2(this, _forest2).merge(state.remoteRoot, _class_private_field_get2(this, _currentRoot), _class_private_method_get2(this, _merge, merge).bind(this));
|
|
678
814
|
const missing2 = [
|
|
679
|
-
...await this
|
|
815
|
+
...await _class_private_field_get2(this, _forest2).missingNodes(remoteRoot)
|
|
680
816
|
];
|
|
681
817
|
if (missing2.length === 0) {
|
|
682
|
-
this
|
|
818
|
+
_class_private_field_set2(this, _currentRoot, await _class_private_field_get2(this, _forest2).merge(remoteRoot, _class_private_field_get2(this, _currentRoot), _class_private_method_get2(this, _merge, merge).bind(this)));
|
|
683
819
|
}
|
|
684
820
|
}
|
|
685
821
|
}
|
|
@@ -691,15 +827,15 @@ var LWWTree = class _LWWTree {
|
|
|
691
827
|
};
|
|
692
828
|
}
|
|
693
829
|
async generateSyncMessage(state) {
|
|
694
|
-
if (state.remoteRoot === this
|
|
830
|
+
if (state.remoteRoot === _class_private_field_get2(this, _currentRoot) && state.remoteWant.length === 0 && !state.needsAck) {
|
|
695
831
|
return [
|
|
696
832
|
state,
|
|
697
833
|
null
|
|
698
834
|
];
|
|
699
835
|
}
|
|
700
|
-
const nodes = await this
|
|
836
|
+
const nodes = await _class_private_field_get2(this, _forest2).getNodes(state.remoteWant);
|
|
701
837
|
const want = state.remoteRoot === null ? [] : [
|
|
702
|
-
...await this
|
|
838
|
+
...await _class_private_field_get2(this, _forest2).missingNodes(state.remoteRoot)
|
|
703
839
|
];
|
|
704
840
|
return [
|
|
705
841
|
{
|
|
@@ -708,51 +844,70 @@ var LWWTree = class _LWWTree {
|
|
|
708
844
|
needsAck: false
|
|
709
845
|
},
|
|
710
846
|
{
|
|
711
|
-
root: this
|
|
847
|
+
root: _class_private_field_get2(this, _currentRoot),
|
|
712
848
|
want,
|
|
713
849
|
nodes
|
|
714
850
|
}
|
|
715
851
|
];
|
|
716
852
|
}
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
853
|
+
constructor(params) {
|
|
854
|
+
_class_private_method_init2(this, _getData);
|
|
855
|
+
_class_private_method_init2(this, _merge);
|
|
856
|
+
_class_private_method_init2(this, _decode);
|
|
857
|
+
_class_private_method_init2(this, _encode);
|
|
858
|
+
_class_private_field_init2(this, _actor, {
|
|
859
|
+
writable: true,
|
|
860
|
+
value: void 0
|
|
861
|
+
});
|
|
862
|
+
_class_private_field_init2(this, _forest2, {
|
|
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);
|
|
728
871
|
}
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
return
|
|
735
|
-
}
|
|
736
|
-
const leftData = this.#decode(left);
|
|
737
|
-
const rightData = this.#decode(right);
|
|
738
|
-
const cmp = leftData.clock[1] === rightData.clock[1] ? leftData.clock[0].localeCompare(rightData.clock[0]) : leftData.clock[1] - rightData.clock[1];
|
|
739
|
-
if (cmp >= 0) {
|
|
740
|
-
return left;
|
|
741
|
-
} else {
|
|
742
|
-
return right;
|
|
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);
|
|
743
878
|
}
|
|
879
|
+
case "missing":
|
|
880
|
+
return void 0;
|
|
881
|
+
case "not-available":
|
|
882
|
+
throw new Error("Key not available");
|
|
744
883
|
}
|
|
745
|
-
|
|
746
|
-
|
|
884
|
+
}
|
|
885
|
+
async function merge(key, left, right) {
|
|
886
|
+
if (!left) {
|
|
887
|
+
return right;
|
|
747
888
|
}
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
return textEncoder3.encode(JSON.stringify({
|
|
751
|
-
clock,
|
|
752
|
-
value
|
|
753
|
-
}));
|
|
889
|
+
if (!right) {
|
|
890
|
+
return left;
|
|
754
891
|
}
|
|
755
|
-
|
|
892
|
+
const leftData = _class_private_method_get2(this, _decode, decode).call(this, left);
|
|
893
|
+
const rightData = _class_private_method_get2(this, _decode, decode).call(this, right);
|
|
894
|
+
const cmp = leftData.clock[1] === rightData.clock[1] ? leftData.clock[0].localeCompare(rightData.clock[0]) : leftData.clock[1] - rightData.clock[1];
|
|
895
|
+
if (cmp >= 0) {
|
|
896
|
+
return left;
|
|
897
|
+
} else {
|
|
898
|
+
return right;
|
|
899
|
+
}
|
|
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
|
+
}
|
|
756
911
|
var initLWWTreeSyncState = () => ({
|
|
757
912
|
remoteRoot: null,
|
|
758
913
|
remoteWant: [],
|
|
@@ -763,33 +918,82 @@ var textEncoder3 = new TextEncoder();
|
|
|
763
918
|
|
|
764
919
|
// src/mirror-multi-map.ts
|
|
765
920
|
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();
|
|
766
977
|
var MirrorMultiMap = class _MirrorMultiMap {
|
|
767
978
|
static async new(params) {
|
|
768
979
|
const tree = new _MirrorMultiMap(params);
|
|
769
|
-
tree
|
|
980
|
+
_class_private_field_set3(tree, _currentRoot2, await _class_private_field_get3(tree, _forest3).createTree([]));
|
|
770
981
|
return tree;
|
|
771
982
|
}
|
|
772
|
-
#forest = new Forest();
|
|
773
|
-
#actor;
|
|
774
|
-
#currentRoot;
|
|
775
|
-
#remoteStates = /* @__PURE__ */ new Map();
|
|
776
|
-
constructor(params) {
|
|
777
|
-
this.#actor = params.actor;
|
|
778
|
-
}
|
|
779
983
|
get localActorId() {
|
|
780
|
-
return this
|
|
984
|
+
return _class_private_field_get3(this, _actor2);
|
|
781
985
|
}
|
|
782
986
|
get currentRoot() {
|
|
783
|
-
return this
|
|
987
|
+
return _class_private_field_get3(this, _currentRoot2);
|
|
784
988
|
}
|
|
785
989
|
get forest() {
|
|
786
|
-
return this
|
|
990
|
+
return _class_private_field_get3(this, _forest3);
|
|
787
991
|
}
|
|
788
992
|
async getLocal(key) {
|
|
789
|
-
const entry = await this
|
|
993
|
+
const entry = await _class_private_field_get3(this, _forest3).get(_class_private_field_get3(this, _currentRoot2), key);
|
|
790
994
|
switch (entry?.kind) {
|
|
791
995
|
case "present":
|
|
792
|
-
return this
|
|
996
|
+
return _class_private_method_get3(this, _decode2, decode2).call(this, entry.value);
|
|
793
997
|
case "missing":
|
|
794
998
|
return void 0;
|
|
795
999
|
case "not-available":
|
|
@@ -799,22 +1003,22 @@ var MirrorMultiMap = class _MirrorMultiMap {
|
|
|
799
1003
|
async setLocalBatch(pairs) {
|
|
800
1004
|
const updates = pairs.map(([key, value]) => [
|
|
801
1005
|
key,
|
|
802
|
-
this
|
|
1006
|
+
_class_private_method_get3(this, _encode2, encode2).call(this, value)
|
|
803
1007
|
]);
|
|
804
|
-
this
|
|
1008
|
+
_class_private_field_set3(this, _currentRoot2, await _class_private_field_get3(this, _forest3).setBatch(_class_private_field_get3(this, _currentRoot2), updates));
|
|
805
1009
|
}
|
|
806
1010
|
async getFor(actorId, key) {
|
|
807
|
-
const state = this
|
|
1011
|
+
const state = _class_private_field_get3(this, _remoteStates).get(actorId);
|
|
808
1012
|
if (!state) {
|
|
809
1013
|
throw new Error(`Unknown actorId: ${actorId}`);
|
|
810
1014
|
}
|
|
811
1015
|
if (!state.remoteRoot) {
|
|
812
1016
|
return void 0;
|
|
813
1017
|
}
|
|
814
|
-
const entry = await this
|
|
1018
|
+
const entry = await _class_private_field_get3(this, _forest3).get(state.remoteRoot, key);
|
|
815
1019
|
switch (entry?.kind) {
|
|
816
1020
|
case "present":
|
|
817
|
-
return this
|
|
1021
|
+
return _class_private_method_get3(this, _decode2, decode2).call(this, entry.value);
|
|
818
1022
|
case "missing":
|
|
819
1023
|
return void 0;
|
|
820
1024
|
case "not-available":
|
|
@@ -822,14 +1026,14 @@ var MirrorMultiMap = class _MirrorMultiMap {
|
|
|
822
1026
|
}
|
|
823
1027
|
}
|
|
824
1028
|
async setForBatch(actorId, pairs) {
|
|
825
|
-
const remoteState = this
|
|
1029
|
+
const remoteState = _class_private_field_get3(this, _remoteStates).get(actorId) ?? initSyncState();
|
|
826
1030
|
const updates = pairs.map(([key, value]) => [
|
|
827
1031
|
key,
|
|
828
|
-
this
|
|
1032
|
+
_class_private_method_get3(this, _encode2, encode2).call(this, value)
|
|
829
1033
|
]);
|
|
830
|
-
const prevRoot = remoteState.remoteRoot ?? await this
|
|
831
|
-
const nextRoot = await this
|
|
832
|
-
this
|
|
1034
|
+
const prevRoot = remoteState.remoteRoot ?? await _class_private_field_get3(this, _forest3).createTree([]);
|
|
1035
|
+
const nextRoot = await _class_private_field_get3(this, _forest3).setBatch(prevRoot, updates);
|
|
1036
|
+
_class_private_field_get3(this, _remoteStates).set(actorId, {
|
|
833
1037
|
remoteRoot: nextRoot,
|
|
834
1038
|
myRoot: null,
|
|
835
1039
|
remoteWant: remoteState.remoteWant,
|
|
@@ -838,8 +1042,8 @@ var MirrorMultiMap = class _MirrorMultiMap {
|
|
|
838
1042
|
}
|
|
839
1043
|
async getAll(key) {
|
|
840
1044
|
const result = /* @__PURE__ */ new Map();
|
|
841
|
-
result.set(this
|
|
842
|
-
for (const [actorId, _state] of this
|
|
1045
|
+
result.set(_class_private_field_get3(this, _actor2), await this.getLocal(key));
|
|
1046
|
+
for (const [actorId, _state] of _class_private_field_get3(this, _remoteStates)) {
|
|
843
1047
|
result.set(actorId, await this.getFor(actorId, key));
|
|
844
1048
|
}
|
|
845
1049
|
return result;
|
|
@@ -847,20 +1051,20 @@ var MirrorMultiMap = class _MirrorMultiMap {
|
|
|
847
1051
|
async getDifferent() {
|
|
848
1052
|
const resultByKey = /* @__PURE__ */ new Map();
|
|
849
1053
|
const actors = /* @__PURE__ */ new Set([
|
|
850
|
-
this
|
|
851
|
-
...this
|
|
1054
|
+
_class_private_field_get3(this, _actor2),
|
|
1055
|
+
..._class_private_field_get3(this, _remoteStates).keys()
|
|
852
1056
|
]);
|
|
853
1057
|
for (const actor of actors) {
|
|
854
1058
|
let root;
|
|
855
|
-
if (actor === this
|
|
856
|
-
root = this
|
|
1059
|
+
if (actor === _class_private_field_get3(this, _actor2)) {
|
|
1060
|
+
root = _class_private_field_get3(this, _currentRoot2);
|
|
857
1061
|
} else {
|
|
858
|
-
root = this
|
|
1062
|
+
root = _class_private_field_get3(this, _remoteStates).get(actor)?.remoteRoot;
|
|
859
1063
|
}
|
|
860
1064
|
if (!root) {
|
|
861
1065
|
continue;
|
|
862
1066
|
}
|
|
863
|
-
for (const item of this
|
|
1067
|
+
for (const item of _class_private_field_get3(this, _forest3).items(root)) {
|
|
864
1068
|
let subMap = resultByKey.get(item.key);
|
|
865
1069
|
if (!subMap) {
|
|
866
1070
|
subMap = /* @__PURE__ */ new Map();
|
|
@@ -884,7 +1088,7 @@ var MirrorMultiMap = class _MirrorMultiMap {
|
|
|
884
1088
|
if (!allEqual) {
|
|
885
1089
|
const resultSubMap = /* @__PURE__ */ new Map();
|
|
886
1090
|
for (const [actorId, value] of subMap) {
|
|
887
|
-
resultSubMap.set(actorId, this
|
|
1091
|
+
resultSubMap.set(actorId, _class_private_method_get3(this, _decode2, decode2).call(this, value));
|
|
888
1092
|
}
|
|
889
1093
|
result.set(key, resultSubMap);
|
|
890
1094
|
}
|
|
@@ -892,11 +1096,11 @@ var MirrorMultiMap = class _MirrorMultiMap {
|
|
|
892
1096
|
return result;
|
|
893
1097
|
}
|
|
894
1098
|
clearActorState(actorId) {
|
|
895
|
-
this
|
|
1099
|
+
_class_private_field_get3(this, _remoteStates).delete(actorId);
|
|
896
1100
|
}
|
|
897
1101
|
async receiveSyncMessage(actorId, message) {
|
|
898
|
-
await this
|
|
899
|
-
const state = this
|
|
1102
|
+
await _class_private_field_get3(this, _forest3).insertNodes(message.nodes);
|
|
1103
|
+
const state = _class_private_field_get3(this, _remoteStates).get(actorId) ?? initSyncState();
|
|
900
1104
|
const remoteRoot = message.root ?? state.remoteRoot;
|
|
901
1105
|
const newState = {
|
|
902
1106
|
remoteRoot,
|
|
@@ -904,37 +1108,58 @@ var MirrorMultiMap = class _MirrorMultiMap {
|
|
|
904
1108
|
remoteWant: message.want,
|
|
905
1109
|
needsAck: message.nodes.length > 0
|
|
906
1110
|
};
|
|
907
|
-
this
|
|
1111
|
+
_class_private_field_get3(this, _remoteStates).set(actorId, newState);
|
|
908
1112
|
}
|
|
909
1113
|
async generateSyncMessage(actorId) {
|
|
910
|
-
const state = this
|
|
911
|
-
if (state.myRoot === this
|
|
1114
|
+
const state = _class_private_field_get3(this, _remoteStates).get(actorId) ?? initSyncState();
|
|
1115
|
+
if (state.myRoot === _class_private_field_get3(this, _currentRoot2) && state.remoteWant.length === 0 && !state.needsAck) {
|
|
912
1116
|
return null;
|
|
913
1117
|
}
|
|
914
|
-
const nodes = await this
|
|
1118
|
+
const nodes = await _class_private_field_get3(this, _forest3).getNodes(state.remoteWant);
|
|
915
1119
|
const want = state.remoteRoot === null ? [] : [
|
|
916
|
-
...await this
|
|
1120
|
+
...await _class_private_field_get3(this, _forest3).missingNodes(state.remoteRoot)
|
|
917
1121
|
];
|
|
918
|
-
this
|
|
1122
|
+
_class_private_field_get3(this, _remoteStates).set(actorId, {
|
|
919
1123
|
remoteRoot: state.remoteRoot,
|
|
920
1124
|
myRoot: state.myRoot,
|
|
921
1125
|
remoteWant: state.remoteWant,
|
|
922
1126
|
needsAck: false
|
|
923
1127
|
});
|
|
924
1128
|
return {
|
|
925
|
-
root: this
|
|
1129
|
+
root: _class_private_field_get3(this, _currentRoot2),
|
|
926
1130
|
remoteRoot: state.remoteRoot,
|
|
927
1131
|
want,
|
|
928
1132
|
nodes
|
|
929
1133
|
};
|
|
930
1134
|
}
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
1135
|
+
constructor(params) {
|
|
1136
|
+
_class_private_method_init3(this, _decode2);
|
|
1137
|
+
_class_private_method_init3(this, _encode2);
|
|
1138
|
+
_class_private_field_init3(this, _forest3, {
|
|
1139
|
+
writable: true,
|
|
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);
|
|
936
1155
|
}
|
|
937
1156
|
};
|
|
1157
|
+
function decode2(value) {
|
|
1158
|
+
return JSON.parse(textDecoder2.decode(value));
|
|
1159
|
+
}
|
|
1160
|
+
function encode2(data) {
|
|
1161
|
+
return textEncoder4.encode(JSON.stringify(data));
|
|
1162
|
+
}
|
|
938
1163
|
var initSyncState = () => ({
|
|
939
1164
|
remoteRoot: null,
|
|
940
1165
|
myRoot: null,
|