Skip to content

Commit ca610bf

Browse files
committed
fix: improve runtime context logic
1 parent 98a1e79 commit ca610bf

File tree

8 files changed

+50
-39
lines changed

8 files changed

+50
-39
lines changed

Diff for: packages/runtime/plugin-runtime/src/core/browser/index.tsx

+10-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
import cookieTool from 'cookie';
22
import type React from 'react';
33
import { getGlobalAppInit, getGlobalInternalRuntimeContext } from '../context';
4-
import { type RuntimeContext, getInitialContext } from '../context/runtime';
4+
import {
5+
type RuntimeContext,
6+
getInitialContext,
7+
makeRequestContext,
8+
} from '../context/runtime';
59
import { createLoaderManager } from '../loader/loaderManager';
610
import { wrapRuntimeContextProvider } from '../react/wrapper';
711
import type { SSRContainer } from '../types';
@@ -33,12 +37,12 @@ const getQuery = () =>
3337
return res;
3438
}, {});
3539

36-
function getSSRData(): SSRContainer & ExtraSSRContainer {
40+
function getSSRData(): SSRContainer {
3741
const ssrData = window._SSR_DATA;
3842

3943
const ssrRequest = ssrData?.context?.request;
4044

41-
const finalSSRData: SSRContainer & ExtraSSRContainer = {
45+
const finalSSRData: SSRContainer = {
4246
...(ssrData || {
4347
renderLevel: 0,
4448
mode: 'string',
@@ -117,8 +121,10 @@ export async function render(
117121
}),
118122
// garfish plugin params
119123
_internalRouterBaseName: App.props.basename,
120-
...{ ssrContext: ssrData.context },
124+
ssrContext: ssrData.context,
121125
});
126+
const requestContext = makeRequestContext(context);
127+
context.context = requestContext;
122128

123129
context.initialData = ssrData.data?.initialData;
124130
const initialData = await runBeforeRender(context);

Diff for: packages/runtime/plugin-runtime/src/core/compatible.tsx

+5-15
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
type RuntimeContext,
1111
RuntimeReactContext,
1212
type TRuntimeContext,
13+
makeRequestContext,
1314
} from './context/runtime';
1415
import { createLoaderManager } from './loader/loaderManager';
1516
import { type Plugin, registerPlugin } from './plugin';
@@ -146,8 +147,10 @@ export const bootstrap: BootStrap = async (
146147
loaderManager: createLoaderManager(initialLoadersState, {
147148
skipStatic: true,
148149
}),
149-
...(ssrData ? { ssrContext: ssrData?.context } : {}),
150+
ssrContext: ssrData?.context,
150151
});
152+
const requestContext = makeRequestContext(context);
153+
context.context = requestContext;
151154

152155
context.initialData = ssrData?.data?.initialData;
153156
const initialData = await runBeforeRender(context);
@@ -228,23 +231,10 @@ export const bootstrap: BootStrap = async (
228231
export const useRuntimeContext = () => {
229232
const context = useContext(RuntimeReactContext);
230233

231-
const baseSSRContext = context.ssrContext;
232-
const tSSRContext = baseSSRContext
233-
? {
234-
isBrowser: context.isBrowser,
235-
request: baseSSRContext.request || ({} as TSSRContext['request']),
236-
response: baseSSRContext.response || ({} as TSSRContext['response']),
237-
logger: baseSSRContext.logger || ({} as TSSRContext['logger']),
238-
getInitData: () => {
239-
return Object.freeze(context.initialData);
240-
},
241-
}
242-
: ({} as TSSRContext);
243-
244234
// TODO: Here we should not provide all the RuntimeReactContext to the user
245235
const pickedContext: TRuntimeContext = {
246236
...context,
247-
context: tSSRContext,
237+
context: context.context || ({} as TSSRContext),
248238
request: context.ssrContext?.request,
249239
response: context.ssrContext?.response,
250240
};

Diff for: packages/runtime/plugin-runtime/src/core/context/runtime.ts

+17
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@ interface BaseRuntimeContext {
1616
store?: Store;
1717
routeManifest: RouteManifest;
1818
routerContext?: StaticHandlerContext;
19+
context?: TSSRContext;
1920
/**
2021
* private
2122
*/
2223
unstable_getBlockNavState?: () => boolean;
2324
}
2425

26+
// It's the RuntimeContext passed internally
2527
export interface RuntimeContext extends BaseRuntimeContext {
2628
[key: string]: any;
2729
}
@@ -30,6 +32,7 @@ export const RuntimeReactContext = createContext<RuntimeContext>({} as any);
3032

3133
export const ServerRouterContext = createContext({} as any);
3234

35+
// TODO: We should export this context to user as RuntimeContext, use in `init` function
3336
export interface TRuntimeContext extends Partial<BaseRuntimeContext> {
3437
initialData?: Record<string, unknown>;
3538
isBrowser: boolean;
@@ -53,3 +56,17 @@ export const getInitialContext = (
5356
routeManifest ||
5457
(typeof window !== 'undefined' && (window as any)[ROUTE_MANIFEST]),
5558
});
59+
60+
export const makeRequestContext = (context: RuntimeContext) => {
61+
const baseSSRContext = context.ssrContext;
62+
const requestContext = baseSSRContext
63+
? {
64+
isBrowser: context.isBrowser,
65+
request: baseSSRContext.request || ({} as TSSRContext['request']),
66+
response: baseSSRContext.response || ({} as TSSRContext['response']),
67+
logger: baseSSRContext.logger || ({} as TSSRContext['logger']),
68+
}
69+
: ({} as TSSRContext);
70+
71+
return requestContext;
72+
};

Diff for: packages/runtime/plugin-runtime/src/core/server/requestHandler.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
getGlobalInternalRuntimeContext,
1717
getGlobalRSCRoot,
1818
} from '../context';
19-
import { getInitialContext } from '../context/runtime';
19+
import { getInitialContext, makeRequestContext } from '../context/runtime';
2020
import { createLoaderManager } from '../loader/loaderManager';
2121
import { createRoot } from '../react';
2222
import type { SSRServerContext } from '../types';
@@ -133,6 +133,7 @@ function createSSRContext(
133133
params,
134134
headers: headersData,
135135
host,
136+
referer: headers.get('referer')!,
136137
raw: request,
137138
},
138139
response: {
@@ -207,6 +208,8 @@ export const createRequestHandler: CreateRequestHandler = async (
207208
},
208209
),
209210
});
211+
const requestContext = makeRequestContext(context);
212+
context.context = requestContext;
210213

211214
// Handle redirects from React Router with an HTTP redirect
212215
const getRedirectResponse = (result: any) => {

Diff for: packages/runtime/plugin-runtime/src/core/server/stream/afterTemplate.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { IncomingHttpHeaders } from 'http';
12
import { serializeJson } from '@modern-js/runtime-utils/node';
23
import type { HeadersData } from '@modern-js/runtime-utils/universal/request';
34
import { type RenderLevel, SSR_DATA_JSON_ID } from '../../constants';
@@ -99,7 +100,7 @@ function createReplaceSSRData(options: {
99100
pathname: request.pathname,
100101
host: request.host,
101102
url: request.url,
102-
headers,
103+
headers: headers as IncomingHttpHeaders,
103104
},
104105
},
105106
mode: 'stream',

Diff for: packages/runtime/plugin-runtime/src/core/server/string/ssrData.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { IncomingHttpHeaders } from 'http';
12
import { serializeJson } from '@modern-js/runtime-utils/node';
23
import type { StaticHandlerContext } from '@modern-js/runtime-utils/remix-router';
34
import type { HeadersData } from '@modern-js/runtime-utils/universal/request';
@@ -68,7 +69,7 @@ export class SSRDataCollector implements Collector {
6869
pathname: request.pathname,
6970
host: request.host,
7071
url: request.url,
71-
headers,
72+
headers: headers as IncomingHttpHeaders,
7273
},
7374
reporter: {
7475
sessionId: reporter?.sessionId,

Diff for: packages/runtime/plugin-runtime/src/core/types.ts

+6-17
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { IncomingHttpHeaders } from 'node:http';
12
import type { OnError, OnTiming } from '@modern-js/app-tools';
23
import type { BaseSSRServerContext } from '@modern-js/types';
34
import type { RenderLevel } from './constants';
@@ -31,14 +32,7 @@ export interface SSRContainer {
3132
mode: SSRMode;
3233
data?: SSRData; // string ssr data
3334
context?: {
34-
request: {
35-
params: Record<string, any>;
36-
query: Record<string, string>;
37-
pathname: string;
38-
host: string;
39-
url: string;
40-
headers?: Record<string, string | undefined>;
41-
};
35+
request: BaseSSRServerContext['request'];
4236
reporter?: {
4337
sessionId?: string;
4438
};
@@ -62,9 +56,6 @@ export type SSRServerContext = Pick<
6256
> & {
6357
request: BaseSSRServerContext['request'] & {
6458
baseUrl: string;
65-
userAgent: string;
66-
cookie: string;
67-
cookieMap: Record<string, string>;
6859
raw: Request;
6960
};
7061
htmlModifiers: BuildHtmlCb[];
@@ -76,21 +67,19 @@ export type SSRServerContext = Pick<
7667

7768
/* 通过 useRuntimeContext 获取的 SSRContext */
7869
interface TSSRBaseContext {
79-
request: BaseSSRServerContext['request'] & {
80-
userAgent: string;
81-
cookie: string;
82-
};
70+
request: BaseSSRServerContext['request'];
8371
[propName: string]: any;
8472
}
8573

86-
interface ServerContext extends TSSRBaseContext {
74+
export interface ServerContext extends TSSRBaseContext {
8775
isBrowser: false;
8876
response: BaseSSRServerContext['response'];
8977
logger: BaseSSRServerContext['logger'];
9078
}
9179

92-
interface ClientContext extends TSSRBaseContext {
80+
export interface ClientContext extends TSSRBaseContext {
9381
isBrowser: true;
9482
}
9583

84+
// TODO: rename it, maybe requestContext or renderContext
9685
export declare type TSSRContext = ServerContext | ClientContext;

Diff for: packages/toolkit/types/server/context.d.ts

+4
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ export type BaseSSRServerContext<T extends 'node' | 'worker' = 'node'> = {
7676
headers: IncomingHttpHeaders;
7777
host: string;
7878
url: string;
79+
referer?: string;
80+
userAgent?: string;
81+
cookie?: string;
82+
cookieMap?: Record<string, string>;
7983
[propsName: string]: any;
8084
};
8185
response: BaseResponseLike;

0 commit comments

Comments
 (0)