@bleedingdev/modern-js-server-core 3.9.0-ultramodern.9 → 3.9.3-ultramodern.2
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/cjs/adapters/node/hono.js +25 -16
- package/dist/cjs/adapters/node/node.js +3 -1
- package/dist/cjs/adapters/node/plugins/static.js +1 -1
- package/dist/cjs/helper.js +1 -1
- package/dist/cjs/plugins/log.js +2 -1
- package/dist/cjs/plugins/render/render.js +4 -4
- package/dist/cjs/plugins/render/ssrCache.js +96 -52
- package/dist/cjs/serverBase.js +2 -2
- package/dist/cjs/utils/transformStream.js +1 -1
- package/dist/esm/adapters/node/hono.mjs +25 -16
- package/dist/esm/adapters/node/node.mjs +3 -1
- package/dist/esm/adapters/node/plugins/static.mjs +1 -1
- package/dist/esm/helper.mjs +1 -1
- package/dist/esm/plugins/log.mjs +2 -1
- package/dist/esm/plugins/render/render.mjs +5 -11
- package/dist/esm/plugins/render/ssrCache.mjs +96 -52
- package/dist/esm/serverBase.mjs +2 -2
- package/dist/esm/utils/transformStream.mjs +1 -1
- package/dist/esm-node/adapters/node/hono.mjs +25 -16
- package/dist/esm-node/adapters/node/node.mjs +3 -1
- package/dist/esm-node/adapters/node/plugins/static.mjs +1 -1
- package/dist/esm-node/helper.mjs +1 -1
- package/dist/esm-node/plugins/log.mjs +2 -1
- package/dist/esm-node/plugins/render/render.mjs +5 -11
- package/dist/esm-node/plugins/render/ssrCache.mjs +96 -52
- package/dist/esm-node/serverBase.mjs +2 -2
- package/dist/esm-node/utils/transformStream.mjs +1 -1
- package/dist/types/adapters/node/plugins/static.d.ts +2 -2
- package/dist/types/types/config/bff.d.ts +1 -1
- package/dist/types/types/config/server.d.ts +8 -3
- package/dist/types/types/config/source.d.ts +1 -1
- package/dist/types/types/server.d.ts +2 -0
- package/package.json +22 -14
- package/dist/esm/rslib-runtime~1.mjs +0 -18
- package/dist/esm-node/rslib-runtime~0.mjs +0 -19
|
@@ -63,29 +63,38 @@ const httpCallBack2HonoMid = (handler)=>async (context, next)=>{
|
|
|
63
63
|
} else await next();
|
|
64
64
|
};
|
|
65
65
|
const noop = ()=>{};
|
|
66
|
-
const connectMid2HonoMid = (handler)=>async (context, next)=>
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
66
|
+
const connectMid2HonoMid = (handler)=>async (context, next)=>{
|
|
67
|
+
const { req, res: rawRes } = context.env.node;
|
|
68
|
+
const res = rawRes;
|
|
69
|
+
if (handler.length < 3) return handler(req, res, noop);
|
|
70
|
+
const continueChain = await new Promise((resolve, reject)=>{
|
|
71
|
+
const onFinish = ()=>{
|
|
72
|
+
context.res;
|
|
73
|
+
context.finalized = true;
|
|
74
|
+
resolve(false);
|
|
75
|
+
};
|
|
76
|
+
res.once?.('finish', onFinish);
|
|
77
|
+
handler(req, res, (err)=>{
|
|
78
|
+
res.removeListener?.('finish', onFinish);
|
|
70
79
|
if (err) reject(err);
|
|
71
|
-
else resolve(
|
|
80
|
+
else resolve(true);
|
|
72
81
|
});
|
|
73
82
|
});
|
|
74
|
-
|
|
83
|
+
if (continueChain) await next();
|
|
84
|
+
};
|
|
85
|
+
const connectMockMid2HonoMid = (handler)=>{
|
|
86
|
+
if (handler.length >= 3) return connectMid2HonoMid(handler);
|
|
87
|
+
return async (context, _next)=>new Promise((resolve)=>{
|
|
75
88
|
const { req, res: rawRes } = context.env.node;
|
|
76
89
|
const res = rawRes;
|
|
77
|
-
|
|
78
|
-
res
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
resolve();
|
|
82
|
-
});
|
|
83
|
-
handler(req, res, noop);
|
|
84
|
-
} else handler(req, res, (err)=>{
|
|
85
|
-
if (err) reject(err);
|
|
86
|
-
else resolve(next());
|
|
90
|
+
res.once?.('finish', ()=>{
|
|
91
|
+
context.res;
|
|
92
|
+
context.finalized = true;
|
|
93
|
+
resolve();
|
|
87
94
|
});
|
|
95
|
+
handler(req, res, noop);
|
|
88
96
|
});
|
|
97
|
+
};
|
|
89
98
|
exports.connectMid2HonoMid = __webpack_exports__.connectMid2HonoMid;
|
|
90
99
|
exports.connectMockMid2HonoMid = __webpack_exports__.connectMockMid2HonoMid;
|
|
91
100
|
exports.httpCallBack2HonoMid = __webpack_exports__.httpCallBack2HonoMid;
|
|
@@ -68,7 +68,9 @@ const createWebRequest = (req, res, body)=>{
|
|
|
68
68
|
headers: headerRecord,
|
|
69
69
|
signal: controller.signal
|
|
70
70
|
};
|
|
71
|
-
res.on('close', ()=>
|
|
71
|
+
res.on('close', ()=>{
|
|
72
|
+
if (!res.writableFinished || req.aborted) controller.abort('res closed');
|
|
73
|
+
});
|
|
72
74
|
const protocol = 'encrypted' in req.socket && req.socket.encrypted ? 'https' : 'http';
|
|
73
75
|
const authority = req.headers[':authority'] ?? req.headers.host;
|
|
74
76
|
const url = `${protocol}://${authority}${req.url}`;
|
|
@@ -199,7 +199,7 @@ function createStaticMiddleware(options) {
|
|
|
199
199
|
respondAsset: options.respondAsset,
|
|
200
200
|
respondPublicFallback: options.respondPublicFallback
|
|
201
201
|
})(c, next);
|
|
202
|
-
{
|
|
202
|
+
else {
|
|
203
203
|
const filepath = external_path_default().join(pwd, pathname.replace(pathPrefix, ()=>''));
|
|
204
204
|
if (!isPathInside(filepath, pwd)) return next();
|
|
205
205
|
if (!await utils_namespaceObject.fs.pathExists(filepath)) return next();
|
package/dist/cjs/helper.js
CHANGED
|
@@ -31,7 +31,7 @@ const LOADER_CONTEXT = 'loaderContext';
|
|
|
31
31
|
function getLoaderCtx(c) {
|
|
32
32
|
const loaderContext = c.get(LOADER_CONTEXT);
|
|
33
33
|
if (loaderContext) return loaderContext;
|
|
34
|
-
{
|
|
34
|
+
else {
|
|
35
35
|
const loaderContext = new Map();
|
|
36
36
|
c.set(LOADER_CONTEXT, loaderContext);
|
|
37
37
|
return loaderContext;
|
package/dist/cjs/plugins/log.js
CHANGED
|
@@ -72,7 +72,8 @@ function logHandler() {
|
|
|
72
72
|
log(logFn, "<--", method, path);
|
|
73
73
|
const start = Date.now();
|
|
74
74
|
await next();
|
|
75
|
-
|
|
75
|
+
const nodeRes = c?.env?.node?.res;
|
|
76
|
+
log(logFn, "-->", method, path, nodeRes?.headersSent ? nodeRes.statusCode : c.res.status, time(start));
|
|
76
77
|
};
|
|
77
78
|
}
|
|
78
79
|
const logPlugin = ()=>({
|
|
@@ -87,8 +87,7 @@ var __webpack_exports__ = {};
|
|
|
87
87
|
void 0,
|
|
88
88
|
{}
|
|
89
89
|
];
|
|
90
|
-
}
|
|
91
|
-
{
|
|
90
|
+
} else {
|
|
92
91
|
const result = matchedRoutes[0];
|
|
93
92
|
if (!result) return [
|
|
94
93
|
void 0,
|
|
@@ -113,6 +112,7 @@ var __webpack_exports__ = {};
|
|
|
113
112
|
return async (req, { monitors, nodeReq, templates, serverManifest, rscClientManifest, rscSSRManifest, rscServerManifest, locals, matchEntryName, matchPathname, loaderContext, serverContext, contextForceCSR, reporter })=>{
|
|
114
113
|
const forMatchpathname = matchPathname ?? (0, index_js_namespaceObject.getPathname)(req);
|
|
115
114
|
const [routeInfo, params] = matchRoute(router, forMatchpathname, matchEntryName);
|
|
115
|
+
serverContext?.set('renderRoute', routeInfo);
|
|
116
116
|
const framework = (0, universal_namespaceObject.cutNameByHyphen)(metaName || 'modern-js');
|
|
117
117
|
const fallbackHeader = `x-${framework}-ssr-fallback`;
|
|
118
118
|
let fallbackReason = null;
|
|
@@ -243,7 +243,7 @@ var __webpack_exports__ = {};
|
|
|
243
243
|
if (req.headers.get('x-rsc-action')) return 'rsc-action';
|
|
244
244
|
if (req.headers.get('x-rsc-tree')) return 'rsc-tree';
|
|
245
245
|
if (!isSSR) return 'csr';
|
|
246
|
-
{
|
|
246
|
+
else {
|
|
247
247
|
if (query.__loader) return 'data';
|
|
248
248
|
const fallbackHeaderValue = req.headers.get(fallbackHeader) || nodeReq?.headers[fallbackHeader];
|
|
249
249
|
if (forceCSR && (query.csr || fallbackHeaderValue || contextForceCSR)) {
|
|
@@ -272,7 +272,7 @@ var __webpack_exports__ = {};
|
|
|
272
272
|
[external_constants_js_namespaceObject.X_MODERNJS_RENDER]: 'client'
|
|
273
273
|
})
|
|
274
274
|
});
|
|
275
|
-
return (0, external_csrRscRender_js_namespaceObject.csrRscRender)(request, options);
|
|
275
|
+
else return (0, external_csrRscRender_js_namespaceObject.csrRscRender)(request, options);
|
|
276
276
|
}
|
|
277
277
|
})();
|
|
278
278
|
exports.createRender = __webpack_exports__.createRender;
|
|
@@ -35,54 +35,88 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
35
35
|
const storer_namespaceObject = require("@modern-js/runtime-utils/storer");
|
|
36
36
|
const external_constants_js_namespaceObject = require("../../constants.js");
|
|
37
37
|
const index_js_namespaceObject = require("../../utils/index.js");
|
|
38
|
+
const preventsSharedCaching = (headers)=>/(?:^|,)\s*(?:private|no-store|no-cache)\s*(?:[=,]|$)/i.test(headers.get('cache-control') || '');
|
|
39
|
+
const isCacheableResponse = (response)=>200 === response.status && !preventsSharedCaching(response.headers) && !response.headers.has('set-cookie') && !response.headers.get('vary');
|
|
38
40
|
const removeTailSlash = (s)=>s.replace(/\/+$/, '');
|
|
39
41
|
const ZERO_RENDER_LEVEL = /"renderLevel":0/;
|
|
40
42
|
const NO_SSR_CACHE = /<meta\s+[^>]*name=["']no-ssr-cache["'][^>]*>/i;
|
|
41
43
|
async function processCache({ request, key, requestHandler, requestHandlerOptions, ttl, container, cacheStatus }) {
|
|
42
44
|
const response = await requestHandler(request, requestHandlerOptions);
|
|
43
45
|
const { onError } = requestHandlerOptions;
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
46
|
+
const deleteCache = async ()=>{
|
|
47
|
+
try {
|
|
48
|
+
await container.delete(key);
|
|
49
|
+
} catch {
|
|
50
|
+
(onError || console.error)('[render-cache] delete cache failed');
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
if (!isCacheableResponse(response) || !response.body) {
|
|
54
|
+
await deleteCache();
|
|
55
|
+
return response;
|
|
56
|
+
}
|
|
57
|
+
const headers = Object.fromEntries(response.headers);
|
|
56
58
|
const decoder = new TextDecoder();
|
|
57
59
|
if (response.body) {
|
|
58
60
|
const stream = (0, index_js_namespaceObject.createTransformStream)();
|
|
59
61
|
const reader = response.body.getReader();
|
|
60
62
|
const writer = stream.writable.getWriter();
|
|
61
63
|
let html = '';
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
64
|
+
let cancelled = false;
|
|
65
|
+
const cancel = async (reason)=>{
|
|
66
|
+
cancelled = true;
|
|
67
|
+
await reader.cancel(reason);
|
|
68
|
+
};
|
|
69
|
+
writer.closed.catch(cancel).catch(()=>{});
|
|
70
|
+
const onAbort = ()=>{
|
|
71
|
+
Promise.allSettled([
|
|
72
|
+
cancel(request.signal.reason),
|
|
73
|
+
writer.abort(request.signal.reason)
|
|
74
|
+
]);
|
|
75
|
+
};
|
|
76
|
+
request.signal.addEventListener('abort', onAbort, {
|
|
77
|
+
once: true
|
|
78
|
+
});
|
|
79
|
+
if (request.signal.aborted) onAbort();
|
|
80
|
+
const pumping = (async ()=>{
|
|
81
|
+
try {
|
|
82
|
+
for(;;){
|
|
83
|
+
const { done, value } = await reader.read();
|
|
84
|
+
if (cancelled) return;
|
|
85
|
+
if (done) break;
|
|
86
|
+
html += decoder.decode(value, {
|
|
87
|
+
stream: true
|
|
88
|
+
});
|
|
89
|
+
await writer.write(value);
|
|
90
|
+
}
|
|
91
|
+
html += decoder.decode();
|
|
92
|
+
await writer.close();
|
|
93
|
+
if (cancelled) return;
|
|
94
|
+
if (ZERO_RENDER_LEVEL.test(html) || NO_SSR_CACHE.test(html)) return void await deleteCache();
|
|
95
|
+
const cache = {
|
|
96
|
+
val: html,
|
|
97
|
+
cursor: Date.now(),
|
|
98
|
+
headers
|
|
99
|
+
};
|
|
100
|
+
try {
|
|
101
|
+
await container.set(key, JSON.stringify(cache), {
|
|
72
102
|
ttl
|
|
73
|
-
}).catch(()=>{
|
|
74
|
-
if (onError) onError(`[render-cache] set cache failed, key: ${key}, value: ${JSON.stringify(cache)}`);
|
|
75
|
-
else console.error(`[render-cache] set cache failed, key: ${key}, value: ${JSON.stringify(cache)}`);
|
|
76
103
|
});
|
|
77
|
-
|
|
78
|
-
|
|
104
|
+
} catch (error) {
|
|
105
|
+
(onError || console.error)('[render-cache] set cache failed');
|
|
79
106
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
107
|
+
} catch (error) {
|
|
108
|
+
await Promise.allSettled([
|
|
109
|
+
cancel(error),
|
|
110
|
+
writer.abort(error)
|
|
111
|
+
]);
|
|
112
|
+
if (cacheStatus) try {
|
|
113
|
+
(onError || console.error)('[render-cache] response stream failed');
|
|
114
|
+
} catch {}
|
|
115
|
+
} finally{
|
|
116
|
+
request.signal.removeEventListener('abort', onAbort);
|
|
117
|
+
}
|
|
118
|
+
})();
|
|
119
|
+
pumping.catch(()=>{});
|
|
86
120
|
cacheStatus && response.headers.set(external_constants_js_namespaceObject.X_RENDER_CACHE, cacheStatus);
|
|
87
121
|
return new Response(stream.readable, {
|
|
88
122
|
status: response.status,
|
|
@@ -97,9 +131,12 @@ function computedKey(req, cacheControl) {
|
|
|
97
131
|
const pathname = (0, index_js_namespaceObject.getPathname)(req);
|
|
98
132
|
const { customKey } = cacheControl;
|
|
99
133
|
const defaultKey = '/' === pathname ? pathname : removeTailSlash(pathname);
|
|
100
|
-
if (
|
|
101
|
-
|
|
102
|
-
|
|
134
|
+
if (customKey) if ('string' == typeof customKey) return customKey;
|
|
135
|
+
else return customKey(defaultKey);
|
|
136
|
+
else {
|
|
137
|
+
const url = new URL(req.url);
|
|
138
|
+
return `${url.origin}${defaultKey}${url.search}`;
|
|
139
|
+
}
|
|
103
140
|
}
|
|
104
141
|
function shouldUseCache(request) {
|
|
105
142
|
const url = new URL(request.url);
|
|
@@ -110,7 +147,7 @@ function shouldUseCache(request) {
|
|
|
110
147
|
}
|
|
111
148
|
function matchCacheControl(cacheOption, req) {
|
|
112
149
|
if (!cacheOption || !req) return;
|
|
113
|
-
{
|
|
150
|
+
else {
|
|
114
151
|
if (isCacheControl(cacheOption)) return cacheOption;
|
|
115
152
|
if (isCacheOptionProvider(cacheOption)) return cacheOption(req);
|
|
116
153
|
const url = req.url;
|
|
@@ -129,13 +166,15 @@ function matchCacheControl(cacheOption, req) {
|
|
|
129
166
|
async function getCacheResult(request, options) {
|
|
130
167
|
const { cacheControl, container = storage, requestHandler, requestHandlerOptions } = options;
|
|
131
168
|
const { onError } = requestHandlerOptions;
|
|
132
|
-
const
|
|
169
|
+
const hasCredentials = request.headers.has('cookie') || request.headers.has('authorization');
|
|
170
|
+
if ('GET' !== request.method || !shouldUseCache(request) || preventsSharedCaching(request.headers) || hasCredentials && !cacheControl.customKey) return requestHandler(request, requestHandlerOptions);
|
|
171
|
+
const key = `${CACHE_NAMESPACE}:v2:${computedKey(request, cacheControl)}`;
|
|
133
172
|
let value;
|
|
134
173
|
try {
|
|
135
174
|
value = await container.get(key);
|
|
136
175
|
} catch (_) {
|
|
137
|
-
if (onError) onError(
|
|
138
|
-
else console.error(
|
|
176
|
+
if (onError) onError('[render-cache] get cache failed');
|
|
177
|
+
else console.error('[render-cache] get cache failed');
|
|
139
178
|
value = void 0;
|
|
140
179
|
}
|
|
141
180
|
const { maxAge, staleWhileRevalidate } = cacheControl;
|
|
@@ -149,27 +188,27 @@ async function getCacheResult(request, options) {
|
|
|
149
188
|
container,
|
|
150
189
|
cacheStatus: 'miss'
|
|
151
190
|
});
|
|
152
|
-
{
|
|
191
|
+
else {
|
|
153
192
|
const cache = JSON.parse(value);
|
|
154
193
|
const interval = Date.now() - cache.cursor;
|
|
155
194
|
if (interval <= maxAge) {
|
|
156
195
|
const cacheStatus = 'hit';
|
|
157
196
|
return new Response(cache.val, {
|
|
158
197
|
headers: {
|
|
198
|
+
...cache.headers,
|
|
159
199
|
[external_constants_js_namespaceObject.X_RENDER_CACHE]: cacheStatus
|
|
160
200
|
}
|
|
161
201
|
});
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
{
|
|
202
|
+
} else {
|
|
203
|
+
if (!(interval <= staleWhileRevalidate + maxAge)) return processCache({
|
|
204
|
+
key,
|
|
205
|
+
request,
|
|
206
|
+
requestHandler,
|
|
207
|
+
requestHandlerOptions,
|
|
208
|
+
ttl,
|
|
209
|
+
container,
|
|
210
|
+
cacheStatus: 'expired'
|
|
211
|
+
});
|
|
173
212
|
processCache({
|
|
174
213
|
key,
|
|
175
214
|
request,
|
|
@@ -179,10 +218,15 @@ async function getCacheResult(request, options) {
|
|
|
179
218
|
container
|
|
180
219
|
}).then(async (response)=>{
|
|
181
220
|
await response.text();
|
|
221
|
+
}).catch((error)=>{
|
|
222
|
+
try {
|
|
223
|
+
(onError || console.error)('[render-cache] revalidation failed');
|
|
224
|
+
} catch {}
|
|
182
225
|
});
|
|
183
226
|
const cacheStatus = 'stale';
|
|
184
227
|
return new Response(cache.val, {
|
|
185
228
|
headers: {
|
|
229
|
+
...cache.headers,
|
|
186
230
|
[external_constants_js_namespaceObject.X_RENDER_CACHE]: cacheStatus
|
|
187
231
|
}
|
|
188
232
|
});
|
package/dist/cjs/serverBase.js
CHANGED
|
@@ -179,7 +179,7 @@ function applyMiddlewares() {
|
|
|
179
179
|
if (middleware.before) {
|
|
180
180
|
const targetIndex = finalMiddlewares.findIndex((item)=>{
|
|
181
181
|
if (middleware.before?.includes(item.name)) return true;
|
|
182
|
-
return false;
|
|
182
|
+
else return false;
|
|
183
183
|
});
|
|
184
184
|
if (-1 !== targetIndex) finalMiddlewares.splice(targetIndex, 0, middleware);
|
|
185
185
|
else finalMiddlewares.push(middleware);
|
|
@@ -200,7 +200,7 @@ function applyMiddlewares() {
|
|
|
200
200
|
}
|
|
201
201
|
function handler2Handlers(handler) {
|
|
202
202
|
if (Array.isArray(handler)) return handler;
|
|
203
|
-
return [
|
|
203
|
+
else return [
|
|
204
204
|
handler
|
|
205
205
|
];
|
|
206
206
|
}
|
|
@@ -43,7 +43,7 @@ function transformResponse(response, transformCb) {
|
|
|
43
43
|
if (response.body) {
|
|
44
44
|
const stream = createTransformStream(async (before)=>{
|
|
45
45
|
if (Array.isArray(transformCb)) return transformCb.reduce(async (before, cb)=>cb(await before), Promise.resolve(before));
|
|
46
|
-
return transformCb(before);
|
|
46
|
+
else return transformCb(before);
|
|
47
47
|
});
|
|
48
48
|
response.body.pipeThrough(stream);
|
|
49
49
|
readable = stream.readable;
|
|
@@ -29,27 +29,36 @@ const httpCallBack2HonoMid = (handler)=>async (context, next)=>{
|
|
|
29
29
|
} else await next();
|
|
30
30
|
};
|
|
31
31
|
const noop = ()=>{};
|
|
32
|
-
const connectMid2HonoMid = (handler)=>async (context, next)=>
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
const connectMid2HonoMid = (handler)=>async (context, next)=>{
|
|
33
|
+
const { req, res: rawRes } = context.env.node;
|
|
34
|
+
const res = rawRes;
|
|
35
|
+
if (handler.length < 3) return handler(req, res, noop);
|
|
36
|
+
const continueChain = await new Promise((resolve, reject)=>{
|
|
37
|
+
const onFinish = ()=>{
|
|
38
|
+
context.res;
|
|
39
|
+
context.finalized = true;
|
|
40
|
+
resolve(false);
|
|
41
|
+
};
|
|
42
|
+
res.once?.('finish', onFinish);
|
|
43
|
+
handler(req, res, (err)=>{
|
|
44
|
+
res.removeListener?.('finish', onFinish);
|
|
36
45
|
if (err) reject(err);
|
|
37
|
-
else resolve(
|
|
46
|
+
else resolve(true);
|
|
38
47
|
});
|
|
39
48
|
});
|
|
40
|
-
|
|
49
|
+
if (continueChain) await next();
|
|
50
|
+
};
|
|
51
|
+
const connectMockMid2HonoMid = (handler)=>{
|
|
52
|
+
if (handler.length >= 3) return connectMid2HonoMid(handler);
|
|
53
|
+
return async (context, _next)=>new Promise((resolve)=>{
|
|
41
54
|
const { req, res: rawRes } = context.env.node;
|
|
42
55
|
const res = rawRes;
|
|
43
|
-
|
|
44
|
-
res
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
resolve();
|
|
48
|
-
});
|
|
49
|
-
handler(req, res, noop);
|
|
50
|
-
} else handler(req, res, (err)=>{
|
|
51
|
-
if (err) reject(err);
|
|
52
|
-
else resolve(next());
|
|
56
|
+
res.once?.('finish', ()=>{
|
|
57
|
+
context.res;
|
|
58
|
+
context.finalized = true;
|
|
59
|
+
resolve();
|
|
53
60
|
});
|
|
61
|
+
handler(req, res, noop);
|
|
54
62
|
});
|
|
63
|
+
};
|
|
55
64
|
export { connectMid2HonoMid, connectMockMid2HonoMid, httpCallBack2HonoMid };
|
|
@@ -24,7 +24,9 @@ const createWebRequest = (req, res, body)=>{
|
|
|
24
24
|
headers: headerRecord,
|
|
25
25
|
signal: controller.signal
|
|
26
26
|
};
|
|
27
|
-
res.on('close', ()=>
|
|
27
|
+
res.on('close', ()=>{
|
|
28
|
+
if (!res.writableFinished || req.aborted) controller.abort('res closed');
|
|
29
|
+
});
|
|
28
30
|
const protocol = 'encrypted' in req.socket && req.socket.encrypted ? 'https' : 'http';
|
|
29
31
|
const authority = req.headers[':authority'] ?? req.headers.host;
|
|
30
32
|
const url = `${protocol}://${authority}${req.url}`;
|
|
@@ -154,7 +154,7 @@ function createStaticMiddleware(options) {
|
|
|
154
154
|
respondAsset: options.respondAsset,
|
|
155
155
|
respondPublicFallback: options.respondPublicFallback
|
|
156
156
|
})(c, next);
|
|
157
|
-
{
|
|
157
|
+
else {
|
|
158
158
|
const filepath = path.join(pwd, pathname.replace(pathPrefix, ()=>''));
|
|
159
159
|
if (!isPathInside(filepath, pwd)) return next();
|
|
160
160
|
if (!await fs.pathExists(filepath)) return next();
|
package/dist/esm/helper.mjs
CHANGED
|
@@ -2,7 +2,7 @@ const LOADER_CONTEXT = 'loaderContext';
|
|
|
2
2
|
function getLoaderCtx(c) {
|
|
3
3
|
const loaderContext = c.get(LOADER_CONTEXT);
|
|
4
4
|
if (loaderContext) return loaderContext;
|
|
5
|
-
{
|
|
5
|
+
else {
|
|
6
6
|
const loaderContext = new Map();
|
|
7
7
|
c.set(LOADER_CONTEXT, loaderContext);
|
|
8
8
|
return loaderContext;
|
package/dist/esm/plugins/log.mjs
CHANGED
|
@@ -40,7 +40,8 @@ function logHandler() {
|
|
|
40
40
|
log(logFn, "<--", method, path);
|
|
41
41
|
const start = Date.now();
|
|
42
42
|
await next();
|
|
43
|
-
|
|
43
|
+
const nodeRes = c?.env?.node?.res;
|
|
44
|
+
log(logFn, "-->", method, path, nodeRes?.headersSent ? nodeRes.statusCode : c.res.status, time(start));
|
|
44
45
|
};
|
|
45
46
|
}
|
|
46
47
|
const logPlugin = ()=>({
|
|
@@ -7,12 +7,6 @@ import { dataHandler } from "./dataHandler.mjs";
|
|
|
7
7
|
import { renderRscHandler } from "./renderRscHandler.mjs";
|
|
8
8
|
import { serverActionHandler } from "./serverActionHandler.mjs";
|
|
9
9
|
import { ssrRender } from "./ssrRender.mjs";
|
|
10
|
-
import { __webpack_require__ } from "../../rslib-runtime~1.mjs";
|
|
11
|
-
__webpack_require__.add({
|
|
12
|
-
718 (module) {
|
|
13
|
-
module.exports = require("@modern-js/runtime-utils/router");
|
|
14
|
-
}
|
|
15
|
-
});
|
|
16
10
|
const DYNAMIC_ROUTE_REG = /\/:./;
|
|
17
11
|
function getRouter(routes) {
|
|
18
12
|
const dynamicRoutes = [];
|
|
@@ -45,8 +39,7 @@ function matchRoute(router, pathname, entryName) {
|
|
|
45
39
|
void 0,
|
|
46
40
|
{}
|
|
47
41
|
];
|
|
48
|
-
}
|
|
49
|
-
{
|
|
42
|
+
} else {
|
|
50
43
|
const result = matchedRoutes[0];
|
|
51
44
|
if (!result) return [
|
|
52
45
|
void 0,
|
|
@@ -71,6 +64,7 @@ async function createRender({ routes, pwd, metaName, staticGenerate, cacheConfig
|
|
|
71
64
|
return async (req, { monitors, nodeReq, templates, serverManifest, rscClientManifest, rscSSRManifest, rscServerManifest, locals, matchEntryName, matchPathname, loaderContext, serverContext, contextForceCSR, reporter })=>{
|
|
72
65
|
const forMatchpathname = matchPathname ?? getPathname(req);
|
|
73
66
|
const [routeInfo, params] = matchRoute(router, forMatchpathname, matchEntryName);
|
|
67
|
+
serverContext?.set('renderRoute', routeInfo);
|
|
74
68
|
const framework = cutNameByHyphen(metaName || 'modern-js');
|
|
75
69
|
const fallbackHeader = `x-${framework}-ssr-fallback`;
|
|
76
70
|
let fallbackReason = null;
|
|
@@ -163,7 +157,7 @@ async function renderHandler(request, options, mode, fallbackWrapper, framework)
|
|
|
163
157
|
const { nestedRoutesJson } = serverManifest;
|
|
164
158
|
const routes = nestedRoutesJson?.[options.routeInfo.entryName];
|
|
165
159
|
if (routes) {
|
|
166
|
-
const { matchRoutes } =
|
|
160
|
+
const { matchRoutes } = require("@modern-js/runtime-utils/router");
|
|
167
161
|
const url = new URL(request.url);
|
|
168
162
|
const matchedRoutes = matchRoutes(routes, url.pathname, options.routeInfo.urlPath);
|
|
169
163
|
if (matchedRoutes) {
|
|
@@ -201,7 +195,7 @@ async function getRenderMode(req, fallbackHeader, isSSR, forceCSR, nodeReq, onFa
|
|
|
201
195
|
if (req.headers.get('x-rsc-action')) return 'rsc-action';
|
|
202
196
|
if (req.headers.get('x-rsc-tree')) return 'rsc-tree';
|
|
203
197
|
if (!isSSR) return 'csr';
|
|
204
|
-
{
|
|
198
|
+
else {
|
|
205
199
|
if (query.__loader) return 'data';
|
|
206
200
|
const fallbackHeaderValue = req.headers.get(fallbackHeader) || nodeReq?.headers[fallbackHeader];
|
|
207
201
|
if (forceCSR && (query.csr || fallbackHeaderValue || contextForceCSR)) {
|
|
@@ -230,6 +224,6 @@ async function csrRender(request, options) {
|
|
|
230
224
|
[X_MODERNJS_RENDER]: 'client'
|
|
231
225
|
})
|
|
232
226
|
});
|
|
233
|
-
return csrRscRender(request, options);
|
|
227
|
+
else return csrRscRender(request, options);
|
|
234
228
|
}
|
|
235
229
|
export { createRender, matchRoute };
|