space-data-module-sdk 0.8.4 → 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.
Files changed (354) hide show
  1. package/README.md +117 -20
  2. package/bin/space-data-module.js +263 -0
  3. package/docs/.nojekyll +1 -0
  4. package/docs/AGENTS.md +34 -0
  5. package/docs/architecture.svg +141 -0
  6. package/docs/browser-wasmedge-isomorphic.md +179 -0
  7. package/docs/flatsql-streaming-standard.md +341 -0
  8. package/docs/gpu-module-abi.md +193 -0
  9. package/docs/index.html +125 -0
  10. package/docs/isomorphic-pthreads.md +188 -0
  11. package/docs/isomorphic-sdn-runtime-plan.md +167 -0
  12. package/docs/language-runtime-matrix.md +82 -0
  13. package/docs/manifest-structure.svg +114 -0
  14. package/docs/module-bundle-runtime-plan.md +19 -0
  15. package/docs/module-lifecycle.svg +70 -0
  16. package/docs/module-publication-standard.md +540 -0
  17. package/docs/node-red-default-node-parity.md +88 -0
  18. package/docs/protocol-installation.md +196 -0
  19. package/docs/secrets-capability.md +152 -0
  20. package/docs/styles.css +288 -0
  21. package/docs/testing-harness.md +408 -0
  22. package/docs/tri-runtime-parity.md +132 -0
  23. package/docs/wallet-callback.html +2 -0
  24. package/package.json +25 -6
  25. package/schemas/HttpRequestAbi.fbs +41 -0
  26. package/schemas/HttpResponseAbi.fbs +36 -0
  27. package/schemas/PluginManifest.fbs +2 -1
  28. package/src/AGENTS.md +1 -1
  29. package/src/app/codec.js +548 -0
  30. package/src/app/index.js +6 -0
  31. package/src/browser.js +5 -0
  32. package/src/bundle/constants.js +1 -0
  33. package/src/bundle/index.js +15 -0
  34. package/src/bundle/sigdomain.js +179 -0
  35. package/src/bundle/signing.js +767 -0
  36. package/src/bundle/wasm.js +3 -2
  37. package/src/capabilities.js +3 -0
  38. package/src/compat/index.js +7 -0
  39. package/src/compat/sdnLegacy.js +449 -0
  40. package/src/compiler/compileModule.js +556 -55
  41. package/src/compiler/flatcSupport.js +41 -27
  42. package/src/compiler/index.d.ts +2 -0
  43. package/src/compiler/index.js +18 -0
  44. package/src/compiler/invokeGlue.js +1212 -183
  45. package/src/compiler/pthreadArtifactGuard.js +910 -0
  46. package/src/compiler/sdnShimGenerator.js +323 -0
  47. package/src/compiler/wasiThreadsToolchain.js +150 -0
  48. package/src/compliance/index.js +11 -1
  49. package/src/compliance/legacyWildcardPorts.js +228 -0
  50. package/src/compliance/pluginCompliance.js +1000 -96
  51. package/src/field-stream/index.d.ts +31 -0
  52. package/src/field-stream/index.js +119 -0
  53. package/src/flow/dependencyStreamBridge.js +234 -0
  54. package/src/flow/flatsqlLinkShim.js +304 -0
  55. package/src/flow/flowCodec.js +107 -0
  56. package/src/flow/flowCompiler.js +2900 -0
  57. package/src/flow/flowRuntimeHost.js +877 -0
  58. package/src/flow/index.d.ts +117 -0
  59. package/src/flow/index.js +31 -0
  60. package/src/flow/isomorphicFlowHost.js +384 -0
  61. package/src/flow/jsFlowRuntime.js +275 -0
  62. package/src/flow/normalize.js +294 -0
  63. package/src/flow/runtime-src/flow_runtime.cpp +1699 -0
  64. package/src/flow/vendor/sdn-flow/MethodRegistry.js +400 -0
  65. package/src/flow/vendor/sdn-flow/constants.js +39 -0
  66. package/src/flow/vendor/sdn-flow/index.js +29 -0
  67. package/src/flow/vendor/sdn-flow/normalize.js +506 -0
  68. package/src/flow/vendor/sdn-flow/wasmCompatibility.js +189 -0
  69. package/src/generated/http/cpp/HttpRequestAbi_generated.h +285 -0
  70. package/src/generated/http/cpp/HttpResponseAbi_generated.h +192 -0
  71. package/src/generated/http/sdn/http/http-header.js +53 -0
  72. package/src/generated/http/sdn/http/http-header.ts +67 -0
  73. package/src/generated/http/sdn/http/http-request.js +132 -0
  74. package/src/generated/http/sdn/http/http-request.ts +179 -0
  75. package/src/generated/http/sdn/http/http-response.js +144 -0
  76. package/src/generated/http/sdn/http/http-response.ts +168 -0
  77. package/src/generated/http/sdn/http.js +11 -0
  78. package/src/generated/http/sdn/http.ts +4 -0
  79. package/src/generated/orbpro/flow/backpressure-policy.d.ts +12 -0
  80. package/src/generated/orbpro/flow/backpressure-policy.d.ts.map +1 -0
  81. package/src/generated/orbpro/flow/backpressure-policy.js +17 -0
  82. package/src/generated/orbpro/flow/backpressure-policy.js.map +1 -0
  83. package/src/generated/orbpro/flow/backpressure-policy.ts +15 -0
  84. package/src/generated/orbpro/flow/flow-bundle-manifest.d.ts +142 -0
  85. package/src/generated/orbpro/flow/flow-bundle-manifest.d.ts.map +1 -0
  86. package/src/generated/orbpro/flow/flow-bundle-manifest.js +304 -0
  87. package/src/generated/orbpro/flow/flow-bundle-manifest.js.map +1 -0
  88. package/src/generated/orbpro/flow/flow-bundle-manifest.ts +399 -0
  89. package/src/generated/orbpro/flow/flow-edge.d.ts +113 -0
  90. package/src/generated/orbpro/flow/flow-edge.d.ts.map +1 -0
  91. package/src/generated/orbpro/flow/flow-edge.js +221 -0
  92. package/src/generated/orbpro/flow/flow-edge.js.map +1 -0
  93. package/src/generated/orbpro/flow/flow-edge.ts +292 -0
  94. package/src/generated/orbpro/flow/flow-node.d.ts +80 -0
  95. package/src/generated/orbpro/flow/flow-node.d.ts.map +1 -0
  96. package/src/generated/orbpro/flow/flow-node.js +158 -0
  97. package/src/generated/orbpro/flow/flow-node.js.map +1 -0
  98. package/src/generated/orbpro/flow/flow-node.ts +202 -0
  99. package/src/generated/orbpro/flow/flow-program.d.ts +164 -0
  100. package/src/generated/orbpro/flow/flow-program.d.ts.map +1 -0
  101. package/src/generated/orbpro/flow/flow-program.js +350 -0
  102. package/src/generated/orbpro/flow/flow-program.js.map +1 -0
  103. package/src/generated/orbpro/flow/flow-program.ts +477 -0
  104. package/src/generated/orbpro/flow/flow-trigger.d.ts +108 -0
  105. package/src/generated/orbpro/flow/flow-trigger.d.ts.map +1 -0
  106. package/src/generated/orbpro/flow/flow-trigger.js +207 -0
  107. package/src/generated/orbpro/flow/flow-trigger.js.map +1 -0
  108. package/src/generated/orbpro/flow/flow-trigger.ts +276 -0
  109. package/src/generated/orbpro/flow/node-kind.d.ts +13 -0
  110. package/src/generated/orbpro/flow/node-kind.d.ts.map +1 -0
  111. package/src/generated/orbpro/flow/node-kind.js +16 -0
  112. package/src/generated/orbpro/flow/node-kind.js.map +1 -0
  113. package/src/generated/orbpro/{invoke.ts → flow/node-kind.ts} +12 -2
  114. package/src/generated/orbpro/flow/plugin-version-binding.d.ts +52 -0
  115. package/src/generated/orbpro/flow/plugin-version-binding.d.ts.map +1 -0
  116. package/src/generated/orbpro/flow/plugin-version-binding.js +85 -0
  117. package/src/generated/orbpro/flow/plugin-version-binding.js.map +1 -0
  118. package/src/generated/orbpro/flow/plugin-version-binding.ts +121 -0
  119. package/src/generated/orbpro/flow/schema-hash-binding.d.ts +70 -0
  120. package/src/generated/orbpro/flow/schema-hash-binding.d.ts.map +1 -0
  121. package/src/generated/orbpro/flow/schema-hash-binding.js +143 -0
  122. package/src/generated/orbpro/flow/schema-hash-binding.js.map +1 -0
  123. package/src/generated/orbpro/flow/schema-hash-binding.ts +189 -0
  124. package/src/generated/orbpro/flow/trigger-binding.d.ts +71 -0
  125. package/src/generated/orbpro/flow/trigger-binding.d.ts.map +1 -0
  126. package/src/generated/orbpro/flow/trigger-binding.js +142 -0
  127. package/src/generated/orbpro/flow/trigger-binding.js.map +1 -0
  128. package/src/generated/orbpro/flow/trigger-binding.ts +181 -0
  129. package/src/generated/orbpro/flow/trigger-kind.d.ts +14 -0
  130. package/src/generated/orbpro/flow/trigger-kind.d.ts.map +1 -0
  131. package/src/generated/orbpro/flow/trigger-kind.js +17 -0
  132. package/src/generated/orbpro/flow/trigger-kind.js.map +1 -0
  133. package/src/generated/orbpro/flow/trigger-kind.ts +17 -0
  134. package/src/generated/orbpro/flow.d.ts +21 -0
  135. package/src/generated/orbpro/flow.d.ts.map +1 -0
  136. package/src/generated/orbpro/flow.js +23 -0
  137. package/src/generated/orbpro/flow.js.map +1 -0
  138. package/src/generated/orbpro/flow.ts +24 -0
  139. package/src/generated/orbpro/manifest/capability-kind.d.ts +2 -1
  140. package/src/generated/orbpro/manifest/capability-kind.js +1 -0
  141. package/src/generated/orbpro/manifest/capability-kind.ts +1 -0
  142. package/src/generated/orbpro/plugin/stream-invoke-request.d.ts +93 -0
  143. package/src/generated/orbpro/plugin/stream-invoke-request.js +160 -0
  144. package/src/generated/orbpro/plugin/stream-invoke-request.ts +211 -0
  145. package/src/generated/orbpro/plugin/stream-invoke-response.d.ts +99 -0
  146. package/src/generated/orbpro/plugin/stream-invoke-response.js +175 -0
  147. package/src/generated/orbpro/plugin/stream-invoke-response.ts +226 -0
  148. package/src/generated/orbpro/plugin.js +8 -0
  149. package/src/generated/orbpro/stream.d.ts +12 -0
  150. package/src/generated/orbpro/stream.js +14 -0
  151. package/src/generated/orbpro/stream.ts +15 -0
  152. package/src/generated/spacedatastandards/plg/EntryFunction.d.ts +52 -0
  153. package/src/generated/spacedatastandards/plg/EntryFunction.d.ts.map +1 -0
  154. package/src/generated/spacedatastandards/plg/EntryFunction.js +106 -0
  155. package/src/generated/spacedatastandards/plg/EntryFunction.ts +162 -0
  156. package/src/generated/spacedatastandards/plg/FlatBufferTypeRef.d.ts +90 -0
  157. package/src/generated/spacedatastandards/plg/FlatBufferTypeRef.d.ts.map +1 -0
  158. package/src/generated/spacedatastandards/plg/FlatBufferTypeRef.js +189 -0
  159. package/src/generated/spacedatastandards/plg/FlatBufferTypeRef.ts +270 -0
  160. package/src/generated/spacedatastandards/plg/PLG.d.ts +492 -0
  161. package/src/generated/spacedatastandards/plg/PLG.d.ts.map +1 -0
  162. package/src/generated/spacedatastandards/plg/PLG.js +1139 -0
  163. package/src/generated/spacedatastandards/plg/PLG.ts +1600 -0
  164. package/src/generated/spacedatastandards/plg/PLGAcceptedTypeSet.d.ts +63 -0
  165. package/src/generated/spacedatastandards/plg/PLGAcceptedTypeSet.d.ts.map +1 -0
  166. package/src/generated/spacedatastandards/plg/PLGAcceptedTypeSet.js +138 -0
  167. package/src/generated/spacedatastandards/plg/PLGAcceptedTypeSet.ts +189 -0
  168. package/src/generated/spacedatastandards/plg/PLGBuildArtifact.d.ts +41 -0
  169. package/src/generated/spacedatastandards/plg/PLGBuildArtifact.d.ts.map +1 -0
  170. package/src/generated/spacedatastandards/plg/PLGBuildArtifact.js +104 -0
  171. package/src/generated/spacedatastandards/plg/PLGBuildArtifact.ts +151 -0
  172. package/src/generated/spacedatastandards/plg/PLGFlowEdge.d.ts +68 -0
  173. package/src/generated/spacedatastandards/plg/PLGFlowEdge.d.ts.map +1 -0
  174. package/src/generated/spacedatastandards/plg/PLGFlowEdge.js +124 -0
  175. package/src/generated/spacedatastandards/plg/PLGFlowEdge.ts +184 -0
  176. package/src/generated/spacedatastandards/plg/PLGFlowEdgeContract.d.ts +58 -0
  177. package/src/generated/spacedatastandards/plg/PLGFlowEdgeContract.d.ts.map +1 -0
  178. package/src/generated/spacedatastandards/plg/PLGFlowEdgeContract.js +126 -0
  179. package/src/generated/spacedatastandards/plg/PLGFlowEdgeContract.ts +161 -0
  180. package/src/generated/spacedatastandards/plg/PLGFlowNode.d.ts +82 -0
  181. package/src/generated/spacedatastandards/plg/PLGFlowNode.d.ts.map +1 -0
  182. package/src/generated/spacedatastandards/plg/PLGFlowNode.js +164 -0
  183. package/src/generated/spacedatastandards/plg/PLGFlowNode.ts +244 -0
  184. package/src/generated/spacedatastandards/plg/PLGFlowTrigger.d.ts +55 -0
  185. package/src/generated/spacedatastandards/plg/PLGFlowTrigger.d.ts.map +1 -0
  186. package/src/generated/spacedatastandards/plg/PLGFlowTrigger.js +105 -0
  187. package/src/generated/spacedatastandards/plg/PLGFlowTrigger.ts +162 -0
  188. package/src/generated/spacedatastandards/plg/PLGFlowTriggerBinding.d.ts +42 -0
  189. package/src/generated/spacedatastandards/plg/PLGFlowTriggerBinding.d.ts.map +1 -0
  190. package/src/generated/spacedatastandards/plg/PLGFlowTriggerBinding.js +83 -0
  191. package/src/generated/spacedatastandards/plg/PLGFlowTriggerBinding.ts +127 -0
  192. package/src/generated/spacedatastandards/plg/PLGHostCapability.d.ts +36 -0
  193. package/src/generated/spacedatastandards/plg/PLGHostCapability.d.ts.map +1 -0
  194. package/src/generated/spacedatastandards/plg/PLGHostCapability.js +90 -0
  195. package/src/generated/spacedatastandards/plg/PLGHostCapability.ts +127 -0
  196. package/src/generated/spacedatastandards/plg/PLGMethodManifest.d.ts +53 -0
  197. package/src/generated/spacedatastandards/plg/PLGMethodManifest.d.ts.map +1 -0
  198. package/src/generated/spacedatastandards/plg/PLGMethodManifest.js +153 -0
  199. package/src/generated/spacedatastandards/plg/PLGMethodManifest.ts +210 -0
  200. package/src/generated/spacedatastandards/plg/PLGPortManifest.d.ts +70 -0
  201. package/src/generated/spacedatastandards/plg/PLGPortManifest.d.ts.map +1 -0
  202. package/src/generated/spacedatastandards/plg/PLGPortManifest.js +149 -0
  203. package/src/generated/spacedatastandards/plg/PLGPortManifest.ts +212 -0
  204. package/src/generated/spacedatastandards/plg/PLGProtocolSpec.d.ts +73 -0
  205. package/src/generated/spacedatastandards/plg/PLGProtocolSpec.d.ts.map +1 -0
  206. package/src/generated/spacedatastandards/plg/PLGProtocolSpec.js +199 -0
  207. package/src/generated/spacedatastandards/plg/PLGProtocolSpec.ts +292 -0
  208. package/src/generated/spacedatastandards/plg/PLGTimerSpec.d.ts +40 -0
  209. package/src/generated/spacedatastandards/plg/PLGTimerSpec.d.ts.map +1 -0
  210. package/src/generated/spacedatastandards/plg/PLGTimerSpec.js +103 -0
  211. package/src/generated/spacedatastandards/plg/PLGTimerSpec.ts +148 -0
  212. package/src/generated/spacedatastandards/plg/PluginCapability.d.ts +41 -0
  213. package/src/generated/spacedatastandards/plg/PluginCapability.d.ts.map +1 -0
  214. package/src/generated/spacedatastandards/plg/PluginCapability.js +82 -0
  215. package/src/generated/spacedatastandards/plg/{plugin-capability.ts → PluginCapability.ts} +55 -18
  216. package/src/generated/spacedatastandards/plg/PluginDependency.d.ts +42 -0
  217. package/src/generated/spacedatastandards/plg/PluginDependency.d.ts.map +1 -0
  218. package/src/generated/spacedatastandards/plg/PluginDependency.js +80 -0
  219. package/src/generated/spacedatastandards/plg/PluginDependency.ts +124 -0
  220. package/src/generated/spacedatastandards/plg/TAB.d.ts +85 -0
  221. package/src/generated/spacedatastandards/plg/TAB.d.ts.map +1 -0
  222. package/src/generated/spacedatastandards/plg/TAB.js +173 -0
  223. package/src/generated/spacedatastandards/plg/TAB.ts +228 -0
  224. package/src/generated/spacedatastandards/plg/bufferMutability.d.ts +18 -0
  225. package/src/generated/spacedatastandards/plg/bufferMutability.d.ts.map +1 -0
  226. package/src/generated/spacedatastandards/plg/bufferMutability.js +20 -0
  227. package/src/generated/spacedatastandards/plg/bufferMutability.ts +23 -0
  228. package/src/generated/spacedatastandards/plg/bufferOwnership.d.ts +18 -0
  229. package/src/generated/spacedatastandards/plg/bufferOwnership.d.ts.map +1 -0
  230. package/src/generated/spacedatastandards/plg/bufferOwnership.js +20 -0
  231. package/src/generated/spacedatastandards/plg/bufferOwnership.ts +23 -0
  232. package/src/generated/spacedatastandards/plg/drainBehavior.d.ts +20 -0
  233. package/src/generated/spacedatastandards/plg/drainBehavior.d.ts.map +1 -0
  234. package/src/generated/spacedatastandards/plg/drainBehavior.js +22 -0
  235. package/src/generated/spacedatastandards/plg/drainBehavior.ts +25 -0
  236. package/src/generated/spacedatastandards/plg/flowEdgeRoutePolicy.d.ts +10 -0
  237. package/src/generated/spacedatastandards/plg/flowEdgeRoutePolicy.d.ts.map +1 -0
  238. package/src/generated/spacedatastandards/plg/flowEdgeRoutePolicy.js +12 -0
  239. package/src/generated/spacedatastandards/plg/flowEdgeRoutePolicy.ts +13 -0
  240. package/src/generated/spacedatastandards/plg/hostCapabilityKind.d.ts +51 -0
  241. package/src/generated/spacedatastandards/plg/hostCapabilityKind.d.ts.map +1 -0
  242. package/src/generated/spacedatastandards/plg/hostCapabilityKind.js +53 -0
  243. package/src/generated/spacedatastandards/plg/hostCapabilityKind.ts +55 -0
  244. package/src/generated/spacedatastandards/plg/invokeSurfaceKind.d.ts +15 -0
  245. package/src/generated/spacedatastandards/plg/invokeSurfaceKind.d.ts.map +1 -0
  246. package/src/generated/spacedatastandards/plg/invokeSurfaceKind.js +17 -0
  247. package/src/generated/spacedatastandards/plg/invokeSurfaceKind.ts +19 -0
  248. package/src/generated/spacedatastandards/plg/main.d.ts +29 -0
  249. package/src/generated/spacedatastandards/plg/main.d.ts.map +1 -0
  250. package/src/generated/spacedatastandards/plg/main.js +30 -0
  251. package/src/generated/spacedatastandards/plg/main.ts +32 -0
  252. package/src/generated/spacedatastandards/plg/payloadWireFormat.d.ts +17 -0
  253. package/src/generated/spacedatastandards/plg/payloadWireFormat.d.ts.map +1 -0
  254. package/src/generated/spacedatastandards/plg/payloadWireFormat.js +19 -0
  255. package/src/generated/spacedatastandards/plg/payloadWireFormat.ts +21 -0
  256. package/src/generated/spacedatastandards/plg/pluginCategory.d.ts +82 -0
  257. package/src/generated/spacedatastandards/plg/pluginCategory.d.ts.map +1 -0
  258. package/src/generated/spacedatastandards/plg/pluginCategory.js +84 -0
  259. package/src/generated/spacedatastandards/plg/pluginCategory.ts +103 -0
  260. package/src/generated/spacedatastandards/plg/publicationState.d.ts +18 -0
  261. package/src/generated/spacedatastandards/plg/publicationState.d.ts.map +1 -0
  262. package/src/generated/spacedatastandards/plg/publicationState.js +20 -0
  263. package/src/generated/spacedatastandards/plg/purchaseTier.d.ts +18 -0
  264. package/src/generated/spacedatastandards/plg/purchaseTier.d.ts.map +1 -0
  265. package/src/generated/spacedatastandards/plg/purchaseTier.js +20 -0
  266. package/src/host/AGENTS.md +2 -2
  267. package/src/host/abi.js +53 -66
  268. package/src/host/browserHost.js +355 -8
  269. package/src/host/cpp/keyslotClient.hpp +231 -0
  270. package/src/host/cpp/secretsClient.hpp +583 -0
  271. package/src/host/hostcallWire.js +183 -0
  272. package/src/host/index.js +2 -0
  273. package/src/host/isomorphicLoader.js +44 -7
  274. package/src/host/nodeHost.js +227 -8
  275. package/src/host/sabHostcallChannel.js +206 -0
  276. package/src/host/timerDriver.js +203 -0
  277. package/src/host/wasiShim.js +41 -1
  278. package/src/host/wasiThreadBrowserWorker.mjs +48 -0
  279. package/src/host/wasiThreadHost.js +393 -0
  280. package/src/host/wasiThreadWorker.mjs +32 -0
  281. package/src/host/wasiThreadWorkerRuntime.js +93 -0
  282. package/src/http/index.js +339 -0
  283. package/src/index.d.ts +716 -10
  284. package/src/index.js +4 -0
  285. package/src/invoke/codec.js +1202 -128
  286. package/src/invoke/index.js +5 -1
  287. package/src/licensing/index.d.ts +2 -0
  288. package/src/licensing/index.js +2 -0
  289. package/src/licensing/records.js +287 -8
  290. package/src/manifest/codec.js +62 -14
  291. package/src/manifest/index.js +2 -0
  292. package/src/manifest/legacyToPlg.js +164 -25
  293. package/src/manifest/normalize.js +1 -0
  294. package/src/manifest/plgCodec.js +1303 -62
  295. package/src/manifest/typeRefs.js +162 -24
  296. package/src/runtime/compiledRuntimeAbi.js +47 -0
  297. package/src/runtime/compiledRuntimeAbi.json +33 -0
  298. package/src/runtime/index.d.ts +32 -0
  299. package/src/runtime/index.js +1 -0
  300. package/src/runtime-host/index.js +3 -0
  301. package/src/runtime-host/methodRegistry.js +55 -0
  302. package/src/standards/index.js +200 -56
  303. package/src/standards/sharedCatalog.js +16 -0
  304. package/src/testing/browserModuleHarness.js +604 -31
  305. package/src/testing/docker/wasmedge-parity.Dockerfile +39 -0
  306. package/src/testing/index.d.ts +151 -0
  307. package/src/testing/index.js +21 -0
  308. package/src/testing/native/wasmedge_emscripten_pthread_runner.c +25 -1
  309. package/src/testing/parityBrowserRunner.js +138 -0
  310. package/src/testing/parityHarness.js +616 -0
  311. package/src/testing/parityLanes.js +537 -0
  312. package/src/testing/processInvoke.js +29 -21
  313. package/src/testing/streamInvokeCodec.js +10 -175
  314. package/src/testing/wasmedgePin.json +6 -0
  315. package/src/testing/workerModuleHarness.js +242 -0
  316. package/src/testing/workerModuleHarnessWorker.js +176 -0
  317. package/src/transport/index.js +3 -0
  318. package/src/transport/pki.js +299 -11
  319. package/src/transport/records.js +16 -7
  320. package/src/utils/ecdsaDer.js +106 -0
  321. package/src/utils/wasmCrypto.js +0 -43
  322. package/templates/gpu-module/README.md +48 -0
  323. package/templates/gpu-module/include/space_data_gpu_abi.h +122 -0
  324. package/templates/gpu-module/manifest.json +84 -0
  325. package/schemas/PluginInvokeRequest.fbs +0 -18
  326. package/schemas/PluginInvokeResponse.fbs +0 -30
  327. package/schemas/spacedatastandards/PLG.fbs +0 -191
  328. package/src/generated/orbpro/invoke/plugin-invoke-request.d.ts +0 -51
  329. package/src/generated/orbpro/invoke/plugin-invoke-request.d.ts.map +0 -1
  330. package/src/generated/orbpro/invoke/plugin-invoke-request.js +0 -131
  331. package/src/generated/orbpro/invoke/plugin-invoke-request.js.map +0 -1
  332. package/src/generated/orbpro/invoke/plugin-invoke-request.ts +0 -173
  333. package/src/generated/orbpro/invoke/plugin-invoke-response.d.ts +0 -76
  334. package/src/generated/orbpro/invoke/plugin-invoke-response.d.ts.map +0 -1
  335. package/src/generated/orbpro/invoke/plugin-invoke-response.js +0 -184
  336. package/src/generated/orbpro/invoke/plugin-invoke-response.js.map +0 -1
  337. package/src/generated/orbpro/invoke/plugin-invoke-response.ts +0 -243
  338. package/src/generated/orbpro/invoke.d.ts +0 -3
  339. package/src/generated/orbpro/invoke.js +0 -5
  340. package/src/generated/spacedatastandards/plg/entry-function.js +0 -86
  341. package/src/generated/spacedatastandards/plg/entry-function.ts +0 -119
  342. package/src/generated/spacedatastandards/plg/index.js +0 -16
  343. package/src/generated/spacedatastandards/plg/index.ts +0 -11
  344. package/src/generated/spacedatastandards/plg/plg.js +0 -657
  345. package/src/generated/spacedatastandards/plg/plg.ts +0 -924
  346. package/src/generated/spacedatastandards/plg/plugin-capability.js +0 -66
  347. package/src/generated/spacedatastandards/plg/plugin-category.js +0 -15
  348. package/src/generated/spacedatastandards/plg/plugin-category.ts +0 -53
  349. package/src/generated/spacedatastandards/plg/plugin-dependency.js +0 -63
  350. package/src/generated/spacedatastandards/plg/plugin-dependency.ts +0 -86
  351. package/src/generated/spacedatastandards/plg/publication-state.js +0 -9
  352. package/src/generated/spacedatastandards/plg/purchase-tier.js +0 -9
  353. /package/src/generated/spacedatastandards/plg/{publication-state.ts → publicationState.ts} +0 -0
  354. /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
+ }