@bleedingdev/modern-js-runtime-extensions 3.9.0-ultramodern.2 → 3.9.0-ultramodern.20

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.
Files changed (251) hide show
  1. package/dist/cjs/buildIdentity.js +73 -0
  2. package/dist/cjs/contextExtensions.js +74 -0
  3. package/dist/cjs/headRuntime.js +91 -0
  4. package/dist/cjs/helmetContext.js +54 -0
  5. package/dist/cjs/index.js +18 -4
  6. package/dist/cjs/localisedLoaderIdentity.js +51 -0
  7. package/dist/cjs/localisedUrls/config.js +49 -0
  8. package/dist/cjs/localisedUrls/index.js +95 -0
  9. package/dist/cjs/localisedUrls/normalise.js +87 -0
  10. package/dist/cjs/localisedUrls/pathname.js +68 -0
  11. package/dist/cjs/localisedUrls/patterns.js +214 -0
  12. package/dist/cjs/localisedUrls/redirect.js +100 -0
  13. package/dist/cjs/localisedUrls/resolve.js +78 -0
  14. package/dist/cjs/localisedUrls/routeIdentity.js +92 -0
  15. package/dist/cjs/localisedUrls/routes.js +217 -0
  16. package/dist/cjs/localisedUrls/types.js +18 -0
  17. package/dist/cjs/prefetchPolicy.js +52 -0
  18. package/dist/cjs/rendererHead.js +18 -5
  19. package/dist/cjs/request-policy/browser.js +139 -0
  20. package/dist/cjs/request-policy/client.js +234 -0
  21. package/dist/cjs/request-policy/node.js +149 -0
  22. package/dist/cjs/request-policy/policyCore.js +266 -0
  23. package/dist/cjs/request-policy/requestContext.js +137 -0
  24. package/dist/cjs/request-policy/traceparent.js +56 -0
  25. package/dist/cjs/request-policy/transport.js +234 -0
  26. package/dist/cjs/request-policy/types.js +57 -0
  27. package/dist/cjs/routeHydration.js +127 -0
  28. package/dist/cjs/routerPrefetchPolicy.js +153 -0
  29. package/dist/cjs/routerProvider.js +105 -0
  30. package/dist/cjs/routerState.js +175 -0
  31. package/dist/cjs/routerStatePlugin.js +113 -0
  32. package/dist/cjs/routerStateTypes.js +18 -0
  33. package/dist/cjs/rsc-disabled/rscDisabledClientBrowserRuntime.js +69 -0
  34. package/dist/cjs/rsc-disabled/rscDisabledClientEdgeRuntime.js +61 -0
  35. package/dist/cjs/rsc-disabled/rscDisabledClientNodeRuntime.js +65 -0
  36. package/dist/cjs/rsc-disabled/rscDisabledRuntimeError.js +42 -0
  37. package/dist/cjs/rsc-disabled/rscDisabledServerEdgeRuntime.js +93 -0
  38. package/dist/cjs/rsc-disabled/rscDisabledServerNodeRuntime.js +101 -0
  39. package/dist/cjs/runtimeContextProjection.js +112 -0
  40. package/dist/cjs/server-config/bffRuntime.js +18 -0
  41. package/dist/cjs/server-config/index.js +18 -0
  42. package/dist/cjs/server-config/serverTelemetry.js +18 -0
  43. package/dist/cjs/shellStream.js +34 -2
  44. package/dist/cjs/workspaceEvents.js +159 -0
  45. package/dist/esm/buildIdentity.mjs +35 -0
  46. package/dist/esm/contextExtensions.mjs +33 -0
  47. package/dist/esm/headRuntime.mjs +43 -0
  48. package/dist/esm/helmetContext.mjs +13 -0
  49. package/dist/esm/index.mjs +2 -0
  50. package/dist/esm/localisedLoaderIdentity.mjs +13 -0
  51. package/dist/esm/localisedUrls/config.mjs +11 -0
  52. package/dist/esm/localisedUrls/index.mjs +8 -0
  53. package/dist/esm/localisedUrls/normalise.mjs +37 -0
  54. package/dist/esm/localisedUrls/pathname.mjs +24 -0
  55. package/dist/esm/localisedUrls/patterns.mjs +152 -0
  56. package/dist/esm/localisedUrls/redirect.mjs +53 -0
  57. package/dist/esm/localisedUrls/resolve.mjs +37 -0
  58. package/dist/esm/localisedUrls/routeIdentity.mjs +54 -0
  59. package/dist/esm/localisedUrls/routes.mjs +176 -0
  60. package/dist/esm/localisedUrls/types.mjs +0 -0
  61. package/dist/esm/prefetchPolicy.mjs +11 -0
  62. package/dist/esm/rendererHead.mjs +14 -5
  63. package/dist/esm/request-policy/browser.mjs +11 -0
  64. package/dist/esm/request-policy/client.mjs +195 -0
  65. package/dist/esm/request-policy/policyCore.mjs +171 -0
  66. package/dist/esm/request-policy/requestContext.mjs +75 -0
  67. package/dist/esm/request-policy/traceparent.mjs +18 -0
  68. package/dist/esm/request-policy/transport.mjs +196 -0
  69. package/dist/esm/request-policy/types.mjs +10 -0
  70. package/dist/esm/routeHydration.mjs +77 -0
  71. package/dist/esm/routerPrefetchPolicy.mjs +115 -0
  72. package/dist/esm/routerProvider.mjs +58 -0
  73. package/dist/esm/routerState.mjs +113 -0
  74. package/dist/esm/routerStatePlugin.mjs +75 -0
  75. package/dist/esm/routerStateTypes.mjs +0 -0
  76. package/dist/esm/rsc-disabled/rscDisabledClientBrowserRuntime.mjs +10 -0
  77. package/dist/esm/rsc-disabled/rscDisabledClientEdgeRuntime.mjs +8 -0
  78. package/dist/esm/rsc-disabled/rscDisabledClientNodeRuntime.mjs +9 -0
  79. package/dist/esm/rsc-disabled/rscDisabledRuntimeError.mjs +4 -0
  80. package/dist/esm/rsc-disabled/rscDisabledServerEdgeRuntime.mjs +16 -0
  81. package/dist/esm/rsc-disabled/rscDisabledServerNodeRuntime.mjs +18 -0
  82. package/dist/esm/runtimeContextProjection.mjs +74 -0
  83. package/dist/esm/server-config/bffRuntime.mjs +0 -0
  84. package/dist/esm/server-config/index.mjs +0 -0
  85. package/dist/esm/server-config/serverTelemetry.mjs +0 -0
  86. package/dist/esm/shellStream.mjs +34 -2
  87. package/dist/esm/workspaceEvents.mjs +66 -0
  88. package/dist/esm-node/buildIdentity.mjs +36 -0
  89. package/dist/esm-node/contextExtensions.mjs +34 -0
  90. package/dist/esm-node/headRuntime.mjs +44 -0
  91. package/dist/esm-node/helmetContext.mjs +14 -0
  92. package/dist/esm-node/index.mjs +2 -0
  93. package/dist/esm-node/localisedLoaderIdentity.mjs +14 -0
  94. package/dist/esm-node/localisedUrls/config.mjs +12 -0
  95. package/dist/esm-node/localisedUrls/index.mjs +9 -0
  96. package/dist/esm-node/localisedUrls/normalise.mjs +38 -0
  97. package/dist/esm-node/localisedUrls/pathname.mjs +25 -0
  98. package/dist/esm-node/localisedUrls/patterns.mjs +153 -0
  99. package/dist/esm-node/localisedUrls/redirect.mjs +54 -0
  100. package/dist/esm-node/localisedUrls/resolve.mjs +38 -0
  101. package/dist/esm-node/localisedUrls/routeIdentity.mjs +55 -0
  102. package/dist/esm-node/localisedUrls/routes.mjs +177 -0
  103. package/dist/esm-node/localisedUrls/types.mjs +1 -0
  104. package/dist/esm-node/prefetchPolicy.mjs +12 -0
  105. package/dist/esm-node/rendererHead.mjs +14 -5
  106. package/dist/esm-node/request-policy/browser.mjs +12 -0
  107. package/dist/esm-node/request-policy/client.mjs +196 -0
  108. package/dist/esm-node/request-policy/node.mjs +22 -0
  109. package/dist/esm-node/request-policy/policyCore.mjs +172 -0
  110. package/dist/esm-node/request-policy/requestContext.mjs +76 -0
  111. package/dist/esm-node/request-policy/traceparent.mjs +19 -0
  112. package/dist/esm-node/request-policy/transport.mjs +197 -0
  113. package/dist/esm-node/request-policy/types.mjs +11 -0
  114. package/dist/esm-node/routeHydration.mjs +78 -0
  115. package/dist/esm-node/routerPrefetchPolicy.mjs +116 -0
  116. package/dist/esm-node/routerProvider.mjs +59 -0
  117. package/dist/esm-node/routerState.mjs +114 -0
  118. package/dist/esm-node/routerStatePlugin.mjs +76 -0
  119. package/dist/esm-node/routerStateTypes.mjs +1 -0
  120. package/dist/esm-node/rsc-disabled/rscDisabledClientBrowserRuntime.mjs +11 -0
  121. package/dist/esm-node/rsc-disabled/rscDisabledClientEdgeRuntime.mjs +9 -0
  122. package/dist/esm-node/rsc-disabled/rscDisabledClientNodeRuntime.mjs +10 -0
  123. package/dist/esm-node/rsc-disabled/rscDisabledRuntimeError.mjs +5 -0
  124. package/dist/esm-node/rsc-disabled/rscDisabledServerEdgeRuntime.mjs +17 -0
  125. package/dist/esm-node/rsc-disabled/rscDisabledServerNodeRuntime.mjs +19 -0
  126. package/dist/esm-node/runtimeContextProjection.mjs +75 -0
  127. package/dist/esm-node/server-config/bffRuntime.mjs +1 -0
  128. package/dist/esm-node/server-config/index.mjs +1 -0
  129. package/dist/esm-node/server-config/serverTelemetry.mjs +1 -0
  130. package/dist/esm-node/shellStream.mjs +34 -2
  131. package/dist/esm-node/workspaceEvents.mjs +67 -0
  132. package/dist/types/buildIdentity.d.ts +37 -0
  133. package/dist/types/contextExtensions.d.ts +34 -0
  134. package/dist/types/headRuntime.d.ts +12 -0
  135. package/dist/types/helmetCompat.d.ts +1 -1
  136. package/dist/types/helmetContext.d.ts +10 -0
  137. package/dist/types/index.d.ts +2 -0
  138. package/dist/types/localisedLoaderIdentity.d.ts +10 -0
  139. package/dist/types/localisedUrls/config.d.ts +9 -0
  140. package/dist/types/localisedUrls/index.d.ts +10 -0
  141. package/dist/types/localisedUrls/normalise.d.ts +10 -0
  142. package/dist/types/localisedUrls/pathname.d.ts +4 -0
  143. package/dist/types/localisedUrls/patterns.d.ts +11 -0
  144. package/dist/types/localisedUrls/redirect.d.ts +19 -0
  145. package/dist/types/localisedUrls/resolve.d.ts +7 -0
  146. package/dist/types/localisedUrls/routeIdentity.d.ts +22 -0
  147. package/dist/types/localisedUrls/routes.d.ts +3 -0
  148. package/dist/types/localisedUrls/types.d.ts +14 -0
  149. package/dist/types/prefetchPolicy.d.ts +4 -0
  150. package/dist/types/rendererHead.d.ts +5 -3
  151. package/dist/types/request-policy/browser.d.ts +10 -0
  152. package/dist/types/request-policy/client.d.ts +14 -0
  153. package/dist/types/request-policy/node.d.ts +10 -0
  154. package/dist/types/request-policy/policyCore.d.ts +107 -0
  155. package/dist/types/request-policy/requestContext.d.ts +22 -0
  156. package/dist/types/request-policy/traceparent.d.ts +10 -0
  157. package/dist/types/request-policy/transport.d.ts +12 -0
  158. package/dist/types/request-policy/types.d.ts +144 -0
  159. package/dist/types/routeHydration.d.ts +24 -0
  160. package/dist/types/routerPrefetchPolicy.d.ts +28 -0
  161. package/dist/types/routerProvider.d.ts +55 -0
  162. package/dist/types/routerState.d.ts +17 -0
  163. package/dist/types/routerStatePlugin.d.ts +19 -0
  164. package/dist/types/routerStateTypes.d.ts +70 -0
  165. package/dist/types/rsc-disabled/rscDisabledClientBrowserRuntime.d.ts +9 -0
  166. package/dist/types/rsc-disabled/rscDisabledClientEdgeRuntime.d.ts +7 -0
  167. package/dist/types/rsc-disabled/rscDisabledClientNodeRuntime.d.ts +8 -0
  168. package/dist/types/rsc-disabled/rscDisabledRuntimeError.d.ts +1 -0
  169. package/dist/types/rsc-disabled/rscDisabledServerEdgeRuntime.d.ts +15 -0
  170. package/dist/types/rsc-disabled/rscDisabledServerNodeRuntime.d.ts +17 -0
  171. package/dist/types/runtimeContextProjection.d.ts +30 -0
  172. package/dist/types/server-config/bffRuntime.d.ts +122 -0
  173. package/dist/types/server-config/index.d.ts +2 -0
  174. package/dist/types/server-config/serverTelemetry.d.ts +322 -0
  175. package/dist/types/workspaceEvents.d.ts +62 -0
  176. package/package.json +240 -15
  177. package/rslib.config.mts +17 -2
  178. package/rstest.config.mts +33 -2
  179. package/src/buildIdentity.ts +61 -0
  180. package/src/contextExtensions.ts +81 -0
  181. package/src/headRuntime.tsx +77 -0
  182. package/src/helmetCompat.ts +1 -1
  183. package/src/helmetContext.ts +31 -0
  184. package/src/index.ts +2 -0
  185. package/src/localisedLoaderIdentity.ts +30 -0
  186. package/src/localisedUrls/config.ts +18 -0
  187. package/src/localisedUrls/index.ts +25 -0
  188. package/src/localisedUrls/normalise.ts +62 -0
  189. package/src/localisedUrls/pathname.ts +60 -0
  190. package/src/localisedUrls/patterns.ts +283 -0
  191. package/src/localisedUrls/redirect.ts +107 -0
  192. package/src/localisedUrls/resolve.ts +106 -0
  193. package/src/localisedUrls/routeIdentity.ts +83 -0
  194. package/src/localisedUrls/routes.ts +451 -0
  195. package/src/localisedUrls/types.ts +18 -0
  196. package/src/prefetchPolicy.ts +33 -0
  197. package/src/rendererHead.ts +25 -8
  198. package/src/request-policy/browser.ts +22 -0
  199. package/src/request-policy/client.ts +404 -0
  200. package/src/request-policy/node.ts +41 -0
  201. package/src/request-policy/policyCore.ts +424 -0
  202. package/src/request-policy/requestContext.ts +149 -0
  203. package/src/request-policy/traceparent.ts +43 -0
  204. package/src/request-policy/transport.ts +349 -0
  205. package/src/request-policy/types.ts +229 -0
  206. package/src/routeHydration.ts +208 -0
  207. package/src/routerPrefetchPolicy.ts +195 -0
  208. package/src/routerProvider.ts +160 -0
  209. package/src/routerState.ts +220 -0
  210. package/src/routerStatePlugin.ts +125 -0
  211. package/src/routerStateTypes.ts +76 -0
  212. package/src/rsc-disabled/rscDisabledClientBrowserRuntime.ts +10 -0
  213. package/src/rsc-disabled/rscDisabledClientEdgeRuntime.ts +8 -0
  214. package/src/rsc-disabled/rscDisabledClientNodeRuntime.ts +9 -0
  215. package/src/rsc-disabled/rscDisabledRuntimeError.ts +3 -0
  216. package/src/rsc-disabled/rscDisabledServerEdgeRuntime.ts +16 -0
  217. package/src/rsc-disabled/rscDisabledServerNodeRuntime.ts +18 -0
  218. package/src/runtimeContextProjection.ts +105 -0
  219. package/src/server-config/bffRuntime.ts +136 -0
  220. package/src/server-config/index.ts +2 -0
  221. package/src/server-config/serverTelemetry.ts +337 -0
  222. package/src/shellStream.ts +55 -25
  223. package/src/workspaceEvents.ts +324 -0
  224. package/tests/buildIdentity.test.ts +51 -0
  225. package/tests/contextExtensions.test.ts +27 -0
  226. package/tests/headRuntime.test.tsx +229 -0
  227. package/tests/localisedUrls.test.ts +560 -0
  228. package/tests/rendererHead.test.ts +52 -121
  229. package/tests/request-policy/browser-policy.test.ts +108 -0
  230. package/tests/request-policy/client-isolation.test.ts +109 -0
  231. package/tests/request-policy/node-policy.test.ts +447 -0
  232. package/tests/request-policy/policyCore.test.ts +129 -0
  233. package/tests/request-policy/requestContext.test.ts +66 -0
  234. package/tests/request-policy/requestFactory.outbound-contract.test.ts +290 -0
  235. package/tests/request-policy/traceparent.test.ts +52 -0
  236. package/tests/request-policy/transport-retry.test.ts +367 -0
  237. package/tests/routeHydration.test.ts +180 -0
  238. package/tests/routerPrefetchPolicy.test.ts +102 -0
  239. package/tests/routerProvider.test.ts +29 -0
  240. package/tests/routerState.test.ts +77 -0
  241. package/tests/routerStatePlugin.test.ts +63 -0
  242. package/tests/runtimeContextProjection.test.ts +83 -0
  243. package/tests/safeFailure.test.ts +10 -28
  244. package/tests/shellStream.test.ts +39 -2
  245. package/tests/workspaceEvents.test.ts +221 -0
  246. package/dist/cjs/rscHtmlStream.js +0 -128
  247. package/dist/esm/rscHtmlStream.mjs +0 -86
  248. package/dist/esm-node/rscHtmlStream.mjs +0 -87
  249. package/dist/types/rscHtmlStream.d.ts +0 -4
  250. package/src/rscHtmlStream.ts +0 -142
  251. 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';