import type { ChannelDirectoryAdapter, ChannelOutboundAdapter } from "./types.adapters.js"; type MaybePromise = T | Promise; type DirectoryListMethod = "listPeersLive" | "listGroupsLive" | "listGroupMembers"; type OutboundMethod = "sendText" | "sendMedia" | "sendPoll"; type DirectoryListParams = Parameters>[0]; type DirectoryGroupMembersParams = Parameters< NonNullable >[0]; type SendTextParams = Parameters>[0]; type SendMediaParams = Parameters>[0]; type SendPollParams = Parameters>[0]; async function resolveForwardedMethod(params: { getRuntime: () => MaybePromise; resolve: (runtime: Runtime) => Fn | null | undefined; unavailableMessage?: string; }): Promise { const runtime = await params.getRuntime(); const method = params.resolve(runtime); if (method) { return method; } throw new Error(params.unavailableMessage ?? "Runtime method is unavailable"); } export function createRuntimeDirectoryLiveAdapter(params: { getRuntime: () => MaybePromise; listPeersLive?: (runtime: Runtime) => ChannelDirectoryAdapter["listPeersLive"] | null | undefined; listGroupsLive?: ( runtime: Runtime, ) => ChannelDirectoryAdapter["listGroupsLive"] | null | undefined; listGroupMembers?: ( runtime: Runtime, ) => ChannelDirectoryAdapter["listGroupMembers"] | null | undefined; }): Pick { return { listPeersLive: params.listPeersLive ? async (ctx: DirectoryListParams) => await ( await resolveForwardedMethod({ getRuntime: params.getRuntime, resolve: params.listPeersLive!, }) )(ctx) : undefined, listGroupsLive: params.listGroupsLive ? async (ctx: DirectoryListParams) => await ( await resolveForwardedMethod({ getRuntime: params.getRuntime, resolve: params.listGroupsLive!, }) )(ctx) : undefined, listGroupMembers: params.listGroupMembers ? async (ctx: DirectoryGroupMembersParams) => await ( await resolveForwardedMethod({ getRuntime: params.getRuntime, resolve: params.listGroupMembers!, }) )(ctx) : undefined, }; } export function createRuntimeOutboundDelegates(params: { getRuntime: () => MaybePromise; sendText?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter["sendText"] | null | undefined; unavailableMessage?: string; }; sendMedia?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter["sendMedia"] | null | undefined; unavailableMessage?: string; }; sendPoll?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter["sendPoll"] | null | undefined; unavailableMessage?: string; }; }): Pick { return { sendText: params.sendText ? async (ctx: SendTextParams) => await ( await resolveForwardedMethod({ getRuntime: params.getRuntime, resolve: params.sendText!.resolve, unavailableMessage: params.sendText!.unavailableMessage, }) )(ctx) : undefined, sendMedia: params.sendMedia ? async (ctx: SendMediaParams) => await ( await resolveForwardedMethod({ getRuntime: params.getRuntime, resolve: params.sendMedia!.resolve, unavailableMessage: params.sendMedia!.unavailableMessage, }) )(ctx) : undefined, sendPoll: params.sendPoll ? async (ctx: SendPollParams) => await ( await resolveForwardedMethod({ getRuntime: params.getRuntime, resolve: params.sendPoll!.resolve, unavailableMessage: params.sendPoll!.unavailableMessage, }) )(ctx) : undefined, }; }