import { Query } from "@kevisual/query"; import { RouterViewApi, RouterItem } from "./proxy.ts"; import { App, type QueryRouterServer } from "@kevisual/router"; import { filter } from "@kevisual/js-filter"; import { isBrowser } from "es-toolkit"; export const initApi = async (opts: { item?: RouterViewApi, router: QueryRouterServer | App, token?: string, /** * WHERE path = 'auth' OR path = 'router' OR path = 'call' */ exclude?: string; }) => { const router = opts?.router! as QueryRouterServer; const item = opts?.item; const token = opts?.token; const query = item?.api?.query || new Query({ url: item?.api?.url || '/api/router' }) const res = await query.post<{ list: RouterItem[] }>({ path: "router", key: 'list', token: token }); if (res.code !== 200) { console.error('初始化路由失败:', query.url, res.message); return } let _list = res.data?.list || [] if (opts?.exclude) { if (opts?.exclude) { let excludeList = filter(_list, opts.exclude); const excludeIds = excludeList.map(i => i.id); _list = _list.filter(i => !excludeIds.includes(i.id!)); } } const _isBrowser = isBrowser(); for (const r of _list) { if (r.path || r.id) { _isBrowser && console.debug(`注册路由: [${r.path}] ${r?.key}`, 'API'); let metadata = r.metadata || {}; metadata.viewItem = item; metadata.url = query.url; router.route({ path: r.path, key: r.key || '', id: r.id, description: r.description, metadata: metadata, }).define(async (ctx) => { const msg = { ...ctx.query }; if (msg.token === undefined && token !== undefined) { msg.token = token; } const res = await query.post({ path: r.path, key: r.key, ...msg }); ctx.forward(res) }).addTo(router); } } }