import type { RPCMessage, TunnelDisconnectEvent, TunnelMessage } from '../proto/api'; import type { WitnessError } from '../utils/error'; type ExtractPrefix = T extends `${infer _}${S}` ? _ : never; export type RPCType = ExtractPrefix; type RPCRequestType = `${T}Request`; type RPCResponseType = `${T}Response`; export type RPCRequestData = Exclude], undefined>; export type RPCResponseData = Exclude], undefined>; export type RPCRequest = { requestId: RPCMessage['id']; type: T; data: RPCRequestData; respond(res: RPCResponseData | WitnessError): void; }; export type RPCResponse = { id: RPCMessage['id']; type: T; data: RPCResponseData; } | { id: RPCMessage['id']; error: WitnessError; }; export type RPCEventMap = { 'connection-terminated': WitnessError; 'tunnel-message': TunnelMessage; 'tunnel-disconnect-event': TunnelDisconnectEvent; 'rpc-request': RPCRequest; 'rpc-response': RPCResponse; }; export type RPCEventType = keyof RPCEventMap; export interface RPCEvent extends Event { type: T; data: RPCEventMap[T]; } export {};