interprocess
Version:
A scalable and type-safe Electron IPC management tool with enhanced DX
50 lines (49 loc) • 2.63 kB
TypeScript
export declare type IPCMainEvent = Electron.IpcMainInvokeEvent;
export declare type IPCRendererEvent = Electron.IpcRendererEvent;
export declare type BrowserWindow = Electron.BrowserWindow;
export declare type SyncAvailableIpcsOperation = 'add' | 'remove';
export declare type IPCMain<T> = IPC<T, IPCMainEvent>;
export declare type IPCRenderer<T> = IPC<T, IPCRendererEvent>;
export declare type String<T extends string> = T | Omit<string, T>;
export declare type ProcessKeys<P> = keyof P extends string ? keyof P : never;
export declare type Merge<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
export declare type TypeAssertion<Target, Type, Fallback> = Target extends Type ? Target : Fallback;
export declare type StringAssertion<Target, Fallback> = TypeAssertion<Target, string, Fallback>;
export declare type NormalizeCombinedIPCs<T extends Object[], S extends Merge<T[number]>> = {
[K in keyof S]: S[K];
};
export declare type IPC<Type = {}, Event = Electron.Event> = {
[Property in keyof Type]: Type[Property] extends (event: Event, value: infer V) => infer R ? Type[Property] : never;
};
export declare type IPCFactoryProps<T extends Record<string, unknown>> = {
main?: {
[K in keyof T['main']]?: (event: IPCMainEvent, args: any) => Promise<any>;
};
renderer?: {
[K in keyof T['renderer']]?: (event: IPCRendererEvent, args: any) => Promise<any>;
};
};
export declare type MainHandler<Key, Target> = Target extends (event: IPCMainEvent, value: infer V) => infer R ? (handler?: (event: IPCMainEvent, handler: {
[K in Key extends string ? Key : string]: Target;
} & {
data: V;
}, ...rest: any[]) => R) => void : never;
export declare type RendererHandler<Key, Target> = Target extends (event: IPCRendererEvent, value: infer V) => infer R ? (handler?: (event: IPCRendererEvent, handler: {
[K in Key extends string ? Key : string]: Target;
} & {
data: V;
}, ...rest: any[]) => R) => void : never;
export declare type APIHandlers<H, I, R> = {
handle: H;
invoke: I;
remove: R;
};
export declare type APIExpose<H, I, R, S extends (handlers: APIHandlers<H, I, R>) => any, Key, Append extends any> = {
apiKey?: String<Key extends string ? Key : any>;
exposeAll?: boolean;
append?: {
[K in keyof Append]: Append[K];
};
override?: (handlers: APIHandlers<H, I, R>) => ReturnType<S>;
};
export declare type API<Handle, Invoke, Remove, APIConfig extends Record<string, unknown>> = APIExpose<Handle, Invoke, Remove, (handlers: APIHandlers<Handle, Invoke, Remove>) => any, '', APIConfig['append']>;