import { AttachMessageTransport, OnClose, OnMessage, SendMessage, } from "@tracerbench/message-transport"; import { Cancellation, RaceCancellation, Task } from "race-cancellation"; export type { AttachMessageTransport, OnClose, OnMessage, SendMessage, Cancellation, RaceCancellation, Task, }; export type AttachJsonRpcTransport = ( onNotification: OnNotification, onError: OnError, onClose: OnClose, ) => [SendRequest, RaceCancellation]; export type SendRequest = < Method extends string, Params extends object, Result extends object, >( request: Request, raceCancellation?: RaceCancellation, ) => Promise>; export type AttachProtocolTransport = ( onEvent: OnEvent, onError: OnError, onClose: OnClose, ) => ProtocolTransport; export type ProtocolTransport = [ AttachSession, DetachSession, SendMethod, RaceCancellation, ]; export type AttachSession = ( sessionId: SessionId, ) => AttachProtocolTransport; export type DetachSession = (sessionId: SessionId) => void; export type SendMethod = < Method extends string, Params extends object, Result extends object, >( method: Method, params?: Params, raceCancellation?: RaceCancellation, ) => Promise; export interface SuccessResponse { id: number; result: Result; } export interface ErrorResponse { id: number; error: ResponseError; } export interface ResponseError { code: number; message: string; data?: unknown; } export type Response = | SuccessResponse | ErrorResponse; export interface Request< Method extends string = string, Params extends object = object, SessionID = unknown, > { /** * The request gets assigned an id when it is sent. */ id?: number; method: Method; params?: Params; /** * Flattened sessionId */ sessionId?: SessionID; } export interface Notification< Method extends string = string, Params extends object = object, SessionID = unknown, > { method: Method; params?: Params; sessionId?: SessionID; } export type DebugCallback = (formatter: unknown, ...args: unknown[]) => void; export interface ProtocolError< Method extends string = string, Params extends object = object, > extends Error { name: "ProtocolError"; request: Request; response: ErrorResponse; } export type OnNotification = < Method extends string = string, Params extends object = object, >( notification: Notification, ) => void; export type OnError = (error: Error) => void; export type OnEvent = < Event extends string = string, Params extends object = object, >( event: Event, params?: Params, ) => void;