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

+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' {