@bleedingdev/modern-js-runtime-extensions 3.9.0-ultramodern.4 → 3.9.0-ultramodern.5
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/contextExtensions.js +74 -0
- package/dist/cjs/headRuntime.js +91 -0
- package/dist/cjs/helmetContext.js +54 -0
- package/dist/cjs/index.js +18 -4
- package/dist/cjs/prefetchPolicy.js +52 -0
- package/dist/cjs/request-policy/browser.js +139 -0
- package/dist/cjs/request-policy/client.js +234 -0
- package/dist/cjs/request-policy/node.js +149 -0
- package/dist/cjs/request-policy/policyCore.js +266 -0
- package/dist/cjs/request-policy/requestContext.js +137 -0
- package/dist/cjs/request-policy/traceparent.js +56 -0
- package/dist/cjs/request-policy/transport.js +234 -0
- package/dist/cjs/request-policy/types.js +57 -0
- package/dist/cjs/routeHydration.js +127 -0
- package/dist/cjs/routerPrefetchPolicy.js +153 -0
- package/dist/cjs/routerProvider.js +170 -0
- package/dist/cjs/routerState.js +167 -0
- package/dist/cjs/routerStatePlugin.js +86 -0
- package/dist/cjs/routerStateTypes.js +18 -0
- package/dist/cjs/runtimeContextProjection.js +112 -0
- package/dist/cjs/server-config/bffRuntime.js +18 -0
- package/dist/cjs/server-config/index.js +18 -0
- package/dist/cjs/server-config/serverTelemetry.js +18 -0
- package/dist/cjs/shellStream.js +34 -2
- package/dist/cjs/workspaceEvents.js +159 -0
- package/dist/esm/contextExtensions.mjs +33 -0
- package/dist/esm/headRuntime.mjs +43 -0
- package/dist/esm/helmetContext.mjs +13 -0
- package/dist/esm/index.mjs +2 -0
- package/dist/esm/prefetchPolicy.mjs +11 -0
- package/dist/esm/request-policy/browser.mjs +11 -0
- package/dist/esm/request-policy/client.mjs +195 -0
- package/dist/esm/request-policy/policyCore.mjs +171 -0
- package/dist/esm/request-policy/requestContext.mjs +75 -0
- package/dist/esm/request-policy/traceparent.mjs +18 -0
- package/dist/esm/request-policy/transport.mjs +196 -0
- package/dist/esm/request-policy/types.mjs +10 -0
- package/dist/esm/routeHydration.mjs +77 -0
- package/dist/esm/routerPrefetchPolicy.mjs +115 -0
- package/dist/esm/routerProvider.mjs +117 -0
- package/dist/esm/routerState.mjs +105 -0
- package/dist/esm/routerStatePlugin.mjs +48 -0
- package/dist/esm/routerStateTypes.mjs +0 -0
- package/dist/esm/runtimeContextProjection.mjs +74 -0
- package/dist/esm/server-config/bffRuntime.mjs +0 -0
- package/dist/esm/server-config/index.mjs +0 -0
- package/dist/esm/server-config/serverTelemetry.mjs +0 -0
- package/dist/esm/shellStream.mjs +34 -2
- package/dist/esm/workspaceEvents.mjs +66 -0
- package/dist/esm-node/contextExtensions.mjs +34 -0
- package/dist/esm-node/headRuntime.mjs +44 -0
- package/dist/esm-node/helmetContext.mjs +14 -0
- package/dist/esm-node/index.mjs +2 -0
- package/dist/esm-node/prefetchPolicy.mjs +12 -0
- package/dist/esm-node/request-policy/browser.mjs +12 -0
- package/dist/esm-node/request-policy/client.mjs +196 -0
- package/dist/esm-node/request-policy/node.mjs +22 -0
- package/dist/esm-node/request-policy/policyCore.mjs +172 -0
- package/dist/esm-node/request-policy/requestContext.mjs +76 -0
- package/dist/esm-node/request-policy/traceparent.mjs +19 -0
- package/dist/esm-node/request-policy/transport.mjs +197 -0
- package/dist/esm-node/request-policy/types.mjs +11 -0
- package/dist/esm-node/routeHydration.mjs +78 -0
- package/dist/esm-node/routerPrefetchPolicy.mjs +116 -0
- package/dist/esm-node/routerProvider.mjs +118 -0
- package/dist/esm-node/routerState.mjs +106 -0
- package/dist/esm-node/routerStatePlugin.mjs +49 -0
- package/dist/esm-node/routerStateTypes.mjs +1 -0
- package/dist/esm-node/runtimeContextProjection.mjs +75 -0
- package/dist/esm-node/server-config/bffRuntime.mjs +1 -0
- package/dist/esm-node/server-config/index.mjs +1 -0
- package/dist/esm-node/server-config/serverTelemetry.mjs +1 -0
- package/dist/esm-node/shellStream.mjs +34 -2
- package/dist/esm-node/workspaceEvents.mjs +67 -0
- package/dist/types/contextExtensions.d.ts +34 -0
- package/dist/types/headRuntime.d.ts +12 -0
- package/dist/types/helmetContext.d.ts +10 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/prefetchPolicy.d.ts +4 -0
- package/dist/types/request-policy/browser.d.ts +10 -0
- package/dist/types/request-policy/client.d.ts +14 -0
- package/dist/types/request-policy/node.d.ts +10 -0
- package/dist/types/request-policy/policyCore.d.ts +107 -0
- package/dist/types/request-policy/requestContext.d.ts +22 -0
- package/dist/types/request-policy/traceparent.d.ts +10 -0
- package/dist/types/request-policy/transport.d.ts +12 -0
- package/dist/types/request-policy/types.d.ts +144 -0
- package/dist/types/routeHydration.d.ts +24 -0
- package/dist/types/routerPrefetchPolicy.d.ts +28 -0
- package/dist/types/routerProvider.d.ts +77 -0
- package/dist/types/routerState.d.ts +12 -0
- package/dist/types/routerStatePlugin.d.ts +19 -0
- package/dist/types/routerStateTypes.d.ts +40 -0
- package/dist/types/runtimeContextProjection.d.ts +30 -0
- package/dist/types/server-config/bffRuntime.d.ts +122 -0
- package/dist/types/server-config/index.d.ts +2 -0
- package/dist/types/server-config/serverTelemetry.d.ts +322 -0
- package/dist/types/workspaceEvents.d.ts +62 -0
- package/package.json +198 -13
- package/rslib.config.mts +17 -2
- package/rstest.config.mts +33 -2
- package/src/contextExtensions.ts +81 -0
- package/src/headRuntime.tsx +77 -0
- package/src/helmetContext.ts +31 -0
- package/src/index.ts +2 -0
- package/src/prefetchPolicy.ts +33 -0
- package/src/request-policy/browser.ts +22 -0
- package/src/request-policy/client.ts +404 -0
- package/src/request-policy/node.ts +41 -0
- package/src/request-policy/policyCore.ts +424 -0
- package/src/request-policy/requestContext.ts +149 -0
- package/src/request-policy/traceparent.ts +43 -0
- package/src/request-policy/transport.ts +349 -0
- package/src/request-policy/types.ts +229 -0
- package/src/routeHydration.ts +208 -0
- package/src/routerPrefetchPolicy.ts +195 -0
- package/src/routerProvider.ts +340 -0
- package/src/routerState.ts +208 -0
- package/src/routerStatePlugin.ts +86 -0
- package/src/routerStateTypes.ts +46 -0
- package/src/runtimeContextProjection.ts +105 -0
- package/src/server-config/bffRuntime.ts +136 -0
- package/src/server-config/index.ts +2 -0
- package/src/server-config/serverTelemetry.ts +337 -0
- package/src/shellStream.ts +55 -25
- package/src/workspaceEvents.ts +324 -0
- package/tests/buildIdentity.test.ts +2 -4
- package/tests/contextExtensions.test.ts +71 -0
- package/tests/headRuntime.test.tsx +369 -0
- package/tests/nativeSafeFailureCompatibility.test.ts +117 -0
- package/tests/prefetchPolicy.test.ts +51 -0
- package/tests/rendererHead.test.ts +1 -72
- package/tests/request-policy/browser-policy.test.ts +608 -0
- package/tests/request-policy/client-isolation.test.ts +149 -0
- package/tests/request-policy/identityBinding.test.ts +75 -0
- package/tests/request-policy/node-policy.test.ts +741 -0
- package/tests/request-policy/policyCore.test.ts +250 -0
- package/tests/request-policy/requestContext.test.ts +80 -0
- package/tests/request-policy/requestFactory.outbound-contract.test.ts +691 -0
- package/tests/request-policy/traceparent.test.ts +55 -0
- package/tests/request-policy/transport-retry.test.ts +370 -0
- package/tests/routeHydration.test.ts +180 -0
- package/tests/routerPrefetchPolicy.test.ts +102 -0
- package/tests/routerProvider.test.ts +38 -0
- package/tests/routerState.test.ts +157 -0
- package/tests/routerStatePlugin.test.ts +108 -0
- package/tests/runtimeContextProjection.test.ts +135 -0
- package/tests/shellStream.test.ts +37 -0
- package/tests/workspaceEvents.test.ts +391 -0
- package/dist/cjs/rscHtmlStream.js +0 -128
- package/dist/esm/rscHtmlStream.mjs +0 -86
- package/dist/esm-node/rscHtmlStream.mjs +0 -87
- package/dist/types/rscHtmlStream.d.ts +0 -4
- package/src/rscHtmlStream.ts +0 -142
- package/tests/rscHtmlStream.test.ts +0 -153
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
RequestClient,
|
|
3
|
+
RequestHeadersContext,
|
|
4
|
+
RequestHooks,
|
|
5
|
+
} from '@modern-js/create-request/client';
|
|
6
|
+
import {
|
|
7
|
+
attachOperationContextHeaders,
|
|
8
|
+
buildEnvelopeHeaderValue,
|
|
9
|
+
deleteHeader,
|
|
10
|
+
firstHeaderValue,
|
|
11
|
+
IdentityBindingViolationError,
|
|
12
|
+
isEmptyDomain,
|
|
13
|
+
isSecuredRequestId,
|
|
14
|
+
ProducerDomainNotConfiguredError,
|
|
15
|
+
parseTraceparentValue,
|
|
16
|
+
readHeader,
|
|
17
|
+
resolveConfiguredRequest,
|
|
18
|
+
TRACEPARENT_HEADER,
|
|
19
|
+
toOrigin,
|
|
20
|
+
writeHeader,
|
|
21
|
+
} from './policyCore';
|
|
22
|
+
import { executeWithResilience } from './transport';
|
|
23
|
+
import type {
|
|
24
|
+
AllowCrossOriginEnvelope,
|
|
25
|
+
IdentityBindingOptions,
|
|
26
|
+
IdentityBindingViolation,
|
|
27
|
+
IOptions,
|
|
28
|
+
OperationContractOptions,
|
|
29
|
+
RequestCreator,
|
|
30
|
+
RequestCreatorOptions,
|
|
31
|
+
ResolveHeaders,
|
|
32
|
+
TransportResilienceOptions,
|
|
33
|
+
TransportTarget,
|
|
34
|
+
UploadCreator,
|
|
35
|
+
} from './types';
|
|
36
|
+
import {
|
|
37
|
+
BFF_DEFAULT_PROTECTED_IDENTITY_HEADERS,
|
|
38
|
+
BFF_ENVELOPE_HEADER as ENVELOPE_HEADER,
|
|
39
|
+
BFF_OPERATION_CONTEXT_DETAIL_HEADER as OPERATION_CONTEXT_DETAIL_HEADER,
|
|
40
|
+
BFF_OPERATION_CONTEXT_HEADER as OPERATION_CONTEXT_HEADER,
|
|
41
|
+
} from './types';
|
|
42
|
+
|
|
43
|
+
type HeaderMap = Record<string, any>;
|
|
44
|
+
type PolicyEnvironment = {
|
|
45
|
+
target: TransportTarget;
|
|
46
|
+
resolveSourceOrigin: (incomingHeaders: HeaderMap) => string | undefined;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/** Bind fork producer policy to one isolated native request client. */
|
|
50
|
+
export const createPolicyClient = <F>(
|
|
51
|
+
nativeClient: RequestClient<F>,
|
|
52
|
+
environment: PolicyEnvironment,
|
|
53
|
+
) => {
|
|
54
|
+
const isServerTarget = environment.target === 'server';
|
|
55
|
+
const configuredRequests = new Map<string, boolean>();
|
|
56
|
+
const realResolveHeaders: Map<string, ResolveHeaders> = new Map();
|
|
57
|
+
const realRequireEnvelope: Map<string, boolean> = new Map();
|
|
58
|
+
const realAllowCrossOriginEnvelope: Map<string, AllowCrossOriginEnvelope> =
|
|
59
|
+
new Map();
|
|
60
|
+
const realTransportResilience: Map<string, TransportResilienceOptions> =
|
|
61
|
+
new Map();
|
|
62
|
+
const realIdentityBinding: Map<string, IdentityBindingOptions> = new Map();
|
|
63
|
+
const realOperationContract: Map<string, OperationContractOptions> =
|
|
64
|
+
new Map();
|
|
65
|
+
const domainMap: Map<string, string> = new Map();
|
|
66
|
+
|
|
67
|
+
const attachEnvelopeHeaderIfRequired = (
|
|
68
|
+
headers: HeaderMap,
|
|
69
|
+
requestId: string,
|
|
70
|
+
url: string,
|
|
71
|
+
incomingHeaders: HeaderMap,
|
|
72
|
+
) => {
|
|
73
|
+
const shouldRequireEnvelope =
|
|
74
|
+
realRequireEnvelope.get(requestId) ?? isSecuredRequestId(requestId);
|
|
75
|
+
if (!shouldRequireEnvelope) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
headers[ENVELOPE_HEADER] = buildEnvelopeHeaderValue({
|
|
80
|
+
requestId,
|
|
81
|
+
target: environment.target,
|
|
82
|
+
sourceOrigin: environment.resolveSourceOrigin(incomingHeaders),
|
|
83
|
+
targetOrigin: toOrigin(url),
|
|
84
|
+
traceContext: parseTraceparentValue(
|
|
85
|
+
readHeader(headers, TRACEPARENT_HEADER),
|
|
86
|
+
),
|
|
87
|
+
allowCrossOriginEnvelope: realAllowCrossOriginEnvelope.get(requestId),
|
|
88
|
+
});
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const attachSecuredOperationHeaders = (
|
|
92
|
+
headers: HeaderMap,
|
|
93
|
+
requestId: string,
|
|
94
|
+
method: string,
|
|
95
|
+
path: string,
|
|
96
|
+
operationContext: RequestCreatorOptions<F>['operationContext'],
|
|
97
|
+
) => {
|
|
98
|
+
if (!isSecuredRequestId(requestId)) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
attachOperationContextHeaders({
|
|
102
|
+
headers,
|
|
103
|
+
requestId,
|
|
104
|
+
target: environment.target,
|
|
105
|
+
method,
|
|
106
|
+
path,
|
|
107
|
+
operationContext,
|
|
108
|
+
operationContract: realOperationContract.get(requestId),
|
|
109
|
+
operationContextHeader: OPERATION_CONTEXT_HEADER,
|
|
110
|
+
operationContextDetailHeader: OPERATION_CONTEXT_DETAIL_HEADER,
|
|
111
|
+
});
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const applyIdentityAndForwardedHeaders = ({
|
|
115
|
+
headers,
|
|
116
|
+
requestId,
|
|
117
|
+
incomingHeaders,
|
|
118
|
+
forwardedHeaders,
|
|
119
|
+
allowedHeaders: targetAllowedHeaders,
|
|
120
|
+
}: RequestHeadersContext) => {
|
|
121
|
+
const identityBinding = realIdentityBinding.get(requestId);
|
|
122
|
+
const identityBindingEnabled =
|
|
123
|
+
identityBinding?.enabled ?? isSecuredRequestId(requestId);
|
|
124
|
+
const identityBindingStrict =
|
|
125
|
+
identityBinding?.strict ?? isSecuredRequestId(requestId);
|
|
126
|
+
const protectedIdentityHeaders = (
|
|
127
|
+
identityBinding?.protectedHeaders ||
|
|
128
|
+
BFF_DEFAULT_PROTECTED_IDENTITY_HEADERS
|
|
129
|
+
).map(header => header.toLowerCase());
|
|
130
|
+
|
|
131
|
+
if (identityBindingEnabled) {
|
|
132
|
+
const derivedIdentityHeaders: HeaderMap = {};
|
|
133
|
+
if (isServerTarget) {
|
|
134
|
+
for (const header of protectedIdentityHeaders) {
|
|
135
|
+
const incomingHeaderValue = readHeader(incomingHeaders, header);
|
|
136
|
+
if (typeof incomingHeaderValue !== 'undefined') {
|
|
137
|
+
writeHeader(derivedIdentityHeaders, header, incomingHeaderValue);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const customDerivedHeaders = identityBinding?.deriveHeaders?.({
|
|
143
|
+
requestId,
|
|
144
|
+
target: environment.target,
|
|
145
|
+
incomingHeaders: isServerTarget ? { ...incomingHeaders } : {},
|
|
146
|
+
protectedHeaders: [...protectedIdentityHeaders],
|
|
147
|
+
});
|
|
148
|
+
if (customDerivedHeaders && typeof customDerivedHeaders === 'object') {
|
|
149
|
+
for (const header of protectedIdentityHeaders) {
|
|
150
|
+
const customValue = readHeader(customDerivedHeaders, header);
|
|
151
|
+
if (typeof customValue !== 'undefined') {
|
|
152
|
+
writeHeader(derivedIdentityHeaders, header, customValue);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
for (const header of protectedIdentityHeaders) {
|
|
158
|
+
const attemptedValue = readHeader(headers, header);
|
|
159
|
+
if (typeof attemptedValue === 'undefined') {
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const violation: IdentityBindingViolation = {
|
|
164
|
+
requestId,
|
|
165
|
+
target: environment.target,
|
|
166
|
+
header,
|
|
167
|
+
attemptedValue,
|
|
168
|
+
derivedValue: readHeader(derivedIdentityHeaders, header),
|
|
169
|
+
reason: 'client_override_blocked',
|
|
170
|
+
};
|
|
171
|
+
identityBinding?.onViolation?.(violation);
|
|
172
|
+
|
|
173
|
+
if (identityBindingStrict) {
|
|
174
|
+
throw new IdentityBindingViolationError(violation);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
deleteHeader(headers, header);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
Object.keys(derivedIdentityHeaders).forEach(header => {
|
|
181
|
+
if (isServerTarget) {
|
|
182
|
+
writeHeader(forwardedHeaders, header, derivedIdentityHeaders[header]);
|
|
183
|
+
} else {
|
|
184
|
+
writeHeader(headers, header, derivedIdentityHeaders[header]);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (isServerTarget) {
|
|
190
|
+
const resolveHeaders = realResolveHeaders.get(requestId);
|
|
191
|
+
if (resolveHeaders) {
|
|
192
|
+
const resolvedHeaders = resolveHeaders({
|
|
193
|
+
requestId,
|
|
194
|
+
allowedHeaders: targetAllowedHeaders,
|
|
195
|
+
incomingHeaders: { ...forwardedHeaders },
|
|
196
|
+
});
|
|
197
|
+
if (resolvedHeaders && typeof resolvedHeaders === 'object') {
|
|
198
|
+
for (const key of targetAllowedHeaders) {
|
|
199
|
+
const resolvedValue = readHeader(resolvedHeaders, key);
|
|
200
|
+
if (typeof resolvedValue !== 'undefined') {
|
|
201
|
+
if (
|
|
202
|
+
identityBindingEnabled &&
|
|
203
|
+
protectedIdentityHeaders.includes(key.toLowerCase())
|
|
204
|
+
) {
|
|
205
|
+
writeHeader(forwardedHeaders, key.toLowerCase(), resolvedValue);
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
writeHeader(forwardedHeaders, key, resolvedValue);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
return headers;
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
const configure = (options: IOptions<F>) => {
|
|
219
|
+
const {
|
|
220
|
+
request,
|
|
221
|
+
interceptor,
|
|
222
|
+
allowedHeaders,
|
|
223
|
+
resolveHeaders,
|
|
224
|
+
transport,
|
|
225
|
+
requireEnvelope,
|
|
226
|
+
allowCrossOriginEnvelope,
|
|
227
|
+
identityBinding,
|
|
228
|
+
operationContract,
|
|
229
|
+
setDomain,
|
|
230
|
+
requestId = 'default',
|
|
231
|
+
} = options;
|
|
232
|
+
|
|
233
|
+
const hasExistingDomain = domainMap.has(requestId);
|
|
234
|
+
if (requestId !== 'default' && !setDomain && !hasExistingDomain) {
|
|
235
|
+
throw new ProducerDomainNotConfiguredError(requestId);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
let resolvedDomain: string | undefined;
|
|
239
|
+
nativeClient.configure({
|
|
240
|
+
request,
|
|
241
|
+
interceptor,
|
|
242
|
+
allowedHeaders,
|
|
243
|
+
requestId,
|
|
244
|
+
setDomain: setDomain
|
|
245
|
+
? options => {
|
|
246
|
+
resolvedDomain = setDomain(options);
|
|
247
|
+
if (requestId !== 'default' && isEmptyDomain(resolvedDomain)) {
|
|
248
|
+
throw new ProducerDomainNotConfiguredError(requestId);
|
|
249
|
+
}
|
|
250
|
+
return resolvedDomain;
|
|
251
|
+
}
|
|
252
|
+
: undefined,
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
realResolveHeaders.delete(requestId);
|
|
256
|
+
realTransportResilience.delete(requestId);
|
|
257
|
+
realIdentityBinding.delete(requestId);
|
|
258
|
+
realOperationContract.delete(requestId);
|
|
259
|
+
realRequireEnvelope.delete(requestId);
|
|
260
|
+
realAllowCrossOriginEnvelope.delete(requestId);
|
|
261
|
+
|
|
262
|
+
if (isServerTarget && typeof resolveHeaders === 'function') {
|
|
263
|
+
realResolveHeaders.set(requestId, resolveHeaders);
|
|
264
|
+
}
|
|
265
|
+
if (transport && typeof transport === 'object') {
|
|
266
|
+
realTransportResilience.set(requestId, transport);
|
|
267
|
+
}
|
|
268
|
+
if (identityBinding && typeof identityBinding === 'object') {
|
|
269
|
+
realIdentityBinding.set(requestId, identityBinding);
|
|
270
|
+
}
|
|
271
|
+
if (operationContract && typeof operationContract === 'object') {
|
|
272
|
+
realOperationContract.set(requestId, operationContract);
|
|
273
|
+
}
|
|
274
|
+
if (typeof requireEnvelope === 'boolean') {
|
|
275
|
+
realRequireEnvelope.set(requestId, requireEnvelope);
|
|
276
|
+
}
|
|
277
|
+
if (
|
|
278
|
+
typeof allowCrossOriginEnvelope === 'boolean' ||
|
|
279
|
+
typeof allowCrossOriginEnvelope === 'function'
|
|
280
|
+
) {
|
|
281
|
+
realAllowCrossOriginEnvelope.set(requestId, allowCrossOriginEnvelope);
|
|
282
|
+
}
|
|
283
|
+
if (typeof resolvedDomain === 'string') {
|
|
284
|
+
domainMap.set(requestId, resolvedDomain);
|
|
285
|
+
}
|
|
286
|
+
configuredRequests.set(requestId, true);
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
const createHooks = (
|
|
290
|
+
path: string,
|
|
291
|
+
method: string,
|
|
292
|
+
requestId: string,
|
|
293
|
+
operationContext: RequestCreatorOptions<F>['operationContext'],
|
|
294
|
+
upload = false,
|
|
295
|
+
): RequestHooks => ({
|
|
296
|
+
onStart: ({ configuredDomain }) => {
|
|
297
|
+
resolveConfiguredRequest(configuredRequests, requestId, false);
|
|
298
|
+
if (
|
|
299
|
+
!upload &&
|
|
300
|
+
requestId !== 'default' &&
|
|
301
|
+
isEmptyDomain(configuredDomain)
|
|
302
|
+
) {
|
|
303
|
+
throw new ProducerDomainNotConfiguredError(requestId);
|
|
304
|
+
}
|
|
305
|
+
},
|
|
306
|
+
prepareHeaders: applyIdentityAndForwardedHeaders,
|
|
307
|
+
dispatch: context => {
|
|
308
|
+
const {
|
|
309
|
+
incomingHeaders,
|
|
310
|
+
url,
|
|
311
|
+
init: { headers },
|
|
312
|
+
} = context;
|
|
313
|
+
if (isServerTarget && !upload) {
|
|
314
|
+
if (typeof readHeader(headers, TRACEPARENT_HEADER) === 'undefined') {
|
|
315
|
+
const incomingTraceparent = firstHeaderValue(
|
|
316
|
+
readHeader(incomingHeaders, TRACEPARENT_HEADER),
|
|
317
|
+
);
|
|
318
|
+
if (typeof incomingTraceparent === 'string') {
|
|
319
|
+
writeHeader(headers, TRACEPARENT_HEADER, incomingTraceparent);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
if (
|
|
323
|
+
typeof readHeader(headers, TRACEPARENT_HEADER) === 'undefined' &&
|
|
324
|
+
operationContext?.traceparent
|
|
325
|
+
) {
|
|
326
|
+
writeHeader(
|
|
327
|
+
headers,
|
|
328
|
+
TRACEPARENT_HEADER,
|
|
329
|
+
operationContext.traceparent,
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
attachEnvelopeHeaderIfRequired(headers, requestId, url, incomingHeaders);
|
|
334
|
+
attachSecuredOperationHeaders(
|
|
335
|
+
headers,
|
|
336
|
+
requestId,
|
|
337
|
+
method,
|
|
338
|
+
path,
|
|
339
|
+
operationContext,
|
|
340
|
+
);
|
|
341
|
+
|
|
342
|
+
return executeWithResilience({
|
|
343
|
+
requestId,
|
|
344
|
+
target: environment.target,
|
|
345
|
+
method,
|
|
346
|
+
url,
|
|
347
|
+
init: context.init,
|
|
348
|
+
fetcher: context.fetcher,
|
|
349
|
+
transport: realTransportResilience.get(requestId),
|
|
350
|
+
});
|
|
351
|
+
},
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
const createRequest: RequestCreator<F> = ((
|
|
355
|
+
...args: Parameters<RequestCreator<F>>
|
|
356
|
+
) => {
|
|
357
|
+
const options: RequestCreatorOptions<F> =
|
|
358
|
+
typeof args[0] === 'object' && args[0] !== null
|
|
359
|
+
? args[0]
|
|
360
|
+
: {
|
|
361
|
+
path: args[0],
|
|
362
|
+
method: args[1],
|
|
363
|
+
port: args[2],
|
|
364
|
+
httpMethodDecider: args[3],
|
|
365
|
+
fetch: args[4],
|
|
366
|
+
requestId: args[5],
|
|
367
|
+
operationContext: args[6],
|
|
368
|
+
};
|
|
369
|
+
const {
|
|
370
|
+
operationContext,
|
|
371
|
+
requestId = 'default',
|
|
372
|
+
...nativeOptions
|
|
373
|
+
} = options;
|
|
374
|
+
return nativeClient.createRequest({
|
|
375
|
+
...nativeOptions,
|
|
376
|
+
requestId,
|
|
377
|
+
hooks: createHooks(
|
|
378
|
+
options.path,
|
|
379
|
+
options.method,
|
|
380
|
+
requestId,
|
|
381
|
+
operationContext,
|
|
382
|
+
),
|
|
383
|
+
});
|
|
384
|
+
}) as RequestCreator<F>;
|
|
385
|
+
|
|
386
|
+
const createUploader: UploadCreator = ({
|
|
387
|
+
operationContext,
|
|
388
|
+
requestId = 'default',
|
|
389
|
+
...options
|
|
390
|
+
}) =>
|
|
391
|
+
nativeClient.createUploader({
|
|
392
|
+
...options,
|
|
393
|
+
requestId,
|
|
394
|
+
hooks: createHooks(
|
|
395
|
+
options.path,
|
|
396
|
+
'POST',
|
|
397
|
+
requestId,
|
|
398
|
+
operationContext,
|
|
399
|
+
true,
|
|
400
|
+
),
|
|
401
|
+
});
|
|
402
|
+
|
|
403
|
+
return { configure, createRequest, createUploader };
|
|
404
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { createClient as createNativeClient } from '@modern-js/create-request/server';
|
|
2
|
+
import { createPolicyClient } from './client';
|
|
3
|
+
import { firstHeaderValue, toOrigin } from './policyCore';
|
|
4
|
+
|
|
5
|
+
const resolveSourceOrigin = (headers: Record<string, any>) => {
|
|
6
|
+
const origin = toOrigin(firstHeaderValue(headers.origin) as string);
|
|
7
|
+
if (origin) {
|
|
8
|
+
return origin;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const referer = toOrigin(firstHeaderValue(headers.referer) as string);
|
|
12
|
+
if (referer) {
|
|
13
|
+
return referer;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const host = firstHeaderValue(headers.host);
|
|
17
|
+
if (!host) {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
const proto = firstHeaderValue(headers['x-forwarded-proto']) || 'http';
|
|
21
|
+
return `${proto}://${host}`;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/** Create a server producer client with its own configuration and policy. */
|
|
25
|
+
export const createClient = () =>
|
|
26
|
+
createPolicyClient(createNativeClient(), {
|
|
27
|
+
target: 'server',
|
|
28
|
+
resolveSourceOrigin,
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
export const { configure, createRequest, createUploader } = createClient();
|
|
32
|
+
|
|
33
|
+
export {
|
|
34
|
+
CrossOriginEnvelopePolicyError,
|
|
35
|
+
IdentityBindingViolationError,
|
|
36
|
+
OperationContractViolationError,
|
|
37
|
+
ProducerClientNotInitializedError,
|
|
38
|
+
ProducerDomainNotConfiguredError,
|
|
39
|
+
} from './policyCore';
|
|
40
|
+
export * from './requestContext';
|
|
41
|
+
export * from './types';
|