// // Copyright 2022 DXOS.org // import { Event as AsyncEvent } from '@dxos/async'; import { Stream } from '@dxos/codec-protobuf/stream'; import { type Config } from '@dxos/config'; import { type ClearSnapshotsRequest, type DevtoolsHost, // TODO(burdon): Rename DevtoolsService type EnableDebugLoggingRequest, type EnableDebugLoggingResponse, type Event, type GetConfigResponse, type GetNetworkPeersRequest, type GetNetworkPeersResponse, type GetSpaceSnapshotRequest, type GetSpaceSnapshotResponse, type ResetStorageRequest, type SaveSpaceSnapshotRequest, type SaveSpaceSnapshotResponse, type SubscribeToCredentialMessagesRequest, type SubscribeToCredentialMessagesResponse, type SubscribeToFeedBlocksRequest, type SubscribeToFeedBlocksResponse, type SubscribeToFeedsRequest, type SubscribeToFeedsResponse, type SubscribeToItemsRequest, type SubscribeToItemsResponse, type SubscribeToKeyringKeysRequest, type SubscribeToKeyringKeysResponse, type SubscribeToNetworkTopicsResponse, type SubscribeToSpacesRequest, type SubscribeToSpacesResponse, type SubscribeToSignalStatusResponse, type SignalResponse, type SubscribeToSwarmInfoResponse, type StorageInfo, type GetSnapshotsResponse, type SubscribeToMetadataResponse, type GetBlobsResponse, } from '@dxos/protocols/proto/dxos/devtools/host'; import { subscribeToFeedBlocks, subscribeToFeeds } from './feeds'; import { subscribeToKeyringKeys } from './keys'; import { subscribeToMetadata } from './metadata'; import { subscribeToNetworkStatus, subscribeToSignal, subscribeToSwarmInfo } from './network'; import { subscribeToSpaces } from './spaces'; import { type ServiceContext } from '../services'; export class DevtoolsHostEvents { readonly ready = new AsyncEvent(); } export type DevtoolsServiceParams = { events: DevtoolsHostEvents; config: Config; context: ServiceContext; }; /** * @deprecated */ export class DevtoolsServiceImpl implements DevtoolsHost { constructor(private readonly params: DevtoolsServiceParams) {} events(request: void): Stream { return new Stream(({ next }) => { this.params.events.ready.on(() => { next({ ready: {} }); }); }); } async getConfig(request: void): Promise { return { config: JSON.stringify(this.params.config.values) }; // 😨 } async getStorageInfo(): Promise { const storageUsage = (await this.params.context.storage.getDiskInfo?.()) ?? { used: 0 }; const navigatorInfo = typeof navigator === 'object' ? await navigator.storage.estimate() : undefined; return { type: this.params.context.storage.type, storageUsage: storageUsage.used, originUsage: navigatorInfo?.usage ?? 0, usageQuota: navigatorInfo?.quota ?? 0, }; } async getBlobs(): Promise { return { blobs: await this.params.context.blobStore.list(), }; } async getSnapshots(): Promise { return { snapshots: [], }; } resetStorage(request: ResetStorageRequest): Promise { throw new Error(); } enableDebugLogging(request: EnableDebugLoggingRequest): Promise { throw new Error(); } disableDebugLogging(request: EnableDebugLoggingRequest): Promise { throw new Error(); } subscribeToKeyringKeys(request: SubscribeToKeyringKeysRequest): Stream { return subscribeToKeyringKeys({ keyring: this.params.context.keyring }); } subscribeToCredentialMessages( request: SubscribeToCredentialMessagesRequest, ): Stream { throw new Error(); } subscribeToSpaces(request: SubscribeToSpacesRequest): Stream { return subscribeToSpaces(this.params.context, request); } subscribeToItems(request: SubscribeToItemsRequest): Stream { throw new Error(); } subscribeToFeeds(request: SubscribeToFeedsRequest): Stream { return subscribeToFeeds(this.params.context, request); } subscribeToFeedBlocks(request: SubscribeToFeedBlocksRequest): Stream { return subscribeToFeedBlocks({ feedStore: this.params.context.feedStore }, request); } getSpaceSnapshot(request: GetSpaceSnapshotRequest): Promise { throw new Error(); } saveSpaceSnapshot(request: SaveSpaceSnapshotRequest): Promise { throw new Error(); } clearSnapshots(request: ClearSnapshotsRequest): Promise { throw new Error(); } getNetworkPeers(request: GetNetworkPeersRequest): Promise { throw new Error(); } subscribeToNetworkTopics(request: void): Stream { throw new Error(); } subscribeToSignalStatus(request: void): Stream { return subscribeToNetworkStatus({ signalManager: this.params.context.signalManager }); } subscribeToSignal(): Stream { return subscribeToSignal({ signalManager: this.params.context.signalManager }); } subscribeToSwarmInfo(): Stream { return subscribeToSwarmInfo({ networkManager: this.params.context.networkManager }); } subscribeToMetadata(): Stream { return subscribeToMetadata({ context: this.params.context }); } }