File size: 2,008 Bytes
bf48b89 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | 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);
}
}
|