@pulse-compute/wasm-contracts 0.0.0 → 1.0.0-beta.1

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 (96) hide show
  1. package/README.md +34 -2
  2. package/package.json +123 -6
  3. package/src/assets/contracts.js +296 -0
  4. package/src/config/provider-resolution.js +54 -0
  5. package/src/config/runtime-provider-kv.js +73 -0
  6. package/src/config/symbolic-refs.js +192 -0
  7. package/src/crypto/contracts.js +637 -0
  8. package/src/definitions/config-schema.js +30 -0
  9. package/src/definitions/handler-roles.js +66 -0
  10. package/src/definitions/path-grammar.js +11 -0
  11. package/src/definitions/router-api.js +146 -0
  12. package/src/diagnostics/codes.js +42 -0
  13. package/src/diagnostics/reporter.js +20 -0
  14. package/src/diagnostics.js +139 -0
  15. package/src/dispatch-table.js +23 -0
  16. package/src/entities/catalog.d.ts +7 -0
  17. package/src/entities/catalog.js +87 -0
  18. package/src/entities/contracts.d.ts +95 -0
  19. package/src/entities/contracts.js +122 -0
  20. package/src/entities/json-rpc.d.ts +27 -0
  21. package/src/entities/json-rpc.js +69 -0
  22. package/src/entities/runtime.d.ts +67 -0
  23. package/src/entities/runtime.js +288 -0
  24. package/src/events/contracts.js +456 -0
  25. package/src/execution-plan.js +42 -0
  26. package/src/grip/contracts.js +106 -0
  27. package/src/handler/backend-json-request-body.js +58 -0
  28. package/src/handler/beta-lifecycle-golden.js +97 -0
  29. package/src/handler/canonical-native-plan.js +143 -0
  30. package/src/handler/canonical-native-runtime.js +168 -0
  31. package/src/handler/canonical-runtime.js +13 -0
  32. package/src/handler/context.js +131 -0
  33. package/src/handler/ctx-contract.js +71 -0
  34. package/src/handler/doctor-readiness-aggregator.js +67 -0
  35. package/src/handler/effects.js +446 -0
  36. package/src/handler/io-lifecycle.js +134 -0
  37. package/src/handler/lifecycle-authoring-alignment.js +52 -0
  38. package/src/handler/lifecycle-readiness-aggregate.js +93 -0
  39. package/src/handler/reference-node-lifecycle-golden.js +73 -0
  40. package/src/handler/request-json-body.js +147 -0
  41. package/src/handler/runtime-api.js +471 -0
  42. package/src/handler/schema-decode-result.js +135 -0
  43. package/src/handler/schema-response-codec.js +141 -0
  44. package/src/handler/surface-contract.js +594 -0
  45. package/src/handler/types-contract.js +51 -0
  46. package/src/handler-table.js +28 -0
  47. package/src/host/backend-capabilities.js +24 -0
  48. package/src/host/capabilities.js +273 -0
  49. package/src/host/channel-broadcaster.js +60 -0
  50. package/src/host/json-body.js +80 -0
  51. package/src/host/request-result-headers.js +38 -0
  52. package/src/host/streaming-passthrough.js +90 -0
  53. package/src/host/wasm-host-abi.js +154 -0
  54. package/src/index.js +75 -0
  55. package/src/jwt/contracts.js +427 -0
  56. package/src/library/api-surface.js +99 -0
  57. package/src/library/contracts.js +273 -0
  58. package/src/library/manifest.js +317 -0
  59. package/src/library/second-package-owned-lowering.js +39 -0
  60. package/src/library/sidecars.js +147 -0
  61. package/src/logging.js +89 -0
  62. package/src/package/package-contract.js +975 -0
  63. package/src/package/package-contract.schema.json +303 -0
  64. package/src/package/runtime-pulse-live.js +100 -0
  65. package/src/path-table.js +12 -0
  66. package/src/path.js +275 -0
  67. package/src/project/config-factory.js +48 -0
  68. package/src/project/config-plan.js +409 -0
  69. package/src/project/config-runtime.js +46 -0
  70. package/src/project/javascript-application.js +212 -0
  71. package/src/project/javascript-core-capabilities.js +44 -0
  72. package/src/project/native-optimization.js +9 -0
  73. package/src/project/package-ownership.js +242 -0
  74. package/src/project/package-product-projection.js +171 -0
  75. package/src/project/reachable-graph-identity.js +219 -0
  76. package/src/project/reachable-graph-projections.js +279 -0
  77. package/src/project/reachable-graph-resolver.js +303 -0
  78. package/src/project/reachable-graph-v2.js +430 -0
  79. package/src/project/reachable-graph-v2.schema.json +285 -0
  80. package/src/project/reachable-graph.js +199 -0
  81. package/src/project/reachable-graph.schema.json +222 -0
  82. package/src/project/target-support-evidence.js +559 -0
  83. package/src/provider/canonical-provider.js +235 -0
  84. package/src/provider/final-wasm-policy.js +87 -0
  85. package/src/provider/toolchain.js +771 -0
  86. package/src/route-plan.js +43 -0
  87. package/src/schema-json/compile.js +63 -0
  88. package/src/schema-json/contracts.js +10 -0
  89. package/src/schema-json/generic-parser.js +62 -0
  90. package/src/schema-json/registry.js +359 -0
  91. package/src/schema-json/semantic-trace.js +241 -0
  92. package/src/schema-json/v1.js +65 -0
  93. package/src/schema-json/v2.js +110 -0
  94. package/src/sha256.js +104 -0
  95. package/src/spine.js +381 -0
  96. package/src/stable-id.js +142 -0
@@ -0,0 +1,67 @@
1
+ 'use strict';
2
+
3
+ const DOCTOR_READINESS_AGGREGATOR_VERSION = 'pulsewasm.doctor-readiness-aggregator.v1';
4
+ const DOCTOR_READINESS_AGGREGATOR_PHASE = '53';
5
+ const DOCTOR_READINESS_AGGREGATOR_ARTIFACT = 'doctor-readiness-aggregator.json';
6
+ const DOCTOR_READINESS_AGGREGATOR_CONTRACT_ID = 'pulse.doctor-readiness-aggregator';
7
+
8
+ const DOCTOR_READINESS_AGGREGATOR_SCOPE = Object.freeze({
9
+ betaApp: 'examples/beta-lifecycle/app.js',
10
+ referenceApp: 'examples/reference-node-lifecycle/app.js',
11
+ assetsPackageOutApp: 'examples/assets-package-out/app.js',
12
+ command: 'node wasm/scripts/run-wasm-tests.cjs --profile release --no-report',
13
+ cliDoctorReadinessRequired: true,
14
+ routeReadinessRequired: true,
15
+ packageReadinessRequired: true,
16
+ providerReadinessRequired: true,
17
+ planOnlyClassificationRequired: true,
18
+ splitProofClassificationRequired: true
19
+ });
20
+
21
+ const DOCTOR_READINESS_AGGREGATOR_POLICY = Object.freeze({
22
+ purpose: 'make pulsewasm doctor the developer-facing readiness aggregator for beta lifecycle routes, lowerable packages, providers, and plan-only edges',
23
+ productionCompletenessRequired: false,
24
+ betaQualityTarget: true,
25
+ simpleUserFunctionLoweringIntentional: true,
26
+ sourceOfTruth: Object.freeze({
27
+ routeShape: 'handler-io-lifecycle-plan.json and CLI doctor lifecycle section',
28
+ nodeBackendLifecycle: 'reference-node-lifecycle-golden.json and Node backend proof artifacts',
29
+ assetsPackageLifecycle: 'assets package-owned/package-out/sidecar and Node compiled-Wasm assets proof artifacts',
30
+ fastlyLifecycle: 'fastly-lifecycle-parity-proof.json and fastly-assets-package-out-parity-proof.json',
31
+ unsupportedEdges: 'contracts diagnostics plus lifecycle-authoring-alignment.json'
32
+ }),
33
+ readinessVocabulary: Object.freeze({
34
+ implemented: 'usable in the validated beta path',
35
+ implementedNarrow: 'usable for the documented narrow beta subset',
36
+ symbolicParity: 'provider-owned symbolic parity proof; no external service required',
37
+ planOnly: 'reserved/planned and diagnosed or classified, not silently implemented',
38
+ splitProofRequired: 'validated through split lifecycle proofs because the combined app is not yet lowered by one compiled bridge'
39
+ }),
40
+ requiredDoctorSections: Object.freeze([
41
+ 'readiness.summary',
42
+ 'readiness.routes',
43
+ 'readiness.packages',
44
+ 'readiness.providers',
45
+ 'readiness.unsupportedEdges',
46
+ 'readiness.actionableNextSteps'
47
+ ]),
48
+ outOfScope: Object.freeze([
49
+ 'production asset CDN semantics',
50
+ 'full Fastly compiled-Wasm runtime execution',
51
+ 'single unified compiled bridge for backend and package-owned assets handlers in the combined beta app',
52
+ 'arbitrary third-party compiler lowerer execution',
53
+ 'async/await lowering',
54
+ 'Promise lowering',
55
+ 'automatic schema generation',
56
+ 'arbitrary JavaScript object lowering'
57
+ ])
58
+ });
59
+
60
+ module.exports = {
61
+ DOCTOR_READINESS_AGGREGATOR_VERSION,
62
+ DOCTOR_READINESS_AGGREGATOR_PHASE,
63
+ DOCTOR_READINESS_AGGREGATOR_ARTIFACT,
64
+ DOCTOR_READINESS_AGGREGATOR_CONTRACT_ID,
65
+ DOCTOR_READINESS_AGGREGATOR_SCOPE,
66
+ DOCTOR_READINESS_AGGREGATOR_POLICY
67
+ };
@@ -0,0 +1,446 @@
1
+ 'use strict';
2
+
3
+ const ROUTE_HANDLER_EFFECT_PLAN_VERSION = 'pulsewasm.route-handler-effect-plan.v1';
4
+ const ROUTE_HANDLER_EFFECT_PLAN_PHASE = '30';
5
+ const ROUTE_HANDLER_EFFECT_PLAN_ARTIFACT = 'route-handler-effect-plan.json';
6
+ const ROUTE_HANDLER_NODE_EFFECT_PROOF_VERSION = 'pulsewasm.route-handler-node-effect-proof.v1';
7
+ const ROUTE_HANDLER_NODE_EFFECT_PROOF_PHASE = '32';
8
+ const ROUTE_HANDLER_NODE_EFFECT_PROOF_ARTIFACT = 'node-route-handler-effect-proof.json';
9
+ const ROUTE_HANDLER_NODE_EFFECT_RUNTIME_VERSION = 'pulsewasm.route-handler-node-effect-runtime.v1';
10
+ const ROUTE_HANDLER_NODE_LIVE_ORIGIN_EFFECT_PROOF_VERSION = 'pulsewasm.route-handler-node-live-origin-effect-proof.v1';
11
+ const ROUTE_HANDLER_NODE_LIVE_ORIGIN_EFFECT_PROOF_PHASE = '37';
12
+ const ROUTE_HANDLER_NODE_LIVE_ORIGIN_EFFECT_PROOF_ARTIFACT = 'node-live-origin-route-handler-effect-proof.json';
13
+ const ROUTE_HANDLER_NODE_LIVE_ORIGIN_EFFECT_RUNTIME_VERSION = 'pulsewasm.route-handler-node-live-origin-effect-runtime.v1';
14
+ const ROUTE_HANDLER_NODE_COMPILED_EFFECT_BRIDGE_VERSION = 'pulsewasm.route-handler-node-compiled-effect-bridge.v1';
15
+ const ROUTE_HANDLER_NODE_COMPILED_EFFECT_BRIDGE_PHASE = '38';
16
+ const ROUTE_HANDLER_NODE_COMPILED_EFFECT_BRIDGE_ARTIFACT = 'node-compiled-route-handler-effect-bridge.json';
17
+ const ROUTE_HANDLER_NODE_COMPILED_EFFECT_BRIDGE_RUNTIME_VERSION = 'pulsewasm.route-handler-node-compiled-effect-bridge-runtime.v1';
18
+ const ROUTE_HANDLER_FASTLY_EFFECT_PROOF_VERSION = 'pulsewasm.route-handler-fastly-effect-proof.v1';
19
+ const ROUTE_HANDLER_FASTLY_EFFECT_PROOF_PHASE = '33';
20
+ const ROUTE_HANDLER_FASTLY_EFFECT_PROOF_ARTIFACT = 'fastly-route-handler-effect-proof.json';
21
+ const ROUTE_HANDLER_FASTLY_EFFECT_RUNTIME_VERSION = 'pulsewasm.route-handler-fastly-effect-runtime.v1';
22
+ const ROUTE_HANDLER_FASTLY_EFFECT_PROVIDER_CONFIG_VERSION = 'pulsewasm.route-handler-fastly-effect-provider-config.v1';
23
+ const ROUTE_HANDLER_EFFECT_CONTRACT_ID = 'pulse.route-handler-effects';
24
+
25
+ const ROUTE_HANDLER_EFFECT_PLAN_SCOPE = Object.freeze({
26
+ planOnly: true,
27
+ runtimeBehaviorChanged: false,
28
+ providerBehaviorImplemented: false,
29
+ compiledWasmEffectExecutionImplemented: false,
30
+ languageLevelAsync: false,
31
+ promises: false,
32
+ asyncAwait: false,
33
+ asyncify: false,
34
+ hiddenScheduler: false
35
+ });
36
+
37
+ const ROUTE_HANDLER_NODE_EFFECT_PROOF_SCOPE = Object.freeze({
38
+ provider: 'node',
39
+ compilerOwnsProviderBehavior: false,
40
+ compilerOrchestrationOnly: true,
41
+ providerBehaviorImplemented: true,
42
+ backendFetchProviderExecutionImplemented: true,
43
+ responseHandleSurfaceImplemented: true,
44
+ continuationContextImplemented: true,
45
+ directProviderSmoke: true,
46
+ routeEffectPlanRequired: true,
47
+ compiledWasmEffectExecutionImplemented: false,
48
+ compiledWasmSuspendResumeBridgeImplemented: false,
49
+ languageLevelAsync: false,
50
+ promises: false,
51
+ asyncAwait: false,
52
+ asyncify: false,
53
+ actualNetworkFetch: false,
54
+ localFixtureFetch: true
55
+ });
56
+
57
+ const ROUTE_HANDLER_NODE_LIVE_ORIGIN_EFFECT_PROOF_SCOPE = Object.freeze({
58
+ provider: 'node',
59
+ compilerOwnsProviderBehavior: false,
60
+ compilerOrchestrationOnly: true,
61
+ providerBehaviorImplemented: true,
62
+ compilerOwnsProviderBehavior: false,
63
+ backendFetchProviderExecutionImplemented: true,
64
+ liveOriginFetchImplemented: true,
65
+ responseHandleSurfaceImplemented: true,
66
+ continuationContextImplemented: true,
67
+ directProviderSmoke: true,
68
+ routeEffectPlanRequired: true,
69
+ compiledWasmEffectExecutionImplemented: false,
70
+ compiledWasmSuspendResumeBridgeImplemented: false,
71
+ languageLevelAsync: false,
72
+ promises: false,
73
+ asyncAwait: false,
74
+ asyncify: false,
75
+ actualNetworkFetch: true,
76
+ localFixtureFetch: false,
77
+ bootstrapOriginRequired: true
78
+ });
79
+
80
+ const ROUTE_HANDLER_NODE_COMPILED_EFFECT_BRIDGE_SCOPE = Object.freeze({
81
+ provider: 'node',
82
+ compilerOwnsProviderBehavior: false,
83
+ compilerOrchestrationOnly: true,
84
+ providerBehaviorImplemented: true,
85
+ backendFetchProviderExecutionImplemented: true,
86
+ liveOriginFetchImplemented: true,
87
+ responseHandleSurfaceImplemented: true,
88
+ continuationContextImplemented: true,
89
+ routeEffectPlanRequired: true,
90
+ compiledWasmEffectExecutionImplemented: true,
91
+ compiledWasmSuspendResumeBridgeImplemented: true,
92
+ compiledWasmContinuationReentryImplemented: true,
93
+ compiledWasmResolvedHandleInjectionImplemented: true,
94
+ directProviderSmoke: false,
95
+ languageLevelAsync: false,
96
+ promises: false,
97
+ asyncAwait: false,
98
+ asyncify: false,
99
+ actualNetworkFetch: true,
100
+ localFixtureFetch: false,
101
+ bootstrapOriginRequired: true,
102
+ singleEffectGroup: true,
103
+ namedObjectEffectGroup: true,
104
+ arrayEffectGroup: false
105
+ });
106
+
107
+ const ROUTE_HANDLER_FASTLY_EFFECT_PROOF_SCOPE = Object.freeze({
108
+ provider: 'fastly',
109
+ providerBehaviorImplemented: true,
110
+ compilerOwnsProviderBehavior: false,
111
+ backendFetchProviderExecutionImplemented: true,
112
+ responseHandleSurfaceImplemented: true,
113
+ continuationContextImplemented: true,
114
+ directProviderSmoke: true,
115
+ routeEffectPlanRequired: true,
116
+ providerConfigMappingImplemented: true,
117
+ symbolicBackendRefs: true,
118
+ symbolicConfigSecretRefs: true,
119
+ compiledWasmEffectExecutionImplemented: false,
120
+ compiledWasmSuspendResumeBridgeImplemented: false,
121
+ languageLevelAsync: false,
122
+ promises: false,
123
+ asyncAwait: false,
124
+ asyncify: false,
125
+ actualNetworkFetch: false,
126
+ localFixtureFetch: true
127
+ });
128
+
129
+ const ROUTE_HANDLER_EFFECT_GROUP_SHAPES = Object.freeze({
130
+ single: {
131
+ status: 'implemented-plan',
132
+ authoringShape: 'ctx.resolve(ctx.fetch("backend", requestSpec), afterFetch)',
133
+ resultAccess: 'ctx.resolved()'
134
+ },
135
+ namedObject: {
136
+ status: 'implemented-plan',
137
+ authoringShape: 'ctx.resolve({ user: ctx.fetch("users", requestSpec) }, afterDashboard)',
138
+ resultAccess: 'ctx.resolved("user")'
139
+ },
140
+ array: {
141
+ status: 'reserved-with-diagnostic',
142
+ authoringShape: 'ctx.resolve([ctx.fetch(...)], afterFetch)',
143
+ diagnostic: 'PULSEWASM_RESOLVE_ARRAY_GROUP_RESERVED'
144
+ }
145
+ });
146
+
147
+ const ROUTE_HANDLER_EFFECT_ALLOWED_METHODS = Object.freeze(['GET', 'HEAD', 'POST']);
148
+ const ROUTE_HANDLER_EFFECT_KIND_REGISTRY = Object.freeze({
149
+ backendFetch: {
150
+ kind: 'backend-fetch',
151
+ publicSurface: 'ctx.fetch("backendKey", requestSpec)',
152
+ status: 'planned-only',
153
+ requiredCapability: 'backend-fetch',
154
+ hostOwned: true,
155
+ providerExecution: 'future-provider-proof',
156
+ payload: {
157
+ backend: 'literal backend key',
158
+ request: 'static object literal request spec',
159
+ method: 'literal GET/HEAD/POST for the MVP plan',
160
+ path: 'literal/concat/ctx.param expression tree'
161
+ }
162
+ }
163
+ });
164
+
165
+ const ROUTE_HANDLER_CONTEXT_SURFACE = Object.freeze({
166
+ sync: [
167
+ 'ctx.param',
168
+ 'ctx.paramI32',
169
+ 'ctx.request.method',
170
+ 'ctx.request.path',
171
+ 'ctx.request.header.first',
172
+ 'ctx.request.header.count',
173
+ 'ctx.request.header.at',
174
+ 'ctx.response.header.set',
175
+ 'ctx.response.header.append',
176
+ 'ctx.response.header.delete',
177
+ 'ctx.result.text',
178
+ 'ctx.result.jsonText',
179
+ 'ctx.result.empty',
180
+ 'ctx.error',
181
+ 'next',
182
+ 'next(error)'
183
+ ],
184
+ effect: [
185
+ 'ctx.fetch',
186
+ 'ctx.resolve',
187
+ 'ctx.resolved'
188
+ ],
189
+ resolvedFetchResponse: [
190
+ 'status',
191
+ 'ok',
192
+ 'header',
193
+ 'text',
194
+ 'jsonText',
195
+ 'json'
196
+ ],
197
+ reservedResolvedFetchResponse: [
198
+ 'bytes',
199
+ 'stream'
200
+ ],
201
+ rejected: [
202
+ 'await ctx.fetch(...)',
203
+ 'ctx.fetch(...).then(...)',
204
+ 'inline resolve continuation callbacks',
205
+ 'captured continuation closures',
206
+ 'dynamic backend keys',
207
+ 'dynamic effect names',
208
+ 'computed request objects',
209
+ 'Promise',
210
+ 'async function',
211
+ 'global fetch',
212
+ 'bare defer keyword'
213
+ ]
214
+ });
215
+
216
+ const ROUTE_HANDLER_EFFECT_DIAGNOSTICS = Object.freeze({
217
+ resolveContinuationMustBeTopLevel: 'PULSEWASM_RESOLVE_CONTINUATION_MUST_BE_TOP_LEVEL',
218
+ resolveContinuationMissing: 'PULSEWASM_RESOLVE_CONTINUATION_MISSING',
219
+ resolveEffectUnsupported: 'PULSEWASM_RESOLVE_EFFECT_UNSUPPORTED',
220
+ resolveObjectKeyUnsupported: 'PULSEWASM_RESOLVE_OBJECT_KEY_UNSUPPORTED',
221
+ resolveArrayGroupReserved: 'PULSEWASM_RESOLVE_ARRAY_GROUP_RESERVED',
222
+ fetchBackendMustBeLiteral: 'PULSEWASM_FETCH_BACKEND_MUST_BE_LITERAL',
223
+ fetchRequestMustBeObject: 'PULSEWASM_FETCH_REQUEST_MUST_BE_OBJECT',
224
+ fetchMethodMustBeLiteral: 'PULSEWASM_FETCH_METHOD_MUST_BE_LITERAL',
225
+ fetchMethodUnsupported: 'PULSEWASM_FETCH_METHOD_UNSUPPORTED',
226
+ backendMethodUnsupported: 'PULSEWASM_BACKEND_METHOD_UNSUPPORTED',
227
+ backendRequestBodyModeUnsupported: 'PULSEWASM_BACKEND_REQUEST_BODY_MODE_UNSUPPORTED',
228
+ schemaEncodeRefRequired: 'PULSEWASM_SCHEMA_ENCODE_REF_REQUIRED',
229
+ schemaEncodeDynamicSchemaUnsupported: 'PULSEWASM_SCHEMA_ENCODE_DYNAMIC_SCHEMA_UNSUPPORTED',
230
+ fetchJsonBodySchemaEncodeRequired: 'PULSEWASM_FETCH_JSON_BODY_SCHEMA_ENCODE_REQUIRED',
231
+ requestBodyBinaryReserved: 'PULSEWASM_REQUEST_BODY_BINARY_RESERVED',
232
+ requestBodyStreamReserved: 'PULSEWASM_REQUEST_BODY_STREAM_RESERVED',
233
+ requestBodyMultipartReserved: 'PULSEWASM_REQUEST_BODY_MULTIPART_RESERVED',
234
+ fetchPathUnsupported: 'PULSEWASM_FETCH_PATH_UNSUPPORTED',
235
+ fetchHeadersUnsupported: 'PULSEWASM_FETCH_HEADERS_UNSUPPORTED',
236
+ handlerSourceMissing: 'PULSEWASM_ROUTE_EFFECT_HANDLER_SOURCE_MISSING',
237
+ resolvedResultUnknownName: 'PULSEWASM_RESOLVED_RESULT_UNKNOWN_NAME',
238
+ resolvedResponseModeReserved: 'PULSEWASM_RESOLVED_RESPONSE_MODE_RESERVED',
239
+ unsupportedLanguageAsync: 'PULSEWASM_ROUTE_EFFECT_ASYNC_UNSUPPORTED',
240
+ nodeEffectPlanRequired: 'PULSEWASM_NODE_ROUTE_EFFECT_PLAN_REQUIRED',
241
+ nodeEffectNoPlannedEffects: 'PULSEWASM_NODE_ROUTE_EFFECT_NO_PLANNED_EFFECTS',
242
+ nodeEffectRouteNotFound: 'PULSEWASM_NODE_ROUTE_EFFECT_ROUTE_NOT_FOUND',
243
+ nodeEffectContinuationMissing: 'PULSEWASM_NODE_ROUTE_EFFECT_CONTINUATION_MISSING',
244
+ nodeEffectBackendMissing: 'PULSEWASM_NODE_ROUTE_EFFECT_BACKEND_MISSING',
245
+ nodeEffectBackendResponseMissing: 'PULSEWASM_NODE_ROUTE_EFFECT_BACKEND_RESPONSE_MISSING',
246
+ nodeEffectUnsupportedMethod: 'PULSEWASM_NODE_ROUTE_EFFECT_UNSUPPORTED_METHOD',
247
+ nodeEffectPathUnsupported: 'PULSEWASM_NODE_ROUTE_EFFECT_PATH_UNSUPPORTED',
248
+ nodeEffectResolvedNameMissing: 'PULSEWASM_NODE_ROUTE_EFFECT_RESOLVED_NAME_MISSING',
249
+ nodeEffectSmokeFailed: 'PULSEWASM_NODE_ROUTE_EFFECT_SMOKE_FAILED',
250
+ nodeLiveOriginRequired: 'PULSEWASM_NODE_ROUTE_EFFECT_LIVE_ORIGIN_REQUIRED',
251
+ nodeLiveOriginFetchFailed: 'PULSEWASM_NODE_ROUTE_EFFECT_LIVE_ORIGIN_FETCH_FAILED',
252
+ nodeLiveOriginInvalidUrl: 'PULSEWASM_NODE_ROUTE_EFFECT_LIVE_ORIGIN_INVALID_URL',
253
+ nodeCompiledBridgePlanRequired: 'PULSEWASM_NODE_COMPILED_ROUTE_EFFECT_BRIDGE_PLAN_REQUIRED',
254
+ nodeCompiledBridgeNoPlannedEffects: 'PULSEWASM_NODE_COMPILED_ROUTE_EFFECT_BRIDGE_NO_PLANNED_EFFECTS',
255
+ nodeCompiledBridgeAscMissing: 'PULSEWASM_NODE_COMPILED_ROUTE_EFFECT_BRIDGE_ASC_MISSING',
256
+ nodeCompiledBridgeCompileFailed: 'PULSEWASM_NODE_COMPILED_ROUTE_EFFECT_BRIDGE_COMPILE_FAILED',
257
+ nodeCompiledBridgeSmokeFailed: 'PULSEWASM_NODE_COMPILED_ROUTE_EFFECT_BRIDGE_SMOKE_FAILED',
258
+ fastlyEffectPlanRequired: 'PULSEWASM_FASTLY_ROUTE_EFFECT_PLAN_REQUIRED',
259
+ fastlyEffectNoPlannedEffects: 'PULSEWASM_FASTLY_ROUTE_EFFECT_NO_PLANNED_EFFECTS',
260
+ fastlyEffectRouteNotFound: 'PULSEWASM_FASTLY_ROUTE_EFFECT_ROUTE_NOT_FOUND',
261
+ fastlyEffectContinuationMissing: 'PULSEWASM_FASTLY_ROUTE_EFFECT_CONTINUATION_MISSING',
262
+ fastlyEffectBackendMissing: 'PULSEWASM_FASTLY_ROUTE_EFFECT_BACKEND_MISSING',
263
+ fastlyEffectBackendResponseMissing: 'PULSEWASM_FASTLY_ROUTE_EFFECT_BACKEND_RESPONSE_MISSING',
264
+ fastlyEffectUnsupportedMethod: 'PULSEWASM_FASTLY_ROUTE_EFFECT_UNSUPPORTED_METHOD',
265
+ fastlyEffectPathUnsupported: 'PULSEWASM_FASTLY_ROUTE_EFFECT_PATH_UNSUPPORTED',
266
+ fastlyEffectResolvedNameMissing: 'PULSEWASM_FASTLY_ROUTE_EFFECT_RESOLVED_NAME_MISSING',
267
+ fastlyEffectSmokeFailed: 'PULSEWASM_FASTLY_ROUTE_EFFECT_SMOKE_FAILED'
268
+ });
269
+
270
+ const ROUTE_HANDLER_EFFECT_LIFECYCLE = Object.freeze({
271
+ handlerRunsSynchronously: true,
272
+ resolveReturnsEffectRequest: true,
273
+ hostExecutesEffectGroup: true,
274
+ continuationReentryIsExplicit: true,
275
+ continuationReadsResultsThroughCtx: true,
276
+ continuationMayReturnResultOrAnotherResolveRequest: 'reserved',
277
+ wasmCallStackCaptured: false,
278
+ continuationTokenUserVisible: false
279
+ });
280
+
281
+ function defaultRouteHandlerEffectPolicy() {
282
+ return {
283
+ ...ROUTE_HANDLER_EFFECT_PLAN_SCOPE,
284
+ contractId: ROUTE_HANDLER_EFFECT_CONTRACT_ID,
285
+ artifact: ROUTE_HANDLER_EFFECT_PLAN_ARTIFACT,
286
+ nodeProviderProofArtifact: ROUTE_HANDLER_NODE_EFFECT_PROOF_ARTIFACT,
287
+ nodeProviderRuntimeVersion: ROUTE_HANDLER_NODE_EFFECT_RUNTIME_VERSION,
288
+ nodeLiveOriginProviderProofArtifact: ROUTE_HANDLER_NODE_LIVE_ORIGIN_EFFECT_PROOF_ARTIFACT,
289
+ nodeLiveOriginProviderRuntimeVersion: ROUTE_HANDLER_NODE_LIVE_ORIGIN_EFFECT_RUNTIME_VERSION,
290
+ nodeCompiledEffectBridgeArtifact: ROUTE_HANDLER_NODE_COMPILED_EFFECT_BRIDGE_ARTIFACT,
291
+ nodeCompiledEffectBridgeRuntimeVersion: ROUTE_HANDLER_NODE_COMPILED_EFFECT_BRIDGE_RUNTIME_VERSION,
292
+ fastlyProviderProofArtifact: ROUTE_HANDLER_FASTLY_EFFECT_PROOF_ARTIFACT,
293
+ fastlyProviderRuntimeVersion: ROUTE_HANDLER_FASTLY_EFFECT_RUNTIME_VERSION,
294
+ allowedMethods: [...ROUTE_HANDLER_EFFECT_ALLOWED_METHODS],
295
+ groupShapes: JSON.parse(JSON.stringify(ROUTE_HANDLER_EFFECT_GROUP_SHAPES)),
296
+ effectKinds: JSON.parse(JSON.stringify(ROUTE_HANDLER_EFFECT_KIND_REGISTRY)),
297
+ contextSurface: JSON.parse(JSON.stringify(ROUTE_HANDLER_CONTEXT_SURFACE)),
298
+ lifecycle: JSON.parse(JSON.stringify(ROUTE_HANDLER_EFFECT_LIFECYCLE))
299
+ };
300
+ }
301
+
302
+ function defaultRouteHandlerNodeEffectProofPolicy() {
303
+ return {
304
+ ...ROUTE_HANDLER_NODE_EFFECT_PROOF_SCOPE,
305
+ contractId: ROUTE_HANDLER_EFFECT_CONTRACT_ID,
306
+ artifact: ROUTE_HANDLER_NODE_EFFECT_PROOF_ARTIFACT,
307
+ sourcePlanArtifact: ROUTE_HANDLER_EFFECT_PLAN_ARTIFACT,
308
+ runtimeVersion: ROUTE_HANDLER_NODE_EFFECT_RUNTIME_VERSION,
309
+ allowedMethods: [...ROUTE_HANDLER_EFFECT_ALLOWED_METHODS],
310
+ groupShapes: JSON.parse(JSON.stringify(ROUTE_HANDLER_EFFECT_GROUP_SHAPES)),
311
+ resolvedFetchResponseSurface: [...ROUTE_HANDLER_CONTEXT_SURFACE.resolvedFetchResponse],
312
+ reservedResolvedFetchResponseSurface: [...ROUTE_HANDLER_CONTEXT_SURFACE.reservedResolvedFetchResponse],
313
+ lifecycle: JSON.parse(JSON.stringify(ROUTE_HANDLER_EFFECT_LIFECYCLE)),
314
+ providerProof: {
315
+ owner: '@pulse-compute/provider-node',
316
+ mode: 'direct-provider-smoke-connected-to-route-handler-effect-plan',
317
+ executesBackendFetchEffects: true,
318
+ suppliesResolvedResponseHandles: true,
319
+ reentersContinuationInCompiledWasm: false,
320
+ continuationContextCanCallTopLevelHandlers: true
321
+ }
322
+ };
323
+ }
324
+
325
+
326
+ function defaultRouteHandlerNodeLiveOriginEffectProofPolicy() {
327
+ return {
328
+ ...ROUTE_HANDLER_NODE_LIVE_ORIGIN_EFFECT_PROOF_SCOPE,
329
+ contractId: ROUTE_HANDLER_EFFECT_CONTRACT_ID,
330
+ artifact: ROUTE_HANDLER_NODE_LIVE_ORIGIN_EFFECT_PROOF_ARTIFACT,
331
+ sourcePlanArtifact: ROUTE_HANDLER_EFFECT_PLAN_ARTIFACT,
332
+ runtimeVersion: ROUTE_HANDLER_NODE_LIVE_ORIGIN_EFFECT_RUNTIME_VERSION,
333
+ allowedMethods: [...ROUTE_HANDLER_EFFECT_ALLOWED_METHODS],
334
+ groupShapes: JSON.parse(JSON.stringify(ROUTE_HANDLER_EFFECT_GROUP_SHAPES)),
335
+ resolvedFetchResponseSurface: [...ROUTE_HANDLER_CONTEXT_SURFACE.resolvedFetchResponse],
336
+ reservedResolvedFetchResponseSurface: [...ROUTE_HANDLER_CONTEXT_SURFACE.reservedResolvedFetchResponse],
337
+ lifecycle: JSON.parse(JSON.stringify(ROUTE_HANDLER_EFFECT_LIFECYCLE)),
338
+ providerProof: {
339
+ owner: '@pulse-compute/provider-node',
340
+ mode: 'direct-provider-smoke-with-live-local-origin',
341
+ executesBackendFetchEffects: true,
342
+ suppliesResolvedResponseHandles: true,
343
+ reentersContinuationInCompiledWasm: false,
344
+ continuationContextCanCallTopLevelHandlers: true,
345
+ actualNetworkFetch: true,
346
+ localFixtureFetch: false,
347
+ userAuthoredAsync: false
348
+ }
349
+ };
350
+ }
351
+
352
+ function defaultRouteHandlerNodeCompiledEffectBridgePolicy() {
353
+ return {
354
+ ...ROUTE_HANDLER_NODE_COMPILED_EFFECT_BRIDGE_SCOPE,
355
+ contractId: ROUTE_HANDLER_EFFECT_CONTRACT_ID,
356
+ artifact: ROUTE_HANDLER_NODE_COMPILED_EFFECT_BRIDGE_ARTIFACT,
357
+ sourcePlanArtifact: ROUTE_HANDLER_EFFECT_PLAN_ARTIFACT,
358
+ runtimeVersion: ROUTE_HANDLER_NODE_COMPILED_EFFECT_BRIDGE_RUNTIME_VERSION,
359
+ allowedMethods: [...ROUTE_HANDLER_EFFECT_ALLOWED_METHODS],
360
+ groupShapes: JSON.parse(JSON.stringify(ROUTE_HANDLER_EFFECT_GROUP_SHAPES)),
361
+ resolvedFetchResponseSurface: [...ROUTE_HANDLER_CONTEXT_SURFACE.resolvedFetchResponse],
362
+ reservedResolvedFetchResponseSurface: [...ROUTE_HANDLER_CONTEXT_SURFACE.reservedResolvedFetchResponse],
363
+ lifecycle: JSON.parse(JSON.stringify(ROUTE_HANDLER_EFFECT_LIFECYCLE)),
364
+ providerProof: {
365
+ owner: '@pulse-compute/provider-node',
366
+ mode: 'compiled-wasm-resolve-resume-bridge-with-live-local-origin',
367
+ executesBackendFetchEffects: true,
368
+ suppliesResolvedResponseHandles: true,
369
+ reentersContinuationInCompiledWasm: true,
370
+ actualNetworkFetch: true,
371
+ localFixtureFetch: false,
372
+ userAuthoredAsync: false,
373
+ promises: false,
374
+ asyncAwait: false,
375
+ asyncify: false
376
+ }
377
+ };
378
+ }
379
+
380
+ function defaultRouteHandlerFastlyEffectProofPolicy() {
381
+ return {
382
+ ...ROUTE_HANDLER_FASTLY_EFFECT_PROOF_SCOPE,
383
+ contractId: ROUTE_HANDLER_EFFECT_CONTRACT_ID,
384
+ artifact: ROUTE_HANDLER_FASTLY_EFFECT_PROOF_ARTIFACT,
385
+ sourcePlanArtifact: ROUTE_HANDLER_EFFECT_PLAN_ARTIFACT,
386
+ runtimeVersion: ROUTE_HANDLER_FASTLY_EFFECT_RUNTIME_VERSION,
387
+ providerConfigVersion: ROUTE_HANDLER_FASTLY_EFFECT_PROVIDER_CONFIG_VERSION,
388
+ allowedMethods: [...ROUTE_HANDLER_EFFECT_ALLOWED_METHODS],
389
+ groupShapes: JSON.parse(JSON.stringify(ROUTE_HANDLER_EFFECT_GROUP_SHAPES)),
390
+ resolvedFetchResponseSurface: [...ROUTE_HANDLER_CONTEXT_SURFACE.resolvedFetchResponse],
391
+ reservedResolvedFetchResponseSurface: [...ROUTE_HANDLER_CONTEXT_SURFACE.reservedResolvedFetchResponse],
392
+ lifecycle: JSON.parse(JSON.stringify(ROUTE_HANDLER_EFFECT_LIFECYCLE)),
393
+ providerProof: {
394
+ owner: '@pulse-compute/provider-fastly',
395
+ mode: 'direct-provider-smoke-connected-to-route-handler-effect-plan',
396
+ executesBackendFetchEffects: true,
397
+ suppliesResolvedResponseHandles: true,
398
+ reentersContinuationInCompiledWasm: false,
399
+ continuationContextCanCallTopLevelHandlers: true,
400
+ providerConfigMapping: 'symbolic-backend-fetch-bindings',
401
+ symbolicBackendRefs: true,
402
+ symbolicConfigSecretRefs: true,
403
+ actualNetworkFetch: false
404
+ }
405
+ };
406
+ }
407
+
408
+ module.exports = {
409
+ ROUTE_HANDLER_EFFECT_PLAN_VERSION,
410
+ ROUTE_HANDLER_EFFECT_PLAN_PHASE,
411
+ ROUTE_HANDLER_EFFECT_PLAN_ARTIFACT,
412
+ ROUTE_HANDLER_NODE_EFFECT_PROOF_VERSION,
413
+ ROUTE_HANDLER_NODE_EFFECT_PROOF_PHASE,
414
+ ROUTE_HANDLER_NODE_EFFECT_PROOF_ARTIFACT,
415
+ ROUTE_HANDLER_NODE_EFFECT_RUNTIME_VERSION,
416
+ ROUTE_HANDLER_NODE_LIVE_ORIGIN_EFFECT_PROOF_VERSION,
417
+ ROUTE_HANDLER_NODE_COMPILED_EFFECT_BRIDGE_VERSION,
418
+ ROUTE_HANDLER_NODE_LIVE_ORIGIN_EFFECT_PROOF_PHASE,
419
+ ROUTE_HANDLER_NODE_COMPILED_EFFECT_BRIDGE_PHASE,
420
+ ROUTE_HANDLER_NODE_LIVE_ORIGIN_EFFECT_PROOF_ARTIFACT,
421
+ ROUTE_HANDLER_NODE_COMPILED_EFFECT_BRIDGE_ARTIFACT,
422
+ ROUTE_HANDLER_NODE_LIVE_ORIGIN_EFFECT_RUNTIME_VERSION,
423
+ ROUTE_HANDLER_NODE_COMPILED_EFFECT_BRIDGE_RUNTIME_VERSION,
424
+ ROUTE_HANDLER_FASTLY_EFFECT_PROOF_VERSION,
425
+ ROUTE_HANDLER_FASTLY_EFFECT_PROOF_PHASE,
426
+ ROUTE_HANDLER_FASTLY_EFFECT_PROOF_ARTIFACT,
427
+ ROUTE_HANDLER_FASTLY_EFFECT_RUNTIME_VERSION,
428
+ ROUTE_HANDLER_FASTLY_EFFECT_PROVIDER_CONFIG_VERSION,
429
+ ROUTE_HANDLER_EFFECT_CONTRACT_ID,
430
+ ROUTE_HANDLER_EFFECT_PLAN_SCOPE,
431
+ ROUTE_HANDLER_NODE_EFFECT_PROOF_SCOPE,
432
+ ROUTE_HANDLER_NODE_LIVE_ORIGIN_EFFECT_PROOF_SCOPE,
433
+ ROUTE_HANDLER_NODE_COMPILED_EFFECT_BRIDGE_SCOPE,
434
+ ROUTE_HANDLER_FASTLY_EFFECT_PROOF_SCOPE,
435
+ ROUTE_HANDLER_EFFECT_GROUP_SHAPES,
436
+ ROUTE_HANDLER_EFFECT_ALLOWED_METHODS,
437
+ ROUTE_HANDLER_EFFECT_KIND_REGISTRY,
438
+ ROUTE_HANDLER_CONTEXT_SURFACE,
439
+ ROUTE_HANDLER_EFFECT_DIAGNOSTICS,
440
+ ROUTE_HANDLER_EFFECT_LIFECYCLE,
441
+ defaultRouteHandlerEffectPolicy,
442
+ defaultRouteHandlerNodeEffectProofPolicy,
443
+ defaultRouteHandlerNodeLiveOriginEffectProofPolicy,
444
+ defaultRouteHandlerNodeCompiledEffectBridgePolicy,
445
+ defaultRouteHandlerFastlyEffectProofPolicy
446
+ };
@@ -0,0 +1,134 @@
1
+ 'use strict';
2
+
3
+ const HANDLER_IO_LIFECYCLE_PLAN_VERSION = 'pulsewasm.handler-io-lifecycle-plan.v1';
4
+ const HANDLER_IO_LIFECYCLE_PLAN_PHASE = '36';
5
+ const HANDLER_IO_LIFECYCLE_PLAN_ARTIFACT = 'handler-io-lifecycle-plan.json';
6
+ const HANDLER_IO_LIFECYCLE_CONTRACT_ID = 'pulse.handler-io-lifecycle';
7
+
8
+ const HANDLER_IO_LIFECYCLE_SCOPE = Object.freeze({
9
+ planOnly: true,
10
+ unifiesRouteContextPlan: true,
11
+ unifiesRouteEffectPlan: true,
12
+ referencesSchemaJson: true,
13
+ providerBehaviorImplemented: false,
14
+ runtimeBehaviorChanged: false,
15
+ compiledWasmEffectExecutionImplemented: false,
16
+ requestBodyRuntimeImplemented: false,
17
+ backendJsonRequestBodyImplemented: true,
18
+ binaryRequestBodyParsing: false,
19
+ streamRequestBodyParsing: false,
20
+ asyncAwait: false,
21
+ promises: false,
22
+ asyncify: false
23
+ });
24
+
25
+ const HANDLER_IO_LIFECYCLE_STAGES = Object.freeze([
26
+ 'route-match',
27
+ 'sync-context-read',
28
+ 'lazy-request-body-decode',
29
+ 'backend-origin-effect',
30
+ 'continuation-reentry',
31
+ 'origin-response-decode',
32
+ 'final-response-encode'
33
+ ]);
34
+
35
+ const HANDLER_IO_REQUEST_BODY_MODES = Object.freeze({
36
+ none: { status: 'implemented-now', description: 'route does not read a request body' },
37
+ schemaJson: { status: 'planned-only', surface: 'ctx.req.json("Schema") / ctx.req.parse("Schema")' },
38
+ genericJson: { status: 'planned-only', surface: 'ctx.req.json() with explicit as-json fallback' },
39
+ text: { status: 'reserved-with-diagnostic', surface: 'ctx.req.text() / ctx.request.bodyText()' },
40
+ binary: { status: 'reserved-with-diagnostic', surface: 'binary request body parsing' },
41
+ stream: { status: 'reserved-with-diagnostic', surface: 'stream request body parsing' }
42
+ });
43
+
44
+ const HANDLER_IO_BACKEND_REQUEST_BODY_MODES = Object.freeze({
45
+ none: { status: 'implemented-now', methods: ['GET', 'HEAD', 'POST'] },
46
+ json: { status: 'implemented-node-provider-proof', surface: 'ctx.fetch(..., { json: ctx.schema.encode("Schema", ref) })' },
47
+ text: { status: 'reserved-with-diagnostic', surface: 'ctx.fetch(..., { body/text })' },
48
+ binary: { status: 'reserved-with-diagnostic' },
49
+ stream: { status: 'reserved-with-diagnostic' }
50
+ });
51
+
52
+ const HANDLER_IO_ORIGIN_RESPONSE_BODY_MODES = Object.freeze({
53
+ text: { status: 'implemented-provider-proof', surface: 'ctx.resolved().text()' },
54
+ jsonText: { status: 'implemented-provider-proof', surface: 'ctx.resolved().jsonText()' },
55
+ status: { status: 'implemented-provider-proof', surface: 'ctx.resolved().status() / ok()' },
56
+ header: { status: 'implemented-provider-proof', surface: 'ctx.resolved().header(name)' },
57
+ json: { status: 'implemented-provider-proof', surface: 'ctx.resolved().json("Schema")' },
58
+ binary: { status: 'reserved-with-diagnostic', surface: 'ctx.resolved().bytes()' },
59
+ stream: { status: 'reserved-with-diagnostic', surface: 'ctx.resolved().stream()' }
60
+ });
61
+
62
+ const HANDLER_IO_FINAL_RESPONSE_MODES = Object.freeze({
63
+ text: { status: 'implemented-now', surface: 'ctx.result.text(status, body, opts)' },
64
+ jsonText: { status: 'implemented-now', surface: 'ctx.result.jsonText(status, jsonText, opts)' },
65
+ empty: { status: 'implemented-now', surface: 'ctx.result.empty(status, opts)' },
66
+ schemaJson: { status: 'implemented-compiled-runtime', surface: 'ctx.result.json("Schema", ref, opts)' },
67
+ passthrough: { status: 'reserved-with-diagnostic', surface: 'ctx.result.from(origin, policy)' },
68
+ binary: { status: 'reserved-with-diagnostic' },
69
+ stream: { status: 'reserved-with-diagnostic' }
70
+ });
71
+
72
+ const HANDLER_IO_SCHEMA_SURFACE = Object.freeze({
73
+ requestDecode: ['ctx.req.json("Schema")', 'ctx.req.parse("Schema")'],
74
+ genericRequestDecode: ['ctx.req.json()'],
75
+ originDecode: ['ctx.resolved("name").json("Schema")'],
76
+ encode: ['ctx.schema.encode("Schema", ref)', 'ctx.result.json("Schema", ref, opts)'],
77
+ currentStatus: 'implemented-for-result-origin-decode-and-backend-json-request-bodies',
78
+ automaticSchemaGeneration: false,
79
+ arbitraryJsObjectInference: false
80
+ });
81
+
82
+ const HANDLER_IO_LAZY_EVALUATION_POLICY = Object.freeze({
83
+ requestBodyRead: 'route-demand-only',
84
+ requestBodyParse: 'on-demand-helper-only',
85
+ requestBodyCache: 'per-request body/decode refs',
86
+ backendEffects: 'explicit ctx.resolve boundary only',
87
+ finalResponseEncode: 'only when selected result is returned',
88
+ eagerBodyParsing: false,
89
+ implicitGenericParserBundle: false
90
+ });
91
+
92
+ const HANDLER_IO_LIFECYCLE_DIAGNOSTICS = Object.freeze({
93
+ contextPlanMissing: 'PULSEWASM_HANDLER_IO_CONTEXT_PLAN_MISSING',
94
+ effectPlanMissing: 'PULSEWASM_HANDLER_IO_EFFECT_PLAN_MISSING',
95
+ routePlanMissing: 'PULSEWASM_HANDLER_IO_ROUTE_PLAN_MISSING',
96
+ schemaParserUnavailable: 'PULSEWASM_HANDLER_IO_SCHEMA_PARSER_UNAVAILABLE',
97
+ requestBodyReserved: 'PULSEWASM_HANDLER_IO_REQUEST_BODY_RESERVED',
98
+ backendRequestBodyReserved: 'PULSEWASM_HANDLER_IO_BACKEND_REQUEST_BODY_RESERVED',
99
+ responseBodyReserved: 'PULSEWASM_HANDLER_IO_RESPONSE_BODY_RESERVED',
100
+ unsupportedSchemaSurface: 'PULSEWASM_HANDLER_IO_SCHEMA_SURFACE_UNSUPPORTED'
101
+ });
102
+
103
+ function defaultHandlerIoLifecyclePolicy() {
104
+ return {
105
+ ...HANDLER_IO_LIFECYCLE_SCOPE,
106
+ contractId: HANDLER_IO_LIFECYCLE_CONTRACT_ID,
107
+ artifact: HANDLER_IO_LIFECYCLE_PLAN_ARTIFACT,
108
+ stages: [...HANDLER_IO_LIFECYCLE_STAGES],
109
+ requestBodyModes: JSON.parse(JSON.stringify(HANDLER_IO_REQUEST_BODY_MODES)),
110
+ backendRequestBodyModes: JSON.parse(JSON.stringify(HANDLER_IO_BACKEND_REQUEST_BODY_MODES)),
111
+ originResponseBodyModes: JSON.parse(JSON.stringify(HANDLER_IO_ORIGIN_RESPONSE_BODY_MODES)),
112
+ finalResponseModes: JSON.parse(JSON.stringify(HANDLER_IO_FINAL_RESPONSE_MODES)),
113
+ schemaSurface: JSON.parse(JSON.stringify(HANDLER_IO_SCHEMA_SURFACE)),
114
+ lazyEvaluation: JSON.parse(JSON.stringify(HANDLER_IO_LAZY_EVALUATION_POLICY)),
115
+ diagnostics: { ...HANDLER_IO_LIFECYCLE_DIAGNOSTICS }
116
+ };
117
+ }
118
+
119
+ module.exports = {
120
+ HANDLER_IO_LIFECYCLE_PLAN_VERSION,
121
+ HANDLER_IO_LIFECYCLE_PLAN_PHASE,
122
+ HANDLER_IO_LIFECYCLE_PLAN_ARTIFACT,
123
+ HANDLER_IO_LIFECYCLE_CONTRACT_ID,
124
+ HANDLER_IO_LIFECYCLE_SCOPE,
125
+ HANDLER_IO_LIFECYCLE_STAGES,
126
+ HANDLER_IO_REQUEST_BODY_MODES,
127
+ HANDLER_IO_BACKEND_REQUEST_BODY_MODES,
128
+ HANDLER_IO_ORIGIN_RESPONSE_BODY_MODES,
129
+ HANDLER_IO_FINAL_RESPONSE_MODES,
130
+ HANDLER_IO_SCHEMA_SURFACE,
131
+ HANDLER_IO_LAZY_EVALUATION_POLICY,
132
+ HANDLER_IO_LIFECYCLE_DIAGNOSTICS,
133
+ defaultHandlerIoLifecyclePolicy
134
+ };