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

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,136 @@
1
+ export type BffRuntimeFramework = 'hono' | 'effect';
2
+
3
+ /** Fork BFF options, independent of any native server config interface. */
4
+ export interface BffRuntimeUserConfig {
5
+ runtimeFramework?: BffRuntimeFramework;
6
+ effect?: BffEffectUserConfig;
7
+ crossProjectPolicy?: BffCrossProjectPolicyUserConfig;
8
+ }
9
+
10
+ export interface BffCrossProjectPolicyUserConfig {
11
+ /**
12
+ * Enable cross-project envelope and operation-context policy checks.
13
+ *
14
+ * @default false
15
+ */
16
+ enabled?: boolean;
17
+ /**
18
+ * Require cross-project envelope header when policy is enabled.
19
+ *
20
+ * @default true
21
+ */
22
+ requireEnvelope?: boolean;
23
+ /**
24
+ * Require operation-context header when policy is enabled.
25
+ *
26
+ * @default true
27
+ */
28
+ requireOperationContext?: boolean;
29
+ /**
30
+ * Require operation-context detail header carrying schema/version metadata.
31
+ *
32
+ * @default true
33
+ */
34
+ requireOperationContextDetails?: boolean;
35
+ /**
36
+ * Require operation schema hash in operation-context details.
37
+ *
38
+ * @default true
39
+ */
40
+ requireOperationSchemaHash?: boolean;
41
+ /**
42
+ * Require operation version in operation-context details.
43
+ *
44
+ * @default true
45
+ */
46
+ requireOperationVersion?: boolean;
47
+ /**
48
+ * Optional allowlist of producer namespaces derived from requestId.
49
+ */
50
+ allowedNamespaces?: string[];
51
+ /**
52
+ * Optional hook deriving a verified producer identity (namespace) from
53
+ * request headers, e.g. an mTLS subject or gateway-verified JWT claim.
54
+ * When provided, namespace checks bind to this verified value instead of
55
+ * the client-asserted requestId namespace; returning `undefined` denies
56
+ * the request. Without it the namespace checks are advisory only.
57
+ */
58
+ verifyProducerIdentity?: (
59
+ headers: Record<string, unknown>,
60
+ ) => string | undefined;
61
+ /**
62
+ * Optional operation-contract map keyed by:
63
+ * - `${METHOD}:${routePath}`
64
+ * - `operation:${requestId}:${operationId}`
65
+ */
66
+ expectedOperationContracts?: Record<
67
+ string,
68
+ {
69
+ schemaHash?: string;
70
+ operationVersion?: number;
71
+ }
72
+ >;
73
+ /**
74
+ * Allow operations missing from expectedOperationContracts.
75
+ *
76
+ * @default false
77
+ */
78
+ allowUnknownOperations?: boolean;
79
+ /**
80
+ * HTTP status code used for denied requests.
81
+ *
82
+ * @default 403
83
+ */
84
+ denyStatus?: number;
85
+ }
86
+
87
+ export type BffEffectOpenApiUserConfig =
88
+ | boolean
89
+ | {
90
+ path?: string;
91
+ };
92
+
93
+ export interface BffEffectDataPlatformSelectionUserConfig {
94
+ maxDepth?: number;
95
+ maxFields?: number;
96
+ allowedLeafPaths?: string[];
97
+ }
98
+
99
+ export interface BffEffectDataPlatformBatchUserConfig {
100
+ enabled?: boolean;
101
+ endpoint?: `/${string}`;
102
+ maxBatchSize?: number;
103
+ maxBatchBytes?: number;
104
+ flushIntervalMs?: number;
105
+ maxConcurrency?: number;
106
+ requestTimeoutMs?: number;
107
+ allowedMethods?: string[];
108
+ }
109
+
110
+ export interface BffEffectDataPlatformUserConfig {
111
+ enabled?: boolean;
112
+ requireEnvelope?: boolean;
113
+ envelopeHeader?: string;
114
+ expectedNamespace?: string;
115
+ validateOrigin?: boolean;
116
+ requireTraceContext?: boolean;
117
+ selection?: BffEffectDataPlatformSelectionUserConfig;
118
+ batch?: BffEffectDataPlatformBatchUserConfig;
119
+ }
120
+
121
+ export interface BffEffectUserConfig {
122
+ entry?: string;
123
+ /**
124
+ * Enforce Effect-native API/runtime modules instead of raw request handlers.
125
+ *
126
+ * Effect API entries must export a `defineEffectBff(...)`
127
+ * definition or a `{ api, layer }` HttpApi module. Raw `handler` exports,
128
+ * default request handlers, and unbranded custom `createHandler` factories
129
+ * are rejected.
130
+ *
131
+ * @default true
132
+ */
133
+ strictEffectApproach?: true;
134
+ openapi?: BffEffectOpenApiUserConfig;
135
+ dataPlatform?: BffEffectDataPlatformUserConfig;
136
+ }
@@ -0,0 +1,2 @@
1
+ export type * from './bffRuntime';
2
+ export type * from './serverTelemetry';
@@ -0,0 +1,337 @@
1
+ export interface ServerTelemetryExporterOptions {
2
+ enabled?: boolean;
3
+ endpoint?: string;
4
+ headers?: Record<string, string>;
5
+ timeoutMs?: number;
6
+ }
7
+
8
+ export interface ServerTelemetryVictoriaMetricsOptions
9
+ extends ServerTelemetryExporterOptions {
10
+ metricPrefix?: string;
11
+ }
12
+
13
+ export interface ServerTelemetrySloUserConfig {
14
+ /**
15
+ * Queue utilization ratio threshold that emits SLO degradation alerts.
16
+ *
17
+ * @default 0.8
18
+ */
19
+ queueUtilizationWarnThreshold?: number;
20
+ /**
21
+ * Total dropped-envelope threshold that emits SLO degradation alerts.
22
+ *
23
+ * @default 1
24
+ */
25
+ queueDroppedWarnThreshold?: number;
26
+ /**
27
+ * Cooldown between SLO alert emissions for the same alert type.
28
+ *
29
+ * @default 60000
30
+ */
31
+ alertCooldownMs?: number;
32
+ }
33
+
34
+ export interface ServerTelemetryHealthContractGateUserConfig {
35
+ /**
36
+ * Whether this contract gate currently passes.
37
+ */
38
+ passed: boolean;
39
+ /**
40
+ * Optional failure reason used for health diagnostics.
41
+ */
42
+ reason?: string;
43
+ }
44
+
45
+ export interface ServerTelemetrySnapshotObservationUserConfig {
46
+ /**
47
+ * Enable automatic contract gate synchronization from a gate snapshot file.
48
+ *
49
+ * @default true
50
+ */
51
+ enabled?: boolean;
52
+ /**
53
+ * Path to contract gate snapshot JSON file.
54
+ *
55
+ * @default ".modern/contract-gates.json"
56
+ */
57
+ gateSnapshotPath?: string;
58
+ /**
59
+ * Poll interval for reading gate snapshot changes.
60
+ *
61
+ * @default 15000
62
+ */
63
+ pollIntervalMs?: number;
64
+ /**
65
+ * Marks gate entries as failed when they are older than this threshold.
66
+ *
67
+ * @default 600000
68
+ */
69
+ gateStaleAfterMs?: number;
70
+ /**
71
+ * Runtime MF fallback signal ingestion.
72
+ */
73
+ runtimeFallbackSignal?: ServerTelemetryHealthRuntimeFallbackSignalUserConfig;
74
+ /**
75
+ * Optional pluggable state store backend for contract gate snapshots.
76
+ * When omitted, snapshots are read/written from gateSnapshotPath on local disk.
77
+ */
78
+ stateStore?: ServerTelemetrySnapshotObservationStateStoreUserConfig;
79
+ }
80
+
81
+ export interface ServerTelemetrySnapshotObservationStateStoreUserConfig {
82
+ /**
83
+ * Path or package name of a module that exports
84
+ * `createContractGateSnapshotStore(context)`.
85
+ */
86
+ module: string;
87
+ /**
88
+ * Optional adapter-specific configuration.
89
+ */
90
+ options?: Record<string, unknown>;
91
+ }
92
+
93
+ export interface ServerTelemetryHealthRuntimeFallbackSignalUserConfig {
94
+ /**
95
+ * Enable runtime MF fallback signal ingestion endpoint.
96
+ *
97
+ * Opt-in: when enabled, `auth` must be configured with a token
98
+ * (`expectedValue` or `expectedValueEnv`) or server setup throws.
99
+ *
100
+ * @default false
101
+ */
102
+ enabled?: boolean;
103
+ /**
104
+ * HTTP endpoint path for runtime fallback events.
105
+ *
106
+ * @default "/_modern/contract-gates/runtime-fallback"
107
+ */
108
+ endpoint?: string;
109
+ /**
110
+ * Contract gate name updated by runtime fallback events.
111
+ *
112
+ * @default "runtime-mf-fallback-health"
113
+ */
114
+ gateName?: string;
115
+ /**
116
+ * How long a runtime fallback signal should hold gate failure status.
117
+ *
118
+ * @default 300000
119
+ */
120
+ failureHoldMs?: number;
121
+ /**
122
+ * Maximum accepted request body size in bytes.
123
+ *
124
+ * @default 16384
125
+ */
126
+ maxBodyBytes?: number;
127
+ /**
128
+ * Optional runtime trust policy for fallback signal ingestion.
129
+ * Use this to restrict who can mutate health contract gates.
130
+ */
131
+ trustPolicy?: ServerTelemetryHealthRuntimeFallbackSignalTrustPolicyUserConfig;
132
+ /**
133
+ * Optional request authentication for runtime fallback signal endpoint.
134
+ */
135
+ auth?: ServerTelemetryHealthRuntimeFallbackSignalAuthUserConfig;
136
+ }
137
+
138
+ export interface ServerTelemetryHealthRuntimeFallbackSignalAuthUserConfig {
139
+ /**
140
+ * Enable auth guard for runtime fallback signal endpoint.
141
+ *
142
+ * @default false
143
+ */
144
+ enabled?: boolean;
145
+ /**
146
+ * Header name carrying runtime fallback auth token.
147
+ *
148
+ * @default "x-modernjs-runtime-signal-token"
149
+ */
150
+ headerName?: string;
151
+ /**
152
+ * Expected token value. Prefer using expectedValueEnv in production.
153
+ */
154
+ expectedValue?: string;
155
+ /**
156
+ * Name of environment variable that stores expected token value.
157
+ */
158
+ expectedValueEnv?: string;
159
+ }
160
+
161
+ export interface ServerTelemetryHealthRuntimeFallbackSignalTrustPolicyUserConfig {
162
+ /**
163
+ * Allowlist of app names accepted by runtime fallback signal endpoint.
164
+ * Empty means no app-name allowlist check.
165
+ */
166
+ allowedApps?: string[];
167
+ /**
168
+ * Allowlist of entry origins accepted by runtime fallback signal endpoint.
169
+ * Values should be URL origins (for example https://erp.example.com).
170
+ * Empty means no entry-origin allowlist check.
171
+ */
172
+ allowedEntryOrigins?: string[];
173
+ /**
174
+ * Expected runtime digest per appName.
175
+ */
176
+ expectedRuntimeDigests?: Record<string, string>;
177
+ /**
178
+ * Require runtimeDigest to be present in signal payload metadata.
179
+ *
180
+ * @default false
181
+ */
182
+ enforceRuntimeDigest?: boolean;
183
+ /**
184
+ * Maximum accepted signals per app+origin window.
185
+ *
186
+ * @default 30
187
+ */
188
+ maxSignalsPerWindow?: number;
189
+ /**
190
+ * Sliding window size in milliseconds for maxSignalsPerWindow.
191
+ *
192
+ * @default 60000
193
+ */
194
+ windowMs?: number;
195
+ /**
196
+ * Drop duplicate fallback events with the same fingerprint during this window.
197
+ *
198
+ * @default 10000
199
+ */
200
+ dedupeWindowMs?: number;
201
+ }
202
+
203
+ export interface ServerTelemetryHealthUserConfig {
204
+ /**
205
+ * Enable telemetry health observation.
206
+ *
207
+ * @default false
208
+ */
209
+ enabled?: boolean;
210
+ /**
211
+ * Periodic health evaluation interval in milliseconds.
212
+ *
213
+ * @default 15000
214
+ */
215
+ evaluationIntervalMs?: number;
216
+ /**
217
+ * Required consecutive healthy evaluations before reporting healthy.
218
+ *
219
+ * @default 3
220
+ */
221
+ minConsecutiveHealthyEvaluations?: number;
222
+ /**
223
+ * Consecutive failing evaluations before reporting unhealthy.
224
+ *
225
+ * @default 2
226
+ */
227
+ minConsecutiveFailedEvaluations?: number;
228
+ /**
229
+ * Maximum queue utilization ratio allowed for healthy telemetry.
230
+ *
231
+ * @default 0.8
232
+ */
233
+ maxQueueUtilization?: number;
234
+ /**
235
+ * Maximum allowed total dropped envelopes for healthy telemetry.
236
+ *
237
+ * @default 0
238
+ */
239
+ maxTotalDropped?: number;
240
+ /**
241
+ * Maximum allowed unhealthy exporters for healthy telemetry.
242
+ *
243
+ * @default 0
244
+ */
245
+ maxUnhealthyExporters?: number;
246
+ /**
247
+ * Contract gate map used in health evaluations.
248
+ * `true` means passing, `false` means failing.
249
+ */
250
+ contractGates?: Record<
251
+ string,
252
+ boolean | ServerTelemetryHealthContractGateUserConfig
253
+ >;
254
+ /**
255
+ * Contract-gate snapshot observation settings.
256
+ */
257
+ snapshotObservation?: ServerTelemetrySnapshotObservationUserConfig;
258
+ }
259
+
260
+ export interface ServerTelemetryConfigExtension {
261
+ telemetry?: ServerTelemetryUserConfig;
262
+ }
263
+
264
+ export interface ServerTelemetryUserConfig {
265
+ /**
266
+ * Enable framework telemetry envelope emission.
267
+ * @default false
268
+ */
269
+ enabled?: boolean;
270
+ /**
271
+ * Logical service name attached to every telemetry envelope.
272
+ * @default server.metaName
273
+ */
274
+ service?: string;
275
+ /**
276
+ * Logical module name attached to every telemetry envelope.
277
+ * @default "server"
278
+ */
279
+ module?: string;
280
+ /**
281
+ * Environment attached to every telemetry envelope.
282
+ * @default process.env.NODE_ENV || "development"
283
+ */
284
+ environment?: string;
285
+ /**
286
+ * Sampling rate for monitor events.
287
+ * @default 1
288
+ */
289
+ samplingRate?: number;
290
+ /**
291
+ * Flush window in milliseconds for exporter batches.
292
+ * @default 1000
293
+ */
294
+ flushIntervalMs?: number;
295
+ /**
296
+ * Maximum envelopes in one emitted batch.
297
+ * @default 50
298
+ */
299
+ maxBatchSize?: number;
300
+ /**
301
+ * Maximum envelopes buffered before backpressure drops oldest.
302
+ * @default 1000
303
+ */
304
+ maxQueueSize?: number;
305
+ /**
306
+ * Envelope attribute keys that should be redacted.
307
+ */
308
+ redactionKeys?: string[];
309
+ /**
310
+ * Control startup exporter health probe behavior.
311
+ * When enabled (default), server initialization emits a startup probe and
312
+ * marks exporters healthy/unhealthy before serving traffic.
313
+ * When fail-loud mode is enabled (default), initialization throws if at
314
+ * least one configured exporter is unhealthy.
315
+ *
316
+ * @default true
317
+ */
318
+ failLoudStartup?: boolean;
319
+ /**
320
+ * Queue backpressure/degradation SLO alert thresholds.
321
+ */
322
+ slo?: ServerTelemetrySloUserConfig;
323
+ /**
324
+ * Telemetry health observation policy.
325
+ */
326
+ health?: ServerTelemetryHealthUserConfig;
327
+ exporters?: {
328
+ /**
329
+ * OpenTelemetry HTTP exporter.
330
+ */
331
+ otlp?: ServerTelemetryExporterOptions;
332
+ /**
333
+ * VictoriaMetrics Prometheus import exporter.
334
+ */
335
+ victoriaMetrics?: ServerTelemetryVictoriaMetricsOptions;
336
+ };
337
+ }
@@ -24,30 +24,60 @@ export const createConservingWebShellStream = (
24
24
  markerCarry = markerFound ? '' : candidate.slice(-(marker.length - 1));
25
25
  };
26
26
 
27
- return source.pipeThrough(
28
- new TransformStream<Uint8Array, Uint8Array>({
29
- transform(chunk, controller) {
30
- const decoded = decoder.decode(chunk, { stream: true });
31
- observeMarker(decoded);
32
- const output = headProcessor.push(decoded);
33
- if (output) {
34
- controller.enqueue(encoder.encode(output));
27
+ const transform = new TransformStream<Uint8Array, Uint8Array>({
28
+ transform(chunk, controller) {
29
+ const decoded = decoder.decode(chunk, { stream: true });
30
+ observeMarker(decoded);
31
+ const output = headProcessor.push(decoded);
32
+ if (output) {
33
+ controller.enqueue(encoder.encode(output));
34
+ }
35
+ },
36
+ flush(controller) {
37
+ const decoded = decoder.decode();
38
+ observeMarker(decoded);
39
+ if (!markerFound) {
40
+ abortHeadRender(context);
41
+ const error = new Error(MISSING_SHELL_MARKER_ERROR);
42
+ onMissingMarker?.(error);
43
+ throw error;
44
+ }
45
+ const output = headProcessor.finish(decoded);
46
+ if (output) {
47
+ controller.enqueue(encoder.encode(output));
48
+ }
49
+ },
50
+ });
51
+ const piping = source.pipeTo(transform.writable);
52
+ piping.catch(() => {});
53
+ const reader = transform.readable.getReader();
54
+ return new ReadableStream<Uint8Array>({
55
+ async pull(controller) {
56
+ try {
57
+ const result = await reader.read();
58
+ if (result.done) {
59
+ await piping;
60
+ controller.close();
61
+ reader.releaseLock();
62
+ } else controller.enqueue(result.value);
63
+ } catch (error) {
64
+ await piping.catch(() => {});
65
+ controller.error(error);
66
+ reader.releaseLock();
67
+ }
68
+ },
69
+ async cancel(reason) {
70
+ try {
71
+ await reader.cancel(reason);
72
+ } finally {
73
+ try {
74
+ await piping.catch(error => {
75
+ if (error !== reason) throw error;
76
+ });
77
+ } finally {
78
+ reader.releaseLock();
35
79
  }
36
- },
37
- flush(controller) {
38
- const decoded = decoder.decode();
39
- observeMarker(decoded);
40
- if (!markerFound) {
41
- abortHeadRender(context);
42
- const error = new Error(MISSING_SHELL_MARKER_ERROR);
43
- onMissingMarker?.(error);
44
- throw error;
45
- }
46
- const output = headProcessor.finish(decoded);
47
- if (output) {
48
- controller.enqueue(encoder.encode(output));
49
- }
50
- },
51
- }),
52
- );
80
+ }
81
+ },
82
+ });
53
83
  };