UNPKG

data-transport

Version:
162 lines (144 loc) 3.66 kB
import { transportKey, transportType } from './constant'; export interface BaseInteraction { listen?: Record<string, (...args: any) => any>; emit?: Record<string, (...args: any) => any>; } export type Reverse<T extends BaseInteraction> = { emit: T['listen']; listen: T['emit']; }; export type MergeInteraction< T extends BaseInteraction, U extends BaseInteraction > = (T['listen'] extends undefined ? U['listen'] extends undefined ? never : { listen: U['listen'] } : U['listen'] extends undefined ? { listen: T['listen'] } : { listen: T['listen'] & U['listen'] }) & (T['emit'] extends undefined ? U['emit'] extends undefined ? never : { emit: U['emit'] } : U['emit'] extends undefined ? { emit: T['emit'] } : { emit: T['emit'] & U['emit'] }); export type Request<T> = T extends (...args: infer P) => any ? P : never; export type Response<T> = T extends (...args: any) => Promise<infer P> ? P : never; export interface EmitParameter<T> { /** * Emit with the event name. */ name: T; /** * Whether a response is required, true by default. */ respond?: boolean; /** * Timeout for the emitting event, 60s by default. */ timeout?: number; /** * Extra data for the emitting event. */ _extra?: Record<string, any>; /** * silent for timeout error, false by default. */ silent?: boolean; /** * skip before emit, false by default. */ skipBeforeEmit?: boolean; } export type EmitOptions<T> = T | EmitParameter<T>; type TransportType = typeof transportType; interface Options { action: string; type: TransportType[keyof TransportType]; [transportKey]: string; hasRespond: boolean; _extra?: Record<string, any>; } export type SendOptions<T = {}> = T & Options & { request?: string | Response<any>; response?: string | Response<any>; }; export type IRequest<T = {}> = T & Options & { requestId: string; request: Request<any>; }; export type IResponse<T = {}> = T & Options & { requestId: string; responseId: string; response: Response<any>; }; export type ListenerOptions<T = {}> = IRequest<T> | IResponse<T>; export type ListenCallback<T = {}> = (options: ListenerOptions<T>) => void; export interface TransportOptions<T = {}> { /** * Send method defines an sender to the specified transport. */ sender: (options: SendOptions<T>) => void; /** * Listen method attaches an event handler to the specified transport, and optionally returns a 'dispose' function to remove the listener. */ listener: ( callback: (options: ListenerOptions<T>) => void ) => (() => void) | void; /** * Timeout milliseconds for sending a request. */ timeout?: number; /** * Display verbose receive data log. */ verbose?: boolean; /** * Specify a prefix for event types. */ prefix?: string; /** * Specify the method name list of the class to listen. */ listenKeys?: string[]; /** * Check the unexpected listen. */ checkListen?: boolean; /** * serializer */ serializer?: { stringify?: (data: any) => string; parse?: (data: string) => any; }; /** * logger */ logger?: (listenOptions: ListenerOptions<any>) => void; } export type ListensMap = Map< string, ( request: Request<any>, options: { hasRespond: Options['hasRespond']; transportId: Options[typeof transportKey]; requestId: string; [key: string]: any; } ) => any >; export interface TransferableWorker { /** * Specify data by transferring ownership (transferable objects) */ transfer?: Transferable[]; }