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