export type Announcement = MRpcBaseMsg & { type: "announcement"; args: T }; export type IncompleteArray = ["Missing required items", T]; export type ActionsWithTunnel< Actions extends Record any>, > = { [A in keyof Actions]: WithTunnel; }; export type Dependencies = { [K in T]: Worker | SharedWorker; }; /** * Comes from the `@mys/m-rpc` library, * but it is not exported. Used to identify * messages sent via `postMessage`. */ export type MRpcBaseMsg = { ns: string; name: string; key: number }; /** */ export type ProxiedActions< Actions extends Record any>, > = { [A in keyof Actions]: ProxiedAction; }; export type ProxiedAction< Action extends (...args: any[]) => any, PromisedReturn = (ReturnType extends Promise ? ReturnType : Promise>), > = (...args: Parameters) => PromisedReturn; /** */ export interface MessengerRealm { postMessage: MessagePort["postMessage"]; addEventListener: MessagePort["addEventListener"]; removeEventListener: MessagePort["removeEventListener"]; } /** */ export type Tunnel = { disconnect: () => void; port: MessagePort; }; /** */ export type WithTunnel< Fn extends (...args: any[]) => any, PromisedReturn = (ReturnType extends Promise ? ReturnType : Promise>), > = ( _: { data: Parameters[0]; ports: Record }, ...args: Rest> ) => PromisedReturn; // 🛑 type Rest = T extends [any, ...(infer R)[]] ? R : never;