zova-module-a-ssrserver 5.1.15 → 5.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -69,26 +69,58 @@ var ServiceSsrHandler = (_dec$1 = Service(), _dec2$1 = BeanInfo({ module: "a-ssr
69
69
  onRenderedList.push(fn);
70
70
  }
71
71
  };
72
- const renderFn = await serverEntry(ssrContext);
73
- const [runtimePageContent, err] = await catchError(() => {
74
- return renderToString(renderFn, ssrContext);
75
- });
76
- const error = ssrContext._meta.renderError ?? err;
77
- onRenderedList.forEach((fn) => {
78
- fn(error);
79
- });
80
- cast(ssrContext).rendered(error);
81
- if (error) {
82
- if (error instanceof Error) throw error;
83
- return error;
72
+ let renderFn;
73
+ let runtimePageContent = "";
74
+ let renderedError;
75
+ let onRenderedFlushed = false;
76
+ let renderedFinalized = false;
77
+ try {
78
+ renderFn = await serverEntry(ssrContext);
79
+ const [runtimePageContentInner, err] = await catchError(() => {
80
+ return renderToString(renderFn, ssrContext);
81
+ });
82
+ if (runtimePageContentInner) runtimePageContent = runtimePageContentInner;
83
+ const error = ssrContext._meta.renderError ?? err;
84
+ renderedError = error;
85
+ onRenderedList.forEach((fn) => {
86
+ fn(error);
87
+ });
88
+ onRenderedFlushed = true;
89
+ cast(ssrContext).rendered(error);
90
+ renderedFinalized = true;
91
+ if (error) {
92
+ if (error instanceof Error) throw error;
93
+ return error;
94
+ }
95
+ ssrContext._meta.runtimePageContent = runtimePageContent;
96
+ // @vitejs/plugin-vue injects code into a component's setup() that registers
97
+ const modules = cast(ssrContext).modules;
98
+ if (modules) {
99
+ ssrContext._meta.endingHeadTags += this._renderModulesPreload_zova(modules, { ssrContext });
100
+ ssrContext._meta.endingHeadTags += this._renderModulesPreload(modules, { ssrContext });
101
+ }
102
+ const html = renderTemplate(ssrContext);
103
+ await this._renderTransferCache(options, route);
104
+ return html;
105
+ } finally {
106
+ const context = cast(ssrContext);
107
+ if (!onRenderedFlushed) onRenderedList.forEach((fn) => {
108
+ fn(renderedError);
109
+ });
110
+ if (!renderedFinalized && typeof context.rendered === "function") context.rendered(renderedError);
111
+ onRenderedList.length = 0;
112
+ this._clearSsrContext(context);
113
+ renderFn = void 0;
84
114
  }
85
- ssrContext._meta.runtimePageContent = runtimePageContent;
86
- // @vitejs/plugin-vue injects code into a component's setup() that registers
87
- ssrContext._meta.endingHeadTags += this._renderModulesPreload_zova(cast(ssrContext).modules, { ssrContext });
88
- ssrContext._meta.endingHeadTags += this._renderModulesPreload(cast(ssrContext).modules, { ssrContext });
89
- const html = renderTemplate(ssrContext);
90
- await this._renderTransferCache(options, route);
91
- return html;
115
+ }
116
+ _clearSsrContext(context) {
117
+ context.modules?.clear?.();
118
+ if (context.__qMetaList?.length) context.__qMetaList.length = 0;
119
+ context.state = void 0;
120
+ context.stateDefer = void 0;
121
+ context.performAction = void 0;
122
+ context.rendered = void 0;
123
+ context._meta = void 0;
92
124
  }
93
125
  async ensureReady(handlerNonce) {
94
126
  if (!this._handlerInstance) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/service/ssrHandler.ts","../src/monkeySys.ts","../src/.metadata/index.ts"],"sourcesContent":["import { catchError } from '@cabloy/utils';\nimport { RouteLocationResolvedGeneric } from '@cabloy/vue-router';\nimport fse from 'fs-extra';\nimport ms from 'ms';\nimport path, { basename } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { BeanBase, cast, Use, UseScope } from 'zova';\nimport { Service } from 'zova-module-a-bean';\nimport { SysRouter } from 'zova-module-a-router';\nimport { ScopeModuleASsr } from 'zova-module-a-ssr';\n\nimport { ISsrHandlerRenderOptionsInner, TypeEventResolvePathResult } from '../types/ssr.js';\n\nconst jsRE = /\\.js$/;\nconst cssRE = /\\.css$/;\nconst woffRE = /\\.woff$/;\nconst woff2RE = /\\.woff2$/;\nconst gifRE = /\\.gif$/;\nconst jpgRE = /\\.jpe?g$/;\nconst pngRE = /\\.png$/;\n\n@Service()\nexport class ServiceSsrHandler extends BeanBase {\n private _siteAssetDir: string;\n private _handlerPromise: Promise<any>;\n private _handlerInstance: any;\n private _clientManifest: any;\n private _ssrModulesZovaCache: any = {};\n\n @Use()\n $$sysRouter: SysRouter;\n\n @UseScope()\n $$scopeSsr: ScopeModuleASsr;\n\n protected __init__(siteAssetDir: string) {\n this._siteAssetDir = siteAssetDir;\n }\n\n protected __dispose__() {\n this.dispose();\n }\n\n public dispose() {\n this.sys.close();\n this._handlerInstance = undefined;\n }\n\n async resolvePath(filename: string): Promise<TypeEventResolvePathResult> {\n if (filename === '') filename = 'index.html';\n // assets\n const fileAsset = path.join(this._siteAssetDir, 'client', filename);\n if (await fse.exists(fileAsset)) return fileAsset;\n // not found\n return undefined;\n }\n\n public async render(options: ISsrHandlerRenderOptionsInner) {\n // resolve route\n const pagePathFull =\n options.state?.pagePathFull ?? this.sys.util.getPagePathFromAbsoluteUrl(options.req.url!);\n const route = await this.$$sysRouter.resolveRoute(pagePathFull, true, false);\n if (!route) return;\n // handler\n const { serverEntry, renderToString, renderTemplate } = this._handlerInstance;\n // ssrContext\n const onRenderedList: Function[] = [];\n const ssrContext = {\n ...options,\n _meta: {} as any,\n onRendered: fn => {\n onRenderedList.push(fn);\n },\n };\n // render\n const renderFn = await serverEntry(ssrContext);\n const [runtimePageContent, err] = await catchError(() => {\n return renderToString(renderFn, ssrContext);\n });\n\n const error = ssrContext._meta.renderError ?? err;\n onRenderedList.forEach(fn => {\n fn(error);\n });\n cast(ssrContext).rendered(error);\n if (error) {\n if (error instanceof Error) throw error;\n return error;\n }\n\n ssrContext._meta.runtimePageContent = runtimePageContent;\n\n // @vitejs/plugin-vue injects code into a component's setup() that registers\n // itself on ctx.modules. After the render, ctx.modules would contain all the\n // components that have been instantiated during this render call.\n ssrContext._meta.endingHeadTags += this._renderModulesPreload_zova(cast(ssrContext).modules, {\n ssrContext,\n });\n ssrContext._meta.endingHeadTags += this._renderModulesPreload(cast(ssrContext).modules, {\n ssrContext,\n });\n\n const html = renderTemplate(ssrContext);\n\n // transferCache\n await this._renderTransferCache(options, route);\n\n // todo: ssg\n\n return html;\n }\n\n public async ensureReady(handlerNonce: number) {\n if (!this._handlerInstance) {\n if (!this._handlerPromise) {\n this._handlerPromise = this._prepareHandler(handlerNonce);\n }\n this._handlerInstance = await this._handlerPromise;\n }\n return this._handlerInstance;\n }\n\n private async _prepareHandler(handlerNonce: number) {\n // handler\n const fileHandler = path.join(this._siteAssetDir, 'handler.js');\n const fileUrl = `${pathToHref(fileHandler)}?${handlerNonce}`;\n const handlerInstance = await import(/* @vite-ignore */ fileUrl);\n // clientManifest\n const fileManifest = path.join(this._siteAssetDir, 'quasar.manifest.json');\n const contentManifest = await fse.readFile(fileManifest, { encoding: 'utf-8' });\n this._clientManifest = JSON.parse(contentManifest);\n // ok\n return handlerInstance;\n }\n\n private _renderModulesPreload(modules, opts) {\n let links = '';\n const seen = new Set();\n\n modules.forEach(id => {\n const files = this._clientManifest[id];\n if (files === void 0) return;\n\n files.forEach(file => {\n if (seen.has(file) === true) return;\n\n seen.add(file);\n const filename = basename(file);\n\n if (this._clientManifest[filename] !== void 0) {\n for (const depFile of this._clientManifest[filename]) {\n if (seen.has(depFile) === false) {\n links += this._renderPreloadTag(depFile, opts);\n seen.add(depFile);\n }\n }\n }\n\n links += this._renderPreloadTag(file, opts);\n });\n });\n\n return links;\n }\n\n private _renderModulesPreload_zova(modules2, opts) {\n let links = '';\n const seen = /* @__PURE__ */ new Set();\n modules2.forEach(id => {\n if (!id.startsWith('@@')) return;\n if (seen.has(id) === true) return;\n let cache = this._ssrModulesZovaCache[id];\n if (!cache) {\n for (const key in this._clientManifest) {\n const prefix = `${id.substring(2)}-`;\n const postfix = '.js';\n if (key.startsWith(prefix) && key.endsWith(postfix)) {\n cache = this._resolveUrlPath(`/assets/${key}`);\n break;\n }\n }\n this._ssrModulesZovaCache[id] = cache;\n }\n links += this._renderPreloadTag(cache, opts);\n seen.add(id);\n });\n return links;\n }\n\n private _resolveUrlPath(url: string) {\n let publicPath = this.sys.env.APP_PUBLIC_PATH;\n if (publicPath) publicPath = `/${publicPath}`;\n return publicPath + url;\n }\n\n private _renderPreloadTag(file: string, _opts) {\n file = this.sys.util.getAbsoluteUrlFromPagePath(file, false, true);\n if (jsRE.test(file) === true) {\n return `<link rel=\"modulepreload\" href=\"${file}\" crossorigin>`;\n }\n\n if (cssRE.test(file) === true) {\n return `<link rel=\"stylesheet\" href=\"${file}\" crossorigin>`;\n }\n\n if (woffRE.test(file) === true) {\n return `<link rel=\"preload\" href=\"${file}\" as=\"font\" type=\"font/woff\" crossorigin>`;\n }\n\n if (woff2RE.test(file) === true) {\n return `<link rel=\"preload\" href=\"${file}\" as=\"font\" type=\"font/woff2\" crossorigin>`;\n }\n\n if (gifRE.test(file) === true) {\n return `<link rel=\"preload\" href=\"${file}\" as=\"image\" type=\"image/gif\" crossorigin>`;\n }\n\n if (jpgRE.test(file) === true) {\n return `<link rel=\"preload\" href=\"${file}\" as=\"image\" type=\"image/jpeg\" crossorigin>`;\n }\n\n if (pngRE.test(file) === true) {\n return `<link rel=\"preload\" href=\"${file}\" as=\"image\" type=\"image/png\" crossorigin>`;\n }\n\n return '';\n }\n\n private async _renderTransferCache(\n options: ISsrHandlerRenderOptionsInner,\n route: RouteLocationResolvedGeneric,\n ) {\n const { res } = options;\n const transferCache = route.meta.transferCache ?? this.$$scopeSsr.config.transferCache;\n if (transferCache === false) return;\n // expires\n const transferCacheExpires = transferCache.expires ?? 0;\n const expires =\n typeof transferCacheExpires === 'string'\n ? ms(transferCacheExpires) / 1000\n : transferCacheExpires;\n if (expires === 0) {\n res.appendHeader('cache-control', 'no-cache, no-store, must-revalidate');\n } else {\n res.appendHeader('cache-control', `public, max-age=${expires}`);\n }\n }\n}\n\nexport function pathToHref(fileName: string): string {\n return pathToFileURL(fileName).href;\n // return Path.sep === '\\\\' ? pathToFileURL(fileName).href : fileName;\n}\n","import type { IMonkeySysInitialize } from 'zova';\n\nimport { BeanSimple } from 'zova';\n\nimport { ServiceSsrHandler } from './service/ssrHandler.js';\n\nexport class MonkeySys extends BeanSimple implements IMonkeySysInitialize {\n async sysInitialize() {\n this.sys.meta.$getSsrHandler = async (siteAssetDir: string): Promise<ServiceSsrHandler> => {\n return await this.sys.bean._getBean(ServiceSsrHandler, false, siteAssetDir);\n };\n }\n}\n","// eslint-disable\n/** service: begin */\nexport * from '../service/ssrHandler.js';\n\nimport 'zova-module-a-bean';\ndeclare module 'zova-module-a-bean' {\n \n export interface IServiceRecord {\n 'a-ssrserver:ssrHandler': never;\n }\n\n \n}\ndeclare module 'zova-module-a-ssrserver' {\n \n export interface ServiceSsrHandler {\n /** @internal */\n get scope(): ScopeModuleASsrserver;\n }\n\n export interface ServiceSsrHandler {\n get $beanFullName(): 'a-ssrserver.service.ssrHandler';\n get $onionName(): 'a-ssrserver:ssrHandler';\n \n } \n}\n/** service: end */\n/** service: begin */\nimport { ServiceSsrHandler } from '../service/ssrHandler.js';\nimport 'zova';\ndeclare module 'zova' {\n export interface IBeanRecordGeneral {\n 'a-ssrserver.service.ssrHandler': ServiceSsrHandler;\n }\n}\n/** service: end */\n/** monkeySys: begin */\nexport * from '../monkeySys.js';\n/** monkeySys: end */\n/** scope: begin */\nimport { BeanScopeBase, type BeanScopeUtil } from 'zova';\nimport { Scope } from 'zova-module-a-bean';\n\n@Scope()\nexport class ScopeModuleASsrserver extends BeanScopeBase {}\n\nexport interface ScopeModuleASsrserver {\n util: BeanScopeUtil;\n}\n\nimport 'zova';\ndeclare module 'zova' {\n export interface IBeanScopeRecord {\n 'a-ssrserver': ScopeModuleASsrserver;\n }\n \n \n\n \n\n \n}\n \n/** scope: end */\n"],"mappings":";;;;;;;;AAAA,IAAA,QAAS,SAAA,OAAa,OAAO,OAAO,OAAM,UAAA,SAAA,aAAA;AAC1C,SAAS,2BAAA,GAA8B,GAAC,GAAK,GAAE;AAAA,MAAO,OAAI,eAAO,GAAA,GAAA;EAAA,YAAA,EAAA;EAAA,cAAA,EAAA;EAAA,UAAA,EAAA;EAAA,OAAA,EAAA,cAAA,EAAA,YAAA,KAAA,EAAA,GAAA,KAAA;EAAA,CAAA;;AACjE,SAAO,0BAAmB,GAAA,GAAA,GAAA,GAAA,GAAA;CAAA,IAAA,IAAA,EAAA;AAAA,QAAA,OAAA,KAAA,EAAA,CAAA,QAAA,SAAA,GAAA;AAAA,IAAA,KAAA,EAAA;GAAA,EAAA,EAAA,aAAA,CAAA,CAAA,EAAA,YAAA,EAAA,eAAA,CAAA,CAAA,EAAA,eAAA,WAAA,KAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,IAAA,IAAA,EAAA,OAAA,CAAA,SAAA,CAAA,OAAA,SAAA,GAAA,GAAA;AAAA,SAAA,EAAA,GAAA,GAAA,EAAA,IAAA;IAAA,EAAA,EAAA,KAAA,KAAA,MAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,YAAA,KAAA,EAAA,GAAA,KAAA,GAAA,EAAA,cAAA,KAAA,IAAA,KAAA,MAAA,EAAA,eAAA,OAAA,eAAA,GAAA,GAAA,EAAA,EAAA,QAAA;;;AAW1B,IAAM,QAAQ;AACd,IAAM,SAAS;AACf,IAAM,UAAU;AAChB,IAAM,QAAQ;AACd,IAAM,QAAQ;AACd,IAAM,QAAQ;AACd,IAAW,qBAAW,SAAA,SAAA,EAAA,UAAA,SAAA,EAAA,QAAA,eAErB,CAAA,EAAA,QAAQ,IAAA,sBAAA,EAAA,QAAA,QAAA,SAAA,eAAA,OAAA,cAAA,cAAA,SAAA,UAAA,EAAA,QAAA,SAAA,QAAA,EAAA,QAAA,QAAA,SAAA,eAAA,OAAA,oBAAA,cAAA,SAAA,gBAAA,EAAA,OAAA,WAAA,QAAA,YAAA,UAAA,MAAA,0BAAA,SAAA;CACT,YAAa,GAAA,MAAA;AACX,QAAQ,GAAA,KAAA;AACR,OAAO,gBAAgB,KAAE;AACzB,OAAO,kBAAkB,KAAI;AAC7B,OAAO,mBAAkB,KAAG;AAC5B,OAAO,kBAAC,KAAsB;;AAE7B,6BAAI,MAAA,eAAA,aAAA,KAAA;AACH,6BAAoB,MAAA,cAAA,cAAA,KAAA;;CAEtB,SAAS,cAAC;AACR,OAAA,gBAAU;;CAEZ,cAAU;AACR,OAAK,SAAA;;;AAGP,OAAA,IAAU,OAAA;AACR,OAAK,mBAAS,KAAA;;;AAGhB,MAAM,aAAW,GAAA,YAAA;EAEf,MAAK,YAAA,KAAkB,KAAC,KAAS,eAAA,UAAA,SAAA;AACnC,MAAA,MAAA,IAAA,OAAA,UAAA,CAAA,QAAA;;CAIA,MAAK,OAAA,SAAA;EAEH,MAAI,eAAiB,QAAA,OAAY,gBAAgB,KAAA,IAAA,KAAA,2BAAA,QAAA,IAAA,IAAA;EACjD,MAAM,QAAC,MAAA,KAAA,YAAA,aAAA,cAAA,MAAA,MAAA;AACP,MAAA,CAAA,MAAO;UAGT,aACI,gBACF,mBACE,KAAO;EAET,MAAK,iBAAa,EAAA;EAClB,MAAG,aAAA;GACH,GAAK;GACH,OAAC,EAAA;GACH,aAAM,OAAc;AACpB,mBAAmB,KAAA,GAAA;;GAElB;EAED,MAAI,WAAA,MAAmB,YAAI,WAAA;EAC3B,MAAG,CAAA,oBAAA,OAAA,MAAA,iBAAA;AACF,UAAA,eAAA,UAAA,WAAA;IACC;EACF,MAAM,QAAQ,WAAS,MAAA,eAAuB;AAC9C,iBAAO,SAAA,OAAoB;AACzB,MAAA,MAAO;IACP;;AAEF,MAAA,OAAW;AACX,OAAA,iBAAuB,MAAM,OAAA;AAC3B,UAAG;;AAEL,aAAK,MAAY,qBAAe;;iGAMhC,YAAA,CAAA;AAEA,aAAW,MAAM,kBAAkB,KAAK,sBAAsB,KAAK,WAAA,CAAA,SAAA,EACjE,YACD,CAAC;EACF,MAAA,OAAW,eAAM,WAAsB;AAGvC,QAAA,KAAW,qBAAqB,SAAQ,MAAA;AAIxC,SAAM;;CAER,MAAK,YAAA,cAAA;AACH,MAAA,CAAK,KAAK,kBAAC;6BAER,MAAM,kBAAA,KAAA,gBAAA,aAAA;AAET,QAAO,mBAAI,MAAA,KAAA;;;;CAIb,MAAM,gBAAM,cAAkB;EAI5B,MAAM,kBAAkB,MAAE,OADxB,GAAA,WADO,KAAgB,KAAE,KAAK,eAAgB,aAAa,CAC3D,CAAA,GAAA;EAGF,MAAM,eAAM,KAAA,KAAgB,KAAA,eAAA,uBAAA;EAC9B,MAAA,kBAAA,MAAA,IAAA,SAAA,cAAA,EAAA,UAAA,SAEA,CAAA;AACE,OAAG,kBAAA,KAAA,MAAA,gBAAA;AAEH,SAAM;;CAER,sBAAK,SAAA,MAAA;EACH,IAAA,QAAM;EACN,MAAM,uBAAA,IAAA,KAAgB;AACtB,UAAK,SAAA,OAAiB;GACpB,MAAC,QAAA,KAAA,gBAAA;AACH,OAAM,UAAC,KAAA,EAAe;AACxB,SAAA,SAAA,SAAA;;AAEA,SAAQ,IAAA,KAAA;IACF,MAAM,WAAI,SAAA,KAAA;AACd,QAAM,KAAO,gBAAS,cAAA,KAAA;0DAEd,KAAA,KAAQ,IAAK,QAAC,KAAA,OAAA;AACd,eAAQ,KAAK,kBAAmB,SAAA,KAAA;AAClC,WAAS,IAAC,QAAQ;;;;KAKpB;IACF;;;CAGJ,2BAA2B,UAAQ,MAAA;EACjC,IAAI,QAAQ;EACZ,MAAM,uBAAkB,IAAA,KAAA;AACxB,WAAS,SAAM,OAAI;AACjB,OAAI,CAAC,GAAC,WAAA,KAAA,CAAA;AACN,OAAI,KAAA,IAAA,GAAA,KAAA,KAAA;GACJ,IAAE,QAAA,KAAA,qBAAA;;AAEA,SAAK,MAAI,OAAK,KAAA,iBAAwB;KACtC,MAAA,SAAA,GAAA,GAAA,UAAA,EAAA,CAAA;gDACF,MAAA,EAAA;AAEK,cAAK,KAAA,gBAAA,WAAA,MAAA;AACd;;;AAGM,SAAK,qBAAK,MAAA;;AAEd,YAAS,KAAO,kBAAO,OAAA,KAAA;AACrB,QAAK,IAAG,GAAA;IACR;AACF,SAAM;;CAER,gBAAgB,KAAK;EACnB,IAAI,aAAQ,KAAU,IAAI,IAAC;AAC3B,MAAI,WAAQ,cAAe,IAAA;AAC3B,SAAM,aAAQ;;CAEhB,kBAAe,MAAA,OAAA;AACb,SAAM,KAAA,IAAA,KAAA,2BAAA,MAAA,OAAA,KAAA;AACN,MAAI,KAAA,KAAA,KAAA,KAAA,KACF,QAAO,mCAAgC,KAAA;AAEzC,MAAE,MAAQ,KAAK,KAAC,KAAA,KACd,QAAK,gCAAO,KAAA;AAEd,MAAA,OAAO,KAAK,KAAA,KAAA,KACd,QAAA,6BAAA,KAAA;AAEA,MAAA,QAAQ,KAAA,KAAgB,KAAK,KAC3B,QAAI,6BAA0B,KAAA;AAE9B,MAAA,MAAO,KAAA,KAAa,KAAG,KACzB,QAAA,6BAAA,KAAA;AAEA,MAAA,MAAQ,KAAA,KAAA,KAAkB,KACxB,QAAO,6BAAc,KAAA;AAErB,MAAE,MAAQ,KAAK,KAAK,KAAC,KACrB,QAAA,6BAAA,KAAA;AAEA,SAAI;;CAEN,MAAE,qBAAA,SAAA,OAAA;UAEE,QACA;EACF,MAAA,gBAAA,MAAA,KAAA,iBAAA,KAAA,WAAA,OAAA;;EAGA,MAAE,uBAA2B,cAAc,WAAW;EACtD,MAAA,UAAA,OAAA,yBAAA,WAAA,GAAA,qBAAA,GAAA,MAAA;oBAEE,KAAE,aAAe,iBAAY,sCAAA;MAE/B,KAAA,aAAA,iBAAA,mBAAA,UAAA;;GAGD,cAAY,0BAA2B,QAAS,WAAS,eAAiB,CAAC,OAAA,MAAa,EAAA;CACzF,cAAE;;CAEF,UAAM;CACN,aAAa;CACd,CAAC,EAAE,eAAA,0BAAA,QAAA,WAAA,cAAA,CAAA,OAAA,MAAA,EAAA;;CAEF,YAAW;CACX,UAAA;;CAED,CAAC,EAAA,SAAQ,IAAM,SAAA,IAAA;AAChB,SAAa,WAAA,UAAA;AACX,QAAO,cAAE,SAAA,CAAA;;;;ACpOX,IAAS,YAAT,cAA4B,WAAK;;AAEjC,OAAS,IAAA,KAAA,iBAA0B,OAAE,iBAAmB;;;;;;;;;ACJxD,IAAG,MAAO,OAAA;AAiBV,IAAU,yBAAa,OAAA,OAAqB,EAAA,QAAA,SAAA,EAC1C,QAAM,eAAA,CAAA,EAAA,KAAA,SAAA,MAAA,SAAA,MAAA,8BAAA,cAAA,GAAA,IAAA,OAAA,IAAA"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/service/ssrHandler.ts","../src/monkeySys.ts","../src/.metadata/index.ts"],"sourcesContent":["import { catchError } from '@cabloy/utils';\nimport { RouteLocationResolvedGeneric } from '@cabloy/vue-router';\nimport fse from 'fs-extra';\nimport ms from 'ms';\nimport path, { basename } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { BeanBase, cast, Use, UseScope } from 'zova';\nimport { Service } from 'zova-module-a-bean';\nimport { SysRouter } from 'zova-module-a-router';\nimport { ScopeModuleASsr } from 'zova-module-a-ssr';\n\nimport { ISsrHandlerRenderOptionsInner, TypeEventResolvePathResult } from '../types/ssr.js';\n\nconst jsRE = /\\.js$/;\nconst cssRE = /\\.css$/;\nconst woffRE = /\\.woff$/;\nconst woff2RE = /\\.woff2$/;\nconst gifRE = /\\.gif$/;\nconst jpgRE = /\\.jpe?g$/;\nconst pngRE = /\\.png$/;\n\n@Service()\nexport class ServiceSsrHandler extends BeanBase {\n private _siteAssetDir: string;\n private _handlerPromise: Promise<any>;\n private _handlerInstance: any;\n private _clientManifest: any;\n private _ssrModulesZovaCache: any = {};\n\n @Use()\n $$sysRouter: SysRouter;\n\n @UseScope()\n $$scopeSsr: ScopeModuleASsr;\n\n protected __init__(siteAssetDir: string) {\n this._siteAssetDir = siteAssetDir;\n }\n\n protected __dispose__() {\n this.dispose();\n }\n\n public dispose() {\n this.sys.close();\n this._handlerInstance = undefined;\n }\n\n async resolvePath(filename: string): Promise<TypeEventResolvePathResult> {\n if (filename === '') filename = 'index.html';\n // assets\n const fileAsset = path.join(this._siteAssetDir, 'client', filename);\n if (await fse.exists(fileAsset)) return fileAsset;\n // not found\n return undefined;\n }\n\n public async render(options: ISsrHandlerRenderOptionsInner) {\n // resolve route\n const pagePathFull =\n options.state?.pagePathFull ?? this.sys.util.getPagePathFromAbsoluteUrl(options.req.url!);\n const route = await this.$$sysRouter.resolveRoute(pagePathFull, true, false);\n if (!route) return;\n // handler\n const { serverEntry, renderToString, renderTemplate } = this._handlerInstance;\n // ssrContext\n const onRenderedList: Function[] = [];\n const ssrContext = {\n ...options,\n _meta: {} as any,\n onRendered: fn => {\n onRenderedList.push(fn);\n },\n };\n let renderFn;\n let runtimePageContent = '';\n let renderedError;\n let onRenderedFlushed = false;\n let renderedFinalized = false;\n try {\n // render\n renderFn = await serverEntry(ssrContext);\n const [runtimePageContentInner, err] = await catchError(() => {\n return renderToString(renderFn, ssrContext);\n });\n if (runtimePageContentInner) {\n runtimePageContent = runtimePageContentInner as string;\n }\n\n const error = ssrContext._meta.renderError ?? err;\n renderedError = error;\n onRenderedList.forEach(fn => {\n fn(error);\n });\n onRenderedFlushed = true;\n cast(ssrContext).rendered(error);\n renderedFinalized = true;\n if (error) {\n if (error instanceof Error) throw error;\n return error;\n }\n\n ssrContext._meta.runtimePageContent = runtimePageContent;\n\n // @vitejs/plugin-vue injects code into a component's setup() that registers\n // itself on ctx.modules. After the render, ctx.modules would contain all the\n // components that have been instantiated during this render call.\n const modules = cast(ssrContext).modules;\n if (modules) {\n ssrContext._meta.endingHeadTags += this._renderModulesPreload_zova(modules, {\n ssrContext,\n });\n ssrContext._meta.endingHeadTags += this._renderModulesPreload(modules, {\n ssrContext,\n });\n }\n\n const html = renderTemplate(ssrContext);\n\n // transferCache\n await this._renderTransferCache(options, route);\n\n // todo: ssg\n\n return html;\n } finally {\n const context = cast(ssrContext);\n if (!onRenderedFlushed) {\n onRenderedList.forEach(fn => {\n fn(renderedError);\n });\n }\n if (!renderedFinalized && typeof context.rendered === 'function') {\n context.rendered(renderedError);\n }\n onRenderedList.length = 0;\n this._clearSsrContext(context);\n renderFn = undefined;\n }\n }\n\n private _clearSsrContext(context): void {\n context.modules?.clear?.();\n if (context.__qMetaList?.length) {\n context.__qMetaList.length = 0;\n }\n context.state = undefined;\n context.stateDefer = undefined;\n context.performAction = undefined;\n context.rendered = undefined;\n context._meta = undefined;\n }\n\n public async ensureReady(handlerNonce: number) {\n if (!this._handlerInstance) {\n if (!this._handlerPromise) {\n this._handlerPromise = this._prepareHandler(handlerNonce);\n }\n this._handlerInstance = await this._handlerPromise;\n }\n return this._handlerInstance;\n }\n\n private async _prepareHandler(handlerNonce: number) {\n // handler\n const fileHandler = path.join(this._siteAssetDir, 'handler.js');\n const fileUrl = `${pathToHref(fileHandler)}?${handlerNonce}`;\n const handlerInstance = await import(/* @vite-ignore */ fileUrl);\n // clientManifest\n const fileManifest = path.join(this._siteAssetDir, 'quasar.manifest.json');\n const contentManifest = await fse.readFile(fileManifest, { encoding: 'utf-8' });\n this._clientManifest = JSON.parse(contentManifest);\n // ok\n return handlerInstance;\n }\n\n private _renderModulesPreload(modules, opts) {\n let links = '';\n const seen = new Set();\n\n modules.forEach(id => {\n const files = this._clientManifest[id];\n if (files === void 0) return;\n\n files.forEach(file => {\n if (seen.has(file) === true) return;\n\n seen.add(file);\n const filename = basename(file);\n\n if (this._clientManifest[filename] !== void 0) {\n for (const depFile of this._clientManifest[filename]) {\n if (seen.has(depFile) === false) {\n links += this._renderPreloadTag(depFile, opts);\n seen.add(depFile);\n }\n }\n }\n\n links += this._renderPreloadTag(file, opts);\n });\n });\n\n return links;\n }\n\n private _renderModulesPreload_zova(modules2, opts) {\n let links = '';\n const seen = /* @__PURE__ */ new Set();\n modules2.forEach(id => {\n if (!id.startsWith('@@')) return;\n if (seen.has(id) === true) return;\n let cache = this._ssrModulesZovaCache[id];\n if (!cache) {\n for (const key in this._clientManifest) {\n const prefix = `${id.substring(2)}-`;\n const postfix = '.js';\n if (key.startsWith(prefix) && key.endsWith(postfix)) {\n cache = this._resolveUrlPath(`/assets/${key}`);\n break;\n }\n }\n this._ssrModulesZovaCache[id] = cache;\n }\n links += this._renderPreloadTag(cache, opts);\n seen.add(id);\n });\n return links;\n }\n\n private _resolveUrlPath(url: string) {\n let publicPath = this.sys.env.APP_PUBLIC_PATH;\n if (publicPath) publicPath = `/${publicPath}`;\n return publicPath + url;\n }\n\n private _renderPreloadTag(file: string, _opts) {\n file = this.sys.util.getAbsoluteUrlFromPagePath(file, false, true);\n if (jsRE.test(file) === true) {\n return `<link rel=\"modulepreload\" href=\"${file}\" crossorigin>`;\n }\n\n if (cssRE.test(file) === true) {\n return `<link rel=\"stylesheet\" href=\"${file}\" crossorigin>`;\n }\n\n if (woffRE.test(file) === true) {\n return `<link rel=\"preload\" href=\"${file}\" as=\"font\" type=\"font/woff\" crossorigin>`;\n }\n\n if (woff2RE.test(file) === true) {\n return `<link rel=\"preload\" href=\"${file}\" as=\"font\" type=\"font/woff2\" crossorigin>`;\n }\n\n if (gifRE.test(file) === true) {\n return `<link rel=\"preload\" href=\"${file}\" as=\"image\" type=\"image/gif\" crossorigin>`;\n }\n\n if (jpgRE.test(file) === true) {\n return `<link rel=\"preload\" href=\"${file}\" as=\"image\" type=\"image/jpeg\" crossorigin>`;\n }\n\n if (pngRE.test(file) === true) {\n return `<link rel=\"preload\" href=\"${file}\" as=\"image\" type=\"image/png\" crossorigin>`;\n }\n\n return '';\n }\n\n private async _renderTransferCache(\n options: ISsrHandlerRenderOptionsInner,\n route: RouteLocationResolvedGeneric,\n ) {\n const { res } = options;\n const transferCache = route.meta.transferCache ?? this.$$scopeSsr.config.transferCache;\n if (transferCache === false) return;\n // expires\n const transferCacheExpires = transferCache.expires ?? 0;\n const expires =\n typeof transferCacheExpires === 'string'\n ? ms(transferCacheExpires) / 1000\n : transferCacheExpires;\n if (expires === 0) {\n res.appendHeader('cache-control', 'no-cache, no-store, must-revalidate');\n } else {\n res.appendHeader('cache-control', `public, max-age=${expires}`);\n }\n }\n}\n\nexport function pathToHref(fileName: string): string {\n return pathToFileURL(fileName).href;\n // return Path.sep === '\\\\' ? pathToFileURL(fileName).href : fileName;\n}\n","import type { IMonkeySysInitialize } from 'zova';\n\nimport { BeanSimple } from 'zova';\n\nimport { ServiceSsrHandler } from './service/ssrHandler.js';\n\nexport class MonkeySys extends BeanSimple implements IMonkeySysInitialize {\n async sysInitialize() {\n this.sys.meta.$getSsrHandler = async (siteAssetDir: string): Promise<ServiceSsrHandler> => {\n return await this.sys.bean._getBean(ServiceSsrHandler, false, siteAssetDir);\n };\n }\n}\n","// eslint-disable\n/** service: begin */\nexport * from '../service/ssrHandler.js';\n\nimport 'zova-module-a-bean';\ndeclare module 'zova-module-a-bean' {\n \n export interface IServiceRecord {\n 'a-ssrserver:ssrHandler': never;\n }\n\n \n}\ndeclare module 'zova-module-a-ssrserver' {\n \n export interface ServiceSsrHandler {\n /** @internal */\n get scope(): ScopeModuleASsrserver;\n }\n\n export interface ServiceSsrHandler {\n get $beanFullName(): 'a-ssrserver.service.ssrHandler';\n get $onionName(): 'a-ssrserver:ssrHandler';\n \n } \n}\n/** service: end */\n/** service: begin */\nimport { ServiceSsrHandler } from '../service/ssrHandler.js';\nimport 'zova';\ndeclare module 'zova' {\n export interface IBeanRecordGeneral {\n 'a-ssrserver.service.ssrHandler': ServiceSsrHandler;\n }\n}\n/** service: end */\n/** monkeySys: begin */\nexport * from '../monkeySys.js';\n/** monkeySys: end */\n/** scope: begin */\nimport { BeanScopeBase, type BeanScopeUtil } from 'zova';\nimport { Scope } from 'zova-module-a-bean';\n\n@Scope()\nexport class ScopeModuleASsrserver extends BeanScopeBase {}\n\nexport interface ScopeModuleASsrserver {\n util: BeanScopeUtil;\n}\n\nimport 'zova';\ndeclare module 'zova' {\n export interface IBeanScopeRecord {\n 'a-ssrserver': ScopeModuleASsrserver;\n }\n \n \n\n \n\n \n}\n \n/** scope: end */\n"],"mappings":"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"}
@@ -15,6 +15,7 @@ export declare class ServiceSsrHandler extends BeanBase {
15
15
  dispose(): void;
16
16
  resolvePath(filename: string): Promise<TypeEventResolvePathResult>;
17
17
  render(options: ISsrHandlerRenderOptionsInner): Promise<any>;
18
+ private _clearSsrContext;
18
19
  ensureReady(handlerNonce: number): Promise<any>;
19
20
  private _prepareHandler;
20
21
  private _renderModulesPreload;
@@ -1 +1 @@
1
- {"version":3,"file":"ssrHandler.d.ts","sourceRoot":"","sources":["../../src/service/ssrHandler.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAuB,MAAM,MAAM,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,6BAA6B,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAU5F,qBACa,iBAAkB,SAAQ,QAAQ;IAC7C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,eAAe,CAAe;IACtC,OAAO,CAAC,gBAAgB,CAAM;IAC9B,OAAO,CAAC,eAAe,CAAM;IAC7B,OAAO,CAAC,oBAAoB,CAAW;IAGvC,WAAW,EAAE,SAAS,CAAC;IAGvB,UAAU,EAAE,eAAe,CAAC;IAE5B,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM;IAIvC,SAAS,CAAC,WAAW;IAId,OAAO;IAKR,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAS3D,MAAM,CAAC,OAAO,EAAE,6BAA6B;IAuD7C,WAAW,CAAC,YAAY,EAAE,MAAM;YAU/B,eAAe;IAa7B,OAAO,CAAC,qBAAqB;IA8B7B,OAAO,CAAC,0BAA0B;IAwBlC,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,iBAAiB;YAiCX,oBAAoB;CAmBnC;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGnD"}
1
+ {"version":3,"file":"ssrHandler.d.ts","sourceRoot":"","sources":["../../src/service/ssrHandler.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAuB,MAAM,MAAM,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,6BAA6B,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAU5F,qBACa,iBAAkB,SAAQ,QAAQ;IAC7C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,eAAe,CAAe;IACtC,OAAO,CAAC,gBAAgB,CAAM;IAC9B,OAAO,CAAC,eAAe,CAAM;IAC7B,OAAO,CAAC,oBAAoB,CAAW;IAGvC,WAAW,EAAE,SAAS,CAAC;IAGvB,UAAU,EAAE,eAAe,CAAC;IAE5B,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM;IAIvC,SAAS,CAAC,WAAW;IAId,OAAO;IAKR,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAS3D,MAAM,CAAC,OAAO,EAAE,6BAA6B;IAoF1D,OAAO,CAAC,gBAAgB;IAYX,WAAW,CAAC,YAAY,EAAE,MAAM;YAU/B,eAAe;IAa7B,OAAO,CAAC,qBAAqB;IA8B7B,OAAO,CAAC,0BAA0B;IAwBlC,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,iBAAiB;YAiCX,oBAAoB;CAmBnC;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGnD"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "zova-module-a-ssrserver",
3
- "version": "5.1.15",
4
- "gitHead": "a534504c9a232c291c1bf395b63134a9222f2746",
3
+ "version": "5.1.16",
4
+ "gitHead": "7332ce2a4b44504a88c64da981b60336ebef7e9b",
5
5
  "description": "",
6
6
  "keywords": [
7
7
  "Zova Module"
@@ -72,42 +72,83 @@ export class ServiceSsrHandler extends BeanBase {
72
72
  onRenderedList.push(fn);
73
73
  },
74
74
  };
75
- // render
76
- const renderFn = await serverEntry(ssrContext);
77
- const [runtimePageContent, err] = await catchError(() => {
78
- return renderToString(renderFn, ssrContext);
79
- });
75
+ let renderFn;
76
+ let runtimePageContent = '';
77
+ let renderedError;
78
+ let onRenderedFlushed = false;
79
+ let renderedFinalized = false;
80
+ try {
81
+ // render
82
+ renderFn = await serverEntry(ssrContext);
83
+ const [runtimePageContentInner, err] = await catchError(() => {
84
+ return renderToString(renderFn, ssrContext);
85
+ });
86
+ if (runtimePageContentInner) {
87
+ runtimePageContent = runtimePageContentInner as string;
88
+ }
80
89
 
81
- const error = ssrContext._meta.renderError ?? err;
82
- onRenderedList.forEach(fn => {
83
- fn(error);
84
- });
85
- cast(ssrContext).rendered(error);
86
- if (error) {
87
- if (error instanceof Error) throw error;
88
- return error;
89
- }
90
+ const error = ssrContext._meta.renderError ?? err;
91
+ renderedError = error;
92
+ onRenderedList.forEach(fn => {
93
+ fn(error);
94
+ });
95
+ onRenderedFlushed = true;
96
+ cast(ssrContext).rendered(error);
97
+ renderedFinalized = true;
98
+ if (error) {
99
+ if (error instanceof Error) throw error;
100
+ return error;
101
+ }
90
102
 
91
- ssrContext._meta.runtimePageContent = runtimePageContent;
103
+ ssrContext._meta.runtimePageContent = runtimePageContent;
104
+
105
+ // @vitejs/plugin-vue injects code into a component's setup() that registers
106
+ // itself on ctx.modules. After the render, ctx.modules would contain all the
107
+ // components that have been instantiated during this render call.
108
+ const modules = cast(ssrContext).modules;
109
+ if (modules) {
110
+ ssrContext._meta.endingHeadTags += this._renderModulesPreload_zova(modules, {
111
+ ssrContext,
112
+ });
113
+ ssrContext._meta.endingHeadTags += this._renderModulesPreload(modules, {
114
+ ssrContext,
115
+ });
116
+ }
92
117
 
93
- // @vitejs/plugin-vue injects code into a component's setup() that registers
94
- // itself on ctx.modules. After the render, ctx.modules would contain all the
95
- // components that have been instantiated during this render call.
96
- ssrContext._meta.endingHeadTags += this._renderModulesPreload_zova(cast(ssrContext).modules, {
97
- ssrContext,
98
- });
99
- ssrContext._meta.endingHeadTags += this._renderModulesPreload(cast(ssrContext).modules, {
100
- ssrContext,
101
- });
118
+ const html = renderTemplate(ssrContext);
102
119
 
103
- const html = renderTemplate(ssrContext);
120
+ // transferCache
121
+ await this._renderTransferCache(options, route);
104
122
 
105
- // transferCache
106
- await this._renderTransferCache(options, route);
123
+ // todo: ssg
107
124
 
108
- // todo: ssg
125
+ return html;
126
+ } finally {
127
+ const context = cast(ssrContext);
128
+ if (!onRenderedFlushed) {
129
+ onRenderedList.forEach(fn => {
130
+ fn(renderedError);
131
+ });
132
+ }
133
+ if (!renderedFinalized && typeof context.rendered === 'function') {
134
+ context.rendered(renderedError);
135
+ }
136
+ onRenderedList.length = 0;
137
+ this._clearSsrContext(context);
138
+ renderFn = undefined;
139
+ }
140
+ }
109
141
 
110
- return html;
142
+ private _clearSsrContext(context): void {
143
+ context.modules?.clear?.();
144
+ if (context.__qMetaList?.length) {
145
+ context.__qMetaList.length = 0;
146
+ }
147
+ context.state = undefined;
148
+ context.stateDefer = undefined;
149
+ context.performAction = undefined;
150
+ context.rendered = undefined;
151
+ context._meta = undefined;
111
152
  }
112
153
 
113
154
  public async ensureReady(handlerNonce: number) {