import { v4 as uuidv4 } from 'uuid'; import { z } from 'zod'; import type { AdapterRouter } from '../trpc'; import type { InstanceManager } from '../instanceManager'; import { router, publicProcedure } from '../utils'; import isArray from 'lodash/isArray'; /** * Create Adapter Router. * @param instanceManager * @returns Adapter Router. */ export function createAdapterRouter(instanceManager: InstanceManager) { return router({ /** * It is used for rpc client to request rpc server to create an instance of Adapter and obtain the SDK instance id. */ createInstance: publicProcedure.input(z.any()).mutation(async ({ input, ctx }) => { const { packageName, className, params } = input; const modules = await import(packageName); const ClassByName = modules?.[className]; const instance = isArray(params) ? new ClassByName(...params) : new ClassByName(params); const id = uuidv4(); instanceManager.setInstance(ctx.socketId, id, instance); return { instanceId: id }; }), /** * It is used for rpc client to request rpc server to call server-side functions. */ call: publicProcedure.input(z.any()).mutation(({ input, ctx }) => { const { instanceId, methodName, params } = input; const instance = instanceManager.getInstance(ctx.socketId, instanceId); return instance[methodName]?.(...params); }), /** * It is used for rpc client to request rpc server to release the server resource(such as network connection) for specific instance. */ destroy: publicProcedure.input(z.any()).mutation(({ input, ctx }) => { const { instanceId } = input; const instance = instanceManager.getInstance(ctx.socketId, instanceId); try { return instance?.destroy?.(); } finally { instanceManager.clearInstance(ctx.socketId, instanceId); } }) }); }