@dxos/client-services 0.1.46 → 0.1.47
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-MGKMTUPD.mjs → chunk-LGYQZ6UO.mjs} +210 -165
- package/dist/lib/browser/chunk-LGYQZ6UO.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +1 -1
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/packlets/testing/index.mjs +1 -1
- package/dist/lib/node/index.cjs +236 -191
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/packlets/testing/index.cjs +251 -206
- package/dist/lib/node/packlets/testing/index.cjs.map +3 -3
- package/dist/types/src/packlets/identity/identity-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/invitation-extension.d.ts +20 -3
- package/dist/types/src/packlets/invitations/invitation-extension.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
- package/package.json +30 -30
- package/src/packlets/identity/identity-manager.ts +3 -0
- package/src/packlets/invitations/invitation-extension.ts +101 -13
- package/src/packlets/invitations/invitations-handler.ts +14 -65
- package/src/packlets/spaces/data-space-manager.ts +3 -0
- package/dist/lib/browser/chunk-MGKMTUPD.mjs.map +0 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/packlets/testing/index.ts", "../../../../../src/packlets/testing/credential-utils.ts", "../../../../../src/packlets/testing/invitation-utils.ts", "../../../../../src/packlets/services/service-host.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/invitation-extension.ts", "../../../../../src/packlets/invitations/invitations-service.ts", "../../../../../src/packlets/invitations/space-invitation-protocol.ts", "../../../../../src/packlets/logging/logging-service.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/genesis.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/testing/test-builder.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nexport * from './credential-utils';\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 2023 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Trigger } from '@dxos/async';\nimport { AuthenticatingInvitationObservable, CancellableInvitationObservable } from '@dxos/client-protocol';\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 InvitationHost = {\n createInvitation(options?: Partial<Invitation>): CancellableInvitationObservable;\n};\n\nexport type InvitationGuest = {\n acceptInvitation(invitation: Invitation): AuthenticatingInvitationObservable;\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 | InvitationHost;\n guest: ServiceContext | InvitationGuest;\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 | InvitationHost,\n options?: Partial<Invitation>,\n): CancellableInvitationObservable => {\n options ??= {\n authMethod: Invitation.AuthMethod.NONE,\n ...(options ?? {}),\n };\n\n if (host instanceof ServiceContext) {\n const hostHandler = host.getInvitationHandler({ kind: Invitation.Kind.SPACE, ...options });\n return host.invitations.createInvitation(hostHandler, options);\n }\n\n return host.createInvitation(options);\n};\n\nconst acceptInvitation = (\n guest: ServiceContext | InvitationGuest,\n invitation: Invitation,\n): AuthenticatingInvitationObservable => {\n invitation = sanitizeInvitation(invitation);\n\n if (guest instanceof ServiceContext) {\n const guestHandler = guest.getInvitationHandler({ kind: invitation.kind });\n return guest.invitations.acceptInvitation(guestHandler, invitation);\n }\n\n return guest.acceptInvitation(invitation);\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event } from '@dxos/async';\nimport { clientServiceBundle, ClientServices, createDefaultModelFactory } from '@dxos/client-protocol';\nimport { Config } from '@dxos/config';\nimport { DataServiceImpl } from '@dxos/echo-pipeline';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { SignalManager, WebsocketSignalManager } from '@dxos/messaging';\nimport { ModelFactory } from '@dxos/model-factory';\nimport { createWebRTCTransportFactory, NetworkManager, TransportFactory } 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 { DevicesServiceImpl } from '../devices';\nimport { DevtoolsServiceImpl, DevtoolsHostEvents } from '../devtools';\nimport { IdentityServiceImpl } from '../identity';\nimport { InvitationsServiceImpl } from '../invitations';\nimport { LoggingServiceImpl } from '../logging';\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 transportFactory?: TransportFactory;\n signalManager?: SignalManager;\n connectionLog?: boolean;\n storage?: Storage;\n lockKey?: string;\n};\n\nexport type InitializeOptions = {\n config?: Config;\n transportFactory?: TransportFactory;\n signalManager?: SignalManager;\n connectionLog?: boolean;\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 private readonly _loggingService: LoggingServiceImpl;\n\n private _config?: Config;\n private readonly _statusUpdate = new Event<void>();\n private readonly _modelFactory: ModelFactory;\n private _signalManager?: SignalManager;\n private _networkManager?: NetworkManager;\n private _storage?: Storage;\n\n _serviceContext!: ServiceContext;\n private _opening = false;\n private _open = false;\n\n constructor({\n config,\n modelFactory = createDefaultModelFactory(),\n // TODO(burdon): Create ApolloLink abstraction (see Client).\n transportFactory,\n signalManager,\n connectionLog,\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, transportFactory, signalManager });\n }\n\n this._resourceLock = lockKey\n ? new VaultResourceLock({\n lockKey,\n onAcquire: () => {\n if (!this._opening) {\n void this.open();\n }\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 await this.reset();\n },\n });\n\n this._loggingService = new LoggingServiceImpl();\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, ...options }: 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 const {\n connectionLog = true,\n transportFactory = createWebRTCTransportFactory({\n iceServers: this._config?.get('runtime.services.ice'),\n }),\n signalManager = new WebsocketSignalManager(this._config?.get('runtime.services.signaling') ?? []),\n } = options;\n this._signalManager = signalManager;\n\n assert(!this._networkManager, 'network manager already set');\n this._networkManager = new NetworkManager({\n log: connectionLog,\n transportFactory,\n signalManager,\n });\n }\n\n async open() {\n if (this._open) {\n return;\n }\n const traceId = PublicKey.random().toHex();\n log.trace('dxos.sdk.client-services-host.open', trace.begin({ id: traceId }));\n\n assert(this._config, 'config not set');\n assert(this._storage, 'storage not set');\n assert(this._signalManager, 'signal manager 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 await this._loggingService.open();\n\n // TODO(wittjosiah): Make re-entrant.\n // TODO(burdon): Break into components.\n this._serviceContext = new ServiceContext(\n this._storage,\n this._networkManager,\n this._signalManager,\n this._modelFactory,\n );\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, this._serviceContext.signalManager),\n\n LoggingService: this._loggingService,\n\n // TODO(burdon): Move to new protobuf definitions.\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 log.trace('dxos.sdk.client-services-host.open', trace.end({ id: traceId }));\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._loggingService.close();\n await this._serviceContext.close();\n this._open = false;\n this._statusUpdate.emit();\n log('closed', { deviceKey });\n }\n\n async reset() {\n const traceId = PublicKey.random().toHex();\n log.trace('dxos.sdk.client-services-host.reset', trace.begin({ id: traceId }));\n\n log('resetting...');\n await this._serviceContext?.close();\n await this._storage!.reset();\n log('reset');\n log.trace('dxos.sdk.client-services-host.reset', trace.end({ id: traceId }));\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';\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 StorageInfo,\n GetSnapshotsResponse,\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 async getStorageInfo(): Promise<StorageInfo> {\n const storageUsage = (await this.params.context.storage.getDiskInfo?.()) ?? { used: 0 };\n\n const navigatorInfo = typeof navigator === 'object' ? await navigator.storage.estimate() : undefined;\n\n return {\n type: this.params.context.storage.type,\n storageUsage: storageUsage.used,\n originUsage: navigatorInfo?.usage ?? 0,\n usageQuota: navigatorInfo?.quota ?? 0,\n };\n }\n\n async getSnapshots(): Promise<GetSnapshotsResponse> {\n return {\n snapshots: await this.params.context.snapshotStore.listSnapshots(),\n };\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({ signalManager: this.params.context.signalManager });\n }\n\n subscribeToSignal(): Stream<SignalResponse> {\n return subscribeToSignal({ signalManager: this.params.context.signalManager });\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 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) => ({\n feedKey: feed.key,\n length: feed.properties.length,\n diskUsage: feed.core.byteLength,\n })),\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 { scheduleTask } from '@dxos/async';\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, ctx }) => {\n const update = async () => {\n next({\n keys: await keyring.list(),\n });\n };\n keyring.keysUpdate.on(ctx, update);\n scheduleTask(ctx, update);\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 { SignalManager } from '@dxos/messaging';\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 = ({ signalManager }: { signalManager: SignalManager }) =>\n new Stream<SubscribeToSignalStatusResponse>(({ next, close }) => {\n const update = () => {\n try {\n const status = signalManager.getStatus();\n next({ servers: status });\n } catch (err: any) {\n close(err);\n }\n };\n\n signalManager.statusChanged.on(() => update());\n update();\n });\n\nexport const subscribeToSignal = ({ signalManager }: { signalManager: SignalManager }) =>\n new Stream<SignalResponse>(({ next }) => {\n const ctx = new Context();\n 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 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 { AUTH_TIMEOUT, LOAD_CONTROL_FEEDS_TIMEOUT } from '@dxos/client-protocol';\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\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: LOAD_CONTROL_FEEDS_TIMEOUT });\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 // 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 const traceId = PublicKey.random().toHex();\n log.trace('dxos.halo.identity-manager.open', trace.begin({ id: traceId }));\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 log.trace('dxos.halo.identity-manager.open', trace.end({ id: traceId }));\n }\n\n async close() {\n await this._identity?.close();\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 memberKey: identityKey,\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 AuthenticatingInvitationObservable,\n AUTHENTICATION_CODE_LENGTH,\n CancellableInvitationObservable,\n INVITATION_TIMEOUT,\n ON_CLOSE_DELAY,\n} from '@dxos/client-protocol';\nimport { Context } from '@dxos/context';\nimport { generatePasscode } from '@dxos/credentials';\nimport { InvalidInvitationExtensionRoleError } from '@dxos/errors';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { createTeleportProtocolFactory, NetworkManager, StarTopology } from '@dxos/network-manager';\nimport { trace } from '@dxos/protocols';\nimport { Invitation } from '@dxos/protocols/proto/dxos/client/services';\nimport { ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { AuthenticationResponse } from '@dxos/protocols/proto/dxos/halo/invitations';\n\nimport { InvitationGuestExtension, InvitationHostExtension } from './invitation-extension';\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 /**\n * @internal\n */\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 const traceId = PublicKey.random().toHex();\n try {\n log.trace('dxos.sdk.invitations-handler.host.onOpen', trace.begin({ id: traceId }));\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 log.trace('dxos.sdk.invitations-handler.host.onOpen', trace.end({ id: traceId }));\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 log.trace('dxos.sdk.invitations-handler.host.onOpen', trace.error({ id: traceId, error: err }));\n } finally {\n if (type !== Invitation.Type.MULTIUSE) {\n await sleep(ON_CLOSE_DELAY);\n await ctx.dispose();\n }\n }\n });\n },\n onError: (err) => {\n if (err instanceof InvalidInvitationExtensionRoleError) {\n return;\n }\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 },\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 let currentState: Invitation.State;\n const stream = new PushStream<Invitation>();\n const setState = (newData: Partial<Invitation>) => {\n assert(newData.state !== undefined);\n currentState = newData.state;\n stream.next({ ...invitation, ...newData });\n };\n\n const ctx = new Context({\n onError: (err) => {\n if (err instanceof TimeoutError) {\n log('timeout', { ...protocol.toJSON() });\n setState({ 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: (extensionCtx) => {\n extensionCtx.onDispose(async () => {\n log('extension disposed', { currentState });\n if (currentState !== Invitation.State.SUCCESS) {\n stream.error(new Error('Remote peer disconnected.'));\n }\n });\n\n scheduleTask(ctx, async () => {\n const traceId = PublicKey.random().toHex();\n try {\n log.trace('dxos.sdk.invitations-handler.guest.onOpen', trace.begin({ id: traceId }));\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 setState({ 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 setState({ state: Invitation.State.READY_FOR_AUTHENTICATION });\n const authCode = await authenticated.wait({ timeout });\n\n log('sending authentication request');\n setState({ 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 setState({ 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 setState({ ...result, state: Invitation.State.SUCCESS });\n log.trace('dxos.sdk.invitations-handler.guest.onOpen', trace.end({ id: traceId }));\n } catch (err: any) {\n if (err instanceof TimeoutError) {\n log('timeout', { ...protocol.toJSON() });\n setState({ state: Invitation.State.TIMEOUT });\n } else {\n log('auth failed', err);\n stream.error(err);\n }\n log.trace('dxos.sdk.invitations-handler.guest.onOpen', trace.error({ id: traceId, error: err }));\n } finally {\n await ctx.dispose();\n }\n });\n },\n onError: (err) => {\n if (err instanceof InvalidInvitationExtensionRoleError) {\n return;\n }\n if (err instanceof TimeoutError) {\n log('timeout', { ...protocol.toJSON() });\n setState({ state: Invitation.State.TIMEOUT });\n } else {\n log('auth failed', err);\n stream.error(err);\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 setState({ state: Invitation.State.CONNECTING });\n });\n\n const observable = new AuthenticatingInvitationObservable({\n initialInvitation: invitation,\n subscriber: stream.observable,\n onCancel: async () => {\n setState({ 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", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Trigger } from '@dxos/async';\nimport { cancelWithContext, Context } from '@dxos/context';\nimport { InvalidInvitationExtensionRoleError } from '@dxos/errors';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { schema, trace } from '@dxos/protocols';\nimport {\n AdmissionRequest,\n AdmissionResponse,\n AuthenticationRequest,\n AuthenticationResponse,\n IntroductionRequest,\n IntroductionResponse,\n InvitationHostService,\n Options,\n} from '@dxos/protocols/proto/dxos/halo/invitations';\nimport { ExtensionContext, RpcExtension } from '@dxos/teleport';\n\n/// Timeout for the options exchange.\nconst OPTIONS_TIMEOUT = 10_000;\n\ntype InvitationHostExtensionCallbacks = {\n // Deliberately not async to not block the extensions opening.\n onOpen: () => void;\n onError: (error: Error) => 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 */\nexport class InvitationHostExtension extends RpcExtension<\n { InvitationHostService: InvitationHostService },\n { InvitationHostService: InvitationHostService }\n> {\n /**\n * @internal\n */\n private _ctx = new Context();\n private _remoteOptions?: Options;\n private _remoteOptionsTrigger = new Trigger();\n\n constructor(private readonly _callbacks: InvitationHostExtensionCallbacks) {\n super({\n requested: {\n InvitationHostService: schema.getService('dxos.halo.invitations.InvitationHostService'),\n },\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 options: async (options) => {\n assert(!this._remoteOptions, 'Remote options already set.');\n this._remoteOptions = options;\n this._remoteOptionsTrigger.wake();\n },\n\n introduce: async (request) => {\n const traceId = PublicKey.random().toHex();\n log.trace('dxos.sdk.invitation-handler.host.introduce', trace.begin({ id: traceId }));\n const response = await this._callbacks.introduce(request);\n log.trace('dxos.sdk.invitation-handler.host.introduce', trace.end({ id: traceId }));\n return response;\n },\n\n authenticate: async (request) => {\n const traceId = PublicKey.random().toHex();\n log.trace('dxos.sdk.invitation-handler.host.authenticate', trace.begin({ id: traceId }));\n const response = await this._callbacks.authenticate(request);\n log.trace('dxos.sdk.invitation-handler.host.authenticate', trace.end({ id: traceId, data: { ...response } }));\n return response;\n },\n\n admit: async (request) => {\n const traceId = PublicKey.random().toHex();\n log.trace('dxos.sdk.invitation-handler.host.admit', trace.begin({ id: traceId }));\n const response = await this._callbacks.admit(request);\n log.trace('dxos.sdk.invitation-handler.host.admit', trace.end({ id: traceId }));\n return response;\n },\n },\n };\n }\n\n override async onOpen(context: ExtensionContext) {\n await super.onOpen(context);\n\n try {\n await this.rpc.InvitationHostService.options({ role: Options.Role.HOST });\n await cancelWithContext(this._ctx, this._remoteOptionsTrigger.wait({ timeout: OPTIONS_TIMEOUT }));\n if (this._remoteOptions?.role !== Options.Role.GUEST) {\n throw new InvalidInvitationExtensionRoleError(undefined, {\n expected: Options.Role.GUEST,\n remoteOptions: this._remoteOptions,\n });\n }\n\n this._callbacks.onOpen();\n } catch (err: any) {\n this._callbacks.onError(err);\n }\n }\n\n override async onClose() {\n await this._ctx.dispose();\n }\n}\n\ntype InvitationGuestExtensionCallbacks = {\n // Deliberately not async to not block the extensions opening.\n onOpen: (ctx: Context) => void;\n onError: (error: Error) => void;\n};\n\n/**\n * Guest's side for a connection to a concrete peer in p2p network during invitation.\n */\nexport class InvitationGuestExtension extends RpcExtension<\n { InvitationHostService: InvitationHostService },\n { InvitationHostService: InvitationHostService }\n> {\n private _ctx = new Context();\n private _remoteOptions?: Options;\n private _remoteOptionsTrigger = new Trigger();\n\n constructor(private readonly _callbacks: InvitationGuestExtensionCallbacks) {\n super({\n requested: {\n InvitationHostService: schema.getService('dxos.halo.invitations.InvitationHostService'),\n },\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 InvitationHostService: {\n options: async (options) => {\n assert(!this._remoteOptions, 'Remote options already set.');\n this._remoteOptions = options;\n this._remoteOptionsTrigger.wake();\n },\n introduce: () => {\n throw new Error('Method not allowed.');\n },\n authenticate: () => {\n throw new Error('Method not allowed.');\n },\n admit: () => {\n throw new Error('Method not allowed.');\n },\n },\n };\n }\n\n override async onOpen(context: ExtensionContext) {\n await super.onOpen(context);\n\n try {\n log('begin options');\n await cancelWithContext(this._ctx, this.rpc.InvitationHostService.options({ role: Options.Role.GUEST }));\n await cancelWithContext(this._ctx, this._remoteOptionsTrigger.wait({ timeout: OPTIONS_TIMEOUT }));\n log('end options');\n if (this._remoteOptions?.role !== Options.Role.HOST) {\n throw new InvalidInvitationExtensionRoleError(undefined, {\n expected: Options.Role.HOST,\n remoteOptions: this._remoteOptions,\n });\n }\n\n this._callbacks.onOpen(this._ctx);\n } catch (err: any) {\n log('openError', err);\n this._callbacks.onError(err);\n }\n }\n\n override async onClose() {\n log('onClose');\n await this._ctx.dispose();\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event } from '@dxos/async';\nimport { AuthenticatingInvitationObservable, CancellableInvitationObservable } from '@dxos/client-protocol';\nimport { Stream } from '@dxos/codec-protobuf';\nimport { log } from '@dxos/log';\nimport {\n AuthenticationRequest,\n Invitation,\n InvitationsService,\n QueryInvitationsResponse,\n} 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 private readonly _invitationCreated = new Event<Invitation>();\n private readonly _invitationAccepted = new Event<Invitation>();\n private readonly _removedCreated = new Event<Invitation>();\n private readonly _removedAccepted = new Event<Invitation>();\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(options: Invitation): Stream<Invitation> {\n let invitation: CancellableInvitationObservable;\n\n const existingInvitation = this._createInvitations.get(options.invitationId);\n if (existingInvitation) {\n invitation = existingInvitation;\n } else {\n const handler = this._getHandler(options);\n invitation = this._invitationsHandler.createInvitation(handler, options);\n this._createInvitations.set(invitation.get().invitationId, invitation);\n this._invitationCreated.emit(invitation.get());\n }\n\n return new Stream<Invitation>(({ next, close }) => {\n invitation.subscribe(\n (invitation) => {\n next(invitation);\n },\n (err: Error) => {\n close(err);\n },\n () => {\n close();\n this._createInvitations.delete(invitation.get().invitationId);\n },\n );\n });\n }\n\n acceptInvitation(options: Invitation): Stream<Invitation> {\n let invitation: AuthenticatingInvitationObservable;\n\n const existingInvitation = this._acceptInvitations.get(options.invitationId);\n if (existingInvitation) {\n invitation = existingInvitation;\n } else {\n const handler = this._getHandler(options);\n invitation = this._invitationsHandler.acceptInvitation(handler, options);\n this._acceptInvitations.set(invitation.get().invitationId, invitation);\n this._invitationAccepted.emit(invitation.get());\n }\n\n return new Stream<Invitation>(({ next, close }) => {\n invitation.subscribe(\n (invitation) => {\n next(invitation);\n },\n (err: Error) => {\n close(err);\n },\n () => {\n close();\n this._acceptInvitations.delete(invitation.get().invitationId);\n },\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('deleting...');\n assert(invitationId);\n const created = this._createInvitations.get(invitationId);\n const accepted = this._acceptInvitations.get(invitationId);\n if (created) {\n await created.cancel();\n this._createInvitations.delete(invitationId);\n this._removedCreated.emit(created.get());\n } else if (accepted) {\n await accepted.cancel();\n this._acceptInvitations.delete(invitationId);\n this._removedAccepted.emit(accepted.get());\n } else {\n log.warn('invalid invitation', { invitationId });\n }\n }\n\n queryInvitations(): Stream<QueryInvitationsResponse> {\n return new Stream<QueryInvitationsResponse>(({ next, ctx }) => {\n // Push added invitations to the stream.\n this._invitationCreated.on(ctx, (invitation) => {\n next({\n action: QueryInvitationsResponse.Action.ADDED,\n type: QueryInvitationsResponse.Type.CREATED,\n invitations: [invitation],\n });\n });\n\n this._invitationAccepted.on(ctx, (invitation) => {\n next({\n action: QueryInvitationsResponse.Action.ADDED,\n type: QueryInvitationsResponse.Type.ACCEPTED,\n invitations: [invitation],\n });\n });\n\n // Push removed invitations to the stream.\n this._removedCreated.on(ctx, (invitation) => {\n next({\n action: QueryInvitationsResponse.Action.REMOVED,\n type: QueryInvitationsResponse.Type.CREATED,\n invitations: [invitation],\n });\n });\n\n this._removedAccepted.on(ctx, (invitation) => {\n next({\n action: QueryInvitationsResponse.Action.REMOVED,\n type: QueryInvitationsResponse.Type.ACCEPTED,\n invitations: [invitation],\n });\n });\n\n // Push existing invitations to the stream.\n next({\n action: QueryInvitationsResponse.Action.ADDED,\n type: QueryInvitationsResponse.Type.CREATED,\n invitations: Array.from(this._createInvitations.values()).map((invitation) => invitation.get()),\n });\n\n next({\n action: QueryInvitationsResponse.Action.ADDED,\n type: QueryInvitationsResponse.Type.ACCEPTED,\n invitations: Array.from(this._acceptInvitations.values()).map((invitation) => invitation.get()),\n });\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { createAdmissionCredentials, getCredentialAssertion } from '@dxos/credentials';\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, SigningContext } 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 { Event } from '@dxos/async';\nimport { Stream } from '@dxos/codec-protobuf';\nimport { log, LogEntry as NaturalLogEntry, LogProcessor, shouldLog } from '@dxos/log';\nimport { LoggingService, LogEntry, QueryLogsRequest } from '@dxos/protocols/proto/dxos/client/services';\n\n/**\n * Logging service used to spy on logs of the host.\n */\nexport class LoggingServiceImpl implements LoggingService {\n private readonly _logs = new Event<NaturalLogEntry>();\n\n async open() {\n log.runtimeConfig.processors.push(this._logProcessor);\n }\n\n async close() {\n const index = log.runtimeConfig.processors.findIndex((processor) => processor === this._logProcessor);\n log.runtimeConfig.processors.splice(index, 1);\n }\n\n queryLogs(request: QueryLogsRequest): Stream<LogEntry> {\n const filters = request.filters?.length ? request.filters : undefined;\n return new Stream<LogEntry>(({ ctx, next }) => {\n const handler = (entry: NaturalLogEntry) => {\n // Prevent logging feedback loop from logging service.\n if (\n entry.meta?.file.includes('logging-service') ||\n (entry.context &&\n Object.values(entry.context).some((value) => typeof value === 'string' && value.includes('LoggingService')))\n ) {\n return;\n }\n\n if (shouldLog(entry, filters)) {\n next(jsonify(entry));\n }\n };\n\n ctx.onDispose(() => {\n this._logs.off(handler);\n });\n\n this._logs.on(handler);\n });\n }\n\n private _logProcessor: LogProcessor = (_config, entry) => {\n this._logs.emit(entry);\n };\n}\n\n/**\n * Recursively converts an object into a JSON-compatible object.\n */\nconst jsonify = (value: any, handles = new WeakSet<any>()): any => {\n if (typeof value === 'function') {\n return null;\n } else if (typeof value === 'object' && value !== null) {\n if (handles.has(value)) {\n return null;\n }\n handles.add(value);\n\n if (Array.isArray(value)) {\n return value.map((x) => jsonify(x, handles));\n } else {\n if (typeof value.toJSON === 'function') {\n return value.toJSON();\n }\n const res: any = {};\n for (const key of Object.keys(value)) {\n res[key] = jsonify(value[key], handles);\n }\n return res;\n }\n } else {\n return value;\n }\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { SignalManager } from '@dxos/messaging';\nimport { NetworkManager } from '@dxos/network-manager';\nimport { NetworkService, NetworkStatus, UpdateConfigRequest } from '@dxos/protocols/proto/dxos/client/services';\n\nexport class NetworkServiceImpl implements NetworkService {\n constructor(private readonly networkManager: NetworkManager, private readonly signalManager: SignalManager) {}\n\n queryStatus() {\n return new Stream<NetworkStatus>(({ next }) => {\n const update = () => {\n next({\n swarm: this.networkManager.connectionState,\n signaling: this.signalManager.getStatus().map(({ host, state }) => ({ server: host, state })),\n });\n };\n\n const unsubscribeSwarm = this.networkManager.connectionStateChanged.on(() => update());\n const unsubscribeSignal = this.signalManager.statusChanged.on(() => update());\n update();\n\n return () => {\n unsubscribeSwarm();\n unsubscribeSignal();\n };\n });\n }\n\n async updateConfig(request: UpdateConfigRequest) {\n await this.networkManager.setConnectionState(request.swarm);\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event, synchronized, trackLeaks } from '@dxos/async';\nimport { cancelWithContext, Context } from '@dxos/context';\nimport { CredentialSigner, getCredentialAssertion } from '@dxos/credentials';\nimport { DataServiceSubscriptions, MetadataStore, Space, SpaceManager } 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 { SpaceState } from '@dxos/protocols/proto/dxos/client/services';\nimport { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { SpaceMetadata } from '@dxos/protocols/proto/dxos/echo/metadata';\nimport { Credential, ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { 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';\nimport { spaceGenesis } from './genesis';\n\nexport interface SigningContext {\n identityKey: PublicKey;\n deviceKey: PublicKey;\n credentialSigner: CredentialSigner; // TODO(burdon): Already has keyring.\n recordCredential: (credential: Credential) => Promise<void>;\n profile?: ProfileDocument;\n}\n\nexport type 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\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 _feedStore: FeedStore<FeedMessage>,\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.open', trace.begin({ id: this._instanceId }));\n await this._metadataStore.load();\n log('metadata loaded', { spaces: this._metadataStore.spaces.length });\n\n for (const spaceMetadata of this._metadataStore.spaces) {\n try {\n log('load space', { spaceMetadata });\n const space = await this._constructSpace(spaceMetadata);\n space.initializeDataPipelineAsync();\n } catch (err) {\n log.error('Error loading space', { spaceMetadata, err });\n }\n }\n\n this._isOpen = true;\n this.updated.emit();\n log.trace('dxos.echo.data-space-manager.open', trace.end({ id: this._instanceId }));\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\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', space.snapshotManager.objectSync.createExtension());\n session.addExtension('dxos.mesh.teleport.notarization', dataSpace.notarizationPlugin.createExtension());\n },\n memberKey: this._signingContext.identityKey,\n });\n controlFeed && space.setControlFeed(controlFeed);\n dataFeed && space.setDataFeed(dataFeed);\n\n const dataSpace = new DataSpace({\n inner: space,\n metadataStore: this._metadataStore,\n gossip,\n presence,\n keyring: this._keyring,\n feedStore: this._feedStore,\n signingContext: this._signingContext,\n callbacks: {\n beforeReady: async () => {\n log('before space ready', { space: space.key });\n this._dataServiceSubscriptions.registerSpace(\n space.key,\n dataSpace.dataPipeline.databaseHost!.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 cache: metadata.cache,\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 { AUTH_TIMEOUT } from '@dxos/client-protocol';\nimport { cancelWithContext, Context } from '@dxos/context';\nimport { CredentialConsumer } from '@dxos/credentials';\nimport { timed } from '@dxos/debug';\nimport { MetadataStore, Space, createMappedFeedWriter, DataPipeline } 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 { SpaceState, Space as SpaceProto } from '@dxos/protocols/proto/dxos/client/services';\nimport { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { SpaceCache } from '@dxos/protocols/proto/dxos/echo/metadata';\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 { SigningContext } from './data-space-manager';\nimport { NotarizationPlugin } from './notarization-plugin';\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 metadataStore: MetadataStore;\n gossip: Gossip;\n presence: Presence;\n keyring: Keyring;\n feedStore: FeedStore<FeedMessage>;\n signingContext: SigningContext;\n callbacks?: DataSpaceCallbacks;\n cache?: SpaceCache;\n};\n\n@trackLeaks('open', 'close')\nexport class DataSpace {\n private readonly _ctx = new Context();\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 private readonly _cache?: SpaceCache;\n\n private _state = SpaceState.CLOSED;\n\n /**\n * Error for _state === SpaceState.ERROR.\n */\n public error: Error | undefined = undefined;\n\n public readonly authVerifier: TrustedKeySetAuthVerifier;\n public readonly stateUpdate = new Event();\n\n public metrics: SpaceProto.Metrics = {};\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\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 this._cache = params.cache;\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._inner.dataPipeline;\n }\n\n get presence() {\n return this._presence;\n }\n\n get notarizationPlugin() {\n return this._notarizationPluginConsumer.processor;\n }\n\n get cache() {\n return this._cache;\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 this.metrics.open = new Date();\n }\n\n async close() {\n this._state = SpaceState.CLOSED;\n await this._ctx.dispose();\n\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 this.metrics.pipelineInitBegin = new Date();\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 this._state = SpaceState.ERROR;\n this.error = err as Error;\n this.stateUpdate.emit();\n } finally {\n this.metrics.ready = new Date();\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 this.metrics.controlPipelineReady = new Date();\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._inner.initializeDataPipeline();\n\n this.metrics.dataPipelineOpen = new Date();\n\n // Wait for the first epoch.\n await cancelWithContext(this._ctx, this._inner.dataPipeline.ensureEpochInitialized());\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._inner.dataPipeline.pipelineState!.waitUntilReachedTargetTimeframe({\n ctx: this._ctx,\n breakOnStall: false,\n });\n\n this.metrics.dataPipelineReady = new Date();\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 async createEpoch() {\n const epoch = await this.dataPipeline.createEpoch();\n\n await this.inner.controlPipeline.writer.write({\n credential: {\n credential: await this._signingContext.credentialSigner.createCredential({\n subject: this.key,\n assertion: {\n '@type': 'dxos.halo.credentials.Epoch',\n ...epoch,\n },\n }),\n },\n });\n\n for (const feed of this.inner.dataPipeline.pipelineState?.feeds ?? []) {\n const indexBeforeEpoch = epoch.timeframe.get(feed.key);\n if (indexBeforeEpoch) {\n await feed.clear(0, indexBeforeEpoch + 1);\n }\n }\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 { createCredential } from '@dxos/credentials';\nimport { failUndefined } from '@dxos/debug';\nimport { Space } from '@dxos/echo-pipeline';\nimport { Keyring } from '@dxos/keyring';\nimport { AdmittedFeed, SpaceMember } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { Timeframe } from '@dxos/timeframe';\n\nimport { SigningContext } from './data-space-manager';\n\nexport const spaceGenesis = async (keyring: Keyring, signingContext: SigningContext, space: Space) => {\n // TODO(dmaretskyi): Find a way to reconcile with credential generator.\n const credentials = [\n await createCredential({\n signer: keyring,\n issuer: space.key,\n subject: space.key,\n assertion: {\n '@type': 'dxos.halo.credentials.SpaceGenesis',\n spaceKey: space.key,\n },\n }),\n\n await createCredential({\n signer: keyring,\n issuer: space.key,\n subject: signingContext.identityKey,\n assertion: {\n '@type': 'dxos.halo.credentials.SpaceMember',\n spaceKey: space.key,\n role: SpaceMember.Role.ADMIN,\n profile: signingContext.profile,\n genesisFeedKey: space.controlFeedKey ?? failUndefined(),\n },\n }),\n\n await signingContext.credentialSigner.createCredential({\n subject: space.controlFeedKey ?? failUndefined(),\n assertion: {\n '@type': 'dxos.halo.credentials.AdmittedFeed',\n spaceKey: space.key,\n identityKey: signingContext.identityKey,\n deviceKey: signingContext.deviceKey,\n designation: AdmittedFeed.Designation.CONTROL,\n },\n }),\n\n await signingContext.credentialSigner.createCredential({\n subject: space.dataFeedKey ?? failUndefined(),\n assertion: {\n '@type': 'dxos.halo.credentials.AdmittedFeed',\n spaceKey: space.key,\n identityKey: signingContext.identityKey,\n deviceKey: signingContext.deviceKey,\n designation: AdmittedFeed.Designation.DATA,\n },\n }),\n\n await signingContext.credentialSigner.createCredential({\n subject: space.key ?? failUndefined(),\n assertion: {\n '@type': 'dxos.halo.credentials.Epoch',\n number: 0,\n previousId: undefined,\n timeframe: new Timeframe(),\n snapshotCid: undefined,\n },\n }),\n ];\n\n for (const credential of credentials) {\n await space.controlPipeline.writer.write({\n credential: { credential },\n });\n }\n\n return credentials;\n};\n", "//\n// Copyright 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 { encodeError } from '@dxos/protocols';\nimport {\n CreateEpochRequest,\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 { Provider, humanize } 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 async createEpoch({ spaceKey }: CreateEpochRequest) {\n const dataSpaceManager = await this._getDataSpaceManager();\n const space = dataSpaceManager.spaces.get(spaceKey) ?? raise(new SpaceNotFoundError(spaceKey));\n await space.createEpoch();\n }\n\n private _transformSpace(space: DataSpace): Space {\n return {\n spaceKey: space.key,\n state: space.state,\n error: space.error ? encodeError(space.error) : undefined,\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 cache: space.cache,\n metrics: space.metrics,\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 { PROXY_CONNECTION_TIMEOUT } from '@dxos/client-protocol';\nimport { Config } from '@dxos/config';\nimport { log, logInfo } from '@dxos/log';\nimport { MemorySignalManager, MemorySignalManagerContext, WebsocketSignalManager } from '@dxos/messaging';\nimport { createWebRTCTransportFactory, TransportFactory } from '@dxos/network-manager';\nimport { RpcPort } from '@dxos/rpc';\nimport { getAsyncValue, MaybePromise, 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 config: Config | Provider<MaybePromise<Config>>;\n origin: string;\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: IFrameHostRuntimeParams['config'];\n private readonly _ready = new Trigger<Error | undefined>();\n\n private readonly _appPort: RpcPort;\n private readonly _shellPort?: RpcPort;\n private _config!: Config;\n private _transportFactory!: TransportFactory;\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({ config, origin, appPort, shellPort }: IFrameHostRuntimeParams) {\n this._configProvider = config;\n this.origin = origin;\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 this._transportFactory = createWebRTCTransportFactory({\n iceServers: this._config.get('runtime.services.ice'),\n });\n const signals = this._config.get('runtime.services.signaling');\n this._clientServices = new LocalClientServices({\n lockKey: LOCK_KEY,\n config: this._config,\n signalManager: signals\n ? new WebsocketSignalManager(signals)\n : new MemorySignalManager(new MemorySignalManagerContext()), // TODO(dmaretskyi): Inject this context.\n transportFactory: this._transportFactory,\n });\n\n const middleware: Pick<ClientRpcServerParams, 'handleCall' | 'handleStream'> = {\n handleCall: async (method, params, handler) => {\n const error = await this._ready.wait({ timeout: PROXY_CONNECTION_TIMEOUT });\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: PROXY_CONNECTION_TIMEOUT });\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-protocol';\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-protocol';\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 { Trigger } from '@dxos/async';\nimport { iframeServiceBundle, workerServiceBundle, WorkerServiceBundle } from '@dxos/client-protocol';\nimport { Config } from '@dxos/config';\nimport { RemoteServiceConnectionError } from '@dxos/errors';\nimport { log } from '@dxos/log';\nimport { WebRTCTransportService } from '@dxos/network-manager';\nimport { BridgeService } from '@dxos/protocols/proto/dxos/mesh/bridge';\nimport { createProtoRpcPeer, ProtoRpcPeer, RpcPort } from '@dxos/rpc';\nimport { getAsyncValue, MaybePromise, Provider } from '@dxos/util';\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 config: Config | Provider<MaybePromise<Config>>;\n systemPort: RpcPort;\n shellPort?: RpcPort;\n};\n\n/**\n * Manages the client connection to the shared worker.\n */\nexport class IFrameProxyRuntime {\n private readonly _id = String(Math.floor(Math.random() * 1000000));\n private readonly _configProvider: IFrameProxyRuntimeParams['config'];\n private readonly _systemPort: RpcPort;\n private readonly _shellPort?: RpcPort;\n private _release = new Trigger();\n private _config!: Config;\n private _transportService!: BridgeService;\n private _systemRpc!: ProtoRpcPeer<WorkerServiceBundle>;\n private _shellRuntime?: ShellRuntimeImpl;\n\n constructor({ config, systemPort, shellPort }: IFrameProxyRuntimeParams) {\n this._configProvider = config;\n this._systemPort = systemPort;\n this._shellPort = shellPort;\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 this._config = await getAsyncValue(this._configProvider);\n\n this._transportService = new WebRTCTransportService({\n iceServers: this._config.get('runtime.services.ice'),\n });\n\n this._systemRpc = createProtoRpcPeer({\n requested: workerServiceBundle,\n exposed: iframeServiceBundle,\n handlers: {\n BridgeService: this._transportService,\n },\n port: this._systemPort,\n timeout: 200,\n });\n\n let lockKey: string | undefined;\n if (typeof navigator !== 'undefined') {\n lockKey = this._lockKey(origin);\n this._release = new Trigger();\n const ready = new Trigger();\n void navigator.locks.request(lockKey, async () => {\n ready.wake();\n await this._release.wait();\n });\n await ready.wait();\n }\n\n try {\n await this._systemRpc.open();\n await this._systemRpc.rpc.WorkerService.start({ origin, lockKey });\n } catch (err) {\n log.catch(err);\n throw new RemoteServiceConnectionError('Failed to connect to worker');\n }\n await this._shellRuntime?.open();\n }\n\n async close() {\n this._release.wake();\n await this._shellRuntime?.close();\n await this._systemRpc.rpc.WorkerService.stop();\n await this._systemRpc.close();\n }\n\n private _lockKey(origin: string) {\n return `${origin}-${this._id}`;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { asyncTimeout, Trigger } from '@dxos/async';\nimport { RESOURCE_LOCK_TIMEOUT } from '@dxos/client-protocol';\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(), RESOURCE_LOCK_TIMEOUT);\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 { 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 signals = this._config.get('runtime.services.signaling');\n this._clientServices.initialize({\n config: this._config,\n signalManager: signals\n ? new WebsocketSignalManager(signals)\n : new MemorySignalManager(new MemorySignalManagerContext()), // TODO(dmaretskyi): Inject this context.\n transportFactory: this._transportFactory,\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 log('reconnecting webrtc...');\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 {\n iframeServiceBundle,\n IframeServiceBundle,\n PROXY_CONNECTION_TIMEOUT,\n workerServiceBundle,\n} from '@dxos/client-protocol';\nimport { log, logInfo } from '@dxos/log';\nimport { BridgeService } from '@dxos/protocols/proto/dxos/mesh/bridge';\nimport { createProtoRpcPeer, ProtoRpcPeer, RpcPort } from '@dxos/rpc';\nimport { Callback, MaybePromise } 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};\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\n public readonly onClose = new Callback<() => Promise<void>>();\n\n @logInfo\n public origin?: string;\n\n @logInfo\n public lockKey?: string;\n\n public bridgeService?: BridgeService;\n\n constructor({ serviceHost, systemPort, appPort, shellPort, readySignal }: WorkerSessionParams) {\n assert(serviceHost);\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: PROXY_CONNECTION_TIMEOUT });\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: PROXY_CONNECTION_TIMEOUT });\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.lockKey = request.lockKey;\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: PROXY_CONNECTION_TIMEOUT });\n if (this.lockKey) {\n void this._afterLockReleases(this.lockKey, () => this.close());\n }\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 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 private _afterLockReleases(lockKey: string, callback: () => MaybePromise<void>): Promise<void> {\n return navigator.locks\n .request(lockKey, () => {\n // No-op.\n })\n .then(callback);\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\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 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 { SignalManager } from '@dxos/messaging';\nimport { ModelFactory } from '@dxos/model-factory';\nimport { NetworkManager } from '@dxos/network-manager';\nimport { STORAGE_VERSION, trace } from '@dxos/protocols';\nimport { Invitation } from '@dxos/protocols/proto/dxos/client/services';\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, SigningContext } 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 signalManager: SignalManager,\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 metadataStore: this.metadataStore,\n modelFactory: this.modelFactory,\n snapshotStore: this.snapshotStore,\n });\n\n this.identityManager = new IdentityManager(\n this.metadataStore,\n this.keyring,\n this.feedStore,\n this.spaceManager\n );\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(\n Invitation.Kind.DEVICE,\n () =>\n new DeviceInvitationProtocol(\n this.keyring,\n () => this.identityManager.identity ?? failUndefined(),\n this._acceptIdentity.bind(this)\n )\n );\n }\n\n async open() {\n log.trace('dxos.sdk.service-context.open', trace.begin({ id: this._instanceId }));\n\n await this._checkStorageVersion();\n\n log('opening...');\n await this.signalManager.open();\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 log.trace('dxos.sdk.service-context.open', trace.end({ id: this._instanceId }));\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 await this.signalManager.close();\n this.dataServiceSubscriptions.clear();\n log('closed');\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 private async _checkStorageVersion() {\n await this.metadataStore.load();\n if (this.metadataStore.version !== STORAGE_VERSION) {\n log.error('Invalid storage version', { current: this.metadataStore.version, expected: STORAGE_VERSION });\n // TODO(mykola): Migrate storage to a new version if incompatibility is detected.\n await this.metadataStore.clear();\n }\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.feedStore,\n );\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-protocol';\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 { createDefaultModelFactory } from '@dxos/client-protocol';\nimport { Config } from '@dxos/config';\nimport { createCredentialSignerWithChain, CredentialGenerator } from '@dxos/credentials';\nimport { SnapshotStore, DataPipeline, MetadataStore, SpaceManager, valueEncoding } 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';\nimport { SigningContext } from '../spaces';\n\n//\n// TODO(burdon): Replace with test builder.\n//\n\nexport const createServiceHost = (config: Config, signalManagerContext: MemorySignalManagerContext) => {\n return new ClientServicesHost({\n config,\n signalManager: new MemorySignalManager(signalManagerContext),\n transportFactory: MemoryTransportFactory,\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 signalManager = new MemorySignalManager(signalContext);\n const networkManager = new NetworkManager({\n signalManager,\n transportFactory: MemoryTransportFactory,\n });\n\n const modelFactory = createDefaultModelFactory();\n return new ServiceContext(storage, networkManager, signalManager, 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 TestBuilder {\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 metadataStore: this.metadataStore,\n modelFactory: createDefaultModelFactory(),\n snapshotStore: this.snapshotStore,\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"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["createMockCredential", "signer", "issuer", "createCredential", "subject", "PublicKey", "Buffer", "from", "assertion", "payload", "value", "import_node_assert", "import_async", "import_services", "import_node_assert", "import_async", "import_client_protocol", "import_echo_pipeline", "import_keys", "import_log", "import_messaging", "import_network_manager", "import_protocols", "import_services", "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", "subscriptions", "EventSubscriptions", "feedMap", "ComplexMap", "PublicKey", "hash", "update", "feeds", "filter", "feed", "length", "some", "feedKey", "equals", "key", "forEach", "has", "set", "on", "add", "off", "Array", "from", "values", "map", "properties", "diskUsage", "core", "byteLength", "feedOpened", "clear", "subscribeToFeedBlocks", "maxBlocks", "timeout", "setTimeout", "getFeed", "iterator", "FeedIterator", "open", "blocks", "block", "push", "slice", "close", "clearTimeout", "import_async", "import_codec_protobuf", "subscribeToKeyringKeys", "keyring", "Stream", "next", "ctx", "update", "keys", "list", "keysUpdate", "on", "scheduleTask", "import_codec_protobuf", "import_keys", "subscribeToNetworkStatus", "signalManager", "Stream", "next", "close", "update", "status", "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", "getStorageInfo", "storageUsage", "context", "storage", "getDiskInfo", "used", "navigatorInfo", "navigator", "estimate", "undefined", "type", "originUsage", "usage", "usageQuota", "quota", "getSnapshots", "snapshots", "snapshotStore", "listSnapshots", "resetStorage", "enableDebugLogging", "disableDebugLogging", "subscribeToKeyringKeys", "keyring", "subscribeToCredentialMessages", "subscribeToSpaces", "subscribeToItems", "subscribeToFeeds", "feedStore", "subscribeToFeedBlocks", "getSpaceSnapshot", "saveSpaceSnapshot", "clearSnapshots", "getNetworkPeers", "subscribeToNetworkTopics", "subscribeToSignalStatus", "subscribeToNetworkStatus", "signalManager", "subscribeToSignal", "subscribeToSwarmInfo", "networkManager", "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", "Identity", "constructor", "space", "signer", "identityKey", "deviceKey", "stateUpdate", "Event", "_signer", "_deviceStateMachine", "spaceState", "registerProcessor", "DeviceStateMachine", "onUpdate", "emit", "_profileStateMachine", "ProfileStateMachine", "authVerifier", "TrustedKeySetAuthVerifier", "trustedKeysProvider", "authorizedDeviceKeys", "update", "authTimeout", "AUTH_TIMEOUT", "processor", "open", "close", "ready", "deviceChainReady", "wait", "controlPipeline", "state", "waitUntilReachedTargetTimeframe", "timeout", "LOAD_CONTROL_FEEDS_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", "identity", "_identity", "open", "traceId", "PublicKey", "random", "toHex", "log", "trace", "begin", "id", "load", "identityRecord", "getIdentityRecord", "_constructIdentity", "ready", "identityKey", "displayName", "profileDocument", "emit", "end", "close", "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", "memberKey", "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_client_protocol", "import_context", "import_credentials", "import_errors", "import_keys", "import_log", "import_protocols", "import_services", "import_invitations", "import_node_assert", "import_async", "import_context", "import_keys", "import_log", "import_protocols", "OPTIONS_TIMEOUT", "InvitationHostExtension", "RpcExtension", "constructor", "_callbacks", "requested", "InvitationHostService", "schema", "getService", "exposed", "_ctx", "Context", "_remoteOptionsTrigger", "Trigger", "getHandlers", "options", "assert", "_remoteOptions", "wake", "introduce", "request", "traceId", "PublicKey", "random", "toHex", "log", "trace", "begin", "id", "response", "end", "authenticate", "data", "admit", "onOpen", "context", "rpc", "role", "Options", "Role", "HOST", "cancelWithContext", "wait", "timeout", "GUEST", "InvalidInvitationExtensionRoleError", "undefined", "expected", "remoteOptions", "err", "onError", "onClose", "dispose", "InvitationGuestExtension", "Error", "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", "traceId", "trace", "begin", "id", "CONNECTED", "wait", "guest", "SUCCESS", "end", "TimeoutError", "TIMEOUT", "MULTIUSE", "sleep", "ON_CLOSE_DELAY", "InvalidInvitationExtensionRoleError", "topic", "swarmConnection", "joinSwarm", "peerId", "protocolProvider", "createTeleportProtocolFactory", "teleport", "addExtension", "topology", "StarTopology", "close", "CONNECTING", "observable", "CancellableInvitationObservable", "initialInvitation", "subscriber", "onCancel", "CANCELLED", "acceptInvitation", "authenticated", "currentState", "setState", "newData", "warn", "connectionCount", "InvitationGuestExtension", "extensionCtx", "raise", "introductionResponse", "rpc", "InvitationHostService", "createIntroduction", "response", "attempt", "AUTHENTICATING", "reset", "createAdmissionRequest", "result", "accept", "AuthenticatingInvitationObservable", "onAuthenticate", "import_node_assert", "import_async", "import_codec_protobuf", "import_log", "import_services", "InvitationsServiceImpl", "constructor", "_invitationsHandler", "_getHandler", "_createInvitations", "Map", "_acceptInvitations", "_invitationCreated", "Event", "_invitationAccepted", "_removedCreated", "_removedAccepted", "getLoggingContext", "createInvitation", "options", "invitation", "existingInvitation", "get", "invitationId", "handler", "set", "emit", "Stream", "next", "close", "subscribe", "err", "delete", "acceptInvitation", "authenticate", "authCode", "log", "assert", "observable", "warn", "cancelInvitation", "created", "accepted", "cancel", "queryInvitations", "ctx", "on", "action", "QueryInvitationsResponse", "Action", "ADDED", "type", "Type", "CREATED", "invitations", "ACCEPTED", "REMOVED", "Array", "from", "values", "map", "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_async", "import_codec_protobuf", "import_log", "LoggingServiceImpl", "_logs", "Event", "_logProcessor", "_config", "entry", "emit", "open", "log", "runtimeConfig", "processors", "push", "close", "index", "findIndex", "processor", "splice", "queryLogs", "request", "filters", "length", "undefined", "Stream", "ctx", "next", "handler", "_a", "meta", "file", "includes", "context", "Object", "values", "some", "value", "shouldLog", "jsonify", "onDispose", "off", "on", "handles", "WeakSet", "has", "add", "Array", "isArray", "map", "x", "toJSON", "res", "key", "keys", "import_codec_protobuf", "NetworkServiceImpl", "constructor", "networkManager", "signalManager", "queryStatus", "Stream", "next", "update", "swarm", "connectionState", "signaling", "getStatus", "map", "host", "state", "server", "unsubscribeSwarm", "connectionStateChanged", "on", "unsubscribeSignal", "statusChanged", "updateConfig", "request", "setConnectionState", "import_node_assert", "import_async", "import_context", "import_credentials", "import_keys", "import_log", "import_protocols", "import_services", "import_util", "import_async", "import_client_protocol", "import_context", "import_debug", "import_errors", "import_keys", "import_log", "import_services", "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", "DataSpace", "constructor", "params", "_ctx", "Context", "_state", "SpaceState", "CLOSED", "error", "undefined", "stateUpdate", "Event", "metrics", "_inner", "inner", "on", "emit", "_gossip", "gossip", "_presence", "presence", "_keyring", "keyring", "_feedStore", "feedStore", "_metadataStore", "metadataStore", "_signingContext", "signingContext", "_callbacks", "callbacks", "authVerifier", "TrustedKeySetAuthVerifier", "trustedKeysProvider", "ComplexSet", "PublicKey", "hash", "Array", "from", "spaceState", "members", "keys", "update", "authTimeout", "AUTH_TIMEOUT", "_notarizationPluginConsumer", "registerProcessor", "NotarizationPlugin", "_cache", "cache", "key", "isOpen", "state", "dataPipeline", "notarizationPlugin", "processor", "open", "INACTIVE", "Date", "close", "dispose", "destroy", "postMessage", "channel", "message", "listen", "callback", "initializeDataPipelineAsync", "scheduleTask", "pipelineInitBegin", "initializeDataPipeline", "err", "CancelledError", "log", "ERROR", "ready", "SystemError", "INITIALIZING", "controlPipeline", "waitUntilReachedTargetTimeframe", "ctx", "breakOnStall", "controlPipelineReady", "_createWritableFeeds", "setWriter", "createMappedFeedWriter", "credential", "writer", "dataPipelineOpen", "cancelWithContext", "ensureEpochInitialized", "pipelineState", "dataPipelineReady", "beforeReady", "READY", "afterReady", "credentials", "controlFeedKey", "controlFeed", "openFeed", "createKey", "writable", "setControlFeed", "push", "credentialSigner", "createCredential", "subject", "assertion", "spaceKey", "deviceKey", "identityKey", "designation", "AdmittedFeed", "Designation", "CONTROL", "dataFeedKey", "dataFeed", "setDataFeed", "DATA", "length", "notarize", "timeout", "setWritableFeedKeys", "createEpoch", "epoch", "write", "feed", "feeds", "indexBeforeEpoch", "timeframe", "get", "clear", "timed", "trackLeaks", "import_credentials", "import_debug", "spaceGenesis", "keyring", "signingContext", "space", "credentials", "createCredential", "signer", "issuer", "key", "subject", "assertion", "spaceKey", "identityKey", "role", "SpaceMember", "Role", "ADMIN", "profile", "genesisFeedKey", "controlFeedKey", "failUndefined", "credentialSigner", "deviceKey", "designation", "AdmittedFeed", "Designation", "CONTROL", "dataFeedKey", "DATA", "number", "previousId", "undefined", "timeframe", "Timeframe", "snapshotCid", "credential", "controlPipeline", "writer", "write", "__decorate", "DataSpaceManager", "constructor", "_spaceManager", "_metadataStore", "_dataServiceSubscriptions", "_keyring", "_signingContext", "_feedStore", "_ctx", "Context", "updated", "Event", "_spaces", "ComplexMap", "PublicKey", "hash", "_isOpen", "_instanceId", "random", "toHex", "spaces", "open", "log", "trace", "begin", "id", "load", "length", "spaceMetadata", "space", "_constructSpace", "initializeDataPipelineAsync", "err", "error", "emit", "end", "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", "controlFeed", "openFeed", "writable", "dataFeed", "constructSpace", "swarmIdentity", "peerKey", "credentialProvider", "createAuthProvider", "credentialSigner", "credentialAuthenticator", "deferFunction", "dataSpace", "authVerifier", "verifier", "onNetworkConnection", "session", "addExtension", "createExtension", "remotePeerId", "snapshotManager", "objectSync", "notarizationPlugin", "memberKey", "setControlFeed", "setDataFeed", "DataSpace", "metadataStore", "keyring", "feedStore", "signingContext", "callbacks", "beforeReady", "registerSpace", "dataPipeline", "databaseHost", "createDataServiceHost", "afterReady", "cache", "controlPipeline", "setTargetTimeframe", "set", "synchronized", "trackLeaks", "import_async", "import_codec_protobuf", "import_debug", "import_echo_pipeline", "import_log", "import_protocols", "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", "createEpoch", "key", "error", "encodeError", "undefined", "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", "cache", "metrics", "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_client_protocol", "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_protocol", "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", "config", "origin", "appPort", "shellPort", "_ready", "Trigger", "_configProvider", "_appPort", "_shellPort", "_shellRuntime", "ShellRuntimeImpl", "services", "_clientServices", "shell", "start", "log", "_config", "getAsyncValue", "_transportFactory", "createWebRTCTransportFactory", "iceServers", "get", "signals", "LocalClientServices", "lockKey", "signalManager", "WebsocketSignalManager", "MemorySignalManager", "MemorySignalManagerContext", "transportFactory", "middleware", "handleCall", "method", "params", "handler", "error", "wait", "timeout", "PROXY_CONNECTION_TIMEOUT", "handleStream", "_clientRpc", "ClientRpcServer", "serviceRegistry", "host", "port", "Promise", "all", "open", "wake", "undefined", "err", "catch", "stop", "close", "logInfo", "import_async", "import_client_protocol", "import_errors", "import_log", "import_network_manager", "import_rpc", "import_util", "import_async", "import_client_protocol", "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", "RESOURCE_LOCK_TIMEOUT", "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_protocol", "import_log", "import_rpc", "import_util", "__decorate", "WorkerSession", "constructor", "serviceHost", "systemPort", "appPort", "shellPort", "readySignal", "_startTrigger", "Trigger", "onClose", "Callback", "assert", "_serviceHost", "middleware", "handleCall", "method", "params", "handler", "error", "wait", "timeout", "PROXY_CONNECTION_TIMEOUT", "handleStream", "_clientRpc", "ClientRpcServer", "serviceRegistry", "port", "_shellClientRpc", "_iframeRpc", "createProtoRpcPeer", "requested", "iframeServiceBundle", "exposed", "workerServiceBundle", "handlers", "WorkerService", "start", "request", "origin", "lockKey", "wake", "stop", "setTimeout", "close", "err", "log", "catch", "bridgeService", "rpc", "BridgeService", "open", "info", "Promise", "all", "_maybeOpenShell", "_afterLockReleases", "callIfSet", "asyncTimeout", "callback", "navigator", "locks", "then", "logInfo", "import_node_assert", "import_async", "import_credentials", "import_debug", "import_echo_pipeline", "import_feed_store", "import_keys", "import_log", "import_protocols", "import_services", "ServiceContext", "constructor", "storage", "networkManager", "signalManager", "modelFactory", "initialized", "Trigger", "dataServiceSubscriptions", "DataServiceSubscriptions", "_handlerFactories", "Map", "_instanceId", "PublicKey", "random", "toHex", "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", "_checkStorageVersion", "_initialize", "end", "close", "_deviceSpaceSync", "dataSpaceManager", "clear", "createIdentity", "params", "getInvitationHandler", "invitation", "get", "kind", "assert", "acceptIdentity", "load", "version", "STORAGE_VERSION", "error", "current", "expected", "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", "transportFactory", "signalManager", "connectionLog", "storage", "lockKey", "_statusUpdate", "Event", "_opening", "_open", "_storage", "_modelFactory", "initialize", "_resourceLock", "VaultResourceLock", "onAcquire", "open", "onRelease", "close", "undefined", "_systemService", "SystemServiceImpl", "_config", "statusUpdate", "getCurrentStatus", "isOpen", "SystemStatus", "ACTIVE", "INACTIVE", "onUpdateStatus", "status", "acquire", "release", "onReset", "reset", "_loggingService", "LoggingServiceImpl", "_serviceRegistry", "ServiceRegistry", "clientServiceBundle", "SystemService", "serviceRegistry", "descriptors", "services", "options", "assert", "createStorageObjects", "get", "createWebRTCTransportFactory", "iceServers", "WebsocketSignalManager", "_signalManager", "_networkManager", "NetworkManager", "log", "traceId", "PublicKey", "random", "toHex", "trace", "begin", "id", "_serviceContext", "ServiceContext", "setServices", "IdentityService", "IdentityServiceImpl", "InvitationsService", "InvitationsServiceImpl", "invitations", "invitation", "getInvitationHandler", "DevicesService", "DevicesServiceImpl", "identityManager", "SpacesService", "SpacesServiceImpl", "spaceManager", "dataServiceSubscriptions", "initialized", "wait", "dataSpaceManager", "DataService", "DataServiceImpl", "NetworkService", "NetworkServiceImpl", "networkManager", "LoggingService", "DevtoolsHost", "DevtoolsServiceImpl", "events", "DevtoolsHostEvents", "context", "emit", "deviceKey", "identity", "end", "LocalClientServices", "constructor", "params", "_host", "ClientServicesHost", "descriptors", "services", "host", "open", "close", "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", "ServiceContext", "hostHandler", "getInvitationHandler", "Kind", "SPACE", "invitations", "guestHandler", "import_client_protocol", "import_credentials", "import_echo_pipeline", "import_feed_store", "import_keyring", "import_messaging", "import_network_manager", "import_random_access_storage", "createServiceHost", "config", "signalManagerContext", "ClientServicesHost", "signalManager", "MemorySignalManager", "transportFactory", "MemoryTransportFactory", "createServiceContext", "signalContext", "MemorySignalManagerContext", "storage", "createStorage", "type", "StorageType", "RAM", "networkManager", "NetworkManager", "modelFactory", "createDefaultModelFactory", "ServiceContext", "createPeers", "numPeers", "Promise", "all", "Array", "from", "map", "peer", "open", "createIdentity", "syncItemsLocal", "db1", "db2", "testLocalDatabase", "TestBuilder", "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"]
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nexport * from './credential-utils';\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 2023 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Trigger } from '@dxos/async';\nimport { AuthenticatingInvitationObservable, CancellableInvitationObservable } from '@dxos/client-protocol';\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 InvitationHost = {\n createInvitation(options?: Partial<Invitation>): CancellableInvitationObservable;\n};\n\nexport type InvitationGuest = {\n acceptInvitation(invitation: Invitation): AuthenticatingInvitationObservable;\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 | InvitationHost;\n guest: ServiceContext | InvitationGuest;\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 | InvitationHost,\n options?: Partial<Invitation>,\n): CancellableInvitationObservable => {\n options ??= {\n authMethod: Invitation.AuthMethod.NONE,\n ...(options ?? {}),\n };\n\n if (host instanceof ServiceContext) {\n const hostHandler = host.getInvitationHandler({ kind: Invitation.Kind.SPACE, ...options });\n return host.invitations.createInvitation(hostHandler, options);\n }\n\n return host.createInvitation(options);\n};\n\nconst acceptInvitation = (\n guest: ServiceContext | InvitationGuest,\n invitation: Invitation,\n): AuthenticatingInvitationObservable => {\n invitation = sanitizeInvitation(invitation);\n\n if (guest instanceof ServiceContext) {\n const guestHandler = guest.getInvitationHandler({ kind: invitation.kind });\n return guest.invitations.acceptInvitation(guestHandler, invitation);\n }\n\n return guest.acceptInvitation(invitation);\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event } from '@dxos/async';\nimport { clientServiceBundle, ClientServices, createDefaultModelFactory } from '@dxos/client-protocol';\nimport { Config } from '@dxos/config';\nimport { DataServiceImpl } from '@dxos/echo-pipeline';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { SignalManager, WebsocketSignalManager } from '@dxos/messaging';\nimport { ModelFactory } from '@dxos/model-factory';\nimport { createWebRTCTransportFactory, NetworkManager, TransportFactory } 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 { DevicesServiceImpl } from '../devices';\nimport { DevtoolsServiceImpl, DevtoolsHostEvents } from '../devtools';\nimport { IdentityServiceImpl } from '../identity';\nimport { InvitationsServiceImpl } from '../invitations';\nimport { LoggingServiceImpl } from '../logging';\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 transportFactory?: TransportFactory;\n signalManager?: SignalManager;\n connectionLog?: boolean;\n storage?: Storage;\n lockKey?: string;\n};\n\nexport type InitializeOptions = {\n config?: Config;\n transportFactory?: TransportFactory;\n signalManager?: SignalManager;\n connectionLog?: boolean;\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 private readonly _loggingService: LoggingServiceImpl;\n\n private _config?: Config;\n private readonly _statusUpdate = new Event<void>();\n private readonly _modelFactory: ModelFactory;\n private _signalManager?: SignalManager;\n private _networkManager?: NetworkManager;\n private _storage?: Storage;\n\n _serviceContext!: ServiceContext;\n private _opening = false;\n private _open = false;\n\n constructor({\n config,\n modelFactory = createDefaultModelFactory(),\n // TODO(burdon): Create ApolloLink abstraction (see Client).\n transportFactory,\n signalManager,\n connectionLog,\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, transportFactory, signalManager });\n }\n\n this._resourceLock = lockKey\n ? new VaultResourceLock({\n lockKey,\n onAcquire: () => {\n if (!this._opening) {\n void this.open();\n }\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 await this.reset();\n },\n });\n\n this._loggingService = new LoggingServiceImpl();\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, ...options }: 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 const {\n connectionLog = true,\n transportFactory = createWebRTCTransportFactory({\n iceServers: this._config?.get('runtime.services.ice'),\n }),\n signalManager = new WebsocketSignalManager(this._config?.get('runtime.services.signaling') ?? []),\n } = options;\n this._signalManager = signalManager;\n\n assert(!this._networkManager, 'network manager already set');\n this._networkManager = new NetworkManager({\n log: connectionLog,\n transportFactory,\n signalManager,\n });\n }\n\n async open() {\n if (this._open) {\n return;\n }\n const traceId = PublicKey.random().toHex();\n log.trace('dxos.sdk.client-services-host.open', trace.begin({ id: traceId }));\n\n assert(this._config, 'config not set');\n assert(this._storage, 'storage not set');\n assert(this._signalManager, 'signal manager 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 await this._loggingService.open();\n\n // TODO(wittjosiah): Make re-entrant.\n // TODO(burdon): Break into components.\n this._serviceContext = new ServiceContext(\n this._storage,\n this._networkManager,\n this._signalManager,\n this._modelFactory,\n );\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, this._serviceContext.signalManager),\n\n LoggingService: this._loggingService,\n\n // TODO(burdon): Move to new protobuf definitions.\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 log.trace('dxos.sdk.client-services-host.open', trace.end({ id: traceId }));\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._loggingService.close();\n await this._serviceContext.close();\n this._open = false;\n this._statusUpdate.emit();\n log('closed', { deviceKey });\n }\n\n async reset() {\n const traceId = PublicKey.random().toHex();\n log.trace('dxos.sdk.client-services-host.reset', trace.begin({ id: traceId }));\n\n log('resetting...');\n await this._serviceContext?.close();\n await this._storage!.reset();\n log('reset');\n log.trace('dxos.sdk.client-services-host.reset', trace.end({ id: traceId }));\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';\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 StorageInfo,\n GetSnapshotsResponse,\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 async getStorageInfo(): Promise<StorageInfo> {\n const storageUsage = (await this.params.context.storage.getDiskInfo?.()) ?? { used: 0 };\n\n const navigatorInfo = typeof navigator === 'object' ? await navigator.storage.estimate() : undefined;\n\n return {\n type: this.params.context.storage.type,\n storageUsage: storageUsage.used,\n originUsage: navigatorInfo?.usage ?? 0,\n usageQuota: navigatorInfo?.quota ?? 0,\n };\n }\n\n async getSnapshots(): Promise<GetSnapshotsResponse> {\n return {\n snapshots: await this.params.context.snapshotStore.listSnapshots(),\n };\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({ signalManager: this.params.context.signalManager });\n }\n\n subscribeToSignal(): Stream<SignalResponse> {\n return subscribeToSignal({ signalManager: this.params.context.signalManager });\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 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) => ({\n feedKey: feed.key,\n length: feed.properties.length,\n diskUsage: feed.core.byteLength,\n })),\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 { scheduleTask } from '@dxos/async';\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, ctx }) => {\n const update = async () => {\n next({\n keys: await keyring.list(),\n });\n };\n keyring.keysUpdate.on(ctx, update);\n scheduleTask(ctx, update);\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 { SignalManager } from '@dxos/messaging';\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 = ({ signalManager }: { signalManager: SignalManager }) =>\n new Stream<SubscribeToSignalStatusResponse>(({ next, close }) => {\n const update = () => {\n try {\n const status = signalManager.getStatus();\n next({ servers: status });\n } catch (err: any) {\n close(err);\n }\n };\n\n signalManager.statusChanged.on(() => update());\n update();\n });\n\nexport const subscribeToSignal = ({ signalManager }: { signalManager: SignalManager }) =>\n new Stream<SignalResponse>(({ next }) => {\n const ctx = new Context();\n 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 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 { AUTH_TIMEOUT, LOAD_CONTROL_FEEDS_TIMEOUT } from '@dxos/client-protocol';\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\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: LOAD_CONTROL_FEEDS_TIMEOUT });\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 // 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 const traceId = PublicKey.random().toHex();\n log.trace('dxos.halo.identity-manager.open', trace.begin({ id: traceId }));\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 log.trace('dxos.halo.identity-manager.open', trace.end({ id: traceId }));\n }\n\n async close() {\n await this._identity?.close();\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 onAuthFailure: () => {\n log.warn('auth failure');\n },\n memberKey: identityKey,\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 AuthenticatingInvitationObservable,\n AUTHENTICATION_CODE_LENGTH,\n CancellableInvitationObservable,\n INVITATION_TIMEOUT,\n ON_CLOSE_DELAY,\n} from '@dxos/client-protocol';\nimport { Context } from '@dxos/context';\nimport { generatePasscode } from '@dxos/credentials';\nimport { InvalidInvitationExtensionRoleError } from '@dxos/errors';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { createTeleportProtocolFactory, NetworkManager, StarTopology } from '@dxos/network-manager';\nimport { trace } from '@dxos/protocols';\nimport { Invitation } from '@dxos/protocols/proto/dxos/client/services';\nimport { AuthenticationResponse } from '@dxos/protocols/proto/dxos/halo/invitations';\n\nimport {\n InvitationGuestExtension,\n InvitationHostExtension,\n isAuthenticationRequired,\n MAX_OTP_ATTEMPTS,\n} from './invitation-extension';\nimport { InvitationProtocol } from './invitation-protocol';\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 /**\n * @internal\n */\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 extension = new InvitationHostExtension({\n onStateUpdate: (invitation) => {\n stream.next({ ...invitation, state: Invitation.State.READY_FOR_AUTHENTICATION });\n },\n\n resolveInvitation: async ({ invitationId }) => {\n if (invitationId && invitationId !== invitation.invitationId) {\n return undefined;\n }\n return invitation;\n },\n\n admit: async (admissionRequest) => {\n try {\n const deviceKey = admissionRequest.device?.deviceKey ?? admissionRequest.space?.deviceKey;\n assert(deviceKey);\n const admissionResponse = await protocol.admit(admissionRequest, extension.guestProfile);\n\n // Updating credentials complete.\n extension.completedTrigger.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 const traceId = PublicKey.random().toHex();\n try {\n log.trace('dxos.sdk.invitations-handler.host.onOpen', trace.begin({ id: traceId }));\n log('connected', { ...protocol.toJSON() });\n stream.next({ ...invitation, state: Invitation.State.CONNECTED });\n const deviceKey = await extension.completedTrigger.wait({ timeout });\n log('admitted guest', { guest: deviceKey, ...protocol.toJSON() });\n stream.next({ ...invitation, state: Invitation.State.SUCCESS });\n log.trace('dxos.sdk.invitations-handler.host.onOpen', trace.end({ id: traceId }));\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 log.trace('dxos.sdk.invitations-handler.host.onOpen', trace.error({ id: traceId, error: err }));\n } finally {\n if (type !== Invitation.Type.MULTIUSE) {\n await sleep(ON_CLOSE_DELAY);\n await ctx.dispose();\n }\n }\n });\n },\n onError: (err) => {\n if (err instanceof InvalidInvitationExtensionRoleError) {\n return;\n }\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 },\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 let currentState: Invitation.State;\n const stream = new PushStream<Invitation>();\n const setState = (newData: Partial<Invitation>) => {\n assert(newData.state !== undefined);\n currentState = newData.state;\n stream.next({ ...invitation, ...newData });\n };\n\n const ctx = new Context({\n onError: (err) => {\n if (err instanceof TimeoutError) {\n log('timeout', { ...protocol.toJSON() });\n setState({ 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: (extensionCtx) => {\n extensionCtx.onDispose(async () => {\n log('extension disposed', { currentState });\n if (currentState !== Invitation.State.SUCCESS) {\n stream.error(new Error('Remote peer disconnected.'));\n }\n });\n\n scheduleTask(ctx, async () => {\n const traceId = PublicKey.random().toHex();\n try {\n log.trace('dxos.sdk.invitations-handler.guest.onOpen', trace.begin({ id: traceId }));\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 setState({ 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 setState({ state: Invitation.State.READY_FOR_AUTHENTICATION });\n const authCode = await authenticated.wait({ timeout });\n\n log('sending authentication request');\n setState({ 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 setState({ 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 setState({ ...result, state: Invitation.State.SUCCESS });\n log.trace('dxos.sdk.invitations-handler.guest.onOpen', trace.end({ id: traceId }));\n } catch (err: any) {\n if (err instanceof TimeoutError) {\n log('timeout', { ...protocol.toJSON() });\n setState({ state: Invitation.State.TIMEOUT });\n } else {\n log('auth failed', err);\n stream.error(err);\n }\n log.trace('dxos.sdk.invitations-handler.guest.onOpen', trace.error({ id: traceId, error: err }));\n } finally {\n await ctx.dispose();\n }\n });\n },\n onError: (err) => {\n if (err instanceof InvalidInvitationExtensionRoleError) {\n return;\n }\n if (err instanceof TimeoutError) {\n log('timeout', { ...protocol.toJSON() });\n setState({ state: Invitation.State.TIMEOUT });\n } else {\n log('auth failed', err);\n stream.error(err);\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 setState({ state: Invitation.State.CONNECTING });\n });\n\n const observable = new AuthenticatingInvitationObservable({\n initialInvitation: invitation,\n subscriber: stream.observable,\n onCancel: async () => {\n setState({ 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", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Trigger } from '@dxos/async';\nimport { cancelWithContext, Context } from '@dxos/context';\nimport { InvalidInvitationExtensionRoleError } from '@dxos/errors';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { schema, trace } from '@dxos/protocols';\nimport { Invitation } from '@dxos/protocols/proto/dxos/client/services';\nimport { ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport {\n AdmissionRequest,\n AdmissionResponse,\n AuthenticationResponse,\n IntroductionRequest,\n InvitationHostService,\n Options,\n} from '@dxos/protocols/proto/dxos/halo/invitations';\nimport { ExtensionContext, RpcExtension } from '@dxos/teleport';\n\n/// Timeout for the options exchange.\nconst OPTIONS_TIMEOUT = 10_000;\n\nexport const MAX_OTP_ATTEMPTS = 3;\n\ntype InvitationHostExtensionCallbacks = {\n // Deliberately not async to not block the extensions opening.\n onOpen: () => void;\n onError: (error: Error) => void;\n\n onStateUpdate: (invitation: Invitation) => void;\n\n resolveInvitation: (request: IntroductionRequest) => Promise<Invitation | undefined>;\n\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 */\nexport class InvitationHostExtension extends RpcExtension<\n { InvitationHostService: InvitationHostService },\n { InvitationHostService: InvitationHostService }\n> {\n /**\n * @internal\n */\n private _ctx = new Context();\n private _remoteOptions?: Options;\n private _remoteOptionsTrigger = new Trigger();\n\n public invitation?: Invitation = undefined;\n\n public guestProfile?: ProfileDocument = undefined;\n\n public authenticationPassed = false;\n\n /**\n * Retry counter for SHARED_SECRET authentication method.\n */\n public authenticationRetry = 0;\n\n /**\n * Resolved when admission is completed.\n */\n public completedTrigger = new Trigger<PublicKey>();\n\n constructor(private readonly _callbacks: InvitationHostExtensionCallbacks) {\n super({\n requested: {\n InvitationHostService: schema.getService('dxos.halo.invitations.InvitationHostService'),\n },\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 options: async (options) => {\n assert(!this._remoteOptions, 'Remote options already set.');\n this._remoteOptions = options;\n this._remoteOptionsTrigger.wake();\n },\n\n introduce: async (request) => {\n const { profile, invitationId } = request;\n\n const traceId = PublicKey.random().toHex();\n log.trace('dxos.sdk.invitation-handler.host.introduce', trace.begin({ id: traceId }));\n\n const invitation = await this._callbacks.resolveInvitation(request);\n if (!invitation) {\n log.warn('invitation not found', { invitationId });\n this._callbacks.onError(new Error('Invitation not found.'));\n // TODO(dmaretskyi): Better error handling.\n return {\n authMethod: Invitation.AuthMethod.NONE,\n };\n }\n this.invitation = invitation;\n\n log('guest introduced itself', {\n guestProfile: profile,\n });\n this.guestProfile = profile;\n\n this._callbacks.onStateUpdate({ ...this.invitation, state: Invitation.State.READY_FOR_AUTHENTICATION });\n\n log.trace('dxos.sdk.invitation-handler.host.introduce', trace.end({ id: traceId }));\n return {\n spaceKey: this.invitation.authMethod === Invitation.AuthMethod.NONE ? this.invitation.spaceKey : undefined,\n authMethod: this.invitation.authMethod,\n };\n },\n\n authenticate: async ({ authCode: code }) => {\n const traceId = PublicKey.random().toHex();\n log.trace('dxos.sdk.invitation-handler.host.authenticate', trace.begin({ id: traceId }));\n log('received authentication request', { authCode: code });\n let status = AuthenticationResponse.Status.OK;\n\n assert(this.invitation, 'Invitation is not set.');\n switch (this.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 (this.invitation.authCode) {\n if (this.authenticationRetry++ > MAX_OTP_ATTEMPTS) {\n status = AuthenticationResponse.Status.INVALID_OPT_ATTEMPTS;\n } else if (code !== this.invitation.authCode) {\n status = AuthenticationResponse.Status.INVALID_OTP;\n } else {\n this.authenticationPassed = true;\n }\n }\n break;\n }\n\n default: {\n log.error('invalid authentication method', { authMethod: this.invitation.authMethod });\n status = AuthenticationResponse.Status.INTERNAL_ERROR;\n break;\n }\n }\n\n log.trace('dxos.sdk.invitation-handler.host.authenticate', trace.end({ id: traceId, data: { status } }));\n return { status };\n },\n\n admit: async (request) => {\n const traceId = PublicKey.random().toHex();\n log.trace('dxos.sdk.invitation-handler.host.admit', trace.begin({ id: traceId }));\n\n try {\n assert(this.invitation, 'Invitation is not set.');\n // Check authenticated.\n if (isAuthenticationRequired(this.invitation) && !this.authenticationPassed) {\n throw new Error('Not authenticated');\n }\n\n const response = await this._callbacks.admit(request);\n\n log.trace('dxos.sdk.invitation-handler.host.admit', trace.end({ id: traceId }));\n return response;\n } catch (err: any) {\n this._callbacks.onError(err);\n throw err;\n }\n },\n },\n };\n }\n\n override async onOpen(context: ExtensionContext) {\n await super.onOpen(context);\n\n try {\n await this.rpc.InvitationHostService.options({ role: Options.Role.HOST });\n await cancelWithContext(this._ctx, this._remoteOptionsTrigger.wait({ timeout: OPTIONS_TIMEOUT }));\n if (this._remoteOptions?.role !== Options.Role.GUEST) {\n throw new InvalidInvitationExtensionRoleError(undefined, {\n expected: Options.Role.GUEST,\n remoteOptions: this._remoteOptions,\n });\n }\n\n this._callbacks.onOpen();\n } catch (err: any) {\n this._callbacks.onError(err);\n }\n }\n\n override async onClose() {\n await this._ctx.dispose();\n }\n}\n\ntype InvitationGuestExtensionCallbacks = {\n // Deliberately not async to not block the extensions opening.\n onOpen: (ctx: Context) => void;\n onError: (error: Error) => void;\n};\n\n/**\n * Guest's side for a connection to a concrete peer in p2p network during invitation.\n */\nexport class InvitationGuestExtension extends RpcExtension<\n { InvitationHostService: InvitationHostService },\n { InvitationHostService: InvitationHostService }\n> {\n private _ctx = new Context();\n private _remoteOptions?: Options;\n private _remoteOptionsTrigger = new Trigger();\n\n constructor(private readonly _callbacks: InvitationGuestExtensionCallbacks) {\n super({\n requested: {\n InvitationHostService: schema.getService('dxos.halo.invitations.InvitationHostService'),\n },\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 InvitationHostService: {\n options: async (options) => {\n assert(!this._remoteOptions, 'Remote options already set.');\n this._remoteOptions = options;\n this._remoteOptionsTrigger.wake();\n },\n introduce: () => {\n throw new Error('Method not allowed.');\n },\n authenticate: () => {\n throw new Error('Method not allowed.');\n },\n admit: () => {\n throw new Error('Method not allowed.');\n },\n },\n };\n }\n\n override async onOpen(context: ExtensionContext) {\n await super.onOpen(context);\n\n try {\n log('begin options');\n await cancelWithContext(this._ctx, this.rpc.InvitationHostService.options({ role: Options.Role.GUEST }));\n await cancelWithContext(this._ctx, this._remoteOptionsTrigger.wait({ timeout: OPTIONS_TIMEOUT }));\n log('end options');\n if (this._remoteOptions?.role !== Options.Role.HOST) {\n throw new InvalidInvitationExtensionRoleError(undefined, {\n expected: Options.Role.HOST,\n remoteOptions: this._remoteOptions,\n });\n }\n\n this._callbacks.onOpen(this._ctx);\n } catch (err: any) {\n log('openError', err);\n this._callbacks.onError(err);\n }\n }\n\n override async onClose() {\n log('onClose');\n await this._ctx.dispose();\n }\n}\n\nexport const isAuthenticationRequired = (invitation: Invitation) =>\n invitation.authMethod !== Invitation.AuthMethod.NONE;\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event } from '@dxos/async';\nimport { AuthenticatingInvitationObservable, CancellableInvitationObservable } from '@dxos/client-protocol';\nimport { Stream } from '@dxos/codec-protobuf';\nimport { log } from '@dxos/log';\nimport {\n AuthenticationRequest,\n Invitation,\n InvitationsService,\n QueryInvitationsResponse,\n} 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 private readonly _invitationCreated = new Event<Invitation>();\n private readonly _invitationAccepted = new Event<Invitation>();\n private readonly _removedCreated = new Event<Invitation>();\n private readonly _removedAccepted = new Event<Invitation>();\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(options: Invitation): Stream<Invitation> {\n let invitation: CancellableInvitationObservable;\n\n const existingInvitation = this._createInvitations.get(options.invitationId);\n if (existingInvitation) {\n invitation = existingInvitation;\n } else {\n const handler = this._getHandler(options);\n invitation = this._invitationsHandler.createInvitation(handler, options);\n this._createInvitations.set(invitation.get().invitationId, invitation);\n this._invitationCreated.emit(invitation.get());\n }\n\n return new Stream<Invitation>(({ next, close }) => {\n invitation.subscribe(\n (invitation) => {\n next(invitation);\n },\n (err: Error) => {\n close(err);\n },\n () => {\n close();\n this._createInvitations.delete(invitation.get().invitationId);\n },\n );\n });\n }\n\n acceptInvitation(options: Invitation): Stream<Invitation> {\n let invitation: AuthenticatingInvitationObservable;\n\n const existingInvitation = this._acceptInvitations.get(options.invitationId);\n if (existingInvitation) {\n invitation = existingInvitation;\n } else {\n const handler = this._getHandler(options);\n invitation = this._invitationsHandler.acceptInvitation(handler, options);\n this._acceptInvitations.set(invitation.get().invitationId, invitation);\n this._invitationAccepted.emit(invitation.get());\n }\n\n return new Stream<Invitation>(({ next, close }) => {\n invitation.subscribe(\n (invitation) => {\n next(invitation);\n },\n (err: Error) => {\n close(err);\n },\n () => {\n close();\n this._acceptInvitations.delete(invitation.get().invitationId);\n },\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('deleting...');\n assert(invitationId);\n const created = this._createInvitations.get(invitationId);\n const accepted = this._acceptInvitations.get(invitationId);\n if (created) {\n await created.cancel();\n this._createInvitations.delete(invitationId);\n this._removedCreated.emit(created.get());\n } else if (accepted) {\n await accepted.cancel();\n this._acceptInvitations.delete(invitationId);\n this._removedAccepted.emit(accepted.get());\n } else {\n log.warn('invalid invitation', { invitationId });\n }\n }\n\n queryInvitations(): Stream<QueryInvitationsResponse> {\n return new Stream<QueryInvitationsResponse>(({ next, ctx }) => {\n // Push added invitations to the stream.\n this._invitationCreated.on(ctx, (invitation) => {\n next({\n action: QueryInvitationsResponse.Action.ADDED,\n type: QueryInvitationsResponse.Type.CREATED,\n invitations: [invitation],\n });\n });\n\n this._invitationAccepted.on(ctx, (invitation) => {\n next({\n action: QueryInvitationsResponse.Action.ADDED,\n type: QueryInvitationsResponse.Type.ACCEPTED,\n invitations: [invitation],\n });\n });\n\n // Push removed invitations to the stream.\n this._removedCreated.on(ctx, (invitation) => {\n next({\n action: QueryInvitationsResponse.Action.REMOVED,\n type: QueryInvitationsResponse.Type.CREATED,\n invitations: [invitation],\n });\n });\n\n this._removedAccepted.on(ctx, (invitation) => {\n next({\n action: QueryInvitationsResponse.Action.REMOVED,\n type: QueryInvitationsResponse.Type.ACCEPTED,\n invitations: [invitation],\n });\n });\n\n // Push existing invitations to the stream.\n next({\n action: QueryInvitationsResponse.Action.ADDED,\n type: QueryInvitationsResponse.Type.CREATED,\n invitations: Array.from(this._createInvitations.values()).map((invitation) => invitation.get()),\n });\n\n next({\n action: QueryInvitationsResponse.Action.ADDED,\n type: QueryInvitationsResponse.Type.ACCEPTED,\n invitations: Array.from(this._acceptInvitations.values()).map((invitation) => invitation.get()),\n });\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { createAdmissionCredentials, getCredentialAssertion } from '@dxos/credentials';\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, SigningContext } 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 { Event } from '@dxos/async';\nimport { Stream } from '@dxos/codec-protobuf';\nimport { log, LogEntry as NaturalLogEntry, LogProcessor, shouldLog } from '@dxos/log';\nimport { LoggingService, LogEntry, QueryLogsRequest } from '@dxos/protocols/proto/dxos/client/services';\n\n/**\n * Logging service used to spy on logs of the host.\n */\nexport class LoggingServiceImpl implements LoggingService {\n private readonly _logs = new Event<NaturalLogEntry>();\n\n async open() {\n log.runtimeConfig.processors.push(this._logProcessor);\n }\n\n async close() {\n const index = log.runtimeConfig.processors.findIndex((processor) => processor === this._logProcessor);\n log.runtimeConfig.processors.splice(index, 1);\n }\n\n queryLogs(request: QueryLogsRequest): Stream<LogEntry> {\n const filters = request.filters?.length ? request.filters : undefined;\n return new Stream<LogEntry>(({ ctx, next }) => {\n const handler = (entry: NaturalLogEntry) => {\n // Prevent logging feedback loop from logging service.\n if (\n entry.meta?.file.includes('logging-service') ||\n (entry.context &&\n Object.values(entry.context).some((value) => typeof value === 'string' && value.includes('LoggingService')))\n ) {\n return;\n }\n\n if (shouldLog(entry, filters)) {\n next(jsonify(entry));\n }\n };\n\n ctx.onDispose(() => {\n this._logs.off(handler);\n });\n\n this._logs.on(handler);\n });\n }\n\n private _logProcessor: LogProcessor = (_config, entry) => {\n this._logs.emit(entry);\n };\n}\n\n/**\n * Recursively converts an object into a JSON-compatible object.\n */\nconst jsonify = (value: any, handles = new WeakSet<any>()): any => {\n if (typeof value === 'function') {\n return null;\n } else if (typeof value === 'object' && value !== null) {\n if (handles.has(value)) {\n return null;\n }\n handles.add(value);\n\n if (Array.isArray(value)) {\n return value.map((x) => jsonify(x, handles));\n } else {\n if (typeof value.toJSON === 'function') {\n return value.toJSON();\n }\n const res: any = {};\n for (const key of Object.keys(value)) {\n res[key] = jsonify(value[key], handles);\n }\n return res;\n }\n } else {\n return value;\n }\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { SignalManager } from '@dxos/messaging';\nimport { NetworkManager } from '@dxos/network-manager';\nimport { NetworkService, NetworkStatus, UpdateConfigRequest } from '@dxos/protocols/proto/dxos/client/services';\n\nexport class NetworkServiceImpl implements NetworkService {\n constructor(private readonly networkManager: NetworkManager, private readonly signalManager: SignalManager) {}\n\n queryStatus() {\n return new Stream<NetworkStatus>(({ next }) => {\n const update = () => {\n next({\n swarm: this.networkManager.connectionState,\n signaling: this.signalManager.getStatus().map(({ host, state }) => ({ server: host, state })),\n });\n };\n\n const unsubscribeSwarm = this.networkManager.connectionStateChanged.on(() => update());\n const unsubscribeSignal = this.signalManager.statusChanged.on(() => update());\n update();\n\n return () => {\n unsubscribeSwarm();\n unsubscribeSignal();\n };\n });\n }\n\n async updateConfig(request: UpdateConfigRequest) {\n await this.networkManager.setConnectionState(request.swarm);\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Event, synchronized, trackLeaks } from '@dxos/async';\nimport { cancelWithContext, Context } from '@dxos/context';\nimport { CredentialSigner, getCredentialAssertion } from '@dxos/credentials';\nimport { DataServiceSubscriptions, MetadataStore, Space, SpaceManager } 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 { SpaceState } from '@dxos/protocols/proto/dxos/client/services';\nimport { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { SpaceMetadata } from '@dxos/protocols/proto/dxos/echo/metadata';\nimport { Credential, ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { 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';\nimport { spaceGenesis } from './genesis';\n\nexport interface SigningContext {\n identityKey: PublicKey;\n deviceKey: PublicKey;\n credentialSigner: CredentialSigner; // TODO(burdon): Already has keyring.\n recordCredential: (credential: Credential) => Promise<void>;\n profile?: ProfileDocument;\n}\n\nexport type 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\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 _feedStore: FeedStore<FeedMessage>,\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.open', trace.begin({ id: this._instanceId }));\n await this._metadataStore.load();\n log('metadata loaded', { spaces: this._metadataStore.spaces.length });\n\n for (const spaceMetadata of this._metadataStore.spaces) {\n try {\n log('load space', { spaceMetadata });\n const space = await this._constructSpace(spaceMetadata);\n space.initializeDataPipelineAsync();\n } catch (err) {\n log.error('Error loading space', { spaceMetadata, err });\n }\n }\n\n this._isOpen = true;\n this.updated.emit();\n log.trace('dxos.echo.data-space-manager.open', trace.end({ id: this._instanceId }));\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\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', space.snapshotManager.objectSync.createExtension());\n session.addExtension('dxos.mesh.teleport.notarization', dataSpace.notarizationPlugin.createExtension());\n },\n onAuthFailure: () => {\n log.warn('auth failure');\n },\n memberKey: this._signingContext.identityKey,\n });\n controlFeed && space.setControlFeed(controlFeed);\n dataFeed && space.setDataFeed(dataFeed);\n\n const dataSpace = new DataSpace({\n inner: space,\n metadataStore: this._metadataStore,\n gossip,\n presence,\n keyring: this._keyring,\n feedStore: this._feedStore,\n signingContext: this._signingContext,\n callbacks: {\n beforeReady: async () => {\n log('before space ready', { space: space.key });\n this._dataServiceSubscriptions.registerSpace(\n space.key,\n dataSpace.dataPipeline.databaseHost!.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 cache: metadata.cache,\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 { AUTH_TIMEOUT } from '@dxos/client-protocol';\nimport { cancelWithContext, Context } from '@dxos/context';\nimport { CredentialConsumer } from '@dxos/credentials';\nimport { timed } from '@dxos/debug';\nimport { MetadataStore, Space, createMappedFeedWriter, DataPipeline } 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 { SpaceState, Space as SpaceProto } from '@dxos/protocols/proto/dxos/client/services';\nimport { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { SpaceCache } from '@dxos/protocols/proto/dxos/echo/metadata';\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 { SigningContext } from './data-space-manager';\nimport { NotarizationPlugin } from './notarization-plugin';\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 metadataStore: MetadataStore;\n gossip: Gossip;\n presence: Presence;\n keyring: Keyring;\n feedStore: FeedStore<FeedMessage>;\n signingContext: SigningContext;\n callbacks?: DataSpaceCallbacks;\n cache?: SpaceCache;\n};\n\n@trackLeaks('open', 'close')\nexport class DataSpace {\n private readonly _ctx = new Context();\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 private readonly _cache?: SpaceCache;\n\n private _state = SpaceState.CLOSED;\n\n /**\n * Error for _state === SpaceState.ERROR.\n */\n public error: Error | undefined = undefined;\n\n public readonly authVerifier: TrustedKeySetAuthVerifier;\n public readonly stateUpdate = new Event();\n\n public metrics: SpaceProto.Metrics = {};\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\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 this._cache = params.cache;\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._inner.dataPipeline;\n }\n\n get presence() {\n return this._presence;\n }\n\n get notarizationPlugin() {\n return this._notarizationPluginConsumer.processor;\n }\n\n get cache() {\n return this._cache;\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 this.metrics.open = new Date();\n }\n\n async close() {\n this._state = SpaceState.CLOSED;\n await this._ctx.dispose();\n\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 this.metrics.pipelineInitBegin = new Date();\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 this._state = SpaceState.ERROR;\n this.error = err as Error;\n this.stateUpdate.emit();\n } finally {\n this.metrics.ready = new Date();\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 this.metrics.controlPipelineReady = new Date();\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._inner.initializeDataPipeline();\n\n this.metrics.dataPipelineOpen = new Date();\n\n // Wait for the first epoch.\n await cancelWithContext(this._ctx, this._inner.dataPipeline.ensureEpochInitialized());\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._inner.dataPipeline.pipelineState!.waitUntilReachedTargetTimeframe({\n ctx: this._ctx,\n breakOnStall: false,\n });\n\n this.metrics.dataPipelineReady = new Date();\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 async createEpoch() {\n const epoch = await this.dataPipeline.createEpoch();\n\n await this.inner.controlPipeline.writer.write({\n credential: {\n credential: await this._signingContext.credentialSigner.createCredential({\n subject: this.key,\n assertion: {\n '@type': 'dxos.halo.credentials.Epoch',\n ...epoch,\n },\n }),\n },\n });\n\n for (const feed of this.inner.dataPipeline.pipelineState?.feeds ?? []) {\n const indexBeforeEpoch = epoch.timeframe.get(feed.key);\n if (indexBeforeEpoch) {\n await feed.clear(0, indexBeforeEpoch + 1);\n }\n }\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 { createCredential } from '@dxos/credentials';\nimport { failUndefined } from '@dxos/debug';\nimport { Space } from '@dxos/echo-pipeline';\nimport { Keyring } from '@dxos/keyring';\nimport { AdmittedFeed, SpaceMember } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { Timeframe } from '@dxos/timeframe';\n\nimport { SigningContext } from './data-space-manager';\n\nexport const spaceGenesis = async (keyring: Keyring, signingContext: SigningContext, space: Space) => {\n // TODO(dmaretskyi): Find a way to reconcile with credential generator.\n const credentials = [\n await createCredential({\n signer: keyring,\n issuer: space.key,\n subject: space.key,\n assertion: {\n '@type': 'dxos.halo.credentials.SpaceGenesis',\n spaceKey: space.key,\n },\n }),\n\n await createCredential({\n signer: keyring,\n issuer: space.key,\n subject: signingContext.identityKey,\n assertion: {\n '@type': 'dxos.halo.credentials.SpaceMember',\n spaceKey: space.key,\n role: SpaceMember.Role.ADMIN,\n profile: signingContext.profile,\n genesisFeedKey: space.controlFeedKey ?? failUndefined(),\n },\n }),\n\n await signingContext.credentialSigner.createCredential({\n subject: space.controlFeedKey ?? failUndefined(),\n assertion: {\n '@type': 'dxos.halo.credentials.AdmittedFeed',\n spaceKey: space.key,\n identityKey: signingContext.identityKey,\n deviceKey: signingContext.deviceKey,\n designation: AdmittedFeed.Designation.CONTROL,\n },\n }),\n\n await signingContext.credentialSigner.createCredential({\n subject: space.dataFeedKey ?? failUndefined(),\n assertion: {\n '@type': 'dxos.halo.credentials.AdmittedFeed',\n spaceKey: space.key,\n identityKey: signingContext.identityKey,\n deviceKey: signingContext.deviceKey,\n designation: AdmittedFeed.Designation.DATA,\n },\n }),\n\n await signingContext.credentialSigner.createCredential({\n subject: space.key ?? failUndefined(),\n assertion: {\n '@type': 'dxos.halo.credentials.Epoch',\n number: 0,\n previousId: undefined,\n timeframe: new Timeframe(),\n snapshotCid: undefined,\n },\n }),\n ];\n\n for (const credential of credentials) {\n await space.controlPipeline.writer.write({\n credential: { credential },\n });\n }\n\n return credentials;\n};\n", "//\n// Copyright 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 { encodeError } from '@dxos/protocols';\nimport {\n CreateEpochRequest,\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 { Provider, humanize } 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 async createEpoch({ spaceKey }: CreateEpochRequest) {\n const dataSpaceManager = await this._getDataSpaceManager();\n const space = dataSpaceManager.spaces.get(spaceKey) ?? raise(new SpaceNotFoundError(spaceKey));\n await space.createEpoch();\n }\n\n private _transformSpace(space: DataSpace): Space {\n return {\n spaceKey: space.key,\n state: space.state,\n error: space.error ? encodeError(space.error) : undefined,\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 cache: space.cache,\n metrics: space.metrics,\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 { PROXY_CONNECTION_TIMEOUT } from '@dxos/client-protocol';\nimport { Config } from '@dxos/config';\nimport { log, logInfo } from '@dxos/log';\nimport { MemorySignalManager, MemorySignalManagerContext, WebsocketSignalManager } from '@dxos/messaging';\nimport { createWebRTCTransportFactory, TransportFactory } from '@dxos/network-manager';\nimport { RpcPort } from '@dxos/rpc';\nimport { getAsyncValue, MaybePromise, 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 config: Config | Provider<MaybePromise<Config>>;\n origin: string;\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: IFrameHostRuntimeParams['config'];\n private readonly _ready = new Trigger<Error | undefined>();\n\n private readonly _appPort: RpcPort;\n private readonly _shellPort?: RpcPort;\n private _config!: Config;\n private _transportFactory!: TransportFactory;\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({ config, origin, appPort, shellPort }: IFrameHostRuntimeParams) {\n this._configProvider = config;\n this.origin = origin;\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 this._transportFactory = createWebRTCTransportFactory({\n iceServers: this._config.get('runtime.services.ice'),\n });\n const signals = this._config.get('runtime.services.signaling');\n this._clientServices = new LocalClientServices({\n lockKey: LOCK_KEY,\n config: this._config,\n signalManager: signals\n ? new WebsocketSignalManager(signals)\n : new MemorySignalManager(new MemorySignalManagerContext()), // TODO(dmaretskyi): Inject this context.\n transportFactory: this._transportFactory,\n });\n\n const middleware: Pick<ClientRpcServerParams, 'handleCall' | 'handleStream'> = {\n handleCall: async (method, params, handler) => {\n const error = await this._ready.wait({ timeout: PROXY_CONNECTION_TIMEOUT });\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: PROXY_CONNECTION_TIMEOUT });\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-protocol';\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-protocol';\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 { Trigger } from '@dxos/async';\nimport { iframeServiceBundle, workerServiceBundle, WorkerServiceBundle } from '@dxos/client-protocol';\nimport { Config } from '@dxos/config';\nimport { RemoteServiceConnectionError } from '@dxos/errors';\nimport { log } from '@dxos/log';\nimport { WebRTCTransportService } from '@dxos/network-manager';\nimport { BridgeService } from '@dxos/protocols/proto/dxos/mesh/bridge';\nimport { createProtoRpcPeer, ProtoRpcPeer, RpcPort } from '@dxos/rpc';\nimport { getAsyncValue, MaybePromise, Provider } from '@dxos/util';\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 config: Config | Provider<MaybePromise<Config>>;\n systemPort: RpcPort;\n shellPort?: RpcPort;\n};\n\n/**\n * Manages the client connection to the shared worker.\n */\nexport class IFrameProxyRuntime {\n private readonly _id = String(Math.floor(Math.random() * 1000000));\n private readonly _configProvider: IFrameProxyRuntimeParams['config'];\n private readonly _systemPort: RpcPort;\n private readonly _shellPort?: RpcPort;\n private _release = new Trigger();\n private _config!: Config;\n private _transportService!: BridgeService;\n private _systemRpc!: ProtoRpcPeer<WorkerServiceBundle>;\n private _shellRuntime?: ShellRuntimeImpl;\n\n constructor({ config, systemPort, shellPort }: IFrameProxyRuntimeParams) {\n this._configProvider = config;\n this._systemPort = systemPort;\n this._shellPort = shellPort;\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 this._config = await getAsyncValue(this._configProvider);\n\n this._transportService = new WebRTCTransportService({\n iceServers: this._config.get('runtime.services.ice'),\n });\n\n this._systemRpc = createProtoRpcPeer({\n requested: workerServiceBundle,\n exposed: iframeServiceBundle,\n handlers: {\n BridgeService: this._transportService,\n },\n port: this._systemPort,\n timeout: 200,\n });\n\n let lockKey: string | undefined;\n if (typeof navigator !== 'undefined') {\n lockKey = this._lockKey(origin);\n this._release = new Trigger();\n const ready = new Trigger();\n void navigator.locks.request(lockKey, async () => {\n ready.wake();\n await this._release.wait();\n });\n await ready.wait();\n }\n\n try {\n await this._systemRpc.open();\n await this._systemRpc.rpc.WorkerService.start({ origin, lockKey });\n } catch (err) {\n log.catch(err);\n throw new RemoteServiceConnectionError('Failed to connect to worker');\n }\n await this._shellRuntime?.open();\n }\n\n async close() {\n this._release.wake();\n await this._shellRuntime?.close();\n await this._systemRpc.rpc.WorkerService.stop();\n await this._systemRpc.close();\n }\n\n private _lockKey(origin: string) {\n return `${origin}-${this._id}`;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { asyncTimeout, Trigger } from '@dxos/async';\nimport { RESOURCE_LOCK_TIMEOUT } from '@dxos/client-protocol';\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(), RESOURCE_LOCK_TIMEOUT);\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 { 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 signals = this._config.get('runtime.services.signaling');\n this._clientServices.initialize({\n config: this._config,\n signalManager: signals\n ? new WebsocketSignalManager(signals)\n : new MemorySignalManager(new MemorySignalManagerContext()), // TODO(dmaretskyi): Inject this context.\n transportFactory: this._transportFactory,\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 log('reconnecting webrtc...');\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 {\n iframeServiceBundle,\n IframeServiceBundle,\n PROXY_CONNECTION_TIMEOUT,\n workerServiceBundle,\n} from '@dxos/client-protocol';\nimport { log, logInfo } from '@dxos/log';\nimport { BridgeService } from '@dxos/protocols/proto/dxos/mesh/bridge';\nimport { createProtoRpcPeer, ProtoRpcPeer, RpcPort } from '@dxos/rpc';\nimport { Callback, MaybePromise } 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};\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\n public readonly onClose = new Callback<() => Promise<void>>();\n\n @logInfo\n public origin?: string;\n\n @logInfo\n public lockKey?: string;\n\n public bridgeService?: BridgeService;\n\n constructor({ serviceHost, systemPort, appPort, shellPort, readySignal }: WorkerSessionParams) {\n assert(serviceHost);\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: PROXY_CONNECTION_TIMEOUT });\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: PROXY_CONNECTION_TIMEOUT });\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.lockKey = request.lockKey;\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: PROXY_CONNECTION_TIMEOUT });\n if (this.lockKey) {\n void this._afterLockReleases(this.lockKey, () => this.close());\n }\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 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 private _afterLockReleases(lockKey: string, callback: () => MaybePromise<void>): Promise<void> {\n return navigator.locks\n .request(lockKey, () => {\n // No-op.\n })\n .then(callback);\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\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 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 { SignalManager } from '@dxos/messaging';\nimport { ModelFactory } from '@dxos/model-factory';\nimport { NetworkManager } from '@dxos/network-manager';\nimport { STORAGE_VERSION, trace } from '@dxos/protocols';\nimport { Invitation } from '@dxos/protocols/proto/dxos/client/services';\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, SigningContext } 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 signalManager: SignalManager,\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 metadataStore: this.metadataStore,\n modelFactory: this.modelFactory,\n snapshotStore: this.snapshotStore,\n });\n\n this.identityManager = new IdentityManager(\n this.metadataStore,\n this.keyring,\n this.feedStore,\n this.spaceManager\n );\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(\n Invitation.Kind.DEVICE,\n () =>\n new DeviceInvitationProtocol(\n this.keyring,\n () => this.identityManager.identity ?? failUndefined(),\n this._acceptIdentity.bind(this)\n )\n );\n }\n\n async open() {\n log.trace('dxos.sdk.service-context.open', trace.begin({ id: this._instanceId }));\n\n await this._checkStorageVersion();\n\n log('opening...');\n await this.signalManager.open();\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 log.trace('dxos.sdk.service-context.open', trace.end({ id: this._instanceId }));\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 await this.signalManager.close();\n this.dataServiceSubscriptions.clear();\n log('closed');\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 private async _checkStorageVersion() {\n await this.metadataStore.load();\n if (this.metadataStore.version !== STORAGE_VERSION) {\n log.error('Invalid storage version', { current: this.metadataStore.version, expected: STORAGE_VERSION });\n // TODO(mykola): Migrate storage to a new version if incompatibility is detected.\n await this.metadataStore.clear();\n }\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.feedStore,\n );\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-protocol';\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 { createDefaultModelFactory } from '@dxos/client-protocol';\nimport { Config } from '@dxos/config';\nimport { createCredentialSignerWithChain, CredentialGenerator } from '@dxos/credentials';\nimport { SnapshotStore, DataPipeline, MetadataStore, SpaceManager, valueEncoding } 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';\nimport { SigningContext } from '../spaces';\n\n//\n// TODO(burdon): Replace with test builder.\n//\n\nexport const createServiceHost = (config: Config, signalManagerContext: MemorySignalManagerContext) => {\n return new ClientServicesHost({\n config,\n signalManager: new MemorySignalManager(signalManagerContext),\n transportFactory: MemoryTransportFactory,\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 signalManager = new MemorySignalManager(signalContext);\n const networkManager = new NetworkManager({\n signalManager,\n transportFactory: MemoryTransportFactory,\n });\n\n const modelFactory = createDefaultModelFactory();\n return new ServiceContext(storage, networkManager, signalManager, 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 TestBuilder {\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 metadataStore: this.metadataStore,\n modelFactory: createDefaultModelFactory(),\n snapshotStore: this.snapshotStore,\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"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["createMockCredential", "signer", "issuer", "createCredential", "subject", "PublicKey", "Buffer", "from", "assertion", "payload", "value", "import_node_assert", "import_async", "import_services", "import_node_assert", "import_async", "import_client_protocol", "import_echo_pipeline", "import_keys", "import_log", "import_messaging", "import_network_manager", "import_protocols", "import_services", "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", "subscriptions", "EventSubscriptions", "feedMap", "ComplexMap", "PublicKey", "hash", "update", "feeds", "filter", "feed", "length", "some", "feedKey", "equals", "key", "forEach", "has", "set", "on", "add", "off", "Array", "from", "values", "map", "properties", "diskUsage", "core", "byteLength", "feedOpened", "clear", "subscribeToFeedBlocks", "maxBlocks", "timeout", "setTimeout", "getFeed", "iterator", "FeedIterator", "open", "blocks", "block", "push", "slice", "close", "clearTimeout", "import_async", "import_codec_protobuf", "subscribeToKeyringKeys", "keyring", "Stream", "next", "ctx", "update", "keys", "list", "keysUpdate", "on", "scheduleTask", "import_codec_protobuf", "import_keys", "subscribeToNetworkStatus", "signalManager", "Stream", "next", "close", "update", "status", "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", "getStorageInfo", "storageUsage", "context", "storage", "getDiskInfo", "used", "navigatorInfo", "navigator", "estimate", "undefined", "type", "originUsage", "usage", "usageQuota", "quota", "getSnapshots", "snapshots", "snapshotStore", "listSnapshots", "resetStorage", "enableDebugLogging", "disableDebugLogging", "subscribeToKeyringKeys", "keyring", "subscribeToCredentialMessages", "subscribeToSpaces", "subscribeToItems", "subscribeToFeeds", "feedStore", "subscribeToFeedBlocks", "getSpaceSnapshot", "saveSpaceSnapshot", "clearSnapshots", "getNetworkPeers", "subscribeToNetworkTopics", "subscribeToSignalStatus", "subscribeToNetworkStatus", "signalManager", "subscribeToSignal", "subscribeToSwarmInfo", "networkManager", "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", "Identity", "constructor", "space", "signer", "identityKey", "deviceKey", "stateUpdate", "Event", "_signer", "_deviceStateMachine", "spaceState", "registerProcessor", "DeviceStateMachine", "onUpdate", "emit", "_profileStateMachine", "ProfileStateMachine", "authVerifier", "TrustedKeySetAuthVerifier", "trustedKeysProvider", "authorizedDeviceKeys", "update", "authTimeout", "AUTH_TIMEOUT", "processor", "open", "close", "ready", "deviceChainReady", "wait", "controlPipeline", "state", "waitUntilReachedTargetTimeframe", "timeout", "LOAD_CONTROL_FEEDS_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", "identity", "_identity", "open", "traceId", "PublicKey", "random", "toHex", "log", "trace", "begin", "id", "load", "identityRecord", "getIdentityRecord", "_constructIdentity", "ready", "identityKey", "displayName", "profileDocument", "emit", "end", "close", "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", "onAuthFailure", "warn", "memberKey", "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_client_protocol", "import_context", "import_credentials", "import_errors", "import_keys", "import_log", "import_protocols", "import_services", "import_invitations", "import_node_assert", "import_async", "import_context", "import_keys", "import_log", "import_protocols", "import_services", "OPTIONS_TIMEOUT", "MAX_OTP_ATTEMPTS", "InvitationHostExtension", "RpcExtension", "constructor", "_callbacks", "requested", "InvitationHostService", "schema", "getService", "exposed", "_ctx", "Context", "_remoteOptionsTrigger", "Trigger", "invitation", "undefined", "guestProfile", "authenticationPassed", "authenticationRetry", "completedTrigger", "getHandlers", "options", "assert", "_remoteOptions", "wake", "introduce", "request", "profile", "invitationId", "traceId", "PublicKey", "random", "toHex", "log", "trace", "begin", "id", "resolveInvitation", "warn", "onError", "Error", "authMethod", "Invitation", "AuthMethod", "NONE", "onStateUpdate", "state", "State", "READY_FOR_AUTHENTICATION", "end", "spaceKey", "authenticate", "authCode", "code", "status", "AuthenticationResponse", "Status", "OK", "SHARED_SECRET", "INVALID_OPT_ATTEMPTS", "INVALID_OTP", "error", "INTERNAL_ERROR", "data", "admit", "isAuthenticationRequired", "response", "err", "onOpen", "context", "rpc", "role", "Options", "Role", "HOST", "cancelWithContext", "wait", "timeout", "GUEST", "InvalidInvitationExtensionRoleError", "expected", "remoteOptions", "onClose", "dispose", "InvitationGuestExtension", "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", "extension", "InvitationHostExtension", "onStateUpdate", "next", "READY_FOR_AUTHENTICATION", "resolveInvitation", "admit", "admissionRequest", "_a", "deviceKey", "device", "space", "admissionResponse", "guestProfile", "completedTrigger", "wake", "onOpen", "scheduleTask", "traceId", "trace", "begin", "id", "CONNECTED", "wait", "guest", "SUCCESS", "end", "TimeoutError", "TIMEOUT", "MULTIUSE", "sleep", "ON_CLOSE_DELAY", "InvalidInvitationExtensionRoleError", "topic", "swarmConnection", "joinSwarm", "peerId", "protocolProvider", "createTeleportProtocolFactory", "teleport", "addExtension", "topology", "StarTopology", "close", "CONNECTING", "observable", "CancellableInvitationObservable", "initialInvitation", "subscriber", "onCancel", "CANCELLED", "acceptInvitation", "authenticated", "Trigger", "currentState", "setState", "newData", "warn", "connectionCount", "InvitationGuestExtension", "extensionCtx", "Error", "raise", "introductionResponse", "rpc", "InvitationHostService", "introduce", "createIntroduction", "response", "spaceKey", "isAuthenticationRequired", "attempt", "MAX_OTP_ATTEMPTS", "AUTHENTICATING", "authenticate", "status", "AuthenticationResponse", "Status", "OK", "INVALID_OTP", "reset", "createAdmissionRequest", "result", "accept", "AuthenticatingInvitationObservable", "onAuthenticate", "code", "import_node_assert", "import_async", "import_codec_protobuf", "import_log", "import_services", "InvitationsServiceImpl", "constructor", "_invitationsHandler", "_getHandler", "_createInvitations", "Map", "_acceptInvitations", "_invitationCreated", "Event", "_invitationAccepted", "_removedCreated", "_removedAccepted", "getLoggingContext", "createInvitation", "options", "invitation", "existingInvitation", "get", "invitationId", "handler", "set", "emit", "Stream", "next", "close", "subscribe", "err", "delete", "acceptInvitation", "authenticate", "authCode", "log", "assert", "observable", "warn", "cancelInvitation", "created", "accepted", "cancel", "queryInvitations", "ctx", "on", "action", "QueryInvitationsResponse", "Action", "ADDED", "type", "Type", "CREATED", "invitations", "ACCEPTED", "REMOVED", "Array", "from", "values", "map", "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_async", "import_codec_protobuf", "import_log", "LoggingServiceImpl", "_logs", "Event", "_logProcessor", "_config", "entry", "emit", "open", "log", "runtimeConfig", "processors", "push", "close", "index", "findIndex", "processor", "splice", "queryLogs", "request", "filters", "length", "undefined", "Stream", "ctx", "next", "handler", "_a", "meta", "file", "includes", "context", "Object", "values", "some", "value", "shouldLog", "jsonify", "onDispose", "off", "on", "handles", "WeakSet", "has", "add", "Array", "isArray", "map", "x", "toJSON", "res", "key", "keys", "import_codec_protobuf", "NetworkServiceImpl", "constructor", "networkManager", "signalManager", "queryStatus", "Stream", "next", "update", "swarm", "connectionState", "signaling", "getStatus", "map", "host", "state", "server", "unsubscribeSwarm", "connectionStateChanged", "on", "unsubscribeSignal", "statusChanged", "updateConfig", "request", "setConnectionState", "import_node_assert", "import_async", "import_context", "import_credentials", "import_keys", "import_log", "import_protocols", "import_services", "import_util", "import_async", "import_client_protocol", "import_context", "import_debug", "import_errors", "import_keys", "import_log", "import_services", "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", "DataSpace", "constructor", "params", "_ctx", "Context", "_state", "SpaceState", "CLOSED", "error", "undefined", "stateUpdate", "Event", "metrics", "_inner", "inner", "on", "emit", "_gossip", "gossip", "_presence", "presence", "_keyring", "keyring", "_feedStore", "feedStore", "_metadataStore", "metadataStore", "_signingContext", "signingContext", "_callbacks", "callbacks", "authVerifier", "TrustedKeySetAuthVerifier", "trustedKeysProvider", "ComplexSet", "PublicKey", "hash", "Array", "from", "spaceState", "members", "keys", "update", "authTimeout", "AUTH_TIMEOUT", "_notarizationPluginConsumer", "registerProcessor", "NotarizationPlugin", "_cache", "cache", "key", "isOpen", "state", "dataPipeline", "notarizationPlugin", "processor", "open", "INACTIVE", "Date", "close", "dispose", "destroy", "postMessage", "channel", "message", "listen", "callback", "initializeDataPipelineAsync", "scheduleTask", "pipelineInitBegin", "initializeDataPipeline", "err", "CancelledError", "log", "ERROR", "ready", "SystemError", "INITIALIZING", "controlPipeline", "waitUntilReachedTargetTimeframe", "ctx", "breakOnStall", "controlPipelineReady", "_createWritableFeeds", "setWriter", "createMappedFeedWriter", "credential", "writer", "dataPipelineOpen", "cancelWithContext", "ensureEpochInitialized", "pipelineState", "dataPipelineReady", "beforeReady", "READY", "afterReady", "credentials", "controlFeedKey", "controlFeed", "openFeed", "createKey", "writable", "setControlFeed", "push", "credentialSigner", "createCredential", "subject", "assertion", "spaceKey", "deviceKey", "identityKey", "designation", "AdmittedFeed", "Designation", "CONTROL", "dataFeedKey", "dataFeed", "setDataFeed", "DATA", "length", "notarize", "timeout", "setWritableFeedKeys", "createEpoch", "epoch", "write", "feed", "feeds", "indexBeforeEpoch", "timeframe", "get", "clear", "timed", "trackLeaks", "import_credentials", "import_debug", "spaceGenesis", "keyring", "signingContext", "space", "credentials", "createCredential", "signer", "issuer", "key", "subject", "assertion", "spaceKey", "identityKey", "role", "SpaceMember", "Role", "ADMIN", "profile", "genesisFeedKey", "controlFeedKey", "failUndefined", "credentialSigner", "deviceKey", "designation", "AdmittedFeed", "Designation", "CONTROL", "dataFeedKey", "DATA", "number", "previousId", "undefined", "timeframe", "Timeframe", "snapshotCid", "credential", "controlPipeline", "writer", "write", "__decorate", "DataSpaceManager", "constructor", "_spaceManager", "_metadataStore", "_dataServiceSubscriptions", "_keyring", "_signingContext", "_feedStore", "_ctx", "Context", "updated", "Event", "_spaces", "ComplexMap", "PublicKey", "hash", "_isOpen", "_instanceId", "random", "toHex", "spaces", "open", "log", "trace", "begin", "id", "load", "length", "spaceMetadata", "space", "_constructSpace", "initializeDataPipelineAsync", "err", "error", "emit", "end", "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", "controlFeed", "openFeed", "writable", "dataFeed", "constructSpace", "swarmIdentity", "peerKey", "credentialProvider", "createAuthProvider", "credentialSigner", "credentialAuthenticator", "deferFunction", "dataSpace", "authVerifier", "verifier", "onNetworkConnection", "session", "addExtension", "createExtension", "remotePeerId", "snapshotManager", "objectSync", "notarizationPlugin", "onAuthFailure", "warn", "memberKey", "setControlFeed", "setDataFeed", "DataSpace", "metadataStore", "keyring", "feedStore", "signingContext", "callbacks", "beforeReady", "registerSpace", "dataPipeline", "databaseHost", "createDataServiceHost", "afterReady", "cache", "controlPipeline", "setTargetTimeframe", "set", "synchronized", "trackLeaks", "import_async", "import_codec_protobuf", "import_debug", "import_echo_pipeline", "import_log", "import_protocols", "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", "createEpoch", "key", "error", "encodeError", "undefined", "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", "cache", "metrics", "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_client_protocol", "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_protocol", "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", "config", "origin", "appPort", "shellPort", "_ready", "Trigger", "_configProvider", "_appPort", "_shellPort", "_shellRuntime", "ShellRuntimeImpl", "services", "_clientServices", "shell", "start", "log", "_config", "getAsyncValue", "_transportFactory", "createWebRTCTransportFactory", "iceServers", "get", "signals", "LocalClientServices", "lockKey", "signalManager", "WebsocketSignalManager", "MemorySignalManager", "MemorySignalManagerContext", "transportFactory", "middleware", "handleCall", "method", "params", "handler", "error", "wait", "timeout", "PROXY_CONNECTION_TIMEOUT", "handleStream", "_clientRpc", "ClientRpcServer", "serviceRegistry", "host", "port", "Promise", "all", "open", "wake", "undefined", "err", "catch", "stop", "close", "logInfo", "import_async", "import_client_protocol", "import_errors", "import_log", "import_network_manager", "import_rpc", "import_util", "import_async", "import_client_protocol", "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", "RESOURCE_LOCK_TIMEOUT", "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_protocol", "import_log", "import_rpc", "import_util", "__decorate", "WorkerSession", "constructor", "serviceHost", "systemPort", "appPort", "shellPort", "readySignal", "_startTrigger", "Trigger", "onClose", "Callback", "assert", "_serviceHost", "middleware", "handleCall", "method", "params", "handler", "error", "wait", "timeout", "PROXY_CONNECTION_TIMEOUT", "handleStream", "_clientRpc", "ClientRpcServer", "serviceRegistry", "port", "_shellClientRpc", "_iframeRpc", "createProtoRpcPeer", "requested", "iframeServiceBundle", "exposed", "workerServiceBundle", "handlers", "WorkerService", "start", "request", "origin", "lockKey", "wake", "stop", "setTimeout", "close", "err", "log", "catch", "bridgeService", "rpc", "BridgeService", "open", "info", "Promise", "all", "_maybeOpenShell", "_afterLockReleases", "callIfSet", "asyncTimeout", "callback", "navigator", "locks", "then", "logInfo", "import_node_assert", "import_async", "import_credentials", "import_debug", "import_echo_pipeline", "import_feed_store", "import_keys", "import_log", "import_protocols", "import_services", "ServiceContext", "constructor", "storage", "networkManager", "signalManager", "modelFactory", "initialized", "Trigger", "dataServiceSubscriptions", "DataServiceSubscriptions", "_handlerFactories", "Map", "_instanceId", "PublicKey", "random", "toHex", "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", "_checkStorageVersion", "_initialize", "end", "close", "_deviceSpaceSync", "dataSpaceManager", "clear", "createIdentity", "params", "getInvitationHandler", "invitation", "get", "kind", "assert", "acceptIdentity", "load", "version", "STORAGE_VERSION", "error", "current", "expected", "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", "transportFactory", "signalManager", "connectionLog", "storage", "lockKey", "_statusUpdate", "Event", "_opening", "_open", "_storage", "_modelFactory", "initialize", "_resourceLock", "VaultResourceLock", "onAcquire", "open", "onRelease", "close", "undefined", "_systemService", "SystemServiceImpl", "_config", "statusUpdate", "getCurrentStatus", "isOpen", "SystemStatus", "ACTIVE", "INACTIVE", "onUpdateStatus", "status", "acquire", "release", "onReset", "reset", "_loggingService", "LoggingServiceImpl", "_serviceRegistry", "ServiceRegistry", "clientServiceBundle", "SystemService", "serviceRegistry", "descriptors", "services", "options", "assert", "createStorageObjects", "get", "createWebRTCTransportFactory", "iceServers", "WebsocketSignalManager", "_signalManager", "_networkManager", "NetworkManager", "log", "traceId", "PublicKey", "random", "toHex", "trace", "begin", "id", "_serviceContext", "ServiceContext", "setServices", "IdentityService", "IdentityServiceImpl", "InvitationsService", "InvitationsServiceImpl", "invitations", "invitation", "getInvitationHandler", "DevicesService", "DevicesServiceImpl", "identityManager", "SpacesService", "SpacesServiceImpl", "spaceManager", "dataServiceSubscriptions", "initialized", "wait", "dataSpaceManager", "DataService", "DataServiceImpl", "NetworkService", "NetworkServiceImpl", "networkManager", "LoggingService", "DevtoolsHost", "DevtoolsServiceImpl", "events", "DevtoolsHostEvents", "context", "emit", "deviceKey", "identity", "end", "LocalClientServices", "constructor", "params", "_host", "ClientServicesHost", "descriptors", "services", "host", "open", "close", "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", "ServiceContext", "hostHandler", "getInvitationHandler", "Kind", "SPACE", "invitations", "guestHandler", "import_client_protocol", "import_credentials", "import_echo_pipeline", "import_feed_store", "import_keyring", "import_messaging", "import_network_manager", "import_random_access_storage", "createServiceHost", "config", "signalManagerContext", "ClientServicesHost", "signalManager", "MemorySignalManager", "transportFactory", "MemoryTransportFactory", "createServiceContext", "signalContext", "MemorySignalManagerContext", "storage", "createStorage", "type", "StorageType", "RAM", "networkManager", "NetworkManager", "modelFactory", "createDefaultModelFactory", "ServiceContext", "createPeers", "numPeers", "Promise", "all", "Array", "from", "map", "peer", "open", "createIdentity", "syncItemsLocal", "db1", "db2", "testLocalDatabase", "TestBuilder", "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"]
|
|
7
7
|
}
|