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 CHANGED
@@ -1,12 +1,13 @@
1
- import { BeanBase, BeanInfo, BeanScopeBase, BeanSimple, Use, UseScope, cast } from "zova";
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, _dec5, _dec6, _class$1, _class2, _descriptor, _descriptor2;
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), _dec5 = UseScope("a-ssr"), _dec6 = Reflect.metadata("design:type", typeof ScopeModuleASsr === "undefined" ? Object : ScopeModuleASsr), _dec$1(_class$1 = _dec2$1(_class$1 = (_class2 = class ServiceSsrHandler extends BeanBase {
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._renderTransferCache(options, route);
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 _renderTransferCache(options, route) {
210
+ async _renderPublicResponseCache(options, ssrProfileOptions) {
202
211
  const { res } = options;
203
- const transferCache = route.meta.transferCache ?? this.$$scopeSsr.config.transferCache;
204
- if (transferCache === false) return;
205
- const transferCacheExpires = transferCache.expires ?? 0;
206
- const expires = typeof transferCacheExpires === "string" ? ms(transferCacheExpires) / 1e3 : transferCacheExpires;
207
- if (expires === 0) res.appendHeader("cache-control", "no-cache, no-store, must-revalidate");
208
- else res.appendHeader("cache-control", `public, max-age=${expires}`);
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 _renderTransferCache;
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":"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,GAAG,OAAO,CAAC,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;IAoF/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,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":"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,7 +1,7 @@
1
1
  {
2
2
  "name": "zova-module-a-ssrserver",
3
- "version": "5.1.23",
4
- "gitHead": "93d6ccaace7d8eca543adb7b2dd0b295603eeec0",
3
+ "version": "5.1.24",
4
+ "gitHead": "f56eaba77347037643b625c8e6c5af408ff2d495",
5
5
  "description": "",
6
6
  "keywords": [
7
7
  "Zova Module"
@@ -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, UseScope } from 'zova';
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 { ScopeModuleASsr } from 'zova-module-a-ssr';
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
- // transferCache
121
- await this._renderTransferCache(options, route);
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 _renderTransferCache(
285
+ private async _renderPublicResponseCache(
271
286
  options: ISsrHandlerRenderOptionsInner,
272
- route: RouteLocationResolvedGeneric,
287
+ ssrProfileOptions: Readonly<ISsrProfileOptions>,
273
288
  ) {
274
289
  const { res } = options;
275
- const transferCache = route.meta.transferCache ?? this.$$scopeSsr.config.transferCache;
276
- if (transferCache === false) return;
290
+ const responseCache = ssrProfileOptions.responseCache;
291
+ if (responseCache === false) return;
277
292
  // expires
278
- const transferCacheExpires = transferCache.expires ?? 0;
293
+ const responseCacheExpires = responseCache.expires ?? 0;
279
294
  const expires =
280
- typeof transferCacheExpires === 'string'
281
- ? ms(transferCacheExpires) / 1000
282
- : transferCacheExpires;
295
+ typeof responseCacheExpires === 'string'
296
+ ? ms(responseCacheExpires) / 1000
297
+ : responseCacheExpires;
283
298
  if (expires === 0) {
284
- res.appendHeader('cache-control', 'no-cache, no-store, must-revalidate');
299
+ res.setHeader('cache-control', 'no-cache, no-store, must-revalidate');
285
300
  } else {
286
- res.appendHeader('cache-control', `public, max-age=${expires}`);
301
+ res.setHeader('cache-control', `public, max-age=${expires}`);
287
302
  }
288
303
  }
289
304
  }