mirror of
https://github.com/DIYgod/RSSHub.git
synced 2026-03-13 10:30:18 +08:00
76 lines
2.0 KiB
TypeScript
76 lines
2.0 KiB
TypeScript
import type { Handler, Hono } from 'hono';
|
|
|
|
import type { RoutePath } from '@/../assets/build/route-paths';
|
|
import type { ConfigEnv } from '@/config';
|
|
import { setConfig } from '@/config';
|
|
|
|
import type { Data, Namespace, Route } from './types';
|
|
|
|
export * from '@/types';
|
|
export { default as ofetch } from '@/utils/ofetch';
|
|
export * from '@/utils/parse-date';
|
|
|
|
let app: Hono | null = null;
|
|
|
|
function ensureAppInitialized(app: Hono | null): asserts app is Hono {
|
|
if (!app) {
|
|
throw new Error('RSSHub not initialized. Please call init() first.');
|
|
}
|
|
}
|
|
|
|
export async function init(conf?: ConfigEnv) {
|
|
setConfig(
|
|
Object.assign(
|
|
{
|
|
IS_PACKAGE: true,
|
|
},
|
|
conf
|
|
)
|
|
);
|
|
app = (await import('@/app')).default;
|
|
}
|
|
|
|
export async function request(path: RoutePath | (string & {})) {
|
|
ensureAppInitialized(app);
|
|
|
|
const res = await app.request(path);
|
|
return res.json() as Promise<Data>;
|
|
}
|
|
|
|
export async function registerRoute(namespace: string, route: Route, namespaceConfig?: Namespace) {
|
|
ensureAppInitialized(app);
|
|
|
|
const { namespaces } = await import('./registry');
|
|
|
|
if (!namespaces[namespace]) {
|
|
namespaces[namespace] = {
|
|
...namespaceConfig,
|
|
name: namespaceConfig?.name || namespace,
|
|
routes: {},
|
|
apiRoutes: {},
|
|
};
|
|
}
|
|
|
|
const paths = Array.isArray(route.path) ? route.path : [route.path];
|
|
const subApp = app.basePath(`/${namespace}`);
|
|
|
|
const wrappedHandler: Handler = async (ctx) => {
|
|
if (!ctx.get('data')) {
|
|
const response = await route.handler(ctx);
|
|
if (response instanceof Response) {
|
|
return response;
|
|
}
|
|
ctx.set('data', response);
|
|
}
|
|
};
|
|
|
|
for (const path of paths) {
|
|
namespaces[namespace].routes[path] = {
|
|
...route,
|
|
location: `custom/${namespace}`,
|
|
};
|
|
|
|
subApp.get(path, wrappedHandler);
|
|
}
|
|
}
|