@dxos/echo-pipeline 0.1.31 → 0.1.32-next.77d513e

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 (36) hide show
  1. package/dist/lib/browser/{chunk-QMDRF3NL.mjs → chunk-EM5HSJ7J.mjs} +121 -86
  2. package/dist/lib/browser/chunk-EM5HSJ7J.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +3 -5
  4. package/dist/lib/browser/index.mjs.map +1 -1
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +12 -4
  7. package/dist/lib/browser/testing/index.mjs.map +3 -3
  8. package/dist/lib/node/index.cjs +121 -87
  9. package/dist/lib/node/index.cjs.map +4 -4
  10. package/dist/lib/node/meta.json +1 -1
  11. package/dist/lib/node/testing/index.cjs +126 -76
  12. package/dist/lib/node/testing/index.cjs.map +4 -4
  13. package/dist/types/src/metadata/metadata-store.d.ts +1 -2
  14. package/dist/types/src/metadata/metadata-store.d.ts.map +1 -1
  15. package/dist/types/src/pipeline/pipeline.d.ts +10 -1
  16. package/dist/types/src/pipeline/pipeline.d.ts.map +1 -1
  17. package/dist/types/src/space/{data-pipeline-controller.d.ts → data-pipeline.d.ts} +10 -18
  18. package/dist/types/src/space/data-pipeline.d.ts.map +1 -0
  19. package/dist/types/src/space/index.d.ts +1 -1
  20. package/dist/types/src/space/index.d.ts.map +1 -1
  21. package/dist/types/src/space/space.d.ts +6 -4
  22. package/dist/types/src/space/space.d.ts.map +1 -1
  23. package/dist/types/src/testing/test-agent-builder.d.ts +2 -2
  24. package/dist/types/src/testing/test-agent-builder.d.ts.map +1 -1
  25. package/dist/types/src/testing/util.d.ts +2 -2
  26. package/dist/types/src/testing/util.d.ts.map +1 -1
  27. package/package.json +29 -29
  28. package/src/metadata/metadata-store.ts +1 -2
  29. package/src/pipeline/pipeline.ts +18 -3
  30. package/src/space/{data-pipeline-controller.ts → data-pipeline.ts} +61 -38
  31. package/src/space/index.ts +1 -1
  32. package/src/space/space.ts +22 -23
  33. package/src/testing/test-agent-builder.ts +10 -4
  34. package/src/testing/util.ts +2 -5
  35. package/dist/lib/browser/chunk-QMDRF3NL.mjs.map +0 -7
  36. package/dist/types/src/space/data-pipeline-controller.d.ts.map +0 -1
@@ -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 { 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 { createStorage, Storage, StorageType } from '@dxos/random-access-storage';\nimport { Gossip, Presence } from '@dxos/teleport-extension-gossip';\nimport { ComplexMap } from '@dxos/util';\n\nimport { SnapshotManager, SnapshotStore } from '../dbhost';\nimport { MetadataStore } from '../metadata';\nimport { MOCK_AUTH_PROVIDER, MOCK_AUTH_VERIFIER, Space, SpaceManager, SpaceProtocol } from '../space';\nimport { DataPipelineControllerImpl } from '../space/data-pipeline-controller';\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([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 keyring: Keyring;\n public readonly feedStore: FeedStore<FeedMessage>;\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.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 createSpaceManager() {\n return new SpaceManager({\n feedStore: this._feedBuilder.createFeedStore(),\n networkManager: this._networkManagerProvider()\n });\n }\n\n async createSpace(\n identityKey: PublicKey = this.identityKey,\n spaceKey?: PublicKey,\n genesisKey?: PublicKey\n ): Promise<[Space, DataPipelineControllerImpl]> {\n if (!spaceKey) {\n spaceKey = await this.keyring.createKey();\n }\n\n const dataFeedKey = await this.keyring.createKey();\n const dataFeed = await this.feedStore.openFeed(dataFeedKey, { writable: true });\n\n const controlFeedKey = await this.keyring.createKey();\n const controlFeed = await this.feedStore.openFeed(controlFeedKey, { writable: true });\n const genesisFeed = genesisKey ? await this.feedStore.openFeed(genesisKey) : controlFeed;\n const snapshotManager = new SnapshotManager(new SnapshotStore(createStorage().createDirectory('snapshots')));\n\n const metadataStore = new MetadataStore(createStorage().createDirectory('metadata'));\n await metadataStore.addSpace({ key: spaceKey });\n const dataPipelineController: DataPipelineControllerImpl = new DataPipelineControllerImpl({\n modelFactory: new ModelFactory().registerModel(DocumentModel),\n metadataStore,\n snapshotManager,\n memberKey: identityKey,\n spaceKey,\n feedInfoProvider: (feedKey) => space.spaceState.feeds.get(feedKey),\n snapshotId: undefined\n });\n const space = new Space({\n spaceKey,\n protocol: this.createSpaceProtocol(spaceKey),\n genesisFeed,\n feedProvider: (feedKey) => this.feedStore.openFeed(feedKey)\n })\n .setControlFeed(controlFeed)\n .setDataFeed(dataFeed);\n await space.open();\n await space.initDataPipeline(dataPipelineController);\n\n this._spaces.set(spaceKey, space);\n return [space, dataPipelineController];\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 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", "//\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 { DatabaseBackendProxy, 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 { DatabaseBackendHost, DataServiceHost, DataServiceImpl, DataServiceSubscriptions } from '../dbhost';\nimport { DataPipelineControllerImpl } from '../space';\n\nexport const createMemoryDatabase = async (modelFactory: ModelFactory) => {\n const feed = new MockFeedWriter<DataMessage>();\n const backend = new DatabaseBackendHost(feed, undefined);\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 backend = new DatabaseBackendProxy(dataService, spaceKey);\n const itemManager = new ItemManager(modelFactory);\n await backend.open(itemManager, new ModelFactory().registerModel(DocumentModel));\n return {\n itemManager,\n backend\n };\n};\n\nexport const testLocalDatabase = async (\n create: DataPipelineControllerImpl,\n check: DataPipelineControllerImpl = create\n) => {\n const objectId = PublicKey.random().toHex();\n await create.databaseBackend!.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.databaseBackend!._itemDemuxer.mutation.waitForCondition(() => check._itemManager.entities.has(objectId)),\n 500\n );\n};\n"],
5
- "mappings": "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",
6
- "names": ["DocumentModel", "PublicKey", "MemorySignalManager", "MemorySignalManagerContext", "WebsocketSignalManager", "ModelFactory", "createWebRTCTransportFactory", "MemoryTransportFactory", "NetworkManager", "createStorage", "StorageType", "Gossip", "Presence", "ComplexMap", "TestBuilder", "TestFeedBuilder", "TestBuilder", "constructor", "valueEncoding", "MemoryNetworkManagerProvider", "signalContext", "NetworkManager", "signalManager", "MemorySignalManager", "transportFactory", "MemoryTransportFactory", "WebsocketNetworkManagerProvider", "signalUrl", "WebsocketSignalManager", "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", "_feedBuilder", "_spaces", "feedStore", "createFeedStore", "spaces", "space", "getSpace", "spaceKey", "createSpaceManager", "SpaceManager", "networkManager", "createSpace", "genesisKey", "dataFeedKey", "dataFeed", "openFeed", "writable", "controlFeedKey", "controlFeed", "genesisFeed", "snapshotManager", "SnapshotManager", "SnapshotStore", "createDirectory", "metadataStore", "MetadataStore", "addSpace", "key", "dataPipelineController", "DataPipelineControllerImpl", "modelFactory", "ModelFactory", "registerModel", "DocumentModel", "memberKey", "feedInfoProvider", "feedKey", "spaceState", "feeds", "snapshotId", "undefined", "Space", "protocol", "createSpaceProtocol", "feedProvider", "setControlFeed", "setDataFeed", "open", "initDataPipeline", "topic", "gossip", "SpaceProtocol", "swarmIdentity", "peerKey", "credentialProvider", "MOCK_AUTH_PROVIDER", "credentialAuthenticator", "MOCK_AUTH_VERIFIER", "onSessionAuth", "session", "addExtension", "createGossip", "createExtension", "remotePeerId", "Gossip", "localPeerId", "createPresence", "Presence", "announceInterval", "offlineTimeout", "asyncTimeout", "DocumentModel", "DatabaseBackendProxy", "ItemManager", "MockFeedWriter", "PublicKey", "ModelFactory", "Timeframe", "createMemoryDatabase", "modelFactory", "feed", "MockFeedWriter", "backend", "DatabaseBackendHost", "undefined", "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", "DatabaseBackendProxy", "testLocalDatabase", "create", "check", "objectId", "toHex", "databaseBackend", "getWriteStream", "write", "objects", "genesis", "modelType", "type", "asyncTimeout", "_itemDemuxer", "mutation", "waitForCondition", "_itemManager", "entities", "has"]
4
+ "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\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 { createStorage, Storage, StorageType } from '@dxos/random-access-storage';\nimport { Gossip, Presence } from '@dxos/teleport-extension-gossip';\nimport { ComplexMap } from '@dxos/util';\n\nimport { SnapshotManager, SnapshotStore } from '../dbhost';\nimport { MetadataStore } from '../metadata';\nimport { MOCK_AUTH_PROVIDER, MOCK_AUTH_VERIFIER, Space, SpaceManager, SpaceProtocol } from '../space';\nimport { DataPipeline } from '../space/data-pipeline';\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([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 keyring: Keyring;\n public readonly feedStore: FeedStore<FeedMessage>;\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.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 createSpaceManager() {\n return new SpaceManager({\n feedStore: this._feedBuilder.createFeedStore(),\n networkManager: this._networkManagerProvider()\n });\n }\n\n async createSpace(\n identityKey: PublicKey = this.identityKey,\n spaceKey?: PublicKey,\n genesisKey?: PublicKey\n ): Promise<[Space, DataPipeline]> {\n if (!spaceKey) {\n spaceKey = await this.keyring.createKey();\n }\n\n const dataFeedKey = await this.keyring.createKey();\n const dataFeed = await this.feedStore.openFeed(dataFeedKey, { writable: true });\n\n const controlFeedKey = await this.keyring.createKey();\n const controlFeed = await this.feedStore.openFeed(controlFeedKey, { writable: true });\n const genesisFeed = genesisKey ? await this.feedStore.openFeed(genesisKey) : controlFeed;\n const snapshotManager = new SnapshotManager(new SnapshotStore(createStorage().createDirectory('snapshots')));\n\n const metadataStore = new MetadataStore(createStorage().createDirectory('metadata'));\n await metadataStore.addSpace({ key: spaceKey });\n const dataPipelineController: DataPipeline = new DataPipeline({\n modelFactory: new ModelFactory().registerModel(DocumentModel),\n metadataStore,\n snapshotManager,\n memberKey: identityKey,\n spaceKey,\n feedInfoProvider: (feedKey) => space.spaceState.feeds.get(feedKey),\n snapshotId: undefined\n });\n const space = new Space({\n spaceKey,\n protocol: this.createSpaceProtocol(spaceKey),\n genesisFeed,\n feedProvider: (feedKey) => this.feedStore.openFeed(feedKey)\n })\n .setControlFeed(controlFeed)\n .setDataFeed(dataFeed);\n await space.open();\n await dataPipelineController.open({\n openPipeline: async (start) => {\n const pipeline = await space.createDataPipeline({ start });\n await pipeline.start();\n return pipeline;\n }\n });\n\n this._spaces.set(spaceKey, space);\n return [space, dataPipelineController];\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 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", "//\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 { DatabaseBackendProxy, 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 { DatabaseBackendHost, 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 DatabaseBackendHost(feed, undefined);\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 backend = new DatabaseBackendProxy(dataService, spaceKey);\n const itemManager = new ItemManager(modelFactory);\n await backend.open(itemManager, 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.databaseBackend!.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.databaseBackend!._itemDemuxer.mutation.waitForCondition(() => check._itemManager.entities.has(objectId)),\n 500\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["DocumentModel", "PublicKey", "MemorySignalManager", "MemorySignalManagerContext", "WebsocketSignalManager", "ModelFactory", "createWebRTCTransportFactory", "MemoryTransportFactory", "NetworkManager", "createStorage", "StorageType", "Gossip", "Presence", "ComplexMap", "TestBuilder", "TestFeedBuilder", "TestBuilder", "constructor", "valueEncoding", "MemoryNetworkManagerProvider", "signalContext", "NetworkManager", "signalManager", "MemorySignalManager", "transportFactory", "MemoryTransportFactory", "WebsocketNetworkManagerProvider", "signalUrl", "WebsocketSignalManager", "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", "_feedBuilder", "_spaces", "feedStore", "createFeedStore", "spaces", "space", "getSpace", "spaceKey", "createSpaceManager", "SpaceManager", "networkManager", "createSpace", "genesisKey", "dataFeedKey", "dataFeed", "openFeed", "writable", "controlFeedKey", "controlFeed", "genesisFeed", "snapshotManager", "SnapshotManager", "SnapshotStore", "createDirectory", "metadataStore", "MetadataStore", "addSpace", "key", "dataPipelineController", "DataPipeline", "modelFactory", "ModelFactory", "registerModel", "DocumentModel", "memberKey", "feedInfoProvider", "feedKey", "spaceState", "feeds", "snapshotId", "undefined", "Space", "protocol", "createSpaceProtocol", "feedProvider", "setControlFeed", "setDataFeed", "open", "openPipeline", "start", "pipeline", "createDataPipeline", "topic", "gossip", "SpaceProtocol", "swarmIdentity", "peerKey", "credentialProvider", "MOCK_AUTH_PROVIDER", "credentialAuthenticator", "MOCK_AUTH_VERIFIER", "onSessionAuth", "session", "addExtension", "createGossip", "createExtension", "remotePeerId", "Gossip", "localPeerId", "createPresence", "Presence", "announceInterval", "offlineTimeout", "asyncTimeout", "DocumentModel", "DatabaseBackendProxy", "ItemManager", "MockFeedWriter", "PublicKey", "ModelFactory", "Timeframe", "createMemoryDatabase", "modelFactory", "feed", "MockFeedWriter", "backend", "DatabaseBackendHost", "undefined", "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", "DatabaseBackendProxy", "testLocalDatabase", "create", "check", "objectId", "toHex", "databaseBackend", "getWriteStream", "write", "objects", "genesis", "modelType", "type", "asyncTimeout", "_itemDemuxer", "mutation", "waitForCondition", "_itemManager", "entities", "has"]
7
7
  }
@@ -33,7 +33,7 @@ __export(src_exports, {
33
33
  AuthExtension: () => AuthExtension,
34
34
  AuthStatus: () => AuthStatus,
35
35
  DBError: () => DBError,
36
- DataPipelineControllerImpl: () => DataPipelineControllerImpl,
36
+ DataPipeline: () => DataPipeline,
37
37
  DataServiceHost: () => DataServiceHost,
38
38
  DataServiceImpl: () => DataServiceImpl,
39
39
  DataServiceSubscriptions: () => DataServiceSubscriptions,
@@ -45,7 +45,6 @@ __export(src_exports, {
45
45
  MOCK_AUTH_PROVIDER: () => MOCK_AUTH_PROVIDER,
46
46
  MOCK_AUTH_VERIFIER: () => MOCK_AUTH_VERIFIER,
47
47
  MetadataStore: () => MetadataStore,
48
- NoopDataPipelineController: () => NoopDataPipelineController,
49
48
  Pipeline: () => Pipeline,
50
49
  STORAGE_VERSION: () => STORAGE_VERSION,
51
50
  SnapshotManager: () => SnapshotManager,
@@ -170,7 +169,7 @@ var MetadataStore = class {
170
169
  size: dataSize
171
170
  }, {
172
171
  file: "metadata-store.ts",
173
- line: 68,
172
+ line: 67,
174
173
  scope: this,
175
174
  callSite: (f, a) => f(...a)
176
175
  });
@@ -186,7 +185,7 @@ var MetadataStore = class {
186
185
  err
187
186
  }, {
188
187
  file: "metadata-store.ts",
189
- line: 80,
188
+ line: 79,
190
189
  scope: this,
191
190
  callSite: (f, a) => f(...a)
192
191
  });
@@ -211,7 +210,7 @@ var MetadataStore = class {
211
210
  size: encoded.length
212
211
  }, {
213
212
  file: "metadata-store.ts",
214
- line: 103,
213
+ line: 102,
215
214
  scope: this,
216
215
  callSite: (f, a) => f(...a)
217
216
  });
@@ -226,7 +225,7 @@ var MetadataStore = class {
226
225
  async clear() {
227
226
  (0, import_log.log)("clearing all metadata", {}, {
228
227
  file: "metadata-store.ts",
229
- line: 116,
228
+ line: 115,
230
229
  scope: this,
231
230
  callSite: (f, a) => f(...a)
232
231
  });
@@ -282,6 +281,7 @@ var fromBytesInt32 = (buf) => buf.readInt32LE(0);
282
281
  // packages/core/echo/echo-pipeline/src/pipeline/pipeline.ts
283
282
  var import_node_assert4 = __toESM(require("node:assert"));
284
283
  var import_async3 = require("@dxos/async");
284
+ var import_context = require("@dxos/context");
285
285
  var import_feed_store = require("@dxos/feed-store");
286
286
  var import_keys = require("@dxos/keys");
287
287
  var import_log3 = require("@dxos/log");
@@ -416,7 +416,7 @@ var PipelineState = class {
416
416
  return this._timeframeClock.timeframe;
417
417
  }
418
418
  get targetTimeframe() {
419
- return this._targetTimeframe ? import_timeframe2.Timeframe.merge(this.endTimeframe, this._targetTimeframe) : this.endTimeframe;
419
+ return this._targetTimeframe ? this._targetTimeframe : new import_timeframe2.Timeframe();
420
420
  }
421
421
  async waitUntilTimeframe(target) {
422
422
  await this._timeframeClock.waitUntilReached(target);
@@ -431,7 +431,7 @@ var PipelineState = class {
431
431
  *
432
432
  * @param timeout Timeout in milliseconds to specify the maximum wait time.
433
433
  */
434
- async waitUntilReachedTargetTimeframe({ timeout } = {}) {
434
+ async waitUntilReachedTargetTimeframe({ ctx = new import_context.Context(), timeout, breakOnStall = true } = {}) {
435
435
  var _a;
436
436
  (0, import_log3.log)("waitUntilReachedTargetTimeframe", {
437
437
  timeout,
@@ -439,7 +439,7 @@ var PipelineState = class {
439
439
  target: this.targetTimeframe
440
440
  }, {
441
441
  file: "pipeline.ts",
442
- line: 82,
442
+ line: 96,
443
443
  scope: this,
444
444
  callSite: (f, a) => f(...a)
445
445
  });
@@ -447,11 +447,14 @@ var PipelineState = class {
447
447
  this._timeframeClock.update.waitForCondition(() => {
448
448
  return import_timeframe2.Timeframe.dependencies(this.targetTimeframe, this.timeframe).isEmpty();
449
449
  }),
450
- this._iterator.stalled.discardParameter().waitForCount(1)
450
+ ...breakOnStall ? [
451
+ this._iterator.stalled.discardParameter().waitForCount(1)
452
+ ] : []
451
453
  ]);
452
454
  let done = false;
453
455
  if (timeout) {
454
456
  return Promise.race([
457
+ (0, import_context.rejectOnDispose)(ctx),
455
458
  this._reachedTargetPromise.then(() => {
456
459
  done = true;
457
460
  }),
@@ -466,7 +469,7 @@ var PipelineState = class {
466
469
  dependencies: import_timeframe2.Timeframe.dependencies(this.targetTimeframe, this.timeframe)
467
470
  }, {
468
471
  file: "pipeline.ts",
469
- line: 107,
472
+ line: 122,
470
473
  scope: this,
471
474
  callSite: (f, a) => f(...a)
472
475
  });
@@ -492,7 +495,7 @@ var Pipeline = class {
492
495
  this._feedSetIterator.stalled.on((iterator) => {
493
496
  import_log3.log.warn(`Stalled after ${iterator.options.stallTimeout}ms with ${iterator.size} feeds.`, {}, {
494
497
  file: "pipeline.ts",
495
- line: 183,
498
+ line: 198,
496
499
  scope: this,
497
500
  callSite: (f, a) => f(...a)
498
501
  });
@@ -522,14 +525,14 @@ var Pipeline = class {
522
525
  async start() {
523
526
  (0, import_log3.log)("starting...", {}, {
524
527
  file: "pipeline.ts",
525
- line: 218,
528
+ line: 233,
526
529
  scope: this,
527
530
  callSite: (f, a) => f(...a)
528
531
  });
529
532
  await this._feedSetIterator.open();
530
533
  (0, import_log3.log)("started", {}, {
531
534
  file: "pipeline.ts",
532
- line: 220,
535
+ line: 235,
533
536
  scope: this,
534
537
  callSite: (f, a) => f(...a)
535
538
  });
@@ -537,7 +540,7 @@ var Pipeline = class {
537
540
  async stop() {
538
541
  (0, import_log3.log)("stopping...", {}, {
539
542
  file: "pipeline.ts",
540
- line: 224,
543
+ line: 239,
541
544
  scope: this,
542
545
  callSite: (f, a) => f(...a)
543
546
  });
@@ -545,7 +548,7 @@ var Pipeline = class {
545
548
  await this._processingTrigger.wait();
546
549
  (0, import_log3.log)("stopped", {}, {
547
550
  file: "pipeline.ts",
548
- line: 227,
551
+ line: 242,
549
552
  scope: this,
550
553
  callSite: (f, a) => f(...a)
551
554
  });
@@ -570,7 +573,7 @@ var Pipeline = class {
570
573
  // packages/core/echo/echo-pipeline/src/space/auth.ts
571
574
  var import_node_assert5 = __toESM(require("node:assert"));
572
575
  var import_async4 = require("@dxos/async");
573
- var import_context = require("@dxos/context");
576
+ var import_context2 = require("@dxos/context");
574
577
  var import_crypto = require("@dxos/crypto");
575
578
  var import_log4 = require("@dxos/log");
576
579
  var import_protocols3 = require("@dxos/protocols");
@@ -588,7 +591,7 @@ var AuthExtension = class extends import_teleport.RpcExtension {
588
591
  // Long timeout because auth can wait for sync in certain cases.
589
592
  });
590
593
  this._authParams = _authParams;
591
- this._ctx = new import_context.Context({
594
+ this._ctx = new import_context2.Context({
592
595
  onError: (err) => {
593
596
  import_log4.log.catch(err, {}, {
594
597
  file: "auth.ts",
@@ -817,7 +820,7 @@ var Space = class Space2 {
817
820
  credential
818
821
  }, {
819
822
  file: "space.ts",
820
- line: 74,
823
+ line: 79,
821
824
  scope: this,
822
825
  callSite: (f, a) => f(...a)
823
826
  });
@@ -880,7 +883,7 @@ var Space = class Space2 {
880
883
  async open() {
881
884
  (0, import_log6.log)("opening...", {}, {
882
885
  file: "space.ts",
883
- line: 145,
886
+ line: 149,
884
887
  scope: this,
885
888
  callSite: (f, a) => f(...a)
886
889
  });
@@ -892,18 +895,17 @@ var Space = class Space2 {
892
895
  this._isOpen = true;
893
896
  (0, import_log6.log)("opened", {}, {
894
897
  file: "space.ts",
895
- line: 155,
898
+ line: 159,
896
899
  scope: this,
897
900
  callSite: (f, a) => f(...a)
898
901
  });
899
902
  }
900
903
  async close() {
901
- var _a;
902
904
  (0, import_log6.log)("closing...", {
903
905
  key: this._key
904
906
  }, {
905
907
  file: "space.ts",
906
- line: 160,
908
+ line: 164,
907
909
  scope: this,
908
910
  callSite: (f, a) => f(...a)
909
911
  });
@@ -911,37 +913,30 @@ var Space = class Space2 {
911
913
  return;
912
914
  }
913
915
  await this.protocol.stop();
914
- await ((_a = this._dataPipelineController) == null ? void 0 : _a.close());
915
916
  await this._controlPipeline.stop();
916
917
  this._isOpen = false;
917
918
  (0, import_log6.log)("closed", {}, {
918
919
  file: "space.ts",
919
- line: 171,
920
+ line: 174,
920
921
  scope: this,
921
922
  callSite: (f, a) => f(...a)
922
923
  });
923
924
  }
924
- async initDataPipeline(controller) {
925
+ // TODO(dmaretskyi): Make reusable.
926
+ async createDataPipeline({ start }) {
925
927
  (0, import_node_assert6.default)(this._isOpen, "Space must be open to initialize data pipeline.");
926
- (0, import_node_assert6.default)(!this._dataPipelineController, "Data pipeline already initialized.");
927
928
  (0, import_node_assert6.default)(!this._dataPipeline, "Data pipeline already initialized.");
928
- this._dataPipelineController = controller;
929
- await this._dataPipelineController.open({
930
- openPipeline: async (start) => {
931
- (0, import_node_assert6.default)(!this._dataPipeline, "Data pipeline already initialized.");
932
- this._dataPipeline = new Pipeline(start);
933
- if (this._dataFeed) {
934
- this._dataPipeline.setWriteFeed(this._dataFeed);
935
- }
936
- for (const feed of this._controlPipeline.spaceState.feeds.values()) {
937
- if (feed.assertion.designation === import_credentials3.AdmittedFeed.Designation.DATA) {
938
- await this._dataPipeline.addFeed(await this._feedProvider(feed.key));
939
- }
940
- }
941
- await this._dataPipeline.start();
942
- return this._dataPipeline;
929
+ const pipeline = new Pipeline(start);
930
+ if (this._dataFeed) {
931
+ pipeline.setWriteFeed(this._dataFeed);
932
+ }
933
+ this._dataPipeline = pipeline;
934
+ for (const feed of this._controlPipeline.spaceState.feeds.values()) {
935
+ if (feed.assertion.designation === import_credentials3.AdmittedFeed.Designation.DATA) {
936
+ await pipeline.addFeed(await this._feedProvider(feed.key));
943
937
  }
944
- });
938
+ }
939
+ return pipeline;
945
940
  }
946
941
  };
947
942
  __decorate3([
@@ -1274,10 +1269,10 @@ var spaceGenesis = async (keyring, signingContext, space) => {
1274
1269
  return credentials;
1275
1270
  };
1276
1271
 
1277
- // packages/core/echo/echo-pipeline/src/space/data-pipeline-controller.ts
1272
+ // packages/core/echo/echo-pipeline/src/space/data-pipeline.ts
1278
1273
  var import_node_assert9 = __toESM(require("node:assert"));
1279
1274
  var import_async8 = require("@dxos/async");
1280
- var import_context2 = require("@dxos/context");
1275
+ var import_context3 = require("@dxos/context");
1281
1276
  var import_debug6 = require("@dxos/debug");
1282
1277
  var import_echo_db3 = require("@dxos/echo-db");
1283
1278
  var import_log11 = require("@dxos/log");
@@ -1556,7 +1551,7 @@ var DataServiceImpl = class {
1556
1551
  }
1557
1552
  };
1558
1553
 
1559
- // packages/core/echo/echo-pipeline/src/space/data-pipeline-controller.ts
1554
+ // packages/core/echo/echo-pipeline/src/space/data-pipeline.ts
1560
1555
  var __decorate7 = function(decorators, target, key, desc) {
1561
1556
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1562
1557
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
@@ -1567,22 +1562,21 @@ var __decorate7 = function(decorators, target, key, desc) {
1567
1562
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1568
1563
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1569
1564
  };
1570
- var NoopDataPipelineController = class {
1571
- async open(context) {
1572
- }
1573
- async close() {
1574
- }
1575
- };
1576
1565
  var MESSAGES_PER_SNAPSHOT = 10;
1577
1566
  var AUTOMATIC_SNAPSHOT_DEBOUNCE_INTERVAL = 5e3;
1578
1567
  var TIMEFRAME_SAVE_DEBOUNCE_INTERVAL = 500;
1579
- var DataPipelineControllerImpl = class DataPipelineControllerImpl2 {
1568
+ var DISABLE_SNAPSHOT_CACHE = false;
1569
+ var DataPipeline = class DataPipeline2 {
1580
1570
  constructor(_params) {
1581
1571
  this._params = _params;
1582
- this._ctx = new import_context2.Context();
1572
+ this._ctx = new import_context3.Context();
1583
1573
  this._lastAutomaticSnapshotTimeframe = new import_timeframe3.Timeframe();
1574
+ this._isOpen = false;
1584
1575
  this.onTimeframeReached = new import_async8.Event();
1585
1576
  }
1577
+ get isOpen() {
1578
+ return this._isOpen;
1579
+ }
1586
1580
  get pipelineState() {
1587
1581
  var _a;
1588
1582
  return (_a = this._pipeline) == null ? void 0 : _a.state;
@@ -1595,14 +1589,25 @@ var DataPipelineControllerImpl = class DataPipelineControllerImpl2 {
1595
1589
  var _a;
1596
1590
  return snapshotTimeframeToStartingTimeframe((_a = this.snapshotTimeframe) != null ? _a : new import_timeframe3.Timeframe());
1597
1591
  }
1592
+ setTargetTimeframe(timeframe) {
1593
+ var _a;
1594
+ this._targetTimeframe = timeframe;
1595
+ (_a = this._pipeline) == null ? void 0 : _a.state.setTargetTimeframe(timeframe);
1596
+ }
1598
1597
  async open(spaceContext) {
1599
1598
  var _a, _b, _c, _d;
1599
+ if (this._isOpen) {
1600
+ return;
1601
+ }
1600
1602
  this._spaceContext = spaceContext;
1601
1603
  if (this._params.snapshotId) {
1602
1604
  this._snapshot = await this._params.snapshotManager.load(this._params.snapshotId);
1603
1605
  this._lastAutomaticSnapshotTimeframe = (_b = (_a = this._snapshot) == null ? void 0 : _a.timeframe) != null ? _b : new import_timeframe3.Timeframe();
1604
1606
  }
1605
1607
  this._pipeline = await this._spaceContext.openPipeline(this.getStartTimeframe());
1608
+ if (this._targetTimeframe) {
1609
+ this._pipeline.state.setTargetTimeframe(this._targetTimeframe);
1610
+ }
1606
1611
  const feedWriter = createMappedFeedWriter((data) => ({
1607
1612
  data
1608
1613
  }), (_c = this._pipeline.writer) != null ? _c : (0, import_debug6.failUndefined)());
@@ -1613,30 +1618,33 @@ var DataPipelineControllerImpl = class DataPipelineControllerImpl2 {
1613
1618
  await this._consumePipeline();
1614
1619
  });
1615
1620
  this._createPeriodicSnapshots();
1621
+ this._isOpen = true;
1616
1622
  }
1617
1623
  _createPeriodicSnapshots() {
1618
1624
  this.onTimeframeReached.debounce(TIMEFRAME_SAVE_DEBOUNCE_INTERVAL).on(this._ctx, async () => {
1619
1625
  await this._saveLatestTimeframe();
1620
1626
  });
1621
- this.onTimeframeReached.debounce(AUTOMATIC_SNAPSHOT_DEBOUNCE_INTERVAL).on(this._ctx, async () => {
1622
- var _a, _b;
1623
- const latestTimeframe = (_a = this._pipeline) == null ? void 0 : _a.state.timeframe;
1624
- if (!latestTimeframe) {
1625
- return;
1626
- }
1627
- if (latestTimeframe.totalMessages() - this._lastAutomaticSnapshotTimeframe.totalMessages() > MESSAGES_PER_SNAPSHOT) {
1628
- const snapshot = await this._saveSnapshot();
1629
- this._lastAutomaticSnapshotTimeframe = (_b = snapshot.timeframe) != null ? _b : (0, import_debug6.failUndefined)();
1630
- (0, import_log11.log)("save", {
1631
- snapshot
1632
- }, {
1633
- file: "data-pipeline-controller.ts",
1634
- line: 149,
1635
- scope: this,
1636
- callSite: (f, a) => f(...a)
1637
- });
1638
- }
1639
- });
1627
+ if (!DISABLE_SNAPSHOT_CACHE) {
1628
+ this.onTimeframeReached.debounce(AUTOMATIC_SNAPSHOT_DEBOUNCE_INTERVAL).on(this._ctx, async () => {
1629
+ var _a, _b;
1630
+ const latestTimeframe = (_a = this._pipeline) == null ? void 0 : _a.state.timeframe;
1631
+ if (!latestTimeframe) {
1632
+ return;
1633
+ }
1634
+ if (latestTimeframe.totalMessages() - this._lastAutomaticSnapshotTimeframe.totalMessages() > MESSAGES_PER_SNAPSHOT) {
1635
+ const snapshot = await this._saveSnapshot();
1636
+ this._lastAutomaticSnapshotTimeframe = (_b = snapshot.timeframe) != null ? _b : (0, import_debug6.failUndefined)();
1637
+ (0, import_log11.log)("save", {
1638
+ snapshot
1639
+ }, {
1640
+ file: "data-pipeline.ts",
1641
+ line: 161,
1642
+ scope: this,
1643
+ callSite: (f, a) => f(...a)
1644
+ });
1645
+ }
1646
+ });
1647
+ }
1640
1648
  }
1641
1649
  async _saveSnapshot() {
1642
1650
  const snapshot = await this.createSnapshot();
@@ -1645,21 +1653,41 @@ var DataPipelineControllerImpl = class DataPipelineControllerImpl2 {
1645
1653
  return snapshot;
1646
1654
  }
1647
1655
  async _saveLatestTimeframe() {
1648
- var _a;
1656
+ var _a, _b;
1649
1657
  const latestTimeframe = (_a = this._pipeline) == null ? void 0 : _a.state.timeframe;
1658
+ (0, import_log11.log)("save latest timeframe", {
1659
+ latestTimeframe,
1660
+ spaceKey: this._params.spaceKey
1661
+ }, {
1662
+ file: "data-pipeline.ts",
1663
+ line: 176,
1664
+ scope: this,
1665
+ callSite: (f, a) => f(...a)
1666
+ });
1650
1667
  if (latestTimeframe) {
1651
- await this._params.metadataStore.setSpaceLatestTimeframe(this._params.spaceKey, latestTimeframe);
1668
+ const newTimeframe = import_timeframe3.Timeframe.merge((_b = this._targetTimeframe) != null ? _b : new import_timeframe3.Timeframe(), latestTimeframe);
1669
+ await this._params.metadataStore.setSpaceLatestTimeframe(this._params.spaceKey, newTimeframe);
1652
1670
  }
1653
1671
  }
1654
1672
  async close() {
1655
1673
  var _a, _b, _c;
1674
+ if (!this._isOpen) {
1675
+ return;
1676
+ }
1677
+ (0, import_log11.log)("close", {}, {
1678
+ file: "data-pipeline.ts",
1679
+ line: 188,
1680
+ scope: this,
1681
+ callSite: (f, a) => f(...a)
1682
+ });
1683
+ this._isOpen = false;
1656
1684
  try {
1657
1685
  await this._saveLatestTimeframe();
1658
1686
  await this._saveSnapshot();
1659
1687
  } catch (err) {
1660
1688
  import_log11.log.catch(err, {}, {
1661
- file: "data-pipeline-controller.ts",
1662
- line: 173,
1689
+ file: "data-pipeline.ts",
1690
+ line: 195,
1663
1691
  scope: this,
1664
1692
  callSite: (f, a) => f(...a)
1665
1693
  });
@@ -1672,6 +1700,7 @@ var DataPipelineControllerImpl = class DataPipelineControllerImpl2 {
1672
1700
  }
1673
1701
  createSnapshot() {
1674
1702
  var _a, _b;
1703
+ (0, import_node_assert9.default)(this.databaseBackend, "Database backend is not initialized.");
1675
1704
  return {
1676
1705
  spaceKey: this._params.spaceKey.asUint8Array(),
1677
1706
  timeframe: (_b = (_a = this._pipeline) == null ? void 0 : _a.state.timeframe) != null ? _b : new import_timeframe3.Timeframe(),
@@ -1685,8 +1714,8 @@ var DataPipelineControllerImpl = class DataPipelineControllerImpl2 {
1685
1714
  (0, import_log11.log)("processing message", {
1686
1715
  msg
1687
1716
  }, {
1688
- file: "data-pipeline-controller.ts",
1689
- line: 194,
1717
+ file: "data-pipeline.ts",
1718
+ line: 217,
1690
1719
  scope: this,
1691
1720
  callSite: (f, a) => f(...a)
1692
1721
  });
@@ -1697,8 +1726,8 @@ var DataPipelineControllerImpl = class DataPipelineControllerImpl2 {
1697
1726
  import_log11.log.error("Could not find feed.", {
1698
1727
  feedKey
1699
1728
  }, {
1700
- file: "data-pipeline-controller.ts",
1701
- line: 200,
1729
+ file: "data-pipeline.ts",
1730
+ line: 223,
1702
1731
  scope: this,
1703
1732
  callSite: (f, a) => f(...a)
1704
1733
  });
@@ -1717,8 +1746,8 @@ var DataPipelineControllerImpl = class DataPipelineControllerImpl2 {
1717
1746
  }
1718
1747
  } catch (err) {
1719
1748
  import_log11.log.catch(err, {}, {
1720
- file: "data-pipeline-controller.ts",
1721
- line: 216,
1749
+ file: "data-pipeline.ts",
1750
+ line: 239,
1722
1751
  scope: this,
1723
1752
  callSite: (f, a) => f(...a)
1724
1753
  });
@@ -1730,9 +1759,15 @@ var DataPipelineControllerImpl = class DataPipelineControllerImpl2 {
1730
1759
  await this._pipeline.state.waitUntilTimeframe(timeframe);
1731
1760
  }
1732
1761
  };
1733
- DataPipelineControllerImpl = __decorate7([
1762
+ __decorate7([
1763
+ import_async8.synchronized
1764
+ ], DataPipeline.prototype, "open", null);
1765
+ __decorate7([
1766
+ import_async8.synchronized
1767
+ ], DataPipeline.prototype, "close", null);
1768
+ DataPipeline = __decorate7([
1734
1769
  (0, import_async8.trackLeaks)("open", "close")
1735
- ], DataPipelineControllerImpl);
1770
+ ], DataPipeline);
1736
1771
  var snapshotTimeframeToStartingTimeframe = (snapshotTimeframe) => {
1737
1772
  return snapshotTimeframe.map(([key, seq]) => [
1738
1773
  key,
@@ -1744,7 +1779,7 @@ var snapshotTimeframeToStartingTimeframe = (snapshotTimeframe) => {
1744
1779
  AuthExtension,
1745
1780
  AuthStatus,
1746
1781
  DBError,
1747
- DataPipelineControllerImpl,
1782
+ DataPipeline,
1748
1783
  DataServiceHost,
1749
1784
  DataServiceImpl,
1750
1785
  DataServiceSubscriptions,
@@ -1756,7 +1791,6 @@ var snapshotTimeframeToStartingTimeframe = (snapshotTimeframe) => {
1756
1791
  MOCK_AUTH_PROVIDER,
1757
1792
  MOCK_AUTH_VERIFIER,
1758
1793
  MetadataStore,
1759
- NoopDataPipelineController,
1760
1794
  Pipeline,
1761
1795
  STORAGE_VERSION,
1762
1796
  SnapshotManager,