@dxos/echo-pipeline 0.1.35 → 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.
@@ -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.debug("waitUntilReached", {
233
+ log2.info("waitUntilReached", {
230
234
  target,
231
235
  current: this._timeframe
232
236
  }, {
233
237
  file: "timeframe-clock.ts",
234
- line: 45,
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: 47,
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.properties.length > 0).map((feed) => ({
311
+ return mapFeedIndexesToTimeframe(this._iterator.feeds.filter((feed) => feed.length > 0).map((feed) => ({
297
312
  feedKey: feed.key,
298
- index: feed.properties.length - 1
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: 96,
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: 122,
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: mapTimeframeToFeedIndexes(this._initialTimeframe),
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: 198,
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: 237,
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: 239,
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: 243,
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: 246,
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 synchronized2, trackLeaks, Lock } from "@dxos/async";
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 __decorate3 = function(decorators, target, key, desc) {
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
- __decorate3([
864
+ __decorate4([
839
865
  logInfo
840
866
  ], Space.prototype, "key", null);
841
- __decorate3([
842
- synchronized2
867
+ __decorate4([
868
+ synchronized3
843
869
  ], Space.prototype, "open", null);
844
- __decorate3([
845
- synchronized2
870
+ __decorate4([
871
+ synchronized3
846
872
  ], Space.prototype, "close", null);
847
- Space = __decorate3([
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 __decorate4 = function(decorators, target, key, desc) {
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
- __decorate4([
992
+ __decorate5([
967
993
  logInfo2
968
994
  ], SpaceProtocol.prototype, "_topic", void 0);
969
- __decorate4([
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
- __decorate4([
1055
+ __decorate5([
1030
1056
  logInfo2
1031
1057
  ], SpaceProtocolSession.prototype, "_wireParams", void 0);
1032
- __decorate4([
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 synchronized3, trackLeaks as trackLeaks2 } from "@dxos/async";
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 __decorate5 = function(decorators, target, key, desc) {
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
- __decorate5([
1116
- synchronized3
1141
+ __decorate6([
1142
+ synchronized4
1117
1143
  ], SpaceManager.prototype, "open", null);
1118
- __decorate5([
1119
- synchronized3
1144
+ __decorate6([
1145
+ synchronized4
1120
1146
  ], SpaceManager.prototype, "close", null);
1121
- SpaceManager = __decorate5([
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 __decorate6 = function(decorators, target, key, desc) {
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 = __decorate6([
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 synchronized4, trackLeaks as trackLeaks4 } from "@dxos/async";
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 __decorate7 = function(decorators, target, key, desc) {
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 = false;
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
- __decorate7([
1673
- synchronized4
1698
+ __decorate8([
1699
+ synchronized5
1674
1700
  ], DataPipeline.prototype, "open", null);
1675
- __decorate7([
1676
- synchronized4
1701
+ __decorate8([
1702
+ synchronized5
1677
1703
  ], DataPipeline.prototype, "close", null);
1678
- DataPipeline = __decorate7([
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-6CRSMR4G.mjs.map
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-6CRSMR4G.mjs";
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