@dxos/client-services 0.14.0 → 0.16.0
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.
- package/dist/lib/chunk-client-services-stack.mjs +799 -573
- package/dist/lib/chunk-client-services-stack.mjs.map +1 -1
- package/dist/lib/index.mjs +139 -131
- package/dist/lib/index.mjs.map +1 -1
- package/dist/lib/testing.mjs +1 -1
- package/dist/lib/testing.mjs.map +1 -1
- package/dist/types/src/Events.d.ts +2 -0
- package/dist/types/src/Events.d.ts.map +1 -1
- package/dist/types/src/internal/blobs/blob-replication.d.ts +28 -0
- package/dist/types/src/internal/blobs/blob-replication.d.ts.map +1 -0
- package/dist/types/src/internal/blobs/blob-store-service.d.ts +10 -0
- package/dist/types/src/internal/blobs/blob-store-service.d.ts.map +1 -0
- package/dist/types/src/internal/blobs/blob-store-service.test.d.ts +2 -0
- package/dist/types/src/internal/blobs/blob-store-service.test.d.ts.map +1 -0
- package/dist/types/src/internal/blobs/index.d.ts +4 -0
- package/dist/types/src/internal/blobs/index.d.ts.map +1 -0
- package/dist/types/src/internal/blobs/local-blob-store.d.ts +21 -0
- package/dist/types/src/internal/blobs/local-blob-store.d.ts.map +1 -0
- package/dist/types/src/internal/blobs/local-blob-store.test.d.ts +2 -0
- package/dist/types/src/internal/blobs/local-blob-store.test.d.ts.map +1 -0
- package/dist/types/src/internal/services/layer-specs.d.ts +6 -0
- package/dist/types/src/internal/services/layer-specs.d.ts.map +1 -1
- package/dist/types/src/internal/services/service-stack.d.ts.map +1 -1
- package/dist/types/src/internal/space-export/serialized-space-writer.d.ts +4 -1
- package/dist/types/src/internal/space-export/serialized-space-writer.d.ts.map +1 -1
- package/dist/types/src/internal/spaces/spaces-service.d.ts.map +1 -1
- package/dist/types/src/internal/storage/index.d.ts +1 -0
- package/dist/types/src/internal/storage/index.d.ts.map +1 -1
- package/dist/types/src/internal/storage/storage-watchdog.d.ts +17 -0
- package/dist/types/src/internal/storage/storage-watchdog.d.ts.map +1 -0
- package/dist/types/src/internal/storage/storage-watchdog.test.d.ts +2 -0
- package/dist/types/src/internal/storage/storage-watchdog.test.d.ts.map +1 -0
- package/dist/types/src/internal/worker/worker-runtime.d.ts.map +1 -1
- package/dist/types/src/migrations/blobs/index.d.ts +10 -0
- package/dist/types/src/migrations/blobs/index.d.ts.map +1 -0
- package/dist/types/src/version.d.ts +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +43 -42
- package/src/Events.ts +3 -0
- package/src/internal/blobs/blob-replication.ts +80 -0
- package/src/internal/blobs/blob-store-service.test.ts +76 -0
- package/src/internal/blobs/blob-store-service.ts +45 -0
- package/src/internal/blobs/index.ts +7 -0
- package/src/internal/blobs/local-blob-store.test.ts +53 -0
- package/src/internal/blobs/local-blob-store.ts +89 -0
- package/src/internal/services/layer-specs.ts +55 -0
- package/src/internal/services/service-stack.ts +2 -0
- package/src/internal/space-export/serialized-space-writer.ts +16 -9
- package/src/internal/spaces/spaces-service.ts +44 -6
- package/src/internal/storage/index.ts +1 -0
- package/src/internal/storage/storage-watchdog.test.ts +46 -0
- package/src/internal/storage/storage-watchdog.ts +58 -0
- package/src/internal/worker/worker-runtime.ts +2 -0
- package/src/migrations/blobs/0001_init.sql +17 -0
- package/src/migrations/blobs/index.ts +18 -0
- package/src/migrations/migrations.test.ts +3 -0
- package/src/version.ts +1 -1
package/dist/lib/testing.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.mjs","names":[],"sources":["../../src/internal/pipeline/testing/test-feed-builder.ts","../../src/internal/space/testing/change-metadata.ts","../../src/internal/space/testing/test-agent-builder.ts","../../src/internal/testing/credential-utils.ts","../../src/internal/testing/test-builder.ts","../../src/internal/testing/invitation-utils.ts","../../src/internal/testing/memory-edge-inbox.ts"],"sourcesContent":["//\n// Copyright 2022 DXOS.org\n//\n\nimport { TestBuilder } from '@dxos/feed-store/testing';\nimport type { FeedMessage } from '@dxos/protocols/buf/dxos/echo/feed_pb';\n\nimport { valueEncoding } from '../codec.ts';\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 2023 DXOS.org\n//\n\nimport { log } from '@dxos/log';\nimport { EchoMetadataSchema } from '@dxos/protocols/buf/dxos/echo/metadata_pb';\nimport type { Storage } from '@dxos/random-access-storage';\n\nimport { MetadataStore } from '../../metadata/index.ts';\n\n/**\n * This function will change the storage version in the metadata.\n * This will break your storage and make it unusable.\n * Use this only for testing purposes.\n */\nexport const changeStorageVersionInMetadata = async (storage: Storage, version: number) => {\n log('Changing storage version in metadata. USE ONLY FOR TESTING.');\n const metadata = new MetadataStore(storage.createDirectory('metadata'));\n await metadata.load();\n const echoMetadata = metadata.metadata;\n echoMetadata.version = version;\n const file = metadata._directory.getOrCreateFile('EchoMetadata');\n await metadata._writeFile(file, EchoMetadataSchema, echoMetadata);\n await metadata._directory.flush();\n};\n","//\n// Copyright 2022 DXOS.org\n//\n\nimport { create } from '@bufbuild/protobuf';\n\nimport { Context } from '@dxos/context';\nimport { CredentialGenerator, credentialPayload } from '@dxos/credentials';\nimport { type HypercoreStore } from '@dxos/feed-store';\nimport { type Keyring } from '@dxos/keyring';\nimport { PublicKey } from '@dxos/keys';\nimport { MemorySignalManager, MemorySignalManagerContext } from '@dxos/messaging';\nimport { MemoryTransportFactory, SwarmNetworkManager } from '@dxos/network-manager';\nimport { fromPublicKey } from '@dxos/protocols/buf';\nimport { type FeedMessage } from '@dxos/protocols/buf/dxos/echo/feed_pb';\nimport { type SpaceMetadata, SpaceMetadataSchema } from '@dxos/protocols/buf/dxos/echo/metadata_pb';\nimport { PeerSchema } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\nimport { AdmittedFeed_Designation } from '@dxos/protocols/buf/dxos/halo/credentials_pb';\nimport { type Storage, StorageType, createStorage } from '@dxos/random-access-storage';\nimport { Gossip, Presence } from '@dxos/teleport-extension-gossip';\nimport { ComplexMap } from '@dxos/util';\n\nimport { MetadataStore } from '../../metadata/index.ts';\nimport { TestFeedBuilder } from '../../pipeline/testing/index.ts';\nimport { MOCK_AUTH_PROVIDER, MOCK_AUTH_VERIFIER, type Space, SpaceManager, SpaceProtocol } from '../index.ts';\n\nexport type NetworkManagerProvider = () => SwarmNetworkManager;\n\nexport const MemoryNetworkManagerProvider =\n (signalContext: MemorySignalManagerContext): NetworkManagerProvider =>\n () =>\n new SwarmNetworkManager({\n signalManager: new MemorySignalManager(signalContext),\n transportFactory: MemoryTransportFactory,\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): TestAgent | undefined {\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 hypercoreStore: HypercoreStore<FeedMessage>;\n\n private _metadataStore?: MetadataStore;\n get metadataStore() {\n return (this._metadataStore ??= new MetadataStore(this.storage.createDirectory('metadata')));\n }\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.hypercoreStore = this._feedBuilder.createHypercoreStore();\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): Space | undefined {\n return this._spaces.get(spaceKey);\n }\n\n private _networkManager?: SwarmNetworkManager;\n get networkManager() {\n if (this._networkManager) {\n return this._networkManager;\n }\n\n this._networkManager = this._networkManagerProvider();\n this._networkManager.setPeerInfo(\n create(PeerSchema, { peerKey: this.deviceKey.toHex(), identityKey: this.identityKey.toHex() }),\n );\n\n return this._networkManager;\n }\n\n private _spaceManager?: SpaceManager;\n get spaceManager() {\n return (this._spaceManager ??= new SpaceManager({\n hypercoreStore: this.hypercoreStore,\n networkManager: this.networkManager,\n metadataStore: this.metadataStore,\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.hypercoreStore.openHypercore(genesisKey, { writable: true });\n const dataFeed = await this.hypercoreStore.openHypercore(dataKey ?? (await this.keyring.createKey()), {\n writable: true,\n sparse: true,\n });\n\n const metadata: SpaceMetadata = create(SpaceMetadataSchema, {\n key: fromPublicKey(spaceKey),\n genesisFeedKey: fromPublicKey(genesisKey),\n controlFeedKey: fromPublicKey(controlFeed.key),\n dataFeedKey: fromPublicKey(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 identityKey: this.identityKey,\n peerKey: this.deviceKey,\n credentialProvider: MOCK_AUTH_PROVIDER,\n credentialAuthenticator: MOCK_AUTH_VERIFIER,\n },\n memberKey: identityKey,\n onAuthorizedConnection: (session) => {\n session.addExtension(\n 'dxos.mesh.teleport.gossip',\n this.createGossip().createExtension({ remotePeerId: session.remotePeerId }),\n );\n },\n onDelegatedInvitationStatusChange: async () => {},\n onMemberRolesChanged: async () => {},\n });\n await space.setControlFeed(controlFeed);\n await space.setDataFeed(dataFeed);\n\n await space.open(new Context());\n\n this._spaces.set(spaceKey, space);\n return space;\n }\n\n createSpaceProtocol(topic: PublicKey, gossip?: Gossip): SpaceProtocol {\n return new SpaceProtocol({\n topic,\n swarmIdentity: {\n identityKey: this.identityKey,\n peerKey: this.deviceKey,\n credentialProvider: MOCK_AUTH_PROVIDER,\n credentialAuthenticator: MOCK_AUTH_VERIFIER,\n },\n networkManager: this.networkManager,\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(): Gossip {\n return new Gossip({\n localPeerId: this.deviceKey,\n });\n }\n\n createPresence(gossip?: Gossip): Presence {\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): Promise<void> {\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(credentialPayload(credential));\n }\n }\n}\n","//\n// Copyright 2023 DXOS.org\n//\n\nimport { create } from '@bufbuild/protobuf';\n\nimport { createCredential } from '@dxos/credentials';\nimport { type Signer } from '@dxos/crypto';\nimport { PublicKey } from '@dxos/keys';\nimport { fromPublicKey } from '@dxos/protocols/buf';\nimport { AuthorizedDeviceSchema, type Credential } from '@dxos/protocols/buf/dxos/halo/credentials_pb';\n\nexport const createMockCredential = async ({\n signer,\n issuer,\n}: {\n signer: Signer;\n issuer: PublicKey;\n}): Promise<Credential> =>\n createCredential({\n signer,\n issuer,\n subject: new PublicKey(Buffer.from('test')),\n // The assertion must be a real credential type: the services carry credentials as buf messages,\n // whose registry resolves only the types the schema declares.\n assertion: create(AuthorizedDeviceSchema, { identityKey: fromPublicKey(issuer), deviceKey: fromPublicKey(issuer) }),\n });\n","//\n// Copyright 2022 DXOS.org\n//\n\nimport { create } from '@bufbuild/protobuf';\nimport * as EffectContext from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport * as Exit from 'effect/Exit';\nimport * as Layer from 'effect/Layer';\nimport * as ManagedRuntime from 'effect/ManagedRuntime';\nimport * as Reactivity from 'effect/reactivity/Reactivity';\nimport * as Scope from 'effect/Scope';\nimport type * as SqlClient from 'effect/sql/SqlClient';\n\nimport { type Trigger } from '@dxos/async';\nimport { type ClientServicesRpc, makeClientServicesRpcFromRouter } from '@dxos/client-protocol';\nimport { LayerStack } from '@dxos/compute-runtime';\nimport * as ServiceResolver from '@dxos/compute/ServiceResolver';\nimport { Config, ConfigService } from '@dxos/config';\nimport { Context } from '@dxos/context';\nimport { CredentialGenerator, createCredentialSignerWithChain } from '@dxos/credentials';\nimport { failUndefined } from '@dxos/debug';\nimport { EchoHost, EchoHostService, MeshEchoReplicator } from '@dxos/echo-host';\nimport { type EdgeHttpClient } from '@dxos/edge-client';\nimport * as EffectEx from '@dxos/effect/EffectEx';\nimport * as Hook from '@dxos/effect/Hook';\nimport * as RuntimeProvider from '@dxos/effect/RuntimeProvider';\nimport { HypercoreFactory, HypercoreStore, HypercoreStoreService } from '@dxos/feed-store';\nimport { type KeyringApi, KeyringApiService, SqliteKeyring } from '@dxos/keyring';\nimport {\n MemorySignalManager,\n MemorySignalManagerContext,\n type SignalManager,\n SignalManagerService,\n} from '@dxos/messaging';\nimport {\n MemoryTransportFactory,\n SwarmNetworkManager,\n SwarmNetworkManagerService,\n type TransportFactory,\n} from '@dxos/network-manager';\nimport { toPublicKey } from '@dxos/protocols/buf';\nimport { Invitation_Kind } from '@dxos/protocols/buf/dxos/client/invitation_pb';\nimport { PeerSchema } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\nimport { ChainSchema } from '@dxos/protocols/buf/dxos/halo/credentials_pb';\nimport { StorageType } from '@dxos/random-access-storage';\nimport { RpcRouter } from '@dxos/rpc';\nimport { layerMemory as sqliteLayerMemory } from '@dxos/sql-sqlite/Platform';\n\nimport * as IdentityContract from '../../contracts/identity.ts';\nimport * as InvitationsContract from '../../contracts/invitations.ts';\nimport * as SpacesContract from '../../contracts/spaces.ts';\nimport * as Events from '../../Events.ts';\nimport { type Identity } from '../../Identity.ts';\nimport * as Readiness from '../../Readiness.ts';\nimport * as SqliteStorage from '../../SqliteStorage.ts';\nimport { type EdgeAgentManager, EdgeAgentManagerService } from '../agents/index.ts';\nimport {\n type EdgeIdentityRecoveryManager,\n EdgeIdentityRecoveryManagerService,\n} from '../identity/identity-recovery-manager.ts';\nimport { type CreateIdentityOptions } from '../identity/index.ts';\nimport {\n InvitationsHandler,\n InvitationsHandlerService,\n InvitationsManager,\n SpaceInvitationProtocol,\n} from '../invitations/index.ts';\nimport { type IMetadataStore, IMetadataStoreService, SqliteMetadataStore } from '../metadata/index.ts';\nimport { valueEncoding } from '../pipeline/index.ts';\nimport { type ServiceContextRuntimeProps, layerClientServices } from '../services/index.ts';\nimport { SpaceManager, SpaceManagerService } from '../space/index.ts';\nimport { DataSpaceManager, type DataSpaceManagerRuntimeProps, type SigningContext } from '../spaces/index.ts';\n\n/** The open event chain; `StackOpened` resolves once every handler the cascade triggered has run. */\nconst openChain = Effect.gen(function* () {\n yield* Hook.emit(Events.Opening, undefined);\n yield* Hook.emit(Events.StackOpened, undefined);\n});\n\n/**\n * Options for a test {@link ServiceContext}.\n */\nexport type ServiceContextOptions = {\n config?: Config;\n signalManager?: SignalManager;\n transportFactory?: TransportFactory;\n runtimeProps?: ServiceContextRuntimeProps;\n};\n\n/**\n * The tags this test surface hands out synchronously. The stack resolves lazily, so they are\n * materialised together when it opens rather than on first access.\n */\nconst EXPOSED_TAGS = [\n RpcRouter.RpcRouter,\n Readiness.StackReadinessService,\n IdentityContract.ManagerService,\n IdentityContract.LifecycleService,\n SpaceManagerService,\n IMetadataStoreService,\n EdgeIdentityRecoveryManagerService,\n KeyringApiService,\n HypercoreStoreService,\n EchoHostService,\n InvitationsHandlerService,\n InvitationsContract.ManagerService,\n SwarmNetworkManagerService,\n SignalManagerService,\n SpacesContract.ManagerService,\n EdgeAgentManagerService,\n] as const;\n\n/**\n * A client services runtime for tests: the stack built from {@link layerClientServices} over an\n * in-memory SQLite runtime, plus the system service, with the components exposed as properties\n * while open.\n */\nexport class ServiceContext {\n readonly #options: ServiceContextOptions;\n readonly #config: Config;\n readonly #sql = ManagedRuntime.make(sqliteLayerMemory.pipe(Layer.provideMerge(Reactivity.layer)).pipe(Layer.orDie));\n readonly #controller = Hook.makeController();\n /** Holds the reset handlers; closed by `destroy`. */\n readonly #busScope = Effect.runSync(Scope.make());\n /** Scope of the built stack; closed by `#closeStack`. */\n #stackScope?: Scope.Closeable;\n #stack?: LayerStack.LayerStack;\n /** The tags this test surface exposes, resolved once the stack is open so the getters stay sync. */\n #services?: EffectContext.Context<never>;\n #ctx?: Context;\n\n constructor(options: ServiceContextOptions = {}) {\n this.#options = options;\n this.#config = options.config ?? new Config();\n Effect.runSync(\n Effect.gen({ self: this }, function* () {\n yield* Hook.on(Events.Closing, () => Effect.promise(() => this.#closeStack()));\n yield* Hook.on(Events.WipingStorage, () =>\n Effect.promise(() => this.#sql.runPromise(SqliteStorage.wipeSqliteStorage)),\n );\n }).pipe(Effect.provideService(Hook.Controller, this.#controller), Scope.provide(this.#busScope)),\n );\n }\n\n get isOpen(): boolean {\n return this.#stack !== undefined;\n }\n\n get config(): Config {\n return this.#config;\n }\n\n /**\n * The in-process rpc surface over the services registered with the stack's router; scoped to the\n * caller, who closes it when done.\n */\n get rpc(): Effect.Effect<ClientServicesRpc, never, Scope.Scope> {\n return makeClientServicesRpcFromRouter.pipe(\n Effect.provideService(RpcRouter.RpcRouter, this.#get(RpcRouter.RpcRouter)),\n );\n }\n\n get stack(): LayerStack.LayerStack {\n return this.#stack ?? failUndefined();\n }\n\n /** The router every service registered itself with; served to a client without a wire hop. */\n get router(): RpcRouter.Service {\n return this.#get(RpcRouter.RpcRouter);\n }\n\n get initialized(): Trigger {\n return this.#get(Readiness.StackReadinessService).initialized;\n }\n\n get identityManager(): IdentityContract.Manager {\n return this.#get(IdentityContract.ManagerService);\n }\n\n get spaceManager(): SpaceManager {\n return this.#get(SpaceManagerService);\n }\n\n get metadataStore(): IMetadataStore {\n return this.#get(IMetadataStoreService);\n }\n\n get recoveryManager(): EdgeIdentityRecoveryManager {\n return this.#get(EdgeIdentityRecoveryManagerService);\n }\n\n get keyring(): KeyringApi {\n return this.#get(KeyringApiService);\n }\n\n get hypercoreStore(): HypercoreStore<any> {\n return this.#get(HypercoreStoreService);\n }\n\n get echoHost(): EchoHost {\n return this.#get(EchoHostService);\n }\n\n get invitations(): InvitationsHandler {\n return this.#get(InvitationsHandlerService);\n }\n\n get invitationsManager(): InvitationsContract.Manager {\n return this.#get(InvitationsContract.ManagerService);\n }\n\n get networkManager(): SwarmNetworkManager {\n return this.#get(SwarmNetworkManagerService);\n }\n\n get signalManager(): SignalManager {\n return this.#get(SignalManagerService);\n }\n\n get dataSpaceManager(): SpacesContract.Manager | undefined {\n return this.#services && EffectContext.getUnsafe(this.#services, SpacesContract.ManagerService);\n }\n\n get edgeAgentManager(): EdgeAgentManager | undefined {\n return this.#services && EffectContext.getUnsafe(this.#services, EdgeAgentManagerService);\n }\n\n async open(ctx: Context = new Context()): Promise<void> {\n if (this.#stackScope) {\n return;\n }\n this.#ctx = ctx;\n const scope = Effect.runSync(Scope.make());\n this.#stackScope = scope;\n try {\n // Building the layer also builds its eager specs, so the rpc registrations are in place\n // before the lifecycle events below run.\n const stackContext = await EffectEx.runPromise(\n Layer.build(\n layerClientServices({\n runtimeProps: {\n invitationConnectionDefaultProps: { teleport: { controlHeartbeatInterval: 200 } },\n ...this.#options.runtimeProps,\n },\n signalManager: this.#options.signalManager,\n transportFactory: this.#options.transportFactory ?? MemoryTransportFactory,\n }).pipe(\n Layer.provide(RuntimeProvider.toLayer(this.#sql.contextEffect)),\n Layer.provide(Layer.succeed(ConfigService, this.#config)),\n Layer.provide(Layer.succeed(Hook.Controller, this.#controller)),\n ),\n ).pipe(Scope.provide(scope)),\n );\n this.#stack = EffectContext.get(stackContext, LayerStack.Service);\n this.#services = await EffectEx.runPromise(\n ServiceResolver.resolveAll(EXPOSED_TAGS, {}).pipe(\n Effect.provide(stackContext),\n Effect.orDie,\n Scope.provide(scope),\n ),\n );\n await EffectEx.runPromise(\n EffectEx.withContext(ctx)(openChain).pipe(Effect.provideService(Hook.Controller, this.#controller)),\n );\n } catch (err) {\n await this.#closeStack();\n throw err;\n }\n }\n\n async close(_ctx?: Context): Promise<void> {\n await this.#closeStack();\n }\n\n /**\n * Runs an effect against the SQLite runtime backing this context's storage. The runtime outlives\n * the stack, so a test can still inspect what a reset left behind.\n */\n async runSql<A, E>(effect: Effect.Effect<A, E, SqlClient.SqlClient>): Promise<A> {\n return this.#sql.runPromise(effect);\n }\n\n /** Resets through the in-process RPC bridge, as a client does. */\n async reset(): Promise<void> {\n await EffectEx.runPromise(\n Effect.scoped(\n Effect.gen({ self: this }, function* () {\n const rpc = yield* this.rpc;\n yield* rpc['SystemService.reset']();\n }),\n ),\n );\n }\n\n /** Disposes the SQLite runtime too; call once the context is no longer needed. */\n async destroy(): Promise<void> {\n await this.#closeStack();\n await EffectEx.runPromise(Scope.close(this.#busScope, Exit.void));\n await this.#sql.dispose();\n }\n\n // Shared by close and destroy so a caller that wraps `close` cannot recurse through `destroy`.\n async #closeStack(): Promise<void> {\n const scope = this.#stackScope;\n if (!scope) {\n return;\n }\n this.#stackScope = undefined;\n // Closed before the services are dropped: teardown stops the schedulers that still reach for\n // them, and clearing first leaves those callbacks resolving against nothing.\n await EffectEx.runPromise(Scope.close(scope, Exit.void));\n this.#stack = undefined;\n this.#services = undefined;\n }\n\n async createIdentity(params: CreateIdentityOptions = {}, ctx?: Context): Promise<Identity> {\n return this.#get(IdentityContract.LifecycleService).createIdentity(params, ctx ?? this.#ctx);\n }\n\n // The stack proves nothing about which tags are built, so the lookup is unsafe by construction:\n // asking before `open` throws here rather than returning undefined into a test.\n #get<Self, Service>(tag: EffectContext.Key<Self, Service>): Service {\n return EffectContext.getUnsafe(this.#services ?? failUndefined(), tag);\n }\n}\n\nexport const createServiceHost = (config: Config, signalManagerContext: MemorySignalManagerContext): ServiceContext =>\n new ServiceContext({ config, signalManager: new MemorySignalManager(signalManagerContext) });\n\nexport const createServiceContext = async ({\n signalManagerFactory = async () => new MemorySignalManager(new MemorySignalManagerContext()),\n runtimeProps,\n}: {\n signalManagerFactory?: () => Promise<SignalManager>;\n runtimeProps?: ServiceContextRuntimeProps;\n} = {}): Promise<ServiceContext> => {\n const context = new ServiceContext({ signalManager: await signalManagerFactory(), runtimeProps });\n // Tests close the context; the SQLite runtime goes with it so layer finalizers do not leak across tests.\n const close = context.close.bind(context);\n context.close = async (ctx) => {\n await close(ctx);\n await context.destroy();\n };\n return context;\n};\n\nexport const createPeers = async (\n numPeers: number,\n signalManagerFactory?: () => Promise<SignalManager>,\n runtimeProps?: ServiceContextRuntimeProps,\n) => {\n if (!signalManagerFactory) {\n const signalContext = new MemorySignalManagerContext();\n signalManagerFactory = async () => new MemorySignalManager(signalContext);\n }\n return await Promise.all(\n Array.from(Array(numPeers)).map(async () => {\n const peer = await createServiceContext({ signalManagerFactory, runtimeProps });\n await peer.open(new Context());\n return peer;\n }),\n );\n};\n\nexport const createIdentity = async (peer: ServiceContext) => {\n await peer.createIdentity();\n return peer;\n};\n\nexport class TestBuilder {\n public readonly signalContext = new MemorySignalManagerContext();\n private readonly _ctx = new Context();\n\n createPeer(peerOptions?: TestPeerOpts): TestPeer {\n const peer = new TestPeer(this.signalContext, peerOptions);\n this._ctx.onDispose(async () => peer.destroy());\n return peer;\n }\n\n async destroy(): Promise<void> {\n await this._ctx.dispose();\n }\n}\n\nexport type TestPeerOpts = {\n dataStore?: StorageType;\n dataSpaceProps?: DataSpaceManagerRuntimeProps;\n edgeHttpClient?: EdgeHttpClient;\n};\n\nexport type TestPeerProps = {\n hypercoreStore?: HypercoreStore<any>;\n metadataStore?: SqliteMetadataStore;\n keyring?: SqliteKeyring;\n networkManager?: SwarmNetworkManager;\n spaceManager?: SpaceManager;\n dataSpaceManager?: SpacesContract.Manager;\n signingContext?: SigningContext;\n echoHost?: EchoHost;\n meshEchoReplicator?: MeshEchoReplicator;\n invitationsManager?: InvitationsContract.Manager;\n};\n\nexport class TestPeer {\n private _props: TestPeerProps = {};\n private readonly _runtime = ManagedRuntime.make(\n sqliteLayerMemory.pipe(Layer.provideMerge(Reactivity.layer)).pipe(Layer.orDie),\n );\n private readonly _feedStorage = new SqliteStorage.SqliteStorage({ runtime: this._runtime.contextEffect });\n\n constructor(\n private readonly _signalContext: MemorySignalManagerContext,\n private readonly _opts: TestPeerOpts = { dataStore: StorageType.RAM },\n ) {}\n\n get props() {\n return this._props;\n }\n\n get keyring() {\n return (this._props.keyring ??= new SqliteKeyring({ runtime: this._runtime.contextEffect }));\n }\n\n get hypercoreStore() {\n return (this._props.hypercoreStore ??= new HypercoreStore({\n factory: new HypercoreFactory({\n root: this._feedStorage.createDirectory('feeds'),\n signer: this.keyring,\n hypercore: {\n valueEncoding,\n },\n }),\n }));\n }\n\n get metadataStore() {\n return (this._props.metadataStore ??= new SqliteMetadataStore({ runtime: this._runtime.contextEffect }));\n }\n\n get networkManager() {\n return (this._props.networkManager ??= new SwarmNetworkManager({\n signalManager: new MemorySignalManager(this._signalContext),\n transportFactory: MemoryTransportFactory,\n }));\n }\n\n get spaceManager() {\n return (this._props.spaceManager ??= new SpaceManager({\n hypercoreStore: this.hypercoreStore,\n networkManager: this.networkManager,\n metadataStore: this.metadataStore,\n }));\n }\n\n get identity() {\n return this._props.signingContext ?? failUndefined();\n }\n\n get echoHost() {\n return (this._props.echoHost ??= new EchoHost({\n runtime: this._runtime.contextEffect,\n }));\n }\n\n get meshEchoReplicator() {\n return (this._props.meshEchoReplicator ??= new MeshEchoReplicator());\n }\n\n get dataSpaceManager(): SpacesContract.Manager {\n return (this._props.dataSpaceManager ??= new DataSpaceManager({\n spaceManager: this.spaceManager,\n metadataStore: this.metadataStore,\n keyring: this.keyring,\n signingContextProvider: () => this.identity,\n hypercoreStore: this.hypercoreStore,\n echoHost: this.echoHost,\n invitationsManager: this.invitationsManager,\n edgeConnection: undefined,\n meshReplicator: this.meshEchoReplicator,\n echoEdgeReplicator: undefined,\n edgeHttpClient: this._opts.edgeHttpClient,\n runtimeProps: this._opts.dataSpaceProps,\n }));\n }\n\n get invitationsManager() {\n if (!this._props.invitationsManager) {\n const manager = new InvitationsManager(new InvitationsHandler(this.networkManager), this.metadataStore);\n manager.setInvitationHandlerFactory((invitation) => {\n if (invitation.kind === Invitation_Kind.SPACE) {\n return new SpaceInvitationProtocol(\n this.dataSpaceManager,\n this.identity,\n this.keyring,\n toPublicKey(invitation.spaceKey),\n );\n } else {\n throw new Error('not implemented');\n }\n });\n this._props.invitationsManager = manager;\n }\n return this._props.invitationsManager;\n }\n\n async createIdentity(): Promise<void> {\n await this.migrate();\n this._props.signingContext ??= await createSigningContext(this.keyring);\n this.networkManager.setPeerInfo(\n create(PeerSchema, {\n identityKey: this._props.signingContext.identityKey.toHex(),\n peerKey: this._props.signingContext.deviceKey.toHex(),\n }),\n );\n }\n\n async migrate(): Promise<void> {\n await RuntimeProvider.runPromise(this._runtime.contextEffect)(\n Effect.all([this.metadataStore.migrate, this.keyring.migrate, this._feedStorage.migrate]),\n );\n }\n\n async destroy(): Promise<void> {\n await this._runtime.dispose();\n }\n}\n\nexport const createSigningContext = async (keyring: SqliteKeyring): Promise<SigningContext> => {\n const identityKey = await keyring.createKey();\n const deviceKey = await keyring.createKey();\n\n return {\n identityKey,\n deviceKey,\n credentialSigner: createCredentialSignerWithChain(\n keyring,\n create(ChainSchema, {\n credential: await new CredentialGenerator(keyring, identityKey, deviceKey).createDeviceAuthorization(deviceKey),\n }),\n deviceKey,\n ),\n recordCredential: async () => {}, // No-op.\n getProfile: () => undefined,\n };\n};\n","//\n// Copyright 2023 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport { type AuthenticatingInvitation, type CancellableInvitation, InvitationEncoder } from '@dxos/client-protocol';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { toPublicKey } from '@dxos/protocols/buf';\nimport {\n Invitation,\n Invitation_AuthMethod,\n Invitation_Kind,\n Invitation_State,\n} from '@dxos/protocols/buf/dxos/client/invitation_pb';\nimport { type DeviceProfileDocument } from '@dxos/protocols/buf/dxos/halo/credentials_pb';\n\nimport { ServiceContext } from './test-builder.ts';\n\n/**\n * Strip secrets from invitation before giving it to the peer.\n */\nexport const sanitizeInvitation = (invitation: Invitation): Invitation => {\n return InvitationEncoder.decode(InvitationEncoder.encode(invitation));\n};\n\nexport type InvitationHost = {\n share(options?: Partial<Invitation>): CancellableInvitation;\n};\n\nexport type InvitationGuest = {\n join(invitation: Invitation | string, deviceProfile?: DeviceProfileDocument): AuthenticatingInvitation;\n};\n\nexport type PerformInvitationCallbacks<T> = {\n onConnecting?: (value: T) => boolean | void;\n onConnected?: (value: T) => boolean | void;\n onReady?: (value: T) => boolean | void;\n onAuthenticating?: (value: T) => boolean | void;\n onSuccess?: (value: T) => boolean | void;\n onCancelled?: (value: T) => boolean | void;\n onTimeout?: (value: T) => boolean | void;\n onError?: (value: T) => boolean | void;\n};\n\nexport type PerformInvitationProps = {\n host: ServiceContext | InvitationHost;\n guest: ServiceContext | InvitationGuest;\n guestDeviceProfile?: DeviceProfileDocument;\n options?: Partial<Invitation>;\n hooks?: {\n host?: PerformInvitationCallbacks<CancellableInvitation>;\n guest?: PerformInvitationCallbacks<AuthenticatingInvitation>;\n };\n codeInputDelay?: number;\n};\n\nexport type Result = { invitation?: Invitation; error?: Error };\n\n// TODO(burdon): Make async.\n// TODO(burdon): Rename startInvitation.\n/**\n *\n */\nexport const performInvitation = ({\n host,\n guest,\n guestDeviceProfile,\n options,\n hooks,\n codeInputDelay,\n}: PerformInvitationProps): [Promise<Result>, Promise<Result>] => {\n let guestError = false;\n let guestConnected = false;\n let wereConnected = false;\n const hostComplete = new Trigger<Result>();\n const guestComplete = new Trigger<Result>();\n const authCode = new Trigger<string>();\n\n void createInvitation(host, options).then((hostObservable) => {\n hostObservable.subscribe(\n async (hostInvitation: Invitation) => {\n switch (hostInvitation.state) {\n case Invitation_State.CONNECTING: {\n if (guestConnected) {\n if (wereConnected) {\n hostComplete.wake({ invitation: hostInvitation });\n }\n break;\n }\n\n guestConnected = true;\n if (hooks?.host?.onConnecting?.(hostObservable)) {\n break;\n }\n\n const guestObservable = acceptInvitation(guest, hostInvitation, guestDeviceProfile);\n guestObservable.subscribe(\n async (guestInvitation: Invitation) => {\n switch (guestInvitation.state) {\n case Invitation_State.CONNECTING: {\n if (hooks?.guest?.onConnecting?.(guestObservable)) {\n break;\n }\n const guestSwarmKey = toPublicKey(guestInvitation.swarmKey);\n invariant(guestSwarmKey && toPublicKey(hostInvitation.swarmKey)?.equals(guestSwarmKey));\n break;\n }\n\n case Invitation_State.CONNECTED: {\n hooks?.guest?.onConnected?.(guestObservable);\n break;\n }\n\n case Invitation_State.READY_FOR_AUTHENTICATION: {\n if (hooks?.guest?.onReady?.(guestObservable)) {\n break;\n }\n const code = await authCode.wait();\n if (codeInputDelay == null) {\n await guestObservable.authenticate(code);\n } else {\n setTimeout(async () => {\n if (!guestError) {\n await guestObservable.authenticate(code);\n }\n }, codeInputDelay);\n }\n break;\n }\n\n case Invitation_State.AUTHENTICATING: {\n hooks?.guest?.onAuthenticating?.(guestObservable);\n break;\n }\n\n case Invitation_State.SUCCESS: {\n if (hooks?.guest?.onSuccess?.(guestObservable)) {\n break;\n }\n guestComplete.wake({ invitation: guestInvitation });\n break;\n }\n\n case Invitation_State.CANCELLED: {\n if (hooks?.guest?.onCancelled?.(guestObservable)) {\n break;\n }\n guestComplete.wake({ invitation: guestInvitation });\n break;\n }\n\n case Invitation_State.TIMEOUT: {\n if (hooks?.guest?.onTimeout?.(guestObservable)) {\n return;\n }\n guestComplete.wake({ invitation: guestInvitation });\n }\n }\n },\n (error: Error) => {\n guestError = true;\n if (hooks?.guest?.onError?.(guestObservable)) {\n return;\n }\n guestComplete.wake({ error });\n },\n );\n break;\n }\n\n case Invitation_State.CONNECTED: {\n wereConnected = true;\n hooks?.host?.onConnected?.(hostObservable);\n break;\n }\n\n case Invitation_State.READY_FOR_AUTHENTICATION: {\n if (hooks?.host?.onReady?.(hostObservable)) {\n break;\n }\n if (hostInvitation.authCode) {\n authCode.wake(hostInvitation.authCode);\n }\n break;\n }\n\n case Invitation_State.AUTHENTICATING: {\n hooks?.host?.onAuthenticating?.(hostObservable);\n break;\n }\n\n case Invitation_State.SUCCESS: {\n if (hooks?.host?.onSuccess?.(hostObservable)) {\n break;\n }\n hostComplete.wake({ invitation: hostInvitation });\n break;\n }\n\n case Invitation_State.CANCELLED: {\n if (hooks?.host?.onCancelled?.(hostObservable)) {\n break;\n }\n hostComplete.wake({ invitation: hostInvitation });\n break;\n }\n\n case Invitation_State.TIMEOUT: {\n if (hooks?.host?.onTimeout?.(hostObservable)) {\n break;\n }\n hostComplete.wake({ invitation: hostInvitation });\n break;\n }\n }\n },\n (error: Error) => {\n if (hooks?.host?.onError?.(hostObservable)) {\n return;\n }\n hostComplete.wake({ error });\n },\n );\n });\n\n return [hostComplete.wait(), guestComplete.wait()];\n};\n\nexport const createInvitation = async (\n host: ServiceContext | InvitationHost,\n options?: Partial<Invitation>,\n): Promise<CancellableInvitation> => {\n options ??= {\n authMethod: Invitation_AuthMethod.NONE,\n ...(options ?? {}),\n };\n\n if (host instanceof ServiceContext) {\n return host.invitationsManager.createInvitation(new Context(), {\n kind: Invitation_Kind.SPACE,\n ...options,\n });\n }\n\n return host.share(options);\n};\n\nexport const acceptInvitation = (\n guest: ServiceContext | InvitationGuest,\n invitation: Invitation,\n guestDeviceProfile?: DeviceProfileDocument,\n): AuthenticatingInvitation => {\n invitation = sanitizeInvitation(invitation);\n\n if (guest instanceof ServiceContext) {\n return guest.invitationsManager.acceptInvitation(new Context(), {\n invitation,\n deviceProfile: guestDeviceProfile,\n });\n }\n\n return guest.join(invitation, guestDeviceProfile);\n};\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport { create } from '@bufbuild/protobuf';\n\nimport { type Context } from '@dxos/context';\nimport { createDidFromIdentityKey } from '@dxos/credentials';\nimport { type MessageListener, type ReconnectListener } from '@dxos/edge-client';\nimport { EdgeCallFailedError, EdgeService, type InboxNotice } from '@dxos/protocols';\nimport { MessageSchema } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\n\nimport {\n type InboxEdgeClient,\n type InboxIdentitySource,\n type InboxPushSource,\n type InboxRelay,\n} from '../identity/index.ts';\n\ntype Device = { identity: InboxIdentitySource; listener: MessageListener };\n\n/**\n * In-memory stand-in for the EDGE inbox: one pending list per recipient DID, with every connected\n * device of the recipient rung on each change, as the router's push frame would.\n * Share one between clients so they can message each other without EDGE.\n */\nexport class MemoryEdgeInbox implements InboxRelay {\n readonly notices = new Map<string, InboxNotice[]>();\n /** DIDs refused as EDGE refuses an identity not linked to an account. */\n readonly accountless = new Set<string>();\n readonly #devices = new Set<Device>();\n #nextId = 0;\n #listCalls = 0;\n\n /** `listInbox` calls so far, refused ones included, so a test can wait for a pull without sleeping. */\n get listCalls(): number {\n return this.#listCalls;\n }\n\n /** Stores a payload as EDGE would after authenticating `senderDid`. */\n put(recipientDid: string, senderDid: string, payload: string): string {\n const id = `n${++this.#nextId}`;\n const now = Date.now();\n this.#list(recipientDid).push({ id, senderDid, sentAt: now, expiresAt: now + 1_000_000, payload });\n void this.#ring(recipientDid);\n return id;\n }\n\n connect(identity: InboxIdentitySource): { edgeClient: InboxEdgeClient; pushSource: InboxPushSource } {\n // Resolved per call, since a client's identity is created after its services.\n const authenticate = async (): Promise<string> => {\n const identityKey = identity.identity?.identityKey;\n if (!identityKey) {\n throw new Error('Not authenticated: no identity.');\n }\n const did = await createDidFromIdentityKey(identityKey);\n if (this.accountless.has(did)) {\n throw new EdgeCallFailedError({\n message: 'Identity is not associated with an account.',\n data: { type: 'identity_not_associated_with_account' },\n });\n }\n return did;\n };\n\n const edgeClient: InboxEdgeClient = {\n sendInboxMessage: async (_ctx: Context, recipientDid: string, payload: string) => ({\n id: this.put(recipientDid, await authenticate(), payload),\n }),\n listInbox: async () => {\n this.#listCalls++;\n return { notices: [...this.#list(await authenticate())] };\n },\n ackInbox: async (_ctx: Context, ids: readonly string[]) => {\n const did = await authenticate();\n this.notices.set(\n did,\n this.#list(did).filter((notice) => !ids.includes(notice.id)),\n );\n await this.#ring(did);\n },\n };\n const pushSource: InboxPushSource = {\n onMessage: (listener: MessageListener) => {\n const device = { identity, listener };\n this.#devices.add(device);\n return () => this.#devices.delete(device);\n },\n onReconnected: (_listener: ReconnectListener) => () => {},\n };\n return { edgeClient, pushSource };\n }\n\n #list(did: string): InboxNotice[] {\n const list = this.notices.get(did) ?? [];\n this.notices.set(did, list);\n return list;\n }\n\n async #ring(did: string): Promise<void> {\n const frame = create(MessageSchema, { serviceId: EdgeService.INBOX });\n for (const { identity, listener } of [...this.#devices]) {\n const identityKey = identity.identity?.identityKey;\n if (identityKey && (await createDidFromIdentityKey(identityKey)) === did) {\n listener(frame);\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"testing.mjs","names":["TestBuilder","__dxlog_file","__dxlog_file","__dxlog_file","Events.Opening","Events.StackOpened","Readiness.StackReadinessService","IdentityContract.ManagerService","IdentityContract.LifecycleService","InvitationsContract.ManagerService","SpacesContract.ManagerService","sqliteLayerMemory","Events.Closing","Events.WipingStorage","SqliteStorage.wipeSqliteStorage","SqliteStorage.SqliteStorage"],"sources":["../../src/internal/pipeline/testing/test-feed-builder.ts","../../src/internal/space/testing/change-metadata.ts","../../src/internal/space/testing/test-agent-builder.ts","../../src/internal/testing/credential-utils.ts","../../src/internal/testing/test-builder.ts","../../src/internal/testing/invitation-utils.ts","../../src/internal/testing/memory-edge-inbox.ts"],"sourcesContent":["//\n// Copyright 2022 DXOS.org\n//\n\nimport { TestBuilder } from '@dxos/feed-store/testing';\nimport type { FeedMessage } from '@dxos/protocols/buf/dxos/echo/feed_pb';\n\nimport { valueEncoding } from '../codec.ts';\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 2023 DXOS.org\n//\n\nimport { log } from '@dxos/log';\nimport { EchoMetadataSchema } from '@dxos/protocols/buf/dxos/echo/metadata_pb';\nimport type { Storage } from '@dxos/random-access-storage';\n\nimport { MetadataStore } from '../../metadata/index.ts';\n\n/**\n * This function will change the storage version in the metadata.\n * This will break your storage and make it unusable.\n * Use this only for testing purposes.\n */\nexport const changeStorageVersionInMetadata = async (storage: Storage, version: number) => {\n log('Changing storage version in metadata. USE ONLY FOR TESTING.');\n const metadata = new MetadataStore(storage.createDirectory('metadata'));\n await metadata.load();\n const echoMetadata = metadata.metadata;\n echoMetadata.version = version;\n const file = metadata._directory.getOrCreateFile('EchoMetadata');\n await metadata._writeFile(file, EchoMetadataSchema, echoMetadata);\n await metadata._directory.flush();\n};\n","//\n// Copyright 2022 DXOS.org\n//\n\nimport { create } from '@bufbuild/protobuf';\n\nimport { Context } from '@dxos/context';\nimport { CredentialGenerator, credentialPayload } from '@dxos/credentials';\nimport { type HypercoreStore } from '@dxos/feed-store';\nimport { type Keyring } from '@dxos/keyring';\nimport { PublicKey } from '@dxos/keys';\nimport { MemorySignalManager, MemorySignalManagerContext } from '@dxos/messaging';\nimport { MemoryTransportFactory, SwarmNetworkManager } from '@dxos/network-manager';\nimport { fromPublicKey } from '@dxos/protocols/buf';\nimport { type FeedMessage } from '@dxos/protocols/buf/dxos/echo/feed_pb';\nimport { type SpaceMetadata, SpaceMetadataSchema } from '@dxos/protocols/buf/dxos/echo/metadata_pb';\nimport { PeerSchema } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\nimport { AdmittedFeed_Designation } from '@dxos/protocols/buf/dxos/halo/credentials_pb';\nimport { type Storage, StorageType, createStorage } from '@dxos/random-access-storage';\nimport { Gossip, Presence } from '@dxos/teleport-extension-gossip';\nimport { ComplexMap } from '@dxos/util';\n\nimport { MetadataStore } from '../../metadata/index.ts';\nimport { TestFeedBuilder } from '../../pipeline/testing/index.ts';\nimport { MOCK_AUTH_PROVIDER, MOCK_AUTH_VERIFIER, type Space, SpaceManager, SpaceProtocol } from '../index.ts';\n\nexport type NetworkManagerProvider = () => SwarmNetworkManager;\n\nexport const MemoryNetworkManagerProvider =\n (signalContext: MemorySignalManagerContext): NetworkManagerProvider =>\n () =>\n new SwarmNetworkManager({\n signalManager: new MemorySignalManager(signalContext),\n transportFactory: MemoryTransportFactory,\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): TestAgent | undefined {\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 hypercoreStore: HypercoreStore<FeedMessage>;\n\n private _metadataStore?: MetadataStore;\n get metadataStore() {\n return (this._metadataStore ??= new MetadataStore(this.storage.createDirectory('metadata')));\n }\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.hypercoreStore = this._feedBuilder.createHypercoreStore();\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): Space | undefined {\n return this._spaces.get(spaceKey);\n }\n\n private _networkManager?: SwarmNetworkManager;\n get networkManager() {\n if (this._networkManager) {\n return this._networkManager;\n }\n\n this._networkManager = this._networkManagerProvider();\n this._networkManager.setPeerInfo(\n create(PeerSchema, { peerKey: this.deviceKey.toHex(), identityKey: this.identityKey.toHex() }),\n );\n\n return this._networkManager;\n }\n\n private _spaceManager?: SpaceManager;\n get spaceManager() {\n return (this._spaceManager ??= new SpaceManager({\n hypercoreStore: this.hypercoreStore,\n networkManager: this.networkManager,\n metadataStore: this.metadataStore,\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.hypercoreStore.openHypercore(genesisKey, { writable: true });\n const dataFeed = await this.hypercoreStore.openHypercore(dataKey ?? (await this.keyring.createKey()), {\n writable: true,\n sparse: true,\n });\n\n const metadata: SpaceMetadata = create(SpaceMetadataSchema, {\n key: fromPublicKey(spaceKey),\n genesisFeedKey: fromPublicKey(genesisKey),\n controlFeedKey: fromPublicKey(controlFeed.key),\n dataFeedKey: fromPublicKey(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 identityKey: this.identityKey,\n peerKey: this.deviceKey,\n credentialProvider: MOCK_AUTH_PROVIDER,\n credentialAuthenticator: MOCK_AUTH_VERIFIER,\n },\n memberKey: identityKey,\n onAuthorizedConnection: (session) => {\n session.addExtension(\n 'dxos.mesh.teleport.gossip',\n this.createGossip().createExtension({ remotePeerId: session.remotePeerId }),\n );\n },\n onDelegatedInvitationStatusChange: async () => {},\n onMemberRolesChanged: async () => {},\n });\n await space.setControlFeed(controlFeed);\n await space.setDataFeed(dataFeed);\n\n await space.open(new Context());\n\n this._spaces.set(spaceKey, space);\n return space;\n }\n\n createSpaceProtocol(topic: PublicKey, gossip?: Gossip): SpaceProtocol {\n return new SpaceProtocol({\n topic,\n swarmIdentity: {\n identityKey: this.identityKey,\n peerKey: this.deviceKey,\n credentialProvider: MOCK_AUTH_PROVIDER,\n credentialAuthenticator: MOCK_AUTH_VERIFIER,\n },\n networkManager: this.networkManager,\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(): Gossip {\n return new Gossip({\n localPeerId: this.deviceKey,\n });\n }\n\n createPresence(gossip?: Gossip): Presence {\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): Promise<void> {\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(credentialPayload(credential));\n }\n }\n}\n","//\n// Copyright 2023 DXOS.org\n//\n\nimport { create } from '@bufbuild/protobuf';\n\nimport { createCredential } from '@dxos/credentials';\nimport { type Signer } from '@dxos/crypto';\nimport { PublicKey } from '@dxos/keys';\nimport { fromPublicKey } from '@dxos/protocols/buf';\nimport { AuthorizedDeviceSchema, type Credential } from '@dxos/protocols/buf/dxos/halo/credentials_pb';\n\nexport const createMockCredential = async ({\n signer,\n issuer,\n}: {\n signer: Signer;\n issuer: PublicKey;\n}): Promise<Credential> =>\n createCredential({\n signer,\n issuer,\n subject: new PublicKey(Buffer.from('test')),\n // The assertion must be a real credential type: the services carry credentials as buf messages,\n // whose registry resolves only the types the schema declares.\n assertion: create(AuthorizedDeviceSchema, { identityKey: fromPublicKey(issuer), deviceKey: fromPublicKey(issuer) }),\n });\n","//\n// Copyright 2022 DXOS.org\n//\n\nimport { create } from '@bufbuild/protobuf';\nimport * as EffectContext from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport * as Exit from 'effect/Exit';\nimport * as Layer from 'effect/Layer';\nimport * as ManagedRuntime from 'effect/ManagedRuntime';\nimport * as Reactivity from 'effect/reactivity/Reactivity';\nimport * as Scope from 'effect/Scope';\nimport type * as SqlClient from 'effect/sql/SqlClient';\n\nimport { type Trigger } from '@dxos/async';\nimport { type ClientServicesRpc, makeClientServicesRpcFromRouter } from '@dxos/client-protocol';\nimport { LayerStack } from '@dxos/compute-runtime';\nimport * as ServiceResolver from '@dxos/compute/ServiceResolver';\nimport { Config, ConfigService } from '@dxos/config';\nimport { Context } from '@dxos/context';\nimport { CredentialGenerator, createCredentialSignerWithChain } from '@dxos/credentials';\nimport { failUndefined } from '@dxos/debug';\nimport { EchoHost, EchoHostService, MeshEchoReplicator } from '@dxos/echo-host';\nimport { type EdgeHttpClient } from '@dxos/edge-client';\nimport * as EffectEx from '@dxos/effect/EffectEx';\nimport * as Hook from '@dxos/effect/Hook';\nimport * as RuntimeProvider from '@dxos/effect/RuntimeProvider';\nimport { HypercoreFactory, HypercoreStore, HypercoreStoreService } from '@dxos/feed-store';\nimport { type KeyringApi, KeyringApiService, SqliteKeyring } from '@dxos/keyring';\nimport {\n MemorySignalManager,\n MemorySignalManagerContext,\n type SignalManager,\n SignalManagerService,\n} from '@dxos/messaging';\nimport {\n MemoryTransportFactory,\n SwarmNetworkManager,\n SwarmNetworkManagerService,\n type TransportFactory,\n} from '@dxos/network-manager';\nimport { toPublicKey } from '@dxos/protocols/buf';\nimport { Invitation_Kind } from '@dxos/protocols/buf/dxos/client/invitation_pb';\nimport { PeerSchema } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\nimport { ChainSchema } from '@dxos/protocols/buf/dxos/halo/credentials_pb';\nimport { StorageType } from '@dxos/random-access-storage';\nimport { RpcRouter } from '@dxos/rpc';\nimport { layerMemory as sqliteLayerMemory } from '@dxos/sql-sqlite/Platform';\n\nimport * as IdentityContract from '../../contracts/identity.ts';\nimport * as InvitationsContract from '../../contracts/invitations.ts';\nimport * as SpacesContract from '../../contracts/spaces.ts';\nimport * as Events from '../../Events.ts';\nimport { type Identity } from '../../Identity.ts';\nimport * as Readiness from '../../Readiness.ts';\nimport * as SqliteStorage from '../../SqliteStorage.ts';\nimport { type EdgeAgentManager, EdgeAgentManagerService } from '../agents/index.ts';\nimport {\n type EdgeIdentityRecoveryManager,\n EdgeIdentityRecoveryManagerService,\n} from '../identity/identity-recovery-manager.ts';\nimport { type CreateIdentityOptions } from '../identity/index.ts';\nimport {\n InvitationsHandler,\n InvitationsHandlerService,\n InvitationsManager,\n SpaceInvitationProtocol,\n} from '../invitations/index.ts';\nimport { type IMetadataStore, IMetadataStoreService, SqliteMetadataStore } from '../metadata/index.ts';\nimport { valueEncoding } from '../pipeline/index.ts';\nimport { type ServiceContextRuntimeProps, layerClientServices } from '../services/index.ts';\nimport { SpaceManager, SpaceManagerService } from '../space/index.ts';\nimport { DataSpaceManager, type DataSpaceManagerRuntimeProps, type SigningContext } from '../spaces/index.ts';\n\n/** The open event chain; `StackOpened` resolves once every handler the cascade triggered has run. */\nconst openChain = Effect.gen(function* () {\n yield* Hook.emit(Events.Opening, undefined);\n yield* Hook.emit(Events.StackOpened, undefined);\n});\n\n/**\n * Options for a test {@link ServiceContext}.\n */\nexport type ServiceContextOptions = {\n config?: Config;\n signalManager?: SignalManager;\n transportFactory?: TransportFactory;\n runtimeProps?: ServiceContextRuntimeProps;\n};\n\n/**\n * The tags this test surface hands out synchronously. The stack resolves lazily, so they are\n * materialised together when it opens rather than on first access.\n */\nconst EXPOSED_TAGS = [\n RpcRouter.RpcRouter,\n Readiness.StackReadinessService,\n IdentityContract.ManagerService,\n IdentityContract.LifecycleService,\n SpaceManagerService,\n IMetadataStoreService,\n EdgeIdentityRecoveryManagerService,\n KeyringApiService,\n HypercoreStoreService,\n EchoHostService,\n InvitationsHandlerService,\n InvitationsContract.ManagerService,\n SwarmNetworkManagerService,\n SignalManagerService,\n SpacesContract.ManagerService,\n EdgeAgentManagerService,\n] as const;\n\n/**\n * A client services runtime for tests: the stack built from {@link layerClientServices} over an\n * in-memory SQLite runtime, plus the system service, with the components exposed as properties\n * while open.\n */\nexport class ServiceContext {\n readonly #options: ServiceContextOptions;\n readonly #config: Config;\n readonly #sql = ManagedRuntime.make(sqliteLayerMemory.pipe(Layer.provideMerge(Reactivity.layer)).pipe(Layer.orDie));\n readonly #controller = Hook.makeController();\n /** Holds the reset handlers; closed by `destroy`. */\n readonly #busScope = Effect.runSync(Scope.make());\n /** Scope of the built stack; closed by `#closeStack`. */\n #stackScope?: Scope.Closeable;\n #stack?: LayerStack.LayerStack;\n /** The tags this test surface exposes, resolved once the stack is open so the getters stay sync. */\n #services?: EffectContext.Context<never>;\n #ctx?: Context;\n\n constructor(options: ServiceContextOptions = {}) {\n this.#options = options;\n this.#config = options.config ?? new Config();\n Effect.runSync(\n Effect.gen({ self: this }, function* () {\n yield* Hook.on(Events.Closing, () => Effect.promise(() => this.#closeStack()));\n yield* Hook.on(Events.WipingStorage, () =>\n Effect.promise(() => this.#sql.runPromise(SqliteStorage.wipeSqliteStorage)),\n );\n }).pipe(Effect.provideService(Hook.Controller, this.#controller), Scope.provide(this.#busScope)),\n );\n }\n\n get isOpen(): boolean {\n return this.#stack !== undefined;\n }\n\n get config(): Config {\n return this.#config;\n }\n\n /**\n * The in-process rpc surface over the services registered with the stack's router; scoped to the\n * caller, who closes it when done.\n */\n get rpc(): Effect.Effect<ClientServicesRpc, never, Scope.Scope> {\n return makeClientServicesRpcFromRouter.pipe(\n Effect.provideService(RpcRouter.RpcRouter, this.#get(RpcRouter.RpcRouter)),\n );\n }\n\n get stack(): LayerStack.LayerStack {\n return this.#stack ?? failUndefined();\n }\n\n /** The router every service registered itself with; served to a client without a wire hop. */\n get router(): RpcRouter.Service {\n return this.#get(RpcRouter.RpcRouter);\n }\n\n get initialized(): Trigger {\n return this.#get(Readiness.StackReadinessService).initialized;\n }\n\n get identityManager(): IdentityContract.Manager {\n return this.#get(IdentityContract.ManagerService);\n }\n\n get spaceManager(): SpaceManager {\n return this.#get(SpaceManagerService);\n }\n\n get metadataStore(): IMetadataStore {\n return this.#get(IMetadataStoreService);\n }\n\n get recoveryManager(): EdgeIdentityRecoveryManager {\n return this.#get(EdgeIdentityRecoveryManagerService);\n }\n\n get keyring(): KeyringApi {\n return this.#get(KeyringApiService);\n }\n\n get hypercoreStore(): HypercoreStore<any> {\n return this.#get(HypercoreStoreService);\n }\n\n get echoHost(): EchoHost {\n return this.#get(EchoHostService);\n }\n\n get invitations(): InvitationsHandler {\n return this.#get(InvitationsHandlerService);\n }\n\n get invitationsManager(): InvitationsContract.Manager {\n return this.#get(InvitationsContract.ManagerService);\n }\n\n get networkManager(): SwarmNetworkManager {\n return this.#get(SwarmNetworkManagerService);\n }\n\n get signalManager(): SignalManager {\n return this.#get(SignalManagerService);\n }\n\n get dataSpaceManager(): SpacesContract.Manager | undefined {\n return this.#services && EffectContext.getUnsafe(this.#services, SpacesContract.ManagerService);\n }\n\n get edgeAgentManager(): EdgeAgentManager | undefined {\n return this.#services && EffectContext.getUnsafe(this.#services, EdgeAgentManagerService);\n }\n\n async open(ctx: Context = new Context()): Promise<void> {\n if (this.#stackScope) {\n return;\n }\n this.#ctx = ctx;\n const scope = Effect.runSync(Scope.make());\n this.#stackScope = scope;\n try {\n // Building the layer also builds its eager specs, so the rpc registrations are in place\n // before the lifecycle events below run.\n const stackContext = await EffectEx.runPromise(\n Layer.build(\n layerClientServices({\n runtimeProps: {\n invitationConnectionDefaultProps: { teleport: { controlHeartbeatInterval: 200 } },\n ...this.#options.runtimeProps,\n },\n signalManager: this.#options.signalManager,\n transportFactory: this.#options.transportFactory ?? MemoryTransportFactory,\n }).pipe(\n Layer.provide(RuntimeProvider.toLayer(this.#sql.contextEffect)),\n Layer.provide(Layer.succeed(ConfigService, this.#config)),\n Layer.provide(Layer.succeed(Hook.Controller, this.#controller)),\n ),\n ).pipe(Scope.provide(scope)),\n );\n this.#stack = EffectContext.get(stackContext, LayerStack.Service);\n this.#services = await EffectEx.runPromise(\n ServiceResolver.resolveAll(EXPOSED_TAGS, {}).pipe(\n Effect.provide(stackContext),\n Effect.orDie,\n Scope.provide(scope),\n ),\n );\n await EffectEx.runPromise(\n EffectEx.withContext(ctx)(openChain).pipe(Effect.provideService(Hook.Controller, this.#controller)),\n );\n } catch (err) {\n await this.#closeStack();\n throw err;\n }\n }\n\n async close(_ctx?: Context): Promise<void> {\n await this.#closeStack();\n }\n\n /**\n * Runs an effect against the SQLite runtime backing this context's storage. The runtime outlives\n * the stack, so a test can still inspect what a reset left behind.\n */\n async runSql<A, E>(effect: Effect.Effect<A, E, SqlClient.SqlClient>): Promise<A> {\n return this.#sql.runPromise(effect);\n }\n\n /** Resets through the in-process RPC bridge, as a client does. */\n async reset(): Promise<void> {\n await EffectEx.runPromise(\n Effect.scoped(\n Effect.gen({ self: this }, function* () {\n const rpc = yield* this.rpc;\n yield* rpc['SystemService.reset']();\n }),\n ),\n );\n }\n\n /** Disposes the SQLite runtime too; call once the context is no longer needed. */\n async destroy(): Promise<void> {\n await this.#closeStack();\n await EffectEx.runPromise(Scope.close(this.#busScope, Exit.void));\n await this.#sql.dispose();\n }\n\n // Shared by close and destroy so a caller that wraps `close` cannot recurse through `destroy`.\n async #closeStack(): Promise<void> {\n const scope = this.#stackScope;\n if (!scope) {\n return;\n }\n this.#stackScope = undefined;\n // Closed before the services are dropped: teardown stops the schedulers that still reach for\n // them, and clearing first leaves those callbacks resolving against nothing.\n await EffectEx.runPromise(Scope.close(scope, Exit.void));\n this.#stack = undefined;\n this.#services = undefined;\n }\n\n async createIdentity(params: CreateIdentityOptions = {}, ctx?: Context): Promise<Identity> {\n return this.#get(IdentityContract.LifecycleService).createIdentity(params, ctx ?? this.#ctx);\n }\n\n // The stack proves nothing about which tags are built, so the lookup is unsafe by construction:\n // asking before `open` throws here rather than returning undefined into a test.\n #get<Self, Service>(tag: EffectContext.Key<Self, Service>): Service {\n return EffectContext.getUnsafe(this.#services ?? failUndefined(), tag);\n }\n}\n\nexport const createServiceHost = (config: Config, signalManagerContext: MemorySignalManagerContext): ServiceContext =>\n new ServiceContext({ config, signalManager: new MemorySignalManager(signalManagerContext) });\n\nexport const createServiceContext = async ({\n signalManagerFactory = async () => new MemorySignalManager(new MemorySignalManagerContext()),\n runtimeProps,\n}: {\n signalManagerFactory?: () => Promise<SignalManager>;\n runtimeProps?: ServiceContextRuntimeProps;\n} = {}): Promise<ServiceContext> => {\n const context = new ServiceContext({ signalManager: await signalManagerFactory(), runtimeProps });\n // Tests close the context; the SQLite runtime goes with it so layer finalizers do not leak across tests.\n const close = context.close.bind(context);\n context.close = async (ctx) => {\n await close(ctx);\n await context.destroy();\n };\n return context;\n};\n\nexport const createPeers = async (\n numPeers: number,\n signalManagerFactory?: () => Promise<SignalManager>,\n runtimeProps?: ServiceContextRuntimeProps,\n) => {\n if (!signalManagerFactory) {\n const signalContext = new MemorySignalManagerContext();\n signalManagerFactory = async () => new MemorySignalManager(signalContext);\n }\n return await Promise.all(\n Array.from(Array(numPeers)).map(async () => {\n const peer = await createServiceContext({ signalManagerFactory, runtimeProps });\n await peer.open(new Context());\n return peer;\n }),\n );\n};\n\nexport const createIdentity = async (peer: ServiceContext) => {\n await peer.createIdentity();\n return peer;\n};\n\nexport class TestBuilder {\n public readonly signalContext = new MemorySignalManagerContext();\n private readonly _ctx = new Context();\n\n createPeer(peerOptions?: TestPeerOpts): TestPeer {\n const peer = new TestPeer(this.signalContext, peerOptions);\n this._ctx.onDispose(async () => peer.destroy());\n return peer;\n }\n\n async destroy(): Promise<void> {\n await this._ctx.dispose();\n }\n}\n\nexport type TestPeerOpts = {\n dataStore?: StorageType;\n dataSpaceProps?: DataSpaceManagerRuntimeProps;\n edgeHttpClient?: EdgeHttpClient;\n};\n\nexport type TestPeerProps = {\n hypercoreStore?: HypercoreStore<any>;\n metadataStore?: SqliteMetadataStore;\n keyring?: SqliteKeyring;\n networkManager?: SwarmNetworkManager;\n spaceManager?: SpaceManager;\n dataSpaceManager?: SpacesContract.Manager;\n signingContext?: SigningContext;\n echoHost?: EchoHost;\n meshEchoReplicator?: MeshEchoReplicator;\n invitationsManager?: InvitationsContract.Manager;\n};\n\nexport class TestPeer {\n private _props: TestPeerProps = {};\n private readonly _runtime = ManagedRuntime.make(\n sqliteLayerMemory.pipe(Layer.provideMerge(Reactivity.layer)).pipe(Layer.orDie),\n );\n private readonly _feedStorage = new SqliteStorage.SqliteStorage({ runtime: this._runtime.contextEffect });\n\n constructor(\n private readonly _signalContext: MemorySignalManagerContext,\n private readonly _opts: TestPeerOpts = { dataStore: StorageType.RAM },\n ) {}\n\n get props() {\n return this._props;\n }\n\n get keyring() {\n return (this._props.keyring ??= new SqliteKeyring({ runtime: this._runtime.contextEffect }));\n }\n\n get hypercoreStore() {\n return (this._props.hypercoreStore ??= new HypercoreStore({\n factory: new HypercoreFactory({\n root: this._feedStorage.createDirectory('feeds'),\n signer: this.keyring,\n hypercore: {\n valueEncoding,\n },\n }),\n }));\n }\n\n get metadataStore() {\n return (this._props.metadataStore ??= new SqliteMetadataStore({ runtime: this._runtime.contextEffect }));\n }\n\n get networkManager() {\n return (this._props.networkManager ??= new SwarmNetworkManager({\n signalManager: new MemorySignalManager(this._signalContext),\n transportFactory: MemoryTransportFactory,\n }));\n }\n\n get spaceManager() {\n return (this._props.spaceManager ??= new SpaceManager({\n hypercoreStore: this.hypercoreStore,\n networkManager: this.networkManager,\n metadataStore: this.metadataStore,\n }));\n }\n\n get identity() {\n return this._props.signingContext ?? failUndefined();\n }\n\n get echoHost() {\n return (this._props.echoHost ??= new EchoHost({\n runtime: this._runtime.contextEffect,\n }));\n }\n\n get meshEchoReplicator() {\n return (this._props.meshEchoReplicator ??= new MeshEchoReplicator());\n }\n\n get dataSpaceManager(): SpacesContract.Manager {\n return (this._props.dataSpaceManager ??= new DataSpaceManager({\n spaceManager: this.spaceManager,\n metadataStore: this.metadataStore,\n keyring: this.keyring,\n signingContextProvider: () => this.identity,\n hypercoreStore: this.hypercoreStore,\n echoHost: this.echoHost,\n invitationsManager: this.invitationsManager,\n edgeConnection: undefined,\n meshReplicator: this.meshEchoReplicator,\n echoEdgeReplicator: undefined,\n edgeHttpClient: this._opts.edgeHttpClient,\n runtimeProps: this._opts.dataSpaceProps,\n }));\n }\n\n get invitationsManager() {\n if (!this._props.invitationsManager) {\n const manager = new InvitationsManager(new InvitationsHandler(this.networkManager), this.metadataStore);\n manager.setInvitationHandlerFactory((invitation) => {\n if (invitation.kind === Invitation_Kind.SPACE) {\n return new SpaceInvitationProtocol(\n this.dataSpaceManager,\n this.identity,\n this.keyring,\n toPublicKey(invitation.spaceKey),\n );\n } else {\n throw new Error('not implemented');\n }\n });\n this._props.invitationsManager = manager;\n }\n return this._props.invitationsManager;\n }\n\n async createIdentity(): Promise<void> {\n await this.migrate();\n this._props.signingContext ??= await createSigningContext(this.keyring);\n this.networkManager.setPeerInfo(\n create(PeerSchema, {\n identityKey: this._props.signingContext.identityKey.toHex(),\n peerKey: this._props.signingContext.deviceKey.toHex(),\n }),\n );\n }\n\n async migrate(): Promise<void> {\n await RuntimeProvider.runPromise(this._runtime.contextEffect)(\n Effect.all([this.metadataStore.migrate, this.keyring.migrate, this._feedStorage.migrate]),\n );\n }\n\n async destroy(): Promise<void> {\n await this._runtime.dispose();\n }\n}\n\nexport const createSigningContext = async (keyring: SqliteKeyring): Promise<SigningContext> => {\n const identityKey = await keyring.createKey();\n const deviceKey = await keyring.createKey();\n\n return {\n identityKey,\n deviceKey,\n credentialSigner: createCredentialSignerWithChain(\n keyring,\n create(ChainSchema, {\n credential: await new CredentialGenerator(keyring, identityKey, deviceKey).createDeviceAuthorization(deviceKey),\n }),\n deviceKey,\n ),\n recordCredential: async () => {}, // No-op.\n getProfile: () => undefined,\n };\n};\n","//\n// Copyright 2023 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport { type AuthenticatingInvitation, type CancellableInvitation, InvitationEncoder } from '@dxos/client-protocol';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { toPublicKey } from '@dxos/protocols/buf';\nimport {\n Invitation,\n Invitation_AuthMethod,\n Invitation_Kind,\n Invitation_State,\n} from '@dxos/protocols/buf/dxos/client/invitation_pb';\nimport { type DeviceProfileDocument } from '@dxos/protocols/buf/dxos/halo/credentials_pb';\n\nimport { ServiceContext } from './test-builder.ts';\n\n/**\n * Strip secrets from invitation before giving it to the peer.\n */\nexport const sanitizeInvitation = (invitation: Invitation): Invitation => {\n return InvitationEncoder.decode(InvitationEncoder.encode(invitation));\n};\n\nexport type InvitationHost = {\n share(options?: Partial<Invitation>): CancellableInvitation;\n};\n\nexport type InvitationGuest = {\n join(invitation: Invitation | string, deviceProfile?: DeviceProfileDocument): AuthenticatingInvitation;\n};\n\nexport type PerformInvitationCallbacks<T> = {\n onConnecting?: (value: T) => boolean | void;\n onConnected?: (value: T) => boolean | void;\n onReady?: (value: T) => boolean | void;\n onAuthenticating?: (value: T) => boolean | void;\n onSuccess?: (value: T) => boolean | void;\n onCancelled?: (value: T) => boolean | void;\n onTimeout?: (value: T) => boolean | void;\n onError?: (value: T) => boolean | void;\n};\n\nexport type PerformInvitationProps = {\n host: ServiceContext | InvitationHost;\n guest: ServiceContext | InvitationGuest;\n guestDeviceProfile?: DeviceProfileDocument;\n options?: Partial<Invitation>;\n hooks?: {\n host?: PerformInvitationCallbacks<CancellableInvitation>;\n guest?: PerformInvitationCallbacks<AuthenticatingInvitation>;\n };\n codeInputDelay?: number;\n};\n\nexport type Result = { invitation?: Invitation; error?: Error };\n\n// TODO(burdon): Make async.\n// TODO(burdon): Rename startInvitation.\n/**\n *\n */\nexport const performInvitation = ({\n host,\n guest,\n guestDeviceProfile,\n options,\n hooks,\n codeInputDelay,\n}: PerformInvitationProps): [Promise<Result>, Promise<Result>] => {\n let guestError = false;\n let guestConnected = false;\n let wereConnected = false;\n const hostComplete = new Trigger<Result>();\n const guestComplete = new Trigger<Result>();\n const authCode = new Trigger<string>();\n\n void createInvitation(host, options).then((hostObservable) => {\n hostObservable.subscribe(\n async (hostInvitation: Invitation) => {\n switch (hostInvitation.state) {\n case Invitation_State.CONNECTING: {\n if (guestConnected) {\n if (wereConnected) {\n hostComplete.wake({ invitation: hostInvitation });\n }\n break;\n }\n\n guestConnected = true;\n if (hooks?.host?.onConnecting?.(hostObservable)) {\n break;\n }\n\n const guestObservable = acceptInvitation(guest, hostInvitation, guestDeviceProfile);\n guestObservable.subscribe(\n async (guestInvitation: Invitation) => {\n switch (guestInvitation.state) {\n case Invitation_State.CONNECTING: {\n if (hooks?.guest?.onConnecting?.(guestObservable)) {\n break;\n }\n const guestSwarmKey = toPublicKey(guestInvitation.swarmKey);\n invariant(guestSwarmKey && toPublicKey(hostInvitation.swarmKey)?.equals(guestSwarmKey));\n break;\n }\n\n case Invitation_State.CONNECTED: {\n hooks?.guest?.onConnected?.(guestObservable);\n break;\n }\n\n case Invitation_State.READY_FOR_AUTHENTICATION: {\n if (hooks?.guest?.onReady?.(guestObservable)) {\n break;\n }\n const code = await authCode.wait();\n if (codeInputDelay == null) {\n await guestObservable.authenticate(code);\n } else {\n setTimeout(async () => {\n if (!guestError) {\n await guestObservable.authenticate(code);\n }\n }, codeInputDelay);\n }\n break;\n }\n\n case Invitation_State.AUTHENTICATING: {\n hooks?.guest?.onAuthenticating?.(guestObservable);\n break;\n }\n\n case Invitation_State.SUCCESS: {\n if (hooks?.guest?.onSuccess?.(guestObservable)) {\n break;\n }\n guestComplete.wake({ invitation: guestInvitation });\n break;\n }\n\n case Invitation_State.CANCELLED: {\n if (hooks?.guest?.onCancelled?.(guestObservable)) {\n break;\n }\n guestComplete.wake({ invitation: guestInvitation });\n break;\n }\n\n case Invitation_State.TIMEOUT: {\n if (hooks?.guest?.onTimeout?.(guestObservable)) {\n return;\n }\n guestComplete.wake({ invitation: guestInvitation });\n }\n }\n },\n (error: Error) => {\n guestError = true;\n if (hooks?.guest?.onError?.(guestObservable)) {\n return;\n }\n guestComplete.wake({ error });\n },\n );\n break;\n }\n\n case Invitation_State.CONNECTED: {\n wereConnected = true;\n hooks?.host?.onConnected?.(hostObservable);\n break;\n }\n\n case Invitation_State.READY_FOR_AUTHENTICATION: {\n if (hooks?.host?.onReady?.(hostObservable)) {\n break;\n }\n if (hostInvitation.authCode) {\n authCode.wake(hostInvitation.authCode);\n }\n break;\n }\n\n case Invitation_State.AUTHENTICATING: {\n hooks?.host?.onAuthenticating?.(hostObservable);\n break;\n }\n\n case Invitation_State.SUCCESS: {\n if (hooks?.host?.onSuccess?.(hostObservable)) {\n break;\n }\n hostComplete.wake({ invitation: hostInvitation });\n break;\n }\n\n case Invitation_State.CANCELLED: {\n if (hooks?.host?.onCancelled?.(hostObservable)) {\n break;\n }\n hostComplete.wake({ invitation: hostInvitation });\n break;\n }\n\n case Invitation_State.TIMEOUT: {\n if (hooks?.host?.onTimeout?.(hostObservable)) {\n break;\n }\n hostComplete.wake({ invitation: hostInvitation });\n break;\n }\n }\n },\n (error: Error) => {\n if (hooks?.host?.onError?.(hostObservable)) {\n return;\n }\n hostComplete.wake({ error });\n },\n );\n });\n\n return [hostComplete.wait(), guestComplete.wait()];\n};\n\nexport const createInvitation = async (\n host: ServiceContext | InvitationHost,\n options?: Partial<Invitation>,\n): Promise<CancellableInvitation> => {\n options ??= {\n authMethod: Invitation_AuthMethod.NONE,\n ...(options ?? {}),\n };\n\n if (host instanceof ServiceContext) {\n return host.invitationsManager.createInvitation(new Context(), {\n kind: Invitation_Kind.SPACE,\n ...options,\n });\n }\n\n return host.share(options);\n};\n\nexport const acceptInvitation = (\n guest: ServiceContext | InvitationGuest,\n invitation: Invitation,\n guestDeviceProfile?: DeviceProfileDocument,\n): AuthenticatingInvitation => {\n invitation = sanitizeInvitation(invitation);\n\n if (guest instanceof ServiceContext) {\n return guest.invitationsManager.acceptInvitation(new Context(), {\n invitation,\n deviceProfile: guestDeviceProfile,\n });\n }\n\n return guest.join(invitation, guestDeviceProfile);\n};\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport { create } from '@bufbuild/protobuf';\n\nimport { type Context } from '@dxos/context';\nimport { createDidFromIdentityKey } from '@dxos/credentials';\nimport { type MessageListener, type ReconnectListener } from '@dxos/edge-client';\nimport { EdgeCallFailedError, EdgeService, type InboxNotice } from '@dxos/protocols';\nimport { MessageSchema } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\n\nimport {\n type InboxEdgeClient,\n type InboxIdentitySource,\n type InboxPushSource,\n type InboxRelay,\n} from '../identity/index.ts';\n\ntype Device = { identity: InboxIdentitySource; listener: MessageListener };\n\n/**\n * In-memory stand-in for the EDGE inbox: one pending list per recipient DID, with every connected\n * device of the recipient rung on each change, as the router's push frame would.\n * Share one between clients so they can message each other without EDGE.\n */\nexport class MemoryEdgeInbox implements InboxRelay {\n readonly notices = new Map<string, InboxNotice[]>();\n /** DIDs refused as EDGE refuses an identity not linked to an account. */\n readonly accountless = new Set<string>();\n readonly #devices = new Set<Device>();\n #nextId = 0;\n #listCalls = 0;\n\n /** `listInbox` calls so far, refused ones included, so a test can wait for a pull without sleeping. */\n get listCalls(): number {\n return this.#listCalls;\n }\n\n /** Stores a payload as EDGE would after authenticating `senderDid`. */\n put(recipientDid: string, senderDid: string, payload: string): string {\n const id = `n${++this.#nextId}`;\n const now = Date.now();\n this.#list(recipientDid).push({ id, senderDid, sentAt: now, expiresAt: now + 1_000_000, payload });\n void this.#ring(recipientDid);\n return id;\n }\n\n connect(identity: InboxIdentitySource): { edgeClient: InboxEdgeClient; pushSource: InboxPushSource } {\n // Resolved per call, since a client's identity is created after its services.\n const authenticate = async (): Promise<string> => {\n const identityKey = identity.identity?.identityKey;\n if (!identityKey) {\n throw new Error('Not authenticated: no identity.');\n }\n const did = await createDidFromIdentityKey(identityKey);\n if (this.accountless.has(did)) {\n throw new EdgeCallFailedError({\n message: 'Identity is not associated with an account.',\n data: { type: 'identity_not_associated_with_account' },\n });\n }\n return did;\n };\n\n const edgeClient: InboxEdgeClient = {\n sendInboxMessage: async (_ctx: Context, recipientDid: string, payload: string) => ({\n id: this.put(recipientDid, await authenticate(), payload),\n }),\n listInbox: async () => {\n this.#listCalls++;\n return { notices: [...this.#list(await authenticate())] };\n },\n ackInbox: async (_ctx: Context, ids: readonly string[]) => {\n const did = await authenticate();\n this.notices.set(\n did,\n this.#list(did).filter((notice) => !ids.includes(notice.id)),\n );\n await this.#ring(did);\n },\n };\n const pushSource: InboxPushSource = {\n onMessage: (listener: MessageListener) => {\n const device = { identity, listener };\n this.#devices.add(device);\n return () => this.#devices.delete(device);\n },\n onReconnected: (_listener: ReconnectListener) => () => {},\n };\n return { edgeClient, pushSource };\n }\n\n #list(did: string): InboxNotice[] {\n const list = this.notices.get(did) ?? [];\n this.notices.set(did, list);\n return list;\n }\n\n async #ring(did: string): Promise<void> {\n const frame = create(MessageSchema, { serviceId: EdgeService.INBOX });\n for (const { identity, listener } of [...this.#devices]) {\n const identityKey = identity.identity?.identityKey;\n if (identityKey && (await createDidFromIdentityKey(identityKey)) === did) {\n listener(frame);\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -37,6 +37,8 @@ export declare const Closing: Hook.Hook<"client-services/Closing", void>;
|
|
|
37
37
|
export declare const WipingStorage: Hook.Hook<"client-services/WipingStorage", void>;
|
|
38
38
|
/** Storage is wiped; the embedder typically reloads. */
|
|
39
39
|
export declare const Reset: Hook.Hook<"client-services/Reset", void>;
|
|
40
|
+
/** Storage stopped answering, so nothing more will be saved; the embedder replaces the process. */
|
|
41
|
+
export declare const StorageStuck: Hook.Hook<"client-services/StorageStuck", void>;
|
|
40
42
|
/** The local profile changed and should be broadcast to every open space. */
|
|
41
43
|
export declare const ProfileUpdated: Hook.Hook<"client-services/ProfileUpdated", {
|
|
42
44
|
profile: ProfileDocument;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Events.d.ts","sourceRoot":"","sources":["../../../src/Events.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,IAAI,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAErG,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAuB9C,yDAAyD;AACzD,eAAO,MAAM,OAAO,4CAA+C,CAAC;AAEpE,8DAA8D;AAC9D,eAAO,MAAM,YAAY,iDAAoD,CAAC;AAE9E,2FAA2F;AAC3F,eAAO,MAAM,cAAc;eAA0B,QAAQ;EAAuC,CAAC;AAErG,wFAAwF;AACxF,eAAO,MAAM,YAAY,iDAAoD,CAAC;AAE9E;;;GAGG;AACH,eAAO,MAAM,aAAa;cAAyB,QAAQ;uBAAqB,UAAU;EAEzF,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB;cAAyB,QAAQ;EAA0C,CAAC;AAE1G,sCAAsC;AACtC,eAAO,MAAM,mBAAmB;cAAyB,QAAQ;EAA4C,CAAC;AAE9G,oEAAoE;AACpE,eAAO,MAAM,WAAW,gDAAmD,CAAC;AAE5E,0GAA0G;AAC1G,eAAO,MAAM,iBAAiB,sDAAyD,CAAC;AAExF,sDAAsD;AACtD,eAAO,MAAM,OAAO,4CAA+C,CAAC;AAEpE,6FAA6F;AAC7F,eAAO,MAAM,aAAa,kDAAqD,CAAC;AAEhF,wDAAwD;AACxD,eAAO,MAAM,KAAK,0CAA6C,CAAC;AAEhE,6EAA6E;AAC7E,eAAO,MAAM,cAAc;aAAwB,eAAe;EAAuC,CAAC"}
|
|
1
|
+
{"version":3,"file":"Events.d.ts","sourceRoot":"","sources":["../../../src/Events.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,IAAI,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAErG,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAuB9C,yDAAyD;AACzD,eAAO,MAAM,OAAO,4CAA+C,CAAC;AAEpE,8DAA8D;AAC9D,eAAO,MAAM,YAAY,iDAAoD,CAAC;AAE9E,2FAA2F;AAC3F,eAAO,MAAM,cAAc;eAA0B,QAAQ;EAAuC,CAAC;AAErG,wFAAwF;AACxF,eAAO,MAAM,YAAY,iDAAoD,CAAC;AAE9E;;;GAGG;AACH,eAAO,MAAM,aAAa;cAAyB,QAAQ;uBAAqB,UAAU;EAEzF,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB;cAAyB,QAAQ;EAA0C,CAAC;AAE1G,sCAAsC;AACtC,eAAO,MAAM,mBAAmB;cAAyB,QAAQ;EAA4C,CAAC;AAE9G,oEAAoE;AACpE,eAAO,MAAM,WAAW,gDAAmD,CAAC;AAE5E,0GAA0G;AAC1G,eAAO,MAAM,iBAAiB,sDAAyD,CAAC;AAExF,sDAAsD;AACtD,eAAO,MAAM,OAAO,4CAA+C,CAAC;AAEpE,6FAA6F;AAC7F,eAAO,MAAM,aAAa,kDAAqD,CAAC;AAEhF,wDAAwD;AACxD,eAAO,MAAM,KAAK,0CAA6C,CAAC;AAEhE,mGAAmG;AACnG,eAAO,MAAM,YAAY,iDAAoD,CAAC;AAE9E,6EAA6E;AAC7E,eAAO,MAAM,cAAc;aAAwB,eAAe;EAAuC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as EffectContext from 'effect/Context';
|
|
2
|
+
import * as Layer from 'effect/Layer';
|
|
3
|
+
import { type BlobStore } from '@dxos/blob';
|
|
4
|
+
import { EdgeHttpClientService } from '@dxos/edge-client';
|
|
5
|
+
import * as Hook from '@dxos/effect/Hook';
|
|
6
|
+
import { LocalBlobStoreService } from './local-blob-store.ts';
|
|
7
|
+
/**
|
|
8
|
+
* Replication of the local blob store with the EDGE blob service: pushes stored blobs asynchronously
|
|
9
|
+
* and fills local misses. Present only when an EDGE endpoint is configured; without it the local
|
|
10
|
+
* store is complete on its own.
|
|
11
|
+
*/
|
|
12
|
+
export interface BlobReplication {
|
|
13
|
+
/** The local store, filling misses from EDGE and caching them. */
|
|
14
|
+
readonly store: BlobStore;
|
|
15
|
+
/** Signals that a blob was written locally and may need pushing; never waits on the network. */
|
|
16
|
+
wake(): void;
|
|
17
|
+
}
|
|
18
|
+
declare const BlobReplicationService_base: EffectContext.ServiceClass<BlobReplicationService, "@dxos/client-services/BlobReplication", BlobReplication>;
|
|
19
|
+
export declare class BlobReplicationService extends BlobReplicationService_base {
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Replication for a stack with no EDGE endpoint: reads are served by the local store alone and writes
|
|
23
|
+
* stay in its ledger, to be pushed by a later session that has one.
|
|
24
|
+
*/
|
|
25
|
+
export declare const BlobReplicationNoopLayer: Layer.Layer<BlobReplicationService, never, LocalBlobStoreService>;
|
|
26
|
+
export declare const BlobReplicationLayer: Layer.Layer<BlobReplicationService, never, LocalBlobStoreService | EdgeHttpClientService | Hook.Controller>;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=blob-replication.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blob-replication.d.ts","sourceRoot":"","sources":["../../../../../src/internal/blobs/blob-replication.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAC;AAEhD,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,KAAK,SAAS,EAAsB,MAAM,YAAY,CAAC;AAGhE,OAAO,EAAuB,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,KAAK,IAAI,MAAM,mBAAmB,CAAC;AAG1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,gGAAgG;IAChG,IAAI,IAAI,IAAI,CAAC;CACd;;AAED,qBAAa,sBAAuB,SAAQ,2BAE3C;CAAG;AAEJ;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,KAAK,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,EAAE,qBAAqB,CAMtG,CAAC;AASF,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,KAAK,CAC5C,sBAAsB,EACtB,KAAK,EACL,qBAAqB,GAAG,qBAAqB,GAAG,IAAI,CAAC,UAAU,CAwBhE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as Layer from 'effect/Layer';
|
|
2
|
+
import { BlobStoreService } from '@dxos/protocols/rpc';
|
|
3
|
+
import { BlobReplicationService } from './blob-replication.ts';
|
|
4
|
+
import { LocalBlobStoreService } from './local-blob-store.ts';
|
|
5
|
+
/**
|
|
6
|
+
* Serves `BlobStoreService` RPCs from the local blob store. A `put` is confirmed once the bytes are
|
|
7
|
+
* stored locally; replication is only told about it afterwards.
|
|
8
|
+
*/
|
|
9
|
+
export declare const BlobStoreServiceLayer: Layer.Layer<BlobStoreService.Tag, never, LocalBlobStoreService | BlobReplicationService>;
|
|
10
|
+
//# sourceMappingURL=blob-store-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blob-store-service.d.ts","sourceRoot":"","sources":["../../../../../src/internal/blobs/blob-store-service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,KAAK,CAC7C,gBAAgB,CAAC,GAAG,EACpB,KAAK,EACL,qBAAqB,GAAG,sBAAsB,CAwB/C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blob-store-service.test.d.ts","sourceRoot":"","sources":["../../../../../src/internal/blobs/blob-store-service.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/internal/blobs/index.ts"],"names":[],"mappings":"AAIA,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as EffectContext from 'effect/Context';
|
|
2
|
+
import * as Effect from 'effect/Effect';
|
|
3
|
+
import * as Layer from 'effect/Layer';
|
|
4
|
+
import * as SqlClient from 'effect/sql/SqlClient';
|
|
5
|
+
import type * as SqlError from 'effect/sql/SqlError';
|
|
6
|
+
import { type LocalBlobStore } from '@dxos/blob';
|
|
7
|
+
/**
|
|
8
|
+
* Applies any local blob store migrations this database has not recorded yet.
|
|
9
|
+
*/
|
|
10
|
+
export declare const migrateBlobStore: Effect.Effect<void, SqlError.SqlError, SqlClient.SqlClient>;
|
|
11
|
+
/**
|
|
12
|
+
* The `blobs` table of the host's database: blob bytes on this device, outside Automerge, with the
|
|
13
|
+
* ledger of those the hosted store does not hold yet. Knows nothing of replication.
|
|
14
|
+
*/
|
|
15
|
+
export declare const makeLocalBlobStore: Effect.Effect<LocalBlobStore, never, SqlClient.SqlClient>;
|
|
16
|
+
declare const LocalBlobStoreService_base: EffectContext.ServiceClass<LocalBlobStoreService, "@dxos/client-services/LocalBlobStore", LocalBlobStore>;
|
|
17
|
+
export declare class LocalBlobStoreService extends LocalBlobStoreService_base {
|
|
18
|
+
}
|
|
19
|
+
export declare const LocalBlobStoreLayer: Layer.Layer<LocalBlobStoreService, never, SqlClient.SqlClient>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=local-blob-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-blob-store.d.ts","sourceRoot":"","sources":["../../../../../src/internal/blobs/local-blob-store.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjD;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,SAAS,CAQxF,CAAC;AAIF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,CA4CvF,CAAC;;AAEH,qBAAa,qBAAsB,SAAQ,0BAE1C;CAAG;AAEJ,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,CAG9F,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-blob-store.test.d.ts","sourceRoot":"","sources":["../../../../../src/internal/blobs/local-blob-store.test.ts"],"names":[],"mappings":""}
|
|
@@ -47,6 +47,7 @@ export declare const MetadataStoreSpec: LayerSpec.LayerSpec;
|
|
|
47
47
|
export declare const HypercoreFactorySpec: LayerSpec.LayerSpec;
|
|
48
48
|
export declare const HypercoreStoreSpec: LayerSpec.LayerSpec;
|
|
49
49
|
export declare const StorageMigrationSpec: LayerSpec.LayerSpec;
|
|
50
|
+
export declare const StorageWatchdogSpec: LayerSpec.LayerSpec;
|
|
50
51
|
export declare const StorageLifecycleSpec: LayerSpec.LayerSpec;
|
|
51
52
|
export declare const StackReadinessSpec: LayerSpec.LayerSpec;
|
|
52
53
|
export declare const SwarmNetworkManagerSpec: (options: ServiceStackServices) => LayerSpec.LayerSpec;
|
|
@@ -99,6 +100,11 @@ export declare const LoggingServiceRegistrationSpec: LayerSpec.LayerSpec;
|
|
|
99
100
|
export declare const DevtoolsHostSpec: LayerSpec.LayerSpec;
|
|
100
101
|
export declare const SqlServiceSpec: LayerSpec.LayerSpec;
|
|
101
102
|
export declare const SqlServiceRegistrationSpec: LayerSpec.LayerSpec;
|
|
103
|
+
export declare const LocalBlobStoreSpec: LayerSpec.LayerSpec;
|
|
104
|
+
/** Replicates with the edge only when one is configured; without it, blobs live on this device alone. */
|
|
105
|
+
export declare const BlobReplicationSpec: (options: ServiceStackServices) => LayerSpec.LayerSpec;
|
|
106
|
+
export declare const BlobStoreServiceSpec: LayerSpec.LayerSpec;
|
|
107
|
+
export declare const BlobStoreServiceRegistrationSpec: LayerSpec.LayerSpec;
|
|
102
108
|
export declare const DevtoolsHostRegistrationSpec: LayerSpec.LayerSpec;
|
|
103
109
|
/**
|
|
104
110
|
* Every spec the client stack is built from, with the option-driven ones applied.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layer-specs.d.ts","sourceRoot":"","sources":["../../../../../src/internal/services/layer-specs.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,SAAS,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"layer-specs.d.ts","sourceRoot":"","sources":["../../../../../src/internal/services/layer-specs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-stack.d.ts","sourceRoot":"","sources":["../../../../../src/internal/services/service-stack.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAErD,OAAO,EACL,KAAK,mBAAmB,EAExB,eAAe,EACf,KAAK,iBAAiB,EAEvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,IAAI,MAAM,mBAAmB,CAAC;AAI1C,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,EAAE,KAAK,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AAEtF,OAAO,KAAK,gBAAgB,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"service-stack.d.ts","sourceRoot":"","sources":["../../../../../src/internal/services/service-stack.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAErD,OAAO,EACL,KAAK,mBAAmB,EAExB,eAAe,EACf,KAAK,iBAAiB,EAEvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,IAAI,MAAM,mBAAmB,CAAC;AAI1C,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,EAAE,KAAK,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AAEtF,OAAO,KAAK,gBAAgB,MAAM,6BAA6B,CAAC;AAIhE,OAAO,EAAE,KAAK,oBAAoB,EAAE,KAAK,UAAU,EAA+B,MAAM,sBAAsB,CAAC;AAC/G,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAuB,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,KAAK,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAEvE,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAC3C,oBAAoB,EACpB,8BAA8B,GAAG,gCAAgC,CAClE,GACC,4BAA4B,GAAG;IAC7B,gCAAgC,CAAC,EAAE,yBAAyB,CAAC;IAC7D,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,2EAA2E;IAC3E,aAAa,CAAC,EAAE,iBAAiB,CAAC;CACnC,CAAC;;AAEJ;;;GAGG;AACH,qBAAa,uBAAwB,SAAQ,4BAGA;CAAG;AAEhD,MAAM,MAAM,oBAAoB,GAAG,0BAA0B,GAAG;IAC9D,YAAY,CAAC,EAAE,2BAA2B,CAAC;IAC3C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gFAAgF;IAChF,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,sEAAsE;IACtE,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,IAAI,OAChC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,mBAAmB,CAAC,KAChD,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC,UAAU,CAoB3D,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,qBAAqB,uFAMjC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,kEAcjC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,oHAsBjC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,YAAa;IAAE,aAAa,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,iBAAiB,CAAA;CAAE,qHA6BlG,CAAC"}
|
|
@@ -2,7 +2,7 @@ import { type SpecificCredential } from '@dxos/credentials';
|
|
|
2
2
|
import { type Obj } from '@dxos/echo';
|
|
3
3
|
import { type DatabaseRoot, type EchoHost } from '@dxos/echo-host';
|
|
4
4
|
import { type EntityStructure } from '@dxos/echo-protocol';
|
|
5
|
-
import { type IdentityDid, type SpaceId } from '@dxos/keys';
|
|
5
|
+
import { type EntityId, type IdentityDid, type SpaceId } from '@dxos/keys';
|
|
6
6
|
import { type Epoch } from '@dxos/protocols/buf/dxos/halo/credentials_pb';
|
|
7
7
|
import { SpacesService } from '@dxos/protocols/rpc';
|
|
8
8
|
/**
|
|
@@ -27,6 +27,8 @@ export type WriteSerializedSpaceArchiveOptions = {
|
|
|
27
27
|
space: ExportableSpace;
|
|
28
28
|
echoHost: EchoHost;
|
|
29
29
|
exportedBy?: IdentityDid;
|
|
30
|
+
/** Export only these feeds: their `Feed` objects and messages, and no other object. */
|
|
31
|
+
feedIds?: readonly string[];
|
|
30
32
|
};
|
|
31
33
|
/**
|
|
32
34
|
* Write a JSON space archive from a live space.
|
|
@@ -45,4 +47,5 @@ export declare const writeSerializedSpaceArchive: (options: WriteSerializedSpace
|
|
|
45
47
|
* through {@link Obj.fromJSON}.
|
|
46
48
|
*/
|
|
47
49
|
export declare const objectStructureToObjJson: (objectId: string, structure: EntityStructure) => Obj.JSON;
|
|
50
|
+
export declare const collectFeedMessages: (echoHost: EchoHost, spaceId: SpaceId, feedId: EntityId, namespace: string) => Promise<Obj.JSON[]>;
|
|
48
51
|
//# sourceMappingURL=serialized-space-writer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialized-space-writer.d.ts","sourceRoot":"","sources":["../../../../../src/internal/space-export/serialized-space-writer.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGnF,OAAO,
|
|
1
|
+
{"version":3,"file":"serialized-space-writer.d.ts","sourceRoot":"","sources":["../../../../../src/internal/space-export/serialized-space-writer.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGnF,OAAO,EAAO,KAAK,QAAQ,EAAE,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAGhF,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,8CAA8C,CAAC;AAC1E,OAAO,EAAe,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGjE;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,mBAAmB,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC,KAAK,CAAC,GAAG,SAAS,CAAA;KAAE,CAAC;IAC5F,QAAQ,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;CAC5C,CAAC;AA6BF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,QAAS,GAAG,CAAC,IAAI,KAAG,GAAG,CAAC,IAmBtD,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,uFAAuF;IACvF,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B,YAC7B,kCAAkC,KAC1C,OAAO,CAAC,aAAa,CAAC,YAAY,CAiDpC,CAAC;AASF;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,aAAc,MAAM,aAAa,eAAe,KAAG,GAAG,CAAC,IAsC3F,CAAC;AAuCF,eAAO,MAAM,mBAAmB,aACpB,QAAQ,WACT,OAAO,UACR,QAAQ,aACL,MAAM,KAChB,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAgDpB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spaces-service.d.ts","sourceRoot":"","sources":["../../../../../src/internal/spaces/spaces-service.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,YAAY,MAAM,eAAe,CAAC;AAa9C,OAAO,EAAE,KAAK,QAAQ,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGjE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAiBzC,OAAO,EAGL,KAAK,mBAAmB,EAGxB,KAAK,iBAAiB,EAEtB,KAAK,mBAAmB,EAExB,KAAK,KAAK,EAMX,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAC/E,OAAO,EAAe,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEjE,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,KAAK,gBAAgB,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,cAAc,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"spaces-service.d.ts","sourceRoot":"","sources":["../../../../../src/internal/spaces/spaces-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/internal/storage/index.ts"],"names":[],"mappings":"AAIA,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/internal/storage/index.ts"],"names":[],"mappings":"AAIA,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as Duration from 'effect/Duration';
|
|
2
|
+
import * as Layer from 'effect/Layer';
|
|
3
|
+
import * as SqlClient from 'effect/sql/SqlClient';
|
|
4
|
+
import * as Hook from '@dxos/effect/Hook';
|
|
5
|
+
export type StorageWatchdogOptions = {
|
|
6
|
+
/** How often the connection is asked for. */
|
|
7
|
+
interval?: Duration.Input;
|
|
8
|
+
/** How long a probe may wait for the connection before storage counts as stuck: above any one statement a healthy store runs. */
|
|
9
|
+
stuckAfter?: Duration.Input;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Once the stack is open, asks for the SQLite connection on an interval. Every statement and index pass
|
|
13
|
+
* goes through that one connection, so a probe that cannot get it means nothing more will be saved:
|
|
14
|
+
* {@link Events.StorageStuck} is emitted once, for the embedder to replace the process.
|
|
15
|
+
*/
|
|
16
|
+
export declare const storageWatchdogLayer: ({ interval, stuckAfter, }?: StorageWatchdogOptions) => Layer.Layer<never, never, Hook.Controller | SqlClient.SqlClient>;
|
|
17
|
+
//# sourceMappingURL=storage-watchdog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-watchdog.d.ts","sourceRoot":"","sources":["../../../../../src/internal/storage/storage-watchdog.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAE5C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAElD,OAAO,KAAK,IAAI,MAAM,mBAAmB,CAAC;AAK1C,MAAM,MAAM,sBAAsB,GAAG;IACnC,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;IAC1B,iIAAiI;IACjI,UAAU,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;CAC7B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,+BAG9B,sBAAsB,qEA2BtB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-watchdog.test.d.ts","sourceRoot":"","sources":["../../../../../src/internal/storage/storage-watchdog.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-runtime.d.ts","sourceRoot":"","sources":["../../../../../src/internal/worker/worker-runtime.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,KAAK,SAAS,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAIvD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,cAAc,CAAC;AAI1D,OAAO,EAAuB,0BAA0B,EAAmB,MAAM,iBAAiB,CAAC;AAEnG,OAAO,EAAE,uBAAuB,EAAuB,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAmC,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEvF,OAAO,KAAK,SAAS,MAAM,4BAA4B,CAAC;AAWxD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,gGAAgG;IAChG,WAAW,EAAE,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC3C,+GAA+G;IAC/G,cAAc,EAAE,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;CAC/C,CAAC;AAEF,gGAAgG;AAChG,MAAM,WAAW,aAAa;IAC5B,kFAAkF;IAClF,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC;CACxC;AAWD,MAAM,MAAM,oBAAoB,GAAG;IACjC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,oHAAoH;IACpH,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtC;;OAEG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAC;IAErC;;;OAGG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAE9E;;;OAGG;IACH,0BAA0B,CAAC,EAAE,0BAA0B,CAAC;CACzD,CAAC;AAEF;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,uFAAuF;IACvF,QAAQ,CAAC,KAAK,EAAE,MAAM,UAAU,CAAC,UAAU,CAAC;IAC5C,2HAA2H;IAC3H,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACxG,+EAA+E;IAC/E,QAAQ,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CACrF;;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,kBAElC;CAAG;AAEJ;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,8GAM3B,oBAAoB,KAAG,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,EAAE,KAAK,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"worker-runtime.d.ts","sourceRoot":"","sources":["../../../../../src/internal/worker/worker-runtime.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,KAAK,SAAS,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAIvD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,cAAc,CAAC;AAI1D,OAAO,EAAuB,0BAA0B,EAAmB,MAAM,iBAAiB,CAAC;AAEnG,OAAO,EAAE,uBAAuB,EAAuB,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAmC,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEvF,OAAO,KAAK,SAAS,MAAM,4BAA4B,CAAC;AAWxD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,gGAAgG;IAChG,WAAW,EAAE,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC3C,+GAA+G;IAC/G,cAAc,EAAE,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;CAC/C,CAAC;AAEF,gGAAgG;AAChG,MAAM,WAAW,aAAa;IAC5B,kFAAkF;IAClF,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC;CACxC;AAWD,MAAM,MAAM,oBAAoB,GAAG;IACjC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,oHAAoH;IACpH,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtC;;OAEG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAC;IAErC;;;OAGG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAE9E;;;OAGG;IACH,0BAA0B,CAAC,EAAE,0BAA0B,CAAC;CACzD,CAAC;AAEF;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,uFAAuF;IACvF,QAAQ,CAAC,KAAK,EAAE,MAAM,UAAU,CAAC,UAAU,CAAC;IAC5C,2HAA2H;IAC3H,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACxG,+EAA+E;IAC/E,QAAQ,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CACrF;;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,kBAElC;CAAG;AAEJ;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,8GAM3B,oBAAoB,KAAG,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,EAAE,KAAK,CAAC,KAAK,CAqNnD,CAAC;AAEhD;;GAEG;AACH,eAAO,MAAM,kBAAkB,YACpB,oBAAoB,KAC5B,KAAK,CAAC,KAAK,CAAC,aAAa,EAAE,uBAAuB,CAA4D,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local blob store migrations, keyed `<id>_<name>` as `Migrator.fromRecord` expects. Ids must only ever increase,
|
|
3
|
+
* and an applied migration must never be edited — nothing verifies its contents.
|
|
4
|
+
*/
|
|
5
|
+
export declare const MIGRATIONS: {
|
|
6
|
+
'0001_init': import("effect/Effect").Effect<void, import("effect/sql/SqlError").SqlError, import("effect/sql/SqlClient").SqlClient>;
|
|
7
|
+
};
|
|
8
|
+
/** Own history table per store, since many stores share the client database. */
|
|
9
|
+
export declare const MIGRATIONS_TABLE = "blobs_migrations";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/migrations/blobs/index.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,eAAO,MAAM,UAAU;IACrB,WAAW;CACZ,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,gBAAgB,qBAAqB,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const DXOS_VERSION = "0.
|
|
1
|
+
export declare const DXOS_VERSION = "0.16.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|