@peerbit/shared-log 8.0.7 → 9.0.0-55cebfe

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.
Files changed (79) hide show
  1. package/dist/benchmark/get-samples.d.ts +2 -0
  2. package/dist/benchmark/get-samples.d.ts.map +1 -0
  3. package/dist/benchmark/get-samples.js +69 -0
  4. package/dist/benchmark/get-samples.js.map +1 -0
  5. package/dist/benchmark/index.d.ts +2 -0
  6. package/dist/benchmark/index.d.ts.map +1 -0
  7. package/{lib/esm/__benchmark__ → dist/benchmark}/index.js +16 -16
  8. package/dist/benchmark/index.js.map +1 -0
  9. package/dist/benchmark/replication-prune.d.ts +2 -0
  10. package/dist/benchmark/replication-prune.d.ts.map +1 -0
  11. package/dist/benchmark/replication-prune.js +103 -0
  12. package/dist/benchmark/replication-prune.js.map +1 -0
  13. package/dist/benchmark/replication.d.ts +2 -0
  14. package/dist/benchmark/replication.d.ts.map +1 -0
  15. package/dist/benchmark/replication.js +91 -0
  16. package/dist/benchmark/replication.js.map +1 -0
  17. package/{lib/esm → dist/src}/blocks.d.ts +1 -0
  18. package/dist/src/blocks.d.ts.map +1 -0
  19. package/{lib/esm → dist/src}/blocks.js +1 -1
  20. package/dist/src/blocks.js.map +1 -0
  21. package/{lib/esm → dist/src}/cpu.d.ts +2 -1
  22. package/dist/src/cpu.d.ts.map +1 -0
  23. package/{lib/esm → dist/src}/cpu.js +2 -2
  24. package/dist/src/cpu.js.map +1 -0
  25. package/{lib/esm → dist/src}/exchange-heads.d.ts +2 -1
  26. package/dist/src/exchange-heads.d.ts.map +1 -0
  27. package/{lib/esm → dist/src}/exchange-heads.js +9 -7
  28. package/dist/src/exchange-heads.js.map +1 -0
  29. package/{lib/esm → dist/src}/index.d.ts +64 -54
  30. package/dist/src/index.d.ts.map +1 -0
  31. package/{lib/esm → dist/src}/index.js +569 -399
  32. package/dist/src/index.js.map +1 -0
  33. package/{lib/esm → dist/src}/message.d.ts +1 -0
  34. package/dist/src/message.d.ts.map +1 -0
  35. package/{lib/esm → dist/src}/pid.d.ts +1 -0
  36. package/dist/src/pid.d.ts.map +1 -0
  37. package/{lib/esm → dist/src}/pid.js +20 -20
  38. package/dist/src/pid.js.map +1 -0
  39. package/dist/src/ranges.d.ts +10 -0
  40. package/dist/src/ranges.d.ts.map +1 -0
  41. package/dist/src/ranges.js +645 -0
  42. package/dist/src/ranges.js.map +1 -0
  43. package/dist/src/replication.d.ts +112 -0
  44. package/dist/src/replication.d.ts.map +1 -0
  45. package/dist/src/replication.js +348 -0
  46. package/dist/src/replication.js.map +1 -0
  47. package/dist/src/role.d.ts +2 -0
  48. package/dist/src/role.d.ts.map +1 -0
  49. package/dist/src/role.js +106 -0
  50. package/dist/src/role.js.map +1 -0
  51. package/package.json +70 -43
  52. package/src/blocks.ts +1 -1
  53. package/src/cpu.ts +7 -6
  54. package/src/exchange-heads.ts +19 -19
  55. package/src/index.ts +881 -609
  56. package/src/pid.ts +22 -21
  57. package/src/ranges.ts +692 -148
  58. package/src/replication.ts +271 -19
  59. package/src/role.ts +63 -83
  60. package/LICENSE +0 -202
  61. package/lib/esm/__benchmark__/index.d.ts +0 -1
  62. package/lib/esm/__benchmark__/index.js.map +0 -1
  63. package/lib/esm/blocks.js.map +0 -1
  64. package/lib/esm/cpu.js.map +0 -1
  65. package/lib/esm/exchange-heads.js.map +0 -1
  66. package/lib/esm/index.js.map +0 -1
  67. package/lib/esm/pid.js.map +0 -1
  68. package/lib/esm/ranges.d.ts +0 -12
  69. package/lib/esm/ranges.js +0 -247
  70. package/lib/esm/ranges.js.map +0 -1
  71. package/lib/esm/replication.d.ts +0 -53
  72. package/lib/esm/replication.js +0 -105
  73. package/lib/esm/replication.js.map +0 -1
  74. package/lib/esm/role.d.ts +0 -38
  75. package/lib/esm/role.js +0 -130
  76. package/lib/esm/role.js.map +0 -1
  77. package/src/__benchmark__/index.ts +0 -115
  78. /package/{lib/esm → dist/src}/message.js +0 -0
  79. /package/{lib/esm → dist/src}/message.js.map +0 -0
@@ -0,0 +1,645 @@
1
+ import { equals } from "@peerbit/crypto";
2
+ import { And, Compare, IntegerCompare, Or, SearchRequest, Sort, SortDirection, StringMatch, iterate, iteratorInSeries, } from "@peerbit/indexer-interface";
3
+ import {} from "./replication.js";
4
+ import { SEGMENT_COORDINATE_SCALE } from "./role.js";
5
+ /*
6
+ export const containsPoint = (
7
+ rect: { offset: number; length: number },
8
+ point: number,
9
+ eps = 0.00001 // we do this to handle numerical errors
10
+ ) => {
11
+ if (rect.factor === 0) {
12
+ return false;
13
+ }
14
+ const start = rect.offset;
15
+ const width = rect.factor + eps; // we do this to handle numerical errors. It is better to be more inclusive
16
+ const endUnwrapped = rect.offset + width;
17
+ let end = endUnwrapped;
18
+ let wrapped = false;
19
+ if (endUnwrapped > 1) {
20
+ end = endUnwrapped % 1;
21
+ wrapped = true;
22
+ }
23
+
24
+ const inFirstInterval = point >= start && point < Math.min(endUnwrapped, 1);
25
+ const inSecondInterval =
26
+ !inFirstInterval && wrapped && point >= 0 && point < end;
27
+
28
+ return inFirstInterval || inSecondInterval;
29
+ }; */
30
+ /* const resolveRectsThatContainPoint = async (
31
+ rects: Index<ReplicationRangeIndexable>,
32
+ point: number,
33
+ roleAgeLimit: number,
34
+ matured: boolean
35
+ ): Promise<ReplicationRangeIndexable[]> => {
36
+ // point is between 0 and 1, and the range can start at any offset between 0 and 1 and have length between 0 and 1
37
+ // so we need to query for all ranges that contain the point
38
+ const scaledPoint = Math.round(point * SEGMENT_COORDINATE_SCALE)
39
+ let queries = [
40
+ new IntegerCompare({ key: 'start', compare: Compare.LessOrEqual, value: scaledPoint }),
41
+ new IntegerCompare({ key: 'end', compare: Compare.Greater, value: scaledPoint }),
42
+ new IntegerCompare({ key: 'timestamp', compare: matured ? Compare.LessOrEqual : Compare.Greater, value: Date.now() - roleAgeLimit })
43
+ ]
44
+
45
+ const results = await rects.query(new SearchRequest({
46
+ query: [
47
+ new Nested({
48
+ path: 'segments',
49
+ query: queries
50
+ })
51
+ ]
52
+ }))
53
+ return results.results.map(x => x.value)
54
+ } */
55
+ /* const resolveRectsInRange = async (rects: Index<ReplicationRangeIndexable>,
56
+ start: number,
57
+ end: number,
58
+ roleAgeLimit: number,
59
+ matured: boolean
60
+ ): Promise<ReplicationRangeIndexable[]> => {
61
+ // point is between 0 and 1, and the range can start at any offset between 0 and 1 and have length between 0 and 1
62
+ // so we need to query for all ranges that contain the point
63
+ let endScaled = Math.round(end * SEGMENT_COORDINATE_SCALE);
64
+ let startScaled = Math.round(start * SEGMENT_COORDINATE_SCALE);
65
+ let queries = [
66
+ new Or([
67
+ new And([
68
+ new IntegerCompare({ key: 'start1', compare: Compare.Less, value: endScaled }),
69
+ new IntegerCompare({ key: 'end1', compare: Compare.GreaterOrEqual, value: startScaled }),
70
+ ]),
71
+ new And([
72
+ new IntegerCompare({ key: 'start2', compare: Compare.Less, value: endScaled }),
73
+ new IntegerCompare({ key: 'end2', compare: Compare.GreaterOrEqual, value: startScaled }),
74
+ ])
75
+ ]),
76
+ new IntegerCompare({ key: 'timestamp', compare: matured ? Compare.LessOrEqual : Compare.Greater, value: BigInt(+new Date - roleAgeLimit) })
77
+ ]
78
+
79
+ const results = await rects.query(new SearchRequest({
80
+ query: queries,
81
+ sort: [new Sort({ key: "start1" }), new Sort({ key: "start2" })],
82
+ fetch: 0xffffffff
83
+ }))
84
+ return results.results.map(x => x.value)
85
+ } */
86
+ const containingPoint = (rects, point, roleAgeLimit, matured, now, options) => {
87
+ // point is between 0 and 1, and the range can start at any offset between 0 and 1 and have length between 0 and 1
88
+ // so we need to query for all ranges that contain the point
89
+ let pointScaled = Math.round(point * (options?.scaled ? 1 : SEGMENT_COORDINATE_SCALE));
90
+ let queries = [
91
+ new Or([
92
+ new And([
93
+ new IntegerCompare({
94
+ key: "start1",
95
+ compare: Compare.LessOrEqual,
96
+ value: pointScaled,
97
+ }),
98
+ new IntegerCompare({
99
+ key: "end1",
100
+ compare: Compare.Greater,
101
+ value: pointScaled,
102
+ }),
103
+ ]),
104
+ new And([
105
+ new IntegerCompare({
106
+ key: "start2",
107
+ compare: Compare.LessOrEqual,
108
+ value: pointScaled,
109
+ }),
110
+ new IntegerCompare({
111
+ key: "end2",
112
+ compare: Compare.Greater,
113
+ value: pointScaled,
114
+ }),
115
+ ]),
116
+ ]),
117
+ new IntegerCompare({
118
+ key: "timestamp",
119
+ compare: matured ? Compare.LessOrEqual : Compare.Greater,
120
+ value: BigInt(now - roleAgeLimit),
121
+ }),
122
+ ];
123
+ return iterate(rects, new SearchRequest({
124
+ query: queries,
125
+ sort: options?.sort,
126
+ fetch: 0xffffffff,
127
+ }));
128
+ /* const results = await rects.query(new SearchRequest({
129
+ query: queries,
130
+ sort: options?.sort,
131
+ fetch: 0xffffffff
132
+ }))
133
+ return results.results.map(x => x.value) */
134
+ };
135
+ const getClosest = (direction, rects, point, roleAgeLimit, matured, now, scaled = false) => {
136
+ const scaledPoint = Math.round(point * (scaled ? 1 : SEGMENT_COORDINATE_SCALE));
137
+ const createQueries = (p, equality) => {
138
+ let queries;
139
+ if (direction === "below") {
140
+ queries = [
141
+ new IntegerCompare({
142
+ key: "end2",
143
+ compare: equality ? Compare.LessOrEqual : Compare.Less,
144
+ value: p,
145
+ }),
146
+ new IntegerCompare({
147
+ key: "timestamp",
148
+ compare: matured ? Compare.LessOrEqual : Compare.GreaterOrEqual,
149
+ value: BigInt(now - roleAgeLimit),
150
+ }),
151
+ ];
152
+ }
153
+ else {
154
+ queries = [
155
+ new IntegerCompare({
156
+ key: "start1",
157
+ compare: equality ? Compare.GreaterOrEqual : Compare.Greater,
158
+ value: p,
159
+ }),
160
+ new IntegerCompare({
161
+ key: "timestamp",
162
+ compare: matured ? Compare.LessOrEqual : Compare.GreaterOrEqual,
163
+ value: BigInt(now - roleAgeLimit),
164
+ }),
165
+ ];
166
+ }
167
+ queries.push(new IntegerCompare({ key: "width", compare: Compare.Greater, value: 0 }));
168
+ return queries;
169
+ };
170
+ const iterator = iterate(rects, new SearchRequest({
171
+ query: createQueries(scaledPoint, false),
172
+ sort: direction === "below"
173
+ ? new Sort({ key: ["end2"], direction: "desc" })
174
+ : new Sort({ key: ["start1"], direction: "asc" }),
175
+ }));
176
+ const iteratorWrapped = iterate(rects, new SearchRequest({
177
+ query: createQueries(direction === "below" ? SEGMENT_COORDINATE_SCALE : 0, true),
178
+ sort: direction === "below"
179
+ ? new Sort({ key: ["end2"], direction: "desc" })
180
+ : new Sort({ key: ["start1"], direction: "asc" }),
181
+ }));
182
+ return joinIterator([iterator, iteratorWrapped], scaledPoint, true, direction);
183
+ };
184
+ export const getDistance = (from, to, direction, end = SEGMENT_COORDINATE_SCALE) => {
185
+ // if direction is 'above' only measure distance from 'from to 'to' from above.
186
+ // i.e if from < to, then from needs to wrap around 0 to 1 and then to to
187
+ // if direction is 'below' and from > to, then from needs to wrap around 1 to 0 and then to to
188
+ // if direction is 'closest' then the shortest distance is the distance
189
+ // also from is 0.1 and to is 0.9, then distance should be 0.2 not 0.8
190
+ // same as for if from is 0.9 and to is 0.1, then distance should be 0.2 not 0.8
191
+ if (direction === "closest") {
192
+ if (from === to) {
193
+ return 0;
194
+ }
195
+ return Math.min(Math.abs(from - to), Math.abs(end - Math.abs(from - to)));
196
+ }
197
+ if (direction === "above") {
198
+ if (from <= to) {
199
+ return Math.abs(end - to) + from;
200
+ }
201
+ return from - to;
202
+ }
203
+ if (direction === "below") {
204
+ if (from >= to) {
205
+ return Math.abs(end - from) + to;
206
+ }
207
+ return to - from;
208
+ }
209
+ throw new Error("Invalid direction");
210
+ };
211
+ const joinIterator = (iterators, point, scaled, direction) => {
212
+ const scaledPoint = Math.round(point * (scaled ? 1 : SEGMENT_COORDINATE_SCALE));
213
+ let queues = [];
214
+ return {
215
+ next: async (count) => {
216
+ let results = {
217
+ kept: 0, // TODO
218
+ results: [],
219
+ };
220
+ for (let i = 0; i < iterators.length; i++) {
221
+ let queue = queues[i];
222
+ if (!queue) {
223
+ queue = { elements: [], kept: 0 };
224
+ queues[i] = queue;
225
+ }
226
+ let iterator = iterators[i];
227
+ if (queue.elements.length < count && iterator.done() === false) {
228
+ let res = await iterator.next(count);
229
+ queue.kept = res.kept;
230
+ for (const el of res.results) {
231
+ const closest = el.value;
232
+ let dist;
233
+ if (direction === "closest") {
234
+ dist = Math.min(getDistance(closest.start1, scaledPoint, direction), getDistance(closest.end2, scaledPoint, direction));
235
+ }
236
+ else if (direction === "above") {
237
+ dist = getDistance(closest.start1, scaledPoint, direction);
238
+ }
239
+ else if (direction === "below") {
240
+ dist = getDistance(closest.end2, scaledPoint, direction);
241
+ }
242
+ else {
243
+ throw new Error("Invalid direction");
244
+ }
245
+ queue.elements.push({ result: el, dist });
246
+ }
247
+ }
248
+ }
249
+ // pull the 'count' the closest element from one of the queue
250
+ for (let i = 0; i < count; i++) {
251
+ let closestQueue = -1;
252
+ let closestDist = Number.MAX_SAFE_INTEGER;
253
+ for (let j = 0; j < queues.length; j++) {
254
+ let queue = queues[j];
255
+ if (queue && queue.elements.length > 0) {
256
+ let closest = queue.elements[0];
257
+ if (closest.dist < closestDist) {
258
+ closestDist = closest.dist;
259
+ closestQueue = j;
260
+ }
261
+ }
262
+ }
263
+ if (closestQueue === -1) {
264
+ break;
265
+ }
266
+ let closest = queues[closestQueue]?.elements.shift();
267
+ if (closest) {
268
+ results.results.push(closest.result);
269
+ }
270
+ }
271
+ for (let i = 0; i < queues.length; i++) {
272
+ results.kept += queues[i].elements.length + queues[i].kept;
273
+ }
274
+ return results;
275
+ },
276
+ done: () => iterators.every((x) => x.done()),
277
+ close: async () => {
278
+ for (const iterator of iterators) {
279
+ await iterator.close();
280
+ }
281
+ },
282
+ all: async () => {
283
+ let results = [];
284
+ for (const iterator of iterators) {
285
+ let res = await iterator.all();
286
+ results.push(...res);
287
+ }
288
+ return results;
289
+ },
290
+ };
291
+ };
292
+ const getClosestAround = (peers, point, roleAge, now, scaled) => {
293
+ const closestBelow = getClosest("below", peers, point, roleAge, true, now, scaled);
294
+ const closestAbove = getClosest("above", peers, point, roleAge, true, now, scaled);
295
+ const containing = containingPoint(peers, point, roleAge, true, now, {
296
+ scaled: scaled,
297
+ });
298
+ return iteratorInSeries(containing, joinIterator([closestBelow, closestAbove], point, scaled, "closest"));
299
+ };
300
+ const collectNodesAroundPoint = async (roleAge, peers, collector, point, now, done = () => true) => {
301
+ const containing = containingPoint(peers, point, 0, true, now, {
302
+ scaled: false,
303
+ });
304
+ const allContaining = await containing.next(0xffffffff);
305
+ for (const rect of allContaining.results) {
306
+ collector(rect.value, isMatured(rect.value, now, roleAge));
307
+ }
308
+ if (done()) {
309
+ return;
310
+ }
311
+ const closestBelow = getClosest("below", peers, point, 0, true, now, false);
312
+ const closestAbove = getClosest("above", peers, point, 0, true, now, false);
313
+ const aroundIterator = joinIterator([closestBelow, closestAbove], point, false, "closest");
314
+ while (aroundIterator.done() === false && done() === false) {
315
+ const res = await aroundIterator.next(1);
316
+ for (const rect of res.results) {
317
+ collector(rect.value, isMatured(rect.value, now, roleAge));
318
+ if (done()) {
319
+ return;
320
+ }
321
+ }
322
+ }
323
+ };
324
+ export const isMatured = (segment, now, minAge) => {
325
+ return now - Number(segment.timestamp) >= minAge;
326
+ };
327
+ export const getSamples = async (cursor, peers, amount, roleAge) => {
328
+ const leaders = new Set();
329
+ const width = 1;
330
+ if (!peers) {
331
+ return [];
332
+ }
333
+ const size = await peers.getSize();
334
+ amount = Math.min(amount, size);
335
+ if (amount === 0) {
336
+ return [];
337
+ }
338
+ const now = +new Date();
339
+ const maturedLeaders = new Set();
340
+ for (let i = 0; i < amount; i++) {
341
+ // evenly distributed
342
+ const point = ((cursor + i / amount) % 1) * width;
343
+ // aquire at least one unique node for each point
344
+ await collectNodesAroundPoint(roleAge, peers, (rect, m) => {
345
+ // console.log(m, rect.start1 / SEGMENT_COORDINATE_SCALE, rect.width / SEGMENT_COORDINATE_SCALE)
346
+ if (m) {
347
+ maturedLeaders.add(rect.hash);
348
+ }
349
+ leaders.add(rect.hash);
350
+ }, point, now, () => {
351
+ if (maturedLeaders.size > i) {
352
+ return true;
353
+ }
354
+ return false;
355
+ });
356
+ }
357
+ return [...leaders];
358
+ };
359
+ const fetchOne = async (iterator) => {
360
+ const value = await iterator.next(1);
361
+ await iterator.close();
362
+ return value.results[0]?.value;
363
+ };
364
+ export const getCoverSet = async (coveringWidth, peers, roleAge, startNodeIdentity) => {
365
+ let now = +new Date();
366
+ // find a good starting point
367
+ let startNode = undefined;
368
+ if (startNodeIdentity) {
369
+ // start at our node (local first)
370
+ let result = await peers.query(new SearchRequest({
371
+ query: [
372
+ new StringMatch({ key: "hash", value: startNodeIdentity.hashcode() }),
373
+ ],
374
+ fetch: 1,
375
+ }));
376
+ startNode = result.results[0]?.value;
377
+ if (startNode) {
378
+ if (!isMatured(startNode, now, roleAge)) {
379
+ const matured = await fetchOne(getClosestAround(peers, startNode.start1, roleAge, now, true));
380
+ if (matured) {
381
+ startNode = matured;
382
+ }
383
+ }
384
+ }
385
+ }
386
+ let startLocation;
387
+ if (!startNode) {
388
+ startLocation = Math.random() * SEGMENT_COORDINATE_SCALE;
389
+ startNode = await fetchOne(getClosestAround(peers, startLocation, roleAge, now, true));
390
+ }
391
+ else {
392
+ // TODO choose start location as the point with the longest range?
393
+ startLocation =
394
+ startNode.start1 ?? Math.random() * SEGMENT_COORDINATE_SCALE;
395
+ }
396
+ /* const startNode = walker; */
397
+ if (!startNode) {
398
+ return new Set();
399
+ }
400
+ let results = [];
401
+ let widthToCoverScaled = coveringWidth * SEGMENT_COORDINATE_SCALE;
402
+ const endLocation = (startLocation + widthToCoverScaled) % SEGMENT_COORDINATE_SCALE;
403
+ const endIsWrapped = endLocation <= startLocation;
404
+ const endRect = (await fetchOne(getClosestAround(peers, endLocation, roleAge, now, true))) || (await fetchOne(getClosestAround(peers, endLocation, 0, now, true))); // (await getClosest('above', peers, nextLocation, roleAge, true, 1, true))[0]
405
+ if (!endRect) {
406
+ return new Set();
407
+ }
408
+ let current =
409
+ /* (await getClosestAround(peers, startLocation, roleAge, 1, true))[0] */ startNode ||
410
+ (await fetchOne(getClosestAround(peers, startLocation, 0, now, true))); //(await getClosest('above', peers, startLocation, roleAge, true, 1, true))[0]
411
+ let coveredLength = current.width;
412
+ let nextLocation = current.end2;
413
+ // push edges
414
+ results.push(endRect);
415
+ results.push(current);
416
+ /* const endIsSameAsStart = equals(endRect.id, current.id); */
417
+ const resolveNextContaining = async (nextLocation, roleAge) => {
418
+ let next = await fetchOne(containingPoint(peers, nextLocation, roleAge, true, now, {
419
+ scaled: true,
420
+ sort: [new Sort({ key: "end2", direction: SortDirection.DESC })],
421
+ })); // get entersecting sort by largest end2
422
+ return next;
423
+ };
424
+ const resolveNextAbove = async (nextLocation, roleAge) => {
425
+ // if not get closest from above
426
+ let next = await fetchOne(getClosest("above", peers, nextLocation, roleAge, true, now, true));
427
+ return next;
428
+ };
429
+ const resolveNext = async (nextLocation, roleAge) => {
430
+ const containing = await resolveNextContaining(nextLocation, roleAge);
431
+ if (containing) {
432
+ return [containing, true];
433
+ }
434
+ return [await resolveNextAbove(nextLocation, roleAge), false];
435
+ };
436
+ // fill the middle
437
+ let wrappedOnce = current.end2 < current.end1;
438
+ let maturedCoveredLength = coveredLength;
439
+ /* let lastMatured = isMatured(startNode, now, roleAge) ? startNode : undefined;
440
+ */
441
+ while (maturedCoveredLength < widthToCoverScaled &&
442
+ coveredLength <= SEGMENT_COORDINATE_SCALE) {
443
+ let nextCandidate = await resolveNext(nextLocation, roleAge);
444
+ /* let fromAbove = false; */
445
+ let matured = true;
446
+ if (!nextCandidate[0]) {
447
+ matured = false;
448
+ nextCandidate = await resolveNext(nextLocation, 0);
449
+ /* fromAbove = true; */
450
+ }
451
+ if (!nextCandidate[0]) {
452
+ break;
453
+ }
454
+ current = nextCandidate[0];
455
+ let distanceBefore = coveredLength;
456
+ if (current.end2 < nextLocation) {
457
+ wrappedOnce = true;
458
+ coveredLength += SEGMENT_COORDINATE_SCALE - nextLocation;
459
+ coveredLength += current.end2;
460
+ }
461
+ else {
462
+ coveredLength += current.end1 - nextLocation;
463
+ }
464
+ let isLast = distanceBefore < widthToCoverScaled &&
465
+ coveredLength >= widthToCoverScaled;
466
+ if ((isLast &&
467
+ !nextCandidate[1]) /* || Math.min(current.start1, current.start2) > Math.min(endRect.start1, endRect.start2) */ /* (Math.min(current.start1, current.start2) > endLocation) */ ||
468
+ equals(endRect.id, current.id)) {
469
+ /* if ((isLast && ((endIsWrapped && wrappedOnce) || (!endIsWrapped))) && (current.start1 > endLocation || equals(current.id, endRect.id))) { */
470
+ // this is the end!
471
+ /* if (lastMatured && lastMatured.distanceTo(endLocation) < current.distanceTo(endLocation)) {
472
+ breaks;
473
+ } */
474
+ break;
475
+ }
476
+ /* if (fromAbove && next && next.start1 > endRect.start1 && (endIsWrapped === false || wrappedOnce)) {
477
+ break;
478
+ } */
479
+ // this is a skip condition to not include too many rects
480
+ if (matured) {
481
+ maturedCoveredLength = coveredLength;
482
+ /* lastMatured = current; */
483
+ }
484
+ results.push(current);
485
+ /*
486
+
487
+ if (current.start1 > endLocation && (wrappedOnce || !endIsWrapped)) {
488
+ break;
489
+ }
490
+
491
+ */
492
+ nextLocation = endIsWrapped
493
+ ? wrappedOnce
494
+ ? Math.min(current.end2, endLocation)
495
+ : current.end2
496
+ : Math.min(current.end2, endLocation);
497
+ }
498
+ const res = new Set(results.map((x) => x.hash));
499
+ startNodeIdentity && res.add(startNodeIdentity.hashcode());
500
+ return res;
501
+ //
502
+ /* const set: Set<string> = new Set();
503
+ let currentNode = startNode;
504
+ const t = +new Date();
505
+
506
+ let wrappedOnce = false;
507
+ const startPoint = startNode.segment.offset;
508
+
509
+ const getNextPoint = (): [number, number, number, boolean] => {
510
+ let nextPoint =
511
+ currentNode.segment.offset + currentNode.segment.factor;
512
+
513
+ if (nextPoint > 1 || nextPoint < startPoint) {
514
+ wrappedOnce = true;
515
+ }
516
+
517
+ nextPoint = nextPoint % 1;
518
+ let distanceStart: number;
519
+
520
+ if (wrappedOnce) {
521
+ distanceStart = (1 - startPoint + currentNode.segment.offset) % 1;
522
+ } else {
523
+ distanceStart = (currentNode.segment.offset - startPoint) % 1;
524
+ }
525
+
526
+ const distanceEnd = distanceStart + currentNode.segment.factor;
527
+
528
+ return [nextPoint, distanceStart, distanceEnd, wrappedOnce];
529
+ };
530
+
531
+ const getNextMatured = async (from: ReplicatorRect) => {
532
+ let next = (await peers.query(new SearchRequest({ query: [new IntegerCompare({ key: ['segment', 'offset'], compare: Compare.Greater, value: from.segment.offset })], fetch: 1 })))?.results[0]?.value // (from.next || peers.head)!;
533
+ while (
534
+ next.hash !== from.hash &&
535
+ next.hash !== startNode.hash
536
+ ) {
537
+ if (isMatured(next.segment, t, roleAge)) {
538
+ return next;
539
+ }
540
+ next = (next.next || peers.head)!;
541
+ }
542
+ return undefined;
543
+ }; */
544
+ /**
545
+ * The purpose of this loop is to cover at least coveringWidth
546
+ * so that if we query all nodes in this range, we know we will
547
+ * "query" all data in that range
548
+ */
549
+ /* let isPastThePoint = false;
550
+ outer: while (currentNode) {
551
+ if (set.has(currentNode.hash)) break;
552
+
553
+ const [nextPoint, distanceStart, distanceEnd, wrapped] = getNextPoint();
554
+
555
+ if (distanceStart <= coveringWidth) {
556
+ set.add(currentNode.hash);
557
+ }
558
+
559
+ if (distanceEnd >= coveringWidth) {
560
+ break;
561
+ }
562
+
563
+ let next = currentNode.next || peers.head;
564
+ while (next) {
565
+ if (next.value.publicKey.equals(startNode.value.publicKey)) {
566
+ break outer;
567
+ }
568
+
569
+ const prevOffset = (next.prev || peers.tail)!.value.role.offset;
570
+ const nextOffset = next.value.role.offset;
571
+ const nextHasWrapped = nextOffset < prevOffset;
572
+
573
+ if (
574
+ (!wrapped && nextOffset > nextPoint) ||
575
+ (nextHasWrapped &&
576
+ (wrapped ? nextOffset > nextPoint : prevOffset < nextPoint)) ||
577
+ (!nextHasWrapped && prevOffset < nextPoint && nextPoint <= nextOffset)
578
+ ) {
579
+ isPastThePoint = true;
580
+ }
581
+
582
+ if (isPastThePoint) {
583
+ break; // include this next in the set;
584
+ }
585
+
586
+ const overlapsRange = containsPoint(next.value.role, nextPoint);
587
+
588
+ if (overlapsRange) {
589
+ // Find out if there is a better choice ahead of us
590
+ const nextNext = await getNextMatured(next);
591
+ if (
592
+ nextNext &&
593
+ nextNext.hash === currentNode.hash &&
594
+ nextNext.segment.offset < nextPoint &&
595
+ nextNext.segment.offset + nextNext.segment.factor > nextPoint
596
+ ) {
597
+ // nextNext is better (continue to iterate)
598
+ } else {
599
+ // done
600
+ break;
601
+ }
602
+ } else {
603
+ // (continue to iterate)
604
+ }
605
+
606
+ next = next.next || peers.head;
607
+ }
608
+ currentNode = next!;
609
+ } */
610
+ // collect 1 point around the boundary of the start and one at the end,
611
+ // preferrd matured and that we already have it
612
+ /* for (const point of [
613
+ startNode.segment.offset,
614
+ (startNode.segment.offset + coveringWidth) % 1
615
+ ]) {
616
+ let done = false;
617
+ const unmatured: string[] = [];
618
+ collectNodesAroundPoint(
619
+ t,
620
+ roleAge,
621
+ peers,
622
+ isMatured(startNode.segment, t, roleAge) ? startNode : peers.head, // start at startNode is matured, else start at head (we only seek to find one matured node at the point)
623
+ (rect, matured) => {
624
+ if (matured) {
625
+ if (set.has(rect.hash)) {
626
+ // great!
627
+ } else {
628
+ set.add(rect.hash);
629
+ }
630
+ done = true;
631
+ } else {
632
+ unmatured.push(rect.hash);
633
+ }
634
+ },
635
+ point,
636
+ () => done
637
+ );
638
+ if (!done && unmatured.length > 0) {
639
+ set.add(unmatured[0]);
640
+ // TODO add more elements?
641
+ }
642
+ }
643
+ return set; */
644
+ };
645
+ //# sourceMappingURL=ranges.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ranges.js","sourceRoot":"","sources":["../../src/ranges.ts"],"names":[],"mappings":"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"}