framework: server.registerRenderer

This commit is contained in:
undefined committed 2024-06-07 07:10:36 +08:00
1 parent d82dd2b04d
commit 59c1b83b50
6 files changed
+24 -11

No files matched your search

+2 -1
View File
@@ -2,4 +2,5 @@
移除了 ctx.app (请使用 ctx.root)
移除了 ctx.options (请使用 ctx.root.config)
serializer: 移除 showDisplayName 参数
移除了 loader.addScript, loader.addon 函数
移除了 loader.addScript, loader.addon 函数
移除了 Hydro.module.render (请使用 ctx.server.registerRenderer)
+1 -4
View File
@@ -77,10 +77,7 @@ export default (logger, xff, xhost) => async (ctx: KoaContext, next: Next) => {
}
response.type = 'application/json';
} else if (response.template) {
const s = response.template.split('.');
let templateName = `${s[0]}.${args.domainId}.${s[1]}`;
if (!global.Hydro.ui.template[templateName]) templateName = response.template;
response.body = await handler.renderHTML(templateName, response.body || {});
response.body = await handler.renderHTML(response.template, response.body || {});
response.type = 'text/html';
}
}
+11 -2
View File
@@ -68,6 +68,7 @@ export interface HydroResponse {
attachment: (name: string, stream?: any) => void;
addHeader: (name: string, value: string) => void;
}
export type RendererFunction = (name: string, context: Record<string, any>) => string | Promise<string>;
type HydroContext = {
request: HydroRequest;
response: HydroResponse;
@@ -163,8 +164,7 @@ export class HandlerCommon {
renderHTML(templateName: string, args: Record<string, any>) {
const type = templateName.split('.')[1];
const engine = global.Hydro.module.render[type]
|| (() => JSON.stringify(args, serializer(false, this)));
const engine = this.ctx.server.renderers[type] || (() => JSON.stringify(args, serializer(false, this)));
return engine(templateName, {
handler: this,
UserContext: this.user,
@@ -316,6 +316,7 @@ export class WebService extends Service {
private wsLayers = [];
private captureAllRoutes = {};
renderers: Record<string, RendererFunction> = {};
server = koa;
router = router;
HandlerCommon = HandlerCommon;
@@ -657,6 +658,14 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`);
HandlerCommon.prototype[val] = MixinClass[val];
}
}
public registerRenderer(name: string, func: RendererFunction) {
if (this.renderers[name]) logger.warn('Renderer %s already exists.', name);
this.renderers[name] = func;
this[Context.current]?.on('dispose', () => {
delete this.renderers[name];
});
}
}
declare module 'cordis' {
-1
View File
@@ -802,7 +802,6 @@ export interface ModuleInterfaces {
callback: (this: Handler, args: Record<string, any>) => Promise<OAuthUserResponse>;
};
hash: (password: string, salt: string, user: User) => boolean | string | Promise<string>;
render: (name: string, state: any) => string | Promise<string>;
}
export interface HydroGlobal {
+6
View File
@@ -78,6 +78,12 @@ export class Handler extends HandlerOriginal {
constructor(_, ctx: Context) {
super(_, ctx);
this.ctx = ctx.extend({ domain: this.domain });
this.renderHTML = ((orig) => function (name: string, args: Record<string, any>) {
const s = name.split('.');
let templateName = `${s[0]}.${args.domainId}.${s[1]}`;
if (!global.Hydro.ui.template[templateName]) templateName = name;
return orig(templateName, args);
})(this.renderHTML).bind(this);
}
async onerror(error: HydroError) {
+4 -3
View File
@@ -181,8 +181,9 @@ const render = (name: string, state: any) => new Promise<string>((resolve, rejec
});
});
export const inject = ['server'];
export async function apply(ctx: Context) {
ctx.provideModule('render', 'html', render);
ctx.provideModule('render', 'yaml', render);
ctx.provideModule('render', 'md', render);
ctx.server.registerRenderer('html', render);
ctx.server.registerRenderer('yaml', render);
ctx.server.registerRenderer('md', render);
}