diff --git a/src/core/RPCPlugin.ts b/src/core/RPCPlugin.ts new file mode 100644 index 0000000..f621a05 --- /dev/null +++ b/src/core/RPCPlugin.ts @@ -0,0 +1,76 @@ +import { RPCSession } from "./RPCSession"; + +// interface BaseHookRuntimeCtx { +// nexts: RPCPlugin[]; +// setNextPlugins: (plugins: RPCPlugin[]) => void +// } + +export interface BaseHookCtx { + +} + +export interface CallOutgoingBeforeCtx extends BaseHookCtx { + session: RPCSession; + options: { + fnPath: string; + args: any[]; + }; +} + +export interface CallOutgoingCtx extends CallOutgoingBeforeCtx { + result: any; + setResult: (data: any) => void; +} + +export interface CallIncomingBeforeCtx extends BaseHookCtx { + +} + +export interface CallIncomingCtx extends CallIncomingBeforeCtx { + +} + +export type NormalMethodReturn = Promise | void; +export type HookFn = (ctx: Ctx) => NormalMethodReturn; + +export interface RPCPluginHooksCtx { + onCallOutgoingBefore: CallOutgoingBeforeCtx; + onCallOutgoing: CallOutgoingCtx; + onCallIncomingBefore: CallIncomingBeforeCtx; + onCallIncoming: CallIncomingCtx; +} + +export type RPCPluginHooks = { + [K in keyof RPCPluginHooksCtx]?: HookFn; +}; + + +export interface RPCPlugin extends RPCPluginHooks { + onInit?(): void; + onDestroy?(): void; +} + +export abstract class AbstractRPCPlugin implements RPCPlugin { + abstract onInit?(): void; + abstract onDestroy?(): void; + abstract onCallOutgoingBefore?(ctx: CallOutgoingBeforeCtx): NormalMethodReturn; + abstract onCallOutgoing?(ctx: CallOutgoingCtx): NormalMethodReturn; + abstract onCallIncomingBefore?(ctx: CallIncomingBeforeCtx): NormalMethodReturn; + abstract onCallIncoming?(ctx: CallIncomingCtx): NormalMethodReturn; +} + +type HookName = keyof RPCPluginHooksCtx; + +export class HookChainInterruptedError extends Error { }; + +type HookRunner = (ctx: Ctx) => Promise; +export function createHookRunner( + plugins: RPCPlugin[], + hookName: K, +): HookRunner { + return async (ctx: RPCPluginHooksCtx[K]) => { + for (const plugin of plugins) { + await (plugin[hookName] as HookFn | undefined)?.(ctx); + } + }; +} \ No newline at end of file