zova-module-a-ssrserver 5.1.23 → 5.1.25
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 +17 -17
- package/dist/index.js.map +1 -1
- package/dist/service/ssrHandler.d.ts +1 -3
- package/dist/service/ssrHandler.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/.metadata/index.ts +10 -10
- package/src/service/ssrHandler.ts +32 -18
package/dist/index.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { BeanBase, BeanInfo, BeanScopeBase, BeanSimple, Use,
|
|
1
|
+
import { BeanBase, BeanInfo, BeanScopeBase, BeanSimple, Use, cast } from "zova";
|
|
2
2
|
import { catchError } from "@cabloy/utils";
|
|
3
3
|
import fse from "fs-extra";
|
|
4
4
|
import ms from "ms";
|
|
5
5
|
import path, { basename } from "node:path";
|
|
6
6
|
import { pathToFileURL } from "node:url";
|
|
7
7
|
import { Scope, Service } from "zova-module-a-bean";
|
|
8
|
+
import { resolveSsrProfile, resolveSsrProfileOptions } from "zova-module-a-ssr";
|
|
8
9
|
//#region src/service/ssrHandler.ts
|
|
9
|
-
var _dec$1, _dec2$1, _dec3, _dec4,
|
|
10
|
+
var _dec$1, _dec2$1, _dec3, _dec4, _class$1, _class2, _descriptor;
|
|
10
11
|
function _initializerDefineProperty(e, i, r, l) {
|
|
11
12
|
r && Object.defineProperty(e, i, {
|
|
12
13
|
enumerable: r.enumerable,
|
|
@@ -30,7 +31,7 @@ var woff2RE = /\.woff2$/;
|
|
|
30
31
|
var gifRE = /\.gif$/;
|
|
31
32
|
var jpgRE = /\.jpe?g$/;
|
|
32
33
|
var pngRE = /\.png$/;
|
|
33
|
-
var ServiceSsrHandler = (_dec$1 = Service(), _dec2$1 = BeanInfo({ module: "a-ssrserver" }), _dec3 = Use("a-router.sys.router"), _dec4 = Reflect.metadata("design:type", typeof SysRouter === "undefined" ? Object : SysRouter),
|
|
34
|
+
var ServiceSsrHandler = (_dec$1 = Service(), _dec2$1 = BeanInfo({ module: "a-ssrserver" }), _dec3 = Use("a-router.sys.router"), _dec4 = Reflect.metadata("design:type", typeof SysRouter === "undefined" ? Object : SysRouter), _dec$1(_class$1 = _dec2$1(_class$1 = (_class2 = class ServiceSsrHandler extends BeanBase {
|
|
34
35
|
constructor(...args) {
|
|
35
36
|
super(...args);
|
|
36
37
|
this._siteAssetDir = void 0;
|
|
@@ -39,7 +40,6 @@ var ServiceSsrHandler = (_dec$1 = Service(), _dec2$1 = BeanInfo({ module: "a-ssr
|
|
|
39
40
|
this._clientManifest = void 0;
|
|
40
41
|
this._ssrModulesZovaCache = {};
|
|
41
42
|
_initializerDefineProperty(this, "$$sysRouter", _descriptor, this);
|
|
42
|
-
_initializerDefineProperty(this, "$$scopeSsr", _descriptor2, this);
|
|
43
43
|
}
|
|
44
44
|
__init__(siteAssetDir) {
|
|
45
45
|
this._siteAssetDir = siteAssetDir;
|
|
@@ -60,10 +60,15 @@ var ServiceSsrHandler = (_dec$1 = Service(), _dec2$1 = BeanInfo({ module: "a-ssr
|
|
|
60
60
|
const pagePathFull = options.state?.pagePathFull ?? this.sys.util.getPagePathFromAbsoluteUrl(options.req.url);
|
|
61
61
|
const route = await this.$$sysRouter.resolveRoute(pagePathFull, true, false);
|
|
62
62
|
if (!route) return;
|
|
63
|
+
const ssrProfile = resolveSsrProfile(route.meta.ssrProfile, this.sys.env.SSR_PROFILE);
|
|
64
|
+
const ssrProfileOptions = resolveSsrProfileOptions(ssrProfile, this.sys.config.ssr.profiles, route.meta.ssrProfileOptions, route.meta.locale);
|
|
65
|
+
if (ssrProfile === "session") options.res.setHeader("cache-control", "private, no-store");
|
|
66
|
+
const state = { ...options.state };
|
|
63
67
|
const { serverEntry, renderToString, renderTemplate } = this._handlerInstance;
|
|
64
68
|
const onRenderedList = [];
|
|
65
69
|
const ssrContext = {
|
|
66
70
|
...options,
|
|
71
|
+
state,
|
|
67
72
|
_meta: {},
|
|
68
73
|
onRendered: (fn) => {
|
|
69
74
|
onRenderedList.push(fn);
|
|
@@ -100,7 +105,7 @@ var ServiceSsrHandler = (_dec$1 = Service(), _dec2$1 = BeanInfo({ module: "a-ssr
|
|
|
100
105
|
ssrContext._meta.endingHeadTags += this._renderModulesPreload(modules, { ssrContext });
|
|
101
106
|
}
|
|
102
107
|
const html = renderTemplate(ssrContext);
|
|
103
|
-
await this.
|
|
108
|
+
if (ssrProfile === "public") await this._renderPublicResponseCache(options, ssrProfileOptions);
|
|
104
109
|
return html;
|
|
105
110
|
} finally {
|
|
106
111
|
const context = cast(ssrContext);
|
|
@@ -198,25 +203,20 @@ var ServiceSsrHandler = (_dec$1 = Service(), _dec2$1 = BeanInfo({ module: "a-ssr
|
|
|
198
203
|
if (pngRE.test(file) === true) return `<link rel="preload" href="${file}" as="image" type="image/png" crossorigin>`;
|
|
199
204
|
return "";
|
|
200
205
|
}
|
|
201
|
-
async
|
|
206
|
+
async _renderPublicResponseCache(options, ssrProfileOptions) {
|
|
202
207
|
const { res } = options;
|
|
203
|
-
const
|
|
204
|
-
if (
|
|
205
|
-
const
|
|
206
|
-
const expires = typeof
|
|
207
|
-
if (expires === 0) res.
|
|
208
|
-
else res.
|
|
208
|
+
const responseCache = ssrProfileOptions.responseCache;
|
|
209
|
+
if (responseCache === false) return;
|
|
210
|
+
const responseCacheExpires = responseCache.expires ?? 0;
|
|
211
|
+
const expires = typeof responseCacheExpires === "string" ? ms(responseCacheExpires) / 1e3 : responseCacheExpires;
|
|
212
|
+
if (expires === 0) res.setHeader("cache-control", "no-cache, no-store, must-revalidate");
|
|
213
|
+
else res.setHeader("cache-control", `public, max-age=${expires}`);
|
|
209
214
|
}
|
|
210
215
|
}, _descriptor = _applyDecoratedDescriptor(_class2.prototype, "$$sysRouter", [_dec3, _dec4], {
|
|
211
216
|
configurable: true,
|
|
212
217
|
enumerable: true,
|
|
213
218
|
writable: true,
|
|
214
219
|
initializer: null
|
|
215
|
-
}), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "$$scopeSsr", [_dec5, _dec6], {
|
|
216
|
-
configurable: true,
|
|
217
|
-
enumerable: true,
|
|
218
|
-
writable: true,
|
|
219
|
-
initializer: null
|
|
220
220
|
}), _class2)) || _class$1) || _class$1);
|
|
221
221
|
function pathToHref(fileName) {
|
|
222
222
|
return pathToFileURL(fileName).href;
|
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":["var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _class, _class2, _descriptor, _descriptor2;\nfunction _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\nfunction _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\nfunction _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\nimport { \"BeanInfo\" as __z_BeanInfo } from \"zova\";\nimport { catchError } from '@cabloy/utils';\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';\nconst jsRE = /\\.js$/;\nconst cssRE = /\\.css$/;\nconst woffRE = /\\.woff$/;\nconst woff2RE = /\\.woff2$/;\nconst gifRE = /\\.gif$/;\nconst jpgRE = /\\.jpe?g$/;\nconst pngRE = /\\.png$/;\nexport let ServiceSsrHandler = (_dec = Service(), _dec2 = __z_BeanInfo({\n module: \"a-ssrserver\"\n}), _dec3 = Use(\"a-router.sys.router\"), _dec4 = Reflect.metadata(\"design:type\", typeof SysRouter === \"undefined\" ? Object : SysRouter), _dec5 = UseScope(\"a-ssr\"), _dec6 = Reflect.metadata(\"design:type\", typeof ScopeModuleASsr === \"undefined\" ? Object : ScopeModuleASsr), _dec(_class = _dec2(_class = (_class2 = class ServiceSsrHandler extends BeanBase {\n constructor(...args) {\n super(...args);\n this._siteAssetDir = void 0;\n this._handlerPromise = void 0;\n this._handlerInstance = void 0;\n this._clientManifest = void 0;\n this._ssrModulesZovaCache = {};\n _initializerDefineProperty(this, \"$$sysRouter\", _descriptor, this);\n _initializerDefineProperty(this, \"$$scopeSsr\", _descriptor2, this);\n }\n __init__(siteAssetDir) {\n this._siteAssetDir = siteAssetDir;\n }\n __dispose__() {\n this.dispose();\n }\n dispose() {\n this.sys.close();\n this._handlerInstance = undefined;\n }\n async resolvePath(filename) {\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 async render(options) {\n // resolve route\n const pagePathFull = 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 {\n serverEntry,\n renderToString,\n renderTemplate\n } = this._handlerInstance;\n // ssrContext\n const onRenderedList = [];\n const ssrContext = {\n ...options,\n _meta: {},\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;\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 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 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 _clearSsrContext(context) {\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 async ensureReady(handlerNonce) {\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 async _prepareHandler(handlerNonce) {\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, {\n encoding: 'utf-8'\n });\n this._clientManifest = JSON.parse(contentManifest);\n // ok\n return handlerInstance;\n }\n _renderModulesPreload(modules, opts) {\n let links = '';\n const seen = new Set();\n modules.forEach(id => {\n const files = this._clientManifest[id];\n if (files === void 0) return;\n files.forEach(file => {\n if (seen.has(file) === true) return;\n seen.add(file);\n const filename = basename(file);\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 links += this._renderPreloadTag(file, opts);\n });\n });\n return links;\n }\n _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 _resolveUrlPath(url) {\n let publicPath = this.sys.env.APP_PUBLIC_PATH;\n if (publicPath) publicPath = `/${publicPath}`;\n return publicPath + url;\n }\n _renderPreloadTag(file, _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 if (cssRE.test(file) === true) {\n return `<link rel=\"stylesheet\" href=\"${file}\" crossorigin>`;\n }\n if (woffRE.test(file) === true) {\n return `<link rel=\"preload\" href=\"${file}\" as=\"font\" type=\"font/woff\" crossorigin>`;\n }\n if (woff2RE.test(file) === true) {\n return `<link rel=\"preload\" href=\"${file}\" as=\"font\" type=\"font/woff2\" crossorigin>`;\n }\n if (gifRE.test(file) === true) {\n return `<link rel=\"preload\" href=\"${file}\" as=\"image\" type=\"image/gif\" crossorigin>`;\n }\n if (jpgRE.test(file) === true) {\n return `<link rel=\"preload\" href=\"${file}\" as=\"image\" type=\"image/jpeg\" crossorigin>`;\n }\n if (pngRE.test(file) === true) {\n return `<link rel=\"preload\" href=\"${file}\" as=\"image\" type=\"image/png\" crossorigin>`;\n }\n return '';\n }\n async _renderTransferCache(options, route) {\n const {\n res\n } = 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 = typeof transferCacheExpires === 'string' ? ms(transferCacheExpires) / 1000 : 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}, _descriptor = _applyDecoratedDescriptor(_class2.prototype, \"$$sysRouter\", [_dec3, _dec4], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, \"$$scopeSsr\", [_dec5, _dec6], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _class2)) || _class) || _class);\nexport function pathToHref(fileName) {\n return pathToFileURL(fileName).href;\n // return Path.sep === '\\\\' ? pathToFileURL(fileName).href : fileName;\n}","import { BeanSimple } from 'zova';\nimport { ServiceSsrHandler } from './service/ssrHandler.js';\nexport class MonkeySys extends BeanSimple {\n async sysInitialize() {\n this.sys.meta.$getSsrHandler = async siteAssetDir => {\n return await this.sys.bean._getBean(ServiceSsrHandler, false, siteAssetDir);\n };\n }\n}","var _dec, _dec2, _class;\nimport { \"BeanInfo\" as __z_BeanInfo } from \"zova\";\n// eslint-disable\n/** service: begin */\nexport * from '../service/ssrHandler.js';\nimport 'zova-module-a-bean';\n/** service: end */\n/** service: begin */\nimport { ServiceSsrHandler } from '../service/ssrHandler.js';\nimport 'zova';\n/** service: end */\n/** monkeySys: begin */\nexport * from '../monkeySys.js';\n/** monkeySys: end */\n/** scope: begin */\nimport { BeanScopeBase } from 'zova';\nimport { Scope } from 'zova-module-a-bean';\nexport let ScopeModuleASsrserver = (_dec = Scope(), _dec2 = __z_BeanInfo({\n module: \"a-ssrserver\"\n}), _dec(_class = _dec2(_class = class ScopeModuleASsrserver extends BeanScopeBase {}) || _class) || _class);\nimport 'zova';\n\n/** scope: end */"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/service/ssrHandler.ts","../src/monkeySys.ts","../src/.metadata/index.ts"],"sourcesContent":["var _dec, _dec2, _dec3, _dec4, _class, _class2, _descriptor;\nfunction _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }\nfunction _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, (\"value\" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }\nfunction _initializerWarningHelper(r, e) { throw Error(\"Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.\"); }\nimport { \"BeanInfo\" as __z_BeanInfo } from \"zova\";\nimport { catchError } from '@cabloy/utils';\nimport fse from 'fs-extra';\nimport ms from 'ms';\nimport path, { basename } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { BeanBase, cast, Use } from 'zova';\nimport { Service } from 'zova-module-a-bean';\nimport { resolveSsrProfile, resolveSsrProfileOptions } from 'zova-module-a-ssr';\nconst jsRE = /\\.js$/;\nconst cssRE = /\\.css$/;\nconst woffRE = /\\.woff$/;\nconst woff2RE = /\\.woff2$/;\nconst gifRE = /\\.gif$/;\nconst jpgRE = /\\.jpe?g$/;\nconst pngRE = /\\.png$/;\nexport let ServiceSsrHandler = (_dec = Service(), _dec2 = __z_BeanInfo({\n module: \"a-ssrserver\"\n}), _dec3 = Use(\"a-router.sys.router\"), _dec4 = Reflect.metadata(\"design:type\", typeof SysRouter === \"undefined\" ? Object : SysRouter), _dec(_class = _dec2(_class = (_class2 = class ServiceSsrHandler extends BeanBase {\n constructor(...args) {\n super(...args);\n this._siteAssetDir = void 0;\n this._handlerPromise = void 0;\n this._handlerInstance = void 0;\n this._clientManifest = void 0;\n this._ssrModulesZovaCache = {};\n _initializerDefineProperty(this, \"$$sysRouter\", _descriptor, this);\n }\n __init__(siteAssetDir) {\n this._siteAssetDir = siteAssetDir;\n }\n __dispose__() {\n this.dispose();\n }\n dispose() {\n this.sys.close();\n this._handlerInstance = undefined;\n }\n async resolvePath(filename) {\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 async render(options) {\n // resolve route\n const pagePathFull = 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 const ssrProfile = resolveSsrProfile(route.meta.ssrProfile, this.sys.env.SSR_PROFILE);\n const ssrProfileOptions = resolveSsrProfileOptions(ssrProfile, this.sys.config.ssr.profiles, route.meta.ssrProfileOptions, route.meta.locale);\n if (ssrProfile === 'session') {\n options.res.setHeader('cache-control', 'private, no-store');\n }\n const state = {\n ...options.state\n };\n // handler\n const {\n serverEntry,\n renderToString,\n renderTemplate\n } = this._handlerInstance;\n // ssrContext\n const onRenderedList = [];\n const ssrContext = {\n ...options,\n state,\n _meta: {},\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;\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 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 const html = renderTemplate(ssrContext);\n\n // responseCache\n if (ssrProfile === 'public') {\n await this._renderPublicResponseCache(options, ssrProfileOptions);\n }\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 _clearSsrContext(context) {\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 async ensureReady(handlerNonce) {\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 async _prepareHandler(handlerNonce) {\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, {\n encoding: 'utf-8'\n });\n this._clientManifest = JSON.parse(contentManifest);\n // ok\n return handlerInstance;\n }\n _renderModulesPreload(modules, opts) {\n let links = '';\n const seen = new Set();\n modules.forEach(id => {\n const files = this._clientManifest[id];\n if (files === void 0) return;\n files.forEach(file => {\n if (seen.has(file) === true) return;\n seen.add(file);\n const filename = basename(file);\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 links += this._renderPreloadTag(file, opts);\n });\n });\n return links;\n }\n _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 _resolveUrlPath(url) {\n let publicPath = this.sys.env.APP_PUBLIC_PATH;\n if (publicPath) publicPath = `/${publicPath}`;\n return publicPath + url;\n }\n _renderPreloadTag(file, _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 if (cssRE.test(file) === true) {\n return `<link rel=\"stylesheet\" href=\"${file}\" crossorigin>`;\n }\n if (woffRE.test(file) === true) {\n return `<link rel=\"preload\" href=\"${file}\" as=\"font\" type=\"font/woff\" crossorigin>`;\n }\n if (woff2RE.test(file) === true) {\n return `<link rel=\"preload\" href=\"${file}\" as=\"font\" type=\"font/woff2\" crossorigin>`;\n }\n if (gifRE.test(file) === true) {\n return `<link rel=\"preload\" href=\"${file}\" as=\"image\" type=\"image/gif\" crossorigin>`;\n }\n if (jpgRE.test(file) === true) {\n return `<link rel=\"preload\" href=\"${file}\" as=\"image\" type=\"image/jpeg\" crossorigin>`;\n }\n if (pngRE.test(file) === true) {\n return `<link rel=\"preload\" href=\"${file}\" as=\"image\" type=\"image/png\" crossorigin>`;\n }\n return '';\n }\n async _renderPublicResponseCache(options, ssrProfileOptions) {\n const {\n res\n } = options;\n const responseCache = ssrProfileOptions.responseCache;\n if (responseCache === false) return;\n // expires\n const responseCacheExpires = responseCache.expires ?? 0;\n const expires = typeof responseCacheExpires === 'string' ? ms(responseCacheExpires) / 1000 : responseCacheExpires;\n if (expires === 0) {\n res.setHeader('cache-control', 'no-cache, no-store, must-revalidate');\n } else {\n res.setHeader('cache-control', `public, max-age=${expires}`);\n }\n }\n}, _descriptor = _applyDecoratedDescriptor(_class2.prototype, \"$$sysRouter\", [_dec3, _dec4], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _class2)) || _class) || _class);\nexport function pathToHref(fileName) {\n return pathToFileURL(fileName).href;\n // return Path.sep === '\\\\' ? pathToFileURL(fileName).href : fileName;\n}","import { BeanSimple } from 'zova';\nimport { ServiceSsrHandler } from './service/ssrHandler.js';\nexport class MonkeySys extends BeanSimple {\n async sysInitialize() {\n this.sys.meta.$getSsrHandler = async siteAssetDir => {\n return await this.sys.bean._getBean(ServiceSsrHandler, false, siteAssetDir);\n };\n }\n}","var _dec, _dec2, _class;\nimport { \"BeanInfo\" as __z_BeanInfo } from \"zova\";\n// eslint-disable\n/** service: begin */\nexport * from '../service/ssrHandler.js';\nimport 'zova-module-a-bean';\n/** service: end */\n/** service: begin */\nimport { ServiceSsrHandler } from '../service/ssrHandler.js';\nimport 'zova';\n/** service: end */\n/** monkeySys: begin */\nexport * from '../monkeySys.js';\n/** monkeySys: end */\n/** scope: begin */\nimport { BeanScopeBase } from 'zova';\nimport { Scope } from 'zova-module-a-bean';\nexport let ScopeModuleASsrserver = (_dec = Scope(), _dec2 = __z_BeanInfo({\n module: \"a-ssrserver\"\n}), _dec(_class = _dec2(_class = class ScopeModuleASsrserver extends BeanScopeBase {}) || _class) || _class);\nimport 'zova';\n\n/** scope: end */"],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { BeanBase } from 'zova';
|
|
2
2
|
import { SysRouter } from 'zova-module-a-router';
|
|
3
|
-
import { ScopeModuleASsr } from 'zova-module-a-ssr';
|
|
4
3
|
import { ISsrHandlerRenderOptionsInner, TypeEventResolvePathResult } from '../types/ssr.js';
|
|
5
4
|
export declare class ServiceSsrHandler extends BeanBase {
|
|
6
5
|
private _siteAssetDir;
|
|
@@ -9,7 +8,6 @@ export declare class ServiceSsrHandler extends BeanBase {
|
|
|
9
8
|
private _clientManifest;
|
|
10
9
|
private _ssrModulesZovaCache;
|
|
11
10
|
$$sysRouter: SysRouter;
|
|
12
|
-
$$scopeSsr: ScopeModuleASsr;
|
|
13
11
|
protected __init__(siteAssetDir: string): void;
|
|
14
12
|
protected __dispose__(): void;
|
|
15
13
|
dispose(): void;
|
|
@@ -22,7 +20,7 @@ export declare class ServiceSsrHandler extends BeanBase {
|
|
|
22
20
|
private _renderModulesPreload_zova;
|
|
23
21
|
private _resolveUrlPath;
|
|
24
22
|
private _renderPreloadTag;
|
|
25
|
-
private
|
|
23
|
+
private _renderPublicResponseCache;
|
|
26
24
|
}
|
|
27
25
|
export declare function pathToHref(fileName: string): string;
|
|
28
26
|
//# sourceMappingURL=ssrHandler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssrHandler.d.ts","sourceRoot":"","sources":["../../src/service/ssrHandler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ssrHandler.d.ts","sourceRoot":"","sources":["../../src/service/ssrHandler.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAa,MAAM,MAAM,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,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;IAEvB,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,GAAG,OAAO,CAAC,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;IAoG/F,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,0BAA0B;CAmBzC;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGnD"}
|
package/package.json
CHANGED
package/src/.metadata/index.ts
CHANGED
|
@@ -4,15 +4,15 @@ export * from '../service/ssrHandler.js';
|
|
|
4
4
|
|
|
5
5
|
import 'zova-module-a-bean';
|
|
6
6
|
declare module 'zova-module-a-bean' {
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
export interface IServiceRecord {
|
|
9
9
|
'a-ssrserver:ssrHandler': never;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
|
|
13
13
|
}
|
|
14
14
|
declare module 'zova-module-a-ssrserver' {
|
|
15
|
-
|
|
15
|
+
|
|
16
16
|
export interface ServiceSsrHandler {
|
|
17
17
|
/** @internal */
|
|
18
18
|
get scope(): ScopeModuleASsrserver;
|
|
@@ -21,8 +21,8 @@ declare module 'zova-module-a-ssrserver' {
|
|
|
21
21
|
export interface ServiceSsrHandler {
|
|
22
22
|
get $beanFullName(): 'a-ssrserver.service.ssrHandler';
|
|
23
23
|
get $onionName(): 'a-ssrserver:ssrHandler';
|
|
24
|
-
|
|
25
|
-
}
|
|
24
|
+
|
|
25
|
+
}
|
|
26
26
|
}
|
|
27
27
|
/** service: end */
|
|
28
28
|
/** service: begin */
|
|
@@ -53,12 +53,12 @@ declare module 'zova' {
|
|
|
53
53
|
export interface IBeanScopeRecord {
|
|
54
54
|
'a-ssrserver': ScopeModuleASsrserver;
|
|
55
55
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
56
|
|
|
59
|
-
|
|
60
57
|
|
|
61
|
-
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
62
|
}
|
|
63
|
-
|
|
63
|
+
|
|
64
64
|
/** scope: end */
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
+
import type { ISsrProfileOptions } from 'zova-module-a-ssr';
|
|
2
|
+
|
|
1
3
|
import { catchError } from '@cabloy/utils';
|
|
2
|
-
import { RouteLocationResolvedGeneric } from '@cabloy/vue-router';
|
|
3
4
|
import fse from 'fs-extra';
|
|
4
5
|
import ms from 'ms';
|
|
5
6
|
import path, { basename } from 'node:path';
|
|
6
7
|
import { pathToFileURL } from 'node:url';
|
|
7
|
-
import { BeanBase, cast, Use
|
|
8
|
+
import { BeanBase, cast, Use } from 'zova';
|
|
8
9
|
import { Service } from 'zova-module-a-bean';
|
|
9
10
|
import { SysRouter } from 'zova-module-a-router';
|
|
10
|
-
import {
|
|
11
|
+
import { resolveSsrProfile, resolveSsrProfileOptions } from 'zova-module-a-ssr';
|
|
11
12
|
|
|
12
13
|
import { ISsrHandlerRenderOptionsInner, TypeEventResolvePathResult } from '../types/ssr.js';
|
|
13
14
|
|
|
@@ -30,9 +31,6 @@ export class ServiceSsrHandler extends BeanBase {
|
|
|
30
31
|
@Use()
|
|
31
32
|
$$sysRouter: SysRouter;
|
|
32
33
|
|
|
33
|
-
@UseScope()
|
|
34
|
-
$$scopeSsr: ScopeModuleASsr;
|
|
35
|
-
|
|
36
34
|
protected __init__(siteAssetDir: string) {
|
|
37
35
|
this._siteAssetDir = siteAssetDir;
|
|
38
36
|
}
|
|
@@ -61,12 +59,26 @@ export class ServiceSsrHandler extends BeanBase {
|
|
|
61
59
|
options.state?.pagePathFull ?? this.sys.util.getPagePathFromAbsoluteUrl(options.req.url!);
|
|
62
60
|
const route = await this.$$sysRouter.resolveRoute(pagePathFull, true, false);
|
|
63
61
|
if (!route) return;
|
|
62
|
+
const ssrProfile = resolveSsrProfile(route.meta.ssrProfile, this.sys.env.SSR_PROFILE);
|
|
63
|
+
const ssrProfileOptions = resolveSsrProfileOptions(
|
|
64
|
+
ssrProfile,
|
|
65
|
+
this.sys.config.ssr.profiles,
|
|
66
|
+
route.meta.ssrProfileOptions,
|
|
67
|
+
route.meta.locale,
|
|
68
|
+
);
|
|
69
|
+
if (ssrProfile === 'session') {
|
|
70
|
+
options.res.setHeader('cache-control', 'private, no-store');
|
|
71
|
+
}
|
|
72
|
+
const state = {
|
|
73
|
+
...options.state,
|
|
74
|
+
};
|
|
64
75
|
// handler
|
|
65
76
|
const { serverEntry, renderToString, renderTemplate } = this._handlerInstance;
|
|
66
77
|
// ssrContext
|
|
67
78
|
const onRenderedList: Function[] = [];
|
|
68
79
|
const ssrContext = {
|
|
69
80
|
...options,
|
|
81
|
+
state,
|
|
70
82
|
_meta: {} as any,
|
|
71
83
|
onRendered: fn => {
|
|
72
84
|
onRenderedList.push(fn);
|
|
@@ -117,8 +129,10 @@ export class ServiceSsrHandler extends BeanBase {
|
|
|
117
129
|
|
|
118
130
|
const html = renderTemplate(ssrContext);
|
|
119
131
|
|
|
120
|
-
//
|
|
121
|
-
|
|
132
|
+
// responseCache
|
|
133
|
+
if (ssrProfile === 'public') {
|
|
134
|
+
await this._renderPublicResponseCache(options, ssrProfileOptions);
|
|
135
|
+
}
|
|
122
136
|
|
|
123
137
|
// todo: ssg
|
|
124
138
|
|
|
@@ -267,23 +281,23 @@ export class ServiceSsrHandler extends BeanBase {
|
|
|
267
281
|
return '';
|
|
268
282
|
}
|
|
269
283
|
|
|
270
|
-
private async
|
|
284
|
+
private async _renderPublicResponseCache(
|
|
271
285
|
options: ISsrHandlerRenderOptionsInner,
|
|
272
|
-
|
|
286
|
+
ssrProfileOptions: Readonly<ISsrProfileOptions>,
|
|
273
287
|
) {
|
|
274
288
|
const { res } = options;
|
|
275
|
-
const
|
|
276
|
-
if (
|
|
289
|
+
const responseCache = ssrProfileOptions.responseCache;
|
|
290
|
+
if (responseCache === false) return;
|
|
277
291
|
// expires
|
|
278
|
-
const
|
|
292
|
+
const responseCacheExpires = responseCache.expires ?? 0;
|
|
279
293
|
const expires =
|
|
280
|
-
typeof
|
|
281
|
-
? ms(
|
|
282
|
-
:
|
|
294
|
+
typeof responseCacheExpires === 'string'
|
|
295
|
+
? ms(responseCacheExpires) / 1000
|
|
296
|
+
: responseCacheExpires;
|
|
283
297
|
if (expires === 0) {
|
|
284
|
-
res.
|
|
298
|
+
res.setHeader('cache-control', 'no-cache, no-store, must-revalidate');
|
|
285
299
|
} else {
|
|
286
|
-
res.
|
|
300
|
+
res.setHeader('cache-control', `public, max-age=${expires}`);
|
|
287
301
|
}
|
|
288
302
|
}
|
|
289
303
|
}
|