@dxos/client-services 0.1.35 → 0.1.36
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/browser/{chunk-H5IXSSI7.mjs → chunk-2AYYVPWN.mjs} +835 -950
- package/dist/lib/browser/chunk-2AYYVPWN.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +9 -11
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/packlets/testing/index.mjs +212 -74
- package/dist/lib/browser/packlets/testing/index.mjs.map +3 -3
- package/dist/lib/node/index.cjs +942 -1058
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/packlets/testing/index.cjs +1089 -1067
- package/dist/lib/node/packlets/testing/index.cjs.map +4 -4
- package/dist/types/src/packlets/identity/identity-manager.d.ts +1 -0
- package/dist/types/src/packlets/identity/identity-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/identity/identity.d.ts +3 -3
- package/dist/types/src/packlets/identity/identity.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts +18 -0
- package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts.map +1 -0
- package/dist/types/src/packlets/invitations/device-invitation-protocol.test.d.ts +2 -0
- package/dist/types/src/packlets/invitations/device-invitation-protocol.test.d.ts.map +1 -0
- package/dist/types/src/packlets/invitations/index.d.ts +4 -4
- package/dist/types/src/packlets/invitations/index.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/invitation-protocol.d.ts +12 -0
- package/dist/types/src/packlets/invitations/invitation-protocol.d.ts.map +1 -0
- package/dist/types/src/packlets/invitations/invitations-handler.d.ts +38 -0
- package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -0
- package/dist/types/src/packlets/invitations/invitations-service.d.ts +13 -15
- package/dist/types/src/packlets/invitations/invitations-service.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts +22 -0
- package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts.map +1 -0
- package/dist/types/src/packlets/invitations/space-invitation-protocol.test.d.ts +2 -0
- package/dist/types/src/packlets/invitations/space-invitation-protocol.test.d.ts.map +1 -0
- package/dist/types/src/packlets/services/service-context.d.ts +6 -4
- package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
- package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/data-space-manager.d.ts +2 -0
- package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/spaces-service.d.ts.map +1 -1
- package/dist/types/src/packlets/testing/invitation-utils.d.ts +31 -2
- package/dist/types/src/packlets/testing/invitation-utils.d.ts.map +1 -1
- package/dist/types/src/packlets/testing/test-builder.d.ts +3 -3
- package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
- package/dist/types/src/packlets/tests/invitations.test.d.ts +2 -0
- package/dist/types/src/packlets/tests/invitations.test.d.ts.map +1 -0
- package/dist/types/src/packlets/vault/worker-runtime.d.ts +2 -0
- package/dist/types/src/packlets/vault/worker-runtime.d.ts.map +1 -1
- package/package.json +30 -30
- package/src/packlets/identity/identity-manager.ts +2 -1
- package/src/packlets/identity/identity.ts +3 -3
- package/src/packlets/invitations/{device-invitations-handler.test.ts → device-invitation-protocol.test.ts} +3 -3
- package/src/packlets/invitations/device-invitation-protocol.ts +83 -0
- package/src/packlets/invitations/index.ts +4 -4
- package/src/packlets/invitations/invitation-protocol.ts +21 -0
- package/src/packlets/invitations/invitations-handler.ts +462 -0
- package/src/packlets/invitations/invitations-service.ts +127 -104
- package/src/packlets/invitations/space-invitation-protocol.test.ts +221 -0
- package/src/packlets/invitations/space-invitation-protocol.ts +117 -0
- package/src/packlets/services/service-context.test.ts +11 -4
- package/src/packlets/services/service-context.ts +40 -19
- package/src/packlets/services/service-host.ts +4 -12
- package/src/packlets/services/service-registry.test.ts +23 -25
- package/src/packlets/spaces/data-space-manager.ts +5 -0
- package/src/packlets/spaces/spaces-service.ts +7 -2
- package/src/packlets/storage/storage.ts +2 -0
- package/src/packlets/testing/invitation-utils.ts +219 -31
- package/src/packlets/testing/test-builder.ts +33 -22
- package/src/packlets/tests/client-services.test.ts +33 -76
- package/src/packlets/tests/halo-profile.test.ts +2 -28
- package/src/packlets/tests/invitations.test.ts +389 -0
- package/src/packlets/tests/spaces-invitations.test.ts +12 -30
- package/src/packlets/tests/spaces.test.ts +30 -28
- package/src/packlets/vault/worker-runtime.ts +4 -0
- package/dist/lib/browser/chunk-H5IXSSI7.mjs.map +0 -7
- package/dist/types/src/packlets/invitations/device-invitations-handler.d.ts +0 -30
- package/dist/types/src/packlets/invitations/device-invitations-handler.d.ts.map +0 -1
- package/dist/types/src/packlets/invitations/device-invitations-handler.test.d.ts +0 -2
- package/dist/types/src/packlets/invitations/device-invitations-handler.test.d.ts.map +0 -1
- package/dist/types/src/packlets/invitations/device-invitations-service.d.ts +0 -13
- package/dist/types/src/packlets/invitations/device-invitations-service.d.ts.map +0 -1
- package/dist/types/src/packlets/invitations/device-invitations-service.test.d.ts +0 -2
- package/dist/types/src/packlets/invitations/device-invitations-service.test.d.ts.map +0 -1
- package/dist/types/src/packlets/invitations/space-invitations-handler.d.ts +0 -26
- package/dist/types/src/packlets/invitations/space-invitations-handler.d.ts.map +0 -1
- package/dist/types/src/packlets/invitations/space-invitations-handler.test.d.ts +0 -2
- package/dist/types/src/packlets/invitations/space-invitations-handler.test.d.ts.map +0 -1
- package/dist/types/src/packlets/invitations/space-invitations-service.d.ts +0 -16
- package/dist/types/src/packlets/invitations/space-invitations-service.d.ts.map +0 -1
- package/dist/types/src/packlets/invitations/space-invitations-service.test.d.ts +0 -2
- package/dist/types/src/packlets/invitations/space-invitations-service.test.d.ts.map +0 -1
- package/src/packlets/invitations/device-invitations-handler.ts +0 -370
- package/src/packlets/invitations/device-invitations-service.test.ts +0 -96
- package/src/packlets/invitations/device-invitations-service.ts +0 -24
- package/src/packlets/invitations/space-invitations-handler.test.ts +0 -246
- package/src/packlets/invitations/space-invitations-handler.ts +0 -463
- package/src/packlets/invitations/space-invitations-service.test.ts +0 -129
- package/src/packlets/invitations/space-invitations-service.ts +0 -35
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../../../src/packlets/testing/index.ts", "../../../../../src/packlets/testing/credential-utils.ts", "../../../../../src/packlets/testing/host-test-builder.ts", "../../../../../src/packlets/services/service-host.ts", "../../../../../src/packlets/deprecated/tracing.ts", "../../../../../src/packlets/devices/devices-service.ts", "../../../../../src/packlets/devtools/devtools.ts", "../../../../../src/packlets/devtools/feeds.ts", "../../../../../src/packlets/devtools/keys.ts", "../../../../../src/packlets/devtools/network.ts", "../../../../../src/packlets/devtools/spaces.ts", "../../../../../src/packlets/identity/authenticator.ts", "../../../../../src/packlets/identity/identity.ts", "../../../../../src/packlets/identity/identity-manager.ts", "../../../../../src/packlets/identity/identity-service.ts", "../../../../../src/packlets/invitations/device-
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nexport * from './credential-utils';\nexport * from './host-test-builder';\nexport * from './invitation-utils';\nexport * from './test-builder';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { createCredential } from '@dxos/credentials';\nimport { Signer } from '@dxos/crypto';\nimport { PublicKey } from '@dxos/keys';\nimport { Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\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 assertion: {\n '@type': 'example.testing.rpc.MessageWithAny',\n payload: {\n '@type': 'google.protobuf.Any',\n value: Buffer.from('test')\n }\n }\n });\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { createDefaultModelFactory } from '@dxos/client';\nimport { Config } from '@dxos/config';\nimport { createCredentialSignerWithChain, CredentialGenerator } from '@dxos/credentials';\nimport {\n SnapshotStore,\n DataPipeline,\n MetadataStore,\n SigningContext,\n SpaceManager,\n valueEncoding\n} from '@dxos/echo-pipeline';\nimport { testLocalDatabase } from '@dxos/echo-pipeline/testing';\nimport { FeedFactory, FeedStore } from '@dxos/feed-store';\nimport { Keyring } from '@dxos/keyring';\nimport { MemorySignalManager, MemorySignalManagerContext } from '@dxos/messaging';\nimport { MemoryTransportFactory, NetworkManager } from '@dxos/network-manager';\nimport { createStorage, Storage, StorageType } from '@dxos/random-access-storage';\n\nimport { ClientServicesHost, ServiceContext } from '../services';\n\n//\n// TODO(burdon): Replace with test builder.\n//\n\nexport const createServiceHost = (config: Config, signalManagerContext: MemorySignalManagerContext) => {\n const networkManager = new NetworkManager({\n signalManager: new MemorySignalManager(signalManagerContext),\n transportFactory: MemoryTransportFactory\n });\n\n return new ClientServicesHost({\n config,\n networkManager\n });\n};\n\nexport const createServiceContext = ({\n signalContext = new MemorySignalManagerContext(),\n storage = createStorage({ type: StorageType.RAM })\n}: {\n signalContext?: MemorySignalManagerContext;\n storage?: Storage;\n} = {}) => {\n const networkManager = new NetworkManager({\n signalManager: new MemorySignalManager(signalContext),\n transportFactory: MemoryTransportFactory\n });\n\n const modelFactory = createDefaultModelFactory();\n return new ServiceContext(storage, networkManager, modelFactory);\n};\n\nexport const createPeers = async (numPeers: number) => {\n const signalContext = new MemorySignalManagerContext();\n\n return await Promise.all(\n Array.from(Array(numPeers)).map(async () => {\n const peer = createServiceContext({ signalContext });\n await peer.open();\n return peer;\n })\n );\n};\n\nexport const createIdentity = async (peer: ServiceContext) => {\n await peer.createIdentity();\n return peer;\n};\n\n// TODO(burdon): Remove @dxos/client-testing.\n// TODO(burdon): Create builder and make configurable.\nexport const syncItemsLocal = async (db1: DataPipeline, db2: DataPipeline) => {\n await testLocalDatabase(db1, db2);\n await testLocalDatabase(db2, db1);\n};\n\nexport class HostTestBuilder {\n public readonly signalContext = new MemorySignalManagerContext();\n\n createPeer(): TestPeer {\n return new TestPeer(this.signalContext);\n }\n}\n\nexport type TestPeerProps = {\n storage?: Storage;\n feedStore?: FeedStore<any>;\n metadataStore?: MetadataStore;\n keyring?: Keyring;\n networkManager?: NetworkManager;\n spaceManager?: SpaceManager;\n snapshotStore?: SnapshotStore;\n};\n\nexport class TestPeer {\n private _props: TestPeerProps = {};\n\n constructor(private readonly signalContext: MemorySignalManagerContext) {}\n\n get storage() {\n return (this._props.storage ??= createStorage({ type: StorageType.RAM }));\n }\n\n get keyring() {\n return (this._props.keyring ??= new Keyring(this.storage.createDirectory('keyring')));\n }\n\n get feedStore() {\n return (this._props.feedStore ??= new FeedStore({\n factory: new FeedFactory({\n root: this.storage.createDirectory('feeds'),\n signer: this.keyring,\n hypercore: {\n valueEncoding\n }\n })\n }));\n }\n\n get metadataStore() {\n return (this._props.metadataStore ??= new MetadataStore(this.storage.createDirectory('metadata')));\n }\n\n get snapshotStore() {\n return (this._props.snapshotStore ??= new SnapshotStore(this.storage.createDirectory('snapshots')));\n }\n\n get networkManager() {\n return (this._props.networkManager ??= new NetworkManager({\n signalManager: new MemorySignalManager(this.signalContext),\n transportFactory: MemoryTransportFactory\n }));\n }\n\n get spaceManager() {\n return (this._props.spaceManager ??= new SpaceManager({\n feedStore: this.feedStore,\n networkManager: this.networkManager\n }));\n }\n}\n\nexport const createSigningContext = async (keyring: Keyring): 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 {\n credential: await new CredentialGenerator(keyring, identityKey, deviceKey).createDeviceAuthorization(deviceKey)\n },\n deviceKey\n ),\n recordCredential: async () => {} // No-op.\n };\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event } from '@dxos/async';\nimport { clientServiceBundle, ClientServices, createDefaultModelFactory, PublicKey } from '@dxos/client';\nimport { Config } from '@dxos/config';\nimport { raise } from '@dxos/debug';\nimport { DataServiceImpl } from '@dxos/echo-pipeline';\nimport { log } from '@dxos/log';\nimport { ModelFactory } from '@dxos/model-factory';\nimport { NetworkManager } from '@dxos/network-manager';\nimport { trace } from '@dxos/protocols';\nimport { SystemStatus } from '@dxos/protocols/proto/dxos/client/services';\nimport { Storage } from '@dxos/random-access-storage';\n\nimport { TracingServiceImpl } from '../deprecated';\nimport { DevicesServiceImpl } from '../devices';\nimport { DevtoolsServiceImpl, DevtoolsHostEvents } from '../devtools';\nimport { IdentityServiceImpl } from '../identity';\nimport { DeviceInvitationsServiceImpl, SpaceInvitationsServiceImpl } from '../invitations';\nimport { NetworkServiceImpl } from '../network';\nimport { SpacesServiceImpl } from '../spaces';\nimport { createStorageObjects } from '../storage';\nimport { SystemServiceImpl } from '../system';\nimport { VaultResourceLock } from '../vault';\nimport { ServiceContext } from './service-context';\nimport { ServiceRegistry } from './service-registry';\n\nexport type ClientServicesHostParams = {\n /**\n * Can be omitted if `initialize` is later called.\n */\n config?: Config;\n modelFactory?: ModelFactory;\n networkManager?: NetworkManager;\n storage?: Storage;\n lockKey?: string;\n};\n\nexport type InitializeOptions = {\n config?: Config;\n networkManager?: NetworkManager;\n};\n\n/**\n * Remote service implementation.\n */\nexport class ClientServicesHost {\n private readonly _resourceLock?: VaultResourceLock;\n private readonly _serviceRegistry: ServiceRegistry<ClientServices>;\n private readonly _systemService: SystemServiceImpl;\n\n private _config?: Config;\n private readonly _statusUpdate = new Event<void>();\n private readonly _modelFactory: ModelFactory;\n private _networkManager?: NetworkManager;\n private _storage?: Storage;\n\n /**\n * @internal\n */\n _serviceContext!: ServiceContext;\n private _opening = false;\n private _open = false;\n\n private readonly _instanceId = PublicKey.random().toHex();\n\n constructor({\n config,\n modelFactory = createDefaultModelFactory(),\n // TODO(burdon): Create ApolloLink abstraction (see Client).\n networkManager,\n storage,\n // TODO(wittjosiah): Turn this on by default.\n lockKey\n }: ClientServicesHostParams = {}) {\n this._storage = storage;\n this._modelFactory = modelFactory;\n\n if (config) {\n this.initialize({ config, networkManager });\n }\n\n this._resourceLock = lockKey\n ? new VaultResourceLock({\n lockKey,\n onAcquire: () => {\n this._opening || this.open();\n },\n onRelease: () => this.close()\n })\n : undefined;\n\n this._systemService = new SystemServiceImpl({\n config: this._config,\n\n statusUpdate: this._statusUpdate,\n\n getCurrentStatus: () => (this.isOpen ? SystemStatus.ACTIVE : SystemStatus.INACTIVE),\n\n onUpdateStatus: async (status: SystemStatus) => {\n if (!this.isOpen && status === SystemStatus.ACTIVE) {\n await this._resourceLock?.acquire();\n } else if (this.isOpen && status === SystemStatus.INACTIVE) {\n await this._resourceLock?.release();\n }\n },\n\n onReset: async () => {\n assert(this._serviceContext, 'service host is closed');\n await this._serviceContext.reset();\n }\n });\n\n // TODO(burdon): Start to think of DMG (dynamic services).\n this._serviceRegistry = new ServiceRegistry<ClientServices>(clientServiceBundle, {\n SystemService: this._systemService\n });\n }\n\n get isOpen() {\n return this._open;\n }\n\n get serviceRegistry() {\n return this._serviceRegistry;\n }\n\n get descriptors() {\n return this._serviceRegistry.descriptors;\n }\n\n get services() {\n return this._serviceRegistry.services;\n }\n\n /**\n * Initialize the service host with the config.\n * Config can also be provided in the constructor.\n * Can only be called once.\n */\n initialize({ config, networkManager }: InitializeOptions) {\n assert(!this._open, 'service host is open');\n\n if (config) {\n assert(!this._config, 'config already set');\n\n this._config = config;\n if (!this._storage) {\n this._storage = createStorageObjects(config.get('runtime.client.storage', {})!).storage;\n }\n }\n\n if (networkManager) {\n assert(!this._networkManager, 'network manager already set');\n this._networkManager = networkManager;\n }\n }\n\n async open() {\n if (this._open) {\n return;\n }\n\n log.trace('dxos.sdk.client-services-host', trace.begin({ id: this._instanceId }));\n\n assert(this._config, 'config not set');\n assert(this._storage, 'storage not set');\n assert(this._networkManager, 'network manager not set');\n\n this._opening = true;\n log('opening...', { lockKey: this._resourceLock?.lockKey });\n await this._resourceLock?.acquire();\n\n // TODO(wittjosiah): Make re-entrant.\n // TODO(burdon): Break into components.\n this._serviceContext = new ServiceContext(this._storage, this._networkManager, this._modelFactory);\n\n // TODO(burdon): Start to think of DMG (dynamic services).\n this._serviceRegistry.setServices({\n SystemService: this._systemService,\n\n IdentityService: new IdentityServiceImpl(this._serviceContext),\n\n DevicesService: new DevicesServiceImpl(this._serviceContext.identityManager),\n\n DeviceInvitationsService: new DeviceInvitationsServiceImpl(\n this._serviceContext.identityManager,\n this._serviceContext.deviceInvitations\n ),\n\n SpaceInvitationsService: new SpaceInvitationsServiceImpl(\n this._serviceContext.identityManager,\n () => this._serviceContext.spaceInvitations ?? raise(new Error('SpaceInvitations not initialized')),\n () => this._serviceContext.dataSpaceManager ?? raise(new Error('SpaceManager not initialized'))\n ),\n\n SpacesService: new SpacesServiceImpl(\n this._serviceContext.identityManager,\n this._serviceContext.spaceManager,\n this._serviceContext.dataServiceSubscriptions,\n async () => {\n await this._serviceContext.initialized.wait();\n return this._serviceContext.dataSpaceManager!;\n }\n ),\n\n DataService: new DataServiceImpl(this._serviceContext.dataServiceSubscriptions),\n\n NetworkService: new NetworkServiceImpl(this._serviceContext.networkManager),\n\n // TODO(burdon): Move to new protobuf definitions.\n TracingService: new TracingServiceImpl(this._config),\n DevtoolsHost: new DevtoolsServiceImpl({\n events: new DevtoolsHostEvents(),\n config: this._config,\n context: this._serviceContext\n })\n });\n\n await this._serviceContext.open();\n this._opening = false;\n this._open = true;\n this._statusUpdate.emit();\n const deviceKey = this._serviceContext.identityManager.identity?.deviceKey;\n log('opened', { deviceKey });\n }\n\n async close() {\n if (!this._open) {\n return;\n }\n\n const deviceKey = this._serviceContext.identityManager.identity?.deviceKey;\n log('closing...', { deviceKey });\n this._serviceRegistry.setServices({ SystemService: this._systemService });\n await this._serviceContext.close();\n this._open = false;\n this._statusUpdate.emit();\n log('closed', { deviceKey });\n\n log.trace('dxos.sdk.client-services-host', trace.end({ id: this._instanceId }));\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Config } from '@dxos/config';\nimport { TracingService } from '@dxos/protocols/proto/dxos/devtools/host';\n\n/**\n * @deprecated\n */\nexport class TracingServiceImpl implements TracingService {\n constructor(private readonly _config: Config) {}\n\n async setTracingOptions() {\n throw new Error('Tracing not available.');\n }\n\n subscribeToRpcTrace(): any {\n throw new Error('Tracing not available.');\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { EventSubscriptions } from '@dxos/async';\nimport { Stream } from '@dxos/codec-protobuf';\nimport { Device, DeviceKind, DevicesService, QueryDevicesResponse } from '@dxos/protocols/proto/dxos/client/services';\nimport { ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';\n\nimport { IdentityManager } from '../identity/identity-manager';\n\nexport class DevicesServiceImpl implements DevicesService {\n constructor(private readonly _identityManager: IdentityManager) {}\n\n updateDevice(request: ProfileDocument): Promise<Device> {\n throw new Error('Method not implemented.');\n }\n\n queryDevices(): Stream<QueryDevicesResponse> {\n return new Stream(({ next }) => {\n const update = () => {\n const deviceKeys = this._identityManager.identity?.authorizedDeviceKeys;\n if (!deviceKeys) {\n next({ devices: [] });\n } else {\n next({\n devices: Array.from(deviceKeys.values()).map((key) => ({\n deviceKey: key,\n kind: this._identityManager.identity?.deviceKey.equals(key) ? DeviceKind.CURRENT : DeviceKind.TRUSTED\n }))\n });\n }\n };\n\n const subscriptions = new EventSubscriptions();\n subscriptions.add(\n this._identityManager.stateUpdate.on(() => {\n update();\n\n if (this._identityManager.identity) {\n subscriptions.add(\n this._identityManager.identity.stateUpdate.on(() => {\n update();\n })\n );\n }\n })\n );\n\n update();\n\n return () => subscriptions.clear();\n });\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Event as AsyncEvent } from '@dxos/async';\nimport { Stream } from '@dxos/codec-protobuf';\nimport { Config } from '@dxos/config';\nimport {\n ClearSnapshotsRequest,\n DevtoolsHost, // TODO(burdon): Rename DevtoolsService\n EnableDebugLoggingRequest,\n EnableDebugLoggingResponse,\n Event,\n GetConfigResponse,\n GetNetworkPeersRequest,\n GetNetworkPeersResponse,\n GetSpaceSnapshotRequest,\n GetSpaceSnapshotResponse,\n ResetStorageRequest,\n SaveSpaceSnapshotRequest,\n SaveSpaceSnapshotResponse,\n SubscribeToCredentialMessagesRequest,\n SubscribeToCredentialMessagesResponse,\n SubscribeToFeedBlocksRequest,\n SubscribeToFeedBlocksResponse,\n SubscribeToFeedsRequest,\n SubscribeToFeedsResponse,\n SubscribeToItemsRequest,\n SubscribeToItemsResponse,\n SubscribeToKeyringKeysRequest,\n SubscribeToKeyringKeysResponse,\n SubscribeToNetworkTopicsResponse,\n SubscribeToSpacesRequest,\n SubscribeToSpacesResponse,\n SubscribeToSignalStatusResponse,\n SignalResponse,\n SubscribeToSwarmInfoResponse\n} from '@dxos/protocols/proto/dxos/devtools/host';\n\nimport { ServiceContext } from '../services';\nimport { subscribeToFeedBlocks, subscribeToFeeds } from './feeds';\nimport { subscribeToKeyringKeys } from './keys';\nimport { subscribeToNetworkStatus, subscribeToSignal, subscribeToSwarmInfo } from './network';\nimport { subscribeToSpaces } from './spaces';\n\nexport class DevtoolsHostEvents {\n readonly ready = new AsyncEvent();\n}\n\nexport type DevtoolsServiceParams = {\n events: DevtoolsHostEvents;\n config: Config;\n context: ServiceContext;\n};\n\n/**\n * @deprecated\n */\nexport class DevtoolsServiceImpl implements DevtoolsHost {\n constructor(private readonly params: DevtoolsServiceParams) {}\n\n events(request: void): Stream<Event> {\n return new Stream<Event>(({ next }) => {\n this.params.events.ready.on(() => {\n next({ ready: {} });\n });\n });\n }\n\n getConfig(request: void): Promise<GetConfigResponse> {\n throw new Error();\n }\n\n resetStorage(request: ResetStorageRequest): Promise<void> {\n throw new Error();\n }\n\n enableDebugLogging(request: EnableDebugLoggingRequest): Promise<EnableDebugLoggingResponse> {\n throw new Error();\n }\n\n disableDebugLogging(request: EnableDebugLoggingRequest): Promise<EnableDebugLoggingResponse> {\n throw new Error();\n }\n\n subscribeToKeyringKeys(request: SubscribeToKeyringKeysRequest): Stream<SubscribeToKeyringKeysResponse> {\n return subscribeToKeyringKeys({ keyring: this.params.context.keyring });\n }\n\n subscribeToCredentialMessages(\n request: SubscribeToCredentialMessagesRequest\n ): Stream<SubscribeToCredentialMessagesResponse> {\n throw new Error();\n }\n\n subscribeToSpaces(request: SubscribeToSpacesRequest): Stream<SubscribeToSpacesResponse> {\n return subscribeToSpaces(this.params.context, request);\n }\n\n subscribeToItems(request: SubscribeToItemsRequest): Stream<SubscribeToItemsResponse> {\n throw new Error();\n }\n\n subscribeToFeeds(request: SubscribeToFeedsRequest): Stream<SubscribeToFeedsResponse> {\n return subscribeToFeeds({ feedStore: this.params.context.feedStore }, request);\n }\n\n subscribeToFeedBlocks(request: SubscribeToFeedBlocksRequest): Stream<SubscribeToFeedBlocksResponse> {\n return subscribeToFeedBlocks({ feedStore: this.params.context.feedStore }, request);\n }\n\n getSpaceSnapshot(request: GetSpaceSnapshotRequest): Promise<GetSpaceSnapshotResponse> {\n throw new Error();\n }\n\n saveSpaceSnapshot(request: SaveSpaceSnapshotRequest): Promise<SaveSpaceSnapshotResponse> {\n throw new Error();\n }\n\n clearSnapshots(request: ClearSnapshotsRequest): Promise<void> {\n throw new Error();\n }\n\n getNetworkPeers(request: GetNetworkPeersRequest): Promise<GetNetworkPeersResponse> {\n throw new Error();\n }\n\n subscribeToNetworkTopics(request: void): Stream<SubscribeToNetworkTopicsResponse> {\n throw new Error();\n }\n\n subscribeToSignalStatus(request: void): Stream<SubscribeToSignalStatusResponse> {\n return subscribeToNetworkStatus({ networkManager: this.params.context.networkManager });\n }\n\n subscribeToSignal(): Stream<SignalResponse> {\n return subscribeToSignal({ networkManager: this.params.context.networkManager });\n }\n\n subscribeToSwarmInfo(): Stream<SubscribeToSwarmInfoResponse> {\n return subscribeToSwarmInfo({ networkManager: this.params.context.networkManager });\n }\n}\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { EventSubscriptions } from '@dxos/async';\nimport { Stream } from '@dxos/codec-protobuf';\nimport { FeedIterator, FeedStore, FeedWrapper } from '@dxos/feed-store';\nimport { PublicKey } from '@dxos/keys';\nimport {\n SubscribeToFeedsRequest,\n SubscribeToFeedsResponse,\n SubscribeToFeedBlocksRequest,\n SubscribeToFeedBlocksResponse\n} from '@dxos/protocols/proto/dxos/devtools/host';\nimport { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { ComplexMap } from '@dxos/util';\n\nexport const subscribeToFeeds = (\n { feedStore }: { feedStore: FeedStore<FeedMessage> },\n { feedKeys }: SubscribeToFeedsRequest\n) => {\n return new Stream<SubscribeToFeedsResponse>(({ next }) => {\n if (feedKeys?.length === 0) {\n return;\n }\n\n const subscriptions = new EventSubscriptions();\n const feedMap = new ComplexMap<PublicKey, FeedWrapper<FeedMessage>>(PublicKey.hash);\n\n const update = () => {\n const { feeds } = feedStore;\n feeds\n .filter((feed) => !feedKeys?.length || feedKeys.some((feedKey) => feedKey.equals(feed.key)))\n .forEach((feed) => {\n if (!feedMap.has(feed.key)) {\n feedMap.set(feed.key, feed);\n feed.on('close', update);\n subscriptions.add(feed.off('close', update));\n }\n });\n\n next({\n feeds: Array.from(feedMap.values()).map((feed) => ({ feedKey: feed.key, length: feed.properties.length }))\n });\n };\n\n subscriptions.add(feedStore.feedOpened.on(update));\n update();\n\n return () => {\n subscriptions.clear();\n };\n });\n};\n\nexport const subscribeToFeedBlocks = (\n { feedStore }: { feedStore: FeedStore<FeedMessage> },\n { feedKey, maxBlocks = 10 }: SubscribeToFeedBlocksRequest\n) => {\n return new Stream<SubscribeToFeedBlocksResponse>(({ next }) => {\n if (!feedKey) {\n return;\n }\n const subscriptions = new EventSubscriptions();\n\n const timeout = setTimeout(async () => {\n const feed = feedStore.getFeed(feedKey);\n if (!feed) {\n return;\n }\n\n const update = async () => {\n const iterator = new FeedIterator(feed);\n await iterator.open();\n const blocks = [];\n for await (const block of iterator) {\n blocks.push(block);\n if (blocks.length >= feed.properties.length) {\n break;\n }\n }\n\n next({\n blocks: blocks.slice(-maxBlocks)\n });\n\n await iterator.close();\n };\n\n feed.on('append', update);\n subscriptions.add(() => feed.off('append', update));\n\n feed.on('truncate', update);\n subscriptions.add(() => feed.off('truncate', update));\n await update();\n });\n\n return () => {\n subscriptions.clear();\n clearTimeout(timeout);\n };\n });\n};\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { Keyring } from '@dxos/keyring';\nimport { SubscribeToKeyringKeysResponse } from '@dxos/protocols/proto/dxos/devtools/host';\n\nexport const subscribeToKeyringKeys = ({ keyring }: { keyring: Keyring }) =>\n new Stream<SubscribeToKeyringKeysResponse>(({ next }) => {\n const update = () => {\n next({\n keys: keyring.list()\n });\n };\n const unsubscribe = keyring.keysUpdate.on(update);\n update();\n return unsubscribe;\n });\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { PublicKey } from '@dxos/keys';\nimport { NetworkManager } from '@dxos/network-manager';\nimport {\n GetNetworkPeersRequest,\n GetNetworkPeersResponse,\n SubscribeToNetworkTopicsResponse,\n SubscribeToSignalStatusResponse,\n SignalResponse,\n SubscribeToSwarmInfoResponse\n} from '@dxos/protocols/proto/dxos/devtools/host';\n\nexport const subscribeToNetworkStatus = ({ networkManager }: { networkManager: NetworkManager }) =>\n new Stream<SubscribeToSignalStatusResponse>(({ next, close }) => {\n const update = () => {\n try {\n const status = networkManager.signalManager.getStatus();\n next({ servers: status });\n } catch (err: any) {\n close(err);\n }\n };\n\n networkManager.signalManager.statusChanged.on(update);\n update();\n });\n\nexport const subscribeToSignal = ({ networkManager }: { networkManager: NetworkManager }) =>\n new Stream<SignalResponse>(({ next }) => {\n const ctx = new Context();\n networkManager.signalManager.onMessage.on(ctx, (message) => {\n next({\n message: {\n author: message.author.asUint8Array(),\n recipient: message.recipient.asUint8Array(),\n payload: message.payload\n },\n receivedAt: new Date()\n });\n });\n networkManager.signalManager.swarmEvent.on(ctx, (swarmEvent) => {\n next({ swarmEvent: swarmEvent.swarmEvent, receivedAt: new Date() });\n });\n return () => {\n return ctx.dispose();\n };\n });\n\nexport const subscribeToNetworkTopics = ({ networkManager }: { networkManager: NetworkManager }) =>\n new Stream<SubscribeToNetworkTopicsResponse>(({ next, close }) => {\n const update = () => {\n try {\n const topics = networkManager.topics;\n const labeledTopics = topics.map((topic) => ({\n topic,\n label: networkManager.getSwarm(topic)?.label ?? topic.toHex()\n }));\n next({ topics: labeledTopics });\n } catch (err: any) {\n close(err);\n }\n };\n networkManager.topicsUpdated.on(update);\n\n update();\n });\n\nexport const subscribeToSwarmInfo = ({ networkManager }: { networkManager: NetworkManager }) =>\n new Stream<SubscribeToSwarmInfoResponse>(({ next }) => {\n const update = () => {\n const info = networkManager.connectionLog?.swarms;\n if (info) {\n next({ data: info });\n }\n };\n networkManager.connectionLog?.update.on(update);\n update();\n });\n\nexport const getNetworkPeers = (\n { networkManager }: { networkManager: NetworkManager },\n request: GetNetworkPeersRequest\n): GetNetworkPeersResponse => {\n if (!request.topic) {\n throw new Error('Expected a network topic');\n }\n\n const map = networkManager.getSwarmMap(PublicKey.from(request.topic));\n return {\n peers: map?.peers.map((peer) => ({\n ...peer,\n connections: peer.connections.map((connection) => connection.asUint8Array())\n }))\n };\n};\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { Space } from '@dxos/echo-pipeline';\nimport { SubscribeToSpacesRequest, SubscribeToSpacesResponse } from '@dxos/protocols/proto/dxos/devtools/host';\nimport { SpaceMetadata } from '@dxos/protocols/proto/dxos/echo/metadata';\n\nimport { ServiceContext } from '../services';\n\nexport const subscribeToSpaces = (context: ServiceContext, { spaceKeys = [] }: SubscribeToSpacesRequest) => {\n return new Stream<SubscribeToSpacesResponse>(({ next }) => {\n let unsubscribe: () => void;\n\n const update = async () => {\n const spaces: Space[] = [...context.spaceManager!.spaces.values()];\n const filteredSpaces = spaces.filter(\n (space) => !spaceKeys?.length || spaceKeys.some((spaceKey) => spaceKey.equals(space.key))\n );\n\n next({\n spaces: filteredSpaces.map((space): SubscribeToSpacesResponse.SpaceInfo => {\n const spaceMetadata = context.metadataStore.spaces.find((spaceMetadata: SpaceMetadata) =>\n spaceMetadata.key.equals(space.key)\n );\n\n return {\n key: space.key,\n isOpen: space.isOpen,\n timeframe: spaceMetadata?.dataTimeframe,\n genesisFeed: space.genesisFeedKey,\n controlFeed: space.controlFeedKey!, // TODO(dmaretskyi): Those keys may be missing.\n dataFeed: space.dataFeedKey!\n };\n })\n });\n };\n\n const timeout = setTimeout(async () => {\n await context.initialized.wait();\n unsubscribe = context.dataSpaceManager!.updated.on(() => update());\n\n // Send initial spaces.\n await update();\n });\n\n return () => {\n unsubscribe?.();\n clearTimeout(timeout);\n };\n });\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Event, Trigger } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { verifyCredential, CredentialSigner } from '@dxos/credentials';\nimport { AuthProvider, AuthVerifier } from '@dxos/echo-pipeline';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { schema } from '@dxos/protocols';\nimport { ComplexSet } from '@dxos/util';\n\nexport const createAuthProvider =\n (signer: CredentialSigner): AuthProvider =>\n async (nonce) => {\n const credential = await signer.createCredential({\n assertion: {\n '@type': 'dxos.halo.credentials.Auth'\n },\n subject: signer.getIssuer(),\n nonce\n });\n\n return schema.getCodecForType('dxos.halo.credentials.Credential').encode(credential);\n };\n\nexport type TrustedKeySetAuthVerifierParams = {\n // TODO(dmaretskyi): Change to `isTrusted: (key) => bool`.\n trustedKeysProvider: () => ComplexSet<PublicKey>;\n update: Event<void>;\n /**\n * Timeout to wait for the device key to be added to the trusted set.\n */\n authTimeout: number;\n};\n\n/**\n * Verifies credentials of another member in the space based on a set of trusted key.\n * Will wait up to `authTimeout` for the key to be added to the trusted set.\n */\nexport class TrustedKeySetAuthVerifier {\n private _ctx = new Context();\n\n // prettier-ignore\n constructor(\n private readonly _params: TrustedKeySetAuthVerifierParams\n ) {}\n\n async close() {\n await this._ctx.dispose();\n }\n\n get verifier(): AuthVerifier {\n return async (nonce, auth) => {\n const credential = schema.getCodecForType('dxos.halo.credentials.Credential').decode(auth);\n log('authenticating...', { credential });\n\n const result = await verifyCredential(credential);\n if (result.kind === 'fail') {\n log('Invalid credential', { result });\n return false;\n }\n\n if (!credential.proof.nonce || !Buffer.from(nonce).equals(credential.proof.nonce)) {\n log('Invalid nonce', { nonce, credential });\n return false;\n }\n\n if (this._isTrustedKey(credential.issuer)) {\n log('key is not currently in trusted set, waiting...', { key: credential.issuer });\n return true;\n }\n\n const trigger = new Trigger<boolean>();\n this._ctx.onDispose(() => {\n trigger.wake(false);\n });\n\n const clear = this._params.update.on(this._ctx, () => {\n if (this._isTrustedKey(credential.issuer)) {\n log('auth success', { key: credential.issuer });\n trigger.wake(true);\n } else {\n log('key is not currently in trusted set, waiting...', { key: credential.issuer });\n }\n });\n\n try {\n return await trigger.wait({ timeout: this._params.authTimeout });\n } catch {\n return false;\n } finally {\n clear();\n }\n };\n }\n\n private _isTrustedKey(deviceKey: PublicKey) {\n const deviceSet = this._params.trustedKeysProvider();\n return deviceSet.has(deviceKey);\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event } from '@dxos/async';\nimport {\n DeviceStateMachine,\n CredentialSigner,\n createCredentialSignerWithKey,\n createCredentialSignerWithChain,\n ProfileStateMachine,\n CredentialConsumer\n} from '@dxos/credentials';\nimport { Signer } from '@dxos/crypto';\nimport { failUndefined } from '@dxos/debug';\nimport { Space } from '@dxos/echo-pipeline';\nimport { writeMessages } from '@dxos/feed-store';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { AdmittedFeed, ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { HaloAdmissionCredentials } from '@dxos/protocols/proto/dxos/halo/invitations';\nimport { ComplexSet } from '@dxos/util';\n\nimport { TrustedKeySetAuthVerifier } from './authenticator';\n\n/**\n * Timeout for the device to be added to the trusted set during auth.\n */\nconst AUTH_TIMEOUT = 30000;\n\nexport type IdentityParams = {\n identityKey: PublicKey;\n deviceKey: PublicKey;\n signer: Signer;\n space: Space;\n};\n\n/**\n * Agent identity manager, which includes the agent's Halo space.\n */\nexport class Identity {\n public readonly space: Space;\n private readonly _signer: Signer;\n private readonly _deviceStateMachine: CredentialConsumer<DeviceStateMachine>;\n private readonly _profileStateMachine: CredentialConsumer<ProfileStateMachine>;\n public readonly authVerifier: TrustedKeySetAuthVerifier;\n\n public readonly identityKey: PublicKey;\n public readonly deviceKey: PublicKey;\n\n public readonly stateUpdate = new Event();\n\n constructor({ space, signer, identityKey, deviceKey }: IdentityParams) {\n this.space = space;\n this._signer = signer;\n\n this.identityKey = identityKey;\n this.deviceKey = deviceKey;\n\n this._deviceStateMachine = this.space.spaceState.registerProcessor(\n new DeviceStateMachine({\n identityKey: this.identityKey,\n deviceKey: this.deviceKey,\n onUpdate: () => this.stateUpdate.emit()\n })\n );\n this._profileStateMachine = this.space.spaceState.registerProcessor(\n new ProfileStateMachine({\n identityKey: this.identityKey,\n onUpdate: () => this.stateUpdate.emit()\n })\n );\n\n this.authVerifier = new TrustedKeySetAuthVerifier({\n trustedKeysProvider: () => this.authorizedDeviceKeys,\n update: this.stateUpdate,\n authTimeout: AUTH_TIMEOUT\n });\n }\n\n // TODO(burdon): Expose state object?\n get authorizedDeviceKeys(): ComplexSet<PublicKey> {\n return this._deviceStateMachine.processor.authorizedDeviceKeys;\n }\n\n async open() {\n await this._deviceStateMachine.open();\n await this._profileStateMachine.open();\n await this.space.open();\n }\n\n async close() {\n await this.authVerifier.close();\n await this._deviceStateMachine.close();\n await this._profileStateMachine.close();\n await this.space.close();\n }\n\n async ready() {\n await this._deviceStateMachine.processor.deviceChainReady.wait();\n\n await this.controlPipeline.state.waitUntilReachedTargetTimeframe({ timeout: 3_000 });\n }\n\n get profileDocument(): ProfileDocument | undefined {\n return this._profileStateMachine.processor.profile;\n }\n\n /**\n * @test-only\n */\n get controlPipeline() {\n return this.space.controlPipeline;\n }\n\n get haloSpaceKey() {\n return this.space.key;\n }\n\n get haloGenesisFeedKey() {\n return this.space.genesisFeedKey;\n }\n\n get deviceCredentialChain() {\n return this._deviceStateMachine.processor.deviceCredentialChain;\n }\n\n getAdmissionCredentials(): HaloAdmissionCredentials {\n return {\n deviceKey: this.deviceKey,\n controlFeedKey: this.space.controlFeedKey ?? failUndefined(),\n dataFeedKey: this.space.dataFeedKey ?? failUndefined()\n };\n }\n\n /**\n * Issues credentials as identity.\n * Requires identity to be ready.\n */\n getIdentityCredentialSigner(): CredentialSigner {\n assert(this._deviceStateMachine.processor.deviceCredentialChain, 'Device credential chain is not ready.');\n return createCredentialSignerWithChain(\n this._signer,\n this._deviceStateMachine.processor.deviceCredentialChain,\n this.deviceKey\n );\n }\n\n /**\n * Issues credentials as device.\n */\n getDeviceCredentialSigner(): CredentialSigner {\n return createCredentialSignerWithKey(this._signer, this.deviceKey);\n }\n\n async admitDevice({ deviceKey, controlFeedKey, dataFeedKey }: HaloAdmissionCredentials) {\n log('Admitting device:', {\n identityKey: this.identityKey,\n hostDevice: this.deviceKey,\n deviceKey,\n controlFeedKey,\n dataFeedKey\n });\n const signer = this.getIdentityCredentialSigner();\n await writeMessages(\n this.controlPipeline.writer,\n [\n await signer.createCredential({\n subject: deviceKey,\n assertion: {\n '@type': 'dxos.halo.credentials.AuthorizedDevice',\n identityKey: this.identityKey,\n deviceKey\n }\n }),\n await signer.createCredential({\n subject: controlFeedKey,\n assertion: {\n '@type': 'dxos.halo.credentials.AdmittedFeed',\n spaceKey: this.haloSpaceKey,\n deviceKey,\n identityKey: this.identityKey,\n designation: AdmittedFeed.Designation.CONTROL\n }\n }),\n await signer.createCredential({\n subject: dataFeedKey,\n assertion: {\n '@type': 'dxos.halo.credentials.AdmittedFeed',\n spaceKey: this.haloSpaceKey,\n deviceKey,\n identityKey: this.identityKey,\n designation: AdmittedFeed.Designation.DATA\n }\n })\n ].map((credential): FeedMessage.Payload => ({ credential: { credential } }))\n );\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event } from '@dxos/async';\nimport { createCredentialSignerWithKey, CredentialGenerator } from '@dxos/credentials';\nimport { MetadataStore, SpaceManager, SwarmIdentity } from '@dxos/echo-pipeline';\nimport { FeedStore } from '@dxos/feed-store';\nimport { Keyring } from '@dxos/keyring';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/protocols';\nimport { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { IdentityRecord, SpaceMetadata } from '@dxos/protocols/proto/dxos/echo/metadata';\nimport { AdmittedFeed } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { Timeframe } from '@dxos/timeframe';\nimport { deferFunction } from '@dxos/util';\n\nimport { createAuthProvider } from './authenticator';\nimport { Identity } from './identity';\n\ninterface ConstructSpaceParams {\n spaceRecord: SpaceMetadata;\n swarmIdentity: SwarmIdentity;\n identityKey: PublicKey;\n}\n\nexport type JoinIdentityParams = {\n identityKey: PublicKey;\n deviceKey: PublicKey;\n haloSpaceKey: PublicKey;\n haloGenesisFeedKey: PublicKey;\n controlFeedKey: PublicKey;\n dataFeedKey: PublicKey;\n\n /**\n * Latest known timeframe for the control pipeline.\n * We will try to catch up to this timeframe before starting the data pipeline.\n */\n controlTimeframe?: Timeframe;\n};\n\nexport type CreateIdentityOptions = {\n displayName?: string;\n};\n\n// TODO(dmaretskyi): Rename: represents the peer's state machine.\nexport class IdentityManager {\n readonly stateUpdate = new Event();\n\n private _identity?: Identity;\n\n private readonly _instanceId = PublicKey.random().toHex();\n\n // TODO(burdon): IdentityManagerParams.\n // TODO(dmaretskyi): Perhaps this should take/generate the peerKey outside of an initialized identity.\n constructor(\n private readonly _metadataStore: MetadataStore,\n private readonly _keyring: Keyring,\n private readonly _feedStore: FeedStore<FeedMessage>,\n private readonly _spaceManager: SpaceManager\n ) {}\n\n get identity() {\n return this._identity;\n }\n\n async open() {\n log.trace('dxos.halo.identity-manager', trace.begin({ id: this._instanceId }));\n await this._metadataStore.load();\n\n const identityRecord = this._metadataStore.getIdentityRecord();\n log('identity record', { identityRecord });\n if (identityRecord) {\n this._identity = await this._constructIdentity(identityRecord);\n await this._identity.open();\n await this._identity.ready();\n log.trace('dxos.halo.identity', {\n identityKey: identityRecord.identityKey,\n displayName: this._identity.profileDocument?.displayName\n });\n this.stateUpdate.emit();\n }\n }\n\n async close() {\n await this._identity?.close();\n log.trace('dxos.halo.identity-manager', trace.end({ id: this._instanceId }));\n }\n\n async createIdentity({ displayName }: CreateIdentityOptions = {}) {\n assert(!this._identity, 'Identity already exists.');\n log('creating identity...');\n\n const controlFeedKey = await this._keyring.createKey();\n const identityRecord: IdentityRecord = {\n identityKey: await this._keyring.createKey(),\n deviceKey: await this._keyring.createKey(),\n haloSpace: {\n key: await this._keyring.createKey(),\n genesisFeedKey: controlFeedKey,\n controlFeedKey,\n dataFeedKey: await this._keyring.createKey()\n }\n };\n\n const identity = await this._constructIdentity(identityRecord);\n await identity.open();\n\n {\n const generator = new CredentialGenerator(this._keyring, identityRecord.identityKey, identityRecord.deviceKey);\n assert(identityRecord.haloSpace.genesisFeedKey, 'Genesis feed key is required.');\n assert(identityRecord.haloSpace.dataFeedKey, 'Data feed key is required.');\n const credentials = [\n // Space genesis.\n ...(await generator.createSpaceGenesis(identityRecord.haloSpace.key, identityRecord.haloSpace.genesisFeedKey)),\n\n // Feed admission.\n await generator.createFeedAdmission(\n identityRecord.haloSpace.key,\n identityRecord.haloSpace.dataFeedKey,\n AdmittedFeed.Designation.DATA\n )\n ];\n\n if (displayName) {\n credentials.push(await generator.createProfileCredential({ displayName }));\n }\n\n // Device authorization (writes device chain).\n // NOTE: This credential is written last. This is a hack to make sure that display name is set before identity is \"ready\".\n credentials.push(await generator.createDeviceAuthorization(identityRecord.deviceKey));\n\n for (const credential of credentials) {\n await identity.controlPipeline.writer.write({\n credential: { credential }\n });\n }\n }\n\n // TODO(burdon): ???\n // await this._keyring.deleteKey(identityRecord.identity_key);\n // await this._keyring.deleteKey(identityRecord.halo_space.space_key);\n\n await this._metadataStore.setIdentityRecord(identityRecord);\n this._identity = identity;\n await this._identity.ready();\n log.trace('dxos.halo.identity', {\n identityKey: identityRecord.identityKey,\n displayName: this._identity.profileDocument?.displayName\n });\n this.stateUpdate.emit();\n\n log('created identity', { identityKey: identity.identityKey, deviceKey: identity.deviceKey });\n return identity;\n }\n\n /**\n * Accept an existing identity. Expects it's device key to be authorized (now or later).\n */\n async acceptIdentity(params: JoinIdentityParams) {\n log('accepting identity', { params });\n assert(!this._identity, 'Identity already exists.');\n\n const identityRecord: IdentityRecord = {\n identityKey: params.identityKey,\n deviceKey: params.deviceKey,\n haloSpace: {\n key: params.haloSpaceKey,\n genesisFeedKey: params.haloGenesisFeedKey,\n controlFeedKey: params.controlFeedKey,\n dataFeedKey: params.dataFeedKey,\n controlTimeframe: params.controlTimeframe\n }\n };\n const identity = await this._constructIdentity(identityRecord);\n\n await identity.open();\n this._identity = identity;\n await this._metadataStore.setIdentityRecord(identityRecord);\n await this._identity.ready();\n log.trace('dxos.halo.identity', {\n identityKey: identityRecord.identityKey,\n displayName: this._identity.profileDocument?.displayName\n });\n\n this.stateUpdate.emit();\n log('accepted identity', { identityKey: identity.identityKey, deviceKey: identity.deviceKey });\n return identity;\n }\n\n private async _constructIdentity(identityRecord: IdentityRecord) {\n assert(!this._identity);\n log('constructing identity', { identityRecord });\n\n // Must be created before the space so the feeds are writable.\n assert(identityRecord.haloSpace.controlFeedKey);\n const controlFeed = await this._feedStore.openFeed(identityRecord.haloSpace.controlFeedKey, {\n writable: true\n });\n assert(identityRecord.haloSpace.dataFeedKey);\n const dataFeed = await this._feedStore.openFeed(identityRecord.haloSpace.dataFeedKey, { writable: true });\n\n const space = await this._constructSpace({\n spaceRecord: identityRecord.haloSpace,\n swarmIdentity: {\n peerKey: identityRecord.deviceKey,\n credentialProvider: createAuthProvider(createCredentialSignerWithKey(this._keyring, identityRecord.deviceKey)),\n credentialAuthenticator: deferFunction(() => identity.authVerifier.verifier)\n },\n identityKey: identityRecord.identityKey\n });\n space.setControlFeed(controlFeed);\n space.setDataFeed(dataFeed);\n\n const identity: Identity = new Identity({\n space,\n signer: this._keyring,\n identityKey: identityRecord.identityKey,\n deviceKey: identityRecord.deviceKey\n });\n log('done', { identityKey: identityRecord.identityKey });\n\n // TODO(mykola): Set new timeframe on a write to a feed.\n if (identityRecord.haloSpace.controlTimeframe) {\n identity.controlPipeline.state.setTargetTimeframe(identityRecord.haloSpace.controlTimeframe);\n }\n\n return identity;\n }\n\n private async _constructSpace({ spaceRecord, swarmIdentity, identityKey }: ConstructSpaceParams) {\n return this._spaceManager.constructSpace({\n metadata: {\n key: spaceRecord.key,\n genesisFeedKey: spaceRecord.genesisFeedKey\n },\n swarmIdentity,\n onNetworkConnection: () => {}\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { signPresentation } from '@dxos/credentials';\nimport { todo } from '@dxos/debug';\nimport {\n Identity,\n IdentityService,\n QueryIdentityResponse,\n RecoverIdentityRequest,\n SignPresentationRequest\n} from '@dxos/protocols/proto/dxos/client/services';\nimport { Presentation, ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';\n\nimport { ServiceContext } from '../services';\n\nexport class IdentityServiceImpl implements IdentityService {\n // TODO(wittjosiah): Remove dependency on service context.\n constructor(private readonly _serviceContext: ServiceContext) {}\n\n async createIdentity(request: ProfileDocument): Promise<Identity> {\n await this._serviceContext.createIdentity(request);\n\n return this._getIdentity()!;\n }\n\n async recoverIdentity(request: RecoverIdentityRequest): Promise<Identity> {\n return todo();\n }\n\n queryIdentity(): Stream<QueryIdentityResponse> {\n return new Stream(({ next }) => {\n const emitNext = () => next({ identity: this._getIdentity() });\n\n emitNext();\n return this._serviceContext.identityManager.stateUpdate.on(emitNext);\n });\n }\n\n private _getIdentity(): Identity | undefined {\n if (!this._serviceContext.identityManager.identity) {\n return undefined;\n }\n\n return {\n identityKey: this._serviceContext.identityManager.identity.identityKey,\n spaceKey: this._serviceContext.identityManager.identity.space.key,\n profile: this._serviceContext.identityManager.identity.profileDocument\n };\n }\n\n async signPresentation({ presentation, nonce }: SignPresentationRequest): Promise<Presentation> {\n assert(this._serviceContext.identityManager.identity, 'Identity not initialized.');\n\n return await signPresentation({\n presentation,\n signer: this._serviceContext.keyring,\n signerKey: this._serviceContext.identityManager.identity.deviceKey,\n chain: this._serviceContext.identityManager.identity.deviceCredentialChain,\n nonce\n });\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { scheduleTask, sleep, Trigger } from '@dxos/async';\nimport {\n AbstractInvitationsHandler,\n AuthenticatingInvitationProvider,\n AUTHENTICATION_CODE_LENGTH,\n CancellableInvitationObservable,\n InvitationObservableProvider,\n InvitationsOptions,\n INVITATION_TIMEOUT,\n ON_CLOSE_DELAY\n} from '@dxos/client';\nimport { Context } from '@dxos/context';\nimport { generatePasscode } from '@dxos/credentials';\nimport { Keyring } from '@dxos/keyring';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { createTeleportProtocolFactory, NetworkManager, StarTopology } from '@dxos/network-manager';\nimport { schema } from '@dxos/protocols';\nimport { Invitation } from '@dxos/protocols/proto/dxos/client/services';\nimport {\n AuthenticationRequest,\n AuthenticationResponse,\n HaloAdmissionCredentials,\n HaloAdmissionOffer,\n HaloHostService\n} from '@dxos/protocols/proto/dxos/halo/invitations';\nimport { ExtensionContext, RpcExtension } from '@dxos/teleport';\n\nimport { Identity, JoinIdentityParams } from '../identity';\n\ntype DeviceInvitationsHandlerParams = {\n networkManager: NetworkManager;\n keyring: Keyring;\n\n getIdentity: () => Identity;\n acceptIdentity: (identity: JoinIdentityParams) => Promise<Identity>;\n};\n\n/**\n * Handles the life-cycle of device invitations between peers.\n */\n// TODO(dmaretskyi): Split into Host and Guest parts.\nexport class DeviceInvitationsHandler extends AbstractInvitationsHandler {\n // prettier-ignore\n constructor(\n private readonly _params: DeviceInvitationsHandlerParams\n ) {\n super(_params.networkManager);\n }\n\n /**\n * Creates an invitation and listens for a join request from the invited (guest) peer.\n */\n createInvitation(context: void, options?: InvitationsOptions): CancellableInvitationObservable {\n const { type, timeout = INVITATION_TIMEOUT, swarmKey } = options ?? {};\n assert(type !== Invitation.Type.OFFLINE);\n const identity = this._params.getIdentity();\n\n // TODO(dmaretskyi): Add invitation kind: halo/space.\n const invitation: Invitation = {\n type,\n invitationId: PublicKey.random().toHex(),\n swarmKey: swarmKey ?? PublicKey.random(),\n authenticationCode: generatePasscode(AUTHENTICATION_CODE_LENGTH)\n };\n\n const ctx = new Context({\n onError: (err) => {\n void ctx.dispose();\n observable.callback.onError(err);\n }\n });\n\n // TODO(burdon): Stop anything pending.\n const observable = new InvitationObservableProvider(async () => {\n await ctx.dispose();\n });\n\n let authenticationCode: string;\n const complete = new Trigger<PublicKey>();\n\n // Called for every connecting peer.\n const createExtension = () =>\n new HostHaloInvitationExtension({\n requestAdmission: async () => {\n log('responding with admission offer', {\n host: identity.deviceKey\n });\n\n // TODO(burdon): Is this the right place to set this state?\n observable.callback.onAuthenticating?.(invitation);\n return {\n identityKey: identity.identityKey,\n haloSpaceKey: identity.haloSpaceKey,\n genesisFeedKey: identity.haloGenesisFeedKey,\n controlTimeframe: identity.controlPipeline.state.timeframe\n };\n },\n\n authenticate: async ({ authenticationCode: code }) => {\n log('received authentication request', { authenticationCode: code });\n authenticationCode = code;\n return { status: AuthenticationResponse.Status.OK };\n },\n\n // TODO(burdon): Not used: controlFeedKey, dataFeedKey.\n presentAdmissionCredentials: async (credentials) => {\n try {\n // Check authenticated.\n if (invitation.type !== Invitation.Type.INTERACTIVE_TESTING) {\n if (invitation.authenticationCode === undefined || invitation.authenticationCode !== authenticationCode) {\n throw new Error(`invalid authentication code: ${authenticationCode}`);\n }\n }\n\n log('writing guest credentials', { host: identity.deviceKey, guest: credentials.deviceKey });\n // TODO(burdon): Check if already admitted.\n await identity.admitDevice(credentials);\n\n // Updating credentials complete.\n complete.wake(credentials.deviceKey);\n } catch (err) {\n // TODO(burdon): Generic RPC callback to report error to client.\n observable.callback.onError(err);\n throw err; // Propagate error to guest.\n }\n },\n\n onOpen: () => {\n scheduleTask(ctx, async () => {\n try {\n log('connected', { host: identity.deviceKey });\n observable.callback.onConnected?.(invitation);\n const deviceKey = await complete.wait({ timeout });\n log('admitted guest', { host: identity.deviceKey, guest: deviceKey });\n observable.callback.onSuccess(invitation);\n } catch (err) {\n if (!observable.cancelled) {\n log.error('failed', err);\n observable.callback.onError(err);\n }\n } finally {\n // NOTE: If we close immediately after `complete` trigger finishes, Guest won't receive the reply to the last RPC.\n // TODO(dmaretskyi): Implement a soft-close which waits for the last connection to terminate before closing.\n await sleep(ON_CLOSE_DELAY);\n await ctx.dispose();\n }\n });\n }\n });\n\n scheduleTask(ctx, async () => {\n const topic = invitation.swarmKey!;\n const swarmConnection = await this._networkManager.joinSwarm({\n topic,\n peerId: topic,\n protocolProvider: createTeleportProtocolFactory(async (teleport) => {\n teleport.addExtension('dxos.halo.invitations', createExtension());\n }),\n topology: new StarTopology(topic)\n });\n ctx.onDispose(() => swarmConnection.close());\n\n observable.callback.onConnecting?.(invitation);\n });\n\n return observable;\n }\n\n /**\n * Waits for the host peer (inviter) to accept our join request.\n * The local guest peer (invitee) then sends the local halo invitation to the host,\n * which then writes the guest's credentials to the halo.\n */\n acceptInvitation(invitation: Invitation, options?: InvitationsOptions): AuthenticatingInvitationProvider {\n const { timeout = INVITATION_TIMEOUT } = options ?? {};\n\n const ctx = new Context({\n onError: (err) => {\n void ctx.dispose();\n observable.callback.onError(err);\n }\n });\n\n const authenticated = new Trigger<string>();\n const observable = new AuthenticatingInvitationProvider({\n onCancel: async () => {\n await ctx.dispose();\n },\n\n // TODO(burdon): Consider retry.\n onAuthenticate: async (code: string) => {\n authenticated.wake(code);\n }\n });\n\n let connectionCount = 0;\n const complete = new Trigger<PublicKey>();\n\n const createExtension = (): GuestHaloInvitationExtension => {\n const extension = new GuestHaloInvitationExtension({\n onOpen: () => {\n scheduleTask(ctx, async () => {\n try {\n // TODO(burdon): Bug where guest may create multiple connections.\n if (++connectionCount > 1) {\n throw new Error(`multiple connections detected: ${connectionCount}`);\n }\n\n log('connected');\n observable.callback.onConnected?.(invitation);\n\n // 1. Send request.\n log('sending admission request');\n const { identityKey, haloSpaceKey, genesisFeedKey, controlTimeframe } =\n await extension.rpc.HaloHostService.requestAdmission();\n\n // 2. Get authentication code.\n // TODO(burdon): Test timeout (options for timeouts at different steps).\n if (invitation.type === undefined || invitation.type === Invitation.Type.INTERACTIVE) {\n log('guest waiting for authentication code...');\n observable.callback.onAuthenticating?.(invitation);\n const authenticationCode = await authenticated.wait({ timeout });\n log('sending authentication request');\n await extension.rpc.HaloHostService.authenticate({ authenticationCode });\n }\n\n const deviceKey = await this._params.keyring.createKey();\n const controlFeedKey = await this._params.keyring.createKey();\n const dataFeedKey = await this._params.keyring.createKey();\n\n // 3. Send admission credentials to host (with local identity keys).\n log('presenting admission credentials', { identityKey, deviceKey, controlFeedKey, dataFeedKey });\n await extension.rpc.HaloHostService.presentAdmissionCredentials({\n deviceKey,\n controlFeedKey,\n dataFeedKey\n });\n\n // 4. Create local identity.\n // TODO(burdon): Abandon if does not complete (otherwise retry will fail).\n const identity = await this._params.acceptIdentity({\n identityKey,\n deviceKey,\n haloSpaceKey,\n haloGenesisFeedKey: genesisFeedKey,\n controlFeedKey,\n dataFeedKey,\n controlTimeframe\n });\n\n // 5. Success.\n log('admitted by host', { guest: identity.deviceKey, identityKey });\n complete.wake(identityKey);\n } catch (err) {\n if (!observable.cancelled) {\n log.warn('auth failed', err);\n observable.callback.onError(err);\n }\n } finally {\n await ctx.dispose();\n }\n });\n }\n });\n return extension;\n };\n\n scheduleTask(ctx, async () => {\n assert(invitation.swarmKey);\n const topic = invitation.swarmKey;\n const swarmConnection = await this._networkManager.joinSwarm({\n topic,\n peerId: PublicKey.random(),\n protocolProvider: createTeleportProtocolFactory(async (teleport) => {\n teleport.addExtension('dxos.halo.invitations', createExtension());\n }),\n topology: new StarTopology(topic)\n });\n ctx.onDispose(() => swarmConnection.close());\n\n observable.callback.onConnecting?.(invitation);\n invitation.identityKey = await complete.wait();\n observable.callback.onSuccess(invitation);\n await ctx.dispose();\n });\n\n return observable;\n }\n}\n\ntype HostHaloInvitationExtensionCallbacks = {\n requestAdmission: () => Promise<HaloAdmissionOffer>;\n authenticate: (request: AuthenticationRequest) => Promise<AuthenticationResponse>;\n presentAdmissionCredentials: (request: HaloAdmissionCredentials) => Promise<void>;\n // Deliberately not async to not block the extensions opening.\n onOpen: () => void;\n};\n\n/**\n * Host's side for a connection to a concrete peer in p2p network during invitation.\n */\nclass HostHaloInvitationExtension extends RpcExtension<{}, { HaloHostService: HaloHostService }> {\n constructor(private readonly _callbacks: HostHaloInvitationExtensionCallbacks) {\n super({\n exposed: {\n HaloHostService: schema.getService('dxos.halo.invitations.HaloHostService')\n }\n });\n }\n\n protected override async getHandlers(): Promise<{ HaloHostService: HaloHostService }> {\n return {\n // TODO(dmaretskyi): For now this is just forwarding the data to callbacks since we don't have session-specific logic.\n // Perhaps in the future we will have more complex logic here.\n HaloHostService: {\n requestAdmission: async () => {\n return this._callbacks.requestAdmission();\n },\n\n authenticate: async (credentials) => {\n return this._callbacks.authenticate(credentials);\n },\n\n // TODO(burdon): Not used: controlFeedKey, dataFeedKey.\n presentAdmissionCredentials: async (credentials) => {\n return this._callbacks.presentAdmissionCredentials(credentials);\n }\n }\n };\n }\n\n override async onOpen(context: ExtensionContext) {\n await super.onOpen(context);\n this._callbacks.onOpen();\n }\n}\n\ntype GuestHaloInvitationExtensionCallbacks = {\n // Deliberately not async to not block the extensions opening.\n onOpen: () => void;\n};\n\n/**\n * Guest's side for a connection to a concrete peer in p2p network during invitation.\n */\nclass GuestHaloInvitationExtension extends RpcExtension<{ HaloHostService: HaloHostService }, {}> {\n constructor(private readonly _callbacks: GuestHaloInvitationExtensionCallbacks) {\n super({\n requested: {\n HaloHostService: schema.getService('dxos.halo.invitations.HaloHostService')\n }\n });\n }\n\n protected override async getHandlers() {\n return {};\n }\n\n override async onOpen(context: ExtensionContext) {\n await super.onOpen(context);\n this._callbacks.onOpen();\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { TimeoutError } from '@dxos/async';\nimport {\n AuthenticatingInvitationObservable,\n CancellableInvitationObservable,\n InvitationsService,\n InvitationsHandler,\n InvitationsOptions\n} from '@dxos/client';\nimport { Stream } from '@dxos/codec-protobuf';\nimport { log } from '@dxos/log';\nimport { AuthenticationRequest, Invitation } from '@dxos/protocols/proto/dxos/client/services';\nimport { Provider } from '@dxos/util';\n\nimport { IdentityManager } from '../identity';\n\n/**\n * Adapts invitation service observable to client/service stream.\n */\nexport abstract class AbstractInvitationsService<T = void> implements InvitationsService {\n private readonly _createInvitations = new Map<string, CancellableInvitationObservable>();\n private readonly _acceptInvitations = new Map<string, AuthenticatingInvitationObservable>();\n\n // prettier-ignore\n protected constructor (\n private readonly _identityManager: IdentityManager,\n private readonly _getInvitationsHandler: Provider<InvitationsHandler<T>>\n ) {}\n\n // TODO(burdon): Guest/host label.\n getLoggingContext() {\n return {\n deviceKey: this._identityManager.identity?.deviceKey\n };\n }\n\n abstract getContext(invitation: Invitation): T;\n\n createInvitation(invitation: Invitation): Stream<Invitation> {\n return new Stream<Invitation>(({ next, close }) => {\n const invitationsHandler: InvitationsHandler<T> = this._getInvitationsHandler();\n const context = this.getContext(invitation);\n log('stream opened', this.getLoggingContext());\n\n let invitationId: string;\n const { type, swarmKey, authMethod } = invitation;\n const observable = invitationsHandler.createInvitation(context, { type, swarmKey, authMethod });\n observable.subscribe({\n onConnecting: (invitation) => {\n assert(invitation.invitationId);\n invitationId = invitation.invitationId;\n this._createInvitations.set(invitation.invitationId, observable);\n invitation.state = Invitation.State.CONNECTING;\n next(invitation);\n },\n onConnected: (invitation) => {\n assert(invitation.invitationId);\n invitation.state = Invitation.State.CONNECTED;\n next(invitation);\n },\n onAuthenticating: (invitation) => {\n assert(invitation.invitationId);\n invitation.state = Invitation.State.AUTHENTICATING;\n next(invitation);\n },\n onSuccess: (invitation) => {\n assert(invitation.invitationId);\n invitation.state = Invitation.State.SUCCESS;\n next(invitation);\n close();\n },\n onCancelled: () => {\n assert(invitationId);\n invitation.invitationId = invitationId;\n invitation.state = Invitation.State.CANCELLED;\n next(invitation);\n close();\n },\n onTimeout: (err: TimeoutError) => {\n invitation.state = Invitation.State.TIMEOUT;\n close(err);\n },\n onError: (err: any) => {\n invitation.state = Invitation.State.ERROR;\n close(err);\n }\n });\n\n return (err?: Error) => {\n const context = this.getLoggingContext();\n if (err) {\n log.warn('stream closed', { ...context, err });\n } else {\n log('stream closed', context);\n }\n\n this._createInvitations.delete(invitation.invitationId!);\n };\n });\n }\n\n acceptInvitation(invitation: Invitation, options?: InvitationsOptions): Stream<Invitation> {\n return new Stream<Invitation>(({ next, close }) => {\n log('stream opened', this.getLoggingContext());\n const invitationsHandler = this._getInvitationsHandler();\n\n let invitationId: string;\n const observable = invitationsHandler.acceptInvitation(invitation, options);\n observable.subscribe({\n onConnecting: (invitation) => {\n assert(invitation.invitationId);\n invitationId = invitation.invitationId;\n this._acceptInvitations.set(invitation.invitationId, observable);\n invitation.state = Invitation.State.CONNECTING;\n next(invitation);\n },\n onConnected: (invitation) => {\n assert(invitation.invitationId);\n invitation.state = Invitation.State.CONNECTED;\n next(invitation);\n },\n onAuthenticating: (invitation) => {\n assert(invitation.invitationId);\n invitation.state = Invitation.State.AUTHENTICATING;\n next(invitation);\n },\n onSuccess: (invitation) => {\n invitation.state = Invitation.State.SUCCESS;\n next(invitation);\n close();\n },\n onCancelled: () => {\n assert(invitationId);\n invitation.invitationId = invitationId;\n invitation.state = Invitation.State.CANCELLED;\n next(invitation);\n close();\n },\n onTimeout: (err: TimeoutError) => {\n invitation.state = Invitation.State.TIMEOUT;\n close(err);\n },\n onError: (err: any) => {\n invitation.state = Invitation.State.ERROR;\n close(err);\n }\n });\n\n return (err?: Error) => {\n const context = this.getLoggingContext();\n if (err) {\n log.warn('stream closed', { ...context, err });\n } else {\n log('stream closed', context);\n }\n\n this._acceptInvitations.delete(invitation.invitationId!);\n };\n });\n }\n\n async authenticate({ invitationId, authenticationCode }: AuthenticationRequest): Promise<void> {\n log('authenticating...');\n assert(invitationId);\n const observable = this._acceptInvitations.get(invitationId);\n if (!observable) {\n log.warn('invalid invitation', { invitationId });\n } else {\n await observable.authenticate(authenticationCode);\n }\n }\n\n async cancelInvitation(invitation: Invitation): Promise<void> {\n log('cancelling...');\n assert(invitation.invitationId);\n const observable =\n this._createInvitations.get(invitation.invitationId) ?? this._acceptInvitations.get(invitation.invitationId);\n if (!observable) {\n log.warn('invalid invitation', { invitationId: invitation.invitationId });\n } else {\n await observable?.cancel();\n }\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { InvitationsHandler } from '@dxos/client';\nimport { Invitation } from '@dxos/protocols/proto/dxos/client/services';\n\nimport { IdentityManager } from '../identity';\nimport { AbstractInvitationsService } from './invitations-service';\n\n/**\n * Adapts invitation service observable to client/service stream.\n */\nexport class DeviceInvitationsServiceImpl extends AbstractInvitationsService {\n // prettier-ignore\n constructor (\n identityManager: IdentityManager,\n private readonly invitationsHandler: InvitationsHandler\n ) {\n super(identityManager, () => invitationsHandler);\n }\n\n override getContext(invitation: Invitation) {}\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { scheduleTask, sleep, Trigger } from '@dxos/async';\nimport {\n AuthenticatingInvitationProvider,\n AUTHENTICATION_CODE_LENGTH,\n CancellableInvitationObservable,\n InvitationObservableProvider,\n INVITATION_TIMEOUT,\n ON_CLOSE_DELAY,\n AbstractInvitationsHandler,\n InvitationsOptions\n} from '@dxos/client';\nimport { Context } from '@dxos/context';\nimport { createAdmissionCredentials, generatePasscode, getCredentialAssertion } from '@dxos/credentials';\nimport { SigningContext } from '@dxos/echo-pipeline';\nimport { writeMessages } from '@dxos/feed-store';\nimport { Keyring } from '@dxos/keyring';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { createTeleportProtocolFactory, NetworkManager, StarTopology, SwarmConnection } from '@dxos/network-manager';\nimport { schema } from '@dxos/protocols';\nimport { Invitation } from '@dxos/protocols/proto/dxos/client/services';\nimport { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport {\n AuthenticationRequest,\n AuthenticationResponse,\n AuthMethod,\n Introduction,\n IntroductionResponse,\n SpaceAdmissionCredentials,\n SpaceAdmissionRequest,\n SpaceHostService\n} from '@dxos/protocols/proto/dxos/halo/invitations';\nimport { ExtensionContext, RpcExtension } from '@dxos/teleport';\n\nimport { DataSpace, DataSpaceManager } from '../spaces';\n\nconst MAX_OTP_ATTEMPTS = 3;\n\n/**\n * Handles the life-cycle of Space invitations between peers.\n */\n// TODO(dmaretskyi): Split into Host and Guest parts.\nexport class SpaceInvitationsHandler extends AbstractInvitationsHandler<DataSpace> {\n constructor(\n networkManager: NetworkManager,\n private readonly _spaceManager: DataSpaceManager,\n private readonly _signingContext: SigningContext,\n private readonly _keyring: Keyring\n ) {\n super(networkManager);\n }\n\n /**\n * Creates an invitation and listens for a join request from the invited (guest) peer.\n */\n createInvitation(space: DataSpace, options?: InvitationsOptions): CancellableInvitationObservable {\n let swarmConnection: SwarmConnection | undefined;\n const { type, timeout = INVITATION_TIMEOUT, swarmKey } = options ?? {};\n assert(type !== Invitation.Type.OFFLINE);\n assert(space);\n\n // TODO(dmaretskyi): Add invitation kind: halo/space.\n const invitation: Invitation = {\n type,\n invitationId: PublicKey.random().toHex(),\n swarmKey: swarmKey ?? PublicKey.random(),\n spaceKey: space.key,\n authMethod: options?.authMethod ?? AuthMethod.SHARED_SECRET,\n authenticationCode: generatePasscode(AUTHENTICATION_CODE_LENGTH) // TODO(dmaretskyi): Don't generate if authMethod === NONE .\n };\n\n const ctx = new Context({\n onError: (err) => {\n void ctx.dispose();\n observable.callback.onError(err);\n }\n });\n\n // TODO(burdon): Stop anything pending.\n const observable = new InvitationObservableProvider(async () => {\n await swarmConnection?.close();\n });\n\n let authenticationPassed = false;\n let authenticationRetry = 0;\n\n // Called for every connecting peer.\n const createExtension = (): HostSpaceInvitationExtension => {\n const complete = new Trigger<PublicKey>();\n let guestProfile: ProfileDocument | undefined;\n\n const hostInvitationExtension = new HostSpaceInvitationExtension({\n introduce: async ({ profile }) => {\n log('guest introduced itself', {\n guestProfile: profile,\n host: this._signingContext.deviceKey,\n spaceKey: space.key\n });\n\n guestProfile = profile;\n\n // TODO(burdon): Is this the right place to set this state?\n // TODO(dmaretskyi): Should we expose guest's profile in this callback?\n observable.callback.onAuthenticating?.(invitation);\n\n return {\n spaceKey:\n type === Invitation.Type.INTERACTIVE_TESTING || type === Invitation.Type.MULTIUSE_TESTING\n ? space.key\n : undefined,\n authMethod: invitation.authMethod!\n };\n },\n\n authenticate: async ({ authenticationCode: code }) => {\n log('received authentication request', { authenticationCode: code });\n let status = AuthenticationResponse.Status.OK;\n\n switch (invitation.authMethod) {\n case AuthMethod.NONE: {\n log('authentication not required');\n return { status: AuthenticationResponse.Status.OK };\n }\n case AuthMethod.SHARED_SECRET: {\n if (invitation.authenticationCode) {\n if (authenticationRetry++ > MAX_OTP_ATTEMPTS) {\n status = AuthenticationResponse.Status.INVALID_OPT_ATTEMPTS;\n } else if (code !== invitation.authenticationCode) {\n status = AuthenticationResponse.Status.INVALID_OTP;\n } else {\n authenticationPassed = true;\n }\n }\n break;\n }\n default: {\n log.error('invalid authentication method', { authMethod: invitation.authMethod });\n status = AuthenticationResponse.Status.INTERNAL_ERROR;\n break;\n }\n }\n\n return { status };\n },\n\n requestAdmission: async ({ identityKey, deviceKey, controlFeedKey, dataFeedKey }) => {\n try {\n // Check authenticated.\n if (isAuthenticationRequired(invitation) && !authenticationPassed) {\n throw new Error('Not authenticated');\n }\n\n log('writing guest credentials', { host: this._signingContext.deviceKey, guest: deviceKey });\n // TODO(burdon): Check if already admitted.\n const credentials: FeedMessage.Payload[] = await createAdmissionCredentials(\n this._signingContext.credentialSigner,\n identityKey,\n space.key,\n space.inner.genesisFeedKey,\n guestProfile\n );\n\n // TODO(dmaretskyi): Refactor.\n assert(credentials[0].credential);\n const spaceMemberCredential = credentials[0].credential.credential;\n assert(getCredentialAssertion(spaceMemberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember');\n\n await writeMessages(space.inner.controlPipeline.writer, credentials);\n\n // Updating credentials complete.\n complete.wake(deviceKey);\n\n return {\n credential: spaceMemberCredential,\n controlTimeframe: space.inner.controlPipeline.state.timeframe,\n dataTimeframe: space.dataPipeline.pipelineState?.timeframe\n };\n } catch (err) {\n // TODO(burdon): Generic RPC callback to report error to client.\n observable.callback.onError(err);\n throw err; // Propagate error to guest.\n }\n },\n\n onOpen: () => {\n scheduleTask(ctx, async () => {\n try {\n log('connected', { host: this._signingContext.deviceKey });\n observable.callback.onConnected?.(invitation);\n const deviceKey = await complete.wait({ timeout });\n log('admitted guest', { host: this._signingContext.deviceKey, guest: deviceKey });\n observable.callback.onSuccess(invitation);\n } catch (err) {\n if (!observable.cancelled) {\n log.error('failed', err);\n observable.callback.onError(err);\n }\n } finally {\n if (type !== Invitation.Type.MULTIUSE_TESTING) {\n await sleep(ON_CLOSE_DELAY);\n await ctx.dispose();\n }\n }\n });\n }\n });\n return hostInvitationExtension;\n };\n\n scheduleTask(ctx, async () => {\n const topic = invitation.swarmKey!;\n const swarmConnection = await this._networkManager.joinSwarm({\n topic,\n peerId: topic,\n protocolProvider: createTeleportProtocolFactory(async (teleport) => {\n teleport.addExtension('dxos.halo.invitations', createExtension());\n }),\n topology: new StarTopology(topic)\n });\n ctx.onDispose(() => swarmConnection.close());\n\n observable.callback.onConnecting?.(invitation);\n });\n\n return observable;\n }\n\n /**\n * Waits for the host peer (inviter) to accept our join request.\n * The local guest peer (invitee) then sends the local space invitation to the host,\n * which then writes the guest's credentials to the space.\n */\n acceptInvitation(invitation: Invitation, options?: InvitationsOptions): AuthenticatingInvitationProvider {\n const { timeout = INVITATION_TIMEOUT } = options ?? {};\n\n const ctx = new Context({\n onError: (err) => {\n void ctx.dispose();\n observable.callback.onError(err);\n }\n });\n\n const authenticated = new Trigger<string>();\n const observable = new AuthenticatingInvitationProvider({\n onCancel: async () => {\n await ctx.dispose();\n },\n\n onAuthenticate: async (code: string) => {\n // TODO(burdon): Reset creates a race condition? Event?\n authenticated.wake(code);\n }\n });\n\n let connectionCount = 0;\n const complete = new Trigger();\n\n const createExtension = (): GuestSpaceInvitationExtension => {\n const extension = new GuestSpaceInvitationExtension({\n onOpen: () => {\n scheduleTask(ctx, async () => {\n try {\n // TODO(burdon): Bug where guest may create multiple connections.\n if (++connectionCount > 1) {\n throw new Error(`multiple connections detected: ${connectionCount}`);\n }\n\n log('connected', { guest: this._signingContext.deviceKey });\n observable.callback.onConnected?.(invitation);\n\n // 1. Introduce guest to host.\n log('introduce', { guest: this._signingContext.deviceKey });\n const introductionResponse = await extension.rpc.SpaceHostService.introduce({\n profile: this._signingContext.profile\n });\n log('introduce response', { guest: this._signingContext.deviceKey, response: introductionResponse });\n invitation.authMethod = introductionResponse.authMethod;\n if (introductionResponse.spaceKey) {\n invitation.spaceKey = introductionResponse.spaceKey;\n }\n\n // TODO(dmaretskyi): Add a callback here to notify that we have introduced ourselves to the host (regradless of auth requirements).\n\n // 2. Get authentication code.\n // TODO(burdon): Test timeout (options for timeouts at different steps).\n if (isAuthenticationRequired(invitation)) {\n observable.callback.onAuthenticating?.(invitation);\n\n for (let attempt = 1; attempt <= MAX_OTP_ATTEMPTS; attempt++) {\n log('guest waiting for authentication code...');\n observable.callback.onAuthenticating?.(invitation);\n const authenticationCode = await authenticated.wait({ timeout });\n\n log('sending authentication request');\n const response = await extension.rpc.SpaceHostService.authenticate({ authenticationCode });\n if (response.status === undefined || response.status === AuthenticationResponse.Status.OK) {\n break;\n }\n\n if (response.status === AuthenticationResponse.Status.INVALID_OTP) {\n if (attempt === MAX_OTP_ATTEMPTS) {\n throw new Error(`Maximum retry attempts: ${MAX_OTP_ATTEMPTS}`);\n } else {\n log('retrying invalid code', { attempt });\n authenticated.reset();\n }\n }\n }\n }\n // 3. Generate a pair of keys for our feeds.\n const controlFeedKey = await this._keyring.createKey();\n const dataFeedKey = await this._keyring.createKey();\n\n // 4. Send admission credentials to host (with local space keys).\n log('request admission', { guest: this._signingContext.deviceKey });\n const { credential, controlTimeframe, dataTimeframe } =\n await extension.rpc.SpaceHostService.requestAdmission({\n identityKey: this._signingContext.identityKey,\n deviceKey: this._signingContext.deviceKey,\n controlFeedKey,\n dataFeedKey\n });\n\n // 4. Create local space.\n const assertion = getCredentialAssertion(credential);\n assert(assertion['@type'] === 'dxos.halo.credentials.SpaceMember', 'Invalid credential');\n assert(credential.subject.id.equals(this._signingContext.identityKey));\n\n const space = await this._spaceManager.acceptSpace({\n spaceKey: assertion.spaceKey,\n genesisFeedKey: assertion.genesisFeedKey,\n controlTimeframe,\n dataTimeframe\n });\n\n // Record credential in our HALO.\n await this._signingContext.recordCredential(credential);\n\n // 5. Success.\n log('admitted by host', { guest: this._signingContext.deviceKey, spaceKey: space.key });\n complete.wake();\n } catch (err) {\n if (!observable.cancelled) {\n log.warn('auth failed', err);\n observable.callback.onError(err);\n }\n } finally {\n await ctx.dispose();\n }\n });\n }\n });\n return extension;\n };\n\n scheduleTask(ctx, async () => {\n assert(invitation.swarmKey);\n const topic = invitation.swarmKey;\n const swarmConnection = await this._networkManager.joinSwarm({\n topic,\n peerId: PublicKey.random(),\n protocolProvider: createTeleportProtocolFactory(async (teleport) => {\n teleport.addExtension('dxos.halo.invitations', createExtension());\n }),\n topology: new StarTopology(topic)\n });\n ctx.onDispose(() => swarmConnection.close());\n\n observable.callback.onConnecting?.(invitation);\n await complete.wait();\n observable.callback.onSuccess(invitation);\n await ctx.dispose();\n });\n\n return observable;\n }\n}\n\nconst isAuthenticationRequired = (invitation: Invitation) =>\n invitation.authMethod !== AuthMethod.NONE &&\n invitation.type !== Invitation.Type.INTERACTIVE_TESTING &&\n invitation.type !== Invitation.Type.MULTIUSE_TESTING;\n\ntype HostSpaceInvitationExtensionCallbacks = {\n // Deliberately not async to not block the extensions opening.\n onOpen: () => void;\n\n introduce: (introduction: Introduction) => Promise<IntroductionResponse>;\n authenticate: (request: AuthenticationRequest) => Promise<AuthenticationResponse>;\n requestAdmission: (request: SpaceAdmissionRequest) => Promise<SpaceAdmissionCredentials>;\n};\n\n/**\n * Host's side for a connection to a concrete peer in p2p network during invitation.\n */\nclass HostSpaceInvitationExtension extends RpcExtension<{}, { SpaceHostService: SpaceHostService }> {\n constructor(private readonly _callbacks: HostSpaceInvitationExtensionCallbacks) {\n super({\n exposed: {\n SpaceHostService: schema.getService('dxos.halo.invitations.SpaceHostService')\n }\n });\n }\n\n protected override async getHandlers(): Promise<{ SpaceHostService: SpaceHostService }> {\n return {\n // TODO(dmaretskyi): For now this is just forwarding the data to callbacks since we don't have session-specific logic.\n // Perhaps in the future we will have more complex logic here.\n SpaceHostService: {\n introduce: async (params) => {\n return this._callbacks.introduce(params);\n },\n\n authenticate: async (credentials) => {\n return this._callbacks.authenticate(credentials);\n },\n\n requestAdmission: async (credentials) => {\n return this._callbacks.requestAdmission(credentials);\n }\n }\n };\n }\n\n override async onOpen(context: ExtensionContext) {\n await super.onOpen(context);\n this._callbacks.onOpen();\n }\n}\n\ntype GuestSpaceInvitationExtensionCallbacks = {\n // Deliberately not async to not block the extensions opening.\n onOpen: () => void;\n};\n\n/**\n * Guest's side for a connection to a concrete peer in p2p network during invitation.\n */\nclass GuestSpaceInvitationExtension extends RpcExtension<{ SpaceHostService: SpaceHostService }, {}> {\n constructor(private readonly _callbacks: GuestSpaceInvitationExtensionCallbacks) {\n super({\n requested: {\n SpaceHostService: schema.getService('dxos.halo.invitations.SpaceHostService')\n }\n });\n }\n\n protected override async getHandlers() {\n return {};\n }\n\n override async onOpen(context: ExtensionContext) {\n await super.onOpen(context);\n this._callbacks.onOpen();\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { InvitationsHandler } from '@dxos/client';\nimport { Invitation } from '@dxos/protocols/proto/dxos/client/services';\nimport { Provider } from '@dxos/util';\n\nimport { IdentityManager } from '../identity';\nimport { DataSpace, DataSpaceManager } from '../spaces';\nimport { AbstractInvitationsService } from './invitations-service';\n\n/**\n * Adapts invitation service observable to client/service stream.\n */\nexport class SpaceInvitationsServiceImpl extends AbstractInvitationsService<DataSpace> {\n // prettier-ignore\n constructor (\n identityManager: IdentityManager,\n private readonly invitationsHandler: Provider<InvitationsHandler<DataSpace>>,\n private readonly _getSpaceManager: Provider<DataSpaceManager>\n ) {\n super(identityManager, invitationsHandler);\n }\n\n override getContext(invitation: Invitation): DataSpace {\n assert(invitation.spaceKey);\n const spaceManager = this._getSpaceManager();\n const space = spaceManager.spaces.get(invitation.spaceKey!);\n assert(space);\n return space;\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { NetworkManager } from '@dxos/network-manager';\nimport { NetworkService, NetworkStatus, SetNetworkOptionsRequest } from '@dxos/protocols/proto/dxos/client/services';\n\nexport class NetworkServiceImpl implements NetworkService {\n constructor(private readonly networkManager: NetworkManager) {}\n\n subscribeToNetworkStatus() {\n return new Stream<NetworkStatus>(({ next }) => {\n const unsubscribe = this.networkManager.connectionStateChanged.on((state) => next({ state }));\n next({ state: this.networkManager.connectionState });\n\n return unsubscribe;\n });\n }\n\n async setNetworkOptions(request: SetNetworkOptionsRequest) {\n await this.networkManager.setConnectionState(request.state);\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event, synchronized, trackLeaks } from '@dxos/async';\nimport { SpaceState } from '@dxos/client';\nimport { cancelWithContext, Context } from '@dxos/context';\nimport { getCredentialAssertion } from '@dxos/credentials';\nimport {\n DataServiceSubscriptions,\n MetadataStore,\n SigningContext,\n SnapshotManager,\n SnapshotStore,\n Space,\n spaceGenesis,\n SpaceManager\n} from '@dxos/echo-pipeline';\nimport { FeedStore } from '@dxos/feed-store';\nimport { Keyring } from '@dxos/keyring';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ModelFactory } from '@dxos/model-factory';\nimport { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { SpaceMetadata } from '@dxos/protocols/proto/dxos/echo/metadata';\nimport { Gossip, Presence } from '@dxos/teleport-extension-gossip';\nimport { Timeframe } from '@dxos/timeframe';\nimport { ComplexMap, deferFunction } from '@dxos/util';\n\nimport { createAuthProvider } from '../identity';\nimport { DataSpace } from './data-space';\n\nexport type AcceptSpaceOptions = {\n spaceKey: PublicKey;\n genesisFeedKey: PublicKey;\n\n /**\n * Latest known timeframe for the control pipeline.\n * We will try to catch up to this timeframe before starting the data pipeline.\n */\n controlTimeframe?: Timeframe;\n\n /**\n * Latest known timeframe for the data pipeline.\n * We will try to catch up to this timeframe before initializing the database.\n */\n dataTimeframe?: Timeframe;\n};\n\n@trackLeaks('open', 'close')\nexport class DataSpaceManager {\n private readonly _ctx = new Context();\n\n public readonly updated = new Event();\n\n private readonly _spaces = new ComplexMap<PublicKey, DataSpace>(PublicKey.hash);\n\n private _isOpen = false;\n\n constructor(\n private readonly _spaceManager: SpaceManager,\n private readonly _metadataStore: MetadataStore,\n private readonly _dataServiceSubscriptions: DataServiceSubscriptions,\n private readonly _keyring: Keyring,\n private readonly _signingContext: SigningContext,\n private readonly _modelFactory: ModelFactory,\n private readonly _feedStore: FeedStore<FeedMessage>,\n private readonly _snapshotStore: SnapshotStore\n ) {}\n\n // TODO(burdon): Remove.\n get spaces() {\n return this._spaces;\n }\n\n @synchronized\n async open() {\n log('open');\n await this._metadataStore.load();\n log('metadata loaded', { spaces: this._metadataStore.spaces.length });\n\n for (const spaceMetadata of this._metadataStore.spaces) {\n log('load space', { spaceMetadata });\n const space = await this._constructSpace(spaceMetadata);\n space.initializeDataPipelineAsync();\n }\n\n this._isOpen = true;\n this.updated.emit();\n }\n\n @synchronized\n async close() {\n log('close');\n this._isOpen = false;\n await this._ctx.dispose();\n for (const space of this._spaces.values()) {\n await space.close();\n }\n }\n\n /**\n * Creates a new space writing the genesis credentials to the control feed.\n */\n @synchronized\n async createSpace() {\n assert(this._isOpen, 'Not open.');\n const spaceKey = await this._keyring.createKey();\n const controlFeedKey = await this._keyring.createKey();\n const dataFeedKey = await this._keyring.createKey();\n const metadata: SpaceMetadata = {\n key: spaceKey,\n genesisFeedKey: controlFeedKey,\n controlFeedKey,\n dataFeedKey\n };\n\n log('creating space...', { spaceKey });\n const space = await this._constructSpace(metadata);\n\n const credentials = await spaceGenesis(this._keyring, this._signingContext, space.inner);\n await this._metadataStore.addSpace(metadata);\n\n const memberCredential = credentials[1];\n assert(getCredentialAssertion(memberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember');\n await this._signingContext.recordCredential(memberCredential);\n\n await space.initializeDataPipeline();\n\n this.updated.emit();\n return space;\n }\n\n // TODO(burdon): Rename join space.\n @synchronized\n async acceptSpace(opts: AcceptSpaceOptions): Promise<DataSpace> {\n log('accept space', { opts });\n assert(this._isOpen, 'Not open.');\n assert(!this._spaces.has(opts.spaceKey), 'Space already exists.');\n\n const metadata: SpaceMetadata = {\n key: opts.spaceKey,\n genesisFeedKey: opts.genesisFeedKey,\n controlTimeframe: opts.controlTimeframe,\n dataTimeframe: opts.dataTimeframe\n };\n\n const space = await this._constructSpace(metadata);\n await this._metadataStore.addSpace(metadata);\n\n space.initializeDataPipelineAsync();\n\n this.updated.emit();\n return space;\n }\n\n /**\n * Wait until the space data pipeline is fully initialized.\n * Used by invitation handler.\n * TODO(dmaretskyi): Consider removing.\n */\n async waitUntilSpaceReady(spaceKey: PublicKey) {\n await cancelWithContext(\n this._ctx,\n this.updated.waitForCondition(() => {\n const space = this._spaces.get(spaceKey);\n return !!space && space.state === SpaceState.READY;\n })\n );\n }\n\n private async _constructSpace(metadata: SpaceMetadata) {\n log('construct space', { metadata });\n const gossip = new Gossip({\n localPeerId: this._signingContext.deviceKey\n });\n const presence = new Presence({\n announceInterval: 500,\n offlineTimeout: 5_000, // TODO(burdon): Config.\n identityKey: this._signingContext.identityKey,\n gossip\n });\n const snapshotManager = new SnapshotManager(this._snapshotStore);\n\n const controlFeed =\n metadata.controlFeedKey && (await this._feedStore.openFeed(metadata.controlFeedKey, { writable: true }));\n const dataFeed = metadata.dataFeedKey && (await this._feedStore.openFeed(metadata.dataFeedKey, { writable: true }));\n\n const space: Space = await this._spaceManager.constructSpace({\n metadata,\n swarmIdentity: {\n peerKey: this._signingContext.deviceKey,\n credentialProvider: createAuthProvider(this._signingContext.credentialSigner),\n credentialAuthenticator: deferFunction(() => dataSpace.authVerifier.verifier)\n },\n onNetworkConnection: (session) => {\n session.addExtension(\n 'dxos.mesh.teleport.gossip',\n gossip.createExtension({ remotePeerId: session.remotePeerId })\n );\n session.addExtension('dxos.mesh.teleport.objectsync', snapshotManager.objectSync.createExtension());\n session.addExtension('dxos.mesh.teleport.notarization', dataSpace.notarizationPlugin.createExtension());\n }\n });\n controlFeed && space.setControlFeed(controlFeed);\n dataFeed && space.setDataFeed(dataFeed);\n\n const dataSpace = new DataSpace({\n inner: space,\n modelFactory: this._modelFactory,\n metadataStore: this._metadataStore,\n snapshotManager,\n gossip,\n presence,\n memberKey: this._signingContext.identityKey,\n keyring: this._keyring,\n feedStore: this._feedStore,\n signingContext: this._signingContext,\n snapshotId: metadata.snapshot,\n callbacks: {\n beforeReady: async () => {\n log('before space ready', { space: space.key });\n this._dataServiceSubscriptions.registerSpace(\n space.key,\n dataSpace.dataPipeline.databaseBackend!.createDataServiceHost()\n );\n },\n afterReady: async () => {\n log('after space ready', { space: space.key, open: this._isOpen });\n if (this._isOpen) {\n this.updated.emit();\n }\n }\n }\n });\n\n await dataSpace.open();\n\n if (metadata.controlTimeframe) {\n dataSpace.inner.controlPipeline.state.setTargetTimeframe(metadata.controlTimeframe);\n }\n if (metadata.dataTimeframe) {\n dataSpace.dataPipeline.setTargetTimeframe(metadata.dataTimeframe);\n }\n\n this._spaces.set(metadata.key, dataSpace);\n return dataSpace;\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Event, scheduleTask, trackLeaks } from '@dxos/async';\nimport { SpaceState } from '@dxos/client';\nimport { Context } from '@dxos/context';\nimport { CredentialConsumer } from '@dxos/credentials';\nimport { timed } from '@dxos/debug';\nimport {\n MetadataStore,\n Space,\n SigningContext,\n createMappedFeedWriter,\n SnapshotManager,\n DataPipeline\n} from '@dxos/echo-pipeline';\nimport { CancelledError, SystemError } from '@dxos/errors';\nimport { FeedStore } from '@dxos/feed-store';\nimport { Keyring } from '@dxos/keyring';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ModelFactory } from '@dxos/model-factory';\nimport { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { AdmittedFeed, Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { GossipMessage } from '@dxos/protocols/proto/dxos/mesh/teleport/gossip';\nimport { Gossip, Presence } from '@dxos/teleport-extension-gossip';\nimport { ComplexSet } from '@dxos/util';\n\nimport { TrustedKeySetAuthVerifier } from '../identity';\nimport { NotarizationPlugin } from './notarization-plugin';\n\nconst AUTH_TIMEOUT = 30000;\n\nexport type DataSpaceCallbacks = {\n /**\n * Called before transitioning to the ready state.\n */\n beforeReady?: () => Promise<void>;\n\n /**\n * Called after transitioning to the ready state.\n */\n afterReady?: () => Promise<void>;\n};\n\nexport type DataSpaceParams = {\n inner: Space;\n modelFactory: ModelFactory;\n metadataStore: MetadataStore;\n snapshotManager: SnapshotManager;\n gossip: Gossip;\n presence: Presence;\n keyring: Keyring;\n feedStore: FeedStore<FeedMessage>;\n signingContext: SigningContext;\n memberKey: PublicKey;\n snapshotId?: string | undefined;\n callbacks?: DataSpaceCallbacks;\n};\n\n@trackLeaks('open', 'close')\nexport class DataSpace {\n private readonly _ctx = new Context();\n private readonly _dataPipeline: DataPipeline;\n private readonly _inner: Space;\n private readonly _gossip: Gossip;\n private readonly _presence: Presence;\n private readonly _keyring: Keyring;\n private readonly _feedStore: FeedStore<FeedMessage>;\n private readonly _metadataStore: MetadataStore;\n private readonly _signingContext: SigningContext;\n private readonly _notarizationPluginConsumer: CredentialConsumer<NotarizationPlugin>;\n private readonly _callbacks: DataSpaceCallbacks;\n\n private _state = SpaceState.CLOSED;\n\n public readonly authVerifier: TrustedKeySetAuthVerifier;\n public readonly stateUpdate = new Event();\n\n constructor(params: DataSpaceParams) {\n this._inner = params.inner;\n this._inner.stateUpdate.on(this._ctx, () => this.stateUpdate.emit());\n\n this._gossip = params.gossip;\n this._presence = params.presence;\n this._keyring = params.keyring;\n this._feedStore = params.feedStore;\n this._metadataStore = params.metadataStore;\n this._signingContext = params.signingContext;\n this._callbacks = params.callbacks ?? {};\n this._dataPipeline = new DataPipeline({\n modelFactory: params.modelFactory,\n metadataStore: params.metadataStore,\n snapshotManager: params.snapshotManager,\n memberKey: params.memberKey,\n spaceKey: this._inner.key,\n feedInfoProvider: (feedKey) => this._inner.spaceState.feeds.get(feedKey),\n snapshotId: params.snapshotId\n });\n\n this.authVerifier = new TrustedKeySetAuthVerifier({\n trustedKeysProvider: () => new ComplexSet(PublicKey.hash, Array.from(this._inner.spaceState.members.keys())),\n update: this._inner.stateUpdate,\n authTimeout: AUTH_TIMEOUT\n });\n\n this._notarizationPluginConsumer = this._inner.spaceState.registerProcessor(new NotarizationPlugin());\n }\n\n get key() {\n return this._inner.key;\n }\n\n get isOpen() {\n return this._inner.isOpen;\n }\n\n get state(): SpaceState {\n return this._state;\n }\n\n // TODO(burdon): Can we mark this for debugging only?\n get inner() {\n return this._inner;\n }\n\n get dataPipeline(): DataPipeline {\n return this._dataPipeline;\n }\n\n get presence() {\n return this._presence;\n }\n\n get notarizationPlugin() {\n return this._notarizationPluginConsumer.processor;\n }\n\n async open() {\n await this.notarizationPlugin.open();\n await this._notarizationPluginConsumer.open();\n await this._inner.open();\n this._state = SpaceState.INACTIVE;\n }\n\n async close() {\n this._state = SpaceState.CLOSED;\n await this._ctx.dispose();\n\n await this._dataPipeline.close();\n await this.authVerifier.close();\n\n await this._inner.close();\n await this._notarizationPluginConsumer.close();\n await this.notarizationPlugin.close();\n\n await this._presence.destroy();\n }\n\n async postMessage(channel: string, message: any) {\n return this._gossip.postMessage(channel, message);\n }\n\n listen(channel: string, callback: (message: GossipMessage) => void) {\n return this._gossip.listen(channel, callback);\n }\n\n /**\n * Initialize the data pipeline in a separate task.\n */\n initializeDataPipelineAsync() {\n scheduleTask(this._ctx, async () => {\n try {\n await this.initializeDataPipeline();\n } catch (err) {\n if (err instanceof CancelledError) {\n log('Data pipeline initialization cancelled', err);\n return;\n }\n\n log.error('Error initializing data pipeline', err);\n }\n });\n }\n\n async initializeDataPipeline() {\n if (this._state !== SpaceState.INACTIVE) {\n throw new SystemError('Invalid operation');\n }\n this._state = SpaceState.INITIALIZING;\n\n // TODO(dmaretskyi): Cancel with context.\n await this._inner.controlPipeline.state.waitUntilReachedTargetTimeframe({\n ctx: this._ctx,\n breakOnStall: false\n });\n\n await this._createWritableFeeds();\n log('Writable feeds created');\n this.stateUpdate.emit();\n\n this.notarizationPlugin.setWriter(\n createMappedFeedWriter<Credential, FeedMessage.Payload>(\n (credential) => ({\n credential: { credential }\n }),\n this._inner.controlPipeline.writer\n )\n );\n\n await this._dataPipeline.open({\n openPipeline: async (start) => {\n const pipeline = await this._inner.createDataPipeline({ start });\n await pipeline.start();\n return pipeline;\n }\n });\n\n log('waiting for data pipeline to reach target timeframe');\n // Wait for the data pipeline to catch up to its desired timeframe.\n await this._dataPipeline.pipelineState!.waitUntilReachedTargetTimeframe({\n ctx: this._ctx,\n breakOnStall: false\n });\n\n log('data pipeline ready');\n await this._callbacks.beforeReady?.();\n\n this._state = SpaceState.READY;\n this.stateUpdate.emit();\n\n await this._callbacks.afterReady?.();\n }\n\n @timed(10_000)\n private async _createWritableFeeds() {\n const credentials: Credential[] = [];\n if (!this.inner.controlFeedKey) {\n const controlFeed = await this._feedStore.openFeed(await this._keyring.createKey(), { writable: true });\n this.inner.setControlFeed(controlFeed);\n\n credentials.push(\n await this._signingContext.credentialSigner.createCredential({\n subject: controlFeed.key,\n assertion: {\n '@type': 'dxos.halo.credentials.AdmittedFeed',\n spaceKey: this.key,\n deviceKey: this._signingContext.deviceKey,\n identityKey: this._signingContext.identityKey,\n designation: AdmittedFeed.Designation.CONTROL\n }\n })\n );\n }\n if (!this.inner.dataFeedKey) {\n const dataFeed = await this._feedStore.openFeed(await this._keyring.createKey(), { writable: true });\n this.inner.setDataFeed(dataFeed);\n\n credentials.push(\n await this._signingContext.credentialSigner.createCredential({\n subject: dataFeed.key,\n assertion: {\n '@type': 'dxos.halo.credentials.AdmittedFeed',\n spaceKey: this.key,\n deviceKey: this._signingContext.deviceKey,\n identityKey: this._signingContext.identityKey,\n designation: AdmittedFeed.Designation.DATA\n }\n })\n );\n }\n\n if (credentials.length > 0) {\n // Never times out\n await this.notarizationPlugin.notarize({ ctx: this._ctx, credentials, timeout: 0 });\n }\n\n // Set this after credentials are notarized so that on failure we will retry.\n await this._metadataStore.setWritableFeedKeys(this.key, this.inner.controlFeedKey!, this.inner.dataFeedKey!);\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { DeferredTask, Event, scheduleTask, sleep, TimeoutError, Trigger } from '@dxos/async';\nimport { Context, rejectOnDispose } from '@dxos/context';\nimport { CredentialProcessor } from '@dxos/credentials';\nimport { FeedWriter } from '@dxos/feed-store';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { schema } from '@dxos/protocols';\nimport { Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { NotarizationService, NotarizeRequest } from '@dxos/protocols/proto/dxos/mesh/teleport/notarization';\nimport { ExtensionContext, RpcExtension } from '@dxos/teleport';\nimport { ComplexMap, ComplexSet, entry } from '@dxos/util';\n\nconst DEFAULT_RETRY_TIMEOUT = 1_000;\n\nconst DEFAULT_SUCCESS_DELAY = 1_000;\n\nconst DEFAULT_NOTARIZE_TIMEOUT = 10_000;\n\nexport type NotarizeParams = {\n /**\n * For cancellation.\n */\n ctx?: Context;\n\n /**\n * Credentials to notarize.\n */\n credentials: Credential[];\n\n /**\n * Timeout for the whole notarization process.\n * Set to 0 to disable.\n * @default {@link DEFAULT_NOTARIZE_TIMEOUT}\n */\n timeout?: number;\n\n /**\n * Retry timeout.\n * @default {@link DEFAULT_RETRY_TIMEOUT}\n */\n retryTimeout?: number;\n\n /**\n * Minimum wait time after a peer confirms successful notarization before attempting with a new peer.\n * This is to avoid spamming peers with notarization requests.\n * @default {@link DEFAULT_SUCCESS_DELAY}\n */\n successDelay?: number;\n};\n\n/**\n * See NotarizationService proto.\n */\nexport class NotarizationPlugin implements CredentialProcessor {\n private readonly _ctx = new Context();\n private readonly _extensionOpened = new Event();\n\n private _writer: FeedWriter<Credential> | undefined;\n private readonly _extensions = new Set<NotarizationTeleportExtension>();\n private readonly _processedCredentials = new ComplexSet<PublicKey>(PublicKey.hash);\n private readonly _processCredentialsTriggers = new ComplexMap<PublicKey, Trigger>(PublicKey.hash);\n\n async open() {}\n\n async close() {\n await this._ctx.dispose();\n }\n\n /**\n * Request credentials to be notarized.\n */\n async notarize({\n ctx: opCtx,\n credentials,\n timeout = DEFAULT_NOTARIZE_TIMEOUT,\n retryTimeout = DEFAULT_RETRY_TIMEOUT,\n successDelay = DEFAULT_SUCCESS_DELAY\n }: NotarizeParams) {\n log('notarize', { credentials });\n assert(\n credentials.every((credential) => credential.id),\n 'Credentials must have an id'\n );\n\n const errors = new Trigger();\n const ctx = this._ctx.derive({\n onError: (err) => {\n log.warn('Notarization error', { err });\n void ctx.dispose();\n errors.throw(err);\n }\n });\n opCtx?.onDispose(() => ctx.dispose());\n\n // Timeout/\n if (timeout !== 0) {\n scheduleTask(\n ctx,\n () => {\n log.warn('Notarization timeout', {\n timeout,\n peers: Array.from(this._extensions).map((extension) => extension.remotePeerId)\n });\n void ctx.dispose();\n errors.throw(new TimeoutError(timeout, 'Notarization timed out'));\n },\n timeout\n );\n }\n\n const allNotarized = Promise.all(credentials.map((credential) => this._waitUntilProcessed(credential.id!)));\n\n const peersTried = new Set<NotarizationTeleportExtension>();\n\n // Repeatable task that tries to notarize credentials with one of the available peers.\n const notarizeTask = new DeferredTask(ctx, async () => {\n try {\n if (this._extensions.size === 0) {\n return; // No peers to try.\n }\n\n // Pick a peer that we haven't tried yet.\n const peer = [...this._extensions].find((peer) => !peersTried.has(peer));\n if (!peer) {\n log.warn('Exhausted all peers to notarize with', { retryIn: retryTimeout });\n peersTried.clear();\n scheduleTask(ctx, () => notarizeTask.schedule(), retryTimeout); // retry with all peers again\n return;\n }\n\n peersTried.add(peer);\n log('try notarizing', { peer: peer.localPeerId, credentialId: credentials.map((credential) => credential.id) });\n await peer.rpc.NotarizationService.notarize({\n credentials: credentials.filter((credential) => !this._processedCredentials.has(credential.id!))\n });\n log('success');\n await sleep(successDelay); // wait before trying with a new peer\n } catch (err) {\n log.warn('error notarizing (recoverable)', err);\n notarizeTask.schedule(); // retry immediately with next peer\n }\n });\n\n notarizeTask.schedule();\n this._extensionOpened.on(ctx, () => notarizeTask.schedule());\n\n try {\n await Promise.race([rejectOnDispose(ctx), allNotarized, errors.wait()]);\n log('done');\n } finally {\n await ctx.dispose();\n }\n }\n\n /**\n * Called with credentials arriving from the control pipeline.\n */\n async process(credential: Credential) {\n if (!credential.id) {\n return;\n }\n this._processCredentialsTriggers.get(credential.id)?.wake();\n this._processedCredentials.add(credential.id);\n this._processCredentialsTriggers.delete(credential.id);\n }\n\n setWriter(writer: FeedWriter<Credential>) {\n assert(!this._writer, 'Writer already set.');\n this._writer = writer;\n }\n\n private async _waitUntilProcessed(id: PublicKey) {\n if (this._processedCredentials.has(id)) {\n return;\n }\n await entry(this._processCredentialsTriggers, id).orInsert(new Trigger()).value.wait();\n }\n\n /**\n * Requests from other peers to notarize credentials.\n */\n private async _onNotarize(request: NotarizeRequest) {\n if (!this._writer) {\n throw new Error('Writer not set');\n }\n for (const credential of request.credentials ?? []) {\n assert(credential.id, 'Credential must have an id');\n if (this._processedCredentials.has(credential.id)) {\n continue;\n }\n await this._writer.write(credential);\n }\n }\n\n createExtension() {\n const extension = new NotarizationTeleportExtension({\n onOpen: async () => {\n log('extension opened', { peer: extension.localPeerId });\n this._extensions.add(extension);\n this._extensionOpened.emit();\n },\n onClose: async () => {\n log('extension closed', { peer: extension.localPeerId });\n this._extensions.delete(extension);\n },\n onNotarize: this._onNotarize.bind(this)\n });\n return extension;\n }\n}\n\nexport type NotarizationTeleportExtensionParams = {\n onOpen: () => Promise<void>;\n onClose: () => Promise<void>;\n onNotarize: (request: NotarizeRequest) => Promise<void>;\n};\n\nexport class NotarizationTeleportExtension extends RpcExtension<Services, Services> {\n constructor(private readonly _params: NotarizationTeleportExtensionParams) {\n super({\n requested: {\n NotarizationService: schema.getService('dxos.mesh.teleport.notarization.NotarizationService')\n },\n exposed: {\n NotarizationService: schema.getService('dxos.mesh.teleport.notarization.NotarizationService')\n }\n });\n }\n\n protected async getHandlers(): Promise<Services> {\n return {\n NotarizationService: {\n notarize: async (request) => {\n await this._params.onNotarize(request);\n }\n }\n };\n }\n\n override async onOpen(ctx: ExtensionContext) {\n await super.onOpen(ctx);\n await this._params.onOpen();\n }\n\n override async onClose(err?: Error | undefined) {\n await this._params.onClose();\n await super.onClose(err);\n }\n}\n\ntype Services = {\n NotarizationService: NotarizationService;\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { EventSubscriptions, scheduleTask } from '@dxos/async';\nimport { Stream } from '@dxos/codec-protobuf';\nimport { raise, todo } from '@dxos/debug';\nimport { DataServiceSubscriptions, SpaceManager, SpaceNotFoundError } from '@dxos/echo-pipeline';\nimport { log } from '@dxos/log';\nimport {\n PostMessageRequest,\n QueryCredentialsRequest,\n QuerySpacesResponse,\n Space,\n SpaceMember,\n SpacesService,\n SubscribeMessagesRequest,\n UpdateSpaceRequest,\n WriteCredentialsRequest\n} from '@dxos/protocols/proto/dxos/client/services';\nimport { Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { GossipMessage } from '@dxos/protocols/proto/dxos/mesh/teleport/gossip';\nimport { humanize, Provider } from '@dxos/util';\n\nimport { IdentityManager } from '../identity';\nimport { DataSpace } from './data-space';\nimport { DataSpaceManager } from './data-space-manager';\n\nconst TIMEFRAME_UPDATE_DEBOUNCE_TIME = 500;\n\n/**\n *\n */\nexport class SpacesServiceImpl implements SpacesService {\n constructor(\n private readonly _identityManager: IdentityManager,\n private readonly _spaceManager: SpaceManager,\n private readonly _dataServiceSubscriptions: DataServiceSubscriptions,\n private readonly _getDataSpaceManager: Provider<Promise<DataSpaceManager>>\n ) {}\n\n async createSpace(): Promise<Space> {\n if (!this._identityManager.identity) {\n throw new Error('This device has no HALO identity available. See https://docs.dxos.org/guide/halo');\n }\n const dataSpaceManager = await this._getDataSpaceManager();\n const space = await dataSpaceManager.createSpace();\n return this._transformSpace(space);\n }\n\n async updateSpace(request: UpdateSpaceRequest) {\n todo();\n }\n\n querySpaces(): Stream<QuerySpacesResponse> {\n return new Stream<QuerySpacesResponse>(({ next, ctx }) => {\n const onUpdate = async () => {\n const dataSpaceManager = await this._getDataSpaceManager();\n const spaces = Array.from(dataSpaceManager.spaces.values()).map((space) => this._transformSpace(space));\n log('update', { spaces });\n next({ spaces });\n };\n\n scheduleTask(ctx, async () => {\n const dataSpaceManager = await this._getDataSpaceManager();\n\n const subscriptions = new EventSubscriptions();\n ctx.onDispose(() => subscriptions.clear());\n\n // TODO(dmaretskyi): Create a pattern for subscribing to a set of objects.\n const subscribeSpaces = () => {\n subscriptions.clear();\n\n for (const space of dataSpaceManager.spaces.values()) {\n subscriptions.add(space.stateUpdate.on(ctx, onUpdate));\n subscriptions.add(space.presence.updated.on(ctx, onUpdate));\n\n // Pipeline progress.\n space.inner.controlPipeline.state.timeframeUpdate\n .debounce(TIMEFRAME_UPDATE_DEBOUNCE_TIME)\n .on(ctx, onUpdate);\n if (space.dataPipeline.pipelineState) {\n subscriptions.add(\n space.dataPipeline.pipelineState.timeframeUpdate\n .debounce(TIMEFRAME_UPDATE_DEBOUNCE_TIME)\n .on(ctx, onUpdate)\n );\n }\n }\n };\n\n dataSpaceManager.updated.on(ctx, () => {\n subscribeSpaces();\n void onUpdate();\n });\n subscribeSpaces();\n\n void onUpdate();\n });\n\n if (!this._identityManager.identity) {\n next({ spaces: [] });\n }\n });\n }\n\n async postMessage({ spaceKey, channel, message }: PostMessageRequest) {\n const dataSpaceManager = await this._getDataSpaceManager();\n const space = dataSpaceManager.spaces.get(spaceKey) ?? raise(new SpaceNotFoundError(spaceKey));\n await space.postMessage(getChannelId(channel), message);\n }\n\n subscribeMessages({ spaceKey, channel }: SubscribeMessagesRequest) {\n return new Stream<GossipMessage>(({ ctx, next }) => {\n scheduleTask(ctx, async () => {\n const dataSpaceManager = await this._getDataSpaceManager();\n const space = dataSpaceManager.spaces.get(spaceKey) ?? raise(new SpaceNotFoundError(spaceKey));\n const handle = space.listen(getChannelId(channel), (message) => {\n next(message);\n });\n ctx.onDispose(() => handle.unsubscribe());\n });\n });\n }\n\n queryCredentials({ spaceKey }: QueryCredentialsRequest): Stream<Credential> {\n return new Stream(({ ctx, next }) => {\n const space = this._spaceManager.spaces.get(spaceKey) ?? raise(new SpaceNotFoundError(spaceKey));\n\n const processor = space.spaceState.registerProcessor({\n process: async (credential) => {\n next(credential);\n }\n });\n ctx.onDispose(() => processor.close());\n scheduleTask(ctx, () => processor.open());\n });\n }\n\n async writeCredentials({ spaceKey, credentials }: WriteCredentialsRequest) {\n const space = this._spaceManager.spaces.get(spaceKey) ?? raise(new SpaceNotFoundError(spaceKey));\n for (const credential of credentials ?? []) {\n await space.controlPipeline.writer.write({ credential: { credential } });\n }\n }\n\n private _transformSpace(space: DataSpace): Space {\n return {\n spaceKey: space.key,\n state: space.state,\n pipeline: {\n targetControlTimeframe: space.inner.controlPipeline.state.targetTimeframe,\n currentControlTimeframe: space.inner.controlPipeline.state.timeframe,\n currentDataTimeframe: space.dataPipeline.pipelineState?.timeframe,\n targetDataTimeframe: space.dataPipeline.pipelineState?.targetTimeframe\n },\n members: Array.from(space.inner.spaceState.members.values()).map((member) => ({\n identity: {\n identityKey: member.key,\n profile: {\n displayName: member.assertion.profile?.displayName ?? humanize(member.key)\n }\n },\n presence:\n this._identityManager.identity?.identityKey.equals(member.key) ||\n space.presence.getPeersOnline().filter(({ identityKey }) => identityKey.equals(member.key)).length > 0\n ? SpaceMember.PresenceState.ONLINE\n : SpaceMember.PresenceState.OFFLINE\n }))\n };\n }\n}\n\n// Add `user-channel` prefix to the channel name, so that it doesn't collide with the internal channels.\nconst getChannelId = (channel: string): string => `user-channel/${channel}`;\n", "//\n\n//\n// Copyright 2023 DXOS.org\n//\n\nimport { InvalidConfigError } from '@dxos/errors';\nimport { Runtime } from '@dxos/protocols/proto/dxos/config';\nimport { createStorage, StorageType } from '@dxos/random-access-storage';\n\nimport StorageDriver = Runtime.Client.Storage.StorageDriver;\n\n// TODO(burdon): Factor out.\nexport const createStorageObjects = (config: Runtime.Client.Storage) => {\n const {\n path = 'dxos/storage', // TODO(burdon): Factor out const.\n storageType,\n keyStorage,\n persistent = false\n } = config ?? {};\n\n if (persistent && storageType === StorageDriver.RAM) {\n throw new InvalidConfigError('RAM storage cannot be used in persistent mode.');\n }\n if (!persistent && storageType !== undefined && storageType !== StorageDriver.RAM) {\n throw new InvalidConfigError('Cannot use a persistent storage in not persistent mode.');\n }\n if (persistent && keyStorage === StorageDriver.RAM) {\n throw new InvalidConfigError('RAM key storage cannot be used in persistent mode.');\n }\n if (!persistent && keyStorage !== StorageDriver.RAM && keyStorage !== undefined) {\n throw new InvalidConfigError('Cannot use a persistent key storage in not persistent mode.');\n }\n\n return {\n storage: createStorage({\n type: persistent ? toStorageType(storageType) : StorageType.RAM,\n root: `${path}/`\n })\n };\n};\n\nconst toStorageType = (type: StorageDriver | undefined): StorageType | undefined => {\n switch (type) {\n case undefined:\n return undefined;\n case StorageDriver.RAM:\n return StorageType.RAM;\n case StorageDriver.CHROME:\n return StorageType.CHROME;\n case StorageDriver.FIREFOX:\n return StorageType.FIREFOX;\n case StorageDriver.IDB:\n return StorageType.IDB;\n case StorageDriver.NODE:\n return StorageType.NODE;\n default:\n throw new Error(`Invalid storage type: ${StorageDriver[type]}`);\n }\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { Stream } from '@dxos/codec-protobuf';\nimport { Config } from '@dxos/config';\nimport {\n SystemStatus,\n SystemStatusResponse,\n SystemService,\n UpdateSystemStatusRequest\n} from '@dxos/protocols/proto/dxos/client/services';\nimport { MaybePromise } from '@dxos/util';\n\nexport type SystemServiceOptions = {\n config?: Config;\n statusUpdate: Event<void>;\n getCurrentStatus: () => SystemStatus;\n onUpdateStatus: (status: SystemStatus) => MaybePromise<void>;\n onReset: () => MaybePromise<void>;\n};\n\n/**\n *\n */\nexport class SystemServiceImpl implements SystemService {\n private readonly _config?: SystemServiceOptions['config'];\n private readonly _statusUpdate: SystemServiceOptions['statusUpdate'];\n private readonly _getCurrentStatus: SystemServiceOptions['getCurrentStatus'];\n private readonly _onUpdateStatus: SystemServiceOptions['onUpdateStatus'];\n private readonly _onReset: SystemServiceOptions['onReset'];\n\n constructor({ config, statusUpdate, onUpdateStatus, getCurrentStatus, onReset }: SystemServiceOptions) {\n this._config = config;\n this._statusUpdate = statusUpdate;\n this._getCurrentStatus = getCurrentStatus;\n this._onUpdateStatus = onUpdateStatus;\n this._onReset = onReset;\n }\n\n async getConfig() {\n return this._config?.values ?? {};\n }\n\n async updateStatus({ status }: UpdateSystemStatusRequest) {\n await this._onUpdateStatus(status);\n }\n\n queryStatus(): Stream<SystemStatusResponse> {\n return new Stream(({ next }) => {\n const update = () => {\n next({ status: this._getCurrentStatus() });\n };\n\n update();\n const unsubscribe = this._statusUpdate.on(() => update());\n const interval = setInterval(update, 3000);\n\n return () => {\n clearInterval(interval);\n unsubscribe();\n };\n });\n }\n\n async reset() {\n await this._onReset();\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport { Config } from '@dxos/config';\nimport { log, logInfo } from '@dxos/log';\nimport { MemorySignalManager, MemorySignalManagerContext, WebsocketSignalManager } from '@dxos/messaging';\nimport { createWebRTCTransportFactory, NetworkManager } from '@dxos/network-manager';\nimport { RpcPort } from '@dxos/rpc';\nimport { getAsyncValue, Provider } from '@dxos/util';\n\nimport { LocalClientServices } from '../services';\nimport { ClientRpcServer, ClientRpcServerParams } from '../services/client-rpc-server';\nimport { ShellRuntime, ShellRuntimeImpl } from './shell-runtime';\n\nconst LOCK_KEY = 'DXOS_RESOURCE_LOCK';\n\nexport type IFrameHostRuntimeParams = {\n configProvider: Config | Provider<Promise<Config>>;\n appPort: RpcPort;\n shellPort?: RpcPort;\n};\n\n/**\n * Runs the client services in the main thread.\n *\n * Holds a lock over the client services such that only one instance can run at a time.\n * This should only be used when SharedWorker is not available.\n */\nexport class IFrameHostRuntime {\n private readonly _configProvider: Config | Provider<Promise<Config>>;\n private readonly _transportFactory = createWebRTCTransportFactory();\n private readonly _ready = new Trigger<Error | undefined>();\n\n private readonly _appPort: RpcPort;\n private readonly _shellPort?: RpcPort;\n private _config!: Config;\n\n // TODO(dmaretskyi): Replace with host and figure out how to return services provider here.\n private _clientServices!: LocalClientServices;\n private _clientRpc!: ClientRpcServer;\n private _shellRuntime?: ShellRuntimeImpl;\n\n @logInfo\n public origin?: string;\n\n constructor({ configProvider, appPort, shellPort }: IFrameHostRuntimeParams) {\n this._configProvider = configProvider;\n this._appPort = appPort;\n this._shellPort = shellPort;\n\n if (this._shellPort) {\n this._shellRuntime = new ShellRuntimeImpl(this._shellPort);\n }\n }\n\n get services() {\n return this._clientServices;\n }\n\n get shell(): ShellRuntime | undefined {\n return this._shellRuntime;\n }\n\n async start() {\n log('starting...');\n try {\n this._config = await getAsyncValue(this._configProvider);\n const signalServer = this._config.get('runtime.services.signal.server');\n this._clientServices = new LocalClientServices({\n lockKey: LOCK_KEY,\n config: this._config,\n networkManager: new NetworkManager({\n log: true,\n signalManager: signalServer\n ? new WebsocketSignalManager([signalServer])\n : new MemorySignalManager(new MemorySignalManagerContext()), // TODO(dmaretskyi): Inject this context.\n transportFactory: this._transportFactory\n })\n });\n\n const middleware: Pick<ClientRpcServerParams, 'handleCall' | 'handleStream'> = {\n handleCall: async (method, params, handler) => {\n const error = await this._ready.wait({ timeout: 3_000 });\n if (error) {\n throw error;\n }\n\n return handler(method, params);\n },\n handleStream: async (method, params, handler) => {\n const error = await this._ready.wait({ timeout: 3_000 });\n if (error) {\n throw error;\n }\n\n return handler(method, params);\n }\n };\n\n this._clientRpc = new ClientRpcServer({\n serviceRegistry: this._clientServices.host.serviceRegistry,\n port: this._appPort,\n ...middleware\n });\n\n await Promise.all([this._clientServices.open(), this._clientRpc.open(), this._shellRuntime?.open()]);\n this._ready.wake(undefined);\n log('started');\n } catch (err: any) {\n this._ready.wake(err);\n log.catch(err);\n }\n }\n\n async stop() {\n log('stopping...');\n await this._clientRpc.close();\n await this._clientServices.close();\n await this._shellRuntime?.close();\n log('stopped');\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { ClientServices } from '@dxos/client';\nimport { Any, ServiceHandler, Stream } from '@dxos/codec-protobuf';\nimport { raise } from '@dxos/debug';\nimport { parseMethodName, RpcPeer, RpcPeerOptions } from '@dxos/rpc';\nimport { MaybePromise } from '@dxos/util';\n\nimport { ServiceRegistry } from './service-registry';\n\nexport type ClientRpcServerParams = {\n serviceRegistry: ServiceRegistry<ClientServices>;\n handleCall?: (\n method: string,\n params: Any,\n handler: (method: string, params: Any) => MaybePromise<Any>\n ) => Promise<Any>;\n handleStream?: (\n method: string,\n params: Any,\n handler: (method: string, params: Any) => Stream<Any>\n ) => MaybePromise<Stream<Any>>;\n} & Omit<RpcPeerOptions, 'callHandler' | 'streamHandler'>;\n\nexport class ClientRpcServer {\n private readonly _serviceRegistry: ServiceRegistry<ClientServices>;\n private readonly _rpcPeer: RpcPeer;\n private readonly _handlerCache = new Map<string, ServiceHandler<any>>();\n private readonly _handleCall: ClientRpcServerParams['handleCall'];\n private readonly _handleStream: ClientRpcServerParams['handleStream'];\n\n constructor(params: ClientRpcServerParams) {\n const { serviceRegistry, handleCall, handleStream, ...rpcOptions } = params;\n this._handleCall = handleCall;\n this._handleStream = handleStream;\n\n this._serviceRegistry = serviceRegistry;\n this._rpcPeer = new RpcPeer({\n ...rpcOptions,\n callHandler: (method, params) => {\n const [serviceName, methodName] = parseMethodName(method);\n const handler = (method: string, params: Any) => this._getServiceHandler(serviceName).call(method, params);\n\n if (this._handleCall) {\n return this._handleCall(methodName, params, handler);\n } else {\n return handler(methodName, params);\n }\n },\n streamHandler: (method, params) => {\n const [serviceName, methodName] = parseMethodName(method);\n const handler = (method: string, params: Any) =>\n this._getServiceHandler(serviceName).callStream(method, params);\n\n if (this._handleStream) {\n return Stream.unwrapPromise(this._handleStream(methodName, params, handler));\n } else {\n return handler(methodName, params);\n }\n }\n });\n }\n\n async open() {\n await this._rpcPeer.open();\n }\n\n async close() {\n await this._rpcPeer.close();\n }\n\n private _getServiceHandler(serviceName: string) {\n if (!this._handlerCache.has(serviceName)) {\n const [key, descriptor] =\n Object.entries(this._serviceRegistry.descriptors).find(\n ([key, descriptor]) => descriptor.name === serviceName\n ) ?? raise(new Error(`Service not available: ${serviceName}`));\n\n const service = this._serviceRegistry.services[key as keyof ClientServices];\n if (!service) {\n throw new Error(`Service not available: ${serviceName}`);\n }\n\n this._handlerCache.set(serviceName, descriptor.createServer(service as any));\n }\n\n return this._handlerCache.get(serviceName)!;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event } from '@dxos/async';\nimport { appServiceBundle, AppServiceBundle, shellServiceBundle } from '@dxos/client';\nimport { PublicKey } from '@dxos/keys';\nimport { AppContextRequest, LayoutRequest, ShellLayout } from '@dxos/protocols/proto/dxos/iframe';\nimport { createProtoRpcPeer, ProtoRpcPeer, RpcPort } from '@dxos/rpc';\n\nexport interface ShellRuntime {\n layoutUpdate: Event<LayoutRequest>;\n layout: ShellLayout;\n invitationCode?: string;\n spaceKey?: PublicKey;\n setLayout: (layout: ShellLayout, options?: Omit<LayoutRequest, 'layout'>) => void;\n setAppContext: (context: AppContextRequest) => Promise<void>;\n}\n\n/**\n * Endpoint that handles shell services.\n */\nexport class ShellRuntimeImpl implements ShellRuntime {\n readonly layoutUpdate = new Event<LayoutRequest>();\n private _appRpc?: ProtoRpcPeer<AppServiceBundle>;\n private _layout = ShellLayout.DEFAULT;\n private _invitationCode?: string;\n private _spaceKey?: PublicKey;\n\n constructor(private readonly _port: RpcPort) {}\n\n get layout() {\n return this._layout;\n }\n\n get invitationCode() {\n return this._invitationCode;\n }\n\n get spaceKey() {\n return this._spaceKey;\n }\n\n setLayout(layout: ShellLayout, options: Omit<LayoutRequest, 'layout'> = {}) {\n this._layout = layout;\n this._invitationCode = options.invitationCode;\n this._spaceKey = options.spaceKey;\n this.layoutUpdate.emit({ layout, ...options });\n }\n\n async setAppContext(context: AppContextRequest) {\n assert(this._appRpc, 'runtime not open');\n\n await this._appRpc.rpc.AppService.setContext(context);\n }\n\n async open() {\n this._appRpc = createProtoRpcPeer({\n requested: appServiceBundle,\n exposed: shellServiceBundle,\n handlers: {\n ShellService: {\n setLayout: async (request) => {\n this._layout = request.layout;\n this._invitationCode = request.invitationCode;\n this._spaceKey = request.spaceKey;\n this.layoutUpdate.emit(request);\n }\n }\n },\n port: this._port\n });\n\n await this._appRpc.open();\n }\n\n async close() {\n await this._appRpc?.close();\n this._appRpc = undefined;\n }\n}\n\nexport class MemoryShellRuntime implements ShellRuntime {\n readonly layoutUpdate = new Event<LayoutRequest>();\n readonly contextUpdate = new Event<AppContextRequest>();\n private _layout: ShellLayout;\n private _invitationCode?: string;\n private _spaceKey?: PublicKey;\n\n constructor({ layout, invitationCode, spaceKey }: Partial<LayoutRequest> & Partial<AppContextRequest> = {}) {\n this._layout = layout ?? ShellLayout.DEFAULT;\n this._invitationCode = invitationCode;\n this._spaceKey = spaceKey;\n }\n\n get layout() {\n return this._layout;\n }\n\n get invitationCode() {\n return this._invitationCode;\n }\n\n get spaceKey() {\n return this._spaceKey;\n }\n\n setLayout(layout: ShellLayout, options: Omit<LayoutRequest, 'layout'> = {}) {\n this._layout = layout;\n this._invitationCode = options.invitationCode;\n this._spaceKey = options.spaceKey;\n this.layoutUpdate.emit({ layout, ...options });\n }\n\n async setAppContext(context: AppContextRequest) {\n this.contextUpdate.emit(context);\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { iframeServiceBundle, workerServiceBundle, WorkerServiceBundle } from '@dxos/client';\nimport { WebRTCTransportService } from '@dxos/network-manager';\nimport { BridgeService } from '@dxos/protocols/proto/dxos/mesh/bridge';\nimport { createProtoRpcPeer, ProtoRpcPeer, RpcPort } from '@dxos/rpc';\n\nimport { ShellRuntime, ShellRuntimeImpl } from './shell-runtime';\n\n// NOTE: Keep as RpcPorts to avoid dependency on @dxos/rpc-tunnel so we don't depend on browser-specific apis.\nexport type IFrameProxyRuntimeParams = {\n systemPort: RpcPort;\n workerAppPort: RpcPort;\n windowAppPort: RpcPort;\n shellPort?: RpcPort;\n};\n\n/**\n * Manages the client connection to the shared worker.\n */\nexport class IFrameProxyRuntime {\n private readonly _systemPort: RpcPort;\n private readonly _windowAppPort: RpcPort;\n private readonly _workerAppPort: RpcPort;\n private readonly _shellPort?: RpcPort;\n private readonly _systemRpc: ProtoRpcPeer<WorkerServiceBundle>;\n private readonly _shellRuntime?: ShellRuntimeImpl;\n private readonly _transportService = new WebRTCTransportService();\n\n constructor({ systemPort, workerAppPort, windowAppPort, shellPort }: IFrameProxyRuntimeParams) {\n this._systemPort = systemPort;\n this._windowAppPort = windowAppPort;\n this._workerAppPort = workerAppPort;\n this._shellPort = shellPort;\n\n this._systemRpc = createProtoRpcPeer({\n requested: workerServiceBundle,\n exposed: iframeServiceBundle,\n handlers: {\n BridgeService: this._transportService as BridgeService,\n IframeService: {\n async heartbeat() {\n // Ok.\n }\n }\n },\n port: this._systemPort,\n timeout: 200\n });\n\n this._workerAppPort.subscribe((msg) => this._windowAppPort.send(msg));\n this._windowAppPort.subscribe((msg) => this._workerAppPort.send(msg));\n\n if (this._shellPort) {\n this._shellRuntime = new ShellRuntimeImpl(this._shellPort);\n }\n }\n\n get shell(): ShellRuntime | undefined {\n return this._shellRuntime;\n }\n\n async open(origin: string) {\n await this._systemRpc.open();\n await this._systemRpc.rpc.WorkerService.start({ origin });\n await this._shellRuntime?.open();\n }\n\n async close() {\n await this._shellRuntime?.close();\n await this._systemRpc.rpc.WorkerService.stop();\n await this._systemRpc.close();\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { asyncTimeout, Trigger } from '@dxos/async';\nimport { log, logInfo } from '@dxos/log';\nimport { MaybePromise } from '@dxos/util';\n\nenum Message {\n ACQUIRING = 'acquiring'\n}\n\nexport type VaultResourceLockOptions = {\n lockKey: string;\n onAcquire?: () => MaybePromise<void>;\n onRelease?: () => MaybePromise<void>;\n};\n\nexport class VaultResourceLock {\n private readonly _broadcastChannel = new BroadcastChannel('vault-resource-lock');\n private readonly _lockKey: string;\n private readonly _onAcquire: VaultResourceLockOptions['onAcquire'];\n private readonly _onRelease: VaultResourceLockOptions['onRelease'];\n private _releaseTrigger = new Trigger();\n\n constructor({ lockKey, onAcquire, onRelease }: VaultResourceLockOptions) {\n this._lockKey = lockKey;\n this._onAcquire = onAcquire;\n this._onRelease = onRelease;\n this._broadcastChannel.onmessage = this._onMessage.bind(this);\n }\n\n @logInfo\n get lockKey() {\n return this._lockKey;\n }\n\n async acquire() {\n this._broadcastChannel.postMessage({\n message: Message.ACQUIRING\n });\n\n try {\n log('aquiring lock...');\n await asyncTimeout(this._requestLock(), 3_000);\n log('acquired lock');\n } catch {\n log('stealing lock...');\n await this._requestLock(true);\n log('stolen lock');\n }\n }\n\n async release() {\n this._releaseTrigger.wake();\n }\n\n private _onMessage(event: MessageEvent<any>) {\n if (event.data.message === Message.ACQUIRING) {\n this._releaseTrigger.wake();\n }\n }\n\n private async _requestLock(steal = false) {\n log('requesting lock...', { steal });\n const acquired = new Trigger();\n\n void navigator.locks\n .request(this._lockKey, { steal }, async () => {\n await this._onAcquire?.();\n acquired.wake();\n this._releaseTrigger = new Trigger();\n await this._releaseTrigger.wait();\n log('releasing lock...');\n await this._onRelease?.();\n log('released lock');\n })\n .catch(async () => {\n await this._onRelease?.();\n });\n\n await acquired.wait();\n log('recieved lock', { steal });\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport { Config } from '@dxos/config';\nimport { log } from '@dxos/log';\nimport { MemorySignalManager, MemorySignalManagerContext, WebsocketSignalManager } from '@dxos/messaging';\nimport { NetworkManager, WebRTCTransportProxyFactory } from '@dxos/network-manager';\nimport { RpcPort } from '@dxos/rpc';\nimport { MaybePromise } from '@dxos/util';\n\nimport { ClientServicesHost } from '../services';\nimport { WorkerSession } from './worker-session';\n\n// NOTE: Keep as RpcPorts to avoid dependency on @dxos/rpc-tunnel so we don't depend on browser-specific apis.\nexport type CreateSessionParams = {\n appPort: RpcPort;\n systemPort: RpcPort;\n shellPort: RpcPort;\n};\n\n/**\n * Runtime for the shared worker.\n * Manages connections from proxies (in tabs).\n * Tabs make requests to the `ClientServicesHost`, and provide a WebRTC gateway.\n */\nexport class WorkerRuntime {\n private readonly _transportFactory = new WebRTCTransportProxyFactory();\n private readonly _ready = new Trigger<Error | undefined>();\n private readonly sessions = new Set<WorkerSession>();\n private _sessionForNetworking?: WorkerSession;\n private _clientServices!: ClientServicesHost;\n private _config!: Config;\n\n // prettier-ignore\n constructor(\n private readonly _configProvider: () => MaybePromise<Config>\n ) {\n this._clientServices = new ClientServicesHost();\n }\n\n async start() {\n log('starting...');\n try {\n this._config = await this._configProvider();\n const signalServer = this._config.get('runtime.services.signal.server');\n this._clientServices.initialize({\n config: this._config,\n networkManager: new NetworkManager({\n log: true,\n signalManager: signalServer\n ? new WebsocketSignalManager([signalServer])\n : new MemorySignalManager(new MemorySignalManagerContext()), // TODO(dmaretskyi): Inject this context.\n transportFactory: this._transportFactory\n })\n });\n\n await this._clientServices.open();\n this._ready.wake(undefined);\n log('started');\n } catch (err: any) {\n this._ready.wake(err);\n log.catch(err);\n }\n }\n\n async stop() {\n // TODO(dmaretskyi): Terminate active sessions.\n await this._clientServices.close();\n }\n\n /**\n * Create a new session.\n */\n async createSession({ appPort, systemPort, shellPort }: CreateSessionParams) {\n const session = new WorkerSession({\n serviceHost: this._clientServices,\n appPort,\n systemPort,\n shellPort,\n readySignal: this._ready\n });\n\n // When tab is closed.\n session.onClose.set(async () => {\n this.sessions.delete(session);\n this._reconnectWebrtc();\n });\n\n await session.open();\n this.sessions.add(session);\n\n this._reconnectWebrtc();\n }\n\n /**\n * Selects one of the existing session fro WebRTC networking.\n */\n private _reconnectWebrtc() {\n // Check if current session is already closed.\n if (this._sessionForNetworking) {\n if (!this.sessions.has(this._sessionForNetworking)) {\n this._sessionForNetworking = undefined;\n }\n }\n\n // Select existing session.\n if (!this._sessionForNetworking) {\n const selected = Array.from(this.sessions).find((session) => session.bridgeService);\n if (selected) {\n this._sessionForNetworking = selected;\n this._transportFactory.setBridgeService(selected.bridgeService);\n } else {\n this._transportFactory.setBridgeService(undefined);\n }\n }\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { asyncTimeout, Trigger } from '@dxos/async';\nimport { iframeServiceBundle, IframeServiceBundle, workerServiceBundle } from '@dxos/client';\nimport { log, logInfo } from '@dxos/log';\nimport { BridgeService } from '@dxos/protocols/proto/dxos/mesh/bridge';\nimport { createProtoRpcPeer, ProtoRpcPeer, RpcPort } from '@dxos/rpc';\nimport { Callback } from '@dxos/util';\n\nimport { ClientServicesHost } from '../services';\nimport { ClientRpcServer, ClientRpcServerParams } from '../services/client-rpc-server';\n\nexport type WorkerSessionParams = {\n serviceHost: ClientServicesHost;\n systemPort: RpcPort;\n appPort: RpcPort;\n shellPort: RpcPort;\n readySignal: Trigger<Error | undefined>;\n options?: {\n heartbeatInterval: number;\n };\n};\n\n/**\n * Represents a tab connection within the worker.\n */\nexport class WorkerSession {\n private readonly _clientRpc: ClientRpcServer;\n private readonly _shellClientRpc: ClientRpcServer;\n private readonly _iframeRpc: ProtoRpcPeer<IframeServiceBundle>;\n private readonly _startTrigger = new Trigger();\n private readonly _serviceHost: ClientServicesHost;\n private readonly _options: NonNullable<WorkerSessionParams['options']>;\n private _heartbeatTimer?: NodeJS.Timeout;\n\n public readonly onClose = new Callback<() => Promise<void>>();\n\n @logInfo\n public origin?: string;\n\n public bridgeService?: BridgeService;\n\n constructor({\n serviceHost,\n systemPort,\n appPort,\n shellPort,\n readySignal,\n options = {\n heartbeatInterval: 1_000\n }\n }: WorkerSessionParams) {\n assert(options);\n assert(serviceHost);\n this._options = options;\n this._serviceHost = serviceHost;\n\n const middleware: Pick<ClientRpcServerParams, 'handleCall' | 'handleStream'> = {\n handleCall: async (method, params, handler) => {\n const error = await readySignal.wait({ timeout: 3_000 });\n if (error) {\n throw error;\n }\n\n return handler(method, params);\n },\n handleStream: async (method, params, handler) => {\n const error = await readySignal.wait({ timeout: 3_000 });\n if (error) {\n throw error;\n }\n\n return handler(method, params);\n }\n };\n\n this._clientRpc = new ClientRpcServer({\n serviceRegistry: this._serviceHost.serviceRegistry,\n port: appPort,\n ...middleware\n });\n this._shellClientRpc = new ClientRpcServer({\n serviceRegistry: this._serviceHost.serviceRegistry,\n port: shellPort,\n ...middleware\n });\n\n this._iframeRpc = createProtoRpcPeer({\n requested: iframeServiceBundle,\n exposed: workerServiceBundle,\n handlers: {\n WorkerService: {\n start: async (request) => {\n this.origin = request.origin;\n this._startTrigger.wake();\n },\n\n stop: async () => {\n setTimeout(async () => {\n try {\n await this.close();\n } catch (err: any) {\n log.catch(err);\n }\n });\n }\n }\n },\n port: systemPort,\n timeout: 1000 // With low timeout heartbeat may fail if the tab's thread is saturated.\n });\n\n this.bridgeService = this._iframeRpc.rpc.BridgeService;\n }\n\n async open() {\n log.info('opening..');\n await Promise.all([this._clientRpc.open(), this._iframeRpc.open(), this._maybeOpenShell()]);\n\n await this._startTrigger.wait({ timeout: 3_000 });\n\n // Detect if bridge is present.\n // TODO(burdon): Add heartbeat to client's System service.\n // How do we detect if the client's tab closed?\n this._heartbeatTimer = setInterval(async () => {\n try {\n await this._iframeRpc.rpc.IframeService.heartbeat();\n } catch (err) {\n log.warn('Heartbeat failed', { err });\n try {\n await this.close();\n } catch (err: any) {\n log.catch(err);\n }\n }\n }, this._options.heartbeatInterval);\n }\n\n async close() {\n log.info('closing..');\n try {\n await this.onClose.callIfSet();\n } catch (err: any) {\n log.catch(err);\n }\n\n if (this._heartbeatTimer !== undefined) {\n clearInterval(this._heartbeatTimer);\n }\n\n await Promise.all([this._clientRpc.close(), this._iframeRpc.close()]);\n }\n\n private async _maybeOpenShell() {\n try {\n await asyncTimeout(this._shellClientRpc.open(), 1_000);\n } catch {\n log.info('No shell connected.');\n }\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport { CredentialConsumer, getCredentialAssertion } from '@dxos/credentials';\nimport { failUndefined } from '@dxos/debug';\nimport {\n valueEncoding,\n MetadataStore,\n SpaceManager,\n SigningContext,\n DataServiceSubscriptions,\n SnapshotStore\n} from '@dxos/echo-pipeline';\nimport { FeedFactory, FeedStore } from '@dxos/feed-store';\nimport { Keyring } from '@dxos/keyring';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ModelFactory } from '@dxos/model-factory';\nimport { NetworkManager } from '@dxos/network-manager';\nimport { trace } from '@dxos/protocols';\nimport type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { Storage } from '@dxos/random-access-storage';\n\nimport { CreateIdentityOptions, IdentityManager, JoinIdentityParams } from '../identity';\nimport { DeviceInvitationsHandler, SpaceInvitationsHandler } from '../invitations';\nimport { DataSpaceManager } from '../spaces';\n\n/**\n * Shared backend for all client services.\n */\n// TODO(burdon): Rename/break-up into smaller components. And/or make members private.\nexport class ServiceContext {\n public readonly initialized = new Trigger();\n public readonly dataServiceSubscriptions = new DataServiceSubscriptions();\n public readonly metadataStore: MetadataStore;\n public readonly snapshotStore: SnapshotStore;\n public readonly feedStore: FeedStore<FeedMessage>;\n public readonly keyring: Keyring;\n public readonly spaceManager: SpaceManager;\n public readonly identityManager: IdentityManager;\n public readonly deviceInvitations: DeviceInvitationsHandler;\n\n private _deviceSpaceSync?: CredentialConsumer<any>;\n\n // Initialized after identity is initialized.\n public dataSpaceManager?: DataSpaceManager;\n public spaceInvitations?: SpaceInvitationsHandler;\n\n private readonly _instanceId = PublicKey.random().toHex();\n\n // prettier-ignore\n constructor(\n public readonly storage: Storage,\n public readonly networkManager: NetworkManager,\n public readonly modelFactory: ModelFactory\n ) {\n // TODO(burdon): Move strings to constants.\n this.metadataStore = new MetadataStore(storage.createDirectory('metadata'));\n this.snapshotStore = new SnapshotStore(storage.createDirectory('snapshots'));\n\n this.keyring = new Keyring(storage.createDirectory('keyring'));\n this.feedStore = new FeedStore<FeedMessage>({\n factory: new FeedFactory<FeedMessage>({\n root: storage.createDirectory('feeds'),\n signer: this.keyring,\n hypercore: {\n valueEncoding\n }\n })\n });\n\n this.spaceManager = new SpaceManager({\n feedStore: this.feedStore,\n networkManager: this.networkManager\n });\n\n this.identityManager = new IdentityManager(\n this.metadataStore,\n this.keyring,\n this.feedStore,\n this.spaceManager\n );\n\n // TODO(burdon): _initialize called in multiple places.\n // TODO(burdon): Call _initialize on success.\n this.deviceInvitations = new DeviceInvitationsHandler({\n networkManager: this.networkManager,\n getIdentity: () => this.identityManager.identity ?? failUndefined(),\n acceptIdentity: this._acceptIdentity.bind(this),\n keyring: this.keyring\n });\n }\n\n async open() {\n log.trace('dxos.sdk.client-services', trace.begin({ id: this._instanceId }));\n\n log('opening...');\n await this.networkManager.open();\n await this.spaceManager.open();\n await this.identityManager.open();\n if (this.identityManager.identity) {\n await this._initialize();\n }\n log('opened');\n }\n\n async close() {\n log('closing...');\n await this._deviceSpaceSync?.close();\n await this.dataSpaceManager?.close();\n await this.identityManager.close();\n await this.spaceManager.close();\n await this.feedStore.close();\n await this.networkManager.close();\n this.dataServiceSubscriptions.clear();\n log('closed');\n\n log.trace('dxos.sdk.client-services', trace.end({ id: this._instanceId }));\n }\n\n async reset() {\n log('resetting...');\n await this.close();\n await this.storage.reset();\n log('reset');\n }\n\n async createIdentity(params: CreateIdentityOptions = {}) {\n const identity = await this.identityManager.createIdentity(params);\n\n await this._initialize();\n return identity;\n }\n\n private async _acceptIdentity(params: JoinIdentityParams) {\n const identity = await this.identityManager.acceptIdentity(params);\n\n await this._initialize();\n return identity;\n }\n\n // Called when identity is created.\n private async _initialize() {\n log('initializing spaces...');\n const identity = this.identityManager.identity ?? failUndefined();\n const signingContext: SigningContext = {\n credentialSigner: identity.getIdentityCredentialSigner(),\n identityKey: identity.identityKey,\n deviceKey: identity.deviceKey,\n profile: identity.profileDocument,\n recordCredential: async (credential) => {\n await identity.controlPipeline.writer.write({ credential: { credential } });\n }\n };\n\n this.dataSpaceManager = new DataSpaceManager(\n this.spaceManager,\n this.metadataStore,\n this.dataServiceSubscriptions,\n this.keyring,\n signingContext,\n this.modelFactory,\n this.feedStore,\n this.snapshotStore\n );\n await this.dataSpaceManager.open();\n\n this.spaceInvitations = new SpaceInvitationsHandler(\n this.networkManager,\n this.dataSpaceManager,\n signingContext,\n this.keyring\n );\n this.initialized.wake();\n\n this._deviceSpaceSync = identity.space.spaceState.registerProcessor({\n process: async (credential: Credential) => {\n const assertion = getCredentialAssertion(credential);\n if (assertion['@type'] !== 'dxos.halo.credentials.SpaceMember') {\n return;\n }\n if (assertion.spaceKey.equals(identity.space.key)) {\n // ignore halo space\n return;\n }\n if (!this.dataSpaceManager) {\n log('dataSpaceManager not initialized yet, ignoring space admission', { details: assertion });\n return;\n }\n if (this.dataSpaceManager.spaces.has(assertion.spaceKey)) {\n log('space already exists, ignoring space admission', { details: assertion });\n return;\n }\n\n try {\n log('accepting space recorded in halo', { details: assertion });\n await this.dataSpaceManager.acceptSpace({\n spaceKey: assertion.spaceKey,\n genesisFeedKey: assertion.genesisFeedKey\n });\n } catch (err) {\n log.catch(err);\n }\n }\n });\n await this._deviceSpaceSync.open();\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { ServiceBundle } from '@dxos/rpc';\n\n/**\n * Registry of operational services.\n */\nexport class ServiceRegistry<Services> {\n // prettier-ignore\n constructor (\n private readonly _serviceBundle: ServiceBundle<Services>,\n private _handlers: Partial<Services> = {}\n ) {}\n\n get descriptors() {\n return this._serviceBundle;\n }\n\n get services() {\n return this._handlers;\n }\n\n setServices(services: Partial<Services>) {\n this._handlers = services;\n }\n\n addService(name: keyof Services, service: Services[keyof Services]) {\n this._handlers[name] = service;\n }\n\n removeService(name: keyof Services) {\n delete this._handlers[name];\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { ClientServices, ClientServicesProvider } from '@dxos/client';\nimport { ServiceBundle } from '@dxos/rpc';\n\nimport { ClientServicesHost, ClientServicesHostParams } from './service-host';\n\n/**\n * Starts a local instance of the service host.\n */\nexport class LocalClientServices implements ClientServicesProvider {\n private readonly _host: ClientServicesHost;\n\n constructor(params: ClientServicesHostParams) {\n this._host = new ClientServicesHost(params);\n }\n\n get descriptors(): ServiceBundle<ClientServices> {\n return this._host.descriptors;\n }\n\n get services(): Partial<ClientServices> {\n return this._host.services;\n }\n\n get host(): ClientServicesHost {\n return this._host;\n }\n\n async open(): Promise<void> {\n await this._host.open();\n }\n\n async close(): Promise<void> {\n await this._host.close();\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { ClientServicesProvider } from '@dxos/client';\nimport { Config } from '@dxos/config';\nimport { log } from '@dxos/log';\nimport { MemorySignalManager, MemorySignalManagerContext, WebsocketSignalManager } from '@dxos/messaging';\nimport {\n createWebRTCTransportFactory,\n MemoryTransportFactory,\n NetworkManager,\n NetworkManagerOptions\n} from '@dxos/network-manager';\n\nimport { LocalClientServices } from './local-client-services';\n\n/**\n * Creates stand-alone services without rpc.\n */\nexport const fromHost = (config: Config = new Config()): ClientServicesProvider => {\n return new LocalClientServices({\n config,\n networkManager: createNetworkManager(config)\n });\n};\n\n/**\n * Creates a WebRTC network manager connected to the specified signal server.\n */\n// TODO(burdon): Move to client-services and remove dependencies from here.\nconst createNetworkManager = (config: Config, options: Partial<NetworkManagerOptions> = {}): NetworkManager => {\n const signalServer = config.get('runtime.services.signal.server');\n if (signalServer) {\n const {\n log = true,\n signalManager = new WebsocketSignalManager([signalServer]),\n transportFactory = createWebRTCTransportFactory({\n iceServers: config.get('runtime.services.ice')\n })\n } = options;\n\n return new NetworkManager({ log, signalManager, transportFactory });\n }\n\n // TODO(burdon): Should not provide a memory signal manager since no shared context.\n // Use TestClientBuilder for shared memory tests.\n log.warn('P2P network is not configured.');\n return new NetworkManager({\n signalManager: new MemorySignalManager(new MemorySignalManagerContext()),\n transportFactory: MemoryTransportFactory\n });\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Trigger } from '@dxos/async';\nimport { InvitationsHandler } from '@dxos/client';\nimport { raise } from '@dxos/debug';\nimport { Invitation } from '@dxos/protocols/proto/dxos/client/services';\n\nexport const performInvitation = async <T>(host: InvitationsHandler<T>, guest: InvitationsHandler<T>, context: T) => {\n const done1 = new Trigger<Invitation>(); // peer 1 connected.\n const done2 = new Trigger<Invitation>(); // peer 2 connected.\n const observable1 = await host.createInvitation(context, { type: Invitation.Type.INTERACTIVE_TESTING });\n observable1.subscribe({\n onConnecting: async (invitation1: Invitation) => {\n const observable2 = await guest.acceptInvitation(invitation1, { type: Invitation.Type.INTERACTIVE_TESTING });\n observable2.subscribe({\n onConnecting: async (invitation2: Invitation) => {\n assert(invitation1.swarmKey!.equals(invitation2.swarmKey!));\n },\n onConnected: async (invitation2: Invitation) => {},\n onSuccess: (invitation) => {\n done2.wake(invitation);\n },\n onCancelled: () => raise(new Error()),\n onTimeout: (err: Error) => raise(err),\n onError: (err: Error) => raise(err)\n });\n },\n onConnected: async (invitation1: Invitation) => {},\n onCancelled: () => raise(new Error('cancelled')),\n onSuccess: (invitation) => {\n done1.wake(invitation);\n },\n onTimeout: (err: Error) => raise(err),\n onError: (err: Error) => raise(err)\n });\n\n await done1.wait();\n await done2.wait();\n};\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { asyncTimeout, Trigger } from '@dxos/async';\nimport { Client, ClientServices, ClientServicesProxy, createDefaultModelFactory, Invitation } from '@dxos/client';\nimport { Config } from '@dxos/config';\nimport { raise } from '@dxos/debug';\nimport { DocumentModel } from '@dxos/document-model';\nimport { DatabaseBackendProxy, genesisMutation } from '@dxos/echo-db';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { MemorySignalManager, MemorySignalManagerContext, WebsocketSignalManager } from '@dxos/messaging';\nimport { createWebRTCTransportFactory, MemoryTransportFactory, NetworkManager } from '@dxos/network-manager';\nimport { Storage } from '@dxos/random-access-storage';\nimport { createLinkedPorts, createProtoRpcPeer, ProtoRpcPeer } from '@dxos/rpc';\n\nimport { ClientServicesHost, LocalClientServices } from '../services';\n\nexport const testConfigWithLocalSignal = new Config({\n version: 1,\n runtime: {\n services: {\n signal: {\n // TODO(burdon): Port numbers and global consts?\n server: 'ws://localhost:4000/.well-known/dx/signal'\n }\n }\n }\n});\n\n/**\n * Client builder supports different configurations, incl. signaling, transports, storage.\n */\nexport class TestBuilder {\n private readonly _config: Config;\n\n public storage?: Storage;\n\n // prettier-ignore\n constructor (\n config?: Config,\n private readonly _modelFactory = createDefaultModelFactory(),\n private readonly _signalManagerContext = new MemorySignalManagerContext()\n ) {\n this._config = config ?? new Config();\n }\n\n get config(): Config {\n return this._config;\n }\n\n /**\n * Get network manager using local shared memory or remote signal manager.\n */\n get networkManager() {\n const signalServer = this._config.get('runtime.services.signal.server');\n if (signalServer) {\n return new NetworkManager({\n log: true,\n signalManager: new WebsocketSignalManager([signalServer]),\n transportFactory: createWebRTCTransportFactory({\n iceServers: this._config.get('runtime.services.ice')\n })\n });\n }\n\n // Memory transport with shared context.\n return new NetworkManager({\n log: true,\n signalManager: new MemorySignalManager(this._signalManagerContext),\n transportFactory: MemoryTransportFactory\n });\n }\n\n /**\n * Create backend service handlers.\n */\n createClientServicesHost() {\n return new ClientServicesHost({\n config: this._config,\n modelFactory: this._modelFactory,\n networkManager: this.networkManager,\n storage: this.storage\n });\n }\n\n /**\n * Create local services host.\n */\n createLocal() {\n return new LocalClientServices({\n config: this._config,\n modelFactory: this._modelFactory,\n networkManager: this.networkManager,\n storage: this.storage\n });\n }\n\n /**\n * Create client/server.\n */\n createClientServer(host: ClientServicesHost = this.createClientServicesHost()): [Client, ProtoRpcPeer<{}>] {\n const [proxyPort, hostPort] = createLinkedPorts();\n const server = createProtoRpcPeer({\n exposed: host.descriptors,\n handlers: host.services as ClientServices,\n port: hostPort\n });\n // TODO(dmaretskyi): Refactor.\n\n const client = new Client({ services: new ClientServicesProxy(proxyPort) });\n return [client, server];\n }\n}\n\nexport const testSpace = async (create: DatabaseBackendProxy, check: DatabaseBackendProxy = create) => {\n const objectId = PublicKey.random().toHex();\n\n const result = create.mutate(genesisMutation(objectId, DocumentModel.meta.type));\n\n await result.batch.getReceipt();\n // TODO(dmaretskiy): await result.waitToBeProcessed()\n assert(create._itemManager.entities.has(result.objectsUpdated[0].id));\n\n await asyncTimeout(\n check.itemUpdate.waitForCondition(() => check._itemManager.entities.has(objectId)),\n 1000\n );\n\n return result;\n};\n\nexport const syncItems = async (db1: DatabaseBackendProxy, db2: DatabaseBackendProxy) => {\n // Check item replicated from 1 => 2.\n await testSpace(db1, db2);\n\n // Check item replicated from 2 => 1.\n await testSpace(db2, db1);\n};\n\nexport const joinCommonSpace = async ([initialPeer, ...peers]: Client[], spaceKey?: PublicKey): Promise<PublicKey> => {\n const rootSpace = spaceKey ? initialPeer.getSpace(spaceKey) : await initialPeer.createSpace();\n assert(rootSpace, 'Space not found.');\n\n await Promise.all(\n peers.map(async (peer) => {\n const hostDone = new Trigger<Invitation>();\n const guestDone = new Trigger<Invitation>();\n\n const hostObservabli = rootSpace.createInvitation({ type: Invitation.Type.INTERACTIVE_TESTING });\n log('invitation created');\n hostObservabli.subscribe({\n onConnecting: (invitation) => {\n const guestObservable = peer.acceptInvitation(invitation);\n log('invitation accepted');\n\n guestObservable.subscribe({\n onSuccess: (invitation: Invitation) => {\n guestDone.wake(invitation);\n log('invitation guestDone');\n },\n onError: (err: Error) => raise(err)\n });\n },\n onSuccess: (invitation) => {\n hostDone.wake(invitation);\n log('invitation hostDone');\n },\n onError: (err) => raise(err)\n });\n\n await Promise.all([hostDone.wait(), guestDone.wait()]);\n })\n );\n\n return rootSpace.key;\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["createMockCredential", "signer", "issuer", "createCredential", "subject", "PublicKey", "Buffer", "from", "assertion", "payload", "value", "import_client", "import_credentials", "import_echo_pipeline", "import_feed_store", "import_keyring", "import_messaging", "import_network_manager", "import_random_access_storage", "import_node_assert", "import_async", "import_client", "import_debug", "import_echo_pipeline", "import_log", "import_protocols", "import_services", "TracingServiceImpl", "constructor", "_config", "setTracingOptions", "Error", "subscribeToRpcTrace", "DevicesServiceImpl", "constructor", "_identityManager", "updateDevice", "request", "Error", "queryDevices", "Stream", "next", "update", "deviceKeys", "identity", "authorizedDeviceKeys", "devices", "Array", "from", "values", "map", "key", "_a", "deviceKey", "kind", "equals", "DeviceKind", "CURRENT", "TRUSTED", "subscriptions", "EventSubscriptions", "add", "stateUpdate", "on", "clear", "import_async", "import_codec_protobuf", "import_async", "import_codec_protobuf", "import_keys", "subscribeToFeeds", "feedStore", "feedKeys", "Stream", "next", "length", "subscriptions", "EventSubscriptions", "feedMap", "ComplexMap", "PublicKey", "hash", "update", "feeds", "filter", "feed", "some", "feedKey", "equals", "key", "forEach", "has", "set", "on", "add", "off", "Array", "from", "values", "map", "properties", "feedOpened", "clear", "subscribeToFeedBlocks", "maxBlocks", "timeout", "setTimeout", "getFeed", "iterator", "FeedIterator", "open", "blocks", "block", "push", "slice", "close", "clearTimeout", "import_codec_protobuf", "subscribeToKeyringKeys", "keyring", "Stream", "next", "update", "keys", "list", "unsubscribe", "keysUpdate", "on", "import_codec_protobuf", "import_keys", "subscribeToNetworkStatus", "networkManager", "Stream", "next", "close", "update", "status", "signalManager", "getStatus", "servers", "err", "statusChanged", "on", "subscribeToSignal", "ctx", "Context", "onMessage", "message", "author", "asUint8Array", "recipient", "payload", "receivedAt", "Date", "swarmEvent", "dispose", "subscribeToSwarmInfo", "networkManager", "Stream", "next", "update", "_a", "info", "connectionLog", "swarms", "data", "on", "import_codec_protobuf", "subscribeToSpaces", "context", "spaceKeys", "Stream", "next", "unsubscribe", "update", "spaces", "spaceManager", "values", "filteredSpaces", "filter", "space", "length", "some", "spaceKey", "equals", "key", "map", "spaceMetadata", "metadataStore", "find", "isOpen", "timeframe", "dataTimeframe", "genesisFeed", "genesisFeedKey", "controlFeed", "controlFeedKey", "dataFeed", "dataFeedKey", "timeout", "setTimeout", "initialized", "wait", "dataSpaceManager", "updated", "on", "clearTimeout", "DevtoolsHostEvents", "ready", "AsyncEvent", "DevtoolsServiceImpl", "constructor", "params", "events", "request", "Stream", "next", "on", "getConfig", "Error", "resetStorage", "enableDebugLogging", "disableDebugLogging", "subscribeToKeyringKeys", "keyring", "context", "subscribeToCredentialMessages", "subscribeToSpaces", "subscribeToItems", "subscribeToFeeds", "feedStore", "subscribeToFeedBlocks", "getSpaceSnapshot", "saveSpaceSnapshot", "clearSnapshots", "getNetworkPeers", "subscribeToNetworkTopics", "subscribeToSignalStatus", "subscribeToNetworkStatus", "networkManager", "subscribeToSignal", "subscribeToSwarmInfo", "import_async", "import_context", "import_credentials", "createAuthProvider", "signer", "nonce", "credential", "createCredential", "assertion", "subject", "getIssuer", "schema", "getCodecForType", "encode", "TrustedKeySetAuthVerifier", "constructor", "_params", "_ctx", "Context", "close", "dispose", "verifier", "auth", "decode", "log", "result", "verifyCredential", "kind", "proof", "Buffer", "from", "equals", "_isTrustedKey", "issuer", "key", "trigger", "Trigger", "onDispose", "wake", "clear", "update", "on", "wait", "timeout", "authTimeout", "deviceKey", "deviceSet", "trustedKeysProvider", "has", "import_async", "import_credentials", "import_feed_store", "import_log", "AUTH_TIMEOUT", "Identity", "constructor", "space", "signer", "identityKey", "deviceKey", "stateUpdate", "Event", "_signer", "_deviceStateMachine", "spaceState", "registerProcessor", "DeviceStateMachine", "onUpdate", "emit", "_profileStateMachine", "ProfileStateMachine", "authVerifier", "TrustedKeySetAuthVerifier", "trustedKeysProvider", "authorizedDeviceKeys", "update", "authTimeout", "processor", "open", "close", "ready", "deviceChainReady", "wait", "controlPipeline", "state", "waitUntilReachedTargetTimeframe", "timeout", "profileDocument", "profile", "haloSpaceKey", "key", "haloGenesisFeedKey", "genesisFeedKey", "deviceCredentialChain", "getAdmissionCredentials", "controlFeedKey", "failUndefined", "dataFeedKey", "getIdentityCredentialSigner", "assert", "createCredentialSignerWithChain", "getDeviceCredentialSigner", "createCredentialSignerWithKey", "admitDevice", "log", "hostDevice", "writeMessages", "writer", "createCredential", "subject", "assertion", "spaceKey", "designation", "AdmittedFeed", "Designation", "CONTROL", "DATA", "map", "credential", "import_node_assert", "import_async", "import_credentials", "import_keys", "import_log", "import_protocols", "import_util", "IdentityManager", "constructor", "_metadataStore", "_keyring", "_feedStore", "_spaceManager", "stateUpdate", "Event", "_instanceId", "PublicKey", "random", "toHex", "identity", "_identity", "open", "log", "trace", "begin", "id", "load", "identityRecord", "getIdentityRecord", "_constructIdentity", "ready", "identityKey", "displayName", "profileDocument", "emit", "close", "end", "createIdentity", "assert", "controlFeedKey", "createKey", "deviceKey", "haloSpace", "key", "genesisFeedKey", "dataFeedKey", "generator", "CredentialGenerator", "credentials", "createSpaceGenesis", "createFeedAdmission", "AdmittedFeed", "Designation", "DATA", "push", "createProfileCredential", "createDeviceAuthorization", "credential", "controlPipeline", "writer", "write", "setIdentityRecord", "acceptIdentity", "params", "haloSpaceKey", "haloGenesisFeedKey", "controlTimeframe", "controlFeed", "openFeed", "writable", "dataFeed", "space", "_constructSpace", "spaceRecord", "swarmIdentity", "peerKey", "credentialProvider", "createAuthProvider", "createCredentialSignerWithKey", "credentialAuthenticator", "deferFunction", "authVerifier", "verifier", "setControlFeed", "setDataFeed", "Identity", "signer", "state", "setTargetTimeframe", "constructSpace", "metadata", "onNetworkConnection", "import_node_assert", "import_codec_protobuf", "import_credentials", "import_debug", "IdentityServiceImpl", "constructor", "_serviceContext", "createIdentity", "request", "_getIdentity", "recoverIdentity", "todo", "queryIdentity", "Stream", "next", "emitNext", "identity", "identityManager", "stateUpdate", "on", "undefined", "identityKey", "spaceKey", "space", "key", "profile", "profileDocument", "signPresentation", "presentation", "nonce", "assert", "signer", "keyring", "signerKey", "deviceKey", "chain", "deviceCredentialChain", "import_node_assert", "import_async", "import_context", "import_credentials", "import_keys", "import_log", "import_protocols", "import_services", "DeviceInvitationsHandler", "AbstractInvitationsHandler", "constructor", "_params", "networkManager", "createInvitation", "context", "options", "type", "timeout", "INVITATION_TIMEOUT", "swarmKey", "assert", "Invitation", "Type", "OFFLINE", "identity", "getIdentity", "invitation", "invitationId", "PublicKey", "random", "toHex", "authenticationCode", "generatePasscode", "AUTHENTICATION_CODE_LENGTH", "ctx", "Context", "onError", "err", "dispose", "observable", "callback", "InvitationObservableProvider", "complete", "Trigger", "createExtension", "HostHaloInvitationExtension", "requestAdmission", "log", "host", "deviceKey", "onAuthenticating", "identityKey", "haloSpaceKey", "genesisFeedKey", "haloGenesisFeedKey", "controlTimeframe", "controlPipeline", "state", "timeframe", "authenticate", "code", "status", "AuthenticationResponse", "Status", "OK", "presentAdmissionCredentials", "credentials", "INTERACTIVE_TESTING", "undefined", "Error", "guest", "admitDevice", "wake", "onOpen", "scheduleTask", "onConnected", "wait", "onSuccess", "cancelled", "error", "sleep", "ON_CLOSE_DELAY", "topic", "swarmConnection", "_networkManager", "joinSwarm", "peerId", "protocolProvider", "createTeleportProtocolFactory", "teleport", "addExtension", "topology", "StarTopology", "onDispose", "close", "onConnecting", "acceptInvitation", "authenticated", "AuthenticatingInvitationProvider", "onCancel", "onAuthenticate", "connectionCount", "extension", "GuestHaloInvitationExtension", "rpc", "HaloHostService", "INTERACTIVE", "keyring", "createKey", "controlFeedKey", "dataFeedKey", "acceptIdentity", "warn", "RpcExtension", "_callbacks", "exposed", "schema", "getService", "getHandlers", "requested", "import_node_assert", "import_codec_protobuf", "import_log", "import_services", "AbstractInvitationsService", "_identityManager", "_getInvitationsHandler", "_createInvitations", "Map", "_acceptInvitations", "getLoggingContext", "deviceKey", "identity", "createInvitation", "invitation", "Stream", "next", "close", "invitationsHandler", "context", "getContext", "log", "invitationId", "type", "swarmKey", "authMethod", "observable", "subscribe", "onConnecting", "assert", "set", "state", "Invitation", "State", "CONNECTING", "onConnected", "CONNECTED", "onAuthenticating", "AUTHENTICATING", "onSuccess", "SUCCESS", "onCancelled", "CANCELLED", "onTimeout", "err", "TIMEOUT", "onError", "ERROR", "warn", "delete", "acceptInvitation", "options", "authenticate", "authenticationCode", "get", "cancelInvitation", "cancel", "DeviceInvitationsServiceImpl", "AbstractInvitationsService", "constructor", "identityManager", "invitationsHandler", "getContext", "invitation", "import_node_assert", "import_async", "import_client", "import_context", "import_credentials", "import_feed_store", "import_keys", "import_log", "import_network_manager", "import_protocols", "import_services", "import_invitations", "import_teleport", "MAX_OTP_ATTEMPTS", "SpaceInvitationsHandler", "AbstractInvitationsHandler", "constructor", "networkManager", "_spaceManager", "_signingContext", "_keyring", "createInvitation", "space", "options", "swarmConnection", "type", "timeout", "INVITATION_TIMEOUT", "swarmKey", "assert", "Invitation", "Type", "OFFLINE", "invitation", "invitationId", "PublicKey", "random", "toHex", "spaceKey", "key", "authMethod", "AuthMethod", "SHARED_SECRET", "authenticationCode", "generatePasscode", "AUTHENTICATION_CODE_LENGTH", "ctx", "Context", "onError", "err", "dispose", "observable", "callback", "InvitationObservableProvider", "close", "authenticationPassed", "authenticationRetry", "createExtension", "complete", "Trigger", "guestProfile", "hostInvitationExtension", "HostSpaceInvitationExtension", "introduce", "profile", "_a", "log", "host", "deviceKey", "onAuthenticating", "INTERACTIVE_TESTING", "MULTIUSE_TESTING", "undefined", "authenticate", "code", "status", "AuthenticationResponse", "Status", "OK", "NONE", "INVALID_OPT_ATTEMPTS", "INVALID_OTP", "error", "INTERNAL_ERROR", "requestAdmission", "identityKey", "controlFeedKey", "dataFeedKey", "isAuthenticationRequired", "Error", "guest", "credentials", "createAdmissionCredentials", "credentialSigner", "inner", "genesisFeedKey", "credential", "spaceMemberCredential", "getCredentialAssertion", "writeMessages", "controlPipeline", "writer", "wake", "controlTimeframe", "state", "timeframe", "dataTimeframe", "dataPipeline", "pipelineState", "onOpen", "scheduleTask", "onConnected", "wait", "onSuccess", "cancelled", "sleep", "ON_CLOSE_DELAY", "topic", "_networkManager", "joinSwarm", "peerId", "protocolProvider", "createTeleportProtocolFactory", "teleport", "addExtension", "topology", "StarTopology", "onDispose", "onConnecting", "acceptInvitation", "authenticated", "AuthenticatingInvitationProvider", "onCancel", "onAuthenticate", "connectionCount", "extension", "GuestSpaceInvitationExtension", "introductionResponse", "rpc", "SpaceHostService", "response", "attempt", "reset", "createKey", "assertion", "subject", "id", "equals", "acceptSpace", "recordCredential", "warn", "RpcExtension", "_callbacks", "exposed", "schema", "getService", "getHandlers", "params", "context", "requested", "import_node_assert", "SpaceInvitationsServiceImpl", "AbstractInvitationsService", "constructor", "identityManager", "invitationsHandler", "_getSpaceManager", "getContext", "invitation", "assert", "spaceKey", "spaceManager", "space", "spaces", "get", "import_codec_protobuf", "NetworkServiceImpl", "constructor", "networkManager", "subscribeToNetworkStatus", "Stream", "next", "unsubscribe", "connectionStateChanged", "on", "state", "connectionState", "setNetworkOptions", "request", "setConnectionState", "import_node_assert", "import_async", "import_client", "import_context", "import_credentials", "import_echo_pipeline", "import_keys", "import_log", "import_util", "import_async", "import_client", "import_context", "import_debug", "import_keys", "import_log", "import_credentials", "import_util", "import_node_assert", "import_async", "import_context", "import_keys", "import_log", "import_protocols", "import_teleport", "import_util", "DEFAULT_RETRY_TIMEOUT", "DEFAULT_SUCCESS_DELAY", "DEFAULT_NOTARIZE_TIMEOUT", "NotarizationPlugin", "_ctx", "Context", "_extensionOpened", "Event", "_extensions", "Set", "_processedCredentials", "ComplexSet", "PublicKey", "hash", "_processCredentialsTriggers", "ComplexMap", "open", "close", "dispose", "notarize", "ctx", "opCtx", "credentials", "timeout", "retryTimeout", "successDelay", "log", "assert", "every", "credential", "id", "errors", "Trigger", "derive", "onError", "err", "warn", "throw", "onDispose", "scheduleTask", "peers", "Array", "from", "map", "extension", "remotePeerId", "TimeoutError", "allNotarized", "Promise", "all", "_waitUntilProcessed", "peersTried", "notarizeTask", "DeferredTask", "size", "peer", "find", "has", "retryIn", "clear", "schedule", "add", "localPeerId", "credentialId", "rpc", "NotarizationService", "filter", "sleep", "on", "race", "rejectOnDispose", "wait", "process", "get", "wake", "delete", "setWriter", "writer", "_writer", "entry", "orInsert", "value", "_onNotarize", "request", "Error", "write", "createExtension", "NotarizationTeleportExtension", "onOpen", "emit", "onClose", "onNotarize", "bind", "RpcExtension", "constructor", "_params", "requested", "schema", "getService", "exposed", "getHandlers", "AUTH_TIMEOUT", "DataSpace", "constructor", "params", "_ctx", "Context", "_state", "SpaceState", "CLOSED", "stateUpdate", "Event", "_inner", "inner", "on", "emit", "_gossip", "gossip", "_presence", "presence", "_keyring", "keyring", "_feedStore", "feedStore", "_metadataStore", "metadataStore", "_signingContext", "signingContext", "_callbacks", "callbacks", "_dataPipeline", "DataPipeline", "modelFactory", "snapshotManager", "memberKey", "spaceKey", "key", "feedInfoProvider", "feedKey", "spaceState", "feeds", "get", "snapshotId", "authVerifier", "TrustedKeySetAuthVerifier", "trustedKeysProvider", "ComplexSet", "PublicKey", "hash", "Array", "from", "members", "keys", "update", "authTimeout", "_notarizationPluginConsumer", "registerProcessor", "NotarizationPlugin", "isOpen", "state", "dataPipeline", "notarizationPlugin", "processor", "open", "INACTIVE", "close", "dispose", "destroy", "postMessage", "channel", "message", "listen", "callback", "initializeDataPipelineAsync", "scheduleTask", "initializeDataPipeline", "err", "CancelledError", "log", "error", "SystemError", "INITIALIZING", "controlPipeline", "waitUntilReachedTargetTimeframe", "ctx", "breakOnStall", "_createWritableFeeds", "setWriter", "createMappedFeedWriter", "credential", "writer", "openPipeline", "start", "pipeline", "createDataPipeline", "pipelineState", "beforeReady", "READY", "afterReady", "credentials", "controlFeedKey", "controlFeed", "openFeed", "createKey", "writable", "setControlFeed", "push", "credentialSigner", "createCredential", "subject", "assertion", "deviceKey", "identityKey", "designation", "AdmittedFeed", "Designation", "CONTROL", "dataFeedKey", "dataFeed", "setDataFeed", "DATA", "length", "notarize", "timeout", "setWritableFeedKeys", "timed", "trackLeaks", "__decorate", "DataSpaceManager", "constructor", "_spaceManager", "_metadataStore", "_dataServiceSubscriptions", "_keyring", "_signingContext", "_modelFactory", "_feedStore", "_snapshotStore", "_ctx", "Context", "updated", "Event", "_spaces", "ComplexMap", "PublicKey", "hash", "_isOpen", "spaces", "open", "log", "load", "length", "spaceMetadata", "space", "_constructSpace", "initializeDataPipelineAsync", "emit", "close", "dispose", "values", "createSpace", "assert", "spaceKey", "createKey", "controlFeedKey", "dataFeedKey", "metadata", "key", "genesisFeedKey", "credentials", "spaceGenesis", "inner", "addSpace", "memberCredential", "getCredentialAssertion", "recordCredential", "initializeDataPipeline", "acceptSpace", "opts", "has", "controlTimeframe", "dataTimeframe", "waitUntilSpaceReady", "cancelWithContext", "waitForCondition", "get", "state", "SpaceState", "READY", "gossip", "Gossip", "localPeerId", "deviceKey", "presence", "Presence", "announceInterval", "offlineTimeout", "identityKey", "snapshotManager", "SnapshotManager", "controlFeed", "openFeed", "writable", "dataFeed", "constructSpace", "swarmIdentity", "peerKey", "credentialProvider", "createAuthProvider", "credentialSigner", "credentialAuthenticator", "deferFunction", "dataSpace", "authVerifier", "verifier", "onNetworkConnection", "session", "addExtension", "createExtension", "remotePeerId", "objectSync", "notarizationPlugin", "setControlFeed", "setDataFeed", "DataSpace", "modelFactory", "metadataStore", "memberKey", "keyring", "feedStore", "signingContext", "snapshotId", "snapshot", "callbacks", "beforeReady", "registerSpace", "dataPipeline", "databaseBackend", "createDataServiceHost", "afterReady", "controlPipeline", "setTargetTimeframe", "set", "synchronized", "trackLeaks", "import_async", "import_codec_protobuf", "import_debug", "import_echo_pipeline", "import_log", "import_services", "import_util", "TIMEFRAME_UPDATE_DEBOUNCE_TIME", "SpacesServiceImpl", "constructor", "_identityManager", "_spaceManager", "_dataServiceSubscriptions", "_getDataSpaceManager", "createSpace", "identity", "Error", "dataSpaceManager", "space", "_transformSpace", "updateSpace", "request", "todo", "querySpaces", "Stream", "next", "ctx", "onUpdate", "spaces", "Array", "from", "values", "map", "log", "scheduleTask", "subscriptions", "EventSubscriptions", "onDispose", "clear", "subscribeSpaces", "add", "stateUpdate", "on", "presence", "updated", "inner", "controlPipeline", "state", "timeframeUpdate", "debounce", "dataPipeline", "pipelineState", "postMessage", "spaceKey", "channel", "message", "get", "raise", "SpaceNotFoundError", "getChannelId", "subscribeMessages", "handle", "listen", "unsubscribe", "queryCredentials", "processor", "spaceState", "registerProcessor", "process", "credential", "close", "open", "writeCredentials", "credentials", "writer", "write", "key", "pipeline", "targetControlTimeframe", "targetTimeframe", "currentControlTimeframe", "timeframe", "currentDataTimeframe", "targetDataTimeframe", "members", "member", "_a", "_b", "identityKey", "profile", "displayName", "assertion", "humanize", "equals", "getPeersOnline", "filter", "length", "SpaceMember", "PresenceState", "ONLINE", "OFFLINE", "import_errors", "StorageDriver", "createStorageObjects", "config", "path", "storageType", "keyStorage", "persistent", "RAM", "InvalidConfigError", "undefined", "storage", "createStorage", "type", "toStorageType", "StorageType", "root", "CHROME", "FIREFOX", "IDB", "NODE", "Error", "import_codec_protobuf", "SystemServiceImpl", "constructor", "config", "statusUpdate", "onUpdateStatus", "getCurrentStatus", "onReset", "_config", "_statusUpdate", "_getCurrentStatus", "_onUpdateStatus", "_onReset", "getConfig", "values", "updateStatus", "status", "queryStatus", "Stream", "next", "update", "unsubscribe", "on", "interval", "setInterval", "clearInterval", "reset", "import_async", "import_log", "import_network_manager", "import_util", "import_codec_protobuf", "import_debug", "ClientRpcServer", "constructor", "params", "_handlerCache", "Map", "serviceRegistry", "handleCall", "handleStream", "rpcOptions", "_handleCall", "_handleStream", "_serviceRegistry", "_rpcPeer", "RpcPeer", "callHandler", "method", "serviceName", "methodName", "parseMethodName", "handler", "_getServiceHandler", "call", "streamHandler", "callStream", "Stream", "unwrapPromise", "open", "close", "has", "key", "descriptor", "Object", "entries", "descriptors", "find", "name", "raise", "Error", "service", "services", "set", "createServer", "get", "import_node_assert", "import_async", "import_client", "import_rpc", "ShellRuntimeImpl", "constructor", "_port", "layoutUpdate", "Event", "_layout", "ShellLayout", "DEFAULT", "layout", "invitationCode", "_invitationCode", "spaceKey", "_spaceKey", "setLayout", "options", "emit", "setAppContext", "context", "assert", "_appRpc", "rpc", "AppService", "setContext", "open", "createProtoRpcPeer", "requested", "appServiceBundle", "exposed", "shellServiceBundle", "handlers", "ShellService", "request", "port", "close", "undefined", "__decorate", "LOCK_KEY", "IFrameHostRuntime", "constructor", "configProvider", "appPort", "shellPort", "_transportFactory", "createWebRTCTransportFactory", "_ready", "Trigger", "_configProvider", "_appPort", "_shellPort", "_shellRuntime", "ShellRuntimeImpl", "services", "_clientServices", "shell", "start", "log", "_config", "getAsyncValue", "signalServer", "get", "LocalClientServices", "lockKey", "config", "networkManager", "NetworkManager", "signalManager", "WebsocketSignalManager", "MemorySignalManager", "MemorySignalManagerContext", "transportFactory", "middleware", "handleCall", "method", "params", "handler", "error", "wait", "timeout", "handleStream", "_clientRpc", "ClientRpcServer", "serviceRegistry", "host", "port", "Promise", "all", "open", "wake", "undefined", "err", "catch", "stop", "close", "logInfo", "import_client", "import_network_manager", "import_rpc", "import_async", "import_log", "__decorate", "Message", "ACQUIRING", "VaultResourceLock", "constructor", "lockKey", "onAcquire", "onRelease", "_broadcastChannel", "BroadcastChannel", "_releaseTrigger", "Trigger", "_lockKey", "_onAcquire", "_onRelease", "onmessage", "_onMessage", "bind", "acquire", "postMessage", "message", "log", "asyncTimeout", "_requestLock", "release", "wake", "event", "data", "steal", "acquired", "navigator", "locks", "request", "wait", "catch", "logInfo", "import_async", "import_log", "import_messaging", "import_network_manager", "import_node_assert", "import_async", "import_client", "import_log", "import_rpc", "import_util", "__decorate", "WorkerSession", "constructor", "serviceHost", "systemPort", "appPort", "shellPort", "readySignal", "options", "heartbeatInterval", "_startTrigger", "Trigger", "onClose", "Callback", "assert", "_options", "_serviceHost", "middleware", "handleCall", "method", "params", "handler", "error", "wait", "timeout", "handleStream", "_clientRpc", "ClientRpcServer", "serviceRegistry", "port", "_shellClientRpc", "_iframeRpc", "createProtoRpcPeer", "requested", "iframeServiceBundle", "exposed", "workerServiceBundle", "handlers", "WorkerService", "start", "request", "origin", "wake", "stop", "setTimeout", "close", "err", "log", "catch", "bridgeService", "rpc", "BridgeService", "open", "info", "Promise", "all", "_maybeOpenShell", "_heartbeatTimer", "setInterval", "IframeService", "heartbeat", "warn", "callIfSet", "undefined", "clearInterval", "asyncTimeout", "logInfo", "import_async", "import_credentials", "import_debug", "import_echo_pipeline", "import_feed_store", "import_keys", "import_log", "import_protocols", "ServiceContext", "constructor", "storage", "networkManager", "modelFactory", "initialized", "Trigger", "dataServiceSubscriptions", "DataServiceSubscriptions", "_instanceId", "PublicKey", "random", "toHex", "metadataStore", "MetadataStore", "createDirectory", "snapshotStore", "SnapshotStore", "keyring", "Keyring", "feedStore", "FeedStore", "factory", "FeedFactory", "root", "signer", "hypercore", "valueEncoding", "spaceManager", "SpaceManager", "identityManager", "IdentityManager", "deviceInvitations", "DeviceInvitationsHandler", "getIdentity", "identity", "failUndefined", "acceptIdentity", "_acceptIdentity", "bind", "open", "log", "trace", "begin", "id", "_initialize", "close", "_deviceSpaceSync", "dataSpaceManager", "clear", "end", "reset", "createIdentity", "params", "signingContext", "credentialSigner", "getIdentityCredentialSigner", "identityKey", "deviceKey", "profile", "profileDocument", "recordCredential", "credential", "controlPipeline", "writer", "write", "DataSpaceManager", "spaceInvitations", "SpaceInvitationsHandler", "wake", "space", "spaceState", "registerProcessor", "process", "assertion", "getCredentialAssertion", "spaceKey", "equals", "key", "details", "spaces", "has", "acceptSpace", "genesisFeedKey", "err", "catch", "ServiceRegistry", "constructor", "_serviceBundle", "_handlers", "descriptors", "services", "setServices", "addService", "name", "service", "removeService", "ClientServicesHost", "constructor", "config", "modelFactory", "createDefaultModelFactory", "networkManager", "storage", "lockKey", "_statusUpdate", "Event", "_opening", "_open", "_instanceId", "PublicKey", "random", "toHex", "_storage", "_modelFactory", "initialize", "_resourceLock", "VaultResourceLock", "onAcquire", "open", "onRelease", "close", "undefined", "_systemService", "SystemServiceImpl", "_config", "statusUpdate", "getCurrentStatus", "isOpen", "SystemStatus", "ACTIVE", "INACTIVE", "onUpdateStatus", "status", "acquire", "release", "onReset", "assert", "_serviceContext", "reset", "_serviceRegistry", "ServiceRegistry", "clientServiceBundle", "SystemService", "serviceRegistry", "descriptors", "services", "createStorageObjects", "get", "_networkManager", "log", "trace", "begin", "id", "ServiceContext", "setServices", "IdentityService", "IdentityServiceImpl", "DevicesService", "DevicesServiceImpl", "identityManager", "DeviceInvitationsService", "DeviceInvitationsServiceImpl", "deviceInvitations", "SpaceInvitationsService", "SpaceInvitationsServiceImpl", "_a", "spaceInvitations", "raise", "Error", "dataSpaceManager", "SpacesService", "SpacesServiceImpl", "spaceManager", "dataServiceSubscriptions", "initialized", "wait", "DataService", "DataServiceImpl", "NetworkService", "NetworkServiceImpl", "TracingService", "TracingServiceImpl", "DevtoolsHost", "DevtoolsServiceImpl", "events", "DevtoolsHostEvents", "context", "emit", "deviceKey", "identity", "end", "LocalClientServices", "constructor", "params", "_host", "ClientServicesHost", "descriptors", "services", "host", "open", "close", "import_config", "import_log", "import_messaging", "import_network_manager", "createServiceHost", "config", "signalManagerContext", "networkManager", "NetworkManager", "signalManager", "MemorySignalManager", "transportFactory", "MemoryTransportFactory", "ClientServicesHost", "createServiceContext", "signalContext", "MemorySignalManagerContext", "storage", "createStorage", "type", "StorageType", "RAM", "modelFactory", "createDefaultModelFactory", "ServiceContext", "createPeers", "numPeers", "Promise", "all", "Array", "from", "map", "peer", "open", "createIdentity", "syncItemsLocal", "db1", "db2", "testLocalDatabase", "HostTestBuilder", "createPeer", "TestPeer", "constructor", "_props", "keyring", "Keyring", "createDirectory", "feedStore", "FeedStore", "factory", "FeedFactory", "root", "signer", "hypercore", "valueEncoding", "metadataStore", "MetadataStore", "snapshotStore", "SnapshotStore", "spaceManager", "SpaceManager", "createSigningContext", "identityKey", "createKey", "deviceKey", "credentialSigner", "createCredentialSignerWithChain", "credential", "CredentialGenerator", "createDeviceAuthorization", "recordCredential", "import_node_assert", "import_async", "import_debug", "import_services", "performInvitation", "host", "guest", "context", "done1", "Trigger", "done2", "observable1", "createInvitation", "type", "Invitation", "Type", "INTERACTIVE_TESTING", "subscribe", "onConnecting", "invitation1", "observable2", "acceptInvitation", "invitation2", "assert", "swarmKey", "equals", "onConnected", "onSuccess", "invitation", "wake", "onCancelled", "raise", "Error", "onTimeout", "err", "onError", "wait", "import_node_assert", "import_async", "import_client", "import_config", "import_debug", "import_keys", "import_log", "import_messaging", "import_network_manager", "import_rpc", "testConfigWithLocalSignal", "Config", "version", "runtime", "services", "signal", "server", "TestBuilder", "constructor", "config", "_modelFactory", "createDefaultModelFactory", "_signalManagerContext", "MemorySignalManagerContext", "_config", "networkManager", "signalServer", "get", "NetworkManager", "log", "signalManager", "WebsocketSignalManager", "transportFactory", "createWebRTCTransportFactory", "iceServers", "MemorySignalManager", "MemoryTransportFactory", "createClientServicesHost", "ClientServicesHost", "modelFactory", "storage", "createLocal", "LocalClientServices", "createClientServer", "host", "proxyPort", "hostPort", "createLinkedPorts", "createProtoRpcPeer", "exposed", "descriptors", "handlers", "port", "client", "Client", "ClientServicesProxy", "testSpace", "create", "check", "objectId", "PublicKey", "random", "toHex", "result", "mutate", "genesisMutation", "DocumentModel", "meta", "type", "batch", "getReceipt", "assert", "_itemManager", "entities", "has", "objectsUpdated", "id", "asyncTimeout", "itemUpdate", "waitForCondition", "syncItems", "db1", "db2", "joinCommonSpace", "initialPeer", "peers", "spaceKey", "rootSpace", "getSpace", "createSpace", "Promise", "all", "map", "peer", "hostDone", "Trigger", "guestDone", "hostObservabli", "createInvitation", "Invitation", "Type", "INTERACTIVE_TESTING", "subscribe", "onConnecting", "invitation", "guestObservable", "acceptInvitation", "onSuccess", "wake", "onError", "err", "raise", "wait", "key"]
|
|
3
|
+
"sources": ["../../../../../src/packlets/testing/index.ts", "../../../../../src/packlets/testing/credential-utils.ts", "../../../../../src/packlets/testing/host-test-builder.ts", "../../../../../src/packlets/services/service-host.ts", "../../../../../src/packlets/deprecated/tracing.ts", "../../../../../src/packlets/devices/devices-service.ts", "../../../../../src/packlets/devtools/devtools.ts", "../../../../../src/packlets/devtools/feeds.ts", "../../../../../src/packlets/devtools/keys.ts", "../../../../../src/packlets/devtools/network.ts", "../../../../../src/packlets/devtools/spaces.ts", "../../../../../src/packlets/identity/authenticator.ts", "../../../../../src/packlets/identity/identity.ts", "../../../../../src/packlets/identity/identity-manager.ts", "../../../../../src/packlets/identity/identity-service.ts", "../../../../../src/packlets/invitations/device-invitation-protocol.ts", "../../../../../src/packlets/invitations/invitations-handler.ts", "../../../../../src/packlets/invitations/invitations-service.ts", "../../../../../src/packlets/invitations/space-invitation-protocol.ts", "../../../../../src/packlets/network/network-service.ts", "../../../../../src/packlets/spaces/data-space-manager.ts", "../../../../../src/packlets/spaces/data-space.ts", "../../../../../src/packlets/spaces/notarization-plugin.ts", "../../../../../src/packlets/spaces/spaces-service.ts", "../../../../../src/packlets/storage/storage.ts", "../../../../../src/packlets/system/system-service.ts", "../../../../../src/packlets/vault/iframe-host-runtime.ts", "../../../../../src/packlets/services/client-rpc-server.ts", "../../../../../src/packlets/vault/shell-runtime.ts", "../../../../../src/packlets/vault/iframe-proxy-runtime.ts", "../../../../../src/packlets/vault/vault-resource-lock.ts", "../../../../../src/packlets/vault/worker-runtime.ts", "../../../../../src/packlets/vault/worker-session.ts", "../../../../../src/packlets/services/service-context.ts", "../../../../../src/packlets/services/service-registry.ts", "../../../../../src/packlets/services/local-client-services.ts", "../../../../../src/packlets/services/utils.ts", "../../../../../src/packlets/testing/invitation-utils.ts", "../../../../../src/packlets/testing/test-builder.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nexport * from './credential-utils';\nexport * from './host-test-builder';\nexport * from './invitation-utils';\nexport * from './test-builder';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { createCredential } from '@dxos/credentials';\nimport { Signer } from '@dxos/crypto';\nimport { PublicKey } from '@dxos/keys';\nimport { Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\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 assertion: {\n '@type': 'example.testing.rpc.MessageWithAny',\n payload: {\n '@type': 'google.protobuf.Any',\n value: Buffer.from('test')\n }\n }\n });\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { createDefaultModelFactory } from '@dxos/client';\nimport { Config } from '@dxos/config';\nimport { createCredentialSignerWithChain, CredentialGenerator } from '@dxos/credentials';\nimport {\n SnapshotStore,\n DataPipeline,\n MetadataStore,\n SigningContext,\n SpaceManager,\n valueEncoding\n} from '@dxos/echo-pipeline';\nimport { testLocalDatabase } from '@dxos/echo-pipeline/testing';\nimport { FeedFactory, FeedStore } from '@dxos/feed-store';\nimport { Keyring } from '@dxos/keyring';\nimport { MemorySignalManager, MemorySignalManagerContext } from '@dxos/messaging';\nimport { MemoryTransportFactory, NetworkManager } from '@dxos/network-manager';\nimport { createStorage, Storage, StorageType } from '@dxos/random-access-storage';\n\nimport { ClientServicesHost, ServiceContext } from '../services';\n\n//\n// TODO(burdon): Replace with test builder.\n//\n\nexport const createServiceHost = (config: Config, signalManagerContext: MemorySignalManagerContext) => {\n const networkManager = new NetworkManager({\n signalManager: new MemorySignalManager(signalManagerContext),\n transportFactory: MemoryTransportFactory\n });\n\n return new ClientServicesHost({\n config,\n networkManager\n });\n};\n\nexport const createServiceContext = ({\n signalContext = new MemorySignalManagerContext(),\n storage = createStorage({ type: StorageType.RAM })\n}: {\n signalContext?: MemorySignalManagerContext;\n storage?: Storage;\n} = {}) => {\n const networkManager = new NetworkManager({\n signalManager: new MemorySignalManager(signalContext),\n transportFactory: MemoryTransportFactory\n });\n\n const modelFactory = createDefaultModelFactory();\n return new ServiceContext(storage, networkManager, modelFactory);\n};\n\nexport const createPeers = async (numPeers: number) => {\n const signalContext = new MemorySignalManagerContext();\n\n return await Promise.all(\n Array.from(Array(numPeers)).map(async () => {\n const peer = createServiceContext({ signalContext });\n await peer.open();\n return peer;\n })\n );\n};\n\nexport const createIdentity = async (peer: ServiceContext) => {\n await peer.createIdentity();\n return peer;\n};\n\n// TODO(burdon): Remove @dxos/client-testing.\n// TODO(burdon): Create builder and make configurable.\nexport const syncItemsLocal = async (db1: DataPipeline, db2: DataPipeline) => {\n await testLocalDatabase(db1, db2);\n await testLocalDatabase(db2, db1);\n};\n\nexport class HostTestBuilder {\n public readonly signalContext = new MemorySignalManagerContext();\n\n createPeer(): TestPeer {\n return new TestPeer(this.signalContext);\n }\n}\n\nexport type TestPeerProps = {\n storage?: Storage;\n feedStore?: FeedStore<any>;\n metadataStore?: MetadataStore;\n keyring?: Keyring;\n networkManager?: NetworkManager;\n spaceManager?: SpaceManager;\n snapshotStore?: SnapshotStore;\n};\n\nexport class TestPeer {\n private _props: TestPeerProps = {};\n\n constructor(private readonly signalContext: MemorySignalManagerContext) {}\n\n get storage() {\n return (this._props.storage ??= createStorage({ type: StorageType.RAM }));\n }\n\n get keyring() {\n return (this._props.keyring ??= new Keyring(this.storage.createDirectory('keyring')));\n }\n\n get feedStore() {\n return (this._props.feedStore ??= new FeedStore({\n factory: new FeedFactory({\n root: this.storage.createDirectory('feeds'),\n signer: this.keyring,\n hypercore: {\n valueEncoding\n }\n })\n }));\n }\n\n get metadataStore() {\n return (this._props.metadataStore ??= new MetadataStore(this.storage.createDirectory('metadata')));\n }\n\n get snapshotStore() {\n return (this._props.snapshotStore ??= new SnapshotStore(this.storage.createDirectory('snapshots')));\n }\n\n get networkManager() {\n return (this._props.networkManager ??= new NetworkManager({\n signalManager: new MemorySignalManager(this.signalContext),\n transportFactory: MemoryTransportFactory\n }));\n }\n\n get spaceManager() {\n return (this._props.spaceManager ??= new SpaceManager({\n feedStore: this.feedStore,\n networkManager: this.networkManager\n }));\n }\n}\n\nexport const createSigningContext = async (keyring: Keyring): 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 {\n credential: await new CredentialGenerator(keyring, identityKey, deviceKey).createDeviceAuthorization(deviceKey)\n },\n deviceKey\n ),\n recordCredential: async () => {} // No-op.\n };\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event } from '@dxos/async';\nimport { clientServiceBundle, ClientServices, createDefaultModelFactory, PublicKey } from '@dxos/client';\nimport { Config } from '@dxos/config';\nimport { DataServiceImpl } from '@dxos/echo-pipeline';\nimport { log } from '@dxos/log';\nimport { ModelFactory } from '@dxos/model-factory';\nimport { NetworkManager } from '@dxos/network-manager';\nimport { trace } from '@dxos/protocols';\nimport { SystemStatus } from '@dxos/protocols/proto/dxos/client/services';\nimport { Storage } from '@dxos/random-access-storage';\n\nimport { TracingServiceImpl } from '../deprecated';\nimport { DevicesServiceImpl } from '../devices';\nimport { DevtoolsServiceImpl, DevtoolsHostEvents } from '../devtools';\nimport { IdentityServiceImpl } from '../identity';\nimport { InvitationsServiceImpl } from '../invitations';\nimport { NetworkServiceImpl } from '../network';\nimport { SpacesServiceImpl } from '../spaces';\nimport { createStorageObjects } from '../storage';\nimport { SystemServiceImpl } from '../system';\nimport { VaultResourceLock } from '../vault';\nimport { ServiceContext } from './service-context';\nimport { ServiceRegistry } from './service-registry';\n\nexport type ClientServicesHostParams = {\n /**\n * Can be omitted if `initialize` is later called.\n */\n config?: Config;\n modelFactory?: ModelFactory;\n networkManager?: NetworkManager;\n storage?: Storage;\n lockKey?: string;\n};\n\nexport type InitializeOptions = {\n config?: Config;\n networkManager?: NetworkManager;\n};\n\n/**\n * Remote service implementation.\n */\nexport class ClientServicesHost {\n private readonly _resourceLock?: VaultResourceLock;\n private readonly _serviceRegistry: ServiceRegistry<ClientServices>;\n private readonly _systemService: SystemServiceImpl;\n\n private _config?: Config;\n private readonly _statusUpdate = new Event<void>();\n private readonly _modelFactory: ModelFactory;\n private _networkManager?: NetworkManager;\n private _storage?: Storage;\n\n /**\n * @internal\n */\n _serviceContext!: ServiceContext;\n private _opening = false;\n private _open = false;\n\n private readonly _instanceId = PublicKey.random().toHex();\n\n constructor({\n config,\n modelFactory = createDefaultModelFactory(),\n // TODO(burdon): Create ApolloLink abstraction (see Client).\n networkManager,\n storage,\n // TODO(wittjosiah): Turn this on by default.\n lockKey\n }: ClientServicesHostParams = {}) {\n this._storage = storage;\n this._modelFactory = modelFactory;\n\n if (config) {\n this.initialize({ config, networkManager });\n }\n\n this._resourceLock = lockKey\n ? new VaultResourceLock({\n lockKey,\n onAcquire: () => {\n this._opening || this.open();\n },\n onRelease: () => this.close()\n })\n : undefined;\n\n this._systemService = new SystemServiceImpl({\n config: this._config,\n\n statusUpdate: this._statusUpdate,\n\n getCurrentStatus: () => (this.isOpen ? SystemStatus.ACTIVE : SystemStatus.INACTIVE),\n\n onUpdateStatus: async (status: SystemStatus) => {\n if (!this.isOpen && status === SystemStatus.ACTIVE) {\n await this._resourceLock?.acquire();\n } else if (this.isOpen && status === SystemStatus.INACTIVE) {\n await this._resourceLock?.release();\n }\n },\n\n onReset: async () => {\n assert(this._serviceContext, 'service host is closed');\n await this._serviceContext.reset();\n }\n });\n\n // TODO(burdon): Start to think of DMG (dynamic services).\n this._serviceRegistry = new ServiceRegistry<ClientServices>(clientServiceBundle, {\n SystemService: this._systemService\n });\n }\n\n get isOpen() {\n return this._open;\n }\n\n get serviceRegistry() {\n return this._serviceRegistry;\n }\n\n get descriptors() {\n return this._serviceRegistry.descriptors;\n }\n\n get services() {\n return this._serviceRegistry.services;\n }\n\n /**\n * Initialize the service host with the config.\n * Config can also be provided in the constructor.\n * Can only be called once.\n */\n initialize({ config, networkManager }: InitializeOptions) {\n assert(!this._open, 'service host is open');\n\n if (config) {\n assert(!this._config, 'config already set');\n\n this._config = config;\n if (!this._storage) {\n this._storage = createStorageObjects(config.get('runtime.client.storage', {})!).storage;\n }\n }\n\n if (networkManager) {\n assert(!this._networkManager, 'network manager already set');\n this._networkManager = networkManager;\n }\n }\n\n async open() {\n if (this._open) {\n return;\n }\n\n log.trace('dxos.sdk.client-services-host', trace.begin({ id: this._instanceId }));\n\n assert(this._config, 'config not set');\n assert(this._storage, 'storage not set');\n assert(this._networkManager, 'network manager not set');\n\n this._opening = true;\n log('opening...', { lockKey: this._resourceLock?.lockKey });\n await this._resourceLock?.acquire();\n\n // TODO(wittjosiah): Make re-entrant.\n // TODO(burdon): Break into components.\n this._serviceContext = new ServiceContext(this._storage, this._networkManager, this._modelFactory);\n\n // TODO(burdon): Start to think of DMG (dynamic services).\n this._serviceRegistry.setServices({\n SystemService: this._systemService,\n\n IdentityService: new IdentityServiceImpl(this._serviceContext),\n\n InvitationsService: new InvitationsServiceImpl(this._serviceContext.invitations, (invitation) =>\n this._serviceContext.getInvitationHandler(invitation)\n ),\n\n DevicesService: new DevicesServiceImpl(this._serviceContext.identityManager),\n\n SpacesService: new SpacesServiceImpl(\n this._serviceContext.identityManager,\n this._serviceContext.spaceManager,\n this._serviceContext.dataServiceSubscriptions,\n async () => {\n await this._serviceContext.initialized.wait();\n return this._serviceContext.dataSpaceManager!;\n }\n ),\n\n DataService: new DataServiceImpl(this._serviceContext.dataServiceSubscriptions),\n\n NetworkService: new NetworkServiceImpl(this._serviceContext.networkManager),\n\n // TODO(burdon): Move to new protobuf definitions.\n TracingService: new TracingServiceImpl(this._config),\n DevtoolsHost: new DevtoolsServiceImpl({\n events: new DevtoolsHostEvents(),\n config: this._config,\n context: this._serviceContext\n })\n });\n\n await this._serviceContext.open();\n this._opening = false;\n this._open = true;\n this._statusUpdate.emit();\n const deviceKey = this._serviceContext.identityManager.identity?.deviceKey;\n log('opened', { deviceKey });\n }\n\n async close() {\n if (!this._open) {\n return;\n }\n\n const deviceKey = this._serviceContext.identityManager.identity?.deviceKey;\n log('closing...', { deviceKey });\n this._serviceRegistry.setServices({ SystemService: this._systemService });\n await this._serviceContext.close();\n this._open = false;\n this._statusUpdate.emit();\n log('closed', { deviceKey });\n\n log.trace('dxos.sdk.client-services-host', trace.end({ id: this._instanceId }));\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Config } from '@dxos/config';\nimport { TracingService } from '@dxos/protocols/proto/dxos/devtools/host';\n\n/**\n * @deprecated\n */\nexport class TracingServiceImpl implements TracingService {\n constructor(private readonly _config: Config) {}\n\n async setTracingOptions() {\n throw new Error('Tracing not available.');\n }\n\n subscribeToRpcTrace(): any {\n throw new Error('Tracing not available.');\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { EventSubscriptions } from '@dxos/async';\nimport { Stream } from '@dxos/codec-protobuf';\nimport { Device, DeviceKind, DevicesService, QueryDevicesResponse } from '@dxos/protocols/proto/dxos/client/services';\nimport { ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';\n\nimport { IdentityManager } from '../identity/identity-manager';\n\nexport class DevicesServiceImpl implements DevicesService {\n constructor(private readonly _identityManager: IdentityManager) {}\n\n updateDevice(request: ProfileDocument): Promise<Device> {\n throw new Error('Method not implemented.');\n }\n\n queryDevices(): Stream<QueryDevicesResponse> {\n return new Stream(({ next }) => {\n const update = () => {\n const deviceKeys = this._identityManager.identity?.authorizedDeviceKeys;\n if (!deviceKeys) {\n next({ devices: [] });\n } else {\n next({\n devices: Array.from(deviceKeys.values()).map((key) => ({\n deviceKey: key,\n kind: this._identityManager.identity?.deviceKey.equals(key) ? DeviceKind.CURRENT : DeviceKind.TRUSTED\n }))\n });\n }\n };\n\n const subscriptions = new EventSubscriptions();\n subscriptions.add(\n this._identityManager.stateUpdate.on(() => {\n update();\n\n if (this._identityManager.identity) {\n subscriptions.add(\n this._identityManager.identity.stateUpdate.on(() => {\n update();\n })\n );\n }\n })\n );\n\n update();\n\n return () => subscriptions.clear();\n });\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Event as AsyncEvent } from '@dxos/async';\nimport { Stream } from '@dxos/codec-protobuf';\nimport { Config } from '@dxos/config';\nimport {\n ClearSnapshotsRequest,\n DevtoolsHost, // TODO(burdon): Rename DevtoolsService\n EnableDebugLoggingRequest,\n EnableDebugLoggingResponse,\n Event,\n GetConfigResponse,\n GetNetworkPeersRequest,\n GetNetworkPeersResponse,\n GetSpaceSnapshotRequest,\n GetSpaceSnapshotResponse,\n ResetStorageRequest,\n SaveSpaceSnapshotRequest,\n SaveSpaceSnapshotResponse,\n SubscribeToCredentialMessagesRequest,\n SubscribeToCredentialMessagesResponse,\n SubscribeToFeedBlocksRequest,\n SubscribeToFeedBlocksResponse,\n SubscribeToFeedsRequest,\n SubscribeToFeedsResponse,\n SubscribeToItemsRequest,\n SubscribeToItemsResponse,\n SubscribeToKeyringKeysRequest,\n SubscribeToKeyringKeysResponse,\n SubscribeToNetworkTopicsResponse,\n SubscribeToSpacesRequest,\n SubscribeToSpacesResponse,\n SubscribeToSignalStatusResponse,\n SignalResponse,\n SubscribeToSwarmInfoResponse\n} from '@dxos/protocols/proto/dxos/devtools/host';\n\nimport { ServiceContext } from '../services';\nimport { subscribeToFeedBlocks, subscribeToFeeds } from './feeds';\nimport { subscribeToKeyringKeys } from './keys';\nimport { subscribeToNetworkStatus, subscribeToSignal, subscribeToSwarmInfo } from './network';\nimport { subscribeToSpaces } from './spaces';\n\nexport class DevtoolsHostEvents {\n readonly ready = new AsyncEvent();\n}\n\nexport type DevtoolsServiceParams = {\n events: DevtoolsHostEvents;\n config: Config;\n context: ServiceContext;\n};\n\n/**\n * @deprecated\n */\nexport class DevtoolsServiceImpl implements DevtoolsHost {\n constructor(private readonly params: DevtoolsServiceParams) {}\n\n events(request: void): Stream<Event> {\n return new Stream<Event>(({ next }) => {\n this.params.events.ready.on(() => {\n next({ ready: {} });\n });\n });\n }\n\n getConfig(request: void): Promise<GetConfigResponse> {\n throw new Error();\n }\n\n resetStorage(request: ResetStorageRequest): Promise<void> {\n throw new Error();\n }\n\n enableDebugLogging(request: EnableDebugLoggingRequest): Promise<EnableDebugLoggingResponse> {\n throw new Error();\n }\n\n disableDebugLogging(request: EnableDebugLoggingRequest): Promise<EnableDebugLoggingResponse> {\n throw new Error();\n }\n\n subscribeToKeyringKeys(request: SubscribeToKeyringKeysRequest): Stream<SubscribeToKeyringKeysResponse> {\n return subscribeToKeyringKeys({ keyring: this.params.context.keyring });\n }\n\n subscribeToCredentialMessages(\n request: SubscribeToCredentialMessagesRequest\n ): Stream<SubscribeToCredentialMessagesResponse> {\n throw new Error();\n }\n\n subscribeToSpaces(request: SubscribeToSpacesRequest): Stream<SubscribeToSpacesResponse> {\n return subscribeToSpaces(this.params.context, request);\n }\n\n subscribeToItems(request: SubscribeToItemsRequest): Stream<SubscribeToItemsResponse> {\n throw new Error();\n }\n\n subscribeToFeeds(request: SubscribeToFeedsRequest): Stream<SubscribeToFeedsResponse> {\n return subscribeToFeeds({ feedStore: this.params.context.feedStore }, request);\n }\n\n subscribeToFeedBlocks(request: SubscribeToFeedBlocksRequest): Stream<SubscribeToFeedBlocksResponse> {\n return subscribeToFeedBlocks({ feedStore: this.params.context.feedStore }, request);\n }\n\n getSpaceSnapshot(request: GetSpaceSnapshotRequest): Promise<GetSpaceSnapshotResponse> {\n throw new Error();\n }\n\n saveSpaceSnapshot(request: SaveSpaceSnapshotRequest): Promise<SaveSpaceSnapshotResponse> {\n throw new Error();\n }\n\n clearSnapshots(request: ClearSnapshotsRequest): Promise<void> {\n throw new Error();\n }\n\n getNetworkPeers(request: GetNetworkPeersRequest): Promise<GetNetworkPeersResponse> {\n throw new Error();\n }\n\n subscribeToNetworkTopics(request: void): Stream<SubscribeToNetworkTopicsResponse> {\n throw new Error();\n }\n\n subscribeToSignalStatus(request: void): Stream<SubscribeToSignalStatusResponse> {\n return subscribeToNetworkStatus({ networkManager: this.params.context.networkManager });\n }\n\n subscribeToSignal(): Stream<SignalResponse> {\n return subscribeToSignal({ networkManager: this.params.context.networkManager });\n }\n\n subscribeToSwarmInfo(): Stream<SubscribeToSwarmInfoResponse> {\n return subscribeToSwarmInfo({ networkManager: this.params.context.networkManager });\n }\n}\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { EventSubscriptions } from '@dxos/async';\nimport { Stream } from '@dxos/codec-protobuf';\nimport { FeedIterator, FeedStore, FeedWrapper } from '@dxos/feed-store';\nimport { PublicKey } from '@dxos/keys';\nimport {\n SubscribeToFeedsRequest,\n SubscribeToFeedsResponse,\n SubscribeToFeedBlocksRequest,\n SubscribeToFeedBlocksResponse\n} from '@dxos/protocols/proto/dxos/devtools/host';\nimport { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { ComplexMap } from '@dxos/util';\n\nexport const subscribeToFeeds = (\n { feedStore }: { feedStore: FeedStore<FeedMessage> },\n { feedKeys }: SubscribeToFeedsRequest\n) => {\n return new Stream<SubscribeToFeedsResponse>(({ next }) => {\n if (feedKeys?.length === 0) {\n return;\n }\n\n const subscriptions = new EventSubscriptions();\n const feedMap = new ComplexMap<PublicKey, FeedWrapper<FeedMessage>>(PublicKey.hash);\n\n const update = () => {\n const { feeds } = feedStore;\n feeds\n .filter((feed) => !feedKeys?.length || feedKeys.some((feedKey) => feedKey.equals(feed.key)))\n .forEach((feed) => {\n if (!feedMap.has(feed.key)) {\n feedMap.set(feed.key, feed);\n feed.on('close', update);\n subscriptions.add(feed.off('close', update));\n }\n });\n\n next({\n feeds: Array.from(feedMap.values()).map((feed) => ({ feedKey: feed.key, length: feed.properties.length }))\n });\n };\n\n subscriptions.add(feedStore.feedOpened.on(update));\n update();\n\n return () => {\n subscriptions.clear();\n };\n });\n};\n\nexport const subscribeToFeedBlocks = (\n { feedStore }: { feedStore: FeedStore<FeedMessage> },\n { feedKey, maxBlocks = 10 }: SubscribeToFeedBlocksRequest\n) => {\n return new Stream<SubscribeToFeedBlocksResponse>(({ next }) => {\n if (!feedKey) {\n return;\n }\n const subscriptions = new EventSubscriptions();\n\n const timeout = setTimeout(async () => {\n const feed = feedStore.getFeed(feedKey);\n if (!feed) {\n return;\n }\n\n const update = async () => {\n const iterator = new FeedIterator(feed);\n await iterator.open();\n const blocks = [];\n for await (const block of iterator) {\n blocks.push(block);\n if (blocks.length >= feed.properties.length) {\n break;\n }\n }\n\n next({\n blocks: blocks.slice(-maxBlocks)\n });\n\n await iterator.close();\n };\n\n feed.on('append', update);\n subscriptions.add(() => feed.off('append', update));\n\n feed.on('truncate', update);\n subscriptions.add(() => feed.off('truncate', update));\n await update();\n });\n\n return () => {\n subscriptions.clear();\n clearTimeout(timeout);\n };\n });\n};\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { Keyring } from '@dxos/keyring';\nimport { SubscribeToKeyringKeysResponse } from '@dxos/protocols/proto/dxos/devtools/host';\n\nexport const subscribeToKeyringKeys = ({ keyring }: { keyring: Keyring }) =>\n new Stream<SubscribeToKeyringKeysResponse>(({ next }) => {\n const update = () => {\n next({\n keys: keyring.list()\n });\n };\n const unsubscribe = keyring.keysUpdate.on(update);\n update();\n return unsubscribe;\n });\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { PublicKey } from '@dxos/keys';\nimport { NetworkManager } from '@dxos/network-manager';\nimport {\n GetNetworkPeersRequest,\n GetNetworkPeersResponse,\n SubscribeToNetworkTopicsResponse,\n SubscribeToSignalStatusResponse,\n SignalResponse,\n SubscribeToSwarmInfoResponse\n} from '@dxos/protocols/proto/dxos/devtools/host';\n\nexport const subscribeToNetworkStatus = ({ networkManager }: { networkManager: NetworkManager }) =>\n new Stream<SubscribeToSignalStatusResponse>(({ next, close }) => {\n const update = () => {\n try {\n const status = networkManager.signalManager.getStatus();\n next({ servers: status });\n } catch (err: any) {\n close(err);\n }\n };\n\n networkManager.signalManager.statusChanged.on(update);\n update();\n });\n\nexport const subscribeToSignal = ({ networkManager }: { networkManager: NetworkManager }) =>\n new Stream<SignalResponse>(({ next }) => {\n const ctx = new Context();\n networkManager.signalManager.onMessage.on(ctx, (message) => {\n next({\n message: {\n author: message.author.asUint8Array(),\n recipient: message.recipient.asUint8Array(),\n payload: message.payload\n },\n receivedAt: new Date()\n });\n });\n networkManager.signalManager.swarmEvent.on(ctx, (swarmEvent) => {\n next({ swarmEvent: swarmEvent.swarmEvent, receivedAt: new Date() });\n });\n return () => {\n return ctx.dispose();\n };\n });\n\nexport const subscribeToNetworkTopics = ({ networkManager }: { networkManager: NetworkManager }) =>\n new Stream<SubscribeToNetworkTopicsResponse>(({ next, close }) => {\n const update = () => {\n try {\n const topics = networkManager.topics;\n const labeledTopics = topics.map((topic) => ({\n topic,\n label: networkManager.getSwarm(topic)?.label ?? topic.toHex()\n }));\n next({ topics: labeledTopics });\n } catch (err: any) {\n close(err);\n }\n };\n networkManager.topicsUpdated.on(update);\n\n update();\n });\n\nexport const subscribeToSwarmInfo = ({ networkManager }: { networkManager: NetworkManager }) =>\n new Stream<SubscribeToSwarmInfoResponse>(({ next }) => {\n const update = () => {\n const info = networkManager.connectionLog?.swarms;\n if (info) {\n next({ data: info });\n }\n };\n networkManager.connectionLog?.update.on(update);\n update();\n });\n\nexport const getNetworkPeers = (\n { networkManager }: { networkManager: NetworkManager },\n request: GetNetworkPeersRequest\n): GetNetworkPeersResponse => {\n if (!request.topic) {\n throw new Error('Expected a network topic');\n }\n\n const map = networkManager.getSwarmMap(PublicKey.from(request.topic));\n return {\n peers: map?.peers.map((peer) => ({\n ...peer,\n connections: peer.connections.map((connection) => connection.asUint8Array())\n }))\n };\n};\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { Space } from '@dxos/echo-pipeline';\nimport { SubscribeToSpacesRequest, SubscribeToSpacesResponse } from '@dxos/protocols/proto/dxos/devtools/host';\nimport { SpaceMetadata } from '@dxos/protocols/proto/dxos/echo/metadata';\n\nimport { ServiceContext } from '../services';\n\nexport const subscribeToSpaces = (context: ServiceContext, { spaceKeys = [] }: SubscribeToSpacesRequest) => {\n return new Stream<SubscribeToSpacesResponse>(({ next }) => {\n let unsubscribe: () => void;\n\n const update = async () => {\n const spaces: Space[] = [...context.spaceManager!.spaces.values()];\n const filteredSpaces = spaces.filter(\n (space) => !spaceKeys?.length || spaceKeys.some((spaceKey) => spaceKey.equals(space.key))\n );\n\n next({\n spaces: filteredSpaces.map((space): SubscribeToSpacesResponse.SpaceInfo => {\n const spaceMetadata = context.metadataStore.spaces.find((spaceMetadata: SpaceMetadata) =>\n spaceMetadata.key.equals(space.key)\n );\n\n return {\n key: space.key,\n isOpen: space.isOpen,\n timeframe: spaceMetadata?.dataTimeframe,\n genesisFeed: space.genesisFeedKey,\n controlFeed: space.controlFeedKey!, // TODO(dmaretskyi): Those keys may be missing.\n dataFeed: space.dataFeedKey!\n };\n })\n });\n };\n\n const timeout = setTimeout(async () => {\n await context.initialized.wait();\n unsubscribe = context.dataSpaceManager!.updated.on(() => update());\n\n // Send initial spaces.\n await update();\n });\n\n return () => {\n unsubscribe?.();\n clearTimeout(timeout);\n };\n });\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Event, Trigger } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { verifyCredential, CredentialSigner } from '@dxos/credentials';\nimport { AuthProvider, AuthVerifier } from '@dxos/echo-pipeline';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { schema } from '@dxos/protocols';\nimport { ComplexSet } from '@dxos/util';\n\nexport const createAuthProvider =\n (signer: CredentialSigner): AuthProvider =>\n async (nonce) => {\n const credential = await signer.createCredential({\n assertion: {\n '@type': 'dxos.halo.credentials.Auth'\n },\n subject: signer.getIssuer(),\n nonce\n });\n\n return schema.getCodecForType('dxos.halo.credentials.Credential').encode(credential);\n };\n\nexport type TrustedKeySetAuthVerifierParams = {\n // TODO(dmaretskyi): Change to `isTrusted: (key) => bool`.\n trustedKeysProvider: () => ComplexSet<PublicKey>;\n update: Event<void>;\n /**\n * Timeout to wait for the device key to be added to the trusted set.\n */\n authTimeout: number;\n};\n\n/**\n * Verifies credentials of another member in the space based on a set of trusted key.\n * Will wait up to `authTimeout` for the key to be added to the trusted set.\n */\nexport class TrustedKeySetAuthVerifier {\n private _ctx = new Context();\n\n // prettier-ignore\n constructor(\n private readonly _params: TrustedKeySetAuthVerifierParams\n ) {}\n\n async close() {\n await this._ctx.dispose();\n }\n\n get verifier(): AuthVerifier {\n return async (nonce, auth) => {\n const credential = schema.getCodecForType('dxos.halo.credentials.Credential').decode(auth);\n log('authenticating...', { credential });\n\n const result = await verifyCredential(credential);\n if (result.kind === 'fail') {\n log('Invalid credential', { result });\n return false;\n }\n\n if (!credential.proof.nonce || !Buffer.from(nonce).equals(credential.proof.nonce)) {\n log('Invalid nonce', { nonce, credential });\n return false;\n }\n\n if (this._isTrustedKey(credential.issuer)) {\n log('key is not currently in trusted set, waiting...', { key: credential.issuer });\n return true;\n }\n\n const trigger = new Trigger<boolean>();\n this._ctx.onDispose(() => {\n trigger.wake(false);\n });\n\n const clear = this._params.update.on(this._ctx, () => {\n if (this._isTrustedKey(credential.issuer)) {\n log('auth success', { key: credential.issuer });\n trigger.wake(true);\n } else {\n log('key is not currently in trusted set, waiting...', { key: credential.issuer });\n }\n });\n\n try {\n return await trigger.wait({ timeout: this._params.authTimeout });\n } catch {\n return false;\n } finally {\n clear();\n }\n };\n }\n\n private _isTrustedKey(deviceKey: PublicKey) {\n const deviceSet = this._params.trustedKeysProvider();\n return deviceSet.has(deviceKey);\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event } from '@dxos/async';\nimport {\n DeviceStateMachine,\n CredentialSigner,\n createCredentialSignerWithKey,\n createCredentialSignerWithChain,\n ProfileStateMachine,\n CredentialConsumer\n} from '@dxos/credentials';\nimport { Signer } from '@dxos/crypto';\nimport { failUndefined } from '@dxos/debug';\nimport { Space } from '@dxos/echo-pipeline';\nimport { writeMessages } from '@dxos/feed-store';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { AdmittedFeed, ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { DeviceAdmissionRequest } from '@dxos/protocols/proto/dxos/halo/invitations';\nimport { ComplexSet } from '@dxos/util';\n\nimport { TrustedKeySetAuthVerifier } from './authenticator';\n\n/**\n * Timeout for the device to be added to the trusted set during auth.\n */\nconst AUTH_TIMEOUT = 30000;\n\nexport type IdentityParams = {\n identityKey: PublicKey;\n deviceKey: PublicKey;\n signer: Signer;\n space: Space;\n};\n\n/**\n * Agent identity manager, which includes the agent's Halo space.\n */\nexport class Identity {\n public readonly space: Space;\n private readonly _signer: Signer;\n private readonly _deviceStateMachine: CredentialConsumer<DeviceStateMachine>;\n private readonly _profileStateMachine: CredentialConsumer<ProfileStateMachine>;\n public readonly authVerifier: TrustedKeySetAuthVerifier;\n\n public readonly identityKey: PublicKey;\n public readonly deviceKey: PublicKey;\n\n public readonly stateUpdate = new Event();\n\n constructor({ space, signer, identityKey, deviceKey }: IdentityParams) {\n this.space = space;\n this._signer = signer;\n\n this.identityKey = identityKey;\n this.deviceKey = deviceKey;\n\n this._deviceStateMachine = this.space.spaceState.registerProcessor(\n new DeviceStateMachine({\n identityKey: this.identityKey,\n deviceKey: this.deviceKey,\n onUpdate: () => this.stateUpdate.emit()\n })\n );\n this._profileStateMachine = this.space.spaceState.registerProcessor(\n new ProfileStateMachine({\n identityKey: this.identityKey,\n onUpdate: () => this.stateUpdate.emit()\n })\n );\n\n this.authVerifier = new TrustedKeySetAuthVerifier({\n trustedKeysProvider: () => this.authorizedDeviceKeys,\n update: this.stateUpdate,\n authTimeout: AUTH_TIMEOUT\n });\n }\n\n // TODO(burdon): Expose state object?\n get authorizedDeviceKeys(): ComplexSet<PublicKey> {\n return this._deviceStateMachine.processor.authorizedDeviceKeys;\n }\n\n async open() {\n await this._deviceStateMachine.open();\n await this._profileStateMachine.open();\n await this.space.open();\n }\n\n async close() {\n await this.authVerifier.close();\n await this._deviceStateMachine.close();\n await this._profileStateMachine.close();\n await this.space.close();\n }\n\n async ready() {\n await this._deviceStateMachine.processor.deviceChainReady.wait();\n\n await this.controlPipeline.state.waitUntilReachedTargetTimeframe({ timeout: 3_000 });\n }\n\n get profileDocument(): ProfileDocument | undefined {\n return this._profileStateMachine.processor.profile;\n }\n\n /**\n * @test-only\n */\n get controlPipeline() {\n return this.space.controlPipeline;\n }\n\n get haloSpaceKey() {\n return this.space.key;\n }\n\n get haloGenesisFeedKey() {\n return this.space.genesisFeedKey;\n }\n\n get deviceCredentialChain() {\n return this._deviceStateMachine.processor.deviceCredentialChain;\n }\n\n getAdmissionCredentials(): DeviceAdmissionRequest {\n return {\n deviceKey: this.deviceKey,\n controlFeedKey: this.space.controlFeedKey ?? failUndefined(),\n dataFeedKey: this.space.dataFeedKey ?? failUndefined()\n };\n }\n\n /**\n * Issues credentials as identity.\n * Requires identity to be ready.\n */\n getIdentityCredentialSigner(): CredentialSigner {\n assert(this._deviceStateMachine.processor.deviceCredentialChain, 'Device credential chain is not ready.');\n return createCredentialSignerWithChain(\n this._signer,\n this._deviceStateMachine.processor.deviceCredentialChain,\n this.deviceKey\n );\n }\n\n /**\n * Issues credentials as device.\n */\n getDeviceCredentialSigner(): CredentialSigner {\n return createCredentialSignerWithKey(this._signer, this.deviceKey);\n }\n\n async admitDevice({ deviceKey, controlFeedKey, dataFeedKey }: DeviceAdmissionRequest) {\n log('Admitting device:', {\n identityKey: this.identityKey,\n hostDevice: this.deviceKey,\n deviceKey,\n controlFeedKey,\n dataFeedKey\n });\n const signer = this.getIdentityCredentialSigner();\n await writeMessages(\n this.controlPipeline.writer,\n [\n await signer.createCredential({\n subject: deviceKey,\n assertion: {\n '@type': 'dxos.halo.credentials.AuthorizedDevice',\n identityKey: this.identityKey,\n deviceKey\n }\n }),\n await signer.createCredential({\n subject: controlFeedKey,\n assertion: {\n '@type': 'dxos.halo.credentials.AdmittedFeed',\n spaceKey: this.haloSpaceKey,\n deviceKey,\n identityKey: this.identityKey,\n designation: AdmittedFeed.Designation.CONTROL\n }\n }),\n await signer.createCredential({\n subject: dataFeedKey,\n assertion: {\n '@type': 'dxos.halo.credentials.AdmittedFeed',\n spaceKey: this.haloSpaceKey,\n deviceKey,\n identityKey: this.identityKey,\n designation: AdmittedFeed.Designation.DATA\n }\n })\n ].map((credential): FeedMessage.Payload => ({ credential: { credential } }))\n );\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event } from '@dxos/async';\nimport { createCredentialSignerWithKey, CredentialGenerator } from '@dxos/credentials';\nimport { MetadataStore, SpaceManager, SwarmIdentity } from '@dxos/echo-pipeline';\nimport { FeedStore } from '@dxos/feed-store';\nimport { Keyring } from '@dxos/keyring';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/protocols';\nimport { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { IdentityRecord, SpaceMetadata } from '@dxos/protocols/proto/dxos/echo/metadata';\nimport { AdmittedFeed } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { Timeframe } from '@dxos/timeframe';\nimport { deferFunction } from '@dxos/util';\n\nimport { createAuthProvider } from './authenticator';\nimport { Identity } from './identity';\n\ninterface ConstructSpaceParams {\n spaceRecord: SpaceMetadata;\n swarmIdentity: SwarmIdentity;\n identityKey: PublicKey;\n}\n\nexport type JoinIdentityParams = {\n identityKey: PublicKey;\n deviceKey: PublicKey;\n haloSpaceKey: PublicKey;\n haloGenesisFeedKey: PublicKey;\n controlFeedKey: PublicKey;\n dataFeedKey: PublicKey;\n\n /**\n * Latest known timeframe for the control pipeline.\n * We will try to catch up to this timeframe before starting the data pipeline.\n */\n controlTimeframe?: Timeframe;\n};\n\nexport type CreateIdentityOptions = {\n displayName?: string;\n};\n\n// TODO(dmaretskyi): Rename: represents the peer's state machine.\nexport class IdentityManager {\n readonly stateUpdate = new Event();\n\n private _identity?: Identity;\n\n private readonly _instanceId = PublicKey.random().toHex();\n public _traceParent?: string;\n\n // TODO(burdon): IdentityManagerParams.\n // TODO(dmaretskyi): Perhaps this should take/generate the peerKey outside of an initialized identity.\n constructor(\n private readonly _metadataStore: MetadataStore,\n private readonly _keyring: Keyring,\n private readonly _feedStore: FeedStore<FeedMessage>,\n private readonly _spaceManager: SpaceManager\n ) {}\n\n get identity() {\n return this._identity;\n }\n\n async open() {\n log.trace('dxos.halo.identity-manager', trace.begin({ id: this._instanceId, parentId: this._traceParent }));\n await this._metadataStore.load();\n\n const identityRecord = this._metadataStore.getIdentityRecord();\n log('identity record', { identityRecord });\n if (identityRecord) {\n this._identity = await this._constructIdentity(identityRecord);\n await this._identity.open();\n await this._identity.ready();\n log.trace('dxos.halo.identity', {\n identityKey: identityRecord.identityKey,\n displayName: this._identity.profileDocument?.displayName\n });\n this.stateUpdate.emit();\n }\n }\n\n async close() {\n await this._identity?.close();\n log.trace('dxos.halo.identity-manager', trace.end({ id: this._instanceId }));\n }\n\n async createIdentity({ displayName }: CreateIdentityOptions = {}) {\n assert(!this._identity, 'Identity already exists.');\n log('creating identity...');\n\n const controlFeedKey = await this._keyring.createKey();\n const identityRecord: IdentityRecord = {\n identityKey: await this._keyring.createKey(),\n deviceKey: await this._keyring.createKey(),\n haloSpace: {\n key: await this._keyring.createKey(),\n genesisFeedKey: controlFeedKey,\n controlFeedKey,\n dataFeedKey: await this._keyring.createKey()\n }\n };\n\n const identity = await this._constructIdentity(identityRecord);\n await identity.open();\n\n {\n const generator = new CredentialGenerator(this._keyring, identityRecord.identityKey, identityRecord.deviceKey);\n assert(identityRecord.haloSpace.genesisFeedKey, 'Genesis feed key is required.');\n assert(identityRecord.haloSpace.dataFeedKey, 'Data feed key is required.');\n const credentials = [\n // Space genesis.\n ...(await generator.createSpaceGenesis(identityRecord.haloSpace.key, identityRecord.haloSpace.genesisFeedKey)),\n\n // Feed admission.\n await generator.createFeedAdmission(\n identityRecord.haloSpace.key,\n identityRecord.haloSpace.dataFeedKey,\n AdmittedFeed.Designation.DATA\n )\n ];\n\n if (displayName) {\n credentials.push(await generator.createProfileCredential({ displayName }));\n }\n\n // Device authorization (writes device chain).\n // NOTE: This credential is written last. This is a hack to make sure that display name is set before identity is \"ready\".\n credentials.push(await generator.createDeviceAuthorization(identityRecord.deviceKey));\n\n for (const credential of credentials) {\n await identity.controlPipeline.writer.write({\n credential: { credential }\n });\n }\n }\n\n // TODO(burdon): ???\n // await this._keyring.deleteKey(identityRecord.identity_key);\n // await this._keyring.deleteKey(identityRecord.halo_space.space_key);\n\n await this._metadataStore.setIdentityRecord(identityRecord);\n this._identity = identity;\n await this._identity.ready();\n log.trace('dxos.halo.identity', {\n identityKey: identityRecord.identityKey,\n displayName: this._identity.profileDocument?.displayName\n });\n this.stateUpdate.emit();\n\n log('created identity', { identityKey: identity.identityKey, deviceKey: identity.deviceKey });\n return identity;\n }\n\n /**\n * Accept an existing identity. Expects it's device key to be authorized (now or later).\n */\n async acceptIdentity(params: JoinIdentityParams) {\n log('accepting identity', { params });\n assert(!this._identity, 'Identity already exists.');\n\n const identityRecord: IdentityRecord = {\n identityKey: params.identityKey,\n deviceKey: params.deviceKey,\n haloSpace: {\n key: params.haloSpaceKey,\n genesisFeedKey: params.haloGenesisFeedKey,\n controlFeedKey: params.controlFeedKey,\n dataFeedKey: params.dataFeedKey,\n controlTimeframe: params.controlTimeframe\n }\n };\n const identity = await this._constructIdentity(identityRecord);\n\n await identity.open();\n this._identity = identity;\n await this._metadataStore.setIdentityRecord(identityRecord);\n await this._identity.ready();\n log.trace('dxos.halo.identity', {\n identityKey: identityRecord.identityKey,\n displayName: this._identity.profileDocument?.displayName\n });\n\n this.stateUpdate.emit();\n log('accepted identity', { identityKey: identity.identityKey, deviceKey: identity.deviceKey });\n return identity;\n }\n\n private async _constructIdentity(identityRecord: IdentityRecord) {\n assert(!this._identity);\n log('constructing identity', { identityRecord });\n\n // Must be created before the space so the feeds are writable.\n assert(identityRecord.haloSpace.controlFeedKey);\n const controlFeed = await this._feedStore.openFeed(identityRecord.haloSpace.controlFeedKey, {\n writable: true\n });\n assert(identityRecord.haloSpace.dataFeedKey);\n const dataFeed = await this._feedStore.openFeed(identityRecord.haloSpace.dataFeedKey, { writable: true });\n\n const space = await this._constructSpace({\n spaceRecord: identityRecord.haloSpace,\n swarmIdentity: {\n peerKey: identityRecord.deviceKey,\n credentialProvider: createAuthProvider(createCredentialSignerWithKey(this._keyring, identityRecord.deviceKey)),\n credentialAuthenticator: deferFunction(() => identity.authVerifier.verifier)\n },\n identityKey: identityRecord.identityKey\n });\n space.setControlFeed(controlFeed);\n space.setDataFeed(dataFeed);\n\n const identity: Identity = new Identity({\n space,\n signer: this._keyring,\n identityKey: identityRecord.identityKey,\n deviceKey: identityRecord.deviceKey\n });\n log('done', { identityKey: identityRecord.identityKey });\n\n // TODO(mykola): Set new timeframe on a write to a feed.\n if (identityRecord.haloSpace.controlTimeframe) {\n identity.controlPipeline.state.setTargetTimeframe(identityRecord.haloSpace.controlTimeframe);\n }\n\n return identity;\n }\n\n private async _constructSpace({ spaceRecord, swarmIdentity, identityKey }: ConstructSpaceParams) {\n return this._spaceManager.constructSpace({\n metadata: {\n key: spaceRecord.key,\n genesisFeedKey: spaceRecord.genesisFeedKey\n },\n swarmIdentity,\n onNetworkConnection: () => {}\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { signPresentation } from '@dxos/credentials';\nimport { todo } from '@dxos/debug';\nimport {\n Identity,\n IdentityService,\n QueryIdentityResponse,\n RecoverIdentityRequest,\n SignPresentationRequest\n} from '@dxos/protocols/proto/dxos/client/services';\nimport { Presentation, ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';\n\nimport { ServiceContext } from '../services';\n\nexport class IdentityServiceImpl implements IdentityService {\n // TODO(wittjosiah): Remove dependency on service context.\n constructor(private readonly _serviceContext: ServiceContext) {}\n\n async createIdentity(request: ProfileDocument): Promise<Identity> {\n await this._serviceContext.createIdentity(request);\n\n return this._getIdentity()!;\n }\n\n async recoverIdentity(request: RecoverIdentityRequest): Promise<Identity> {\n return todo();\n }\n\n queryIdentity(): Stream<QueryIdentityResponse> {\n return new Stream(({ next }) => {\n const emitNext = () => next({ identity: this._getIdentity() });\n\n emitNext();\n return this._serviceContext.identityManager.stateUpdate.on(emitNext);\n });\n }\n\n private _getIdentity(): Identity | undefined {\n if (!this._serviceContext.identityManager.identity) {\n return undefined;\n }\n\n return {\n identityKey: this._serviceContext.identityManager.identity.identityKey,\n spaceKey: this._serviceContext.identityManager.identity.space.key,\n profile: this._serviceContext.identityManager.identity.profileDocument\n };\n }\n\n async signPresentation({ presentation, nonce }: SignPresentationRequest): Promise<Presentation> {\n assert(this._serviceContext.identityManager.identity, 'Identity not initialized.');\n\n return await signPresentation({\n presentation,\n signer: this._serviceContext.keyring,\n signerKey: this._serviceContext.identityManager.identity.deviceKey,\n chain: this._serviceContext.identityManager.identity.deviceCredentialChain,\n nonce\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Keyring } from '@dxos/keyring';\nimport { Invitation } from '@dxos/protocols/proto/dxos/client/services';\nimport { AdmissionRequest, AdmissionResponse, IntroductionRequest } from '@dxos/protocols/proto/dxos/halo/invitations';\n\nimport { Identity, JoinIdentityParams } from '../identity';\nimport { InvitationProtocol } from './invitation-protocol';\n\nexport class DeviceInvitationProtocol implements InvitationProtocol {\n constructor(\n private readonly _keyring: Keyring,\n private readonly _getIdentity: () => Identity,\n private readonly _acceptIdentity: (identity: JoinIdentityParams) => Promise<Identity>\n ) {}\n\n toJSON(): object {\n return {};\n }\n\n getInvitationContext(): Partial<Invitation> & Pick<Invitation, 'kind'> {\n return {\n kind: Invitation.Kind.DEVICE\n };\n }\n\n async admit(request: AdmissionRequest): Promise<AdmissionResponse> {\n assert(request.device);\n const identity = this._getIdentity();\n await identity.admitDevice(request.device);\n\n return {\n device: {\n identityKey: identity.identityKey,\n haloSpaceKey: identity.haloSpaceKey,\n genesisFeedKey: identity.haloGenesisFeedKey,\n controlTimeframe: identity.controlPipeline.state.timeframe\n }\n };\n }\n\n createIntroduction(): IntroductionRequest {\n return {};\n }\n\n async createAdmissionRequest(): Promise<AdmissionRequest> {\n const deviceKey = await this._keyring.createKey();\n const controlFeedKey = await this._keyring.createKey();\n const dataFeedKey = await this._keyring.createKey();\n\n return {\n device: {\n deviceKey,\n controlFeedKey,\n dataFeedKey\n }\n };\n }\n\n async accept(response: AdmissionResponse, request: AdmissionRequest): Promise<Partial<Invitation>> {\n assert(response.device);\n const { identityKey, haloSpaceKey, genesisFeedKey, controlTimeframe } = response.device;\n\n assert(request.device);\n const { deviceKey, controlFeedKey, dataFeedKey } = request.device;\n\n await this._acceptIdentity({\n identityKey,\n deviceKey,\n haloSpaceKey,\n haloGenesisFeedKey: genesisFeedKey,\n controlFeedKey,\n dataFeedKey,\n controlTimeframe\n });\n\n return { identityKey };\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { PushStream, scheduleTask, sleep, TimeoutError, Trigger } from '@dxos/async';\nimport {\n AUTHENTICATION_CODE_LENGTH,\n CancellableInvitationObservable,\n INVITATION_TIMEOUT,\n ON_CLOSE_DELAY,\n AuthenticatingInvitationObservable\n} from '@dxos/client';\nimport { Context } from '@dxos/context';\nimport { generatePasscode } from '@dxos/credentials';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { createTeleportProtocolFactory, NetworkManager, StarTopology } from '@dxos/network-manager';\nimport { schema } from '@dxos/protocols';\nimport { Invitation } from '@dxos/protocols/proto/dxos/client/services';\nimport { ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport {\n AuthenticationRequest,\n AuthenticationResponse,\n IntroductionRequest,\n IntroductionResponse,\n AdmissionRequest,\n AdmissionResponse,\n InvitationHostService\n} from '@dxos/protocols/proto/dxos/halo/invitations';\nimport { ExtensionContext, RpcExtension } from '@dxos/teleport';\n\nimport { InvitationProtocol } from './invitation-protocol';\n\nconst MAX_OTP_ATTEMPTS = 3;\n\n/**\n * Generic handler for Halo and Space invitations.\n * Handles the life-cycle of invitations between peers.\n *\n * Host\n * - Creates an invitation containing a swarm topic (which can be shared via a URL, QR code, or direct message).\n * - Joins the swarm with the topic and waits for guest's introduction.\n * - Wait for guest to authenticate with OTP.\n * - Waits for guest to present credentials (containing local device and feed keys).\n * - Writes credentials to control feed then exits.\n *\n * Guest\n * - Joins the swarm with the topic.\n * - Sends an introduction.\n * - Sends authentication OTP.\n * - If Space handler then creates a local cloned space (with genesis block).\n * - Sends admission credentials.\n *\n * TODO(burdon): Show proxy/service relationship and reference design doc/diagram.\n *\n * ```\n * [Guest] [Host]\n * |------------------------------------Introduce-->|\n * |-------------------------------[Authenticate]-->|\n * |----------------------------------------Admit-->|\n * ```\n */\nexport class InvitationsHandler {\n constructor(private readonly _networkManager: NetworkManager) {}\n\n createInvitation(protocol: InvitationProtocol, options?: Partial<Invitation>): CancellableInvitationObservable {\n const {\n invitationId = PublicKey.random().toHex(),\n type = Invitation.Type.INTERACTIVE,\n authMethod = Invitation.AuthMethod.SHARED_SECRET,\n state = Invitation.State.INIT,\n timeout = INVITATION_TIMEOUT,\n swarmKey = PublicKey.random()\n } = options ?? {};\n const authCode =\n options?.authCode ??\n (authMethod === Invitation.AuthMethod.SHARED_SECRET ? generatePasscode(AUTHENTICATION_CODE_LENGTH) : undefined);\n assert(protocol);\n\n const invitation: Invitation = {\n invitationId,\n type,\n authMethod,\n state,\n swarmKey,\n authCode,\n timeout,\n ...protocol.getInvitationContext()\n };\n\n const stream = new PushStream<Invitation>();\n const ctx = new Context({\n onError: (err) => {\n void ctx.dispose();\n stream.error(err);\n }\n });\n\n ctx.onDispose(() => {\n log('complete', { ...protocol.toJSON() });\n stream.complete();\n });\n\n // Called for every connecting peer.\n const createExtension = (): InvitationHostExtension => {\n const success = new Trigger<PublicKey>();\n let guestProfile: ProfileDocument | undefined;\n let authenticationPassed = false;\n let authenticationRetry = 0;\n\n const extension = new InvitationHostExtension({\n introduce: async ({ profile }) => {\n log('guest introduced itself', {\n guestProfile: profile,\n ...protocol.toJSON()\n });\n\n guestProfile = profile;\n\n // TODO(dmaretskyi): Should we expose guest's profile in this callback?\n stream.next({ ...invitation, state: Invitation.State.READY_FOR_AUTHENTICATION });\n\n // TODO(wittjosiah): Make when the space details are revealed configurable.\n // Spaces may want to have public details (name, member count, etc.) or hide that until guest is authed.\n return {\n spaceKey: authMethod === Invitation.AuthMethod.NONE ? protocol.getInvitationContext().spaceKey : undefined,\n authMethod\n };\n },\n\n authenticate: async ({ authCode: code }) => {\n log('received authentication request', { authCode: code });\n let status = AuthenticationResponse.Status.OK;\n\n switch (invitation.authMethod) {\n case Invitation.AuthMethod.NONE: {\n log('authentication not required');\n return { status: AuthenticationResponse.Status.OK };\n }\n\n case Invitation.AuthMethod.SHARED_SECRET: {\n if (invitation.authCode) {\n if (authenticationRetry++ > MAX_OTP_ATTEMPTS) {\n status = AuthenticationResponse.Status.INVALID_OPT_ATTEMPTS;\n } else if (code !== invitation.authCode) {\n status = AuthenticationResponse.Status.INVALID_OTP;\n } else {\n authenticationPassed = true;\n }\n }\n break;\n }\n\n default: {\n log.error('invalid authentication method', { authMethod: invitation.authMethod });\n status = AuthenticationResponse.Status.INTERNAL_ERROR;\n break;\n }\n }\n\n return { status };\n },\n\n admit: async (admissionRequest) => {\n try {\n // Check authenticated.\n if (isAuthenticationRequired(invitation) && !authenticationPassed) {\n throw new Error('Not authenticated');\n }\n\n const deviceKey = admissionRequest.device?.deviceKey ?? admissionRequest.space?.deviceKey;\n assert(deviceKey);\n const admissionResponse = await protocol.admit(admissionRequest, guestProfile);\n\n // Updating credentials complete.\n success.wake(deviceKey);\n\n return admissionResponse;\n } catch (err: any) {\n // TODO(burdon): Generic RPC callback to report error to client.\n stream.error(err);\n throw err; // Propagate error to guest.\n }\n },\n\n onOpen: () => {\n scheduleTask(ctx, async () => {\n try {\n log('connected', { ...protocol.toJSON() });\n stream.next({ ...invitation, state: Invitation.State.CONNECTED });\n const deviceKey = await success.wait({ timeout });\n log('admitted guest', { guest: deviceKey, ...protocol.toJSON() });\n stream.next({ ...invitation, state: Invitation.State.SUCCESS });\n } catch (err: any) {\n if (err instanceof TimeoutError) {\n log('timeout', { ...protocol.toJSON() });\n stream.next({ ...invitation, state: Invitation.State.TIMEOUT });\n } else {\n log.error('failed', err);\n stream.error(err);\n }\n } finally {\n if (type !== Invitation.Type.MULTIUSE) {\n await sleep(ON_CLOSE_DELAY);\n await ctx.dispose();\n }\n }\n });\n }\n });\n\n return extension;\n };\n\n scheduleTask(ctx, async () => {\n const topic = invitation.swarmKey!;\n const swarmConnection = await this._networkManager.joinSwarm({\n topic,\n peerId: topic,\n protocolProvider: createTeleportProtocolFactory(async (teleport) => {\n teleport.addExtension('dxos.halo.invitations', createExtension());\n }),\n topology: new StarTopology(topic)\n });\n ctx.onDispose(() => swarmConnection.close());\n\n stream.next({ ...invitation, state: Invitation.State.CONNECTING });\n });\n\n // TODO(burdon): Stop anything pending.\n const observable = new CancellableInvitationObservable({\n initialInvitation: invitation,\n subscriber: stream.observable,\n onCancel: async () => {\n stream.next({ ...invitation, state: Invitation.State.CANCELLED });\n await ctx.dispose();\n }\n });\n\n return observable;\n }\n\n acceptInvitation(protocol: InvitationProtocol, invitation: Invitation): AuthenticatingInvitationObservable {\n const { timeout = INVITATION_TIMEOUT } = invitation;\n assert(protocol);\n\n const authenticated = new Trigger<string>();\n\n const stream = new PushStream<Invitation>();\n const ctx = new Context({\n onError: (err) => {\n if (err instanceof TimeoutError) {\n log('timeout', { ...protocol.toJSON() });\n stream.next({ ...invitation, state: Invitation.State.TIMEOUT });\n } else {\n log.warn('auth failed', err);\n stream.error(err);\n }\n void ctx.dispose();\n }\n });\n\n ctx.onDispose(() => {\n log('complete', { ...protocol.toJSON() });\n stream.complete();\n });\n\n const createExtension = (): InvitationGuestExtension => {\n let connectionCount = 0;\n\n const extension = new InvitationGuestExtension({\n onOpen: () => {\n scheduleTask(ctx, async () => {\n try {\n // TODO(burdon): Bug where guest may create multiple connections.\n if (++connectionCount > 1) {\n throw new Error(`multiple connections detected: ${connectionCount}`);\n }\n\n scheduleTask(ctx, () => ctx.raise(new TimeoutError(timeout)), timeout);\n\n log('connected', { ...protocol.toJSON() });\n stream.next({ ...invitation, state: Invitation.State.CONNECTED });\n\n // 1. Introduce guest to host.\n log('introduce', { ...protocol.toJSON() });\n const introductionResponse = await extension.rpc.InvitationHostService.introduce(\n protocol.createIntroduction()\n );\n log('introduce response', { ...protocol.toJSON(), response: introductionResponse });\n invitation.authMethod = introductionResponse.authMethod;\n if (introductionResponse.spaceKey) {\n invitation.spaceKey = introductionResponse.spaceKey;\n }\n\n // 2. Get authentication code.\n if (isAuthenticationRequired(invitation)) {\n for (let attempt = 1; attempt <= MAX_OTP_ATTEMPTS; attempt++) {\n log('guest waiting for authentication code...');\n stream.next({ ...invitation, state: Invitation.State.READY_FOR_AUTHENTICATION });\n const authCode = await authenticated.wait({ timeout });\n\n log('sending authentication request');\n stream.next({ ...invitation, state: Invitation.State.AUTHENTICATING });\n const response = await extension.rpc.InvitationHostService.authenticate({ authCode });\n if (response.status === undefined || response.status === AuthenticationResponse.Status.OK) {\n break;\n }\n\n if (response.status === AuthenticationResponse.Status.INVALID_OTP) {\n if (attempt === MAX_OTP_ATTEMPTS) {\n throw new Error(`Maximum retry attempts: ${MAX_OTP_ATTEMPTS}`);\n } else {\n log('retrying invalid code', { attempt });\n authenticated.reset();\n }\n }\n }\n } else {\n // Notify that introduction is complete even if auth is not required.\n stream.next({ ...invitation, state: Invitation.State.READY_FOR_AUTHENTICATION });\n }\n\n // 3. Send admission credentials to host (with local space keys).\n log('request admission', { ...protocol.toJSON() });\n const admissionRequest = await protocol.createAdmissionRequest();\n const admissionResponse = await extension.rpc.InvitationHostService.admit(admissionRequest);\n\n // 4. Record credential in our HALO.\n const result = await protocol.accept(admissionResponse, admissionRequest);\n\n // 5. Success.\n log('admitted by host', { ...protocol.toJSON() });\n stream.next({ ...invitation, ...result, state: Invitation.State.SUCCESS });\n } catch (err: any) {\n if (err instanceof TimeoutError) {\n log('timeout', { ...protocol.toJSON() });\n stream.next({ ...invitation, state: Invitation.State.TIMEOUT });\n } else {\n log.warn('auth failed', err);\n stream.error(err);\n }\n } finally {\n await ctx.dispose();\n }\n });\n }\n });\n\n return extension;\n };\n\n scheduleTask(ctx, async () => {\n assert(invitation.swarmKey);\n const topic = invitation.swarmKey;\n const swarmConnection = await this._networkManager.joinSwarm({\n topic,\n peerId: PublicKey.random(),\n protocolProvider: createTeleportProtocolFactory(async (teleport) => {\n teleport.addExtension('dxos.halo.invitations', createExtension());\n }),\n topology: new StarTopology(topic)\n });\n ctx.onDispose(() => swarmConnection.close());\n\n stream.next({ ...invitation, state: Invitation.State.CONNECTING });\n });\n\n const observable = new AuthenticatingInvitationObservable({\n initialInvitation: invitation,\n subscriber: stream.observable,\n onCancel: async () => {\n stream.next({ ...invitation, state: Invitation.State.CANCELLED });\n await ctx.dispose();\n },\n onAuthenticate: async (code: string) => {\n // TODO(burdon): Reset creates a race condition? Event?\n authenticated.wake(code);\n }\n });\n\n return observable;\n }\n}\n\nconst isAuthenticationRequired = (invitation: Invitation) => invitation.authMethod !== Invitation.AuthMethod.NONE;\n\ntype InvitationHostExtensionCallbacks = {\n // Deliberately not async to not block the extensions opening.\n onOpen: () => void;\n\n introduce: (request: IntroductionRequest) => Promise<IntroductionResponse>;\n authenticate: (request: AuthenticationRequest) => Promise<AuthenticationResponse>;\n admit: (request: AdmissionRequest) => Promise<AdmissionResponse>;\n};\n\n/**\n * Host's side for a connection to a concrete peer in p2p network during invitation.\n */\nclass InvitationHostExtension extends RpcExtension<{}, { InvitationHostService: InvitationHostService }> {\n constructor(private readonly _callbacks: InvitationHostExtensionCallbacks) {\n super({\n exposed: {\n InvitationHostService: schema.getService('dxos.halo.invitations.InvitationHostService')\n }\n });\n }\n\n protected override async getHandlers(): Promise<{ InvitationHostService: InvitationHostService }> {\n return {\n // TODO(dmaretskyi): For now this is just forwarding the data to callbacks since we don't have session-specific logic.\n // Perhaps in the future we will have more complex logic here.\n InvitationHostService: {\n introduce: async (request) => {\n return this._callbacks.introduce(request);\n },\n\n authenticate: async (request) => {\n return this._callbacks.authenticate(request);\n },\n\n admit: async (request) => {\n return this._callbacks.admit(request);\n }\n }\n };\n }\n\n override async onOpen(context: ExtensionContext) {\n await super.onOpen(context);\n this._callbacks.onOpen();\n }\n}\n\ntype InvitationGuestExtensionCallbacks = {\n // Deliberately not async to not block the extensions opening.\n onOpen: () => void;\n};\n\n/**\n * Guest's side for a connection to a concrete peer in p2p network during invitation.\n */\nclass InvitationGuestExtension extends RpcExtension<{ InvitationHostService: InvitationHostService }, {}> {\n constructor(private readonly _callbacks: InvitationGuestExtensionCallbacks) {\n super({\n requested: {\n InvitationHostService: schema.getService('dxos.halo.invitations.InvitationHostService')\n }\n });\n }\n\n protected override async getHandlers() {\n return {};\n }\n\n override async onOpen(context: ExtensionContext) {\n await super.onOpen(context);\n this._callbacks.onOpen();\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { AuthenticatingInvitationObservable, CancellableInvitationObservable } from '@dxos/client';\nimport { Stream } from '@dxos/codec-protobuf';\nimport { log } from '@dxos/log';\nimport { AuthenticationRequest, Invitation, InvitationsService } from '@dxos/protocols/proto/dxos/client/services';\n\nimport { InvitationProtocol } from './invitation-protocol';\nimport { InvitationsHandler } from './invitations-handler';\n\n/**\n * Adapts invitation service observable to client/service stream.\n */\nexport class InvitationsServiceImpl implements InvitationsService {\n private readonly _createInvitations = new Map<string, CancellableInvitationObservable>();\n private readonly _acceptInvitations = new Map<string, AuthenticatingInvitationObservable>();\n\n constructor(\n private readonly _invitationsHandler: InvitationsHandler,\n private readonly _getHandler: (invitation: Invitation) => InvitationProtocol\n ) {}\n\n // TODO(burdon): Guest/host label.\n getLoggingContext() {\n return {\n // deviceKey: this._identityManager.identity?.deviceKey\n };\n }\n\n createInvitation(invitation: Invitation): Stream<Invitation> {\n return new Stream<Invitation>(({ next, close }) => {\n const handler = this._getHandler(invitation);\n log('stream opened', this.getLoggingContext());\n\n let invitationId: string;\n const observable = this._invitationsHandler.createInvitation(handler, invitation);\n observable.subscribe(\n (invitation) => {\n switch (invitation.state) {\n case Invitation.State.CONNECTING: {\n assert(invitation.invitationId);\n invitationId = invitation.invitationId;\n this._createInvitations.set(invitation.invitationId, observable);\n invitation.state = Invitation.State.CONNECTING;\n next(invitation);\n break;\n }\n case Invitation.State.CONNECTED: {\n assert(invitation.invitationId);\n invitation.state = Invitation.State.CONNECTED;\n next(invitation);\n break;\n }\n case Invitation.State.READY_FOR_AUTHENTICATION: {\n assert(invitation.invitationId);\n invitation.state = Invitation.State.READY_FOR_AUTHENTICATION;\n next(invitation);\n break;\n }\n case Invitation.State.AUTHENTICATING: {\n assert(invitation.invitationId);\n invitation.state = Invitation.State.AUTHENTICATING;\n next(invitation);\n break;\n }\n case Invitation.State.SUCCESS: {\n assert(invitation.invitationId);\n invitation.state = Invitation.State.SUCCESS;\n next(invitation);\n break;\n }\n case Invitation.State.CANCELLED: {\n assert(invitationId);\n invitation.invitationId = invitationId;\n invitation.state = Invitation.State.CANCELLED;\n next(invitation);\n break;\n }\n case Invitation.State.TIMEOUT: {\n assert(invitationId);\n invitation.invitationId = invitationId;\n invitation.state = Invitation.State.TIMEOUT;\n next(invitation);\n break;\n }\n }\n },\n (err: Error) => {\n close(err);\n },\n () => {\n close();\n }\n );\n\n return (err?: Error) => {\n const context = this.getLoggingContext();\n if (err) {\n log.warn('stream closed', { ...context, err });\n } else {\n log('stream closed', context);\n }\n\n this._createInvitations.delete(invitation.invitationId!);\n };\n });\n }\n\n acceptInvitation(invitation: Invitation): Stream<Invitation> {\n return new Stream<Invitation>(({ next, close }) => {\n log('stream opened', this.getLoggingContext());\n const handler = this._getHandler(invitation);\n\n let invitationId: string;\n const observable = this._invitationsHandler.acceptInvitation(handler, invitation);\n observable.subscribe(\n (invitation) => {\n switch (invitation.state) {\n case Invitation.State.CONNECTING: {\n assert(invitation.invitationId);\n invitationId = invitation.invitationId;\n this._acceptInvitations.set(invitation.invitationId, observable);\n invitation.state = Invitation.State.CONNECTING;\n next(invitation);\n break;\n }\n case Invitation.State.CONNECTED: {\n assert(invitation.invitationId);\n invitation.state = Invitation.State.CONNECTED;\n next(invitation);\n break;\n }\n case Invitation.State.READY_FOR_AUTHENTICATION: {\n assert(invitation.invitationId);\n invitation.state = Invitation.State.READY_FOR_AUTHENTICATION;\n next(invitation);\n break;\n }\n case Invitation.State.AUTHENTICATING: {\n assert(invitation.invitationId);\n invitation.state = Invitation.State.AUTHENTICATING;\n next(invitation);\n break;\n }\n case Invitation.State.SUCCESS: {\n invitation.state = Invitation.State.SUCCESS;\n next(invitation);\n break;\n }\n case Invitation.State.CANCELLED: {\n assert(invitationId);\n invitation.invitationId = invitationId;\n invitation.state = Invitation.State.CANCELLED;\n next(invitation);\n break;\n }\n case Invitation.State.TIMEOUT: {\n assert(invitationId);\n invitation.invitationId = invitationId;\n invitation.state = Invitation.State.TIMEOUT;\n next(invitation);\n break;\n }\n }\n },\n (err: Error) => {\n close(err);\n },\n () => {\n close();\n }\n );\n\n return (err?: Error) => {\n const context = this.getLoggingContext();\n if (err) {\n log.warn('stream closed', { ...context, err });\n } else {\n log('stream closed', context);\n }\n\n this._acceptInvitations.delete(invitation.invitationId!);\n };\n });\n }\n\n async authenticate({ invitationId, authCode }: AuthenticationRequest): Promise<void> {\n log('authenticating...');\n assert(invitationId);\n const observable = this._acceptInvitations.get(invitationId);\n if (!observable) {\n log.warn('invalid invitation', { invitationId });\n } else {\n await observable.authenticate(authCode);\n }\n }\n\n async cancelInvitation({ invitationId }: { invitationId: string }): Promise<void> {\n log('cancelling...');\n assert(invitationId);\n const observable = this._createInvitations.get(invitationId) ?? this._acceptInvitations.get(invitationId);\n if (!observable) {\n log.warn('invalid invitation', { invitationId });\n } else {\n await observable?.cancel();\n }\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { createAdmissionCredentials, getCredentialAssertion } from '@dxos/credentials';\nimport { SigningContext } from '@dxos/echo-pipeline';\nimport { writeMessages } from '@dxos/feed-store';\nimport { Keyring } from '@dxos/keyring';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { Invitation } from '@dxos/protocols/proto/dxos/client/services';\nimport { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { AdmissionRequest, AdmissionResponse, IntroductionRequest } from '@dxos/protocols/proto/dxos/halo/invitations';\n\nimport { DataSpaceManager } from '../spaces';\nimport { InvitationProtocol } from './invitation-protocol';\n\nexport class SpaceInvitationProtocol implements InvitationProtocol {\n constructor(\n private readonly _spaceManager: DataSpaceManager,\n private readonly _signingContext: SigningContext,\n private readonly _keyring: Keyring,\n private readonly _spaceKey?: PublicKey\n ) {}\n\n toJSON(): object {\n return {\n deviceKey: this._signingContext.deviceKey,\n spaceKey: this._spaceKey\n };\n }\n\n getInvitationContext(): Partial<Invitation> & Pick<Invitation, 'kind'> {\n return {\n kind: Invitation.Kind.SPACE,\n spaceKey: this._spaceKey\n };\n }\n\n async admit(request: AdmissionRequest, guestProfile?: ProfileDocument | undefined): Promise<AdmissionResponse> {\n assert(this._spaceKey);\n const space = await this._spaceManager.spaces.get(this._spaceKey);\n assert(space);\n\n assert(request.space);\n const { identityKey, deviceKey } = request.space;\n\n log('writing guest credentials', { host: this._signingContext.deviceKey, guest: deviceKey });\n // TODO(burdon): Check if already admitted.\n const credentials: FeedMessage.Payload[] = await createAdmissionCredentials(\n this._signingContext.credentialSigner,\n identityKey,\n space.key,\n space.inner.genesisFeedKey,\n guestProfile\n );\n\n // TODO(dmaretskyi): Refactor.\n assert(credentials[0].credential);\n const spaceMemberCredential = credentials[0].credential.credential;\n assert(getCredentialAssertion(spaceMemberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember');\n\n await writeMessages(space.inner.controlPipeline.writer, credentials);\n\n return {\n space: {\n credential: spaceMemberCredential,\n controlTimeframe: space.inner.controlPipeline.state.timeframe,\n dataTimeframe: space.dataPipeline.pipelineState?.timeframe\n }\n };\n }\n\n createIntroduction(): IntroductionRequest {\n return {\n profile: this._signingContext.profile\n };\n }\n\n async createAdmissionRequest(): Promise<AdmissionRequest> {\n // Generate a pair of keys for our feeds.\n const controlFeedKey = await this._keyring.createKey();\n const dataFeedKey = await this._keyring.createKey();\n\n return {\n space: {\n identityKey: this._signingContext.identityKey,\n deviceKey: this._signingContext.deviceKey,\n controlFeedKey,\n dataFeedKey\n }\n };\n }\n\n async accept(response: AdmissionResponse): Promise<Partial<Invitation>> {\n assert(response.space);\n const { credential, controlTimeframe, dataTimeframe } = response.space;\n const assertion = getCredentialAssertion(credential);\n assert(assertion['@type'] === 'dxos.halo.credentials.SpaceMember', 'Invalid credential');\n assert(credential.subject.id.equals(this._signingContext.identityKey));\n\n // Create local space.\n await this._spaceManager.acceptSpace({\n spaceKey: assertion.spaceKey,\n genesisFeedKey: assertion.genesisFeedKey,\n controlTimeframe,\n dataTimeframe\n });\n\n await this._signingContext.recordCredential(credential);\n\n return { spaceKey: assertion.spaceKey };\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { NetworkManager } from '@dxos/network-manager';\nimport { NetworkService, NetworkStatus, SetNetworkOptionsRequest } from '@dxos/protocols/proto/dxos/client/services';\n\nexport class NetworkServiceImpl implements NetworkService {\n constructor(private readonly networkManager: NetworkManager) {}\n\n subscribeToNetworkStatus() {\n return new Stream<NetworkStatus>(({ next }) => {\n const unsubscribe = this.networkManager.connectionStateChanged.on((state) => next({ state }));\n next({ state: this.networkManager.connectionState });\n\n return unsubscribe;\n });\n }\n\n async setNetworkOptions(request: SetNetworkOptionsRequest) {\n await this.networkManager.setConnectionState(request.state);\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event, synchronized, trackLeaks } from '@dxos/async';\nimport { SpaceState } from '@dxos/client';\nimport { cancelWithContext, Context } from '@dxos/context';\nimport { getCredentialAssertion } from '@dxos/credentials';\nimport {\n DataServiceSubscriptions,\n MetadataStore,\n SigningContext,\n SnapshotManager,\n SnapshotStore,\n Space,\n spaceGenesis,\n SpaceManager\n} from '@dxos/echo-pipeline';\nimport { FeedStore } from '@dxos/feed-store';\nimport { Keyring } from '@dxos/keyring';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ModelFactory } from '@dxos/model-factory';\nimport { trace } from '@dxos/protocols';\nimport { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { SpaceMetadata } from '@dxos/protocols/proto/dxos/echo/metadata';\nimport { Gossip, Presence } from '@dxos/teleport-extension-gossip';\nimport { Timeframe } from '@dxos/timeframe';\nimport { ComplexMap, deferFunction } from '@dxos/util';\n\nimport { createAuthProvider } from '../identity';\nimport { DataSpace } from './data-space';\n\nexport type AcceptSpaceOptions = {\n spaceKey: PublicKey;\n genesisFeedKey: PublicKey;\n\n /**\n * Latest known timeframe for the control pipeline.\n * We will try to catch up to this timeframe before starting the data pipeline.\n */\n controlTimeframe?: Timeframe;\n\n /**\n * Latest known timeframe for the data pipeline.\n * We will try to catch up to this timeframe before initializing the database.\n */\n dataTimeframe?: Timeframe;\n};\n\n@trackLeaks('open', 'close')\nexport class DataSpaceManager {\n private readonly _ctx = new Context();\n\n public readonly updated = new Event();\n\n private readonly _spaces = new ComplexMap<PublicKey, DataSpace>(PublicKey.hash);\n\n private _isOpen = false;\n private readonly _instanceId = PublicKey.random().toHex();\n public _traceParent?: string;\n\n constructor(\n private readonly _spaceManager: SpaceManager,\n private readonly _metadataStore: MetadataStore,\n private readonly _dataServiceSubscriptions: DataServiceSubscriptions,\n private readonly _keyring: Keyring,\n private readonly _signingContext: SigningContext,\n private readonly _modelFactory: ModelFactory,\n private readonly _feedStore: FeedStore<FeedMessage>,\n private readonly _snapshotStore: SnapshotStore\n ) {}\n\n // TODO(burdon): Remove.\n get spaces() {\n return this._spaces;\n }\n\n @synchronized\n async open() {\n log('open');\n log.trace('dxos.echo.data-space-manager', trace.begin({ id: this._instanceId, parentId: this._traceParent }));\n await this._metadataStore.load();\n log('metadata loaded', { spaces: this._metadataStore.spaces.length });\n\n for (const spaceMetadata of this._metadataStore.spaces) {\n log('load space', { spaceMetadata });\n const space = await this._constructSpace(spaceMetadata);\n space.initializeDataPipelineAsync();\n }\n\n this._isOpen = true;\n this.updated.emit();\n }\n\n @synchronized\n async close() {\n log('close');\n this._isOpen = false;\n await this._ctx.dispose();\n for (const space of this._spaces.values()) {\n await space.close();\n }\n log.trace('dxos.echo.data-space-manager', trace.end({ id: this._instanceId }));\n }\n\n /**\n * Creates a new space writing the genesis credentials to the control feed.\n */\n @synchronized\n async createSpace() {\n assert(this._isOpen, 'Not open.');\n const spaceKey = await this._keyring.createKey();\n const controlFeedKey = await this._keyring.createKey();\n const dataFeedKey = await this._keyring.createKey();\n const metadata: SpaceMetadata = {\n key: spaceKey,\n genesisFeedKey: controlFeedKey,\n controlFeedKey,\n dataFeedKey\n };\n\n log('creating space...', { spaceKey });\n const space = await this._constructSpace(metadata);\n\n const credentials = await spaceGenesis(this._keyring, this._signingContext, space.inner);\n await this._metadataStore.addSpace(metadata);\n\n const memberCredential = credentials[1];\n assert(getCredentialAssertion(memberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember');\n await this._signingContext.recordCredential(memberCredential);\n\n await space.initializeDataPipeline();\n\n this.updated.emit();\n return space;\n }\n\n // TODO(burdon): Rename join space.\n @synchronized\n async acceptSpace(opts: AcceptSpaceOptions): Promise<DataSpace> {\n log('accept space', { opts });\n assert(this._isOpen, 'Not open.');\n assert(!this._spaces.has(opts.spaceKey), 'Space already exists.');\n\n const metadata: SpaceMetadata = {\n key: opts.spaceKey,\n genesisFeedKey: opts.genesisFeedKey,\n controlTimeframe: opts.controlTimeframe,\n dataTimeframe: opts.dataTimeframe\n };\n\n const space = await this._constructSpace(metadata);\n await this._metadataStore.addSpace(metadata);\n\n space.initializeDataPipelineAsync();\n\n this.updated.emit();\n return space;\n }\n\n /**\n * Wait until the space data pipeline is fully initialized.\n * Used by invitation handler.\n * TODO(dmaretskyi): Consider removing.\n */\n async waitUntilSpaceReady(spaceKey: PublicKey) {\n await cancelWithContext(\n this._ctx,\n this.updated.waitForCondition(() => {\n const space = this._spaces.get(spaceKey);\n return !!space && space.state === SpaceState.READY;\n })\n );\n }\n\n private async _constructSpace(metadata: SpaceMetadata) {\n log('construct space', { metadata });\n const gossip = new Gossip({\n localPeerId: this._signingContext.deviceKey\n });\n const presence = new Presence({\n announceInterval: 500,\n offlineTimeout: 5_000, // TODO(burdon): Config.\n identityKey: this._signingContext.identityKey,\n gossip\n });\n const snapshotManager = new SnapshotManager(this._snapshotStore);\n\n const controlFeed =\n metadata.controlFeedKey && (await this._feedStore.openFeed(metadata.controlFeedKey, { writable: true }));\n const dataFeed = metadata.dataFeedKey && (await this._feedStore.openFeed(metadata.dataFeedKey, { writable: true }));\n\n const space: Space = await this._spaceManager.constructSpace({\n metadata,\n swarmIdentity: {\n peerKey: this._signingContext.deviceKey,\n credentialProvider: createAuthProvider(this._signingContext.credentialSigner),\n credentialAuthenticator: deferFunction(() => dataSpace.authVerifier.verifier)\n },\n onNetworkConnection: (session) => {\n session.addExtension(\n 'dxos.mesh.teleport.gossip',\n gossip.createExtension({ remotePeerId: session.remotePeerId })\n );\n session.addExtension('dxos.mesh.teleport.objectsync', snapshotManager.objectSync.createExtension());\n session.addExtension('dxos.mesh.teleport.notarization', dataSpace.notarizationPlugin.createExtension());\n }\n });\n controlFeed && space.setControlFeed(controlFeed);\n dataFeed && space.setDataFeed(dataFeed);\n\n const dataSpace = new DataSpace({\n inner: space,\n modelFactory: this._modelFactory,\n metadataStore: this._metadataStore,\n snapshotManager,\n gossip,\n presence,\n memberKey: this._signingContext.identityKey,\n keyring: this._keyring,\n feedStore: this._feedStore,\n signingContext: this._signingContext,\n snapshotId: metadata.snapshot,\n callbacks: {\n beforeReady: async () => {\n log('before space ready', { space: space.key });\n this._dataServiceSubscriptions.registerSpace(\n space.key,\n dataSpace.dataPipeline.databaseBackend!.createDataServiceHost()\n );\n },\n afterReady: async () => {\n log('after space ready', { space: space.key, open: this._isOpen });\n if (this._isOpen) {\n this.updated.emit();\n }\n }\n }\n });\n\n await dataSpace.open();\n\n if (metadata.controlTimeframe) {\n dataSpace.inner.controlPipeline.state.setTargetTimeframe(metadata.controlTimeframe);\n }\n if (metadata.dataTimeframe) {\n dataSpace.dataPipeline.setTargetTimeframe(metadata.dataTimeframe);\n }\n\n this._spaces.set(metadata.key, dataSpace);\n return dataSpace;\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Event, scheduleTask, trackLeaks } from '@dxos/async';\nimport { SpaceState } from '@dxos/client';\nimport { Context } from '@dxos/context';\nimport { CredentialConsumer } from '@dxos/credentials';\nimport { timed } from '@dxos/debug';\nimport {\n MetadataStore,\n Space,\n SigningContext,\n createMappedFeedWriter,\n SnapshotManager,\n DataPipeline\n} from '@dxos/echo-pipeline';\nimport { CancelledError, SystemError } from '@dxos/errors';\nimport { FeedStore } from '@dxos/feed-store';\nimport { Keyring } from '@dxos/keyring';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ModelFactory } from '@dxos/model-factory';\nimport { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { AdmittedFeed, Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { GossipMessage } from '@dxos/protocols/proto/dxos/mesh/teleport/gossip';\nimport { Gossip, Presence } from '@dxos/teleport-extension-gossip';\nimport { ComplexSet } from '@dxos/util';\n\nimport { TrustedKeySetAuthVerifier } from '../identity';\nimport { NotarizationPlugin } from './notarization-plugin';\n\nconst AUTH_TIMEOUT = 30000;\n\nexport type DataSpaceCallbacks = {\n /**\n * Called before transitioning to the ready state.\n */\n beforeReady?: () => Promise<void>;\n\n /**\n * Called after transitioning to the ready state.\n */\n afterReady?: () => Promise<void>;\n};\n\nexport type DataSpaceParams = {\n inner: Space;\n modelFactory: ModelFactory;\n metadataStore: MetadataStore;\n snapshotManager: SnapshotManager;\n gossip: Gossip;\n presence: Presence;\n keyring: Keyring;\n feedStore: FeedStore<FeedMessage>;\n signingContext: SigningContext;\n memberKey: PublicKey;\n snapshotId?: string | undefined;\n callbacks?: DataSpaceCallbacks;\n};\n\n@trackLeaks('open', 'close')\nexport class DataSpace {\n private readonly _ctx = new Context();\n private readonly _dataPipeline: DataPipeline;\n private readonly _inner: Space;\n private readonly _gossip: Gossip;\n private readonly _presence: Presence;\n private readonly _keyring: Keyring;\n private readonly _feedStore: FeedStore<FeedMessage>;\n private readonly _metadataStore: MetadataStore;\n private readonly _signingContext: SigningContext;\n private readonly _notarizationPluginConsumer: CredentialConsumer<NotarizationPlugin>;\n private readonly _callbacks: DataSpaceCallbacks;\n\n private _state = SpaceState.CLOSED;\n\n public readonly authVerifier: TrustedKeySetAuthVerifier;\n public readonly stateUpdate = new Event();\n\n constructor(params: DataSpaceParams) {\n this._inner = params.inner;\n this._inner.stateUpdate.on(this._ctx, () => this.stateUpdate.emit());\n\n this._gossip = params.gossip;\n this._presence = params.presence;\n this._keyring = params.keyring;\n this._feedStore = params.feedStore;\n this._metadataStore = params.metadataStore;\n this._signingContext = params.signingContext;\n this._callbacks = params.callbacks ?? {};\n this._dataPipeline = new DataPipeline({\n modelFactory: params.modelFactory,\n metadataStore: params.metadataStore,\n snapshotManager: params.snapshotManager,\n memberKey: params.memberKey,\n spaceKey: this._inner.key,\n feedInfoProvider: (feedKey) => this._inner.spaceState.feeds.get(feedKey),\n snapshotId: params.snapshotId\n });\n\n this.authVerifier = new TrustedKeySetAuthVerifier({\n trustedKeysProvider: () => new ComplexSet(PublicKey.hash, Array.from(this._inner.spaceState.members.keys())),\n update: this._inner.stateUpdate,\n authTimeout: AUTH_TIMEOUT\n });\n\n this._notarizationPluginConsumer = this._inner.spaceState.registerProcessor(new NotarizationPlugin());\n }\n\n get key() {\n return this._inner.key;\n }\n\n get isOpen() {\n return this._inner.isOpen;\n }\n\n get state(): SpaceState {\n return this._state;\n }\n\n // TODO(burdon): Can we mark this for debugging only?\n get inner() {\n return this._inner;\n }\n\n get dataPipeline(): DataPipeline {\n return this._dataPipeline;\n }\n\n get presence() {\n return this._presence;\n }\n\n get notarizationPlugin() {\n return this._notarizationPluginConsumer.processor;\n }\n\n async open() {\n await this.notarizationPlugin.open();\n await this._notarizationPluginConsumer.open();\n await this._inner.open();\n this._state = SpaceState.INACTIVE;\n }\n\n async close() {\n this._state = SpaceState.CLOSED;\n await this._ctx.dispose();\n\n await this._dataPipeline.close();\n await this.authVerifier.close();\n\n await this._inner.close();\n await this._notarizationPluginConsumer.close();\n await this.notarizationPlugin.close();\n\n await this._presence.destroy();\n }\n\n async postMessage(channel: string, message: any) {\n return this._gossip.postMessage(channel, message);\n }\n\n listen(channel: string, callback: (message: GossipMessage) => void) {\n return this._gossip.listen(channel, callback);\n }\n\n /**\n * Initialize the data pipeline in a separate task.\n */\n initializeDataPipelineAsync() {\n scheduleTask(this._ctx, async () => {\n try {\n await this.initializeDataPipeline();\n } catch (err) {\n if (err instanceof CancelledError) {\n log('Data pipeline initialization cancelled', err);\n return;\n }\n\n log.error('Error initializing data pipeline', err);\n }\n });\n }\n\n async initializeDataPipeline() {\n if (this._state !== SpaceState.INACTIVE) {\n throw new SystemError('Invalid operation');\n }\n this._state = SpaceState.INITIALIZING;\n\n // TODO(dmaretskyi): Cancel with context.\n await this._inner.controlPipeline.state.waitUntilReachedTargetTimeframe({\n ctx: this._ctx,\n breakOnStall: false\n });\n\n await this._createWritableFeeds();\n log('Writable feeds created');\n this.stateUpdate.emit();\n\n this.notarizationPlugin.setWriter(\n createMappedFeedWriter<Credential, FeedMessage.Payload>(\n (credential) => ({\n credential: { credential }\n }),\n this._inner.controlPipeline.writer\n )\n );\n\n await this._dataPipeline.open({\n openPipeline: async (start) => {\n const pipeline = await this._inner.createDataPipeline({ start });\n await pipeline.start();\n return pipeline;\n }\n });\n\n log('waiting for data pipeline to reach target timeframe');\n // Wait for the data pipeline to catch up to its desired timeframe.\n await this._dataPipeline.pipelineState!.waitUntilReachedTargetTimeframe({\n ctx: this._ctx,\n breakOnStall: false\n });\n\n log('data pipeline ready');\n await this._callbacks.beforeReady?.();\n\n this._state = SpaceState.READY;\n this.stateUpdate.emit();\n\n await this._callbacks.afterReady?.();\n }\n\n @timed(10_000)\n private async _createWritableFeeds() {\n const credentials: Credential[] = [];\n if (!this.inner.controlFeedKey) {\n const controlFeed = await this._feedStore.openFeed(await this._keyring.createKey(), { writable: true });\n this.inner.setControlFeed(controlFeed);\n\n credentials.push(\n await this._signingContext.credentialSigner.createCredential({\n subject: controlFeed.key,\n assertion: {\n '@type': 'dxos.halo.credentials.AdmittedFeed',\n spaceKey: this.key,\n deviceKey: this._signingContext.deviceKey,\n identityKey: this._signingContext.identityKey,\n designation: AdmittedFeed.Designation.CONTROL\n }\n })\n );\n }\n if (!this.inner.dataFeedKey) {\n const dataFeed = await this._feedStore.openFeed(await this._keyring.createKey(), { writable: true });\n this.inner.setDataFeed(dataFeed);\n\n credentials.push(\n await this._signingContext.credentialSigner.createCredential({\n subject: dataFeed.key,\n assertion: {\n '@type': 'dxos.halo.credentials.AdmittedFeed',\n spaceKey: this.key,\n deviceKey: this._signingContext.deviceKey,\n identityKey: this._signingContext.identityKey,\n designation: AdmittedFeed.Designation.DATA\n }\n })\n );\n }\n\n if (credentials.length > 0) {\n // Never times out\n await this.notarizationPlugin.notarize({ ctx: this._ctx, credentials, timeout: 0 });\n }\n\n // Set this after credentials are notarized so that on failure we will retry.\n await this._metadataStore.setWritableFeedKeys(this.key, this.inner.controlFeedKey!, this.inner.dataFeedKey!);\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { DeferredTask, Event, scheduleTask, sleep, TimeoutError, Trigger } from '@dxos/async';\nimport { Context, rejectOnDispose } from '@dxos/context';\nimport { CredentialProcessor } from '@dxos/credentials';\nimport { FeedWriter } from '@dxos/feed-store';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { schema } from '@dxos/protocols';\nimport { Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { NotarizationService, NotarizeRequest } from '@dxos/protocols/proto/dxos/mesh/teleport/notarization';\nimport { ExtensionContext, RpcExtension } from '@dxos/teleport';\nimport { ComplexMap, ComplexSet, entry } from '@dxos/util';\n\nconst DEFAULT_RETRY_TIMEOUT = 1_000;\n\nconst DEFAULT_SUCCESS_DELAY = 1_000;\n\nconst DEFAULT_NOTARIZE_TIMEOUT = 10_000;\n\nexport type NotarizeParams = {\n /**\n * For cancellation.\n */\n ctx?: Context;\n\n /**\n * Credentials to notarize.\n */\n credentials: Credential[];\n\n /**\n * Timeout for the whole notarization process.\n * Set to 0 to disable.\n * @default {@link DEFAULT_NOTARIZE_TIMEOUT}\n */\n timeout?: number;\n\n /**\n * Retry timeout.\n * @default {@link DEFAULT_RETRY_TIMEOUT}\n */\n retryTimeout?: number;\n\n /**\n * Minimum wait time after a peer confirms successful notarization before attempting with a new peer.\n * This is to avoid spamming peers with notarization requests.\n * @default {@link DEFAULT_SUCCESS_DELAY}\n */\n successDelay?: number;\n};\n\n/**\n * See NotarizationService proto.\n */\nexport class NotarizationPlugin implements CredentialProcessor {\n private readonly _ctx = new Context();\n private readonly _extensionOpened = new Event();\n\n private _writer: FeedWriter<Credential> | undefined;\n private readonly _extensions = new Set<NotarizationTeleportExtension>();\n private readonly _processedCredentials = new ComplexSet<PublicKey>(PublicKey.hash);\n private readonly _processCredentialsTriggers = new ComplexMap<PublicKey, Trigger>(PublicKey.hash);\n\n async open() {}\n\n async close() {\n await this._ctx.dispose();\n }\n\n /**\n * Request credentials to be notarized.\n */\n async notarize({\n ctx: opCtx,\n credentials,\n timeout = DEFAULT_NOTARIZE_TIMEOUT,\n retryTimeout = DEFAULT_RETRY_TIMEOUT,\n successDelay = DEFAULT_SUCCESS_DELAY\n }: NotarizeParams) {\n log('notarize', { credentials });\n assert(\n credentials.every((credential) => credential.id),\n 'Credentials must have an id'\n );\n\n const errors = new Trigger();\n const ctx = this._ctx.derive({\n onError: (err) => {\n log.warn('Notarization error', { err });\n void ctx.dispose();\n errors.throw(err);\n }\n });\n opCtx?.onDispose(() => ctx.dispose());\n\n // Timeout/\n if (timeout !== 0) {\n scheduleTask(\n ctx,\n () => {\n log.warn('Notarization timeout', {\n timeout,\n peers: Array.from(this._extensions).map((extension) => extension.remotePeerId)\n });\n void ctx.dispose();\n errors.throw(new TimeoutError(timeout, 'Notarization timed out'));\n },\n timeout\n );\n }\n\n const allNotarized = Promise.all(credentials.map((credential) => this._waitUntilProcessed(credential.id!)));\n\n const peersTried = new Set<NotarizationTeleportExtension>();\n\n // Repeatable task that tries to notarize credentials with one of the available peers.\n const notarizeTask = new DeferredTask(ctx, async () => {\n try {\n if (this._extensions.size === 0) {\n return; // No peers to try.\n }\n\n // Pick a peer that we haven't tried yet.\n const peer = [...this._extensions].find((peer) => !peersTried.has(peer));\n if (!peer) {\n log.warn('Exhausted all peers to notarize with', { retryIn: retryTimeout });\n peersTried.clear();\n scheduleTask(ctx, () => notarizeTask.schedule(), retryTimeout); // retry with all peers again\n return;\n }\n\n peersTried.add(peer);\n log('try notarizing', { peer: peer.localPeerId, credentialId: credentials.map((credential) => credential.id) });\n await peer.rpc.NotarizationService.notarize({\n credentials: credentials.filter((credential) => !this._processedCredentials.has(credential.id!))\n });\n log('success');\n await sleep(successDelay); // wait before trying with a new peer\n } catch (err) {\n log.warn('error notarizing (recoverable)', err);\n notarizeTask.schedule(); // retry immediately with next peer\n }\n });\n\n notarizeTask.schedule();\n this._extensionOpened.on(ctx, () => notarizeTask.schedule());\n\n try {\n await Promise.race([rejectOnDispose(ctx), allNotarized, errors.wait()]);\n log('done');\n } finally {\n await ctx.dispose();\n }\n }\n\n /**\n * Called with credentials arriving from the control pipeline.\n */\n async process(credential: Credential) {\n if (!credential.id) {\n return;\n }\n this._processCredentialsTriggers.get(credential.id)?.wake();\n this._processedCredentials.add(credential.id);\n this._processCredentialsTriggers.delete(credential.id);\n }\n\n setWriter(writer: FeedWriter<Credential>) {\n assert(!this._writer, 'Writer already set.');\n this._writer = writer;\n }\n\n private async _waitUntilProcessed(id: PublicKey) {\n if (this._processedCredentials.has(id)) {\n return;\n }\n await entry(this._processCredentialsTriggers, id).orInsert(new Trigger()).value.wait();\n }\n\n /**\n * Requests from other peers to notarize credentials.\n */\n private async _onNotarize(request: NotarizeRequest) {\n if (!this._writer) {\n throw new Error('Writer not set');\n }\n for (const credential of request.credentials ?? []) {\n assert(credential.id, 'Credential must have an id');\n if (this._processedCredentials.has(credential.id)) {\n continue;\n }\n await this._writer.write(credential);\n }\n }\n\n createExtension() {\n const extension = new NotarizationTeleportExtension({\n onOpen: async () => {\n log('extension opened', { peer: extension.localPeerId });\n this._extensions.add(extension);\n this._extensionOpened.emit();\n },\n onClose: async () => {\n log('extension closed', { peer: extension.localPeerId });\n this._extensions.delete(extension);\n },\n onNotarize: this._onNotarize.bind(this)\n });\n return extension;\n }\n}\n\nexport type NotarizationTeleportExtensionParams = {\n onOpen: () => Promise<void>;\n onClose: () => Promise<void>;\n onNotarize: (request: NotarizeRequest) => Promise<void>;\n};\n\nexport class NotarizationTeleportExtension extends RpcExtension<Services, Services> {\n constructor(private readonly _params: NotarizationTeleportExtensionParams) {\n super({\n requested: {\n NotarizationService: schema.getService('dxos.mesh.teleport.notarization.NotarizationService')\n },\n exposed: {\n NotarizationService: schema.getService('dxos.mesh.teleport.notarization.NotarizationService')\n }\n });\n }\n\n protected async getHandlers(): Promise<Services> {\n return {\n NotarizationService: {\n notarize: async (request) => {\n await this._params.onNotarize(request);\n }\n }\n };\n }\n\n override async onOpen(ctx: ExtensionContext) {\n await super.onOpen(ctx);\n await this._params.onOpen();\n }\n\n override async onClose(err?: Error | undefined) {\n await this._params.onClose();\n await super.onClose(err);\n }\n}\n\ntype Services = {\n NotarizationService: NotarizationService;\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { EventSubscriptions, scheduleTask } from '@dxos/async';\nimport { Stream } from '@dxos/codec-protobuf';\nimport { raise, todo } from '@dxos/debug';\nimport { DataServiceSubscriptions, SpaceManager, SpaceNotFoundError } from '@dxos/echo-pipeline';\nimport { log } from '@dxos/log';\nimport {\n PostMessageRequest,\n QueryCredentialsRequest,\n QuerySpacesResponse,\n Space,\n SpaceMember,\n SpacesService,\n SubscribeMessagesRequest,\n UpdateSpaceRequest,\n WriteCredentialsRequest\n} from '@dxos/protocols/proto/dxos/client/services';\nimport { Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { GossipMessage } from '@dxos/protocols/proto/dxos/mesh/teleport/gossip';\nimport { humanize, Provider } from '@dxos/util';\n\nimport { IdentityManager } from '../identity';\nimport { DataSpace } from './data-space';\nimport { DataSpaceManager } from './data-space-manager';\n\nconst TIMEFRAME_UPDATE_DEBOUNCE_TIME = 500;\n\n/**\n *\n */\nexport class SpacesServiceImpl implements SpacesService {\n constructor(\n private readonly _identityManager: IdentityManager,\n private readonly _spaceManager: SpaceManager,\n private readonly _dataServiceSubscriptions: DataServiceSubscriptions,\n private readonly _getDataSpaceManager: Provider<Promise<DataSpaceManager>>\n ) {}\n\n async createSpace(): Promise<Space> {\n if (!this._identityManager.identity) {\n throw new Error('This device has no HALO identity available. See https://docs.dxos.org/guide/halo');\n }\n const dataSpaceManager = await this._getDataSpaceManager();\n const space = await dataSpaceManager.createSpace();\n return this._transformSpace(space);\n }\n\n async updateSpace(request: UpdateSpaceRequest) {\n todo();\n }\n\n querySpaces(): Stream<QuerySpacesResponse> {\n return new Stream<QuerySpacesResponse>(({ next, ctx }) => {\n const onUpdate = async () => {\n const dataSpaceManager = await this._getDataSpaceManager();\n const spaces = Array.from(dataSpaceManager.spaces.values()).map((space) => this._transformSpace(space));\n log('update', { spaces });\n next({ spaces });\n };\n\n scheduleTask(ctx, async () => {\n const dataSpaceManager = await this._getDataSpaceManager();\n\n const subscriptions = new EventSubscriptions();\n ctx.onDispose(() => subscriptions.clear());\n\n // TODO(dmaretskyi): Create a pattern for subscribing to a set of objects.\n const subscribeSpaces = () => {\n subscriptions.clear();\n\n for (const space of dataSpaceManager.spaces.values()) {\n subscriptions.add(space.stateUpdate.on(ctx, onUpdate));\n subscriptions.add(space.presence.updated.on(ctx, onUpdate));\n\n // Pipeline progress.\n space.inner.controlPipeline.state.timeframeUpdate\n .debounce(TIMEFRAME_UPDATE_DEBOUNCE_TIME)\n .on(ctx, onUpdate);\n if (space.dataPipeline.pipelineState) {\n subscriptions.add(\n space.dataPipeline.pipelineState.timeframeUpdate\n .debounce(TIMEFRAME_UPDATE_DEBOUNCE_TIME)\n .on(ctx, onUpdate)\n );\n }\n }\n };\n\n dataSpaceManager.updated.on(ctx, () => {\n subscribeSpaces();\n void onUpdate();\n });\n subscribeSpaces();\n\n void onUpdate();\n });\n\n if (!this._identityManager.identity) {\n next({ spaces: [] });\n }\n });\n }\n\n async postMessage({ spaceKey, channel, message }: PostMessageRequest) {\n const dataSpaceManager = await this._getDataSpaceManager();\n const space = dataSpaceManager.spaces.get(spaceKey) ?? raise(new SpaceNotFoundError(spaceKey));\n await space.postMessage(getChannelId(channel), message);\n }\n\n subscribeMessages({ spaceKey, channel }: SubscribeMessagesRequest) {\n return new Stream<GossipMessage>(({ ctx, next }) => {\n scheduleTask(ctx, async () => {\n const dataSpaceManager = await this._getDataSpaceManager();\n const space = dataSpaceManager.spaces.get(spaceKey) ?? raise(new SpaceNotFoundError(spaceKey));\n const handle = space.listen(getChannelId(channel), (message) => {\n next(message);\n });\n ctx.onDispose(() => handle.unsubscribe());\n });\n });\n }\n\n queryCredentials({ spaceKey }: QueryCredentialsRequest): Stream<Credential> {\n return new Stream(({ ctx, next }) => {\n const space = this._spaceManager.spaces.get(spaceKey) ?? raise(new SpaceNotFoundError(spaceKey));\n\n const processor = space.spaceState.registerProcessor({\n process: async (credential) => {\n next(credential);\n }\n });\n ctx.onDispose(() => processor.close());\n scheduleTask(ctx, () => processor.open());\n });\n }\n\n async writeCredentials({ spaceKey, credentials }: WriteCredentialsRequest) {\n const space = this._spaceManager.spaces.get(spaceKey) ?? raise(new SpaceNotFoundError(spaceKey));\n for (const credential of credentials ?? []) {\n await space.controlPipeline.writer.write({ credential: { credential } });\n }\n }\n\n private _transformSpace(space: DataSpace): Space {\n return {\n spaceKey: space.key,\n state: space.state,\n pipeline: {\n controlFeeds: space.inner.controlPipeline.state.feeds.map((feed) => feed.key),\n currentControlTimeframe: space.inner.controlPipeline.state.timeframe,\n targetControlTimeframe: space.inner.controlPipeline.state.targetTimeframe,\n totalControlTimeframe: space.inner.controlPipeline.state.endTimeframe,\n\n dataFeeds: space.dataPipeline.pipelineState?.feeds.map((feed) => feed.key) ?? [],\n currentDataTimeframe: space.dataPipeline.pipelineState?.timeframe,\n targetDataTimeframe: space.dataPipeline.pipelineState?.targetTimeframe,\n totalDataTimeframe: space.dataPipeline.pipelineState?.endTimeframe\n },\n members: Array.from(space.inner.spaceState.members.values()).map((member) => ({\n identity: {\n identityKey: member.key,\n profile: {\n displayName: member.assertion.profile?.displayName ?? humanize(member.key)\n }\n },\n presence:\n this._identityManager.identity?.identityKey.equals(member.key) ||\n space.presence.getPeersOnline().filter(({ identityKey }) => identityKey.equals(member.key)).length > 0\n ? SpaceMember.PresenceState.ONLINE\n : SpaceMember.PresenceState.OFFLINE\n }))\n };\n }\n}\n\n// Add `user-channel` prefix to the channel name, so that it doesn't collide with the internal channels.\nconst getChannelId = (channel: string): string => `user-channel/${channel}`;\n", "//\n\n//\n// Copyright 2023 DXOS.org\n//\n\nimport { InvalidConfigError } from '@dxos/errors';\nimport { Runtime } from '@dxos/protocols/proto/dxos/config';\nimport { createStorage, StorageType } from '@dxos/random-access-storage';\n\nimport StorageDriver = Runtime.Client.Storage.StorageDriver;\n\n// TODO(burdon): Factor out.\nexport const createStorageObjects = (config: Runtime.Client.Storage) => {\n const {\n path = 'dxos/storage', // TODO(burdon): Factor out const.\n storageType,\n keyStorage,\n persistent = false\n } = config ?? {};\n\n if (persistent && storageType === StorageDriver.RAM) {\n throw new InvalidConfigError('RAM storage cannot be used in persistent mode.');\n }\n if (!persistent && storageType !== undefined && storageType !== StorageDriver.RAM) {\n throw new InvalidConfigError('Cannot use a persistent storage in not persistent mode.');\n }\n if (persistent && keyStorage === StorageDriver.RAM) {\n throw new InvalidConfigError('RAM key storage cannot be used in persistent mode.');\n }\n if (!persistent && keyStorage !== StorageDriver.RAM && keyStorage !== undefined) {\n throw new InvalidConfigError('Cannot use a persistent key storage in not persistent mode.');\n }\n\n return {\n storage: createStorage({\n type: persistent ? toStorageType(storageType) : StorageType.RAM,\n root: `${path}/`\n })\n };\n};\n\nconst toStorageType = (type: StorageDriver | undefined): StorageType | undefined => {\n switch (type) {\n case undefined:\n return undefined;\n case StorageDriver.RAM:\n return StorageType.RAM;\n case StorageDriver.CHROME:\n return StorageType.CHROME;\n case StorageDriver.FIREFOX:\n return StorageType.FIREFOX;\n case StorageDriver.IDB:\n return StorageType.IDB;\n case StorageDriver.NODE:\n return StorageType.NODE;\n case StorageDriver.WEBFS:\n return StorageType.WEBFS;\n default:\n throw new Error(`Invalid storage type: ${StorageDriver[type]}`);\n }\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { Stream } from '@dxos/codec-protobuf';\nimport { Config } from '@dxos/config';\nimport {\n SystemStatus,\n SystemStatusResponse,\n SystemService,\n UpdateSystemStatusRequest\n} from '@dxos/protocols/proto/dxos/client/services';\nimport { MaybePromise } from '@dxos/util';\n\nexport type SystemServiceOptions = {\n config?: Config;\n statusUpdate: Event<void>;\n getCurrentStatus: () => SystemStatus;\n onUpdateStatus: (status: SystemStatus) => MaybePromise<void>;\n onReset: () => MaybePromise<void>;\n};\n\n/**\n *\n */\nexport class SystemServiceImpl implements SystemService {\n private readonly _config?: SystemServiceOptions['config'];\n private readonly _statusUpdate: SystemServiceOptions['statusUpdate'];\n private readonly _getCurrentStatus: SystemServiceOptions['getCurrentStatus'];\n private readonly _onUpdateStatus: SystemServiceOptions['onUpdateStatus'];\n private readonly _onReset: SystemServiceOptions['onReset'];\n\n constructor({ config, statusUpdate, onUpdateStatus, getCurrentStatus, onReset }: SystemServiceOptions) {\n this._config = config;\n this._statusUpdate = statusUpdate;\n this._getCurrentStatus = getCurrentStatus;\n this._onUpdateStatus = onUpdateStatus;\n this._onReset = onReset;\n }\n\n async getConfig() {\n return this._config?.values ?? {};\n }\n\n async updateStatus({ status }: UpdateSystemStatusRequest) {\n await this._onUpdateStatus(status);\n }\n\n queryStatus(): Stream<SystemStatusResponse> {\n return new Stream(({ next }) => {\n const update = () => {\n next({ status: this._getCurrentStatus() });\n };\n\n update();\n const unsubscribe = this._statusUpdate.on(() => update());\n const interval = setInterval(update, 3000);\n\n return () => {\n clearInterval(interval);\n unsubscribe();\n };\n });\n }\n\n async reset() {\n await this._onReset();\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport { Config } from '@dxos/config';\nimport { log, logInfo } from '@dxos/log';\nimport { MemorySignalManager, MemorySignalManagerContext, WebsocketSignalManager } from '@dxos/messaging';\nimport { createWebRTCTransportFactory, NetworkManager } from '@dxos/network-manager';\nimport { RpcPort } from '@dxos/rpc';\nimport { getAsyncValue, Provider } from '@dxos/util';\n\nimport { LocalClientServices } from '../services';\nimport { ClientRpcServer, ClientRpcServerParams } from '../services/client-rpc-server';\nimport { ShellRuntime, ShellRuntimeImpl } from './shell-runtime';\n\nconst LOCK_KEY = 'DXOS_RESOURCE_LOCK';\n\nexport type IFrameHostRuntimeParams = {\n configProvider: Config | Provider<Promise<Config>>;\n appPort: RpcPort;\n shellPort?: RpcPort;\n};\n\n/**\n * Runs the client services in the main thread.\n *\n * Holds a lock over the client services such that only one instance can run at a time.\n * This should only be used when SharedWorker is not available.\n */\nexport class IFrameHostRuntime {\n private readonly _configProvider: Config | Provider<Promise<Config>>;\n private readonly _transportFactory = createWebRTCTransportFactory();\n private readonly _ready = new Trigger<Error | undefined>();\n\n private readonly _appPort: RpcPort;\n private readonly _shellPort?: RpcPort;\n private _config!: Config;\n\n // TODO(dmaretskyi): Replace with host and figure out how to return services provider here.\n private _clientServices!: LocalClientServices;\n private _clientRpc!: ClientRpcServer;\n private _shellRuntime?: ShellRuntimeImpl;\n\n @logInfo\n public origin?: string;\n\n constructor({ configProvider, appPort, shellPort }: IFrameHostRuntimeParams) {\n this._configProvider = configProvider;\n this._appPort = appPort;\n this._shellPort = shellPort;\n\n if (this._shellPort) {\n this._shellRuntime = new ShellRuntimeImpl(this._shellPort);\n }\n }\n\n get services() {\n return this._clientServices;\n }\n\n get shell(): ShellRuntime | undefined {\n return this._shellRuntime;\n }\n\n async start() {\n log('starting...');\n try {\n this._config = await getAsyncValue(this._configProvider);\n const signalServer = this._config.get('runtime.services.signal.server');\n this._clientServices = new LocalClientServices({\n lockKey: LOCK_KEY,\n config: this._config,\n networkManager: new NetworkManager({\n log: true,\n signalManager: signalServer\n ? new WebsocketSignalManager([signalServer])\n : new MemorySignalManager(new MemorySignalManagerContext()), // TODO(dmaretskyi): Inject this context.\n transportFactory: this._transportFactory\n })\n });\n\n const middleware: Pick<ClientRpcServerParams, 'handleCall' | 'handleStream'> = {\n handleCall: async (method, params, handler) => {\n const error = await this._ready.wait({ timeout: 3_000 });\n if (error) {\n throw error;\n }\n\n return handler(method, params);\n },\n handleStream: async (method, params, handler) => {\n const error = await this._ready.wait({ timeout: 3_000 });\n if (error) {\n throw error;\n }\n\n return handler(method, params);\n }\n };\n\n this._clientRpc = new ClientRpcServer({\n serviceRegistry: this._clientServices.host.serviceRegistry,\n port: this._appPort,\n ...middleware\n });\n\n await Promise.all([this._clientServices.open(), this._clientRpc.open(), this._shellRuntime?.open()]);\n this._ready.wake(undefined);\n log('started');\n } catch (err: any) {\n this._ready.wake(err);\n log.catch(err);\n }\n }\n\n async stop() {\n log('stopping...');\n await this._clientRpc.close();\n await this._clientServices.close();\n await this._shellRuntime?.close();\n log('stopped');\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { ClientServices } from '@dxos/client';\nimport { Any, ServiceHandler, Stream } from '@dxos/codec-protobuf';\nimport { raise } from '@dxos/debug';\nimport { parseMethodName, RpcPeer, RpcPeerOptions } from '@dxos/rpc';\nimport { MaybePromise } from '@dxos/util';\n\nimport { ServiceRegistry } from './service-registry';\n\nexport type ClientRpcServerParams = {\n serviceRegistry: ServiceRegistry<ClientServices>;\n handleCall?: (\n method: string,\n params: Any,\n handler: (method: string, params: Any) => MaybePromise<Any>\n ) => Promise<Any>;\n handleStream?: (\n method: string,\n params: Any,\n handler: (method: string, params: Any) => Stream<Any>\n ) => MaybePromise<Stream<Any>>;\n} & Omit<RpcPeerOptions, 'callHandler' | 'streamHandler'>;\n\nexport class ClientRpcServer {\n private readonly _serviceRegistry: ServiceRegistry<ClientServices>;\n private readonly _rpcPeer: RpcPeer;\n private readonly _handlerCache = new Map<string, ServiceHandler<any>>();\n private readonly _handleCall: ClientRpcServerParams['handleCall'];\n private readonly _handleStream: ClientRpcServerParams['handleStream'];\n\n constructor(params: ClientRpcServerParams) {\n const { serviceRegistry, handleCall, handleStream, ...rpcOptions } = params;\n this._handleCall = handleCall;\n this._handleStream = handleStream;\n\n this._serviceRegistry = serviceRegistry;\n this._rpcPeer = new RpcPeer({\n ...rpcOptions,\n callHandler: (method, params) => {\n const [serviceName, methodName] = parseMethodName(method);\n const handler = (method: string, params: Any) => this._getServiceHandler(serviceName).call(method, params);\n\n if (this._handleCall) {\n return this._handleCall(methodName, params, handler);\n } else {\n return handler(methodName, params);\n }\n },\n streamHandler: (method, params) => {\n const [serviceName, methodName] = parseMethodName(method);\n const handler = (method: string, params: Any) =>\n this._getServiceHandler(serviceName).callStream(method, params);\n\n if (this._handleStream) {\n return Stream.unwrapPromise(this._handleStream(methodName, params, handler));\n } else {\n return handler(methodName, params);\n }\n }\n });\n }\n\n async open() {\n await this._rpcPeer.open();\n }\n\n async close() {\n await this._rpcPeer.close();\n }\n\n private _getServiceHandler(serviceName: string) {\n if (!this._handlerCache.has(serviceName)) {\n const [key, descriptor] =\n Object.entries(this._serviceRegistry.descriptors).find(\n ([key, descriptor]) => descriptor.name === serviceName\n ) ?? raise(new Error(`Service not available: ${serviceName}`));\n\n const service = this._serviceRegistry.services[key as keyof ClientServices];\n if (!service) {\n throw new Error(`Service not available: ${serviceName}`);\n }\n\n this._handlerCache.set(serviceName, descriptor.createServer(service as any));\n }\n\n return this._handlerCache.get(serviceName)!;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event } from '@dxos/async';\nimport { appServiceBundle, AppServiceBundle, shellServiceBundle } from '@dxos/client';\nimport { PublicKey } from '@dxos/keys';\nimport { AppContextRequest, LayoutRequest, ShellLayout } from '@dxos/protocols/proto/dxos/iframe';\nimport { createProtoRpcPeer, ProtoRpcPeer, RpcPort } from '@dxos/rpc';\n\nexport interface ShellRuntime {\n layoutUpdate: Event<LayoutRequest>;\n layout: ShellLayout;\n invitationCode?: string;\n spaceKey?: PublicKey;\n setLayout: (layout: ShellLayout, options?: Omit<LayoutRequest, 'layout'>) => void;\n setAppContext: (context: AppContextRequest) => Promise<void>;\n}\n\n/**\n * Endpoint that handles shell services.\n */\nexport class ShellRuntimeImpl implements ShellRuntime {\n readonly layoutUpdate = new Event<LayoutRequest>();\n private _appRpc?: ProtoRpcPeer<AppServiceBundle>;\n private _layout = ShellLayout.DEFAULT;\n private _invitationCode?: string;\n private _spaceKey?: PublicKey;\n\n constructor(private readonly _port: RpcPort) {}\n\n get layout() {\n return this._layout;\n }\n\n get invitationCode() {\n return this._invitationCode;\n }\n\n get spaceKey() {\n return this._spaceKey;\n }\n\n setLayout(layout: ShellLayout, options: Omit<LayoutRequest, 'layout'> = {}) {\n this._layout = layout;\n this._invitationCode = options.invitationCode;\n this._spaceKey = options.spaceKey;\n this.layoutUpdate.emit({ layout, ...options });\n }\n\n async setAppContext(context: AppContextRequest) {\n assert(this._appRpc, 'runtime not open');\n\n await this._appRpc.rpc.AppService.setContext(context);\n }\n\n async open() {\n this._appRpc = createProtoRpcPeer({\n requested: appServiceBundle,\n exposed: shellServiceBundle,\n handlers: {\n ShellService: {\n setLayout: async (request) => {\n this._layout = request.layout;\n this._invitationCode = request.invitationCode;\n this._spaceKey = request.spaceKey;\n this.layoutUpdate.emit(request);\n }\n }\n },\n port: this._port\n });\n\n await this._appRpc.open();\n }\n\n async close() {\n await this._appRpc?.close();\n this._appRpc = undefined;\n }\n}\n\nexport class MemoryShellRuntime implements ShellRuntime {\n readonly layoutUpdate = new Event<LayoutRequest>();\n readonly contextUpdate = new Event<AppContextRequest>();\n private _layout: ShellLayout;\n private _invitationCode?: string;\n private _spaceKey?: PublicKey;\n\n constructor({ layout, invitationCode, spaceKey }: Partial<LayoutRequest> & Partial<AppContextRequest> = {}) {\n this._layout = layout ?? ShellLayout.DEFAULT;\n this._invitationCode = invitationCode;\n this._spaceKey = spaceKey;\n }\n\n get layout() {\n return this._layout;\n }\n\n get invitationCode() {\n return this._invitationCode;\n }\n\n get spaceKey() {\n return this._spaceKey;\n }\n\n setLayout(layout: ShellLayout, options: Omit<LayoutRequest, 'layout'> = {}) {\n this._layout = layout;\n this._invitationCode = options.invitationCode;\n this._spaceKey = options.spaceKey;\n this.layoutUpdate.emit({ layout, ...options });\n }\n\n async setAppContext(context: AppContextRequest) {\n this.contextUpdate.emit(context);\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { iframeServiceBundle, workerServiceBundle, WorkerServiceBundle } from '@dxos/client';\nimport { WebRTCTransportService } from '@dxos/network-manager';\nimport { BridgeService } from '@dxos/protocols/proto/dxos/mesh/bridge';\nimport { createProtoRpcPeer, ProtoRpcPeer, RpcPort } from '@dxos/rpc';\n\nimport { ShellRuntime, ShellRuntimeImpl } from './shell-runtime';\n\n// NOTE: Keep as RpcPorts to avoid dependency on @dxos/rpc-tunnel so we don't depend on browser-specific apis.\nexport type IFrameProxyRuntimeParams = {\n systemPort: RpcPort;\n workerAppPort: RpcPort;\n windowAppPort: RpcPort;\n shellPort?: RpcPort;\n};\n\n/**\n * Manages the client connection to the shared worker.\n */\nexport class IFrameProxyRuntime {\n private readonly _systemPort: RpcPort;\n private readonly _windowAppPort: RpcPort;\n private readonly _workerAppPort: RpcPort;\n private readonly _shellPort?: RpcPort;\n private readonly _systemRpc: ProtoRpcPeer<WorkerServiceBundle>;\n private readonly _shellRuntime?: ShellRuntimeImpl;\n private readonly _transportService = new WebRTCTransportService();\n\n constructor({ systemPort, workerAppPort, windowAppPort, shellPort }: IFrameProxyRuntimeParams) {\n this._systemPort = systemPort;\n this._windowAppPort = windowAppPort;\n this._workerAppPort = workerAppPort;\n this._shellPort = shellPort;\n\n this._systemRpc = createProtoRpcPeer({\n requested: workerServiceBundle,\n exposed: iframeServiceBundle,\n handlers: {\n BridgeService: this._transportService as BridgeService,\n IframeService: {\n async heartbeat() {\n // Ok.\n }\n }\n },\n port: this._systemPort,\n timeout: 200\n });\n\n this._workerAppPort.subscribe((msg) => this._windowAppPort.send(msg));\n this._windowAppPort.subscribe((msg) => this._workerAppPort.send(msg));\n\n if (this._shellPort) {\n this._shellRuntime = new ShellRuntimeImpl(this._shellPort);\n }\n }\n\n get shell(): ShellRuntime | undefined {\n return this._shellRuntime;\n }\n\n async open(origin: string) {\n await this._systemRpc.open();\n await this._systemRpc.rpc.WorkerService.start({ origin });\n await this._shellRuntime?.open();\n }\n\n async close() {\n await this._shellRuntime?.close();\n await this._systemRpc.rpc.WorkerService.stop();\n await this._systemRpc.close();\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { asyncTimeout, Trigger } from '@dxos/async';\nimport { log, logInfo } from '@dxos/log';\nimport { MaybePromise } from '@dxos/util';\n\nenum Message {\n ACQUIRING = 'acquiring'\n}\n\nexport type VaultResourceLockOptions = {\n lockKey: string;\n onAcquire?: () => MaybePromise<void>;\n onRelease?: () => MaybePromise<void>;\n};\n\nexport class VaultResourceLock {\n private readonly _broadcastChannel = new BroadcastChannel('vault-resource-lock');\n private readonly _lockKey: string;\n private readonly _onAcquire: VaultResourceLockOptions['onAcquire'];\n private readonly _onRelease: VaultResourceLockOptions['onRelease'];\n private _releaseTrigger = new Trigger();\n\n constructor({ lockKey, onAcquire, onRelease }: VaultResourceLockOptions) {\n this._lockKey = lockKey;\n this._onAcquire = onAcquire;\n this._onRelease = onRelease;\n this._broadcastChannel.onmessage = this._onMessage.bind(this);\n }\n\n @logInfo\n get lockKey() {\n return this._lockKey;\n }\n\n async acquire() {\n this._broadcastChannel.postMessage({\n message: Message.ACQUIRING\n });\n\n try {\n log('aquiring lock...');\n await asyncTimeout(this._requestLock(), 3_000);\n log('acquired lock');\n } catch {\n log('stealing lock...');\n await this._requestLock(true);\n log('stolen lock');\n }\n }\n\n async release() {\n this._releaseTrigger.wake();\n }\n\n private _onMessage(event: MessageEvent<any>) {\n if (event.data.message === Message.ACQUIRING) {\n this._releaseTrigger.wake();\n }\n }\n\n private async _requestLock(steal = false) {\n log('requesting lock...', { steal });\n const acquired = new Trigger();\n\n void navigator.locks\n .request(this._lockKey, { steal }, async () => {\n await this._onAcquire?.();\n acquired.wake();\n this._releaseTrigger = new Trigger();\n await this._releaseTrigger.wait();\n log('releasing lock...');\n await this._onRelease?.();\n log('released lock');\n })\n .catch(async () => {\n await this._onRelease?.();\n });\n\n await acquired.wait();\n log('recieved lock', { steal });\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport { Config } from '@dxos/config';\nimport { log } from '@dxos/log';\nimport { MemorySignalManager, MemorySignalManagerContext, WebsocketSignalManager } from '@dxos/messaging';\nimport { NetworkManager, WebRTCTransportProxyFactory } from '@dxos/network-manager';\nimport { RpcPort } from '@dxos/rpc';\nimport { MaybePromise } from '@dxos/util';\n\nimport { ClientServicesHost } from '../services';\nimport { WorkerSession } from './worker-session';\n\n// NOTE: Keep as RpcPorts to avoid dependency on @dxos/rpc-tunnel so we don't depend on browser-specific apis.\nexport type CreateSessionParams = {\n appPort: RpcPort;\n systemPort: RpcPort;\n shellPort: RpcPort;\n};\n\n/**\n * Runtime for the shared worker.\n * Manages connections from proxies (in tabs).\n * Tabs make requests to the `ClientServicesHost`, and provide a WebRTC gateway.\n */\nexport class WorkerRuntime {\n private readonly _transportFactory = new WebRTCTransportProxyFactory();\n private readonly _ready = new Trigger<Error | undefined>();\n private readonly sessions = new Set<WorkerSession>();\n private _sessionForNetworking?: WorkerSession;\n private _clientServices!: ClientServicesHost;\n private _config!: Config;\n\n // prettier-ignore\n constructor(\n private readonly _configProvider: () => MaybePromise<Config>\n ) {\n this._clientServices = new ClientServicesHost();\n }\n\n get host() {\n return this._clientServices;\n }\n\n async start() {\n log('starting...');\n try {\n this._config = await this._configProvider();\n const signalServer = this._config.get('runtime.services.signal.server');\n this._clientServices.initialize({\n config: this._config,\n networkManager: new NetworkManager({\n log: true,\n signalManager: signalServer\n ? new WebsocketSignalManager([signalServer])\n : new MemorySignalManager(new MemorySignalManagerContext()), // TODO(dmaretskyi): Inject this context.\n transportFactory: this._transportFactory\n })\n });\n\n await this._clientServices.open();\n this._ready.wake(undefined);\n log('started');\n } catch (err: any) {\n this._ready.wake(err);\n log.catch(err);\n }\n }\n\n async stop() {\n // TODO(dmaretskyi): Terminate active sessions.\n await this._clientServices.close();\n }\n\n /**\n * Create a new session.\n */\n async createSession({ appPort, systemPort, shellPort }: CreateSessionParams) {\n const session = new WorkerSession({\n serviceHost: this._clientServices,\n appPort,\n systemPort,\n shellPort,\n readySignal: this._ready\n });\n\n // When tab is closed.\n session.onClose.set(async () => {\n this.sessions.delete(session);\n this._reconnectWebrtc();\n });\n\n await session.open();\n this.sessions.add(session);\n\n this._reconnectWebrtc();\n }\n\n /**\n * Selects one of the existing session fro WebRTC networking.\n */\n private _reconnectWebrtc() {\n // Check if current session is already closed.\n if (this._sessionForNetworking) {\n if (!this.sessions.has(this._sessionForNetworking)) {\n this._sessionForNetworking = undefined;\n }\n }\n\n // Select existing session.\n if (!this._sessionForNetworking) {\n const selected = Array.from(this.sessions).find((session) => session.bridgeService);\n if (selected) {\n this._sessionForNetworking = selected;\n this._transportFactory.setBridgeService(selected.bridgeService);\n } else {\n this._transportFactory.setBridgeService(undefined);\n }\n }\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { asyncTimeout, Trigger } from '@dxos/async';\nimport { iframeServiceBundle, IframeServiceBundle, workerServiceBundle } from '@dxos/client';\nimport { log, logInfo } from '@dxos/log';\nimport { BridgeService } from '@dxos/protocols/proto/dxos/mesh/bridge';\nimport { createProtoRpcPeer, ProtoRpcPeer, RpcPort } from '@dxos/rpc';\nimport { Callback } from '@dxos/util';\n\nimport { ClientServicesHost } from '../services';\nimport { ClientRpcServer, ClientRpcServerParams } from '../services/client-rpc-server';\n\nexport type WorkerSessionParams = {\n serviceHost: ClientServicesHost;\n systemPort: RpcPort;\n appPort: RpcPort;\n shellPort: RpcPort;\n readySignal: Trigger<Error | undefined>;\n options?: {\n heartbeatInterval: number;\n };\n};\n\n/**\n * Represents a tab connection within the worker.\n */\nexport class WorkerSession {\n private readonly _clientRpc: ClientRpcServer;\n private readonly _shellClientRpc: ClientRpcServer;\n private readonly _iframeRpc: ProtoRpcPeer<IframeServiceBundle>;\n private readonly _startTrigger = new Trigger();\n private readonly _serviceHost: ClientServicesHost;\n private readonly _options: NonNullable<WorkerSessionParams['options']>;\n private _heartbeatTimer?: NodeJS.Timeout;\n\n public readonly onClose = new Callback<() => Promise<void>>();\n\n @logInfo\n public origin?: string;\n\n public bridgeService?: BridgeService;\n\n constructor({\n serviceHost,\n systemPort,\n appPort,\n shellPort,\n readySignal,\n options = {\n heartbeatInterval: 1_000\n }\n }: WorkerSessionParams) {\n assert(options);\n assert(serviceHost);\n this._options = options;\n this._serviceHost = serviceHost;\n\n const middleware: Pick<ClientRpcServerParams, 'handleCall' | 'handleStream'> = {\n handleCall: async (method, params, handler) => {\n const error = await readySignal.wait({ timeout: 3_000 });\n if (error) {\n throw error;\n }\n\n return handler(method, params);\n },\n handleStream: async (method, params, handler) => {\n const error = await readySignal.wait({ timeout: 3_000 });\n if (error) {\n throw error;\n }\n\n return handler(method, params);\n }\n };\n\n this._clientRpc = new ClientRpcServer({\n serviceRegistry: this._serviceHost.serviceRegistry,\n port: appPort,\n ...middleware\n });\n this._shellClientRpc = new ClientRpcServer({\n serviceRegistry: this._serviceHost.serviceRegistry,\n port: shellPort,\n ...middleware\n });\n\n this._iframeRpc = createProtoRpcPeer({\n requested: iframeServiceBundle,\n exposed: workerServiceBundle,\n handlers: {\n WorkerService: {\n start: async (request) => {\n this.origin = request.origin;\n this._startTrigger.wake();\n },\n\n stop: async () => {\n setTimeout(async () => {\n try {\n await this.close();\n } catch (err: any) {\n log.catch(err);\n }\n });\n }\n }\n },\n port: systemPort,\n timeout: 1000 // With low timeout heartbeat may fail if the tab's thread is saturated.\n });\n\n this.bridgeService = this._iframeRpc.rpc.BridgeService;\n }\n\n async open() {\n log.info('opening..');\n await Promise.all([this._clientRpc.open(), this._iframeRpc.open(), this._maybeOpenShell()]);\n\n await this._startTrigger.wait({ timeout: 3_000 });\n\n // Detect if bridge is present.\n // TODO(burdon): Add heartbeat to client's System service.\n // How do we detect if the client's tab closed?\n this._heartbeatTimer = setInterval(async () => {\n try {\n await this._iframeRpc.rpc.IframeService.heartbeat();\n } catch (err) {\n log.warn('Heartbeat failed', { err });\n try {\n await this.close();\n } catch (err: any) {\n log.catch(err);\n }\n }\n }, this._options.heartbeatInterval);\n }\n\n async close() {\n log.info('closing..');\n try {\n await this.onClose.callIfSet();\n } catch (err: any) {\n log.catch(err);\n }\n\n if (this._heartbeatTimer !== undefined) {\n clearInterval(this._heartbeatTimer);\n }\n\n await Promise.all([this._clientRpc.close(), this._iframeRpc.close()]);\n }\n\n private async _maybeOpenShell() {\n try {\n await asyncTimeout(this._shellClientRpc.open(), 1_000);\n } catch {\n log.info('No shell connected.');\n }\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Trigger } from '@dxos/async';\nimport { Invitation } from '@dxos/client';\nimport { CredentialConsumer, getCredentialAssertion } from '@dxos/credentials';\nimport { failUndefined } from '@dxos/debug';\nimport {\n valueEncoding,\n MetadataStore,\n SpaceManager,\n SigningContext,\n DataServiceSubscriptions,\n SnapshotStore\n} from '@dxos/echo-pipeline';\nimport { FeedFactory, FeedStore } from '@dxos/feed-store';\nimport { Keyring } from '@dxos/keyring';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ModelFactory } from '@dxos/model-factory';\nimport { NetworkManager } from '@dxos/network-manager';\nimport { trace } from '@dxos/protocols';\nimport type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { Storage } from '@dxos/random-access-storage';\n\nimport { CreateIdentityOptions, IdentityManager, JoinIdentityParams } from '../identity';\nimport {\n DeviceInvitationProtocol,\n InvitationsHandler,\n InvitationProtocol,\n SpaceInvitationProtocol\n} from '../invitations';\nimport { DataSpaceManager } from '../spaces';\n\n/**\n * Shared backend for all client services.\n */\n// TODO(burdon): Rename/break-up into smaller components. And/or make members private.\nexport class ServiceContext {\n public readonly initialized = new Trigger();\n public readonly dataServiceSubscriptions = new DataServiceSubscriptions();\n public readonly metadataStore: MetadataStore;\n public readonly snapshotStore: SnapshotStore;\n public readonly feedStore: FeedStore<FeedMessage>;\n public readonly keyring: Keyring;\n public readonly spaceManager: SpaceManager;\n public readonly identityManager: IdentityManager;\n public readonly invitations: InvitationsHandler;\n\n // Initialized after identity is initialized.\n public dataSpaceManager?: DataSpaceManager;\n\n private readonly _handlerFactories = new Map<\n Invitation.Kind,\n (invitation: Partial<Invitation>) => InvitationProtocol\n >();\n\n private _deviceSpaceSync?: CredentialConsumer<any>;\n\n private readonly _instanceId = PublicKey.random().toHex();\n\n // prettier-ignore\n constructor(\n public readonly storage: Storage,\n public readonly networkManager: NetworkManager,\n public readonly modelFactory: ModelFactory\n ) {\n networkManager._traceParent = this._instanceId;\n // TODO(burdon): Move strings to constants.\n this.metadataStore = new MetadataStore(storage.createDirectory('metadata'));\n this.snapshotStore = new SnapshotStore(storage.createDirectory('snapshots'));\n\n this.keyring = new Keyring(storage.createDirectory('keyring'));\n this.feedStore = new FeedStore<FeedMessage>({\n factory: new FeedFactory<FeedMessage>({\n root: storage.createDirectory('feeds'),\n signer: this.keyring,\n hypercore: {\n valueEncoding\n }\n })\n });\n\n this.spaceManager = new SpaceManager({\n feedStore: this.feedStore,\n networkManager: this.networkManager\n });\n this.spaceManager._traceParent = this._instanceId;\n\n this.identityManager = new IdentityManager(\n this.metadataStore,\n this.keyring,\n this.feedStore,\n this.spaceManager\n );\n this.identityManager._traceParent = this._instanceId;\n\n this.invitations = new InvitationsHandler(this.networkManager);\n\n // TODO(burdon): _initialize called in multiple places.\n // TODO(burdon): Call _initialize on success.\n this._handlerFactories.set(Invitation.Kind.DEVICE, () => new DeviceInvitationProtocol(\n this.keyring,\n () => this.identityManager.identity ?? failUndefined(),\n this._acceptIdentity.bind(this)\n ));\n }\n\n async open() {\n log.trace('dxos.sdk.service-context', trace.begin({ id: this._instanceId }));\n\n log('opening...');\n await this.networkManager.open();\n await this.spaceManager.open();\n await this.identityManager.open();\n if (this.identityManager.identity) {\n await this._initialize();\n }\n log('opened');\n }\n\n async close() {\n log('closing...');\n await this._deviceSpaceSync?.close();\n await this.dataSpaceManager?.close();\n await this.identityManager.close();\n await this.spaceManager.close();\n await this.feedStore.close();\n await this.networkManager.close();\n this.dataServiceSubscriptions.clear();\n log('closed');\n\n log.trace('dxos.sdk.service-context', trace.end({ id: this._instanceId }));\n }\n\n async reset() {\n log('resetting...');\n await this.close();\n await this.storage.reset();\n log('reset');\n }\n\n async createIdentity(params: CreateIdentityOptions = {}) {\n const identity = await this.identityManager.createIdentity(params);\n\n await this._initialize();\n return identity;\n }\n\n getInvitationHandler(invitation: Partial<Invitation> & Pick<Invitation, 'kind'>): InvitationProtocol {\n const factory = this._handlerFactories.get(invitation.kind);\n assert(factory, `Unknown invitation kind: ${invitation.kind}`);\n return factory(invitation);\n }\n\n private async _acceptIdentity(params: JoinIdentityParams) {\n const identity = await this.identityManager.acceptIdentity(params);\n\n await this._initialize();\n return identity;\n }\n\n // Called when identity is created.\n private async _initialize() {\n log('initializing spaces...');\n const identity = this.identityManager.identity ?? failUndefined();\n const signingContext: SigningContext = {\n credentialSigner: identity.getIdentityCredentialSigner(),\n identityKey: identity.identityKey,\n deviceKey: identity.deviceKey,\n profile: identity.profileDocument,\n recordCredential: async (credential) => {\n await identity.controlPipeline.writer.write({ credential: { credential } });\n }\n };\n\n this.dataSpaceManager = new DataSpaceManager(\n this.spaceManager,\n this.metadataStore,\n this.dataServiceSubscriptions,\n this.keyring,\n signingContext,\n this.modelFactory,\n this.feedStore,\n this.snapshotStore\n );\n this.dataSpaceManager._traceParent = this._instanceId;\n await this.dataSpaceManager.open();\n\n this._handlerFactories.set(Invitation.Kind.SPACE, (invitation) => {\n assert(this.dataSpaceManager, 'dataSpaceManager not initialized yet');\n return new SpaceInvitationProtocol(this.dataSpaceManager, signingContext, this.keyring, invitation.spaceKey);\n });\n this.initialized.wake();\n\n this._deviceSpaceSync = identity.space.spaceState.registerProcessor({\n process: async (credential: Credential) => {\n const assertion = getCredentialAssertion(credential);\n if (assertion['@type'] !== 'dxos.halo.credentials.SpaceMember') {\n return;\n }\n if (assertion.spaceKey.equals(identity.space.key)) {\n // ignore halo space\n return;\n }\n if (!this.dataSpaceManager) {\n log('dataSpaceManager not initialized yet, ignoring space admission', { details: assertion });\n return;\n }\n if (this.dataSpaceManager.spaces.has(assertion.spaceKey)) {\n log('space already exists, ignoring space admission', { details: assertion });\n return;\n }\n\n try {\n log('accepting space recorded in halo', { details: assertion });\n await this.dataSpaceManager.acceptSpace({\n spaceKey: assertion.spaceKey,\n genesisFeedKey: assertion.genesisFeedKey\n });\n } catch (err) {\n log.catch(err);\n }\n }\n });\n await this._deviceSpaceSync.open();\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { ServiceBundle } from '@dxos/rpc';\n\n/**\n * Registry of operational services.\n */\nexport class ServiceRegistry<Services> {\n // prettier-ignore\n constructor (\n private readonly _serviceBundle: ServiceBundle<Services>,\n private _handlers: Partial<Services> = {}\n ) {}\n\n get descriptors() {\n return this._serviceBundle;\n }\n\n get services() {\n return this._handlers;\n }\n\n setServices(services: Partial<Services>) {\n this._handlers = services;\n }\n\n addService(name: keyof Services, service: Services[keyof Services]) {\n this._handlers[name] = service;\n }\n\n removeService(name: keyof Services) {\n delete this._handlers[name];\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { ClientServices, ClientServicesProvider } from '@dxos/client';\nimport { ServiceBundle } from '@dxos/rpc';\n\nimport { ClientServicesHost, ClientServicesHostParams } from './service-host';\n\n/**\n * Starts a local instance of the service host.\n */\nexport class LocalClientServices implements ClientServicesProvider {\n private readonly _host: ClientServicesHost;\n\n constructor(params: ClientServicesHostParams) {\n this._host = new ClientServicesHost(params);\n }\n\n get descriptors(): ServiceBundle<ClientServices> {\n return this._host.descriptors;\n }\n\n get services(): Partial<ClientServices> {\n return this._host.services;\n }\n\n get host(): ClientServicesHost {\n return this._host;\n }\n\n async open(): Promise<void> {\n await this._host.open();\n }\n\n async close(): Promise<void> {\n await this._host.close();\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { ClientServicesProvider } from '@dxos/client';\nimport { Config } from '@dxos/config';\nimport { log } from '@dxos/log';\nimport { MemorySignalManager, MemorySignalManagerContext, WebsocketSignalManager } from '@dxos/messaging';\nimport {\n createWebRTCTransportFactory,\n MemoryTransportFactory,\n NetworkManager,\n NetworkManagerOptions\n} from '@dxos/network-manager';\n\nimport { LocalClientServices } from './local-client-services';\n\n/**\n * Creates stand-alone services without rpc.\n */\nexport const fromHost = (config: Config = new Config()): ClientServicesProvider => {\n return new LocalClientServices({\n config,\n networkManager: createNetworkManager(config)\n });\n};\n\n/**\n * Creates a WebRTC network manager connected to the specified signal server.\n */\n// TODO(burdon): Move to client-services and remove dependencies from here.\nconst createNetworkManager = (config: Config, options: Partial<NetworkManagerOptions> = {}): NetworkManager => {\n const signalServer = config.get('runtime.services.signal.server');\n if (signalServer) {\n const {\n log = true,\n signalManager = new WebsocketSignalManager([signalServer]),\n transportFactory = createWebRTCTransportFactory({\n iceServers: config.get('runtime.services.ice')\n })\n } = options;\n\n return new NetworkManager({ log, signalManager, transportFactory });\n }\n\n // TODO(burdon): Should not provide a memory signal manager since no shared context.\n // Use TestClientBuilder for shared memory tests.\n log.warn('P2P network is not configured.');\n return new NetworkManager({\n signalManager: new MemorySignalManager(new MemorySignalManagerContext()),\n transportFactory: MemoryTransportFactory\n });\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Trigger } from '@dxos/async';\nimport {\n AuthenticatingInvitationObservable,\n CancellableInvitationObservable,\n Client,\n EchoProxy,\n HaloProxy,\n InvitationsProxy,\n SpaceProxy\n} from '@dxos/client';\nimport { Invitation } from '@dxos/protocols/proto/dxos/client/services';\n\nimport { ServiceContext } from '../services';\n\n/**\n * Strip secrets from invitation before giving it to the peer.\n */\nexport const sanitizeInvitation = (invitation: Invitation): Invitation => {\n return {\n invitationId: invitation.invitationId,\n type: invitation.type,\n kind: invitation.kind,\n authMethod: invitation.authMethod,\n swarmKey: invitation.swarmKey,\n state: invitation.state,\n timeout: invitation.timeout\n };\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 PerformInvitationParams = {\n host: ServiceContext | InvitationsProxy | HaloProxy | SpaceProxy;\n guest: ServiceContext | InvitationsProxy | HaloProxy | EchoProxy | Client;\n options?: Partial<Invitation>;\n hooks?: {\n host?: PerformInvitationCallbacks<CancellableInvitationObservable>;\n guest?: PerformInvitationCallbacks<AuthenticatingInvitationObservable>;\n };\n};\n\nexport type Result = { invitation?: Invitation; error?: Error };\n\nexport const performInvitation = ({\n host,\n guest,\n options,\n hooks\n}: PerformInvitationParams): [Promise<Result>, Promise<Result>] => {\n const hostComplete = new Trigger<Result>();\n const guestComplete = new Trigger<Result>();\n const authCode = new Trigger<string>();\n\n const hostObservable = createInvitation(host, options);\n hostObservable.subscribe(\n async (hostInvitation: Invitation) => {\n switch (hostInvitation.state) {\n case Invitation.State.CONNECTING: {\n if (hooks?.host?.onConnecting?.(hostObservable)) {\n break;\n }\n const guestObservable = acceptInvitation(guest, hostInvitation);\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 assert(hostInvitation.swarmKey!.equals(guestInvitation.swarmKey!));\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 await guestObservable.authenticate(await authCode.wait());\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 if (hooks?.guest?.onError?.(guestObservable)) {\n return;\n }\n guestComplete.wake({ error });\n }\n );\n break;\n }\n\n case Invitation.State.CONNECTED: {\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 return [hostComplete.wait(), guestComplete.wait()];\n};\n\nconst createInvitation = (\n host: ServiceContext | InvitationsProxy | HaloProxy | SpaceProxy,\n options?: Partial<Invitation>\n): CancellableInvitationObservable => {\n options ??= {\n authMethod: Invitation.AuthMethod.NONE,\n ...(options ?? {})\n };\n\n if (host instanceof InvitationsProxy || host instanceof HaloProxy || host instanceof SpaceProxy) {\n return host.createInvitation(options);\n }\n\n const hostHandler = host.getInvitationHandler({ kind: Invitation.Kind.SPACE, ...options });\n return host.invitations.createInvitation(hostHandler, options);\n};\n\nconst acceptInvitation = (\n guest: ServiceContext | InvitationsProxy | HaloProxy | EchoProxy | Client,\n invitation: Invitation\n): AuthenticatingInvitationObservable => {\n invitation = sanitizeInvitation(invitation);\n\n if (\n guest instanceof InvitationsProxy ||\n guest instanceof HaloProxy ||\n guest instanceof EchoProxy ||\n guest instanceof Client\n ) {\n return guest.acceptInvitation(invitation);\n }\n\n const guestHandler = guest.getInvitationHandler({ kind: invitation.kind });\n return guest.invitations.acceptInvitation(guestHandler, invitation);\n};\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { asyncTimeout, Trigger } from '@dxos/async';\nimport { Client, ClientServices, ClientServicesProxy, createDefaultModelFactory, Invitation } from '@dxos/client';\nimport { Config } from '@dxos/config';\nimport { raise } from '@dxos/debug';\nimport { DocumentModel } from '@dxos/document-model';\nimport { DatabaseProxy, genesisMutation } from '@dxos/echo-db';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { MemorySignalManager, MemorySignalManagerContext, WebsocketSignalManager } from '@dxos/messaging';\nimport { createWebRTCTransportFactory, MemoryTransportFactory, NetworkManager } from '@dxos/network-manager';\nimport { Storage } from '@dxos/random-access-storage';\nimport { createLinkedPorts, createProtoRpcPeer, ProtoRpcPeer } from '@dxos/rpc';\n\nimport { ClientServicesHost, LocalClientServices } from '../services';\n\nexport const testConfigWithLocalSignal = new Config({\n version: 1,\n runtime: {\n services: {\n signal: {\n // TODO(burdon): Port numbers and global consts?\n server: 'ws://localhost:4000/.well-known/dx/signal'\n }\n }\n }\n});\n\n/**\n * Client builder supports different configurations, incl. signaling, transports, storage.\n */\nexport class TestBuilder {\n private readonly _config: Config;\n\n public storage?: Storage;\n\n // prettier-ignore\n constructor (\n config?: Config,\n private readonly _modelFactory = createDefaultModelFactory(),\n private readonly _signalManagerContext = new MemorySignalManagerContext()\n ) {\n this._config = config ?? new Config();\n }\n\n get config(): Config {\n return this._config;\n }\n\n /**\n * Get network manager using local shared memory or remote signal manager.\n */\n get networkManager() {\n const signalServer = this._config.get('runtime.services.signal.server');\n if (signalServer) {\n return new NetworkManager({\n log: true,\n signalManager: new WebsocketSignalManager([signalServer]),\n transportFactory: createWebRTCTransportFactory({\n iceServers: this._config.get('runtime.services.ice')\n })\n });\n }\n\n // Memory transport with shared context.\n return new NetworkManager({\n log: true,\n signalManager: new MemorySignalManager(this._signalManagerContext),\n transportFactory: MemoryTransportFactory\n });\n }\n\n /**\n * Create backend service handlers.\n */\n createClientServicesHost() {\n return new ClientServicesHost({\n config: this._config,\n modelFactory: this._modelFactory,\n networkManager: this.networkManager,\n storage: this.storage\n });\n }\n\n /**\n * Create local services host.\n */\n createLocal() {\n return new LocalClientServices({\n config: this._config,\n modelFactory: this._modelFactory,\n networkManager: this.networkManager,\n storage: this.storage\n });\n }\n\n /**\n * Create client/server.\n */\n createClientServer(host: ClientServicesHost = this.createClientServicesHost()): [Client, ProtoRpcPeer<{}>] {\n const [proxyPort, hostPort] = createLinkedPorts();\n const server = createProtoRpcPeer({\n exposed: host.descriptors,\n handlers: host.services as ClientServices,\n port: hostPort\n });\n // TODO(dmaretskyi): Refactor.\n\n const client = new Client({ services: new ClientServicesProxy(proxyPort) });\n return [client, server];\n }\n}\n\nexport const testSpace = async (create: DatabaseProxy, check: DatabaseProxy = create) => {\n const objectId = PublicKey.random().toHex();\n\n const result = create.mutate(genesisMutation(objectId, DocumentModel.meta.type));\n\n await result.batch.getReceipt();\n // TODO(dmaretskiy): await result.waitToBeProcessed()\n assert(create._itemManager.entities.has(result.objectsUpdated[0].id));\n\n await asyncTimeout(\n check.itemUpdate.waitForCondition(() => check._itemManager.entities.has(objectId)),\n 1000\n );\n\n return result;\n};\n\nexport const syncItems = async (db1: DatabaseProxy, db2: DatabaseProxy) => {\n // Check item replicated from 1 => 2.\n await testSpace(db1, db2);\n\n // Check item replicated from 2 => 1.\n await testSpace(db2, db1);\n};\n\nexport const joinCommonSpace = async ([initialPeer, ...peers]: Client[], spaceKey?: PublicKey): Promise<PublicKey> => {\n const rootSpace = spaceKey ? initialPeer.getSpace(spaceKey) : await initialPeer.createSpace();\n assert(rootSpace, 'Space not found.');\n\n await Promise.all(\n peers.map(async (peer) => {\n const hostDone = new Trigger<Invitation>();\n const guestDone = new Trigger<Invitation>();\n\n const hostObservable = rootSpace.createInvitation({ authMethod: Invitation.AuthMethod.NONE });\n log('invitation created');\n hostObservable.subscribe(\n (hostInvitation) => {\n switch (hostInvitation.state) {\n case Invitation.State.CONNECTING: {\n const guestObservable = peer.acceptInvitation(hostInvitation);\n log('invitation accepted');\n\n guestObservable.subscribe(\n (guestInvitation) => {\n switch (guestInvitation.state) {\n case Invitation.State.SUCCESS: {\n guestDone.wake(guestInvitation);\n log('invitation guestDone');\n break;\n }\n }\n },\n (err) => raise(err)\n );\n break;\n }\n\n case Invitation.State.SUCCESS: {\n hostDone.wake(hostInvitation);\n log('invitation hostDone');\n }\n }\n },\n (err) => raise(err)\n );\n\n await Promise.all([hostDone.wait(), guestDone.wait()]);\n })\n );\n\n return rootSpace.key;\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["createMockCredential", "signer", "issuer", "createCredential", "subject", "PublicKey", "Buffer", "from", "assertion", "payload", "value", "import_client", "import_credentials", "import_echo_pipeline", "import_feed_store", "import_keyring", "import_messaging", "import_network_manager", "import_random_access_storage", "import_node_assert", "import_async", "import_client", "import_echo_pipeline", "import_log", "import_protocols", "import_services", "TracingServiceImpl", "constructor", "_config", "setTracingOptions", "Error", "subscribeToRpcTrace", "DevicesServiceImpl", "constructor", "_identityManager", "updateDevice", "request", "Error", "queryDevices", "Stream", "next", "update", "deviceKeys", "identity", "authorizedDeviceKeys", "devices", "Array", "from", "values", "map", "key", "_a", "deviceKey", "kind", "equals", "DeviceKind", "CURRENT", "TRUSTED", "subscriptions", "EventSubscriptions", "add", "stateUpdate", "on", "clear", "import_async", "import_codec_protobuf", "import_async", "import_codec_protobuf", "import_keys", "subscribeToFeeds", "feedStore", "feedKeys", "Stream", "next", "length", "subscriptions", "EventSubscriptions", "feedMap", "ComplexMap", "PublicKey", "hash", "update", "feeds", "filter", "feed", "some", "feedKey", "equals", "key", "forEach", "has", "set", "on", "add", "off", "Array", "from", "values", "map", "properties", "feedOpened", "clear", "subscribeToFeedBlocks", "maxBlocks", "timeout", "setTimeout", "getFeed", "iterator", "FeedIterator", "open", "blocks", "block", "push", "slice", "close", "clearTimeout", "import_codec_protobuf", "subscribeToKeyringKeys", "keyring", "Stream", "next", "update", "keys", "list", "unsubscribe", "keysUpdate", "on", "import_codec_protobuf", "import_keys", "subscribeToNetworkStatus", "networkManager", "Stream", "next", "close", "update", "status", "signalManager", "getStatus", "servers", "err", "statusChanged", "on", "subscribeToSignal", "ctx", "Context", "onMessage", "message", "author", "asUint8Array", "recipient", "payload", "receivedAt", "Date", "swarmEvent", "dispose", "subscribeToSwarmInfo", "networkManager", "Stream", "next", "update", "_a", "info", "connectionLog", "swarms", "data", "on", "import_codec_protobuf", "subscribeToSpaces", "context", "spaceKeys", "Stream", "next", "unsubscribe", "update", "spaces", "spaceManager", "values", "filteredSpaces", "filter", "space", "length", "some", "spaceKey", "equals", "key", "map", "spaceMetadata", "metadataStore", "find", "isOpen", "timeframe", "dataTimeframe", "genesisFeed", "genesisFeedKey", "controlFeed", "controlFeedKey", "dataFeed", "dataFeedKey", "timeout", "setTimeout", "initialized", "wait", "dataSpaceManager", "updated", "on", "clearTimeout", "DevtoolsHostEvents", "ready", "AsyncEvent", "DevtoolsServiceImpl", "constructor", "params", "events", "request", "Stream", "next", "on", "getConfig", "Error", "resetStorage", "enableDebugLogging", "disableDebugLogging", "subscribeToKeyringKeys", "keyring", "context", "subscribeToCredentialMessages", "subscribeToSpaces", "subscribeToItems", "subscribeToFeeds", "feedStore", "subscribeToFeedBlocks", "getSpaceSnapshot", "saveSpaceSnapshot", "clearSnapshots", "getNetworkPeers", "subscribeToNetworkTopics", "subscribeToSignalStatus", "subscribeToNetworkStatus", "networkManager", "subscribeToSignal", "subscribeToSwarmInfo", "import_async", "import_context", "import_credentials", "createAuthProvider", "signer", "nonce", "credential", "createCredential", "assertion", "subject", "getIssuer", "schema", "getCodecForType", "encode", "TrustedKeySetAuthVerifier", "constructor", "_params", "_ctx", "Context", "close", "dispose", "verifier", "auth", "decode", "log", "result", "verifyCredential", "kind", "proof", "Buffer", "from", "equals", "_isTrustedKey", "issuer", "key", "trigger", "Trigger", "onDispose", "wake", "clear", "update", "on", "wait", "timeout", "authTimeout", "deviceKey", "deviceSet", "trustedKeysProvider", "has", "import_async", "import_credentials", "import_feed_store", "import_log", "AUTH_TIMEOUT", "Identity", "constructor", "space", "signer", "identityKey", "deviceKey", "stateUpdate", "Event", "_signer", "_deviceStateMachine", "spaceState", "registerProcessor", "DeviceStateMachine", "onUpdate", "emit", "_profileStateMachine", "ProfileStateMachine", "authVerifier", "TrustedKeySetAuthVerifier", "trustedKeysProvider", "authorizedDeviceKeys", "update", "authTimeout", "processor", "open", "close", "ready", "deviceChainReady", "wait", "controlPipeline", "state", "waitUntilReachedTargetTimeframe", "timeout", "profileDocument", "profile", "haloSpaceKey", "key", "haloGenesisFeedKey", "genesisFeedKey", "deviceCredentialChain", "getAdmissionCredentials", "controlFeedKey", "failUndefined", "dataFeedKey", "getIdentityCredentialSigner", "assert", "createCredentialSignerWithChain", "getDeviceCredentialSigner", "createCredentialSignerWithKey", "admitDevice", "log", "hostDevice", "writeMessages", "writer", "createCredential", "subject", "assertion", "spaceKey", "designation", "AdmittedFeed", "Designation", "CONTROL", "DATA", "map", "credential", "import_node_assert", "import_async", "import_credentials", "import_keys", "import_log", "import_protocols", "import_util", "IdentityManager", "constructor", "_metadataStore", "_keyring", "_feedStore", "_spaceManager", "stateUpdate", "Event", "_instanceId", "PublicKey", "random", "toHex", "identity", "_identity", "open", "log", "trace", "begin", "id", "parentId", "_traceParent", "load", "identityRecord", "getIdentityRecord", "_constructIdentity", "ready", "identityKey", "displayName", "profileDocument", "emit", "close", "end", "createIdentity", "assert", "controlFeedKey", "createKey", "deviceKey", "haloSpace", "key", "genesisFeedKey", "dataFeedKey", "generator", "CredentialGenerator", "credentials", "createSpaceGenesis", "createFeedAdmission", "AdmittedFeed", "Designation", "DATA", "push", "createProfileCredential", "createDeviceAuthorization", "credential", "controlPipeline", "writer", "write", "setIdentityRecord", "acceptIdentity", "params", "haloSpaceKey", "haloGenesisFeedKey", "controlTimeframe", "controlFeed", "openFeed", "writable", "dataFeed", "space", "_constructSpace", "spaceRecord", "swarmIdentity", "peerKey", "credentialProvider", "createAuthProvider", "createCredentialSignerWithKey", "credentialAuthenticator", "deferFunction", "authVerifier", "verifier", "setControlFeed", "setDataFeed", "Identity", "signer", "state", "setTargetTimeframe", "constructSpace", "metadata", "onNetworkConnection", "import_node_assert", "import_codec_protobuf", "import_credentials", "import_debug", "IdentityServiceImpl", "constructor", "_serviceContext", "createIdentity", "request", "_getIdentity", "recoverIdentity", "todo", "queryIdentity", "Stream", "next", "emitNext", "identity", "identityManager", "stateUpdate", "on", "undefined", "identityKey", "spaceKey", "space", "key", "profile", "profileDocument", "signPresentation", "presentation", "nonce", "assert", "signer", "keyring", "signerKey", "deviceKey", "chain", "deviceCredentialChain", "import_node_assert", "import_services", "DeviceInvitationProtocol", "constructor", "_keyring", "_getIdentity", "_acceptIdentity", "toJSON", "getInvitationContext", "kind", "Invitation", "Kind", "DEVICE", "admit", "request", "assert", "device", "identity", "admitDevice", "identityKey", "haloSpaceKey", "genesisFeedKey", "haloGenesisFeedKey", "controlTimeframe", "controlPipeline", "state", "timeframe", "createIntroduction", "createAdmissionRequest", "deviceKey", "createKey", "controlFeedKey", "dataFeedKey", "accept", "response", "import_node_assert", "import_async", "import_context", "import_credentials", "import_keys", "import_log", "import_protocols", "import_services", "MAX_OTP_ATTEMPTS", "InvitationsHandler", "constructor", "_networkManager", "createInvitation", "protocol", "options", "invitationId", "PublicKey", "random", "toHex", "type", "Invitation", "Type", "INTERACTIVE", "authMethod", "AuthMethod", "SHARED_SECRET", "state", "State", "INIT", "timeout", "INVITATION_TIMEOUT", "swarmKey", "authCode", "generatePasscode", "AUTHENTICATION_CODE_LENGTH", "undefined", "assert", "invitation", "getInvitationContext", "stream", "PushStream", "ctx", "Context", "onError", "err", "dispose", "error", "onDispose", "log", "toJSON", "complete", "createExtension", "success", "Trigger", "guestProfile", "authenticationPassed", "authenticationRetry", "extension", "InvitationHostExtension", "introduce", "profile", "next", "READY_FOR_AUTHENTICATION", "spaceKey", "NONE", "authenticate", "code", "status", "AuthenticationResponse", "Status", "OK", "INVALID_OPT_ATTEMPTS", "INVALID_OTP", "INTERNAL_ERROR", "admit", "admissionRequest", "_a", "isAuthenticationRequired", "Error", "deviceKey", "device", "space", "admissionResponse", "wake", "onOpen", "scheduleTask", "CONNECTED", "wait", "guest", "SUCCESS", "TimeoutError", "TIMEOUT", "MULTIUSE", "sleep", "ON_CLOSE_DELAY", "topic", "swarmConnection", "joinSwarm", "peerId", "protocolProvider", "createTeleportProtocolFactory", "teleport", "addExtension", "topology", "StarTopology", "close", "CONNECTING", "observable", "CancellableInvitationObservable", "initialInvitation", "subscriber", "onCancel", "CANCELLED", "acceptInvitation", "authenticated", "warn", "connectionCount", "InvitationGuestExtension", "raise", "introductionResponse", "rpc", "InvitationHostService", "createIntroduction", "response", "attempt", "AUTHENTICATING", "reset", "createAdmissionRequest", "result", "accept", "AuthenticatingInvitationObservable", "onAuthenticate", "RpcExtension", "_callbacks", "exposed", "schema", "getService", "getHandlers", "request", "context", "requested", "import_node_assert", "import_codec_protobuf", "import_log", "import_services", "InvitationsServiceImpl", "constructor", "_invitationsHandler", "_getHandler", "_createInvitations", "Map", "_acceptInvitations", "getLoggingContext", "createInvitation", "invitation", "Stream", "next", "close", "handler", "log", "invitationId", "observable", "subscribe", "state", "Invitation", "State", "CONNECTING", "assert", "set", "CONNECTED", "READY_FOR_AUTHENTICATION", "AUTHENTICATING", "SUCCESS", "CANCELLED", "TIMEOUT", "err", "context", "warn", "delete", "acceptInvitation", "authenticate", "authCode", "get", "cancelInvitation", "cancel", "import_node_assert", "import_credentials", "import_feed_store", "import_log", "import_services", "SpaceInvitationProtocol", "constructor", "_spaceManager", "_signingContext", "_keyring", "_spaceKey", "toJSON", "deviceKey", "spaceKey", "getInvitationContext", "kind", "Invitation", "Kind", "SPACE", "admit", "request", "guestProfile", "assert", "space", "spaces", "get", "identityKey", "log", "host", "guest", "credentials", "createAdmissionCredentials", "credentialSigner", "key", "inner", "genesisFeedKey", "credential", "spaceMemberCredential", "getCredentialAssertion", "writeMessages", "controlPipeline", "writer", "controlTimeframe", "state", "timeframe", "dataTimeframe", "dataPipeline", "pipelineState", "createIntroduction", "profile", "createAdmissionRequest", "controlFeedKey", "createKey", "dataFeedKey", "accept", "response", "assertion", "subject", "id", "equals", "acceptSpace", "recordCredential", "import_codec_protobuf", "NetworkServiceImpl", "constructor", "networkManager", "subscribeToNetworkStatus", "Stream", "next", "unsubscribe", "connectionStateChanged", "on", "state", "connectionState", "setNetworkOptions", "request", "setConnectionState", "import_node_assert", "import_async", "import_client", "import_context", "import_credentials", "import_echo_pipeline", "import_keys", "import_log", "import_protocols", "import_util", "import_async", "import_client", "import_context", "import_debug", "import_keys", "import_log", "import_credentials", "import_util", "import_node_assert", "import_async", "import_context", "import_keys", "import_log", "import_protocols", "import_teleport", "import_util", "DEFAULT_RETRY_TIMEOUT", "DEFAULT_SUCCESS_DELAY", "DEFAULT_NOTARIZE_TIMEOUT", "NotarizationPlugin", "_ctx", "Context", "_extensionOpened", "Event", "_extensions", "Set", "_processedCredentials", "ComplexSet", "PublicKey", "hash", "_processCredentialsTriggers", "ComplexMap", "open", "close", "dispose", "notarize", "ctx", "opCtx", "credentials", "timeout", "retryTimeout", "successDelay", "log", "assert", "every", "credential", "id", "errors", "Trigger", "derive", "onError", "err", "warn", "throw", "onDispose", "scheduleTask", "peers", "Array", "from", "map", "extension", "remotePeerId", "TimeoutError", "allNotarized", "Promise", "all", "_waitUntilProcessed", "peersTried", "notarizeTask", "DeferredTask", "size", "peer", "find", "has", "retryIn", "clear", "schedule", "add", "localPeerId", "credentialId", "rpc", "NotarizationService", "filter", "sleep", "on", "race", "rejectOnDispose", "wait", "process", "get", "wake", "delete", "setWriter", "writer", "_writer", "entry", "orInsert", "value", "_onNotarize", "request", "Error", "write", "createExtension", "NotarizationTeleportExtension", "onOpen", "emit", "onClose", "onNotarize", "bind", "RpcExtension", "constructor", "_params", "requested", "schema", "getService", "exposed", "getHandlers", "AUTH_TIMEOUT", "DataSpace", "constructor", "params", "_ctx", "Context", "_state", "SpaceState", "CLOSED", "stateUpdate", "Event", "_inner", "inner", "on", "emit", "_gossip", "gossip", "_presence", "presence", "_keyring", "keyring", "_feedStore", "feedStore", "_metadataStore", "metadataStore", "_signingContext", "signingContext", "_callbacks", "callbacks", "_dataPipeline", "DataPipeline", "modelFactory", "snapshotManager", "memberKey", "spaceKey", "key", "feedInfoProvider", "feedKey", "spaceState", "feeds", "get", "snapshotId", "authVerifier", "TrustedKeySetAuthVerifier", "trustedKeysProvider", "ComplexSet", "PublicKey", "hash", "Array", "from", "members", "keys", "update", "authTimeout", "_notarizationPluginConsumer", "registerProcessor", "NotarizationPlugin", "isOpen", "state", "dataPipeline", "notarizationPlugin", "processor", "open", "INACTIVE", "close", "dispose", "destroy", "postMessage", "channel", "message", "listen", "callback", "initializeDataPipelineAsync", "scheduleTask", "initializeDataPipeline", "err", "CancelledError", "log", "error", "SystemError", "INITIALIZING", "controlPipeline", "waitUntilReachedTargetTimeframe", "ctx", "breakOnStall", "_createWritableFeeds", "setWriter", "createMappedFeedWriter", "credential", "writer", "openPipeline", "start", "pipeline", "createDataPipeline", "pipelineState", "beforeReady", "READY", "afterReady", "credentials", "controlFeedKey", "controlFeed", "openFeed", "createKey", "writable", "setControlFeed", "push", "credentialSigner", "createCredential", "subject", "assertion", "deviceKey", "identityKey", "designation", "AdmittedFeed", "Designation", "CONTROL", "dataFeedKey", "dataFeed", "setDataFeed", "DATA", "length", "notarize", "timeout", "setWritableFeedKeys", "timed", "trackLeaks", "__decorate", "DataSpaceManager", "constructor", "_spaceManager", "_metadataStore", "_dataServiceSubscriptions", "_keyring", "_signingContext", "_modelFactory", "_feedStore", "_snapshotStore", "_ctx", "Context", "updated", "Event", "_spaces", "ComplexMap", "PublicKey", "hash", "_isOpen", "_instanceId", "random", "toHex", "spaces", "open", "log", "trace", "begin", "id", "parentId", "_traceParent", "load", "length", "spaceMetadata", "space", "_constructSpace", "initializeDataPipelineAsync", "emit", "close", "dispose", "values", "end", "createSpace", "assert", "spaceKey", "createKey", "controlFeedKey", "dataFeedKey", "metadata", "key", "genesisFeedKey", "credentials", "spaceGenesis", "inner", "addSpace", "memberCredential", "getCredentialAssertion", "recordCredential", "initializeDataPipeline", "acceptSpace", "opts", "has", "controlTimeframe", "dataTimeframe", "waitUntilSpaceReady", "cancelWithContext", "waitForCondition", "get", "state", "SpaceState", "READY", "gossip", "Gossip", "localPeerId", "deviceKey", "presence", "Presence", "announceInterval", "offlineTimeout", "identityKey", "snapshotManager", "SnapshotManager", "controlFeed", "openFeed", "writable", "dataFeed", "constructSpace", "swarmIdentity", "peerKey", "credentialProvider", "createAuthProvider", "credentialSigner", "credentialAuthenticator", "deferFunction", "dataSpace", "authVerifier", "verifier", "onNetworkConnection", "session", "addExtension", "createExtension", "remotePeerId", "objectSync", "notarizationPlugin", "setControlFeed", "setDataFeed", "DataSpace", "modelFactory", "metadataStore", "memberKey", "keyring", "feedStore", "signingContext", "snapshotId", "snapshot", "callbacks", "beforeReady", "registerSpace", "dataPipeline", "databaseBackend", "createDataServiceHost", "afterReady", "controlPipeline", "setTargetTimeframe", "set", "synchronized", "trackLeaks", "import_async", "import_codec_protobuf", "import_debug", "import_echo_pipeline", "import_log", "import_services", "import_util", "TIMEFRAME_UPDATE_DEBOUNCE_TIME", "SpacesServiceImpl", "constructor", "_identityManager", "_spaceManager", "_dataServiceSubscriptions", "_getDataSpaceManager", "createSpace", "identity", "Error", "dataSpaceManager", "space", "_transformSpace", "updateSpace", "request", "todo", "querySpaces", "Stream", "next", "ctx", "onUpdate", "spaces", "Array", "from", "values", "map", "log", "scheduleTask", "subscriptions", "EventSubscriptions", "onDispose", "clear", "subscribeSpaces", "add", "stateUpdate", "on", "presence", "updated", "inner", "controlPipeline", "state", "timeframeUpdate", "debounce", "dataPipeline", "pipelineState", "postMessage", "spaceKey", "channel", "message", "get", "raise", "SpaceNotFoundError", "getChannelId", "subscribeMessages", "handle", "listen", "unsubscribe", "queryCredentials", "processor", "spaceState", "registerProcessor", "process", "credential", "close", "open", "writeCredentials", "credentials", "writer", "write", "key", "pipeline", "controlFeeds", "feeds", "feed", "currentControlTimeframe", "timeframe", "targetControlTimeframe", "targetTimeframe", "totalControlTimeframe", "endTimeframe", "dataFeeds", "currentDataTimeframe", "targetDataTimeframe", "totalDataTimeframe", "members", "member", "_a", "_b", "_c", "identityKey", "profile", "displayName", "assertion", "humanize", "equals", "getPeersOnline", "filter", "length", "SpaceMember", "PresenceState", "ONLINE", "OFFLINE", "import_errors", "StorageDriver", "createStorageObjects", "config", "path", "storageType", "keyStorage", "persistent", "RAM", "InvalidConfigError", "undefined", "storage", "createStorage", "type", "toStorageType", "StorageType", "root", "CHROME", "FIREFOX", "IDB", "NODE", "WEBFS", "Error", "import_codec_protobuf", "SystemServiceImpl", "constructor", "config", "statusUpdate", "onUpdateStatus", "getCurrentStatus", "onReset", "_config", "_statusUpdate", "_getCurrentStatus", "_onUpdateStatus", "_onReset", "getConfig", "values", "updateStatus", "status", "queryStatus", "Stream", "next", "update", "unsubscribe", "on", "interval", "setInterval", "clearInterval", "reset", "import_async", "import_log", "import_network_manager", "import_util", "import_codec_protobuf", "import_debug", "ClientRpcServer", "constructor", "params", "_handlerCache", "Map", "serviceRegistry", "handleCall", "handleStream", "rpcOptions", "_handleCall", "_handleStream", "_serviceRegistry", "_rpcPeer", "RpcPeer", "callHandler", "method", "serviceName", "methodName", "parseMethodName", "handler", "_getServiceHandler", "call", "streamHandler", "callStream", "Stream", "unwrapPromise", "open", "close", "has", "key", "descriptor", "Object", "entries", "descriptors", "find", "name", "raise", "Error", "service", "services", "set", "createServer", "get", "import_node_assert", "import_async", "import_client", "import_rpc", "ShellRuntimeImpl", "constructor", "_port", "layoutUpdate", "Event", "_layout", "ShellLayout", "DEFAULT", "layout", "invitationCode", "_invitationCode", "spaceKey", "_spaceKey", "setLayout", "options", "emit", "setAppContext", "context", "assert", "_appRpc", "rpc", "AppService", "setContext", "open", "createProtoRpcPeer", "requested", "appServiceBundle", "exposed", "shellServiceBundle", "handlers", "ShellService", "request", "port", "close", "undefined", "__decorate", "LOCK_KEY", "IFrameHostRuntime", "constructor", "configProvider", "appPort", "shellPort", "_transportFactory", "createWebRTCTransportFactory", "_ready", "Trigger", "_configProvider", "_appPort", "_shellPort", "_shellRuntime", "ShellRuntimeImpl", "services", "_clientServices", "shell", "start", "log", "_config", "getAsyncValue", "signalServer", "get", "LocalClientServices", "lockKey", "config", "networkManager", "NetworkManager", "signalManager", "WebsocketSignalManager", "MemorySignalManager", "MemorySignalManagerContext", "transportFactory", "middleware", "handleCall", "method", "params", "handler", "error", "wait", "timeout", "handleStream", "_clientRpc", "ClientRpcServer", "serviceRegistry", "host", "port", "Promise", "all", "open", "wake", "undefined", "err", "catch", "stop", "close", "logInfo", "import_client", "import_network_manager", "import_rpc", "import_async", "import_log", "__decorate", "Message", "ACQUIRING", "VaultResourceLock", "constructor", "lockKey", "onAcquire", "onRelease", "_broadcastChannel", "BroadcastChannel", "_releaseTrigger", "Trigger", "_lockKey", "_onAcquire", "_onRelease", "onmessage", "_onMessage", "bind", "acquire", "postMessage", "message", "log", "asyncTimeout", "_requestLock", "release", "wake", "event", "data", "steal", "acquired", "navigator", "locks", "request", "wait", "catch", "logInfo", "import_async", "import_log", "import_messaging", "import_network_manager", "import_node_assert", "import_async", "import_client", "import_log", "import_rpc", "import_util", "__decorate", "WorkerSession", "constructor", "serviceHost", "systemPort", "appPort", "shellPort", "readySignal", "options", "heartbeatInterval", "_startTrigger", "Trigger", "onClose", "Callback", "assert", "_options", "_serviceHost", "middleware", "handleCall", "method", "params", "handler", "error", "wait", "timeout", "handleStream", "_clientRpc", "ClientRpcServer", "serviceRegistry", "port", "_shellClientRpc", "_iframeRpc", "createProtoRpcPeer", "requested", "iframeServiceBundle", "exposed", "workerServiceBundle", "handlers", "WorkerService", "start", "request", "origin", "wake", "stop", "setTimeout", "close", "err", "log", "catch", "bridgeService", "rpc", "BridgeService", "open", "info", "Promise", "all", "_maybeOpenShell", "_heartbeatTimer", "setInterval", "IframeService", "heartbeat", "warn", "callIfSet", "undefined", "clearInterval", "asyncTimeout", "logInfo", "import_node_assert", "import_async", "import_client", "import_credentials", "import_debug", "import_echo_pipeline", "import_feed_store", "import_keys", "import_log", "import_protocols", "ServiceContext", "constructor", "storage", "networkManager", "modelFactory", "initialized", "Trigger", "dataServiceSubscriptions", "DataServiceSubscriptions", "_handlerFactories", "Map", "_instanceId", "PublicKey", "random", "toHex", "_traceParent", "metadataStore", "MetadataStore", "createDirectory", "snapshotStore", "SnapshotStore", "keyring", "Keyring", "feedStore", "FeedStore", "factory", "FeedFactory", "root", "signer", "hypercore", "valueEncoding", "spaceManager", "SpaceManager", "identityManager", "IdentityManager", "invitations", "InvitationsHandler", "set", "Invitation", "Kind", "DEVICE", "DeviceInvitationProtocol", "identity", "failUndefined", "_acceptIdentity", "bind", "open", "log", "trace", "begin", "id", "_initialize", "close", "_deviceSpaceSync", "dataSpaceManager", "clear", "end", "reset", "createIdentity", "params", "getInvitationHandler", "invitation", "get", "kind", "assert", "acceptIdentity", "signingContext", "credentialSigner", "getIdentityCredentialSigner", "identityKey", "deviceKey", "profile", "profileDocument", "recordCredential", "credential", "controlPipeline", "writer", "write", "DataSpaceManager", "SPACE", "SpaceInvitationProtocol", "spaceKey", "wake", "space", "spaceState", "registerProcessor", "process", "assertion", "getCredentialAssertion", "equals", "key", "details", "spaces", "has", "acceptSpace", "genesisFeedKey", "err", "catch", "ServiceRegistry", "constructor", "_serviceBundle", "_handlers", "descriptors", "services", "setServices", "addService", "name", "service", "removeService", "ClientServicesHost", "constructor", "config", "modelFactory", "createDefaultModelFactory", "networkManager", "storage", "lockKey", "_statusUpdate", "Event", "_opening", "_open", "_instanceId", "PublicKey", "random", "toHex", "_storage", "_modelFactory", "initialize", "_resourceLock", "VaultResourceLock", "onAcquire", "open", "onRelease", "close", "undefined", "_systemService", "SystemServiceImpl", "_config", "statusUpdate", "getCurrentStatus", "isOpen", "SystemStatus", "ACTIVE", "INACTIVE", "onUpdateStatus", "status", "acquire", "release", "onReset", "assert", "_serviceContext", "reset", "_serviceRegistry", "ServiceRegistry", "clientServiceBundle", "SystemService", "serviceRegistry", "descriptors", "services", "createStorageObjects", "get", "_networkManager", "log", "trace", "begin", "id", "ServiceContext", "setServices", "IdentityService", "IdentityServiceImpl", "InvitationsService", "InvitationsServiceImpl", "invitations", "invitation", "getInvitationHandler", "DevicesService", "DevicesServiceImpl", "identityManager", "SpacesService", "SpacesServiceImpl", "spaceManager", "dataServiceSubscriptions", "initialized", "wait", "dataSpaceManager", "DataService", "DataServiceImpl", "NetworkService", "NetworkServiceImpl", "TracingService", "TracingServiceImpl", "DevtoolsHost", "DevtoolsServiceImpl", "events", "DevtoolsHostEvents", "context", "emit", "deviceKey", "identity", "end", "LocalClientServices", "constructor", "params", "_host", "ClientServicesHost", "descriptors", "services", "host", "open", "close", "import_config", "import_log", "import_messaging", "import_network_manager", "createServiceHost", "config", "signalManagerContext", "networkManager", "NetworkManager", "signalManager", "MemorySignalManager", "transportFactory", "MemoryTransportFactory", "ClientServicesHost", "createServiceContext", "signalContext", "MemorySignalManagerContext", "storage", "createStorage", "type", "StorageType", "RAM", "modelFactory", "createDefaultModelFactory", "ServiceContext", "createPeers", "numPeers", "Promise", "all", "Array", "from", "map", "peer", "open", "createIdentity", "syncItemsLocal", "db1", "db2", "testLocalDatabase", "HostTestBuilder", "createPeer", "TestPeer", "constructor", "_props", "keyring", "Keyring", "createDirectory", "feedStore", "FeedStore", "factory", "FeedFactory", "root", "signer", "hypercore", "valueEncoding", "metadataStore", "MetadataStore", "snapshotStore", "SnapshotStore", "spaceManager", "SpaceManager", "createSigningContext", "identityKey", "createKey", "deviceKey", "credentialSigner", "createCredentialSignerWithChain", "credential", "CredentialGenerator", "createDeviceAuthorization", "recordCredential", "import_node_assert", "import_async", "import_client", "import_services", "sanitizeInvitation", "invitation", "invitationId", "type", "kind", "authMethod", "swarmKey", "state", "timeout", "performInvitation", "host", "guest", "options", "hooks", "hostComplete", "Trigger", "guestComplete", "authCode", "hostObservable", "createInvitation", "subscribe", "hostInvitation", "Invitation", "State", "CONNECTING", "onConnecting", "guestObservable", "acceptInvitation", "guestInvitation", "_a", "_b", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "_k", "_l", "_m", "_n", "assert", "equals", "CONNECTED", "onConnected", "READY_FOR_AUTHENTICATION", "onReady", "authenticate", "wait", "AUTHENTICATING", "onAuthenticating", "SUCCESS", "onSuccess", "wake", "CANCELLED", "onCancelled", "TIMEOUT", "onTimeout", "error", "onError", "AuthMethod", "NONE", "InvitationsProxy", "HaloProxy", "SpaceProxy", "hostHandler", "getInvitationHandler", "Kind", "SPACE", "invitations", "EchoProxy", "Client", "guestHandler", "import_node_assert", "import_async", "import_client", "import_config", "import_debug", "import_keys", "import_log", "import_messaging", "import_network_manager", "import_rpc", "testConfigWithLocalSignal", "Config", "version", "runtime", "services", "signal", "server", "TestBuilder", "constructor", "config", "_modelFactory", "createDefaultModelFactory", "_signalManagerContext", "MemorySignalManagerContext", "_config", "networkManager", "signalServer", "get", "NetworkManager", "log", "signalManager", "WebsocketSignalManager", "transportFactory", "createWebRTCTransportFactory", "iceServers", "MemorySignalManager", "MemoryTransportFactory", "createClientServicesHost", "ClientServicesHost", "modelFactory", "storage", "createLocal", "LocalClientServices", "createClientServer", "host", "proxyPort", "hostPort", "createLinkedPorts", "createProtoRpcPeer", "exposed", "descriptors", "handlers", "port", "client", "Client", "ClientServicesProxy", "testSpace", "create", "check", "objectId", "PublicKey", "random", "toHex", "result", "mutate", "genesisMutation", "DocumentModel", "meta", "type", "batch", "getReceipt", "assert", "_itemManager", "entities", "has", "objectsUpdated", "id", "asyncTimeout", "itemUpdate", "waitForCondition", "syncItems", "db1", "db2", "joinCommonSpace", "initialPeer", "peers", "spaceKey", "rootSpace", "getSpace", "createSpace", "Promise", "all", "map", "peer", "hostDone", "Trigger", "guestDone", "hostObservable", "createInvitation", "authMethod", "Invitation", "AuthMethod", "NONE", "subscribe", "hostInvitation", "state", "State", "CONNECTING", "guestObservable", "acceptInvitation", "guestInvitation", "SUCCESS", "wake", "err", "raise", "wait", "key"]
|
|
7
7
|
}
|