/** * Authoritative type declarations for the `window.host` global injected by * the host runtime into guest webviews. * * Import this module (or `@paritytech/host-sdk/guest`) for type-safe access to * host extensions without manually declaring globals. */ import type { DataConnectedPayload, DataMessagePayload, DataBinaryPayload, DataClosedPayload, DataErrorPayload, DataIncomingCallPayload, MediaTrackReadyPayload, MediaConnectedPayload, MediaRemoteTrackPayload, MediaClosedPayload, MediaErrorPayload, MediaIncomingCallPayload, MediaSignalingProgressPayload, MediaTrackStoppedPayload, MediaCallStateChangedPayload, CrdtAwarenessPayload, CrdtJoinResult, CrdtPeerChangePayload, CrdtRemoteUpdatePayload, MeshCapability, MeshControlEnvelope, MeshObjectResult, MeshOpaqueHandle, MeshPrivateControlPayload, MeshPrivateObjectRef, MeshPresencePayload, MeshPrivateReceiptPayload, MeshHeartbeatPayload, MeshQueryPayload, MeshReplyPayload, MeshScopedQueryPayload, MeshScopedReplyPayload, MeshTopicPayload, StatementEventPayload } from "../events.js"; import type { HostStoreStatus } from "../types.js"; import type { BridgeMetadata } from "../bridge/contract.js"; export interface HostDataExtension { getPeerId(): Promise; connect(peerAddress: string): Promise; startListening(address: string): Promise; close(connId: number): Promise; send(connId: number, data: string): Promise; sendBytes(connId: number, data: Uint8Array): Promise; } export interface HostFilesExtension { save(filename: string, dataBase64: string): Promise; } export interface HostMediaExtension { getUserMedia(constraints: { audio: boolean; video: boolean; }): Promise; getDisplayMedia(): Promise; connect(peer: string, trackIds?: number[]): Promise; accept(peer?: string): Promise; reject(peer?: string): Promise; close(sessionId: number): Promise; attachTrack(trackId: number, elementId: string): Promise; getPeerId(): Promise; startListening(address: string): Promise; setTrackEnabled(trackId: number, enabled: boolean): Promise; groupConnect(peers: string[], trackIds?: number[]): Promise; groupAccept(peer: string, trackIds?: number[]): Promise; addTrack(sessionId: number, trackId: number): Promise; removeTrack(sessionId: number, trackId: number): Promise; getStats(sessionId: number): Promise; } export type HostClawMode = "disabled" | "remote" | "local" | "hybrid"; export type HostClawTask = "ask" | "explain" | "summarize" | "plan"; export interface HostClawAskRequest { prompt: string; task?: HostClawTask; productId?: string; conversationId?: string; context?: Record; } export interface HostClawAskResponse { answer: string; provider?: string; model?: string; mode?: HostClawMode; error?: string; } export interface HostClawStatus { available: boolean; mode: HostClawMode; provider?: string; model?: string; requiresUserKey: boolean; } export interface HostClawExtension { ask(request: HostClawAskRequest): Promise; status(): Promise; } export interface CallStats { sessionId: number; audioBytesReceived?: number; videoBytesReceived?: number; packetLossFraction?: number; jitterSeconds?: number; roundTripTimeSeconds?: number; connectionType?: string; timestampMs: number; } export interface HostCrdtExtension { join(roomId: string, opts?: { transport?: string; }): Promise; applyUpdate(roomId: string, dataBase64: string): Promise; getStateVector(roomId: string): Promise; getFullState(roomId: string): Promise; setAwareness(roomId: string, state: Record): Promise; destroy(roomId: string): Promise; } export interface HostMeshExtension { transport: { publish(topic: string, dataBase64: string): Promise; subscribe(topic: string): Promise; heartbeat(streamId: string, authorId: string, earliestRetainedSeq: number, latestAvailableSeq: number): Promise; }; objects: { put(path: string, dataBase64: string, retentionUntilMs?: number): Promise; get(path: string): Promise; getResult(path: string): Promise; }; query: { request(path: string, dataBase64: string): Promise; scopedRequest(request: { requestId: string; requesterId: string; path: string; dataBase64: string; capability: { capabilityId: string; pathPrefix: string; targetId: string; expiresAtMs: number; maxUses: number; }; }): Promise; respond(requestId: string, dataBase64: string): Promise; scopedRespond(reply: { requestId: string; responderId: string; dataBase64: string; capabilityId: string; }): Promise; }; private?: { objects?: { put(dataBase64: string, policy?: { expiresAtMs?: number; suppressPreviews?: boolean; }): Promise; get(handle: MeshOpaqueHandle, capability: MeshCapability): Promise; }; query?: { request(handle: MeshOpaqueHandle, capability: MeshCapability, dataBase64: string): Promise; }; control?: { publish(capability: MeshCapability, envelope: MeshControlEnvelope): Promise; subscribe(capability: MeshCapability): Promise; }; receipts?: { publish(capability: MeshCapability, dataBase64: string): Promise; subscribe(capability: MeshCapability): Promise; }; }; status: { status(): Promise<{ health: string; transport: string; pendingPublishes: number; pendingQueries: number; retainedObjects: number; repairableObjects: number; expiringObjects: number; nextExpiryMs?: number | null; lastError: string | null; }>; }; } /** Maps event name → callback payload type for `host.on` / `host.off`. */ export interface HostEventMap { dataConnected: DataConnectedPayload; dataMessage: DataMessagePayload; dataBinary: DataBinaryPayload; dataClosed: DataClosedPayload; dataError: DataErrorPayload; dataIncomingCall: DataIncomingCallPayload; mediaTrackReady: MediaTrackReadyPayload; mediaConnected: MediaConnectedPayload; mediaRemoteTrack: MediaRemoteTrackPayload; mediaClosed: MediaClosedPayload; mediaError: MediaErrorPayload; mediaIncomingCall: MediaIncomingCallPayload; mediaSignalingProgress: MediaSignalingProgressPayload; mediaTrackStopped: MediaTrackStoppedPayload; mediaCallStateChanged: MediaCallStateChangedPayload; statement: StatementEventPayload; meshTopic: MeshTopicPayload; meshQuery: MeshQueryPayload; meshReply: MeshReplyPayload; meshScopedQuery: MeshScopedQueryPayload; meshScopedReply: MeshScopedReplyPayload; meshPresence: MeshPresencePayload; meshHeartbeat: MeshHeartbeatPayload; meshPrivateControl: MeshPrivateControlPayload; meshPrivateReceipt: MeshPrivateReceiptPayload; crdtRemoteUpdate: CrdtRemoteUpdatePayload; crdtAwareness: CrdtAwarenessPayload; crdtPeerChange: CrdtPeerChangePayload; } export type HostEventName = keyof HostEventMap; /** Bandersnatch ring-VRF extension. Optional — only present when the host has a VRF backend. */ export interface HostVrfExtension { /** Derive the Bandersnatch public member key (32 bytes). */ deriveMemberKey(): Promise; /** Sign a message with the Bandersnatch key (proof of ownership). */ sign(message: Uint8Array): Promise; /** Create a ring-VRF proof. CPU-intensive — host offloads to a worker. */ createProof(members: Uint8Array[], context: Uint8Array, message: Uint8Array): Promise; /** Derive a context-specific alias (32 bytes). */ aliasInContext(context: Uint8Array): Promise; } export interface HostIdentityNamespace { /** Resolve a username to a hex account ID. Throws if not supported. */ resolveUsername(username: string): Promise; } export interface HostGlobal { /** Immutable metadata for version/profile/capability feature detection. */ __bridge: BridgeMetadata; ext: { claw?: HostClawExtension; data: HostDataExtension; files: HostFilesExtension; media: HostMediaExtension; mesh?: HostMeshExtension; crdt?: HostCrdtExtension; /** Bandersnatch ring-VRF. Optional — absent when the host has no VRF backend. */ vrf?: HostVrfExtension; }; /** Statement Store pub/sub API. Present when the host runtime supports statements. */ statements?: { subscribe(channel: string): Promise; write(channel: string, data: string): Promise; status(): Promise; }; /** Persistent key/value storage scoped to the app. */ storage?: { get(key: string): Promise; set(key: string, value: string): Promise; remove(key: string): Promise; }; /** Return the hex-encoded address of the current account. */ getAddress?(): Promise; /** Identity helpers. Presence and support are also reflected in `__bridge`. */ identity?: HostIdentityNamespace; on(event: E, callback: (payload: HostEventMap[E]) => void): void; off(event: E, callback: (payload: HostEventMap[E]) => void): void; } /** Minimal MessagePort-compatible interface used by the host bridge shim. */ export interface HostApiPort { postMessage(data: ArrayBuffer | Uint8Array | ArrayBufferView): void; addEventListener(type: "message", handler: (event: { data: unknown; }) => void): void; removeEventListener(type: "message", handler: (event: { data: unknown; }) => void): void; start(): void; } declare global { interface Window { /** Injected by the host runtime. May be undefined outside a host webview. */ host?: HostGlobal; /** Binary SCALE bridge port (or shim with the same interface on web). */ __HOST_API_PORT__?: HostApiPort; } } //# sourceMappingURL=types.d.ts.map