@dxos/echo-pipeline 0.1.32-next.86f5578 → 0.1.33

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.
@@ -400,6 +400,9 @@ var Pipeline = class {
400
400
  async addFeed(feed) {
401
401
  await this._feedSetIterator.addFeed(feed);
402
402
  }
403
+ hasFeed(feedKey) {
404
+ return this._feedSetIterator.hasFeed(feedKey);
405
+ }
403
406
  setWriteFeed(feed) {
404
407
  assert4(!this._writer, "Writer already set.");
405
408
  assert4(feed.properties.writable, "Feed must be writable.");
@@ -411,14 +414,14 @@ var Pipeline = class {
411
414
  async start() {
412
415
  log4("starting...", {}, {
413
416
  file: "pipeline.ts",
414
- line: 233,
417
+ line: 237,
415
418
  scope: this,
416
419
  callSite: (f, a) => f(...a)
417
420
  });
418
421
  await this._feedSetIterator.open();
419
422
  log4("started", {}, {
420
423
  file: "pipeline.ts",
421
- line: 235,
424
+ line: 239,
422
425
  scope: this,
423
426
  callSite: (f, a) => f(...a)
424
427
  });
@@ -426,7 +429,7 @@ var Pipeline = class {
426
429
  async stop() {
427
430
  log4("stopping...", {}, {
428
431
  file: "pipeline.ts",
429
- line: 239,
432
+ line: 243,
430
433
  scope: this,
431
434
  callSite: (f, a) => f(...a)
432
435
  });
@@ -434,7 +437,7 @@ var Pipeline = class {
434
437
  await this._processingTrigger.wait();
435
438
  log4("stopped", {}, {
436
439
  file: "pipeline.ts",
437
- line: 242,
440
+ line: 246,
438
441
  scope: this,
439
442
  callSite: (f, a) => f(...a)
440
443
  });
@@ -545,7 +548,7 @@ var AuthExtension = class extends RpcExtension {
545
548
 
546
549
  // packages/core/echo/echo-pipeline/src/space/space.ts
547
550
  import assert6 from "@dxos/node-std/assert";
548
- import { Event as Event2, synchronized as synchronized2, trackLeaks } from "@dxos/async";
551
+ import { Event as Event2, synchronized as synchronized2, trackLeaks, Lock } from "@dxos/async";
549
552
  import { log as log7, logInfo } from "@dxos/log";
550
553
  import { AdmittedFeed as AdmittedFeed2 } from "@dxos/protocols/proto/dxos/halo/credentials";
551
554
  import { Callback as Callback2 } from "@dxos/util";
@@ -678,6 +681,7 @@ var __decorate3 = function(decorators, target, key, desc) {
678
681
  };
679
682
  var Space = class Space2 {
680
683
  constructor({ spaceKey, protocol, genesisFeed, feedProvider }) {
684
+ this._addFeedLock = new Lock();
681
685
  this.onCredentialProcessed = new Callback2();
682
686
  this.stateUpdate = new Event2();
683
687
  this._isOpen = false;
@@ -692,9 +696,13 @@ var Space = class Space2 {
692
696
  });
693
697
  this._controlPipeline.onFeedAdmitted.set(async (info) => {
694
698
  if (info.assertion.designation === AdmittedFeed2.Designation.DATA) {
695
- if (this._dataPipeline) {
696
- await this._dataPipeline.addFeed(await feedProvider(info.key));
697
- }
699
+ await this._addFeedLock.executeSynchronized(async () => {
700
+ if (this._dataPipeline) {
701
+ if (!this._dataPipeline.hasFeed(info.key)) {
702
+ return this._dataPipeline.addFeed(await this._feedProvider(info.key));
703
+ }
704
+ }
705
+ });
698
706
  }
699
707
  if (!info.key.equals(genesisFeed.key)) {
700
708
  this.protocol.addFeed(await feedProvider(info.key));
@@ -706,7 +714,7 @@ var Space = class Space2 {
706
714
  credential
707
715
  }, {
708
716
  file: "space.ts",
709
- line: 79,
717
+ line: 87,
710
718
  scope: this,
711
719
  callSite: (f, a) => f(...a)
712
720
  });
@@ -769,7 +777,7 @@ var Space = class Space2 {
769
777
  async open() {
770
778
  log7("opening...", {}, {
771
779
  file: "space.ts",
772
- line: 149,
780
+ line: 157,
773
781
  scope: this,
774
782
  callSite: (f, a) => f(...a)
775
783
  });
@@ -781,7 +789,7 @@ var Space = class Space2 {
781
789
  this._isOpen = true;
782
790
  log7("opened", {}, {
783
791
  file: "space.ts",
784
- line: 159,
792
+ line: 167,
785
793
  scope: this,
786
794
  callSite: (f, a) => f(...a)
787
795
  });
@@ -791,7 +799,7 @@ var Space = class Space2 {
791
799
  key: this._key
792
800
  }, {
793
801
  file: "space.ts",
794
- line: 164,
802
+ line: 172,
795
803
  scope: this,
796
804
  callSite: (f, a) => f(...a)
797
805
  });
@@ -803,7 +811,7 @@ var Space = class Space2 {
803
811
  this._isOpen = false;
804
812
  log7("closed", {}, {
805
813
  file: "space.ts",
806
- line: 174,
814
+ line: 182,
807
815
  scope: this,
808
816
  callSite: (f, a) => f(...a)
809
817
  });
@@ -817,11 +825,13 @@ var Space = class Space2 {
817
825
  pipeline.setWriteFeed(this._dataFeed);
818
826
  }
819
827
  this._dataPipeline = pipeline;
820
- for (const feed of this._controlPipeline.spaceState.feeds.values()) {
821
- if (feed.assertion.designation === AdmittedFeed2.Designation.DATA) {
822
- await pipeline.addFeed(await this._feedProvider(feed.key));
828
+ await this._addFeedLock.executeSynchronized(async () => {
829
+ for (const feed of this._controlPipeline.spaceState.feeds.values()) {
830
+ if (feed.assertion.designation === AdmittedFeed2.Designation.DATA && !pipeline.hasFeed(feed.key)) {
831
+ await pipeline.addFeed(await this._feedProvider(feed.key));
832
+ }
823
833
  }
824
- }
834
+ });
825
835
  return pipeline;
826
836
  }
827
837
  };
@@ -1028,6 +1038,7 @@ import { synchronized as synchronized3, trackLeaks as trackLeaks2 } from "@dxos/
1028
1038
  import { failUndefined } from "@dxos/debug";
1029
1039
  import { PublicKey as PublicKey4 } from "@dxos/keys";
1030
1040
  import { log as log9 } from "@dxos/log";
1041
+ import { trace } from "@dxos/protocols";
1031
1042
  import { ComplexMap as ComplexMap2 } from "@dxos/util";
1032
1043
  var __decorate5 = function(decorators, target, key, desc) {
1033
1044
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -1042,6 +1053,7 @@ var __decorate5 = function(decorators, target, key, desc) {
1042
1053
  var SpaceManager = class SpaceManager2 {
1043
1054
  constructor({ feedStore, networkManager }) {
1044
1055
  this._spaces = new ComplexMap2(PublicKey4.hash);
1056
+ this._instanceId = PublicKey4.random().toHex();
1045
1057
  this._feedStore = feedStore;
1046
1058
  this._networkManager = networkManager;
1047
1059
  }
@@ -1050,11 +1062,27 @@ var SpaceManager = class SpaceManager2 {
1050
1062
  return this._spaces;
1051
1063
  }
1052
1064
  async open() {
1065
+ log9.trace("dxos.echo.space-manager", trace.begin({
1066
+ id: this._instanceId
1067
+ }), {
1068
+ file: "space-manager.ts",
1069
+ line: 65,
1070
+ scope: this,
1071
+ callSite: (f, a) => f(...a)
1072
+ });
1053
1073
  }
1054
1074
  async close() {
1055
1075
  await Promise.all([
1056
1076
  ...this._spaces.values()
1057
1077
  ].map((space) => space.close()));
1078
+ log9.trace("dxos.echo.space-manager", trace.end({
1079
+ id: this._instanceId
1080
+ }), {
1081
+ file: "space-manager.ts",
1082
+ line: 71,
1083
+ scope: this,
1084
+ callSite: (f, a) => f(...a)
1085
+ });
1058
1086
  }
1059
1087
  async constructSpace({ metadata, swarmIdentity, onNetworkConnection }) {
1060
1088
  var _a;
@@ -1062,7 +1090,7 @@ var SpaceManager = class SpaceManager2 {
1062
1090
  spaceKey: metadata.genesisFeedKey
1063
1091
  }, {
1064
1092
  file: "space-manager.ts",
1065
- line: 70,
1093
+ line: 75,
1066
1094
  scope: this,
1067
1095
  callSite: (f, a) => f(...a)
1068
1096
  });
@@ -1684,4 +1712,4 @@ export {
1684
1712
  DataServiceImpl,
1685
1713
  DataPipeline
1686
1714
  };
1687
- //# sourceMappingURL=chunk-EM5HSJ7J.mjs.map
1715
+ //# sourceMappingURL=chunk-6CRSMR4G.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\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.debug('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, 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, mapTimeframeToFeedIndexes, 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 get endTimeframe() {\n return mapFeedIndexesToTimeframe(\n this._iterator.feeds\n .filter((feed) => feed.properties.length > 0)\n .map((feed) => ({\n feedKey: feed.key,\n index: feed.properties.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 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: mapTimeframeToFeedIndexes(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 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 async start() {\n log('starting...', {});\n await this._feedSetIterator.open();\n log('started');\n }\n\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 = false;\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) {\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", "TimeframeClock", "constructor", "_timeframe", "update", "updateTimeframe", "key", "seq", "merge", "emit", "hasGaps", "gaps", "dependencies", "isEmpty", "waitUntilReached", "target", "debug", "current", "waitForCondition", "deps", "assert", "sleep", "Trigger", "Context", "rejectOnDispose", "FeedSetIterator", "PublicKey", "log", "Timeframe", "debug", "assert", "log", "createMessageSelector", "timeframeClock", "messages", "i", "length", "data", "timeframe", "hasGaps", "PipelineState", "constructor", "_iterator", "_timeframeClock", "timeframeUpdate", "update", "endTimeframe", "mapFeedIndexesToTimeframe", "feeds", "filter", "feed", "properties", "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", "mapTimeframeToFeedIndexes", "stallTimeout", "_state", "_processingTrigger", "Trigger", "wake", "_isOpen", "on", "iterator", "options", "size", "state", "writer", "assert", "_writer", "getFeeds", "addFeed", "hasFeed", "setWriteFeed", "writable", "createMappedFeedWriter", "payload", "createFeedWriter", "open", "stop", "close", "wait", "consume", "block", "reset", "updateTimeframe", "PublicKey", "from", "seq", "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
+ }
@@ -25,7 +25,7 @@ import {
25
25
  mapTimeframeToFeedIndexes,
26
26
  spaceGenesis,
27
27
  valueEncoding
28
- } from "./chunk-EM5HSJ7J.mjs";
28
+ } from "./chunk-6CRSMR4G.mjs";
29
29
 
30
30
  // packages/core/echo/echo-pipeline/src/errors/errors.ts
31
31
  var DBError = class extends Error {