@dxos/echo-pipeline 0.1.46 → 0.1.48-next.83f55fd

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/lib/browser/{chunk-YFIFTFHQ.mjs → chunk-JEULF2QN.mjs} +52 -45
  2. package/dist/lib/browser/chunk-JEULF2QN.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +1 -1
  4. package/dist/lib/browser/meta.json +1 -1
  5. package/dist/lib/browser/testing/index.mjs +2 -3
  6. package/dist/lib/browser/testing/index.mjs.map +2 -2
  7. package/dist/lib/node/index.cjs +51 -44
  8. package/dist/lib/node/index.cjs.map +3 -3
  9. package/dist/lib/node/meta.json +1 -1
  10. package/dist/lib/node/testing/index.cjs +52 -46
  11. package/dist/lib/node/testing/index.cjs.map +3 -3
  12. package/dist/types/src/dbhost/data-service-host.d.ts.map +1 -1
  13. package/dist/types/src/space/space-manager.d.ts +2 -1
  14. package/dist/types/src/space/space-manager.d.ts.map +1 -1
  15. package/dist/types/src/space/space-protocol.d.ts +6 -2
  16. package/dist/types/src/space/space-protocol.d.ts.map +1 -1
  17. package/dist/types/src/testing/database-test-rig.d.ts +2 -1
  18. package/dist/types/src/testing/database-test-rig.d.ts.map +1 -1
  19. package/dist/types/src/testing/test-agent-builder.d.ts +1 -1
  20. package/dist/types/src/testing/test-agent-builder.d.ts.map +1 -1
  21. package/package.json +30 -30
  22. package/src/dbhost/data-service-host.ts +19 -14
  23. package/src/space/auth.ts +1 -1
  24. package/src/space/space-manager.ts +9 -1
  25. package/src/space/space-protocol.ts +12 -4
  26. package/src/space/space.test.ts +1 -1
  27. package/src/space/space.ts +1 -1
  28. package/src/testing/database-test-rig.ts +30 -7
  29. package/src/testing/test-agent-builder.ts +1 -1
  30. package/src/tests/database-unit.test.ts +58 -17
  31. package/dist/lib/browser/chunk-YFIFTFHQ.mjs.map +0 -7
@@ -658,7 +658,7 @@ var AuthExtension = class extends RpcExtension {
658
658
  assert5(success, "credential not verified");
659
659
  runInContext(this._ctx, () => this._authParams.onAuthSuccess());
660
660
  } catch (err) {
661
- log5.warn("auth failed", err, {
661
+ log5("auth failed", err, {
662
662
  file: "auth.ts",
663
663
  line: 75,
664
664
  scope: this,
@@ -702,12 +702,13 @@ var DataServiceHost = class {
702
702
  this._itemDemuxer.mutation.on(ctx, (message) => {
703
703
  var _a;
704
704
  const { batch, meta } = message;
705
+ assert6(!meta.clientTag, "Unexpected client tag in mutation message");
705
706
  log6("message", {
706
707
  batch,
707
708
  meta
708
709
  }, {
709
710
  file: "data-service-host.ts",
710
- line: 49,
711
+ line: 51,
711
712
  scope: this,
712
713
  callSite: (f, a) => f(...a)
713
714
  });
@@ -716,10 +717,12 @@ var DataServiceHost = class {
716
717
  message.meta.seq
717
718
  ]);
718
719
  (_a = batch.objects) == null ? void 0 : _a.forEach((object) => {
719
- setMetadataOnObject(object, meta);
720
+ setMetadataOnObject(object, {
721
+ ...meta
722
+ });
720
723
  });
721
724
  if (clientTag) {
722
- tagMutationsInBatch(batch, clientTag);
725
+ tagMutationsInBatch(batch, clientTag, 0);
723
726
  }
724
727
  next({
725
728
  clientTag,
@@ -731,32 +734,18 @@ var DataServiceHost = class {
731
734
  });
732
735
  }
733
736
  async write(request) {
734
- var _a, _b, _c;
737
+ var _a, _b;
735
738
  assert6(this._writeStream, "Cannot write mutations in readonly mode");
736
739
  log6("write", {
737
740
  clientTag: request.clientTag,
738
741
  objectCount: (_b = (_a = request.batch.objects) == null ? void 0 : _a.length) != null ? _b : 0
739
742
  }, {
740
743
  file: "data-service-host.ts",
741
- line: 77,
744
+ line: 79,
742
745
  scope: this,
743
746
  callSite: (f, a) => f(...a)
744
747
  });
745
- const message = {
746
- batch: {
747
- objects: (_c = request.batch.objects) == null ? void 0 : _c.map((object) => {
748
- var _a2;
749
- return {
750
- ...object,
751
- mutations: (_a2 = object.mutations) == null ? void 0 : _a2.map((mutation) => ({
752
- ...mutation,
753
- meta: void 0
754
- })),
755
- meta: void 0
756
- };
757
- })
758
- }
759
- };
748
+ const message = createDataMessage(request.batch);
760
749
  const receipt = await this._writeStream.write(message, {
761
750
  afterWrite: async (receipt2) => {
762
751
  if (request.clientTag) {
@@ -766,7 +755,7 @@ var DataServiceHost = class {
766
755
  seq: receipt2.seq
767
756
  }, {
768
757
  file: "data-service-host.ts",
769
- line: 96,
758
+ line: 88,
770
759
  scope: this,
771
760
  callSite: (f, a) => f(...a)
772
761
  });
@@ -780,6 +769,24 @@ var DataServiceHost = class {
780
769
  return receipt;
781
770
  }
782
771
  };
772
+ var createDataMessage = (batch) => {
773
+ var _a;
774
+ return {
775
+ batch: {
776
+ objects: (_a = batch.objects) == null ? void 0 : _a.map((object) => {
777
+ var _a2;
778
+ return {
779
+ ...object,
780
+ mutations: (_a2 = object.mutations) == null ? void 0 : _a2.map((mutation) => ({
781
+ ...mutation,
782
+ meta: void 0
783
+ })),
784
+ meta: void 0
785
+ };
786
+ })
787
+ }
788
+ };
789
+ };
783
790
 
784
791
  // packages/core/echo/echo-pipeline/src/dbhost/database-host.ts
785
792
  import { ItemDemuxer } from "@dxos/echo-db";
@@ -1587,7 +1594,7 @@ var Space = class Space2 {
1587
1594
  });
1588
1595
  }
1589
1596
  async initializeDataPipeline() {
1590
- log11.info("initializeDataPipeline", {}, {
1597
+ log11("initializeDataPipeline", {}, {
1591
1598
  file: "space.ts",
1592
1599
  line: 245,
1593
1600
  scope: this,
@@ -1632,12 +1639,13 @@ var __decorate7 = function(decorators, target, key, desc) {
1632
1639
  var MOCK_AUTH_PROVIDER = async (nonce) => Buffer.from("mock");
1633
1640
  var MOCK_AUTH_VERIFIER = async (nonce, credential) => true;
1634
1641
  var SpaceProtocol = class {
1635
- constructor({ topic, swarmIdentity, networkManager, onSessionAuth }) {
1642
+ constructor({ topic, swarmIdentity, networkManager, onSessionAuth, onAuthFailure }) {
1636
1643
  this._feeds = /* @__PURE__ */ new Set();
1637
1644
  this._sessions = new ComplexMap4(PublicKey4.hash);
1638
1645
  this._networkManager = networkManager;
1639
1646
  this._swarmIdentity = swarmIdentity;
1640
1647
  this._onSessionAuth = onSessionAuth;
1648
+ this._onAuthFailure = onAuthFailure;
1641
1649
  this._topic = PublicKey4.from(discoveryKey(sha256(topic.toHex())));
1642
1650
  }
1643
1651
  get sessions() {
@@ -1655,7 +1663,7 @@ var SpaceProtocol = class {
1655
1663
  key: feed.key
1656
1664
  }, {
1657
1665
  file: "space-protocol.ts",
1658
- line: 84,
1666
+ line: 87,
1659
1667
  scope: this,
1660
1668
  callSite: (f, a) => f(...a)
1661
1669
  });
@@ -1676,7 +1684,7 @@ var SpaceProtocol = class {
1676
1684
  };
1677
1685
  log12("starting...", {}, {
1678
1686
  file: "space-protocol.ts",
1679
- line: 107,
1687
+ line: 110,
1680
1688
  scope: this,
1681
1689
  callSite: (f, a) => f(...a)
1682
1690
  });
@@ -1689,7 +1697,7 @@ var SpaceProtocol = class {
1689
1697
  });
1690
1698
  log12("started", {}, {
1691
1699
  file: "space-protocol.ts",
1692
- line: 116,
1700
+ line: 119,
1693
1701
  scope: this,
1694
1702
  callSite: (f, a) => f(...a)
1695
1703
  });
@@ -1698,14 +1706,14 @@ var SpaceProtocol = class {
1698
1706
  if (this._connection) {
1699
1707
  log12("stopping...", {}, {
1700
1708
  file: "space-protocol.ts",
1701
- line: 121,
1709
+ line: 124,
1702
1710
  scope: this,
1703
1711
  callSite: (f, a) => f(...a)
1704
1712
  });
1705
1713
  await this._connection.close();
1706
1714
  log12("stopped", {}, {
1707
1715
  file: "space-protocol.ts",
1708
- line: 123,
1716
+ line: 126,
1709
1717
  scope: this,
1710
1718
  callSite: (f, a) => f(...a)
1711
1719
  });
@@ -1716,7 +1724,8 @@ var SpaceProtocol = class {
1716
1724
  const session = new SpaceProtocolSession({
1717
1725
  wireParams,
1718
1726
  swarmIdentity: this._swarmIdentity,
1719
- onSessionAuth: this._onSessionAuth
1727
+ onSessionAuth: this._onSessionAuth,
1728
+ onAuthFailure: this._onAuthFailure
1720
1729
  });
1721
1730
  this._sessions.set(wireParams.remotePeerId, session);
1722
1731
  for (const feed of this._feeds) {
@@ -1740,7 +1749,7 @@ var AuthStatus;
1740
1749
  })(AuthStatus || (AuthStatus = {}));
1741
1750
  var SpaceProtocolSession = class {
1742
1751
  // TODO(dmaretskyi): Allow to pass in extra extensions.
1743
- constructor({ wireParams, swarmIdentity, onSessionAuth }) {
1752
+ constructor({ wireParams, swarmIdentity, onSessionAuth, onAuthFailure }) {
1744
1753
  // TODO(dmaretskyi): Start with upload=false when switching it on the fly works.
1745
1754
  this.replicator = new ReplicatorExtension().setOptions({
1746
1755
  upload: true
@@ -1749,6 +1758,7 @@ var SpaceProtocolSession = class {
1749
1758
  this._wireParams = wireParams;
1750
1759
  this._swarmIdentity = swarmIdentity;
1751
1760
  this._onSessionAuth = onSessionAuth;
1761
+ this._onAuthFailure = onAuthFailure;
1752
1762
  this._teleport = new Teleport(wireParams);
1753
1763
  }
1754
1764
  get authStatus() {
@@ -1764,23 +1774,19 @@ var SpaceProtocolSession = class {
1764
1774
  verifier: this._swarmIdentity.credentialAuthenticator,
1765
1775
  onAuthSuccess: () => {
1766
1776
  var _a;
1767
- this._authStatus = AuthStatus.SUCCESS;
1768
1777
  log12("Peer authenticated", {}, {
1769
1778
  file: "space-protocol.ts",
1770
- line: 206,
1779
+ line: 213,
1771
1780
  scope: this,
1772
1781
  callSite: (f, a) => f(...a)
1773
1782
  });
1783
+ this._authStatus = AuthStatus.SUCCESS;
1774
1784
  (_a = this._onSessionAuth) == null ? void 0 : _a.call(this, this._teleport);
1775
1785
  },
1776
1786
  onAuthFailure: () => {
1777
- log12.warn("Auth failed", {}, {
1778
- file: "space-protocol.ts",
1779
- line: 211,
1780
- scope: this,
1781
- callSite: (f, a) => f(...a)
1782
- });
1787
+ var _a;
1783
1788
  this._authStatus = AuthStatus.FAILURE;
1789
+ (_a = this._onAuthFailure) == null ? void 0 : _a.call(this, this._teleport);
1784
1790
  }
1785
1791
  }));
1786
1792
  this._teleport.addExtension("dxos.mesh.teleport.replicator", this.replicator);
@@ -1834,13 +1840,13 @@ var SpaceManager = class SpaceManager2 {
1834
1840
  ...this._spaces.values()
1835
1841
  ].map((space) => space.close()));
1836
1842
  }
1837
- async constructSpace({ metadata, swarmIdentity, onNetworkConnection, memberKey }) {
1843
+ async constructSpace({ metadata, swarmIdentity, onNetworkConnection, onAuthFailure, memberKey }) {
1838
1844
  var _a;
1839
1845
  log13.trace("dxos.echo.space-manager.construct-space", trace.begin({
1840
1846
  id: this._instanceId
1841
1847
  }), {
1842
1848
  file: "space-manager.ts",
1843
- line: 74,
1849
+ line: 81,
1844
1850
  scope: this,
1845
1851
  callSite: (f, a) => f(...a)
1846
1852
  });
@@ -1848,7 +1854,7 @@ var SpaceManager = class SpaceManager2 {
1848
1854
  spaceKey: metadata.genesisFeedKey
1849
1855
  }, {
1850
1856
  file: "space-manager.ts",
1851
- line: 75,
1857
+ line: 82,
1852
1858
  scope: this,
1853
1859
  callSite: (f, a) => f(...a)
1854
1860
  });
@@ -1858,7 +1864,8 @@ var SpaceManager = class SpaceManager2 {
1858
1864
  topic: spaceKey,
1859
1865
  swarmIdentity,
1860
1866
  networkManager: this._networkManager,
1861
- onSessionAuth: onNetworkConnection
1867
+ onSessionAuth: onNetworkConnection,
1868
+ onAuthFailure
1862
1869
  });
1863
1870
  const snapshotManager = new SnapshotManager(this._snapshotStore);
1864
1871
  const space = new Space({
@@ -1876,7 +1883,7 @@ var SpaceManager = class SpaceManager2 {
1876
1883
  id: this._instanceId
1877
1884
  }), {
1878
1885
  file: "space-manager.ts",
1879
- line: 100,
1886
+ line: 108,
1880
1887
  scope: this,
1881
1888
  callSite: (f, a) => f(...a)
1882
1889
  });
@@ -1919,4 +1926,4 @@ export {
1919
1926
  SpaceProtocolSession,
1920
1927
  SpaceManager
1921
1928
  };
1922
- //# sourceMappingURL=chunk-YFIFTFHQ.mjs.map
1929
+ //# sourceMappingURL=chunk-JEULF2QN.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/dbhost/data-service-host.ts", "../../../src/dbhost/database-host.ts", "../../../src/dbhost/snapshot-manager.ts", "../../../src/dbhost/snapshot-store.ts", "../../../src/dbhost/data-service.ts", "../../../src/space/data-pipeline.ts", "../../../src/space/space.ts", "../../../src/space/control-pipeline.ts", "../../../src/space/space-protocol.ts", "../../../src/space/space-manager.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2021 DXOS.org\n//\n\nimport CRC32 from 'crc-32';\nimport assert from 'node:assert';\n\nimport { synchronized } from '@dxos/async';\nimport { DataCorruptionError } from '@dxos/errors';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { STORAGE_VERSION, schema } from '@dxos/protocols';\nimport { EchoMetadata, SpaceMetadata, IdentityRecord, SpaceCache } from '@dxos/protocols/proto/dxos/echo/metadata';\nimport { Directory } from '@dxos/random-access-storage';\nimport { Timeframe } from '@dxos/timeframe';\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 < 8) {\n return;\n }\n // Loading file size from first 4 bytes.\n const dataSize = fromBytesInt32(await file.read(0, 4));\n const checksum = fromBytesInt32(await file.read(4, 4));\n log('loaded', { size: dataSize, checksum });\n\n if (fileLength < dataSize + 8) {\n throw new DataCorruptionError('Metadata size is smaller than expected.');\n }\n\n const data = await file.read(8, dataSize);\n\n const calculatedChecksum = CRC32.buf(data);\n if (calculatedChecksum !== checksum) {\n throw new DataCorruptionError('Metadata checksum is invalid.');\n }\n\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 const checksum = CRC32.buf(encoded);\n\n const result = Buffer.alloc(8 + encoded.length);\n\n result.writeInt32LE(encoded.length, 0);\n result.writeInt32LE(checksum, 4);\n encoded.copy(result, 8);\n\n // NOTE: This must be done in one write operation, otherwise the file can be corrupted.\n await file.write(0, result);\n\n log('saved', { size: encoded.length, checksum });\n } finally {\n await file.close();\n }\n }\n\n _getSpace(spaceKey: PublicKey): SpaceMetadata {\n const space = this.spaces.find((space) => space.key === spaceKey);\n assert(space, 'Space not found');\n return space;\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 this._metadata = emptyEchoMetadata();\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 this._getSpace(spaceKey).dataTimeframe = timeframe;\n await this._save();\n }\n\n async setCache(spaceKey: PublicKey, cache: SpaceCache) {\n this._getSpace(spaceKey).cache = cache;\n await this._save();\n }\n\n async setWritableFeedKeys(spaceKey: PublicKey, controlFeedKey: PublicKey, dataFeedKey: PublicKey) {\n const space = this._getSpace(spaceKey);\n space.controlFeedKey = controlFeedKey;\n space.dataFeedKey = dataFeedKey;\n await this._save();\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, options) => await writer.write(await mapper(data), options),\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 private _pendingTimeframe: Timeframe;\n\n // prettier-ignore\n constructor(\n private _timeframe = new Timeframe()\n ) {\n this._pendingTimeframe = _timeframe;\n }\n\n /**\n * Timeframe that was processed by ECHO.\n */\n get timeframe() {\n return this._timeframe;\n }\n\n /**\n * Timeframe that is currently being processed by ECHO.\n * Will be equal to `timeframe` after the processing is complete.\n */\n get pendingTimeframe() {\n return this._pendingTimeframe;\n }\n\n setTimeframe(timeframe: Timeframe) {\n this._timeframe = timeframe;\n this._pendingTimeframe = timeframe;\n this.update.emit(this._timeframe);\n }\n\n updatePendingTimeframe(key: PublicKey, seq: number) {\n this._pendingTimeframe = Timeframe.merge(this._pendingTimeframe, new Timeframe([[key, seq]]));\n }\n\n updateTimeframe() {\n this._timeframe = this._pendingTimeframe;\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('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 { Event, sleep, synchronized, Trigger } from '@dxos/async';\nimport { Context, rejectOnDispose } from '@dxos/context';\nimport { failUndefined } from '@dxos/debug';\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';\nimport { ComplexMap } from '@dxos/util';\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 public readonly stalled = new Event();\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 _feeds: ComplexMap<PublicKey, FeedWrapper<FeedMessage>>,\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 Array.from(this._feeds.values())\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 pendingTimeframe() {\n return this._timeframeClock.pendingTimeframe;\n }\n\n get targetTimeframe() {\n return this._targetTimeframe ? this._targetTimeframe : new Timeframe();\n }\n\n get feeds() {\n return Array.from(this._feeds.values());\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.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(new Timeframe());\n\n private readonly _feeds = new ComplexMap<PublicKey, FeedWrapper<FeedMessage>>(PublicKey.hash);\n\n // Inbound feed stream.\n private _feedSetIterator?: FeedSetIterator<FeedMessage>;\n\n // External state accessor.\n private readonly _state: PipelineState = new PipelineState(this._feeds, 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 private readonly _pauseTrigger = new Trigger().wake();\n\n private _isStopping = false;\n\n private _isStarted = false;\n\n private _isOpen = false;\n\n private _isPaused = false;\n\n // Outbound feed writer.\n private _writer: FeedWriter<FeedMessage.Payload> | undefined;\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 this._feeds.set(feed.key, feed);\n if (this._feedSetIterator) {\n await this._feedSetIterator.addFeed(feed);\n }\n }\n\n hasFeed(feedKey: PublicKey) {\n return this._feeds.has(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._initIterator();\n await this._feedSetIterator!.open();\n log('started');\n this._isStarted = true;\n }\n\n @synchronized\n async stop() {\n log('stopping...', {});\n this._isStopping = true;\n await this._feedSetIterator?.close();\n await this._processingTrigger.wait(); // Wait for the in-flight message to be processed.\n log('stopped');\n this._isStarted = false;\n }\n\n /**\n * @param timeframe Timeframe of already processed messages. The pipeline will start processing messages AFTER this timeframe.\n */\n @synchronized\n async setCursor(timeframe: Timeframe) {\n assert(!this._isStarted || this._isPaused, 'Invalid state.');\n\n this._timeframeClock.setTimeframe(timeframe);\n\n if (this._feedSetIterator) {\n await this._feedSetIterator.close();\n await this._initIterator();\n await this._feedSetIterator.open();\n }\n }\n\n /**\n * Calling pause while processing will cause a deadlock.\n */\n @synchronized\n async pause() {\n assert(this._isStarted, 'Pipeline is not open.');\n if (this._isPaused) {\n return;\n }\n\n this._pauseTrigger.reset();\n await this._processingTrigger.wait();\n this._isPaused = true;\n }\n\n @synchronized\n async unpause() {\n assert(this._isStarted, 'Pipeline is not open.');\n assert(this._isPaused, 'Pipeline is not paused.');\n\n this._pauseTrigger.wake();\n this._isPaused = false;\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 assert(this._feedSetIterator, 'Iterator not initialized.');\n let lastFeedSetIterator = this._feedSetIterator;\n let iterable = lastFeedSetIterator[Symbol.asyncIterator]();\n\n while (!this._isStopping) {\n await this._pauseTrigger.wait();\n\n // Iterator might have been changed while we were waiting for the processing to complete.\n if (lastFeedSetIterator !== this._feedSetIterator) {\n assert(this._feedSetIterator, 'Iterator not initialized.');\n lastFeedSetIterator = this._feedSetIterator;\n iterable = lastFeedSetIterator[Symbol.asyncIterator]();\n }\n\n const { done, value } = await iterable.next();\n if (done) {\n continue;\n }\n\n const block = value ?? failUndefined();\n this._processingTrigger.reset();\n this._timeframeClock.updatePendingTimeframe(PublicKey.from(block.feedKey), block.seq);\n yield block;\n this._processingTrigger.wake();\n\n this._timeframeClock.updateTimeframe();\n }\n\n // TODO(burdon): Test re-entrant?\n this._isOpen = false;\n }\n\n private async _initIterator() {\n this._feedSetIterator = new FeedSetIterator<FeedMessage>(createMessageSelector(this._timeframeClock), {\n start: startAfter(this._timeframeClock.timeframe),\n stallTimeout: 1000,\n });\n this._feedSetIterator.stalled.on((iterator) => {\n log.warn(`Stalled after ${iterator.options.stallTimeout}ms with ${iterator.size} feeds.`);\n this._state.stalled.emit();\n });\n\n for (const feed of this._feeds.values()) {\n await this._feedSetIterator.addFeed(feed);\n }\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('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 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 { EchoObjectBatch } from '@dxos/protocols/proto/dxos/echo/object';\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 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 assert(!(meta as any).clientTag, 'Unexpected client tag in mutation message');\n log('message', { batch, meta });\n\n const clientTag = this._clientTagMap.get([message.meta.feedKey, message.meta.seq]);\n // TODO(dmaretskyi): Memory 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, 0);\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 log('write', { clientTag: request.clientTag, objectCount: request.batch.objects?.length ?? 0 });\n\n // Clear client metadata.\n const message = createDataMessage(request.batch);\n\n const receipt = await this._writeStream.write(message, {\n afterWrite: async (receipt) => {\n // Runs before the mutation is read from the pipeline.\n if (request.clientTag) {\n log('tag', { clientTag: request.clientTag, feedKey: receipt.feedKey, seq: receipt.seq });\n this._clientTagMap.set([receipt.feedKey, receipt.seq], request.clientTag);\n }\n },\n });\n\n return receipt;\n }\n}\n\nconst createDataMessage = (batch: EchoObjectBatch) => ({\n batch: {\n objects: batch.objects?.map((object) => ({\n ...object,\n mutations: object.mutations?.map((mutation) => ({\n ...mutation,\n meta: undefined,\n })),\n meta: undefined,\n })),\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';\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 DatabaseHost {\n private _echoProcessor!: EchoProcessor;\n private _itemManager!: ItemManager;\n public _itemDemuxer!: ItemDemuxer;\n\n constructor(private readonly _outboundStream: FeedWriter<DataMessage> | undefined) {}\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\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 { Any } from '@dxos/codec-protobuf';\nimport { timed } from '@dxos/debug';\nimport { log } from '@dxos/log';\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 log('getObject', { id, snapshot });\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 log('setObject', { data });\n const snapshot = schema.getCodecForType('dxos.echo.snapshot.SpaceSnapshot').decode((data.payload as Any).value);\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 @timed(10_000)\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 as Any).value);\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 { StoredSnapshotInfo } from '@dxos/protocols/proto/dxos/devtools/host';\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 async listSnapshots(): Promise<StoredSnapshotInfo[]> {\n const entries = await this._directory.list();\n\n return await Promise.all(\n entries.map(async (key) => {\n const { size } = await this._directory.getOrCreateFile(key).stat();\n return {\n key,\n size,\n };\n }),\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 { CredentialProcessor, FeedInfo, getCredentialAssertion } from '@dxos/credentials';\nimport { getStateMachineFromItem, ItemManager } from '@dxos/echo-db';\nimport { FeedWriter } from '@dxos/feed-store';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ModelFactory } from '@dxos/model-factory';\nimport { DataMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { SpaceCache } from '@dxos/protocols/proto/dxos/echo/metadata';\nimport { ObjectSnapshot } from '@dxos/protocols/proto/dxos/echo/model/document';\nimport { SpaceSnapshot } from '@dxos/protocols/proto/dxos/echo/snapshot';\nimport { Credential, Epoch } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { Timeframe } from '@dxos/timeframe';\n\nimport { DatabaseHost, 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 * Called once.\n */\n onPipelineCreated: (pipeline: Pipeline) => Promise<void>;\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 in MS between recording latest timeframe in metadata.\n */\nconst TIMEFRAME_SAVE_DEBOUNCE_INTERVAL = 500;\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 _pipeline?: Pipeline;\n private _targetTimeframe?: Timeframe;\n\n private _lastAutomaticSnapshotTimeframe = new Timeframe();\n private _isOpen = false;\n\n private _lastTimeframeSaveTime = 0;\n private _lastSnapshotSaveTime = 0;\n\n constructor(private readonly _params: DataPipelineParams) {}\n\n public itemManager!: ItemManager;\n public databaseHost?: DatabaseHost;\n\n public currentEpoch?: Credential;\n public onNewEpoch = new Event<Credential>();\n\n get isOpen() {\n return this._isOpen;\n }\n\n get pipeline() {\n return this._pipeline;\n }\n\n get pipelineState() {\n return this._pipeline?.state;\n }\n\n setTargetTimeframe(timeframe: Timeframe) {\n this._targetTimeframe = timeframe;\n this._pipeline?.state.setTargetTimeframe(timeframe);\n }\n\n createCredentialProcessor(): CredentialProcessor {\n return {\n process: async (credential) => {\n const assertion = getCredentialAssertion(credential);\n if (assertion['@type'] !== 'dxos.halo.credentials.Epoch') {\n return;\n }\n\n log('new epoch', { credential });\n await this._processEpoch(assertion);\n\n this.currentEpoch = credential;\n this.onNewEpoch.emit(credential);\n },\n };\n }\n\n @synchronized\n async open() {\n if (this._isOpen) {\n return;\n }\n\n this._pipeline = new Pipeline();\n await this._params.onPipelineCreated(this._pipeline);\n await this._pipeline.start();\n await this._pipeline.pause(); // Start paused until we have the first epoch.\n\n if (this._targetTimeframe) {\n this._pipeline.state.setTargetTimeframe(this._targetTimeframe);\n }\n\n // Create database backend.\n const feedWriter: FeedWriter<DataMessage> = {\n write: (data, options) => {\n assert(this._pipeline, 'Pipeline is not initialized.');\n assert(this.currentEpoch, 'Epoch is not initialized.');\n return this._pipeline.writer.write({ data }, options);\n },\n };\n\n this.databaseHost = new DatabaseHost(feedWriter);\n this.itemManager = new ItemManager(this._params.modelFactory);\n\n // Connect pipeline to the database.\n await this.databaseHost.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._isOpen = true;\n }\n\n @synchronized\n async close() {\n if (!this._isOpen) {\n return;\n }\n log('close');\n this._isOpen = false;\n\n await this._ctx.dispose();\n await this._pipeline?.stop();\n\n // NOTE: Make sure the processing is stopped BEFORE we save the snapshot.\n try {\n await this._saveCache();\n if (this._pipeline) {\n await this._saveTargetTimeframe(this._pipeline.state.timeframe);\n }\n } catch (err) {\n log.catch(err);\n }\n\n await this.databaseHost?.close();\n await this.itemManager?.destroy();\n await this._params.snapshotManager.close();\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', { feedKey, seq });\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.databaseHost!.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\n // Timeframe clock is not updated yet\n await this._noteTargetStateIfNeeded(this._pipeline.state.pendingTimeframe);\n }\n } catch (err: any) {\n log.catch(err);\n }\n }\n }\n\n private _createSnapshot(): SpaceSnapshot {\n assert(this.databaseHost, 'Database backend is not initialized.');\n return {\n spaceKey: this._params.spaceKey.asUint8Array(),\n timeframe: this._pipeline!.state.timeframe,\n database: this.databaseHost!.createSnapshot(),\n };\n }\n\n private async _saveTargetTimeframe(timeframe: Timeframe) {\n const newTimeframe = Timeframe.merge(this._targetTimeframe ?? new Timeframe(), timeframe);\n await this._params.metadataStore.setSpaceLatestTimeframe(this._params.spaceKey, newTimeframe);\n this._targetTimeframe = newTimeframe;\n }\n\n private async _saveCache() {\n const cache: SpaceCache = {};\n\n try {\n // Add properties to cache.\n const propertiesItem = this.itemManager.items.find(\n (item) =>\n item.modelMeta?.type === 'dxos:model/document' &&\n (getStateMachineFromItem(item)?.snapshot() as ObjectSnapshot).type === 'dxos.sdk.client.Properties',\n );\n if (propertiesItem) {\n cache.properties = getStateMachineFromItem(propertiesItem)?.snapshot() as ObjectSnapshot;\n }\n } catch (err) {\n log.warn('Failed to cache properties', err);\n }\n\n // Save cache.\n await this._params.metadataStore.setCache(this._params.spaceKey, cache);\n }\n\n private async _noteTargetStateIfNeeded(timeframe: Timeframe) {\n // TODO(dmaretskyi): Replace this with a proper debounce/throttle.\n\n if (Date.now() - this._lastTimeframeSaveTime > TIMEFRAME_SAVE_DEBOUNCE_INTERVAL) {\n this._lastTimeframeSaveTime = Date.now();\n\n await this._saveTargetTimeframe(timeframe);\n }\n\n if (\n Date.now() - this._lastSnapshotSaveTime > AUTOMATIC_SNAPSHOT_DEBOUNCE_INTERVAL &&\n timeframe.totalMessages() - this._lastAutomaticSnapshotTimeframe.totalMessages() > MESSAGES_PER_SNAPSHOT\n ) {\n await this._saveCache();\n }\n }\n\n @synchronized\n private async _processEpoch(epoch: Epoch) {\n assert(this._isOpen); // TODO: In the future we might process epochs before we are open so that data pipeline starts from the last one.\n assert(this._pipeline);\n\n log('Processing epoch', { epoch });\n if (epoch.snapshotCid) {\n const snapshot = await this._params.snapshotManager.load(epoch.snapshotCid);\n\n // TODO(dmaretskyi): Clearing old items + events.\n this.databaseHost!._itemDemuxer.restoreFromSnapshot(snapshot.database);\n }\n\n log('restarting pipeline for epoch');\n\n await this._pipeline.pause();\n await this._pipeline.setCursor(epoch.timeframe);\n await this._pipeline.unpause();\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 @synchronized\n async createEpoch(): Promise<Epoch> {\n assert(this._pipeline);\n assert(this.currentEpoch);\n\n await this._pipeline.pause();\n\n const snapshot = await this._createSnapshot();\n const snapshotCid = await this._params.snapshotManager.store(snapshot);\n\n const epoch: Epoch = {\n previousId: this.currentEpoch.id,\n timeframe: this._pipeline.state.timeframe,\n number: (this.currentEpoch.subject.assertion as Epoch).number + 1,\n snapshotCid,\n };\n\n await this._pipeline.unpause();\n\n return epoch;\n }\n\n async ensureEpochInitialized() {\n await this.onNewEpoch.waitForCondition(() => !!this.currentEpoch);\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event, synchronized, trackLeaks, Lock } from '@dxos/async';\nimport { CredentialConsumer, FeedInfo } from '@dxos/credentials';\nimport { FeedWrapper } from '@dxos/feed-store';\nimport { PublicKey } from '@dxos/keys';\nimport { log, logInfo } from '@dxos/log';\nimport { ModelFactory } from '@dxos/model-factory';\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 { SnapshotManager } from '../dbhost';\nimport { MetadataStore } from '../metadata';\nimport { PipelineAccessor } from '../pipeline';\nimport { ControlPipeline } from './control-pipeline';\nimport { DataPipeline } from './data-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 modelFactory: ModelFactory;\n metadataStore: MetadataStore;\n snapshotManager: SnapshotManager;\n memberKey: PublicKey;\n\n // TODO(dmaretskyi): Superseded by epochs.\n snapshotId?: string | undefined;\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 private readonly _dataPipeline: DataPipeline;\n private readonly _snapshotManager: SnapshotManager;\n\n // Processes epoch credentials.\n private _dataPipelineCredentialConsumer?: CredentialConsumer<any> = undefined;\n\n private _isOpen = false;\n private _controlFeed?: FeedWrapper<FeedMessage>;\n private _dataFeed?: FeedWrapper<FeedMessage>;\n\n constructor(params: SpaceParams) {\n assert(params.spaceKey && params.feedProvider);\n this._key = params.spaceKey;\n this._genesisFeedKey = params.genesisFeed.key;\n this._feedProvider = params.feedProvider;\n this._snapshotManager = params.snapshotManager;\n\n this._controlPipeline = new ControlPipeline({\n spaceKey: params.spaceKey,\n genesisFeed: params.genesisFeed,\n feedProvider: params.feedProvider,\n });\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.pipeline) {\n if (!this._dataPipeline.pipeline.hasFeed(info.key)) {\n return this._dataPipeline.pipeline.addFeed(await this._feedProvider(info.key));\n }\n }\n });\n }\n\n if (!info.key.equals(params.genesisFeed.key)) {\n this.protocol.addFeed(await params.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 = params.protocol;\n this.protocol.addFeed(params.genesisFeed);\n\n this._dataPipeline = new DataPipeline({\n modelFactory: params.modelFactory,\n metadataStore: params.metadataStore,\n snapshotManager: params.snapshotManager,\n memberKey: params.memberKey,\n spaceKey: this._key,\n feedInfoProvider: (feedKey) => this._controlPipeline.spaceState.feeds.get(feedKey),\n snapshotId: params.snapshotId,\n onPipelineCreated: async (pipeline) => {\n if (this._dataFeed) {\n pipeline.setWriteFeed(this._dataFeed);\n }\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 });\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 get dataPipeline(): DataPipeline {\n return this._dataPipeline;\n }\n\n get snapshotManager(): SnapshotManager {\n return this._snapshotManager;\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.pipeline?.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._dataPipelineCredentialConsumer = this._controlPipeline.spaceState.registerProcessor(\n this._dataPipeline.createCredentialProcessor(),\n );\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 await this._dataPipelineCredentialConsumer?.close();\n this._dataPipelineCredentialConsumer = undefined;\n\n await this._dataPipeline.close();\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 async initializeDataPipeline() {\n log('initializeDataPipeline');\n assert(this._isOpen, 'Space must be open to initialize data pipeline.');\n await this._dataPipeline.open();\n await this._dataPipelineCredentialConsumer!.open();\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 { 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};\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 }: ControlPipelineParams) {\n this._pipeline = new Pipeline();\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 onAuthFailure?: (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 private readonly _onAuthFailure?: (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, onAuthFailure }: SpaceProtocolOptions) {\n this._networkManager = networkManager;\n this._swarmIdentity = swarmIdentity;\n this._onSessionAuth = onSessionAuth;\n this._onAuthFailure = onAuthFailure;\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 onAuthFailure: this._onAuthFailure,\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 onAuthFailure?: (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 _onAuthFailure?: (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, onAuthFailure }: SpaceProtocolSessionParams) {\n this._wireParams = wireParams;\n this._swarmIdentity = swarmIdentity;\n this._onSessionAuth = onSessionAuth;\n this._onAuthFailure = onAuthFailure;\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 log('Peer authenticated');\n this._authStatus = AuthStatus.SUCCESS;\n this._onSessionAuth?.(this._teleport);\n // TODO(dmaretskyi): Configure replicator to upload.\n },\n onAuthFailure: () => {\n this._authStatus = AuthStatus.FAILURE;\n this._onAuthFailure?.(this._teleport);\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 { failUndefined } from '@dxos/debug';\nimport { FeedStore } from '@dxos/feed-store';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ModelFactory } from '@dxos/model-factory';\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 { Teleport } from '@dxos/teleport';\nimport { ComplexMap } from '@dxos/util';\n\nimport { SnapshotManager, SnapshotStore } from '../dbhost';\nimport { MetadataStore } from '../metadata';\nimport { Space } from './space';\nimport { SpaceProtocol, SwarmIdentity } from './space-protocol';\n\nexport type SpaceManagerParams = {\n feedStore: FeedStore<FeedMessage>;\n networkManager: NetworkManager;\n modelFactory: ModelFactory;\n metadataStore: MetadataStore;\n snapshotStore: SnapshotStore;\n};\n\nexport type ConstructSpaceParams = {\n metadata: SpaceMetadata;\n swarmIdentity: SwarmIdentity;\n memberKey: PublicKey;\n onNetworkConnection: (session: Teleport) => void;\n onAuthFailure?: (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 _modelFactory: ModelFactory;\n private readonly _metadataStore: MetadataStore;\n private readonly _snapshotStore: SnapshotStore;\n private readonly _instanceId = PublicKey.random().toHex();\n\n constructor({ feedStore, networkManager, modelFactory, metadataStore, snapshotStore }: SpaceManagerParams) {\n // TODO(burdon): Assert.\n this._feedStore = feedStore;\n this._networkManager = networkManager;\n this._modelFactory = modelFactory;\n this._metadataStore = metadataStore;\n this._snapshotStore = snapshotStore;\n }\n\n // TODO(burdon): Remove.\n get spaces() {\n return this._spaces;\n }\n\n @synchronized\n async open() {}\n\n @synchronized\n async close() {\n await Promise.all([...this._spaces.values()].map((space) => space.close()));\n }\n\n async constructSpace({\n metadata,\n swarmIdentity,\n onNetworkConnection,\n onAuthFailure,\n memberKey,\n }: ConstructSpaceParams) {\n log.trace('dxos.echo.space-manager.construct-space', trace.begin({ id: this._instanceId }));\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 onAuthFailure,\n });\n const snapshotManager = new SnapshotManager(this._snapshotStore);\n\n const space = new Space({\n spaceKey,\n protocol,\n genesisFeed,\n feedProvider: (feedKey) => this._feedStore.openFeed(feedKey),\n modelFactory: this._modelFactory,\n metadataStore: this._metadataStore,\n snapshotManager,\n memberKey,\n });\n this._spaces.set(space.key, space);\n log.trace('dxos.echo.space-manager.construct-space', trace.end({ id: this._instanceId }));\n return space;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["CRC32", "assert", "synchronized", "DataCorruptionError", "log", "STORAGE_VERSION", "schema", "emptyEchoMetadata", "version", "spaces", "created", "Date", "updated", "MetadataStore", "constructor", "_directory", "_metadata", "load", "file", "getOrCreateFile", "size", "fileLength", "stat", "dataSize", "fromBytesInt32", "read", "checksum", "data", "calculatedChecksum", "buf", "getCodecForType", "decode", "err", "error", "close", "_save", "encoded", "Buffer", "from", "encode", "result", "alloc", "length", "writeInt32LE", "copy", "write", "_getSpace", "spaceKey", "space", "find", "key", "clear", "delete", "getIdentityRecord", "identity", "setIdentityRecord", "record", "addSpace", "push", "setSpaceLatestTimeframe", "timeframe", "dataTimeframe", "setCache", "cache", "setWritableFeedKeys", "controlFeedKey", "dataFeedKey", "readInt32LE", "createCodecEncoding", "schema", "codec", "getCodecForType", "valueEncoding", "assert", "createMappedFeedWriter", "mapper", "writer", "write", "data", "options", "Event", "timed", "log", "Timeframe", "__decorate", "mapTimeframeToFeedIndexes", "timeframe", "frames", "map", "feedKey", "index", "mapFeedIndexesToTimeframe", "indexes", "startAfter", "TimeframeClock", "constructor", "_timeframe", "update", "_pendingTimeframe", "pendingTimeframe", "setTimeframe", "emit", "updatePendingTimeframe", "key", "seq", "merge", "updateTimeframe", "hasGaps", "gaps", "dependencies", "isEmpty", "waitUntilReached", "target", "current", "waitForCondition", "deps", "assert", "Event", "sleep", "synchronized", "Trigger", "Context", "rejectOnDispose", "failUndefined", "FeedSetIterator", "PublicKey", "log", "Timeframe", "ComplexMap", "debug", "assert", "log", "createMessageSelector", "timeframeClock", "messages", "i", "length", "data", "timeframe", "hasGaps", "__decorate", "PipelineState", "constructor", "_feeds", "_timeframeClock", "timeframeUpdate", "update", "stalled", "Event", "endTimeframe", "mapFeedIndexesToTimeframe", "Array", "from", "values", "filter", "feed", "length", "map", "feedKey", "key", "index", "timeframe", "pendingTimeframe", "targetTimeframe", "_targetTimeframe", "Timeframe", "feeds", "waitUntilTimeframe", "target", "waitUntilReached", "setTargetTimeframe", "waitUntilReachedTargetTimeframe", "ctx", "Context", "timeout", "breakOnStall", "log", "current", "_reachedTargetPromise", "Promise", "race", "waitForCondition", "dependencies", "isEmpty", "discardParameter", "waitForCount", "done", "rejectOnDispose", "then", "sleep", "warn", "Pipeline", "TimeframeClock", "ComplexMap", "PublicKey", "hash", "_state", "_processingTrigger", "Trigger", "wake", "_pauseTrigger", "_isStopping", "_isStarted", "_isOpen", "_isPaused", "state", "writer", "assert", "_writer", "getFeeds", "_feedSetIterator", "addFeed", "set", "hasFeed", "has", "setWriteFeed", "properties", "writable", "createMappedFeedWriter", "payload", "createFeedWriter", "start", "_initIterator", "open", "stop", "close", "wait", "setCursor", "setTimeframe", "pause", "reset", "unpause", "consume", "lastFeedSetIterator", "iterable", "Symbol", "asyncIterator", "value", "next", "block", "failUndefined", "updatePendingTimeframe", "seq", "updateTimeframe", "FeedSetIterator", "createMessageSelector", "startAfter", "stallTimeout", "on", "iterator", "options", "size", "emit", "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", "close", "onAuthFailure", "onClose", "dispose", "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", "objectCount", "length", "createDataMessage", "receipt", "afterWrite", "set", "_a", "mutations", "undefined", "ItemDemuxer", "DatabaseHost", "constructor", "_outboundStream", "isReadOnly", "echoProcessor", "_echoProcessor", "open", "itemManager", "modelFactory", "_itemManager", "_debugLabel", "_itemDemuxer", "ItemDemuxer", "close", "getWriteStream", "createSnapshot", "createDataServiceHost", "DataServiceHost", "undefined", "trackLeaks", "timed", "log", "schema", "ObjectSync", "__decorate", "SnapshotManager", "constructor", "_snapshotStore", "_objectSync", "getObject", "id", "snapshot", "loadSnapshot", "undefined", "payload", "getCodecForType", "encodeAsAny", "setObject", "data", "decode", "value", "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", "listSnapshots", "entries", "list", "Promise", "all", "map", "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", "getCredentialAssertion", "getStateMachineFromItem", "ItemManager", "log", "Timeframe", "__decorate", "MESSAGES_PER_SNAPSHOT", "AUTOMATIC_SNAPSHOT_DEBOUNCE_INTERVAL", "TIMEFRAME_SAVE_DEBOUNCE_INTERVAL", "DataPipeline", "constructor", "_params", "_ctx", "Context", "_lastAutomaticSnapshotTimeframe", "Timeframe", "_isOpen", "_lastTimeframeSaveTime", "_lastSnapshotSaveTime", "onNewEpoch", "Event", "isOpen", "pipeline", "_pipeline", "pipelineState", "state", "setTargetTimeframe", "timeframe", "_targetTimeframe", "createCredentialProcessor", "process", "credential", "assertion", "getCredentialAssertion", "log", "_processEpoch", "currentEpoch", "emit", "open", "Pipeline", "onPipelineCreated", "start", "pause", "feedWriter", "write", "data", "options", "assert", "writer", "databaseHost", "DatabaseHost", "itemManager", "ItemManager", "modelFactory", "scheduleTask", "_consumePipeline", "close", "dispose", "stop", "_saveCache", "_saveTargetTimeframe", "err", "catch", "destroy", "snapshotManager", "msg", "consume", "feedKey", "seq", "payload", "feedInfo", "feedInfoProvider", "error", "echoProcessor", "batch", "meta", "memberKey", "identityKey", "_noteTargetStateIfNeeded", "pendingTimeframe", "_createSnapshot", "spaceKey", "asUint8Array", "database", "createSnapshot", "newTimeframe", "merge", "metadataStore", "setSpaceLatestTimeframe", "cache", "propertiesItem", "items", "find", "item", "_a", "modelMeta", "type", "getStateMachineFromItem", "snapshot", "properties", "warn", "setCache", "Date", "now", "totalMessages", "epoch", "snapshotCid", "load", "_itemDemuxer", "restoreFromSnapshot", "setCursor", "unpause", "waitUntilTimeframe", "createEpoch", "store", "previousId", "id", "number", "subject", "ensureEpochInitialized", "waitForCondition", "synchronized", "trackLeaks", "assert", "Event", "synchronized", "trackLeaks", "Lock", "log", "logInfo", "AdmittedFeed", "Callback", "SpaceStateMachine", "PublicKey", "log", "AdmittedFeed", "Callback", "ControlPipeline", "constructor", "spaceKey", "genesisFeed", "feedProvider", "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", "params", "_addFeedLock", "Lock", "onCredentialProcessed", "Callback", "stateUpdate", "Event", "_dataPipelineCredentialConsumer", "undefined", "_isOpen", "assert", "spaceKey", "feedProvider", "_key", "_genesisFeedKey", "genesisFeed", "key", "_feedProvider", "_snapshotManager", "snapshotManager", "_controlPipeline", "ControlPipeline", "onFeedAdmitted", "set", "info", "assertion", "designation", "AdmittedFeed", "Designation", "DATA", "executeSynchronized", "_dataPipeline", "pipeline", "hasFeed", "addFeed", "equals", "protocol", "credential", "callIfSet", "log", "emit", "DataPipeline", "modelFactory", "metadataStore", "memberKey", "feedInfoProvider", "feedKey", "spaceState", "feeds", "get", "snapshotId", "onPipelineCreated", "_dataFeed", "setWriteFeed", "feed", "values", "isOpen", "genesisFeedKey", "controlFeedKey", "_controlFeed", "dataFeedKey", "controlPipeline", "dataPipeline", "setControlFeed", "setDataFeed", "getControlFeeds", "Array", "from", "open", "start", "registerProcessor", "createCredentialProcessor", "close", "stop", "initializeDataPipeline", "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", "onAuthFailure", "_feeds", "Set", "_sessions", "ComplexMap", "PublicKey", "hash", "_networkManager", "_swarmIdentity", "_onSessionAuth", "_onAuthFailure", "_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", "destroy", "synchronized", "trackLeaks", "failUndefined", "PublicKey", "log", "trace", "ComplexMap", "__decorate", "SpaceManager", "constructor", "feedStore", "networkManager", "modelFactory", "metadataStore", "snapshotStore", "_spaces", "ComplexMap", "PublicKey", "hash", "_instanceId", "random", "toHex", "_feedStore", "_networkManager", "_modelFactory", "_metadataStore", "_snapshotStore", "spaces", "open", "close", "Promise", "all", "values", "map", "space", "constructSpace", "metadata", "swarmIdentity", "onNetworkConnection", "onAuthFailure", "memberKey", "log", "trace", "begin", "id", "spaceKey", "genesisFeedKey", "genesisFeed", "openFeed", "failUndefined", "key", "protocol", "SpaceProtocol", "topic", "onSessionAuth", "snapshotManager", "SnapshotManager", "Space", "feedProvider", "feedKey", "set", "end", "synchronized", "trackLeaks"]
7
+ }
@@ -24,7 +24,7 @@ import {
24
24
  mapTimeframeToFeedIndexes,
25
25
  startAfter,
26
26
  valueEncoding
27
- } from "./chunk-YFIFTFHQ.mjs";
27
+ } from "./chunk-JEULF2QN.mjs";
28
28
 
29
29
  // packages/core/echo/echo-pipeline/src/errors/errors.ts
30
30
  var DBError = class extends Error {