import type { ClientContext, ClientLink } from '@orpc/client' import type { AnyContractRouter } from '@orpc/contract' import type { consoleRouterContract } from '@/contract/router' import { DynamicLink } from '@orpc/client' import { loadConsoleContractForSegment } from './console-router-loader' export type ConsoleRouterContract = typeof consoleRouterContract export function createConsoleDynamicLink( createLink: (contract: AnyContractRouter) => ClientLink, ) { const routerLinkPromises = new Map>>() function getRouterLink(path: readonly string[]) { const segment = path[0] if (!segment) throw new Error('Console contract path is empty.') let routerLinkPromise = routerLinkPromises.get(segment) if (!routerLinkPromise) { routerLinkPromise = loadConsoleContractForSegment(segment).then(createLink).catch((error) => { routerLinkPromises.delete(segment) throw error }) routerLinkPromises.set(segment, routerLinkPromise) } return routerLinkPromise } return new DynamicLink((_options, path) => getRouterLink(path)) }