@pulse-compute/wasm-contracts 0.0.0 → 1.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -2
- package/package.json +124 -6
- package/src/assets/contracts.js +296 -0
- package/src/config/provider-resolution.js +54 -0
- package/src/config/runtime-provider-kv.js +73 -0
- package/src/config/symbolic-refs.js +192 -0
- package/src/crypto/contracts.js +647 -0
- package/src/definitions/config-schema.js +30 -0
- package/src/definitions/handler-roles.js +66 -0
- package/src/definitions/path-grammar.js +11 -0
- package/src/definitions/router-api.js +149 -0
- package/src/diagnostics/codes.js +42 -0
- package/src/diagnostics/reporter.js +20 -0
- package/src/diagnostics.js +139 -0
- package/src/dispatch-table.js +23 -0
- package/src/entities/catalog.d.ts +7 -0
- package/src/entities/catalog.js +87 -0
- package/src/entities/contracts.d.ts +95 -0
- package/src/entities/contracts.js +122 -0
- package/src/entities/json-rpc.d.ts +27 -0
- package/src/entities/json-rpc.js +69 -0
- package/src/entities/runtime.d.ts +67 -0
- package/src/entities/runtime.js +288 -0
- package/src/events/contracts.js +456 -0
- package/src/execution-plan.js +42 -0
- package/src/grip/contracts.js +106 -0
- package/src/handler/backend-json-request-body.js +58 -0
- package/src/handler/beta-lifecycle-golden.js +97 -0
- package/src/handler/canonical-native-plan.js +143 -0
- package/src/handler/canonical-native-runtime.js +168 -0
- package/src/handler/canonical-runtime.js +13 -0
- package/src/handler/context.js +131 -0
- package/src/handler/ctx-contract.js +71 -0
- package/src/handler/doctor-readiness-aggregator.js +67 -0
- package/src/handler/effects.js +446 -0
- package/src/handler/io-lifecycle.js +134 -0
- package/src/handler/lifecycle-authoring-alignment.js +56 -0
- package/src/handler/lifecycle-readiness-aggregate.js +93 -0
- package/src/handler/reference-node-lifecycle-golden.js +73 -0
- package/src/handler/request-json-body.js +147 -0
- package/src/handler/runtime-api.js +471 -0
- package/src/handler/schema-decode-result.js +135 -0
- package/src/handler/schema-response-codec.js +141 -0
- package/src/handler/surface-contract.js +601 -0
- package/src/handler/types-contract.js +51 -0
- package/src/handler-table.js +28 -0
- package/src/host/backend-capabilities.js +24 -0
- package/src/host/capabilities.js +273 -0
- package/src/host/channel-broadcaster.js +60 -0
- package/src/host/json-body.js +80 -0
- package/src/host/request-result-headers.js +38 -0
- package/src/host/streaming-passthrough.js +90 -0
- package/src/host/wasm-host-abi.js +154 -0
- package/src/index.js +75 -0
- package/src/jwt/contracts.js +427 -0
- package/src/library/api-surface.js +99 -0
- package/src/library/contracts.js +273 -0
- package/src/library/manifest.js +317 -0
- package/src/library/second-package-owned-lowering.js +39 -0
- package/src/library/sidecars.js +147 -0
- package/src/logging.js +89 -0
- package/src/package/package-contract.js +975 -0
- package/src/package/package-contract.schema.json +303 -0
- package/src/package/runtime-pulse-live.js +100 -0
- package/src/path-table.js +12 -0
- package/src/path.js +275 -0
- package/src/project/config-factory.js +48 -0
- package/src/project/config-plan.js +409 -0
- package/src/project/config-runtime.js +46 -0
- package/src/project/javascript-application.js +212 -0
- package/src/project/javascript-core-capabilities.js +44 -0
- package/src/project/native-optimization.js +9 -0
- package/src/project/package-ownership.js +242 -0
- package/src/project/package-product-projection.js +171 -0
- package/src/project/reachable-graph-identity.js +219 -0
- package/src/project/reachable-graph-projections.js +279 -0
- package/src/project/reachable-graph-resolver.js +303 -0
- package/src/project/reachable-graph-v2.js +430 -0
- package/src/project/reachable-graph-v2.schema.json +285 -0
- package/src/project/reachable-graph.js +199 -0
- package/src/project/reachable-graph.schema.json +222 -0
- package/src/project/target-support-evidence.js +559 -0
- package/src/provider/canonical-provider.js +239 -0
- package/src/provider/final-wasm-policy.js +87 -0
- package/src/provider/toolchain.js +771 -0
- package/src/route-plan.js +43 -0
- package/src/s3/contracts.js +12 -0
- package/src/schema-json/compile.js +63 -0
- package/src/schema-json/contracts.js +10 -0
- package/src/schema-json/generic-parser.js +62 -0
- package/src/schema-json/registry.js +359 -0
- package/src/schema-json/semantic-trace.js +241 -0
- package/src/schema-json/v1.js +65 -0
- package/src/schema-json/v2.js +110 -0
- package/src/sha256.js +104 -0
- package/src/spine.js +381 -0
- 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
|
+
};
|