space-data-module-sdk 0.8.3 → 0.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +117 -20
- package/bin/space-data-module.js +263 -0
- package/docs/.nojekyll +1 -0
- package/docs/AGENTS.md +34 -0
- package/docs/architecture.svg +141 -0
- package/docs/browser-wasmedge-isomorphic.md +179 -0
- package/docs/flatsql-streaming-standard.md +341 -0
- package/docs/gpu-module-abi.md +193 -0
- package/docs/index.html +125 -0
- package/docs/isomorphic-pthreads.md +188 -0
- package/docs/isomorphic-sdn-runtime-plan.md +167 -0
- package/docs/language-runtime-matrix.md +82 -0
- package/docs/manifest-structure.svg +114 -0
- package/docs/module-bundle-runtime-plan.md +19 -0
- package/docs/module-lifecycle.svg +70 -0
- package/docs/module-publication-standard.md +540 -0
- package/docs/node-red-default-node-parity.md +88 -0
- package/docs/protocol-installation.md +196 -0
- package/docs/secrets-capability.md +152 -0
- package/docs/styles.css +288 -0
- package/docs/testing-harness.md +408 -0
- package/docs/tri-runtime-parity.md +132 -0
- package/docs/wallet-callback.html +2 -0
- package/package.json +26 -6
- package/schemas/HttpRequestAbi.fbs +41 -0
- package/schemas/HttpResponseAbi.fbs +36 -0
- package/schemas/PluginManifest.fbs +2 -1
- package/src/AGENTS.md +1 -1
- package/src/app/codec.js +548 -0
- package/src/app/index.js +6 -0
- package/src/browser.js +5 -0
- package/src/bundle/constants.js +1 -0
- package/src/bundle/index.js +15 -0
- package/src/bundle/sigdomain.js +179 -0
- package/src/bundle/signing.js +767 -0
- package/src/bundle/wasm.js +3 -2
- package/src/capabilities.js +3 -0
- package/src/compat/index.js +7 -0
- package/src/compat/sdnLegacy.js +449 -0
- package/src/compiler/compileModule.js +556 -55
- package/src/compiler/flatcSupport.js +41 -27
- package/src/compiler/index.d.ts +2 -0
- package/src/compiler/index.js +18 -0
- package/src/compiler/invokeGlue.js +1212 -183
- package/src/compiler/pthreadArtifactGuard.js +910 -0
- package/src/compiler/sdnShimGenerator.js +323 -0
- package/src/compiler/wasiThreadsToolchain.js +150 -0
- package/src/compliance/index.js +11 -1
- package/src/compliance/legacyWildcardPorts.js +228 -0
- package/src/compliance/pluginCompliance.js +1000 -96
- package/src/field-stream/index.d.ts +31 -0
- package/src/field-stream/index.js +119 -0
- package/src/flow/dependencyStreamBridge.js +234 -0
- package/src/flow/flatsqlLinkShim.js +304 -0
- package/src/flow/flowCodec.js +107 -0
- package/src/flow/flowCompiler.js +2900 -0
- package/src/flow/flowRuntimeHost.js +877 -0
- package/src/flow/index.d.ts +117 -0
- package/src/flow/index.js +31 -0
- package/src/flow/isomorphicFlowHost.js +384 -0
- package/src/flow/jsFlowRuntime.js +275 -0
- package/src/flow/normalize.js +294 -0
- package/src/flow/runtime-src/flow_runtime.cpp +1699 -0
- package/src/flow/vendor/sdn-flow/MethodRegistry.js +400 -0
- package/src/flow/vendor/sdn-flow/constants.js +39 -0
- package/src/flow/vendor/sdn-flow/index.js +29 -0
- package/src/flow/vendor/sdn-flow/normalize.js +506 -0
- package/src/flow/vendor/sdn-flow/wasmCompatibility.js +189 -0
- package/src/generated/http/cpp/HttpRequestAbi_generated.h +285 -0
- package/src/generated/http/cpp/HttpResponseAbi_generated.h +192 -0
- package/src/generated/http/sdn/http/http-header.js +53 -0
- package/src/generated/http/sdn/http/http-header.ts +67 -0
- package/src/generated/http/sdn/http/http-request.js +132 -0
- package/src/generated/http/sdn/http/http-request.ts +179 -0
- package/src/generated/http/sdn/http/http-response.js +144 -0
- package/src/generated/http/sdn/http/http-response.ts +168 -0
- package/src/generated/http/sdn/http.js +11 -0
- package/src/generated/http/sdn/http.ts +4 -0
- package/src/generated/orbpro/flow/backpressure-policy.d.ts +12 -0
- package/src/generated/orbpro/flow/backpressure-policy.d.ts.map +1 -0
- package/src/generated/orbpro/flow/backpressure-policy.js +17 -0
- package/src/generated/orbpro/flow/backpressure-policy.js.map +1 -0
- package/src/generated/orbpro/flow/backpressure-policy.ts +15 -0
- package/src/generated/orbpro/flow/flow-bundle-manifest.d.ts +142 -0
- package/src/generated/orbpro/flow/flow-bundle-manifest.d.ts.map +1 -0
- package/src/generated/orbpro/flow/flow-bundle-manifest.js +304 -0
- package/src/generated/orbpro/flow/flow-bundle-manifest.js.map +1 -0
- package/src/generated/orbpro/flow/flow-bundle-manifest.ts +399 -0
- package/src/generated/orbpro/flow/flow-edge.d.ts +113 -0
- package/src/generated/orbpro/flow/flow-edge.d.ts.map +1 -0
- package/src/generated/orbpro/flow/flow-edge.js +221 -0
- package/src/generated/orbpro/flow/flow-edge.js.map +1 -0
- package/src/generated/orbpro/flow/flow-edge.ts +292 -0
- package/src/generated/orbpro/flow/flow-node.d.ts +80 -0
- package/src/generated/orbpro/flow/flow-node.d.ts.map +1 -0
- package/src/generated/orbpro/flow/flow-node.js +158 -0
- package/src/generated/orbpro/flow/flow-node.js.map +1 -0
- package/src/generated/orbpro/flow/flow-node.ts +202 -0
- package/src/generated/orbpro/flow/flow-program.d.ts +164 -0
- package/src/generated/orbpro/flow/flow-program.d.ts.map +1 -0
- package/src/generated/orbpro/flow/flow-program.js +350 -0
- package/src/generated/orbpro/flow/flow-program.js.map +1 -0
- package/src/generated/orbpro/flow/flow-program.ts +477 -0
- package/src/generated/orbpro/flow/flow-trigger.d.ts +108 -0
- package/src/generated/orbpro/flow/flow-trigger.d.ts.map +1 -0
- package/src/generated/orbpro/flow/flow-trigger.js +207 -0
- package/src/generated/orbpro/flow/flow-trigger.js.map +1 -0
- package/src/generated/orbpro/flow/flow-trigger.ts +276 -0
- package/src/generated/orbpro/flow/node-kind.d.ts +13 -0
- package/src/generated/orbpro/flow/node-kind.d.ts.map +1 -0
- package/src/generated/orbpro/flow/node-kind.js +16 -0
- package/src/generated/orbpro/flow/node-kind.js.map +1 -0
- package/src/generated/orbpro/{invoke.ts → flow/node-kind.ts} +12 -2
- package/src/generated/orbpro/flow/plugin-version-binding.d.ts +52 -0
- package/src/generated/orbpro/flow/plugin-version-binding.d.ts.map +1 -0
- package/src/generated/orbpro/flow/plugin-version-binding.js +85 -0
- package/src/generated/orbpro/flow/plugin-version-binding.js.map +1 -0
- package/src/generated/orbpro/flow/plugin-version-binding.ts +121 -0
- package/src/generated/orbpro/flow/schema-hash-binding.d.ts +70 -0
- package/src/generated/orbpro/flow/schema-hash-binding.d.ts.map +1 -0
- package/src/generated/orbpro/flow/schema-hash-binding.js +143 -0
- package/src/generated/orbpro/flow/schema-hash-binding.js.map +1 -0
- package/src/generated/orbpro/flow/schema-hash-binding.ts +189 -0
- package/src/generated/orbpro/flow/trigger-binding.d.ts +71 -0
- package/src/generated/orbpro/flow/trigger-binding.d.ts.map +1 -0
- package/src/generated/orbpro/flow/trigger-binding.js +142 -0
- package/src/generated/orbpro/flow/trigger-binding.js.map +1 -0
- package/src/generated/orbpro/flow/trigger-binding.ts +181 -0
- package/src/generated/orbpro/flow/trigger-kind.d.ts +14 -0
- package/src/generated/orbpro/flow/trigger-kind.d.ts.map +1 -0
- package/src/generated/orbpro/flow/trigger-kind.js +17 -0
- package/src/generated/orbpro/flow/trigger-kind.js.map +1 -0
- package/src/generated/orbpro/flow/trigger-kind.ts +17 -0
- package/src/generated/orbpro/flow.d.ts +21 -0
- package/src/generated/orbpro/flow.d.ts.map +1 -0
- package/src/generated/orbpro/flow.js +23 -0
- package/src/generated/orbpro/flow.js.map +1 -0
- package/src/generated/orbpro/flow.ts +24 -0
- package/src/generated/orbpro/manifest/capability-kind.d.ts +2 -1
- package/src/generated/orbpro/manifest/capability-kind.js +1 -0
- package/src/generated/orbpro/manifest/capability-kind.ts +1 -0
- package/src/generated/orbpro/plugin/stream-invoke-request.d.ts +93 -0
- package/src/generated/orbpro/plugin/stream-invoke-request.js +160 -0
- package/src/generated/orbpro/plugin/stream-invoke-request.ts +211 -0
- package/src/generated/orbpro/plugin/stream-invoke-response.d.ts +99 -0
- package/src/generated/orbpro/plugin/stream-invoke-response.js +175 -0
- package/src/generated/orbpro/plugin/stream-invoke-response.ts +226 -0
- package/src/generated/orbpro/plugin.js +8 -0
- package/src/generated/orbpro/stream.d.ts +12 -0
- package/src/generated/orbpro/stream.js +14 -0
- package/src/generated/orbpro/stream.ts +15 -0
- package/src/generated/spacedatastandards/plg/EntryFunction.d.ts +52 -0
- package/src/generated/spacedatastandards/plg/EntryFunction.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/EntryFunction.js +106 -0
- package/src/generated/spacedatastandards/plg/EntryFunction.ts +162 -0
- package/src/generated/spacedatastandards/plg/FlatBufferTypeRef.d.ts +90 -0
- package/src/generated/spacedatastandards/plg/FlatBufferTypeRef.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/FlatBufferTypeRef.js +189 -0
- package/src/generated/spacedatastandards/plg/FlatBufferTypeRef.ts +270 -0
- package/src/generated/spacedatastandards/plg/PLG.d.ts +492 -0
- package/src/generated/spacedatastandards/plg/PLG.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLG.js +1139 -0
- package/src/generated/spacedatastandards/plg/PLG.ts +1600 -0
- package/src/generated/spacedatastandards/plg/PLGAcceptedTypeSet.d.ts +63 -0
- package/src/generated/spacedatastandards/plg/PLGAcceptedTypeSet.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGAcceptedTypeSet.js +138 -0
- package/src/generated/spacedatastandards/plg/PLGAcceptedTypeSet.ts +189 -0
- package/src/generated/spacedatastandards/plg/PLGBuildArtifact.d.ts +41 -0
- package/src/generated/spacedatastandards/plg/PLGBuildArtifact.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGBuildArtifact.js +104 -0
- package/src/generated/spacedatastandards/plg/PLGBuildArtifact.ts +151 -0
- package/src/generated/spacedatastandards/plg/PLGFlowEdge.d.ts +68 -0
- package/src/generated/spacedatastandards/plg/PLGFlowEdge.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGFlowEdge.js +124 -0
- package/src/generated/spacedatastandards/plg/PLGFlowEdge.ts +184 -0
- package/src/generated/spacedatastandards/plg/PLGFlowEdgeContract.d.ts +58 -0
- package/src/generated/spacedatastandards/plg/PLGFlowEdgeContract.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGFlowEdgeContract.js +126 -0
- package/src/generated/spacedatastandards/plg/PLGFlowEdgeContract.ts +161 -0
- package/src/generated/spacedatastandards/plg/PLGFlowNode.d.ts +82 -0
- package/src/generated/spacedatastandards/plg/PLGFlowNode.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGFlowNode.js +164 -0
- package/src/generated/spacedatastandards/plg/PLGFlowNode.ts +244 -0
- package/src/generated/spacedatastandards/plg/PLGFlowTrigger.d.ts +55 -0
- package/src/generated/spacedatastandards/plg/PLGFlowTrigger.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGFlowTrigger.js +105 -0
- package/src/generated/spacedatastandards/plg/PLGFlowTrigger.ts +162 -0
- package/src/generated/spacedatastandards/plg/PLGFlowTriggerBinding.d.ts +42 -0
- package/src/generated/spacedatastandards/plg/PLGFlowTriggerBinding.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGFlowTriggerBinding.js +83 -0
- package/src/generated/spacedatastandards/plg/PLGFlowTriggerBinding.ts +127 -0
- package/src/generated/spacedatastandards/plg/PLGHostCapability.d.ts +36 -0
- package/src/generated/spacedatastandards/plg/PLGHostCapability.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGHostCapability.js +90 -0
- package/src/generated/spacedatastandards/plg/PLGHostCapability.ts +127 -0
- package/src/generated/spacedatastandards/plg/PLGMethodManifest.d.ts +53 -0
- package/src/generated/spacedatastandards/plg/PLGMethodManifest.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGMethodManifest.js +153 -0
- package/src/generated/spacedatastandards/plg/PLGMethodManifest.ts +210 -0
- package/src/generated/spacedatastandards/plg/PLGPortManifest.d.ts +70 -0
- package/src/generated/spacedatastandards/plg/PLGPortManifest.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGPortManifest.js +149 -0
- package/src/generated/spacedatastandards/plg/PLGPortManifest.ts +212 -0
- package/src/generated/spacedatastandards/plg/PLGProtocolSpec.d.ts +73 -0
- package/src/generated/spacedatastandards/plg/PLGProtocolSpec.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGProtocolSpec.js +199 -0
- package/src/generated/spacedatastandards/plg/PLGProtocolSpec.ts +292 -0
- package/src/generated/spacedatastandards/plg/PLGTimerSpec.d.ts +40 -0
- package/src/generated/spacedatastandards/plg/PLGTimerSpec.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PLGTimerSpec.js +103 -0
- package/src/generated/spacedatastandards/plg/PLGTimerSpec.ts +148 -0
- package/src/generated/spacedatastandards/plg/PluginCapability.d.ts +41 -0
- package/src/generated/spacedatastandards/plg/PluginCapability.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PluginCapability.js +82 -0
- package/src/generated/spacedatastandards/plg/{plugin-capability.ts → PluginCapability.ts} +55 -18
- package/src/generated/spacedatastandards/plg/PluginDependency.d.ts +42 -0
- package/src/generated/spacedatastandards/plg/PluginDependency.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/PluginDependency.js +80 -0
- package/src/generated/spacedatastandards/plg/PluginDependency.ts +124 -0
- package/src/generated/spacedatastandards/plg/TAB.d.ts +85 -0
- package/src/generated/spacedatastandards/plg/TAB.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/TAB.js +173 -0
- package/src/generated/spacedatastandards/plg/TAB.ts +228 -0
- package/src/generated/spacedatastandards/plg/bufferMutability.d.ts +18 -0
- package/src/generated/spacedatastandards/plg/bufferMutability.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/bufferMutability.js +20 -0
- package/src/generated/spacedatastandards/plg/bufferMutability.ts +23 -0
- package/src/generated/spacedatastandards/plg/bufferOwnership.d.ts +18 -0
- package/src/generated/spacedatastandards/plg/bufferOwnership.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/bufferOwnership.js +20 -0
- package/src/generated/spacedatastandards/plg/bufferOwnership.ts +23 -0
- package/src/generated/spacedatastandards/plg/drainBehavior.d.ts +20 -0
- package/src/generated/spacedatastandards/plg/drainBehavior.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/drainBehavior.js +22 -0
- package/src/generated/spacedatastandards/plg/drainBehavior.ts +25 -0
- package/src/generated/spacedatastandards/plg/flowEdgeRoutePolicy.d.ts +10 -0
- package/src/generated/spacedatastandards/plg/flowEdgeRoutePolicy.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/flowEdgeRoutePolicy.js +12 -0
- package/src/generated/spacedatastandards/plg/flowEdgeRoutePolicy.ts +13 -0
- package/src/generated/spacedatastandards/plg/hostCapabilityKind.d.ts +51 -0
- package/src/generated/spacedatastandards/plg/hostCapabilityKind.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/hostCapabilityKind.js +53 -0
- package/src/generated/spacedatastandards/plg/hostCapabilityKind.ts +55 -0
- package/src/generated/spacedatastandards/plg/invokeSurfaceKind.d.ts +15 -0
- package/src/generated/spacedatastandards/plg/invokeSurfaceKind.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/invokeSurfaceKind.js +17 -0
- package/src/generated/spacedatastandards/plg/invokeSurfaceKind.ts +19 -0
- package/src/generated/spacedatastandards/plg/main.d.ts +29 -0
- package/src/generated/spacedatastandards/plg/main.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/main.js +30 -0
- package/src/generated/spacedatastandards/plg/main.ts +32 -0
- package/src/generated/spacedatastandards/plg/payloadWireFormat.d.ts +17 -0
- package/src/generated/spacedatastandards/plg/payloadWireFormat.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/payloadWireFormat.js +19 -0
- package/src/generated/spacedatastandards/plg/payloadWireFormat.ts +21 -0
- package/src/generated/spacedatastandards/plg/pluginCategory.d.ts +82 -0
- package/src/generated/spacedatastandards/plg/pluginCategory.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/pluginCategory.js +84 -0
- package/src/generated/spacedatastandards/plg/pluginCategory.ts +103 -0
- package/src/generated/spacedatastandards/plg/publicationState.d.ts +18 -0
- package/src/generated/spacedatastandards/plg/publicationState.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/publicationState.js +20 -0
- package/src/generated/spacedatastandards/plg/purchaseTier.d.ts +18 -0
- package/src/generated/spacedatastandards/plg/purchaseTier.d.ts.map +1 -0
- package/src/generated/spacedatastandards/plg/purchaseTier.js +20 -0
- package/src/host/AGENTS.md +2 -2
- package/src/host/abi.js +53 -66
- package/src/host/browserHost.js +355 -8
- package/src/host/cpp/keyslotClient.hpp +231 -0
- package/src/host/cpp/secretsClient.hpp +583 -0
- package/src/host/hostcallWire.js +183 -0
- package/src/host/index.js +2 -0
- package/src/host/isomorphicLoader.js +44 -7
- package/src/host/nodeHost.js +227 -8
- package/src/host/sabHostcallChannel.js +206 -0
- package/src/host/timerDriver.js +203 -0
- package/src/host/wasiShim.js +41 -1
- package/src/host/wasiThreadBrowserWorker.mjs +48 -0
- package/src/host/wasiThreadHost.js +393 -0
- package/src/host/wasiThreadWorker.mjs +32 -0
- package/src/host/wasiThreadWorkerRuntime.js +93 -0
- package/src/http/index.js +339 -0
- package/src/index.d.ts +716 -10
- package/src/index.js +4 -0
- package/src/invoke/codec.js +1202 -128
- package/src/invoke/index.js +5 -1
- package/src/licensing/index.d.ts +2 -0
- package/src/licensing/index.js +2 -0
- package/src/licensing/records.js +287 -8
- package/src/manifest/codec.js +62 -14
- package/src/manifest/index.js +2 -0
- package/src/manifest/legacyToPlg.js +164 -25
- package/src/manifest/normalize.js +1 -0
- package/src/manifest/plgCodec.js +1303 -62
- package/src/manifest/typeRefs.js +162 -24
- package/src/runtime/compiledRuntimeAbi.js +47 -0
- package/src/runtime/compiledRuntimeAbi.json +33 -0
- package/src/runtime/index.d.ts +32 -0
- package/src/runtime/index.js +1 -0
- package/src/runtime-host/index.js +3 -0
- package/src/runtime-host/methodRegistry.js +55 -0
- package/src/standards/index.js +200 -56
- package/src/standards/sharedCatalog.js +16 -0
- package/src/testing/browserModuleHarness.js +604 -31
- package/src/testing/docker/wasmedge-parity.Dockerfile +39 -0
- package/src/testing/index.d.ts +151 -0
- package/src/testing/index.js +21 -0
- package/src/testing/native/wasmedge_emscripten_pthread_runner.c +25 -1
- package/src/testing/parityBrowserRunner.js +138 -0
- package/src/testing/parityHarness.js +616 -0
- package/src/testing/parityLanes.js +537 -0
- package/src/testing/processInvoke.js +29 -21
- package/src/testing/streamInvokeCodec.js +10 -175
- package/src/testing/wasmedgePin.json +6 -0
- package/src/testing/workerModuleHarness.js +242 -0
- package/src/testing/workerModuleHarnessWorker.js +176 -0
- package/src/transport/index.js +3 -0
- package/src/transport/pki.js +299 -11
- package/src/transport/records.js +16 -7
- package/src/utils/ecdsaDer.js +106 -0
- package/src/utils/wasmCrypto.js +0 -43
- package/templates/gpu-module/README.md +48 -0
- package/templates/gpu-module/include/space_data_gpu_abi.h +122 -0
- package/templates/gpu-module/manifest.json +84 -0
- package/schemas/PluginInvokeRequest.fbs +0 -18
- package/schemas/PluginInvokeResponse.fbs +0 -30
- package/schemas/spacedatastandards/PLG.fbs +0 -191
- package/src/generated/orbpro/invoke/plugin-invoke-request.d.ts +0 -51
- package/src/generated/orbpro/invoke/plugin-invoke-request.d.ts.map +0 -1
- package/src/generated/orbpro/invoke/plugin-invoke-request.js +0 -131
- package/src/generated/orbpro/invoke/plugin-invoke-request.js.map +0 -1
- package/src/generated/orbpro/invoke/plugin-invoke-request.ts +0 -173
- package/src/generated/orbpro/invoke/plugin-invoke-response.d.ts +0 -76
- package/src/generated/orbpro/invoke/plugin-invoke-response.d.ts.map +0 -1
- package/src/generated/orbpro/invoke/plugin-invoke-response.js +0 -184
- package/src/generated/orbpro/invoke/plugin-invoke-response.js.map +0 -1
- package/src/generated/orbpro/invoke/plugin-invoke-response.ts +0 -243
- package/src/generated/orbpro/invoke.d.ts +0 -3
- package/src/generated/orbpro/invoke.js +0 -5
- package/src/generated/spacedatastandards/plg/entry-function.js +0 -86
- package/src/generated/spacedatastandards/plg/entry-function.ts +0 -119
- package/src/generated/spacedatastandards/plg/index.js +0 -16
- package/src/generated/spacedatastandards/plg/index.ts +0 -11
- package/src/generated/spacedatastandards/plg/plg.js +0 -657
- package/src/generated/spacedatastandards/plg/plg.ts +0 -924
- package/src/generated/spacedatastandards/plg/plugin-capability.js +0 -66
- package/src/generated/spacedatastandards/plg/plugin-category.js +0 -15
- package/src/generated/spacedatastandards/plg/plugin-category.ts +0 -53
- package/src/generated/spacedatastandards/plg/plugin-dependency.js +0 -63
- package/src/generated/spacedatastandards/plg/plugin-dependency.ts +0 -86
- package/src/generated/spacedatastandards/plg/publication-state.js +0 -9
- package/src/generated/spacedatastandards/plg/purchase-tier.js +0 -9
- /package/src/generated/spacedatastandards/plg/{publication-state.ts → publicationState.ts} +0 -0
- /package/src/generated/spacedatastandards/plg/{purchase-tier.ts → purchaseTier.ts} +0 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export function encodeUnsignedFieldStreamPolicyForProviderSignature(
|
|
2
|
+
policy: unknown,
|
|
3
|
+
): Uint8Array;
|
|
4
|
+
|
|
5
|
+
export function verifyFieldStreamPolicyProviderSignature(
|
|
6
|
+
policy: unknown,
|
|
7
|
+
options: {
|
|
8
|
+
providerPublicKey: Uint8Array | ArrayBuffer | ArrayBufferView;
|
|
9
|
+
verify(
|
|
10
|
+
publicKey: Uint8Array,
|
|
11
|
+
payload: Uint8Array,
|
|
12
|
+
signature: Uint8Array,
|
|
13
|
+
): boolean | Promise<boolean>;
|
|
14
|
+
},
|
|
15
|
+
): Promise<unknown>;
|
|
16
|
+
|
|
17
|
+
export function encodeUnsignedFieldStreamMessageForProviderSignature(
|
|
18
|
+
message: unknown,
|
|
19
|
+
): Uint8Array;
|
|
20
|
+
|
|
21
|
+
export function verifyFieldStreamMessageProviderSignature(
|
|
22
|
+
message: unknown,
|
|
23
|
+
options: {
|
|
24
|
+
providerPublicKey: Uint8Array | ArrayBuffer | ArrayBufferView;
|
|
25
|
+
verify(
|
|
26
|
+
publicKey: Uint8Array,
|
|
27
|
+
payload: Uint8Array,
|
|
28
|
+
signature: Uint8Array,
|
|
29
|
+
): boolean | Promise<boolean>;
|
|
30
|
+
},
|
|
31
|
+
): Promise<unknown>;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import * as flatbuffers from "flatbuffers";
|
|
2
|
+
|
|
3
|
+
import { FSP } from "spacedatastandards.org/lib/js/FSP/main.js";
|
|
4
|
+
import { FSM } from "spacedatastandards.org/lib/js/FSM/main.js";
|
|
5
|
+
|
|
6
|
+
const PROVIDER_SIGNATURE_LENGTH = 64;
|
|
7
|
+
|
|
8
|
+
export function encodeUnsignedFieldStreamPolicyForProviderSignature(policy) {
|
|
9
|
+
const root = fieldStreamPolicyRoot(policy);
|
|
10
|
+
const unsignedPolicy = root.unpack();
|
|
11
|
+
unsignedPolicy.PROVIDER_SIGNATURE = [];
|
|
12
|
+
const builder = new flatbuffers.Builder(1024);
|
|
13
|
+
const offset = unsignedPolicy.pack(builder);
|
|
14
|
+
FSP.finishFSPBuffer(builder, offset);
|
|
15
|
+
return builder.asUint8Array();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export async function verifyFieldStreamPolicyProviderSignature(policy, options = {}) {
|
|
19
|
+
const root = fieldStreamPolicyRoot(policy);
|
|
20
|
+
const providerSignature = readProviderSignature(root.providerSignatureArray?.(), "field stream policy");
|
|
21
|
+
const providerPublicKey = cloneBytes(options.providerPublicKey);
|
|
22
|
+
if (providerPublicKey.length === 0) {
|
|
23
|
+
throw new TypeError("verifyFieldStreamPolicyProviderSignature requires providerPublicKey.");
|
|
24
|
+
}
|
|
25
|
+
if (typeof options.verify !== "function") {
|
|
26
|
+
throw new TypeError("verifyFieldStreamPolicyProviderSignature requires verify.");
|
|
27
|
+
}
|
|
28
|
+
const payload = encodeUnsignedFieldStreamPolicyForProviderSignature(root);
|
|
29
|
+
const verified = await options.verify(providerPublicKey, payload, providerSignature);
|
|
30
|
+
if (!verified) {
|
|
31
|
+
throw new Error("field stream policy provider signature verification failed");
|
|
32
|
+
}
|
|
33
|
+
return root;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function encodeUnsignedFieldStreamMessageForProviderSignature(message) {
|
|
37
|
+
const root = fieldStreamMessageRoot(message);
|
|
38
|
+
const unsignedMessage = root.unpack();
|
|
39
|
+
unsignedMessage.PROVIDER_SIGNATURE = [];
|
|
40
|
+
const builder = new flatbuffers.Builder(1024);
|
|
41
|
+
const offset = unsignedMessage.pack(builder);
|
|
42
|
+
FSM.finishFSMBuffer(builder, offset);
|
|
43
|
+
return builder.asUint8Array();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export async function verifyFieldStreamMessageProviderSignature(message, options = {}) {
|
|
47
|
+
const root = fieldStreamMessageRoot(message);
|
|
48
|
+
const providerSignature = readProviderSignature(root.providerSignatureArray?.(), "field stream message");
|
|
49
|
+
const providerPublicKey = cloneBytes(options.providerPublicKey);
|
|
50
|
+
if (providerPublicKey.length === 0) {
|
|
51
|
+
throw new TypeError("verifyFieldStreamMessageProviderSignature requires providerPublicKey.");
|
|
52
|
+
}
|
|
53
|
+
if (typeof options.verify !== "function") {
|
|
54
|
+
throw new TypeError("verifyFieldStreamMessageProviderSignature requires verify.");
|
|
55
|
+
}
|
|
56
|
+
const payload = encodeUnsignedFieldStreamMessageForProviderSignature(root);
|
|
57
|
+
const verified = await options.verify(providerPublicKey, payload, providerSignature);
|
|
58
|
+
if (!verified) {
|
|
59
|
+
throw new Error("field stream message provider signature verification failed");
|
|
60
|
+
}
|
|
61
|
+
return root;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function fieldStreamPolicyRoot(policy) {
|
|
65
|
+
if (policy && typeof policy.POLICY_ID === "function" && typeof policy.unpack === "function") {
|
|
66
|
+
return policy;
|
|
67
|
+
}
|
|
68
|
+
const bytes = cloneBytes(policy);
|
|
69
|
+
if (bytes.length === 0) {
|
|
70
|
+
throw new TypeError("field stream policy is required");
|
|
71
|
+
}
|
|
72
|
+
const buffer = new flatbuffers.ByteBuffer(bytes);
|
|
73
|
+
if (!FSP.bufferHasIdentifier(buffer)) {
|
|
74
|
+
throw new Error("field stream policy identifier mismatch");
|
|
75
|
+
}
|
|
76
|
+
return FSP.getRootAsFSP(buffer);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function fieldStreamMessageRoot(message) {
|
|
80
|
+
if (message && typeof message.MESSAGE_ID === "function" && typeof message.unpack === "function") {
|
|
81
|
+
return message;
|
|
82
|
+
}
|
|
83
|
+
const bytes = cloneBytes(message);
|
|
84
|
+
if (bytes.length === 0) {
|
|
85
|
+
throw new TypeError("field stream message is required");
|
|
86
|
+
}
|
|
87
|
+
const buffer = new flatbuffers.ByteBuffer(bytes);
|
|
88
|
+
if (!FSM.bufferHasIdentifier(buffer)) {
|
|
89
|
+
throw new Error("field stream message identifier mismatch");
|
|
90
|
+
}
|
|
91
|
+
return FSM.getRootAsFSM(buffer);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function readProviderSignature(signature, label) {
|
|
95
|
+
const bytes = cloneBytes(signature);
|
|
96
|
+
if (bytes.length !== PROVIDER_SIGNATURE_LENGTH) {
|
|
97
|
+
throw new Error(`${label} provider signature must be ${PROVIDER_SIGNATURE_LENGTH} bytes`);
|
|
98
|
+
}
|
|
99
|
+
if (bytes.every((byte) => byte === 0)) {
|
|
100
|
+
throw new Error(`${label} provider signature must not be all zeroes`);
|
|
101
|
+
}
|
|
102
|
+
return bytes;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function cloneBytes(bytes) {
|
|
106
|
+
if (!bytes) {
|
|
107
|
+
return new Uint8Array();
|
|
108
|
+
}
|
|
109
|
+
if (bytes instanceof Uint8Array) {
|
|
110
|
+
return new Uint8Array(bytes);
|
|
111
|
+
}
|
|
112
|
+
if (ArrayBuffer.isView(bytes)) {
|
|
113
|
+
return new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength).slice();
|
|
114
|
+
}
|
|
115
|
+
if (bytes instanceof ArrayBuffer) {
|
|
116
|
+
return new Uint8Array(bytes).slice();
|
|
117
|
+
}
|
|
118
|
+
return new Uint8Array(bytes);
|
|
119
|
+
}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { DrainPolicy } from "../generated/orbpro/manifest.js";
|
|
2
|
+
import {
|
|
3
|
+
FlatBufferTypeRefT,
|
|
4
|
+
PayloadWireFormat,
|
|
5
|
+
TypedArenaBufferT,
|
|
6
|
+
BufferMutability,
|
|
7
|
+
BufferOwnership,
|
|
8
|
+
} from "../generated/orbpro/stream.js";
|
|
9
|
+
import {
|
|
10
|
+
decodeStreamInvokeResponse,
|
|
11
|
+
encodeStreamInvokeRequest,
|
|
12
|
+
} from "./flowCodec.js";
|
|
13
|
+
import { hasByteAddressableBuffer, toUint8Array } from "../runtime/bufferLike.js";
|
|
14
|
+
|
|
15
|
+
function writeBytes(memory, pointer, data) {
|
|
16
|
+
const bytes = new Uint8Array(memory.buffer);
|
|
17
|
+
bytes.set(toUint8Array(data) ?? new Uint8Array(), Number(pointer) >>> 0);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function cloneBytes(memory, offset, size) {
|
|
21
|
+
const base = Number(offset) >>> 0;
|
|
22
|
+
const length = Number(size) >>> 0;
|
|
23
|
+
if (length === 0) {
|
|
24
|
+
return new Uint8Array();
|
|
25
|
+
}
|
|
26
|
+
return new Uint8Array(new Uint8Array(memory.buffer, base, length));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function normalizeBigInt(value, fallback = 0n) {
|
|
30
|
+
if (typeof value === "bigint") {
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
if (typeof value === "number") {
|
|
34
|
+
return BigInt(value);
|
|
35
|
+
}
|
|
36
|
+
return fallback;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function normalizeTypeRef(typeRef = null) {
|
|
40
|
+
if (!typeRef) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
if (typeRef instanceof FlatBufferTypeRefT) {
|
|
44
|
+
return typeRef;
|
|
45
|
+
}
|
|
46
|
+
return new FlatBufferTypeRefT(
|
|
47
|
+
typeRef.schemaName ?? typeRef.schema_name ?? null,
|
|
48
|
+
typeRef.fileIdentifier ?? typeRef.file_identifier ?? null,
|
|
49
|
+
ArrayBuffer.isView(typeRef.schemaHash ?? typeRef.schema_hash)
|
|
50
|
+
? Array.from(typeRef.schemaHash ?? typeRef.schema_hash)
|
|
51
|
+
: Array.isArray(typeRef.schemaHash ?? typeRef.schema_hash)
|
|
52
|
+
? [...(typeRef.schemaHash ?? typeRef.schema_hash)]
|
|
53
|
+
: [],
|
|
54
|
+
Boolean(
|
|
55
|
+
typeRef.acceptsAnyFlatbuffer ?? typeRef.accepts_any_flatbuffer ?? false,
|
|
56
|
+
),
|
|
57
|
+
typeRef.wireFormat ?? typeRef.wire_format ?? PayloadWireFormat.Flatbuffer,
|
|
58
|
+
typeRef.rootTypeName ?? typeRef.root_type_name ?? null,
|
|
59
|
+
Number(typeRef.fixedStringLength ?? typeRef.fixed_string_length ?? 0),
|
|
60
|
+
Number(typeRef.byteLength ?? typeRef.byte_length ?? 0),
|
|
61
|
+
Number(typeRef.requiredAlignment ?? typeRef.required_alignment ?? 0),
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function getDependencyMemory(instantiatedDependency) {
|
|
66
|
+
const memory =
|
|
67
|
+
instantiatedDependency?.memory ??
|
|
68
|
+
instantiatedDependency?.exports?.memory ??
|
|
69
|
+
null;
|
|
70
|
+
if (!memory || !hasByteAddressableBuffer(memory)) {
|
|
71
|
+
throw new Error(
|
|
72
|
+
"Dependency stream bridge requires dependency WebAssembly.Memory.",
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
return memory;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function getDependencyAllocator(instantiatedDependency) {
|
|
79
|
+
const malloc =
|
|
80
|
+
instantiatedDependency?.resolvedExports?.malloc ??
|
|
81
|
+
instantiatedDependency?.exports?.malloc ??
|
|
82
|
+
null;
|
|
83
|
+
const free =
|
|
84
|
+
instantiatedDependency?.resolvedExports?.free ??
|
|
85
|
+
instantiatedDependency?.exports?.free ??
|
|
86
|
+
null;
|
|
87
|
+
if (typeof malloc !== "function" || typeof free !== "function") {
|
|
88
|
+
throw new Error(
|
|
89
|
+
"Dependency stream bridge requires dependency malloc/free exports.",
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
return { malloc, free };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function getDependencyRawInvoker(instantiatedDependency) {
|
|
96
|
+
const invokeRawStream = instantiatedDependency?.invokeRawStream ?? null;
|
|
97
|
+
if (typeof invokeRawStream !== "function") {
|
|
98
|
+
throw new Error(
|
|
99
|
+
"Dependency stream bridge requires instantiatedDependency.invokeRawStream().",
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
return invokeRawStream;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function stageInputFrames(instantiatedDependency, inputs = []) {
|
|
106
|
+
const memory = getDependencyMemory(instantiatedDependency);
|
|
107
|
+
const { malloc, free } = getDependencyAllocator(instantiatedDependency);
|
|
108
|
+
const stagedPointers = [];
|
|
109
|
+
const typedInputs = inputs.map((input = {}) => {
|
|
110
|
+
const payload = toUint8Array(
|
|
111
|
+
input.bytes ?? input.data ?? input.payloadBytes ?? new Uint8Array(),
|
|
112
|
+
);
|
|
113
|
+
const pointer =
|
|
114
|
+
payload.length > 0 ? Number(malloc(payload.length)) >>> 0 : 0;
|
|
115
|
+
if (pointer !== 0) {
|
|
116
|
+
writeBytes(memory, pointer, payload);
|
|
117
|
+
stagedPointers.push(pointer);
|
|
118
|
+
}
|
|
119
|
+
return new TypedArenaBufferT(
|
|
120
|
+
normalizeTypeRef(input.typeRef ?? input.type_ref ?? null),
|
|
121
|
+
input.portId ?? input.port_id ?? null,
|
|
122
|
+
Number(input.alignment ?? 8) >>> 0,
|
|
123
|
+
pointer,
|
|
124
|
+
payload.length >>> 0,
|
|
125
|
+
BufferOwnership.BORROWED,
|
|
126
|
+
Number(input.generation ?? 0) >>> 0,
|
|
127
|
+
BufferMutability.IMMUTABLE,
|
|
128
|
+
normalizeBigInt(input.traceToken ?? input.trace_token ?? 0),
|
|
129
|
+
Number(input.streamId ?? input.stream_id ?? 0) >>> 0,
|
|
130
|
+
normalizeBigInt(input.sequence ?? 0),
|
|
131
|
+
Boolean(input.endOfStream ?? input.end_of_stream ?? false),
|
|
132
|
+
);
|
|
133
|
+
});
|
|
134
|
+
return {
|
|
135
|
+
typedInputs,
|
|
136
|
+
release() {
|
|
137
|
+
for (const pointer of stagedPointers) {
|
|
138
|
+
free(pointer);
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function normalizeOutputFrame(instantiatedDependency, output = {}) {
|
|
145
|
+
const memory = getDependencyMemory(instantiatedDependency);
|
|
146
|
+
const bytes =
|
|
147
|
+
typeof instantiatedDependency?.cloneBytes === "function"
|
|
148
|
+
? instantiatedDependency.cloneBytes(output.offset, output.size)
|
|
149
|
+
: cloneBytes(memory, output.offset, output.size);
|
|
150
|
+
return {
|
|
151
|
+
typeRef: output.typeRef ?? null,
|
|
152
|
+
portId: output.portId ?? null,
|
|
153
|
+
alignment: output.alignment ?? 8,
|
|
154
|
+
offset: output.offset ?? 0,
|
|
155
|
+
size: output.size ?? bytes.length,
|
|
156
|
+
ownership: output.ownership,
|
|
157
|
+
generation: output.generation ?? 0,
|
|
158
|
+
mutability: output.mutability,
|
|
159
|
+
traceToken: Number(output.traceId ?? 0n),
|
|
160
|
+
streamId: output.streamId ?? 0,
|
|
161
|
+
sequence: Number(output.sequence ?? 0n),
|
|
162
|
+
endOfStream: output.endOfStream ?? false,
|
|
163
|
+
bytes,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function releaseOutputFrames(instantiatedDependency, outputs = []) {
|
|
168
|
+
const release =
|
|
169
|
+
instantiatedDependency?.release ??
|
|
170
|
+
instantiatedDependency?.resolvedExports?.free ??
|
|
171
|
+
null;
|
|
172
|
+
if (typeof release !== "function") {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
const released = new Set();
|
|
176
|
+
for (const output of outputs) {
|
|
177
|
+
const pointer = Number(output.offset ?? 0) >>> 0;
|
|
178
|
+
if (pointer === 0 || released.has(pointer)) {
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
release(pointer);
|
|
182
|
+
released.add(pointer);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export function createDependencyStreamBridge(options = {}) {
|
|
187
|
+
const drainPolicy = options.drainPolicy ?? DrainPolicy.DRAIN_UNTIL_YIELD;
|
|
188
|
+
const releaseOutputs = options.releaseOutputs !== false;
|
|
189
|
+
|
|
190
|
+
return function dependencyStreamBridge({
|
|
191
|
+
methodId,
|
|
192
|
+
inputs = [],
|
|
193
|
+
outputStreamCap = 0,
|
|
194
|
+
instantiatedDependency,
|
|
195
|
+
} = {}) {
|
|
196
|
+
const invokeRawStream = getDependencyRawInvoker(instantiatedDependency);
|
|
197
|
+
const stagedInputs = stageInputFrames(instantiatedDependency, inputs);
|
|
198
|
+
try {
|
|
199
|
+
const requestBytes = encodeStreamInvokeRequest({
|
|
200
|
+
methodId,
|
|
201
|
+
inputs: stagedInputs.typedInputs,
|
|
202
|
+
outputStreamCap,
|
|
203
|
+
drainPolicy,
|
|
204
|
+
});
|
|
205
|
+
const responseBytes = invokeRawStream(requestBytes);
|
|
206
|
+
if (!responseBytes || responseBytes.length === 0) {
|
|
207
|
+
return {
|
|
208
|
+
statusCode: 0,
|
|
209
|
+
backlogRemaining: 0,
|
|
210
|
+
yielded: false,
|
|
211
|
+
outputs: [],
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
const response = decodeStreamInvokeResponse(responseBytes);
|
|
215
|
+
const outputs = response.outputs.map((output) =>
|
|
216
|
+
normalizeOutputFrame(instantiatedDependency, output),
|
|
217
|
+
);
|
|
218
|
+
if (releaseOutputs) {
|
|
219
|
+
releaseOutputFrames(instantiatedDependency, response.outputs);
|
|
220
|
+
}
|
|
221
|
+
return {
|
|
222
|
+
statusCode: response.errorCode ?? 0,
|
|
223
|
+
backlogRemaining: response.backlogRemaining ?? 0,
|
|
224
|
+
yielded: response.yielded ?? false,
|
|
225
|
+
outputs,
|
|
226
|
+
errorMessage: response.errorMessage ?? null,
|
|
227
|
+
};
|
|
228
|
+
} finally {
|
|
229
|
+
stagedInputs.release();
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export default createDependencyStreamBridge;
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FlatSQL link shim (loop C.7 direct linkage) — a tiny, fixed wasm module
|
|
3
|
+
* whose ONLY memory is the FlatSQL engine's exported linear memory
|
|
4
|
+
* (`(import "flatsql" "memory")`). It is the B-iv "engine-import component"
|
|
5
|
+
* from sdn-server/docs/flatsql-component-linkage.md in its minimal form: no
|
|
6
|
+
* data segments, no globals, no stack — pure code — so it is position
|
|
7
|
+
* independent by construction and instantiates against ANY live engine
|
|
8
|
+
* instance (WasmEdge named-module registration server-side,
|
|
9
|
+
* `WebAssembly.instantiate(bytes, { flatsql: engineExports })` in the
|
|
10
|
+
* browser).
|
|
11
|
+
*
|
|
12
|
+
* A linked flow artifact owns its own linear memory (the emscripten heap the
|
|
13
|
+
* flow runtime needs) and imports the engine's *functions* directly
|
|
14
|
+
* (`flatsql.malloc/free/flatsql_*` — scalars cross fine). What core wasm
|
|
15
|
+
* cannot do is LOAD/STORE another instance's memory: this shim closes that
|
|
16
|
+
* gap. Its loads/stores address the ENGINE memory, so the flow crosses the
|
|
17
|
+
* memory boundary with direct in-wasm calls (zero hostcalls, zero host
|
|
18
|
+
* copies):
|
|
19
|
+
*
|
|
20
|
+
* peek8/peek32/peek64 read engine memory (query results, error strings)
|
|
21
|
+
* poke8/poke32 write engine memory (SQL text, TLV param blobs)
|
|
22
|
+
* fnv1a64 word-folded FNV-1a 64 over an engine-memory range —
|
|
23
|
+
* bit-identical to decision-gate's fnv1a64_etag, the
|
|
24
|
+
* SDK's fnv1a64Hex, and sdn-server's
|
|
25
|
+
* FNV1a64WordFolded (the canonical stream/etag hash)
|
|
26
|
+
* count_frames size-prefixed frame count of an aligned stream in
|
|
27
|
+
* engine memory (the x-sdn-record-count rule:
|
|
28
|
+
* zero-length prefixes are padding; malformed = -1)
|
|
29
|
+
*
|
|
30
|
+
* The module bytes are deterministic (assembled below, no toolchain), so the
|
|
31
|
+
* SAME artifact ships in the SDK, in compiled flow bundles
|
|
32
|
+
* (dist/flatsql-link-shim.wasm), and embedded in sdn-server's flowrt —
|
|
33
|
+
* pinned by sha256 in each host's tests.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Minimal wasm binary emitter (LEB128 + sections) — enough for this module.
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
|
|
40
|
+
function lebU(value) {
|
|
41
|
+
const out = [];
|
|
42
|
+
let v = value >>> 0;
|
|
43
|
+
do {
|
|
44
|
+
let byte = v & 0x7f;
|
|
45
|
+
v >>>= 7;
|
|
46
|
+
if (v !== 0) byte |= 0x80;
|
|
47
|
+
out.push(byte);
|
|
48
|
+
} while (v !== 0);
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function lebS64(value) {
|
|
53
|
+
// Signed LEB128 for i64.const immediates (BigInt).
|
|
54
|
+
const out = [];
|
|
55
|
+
let v = BigInt.asIntN(64, BigInt(value));
|
|
56
|
+
for (;;) {
|
|
57
|
+
const byte = Number(v & 0x7fn);
|
|
58
|
+
v >>= 7n;
|
|
59
|
+
const signBit = (byte & 0x40) !== 0;
|
|
60
|
+
if ((v === 0n && !signBit) || (v === -1n && signBit)) {
|
|
61
|
+
out.push(byte);
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
out.push(byte | 0x80);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function lebS32(value) {
|
|
69
|
+
const out = [];
|
|
70
|
+
let v = value | 0;
|
|
71
|
+
for (;;) {
|
|
72
|
+
const byte = v & 0x7f;
|
|
73
|
+
v >>= 7;
|
|
74
|
+
const signBit = (byte & 0x40) !== 0;
|
|
75
|
+
if ((v === 0 && !signBit) || (v === -1 && signBit)) {
|
|
76
|
+
out.push(byte);
|
|
77
|
+
return out;
|
|
78
|
+
}
|
|
79
|
+
out.push(byte | 0x80);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function utf8(text) {
|
|
84
|
+
return Array.from(new TextEncoder().encode(text));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function section(id, payload) {
|
|
88
|
+
return [id, ...lebU(payload.length), ...payload];
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function vec(entries) {
|
|
92
|
+
return [...lebU(entries.length), ...entries.flat()];
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Opcodes used below.
|
|
96
|
+
const OP = {
|
|
97
|
+
block: 0x02,
|
|
98
|
+
loop: 0x03,
|
|
99
|
+
if: 0x04,
|
|
100
|
+
end: 0x0b,
|
|
101
|
+
br: 0x0c,
|
|
102
|
+
br_if: 0x0d,
|
|
103
|
+
return: 0x0f,
|
|
104
|
+
local_get: 0x20,
|
|
105
|
+
local_set: 0x21,
|
|
106
|
+
i32_load: 0x28,
|
|
107
|
+
i64_load: 0x29,
|
|
108
|
+
i32_load8_u: 0x2d,
|
|
109
|
+
i64_load8_u: 0x31,
|
|
110
|
+
i32_store: 0x36,
|
|
111
|
+
i32_store8: 0x3a,
|
|
112
|
+
i32_const: 0x41,
|
|
113
|
+
i64_const: 0x42,
|
|
114
|
+
i32_eqz: 0x45,
|
|
115
|
+
i32_lt_u: 0x49,
|
|
116
|
+
i32_gt_u: 0x4a,
|
|
117
|
+
i32_ge_u: 0x4f,
|
|
118
|
+
i32_add: 0x6a,
|
|
119
|
+
i32_sub: 0x6b,
|
|
120
|
+
i32_and: 0x71,
|
|
121
|
+
i64_add: 0x7c,
|
|
122
|
+
i64_mul: 0x7e,
|
|
123
|
+
i64_xor: 0x85,
|
|
124
|
+
void: 0x40,
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
const FNV_OFFSET_BASIS = 1469598103934665603n; // deployed decision-gate basis
|
|
128
|
+
const FNV_PRIME = 1099511628211n;
|
|
129
|
+
|
|
130
|
+
function func(localDecls, body) {
|
|
131
|
+
const locals = vec(localDecls.map(([count, type]) => [...lebU(count), type]));
|
|
132
|
+
const payload = [...locals, ...body, OP.end];
|
|
133
|
+
return [...lebU(payload.length), ...payload];
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const I32 = 0x7f;
|
|
137
|
+
const I64 = 0x7e;
|
|
138
|
+
|
|
139
|
+
function memarg(align) {
|
|
140
|
+
return [...lebU(align), ...lebU(0)];
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** Assemble the shim module bytes (deterministic). */
|
|
144
|
+
export function buildFlatsqlLinkShimWasm() {
|
|
145
|
+
const types = [
|
|
146
|
+
[0x60, ...vec([[I32]]), ...vec([[I32]])], // t0: (i32)->i32
|
|
147
|
+
[0x60, ...vec([[I32]]), ...vec([[I64]])], // t1: (i32)->i64
|
|
148
|
+
[0x60, ...vec([[I32], [I32]]), ...vec([])], // t2: (i32,i32)->()
|
|
149
|
+
[0x60, ...vec([[I32], [I32]]), ...vec([[I64]])], // t3: (i32,i32)->i64
|
|
150
|
+
[0x60, ...vec([[I32], [I32]]), ...vec([[I32]])], // t4: (i32,i32)->i32
|
|
151
|
+
];
|
|
152
|
+
|
|
153
|
+
// Imports: (import "flatsql" "memory" (memory 0))
|
|
154
|
+
const imports = [
|
|
155
|
+
[
|
|
156
|
+
...lebU(7), ...utf8("flatsql"),
|
|
157
|
+
...lebU(6), ...utf8("memory"),
|
|
158
|
+
0x02, // memory import
|
|
159
|
+
0x00, ...lebU(0), // limits: min 0, no max
|
|
160
|
+
],
|
|
161
|
+
];
|
|
162
|
+
|
|
163
|
+
// Function indexes (imports contribute none): 0..6
|
|
164
|
+
const funcTypes = [0 /* peek8 */, 0 /* peek32 */, 1 /* peek64 */, 2 /* poke8 */, 2 /* poke32 */, 3 /* fnv1a64 */, 4 /* count_frames */];
|
|
165
|
+
|
|
166
|
+
const exports = [
|
|
167
|
+
[...lebU(5), ...utf8("peek8"), 0x00, ...lebU(0)],
|
|
168
|
+
[...lebU(6), ...utf8("peek32"), 0x00, ...lebU(1)],
|
|
169
|
+
[...lebU(6), ...utf8("peek64"), 0x00, ...lebU(2)],
|
|
170
|
+
[...lebU(5), ...utf8("poke8"), 0x00, ...lebU(3)],
|
|
171
|
+
[...lebU(6), ...utf8("poke32"), 0x00, ...lebU(4)],
|
|
172
|
+
[...lebU(7), ...utf8("fnv1a64"), 0x00, ...lebU(5)],
|
|
173
|
+
[...lebU(12), ...utf8("count_frames"), 0x00, ...lebU(6)],
|
|
174
|
+
];
|
|
175
|
+
|
|
176
|
+
const peek8 = func([], [OP.local_get, 0, OP.i32_load8_u, ...memarg(0)]);
|
|
177
|
+
const peek32 = func([], [OP.local_get, 0, OP.i32_load, ...memarg(0)]);
|
|
178
|
+
const peek64 = func([], [OP.local_get, 0, OP.i64_load, ...memarg(0)]);
|
|
179
|
+
const poke8 = func([], [OP.local_get, 0, OP.local_get, 1, OP.i32_store8, ...memarg(0)]);
|
|
180
|
+
const poke32 = func([], [OP.local_get, 0, OP.local_get, 1, OP.i32_store, ...memarg(0)]);
|
|
181
|
+
|
|
182
|
+
// fnv1a64(ptr, len) -> i64 : word-folded FNV-1a 64 (8-byte LE words, byte tail).
|
|
183
|
+
// locals: 2 = hash (i64), 3 = end (i32), 4 = wend (i32)
|
|
184
|
+
const fnv = func(
|
|
185
|
+
[
|
|
186
|
+
[1, I64],
|
|
187
|
+
[2, I32],
|
|
188
|
+
],
|
|
189
|
+
[
|
|
190
|
+
OP.i64_const, ...lebS64(FNV_OFFSET_BASIS), OP.local_set, 2,
|
|
191
|
+
OP.local_get, 0, OP.local_get, 1, OP.i32_add, OP.local_set, 3,
|
|
192
|
+
OP.local_get, 1, OP.i32_const, ...lebS32(-8), OP.i32_and, OP.local_get, 0, OP.i32_add, OP.local_set, 4,
|
|
193
|
+
// word loop
|
|
194
|
+
OP.block, OP.void,
|
|
195
|
+
OP.loop, OP.void,
|
|
196
|
+
OP.local_get, 0, OP.local_get, 4, OP.i32_ge_u, OP.br_if, 1,
|
|
197
|
+
OP.local_get, 2, OP.local_get, 0, OP.i64_load, ...memarg(0), OP.i64_xor,
|
|
198
|
+
OP.i64_const, ...lebS64(FNV_PRIME), OP.i64_mul, OP.local_set, 2,
|
|
199
|
+
OP.local_get, 0, OP.i32_const, 8, OP.i32_add, OP.local_set, 0,
|
|
200
|
+
OP.br, 0,
|
|
201
|
+
OP.end,
|
|
202
|
+
OP.end,
|
|
203
|
+
// byte tail loop
|
|
204
|
+
OP.block, OP.void,
|
|
205
|
+
OP.loop, OP.void,
|
|
206
|
+
OP.local_get, 0, OP.local_get, 3, OP.i32_ge_u, OP.br_if, 1,
|
|
207
|
+
OP.local_get, 2, OP.local_get, 0, OP.i64_load8_u, ...memarg(0), OP.i64_xor,
|
|
208
|
+
OP.i64_const, ...lebS64(FNV_PRIME), OP.i64_mul, OP.local_set, 2,
|
|
209
|
+
OP.local_get, 0, OP.i32_const, 1, OP.i32_add, OP.local_set, 0,
|
|
210
|
+
OP.br, 0,
|
|
211
|
+
OP.end,
|
|
212
|
+
OP.end,
|
|
213
|
+
OP.local_get, 2,
|
|
214
|
+
],
|
|
215
|
+
);
|
|
216
|
+
|
|
217
|
+
// count_frames(ptr, len) -> i32 : size-prefixed frame count; zero-length
|
|
218
|
+
// prefixes skipped as padding; malformed framing returns -1.
|
|
219
|
+
// locals: 2 = count (i32), 3 = end (i32), 4 = frameSize (i32)
|
|
220
|
+
const countFrames = func(
|
|
221
|
+
[[3, I32]],
|
|
222
|
+
[
|
|
223
|
+
OP.local_get, 0, OP.local_get, 1, OP.i32_add, OP.local_set, 3,
|
|
224
|
+
OP.block, OP.void,
|
|
225
|
+
OP.loop, OP.void,
|
|
226
|
+
OP.local_get, 0, OP.local_get, 3, OP.i32_ge_u, OP.br_if, 1,
|
|
227
|
+
// if (end - ptr < 4) return -1
|
|
228
|
+
OP.local_get, 3, OP.local_get, 0, OP.i32_sub, OP.i32_const, 4, OP.i32_lt_u,
|
|
229
|
+
OP.if, OP.void, OP.i32_const, ...lebS32(-1), OP.return, OP.end,
|
|
230
|
+
OP.local_get, 0, OP.i32_load, ...memarg(0), OP.local_set, 4,
|
|
231
|
+
OP.local_get, 0, OP.i32_const, 4, OP.i32_add, OP.local_set, 0,
|
|
232
|
+
// if (frameSize == 0) continue
|
|
233
|
+
OP.local_get, 4, OP.i32_eqz, OP.br_if, 0,
|
|
234
|
+
// if (frameSize > end - ptr) return -1
|
|
235
|
+
OP.local_get, 4, OP.local_get, 3, OP.local_get, 0, OP.i32_sub, OP.i32_gt_u,
|
|
236
|
+
OP.if, OP.void, OP.i32_const, ...lebS32(-1), OP.return, OP.end,
|
|
237
|
+
OP.local_get, 0, OP.local_get, 4, OP.i32_add, OP.local_set, 0,
|
|
238
|
+
OP.local_get, 2, OP.i32_const, 1, OP.i32_add, OP.local_set, 2,
|
|
239
|
+
OP.br, 0,
|
|
240
|
+
OP.end,
|
|
241
|
+
OP.end,
|
|
242
|
+
OP.local_get, 2,
|
|
243
|
+
],
|
|
244
|
+
);
|
|
245
|
+
|
|
246
|
+
const bytes = [
|
|
247
|
+
0x00, 0x61, 0x73, 0x6d, // \0asm
|
|
248
|
+
0x01, 0x00, 0x00, 0x00, // version 1
|
|
249
|
+
...section(1, vec(types)),
|
|
250
|
+
...section(2, vec(imports)),
|
|
251
|
+
...section(3, vec(funcTypes.map((t) => lebU(t)))),
|
|
252
|
+
...section(7, vec(exports)),
|
|
253
|
+
...section(10, vec([peek8, peek32, peek64, poke8, poke32, fnv, countFrames])),
|
|
254
|
+
];
|
|
255
|
+
return new Uint8Array(bytes);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/** The shim module bytes (assembled once at import). */
|
|
259
|
+
export const FLATSQL_LINK_SHIM_WASM = buildFlatsqlLinkShimWasm();
|
|
260
|
+
|
|
261
|
+
/** Import-module names the linked flow artifact resolves against. */
|
|
262
|
+
export const FLATSQL_ENGINE_IMPORT_MODULE = "flatsql";
|
|
263
|
+
export const FLATSQL_LINK_IMPORT_MODULE = "flatsql_link";
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Engine body-reference tokens minted by linked flow artifacts carry this
|
|
267
|
+
* magic in their high 32 bits ("SDNE"); hostcall-bridge tokens are small
|
|
268
|
+
* counters, so the namespaces can never collide.
|
|
269
|
+
*/
|
|
270
|
+
export const ENGINE_BODY_REF_TOKEN_MAGIC = 0x53444e45n << 32n;
|
|
271
|
+
|
|
272
|
+
export function isEngineBodyRefToken(token) {
|
|
273
|
+
return (BigInt(token) & 0xffffffff00000000n) === ENGINE_BODY_REF_TOKEN_MAGIC;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Instantiate the shim against a live engine's exports. `engineExports` must
|
|
278
|
+
* expose the engine `memory`.
|
|
279
|
+
*/
|
|
280
|
+
export async function instantiateFlatsqlLinkShim(engineExports) {
|
|
281
|
+
const { instance } = await WebAssembly.instantiate(FLATSQL_LINK_SHIM_WASM.slice().buffer, {
|
|
282
|
+
[FLATSQL_ENGINE_IMPORT_MODULE]: { memory: engineExports.memory },
|
|
283
|
+
});
|
|
284
|
+
return instance;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Byte layout of one engine body-reference table entry exported by linked
|
|
289
|
+
* flow artifacts (sdn_flatsql_link_ref_table). Mirrors flow_runtime.cpp's
|
|
290
|
+
* SdnEngineRefEntry exactly (little-endian).
|
|
291
|
+
*/
|
|
292
|
+
export const ENGINE_REF_ENTRY_SIZE = 40;
|
|
293
|
+
|
|
294
|
+
export function readEngineRefEntry(view, base) {
|
|
295
|
+
return {
|
|
296
|
+
token: view.getBigUint64(base + 0, true),
|
|
297
|
+
generation: view.getBigUint64(base + 8, true),
|
|
298
|
+
fnv1a64: view.getBigUint64(base + 16, true),
|
|
299
|
+
enginePtr: view.getUint32(base + 24, true),
|
|
300
|
+
size: view.getUint32(base + 28, true),
|
|
301
|
+
frames: view.getUint32(base + 32, true),
|
|
302
|
+
used: view.getUint32(base + 36, true),
|
|
303
|
+
};
|
|
304
|
+
}
|