// Messages export type MessageBase = { requestID: string } export type RequestMessage = { type: TType data: TData } & MessageBase export type ResponseMessageBase = { status: number msg: string } & MessageBase export type SuccessResponseMessage = { data: TData error?: never } & ResponseMessageBase export type ErrorResponseMessage = { data?: never error: unknown | TError } & ResponseMessageBase export type ResponseMessage = | SuccessResponseMessage | ErrorResponseMessage export type ExtractSuccessResponseMessage = Extract< TResponse, { error?: never } > export type ExtractErrorResponseMessage = Extract< TResponse, { data?: never } > // Unknown messages export type UnknownRequestMessage = RequestMessage export type UnknownSuccessResponseMessage = SuccessResponseMessage export type UnknownErrorResponseMessage = ErrorResponseMessage export type UnknownResponseMessage = UnknownSuccessResponseMessage | UnknownErrorResponseMessage export type UnknownMessage = UnknownRequestMessage | UnknownResponseMessage // Transactions export type Transaction< TRequest extends UnknownRequestMessage, TResponse extends UnknownResponseMessage = ResponseMessage, > = { request: TRequest response: TResponse } export type TransactionMethod< TTransaction extends Transaction, > = ( data: TTransaction["request"]["data"], ) => Promise> export type TransactionHandler< TTransaction extends Transaction, > = ( request: TTransaction["request"], response: { success: ( data: ExtractSuccessResponseMessage["data"], status?: number, ) => ExtractSuccessResponseMessage error: ( error: ExtractErrorResponseMessage["error"], status?: number, ) => ExtractErrorResponseMessage }, ) => Promise | TTransaction["response"] export type TransactionsMethods> = { [Key in keyof TTransactions]: TransactionMethod } export type TransactionsHandlers> = { [Key in keyof TTransactions]: TransactionHandler } // Unknown transactions export type UnknownTransaction = Transaction export type UnknownTransactionMethod = TransactionMethod export type UnknownTransactionHandler = TransactionHandler // Emitter export enum InternalEmitterRequestType { Connect = "connect", } export type InternalEmitterTransactions< TReceiverOptions extends Record = Record, > = { [InternalEmitterRequestType.Connect]: Transaction< RequestMessage< InternalEmitterRequestType.Connect, Partial> | undefined > > } // Receiver export enum InternalReceiverRequestType { Ready = "ready", } export type InternalReceiverTransactions = { [InternalReceiverRequestType.Ready]: Transaction< RequestMessage > }