zova-module-a-ssrserver 5.1.23 → 5.1.24
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 +21 -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/service/ssrHandler.ts +33 -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,19 @@ 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);
|
|
65
|
+
if (ssrProfile === "session") options.res.setHeader("cache-control", "private, no-store");
|
|
66
|
+
const state = {
|
|
67
|
+
...options.state,
|
|
68
|
+
ssrProfile,
|
|
69
|
+
ssrProfileOptions
|
|
70
|
+
};
|
|
63
71
|
const { serverEntry, renderToString, renderTemplate } = this._handlerInstance;
|
|
64
72
|
const onRenderedList = [];
|
|
65
73
|
const ssrContext = {
|
|
66
74
|
...options,
|
|
75
|
+
state,
|
|
67
76
|
_meta: {},
|
|
68
77
|
onRendered: (fn) => {
|
|
69
78
|
onRenderedList.push(fn);
|
|
@@ -100,7 +109,7 @@ var ServiceSsrHandler = (_dec$1 = Service(), _dec2$1 = BeanInfo({ module: "a-ssr
|
|
|
100
109
|
ssrContext._meta.endingHeadTags += this._renderModulesPreload(modules, { ssrContext });
|
|
101
110
|
}
|
|
102
111
|
const html = renderTemplate(ssrContext);
|
|
103
|
-
await this.
|
|
112
|
+
if (ssrProfile === "public") await this._renderPublicResponseCache(options, ssrProfileOptions);
|
|
104
113
|
return html;
|
|
105
114
|
} finally {
|
|
106
115
|
const context = cast(ssrContext);
|
|
@@ -198,25 +207,20 @@ var ServiceSsrHandler = (_dec$1 = Service(), _dec2$1 = BeanInfo({ module: "a-ssr
|
|
|
198
207
|
if (pngRE.test(file) === true) return `<link rel="preload" href="${file}" as="image" type="image/png" crossorigin>`;
|
|
199
208
|
return "";
|
|
200
209
|
}
|
|
201
|
-
async
|
|
210
|
+
async _renderPublicResponseCache(options, ssrProfileOptions) {
|
|
202
211
|
const { res } = options;
|
|
203
|
-
const
|
|
204
|
-
if (
|
|
205
|
-
const
|
|
206
|
-
const expires = typeof
|
|
207
|
-
if (expires === 0) res.
|
|
208
|
-
else res.
|
|
212
|
+
const responseCache = ssrProfileOptions.responseCache;
|
|
213
|
+
if (responseCache === false) return;
|
|
214
|
+
const responseCacheExpires = responseCache.expires ?? 0;
|
|
215
|
+
const expires = typeof responseCacheExpires === "string" ? ms(responseCacheExpires) / 1e3 : responseCacheExpires;
|
|
216
|
+
if (expires === 0) res.setHeader("cache-control", "no-cache, no-store, must-revalidate");
|
|
217
|
+
else res.setHeader("cache-control", `public, max-age=${expires}`);
|
|
209
218
|
}
|
|
210
219
|
}, _descriptor = _applyDecoratedDescriptor(_class2.prototype, "$$sysRouter", [_dec3, _dec4], {
|
|
211
220
|
configurable: true,
|
|
212
221
|
enumerable: true,
|
|
213
222
|
writable: true,
|
|
214
223
|
initializer: null
|
|
215
|
-
}), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "$$scopeSsr", [_dec5, _dec6], {
|
|
216
|
-
configurable: true,
|
|
217
|
-
enumerable: true,
|
|
218
|
-
writable: true,
|
|
219
|
-
initializer: null
|
|
220
224
|
}), _class2)) || _class$1) || _class$1);
|
|
221
225
|
function pathToHref(fileName) {
|
|
222
226
|
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);\n if (ssrProfile === 'session') {\n options.res.setHeader('cache-control', 'private, no-store');\n }\n const state = {\n ...options.state,\n ssrProfile,\n ssrProfileOptions\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;IAqG/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
|
@@ -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,27 @@ 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
|
+
);
|
|
68
|
+
if (ssrProfile === 'session') {
|
|
69
|
+
options.res.setHeader('cache-control', 'private, no-store');
|
|
70
|
+
}
|
|
71
|
+
const state = {
|
|
72
|
+
...options.state,
|
|
73
|
+
ssrProfile,
|
|
74
|
+
ssrProfileOptions,
|
|
75
|
+
};
|
|
64
76
|
// handler
|
|
65
77
|
const { serverEntry, renderToString, renderTemplate } = this._handlerInstance;
|
|
66
78
|
// ssrContext
|
|
67
79
|
const onRenderedList: Function[] = [];
|
|
68
80
|
const ssrContext = {
|
|
69
81
|
...options,
|
|
82
|
+
state,
|
|
70
83
|
_meta: {} as any,
|
|
71
84
|
onRendered: fn => {
|
|
72
85
|
onRenderedList.push(fn);
|
|
@@ -117,8 +130,10 @@ export class ServiceSsrHandler extends BeanBase {
|
|
|
117
130
|
|
|
118
131
|
const html = renderTemplate(ssrContext);
|
|
119
132
|
|
|
120
|
-
//
|
|
121
|
-
|
|
133
|
+
// responseCache
|
|
134
|
+
if (ssrProfile === 'public') {
|
|
135
|
+
await this._renderPublicResponseCache(options, ssrProfileOptions);
|
|
136
|
+
}
|
|
122
137
|
|
|
123
138
|
// todo: ssg
|
|
124
139
|
|
|
@@ -267,23 +282,23 @@ export class ServiceSsrHandler extends BeanBase {
|
|
|
267
282
|
return '';
|
|
268
283
|
}
|
|
269
284
|
|
|
270
|
-
private async
|
|
285
|
+
private async _renderPublicResponseCache(
|
|
271
286
|
options: ISsrHandlerRenderOptionsInner,
|
|
272
|
-
|
|
287
|
+
ssrProfileOptions: Readonly<ISsrProfileOptions>,
|
|
273
288
|
) {
|
|
274
289
|
const { res } = options;
|
|
275
|
-
const
|
|
276
|
-
if (
|
|
290
|
+
const responseCache = ssrProfileOptions.responseCache;
|
|
291
|
+
if (responseCache === false) return;
|
|
277
292
|
// expires
|
|
278
|
-
const
|
|
293
|
+
const responseCacheExpires = responseCache.expires ?? 0;
|
|
279
294
|
const expires =
|
|
280
|
-
typeof
|
|
281
|
-
? ms(
|
|
282
|
-
:
|
|
295
|
+
typeof responseCacheExpires === 'string'
|
|
296
|
+
? ms(responseCacheExpires) / 1000
|
|
297
|
+
: responseCacheExpires;
|
|
283
298
|
if (expires === 0) {
|
|
284
|
-
res.
|
|
299
|
+
res.setHeader('cache-control', 'no-cache, no-store, must-revalidate');
|
|
285
300
|
} else {
|
|
286
|
-
res.
|
|
301
|
+
res.setHeader('cache-control', `public, max-age=${expires}`);
|
|
287
302
|
}
|
|
288
303
|
}
|
|
289
304
|
}
|