@dxos/echo-pipeline 0.1.34 → 0.1.36-next.ef27157
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/{chunk-6CRSMR4G.mjs → chunk-LIPDNX3G.mjs} +73 -46
- package/dist/lib/browser/chunk-LIPDNX3G.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +3 -1
- package/dist/lib/browser/index.mjs.map +1 -1
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +1 -1
- package/dist/lib/node/index.cjs +63 -35
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +59 -37
- package/dist/lib/node/testing/index.cjs.map +3 -3
- package/dist/types/src/pipeline/pipeline.d.ts +1 -0
- package/dist/types/src/pipeline/pipeline.d.ts.map +1 -1
- package/dist/types/src/pipeline/timeframe-clock.d.ts +1 -0
- package/dist/types/src/pipeline/timeframe-clock.d.ts.map +1 -1
- package/package.json +30 -29
- package/src/pipeline/pipeline.test.ts +214 -0
- package/src/pipeline/pipeline.ts +14 -5
- package/src/pipeline/timeframe-clock.ts +4 -1
- package/src/space/data-pipeline.ts +2 -2
- package/dist/lib/browser/chunk-6CRSMR4G.mjs.map +0 -7
|
@@ -203,6 +203,10 @@ var mapFeedIndexesToTimeframe = (indexes) => new Timeframe(indexes.map(({ feedKe
|
|
|
203
203
|
feedKey,
|
|
204
204
|
index
|
|
205
205
|
]));
|
|
206
|
+
var startAfter = (timeframe) => timeframe.frames().map(([feedKey, index]) => ({
|
|
207
|
+
feedKey,
|
|
208
|
+
index: index + 1
|
|
209
|
+
}));
|
|
206
210
|
var TimeframeClock = class {
|
|
207
211
|
// prettier-ignore
|
|
208
212
|
constructor(_timeframe = new Timeframe()) {
|
|
@@ -226,12 +230,12 @@ var TimeframeClock = class {
|
|
|
226
230
|
return !gaps.isEmpty();
|
|
227
231
|
}
|
|
228
232
|
async waitUntilReached(target) {
|
|
229
|
-
log2.
|
|
233
|
+
log2.info("waitUntilReached", {
|
|
230
234
|
target,
|
|
231
235
|
current: this._timeframe
|
|
232
236
|
}, {
|
|
233
237
|
file: "timeframe-clock.ts",
|
|
234
|
-
line:
|
|
238
|
+
line: 48,
|
|
235
239
|
scope: this,
|
|
236
240
|
callSite: (f, a) => f(...a)
|
|
237
241
|
});
|
|
@@ -242,7 +246,7 @@ var TimeframeClock = class {
|
|
|
242
246
|
deps: Timeframe.dependencies(target, this._timeframe)
|
|
243
247
|
}, {
|
|
244
248
|
file: "timeframe-clock.ts",
|
|
245
|
-
line:
|
|
249
|
+
line: 50,
|
|
246
250
|
scope: this,
|
|
247
251
|
callSite: (f, a) => f(...a)
|
|
248
252
|
});
|
|
@@ -256,7 +260,7 @@ __decorate2([
|
|
|
256
260
|
|
|
257
261
|
// packages/core/echo/echo-pipeline/src/pipeline/pipeline.ts
|
|
258
262
|
import assert4 from "@dxos/node-std/assert";
|
|
259
|
-
import { sleep, Trigger } from "@dxos/async";
|
|
263
|
+
import { sleep, synchronized as synchronized2, Trigger } from "@dxos/async";
|
|
260
264
|
import { Context, rejectOnDispose } from "@dxos/context";
|
|
261
265
|
import { FeedSetIterator } from "@dxos/feed-store";
|
|
262
266
|
import { PublicKey } from "@dxos/keys";
|
|
@@ -281,6 +285,16 @@ var createMessageSelector = (timeframeClock) => {
|
|
|
281
285
|
};
|
|
282
286
|
|
|
283
287
|
// packages/core/echo/echo-pipeline/src/pipeline/pipeline.ts
|
|
288
|
+
var __decorate3 = function(decorators, target, key, desc) {
|
|
289
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
290
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
291
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
292
|
+
else
|
|
293
|
+
for (var i = decorators.length - 1; i >= 0; i--)
|
|
294
|
+
if (d = decorators[i])
|
|
295
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
296
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
297
|
+
};
|
|
284
298
|
var PipelineState = class {
|
|
285
299
|
// prettier-ignore
|
|
286
300
|
constructor(_iterator, _timeframeClock) {
|
|
@@ -292,10 +306,11 @@ var PipelineState = class {
|
|
|
292
306
|
* Latest theoretical timeframe based on the last mutation in each feed.
|
|
293
307
|
* NOTE: This might never be reached if the mutation dependencies
|
|
294
308
|
*/
|
|
309
|
+
// TODO(dmaretskyi): Rename `totalTimeframe`? or `lastTimeframe`.
|
|
295
310
|
get endTimeframe() {
|
|
296
|
-
return mapFeedIndexesToTimeframe(this._iterator.feeds.filter((feed) => feed.
|
|
311
|
+
return mapFeedIndexesToTimeframe(this._iterator.feeds.filter((feed) => feed.length > 0).map((feed) => ({
|
|
297
312
|
feedKey: feed.key,
|
|
298
|
-
index: feed.
|
|
313
|
+
index: feed.length - 1
|
|
299
314
|
})));
|
|
300
315
|
}
|
|
301
316
|
get timeframe() {
|
|
@@ -304,6 +319,9 @@ var PipelineState = class {
|
|
|
304
319
|
get targetTimeframe() {
|
|
305
320
|
return this._targetTimeframe ? this._targetTimeframe : new Timeframe2();
|
|
306
321
|
}
|
|
322
|
+
get feeds() {
|
|
323
|
+
return this._iterator.feeds;
|
|
324
|
+
}
|
|
307
325
|
async waitUntilTimeframe(target) {
|
|
308
326
|
await this._timeframeClock.waitUntilReached(target);
|
|
309
327
|
}
|
|
@@ -325,7 +343,7 @@ var PipelineState = class {
|
|
|
325
343
|
target: this.targetTimeframe
|
|
326
344
|
}, {
|
|
327
345
|
file: "pipeline.ts",
|
|
328
|
-
line:
|
|
346
|
+
line: 101,
|
|
329
347
|
scope: this,
|
|
330
348
|
callSite: (f, a) => f(...a)
|
|
331
349
|
});
|
|
@@ -355,7 +373,7 @@ var PipelineState = class {
|
|
|
355
373
|
dependencies: Timeframe2.dependencies(this.targetTimeframe, this.timeframe)
|
|
356
374
|
}, {
|
|
357
375
|
file: "pipeline.ts",
|
|
358
|
-
line:
|
|
376
|
+
line: 127,
|
|
359
377
|
scope: this,
|
|
360
378
|
callSite: (f, a) => f(...a)
|
|
361
379
|
});
|
|
@@ -372,7 +390,7 @@ var Pipeline = class {
|
|
|
372
390
|
this._initialTimeframe = _initialTimeframe;
|
|
373
391
|
this._timeframeClock = new TimeframeClock(this._initialTimeframe);
|
|
374
392
|
this._feedSetIterator = new FeedSetIterator(createMessageSelector(this._timeframeClock), {
|
|
375
|
-
start:
|
|
393
|
+
start: startAfter(this._initialTimeframe),
|
|
376
394
|
stallTimeout: 1e3
|
|
377
395
|
});
|
|
378
396
|
this._state = new PipelineState(this._feedSetIterator, this._timeframeClock);
|
|
@@ -381,7 +399,7 @@ var Pipeline = class {
|
|
|
381
399
|
this._feedSetIterator.stalled.on((iterator) => {
|
|
382
400
|
log4.warn(`Stalled after ${iterator.options.stallTimeout}ms with ${iterator.size} feeds.`, {}, {
|
|
383
401
|
file: "pipeline.ts",
|
|
384
|
-
line:
|
|
402
|
+
line: 203,
|
|
385
403
|
scope: this,
|
|
386
404
|
callSite: (f, a) => f(...a)
|
|
387
405
|
});
|
|
@@ -397,6 +415,8 @@ var Pipeline = class {
|
|
|
397
415
|
getFeeds() {
|
|
398
416
|
return this._feedSetIterator.feeds;
|
|
399
417
|
}
|
|
418
|
+
// NOTE: This cannot be synchronized with `stop` because stop waits for the mutation processing to complete,
|
|
419
|
+
// which might be opening feeds during the mutation processing, which w
|
|
400
420
|
async addFeed(feed) {
|
|
401
421
|
await this._feedSetIterator.addFeed(feed);
|
|
402
422
|
}
|
|
@@ -414,14 +434,14 @@ var Pipeline = class {
|
|
|
414
434
|
async start() {
|
|
415
435
|
log4("starting...", {}, {
|
|
416
436
|
file: "pipeline.ts",
|
|
417
|
-
line:
|
|
437
|
+
line: 245,
|
|
418
438
|
scope: this,
|
|
419
439
|
callSite: (f, a) => f(...a)
|
|
420
440
|
});
|
|
421
441
|
await this._feedSetIterator.open();
|
|
422
442
|
log4("started", {}, {
|
|
423
443
|
file: "pipeline.ts",
|
|
424
|
-
line:
|
|
444
|
+
line: 247,
|
|
425
445
|
scope: this,
|
|
426
446
|
callSite: (f, a) => f(...a)
|
|
427
447
|
});
|
|
@@ -429,7 +449,7 @@ var Pipeline = class {
|
|
|
429
449
|
async stop() {
|
|
430
450
|
log4("stopping...", {}, {
|
|
431
451
|
file: "pipeline.ts",
|
|
432
|
-
line:
|
|
452
|
+
line: 252,
|
|
433
453
|
scope: this,
|
|
434
454
|
callSite: (f, a) => f(...a)
|
|
435
455
|
});
|
|
@@ -437,7 +457,7 @@ var Pipeline = class {
|
|
|
437
457
|
await this._processingTrigger.wait();
|
|
438
458
|
log4("stopped", {}, {
|
|
439
459
|
file: "pipeline.ts",
|
|
440
|
-
line:
|
|
460
|
+
line: 255,
|
|
441
461
|
scope: this,
|
|
442
462
|
callSite: (f, a) => f(...a)
|
|
443
463
|
});
|
|
@@ -458,6 +478,12 @@ var Pipeline = class {
|
|
|
458
478
|
this._isOpen = false;
|
|
459
479
|
}
|
|
460
480
|
};
|
|
481
|
+
__decorate3([
|
|
482
|
+
synchronized2
|
|
483
|
+
], Pipeline.prototype, "start", null);
|
|
484
|
+
__decorate3([
|
|
485
|
+
synchronized2
|
|
486
|
+
], Pipeline.prototype, "stop", null);
|
|
461
487
|
|
|
462
488
|
// packages/core/echo/echo-pipeline/src/space/auth.ts
|
|
463
489
|
import assert5 from "@dxos/node-std/assert";
|
|
@@ -548,7 +574,7 @@ var AuthExtension = class extends RpcExtension {
|
|
|
548
574
|
|
|
549
575
|
// packages/core/echo/echo-pipeline/src/space/space.ts
|
|
550
576
|
import assert6 from "@dxos/node-std/assert";
|
|
551
|
-
import { Event as Event2, synchronized as
|
|
577
|
+
import { Event as Event2, synchronized as synchronized3, trackLeaks, Lock } from "@dxos/async";
|
|
552
578
|
import { log as log7, logInfo } from "@dxos/log";
|
|
553
579
|
import { AdmittedFeed as AdmittedFeed2 } from "@dxos/protocols/proto/dxos/halo/credentials";
|
|
554
580
|
import { Callback as Callback2 } from "@dxos/util";
|
|
@@ -669,7 +695,7 @@ var ControlPipeline = class {
|
|
|
669
695
|
};
|
|
670
696
|
|
|
671
697
|
// packages/core/echo/echo-pipeline/src/space/space.ts
|
|
672
|
-
var
|
|
698
|
+
var __decorate4 = function(decorators, target, key, desc) {
|
|
673
699
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
674
700
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
675
701
|
r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -835,16 +861,16 @@ var Space = class Space2 {
|
|
|
835
861
|
return pipeline;
|
|
836
862
|
}
|
|
837
863
|
};
|
|
838
|
-
|
|
864
|
+
__decorate4([
|
|
839
865
|
logInfo
|
|
840
866
|
], Space.prototype, "key", null);
|
|
841
|
-
|
|
842
|
-
|
|
867
|
+
__decorate4([
|
|
868
|
+
synchronized3
|
|
843
869
|
], Space.prototype, "open", null);
|
|
844
|
-
|
|
845
|
-
|
|
870
|
+
__decorate4([
|
|
871
|
+
synchronized3
|
|
846
872
|
], Space.prototype, "close", null);
|
|
847
|
-
Space =
|
|
873
|
+
Space = __decorate4([
|
|
848
874
|
trackLeaks("open", "close")
|
|
849
875
|
], Space);
|
|
850
876
|
|
|
@@ -856,7 +882,7 @@ import { MMSTTopology } from "@dxos/network-manager";
|
|
|
856
882
|
import { Teleport } from "@dxos/teleport";
|
|
857
883
|
import { ReplicatorExtension } from "@dxos/teleport-extension-replicator";
|
|
858
884
|
import { ComplexMap } from "@dxos/util";
|
|
859
|
-
var
|
|
885
|
+
var __decorate5 = function(decorators, target, key, desc) {
|
|
860
886
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
861
887
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
862
888
|
r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -963,10 +989,10 @@ var SpaceProtocol = class {
|
|
|
963
989
|
};
|
|
964
990
|
}
|
|
965
991
|
};
|
|
966
|
-
|
|
992
|
+
__decorate5([
|
|
967
993
|
logInfo2
|
|
968
994
|
], SpaceProtocol.prototype, "_topic", void 0);
|
|
969
|
-
|
|
995
|
+
__decorate5([
|
|
970
996
|
logInfo2
|
|
971
997
|
], SpaceProtocol.prototype, "_ownPeerKey", null);
|
|
972
998
|
var AuthStatus;
|
|
@@ -1026,21 +1052,21 @@ var SpaceProtocolSession = class {
|
|
|
1026
1052
|
await this._teleport.close();
|
|
1027
1053
|
}
|
|
1028
1054
|
};
|
|
1029
|
-
|
|
1055
|
+
__decorate5([
|
|
1030
1056
|
logInfo2
|
|
1031
1057
|
], SpaceProtocolSession.prototype, "_wireParams", void 0);
|
|
1032
|
-
|
|
1058
|
+
__decorate5([
|
|
1033
1059
|
logInfo2
|
|
1034
1060
|
], SpaceProtocolSession.prototype, "authStatus", null);
|
|
1035
1061
|
|
|
1036
1062
|
// packages/core/echo/echo-pipeline/src/space/space-manager.ts
|
|
1037
|
-
import { synchronized as
|
|
1063
|
+
import { synchronized as synchronized4, trackLeaks as trackLeaks2 } from "@dxos/async";
|
|
1038
1064
|
import { failUndefined } from "@dxos/debug";
|
|
1039
1065
|
import { PublicKey as PublicKey4 } from "@dxos/keys";
|
|
1040
1066
|
import { log as log9 } from "@dxos/log";
|
|
1041
1067
|
import { trace } from "@dxos/protocols";
|
|
1042
1068
|
import { ComplexMap as ComplexMap2 } from "@dxos/util";
|
|
1043
|
-
var
|
|
1069
|
+
var __decorate6 = function(decorators, target, key, desc) {
|
|
1044
1070
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1045
1071
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
1046
1072
|
r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -1112,13 +1138,13 @@ var SpaceManager = class SpaceManager2 {
|
|
|
1112
1138
|
return space;
|
|
1113
1139
|
}
|
|
1114
1140
|
};
|
|
1115
|
-
|
|
1116
|
-
|
|
1141
|
+
__decorate6([
|
|
1142
|
+
synchronized4
|
|
1117
1143
|
], SpaceManager.prototype, "open", null);
|
|
1118
|
-
|
|
1119
|
-
|
|
1144
|
+
__decorate6([
|
|
1145
|
+
synchronized4
|
|
1120
1146
|
], SpaceManager.prototype, "close", null);
|
|
1121
|
-
SpaceManager =
|
|
1147
|
+
SpaceManager = __decorate6([
|
|
1122
1148
|
trackLeaks2("open", "close")
|
|
1123
1149
|
], SpaceManager);
|
|
1124
1150
|
|
|
@@ -1304,7 +1330,7 @@ var DatabaseBackendHost = class {
|
|
|
1304
1330
|
import { trackLeaks as trackLeaks3 } from "@dxos/async";
|
|
1305
1331
|
import { schema as schema4 } from "@dxos/protocols";
|
|
1306
1332
|
import { ObjectSync } from "@dxos/teleport-extension-object-sync";
|
|
1307
|
-
var
|
|
1333
|
+
var __decorate7 = function(decorators, target, key, desc) {
|
|
1308
1334
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1309
1335
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
1310
1336
|
r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -1357,7 +1383,7 @@ var SnapshotManager = class SnapshotManager2 {
|
|
|
1357
1383
|
return id;
|
|
1358
1384
|
}
|
|
1359
1385
|
};
|
|
1360
|
-
SnapshotManager =
|
|
1386
|
+
SnapshotManager = __decorate7([
|
|
1361
1387
|
trackLeaks3("open", "close")
|
|
1362
1388
|
], SnapshotManager);
|
|
1363
1389
|
|
|
@@ -1456,13 +1482,13 @@ var DataServiceImpl = class {
|
|
|
1456
1482
|
|
|
1457
1483
|
// packages/core/echo/echo-pipeline/src/space/data-pipeline.ts
|
|
1458
1484
|
import assert9 from "@dxos/node-std/assert";
|
|
1459
|
-
import { Event as Event3, scheduleTask as scheduleTask2, synchronized as
|
|
1485
|
+
import { Event as Event3, scheduleTask as scheduleTask2, synchronized as synchronized5, trackLeaks as trackLeaks4 } from "@dxos/async";
|
|
1460
1486
|
import { Context as Context3 } from "@dxos/context";
|
|
1461
1487
|
import { failUndefined as failUndefined3 } from "@dxos/debug";
|
|
1462
1488
|
import { ItemManager } from "@dxos/echo-db";
|
|
1463
1489
|
import { log as log12 } from "@dxos/log";
|
|
1464
1490
|
import { Timeframe as Timeframe3 } from "@dxos/timeframe";
|
|
1465
|
-
var
|
|
1491
|
+
var __decorate8 = function(decorators, target, key, desc) {
|
|
1466
1492
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1467
1493
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
1468
1494
|
r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -1475,7 +1501,7 @@ var __decorate7 = function(decorators, target, key, desc) {
|
|
|
1475
1501
|
var MESSAGES_PER_SNAPSHOT = 10;
|
|
1476
1502
|
var AUTOMATIC_SNAPSHOT_DEBOUNCE_INTERVAL = 5e3;
|
|
1477
1503
|
var TIMEFRAME_SAVE_DEBOUNCE_INTERVAL = 500;
|
|
1478
|
-
var DISABLE_SNAPSHOT_CACHE =
|
|
1504
|
+
var DISABLE_SNAPSHOT_CACHE = true;
|
|
1479
1505
|
var DataPipeline = class DataPipeline2 {
|
|
1480
1506
|
constructor(_params) {
|
|
1481
1507
|
this._params = _params;
|
|
@@ -1510,7 +1536,7 @@ var DataPipeline = class DataPipeline2 {
|
|
|
1510
1536
|
return;
|
|
1511
1537
|
}
|
|
1512
1538
|
this._spaceContext = spaceContext;
|
|
1513
|
-
if (this._params.snapshotId) {
|
|
1539
|
+
if (this._params.snapshotId && !DISABLE_SNAPSHOT_CACHE) {
|
|
1514
1540
|
this._snapshot = await this._params.snapshotManager.load(this._params.snapshotId);
|
|
1515
1541
|
this._lastAutomaticSnapshotTimeframe = (_b = (_a = this._snapshot) == null ? void 0 : _a.timeframe) != null ? _b : new Timeframe3();
|
|
1516
1542
|
}
|
|
@@ -1669,13 +1695,13 @@ var DataPipeline = class DataPipeline2 {
|
|
|
1669
1695
|
await this._pipeline.state.waitUntilTimeframe(timeframe);
|
|
1670
1696
|
}
|
|
1671
1697
|
};
|
|
1672
|
-
|
|
1673
|
-
|
|
1698
|
+
__decorate8([
|
|
1699
|
+
synchronized5
|
|
1674
1700
|
], DataPipeline.prototype, "open", null);
|
|
1675
|
-
|
|
1676
|
-
|
|
1701
|
+
__decorate8([
|
|
1702
|
+
synchronized5
|
|
1677
1703
|
], DataPipeline.prototype, "close", null);
|
|
1678
|
-
DataPipeline =
|
|
1704
|
+
DataPipeline = __decorate8([
|
|
1679
1705
|
trackLeaks4("open", "close")
|
|
1680
1706
|
], DataPipeline);
|
|
1681
1707
|
var snapshotTimeframeToStartingTimeframe = (snapshotTimeframe) => {
|
|
@@ -1693,6 +1719,7 @@ export {
|
|
|
1693
1719
|
createMappedFeedWriter,
|
|
1694
1720
|
mapTimeframeToFeedIndexes,
|
|
1695
1721
|
mapFeedIndexesToTimeframe,
|
|
1722
|
+
startAfter,
|
|
1696
1723
|
TimeframeClock,
|
|
1697
1724
|
Pipeline,
|
|
1698
1725
|
AuthExtension,
|
|
@@ -1712,4 +1739,4 @@ export {
|
|
|
1712
1739
|
DataServiceImpl,
|
|
1713
1740
|
DataPipeline
|
|
1714
1741
|
};
|
|
1715
|
-
//# sourceMappingURL=chunk-
|
|
1742
|
+
//# sourceMappingURL=chunk-LIPDNX3G.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/metadata/metadata-store.ts", "../../../src/common/codec.ts", "../../../src/common/feeds.ts", "../../../src/pipeline/timeframe-clock.ts", "../../../src/pipeline/pipeline.ts", "../../../src/pipeline/message-selector.ts", "../../../src/space/auth.ts", "../../../src/space/space.ts", "../../../src/space/control-pipeline.ts", "../../../src/space/space-protocol.ts", "../../../src/space/space-manager.ts", "../../../src/space/genesis.ts", "../../../src/dbhost/data-service-host.ts", "../../../src/dbhost/database-backend.ts", "../../../src/dbhost/snapshot-manager.ts", "../../../src/dbhost/snapshot-store.ts", "../../../src/dbhost/data-service.ts", "../../../src/space/data-pipeline.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2021 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { synchronized } from '@dxos/async';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { schema } from '@dxos/protocols';\nimport { EchoMetadata, SpaceMetadata, IdentityRecord } from '@dxos/protocols/proto/dxos/echo/metadata';\nimport { Directory } from '@dxos/random-access-storage';\nimport { Timeframe } from '@dxos/timeframe';\n\n/**\n * Version for the schema of the stored data as defined in dxos.echo.metadata.EchoMetadata.\n *\n * Should be incremented every time there's a breaking change to the stored data.\n */\nexport const STORAGE_VERSION = 1;\n\nexport interface AddSpaceOptions {\n key: PublicKey;\n genesisFeed: PublicKey;\n}\n\nconst emptyEchoMetadata = (): EchoMetadata => ({\n version: STORAGE_VERSION,\n spaces: [],\n created: new Date(),\n updated: new Date()\n});\n\nexport class MetadataStore {\n private _metadata: EchoMetadata = emptyEchoMetadata();\n\n // prettier-ignore\n constructor(\n private readonly _directory: Directory\n ) {}\n\n get version(): number {\n return this._metadata.version ?? 0;\n }\n\n /**\n * Returns a list of currently saved spaces. The list and objects in it can be modified addSpace and\n * addSpaceFeed functions.\n */\n get spaces(): SpaceMetadata[] {\n return this._metadata.spaces ?? [];\n }\n\n /**\n * Loads metadata from persistent storage.\n */\n @synchronized\n async load(): Promise<void> {\n const file = this._directory.getOrCreateFile('EchoMetadata');\n try {\n const { size: fileLength } = await file.stat();\n if (fileLength < 4) {\n return;\n }\n // Loading file size from first 4 bytes.\n const dataSize = fromBytesInt32(await file.read(0, 4));\n log('loaded', { size: dataSize });\n\n // Sanity check.\n {\n if (fileLength < dataSize + 4) {\n throw new Error('Metadata storage is corrupted');\n }\n }\n\n const data = await file.read(4, dataSize);\n this._metadata = schema.getCodecForType('dxos.echo.metadata.EchoMetadata').decode(data);\n } catch (err: any) {\n log.error('failed to load metadata', { err });\n this._metadata = emptyEchoMetadata();\n } finally {\n await file.close();\n }\n }\n\n @synchronized\n private async _save(): Promise<void> {\n const data: EchoMetadata = {\n ...this._metadata,\n version: STORAGE_VERSION,\n created: this._metadata.created ?? new Date(),\n updated: new Date()\n };\n\n const file = this._directory.getOrCreateFile('EchoMetadata');\n\n try {\n const encoded = Buffer.from(schema.getCodecForType('dxos.echo.metadata.EchoMetadata').encode(data));\n\n // Saving file size at first 4 bytes.\n await file.write(0, toBytesInt32(encoded.length));\n log('saved', { size: encoded.length });\n\n // Saving data.\n await file.write(4, encoded);\n } finally {\n await file.close();\n }\n }\n\n /**\n * Clears storage - doesn't work for now.\n */\n async clear(): Promise<void> {\n log('clearing all metadata');\n await this._directory.delete();\n }\n\n getIdentityRecord(): IdentityRecord | undefined {\n return this._metadata.identity;\n }\n\n async setIdentityRecord(record: IdentityRecord) {\n assert(!this._metadata.identity, 'Cannot overwrite existing identity in metadata');\n\n this._metadata.identity = record;\n await this._save();\n }\n\n async addSpace(record: SpaceMetadata) {\n assert(\n !(this._metadata.spaces ?? []).find((space) => space.key === record.key),\n 'Cannot overwrite existing space in metadata'\n );\n\n (this._metadata.spaces ??= []).push(record);\n await this._save();\n }\n\n async setSpaceLatestTimeframe(spaceKey: PublicKey, timeframe: Timeframe) {\n const space = this.spaces.find((space) => space.key === spaceKey);\n assert(space, 'Space not found');\n\n space.dataTimeframe = timeframe;\n await this._save();\n }\n\n async setSpaceSnapshot(spaceKey: PublicKey, snapshot: string) {\n const space = this.spaces.find((space) => space.key === spaceKey);\n assert(space, 'Space not found');\n\n space.snapshot = snapshot;\n await this._save();\n }\n\n async setWritableFeedKeys(spaceKey: PublicKey, controlFeedKey: PublicKey, dataFeedKey: PublicKey) {\n const space = this.spaces.find((space) => space.key === spaceKey);\n assert(space, 'Space not found');\n\n space.controlFeedKey = controlFeedKey;\n space.dataFeedKey = dataFeedKey;\n await this._save();\n }\n}\n\nconst toBytesInt32 = (num: number) => {\n const buf = Buffer.alloc(4);\n buf.writeInt32LE(num, 0);\n return buf;\n};\n\nconst fromBytesInt32 = (buf: Buffer) => buf.readInt32LE(0);\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Codec } from '@dxos/codec-protobuf';\nimport { createCodecEncoding } from '@dxos/hypercore';\nimport { schema } from '@dxos/protocols';\nimport type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\n\n/**\n * Codec for feed messages.\n */\nexport const codec: Codec<FeedMessage> = schema.getCodecForType('dxos.echo.feed.FeedMessage');\n\n/**\n * Value encoding used by feed store.\n */\nexport const valueEncoding = createCodecEncoding(codec);\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { FeedWriter } from '@dxos/feed-store';\nimport { MaybePromise } from '@dxos/util';\n\n/**\n * Maps the written arguments onto a different message type.\n */\nexport const createMappedFeedWriter = <Source extends {}, Target extends {}>(\n mapper: (arg: Source) => MaybePromise<Target>,\n writer: FeedWriter<Target>\n): FeedWriter<Source> => {\n assert(mapper);\n assert(writer);\n\n return {\n write: async (data: Source) => await writer.write(await mapper(data))\n };\n};\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { timed } from '@dxos/debug';\nimport { FeedIndex } from '@dxos/feed-store';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { Timeframe } from '@dxos/timeframe';\n\nexport const mapTimeframeToFeedIndexes = (timeframe: Timeframe): FeedIndex[] =>\n timeframe.frames().map(([feedKey, index]) => ({ feedKey, index }));\n\nexport const mapFeedIndexesToTimeframe = (indexes: FeedIndex[]): Timeframe =>\n new Timeframe(indexes.map(({ feedKey, index }) => [feedKey, index]));\n\nexport const startAfter = (timeframe: Timeframe): FeedIndex[] =>\n timeframe.frames().map(([feedKey, index]) => ({ feedKey, index: index + 1 }));\n\n/**\n * Keeps state of the last timeframe that was processed by ECHO.\n */\nexport class TimeframeClock {\n readonly update = new Event<Timeframe>();\n\n // prettier-ignore\n constructor(\n private _timeframe = new Timeframe()\n ) {}\n\n get timeframe() {\n return this._timeframe;\n }\n\n updateTimeframe(key: PublicKey, seq: number) {\n this._timeframe = Timeframe.merge(this._timeframe, new Timeframe([[key, seq]]));\n this.update.emit(this._timeframe);\n }\n\n hasGaps(timeframe: Timeframe) {\n const gaps = Timeframe.dependencies(timeframe, this._timeframe);\n return !gaps.isEmpty();\n }\n\n @timed(5_000)\n async waitUntilReached(target: Timeframe) {\n log.info('waitUntilReached', { target, current: this._timeframe });\n await this.update.waitForCondition(() => {\n log('check if reached', {\n target,\n current: this._timeframe,\n deps: Timeframe.dependencies(target, this._timeframe)\n });\n\n return Timeframe.dependencies(target, this._timeframe).isEmpty();\n });\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { sleep, synchronized, Trigger } from '@dxos/async';\nimport { Context, rejectOnDispose } from '@dxos/context';\nimport { FeedSetIterator, FeedWrapper, FeedWriter } from '@dxos/feed-store';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { FeedMessageBlock } from '@dxos/protocols';\nimport type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { Timeframe } from '@dxos/timeframe';\n\nimport { createMappedFeedWriter } from '../common';\nimport { createMessageSelector } from './message-selector';\nimport { mapFeedIndexesToTimeframe, startAfter, TimeframeClock } from './timeframe-clock';\n\nexport type WaitUntilReachedTargetParams = {\n /**\n * For cancellation.\n */\n ctx?: Context;\n timeout?: number;\n\n /**\n * @default true\n */\n breakOnStall?: boolean;\n};\n\n/**\n * External state accessor.\n */\nexport class PipelineState {\n // TODO(dmaretskyi): Remove?.\n public readonly timeframeUpdate = this._timeframeClock.update;\n\n /**\n * Target timeframe we are waiting to reach.\n */\n private _targetTimeframe: Timeframe | undefined;\n\n private _reachedTargetPromise: Promise<void> | undefined;\n\n // prettier-ignore\n constructor(\n private _iterator: FeedSetIterator<any>,\n private _timeframeClock: TimeframeClock\n ) { }\n\n /**\n * Latest theoretical timeframe based on the last mutation in each feed.\n * NOTE: This might never be reached if the mutation dependencies\n */\n // TODO(dmaretskyi): Rename `totalTimeframe`? or `lastTimeframe`.\n get endTimeframe() {\n return mapFeedIndexesToTimeframe(\n this._iterator.feeds\n .filter((feed) => feed.length > 0)\n .map((feed) => ({\n feedKey: feed.key,\n index: feed.length - 1\n }))\n );\n }\n\n get timeframe() {\n return this._timeframeClock.timeframe;\n }\n\n get targetTimeframe() {\n return this._targetTimeframe ? this._targetTimeframe : new Timeframe();\n }\n\n get feeds() {\n return this._iterator.feeds;\n }\n\n async waitUntilTimeframe(target: Timeframe) {\n await this._timeframeClock.waitUntilReached(target);\n }\n\n setTargetTimeframe(target: Timeframe) {\n this._targetTimeframe = target;\n }\n\n /**\n * Wait until the pipeline processes all messages in the feed and reaches the target timeframe if that is set.\n *\n * This function will resolve immediately if the pipeline is stalled.\n *\n * @param timeout Timeout in milliseconds to specify the maximum wait time.\n */\n async waitUntilReachedTargetTimeframe({\n ctx = new Context(),\n timeout,\n breakOnStall = true\n }: WaitUntilReachedTargetParams = {}) {\n log('waitUntilReachedTargetTimeframe', {\n timeout,\n current: this.timeframe,\n target: this.targetTimeframe\n });\n\n this._reachedTargetPromise ??= Promise.race([\n this._timeframeClock.update.waitForCondition(() => {\n return Timeframe.dependencies(this.targetTimeframe, this.timeframe).isEmpty();\n }),\n ...(breakOnStall ? [this._iterator.stalled.discardParameter().waitForCount(1)] : [])\n ]);\n\n let done = false;\n\n if (timeout) {\n return Promise.race([\n rejectOnDispose(ctx),\n this._reachedTargetPromise.then(() => {\n done = true;\n }),\n sleep(timeout).then(() => {\n if (done) {\n return;\n }\n\n log.warn('waitUntilReachedTargetTimeframe timed out', {\n timeout,\n current: this.timeframe,\n target: this.targetTimeframe,\n dependencies: Timeframe.dependencies(this.targetTimeframe, this.timeframe)\n });\n })\n ]);\n } else {\n return this._reachedTargetPromise;\n }\n }\n}\n\nexport interface PipelineAccessor {\n state: PipelineState;\n writer: FeedWriter<FeedMessage.Payload>;\n}\n\n/**\n * A multi-reader pipeline that operates on feeds.\n * Might have a single writable feed.\n * Has a timeframe clock to handle message ordering.\n *\n * NOTE:\n * - Feeds passed in must have value encoding consistent with the type expected by the iterator/writer.\n *\n * # Usage examples\n *\n * ## Create a new space.\n *\n * 1. Generate space key, genesis feed key.\n * 2. Create and open pipeline reading from {}.\n * 3. Create and add the writable genesis feed.\n * 4. Write the initial sequence of control and credential messages.\n *\n * ## Load an existing space from storage\n *\n * 1. Load space key, genesis feed key, get starting timeframe from saved snapshot.\n * 2. Create and open pipeline reading from the initial timeframe.\n * 3. Open and add the genesis feed.\n * 4. Once the writable feed is added, the pipeline becomes writable.\n *\n * ## Join an existing space created by another agent/device.\n *\n * 1. Get the space key, genesis feed key from another agent.\n * 2. (optionally) Download the snapshot from another agent.\n * 3. Create and open pipeline.\n * 4. Generate the writable feed key.\n * 5. Wait for the writable feed to be added.\n */\nexport class Pipeline implements PipelineAccessor {\n private readonly _timeframeClock = new TimeframeClock(this._initialTimeframe);\n\n // Inbound feed stream.\n private readonly _feedSetIterator = new FeedSetIterator<FeedMessage>(createMessageSelector(this._timeframeClock), {\n start: startAfter(this._initialTimeframe),\n stallTimeout: 1000\n });\n\n // External state accessor.\n private readonly _state: PipelineState = new PipelineState(this._feedSetIterator, this._timeframeClock);\n\n // Waits for the message consumer to process the message and yield control back to the pipeline.\n private readonly _processingTrigger = new Trigger().wake();\n\n // Outbound feed writer.\n private _writer: FeedWriter<FeedMessage.Payload> | undefined;\n\n private _isOpen = false;\n\n // prettier-ignore\n constructor(\n private readonly _initialTimeframe: Timeframe = new Timeframe()\n ) {\n this._feedSetIterator.stalled.on((iterator) => {\n log.warn(`Stalled after ${iterator.options.stallTimeout}ms with ${iterator.size} feeds.`);\n });\n }\n\n get state() {\n return this._state;\n }\n\n get writer(): FeedWriter<FeedMessage.Payload> {\n assert(this._writer, 'Writer not set.');\n return this._writer;\n }\n\n getFeeds(): FeedWrapper<FeedMessage>[] {\n return this._feedSetIterator.feeds;\n }\n\n // NOTE: This cannot be synchronized with `stop` because stop waits for the mutation processing to complete,\n // which might be opening feeds during the mutation processing, which w\n async addFeed(feed: FeedWrapper<FeedMessage>) {\n await this._feedSetIterator.addFeed(feed);\n }\n\n hasFeed(feedKey: PublicKey) {\n return this._feedSetIterator.hasFeed(feedKey);\n }\n\n setWriteFeed(feed: FeedWrapper<FeedMessage>) {\n assert(!this._writer, 'Writer already set.');\n assert(feed.properties.writable, 'Feed must be writable.');\n\n this._writer = createMappedFeedWriter<FeedMessage.Payload, FeedMessage>(\n (payload: FeedMessage.Payload) => ({\n timeframe: this._timeframeClock.timeframe,\n payload\n }),\n feed.createFeedWriter()\n );\n }\n\n @synchronized\n async start() {\n log('starting...', {});\n await this._feedSetIterator.open();\n log('started');\n }\n\n @synchronized\n async stop() {\n log('stopping...', {});\n await this._feedSetIterator.close();\n await this._processingTrigger.wait(); // Wait for the in-flight message to be processed.\n log('stopped');\n }\n\n /**\n * Starts to iterate over the ordered messages from the added feeds.\n * Updates the timeframe clock after the message has bee processed.\n */\n async *consume(): AsyncIterable<FeedMessageBlock> {\n assert(!this._isOpen, 'Pipeline is already being consumed.');\n this._isOpen = true;\n\n for await (const block of this._feedSetIterator) {\n this._processingTrigger.reset();\n yield block;\n this._processingTrigger.wake();\n\n this._timeframeClock.updateTimeframe(PublicKey.from(block.feedKey), block.seq);\n }\n\n // TODO(burdon): Test re-entrant?\n this._isOpen = false;\n }\n}\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport debug from 'debug';\nimport assert from 'node:assert';\n\nimport { FeedBlock, FeedBlockSelector } from '@dxos/feed-store';\nimport type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\n\nimport { TimeframeClock } from './timeframe-clock';\n\nconst log = debug('dxos:echo-db:message-selector');\n\n/**\n * The MessageSelector makes sure that we read in a trusted order.\n * The first message we wish to process is the SpaceGenesis, which will admit a Feed.\n * As we encounter and process FeedAdmit messages those are added to the Space's trust,\n * and we begin processing messages from them as well.\n */\nexport const createMessageSelector = (timeframeClock: TimeframeClock): FeedBlockSelector<FeedMessage> => {\n return (messages: FeedBlock<FeedMessage>[]) => {\n // Pick the first candidate with a valid timeframe that has no gaps.\n for (let i = 0; i < messages.length; i++) {\n const {\n data: { timeframe }\n } = messages[i];\n assert(timeframe);\n\n if (!timeframeClock.hasGaps(timeframe)) {\n return i;\n }\n }\n\n // Not ready for this message yet.\n log('Skipping...');\n };\n};\n", "//\n// Copyright 2019 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { runInContext, scheduleTask } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { randomBytes } from '@dxos/crypto';\nimport { log } from '@dxos/log';\nimport { schema } from '@dxos/protocols';\nimport { AuthService } from '@dxos/protocols/proto/dxos/mesh/teleport/auth';\nimport { ExtensionContext, RpcExtension } from '@dxos/teleport';\n\nexport type AuthProvider = (nonce: Uint8Array) => Promise<Uint8Array | undefined>;\n\nexport type AuthVerifier = (nonce: Uint8Array, credential: Uint8Array) => Promise<boolean>;\n\nexport type AuthExtensionParams = {\n provider: AuthProvider;\n verifier: AuthVerifier;\n onAuthSuccess: () => void;\n onAuthFailure: () => void;\n};\n\nexport class AuthExtension extends RpcExtension<Services, Services> {\n private readonly _ctx = new Context({\n onError: (err) => {\n log.catch(err);\n }\n });\n\n constructor(private readonly _authParams: AuthExtensionParams) {\n super({\n requested: {\n AuthService: schema.getService('dxos.mesh.teleport.auth.AuthService')\n },\n exposed: {\n AuthService: schema.getService('dxos.mesh.teleport.auth.AuthService')\n },\n timeout: 60 * 1000 // Long timeout because auth can wait for sync in certain cases.\n });\n }\n\n protected async getHandlers(): Promise<Services> {\n return {\n AuthService: {\n authenticate: async ({ challenge }) => {\n try {\n const credential = await this._authParams.provider(challenge);\n if (!credential) {\n throw new Error('auth rejected');\n }\n return { credential };\n } catch (err) {\n log.error('failed to generate auth credentials', err);\n throw new Error('auth rejected');\n }\n }\n }\n };\n }\n\n override async onOpen(context: ExtensionContext): Promise<void> {\n await super.onOpen(context);\n scheduleTask(this._ctx, async () => {\n try {\n const challenge = randomBytes(32);\n const { credential } = await this.rpc.AuthService.authenticate({ challenge });\n assert(credential?.length > 0, 'invalid credential');\n const success = await this._authParams.verifier(challenge, credential);\n assert(success, 'credential not verified');\n runInContext(this._ctx, () => this._authParams.onAuthSuccess());\n } catch (err) {\n log.warn('auth failed', err);\n this.close();\n this._authParams.onAuthFailure();\n }\n });\n }\n\n override async onClose(): Promise<void> {\n await this._ctx.dispose();\n await super.onClose();\n }\n}\n\ntype Services = { AuthService: AuthService };\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event, synchronized, trackLeaks, Lock } from '@dxos/async';\nimport { FeedInfo } from '@dxos/credentials';\nimport { FeedWrapper } from '@dxos/feed-store';\nimport { PublicKey } from '@dxos/keys';\nimport { log, logInfo } from '@dxos/log';\nimport type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { AdmittedFeed, Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { Timeframe } from '@dxos/timeframe';\nimport { AsyncCallback, Callback } from '@dxos/util';\n\nimport { Pipeline, PipelineAccessor } from '../pipeline';\nimport { ControlPipeline } from './control-pipeline';\nimport { SpaceProtocol } from './space-protocol';\n\n// TODO(burdon): Factor out?\ntype FeedProvider = (feedKey: PublicKey) => Promise<FeedWrapper<FeedMessage>>;\n\nexport type SpaceParams = {\n spaceKey: PublicKey;\n protocol: SpaceProtocol;\n genesisFeed: FeedWrapper<FeedMessage>;\n feedProvider: FeedProvider;\n};\n\nexport type CreatePipelineParams = {\n start: Timeframe;\n // designation: AdmittedFeed.Designation;\n};\n\n/**\n * Spaces are globally addressable databases with access control.\n */\n// TODO(dmaretskyi): Extract database stuff.\n@trackLeaks('open', 'close')\nexport class Space {\n private readonly _addFeedLock = new Lock();\n\n public readonly onCredentialProcessed = new Callback<AsyncCallback<Credential>>();\n public readonly stateUpdate = new Event();\n public readonly protocol: SpaceProtocol;\n\n private readonly _key: PublicKey;\n private readonly _genesisFeedKey: PublicKey;\n private readonly _feedProvider: FeedProvider;\n private readonly _controlPipeline: ControlPipeline;\n\n private _isOpen = false;\n private _controlFeed?: FeedWrapper<FeedMessage>;\n private _dataFeed?: FeedWrapper<FeedMessage>;\n private _dataPipeline?: Pipeline;\n\n constructor({ spaceKey, protocol, genesisFeed, feedProvider }: SpaceParams) {\n assert(spaceKey && feedProvider);\n this._key = spaceKey;\n this._genesisFeedKey = genesisFeed.key;\n this._feedProvider = feedProvider;\n\n // TODO(dmaretskyi): Maybe reuse createPipeline method.\n this._controlPipeline = new ControlPipeline({ spaceKey, genesisFeed, feedProvider });\n\n // TODO(dmaretskyi): Feed set abstraction.\n this._controlPipeline.onFeedAdmitted.set(async (info) => {\n if (info.assertion.designation === AdmittedFeed.Designation.DATA) {\n // We will add all existing data feeds when the data pipeline is initialized.\n await this._addFeedLock.executeSynchronized(async () => {\n if (this._dataPipeline) {\n if (!this._dataPipeline.hasFeed(info.key)) {\n return this._dataPipeline.addFeed(await this._feedProvider(info.key));\n }\n }\n });\n }\n\n if (!info.key.equals(genesisFeed.key)) {\n this.protocol.addFeed(await feedProvider(info.key));\n }\n });\n\n this._controlPipeline.onCredentialProcessed.set(async (credential) => {\n await this.onCredentialProcessed.callIfSet(credential);\n log('onCredentialProcessed', { credential });\n this.stateUpdate.emit();\n });\n\n // Start replicating the genesis feed.\n this.protocol = protocol;\n this.protocol.addFeed(genesisFeed);\n }\n\n @logInfo\n get key() {\n return this._key;\n }\n\n get isOpen() {\n return this._isOpen;\n }\n\n get genesisFeedKey(): PublicKey {\n return this._genesisFeedKey;\n }\n\n get controlFeedKey() {\n return this._controlFeed?.key;\n }\n\n get dataFeedKey() {\n return this._dataFeed?.key;\n }\n\n get spaceState() {\n return this._controlPipeline.spaceState;\n }\n\n /**\n * @test-only\n */\n get controlPipeline(): PipelineAccessor {\n return this._controlPipeline.pipeline;\n }\n\n setControlFeed(feed: FeedWrapper<FeedMessage>) {\n assert(!this._controlFeed, 'Control feed already set.');\n this._controlFeed = feed;\n this._controlPipeline.setWriteFeed(feed);\n return this;\n }\n\n setDataFeed(feed: FeedWrapper<FeedMessage>) {\n assert(!this._dataFeed, 'Data feed already set.');\n this._dataFeed = feed;\n this._dataPipeline?.setWriteFeed(feed);\n return this;\n }\n\n /**\n * Use for diagnostics.\n */\n getControlFeeds(): FeedInfo[] {\n return Array.from(this._controlPipeline.spaceState.feeds.values());\n }\n\n /**\n * Use for diagnostics.\n */\n // getDataFeeds(): FeedInfo[] {\n // return this._dataPipeline?.getFeeds();\n // }\n @synchronized\n async open() {\n log('opening...');\n if (this._isOpen) {\n return;\n }\n\n // Order is important.\n await this._controlPipeline.start();\n await this.protocol.start();\n\n this._isOpen = true;\n log('opened');\n }\n\n @synchronized\n async close() {\n log('closing...', { key: this._key });\n if (!this._isOpen) {\n return;\n }\n\n // Closes in reverse order to open.\n await this.protocol.stop();\n await this._controlPipeline.stop();\n\n this._isOpen = false;\n log('closed');\n }\n\n // TODO(dmaretskyi): Make reusable.\n async createDataPipeline({ start }: CreatePipelineParams) {\n assert(this._isOpen, 'Space must be open to initialize data pipeline.');\n assert(!this._dataPipeline, 'Data pipeline already initialized.');\n\n const pipeline = new Pipeline(start);\n if (this._dataFeed) {\n pipeline.setWriteFeed(this._dataFeed);\n }\n\n this._dataPipeline = pipeline;\n\n // Add existing feeds.\n await this._addFeedLock.executeSynchronized(async () => {\n for (const feed of this._controlPipeline.spaceState.feeds.values()) {\n if (feed.assertion.designation === AdmittedFeed.Designation.DATA && !pipeline.hasFeed(feed.key)) {\n await pipeline.addFeed(await this._feedProvider(feed.key));\n }\n }\n });\n\n return pipeline;\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { SpaceStateMachine, SpaceState, MemberInfo, FeedInfo } from '@dxos/credentials';\nimport { FeedWrapper } from '@dxos/feed-store';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { AdmittedFeed, Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { Timeframe } from '@dxos/timeframe';\nimport { AsyncCallback, Callback } from '@dxos/util';\n\nimport { Pipeline, PipelineAccessor } from '../pipeline';\n\nexport type ControlPipelineParams = {\n spaceKey: PublicKey;\n genesisFeed: FeedWrapper<FeedMessage>;\n feedProvider: (feedKey: PublicKey) => Promise<FeedWrapper<FeedMessage>>;\n initialTimeframe?: Timeframe;\n};\n\n/**\n * Processes HALO credentials, which include genesis and invitations.\n */\nexport class ControlPipeline {\n private readonly _pipeline: Pipeline;\n private readonly _spaceStateMachine: SpaceStateMachine;\n\n public readonly onFeedAdmitted = new Callback<AsyncCallback<FeedInfo>>();\n public readonly onMemberAdmitted: Callback<AsyncCallback<MemberInfo>>;\n public readonly onCredentialProcessed: Callback<AsyncCallback<Credential>>;\n\n constructor({ spaceKey, genesisFeed, feedProvider, initialTimeframe }: ControlPipelineParams) {\n this._pipeline = new Pipeline(initialTimeframe);\n void this._pipeline.addFeed(genesisFeed); // TODO(burdon): Require async open/close?\n\n this._spaceStateMachine = new SpaceStateMachine(spaceKey);\n this._spaceStateMachine.onFeedAdmitted.set(async (info) => {\n // log('feed admitted', { info });\n log('feed admitted', { key: info.key });\n\n // TODO(burdon): Check not stopping.\n if (info.assertion.designation === AdmittedFeed.Designation.CONTROL && !info.key.equals(genesisFeed.key)) {\n try {\n const feed = await feedProvider(info.key);\n await this._pipeline.addFeed(feed);\n } catch (err: any) {\n log.catch(err);\n }\n }\n\n await this.onFeedAdmitted.callIfSet(info);\n });\n\n this.onMemberAdmitted = this._spaceStateMachine.onMemberAdmitted;\n this.onCredentialProcessed = this._spaceStateMachine.onCredentialProcessed;\n }\n\n get spaceState(): SpaceState {\n return this._spaceStateMachine;\n }\n\n get pipeline(): PipelineAccessor {\n return this._pipeline;\n }\n\n setWriteFeed(feed: FeedWrapper<FeedMessage>) {\n this._pipeline.setWriteFeed(feed);\n }\n\n async start() {\n log('starting...');\n setTimeout(async () => {\n for await (const msg of this._pipeline.consume()) {\n try {\n // log('processing', { msg });\n log('processing', { key: msg.feedKey, seq: msg.seq });\n if (msg.data.payload.credential) {\n const result = await this._spaceStateMachine.process(\n msg.data.payload.credential.credential,\n PublicKey.from(msg.feedKey)\n );\n if (!result) {\n log.warn('processing failed', { msg });\n }\n }\n } catch (err: any) {\n log.catch(err);\n }\n }\n });\n\n await this._pipeline.start();\n log('started');\n }\n\n async stop() {\n log('stopping...');\n await this._pipeline.stop();\n log('stopped');\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { discoveryKey, sha256 } from '@dxos/crypto';\nimport { FeedWrapper } from '@dxos/feed-store';\nimport { PublicKey } from '@dxos/keys';\nimport { log, logInfo } from '@dxos/log';\nimport {\n MMSTTopology,\n NetworkManager,\n SwarmConnection,\n WireProtocol,\n WireProtocolParams,\n WireProtocolProvider\n} from '@dxos/network-manager';\nimport type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { Teleport } from '@dxos/teleport';\nimport { ReplicatorExtension } from '@dxos/teleport-extension-replicator';\nimport { ComplexMap } from '@dxos/util';\n\nimport { AuthExtension, AuthProvider, AuthVerifier } from './auth';\n\nexport const MOCK_AUTH_PROVIDER: AuthProvider = async (nonce: Uint8Array) => Buffer.from('mock');\nexport const MOCK_AUTH_VERIFIER: AuthVerifier = async (nonce: Uint8Array, credential: Uint8Array) => true;\n\n// TODO(burdon): Reconcile with SigningContext (define types together).\nexport interface SwarmIdentity {\n peerKey: PublicKey;\n credentialProvider: AuthProvider;\n credentialAuthenticator: AuthVerifier;\n}\n\nexport type SpaceProtocolOptions = {\n topic: PublicKey; // TODO(burdon): Rename?\n swarmIdentity: SwarmIdentity;\n networkManager: NetworkManager;\n /**\n * Called when new session is authenticated.\n * Additional extensions can be added here.\n */\n onSessionAuth?: (session: Teleport) => void;\n};\n\n/**\n * Manages Teleport protocol stream creation and joining swarms with replication and presence extensions.\n */\nexport class SpaceProtocol {\n private readonly _networkManager: NetworkManager;\n private readonly _swarmIdentity: SwarmIdentity;\n private readonly _onSessionAuth?: (session: Teleport) => void;\n\n @logInfo\n private readonly _topic: PublicKey;\n\n private readonly _feeds = new Set<FeedWrapper<FeedMessage>>();\n private readonly _sessions = new ComplexMap<PublicKey, SpaceProtocolSession>(PublicKey.hash);\n\n private _connection?: SwarmConnection;\n\n get sessions(): ReadonlyMap<PublicKey, SpaceProtocolSession> {\n return this._sessions;\n }\n\n get feeds(): ReadonlySet<FeedWrapper<FeedMessage>> {\n return this._feeds;\n }\n\n @logInfo\n private get _ownPeerKey() {\n return this._swarmIdentity.peerKey;\n }\n\n constructor({ topic, swarmIdentity, networkManager, onSessionAuth }: SpaceProtocolOptions) {\n this._networkManager = networkManager;\n this._swarmIdentity = swarmIdentity;\n this._onSessionAuth = onSessionAuth;\n\n this._topic = PublicKey.from(discoveryKey(sha256(topic.toHex())));\n }\n\n // TODO(burdon): Create abstraction for Space (e.g., add keys and have provider).\n addFeed(feed: FeedWrapper<FeedMessage>) {\n log('addFeed', { key: feed.key });\n\n this._feeds.add(feed);\n for (const session of this._sessions.values()) {\n session.replicator.addFeed(feed);\n }\n }\n\n async start() {\n if (this._connection) {\n return;\n }\n\n // TODO(burdon): Document why empty buffer.\n const credentials = await this._swarmIdentity.credentialProvider(Buffer.from(''));\n\n // TODO(burdon): Move to config (with sensible defaults).\n const topologyConfig = {\n originateConnections: 4,\n maxPeers: 10,\n sampleSize: 20\n };\n\n log('starting...');\n this._connection = await this._networkManager.joinSwarm({\n protocolProvider: this._createProtocolProvider(credentials),\n peerId: this._swarmIdentity.peerKey,\n topic: this._topic,\n topology: new MMSTTopology(topologyConfig),\n label: `Protocol swarm: ${this._topic}`\n });\n\n log('started');\n }\n\n async stop() {\n if (this._connection) {\n log('stopping...');\n await this._connection.close();\n log('stopped');\n }\n }\n\n private _createProtocolProvider(credentials: Uint8Array | undefined): WireProtocolProvider {\n return (wireParams) => {\n const session = new SpaceProtocolSession({\n wireParams,\n swarmIdentity: this._swarmIdentity,\n onSessionAuth: this._onSessionAuth\n });\n this._sessions.set(wireParams.remotePeerId, session);\n\n for (const feed of this._feeds) {\n session.replicator.addFeed(feed);\n }\n\n return session;\n };\n }\n}\n\nexport type SpaceProtocolSessionParams = {\n wireParams: WireProtocolParams;\n swarmIdentity: SwarmIdentity;\n /**\n * Called when new session is authenticated.\n * Additional extensions can be added here.\n */\n onSessionAuth?: (session: Teleport) => void;\n};\n\nexport enum AuthStatus {\n INITIAL = 'INITIAL',\n SUCCESS = 'SUCCESS',\n FAILURE = 'FAILURE'\n}\n\n// TODO(dmaretskyi): Move to a separate file.\n/**\n * Represents a single connection to a remote peer\n */\nexport class SpaceProtocolSession implements WireProtocol {\n @logInfo\n private readonly _wireParams: WireProtocolParams;\n\n private readonly _onSessionAuth?: (session: Teleport) => void;\n private readonly _swarmIdentity: SwarmIdentity;\n\n private readonly _teleport: Teleport;\n\n // TODO(dmaretskyi): Start with upload=false when switching it on the fly works.\n public readonly replicator = new ReplicatorExtension().setOptions({ upload: true });\n\n private _authStatus = AuthStatus.INITIAL;\n\n @logInfo\n get authStatus() {\n return this._authStatus;\n }\n\n // TODO(dmaretskyi): Allow to pass in extra extensions.\n constructor({ wireParams, swarmIdentity, onSessionAuth }: SpaceProtocolSessionParams) {\n this._wireParams = wireParams;\n this._swarmIdentity = swarmIdentity;\n this._onSessionAuth = onSessionAuth;\n\n this._teleport = new Teleport(wireParams);\n }\n\n get stream() {\n return this._teleport.stream;\n }\n\n async initialize(): Promise<void> {\n await this._teleport.open();\n this._teleport.addExtension(\n 'dxos.mesh.teleport.auth',\n new AuthExtension({\n provider: this._swarmIdentity.credentialProvider,\n verifier: this._swarmIdentity.credentialAuthenticator,\n onAuthSuccess: () => {\n this._authStatus = AuthStatus.SUCCESS;\n log('Peer authenticated');\n this._onSessionAuth?.(this._teleport);\n // TODO(dmaretskyi): Configure replicator to upload.\n },\n onAuthFailure: () => {\n log.warn('Auth failed');\n this._authStatus = AuthStatus.FAILURE;\n }\n })\n );\n this._teleport.addExtension('dxos.mesh.teleport.replicator', this.replicator);\n }\n\n async destroy(): Promise<void> {\n await this._teleport.close();\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { synchronized, trackLeaks } from '@dxos/async';\nimport { CredentialSigner } from '@dxos/credentials';\nimport { failUndefined } from '@dxos/debug';\nimport { FeedStore } from '@dxos/feed-store';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { NetworkManager } from '@dxos/network-manager';\nimport { trace } from '@dxos/protocols';\nimport type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { SpaceMetadata } from '@dxos/protocols/proto/dxos/echo/metadata';\nimport { Credential, ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { Teleport } from '@dxos/teleport';\nimport { ComplexMap } from '@dxos/util';\n\nimport { Space } from './space';\nimport { SpaceProtocol, SwarmIdentity } from './space-protocol';\n\n// TODO(burdon): Factor out to DataSpaceManager\nexport interface SigningContext {\n identityKey: PublicKey;\n deviceKey: PublicKey;\n credentialSigner: CredentialSigner; // TODO(burdon): Already has keyring.\n recordCredential: (credential: Credential) => Promise<void>;\n profile?: ProfileDocument;\n}\n\nexport type SpaceManagerParams = {\n feedStore: FeedStore<FeedMessage>;\n networkManager: NetworkManager;\n};\n\nexport type ConstructSpaceParams = {\n metadata: SpaceMetadata;\n swarmIdentity: SwarmIdentity;\n onNetworkConnection: (session: Teleport) => void;\n};\n\n/**\n * Manages a collection of ECHO (Data) Spaces.\n */\n@trackLeaks('open', 'close')\nexport class SpaceManager {\n private readonly _spaces = new ComplexMap<PublicKey, Space>(PublicKey.hash);\n private readonly _feedStore: FeedStore<FeedMessage>;\n private readonly _networkManager: NetworkManager;\n private readonly _instanceId = PublicKey.random().toHex();\n\n constructor({ feedStore, networkManager }: SpaceManagerParams) {\n // TODO(burdon): Assert.\n this._feedStore = feedStore;\n this._networkManager = networkManager;\n }\n\n // TODO(burdon): Remove.\n get spaces() {\n return this._spaces;\n }\n\n @synchronized\n async open() {\n log.trace('dxos.echo.space-manager', trace.begin({ id: this._instanceId }));\n }\n\n @synchronized\n async close() {\n await Promise.all([...this._spaces.values()].map((space) => space.close()));\n log.trace('dxos.echo.space-manager', trace.end({ id: this._instanceId }));\n }\n\n async constructSpace({ metadata, swarmIdentity, onNetworkConnection }: ConstructSpaceParams) {\n log('constructing space...', { spaceKey: metadata.genesisFeedKey });\n\n // The genesis feed will be the same as the control feed if the space was created by the local agent.\n const genesisFeed = await this._feedStore.openFeed(metadata.genesisFeedKey ?? failUndefined());\n\n const spaceKey = metadata.key;\n const protocol = new SpaceProtocol({\n topic: spaceKey,\n swarmIdentity,\n networkManager: this._networkManager,\n onSessionAuth: onNetworkConnection\n });\n\n const space = new Space({\n spaceKey,\n protocol,\n genesisFeed,\n feedProvider: (feedKey) => this._feedStore.openFeed(feedKey)\n });\n this._spaces.set(space.key, space);\n return space;\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { createCredential } from '@dxos/credentials';\nimport { failUndefined } from '@dxos/debug';\nimport { Keyring } from '@dxos/keyring';\nimport { AdmittedFeed, SpaceMember } from '@dxos/protocols/proto/dxos/halo/credentials';\n\nimport { Space } from './space';\nimport { SigningContext } from './space-manager';\n\nexport const spaceGenesis = async (keyring: Keyring, signingContext: SigningContext, space: Space) => {\n // TODO(dmaretskyi): Find a way to reconcile with credential generator.\n const credentials = [\n await createCredential({\n signer: keyring,\n issuer: space.key,\n subject: space.key,\n assertion: {\n '@type': 'dxos.halo.credentials.SpaceGenesis',\n spaceKey: space.key\n }\n }),\n\n await createCredential({\n signer: keyring,\n issuer: space.key,\n subject: signingContext.identityKey,\n assertion: {\n '@type': 'dxos.halo.credentials.SpaceMember',\n spaceKey: space.key,\n role: SpaceMember.Role.ADMIN,\n profile: signingContext.profile,\n genesisFeedKey: space.controlFeedKey ?? failUndefined()\n }\n }),\n\n await signingContext.credentialSigner.createCredential({\n subject: space.controlFeedKey ?? failUndefined(),\n assertion: {\n '@type': 'dxos.halo.credentials.AdmittedFeed',\n spaceKey: space.key,\n identityKey: signingContext.identityKey,\n deviceKey: signingContext.deviceKey,\n designation: AdmittedFeed.Designation.CONTROL\n }\n }),\n\n await signingContext.credentialSigner.createCredential({\n subject: space.dataFeedKey ?? failUndefined(),\n assertion: {\n '@type': 'dxos.halo.credentials.AdmittedFeed',\n spaceKey: space.key,\n identityKey: signingContext.identityKey,\n deviceKey: signingContext.deviceKey,\n designation: AdmittedFeed.Designation.DATA\n }\n })\n ];\n\n for (const credential of credentials) {\n await space.controlPipeline.writer.write({\n credential: { credential }\n });\n }\n\n return credentials;\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { tagMutationsInBatch, ItemDemuxer, ItemManager, setMetadataOnObject } from '@dxos/echo-db';\nimport { FeedWriter } from '@dxos/feed-store';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { DataMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { EchoEvent, MutationReceipt, WriteRequest } from '@dxos/protocols/proto/dxos/echo/service';\nimport { ComplexMap } from '@dxos/util';\n\n/**\n * Provides methods for DataService for a single space.\n * A DataServiceRouter must be placed before it to route requests to different DataServiceHost instances based on space id.\n */\n// TODO(burdon): Move to client-services.\nexport class DataServiceHost {\n private readonly _clientTagMap = new ComplexMap<[feedKey: PublicKey, seq: number], string>(\n ([feedKey, seq]) => `${feedKey.toHex()}:${seq}`\n );\n\n constructor(\n private readonly _itemManager: ItemManager,\n private readonly _itemDemuxer: ItemDemuxer,\n private readonly _writeStream?: FeedWriter<DataMessage>\n ) {}\n\n /**\n * Real-time subscription to data objects in a space.\n */\n subscribe(): Stream<EchoEvent> {\n return new Stream(({ next, ctx }) => {\n // send current state\n const objects = Array.from(this._itemManager.entities.values()).map((entity) => entity.createSnapshot());\n\n next({\n batch: {\n objects\n }\n });\n\n // subscribe to mutations\n\n this._itemDemuxer.mutation.on(ctx, (message) => {\n const { batch, meta } = message;\n log('Object update', { batch, meta });\n\n const clientTag = this._clientTagMap.get([message.meta.feedKey, message.meta.seq]);\n // TODO(dmaretskyi): Memorąąy leak with _clientTagMap not getting cleared.\n\n // Assign feed metadata\n batch.objects?.forEach((object) => {\n setMetadataOnObject(object, meta);\n });\n\n // Assign client tag metadata\n if (clientTag) {\n tagMutationsInBatch(batch, clientTag);\n }\n\n next({\n clientTag,\n feedKey: message.meta.feedKey,\n seq: message.meta.seq,\n batch\n });\n });\n });\n }\n\n async write(request: WriteRequest): Promise<MutationReceipt> {\n assert(this._writeStream, 'Cannot write mutations in readonly mode');\n\n // Clear client metadata.\n const receipt = await this._writeStream.write({\n batch: {\n objects: request.batch.objects?.map((object) => ({\n ...object,\n mutations: object.mutations?.map((m) => ({\n ...m,\n meta: undefined\n })),\n meta: undefined\n }))\n }\n });\n if (request.clientTag) {\n this._clientTagMap.set([receipt.feedKey, receipt.seq], request.clientTag);\n }\n\n return receipt;\n }\n}\n", "//\n\n//\n// Copyright 2023 DXOS.org\n//\n\nimport { EchoProcessor, ItemDemuxer, ItemManager } from '@dxos/echo-db';\nimport { FeedWriter } from '@dxos/feed-store';\nimport { ModelFactory } from '@dxos/model-factory';\nimport { DataMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { EchoSnapshot } from '@dxos/protocols/proto/dxos/echo/snapshot';\n\nimport { DataServiceHost } from './data-service-host';\n\n/**\n * Database backend that operates on two streams: read and write.\n * Mutations are read from the incoming streams and applied to the ItemManager via ItemDemuxer.\n * Write operations result in mutations being written to the outgoing stream.\n */\nexport class DatabaseBackendHost {\n private _echoProcessor!: EchoProcessor;\n private _itemManager!: ItemManager;\n public _itemDemuxer!: ItemDemuxer;\n\n constructor(\n private readonly _outboundStream: FeedWriter<DataMessage> | undefined,\n private readonly _snapshot?: EchoSnapshot\n ) {}\n\n get isReadOnly(): boolean {\n return !!this._outboundStream;\n }\n\n get echoProcessor() {\n return this._echoProcessor;\n }\n\n async open(itemManager: ItemManager, modelFactory: ModelFactory) {\n this._itemManager = itemManager;\n this._itemManager._debugLabel = 'host';\n\n this._itemDemuxer = new ItemDemuxer(itemManager, modelFactory);\n this._echoProcessor = this._itemDemuxer.open();\n\n if (this._snapshot) {\n this._itemDemuxer.restoreFromSnapshot(this._snapshot);\n }\n }\n\n async close() {}\n\n getWriteStream(): FeedWriter<DataMessage> | undefined {\n return this._outboundStream;\n }\n\n createSnapshot() {\n return this._itemDemuxer.createSnapshot();\n }\n\n createDataServiceHost() {\n return new DataServiceHost(this._itemManager, this._itemDemuxer, this._outboundStream ?? undefined);\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { trackLeaks } from '@dxos/async';\nimport { schema } from '@dxos/protocols';\nimport { SpaceSnapshot } from '@dxos/protocols/proto/dxos/echo/snapshot';\nimport { DataObject } from '@dxos/protocols/proto/dxos/mesh/teleport/objectsync';\nimport { ObjectSync } from '@dxos/teleport-extension-object-sync';\n\nimport { SnapshotStore } from './snapshot-store';\n\n/**\n * Snapshot manager for a specific space.\n */\n@trackLeaks('open', 'close')\nexport class SnapshotManager {\n private readonly _objectSync: ObjectSync;\n\n // prettier-ignore\n constructor(\n private readonly _snapshotStore: SnapshotStore\n ) {\n this._objectSync = new ObjectSync({\n getObject: async (id: string) => {\n const snapshot = await this._snapshotStore.loadSnapshot(id);\n if (!snapshot) {\n return undefined;\n }\n return {\n id,\n payload: schema.getCodecForType('dxos.echo.snapshot.SpaceSnapshot').encodeAsAny(snapshot)\n };\n },\n setObject: async (data: DataObject) => {\n const snapshot = schema.getCodecForType('dxos.echo.snapshot.SpaceSnapshot').decode(data.payload);\n await this._snapshotStore.saveSnapshot(snapshot);\n }\n });\n }\n\n get objectSync() {\n return this._objectSync;\n }\n\n async open() {\n await this._objectSync.open();\n }\n\n async close() {\n await this._objectSync.close();\n }\n\n async load(id: string): Promise<SpaceSnapshot> {\n const local = await this._snapshotStore.loadSnapshot(id);\n if (local) {\n return local;\n }\n\n const remote = await this._objectSync.download(id);\n return schema.getCodecForType('dxos.echo.snapshot.SpaceSnapshot').decode(remote.payload);\n }\n\n async store(snapshot: SpaceSnapshot): Promise<string> {\n const id = await this._snapshotStore.saveSnapshot(snapshot);\n return id;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { subtleCrypto } from '@dxos/crypto';\nimport { schema } from '@dxos/protocols';\nimport { SpaceSnapshot } from '@dxos/protocols/proto/dxos/echo/snapshot';\nimport { Directory } from '@dxos/random-access-storage';\n\nexport class SnapshotStore {\n // prettier-ignore\n constructor(\n private readonly _directory: Directory\n ) {}\n\n async saveSnapshot(snapshot: SpaceSnapshot): Promise<string> {\n const encoded = schema.getCodecForType('dxos.echo.snapshot.SpaceSnapshot').encode(snapshot);\n const key = await subtleCrypto.digest('SHA-256', encoded);\n const keyString = Buffer.from(key).toString('hex');\n\n const file = await this._directory.getOrCreateFile(keyString);\n try {\n await file.write(0, Buffer.from(encoded));\n } finally {\n await file.close();\n }\n\n return keyString;\n }\n\n async loadSnapshot(key: string): Promise<SpaceSnapshot | undefined> {\n const file = await this._directory.getOrCreateFile(key);\n try {\n const { size } = await file.stat();\n if (size === 0) {\n return undefined;\n }\n\n const buffer = await file.read(0, size);\n return schema.getCodecForType('dxos.echo.snapshot.SpaceSnapshot').decode(buffer);\n } finally {\n await file.close();\n }\n }\n}\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { raise } from '@dxos/debug';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport {\n DataService,\n MutationReceipt,\n SubscribeRequest,\n EchoEvent,\n WriteRequest\n} from '@dxos/protocols/proto/dxos/echo/service';\nimport { ComplexMap } from '@dxos/util';\n\nimport { DataServiceHost } from './data-service-host';\n\n// TODO(burdon): Clear on close.\nexport class DataServiceSubscriptions {\n private readonly _spaces = new ComplexMap<PublicKey, DataServiceHost>(PublicKey.hash);\n\n clear() {\n this._spaces.clear();\n }\n\n registerSpace(spaceKey: PublicKey, host: DataServiceHost) {\n log('Registering space', { spaceKey });\n this._spaces.set(spaceKey, host);\n }\n\n unregisterSpace(spaceKey: PublicKey) {\n log('Unregistering space', { spaceKey });\n this._spaces.delete(spaceKey);\n }\n\n getDataService(spaceKey: PublicKey) {\n return this._spaces.get(spaceKey);\n }\n}\n\n/**\n * Routes DataService requests to different DataServiceHost instances based on space id.\n */\n// TODO(burdon): Move to client-services.\nexport class DataServiceImpl implements DataService {\n constructor(private readonly _subscriptions: DataServiceSubscriptions) {}\n\n subscribe(request: SubscribeRequest): Stream<EchoEvent> {\n assert(request.spaceKey);\n const host =\n this._subscriptions.getDataService(request.spaceKey) ?? raise(new Error(`space not found: ${request.spaceKey}`));\n return host.subscribe();\n }\n\n write(request: WriteRequest): Promise<MutationReceipt> {\n assert(request.spaceKey);\n assert(request.batch);\n const host =\n this._subscriptions.getDataService(request.spaceKey) ?? raise(new Error(`space not found: ${request.spaceKey}`));\n return host.write(request);\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event, scheduleTask, synchronized, trackLeaks } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { FeedInfo } from '@dxos/credentials';\nimport { failUndefined } from '@dxos/debug';\nimport { ItemManager } from '@dxos/echo-db';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ModelFactory } from '@dxos/model-factory';\nimport { DataMessage, FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { SpaceSnapshot } from '@dxos/protocols/proto/dxos/echo/snapshot';\nimport { Timeframe } from '@dxos/timeframe';\n\nimport { createMappedFeedWriter } from '../common';\nimport { DatabaseBackendHost, SnapshotManager } from '../dbhost';\nimport { MetadataStore } from '../metadata';\nimport { Pipeline } from '../pipeline';\n\nexport interface PipelineFactory {\n openPipeline: (start: Timeframe) => Promise<Pipeline>;\n}\n\nexport type DataPipelineParams = {\n modelFactory: ModelFactory;\n snapshotManager: SnapshotManager;\n metadataStore: MetadataStore;\n memberKey: PublicKey;\n spaceKey: PublicKey;\n feedInfoProvider: (feedKey: PublicKey) => FeedInfo | undefined;\n snapshotId: string | undefined;\n};\n\n/**\n * Number of mutations since the last snapshot before we automatically create another snapshot.\n */\nconst MESSAGES_PER_SNAPSHOT = 10;\n\n/**\n * Minimum time between automatic snapshots.\n */\nconst AUTOMATIC_SNAPSHOT_DEBOUNCE_INTERVAL = 5000;\n\n/**\n * Minimum time between recording latest timeframe in metadata.\n */\nconst TIMEFRAME_SAVE_DEBOUNCE_INTERVAL = 500;\n\n/**\n * Flag to disable automatic local snapshots.\n */\nconst DISABLE_SNAPSHOT_CACHE = true;\n\n/**\n * Controls data pipeline in the space.\n * Consumes the pipeline and updates the database.\n * Reacts to new epochs to restart the pipeline.\n */\n@trackLeaks('open', 'close')\nexport class DataPipeline {\n private _ctx = new Context();\n private _spaceContext!: PipelineFactory;\n private _pipeline?: Pipeline;\n private _snapshot?: SpaceSnapshot;\n private _targetTimeframe?: Timeframe;\n\n private _lastAutomaticSnapshotTimeframe = new Timeframe();\n private _isOpen = false;\n\n public readonly onTimeframeReached = new Event<Timeframe>();\n\n constructor(private readonly _params: DataPipelineParams) {}\n\n public _itemManager!: ItemManager;\n public databaseBackend?: DatabaseBackendHost;\n\n get isOpen() {\n return this._isOpen;\n }\n\n get pipelineState() {\n return this._pipeline?.state;\n }\n\n get snapshotTimeframe() {\n return this._snapshot?.timeframe;\n }\n\n getStartTimeframe(): Timeframe {\n return snapshotTimeframeToStartingTimeframe(this.snapshotTimeframe ?? new Timeframe());\n }\n\n setTargetTimeframe(timeframe: Timeframe) {\n this._targetTimeframe = timeframe;\n this._pipeline?.state.setTargetTimeframe(timeframe);\n }\n\n @synchronized\n async open(spaceContext: PipelineFactory) {\n if (this._isOpen) {\n return;\n }\n\n this._spaceContext = spaceContext;\n if (this._params.snapshotId && !DISABLE_SNAPSHOT_CACHE) {\n this._snapshot = await this._params.snapshotManager.load(this._params.snapshotId);\n this._lastAutomaticSnapshotTimeframe = this._snapshot?.timeframe ?? new Timeframe();\n }\n\n this._pipeline = await this._spaceContext.openPipeline(this.getStartTimeframe());\n if (this._targetTimeframe) {\n this._pipeline.state.setTargetTimeframe(this._targetTimeframe);\n }\n\n // Create database backend.\n const feedWriter = createMappedFeedWriter<DataMessage, FeedMessage.Payload>(\n (data: DataMessage) => ({ data }),\n this._pipeline.writer ?? failUndefined()\n );\n\n this.databaseBackend = new DatabaseBackendHost(feedWriter, this._snapshot?.database);\n this._itemManager = new ItemManager(this._params.modelFactory);\n\n // Connect pipeline to the database.\n await this.databaseBackend.open(this._itemManager, this._params.modelFactory);\n\n // Start message processing loop.\n scheduleTask(this._ctx, async () => {\n await this._consumePipeline();\n });\n\n this._createPeriodicSnapshots();\n\n this._isOpen = true;\n }\n\n private _createPeriodicSnapshots() {\n // Record last timeframe.\n this.onTimeframeReached.debounce(TIMEFRAME_SAVE_DEBOUNCE_INTERVAL).on(this._ctx, async () => {\n await this._saveLatestTimeframe();\n });\n\n if (!DISABLE_SNAPSHOT_CACHE) {\n this.onTimeframeReached.debounce(AUTOMATIC_SNAPSHOT_DEBOUNCE_INTERVAL).on(this._ctx, async () => {\n const latestTimeframe = this._pipeline?.state.timeframe;\n if (!latestTimeframe) {\n return;\n }\n\n // Save snapshot.\n if (\n latestTimeframe.totalMessages() - this._lastAutomaticSnapshotTimeframe.totalMessages() >\n MESSAGES_PER_SNAPSHOT\n ) {\n const snapshot = await this._saveSnapshot();\n this._lastAutomaticSnapshotTimeframe = snapshot.timeframe ?? failUndefined();\n log('save', { snapshot });\n }\n });\n }\n }\n\n private async _saveSnapshot() {\n const snapshot = await this.createSnapshot();\n const snapshotKey = await this._params.snapshotManager.store(snapshot);\n await this._params.metadataStore.setSpaceSnapshot(this._params.spaceKey, snapshotKey);\n return snapshot;\n }\n\n private async _saveLatestTimeframe() {\n const latestTimeframe = this._pipeline?.state.timeframe;\n log('save latest timeframe', { latestTimeframe, spaceKey: this._params.spaceKey });\n if (latestTimeframe) {\n const newTimeframe = Timeframe.merge(this._targetTimeframe ?? new Timeframe(), latestTimeframe);\n await this._params.metadataStore.setSpaceLatestTimeframe(this._params.spaceKey, newTimeframe);\n }\n }\n\n @synchronized\n async close() {\n if (!this._isOpen) {\n return;\n }\n log('close');\n this._isOpen = false;\n\n try {\n await this._saveLatestTimeframe();\n await this._saveSnapshot();\n } catch (err) {\n log.catch(err);\n }\n await this._ctx.dispose();\n await this._pipeline?.stop();\n await this.databaseBackend?.close();\n await this._itemManager?.destroy();\n await this._params.snapshotManager.close();\n }\n\n createSnapshot(): SpaceSnapshot {\n assert(this.databaseBackend, 'Database backend is not initialized.');\n return {\n spaceKey: this._params.spaceKey.asUint8Array(),\n timeframe: this._pipeline?.state.timeframe ?? new Timeframe(),\n database: this.databaseBackend!.createSnapshot()\n };\n }\n\n private async _consumePipeline() {\n assert(this._pipeline, 'Pipeline is not initialized.');\n for await (const msg of this._pipeline.consume()) {\n const { feedKey, seq, data } = msg;\n log('processing message', { msg });\n\n try {\n if (data.payload.data) {\n const feedInfo = this._params.feedInfoProvider(feedKey);\n if (!feedInfo) {\n log.error('Could not find feed.', { feedKey });\n continue;\n }\n\n await this.databaseBackend!.echoProcessor({\n batch: data.payload.data.batch,\n meta: {\n feedKey,\n seq,\n timeframe: data.timeframe,\n memberKey: feedInfo.assertion.identityKey\n }\n });\n this.onTimeframeReached.emit(data.timeframe);\n }\n } catch (err: any) {\n log.catch(err);\n }\n }\n }\n\n async waitUntilTimeframe(timeframe: Timeframe) {\n assert(this._pipeline, 'Pipeline is not initialized.');\n await this._pipeline.state.waitUntilTimeframe(timeframe);\n }\n}\n\n/**\n * Increase all indexes by one so that we start processing the next mutation after the one in the snapshot.\n */\nconst snapshotTimeframeToStartingTimeframe = (snapshotTimeframe: Timeframe) => {\n return snapshotTimeframe.map(([key, seq]) => [key, seq + 1]);\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["assert", "synchronized", "log", "schema", "STORAGE_VERSION", "emptyEchoMetadata", "version", "spaces", "created", "Date", "updated", "MetadataStore", "constructor", "_directory", "_metadata", "load", "file", "getOrCreateFile", "size", "fileLength", "stat", "dataSize", "fromBytesInt32", "read", "Error", "data", "getCodecForType", "decode", "err", "error", "close", "_save", "encoded", "Buffer", "from", "encode", "write", "toBytesInt32", "length", "clear", "delete", "getIdentityRecord", "identity", "setIdentityRecord", "record", "addSpace", "find", "space", "key", "push", "setSpaceLatestTimeframe", "spaceKey", "timeframe", "dataTimeframe", "setSpaceSnapshot", "snapshot", "setWritableFeedKeys", "controlFeedKey", "dataFeedKey", "num", "buf", "alloc", "writeInt32LE", "readInt32LE", "createCodecEncoding", "schema", "codec", "getCodecForType", "valueEncoding", "assert", "createMappedFeedWriter", "mapper", "writer", "write", "data", "Event", "timed", "log", "Timeframe", "__decorate", "mapTimeframeToFeedIndexes", "timeframe", "frames", "map", "feedKey", "index", "mapFeedIndexesToTimeframe", "indexes", "startAfter", "TimeframeClock", "constructor", "_timeframe", "update", "updateTimeframe", "key", "seq", "merge", "emit", "hasGaps", "gaps", "dependencies", "isEmpty", "waitUntilReached", "target", "info", "current", "waitForCondition", "deps", "assert", "sleep", "synchronized", "Trigger", "Context", "rejectOnDispose", "FeedSetIterator", "PublicKey", "log", "Timeframe", "debug", "assert", "log", "createMessageSelector", "timeframeClock", "messages", "i", "length", "data", "timeframe", "hasGaps", "__decorate", "PipelineState", "constructor", "_iterator", "_timeframeClock", "timeframeUpdate", "update", "endTimeframe", "mapFeedIndexesToTimeframe", "feeds", "filter", "feed", "length", "map", "feedKey", "key", "index", "timeframe", "targetTimeframe", "_targetTimeframe", "Timeframe", "waitUntilTimeframe", "target", "waitUntilReached", "setTargetTimeframe", "waitUntilReachedTargetTimeframe", "ctx", "Context", "timeout", "breakOnStall", "log", "current", "_reachedTargetPromise", "Promise", "race", "waitForCondition", "dependencies", "isEmpty", "stalled", "discardParameter", "waitForCount", "done", "rejectOnDispose", "then", "sleep", "warn", "Pipeline", "_initialTimeframe", "TimeframeClock", "_feedSetIterator", "FeedSetIterator", "createMessageSelector", "start", "startAfter", "stallTimeout", "_state", "_processingTrigger", "Trigger", "wake", "_isOpen", "on", "iterator", "options", "size", "state", "writer", "assert", "_writer", "getFeeds", "addFeed", "hasFeed", "setWriteFeed", "properties", "writable", "createMappedFeedWriter", "payload", "createFeedWriter", "open", "stop", "close", "wait", "consume", "block", "reset", "updateTimeframe", "PublicKey", "from", "seq", "synchronized", "assert", "runInContext", "scheduleTask", "Context", "randomBytes", "log", "schema", "RpcExtension", "AuthExtension", "constructor", "_authParams", "requested", "AuthService", "getService", "exposed", "timeout", "_ctx", "onError", "err", "catch", "getHandlers", "authenticate", "challenge", "credential", "provider", "Error", "error", "onOpen", "context", "rpc", "length", "success", "verifier", "onAuthSuccess", "warn", "close", "onAuthFailure", "onClose", "dispose", "assert", "Event", "synchronized", "trackLeaks", "Lock", "log", "logInfo", "AdmittedFeed", "Callback", "SpaceStateMachine", "PublicKey", "log", "AdmittedFeed", "Callback", "ControlPipeline", "constructor", "spaceKey", "genesisFeed", "feedProvider", "initialTimeframe", "onFeedAdmitted", "Callback", "_pipeline", "Pipeline", "addFeed", "_spaceStateMachine", "SpaceStateMachine", "set", "info", "log", "key", "assertion", "designation", "AdmittedFeed", "Designation", "CONTROL", "equals", "feed", "err", "catch", "callIfSet", "onMemberAdmitted", "onCredentialProcessed", "spaceState", "pipeline", "setWriteFeed", "start", "setTimeout", "msg", "consume", "feedKey", "seq", "data", "payload", "credential", "result", "process", "PublicKey", "from", "warn", "stop", "__decorate", "Space", "constructor", "spaceKey", "protocol", "genesisFeed", "feedProvider", "_addFeedLock", "Lock", "onCredentialProcessed", "Callback", "stateUpdate", "Event", "_isOpen", "assert", "_key", "_genesisFeedKey", "key", "_feedProvider", "_controlPipeline", "ControlPipeline", "onFeedAdmitted", "set", "info", "assertion", "designation", "AdmittedFeed", "Designation", "DATA", "executeSynchronized", "_dataPipeline", "hasFeed", "addFeed", "equals", "credential", "callIfSet", "log", "emit", "isOpen", "genesisFeedKey", "controlFeedKey", "_controlFeed", "dataFeedKey", "_dataFeed", "spaceState", "controlPipeline", "pipeline", "setControlFeed", "feed", "setWriteFeed", "setDataFeed", "getControlFeeds", "Array", "from", "feeds", "values", "open", "start", "close", "stop", "createDataPipeline", "Pipeline", "logInfo", "synchronized", "trackLeaks", "discoveryKey", "sha256", "PublicKey", "log", "logInfo", "MMSTTopology", "Teleport", "ReplicatorExtension", "ComplexMap", "__decorate", "MOCK_AUTH_PROVIDER", "nonce", "Buffer", "from", "MOCK_AUTH_VERIFIER", "credential", "SpaceProtocol", "constructor", "topic", "swarmIdentity", "networkManager", "onSessionAuth", "_feeds", "Set", "_sessions", "ComplexMap", "PublicKey", "hash", "_networkManager", "_swarmIdentity", "_onSessionAuth", "_topic", "discoveryKey", "sha256", "toHex", "sessions", "feeds", "_ownPeerKey", "peerKey", "addFeed", "feed", "log", "key", "add", "session", "values", "replicator", "start", "_connection", "credentials", "credentialProvider", "topologyConfig", "originateConnections", "maxPeers", "sampleSize", "joinSwarm", "protocolProvider", "_createProtocolProvider", "peerId", "topology", "MMSTTopology", "label", "stop", "close", "wireParams", "SpaceProtocolSession", "set", "remotePeerId", "logInfo", "AuthStatus", "INITIAL", "SUCCESS", "FAILURE", "ReplicatorExtension", "setOptions", "upload", "_authStatus", "_wireParams", "_teleport", "Teleport", "authStatus", "stream", "initialize", "open", "addExtension", "AuthExtension", "provider", "verifier", "credentialAuthenticator", "onAuthSuccess", "onAuthFailure", "warn", "destroy", "synchronized", "trackLeaks", "failUndefined", "PublicKey", "log", "trace", "ComplexMap", "__decorate", "SpaceManager", "constructor", "feedStore", "networkManager", "_spaces", "ComplexMap", "PublicKey", "hash", "_instanceId", "random", "toHex", "_feedStore", "_networkManager", "spaces", "open", "log", "trace", "begin", "id", "close", "Promise", "all", "values", "map", "space", "end", "constructSpace", "metadata", "swarmIdentity", "onNetworkConnection", "spaceKey", "genesisFeedKey", "genesisFeed", "openFeed", "failUndefined", "key", "protocol", "SpaceProtocol", "topic", "onSessionAuth", "Space", "feedProvider", "feedKey", "set", "synchronized", "trackLeaks", "createCredential", "failUndefined", "AdmittedFeed", "SpaceMember", "spaceGenesis", "keyring", "signingContext", "space", "credentials", "signer", "issuer", "key", "subject", "assertion", "spaceKey", "identityKey", "role", "Role", "ADMIN", "profile", "genesisFeedKey", "controlFeedKey", "credentialSigner", "deviceKey", "designation", "Designation", "CONTROL", "dataFeedKey", "DATA", "credential", "controlPipeline", "writer", "write", "assert", "Stream", "tagMutationsInBatch", "setMetadataOnObject", "log", "ComplexMap", "DataServiceHost", "constructor", "_itemManager", "_itemDemuxer", "_writeStream", "_clientTagMap", "feedKey", "seq", "toHex", "subscribe", "next", "ctx", "objects", "Array", "from", "entities", "values", "map", "entity", "createSnapshot", "batch", "mutation", "on", "message", "meta", "clientTag", "get", "forEach", "object", "write", "request", "receipt", "_a", "mutations", "m", "undefined", "set", "ItemDemuxer", "DatabaseBackendHost", "constructor", "_outboundStream", "_snapshot", "isReadOnly", "echoProcessor", "_echoProcessor", "open", "itemManager", "modelFactory", "_itemManager", "_debugLabel", "_itemDemuxer", "ItemDemuxer", "restoreFromSnapshot", "close", "getWriteStream", "createSnapshot", "createDataServiceHost", "DataServiceHost", "undefined", "trackLeaks", "schema", "ObjectSync", "__decorate", "SnapshotManager", "constructor", "_snapshotStore", "_objectSync", "getObject", "id", "snapshot", "loadSnapshot", "undefined", "payload", "getCodecForType", "encodeAsAny", "setObject", "data", "decode", "saveSnapshot", "objectSync", "open", "close", "load", "local", "remote", "download", "store", "subtleCrypto", "schema", "SnapshotStore", "constructor", "_directory", "saveSnapshot", "snapshot", "encoded", "getCodecForType", "encode", "key", "digest", "keyString", "Buffer", "from", "toString", "file", "getOrCreateFile", "write", "close", "loadSnapshot", "size", "stat", "undefined", "buffer", "read", "decode", "assert", "raise", "PublicKey", "log", "ComplexMap", "DataServiceSubscriptions", "_spaces", "hash", "clear", "registerSpace", "spaceKey", "host", "set", "unregisterSpace", "delete", "getDataService", "get", "DataServiceImpl", "constructor", "_subscriptions", "subscribe", "request", "Error", "write", "batch", "assert", "Event", "scheduleTask", "synchronized", "trackLeaks", "Context", "failUndefined", "ItemManager", "log", "Timeframe", "__decorate", "MESSAGES_PER_SNAPSHOT", "AUTOMATIC_SNAPSHOT_DEBOUNCE_INTERVAL", "TIMEFRAME_SAVE_DEBOUNCE_INTERVAL", "DISABLE_SNAPSHOT_CACHE", "DataPipeline", "constructor", "_params", "_ctx", "Context", "_lastAutomaticSnapshotTimeframe", "Timeframe", "_isOpen", "onTimeframeReached", "Event", "isOpen", "pipelineState", "_pipeline", "state", "snapshotTimeframe", "_snapshot", "timeframe", "getStartTimeframe", "snapshotTimeframeToStartingTimeframe", "setTargetTimeframe", "_targetTimeframe", "open", "spaceContext", "_spaceContext", "snapshotId", "snapshotManager", "load", "openPipeline", "feedWriter", "createMappedFeedWriter", "data", "writer", "failUndefined", "databaseBackend", "DatabaseBackendHost", "database", "_itemManager", "ItemManager", "modelFactory", "scheduleTask", "_consumePipeline", "_createPeriodicSnapshots", "debounce", "on", "_saveLatestTimeframe", "latestTimeframe", "totalMessages", "snapshot", "_saveSnapshot", "log", "createSnapshot", "snapshotKey", "store", "metadataStore", "setSpaceSnapshot", "spaceKey", "newTimeframe", "merge", "setSpaceLatestTimeframe", "close", "err", "catch", "dispose", "stop", "destroy", "assert", "asUint8Array", "msg", "consume", "feedKey", "seq", "payload", "feedInfo", "feedInfoProvider", "error", "echoProcessor", "batch", "meta", "memberKey", "assertion", "identityKey", "emit", "waitUntilTimeframe", "synchronized", "trackLeaks", "map", "key"]
|
|
7
|
+
}
|
|
@@ -24,8 +24,9 @@ import {
|
|
|
24
24
|
mapFeedIndexesToTimeframe,
|
|
25
25
|
mapTimeframeToFeedIndexes,
|
|
26
26
|
spaceGenesis,
|
|
27
|
+
startAfter,
|
|
27
28
|
valueEncoding
|
|
28
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-LIPDNX3G.mjs";
|
|
29
30
|
|
|
30
31
|
// packages/core/echo/echo-pipeline/src/errors/errors.ts
|
|
31
32
|
var DBError = class extends Error {
|
|
@@ -107,6 +108,7 @@ export {
|
|
|
107
108
|
mapFeedIndexesToTimeframe,
|
|
108
109
|
mapTimeframeToFeedIndexes,
|
|
109
110
|
spaceGenesis,
|
|
111
|
+
startAfter,
|
|
110
112
|
valueEncoding
|
|
111
113
|
};
|
|
112
114
|
//# sourceMappingURL=index.mjs.map
|