@dxos/echo-pipeline 0.1.53-main.52ca4e9 → 0.1.53-main.5bcfb84

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 (34) hide show
  1. package/dist/lib/browser/{chunk-SCMKAWNW.mjs → chunk-RFRZMQ5T.mjs} +95 -63
  2. package/dist/lib/browser/chunk-RFRZMQ5T.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 -2
  6. package/dist/lib/browser/testing/index.mjs.map +2 -2
  7. package/dist/lib/node/index.cjs +96 -64
  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 +102 -70
  11. package/dist/lib/node/testing/index.cjs.map +3 -3
  12. package/dist/types/src/dbhost/data-service-host.d.ts +3 -0
  13. package/dist/types/src/dbhost/data-service-host.d.ts.map +1 -1
  14. package/dist/types/src/dbhost/data-service.d.ts +2 -2
  15. package/dist/types/src/dbhost/data-service.d.ts.map +1 -1
  16. package/dist/types/src/metadata/metadata-store.d.ts +4 -0
  17. package/dist/types/src/metadata/metadata-store.d.ts.map +1 -1
  18. package/dist/types/src/pipeline/pipeline.d.ts +0 -1
  19. package/dist/types/src/pipeline/pipeline.d.ts.map +1 -1
  20. package/dist/types/src/space/data-pipeline.d.ts +3 -3
  21. package/dist/types/src/space/data-pipeline.d.ts.map +1 -1
  22. package/dist/types/src/space/space.d.ts +0 -1
  23. package/dist/types/src/space/space.d.ts.map +1 -1
  24. package/package.json +30 -30
  25. package/src/dbhost/data-service-host.ts +14 -1
  26. package/src/dbhost/data-service.ts +6 -2
  27. package/src/metadata/metadata-store.ts +15 -2
  28. package/src/pipeline/pipeline.ts +13 -1
  29. package/src/space/data-pipeline.ts +25 -19
  30. package/src/space/space.test.ts +46 -5
  31. package/src/space/space.ts +3 -12
  32. package/src/testing/util.ts +1 -1
  33. package/src/tests/database.test.ts +1 -1
  34. package/dist/lib/browser/chunk-SCMKAWNW.mjs.map +0 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/testing/test-agent-builder.ts", "../../../../src/testing/test-feed-builder.ts", "../../../../src/testing/util.ts"],
4
- "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport { CredentialGenerator } from '@dxos/credentials';\nimport { DocumentModel } from '@dxos/document-model';\nimport { FeedStore } from '@dxos/feed-store';\nimport { Keyring } from '@dxos/keyring';\nimport { PublicKey } from '@dxos/keys';\nimport { MemorySignalManager, MemorySignalManagerContext, WebsocketSignalManager } from '@dxos/messaging';\nimport { ModelFactory } from '@dxos/model-factory';\nimport { createWebRTCTransportFactory, MemoryTransportFactory, NetworkManager } from '@dxos/network-manager';\nimport type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { SpaceMetadata } from '@dxos/protocols/proto/dxos/echo/metadata';\nimport { AdmittedFeed } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { createStorage, Storage, StorageType } from '@dxos/random-access-storage';\nimport { Gossip, Presence } from '@dxos/teleport-extension-gossip';\nimport { BlobStore } from '@dxos/teleport-extension-object-sync';\nimport { ComplexMap } from '@dxos/util';\n\nimport { SnapshotStore } from '../dbhost';\nimport { MetadataStore } from '../metadata';\nimport { MOCK_AUTH_PROVIDER, MOCK_AUTH_VERIFIER, Space, SpaceManager, SpaceProtocol } from '../space';\nimport { TestFeedBuilder } from './test-feed-builder';\n\nexport type NetworkManagerProvider = () => NetworkManager;\n\nexport const MemoryNetworkManagerProvider =\n (signalContext: MemorySignalManagerContext): NetworkManagerProvider =>\n () =>\n new NetworkManager({\n signalManager: new MemorySignalManager(signalContext),\n transportFactory: MemoryTransportFactory,\n });\n\nexport const WebsocketNetworkManagerProvider =\n (signalUrl: string): NetworkManagerProvider =>\n () =>\n new NetworkManager({\n signalManager: new WebsocketSignalManager([{ server: signalUrl }]),\n transportFactory: createWebRTCTransportFactory(),\n });\n\nexport type TestAgentBuilderOptions = {\n storage?: Storage;\n networkManagerProvider?: NetworkManagerProvider;\n};\n\n/**\n * Factory for test agents.\n */\nexport class TestAgentBuilder {\n private readonly _agents = new ComplexMap<PublicKey, TestAgent>(PublicKey.hash);\n private readonly _storage: Storage;\n private readonly _networkManagerProvider: NetworkManagerProvider;\n\n constructor({ storage, networkManagerProvider }: TestAgentBuilderOptions = {}) {\n this._storage = storage ?? createStorage({ type: StorageType.RAM });\n this._networkManagerProvider =\n networkManagerProvider ?? MemoryNetworkManagerProvider(new MemorySignalManagerContext());\n }\n\n async close() {\n return Promise.all(this.agents.map((agent) => agent.close()));\n }\n\n get agents() {\n return Array.from(this._agents.values());\n }\n\n getAgent(deviceKey: PublicKey) {\n return this._agents.get(deviceKey);\n }\n\n async createPeer(): Promise<TestAgent> {\n // prettier-ignore\n const feedBuilder = new TestFeedBuilder()\n .setStorage(this._storage, `agent-${this._agents.size}`);\n\n const identityKey = await feedBuilder.keyring.createKey();\n const deviceKey = await feedBuilder.keyring.createKey();\n\n const agent = new TestAgent(this._networkManagerProvider, feedBuilder, identityKey, deviceKey);\n this._agents.set(deviceKey, agent);\n return agent;\n }\n}\n\n/**\n * Test agent that enables the creation and replication of multiple spaces.\n */\nexport class TestAgent {\n private readonly _spaces = new ComplexMap<PublicKey, Space>(PublicKey.hash);\n\n public readonly storage: Storage;\n public readonly keyring: Keyring;\n public readonly feedStore: FeedStore<FeedMessage>;\n\n private _metadataStore?: MetadataStore;\n get metadataStore() {\n return (this._metadataStore ??= new MetadataStore(this.storage.createDirectory('metadata')));\n }\n\n private _snapshotStore?: SnapshotStore;\n get snapshotStore() {\n return (this._snapshotStore ??= new SnapshotStore(this.storage.createDirectory('snapshots')));\n }\n\n private _blobStore?: BlobStore;\n get blobStore() {\n return (this._blobStore ??= new BlobStore(this.storage.createDirectory('blobs')));\n }\n\n public modelFactory = new ModelFactory().registerModel(DocumentModel);\n\n constructor(\n private readonly _networkManagerProvider: NetworkManagerProvider,\n private readonly _feedBuilder: TestFeedBuilder,\n public readonly identityKey: PublicKey,\n public readonly deviceKey: PublicKey,\n ) {\n this.storage = this._feedBuilder.storage;\n this.keyring = this._feedBuilder.keyring;\n this.feedStore = this._feedBuilder.createFeedStore();\n }\n\n async close() {\n return Promise.all([...this.spaces.map((space) => space.close())]);\n }\n\n get spaces() {\n return Array.from(this._spaces.values());\n }\n\n getSpace(spaceKey: PublicKey) {\n return this._spaces.get(spaceKey);\n }\n\n private _spaceManager?: SpaceManager;\n get spaceManager() {\n return (this._spaceManager ??= new SpaceManager({\n feedStore: this.feedStore,\n networkManager: this._networkManagerProvider(),\n modelFactory: this.modelFactory,\n metadataStore: this.metadataStore,\n snapshotStore: this.snapshotStore,\n blobStore: this.blobStore,\n }));\n }\n\n async createSpace(\n identityKey: PublicKey = this.identityKey,\n spaceKey?: PublicKey,\n genesisKey?: PublicKey,\n dataKey?: PublicKey,\n saveMetadata = false,\n ): Promise<Space> {\n if (!spaceKey) {\n saveMetadata = true;\n spaceKey = await this.keyring.createKey();\n }\n if (!genesisKey) {\n genesisKey = await this.keyring.createKey();\n }\n\n const controlFeed = await this.feedStore.openFeed(genesisKey, { writable: true });\n const dataFeed = await this.feedStore.openFeed(dataKey ?? (await this.keyring.createKey()), {\n writable: true,\n sparse: true,\n });\n\n const metadata: SpaceMetadata = {\n key: spaceKey,\n genesisFeedKey: genesisKey,\n controlFeedKey: controlFeed.key,\n dataFeedKey: dataFeed.key,\n };\n if (saveMetadata) {\n await this.metadataStore.addSpace(metadata);\n }\n\n await this.spaceManager.open();\n const space = await this.spaceManager.constructSpace({\n metadata,\n swarmIdentity: {\n peerKey: this.deviceKey,\n credentialProvider: MOCK_AUTH_PROVIDER,\n credentialAuthenticator: MOCK_AUTH_VERIFIER,\n },\n memberKey: identityKey,\n onNetworkConnection: (session) => {\n session.addExtension(\n 'dxos.mesh.teleport.gossip',\n this.createGossip().createExtension({ remotePeerId: session.remotePeerId }),\n );\n },\n });\n space.setControlFeed(controlFeed);\n space.setDataFeed(dataFeed);\n\n await space.open();\n\n this._spaces.set(spaceKey, space);\n return space;\n }\n\n createSpaceProtocol(topic: PublicKey, gossip?: Gossip) {\n return new SpaceProtocol({\n topic,\n swarmIdentity: {\n peerKey: this.deviceKey,\n credentialProvider: MOCK_AUTH_PROVIDER,\n credentialAuthenticator: MOCK_AUTH_VERIFIER,\n },\n networkManager: this._networkManagerProvider(),\n blobStore: this.blobStore,\n onSessionAuth: (session) => {\n session.addExtension(\n 'dxos.mesh.teleport.gossip',\n (gossip ?? this.createGossip()).createExtension({ remotePeerId: session.remotePeerId }),\n );\n },\n });\n }\n\n createGossip() {\n return new Gossip({\n localPeerId: this.deviceKey,\n });\n }\n\n createPresence(gossip?: Gossip) {\n return new Presence({\n announceInterval: 30,\n offlineTimeout: 200,\n identityKey: this.identityKey,\n gossip: gossip ?? this.createGossip(),\n });\n }\n\n async spaceGenesis(space: Space) {\n const generator = new CredentialGenerator(this.keyring, this.identityKey, this.deviceKey);\n const credentials = [\n ...(await generator.createSpaceGenesis(space.key, space.controlFeedKey!)),\n await generator.createFeedAdmission(space.key, space.dataFeedKey!, AdmittedFeed.Designation.DATA),\n await generator.createEpochCredential(space.key),\n ];\n\n for (const credential of credentials) {\n await space.controlPipeline.writer.write({\n credential: { credential },\n });\n }\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { TestBuilder } from '@dxos/feed-store/testing';\nimport type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\n\nimport { valueEncoding } from '../common';\n\n/**\n * Builder with default encoder and generator.\n */\nexport class TestFeedBuilder extends TestBuilder<FeedMessage> {\n constructor() {\n super({\n valueEncoding,\n });\n }\n}\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { asyncTimeout } from '@dxos/async';\nimport { DocumentModel } from '@dxos/document-model';\nimport { DatabaseProxy, ItemManager } from '@dxos/echo-db';\nimport { MockFeedWriter } from '@dxos/feed-store/testing';\nimport { PublicKey } from '@dxos/keys';\nimport { ModelFactory } from '@dxos/model-factory';\nimport { DataMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { Timeframe } from '@dxos/timeframe';\n\nimport { DatabaseHost, DataServiceHost, DataServiceImpl, DataServiceSubscriptions } from '../dbhost';\nimport { DataPipeline } from '../space';\n\nexport const createMemoryDatabase = async (modelFactory: ModelFactory) => {\n const feed = new MockFeedWriter<DataMessage>();\n const backend = new DatabaseHost(feed);\n\n feed.written.on(([data, meta]) =>\n backend.echoProcessor({\n batch: data.batch,\n meta: {\n ...meta,\n memberKey: PublicKey.random(),\n timeframe: new Timeframe([[meta.feedKey, meta.seq]]),\n },\n }),\n );\n\n const itemManager = new ItemManager(modelFactory);\n await backend.open(itemManager, new ModelFactory().registerModel(DocumentModel));\n return {\n backend,\n itemManager,\n };\n};\n\nexport const createRemoteDatabaseFromDataServiceHost = async (\n modelFactory: ModelFactory,\n dataServiceHost: DataServiceHost,\n) => {\n const dataServiceSubscriptions = new DataServiceSubscriptions();\n const dataService = new DataServiceImpl(dataServiceSubscriptions);\n\n const spaceKey = PublicKey.random();\n dataServiceSubscriptions.registerSpace(spaceKey, dataServiceHost);\n\n const itemManager = new ItemManager(modelFactory);\n const backend = new DatabaseProxy(dataService, itemManager, spaceKey);\n await backend.open(new ModelFactory().registerModel(DocumentModel));\n return {\n itemManager,\n backend,\n };\n};\n\nexport const testLocalDatabase = async (create: DataPipeline, check: DataPipeline = create) => {\n const objectId = PublicKey.random().toHex();\n await create.databaseHost!.getWriteStream()?.write({\n batch: {\n objects: [\n {\n objectId,\n genesis: {\n modelType: DocumentModel.meta.type,\n },\n },\n ],\n },\n });\n\n await asyncTimeout(\n check.databaseHost!._itemDemuxer.mutation.waitForCondition(() => check.itemManager.entities.has(objectId)),\n 2000,\n );\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport { CredentialGenerator } from '@dxos/credentials';\nimport { DocumentModel } from '@dxos/document-model';\nimport { FeedStore } from '@dxos/feed-store';\nimport { Keyring } from '@dxos/keyring';\nimport { PublicKey } from '@dxos/keys';\nimport { MemorySignalManager, MemorySignalManagerContext, WebsocketSignalManager } from '@dxos/messaging';\nimport { ModelFactory } from '@dxos/model-factory';\nimport { createWebRTCTransportFactory, MemoryTransportFactory, NetworkManager } from '@dxos/network-manager';\nimport type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { SpaceMetadata } from '@dxos/protocols/proto/dxos/echo/metadata';\nimport { AdmittedFeed } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { createStorage, Storage, StorageType } from '@dxos/random-access-storage';\nimport { Gossip, Presence } from '@dxos/teleport-extension-gossip';\nimport { BlobStore } from '@dxos/teleport-extension-object-sync';\nimport { ComplexMap } from '@dxos/util';\n\nimport { SnapshotStore } from '../dbhost';\nimport { MetadataStore } from '../metadata';\nimport { MOCK_AUTH_PROVIDER, MOCK_AUTH_VERIFIER, Space, SpaceManager, SpaceProtocol } from '../space';\nimport { TestFeedBuilder } from './test-feed-builder';\n\nexport type NetworkManagerProvider = () => NetworkManager;\n\nexport const MemoryNetworkManagerProvider =\n (signalContext: MemorySignalManagerContext): NetworkManagerProvider =>\n () =>\n new NetworkManager({\n signalManager: new MemorySignalManager(signalContext),\n transportFactory: MemoryTransportFactory,\n });\n\nexport const WebsocketNetworkManagerProvider =\n (signalUrl: string): NetworkManagerProvider =>\n () =>\n new NetworkManager({\n signalManager: new WebsocketSignalManager([{ server: signalUrl }]),\n transportFactory: createWebRTCTransportFactory(),\n });\n\nexport type TestAgentBuilderOptions = {\n storage?: Storage;\n networkManagerProvider?: NetworkManagerProvider;\n};\n\n/**\n * Factory for test agents.\n */\nexport class TestAgentBuilder {\n private readonly _agents = new ComplexMap<PublicKey, TestAgent>(PublicKey.hash);\n private readonly _storage: Storage;\n private readonly _networkManagerProvider: NetworkManagerProvider;\n\n constructor({ storage, networkManagerProvider }: TestAgentBuilderOptions = {}) {\n this._storage = storage ?? createStorage({ type: StorageType.RAM });\n this._networkManagerProvider =\n networkManagerProvider ?? MemoryNetworkManagerProvider(new MemorySignalManagerContext());\n }\n\n async close() {\n return Promise.all(this.agents.map((agent) => agent.close()));\n }\n\n get agents() {\n return Array.from(this._agents.values());\n }\n\n getAgent(deviceKey: PublicKey) {\n return this._agents.get(deviceKey);\n }\n\n async createPeer(): Promise<TestAgent> {\n // prettier-ignore\n const feedBuilder = new TestFeedBuilder()\n .setStorage(this._storage, `agent-${this._agents.size}`);\n\n const identityKey = await feedBuilder.keyring.createKey();\n const deviceKey = await feedBuilder.keyring.createKey();\n\n const agent = new TestAgent(this._networkManagerProvider, feedBuilder, identityKey, deviceKey);\n this._agents.set(deviceKey, agent);\n return agent;\n }\n}\n\n/**\n * Test agent that enables the creation and replication of multiple spaces.\n */\nexport class TestAgent {\n private readonly _spaces = new ComplexMap<PublicKey, Space>(PublicKey.hash);\n\n public readonly storage: Storage;\n public readonly keyring: Keyring;\n public readonly feedStore: FeedStore<FeedMessage>;\n\n private _metadataStore?: MetadataStore;\n get metadataStore() {\n return (this._metadataStore ??= new MetadataStore(this.storage.createDirectory('metadata')));\n }\n\n private _snapshotStore?: SnapshotStore;\n get snapshotStore() {\n return (this._snapshotStore ??= new SnapshotStore(this.storage.createDirectory('snapshots')));\n }\n\n private _blobStore?: BlobStore;\n get blobStore() {\n return (this._blobStore ??= new BlobStore(this.storage.createDirectory('blobs')));\n }\n\n public modelFactory = new ModelFactory().registerModel(DocumentModel);\n\n constructor(\n private readonly _networkManagerProvider: NetworkManagerProvider,\n private readonly _feedBuilder: TestFeedBuilder,\n public readonly identityKey: PublicKey,\n public readonly deviceKey: PublicKey,\n ) {\n this.storage = this._feedBuilder.storage;\n this.keyring = this._feedBuilder.keyring;\n this.feedStore = this._feedBuilder.createFeedStore();\n }\n\n async close() {\n return Promise.all([...this.spaces.map((space) => space.close())]);\n }\n\n get spaces() {\n return Array.from(this._spaces.values());\n }\n\n getSpace(spaceKey: PublicKey) {\n return this._spaces.get(spaceKey);\n }\n\n private _spaceManager?: SpaceManager;\n get spaceManager() {\n return (this._spaceManager ??= new SpaceManager({\n feedStore: this.feedStore,\n networkManager: this._networkManagerProvider(),\n modelFactory: this.modelFactory,\n metadataStore: this.metadataStore,\n snapshotStore: this.snapshotStore,\n blobStore: this.blobStore,\n }));\n }\n\n async createSpace(\n identityKey: PublicKey = this.identityKey,\n spaceKey?: PublicKey,\n genesisKey?: PublicKey,\n dataKey?: PublicKey,\n saveMetadata = false,\n ): Promise<Space> {\n if (!spaceKey) {\n saveMetadata = true;\n spaceKey = await this.keyring.createKey();\n }\n if (!genesisKey) {\n genesisKey = await this.keyring.createKey();\n }\n\n const controlFeed = await this.feedStore.openFeed(genesisKey, { writable: true });\n const dataFeed = await this.feedStore.openFeed(dataKey ?? (await this.keyring.createKey()), {\n writable: true,\n sparse: true,\n });\n\n const metadata: SpaceMetadata = {\n key: spaceKey,\n genesisFeedKey: genesisKey,\n controlFeedKey: controlFeed.key,\n dataFeedKey: dataFeed.key,\n };\n if (saveMetadata) {\n await this.metadataStore.addSpace(metadata);\n }\n\n await this.spaceManager.open();\n const space = await this.spaceManager.constructSpace({\n metadata,\n swarmIdentity: {\n peerKey: this.deviceKey,\n credentialProvider: MOCK_AUTH_PROVIDER,\n credentialAuthenticator: MOCK_AUTH_VERIFIER,\n },\n memberKey: identityKey,\n onNetworkConnection: (session) => {\n session.addExtension(\n 'dxos.mesh.teleport.gossip',\n this.createGossip().createExtension({ remotePeerId: session.remotePeerId }),\n );\n },\n });\n space.setControlFeed(controlFeed);\n space.setDataFeed(dataFeed);\n\n await space.open();\n\n this._spaces.set(spaceKey, space);\n return space;\n }\n\n createSpaceProtocol(topic: PublicKey, gossip?: Gossip) {\n return new SpaceProtocol({\n topic,\n swarmIdentity: {\n peerKey: this.deviceKey,\n credentialProvider: MOCK_AUTH_PROVIDER,\n credentialAuthenticator: MOCK_AUTH_VERIFIER,\n },\n networkManager: this._networkManagerProvider(),\n blobStore: this.blobStore,\n onSessionAuth: (session) => {\n session.addExtension(\n 'dxos.mesh.teleport.gossip',\n (gossip ?? this.createGossip()).createExtension({ remotePeerId: session.remotePeerId }),\n );\n },\n });\n }\n\n createGossip() {\n return new Gossip({\n localPeerId: this.deviceKey,\n });\n }\n\n createPresence(gossip?: Gossip) {\n return new Presence({\n announceInterval: 30,\n offlineTimeout: 200,\n identityKey: this.identityKey,\n gossip: gossip ?? this.createGossip(),\n });\n }\n\n async spaceGenesis(space: Space) {\n const generator = new CredentialGenerator(this.keyring, this.identityKey, this.deviceKey);\n const credentials = [\n ...(await generator.createSpaceGenesis(space.key, space.controlFeedKey!)),\n await generator.createFeedAdmission(space.key, space.dataFeedKey!, AdmittedFeed.Designation.DATA),\n await generator.createEpochCredential(space.key),\n ];\n\n for (const credential of credentials) {\n await space.controlPipeline.writer.write({\n credential: { credential },\n });\n }\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { TestBuilder } from '@dxos/feed-store/testing';\nimport type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\n\nimport { valueEncoding } from '../common';\n\n/**\n * Builder with default encoder and generator.\n */\nexport class TestFeedBuilder extends TestBuilder<FeedMessage> {\n constructor() {\n super({\n valueEncoding,\n });\n }\n}\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { asyncTimeout } from '@dxos/async';\nimport { DocumentModel } from '@dxos/document-model';\nimport { DatabaseProxy, ItemManager } from '@dxos/echo-db';\nimport { MockFeedWriter } from '@dxos/feed-store/testing';\nimport { PublicKey } from '@dxos/keys';\nimport { ModelFactory } from '@dxos/model-factory';\nimport { DataMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { Timeframe } from '@dxos/timeframe';\n\nimport { DatabaseHost, DataServiceHost, DataServiceImpl, DataServiceSubscriptions } from '../dbhost';\nimport { DataPipeline } from '../space';\n\nexport const createMemoryDatabase = async (modelFactory: ModelFactory) => {\n const feed = new MockFeedWriter<DataMessage>();\n const backend = new DatabaseHost(feed);\n\n feed.written.on(([data, meta]) =>\n backend.echoProcessor({\n batch: data.batch,\n meta: {\n ...meta,\n memberKey: PublicKey.random(),\n timeframe: new Timeframe([[meta.feedKey, meta.seq]]),\n },\n }),\n );\n\n const itemManager = new ItemManager(modelFactory);\n await backend.open(itemManager, new ModelFactory().registerModel(DocumentModel));\n return {\n backend,\n itemManager,\n };\n};\n\nexport const createRemoteDatabaseFromDataServiceHost = async (\n modelFactory: ModelFactory,\n dataServiceHost: DataServiceHost,\n) => {\n const dataServiceSubscriptions = new DataServiceSubscriptions();\n const dataService = new DataServiceImpl(dataServiceSubscriptions);\n\n const spaceKey = PublicKey.random();\n await dataServiceSubscriptions.registerSpace(spaceKey, dataServiceHost);\n\n const itemManager = new ItemManager(modelFactory);\n const backend = new DatabaseProxy(dataService, itemManager, spaceKey);\n await backend.open(new ModelFactory().registerModel(DocumentModel));\n return {\n itemManager,\n backend,\n };\n};\n\nexport const testLocalDatabase = async (create: DataPipeline, check: DataPipeline = create) => {\n const objectId = PublicKey.random().toHex();\n await create.databaseHost!.getWriteStream()?.write({\n batch: {\n objects: [\n {\n objectId,\n genesis: {\n modelType: DocumentModel.meta.type,\n },\n },\n ],\n },\n });\n\n await asyncTimeout(\n check.databaseHost!._itemDemuxer.mutation.waitForCondition(() => check.itemManager.entities.has(objectId)),\n 2000,\n );\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["CredentialGenerator", "DocumentModel", "PublicKey", "MemorySignalManager", "MemorySignalManagerContext", "WebsocketSignalManager", "ModelFactory", "createWebRTCTransportFactory", "MemoryTransportFactory", "NetworkManager", "AdmittedFeed", "createStorage", "StorageType", "Gossip", "Presence", "BlobStore", "ComplexMap", "TestBuilder", "TestFeedBuilder", "TestBuilder", "constructor", "valueEncoding", "MemoryNetworkManagerProvider", "signalContext", "NetworkManager", "signalManager", "MemorySignalManager", "transportFactory", "MemoryTransportFactory", "WebsocketNetworkManagerProvider", "signalUrl", "WebsocketSignalManager", "server", "createWebRTCTransportFactory", "TestAgentBuilder", "constructor", "storage", "networkManagerProvider", "_agents", "ComplexMap", "PublicKey", "hash", "_storage", "createStorage", "type", "StorageType", "RAM", "_networkManagerProvider", "MemorySignalManagerContext", "close", "Promise", "all", "agents", "map", "agent", "Array", "from", "values", "getAgent", "deviceKey", "get", "createPeer", "feedBuilder", "TestFeedBuilder", "setStorage", "size", "identityKey", "keyring", "createKey", "TestAgent", "set", "metadataStore", "_metadataStore", "MetadataStore", "createDirectory", "snapshotStore", "_snapshotStore", "SnapshotStore", "blobStore", "_blobStore", "BlobStore", "_feedBuilder", "_spaces", "modelFactory", "ModelFactory", "registerModel", "DocumentModel", "feedStore", "createFeedStore", "spaces", "space", "getSpace", "spaceKey", "spaceManager", "_spaceManager", "SpaceManager", "networkManager", "createSpace", "genesisKey", "dataKey", "saveMetadata", "controlFeed", "openFeed", "writable", "dataFeed", "sparse", "metadata", "key", "genesisFeedKey", "controlFeedKey", "dataFeedKey", "addSpace", "open", "constructSpace", "swarmIdentity", "peerKey", "credentialProvider", "MOCK_AUTH_PROVIDER", "credentialAuthenticator", "MOCK_AUTH_VERIFIER", "memberKey", "onNetworkConnection", "session", "addExtension", "createGossip", "createExtension", "remotePeerId", "setControlFeed", "setDataFeed", "createSpaceProtocol", "topic", "gossip", "SpaceProtocol", "onSessionAuth", "Gossip", "localPeerId", "createPresence", "Presence", "announceInterval", "offlineTimeout", "spaceGenesis", "generator", "CredentialGenerator", "credentials", "createSpaceGenesis", "createFeedAdmission", "AdmittedFeed", "Designation", "DATA", "createEpochCredential", "credential", "controlPipeline", "writer", "write", "asyncTimeout", "DocumentModel", "DatabaseProxy", "ItemManager", "MockFeedWriter", "PublicKey", "ModelFactory", "Timeframe", "createMemoryDatabase", "modelFactory", "feed", "MockFeedWriter", "backend", "DatabaseHost", "written", "on", "data", "meta", "echoProcessor", "batch", "memberKey", "PublicKey", "random", "timeframe", "Timeframe", "feedKey", "seq", "itemManager", "ItemManager", "open", "ModelFactory", "registerModel", "DocumentModel", "createRemoteDatabaseFromDataServiceHost", "dataServiceHost", "dataServiceSubscriptions", "DataServiceSubscriptions", "dataService", "DataServiceImpl", "spaceKey", "registerSpace", "DatabaseProxy", "testLocalDatabase", "create", "check", "objectId", "toHex", "databaseHost", "getWriteStream", "write", "objects", "genesis", "modelType", "type", "asyncTimeout", "_itemDemuxer", "mutation", "waitForCondition", "entities", "has"]
7
7
  }
@@ -120,6 +120,7 @@ var import_async = require("@dxos/async");
120
120
  var import_errors = require("@dxos/errors");
121
121
  var import_log = require("@dxos/log");
122
122
  var import_protocols = require("@dxos/protocols");
123
+ var import_services = require("@dxos/protocols/proto/dxos/client/services");
123
124
  var import_util = require("@dxos/util");
124
125
  function _ts_decorate(decorators, target, key, desc) {
125
126
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -138,6 +139,7 @@ var emptyEchoMetadata = () => ({
138
139
  created: new Date(),
139
140
  updated: new Date()
140
141
  });
142
+ var EchoMetadata = import_protocols.schema.getCodecForType("dxos.echo.metadata.EchoMetadata");
141
143
  var MetadataStore = class {
142
144
  // prettier-ignore
143
145
  constructor(_directory) {
@@ -164,6 +166,7 @@ var MetadataStore = class {
164
166
  * Loads metadata from persistent storage.
165
167
  */
166
168
  async load() {
169
+ var _a;
167
170
  const file = this._directory.getOrCreateFile("EchoMetadata");
168
171
  try {
169
172
  const { size: fileLength } = await file.stat();
@@ -177,7 +180,7 @@ var MetadataStore = class {
177
180
  checksum
178
181
  }, {
179
182
  F: __dxlog_file,
180
- L: 69,
183
+ L: 72,
181
184
  S: this,
182
185
  C: (f, a) => f(...a)
183
186
  });
@@ -189,13 +192,17 @@ var MetadataStore = class {
189
192
  if (calculatedChecksum !== checksum) {
190
193
  throw new import_errors.DataCorruptionError("Metadata checksum is invalid.");
191
194
  }
192
- this._metadata = import_protocols.schema.getCodecForType("dxos.echo.metadata.EchoMetadata").decode(data);
195
+ this._metadata = EchoMetadata.decode(data);
196
+ (_a = this._metadata.spaces) == null ? void 0 : _a.forEach((space) => {
197
+ var _a2;
198
+ (_a2 = space.state) != null ? _a2 : space.state = import_services.SpaceState.ACTIVE;
199
+ });
193
200
  } catch (err) {
194
201
  import_log.log.error("failed to load metadata", {
195
202
  err
196
203
  }, {
197
204
  F: __dxlog_file,
198
- L: 84,
205
+ L: 92,
199
206
  S: this,
200
207
  C: (f, a) => f(...a)
201
208
  });
@@ -215,7 +222,7 @@ var MetadataStore = class {
215
222
  this.update.emit(data);
216
223
  const file = this._directory.getOrCreateFile("EchoMetadata");
217
224
  try {
218
- const encoded = (0, import_util.arrayToBuffer)(import_protocols.schema.getCodecForType("dxos.echo.metadata.EchoMetadata").encode(data));
225
+ const encoded = (0, import_util.arrayToBuffer)(EchoMetadata.encode(data));
219
226
  const checksum = import_crc_32.default.buf(encoded);
220
227
  const result = Buffer.alloc(8 + encoded.length);
221
228
  result.writeInt32LE(encoded.length, 0);
@@ -227,7 +234,7 @@ var MetadataStore = class {
227
234
  checksum
228
235
  }, {
229
236
  F: __dxlog_file,
230
- L: 116,
237
+ L: 124,
231
238
  S: this,
232
239
  C: (f, a) => f(...a)
233
240
  });
@@ -250,7 +257,7 @@ var MetadataStore = class {
250
257
  async clear() {
251
258
  (0, import_log.log)("clearing all metadata", void 0, {
252
259
  F: __dxlog_file,
253
- L: 137,
260
+ L: 145,
254
261
  S: this,
255
262
  C: (f, a) => f(...a)
256
263
  });
@@ -289,6 +296,10 @@ var MetadataStore = class {
289
296
  space.dataFeedKey = dataFeedKey;
290
297
  await this._save();
291
298
  }
299
+ async setSpaceState(spaceKey, state) {
300
+ this._getSpace(spaceKey).state = state;
301
+ await this._save();
302
+ }
292
303
  };
293
304
  _ts_decorate([
294
305
  import_async.synchronized
@@ -462,6 +473,7 @@ var PipelineState = class {
462
473
  constructor(_feeds, _timeframeClock) {
463
474
  this._feeds = _feeds;
464
475
  this._timeframeClock = _timeframeClock;
476
+ this._ctx = new import_context.Context();
465
477
  this.timeframeUpdate = this._timeframeClock.update;
466
478
  this.stalled = new import_async3.Event();
467
479
  this._startTimeframe = new import_timeframe2.Timeframe();
@@ -513,7 +525,7 @@ var PipelineState = class {
513
525
  target: this.targetTimeframe
514
526
  }, {
515
527
  F: __dxlog_file4,
516
- L: 118,
528
+ L: 126,
517
529
  S: this,
518
530
  C: (f, a) => f(...a)
519
531
  });
@@ -529,6 +541,7 @@ var PipelineState = class {
529
541
  if (timeout) {
530
542
  return Promise.race([
531
543
  (0, import_context.rejectOnDispose)(ctx),
544
+ (0, import_context.rejectOnDispose)(this._ctx),
532
545
  this._reachedTargetPromise.then(() => {
533
546
  done = true;
534
547
  }),
@@ -543,7 +556,7 @@ var PipelineState = class {
543
556
  dependencies: import_timeframe2.Timeframe.dependencies(this.targetTimeframe, this.timeframe)
544
557
  }, {
545
558
  F: __dxlog_file4,
546
- L: 144,
559
+ L: 153,
547
560
  S: this,
548
561
  C: (f, a) => f(...a)
549
562
  });
@@ -601,7 +614,7 @@ var Pipeline = class {
601
614
  async start() {
602
615
  (0, import_log4.log)("starting...", {}, {
603
616
  F: __dxlog_file4,
604
- L: 264,
617
+ L: 273,
605
618
  S: this,
606
619
  C: (f, a) => f(...a)
607
620
  });
@@ -609,7 +622,7 @@ var Pipeline = class {
609
622
  await this._feedSetIterator.open();
610
623
  (0, import_log4.log)("started", void 0, {
611
624
  F: __dxlog_file4,
612
- L: 267,
625
+ L: 276,
613
626
  S: this,
614
627
  C: (f, a) => f(...a)
615
628
  });
@@ -619,16 +632,19 @@ var Pipeline = class {
619
632
  var _a;
620
633
  (0, import_log4.log)("stopping...", {}, {
621
634
  F: __dxlog_file4,
622
- L: 273,
635
+ L: 282,
623
636
  S: this,
624
637
  C: (f, a) => f(...a)
625
638
  });
626
639
  this._isStopping = true;
627
640
  await ((_a = this._feedSetIterator) == null ? void 0 : _a.close());
628
641
  await this._processingTrigger.wait();
642
+ await this._state._ctx.dispose();
643
+ this._state._ctx = new import_context.Context();
644
+ this._state._reachedTargetPromise = void 0;
629
645
  (0, import_log4.log)("stopped", void 0, {
630
646
  F: __dxlog_file4,
631
- L: 277,
647
+ L: 289,
632
648
  S: this,
633
649
  C: (f, a) => f(...a)
634
650
  });
@@ -705,7 +721,7 @@ var Pipeline = class {
705
721
  feed.undownload({
706
722
  callback: () => (0, import_log4.log)("Undownloaded", void 0, {
707
723
  F: __dxlog_file4,
708
- L: 371,
724
+ L: 383,
709
725
  S: this,
710
726
  C: (f, a) => f(...a)
711
727
  })
@@ -718,7 +734,7 @@ var Pipeline = class {
718
734
  err
719
735
  }, {
720
736
  F: __dxlog_file4,
721
- L: 374,
737
+ L: 386,
722
738
  S: this,
723
739
  C: (f, a) => f(...a)
724
740
  });
@@ -732,7 +748,7 @@ var Pipeline = class {
732
748
  this._feedSetIterator.stalled.on((iterator) => {
733
749
  import_log4.log.warn(`Stalled after ${iterator.options.stallTimeout}ms with ${iterator.size} feeds.`, void 0, {
734
750
  F: __dxlog_file4,
735
- L: 384,
751
+ L: 396,
736
752
  S: this,
737
753
  C: (f, a) => f(...a)
738
754
  });
@@ -1001,7 +1017,7 @@ var ControlPipeline = class {
1001
1017
  // packages/core/echo/echo-pipeline/src/space/data-pipeline.ts
1002
1018
  var import_tiny_invariant8 = __toESM(require("tiny-invariant"));
1003
1019
  var import_async6 = require("@dxos/async");
1004
- var import_context4 = require("@dxos/context");
1020
+ var import_context5 = require("@dxos/context");
1005
1021
  var import_credentials3 = require("@dxos/credentials");
1006
1022
  var import_echo_db3 = require("@dxos/echo-db");
1007
1023
  var import_errors2 = require("@dxos/errors");
@@ -1011,6 +1027,7 @@ var import_timeframe4 = require("@dxos/timeframe");
1011
1027
  // packages/core/echo/echo-pipeline/src/dbhost/data-service-host.ts
1012
1028
  var import_tiny_invariant6 = __toESM(require("tiny-invariant"));
1013
1029
  var import_codec_protobuf = require("@dxos/codec-protobuf");
1030
+ var import_context3 = require("@dxos/context");
1014
1031
  var import_echo_db = require("@dxos/echo-db");
1015
1032
  var import_log7 = require("@dxos/log");
1016
1033
  var import_util4 = require("@dxos/util");
@@ -1020,13 +1037,20 @@ var DataServiceHost = class {
1020
1037
  this._itemManager = _itemManager;
1021
1038
  this._itemDemuxer = _itemDemuxer;
1022
1039
  this._writeStream = _writeStream;
1040
+ this._ctx = new import_context3.Context();
1023
1041
  this._clientTagMap = new import_util4.ComplexMap(([feedKey, seq]) => `${feedKey.toHex()}:${seq}`);
1024
1042
  }
1043
+ async open() {
1044
+ }
1045
+ async close() {
1046
+ await this._ctx.dispose();
1047
+ }
1025
1048
  /**
1026
1049
  * Real-time subscription to data objects in a space.
1027
1050
  */
1028
1051
  subscribe() {
1029
- return new import_codec_protobuf.Stream(({ next, ctx }) => {
1052
+ return new import_codec_protobuf.Stream(({ next, close, ctx }) => {
1053
+ ctx.onDispose(this._ctx.onDispose(close));
1030
1054
  const objects = Array.from(this._itemManager.entities.values()).map((entity) => entity.createSnapshot());
1031
1055
  next({
1032
1056
  batch: {
@@ -1042,7 +1066,7 @@ var DataServiceHost = class {
1042
1066
  meta
1043
1067
  }, {
1044
1068
  F: __dxlog_file7,
1045
- L: 51,
1069
+ L: 63,
1046
1070
  S: this,
1047
1071
  C: (f, a) => f(...a)
1048
1072
  });
@@ -1069,13 +1093,14 @@ var DataServiceHost = class {
1069
1093
  }
1070
1094
  async write(request) {
1071
1095
  var _a, _b;
1096
+ (0, import_tiny_invariant6.default)(!this._ctx.disposed, "Cannot write to closed DataServiceHost");
1072
1097
  (0, import_tiny_invariant6.default)(this._writeStream, "Cannot write mutations in readonly mode");
1073
1098
  (0, import_log7.log)("write", {
1074
1099
  clientTag: request.clientTag,
1075
1100
  objectCount: (_b = (_a = request.batch.objects) == null ? void 0 : _a.length) != null ? _b : 0
1076
1101
  }, {
1077
1102
  F: __dxlog_file7,
1078
- L: 79,
1103
+ L: 92,
1079
1104
  S: this,
1080
1105
  C: (f, a) => f(...a)
1081
1106
  });
@@ -1089,7 +1114,7 @@ var DataServiceHost = class {
1089
1114
  seq: receipt2.seq
1090
1115
  }, {
1091
1116
  F: __dxlog_file7,
1092
- L: 88,
1117
+ L: 101,
1093
1118
  S: this,
1094
1119
  C: (f, a) => f(...a)
1095
1120
  });
@@ -1156,7 +1181,7 @@ var DatabaseHost = class {
1156
1181
 
1157
1182
  // packages/core/echo/echo-pipeline/src/dbhost/snapshot-manager.ts
1158
1183
  var import_async5 = require("@dxos/async");
1159
- var import_context3 = require("@dxos/context");
1184
+ var import_context4 = require("@dxos/context");
1160
1185
  var import_debug3 = require("@dxos/debug");
1161
1186
  var import_keys3 = require("@dxos/keys");
1162
1187
  var import_protocols4 = require("@dxos/protocols");
@@ -1188,7 +1213,7 @@ var SnapshotManager = class SnapshotManager2 {
1188
1213
  if (blobMeta && blobMeta.state === import_blob.BlobMeta.State.FULLY_PRESENT) {
1189
1214
  return this._getBlob(blobId);
1190
1215
  }
1191
- const fallbackStore = await (0, import_context3.cancelWithContext)(ctx, this._snapshotStore.loadSnapshot(id));
1216
+ const fallbackStore = await (0, import_context4.cancelWithContext)(ctx, this._snapshotStore.loadSnapshot(id));
1192
1217
  if (fallbackStore) {
1193
1218
  return fallbackStore;
1194
1219
  }
@@ -1267,7 +1292,7 @@ var DataServiceSubscriptions = class {
1267
1292
  clear() {
1268
1293
  this._spaces.clear();
1269
1294
  }
1270
- registerSpace(spaceKey, host) {
1295
+ async registerSpace(spaceKey, host) {
1271
1296
  (0, import_log8.log)("Registering space", {
1272
1297
  spaceKey
1273
1298
  }, {
@@ -1276,17 +1301,21 @@ var DataServiceSubscriptions = class {
1276
1301
  S: this,
1277
1302
  C: (f, a) => f(...a)
1278
1303
  });
1304
+ (0, import_tiny_invariant7.default)(!this._spaces.has(spaceKey));
1305
+ await host.open();
1279
1306
  this._spaces.set(spaceKey, host);
1280
1307
  }
1281
- unregisterSpace(spaceKey) {
1308
+ async unregisterSpace(spaceKey) {
1282
1309
  (0, import_log8.log)("Unregistering space", {
1283
1310
  spaceKey
1284
1311
  }, {
1285
1312
  F: __dxlog_file8,
1286
- L: 36,
1313
+ L: 38,
1287
1314
  S: this,
1288
1315
  C: (f, a) => f(...a)
1289
1316
  });
1317
+ const host = this._spaces.get(spaceKey);
1318
+ await (host == null ? void 0 : host.close());
1290
1319
  this._spaces.delete(spaceKey);
1291
1320
  }
1292
1321
  getDataService(spaceKey) {
@@ -1330,11 +1359,15 @@ var TIMEFRAME_SAVE_DEBOUNCE_INTERVAL2 = 500;
1330
1359
  var DataPipeline = class DataPipeline2 {
1331
1360
  constructor(_params) {
1332
1361
  this._params = _params;
1333
- this._ctx = new import_context4.Context();
1362
+ this._ctx = new import_context5.Context();
1363
+ this._pipeline = void 0;
1364
+ this._targetTimeframe = void 0;
1334
1365
  this._lastAutomaticSnapshotTimeframe = new import_timeframe4.Timeframe();
1335
1366
  this._isOpen = false;
1336
1367
  this._lastTimeframeSaveTime = 0;
1337
1368
  this._lastSnapshotSaveTime = 0;
1369
+ this.currentEpoch = void 0;
1370
+ this.appliedEpoch = void 0;
1338
1371
  this._lastProcessedEpoch = -1;
1339
1372
  this.onNewEpoch = new import_async6.Event();
1340
1373
  }
@@ -1353,18 +1386,14 @@ var DataPipeline = class DataPipeline2 {
1353
1386
  this._targetTimeframe = timeframe;
1354
1387
  (_a = this._pipeline) == null ? void 0 : _a.state.setTargetTimeframe(timeframe);
1355
1388
  }
1356
- createCredentialProcessor() {
1357
- return {
1358
- process: async (credential) => {
1359
- if (!(0, import_credentials3.checkCredentialType)(credential, "dxos.halo.credentials.Epoch")) {
1360
- return;
1361
- }
1362
- this.currentEpoch = credential;
1363
- if (this._isOpen) {
1364
- await this._processEpochInSeparateTask(credential);
1365
- }
1366
- }
1367
- };
1389
+ async processCredential(credential) {
1390
+ if (!(0, import_credentials3.checkCredentialType)(credential, "dxos.halo.credentials.Epoch")) {
1391
+ return;
1392
+ }
1393
+ this.currentEpoch = credential;
1394
+ if (this._isOpen) {
1395
+ await this._processEpochInSeparateTask(credential);
1396
+ }
1368
1397
  }
1369
1398
  async open() {
1370
1399
  if (this._isOpen) {
@@ -1401,7 +1430,7 @@ var DataPipeline = class DataPipeline2 {
1401
1430
  }
1402
1431
  (0, import_log9.log)("close", void 0, {
1403
1432
  F: __dxlog_file9,
1404
- L: 174,
1433
+ L: 171,
1405
1434
  S: this,
1406
1435
  C: (f, a) => f(...a)
1407
1436
  });
@@ -1416,13 +1445,21 @@ var DataPipeline = class DataPipeline2 {
1416
1445
  } catch (err) {
1417
1446
  import_log9.log.catch(err, void 0, {
1418
1447
  F: __dxlog_file9,
1419
- L: 187,
1448
+ L: 184,
1420
1449
  S: this,
1421
1450
  C: (f, a) => f(...a)
1422
1451
  });
1423
1452
  }
1424
1453
  await ((_b = this.databaseHost) == null ? void 0 : _b.close());
1425
1454
  await ((_c = this.itemManager) == null ? void 0 : _c.destroy());
1455
+ this._ctx = new import_context5.Context();
1456
+ this._pipeline = void 0;
1457
+ this._targetTimeframe = void 0;
1458
+ this._lastAutomaticSnapshotTimeframe = new import_timeframe4.Timeframe();
1459
+ this.currentEpoch = void 0;
1460
+ this.appliedEpoch = void 0;
1461
+ this._lastProcessedEpoch = -1;
1462
+ this._epochCtx = void 0;
1426
1463
  }
1427
1464
  async _consumePipeline() {
1428
1465
  if (this.currentEpoch) {
@@ -1438,7 +1475,7 @@ var DataPipeline = class DataPipeline2 {
1438
1475
  seq
1439
1476
  }, {
1440
1477
  F: __dxlog_file9,
1441
- L: 204,
1478
+ L: 210,
1442
1479
  S: this,
1443
1480
  C: (f, a) => f(...a)
1444
1481
  });
@@ -1450,7 +1487,7 @@ var DataPipeline = class DataPipeline2 {
1450
1487
  feedKey
1451
1488
  }, {
1452
1489
  F: __dxlog_file9,
1453
- L: 210,
1490
+ L: 216,
1454
1491
  S: this,
1455
1492
  C: (f, a) => f(...a)
1456
1493
  });
@@ -1471,7 +1508,7 @@ var DataPipeline = class DataPipeline2 {
1471
1508
  spaceKey: this._params.spaceKey.toHex()
1472
1509
  }, {
1473
1510
  F: __dxlog_file9,
1474
- L: 224,
1511
+ L: 230,
1475
1512
  S: this,
1476
1513
  C: (f, a) => f(...a)
1477
1514
  });
@@ -1480,7 +1517,7 @@ var DataPipeline = class DataPipeline2 {
1480
1517
  } catch (err) {
1481
1518
  import_log9.log.catch(err, void 0, {
1482
1519
  F: __dxlog_file9,
1483
- L: 234,
1520
+ L: 240,
1484
1521
  S: this,
1485
1522
  C: (f, a) => f(...a)
1486
1523
  });
@@ -1515,7 +1552,7 @@ var DataPipeline = class DataPipeline2 {
1515
1552
  } catch (err) {
1516
1553
  import_log9.log.warn("Failed to cache properties", err, {
1517
1554
  F: __dxlog_file9,
1518
- L: 269,
1555
+ L: 275,
1519
1556
  S: this,
1520
1557
  C: (f, a) => f(...a)
1521
1558
  });
@@ -1537,19 +1574,19 @@ var DataPipeline = class DataPipeline2 {
1537
1574
  return;
1538
1575
  }
1539
1576
  await ((_a = this._epochCtx) == null ? void 0 : _a.dispose());
1540
- const ctx = new import_context4.Context({
1577
+ const ctx = new import_context5.Context({
1541
1578
  onError: (err) => {
1542
1579
  if (err instanceof import_errors2.CancelledError) {
1543
1580
  (0, import_log9.log)("Epoch processing cancelled.", void 0, {
1544
1581
  F: __dxlog_file9,
1545
- L: 301,
1582
+ L: 307,
1546
1583
  S: this,
1547
1584
  C: (f, a) => f(...a)
1548
1585
  });
1549
1586
  } else {
1550
1587
  import_log9.log.catch(err, void 0, {
1551
1588
  F: __dxlog_file9,
1552
- L: 303,
1589
+ L: 309,
1553
1590
  S: this,
1554
1591
  C: (f, a) => f(...a)
1555
1592
  });
@@ -1565,7 +1602,7 @@ var DataPipeline = class DataPipeline2 {
1565
1602
  epoch
1566
1603
  }, {
1567
1604
  F: __dxlog_file9,
1568
- L: 313,
1605
+ L: 319,
1569
1606
  S: this,
1570
1607
  C: (f, a) => f(...a)
1571
1608
  });
@@ -1582,7 +1619,7 @@ var DataPipeline = class DataPipeline2 {
1582
1619
  epoch
1583
1620
  }, {
1584
1621
  F: __dxlog_file9,
1585
- L: 327,
1622
+ L: 333,
1586
1623
  S: this,
1587
1624
  C: (f, a) => f(...a)
1588
1625
  });
@@ -1592,7 +1629,7 @@ var DataPipeline = class DataPipeline2 {
1592
1629
  }
1593
1630
  (0, import_log9.log)("restarting pipeline for epoch", void 0, {
1594
1631
  F: __dxlog_file9,
1595
- L: 335,
1632
+ L: 341,
1596
1633
  S: this,
1597
1634
  C: (f, a) => f(...a)
1598
1635
  });
@@ -1656,8 +1693,6 @@ var Space = class Space2 {
1656
1693
  this._addFeedLock = new import_async7.Lock();
1657
1694
  this.onCredentialProcessed = new import_util6.Callback();
1658
1695
  this.stateUpdate = new import_async7.Event();
1659
- // Processes epoch credentials.
1660
- this._dataPipelineCredentialConsumer = void 0;
1661
1696
  this._isOpen = false;
1662
1697
  (0, import_tiny_invariant9.default)(params.spaceKey && params.feedProvider);
1663
1698
  this._key = params.spaceKey;
@@ -1695,7 +1730,7 @@ var Space = class Space2 {
1695
1730
  credential
1696
1731
  }, {
1697
1732
  F: __dxlog_file10,
1698
- L: 110,
1733
+ L: 107,
1699
1734
  S: this,
1700
1735
  C: (f, a) => f(...a)
1701
1736
  });
@@ -1787,7 +1822,7 @@ var Space = class Space2 {
1787
1822
  async open() {
1788
1823
  (0, import_log10.log)("opening...", void 0, {
1789
1824
  F: __dxlog_file10,
1790
- L: 212,
1825
+ L: 209,
1791
1826
  S: this,
1792
1827
  C: (f, a) => f(...a)
1793
1828
  });
@@ -1796,38 +1831,35 @@ var Space = class Space2 {
1796
1831
  }
1797
1832
  await this._controlPipeline.start();
1798
1833
  await this.protocol.start();
1799
- this._dataPipelineCredentialConsumer = this._controlPipeline.spaceState.registerProcessor(this._dataPipeline.createCredentialProcessor());
1800
- await this._dataPipelineCredentialConsumer.open();
1834
+ await this._controlPipeline.spaceState.addCredentialProcessor(this._dataPipeline);
1801
1835
  this._isOpen = true;
1802
1836
  (0, import_log10.log)("opened", void 0, {
1803
1837
  F: __dxlog_file10,
1804
- L: 228,
1838
+ L: 220,
1805
1839
  S: this,
1806
1840
  C: (f, a) => f(...a)
1807
1841
  });
1808
1842
  }
1809
1843
  async close() {
1810
- var _a;
1811
1844
  (0, import_log10.log)("closing...", {
1812
1845
  key: this._key
1813
1846
  }, {
1814
1847
  F: __dxlog_file10,
1815
- L: 233,
1848
+ L: 225,
1816
1849
  S: this,
1817
1850
  C: (f, a) => f(...a)
1818
1851
  });
1819
1852
  if (!this._isOpen) {
1820
1853
  return;
1821
1854
  }
1822
- await ((_a = this._dataPipelineCredentialConsumer) == null ? void 0 : _a.close());
1823
- this._dataPipelineCredentialConsumer = void 0;
1855
+ await this._controlPipeline.spaceState.removeCredentialProcessor(this._dataPipeline);
1824
1856
  await this._dataPipeline.close();
1825
1857
  await this.protocol.stop();
1826
1858
  await this._controlPipeline.stop();
1827
1859
  this._isOpen = false;
1828
1860
  (0, import_log10.log)("closed", void 0, {
1829
1861
  F: __dxlog_file10,
1830
- L: 247,
1862
+ L: 238,
1831
1863
  S: this,
1832
1864
  C: (f, a) => f(...a)
1833
1865
  });
@@ -1835,7 +1867,7 @@ var Space = class Space2 {
1835
1867
  async initializeDataPipeline() {
1836
1868
  (0, import_log10.log)("initializeDataPipeline", void 0, {
1837
1869
  F: __dxlog_file10,
1838
- L: 252,
1870
+ L: 243,
1839
1871
  S: this,
1840
1872
  C: (f, a) => f(...a)
1841
1873
  });