@zlink-systems/framework 0.25.0 → 0.27.0

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 (557) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Channels/IZLinkFanoutClient.d.ts +0 -6
  3. package/dist/contracts/Common/CoreTypes.d.ts +6 -0
  4. package/dist/contracts/Common/CoreTypes.js +7 -0
  5. package/dist/contracts/Common/index.d.ts +1 -1
  6. package/dist/contracts/Common/index.js +0 -1
  7. package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
  8. package/dist/contracts/Configuration/InternalDefaults.js +9 -1
  9. package/dist/contracts/Configuration/Registration.d.ts +13 -2
  10. package/dist/contracts/Configuration/Registration.js +58 -36
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
  12. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
  13. package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
  14. package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
  15. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  16. package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
  17. package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
  18. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
  19. package/dist/contracts/Handlers/JsonContract.js +10 -4
  20. package/dist/contracts/Locations/Authority.d.ts +1 -1
  21. package/dist/contracts/Locations/Authority.js +3 -2
  22. package/dist/contracts/Locations/Options.js +1 -1
  23. package/dist/contracts/Locations/Stores.d.ts +12 -0
  24. package/dist/contracts/Locations/Stores.js +9 -0
  25. package/dist/contracts/RouteMesh/RuntimeTopology.d.ts +8 -0
  26. package/dist/contracts/Spots/Contracts.d.ts +1 -1
  27. package/dist/internal.d.ts +5 -0
  28. package/dist/internal.js +16 -1
  29. package/dist/nest-integration.d.ts +4 -2
  30. package/dist/nest-integration.js +14 -4
  31. package/dist/runtime/abort.d.ts +1 -0
  32. package/dist/runtime/abort.js +8 -5
  33. package/dist/runtime/activation-admission.d.ts +28 -0
  34. package/dist/runtime/activation-admission.js +57 -0
  35. package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
  36. package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
  37. package/dist/runtime/actors/actor-client.d.ts +2 -2
  38. package/dist/runtime/actors/actor-client.js +42 -143
  39. package/dist/runtime/actors/actor-context.d.ts +3 -5
  40. package/dist/runtime/actors/actor-context.js +19 -17
  41. package/dist/runtime/actors/actor-handoff.d.ts +13 -7
  42. package/dist/runtime/actors/actor-handoff.js +36 -25
  43. package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
  44. package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
  45. package/dist/runtime/actors/actor-local-native-join.js +85 -123
  46. package/dist/runtime/actors/actor-native-lookup.js +2 -8
  47. package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
  48. package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
  49. package/dist/runtime/actors/actor-remote-joiner.d.ts +3 -3
  50. package/dist/runtime/actors/actor-remote-joiner.js +11 -17
  51. package/dist/runtime/actors/actor-remote-wire.js +5 -3
  52. package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
  53. package/dist/runtime/actors/actor-request-deadline.js +31 -0
  54. package/dist/runtime/actors/actor-retry-delay.js +2 -1
  55. package/dist/runtime/actors/actor-runtime-contracts.d.ts +4 -2
  56. package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
  57. package/dist/runtime/actors/actor-runtime-state.js +70 -187
  58. package/dist/runtime/actors/actor-source-transfer.d.ts +5 -5
  59. package/dist/runtime/actors/bound-session-wire.js +2 -7
  60. package/dist/runtime/actors/deferred-join-completion.d.ts +19 -0
  61. package/dist/runtime/actors/deferred-join-completion.js +21 -0
  62. package/dist/runtime/actors/index.d.ts +10 -8
  63. package/dist/runtime/actors/index.js +101 -73
  64. package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
  65. package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
  66. package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
  67. package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
  68. package/dist/runtime/admission.d.ts +7 -1
  69. package/dist/runtime/admission.js +11 -1
  70. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
  71. package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
  72. package/dist/runtime/backend/contracts/index.d.ts +8 -33
  73. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +3 -26
  74. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
  75. package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
  76. package/dist/runtime/backend/node/node-backend-adapter-factory.d.ts +1 -2
  77. package/dist/runtime/backend/node/node-backend-adapter-factory.js +4 -18
  78. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +7 -4
  79. package/dist/runtime/backend/node/node-backend-adapter-support.js +28 -34
  80. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
  81. package/dist/runtime/backend/node/node-event-loop-poller.js +11 -6
  82. package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
  83. package/dist/runtime/backend/node/node-raw-binding-port.d.ts +1 -1
  84. package/dist/runtime/backend/node/node-raw-binding-port.js +51 -19
  85. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +21 -19
  86. package/dist/runtime/backend/node/node-raw-mesh-backend.js +171 -111
  87. package/dist/runtime/backend/node/node-socket-backend-adapter.js +4 -3
  88. package/dist/runtime/backend/raw-binding-port.d.ts +13 -1
  89. package/dist/runtime/backend/runtime-values.d.ts +4 -1
  90. package/dist/runtime/backend/runtime-values.js +2 -0
  91. package/dist/runtime/channels/channel-clients.d.ts +20 -9
  92. package/dist/runtime/channels/channel-clients.js +68 -60
  93. package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
  94. package/dist/runtime/channels/channel-envelope.js +47 -29
  95. package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
  96. package/dist/runtime/channels/channel-outbound-operations.js +9 -18
  97. package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
  98. package/dist/runtime/channels/channel-receive-loops.js +27 -6
  99. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
  100. package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
  101. package/dist/runtime/channels/channel-runtime-manager.d.ts +2 -5
  102. package/dist/runtime/channels/channel-runtime-manager.js +4 -12
  103. package/dist/runtime/channels/channel-socket-options.js +3 -2
  104. package/dist/runtime/channels/channel-socket-registry.d.ts +30 -32
  105. package/dist/runtime/channels/channel-socket-registry.js +296 -235
  106. package/dist/runtime/channels/channel-transports.d.ts +11 -20
  107. package/dist/runtime/channels/channel-transports.js +68 -47
  108. package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
  109. package/dist/runtime/channels/client-server-location-runtime.js +10 -11
  110. package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
  111. package/dist/runtime/channels/client-server-service-wire.js +32 -11
  112. package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
  113. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  114. package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
  115. package/dist/runtime/channels/fanout-location-runtime.js +133 -81
  116. package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
  117. package/dist/runtime/channels/spot-direct-envelope.js +4 -3
  118. package/dist/runtime/channels/spot-node-route-transport.js +3 -2
  119. package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
  120. package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
  121. package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
  122. package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
  123. package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
  124. package/dist/runtime/diagnostics/flow-context.js +16 -2
  125. package/dist/runtime/diagnostics/index.d.ts +4 -2
  126. package/dist/runtime/diagnostics/index.js +14 -4
  127. package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
  128. package/dist/runtime/diagnostics/message-flow.js +10 -19
  129. package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
  130. package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
  131. package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
  132. package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
  133. package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
  134. package/dist/runtime/disposal.d.ts +5 -0
  135. package/dist/runtime/disposal.js +22 -0
  136. package/dist/runtime/execution/index.d.ts +22 -9
  137. package/dist/runtime/execution/index.js +107 -37
  138. package/dist/runtime/execution/serial-execution-queue.d.ts +12 -7
  139. package/dist/runtime/execution/serial-execution-queue.js +99 -26
  140. package/dist/runtime/execution/state-lane.d.ts +8 -1
  141. package/dist/runtime/execution/state-lane.js +118 -3
  142. package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
  143. package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
  144. package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
  145. package/dist/runtime/foundation/event-loop-resources.js +6 -119
  146. package/dist/runtime/foundation/listener-records.d.ts +11 -0
  147. package/dist/runtime/foundation/listener-records.js +20 -0
  148. package/dist/runtime/foundation/operation-identity.d.ts +2 -0
  149. package/dist/runtime/foundation/operation-identity.js +9 -5
  150. package/dist/runtime/foundation/operation-registry.d.ts +5 -7
  151. package/dist/runtime/foundation/operation-registry.js +34 -44
  152. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +18 -26
  153. package/dist/runtime/foundation/raw-service-mesh-runtime.js +122 -469
  154. package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
  155. package/dist/runtime/foundation/runtime-state-projections.js +8 -0
  156. package/dist/runtime/foundation/service-authority-payload-codec.d.ts +1 -0
  157. package/dist/runtime/foundation/service-authority-payload-codec.js +30 -12
  158. package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
  159. package/dist/runtime/foundation/service-discovery-registry.js +22 -3
  160. package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
  161. package/dist/runtime/foundation/service-liveness-registry.js +2 -1
  162. package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
  163. package/dist/runtime/foundation/service-maintenance-runtime.js +23 -8
  164. package/dist/runtime/foundation/service-metadata-codec.js +3 -3
  165. package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
  166. package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
  167. package/dist/runtime/foundation/service-relocation-coordinator.d.ts +9 -0
  168. package/dist/runtime/foundation/service-relocation-coordinator.js +14 -1
  169. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +8 -0
  170. package/dist/runtime/foundation/service-relocation-object-owner.js +19 -6
  171. package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
  172. package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
  173. package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
  174. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -19
  175. package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
  176. package/dist/runtime/foundation/service-stateful-registry.js +10 -2
  177. package/dist/runtime/foundation/service-stateful-runtime.d.ts +28 -24
  178. package/dist/runtime/foundation/service-stateful-runtime.js +297 -244
  179. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +12 -7
  180. package/dist/runtime/foundation/service-stateful-wire-codec.js +240 -143
  181. package/dist/runtime/foundation/service-topology-registry.d.ts +1 -3
  182. package/dist/runtime/foundation/service-topology-registry.js +22 -61
  183. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
  184. package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
  185. package/dist/runtime/foundation/service-wire-codec.js +10 -8
  186. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  187. package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
  188. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
  189. package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
  190. package/dist/runtime/framework-errors-internal.d.ts +2 -1
  191. package/dist/runtime/framework-errors-internal.js +343 -122
  192. package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
  193. package/dist/runtime/handlers/handler-instance-scope.js +61 -74
  194. package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
  195. package/dist/runtime/host/actor-packet-relay.js +48 -91
  196. package/dist/runtime/host/actor-placement-coordinator.js +7 -5
  197. package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
  198. package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
  199. package/dist/runtime/host/actor-transfer-runtime.d.ts +28 -28
  200. package/dist/runtime/host/actor-transfer-runtime.js +210 -256
  201. package/dist/runtime/host/application-job-queue.js +16 -33
  202. package/dist/runtime/host/bound-session-relay.js +1 -1
  203. package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
  204. package/dist/runtime/host/index.d.ts +19 -14
  205. package/dist/runtime/host/index.js +234 -175
  206. package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
  207. package/dist/runtime/host/instance-activation-authority.js +17 -45
  208. package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
  209. package/dist/runtime/host/location-runtime-owner.js +2 -2
  210. package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
  211. package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
  212. package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
  213. package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
  214. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
  215. package/dist/runtime/host/remote-bound-session-relay.js +11 -23
  216. package/dist/runtime/host/route-mesh-runtime.d.ts +14 -10
  217. package/dist/runtime/host/route-mesh-runtime.js +178 -257
  218. package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
  219. package/dist/runtime/host/runtime-shutdown.js +18 -21
  220. package/dist/runtime/host/service-relocation-control.js +6 -1
  221. package/dist/runtime/host/service-relocation-host-runtime.d.ts +71 -38
  222. package/dist/runtime/host/service-relocation-host-runtime.js +816 -651
  223. package/dist/runtime/host/spot-address-transport.d.ts +2 -3
  224. package/dist/runtime/host/spot-address-transport.js +34 -136
  225. package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
  226. package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
  227. package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -7
  228. package/dist/runtime/host/spot-runtime-options-factory.js +53 -21
  229. package/dist/runtime/host/stateful-authority-route-runtime.js +6 -2
  230. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +14 -6
  231. package/dist/runtime/host/user-spot-creation-coordinator.js +96 -95
  232. package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
  233. package/dist/runtime/locations/authority-key-codec.js +4 -3
  234. package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
  235. package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
  236. package/dist/runtime/locations/creation-operation-id.js +6 -4
  237. package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
  238. package/dist/runtime/locations/in-memory-authority-store.js +31 -15
  239. package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
  240. package/dist/runtime/locations/in-memory-location-store.js +17 -14
  241. package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
  242. package/dist/runtime/locations/in-memory-provider-location-store.js +79 -27
  243. package/dist/runtime/locations/key-codec.js +3 -2
  244. package/dist/runtime/locations/lease-tracker.d.ts +3 -5
  245. package/dist/runtime/locations/lease-tracker.js +7 -11
  246. package/dist/runtime/locations/lifecycle.d.ts +5 -10
  247. package/dist/runtime/locations/lifecycle.js +4 -33
  248. package/dist/runtime/locations/location-store-failure.d.ts +2 -0
  249. package/dist/runtime/locations/location-store-failure.js +7 -0
  250. package/dist/runtime/locations/location-store-pages.d.ts +3 -0
  251. package/dist/runtime/locations/location-store-pages.js +13 -0
  252. package/dist/runtime/locations/location-store-repository.d.ts +5 -7
  253. package/dist/runtime/locations/location-store-repository.js +303 -332
  254. package/dist/runtime/locations/relocation-blob.js +18 -5
  255. package/dist/runtime/locations/resolvers.d.ts +5 -5
  256. package/dist/runtime/locations/resolvers.js +44 -30
  257. package/dist/runtime/locations/runtime.d.ts +5 -4
  258. package/dist/runtime/locations/runtime.js +123 -92
  259. package/dist/runtime/locations/spot-location-claims.d.ts +8 -2
  260. package/dist/runtime/locations/spot-location-claims.js +40 -23
  261. package/dist/runtime/messaging/payload-codec.js +26 -20
  262. package/dist/runtime/messaging/submission-result.d.ts +3 -0
  263. package/dist/runtime/messaging/submission-result.js +48 -0
  264. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +2 -0
  265. package/dist/runtime/protocol/service_wire_codec.generated.js +17 -8
  266. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +1 -0
  267. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +3 -2
  268. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +3 -3
  269. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +4 -4
  270. package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +6 -3
  271. package/dist/runtime/spots/index.d.ts +29 -29
  272. package/dist/runtime/spots/index.js +441 -313
  273. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -4
  274. package/dist/runtime/spots/spot-activation-registry.js +27 -60
  275. package/dist/runtime/spots/spot-activation-state.d.ts +2 -11
  276. package/dist/runtime/spots/spot-activation-state.js +4 -17
  277. package/dist/runtime/spots/spot-activation.d.ts +10 -9
  278. package/dist/runtime/spots/spot-activation.js +103 -81
  279. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
  280. package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
  281. package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
  282. package/dist/runtime/spots/spot-actor-join-dispatch.js +5 -55
  283. package/dist/runtime/spots/spot-actor-lifecycle-drain.js +2 -2
  284. package/dist/runtime/spots/spot-actor-membership.d.ts +7 -5
  285. package/dist/runtime/spots/spot-actor-membership.js +44 -53
  286. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
  287. package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
  288. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
  289. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
  290. package/dist/runtime/spots/spot-context.d.ts +2 -2
  291. package/dist/runtime/spots/spot-entry-activation.d.ts +3 -4
  292. package/dist/runtime/spots/spot-entry-activation.js +9 -21
  293. package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
  294. package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
  295. package/dist/runtime/spots/spot-manager-public.js +6 -5
  296. package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
  297. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +22 -21
  298. package/dist/runtime/spots/spot-node-runtime-manager.js +73 -82
  299. package/dist/runtime/spots/spot-outbound.d.ts +4 -3
  300. package/dist/runtime/spots/spot-outbound.js +10 -37
  301. package/dist/runtime/spots/spot-remote-codec.js +5 -3
  302. package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
  303. package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
  304. package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
  305. package/dist/runtime/spots/spot-route-replies.js +3 -1
  306. package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -2
  307. package/dist/runtime/spots/spot-routed-actor-admission.js +3 -2
  308. package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +2 -7
  309. package/dist/runtime/spots/spot-routed-frame-dispatch.js +1 -70
  310. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
  311. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
  312. package/dist/runtime/spots/spot-runtime-ports.d.ts +4 -20
  313. package/dist/runtime/spots/spot-serial-executor.d.ts +5 -0
  314. package/dist/runtime/spots/spot-serial-executor.js +9 -2
  315. package/dist/runtime/spots/spot-serial-turn-executor.d.ts +29 -6
  316. package/dist/runtime/spots/spot-serial-turn-executor.js +89 -13
  317. package/dist/runtime/spots/spot-timer.d.ts +3 -2
  318. package/dist/runtime/streams/actor-session-binding-registry.d.ts +17 -32
  319. package/dist/runtime/streams/actor-session-binding-registry.js +145 -367
  320. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +2 -6
  321. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
  322. package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
  323. package/dist/runtime/streams/bound-session-service.d.ts +7 -0
  324. package/dist/runtime/streams/bound-session-service.js +12 -19
  325. package/dist/runtime/streams/index.d.ts +15 -14
  326. package/dist/runtime/streams/index.js +38 -39
  327. package/dist/runtime/streams/managed-stream.d.ts +3 -0
  328. package/dist/runtime/streams/managed-stream.js +17 -8
  329. package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
  330. package/dist/runtime/streams/protocol.d.ts +6 -33
  331. package/dist/runtime/streams/protocol.js +38 -110
  332. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
  333. package/dist/runtime/streams/session-actor-coordinator.js +12 -4
  334. package/dist/runtime/streams/session-calls.d.ts +1 -1
  335. package/dist/runtime/streams/session-calls.js +5 -4
  336. package/dist/runtime/streams/session-context.d.ts +6 -6
  337. package/dist/runtime/streams/session-context.js +22 -4
  338. package/dist/runtime/streams/session-requests.js +2 -1
  339. package/dist/runtime/streams/session-serial-executor.js +2 -2
  340. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
  341. package/dist/runtime/streams/stream-frame-factory.js +2 -2
  342. package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
  343. package/dist/runtime/streams/stream-session-runtime.js +25 -33
  344. package/dist/runtime/workers/index.d.ts +2 -2
  345. package/dist/runtime/workers/index.js +5 -4
  346. package/package.json +3 -3
  347. package/src/contracts/Channels/IZLinkFanoutClient.ts +0 -7
  348. package/src/contracts/Common/CoreTypes.ts +7 -0
  349. package/src/contracts/Common/index.ts +1 -1
  350. package/src/contracts/Configuration/InternalDefaults.ts +12 -0
  351. package/src/contracts/Configuration/Registration.ts +92 -48
  352. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
  353. package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
  354. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  355. package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
  356. package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
  357. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
  358. package/src/contracts/Handlers/JsonContract.ts +14 -4
  359. package/src/contracts/Locations/Authority.ts +7 -3
  360. package/src/contracts/Locations/Options.ts +1 -1
  361. package/src/contracts/Locations/Stores.ts +14 -0
  362. package/src/contracts/RouteMesh/RuntimeTopology.ts +10 -0
  363. package/src/contracts/Spots/Contracts.ts +1 -1
  364. package/src/internal.ts +15 -0
  365. package/src/nest-integration.ts +28 -10
  366. package/src/runtime/abort.ts +6 -5
  367. package/src/runtime/activation-admission.ts +72 -0
  368. package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
  369. package/src/runtime/actors/actor-client.ts +77 -204
  370. package/src/runtime/actors/actor-context.ts +45 -39
  371. package/src/runtime/actors/actor-handoff.ts +55 -45
  372. package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
  373. package/src/runtime/actors/actor-local-native-join.ts +174 -215
  374. package/src/runtime/actors/actor-native-lookup.ts +2 -9
  375. package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
  376. package/src/runtime/actors/actor-remote-joiner.ts +15 -36
  377. package/src/runtime/actors/actor-remote-wire.ts +5 -3
  378. package/src/runtime/actors/actor-request-deadline.ts +49 -0
  379. package/src/runtime/actors/actor-retry-delay.ts +2 -1
  380. package/src/runtime/actors/actor-runtime-contracts.ts +4 -10
  381. package/src/runtime/actors/actor-runtime-state.ts +85 -247
  382. package/src/runtime/actors/actor-source-transfer.ts +5 -18
  383. package/src/runtime/actors/bound-session-wire.ts +2 -8
  384. package/src/runtime/actors/deferred-join-completion.ts +44 -0
  385. package/src/runtime/actors/index.ts +122 -88
  386. package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
  387. package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
  388. package/src/runtime/admission.ts +13 -2
  389. package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
  390. package/src/runtime/backend/contracts/index.ts +15 -42
  391. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -28
  392. package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
  393. package/src/runtime/backend/node/node-backend-adapter-factory.ts +5 -25
  394. package/src/runtime/backend/node/node-backend-adapter-support.ts +32 -35
  395. package/src/runtime/backend/node/node-event-loop-poller.ts +16 -8
  396. package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
  397. package/src/runtime/backend/node/node-raw-binding-port.ts +58 -23
  398. package/src/runtime/backend/node/node-raw-mesh-backend.ts +252 -162
  399. package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -4
  400. package/src/runtime/backend/raw-binding-port.ts +14 -1
  401. package/src/runtime/backend/runtime-values.ts +4 -1
  402. package/src/runtime/channels/channel-clients.ts +132 -96
  403. package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
  404. package/src/runtime/channels/channel-envelope.ts +58 -29
  405. package/src/runtime/channels/channel-outbound-operations.ts +10 -31
  406. package/src/runtime/channels/channel-receive-loops.ts +39 -7
  407. package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
  408. package/src/runtime/channels/channel-runtime-manager.ts +8 -15
  409. package/src/runtime/channels/channel-socket-options.ts +8 -2
  410. package/src/runtime/channels/channel-socket-registry.ts +369 -262
  411. package/src/runtime/channels/channel-transports.ts +161 -115
  412. package/src/runtime/channels/client-server-location-runtime.ts +17 -17
  413. package/src/runtime/channels/client-server-service-wire.ts +40 -12
  414. package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
  415. package/src/runtime/channels/fanout-location-runtime.ts +175 -106
  416. package/src/runtime/channels/spot-direct-envelope.ts +1 -1
  417. package/src/runtime/channels/spot-node-route-transport.ts +5 -2
  418. package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
  419. package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
  420. package/src/runtime/diagnostics/flow-context.ts +16 -2
  421. package/src/runtime/diagnostics/index.ts +27 -17
  422. package/src/runtime/diagnostics/message-flow.ts +15 -25
  423. package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
  424. package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
  425. package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
  426. package/src/runtime/disposal.ts +19 -0
  427. package/src/runtime/execution/index.ts +116 -38
  428. package/src/runtime/execution/serial-execution-queue.ts +179 -34
  429. package/src/runtime/execution/state-lane.ts +142 -4
  430. package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
  431. package/src/runtime/foundation/event-loop-resources.ts +5 -122
  432. package/src/runtime/foundation/listener-records.ts +21 -0
  433. package/src/runtime/foundation/operation-identity.ts +11 -5
  434. package/src/runtime/foundation/operation-registry.ts +33 -50
  435. package/src/runtime/foundation/raw-service-mesh-runtime.ts +170 -571
  436. package/src/runtime/foundation/runtime-state-projections.ts +9 -1
  437. package/src/runtime/foundation/service-authority-payload-codec.ts +41 -13
  438. package/src/runtime/foundation/service-discovery-registry.ts +32 -3
  439. package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
  440. package/src/runtime/foundation/service-liveness-registry.ts +2 -1
  441. package/src/runtime/foundation/service-maintenance-runtime.ts +30 -19
  442. package/src/runtime/foundation/service-metadata-codec.ts +2 -2
  443. package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
  444. package/src/runtime/foundation/service-relocation-coordinator.ts +13 -0
  445. package/src/runtime/foundation/service-relocation-object-owner.ts +23 -7
  446. package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
  447. package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
  448. package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -25
  449. package/src/runtime/foundation/service-stateful-registry.ts +14 -2
  450. package/src/runtime/foundation/service-stateful-runtime.ts +435 -327
  451. package/src/runtime/foundation/service-stateful-wire-codec.ts +329 -199
  452. package/src/runtime/foundation/service-topology-registry.ts +30 -79
  453. package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
  454. package/src/runtime/foundation/service-wire-codec.ts +15 -8
  455. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  456. package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
  457. package/src/runtime/framework-errors-internal.ts +380 -134
  458. package/src/runtime/handlers/handler-instance-scope.ts +68 -95
  459. package/src/runtime/host/actor-packet-relay.ts +57 -147
  460. package/src/runtime/host/actor-placement-coordinator.ts +8 -5
  461. package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
  462. package/src/runtime/host/actor-transfer-runtime.ts +266 -418
  463. package/src/runtime/host/application-job-queue.ts +28 -34
  464. package/src/runtime/host/bound-session-relay.ts +1 -2
  465. package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
  466. package/src/runtime/host/index.ts +408 -312
  467. package/src/runtime/host/instance-activation-authority.ts +89 -109
  468. package/src/runtime/host/location-runtime-owner.ts +4 -2
  469. package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
  470. package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
  471. package/src/runtime/host/remote-bound-session-relay.ts +12 -44
  472. package/src/runtime/host/route-mesh-runtime.ts +236 -275
  473. package/src/runtime/host/runtime-shutdown.ts +17 -21
  474. package/src/runtime/host/service-relocation-control.ts +14 -1
  475. package/src/runtime/host/service-relocation-host-runtime.ts +1161 -904
  476. package/src/runtime/host/spot-address-transport.ts +73 -195
  477. package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
  478. package/src/runtime/host/spot-runtime-options-factory.ts +92 -30
  479. package/src/runtime/host/stateful-authority-route-runtime.ts +8 -4
  480. package/src/runtime/host/user-spot-creation-coordinator.ts +182 -163
  481. package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
  482. package/src/runtime/locations/authority-key-codec.ts +7 -3
  483. package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
  484. package/src/runtime/locations/creation-operation-id.ts +6 -3
  485. package/src/runtime/locations/domain-store-contract.ts +12 -3
  486. package/src/runtime/locations/in-memory-authority-store.ts +44 -15
  487. package/src/runtime/locations/in-memory-location-store.ts +50 -39
  488. package/src/runtime/locations/in-memory-provider-location-store.ts +110 -31
  489. package/src/runtime/locations/key-codec.ts +3 -2
  490. package/src/runtime/locations/lease-tracker.ts +8 -14
  491. package/src/runtime/locations/lifecycle.ts +16 -45
  492. package/src/runtime/locations/location-store-failure.ts +4 -0
  493. package/src/runtime/locations/location-store-pages.ts +18 -0
  494. package/src/runtime/locations/location-store-repository.ts +450 -478
  495. package/src/runtime/locations/relocation-blob.ts +17 -6
  496. package/src/runtime/locations/resolvers.ts +90 -58
  497. package/src/runtime/locations/runtime.ts +220 -110
  498. package/src/runtime/locations/spot-location-claims.ts +54 -26
  499. package/src/runtime/messaging/payload-codec.ts +35 -24
  500. package/src/runtime/messaging/submission-result.ts +57 -1
  501. package/src/runtime/protocol/service_wire_codec.generated.ts +27 -10
  502. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +4 -4
  503. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +6 -6
  504. package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +6 -3
  505. package/src/runtime/spots/index.ts +687 -437
  506. package/src/runtime/spots/spot-activation-registry.ts +42 -71
  507. package/src/runtime/spots/spot-activation-state.ts +4 -16
  508. package/src/runtime/spots/spot-activation.ts +167 -115
  509. package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
  510. package/src/runtime/spots/spot-actor-join-dispatch.ts +25 -79
  511. package/src/runtime/spots/spot-actor-lifecycle-drain.ts +20 -18
  512. package/src/runtime/spots/spot-actor-membership.ts +107 -75
  513. package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
  514. package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
  515. package/src/runtime/spots/spot-context.ts +3 -3
  516. package/src/runtime/spots/spot-entry-activation.ts +13 -33
  517. package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
  518. package/src/runtime/spots/spot-manager-public.ts +29 -21
  519. package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
  520. package/src/runtime/spots/spot-node-runtime-manager.ts +145 -140
  521. package/src/runtime/spots/spot-outbound.ts +47 -68
  522. package/src/runtime/spots/spot-remote-codec.ts +7 -3
  523. package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
  524. package/src/runtime/spots/spot-route-replies.ts +6 -4
  525. package/src/runtime/spots/spot-routed-actor-admission.ts +13 -6
  526. package/src/runtime/spots/spot-routed-frame-dispatch.ts +6 -77
  527. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
  528. package/src/runtime/spots/spot-runtime-ports.ts +10 -43
  529. package/src/runtime/spots/spot-serial-executor.ts +10 -2
  530. package/src/runtime/spots/spot-serial-turn-executor.ts +120 -13
  531. package/src/runtime/spots/spot-timer.ts +3 -2
  532. package/src/runtime/streams/actor-session-binding-registry.ts +182 -560
  533. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +1 -19
  534. package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
  535. package/src/runtime/streams/bound-session-service.ts +23 -37
  536. package/src/runtime/streams/index.ts +102 -88
  537. package/src/runtime/streams/managed-stream.ts +29 -10
  538. package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
  539. package/src/runtime/streams/protocol.ts +34 -88
  540. package/src/runtime/streams/session-actor-coordinator.ts +17 -5
  541. package/src/runtime/streams/session-calls.ts +6 -5
  542. package/src/runtime/streams/session-context.ts +54 -10
  543. package/src/runtime/streams/session-requests.ts +2 -1
  544. package/src/runtime/streams/session-serial-executor.ts +2 -2
  545. package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
  546. package/src/runtime/streams/stream-frame-factory.ts +2 -3
  547. package/src/runtime/streams/stream-session-runtime.ts +57 -59
  548. package/src/runtime/workers/index.ts +13 -12
  549. package/dist/runtime/actors/deferred-join-accepted-journal.d.ts +0 -47
  550. package/dist/runtime/actors/deferred-join-accepted-journal.js +0 -992
  551. package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
  552. package/dist/runtime/actors/post-commit-actor-location.js +0 -72
  553. package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
  554. package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
  555. package/src/runtime/actors/deferred-join-accepted-journal.ts +0 -1346
  556. package/src/runtime/actors/post-commit-actor-location.ts +0 -121
  557. package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
@@ -1,7 +1,8 @@
1
+ import { ZLINK_DEFAULT_PUBLIC_WEIGHT } from '../../../contracts/Configuration/RegistrationBuilderPolicy';
1
2
  import type { Socket } from '@zlink-systems/zlink';
2
3
  import type { ZLinkBackendObject } from '../contracts';
3
4
  import {
4
- closeWithBusyRetry,
5
+ closeBindingHandle,
5
6
  disableSocketLinger,
6
7
  isBindingNotFound,
7
8
  isContextTerminatedError,
@@ -52,7 +53,7 @@ export function wrapSocket<T extends { close(): void }>(
52
53
  async dispose(): Promise<void> {
53
54
  eventLoopPoller?.dispose();
54
55
  disableSocketLinger(nativeInstance);
55
- await closeWithBusyRetry(nativeInstance);
56
+ closeBindingHandle(nativeInstance);
56
57
  },
57
58
  close(): void {
58
59
  eventLoopPoller?.dispose();
@@ -114,7 +115,7 @@ export function wrapSocket<T extends { close(): void }>(
114
115
  );
115
116
  },
116
117
  get peerWeight(): number {
117
- return socket.options?.peerWeight ?? 100;
118
+ return socket.options?.peerWeight ?? ZLINK_DEFAULT_PUBLIC_WEIGHT;
118
119
  },
119
120
  set peerWeight(value: number) {
120
121
  requireSocketOptions(socket).peerWeight = value;
@@ -381,7 +382,7 @@ export function isEndpointCloseIgnorableError(error: unknown): boolean {
381
382
  isContextTerminatedError(error) ||
382
383
  (error instanceof Error &&
383
384
  'code' in error &&
384
- ((error as { code: unknown }).code === 604 ||
385
+ ((error as { code: unknown }).code === zlink.ConnectResult.InternalError ||
385
386
  (error as { code: unknown }).code === zlink.ConnectResult.NotFound))
386
387
  );
387
388
  }
@@ -2,6 +2,11 @@ export interface ZLinkRawReceivedRecord {
2
2
  readonly sourceRid: string;
3
3
  readonly sourceRoute: Uint8Array;
4
4
  readonly requestSeq?: bigint;
5
+ /**
6
+ * Core selected-route generation of the ROUTER route that delivered this
7
+ * record (Core ROUTER §10.1); 0n for a non-ROUTER receive. Equality only.
8
+ */
9
+ readonly routeGeneration: bigint;
5
10
  readonly reply?: (parts: readonly Uint8Array[]) => void;
6
11
  readonly parts: readonly Buffer[];
7
12
  /** Releases the ordinary Framework-owned receive record exactly once. */
@@ -21,7 +26,7 @@ export interface ZLinkRawMonitorRecord {
21
26
  }
22
27
 
23
28
  export interface ZLinkRawSocketPort {
24
- setReadableHandler(handler: () => void): void;
29
+ setReadableHandler(handler: (receiveReady: boolean, routeReady: boolean) => void): void;
25
30
  bind(endpoint: string): void;
26
31
  unbind(endpoint: string): void;
27
32
  connect(endpoint: string): void;
@@ -37,6 +42,12 @@ export interface ZLinkRawMonitorPort {
37
42
  close(): void;
38
43
  }
39
44
 
45
+ /** One row of the ROUTER selected-route snapshot (Core ROUTER §10.1). */
46
+ export interface ZLinkRawRouterRoute {
47
+ readonly routingId: string;
48
+ readonly routeGeneration: bigint;
49
+ }
50
+
40
51
  export interface ZLinkRawRouterPort extends ZLinkRawSocketPort {
41
52
  disconnectRid?(routingId: string): void;
42
53
  localEndpoint(): string;
@@ -49,6 +60,8 @@ export interface ZLinkRawRouterPort extends ZLinkRawSocketPort {
49
60
  timeoutMs: number
50
61
  ): Promise<readonly Buffer[]>;
51
62
  receive(dontWait?: boolean): ZLinkRawReceivedRecord | undefined;
63
+ /** The selected route of every RID. The socket's one route observer calls it. */
64
+ routesSnapshot(): readonly ZLinkRawRouterRoute[];
52
65
  }
53
66
 
54
67
  export interface ZLinkRawDealerPort extends ZLinkRawSocketPort {
@@ -46,11 +46,14 @@ export class ZLinkBackendResultError extends Error {
46
46
  readonly operation: 'request' | 'submit',
47
47
  readonly result: number,
48
48
  readonly nativeErrno?: number,
49
- options?: ErrorOptions
49
+ options?: ErrorOptions & { readonly phase?: 'submit' | 'completion' }
50
50
  ) {
51
51
  super(`Backend ${operation} failed with result ${result}.`, options);
52
52
  this.name = 'ZLinkBackendResultError';
53
+ this.phase = options?.phase ?? 'completion';
53
54
  }
55
+
56
+ readonly phase: 'submit' | 'completion';
54
57
  }
55
58
 
56
59
  export function isZLinkBackendResultError(error: unknown): error is ZLinkBackendResultError {
@@ -1,3 +1,4 @@
1
+ import { DEFAULT_REQUEST_TIMEOUT_MS } from '../../contracts/Configuration/Registration';
1
2
  import type {
2
3
  ZLinkChannelClient,
3
4
  ZLinkChannelRequestCall,
@@ -43,68 +44,76 @@ import {
43
44
  } from '../spots/spot-outbound';
44
45
  import { resolveFrameworkPacketName } from '../messaging/packet-name';
45
46
 
46
- export class DefaultZLinkChannelClient implements ZLinkChannelClient {
47
- constructor(
48
- private readonly registration: ZLinkFrameworkRegistration,
49
- private readonly transport?: ZLinkChannelClientTransportSource
50
- ) {}
47
+ type RouteMeshChannelMatch = {
48
+ readonly meshName: string;
49
+ readonly mesh: NonNullable<ReturnType<ZLinkFrameworkRegistration['spotNodes']['get']>>;
50
+ };
51
51
 
52
- sendToChannel(channelName: string, message: unknown): ZLinkSendCall {
53
- return new DefaultZLinkSendCall(
54
- () => this.requireChannel(channelName),
55
- async (packetName, metadata, signal) =>
56
- normalizeSubmitResult(
57
- await this.requireTransport().send(channelName, packetName, message, signal, metadata)
58
- )
59
- );
60
- }
52
+ type ChannelRouteResolution =
53
+ | {
54
+ readonly kind: 'client-server';
55
+ readonly channel: NonNullable<ReturnType<ZLinkFrameworkRegistration['channels']['get']>>;
56
+ }
57
+ | { readonly kind: 'route-mesh'; readonly matches: readonly RouteMeshChannelMatch[] };
58
+
59
+ type ResolvedChannelRoute =
60
+ | Extract<ChannelRouteResolution, { readonly kind: 'client-server' }>
61
+ | {
62
+ readonly kind: 'route-mesh';
63
+ readonly meshName: string;
64
+ readonly mesh: RouteMeshChannelMatch['mesh'];
65
+ };
66
+
67
+ export function resolveChannelRoute(
68
+ registration: ZLinkFrameworkRegistration,
69
+ channelName: string
70
+ ): ChannelRouteResolution | undefined {
71
+ const clientServerChannel = registration.channels.get(channelName);
72
+ if (clientServerChannel !== undefined) {
73
+ return { kind: 'client-server', channel: clientServerChannel };
74
+ }
75
+
76
+ const matches = [...registration.spotNodes.entries()]
77
+ .filter(([, mesh]) =>
78
+ Object.prototype.hasOwnProperty.call(mesh.meshChannels ?? {}, channelName)
79
+ )
80
+ .map(([meshName, mesh]) => ({ meshName, mesh }));
81
+ return matches.length === 0 ? undefined : { kind: 'route-mesh', matches };
82
+ }
61
83
 
62
- requestToChannel(channelName: string, request: unknown): ZLinkChannelRequestCall {
63
- return new DefaultZLinkRequestCall(
64
- () => this.requireChannel(channelName),
65
- (packetName, timeoutMs, metadata, signal) =>
66
- this.requireTransport().request(
67
- channelName,
68
- packetName,
69
- request,
70
- timeoutMs,
71
- signal,
72
- metadata
73
- ),
74
- this.defaultRequestTimeout(channelName)
75
- );
84
+ export function requireUniqueRouteMeshChannel(
85
+ matches: readonly RouteMeshChannelMatch[],
86
+ duplicateMessage: string
87
+ ): RouteMeshChannelMatch {
88
+ if (matches.length !== 1) {
89
+ throw new ZLinkConfigurationException(duplicateMessage);
76
90
  }
91
+ return matches[0]!;
92
+ }
77
93
 
78
- private defaultRequestTimeout(channelName: string): number {
79
- return (
80
- this.registration.channels.get(channelName)?.requestTimeoutMs ??
81
- this.registration.requestTimeoutMs ??
82
- 30_000
94
+ export class DefaultZLinkChannelClient implements ZLinkChannelClient {
95
+ private readonly routeClient: DefaultZLinkRouteClient;
96
+
97
+ constructor(
98
+ registration: ZLinkFrameworkRegistration,
99
+ channelTransport?: ZLinkChannelClientTransportSource,
100
+ routeTransport?: ZLinkRouteClientTransport,
101
+ spotRouterChannelIdForMesh: (meshName: string) => string = (meshName) => meshName
102
+ ) {
103
+ this.routeClient = new DefaultZLinkRouteClient(
104
+ registration,
105
+ routeTransport,
106
+ spotRouterChannelIdForMesh,
107
+ channelTransport
83
108
  );
84
109
  }
85
110
 
86
- private requireChannel(channelName: string): void {
87
- const channel = this.registration.channels.get(channelName);
88
- if (channel === undefined) {
89
- throw createInternalFrameworkException(
90
- ZLinkFrameworkInternalErrorKind.RequestTargetNotFound,
91
- `Channel client '${channelName}' is not registered.`
92
- );
93
- }
94
- if (channel.client === undefined) {
95
- throw createInternalFrameworkException(
96
- ZLinkFrameworkInternalErrorKind.InvalidConfiguration,
97
- `Channel client role '${channelName}' is not configured.`
98
- );
99
- }
111
+ sendToChannel(channelName: string, message: unknown): ZLinkSendCall {
112
+ return this.routeClient.sendToChannel(channelName, message);
100
113
  }
101
114
 
102
- private requireTransport(): ZLinkChannelClientTransport {
103
- const transport = typeof this.transport === 'function' ? this.transport() : this.transport;
104
- if (transport === undefined) {
105
- throw new ZLinkConfigurationException('Channel runtime is not started.');
106
- }
107
- return transport;
115
+ requestToChannel(channelName: string, request: unknown): ZLinkChannelRequestCall {
116
+ return this.routeClient.requestToChannel(channelName, request);
108
117
  }
109
118
  }
110
119
 
@@ -138,17 +147,6 @@ export class DefaultZLinkFanoutClient implements ZLinkFanoutClient {
138
147
  );
139
148
  }
140
149
 
141
- getListenerStatus(channelName: string): import('../../contracts').ZLinkFanoutListenerStatus {
142
- this.requirePublisherChannel(channelName);
143
- const status = this.requireTransport().getFanoutListenerStatus?.(channelName);
144
- if (status === undefined) {
145
- throw new ZLinkConfigurationException(
146
- `Fanout publisher '${channelName}' has not reported a bound listener.`
147
- );
148
- }
149
- return status;
150
- }
151
-
152
150
  private requirePublisherChannel(channelName: string): void {
153
151
  if (!this.registration.fanoutPublishers.has(channelName)) {
154
152
  throw new ZLinkConfigurationException(
@@ -171,7 +169,8 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
171
169
  private readonly registration: ZLinkFrameworkRegistration,
172
170
  private readonly transport?: ZLinkRouteClientTransport,
173
171
  private readonly spotRouterChannelIdForMesh: (meshName: string) => string = (meshName) =>
174
- meshName
172
+ meshName,
173
+ private readonly channelTransport?: ZLinkChannelClientTransportSource
175
174
  ) {}
176
175
 
177
176
  sendToNode(meshName: string, targetNodeRid: string, message: unknown): ZLinkSendCall {
@@ -210,14 +209,23 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
210
209
 
211
210
  sendToChannel(channelName: string, message: unknown): ZLinkSendCall {
212
211
  return new DefaultZLinkSendCall(
213
- () => {
214
- this.resolveMeshChannel(channelName);
215
- },
212
+ () => this.requireChannelRoute(channelName),
216
213
  async (packetName, metadata, signal) => {
217
- const meshName = this.resolveMeshChannel(channelName);
214
+ const route = this.requireChannelRoute(channelName);
215
+ if (route.kind === 'route-mesh') {
216
+ return normalizeSubmitResult(
217
+ await this.requireTransport().submitToChannel(
218
+ route.meshName,
219
+ channelName,
220
+ packetName,
221
+ message,
222
+ signal,
223
+ metadata
224
+ )
225
+ );
226
+ }
218
227
  return normalizeSubmitResult(
219
- await this.requireTransport().submitToChannel(
220
- meshName,
228
+ await this.requireChannelTransport().send(
221
229
  channelName,
222
230
  packetName,
223
231
  message,
@@ -231,13 +239,21 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
231
239
 
232
240
  requestToChannel(channelName: string, request: unknown): ZLinkChannelRequestCall {
233
241
  return new DefaultZLinkRequestCall(
234
- () => {
235
- this.resolveMeshChannel(channelName);
236
- },
242
+ () => this.requireChannelRoute(channelName),
237
243
  (packetName, timeoutMs, metadata, signal) => {
238
- const meshName = this.resolveMeshChannel(channelName);
239
- return this.requireTransport().requestToChannel(
240
- meshName,
244
+ const route = this.requireChannelRoute(channelName);
245
+ if (route.kind === 'route-mesh') {
246
+ return this.requireTransport().requestToChannel(
247
+ route.meshName,
248
+ channelName,
249
+ packetName,
250
+ request,
251
+ timeoutMs,
252
+ signal,
253
+ metadata
254
+ );
255
+ }
256
+ return this.requireChannelTransport().request(
241
257
  channelName,
242
258
  packetName,
243
259
  request,
@@ -278,7 +294,7 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
278
294
  metadata,
279
295
  spotRouterChannelIdForMesh: this.spotRouterChannelIdForMesh
280
296
  }),
281
- this.registration.requestTimeoutMs ?? 30_000
297
+ this.registration.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS
282
298
  );
283
299
  }
284
300
 
@@ -287,7 +303,7 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
287
303
  this.registration.spotNodes.get(meshName)?.requestTimeoutMs ??
288
304
  this.registration.routeChannelOptions.get(meshName)?.requestTimeoutMs ??
289
305
  this.registration.requestTimeoutMs ??
290
- 30_000
306
+ DEFAULT_REQUEST_TIMEOUT_MS
291
307
  );
292
308
  }
293
309
 
@@ -300,31 +316,42 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
300
316
  }
301
317
  }
302
318
 
303
- private resolveMeshChannel(channelName: string): string {
304
- const matches = [...this.registration.spotNodes.entries()]
305
- .filter(([, mesh]) =>
306
- Object.prototype.hasOwnProperty.call(mesh.meshChannels ?? {}, channelName)
307
- )
308
- .map(([meshName]) => meshName);
309
- if (matches.length === 0) {
319
+ private requireChannelRoute(channelName: string): ResolvedChannelRoute {
320
+ const resolution = resolveChannelRoute(this.registration, channelName);
321
+ if (resolution === undefined) {
310
322
  throw createInternalFrameworkException(
311
323
  ZLinkFrameworkInternalErrorKind.RequestTargetNotFound,
312
- `RouteMesh channel '${channelName}' is not registered.`
324
+ `ChannelName '${channelName}' is not registered.`
313
325
  );
314
326
  }
315
- if (matches.length !== 1) {
316
- throw new ZLinkConfigurationException(
317
- `RouteMesh channel '${channelName}' must be unique across the Framework host.`
318
- );
327
+ if (resolution.kind === 'client-server') {
328
+ if (resolution.channel.client === undefined) {
329
+ throw createInternalFrameworkException(
330
+ ZLinkFrameworkInternalErrorKind.InvalidConfiguration,
331
+ `Channel client role '${channelName}' is not configured.`
332
+ );
333
+ }
334
+ return resolution;
319
335
  }
320
- return matches[0]!;
336
+
337
+ return {
338
+ kind: 'route-mesh',
339
+ ...requireUniqueRouteMeshChannel(
340
+ resolution.matches,
341
+ `RouteMesh channel '${channelName}' must be unique across the Framework host.`
342
+ )
343
+ };
321
344
  }
322
345
 
323
346
  private defaultRequestTimeoutForChannel(channelName: string): number {
324
- const match = [...this.registration.spotNodes.entries()].find(([, mesh]) =>
325
- Object.prototype.hasOwnProperty.call(mesh.meshChannels ?? {}, channelName)
326
- );
327
- return match?.[1].requestTimeoutMs ?? this.registration.requestTimeoutMs ?? 30_000;
347
+ const route = resolveChannelRoute(this.registration, channelName);
348
+ const timeoutMs =
349
+ route?.kind === 'client-server'
350
+ ? route.channel.requestTimeoutMs
351
+ : route?.kind === 'route-mesh'
352
+ ? route.matches[0]?.mesh.requestTimeoutMs
353
+ : undefined;
354
+ return timeoutMs ?? this.registration.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
328
355
  }
329
356
 
330
357
  private requireTransport(): ZLinkRouteClientTransport {
@@ -334,6 +361,15 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
334
361
  return this.transport;
335
362
  }
336
363
 
364
+ private requireChannelTransport(): ZLinkChannelClientTransport {
365
+ const transport =
366
+ typeof this.channelTransport === 'function' ? this.channelTransport() : this.channelTransport;
367
+ if (transport === undefined) {
368
+ throw new ZLinkConfigurationException('Channel runtime is not started.');
369
+ }
370
+ return transport;
371
+ }
372
+
337
373
  private requireSpotTransport(): ZLinkSpotRoutedTransport {
338
374
  const transport = this.requireTransport();
339
375
  if (transport.sendToSpot === undefined || transport.requestToSpot === undefined) {
@@ -1,3 +1,4 @@
1
+ import { ZlinkStreamContentType } from '@zlink-systems/stream-wire';
1
2
  import type { Message } from '../../contracts/Common/Message';
2
3
  import type { ZLinkFlowOrigin } from '../../contracts';
3
4
  import {
@@ -80,7 +81,7 @@ export function malformedProtocolErrorRequestHeader(
80
81
  kind: ZLinkChannelMessageKind.Request,
81
82
  channelName,
82
83
  messageName: info.messageName ?? '',
83
- contentType: 'application/json',
84
+ contentType: ZlinkStreamContentType.Json,
84
85
  correlationId: info.correlationId ?? null,
85
86
  deadline: null,
86
87
  topic: null,
@@ -1,6 +1,7 @@
1
1
  import type { Message } from '../../contracts/Common/Message';
2
2
  import type { ZLinkBackendMessageLike as MessageLike } from '../backend/runtime-values';
3
3
  import { randomUUID } from 'node:crypto';
4
+ import { isUtf8 } from 'node:buffer';
4
5
  import {
5
6
  ZLinkFrameworkErrorKind,
6
7
  ZLinkFrameworkException,
@@ -20,6 +21,7 @@ import { selectSerializerWithContentType } from '../messaging/payload-codec';
20
21
  import { isCanonicalCodecContentType } from '../../contracts/Configuration/CodecContentType';
21
22
  import { parseFrameworkJsonV1, stringifyFrameworkJsonV1 } from '../messaging/framework-json-v1';
22
23
  import { currentOrCreateFlow } from '../diagnostics/flow-context';
24
+ import { SERVICE_WIRE_METADATA_BYTES } from '../foundation/service-wire-constants.generated';
23
25
  import { codecsForFrameworkPacket } from './channel-framework-packets';
24
26
  import { readZLinkPacketJsonContract } from '../../contracts/Handlers/Attributes';
25
27
  import type { ZLinkJsonSchema } from '../../contracts/Handlers/JsonContract';
@@ -614,7 +616,24 @@ function writeChannelHeader(
614
616
  writer.append(',"source":');
615
617
  writer.nullableString(source);
616
618
  }
617
- writer.append(',"metadata":{');
619
+ writer.append(',"metadata":');
620
+ writeApplicationMetadata(writer, metadata);
621
+ if (flowId !== undefined) {
622
+ writer.append(',"flowId":');
623
+ writer.string(flowId);
624
+ }
625
+ if (flowOrigin !== undefined) {
626
+ writer.append(',"flowOrigin":');
627
+ writer.append(String(encodeFlowOrigin(flowOrigin)));
628
+ }
629
+ writer.append('}');
630
+ }
631
+
632
+ function writeApplicationMetadata(
633
+ writer: ChannelHeaderWriter,
634
+ metadata: Readonly<Record<string, string>>
635
+ ): void {
636
+ writer.append('{');
618
637
  let first = true;
619
638
  for (const name in metadata) {
620
639
  if (!Object.prototype.hasOwnProperty.call(metadata, name)) continue;
@@ -625,15 +644,6 @@ function writeChannelHeader(
625
644
  writer.string(metadata[name]!);
626
645
  }
627
646
  writer.append('}');
628
- if (flowId !== undefined) {
629
- writer.append(',"flowId":');
630
- writer.string(flowId);
631
- }
632
- if (flowOrigin !== undefined) {
633
- writer.append(',"flowOrigin":');
634
- writer.append(String(encodeFlowOrigin(flowOrigin)));
635
- }
636
- writer.append('}');
637
647
  }
638
648
 
639
649
  class ChannelHeaderWriter {
@@ -744,14 +754,20 @@ function parseWireJson(payload: string, schema?: ZLinkJsonSchema): unknown {
744
754
  }
745
755
 
746
756
  function parseChannelHeaderBytes(payload: Buffer): unknown {
747
- return tryParseCanonicalChannelHeader(payload) ?? parseWireJson(payload.toString());
757
+ if (!isUtf8(payload)) {
758
+ throw new ZLinkFrameworkException(
759
+ ZLinkFrameworkErrorKind.ProtocolError,
760
+ 'Channel envelope header must contain valid UTF-8.'
761
+ );
762
+ }
763
+ return tryParseCanonicalChannelHeader(payload) ?? parseFrameworkJsonV1(payload.toString());
748
764
  }
749
765
 
750
766
  /**
751
767
  * Accept the byte layout emitted by writeChannelHeader without materializing
752
768
  * the enclosing JSON text. Any variation falls through to the established
753
769
  * framework-json-v1 parser, which remains the sole authority for JSON
754
- * failures, unknown properties, and prototype-key rejection.
770
+ * failures and unknown properties. Header metadata accepts every valid string key.
755
771
  */
756
772
  function tryParseCanonicalChannelHeader(payload: Buffer): Record<string, unknown> | undefined {
757
773
  const reader = new CanonicalChannelHeaderReader(payload);
@@ -1019,38 +1035,51 @@ const EMPTY_APPLICATION_METADATA: Readonly<Record<string, string>> = Object.free
1019
1035
  function applicationMetadataRecord(
1020
1036
  metadata: ReadonlyMap<string, string>
1021
1037
  ): Readonly<Record<string, string>> {
1022
- // The common case carries no metadata; skip the record + JSON.stringify
1023
- // byte-limit walk entirely.
1024
1038
  if (metadata.size === 0) return EMPTY_APPLICATION_METADATA;
1025
- const record: Record<string, string> = {};
1026
- for (const [key, value] of metadata) {
1027
- if (key.length === 0 || key.includes('\0') || value.includes('\0')) {
1039
+ const record: Record<string, string> = Object.create(null) as Record<string, string>;
1040
+ for (const [key, value] of metadata) record[key] = value;
1041
+ return validateApplicationMetadata(record);
1042
+ }
1043
+
1044
+ const INVALID_METADATA_UNICODE =
1045
+ /[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/u;
1046
+
1047
+ function validateApplicationMetadata(
1048
+ metadata: Record<string, unknown>
1049
+ ): Readonly<Record<string, string>> {
1050
+ const keys = Object.keys(metadata);
1051
+ if (keys.length === 0) return EMPTY_APPLICATION_METADATA;
1052
+ for (const key of keys) {
1053
+ const value = requireString(metadata[key], `metadata.${key}`);
1054
+ if (
1055
+ key.length === 0 ||
1056
+ key.includes('\0') ||
1057
+ value.includes('\0') ||
1058
+ INVALID_METADATA_UNICODE.test(key) ||
1059
+ INVALID_METADATA_UNICODE.test(value)
1060
+ ) {
1028
1061
  throw new ZLinkConfigurationException(
1029
- 'Channel application metadata keys must be non-empty and keys and values must not contain NUL.'
1062
+ 'Channel application metadata keys must be non-empty and keys and values must be valid Unicode without NUL.'
1030
1063
  );
1031
1064
  }
1032
- record[key] = value;
1033
1065
  }
1034
- if (Buffer.byteLength(JSON.stringify(record), 'utf8') > 1024) {
1066
+ const record = metadata as Record<string, string>;
1067
+ const writer = new ChannelHeaderWriter();
1068
+ writeApplicationMetadata(writer, record);
1069
+ if (writer.byteLength > SERVICE_WIRE_METADATA_BYTES) {
1035
1070
  throw new ZLinkConfigurationException(
1036
- 'Channel application metadata exceeds the 1024-byte limit.'
1071
+ `Channel application metadata exceeds the ${SERVICE_WIRE_METADATA_BYTES}-byte limit.`
1037
1072
  );
1038
1073
  }
1039
1074
  return Object.freeze(record);
1040
1075
  }
1041
1076
 
1042
1077
  function requireApplicationMetadata(value: unknown): Readonly<Record<string, string>> {
1043
- if (value === undefined) {
1044
- return Object.freeze({});
1045
- }
1078
+ if (value === undefined) return EMPTY_APPLICATION_METADATA;
1046
1079
  if (!isRecord(value)) {
1047
1080
  throw new ZLinkConfigurationException('Channel application metadata must be a JSON object.');
1048
1081
  }
1049
- const metadata = new Map<string, string>();
1050
- for (const [key, selectedValue] of Object.entries(value)) {
1051
- metadata.set(key, requireString(selectedValue, `metadata.${key}`));
1052
- }
1053
- return applicationMetadataRecord(metadata);
1082
+ return validateApplicationMetadata(value);
1054
1083
  }
1055
1084
 
1056
1085
  function optionalFlowId(value: unknown): string | undefined {
@@ -72,11 +72,7 @@ export class ZLinkChannelOutboundOperations {
72
72
  throwIfAborted(signal);
73
73
  const dealer = await this.sockets.awaitClientDealerForOutbound(channelName, signal);
74
74
  if (dealer === undefined) {
75
- return {
76
- status: this.sockets.hasKnownClientServerTargets(channelName)
77
- ? ZLinkSubmitStatus.RouteNotConnected
78
- : ZLinkSubmitStatus.TargetNotFound
79
- };
75
+ return { status: ZLinkSubmitStatus.TimedOut };
80
76
  }
81
77
  const parts = encodeChannelEnvelopeParts(
82
78
  ZLinkChannelMessageKind.Command,
@@ -155,7 +151,6 @@ export class ZLinkChannelOutboundOperations {
155
151
  signal?: AbortSignal,
156
152
  metadata?: ReadonlyMap<string, string>
157
153
  ): Promise<TReply> {
158
- const deadlineAtMs = timeoutMs === undefined ? undefined : performance.now() + timeoutMs;
159
154
  let correlationId: string | undefined;
160
155
  let selectedServerRid: string | undefined;
161
156
  let terminalRecorded = false;
@@ -175,22 +170,11 @@ export class ZLinkChannelOutboundOperations {
175
170
  };
176
171
  try {
177
172
  throwIfAborted(signal);
178
- const dealer = await this.sockets.awaitClientDealerForOutbound(
179
- channelName,
180
- signal,
181
- deadlineAtMs
182
- );
183
- // Binding timeouts are whole milliseconds; rounding down keeps the call's deadline.
184
- const remainingMs =
185
- deadlineAtMs === undefined ? undefined : Math.floor(deadlineAtMs - performance.now());
186
- if (dealer === undefined || (remainingMs !== undefined && remainingMs <= 0)) {
173
+ const dealer = await this.sockets.awaitClientDealerForOutbound(channelName, signal);
174
+ if (dealer === undefined) {
187
175
  throw createInternalFrameworkException(
188
- this.sockets.hasKnownClientServerTargets(channelName)
189
- ? ZLinkFrameworkInternalErrorKind.RouteNotConnected
190
- : ZLinkFrameworkInternalErrorKind.RequestTargetNotFound,
191
- this.sockets.hasKnownClientServerTargets(channelName)
192
- ? `Channel '${channelName}' has known ClientServer targets but no ready server.`
193
- : `Channel '${channelName}' has no ready ClientServer server.`
176
+ ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
177
+ `Channel '${channelName}' has no ready ClientServer server before its admission deadline.`
194
178
  );
195
179
  }
196
180
  const serverRid = this.sockets.selectedClientServerRid(channelName, dealer);
@@ -201,7 +185,7 @@ export class ZLinkChannelOutboundOperations {
201
185
  channelName,
202
186
  packetName,
203
187
  request,
204
- remainingMs,
188
+ timeoutMs,
205
189
  undefined,
206
190
  this.codecs,
207
191
  correlationId,
@@ -221,7 +205,7 @@ export class ZLinkChannelOutboundOperations {
221
205
  let replyParts: readonly Message[] = [];
222
206
  try {
223
207
  try {
224
- replyParts = await awaitWithAbort(dealer.request(parts, remainingMs), signal);
208
+ replyParts = await awaitWithAbort(dealer.request(parts, timeoutMs), signal);
225
209
  } catch (error) {
226
210
  if (signal?.aborted === true) throw error;
227
211
  // Spec 32-framework-error-model:81-92 — classify the backend request
@@ -234,12 +218,7 @@ export class ZLinkChannelOutboundOperations {
234
218
  error
235
219
  );
236
220
  }
237
- throw createInternalFrameworkException(
238
- ZLinkFrameworkInternalErrorKind.RouteNotConnected,
239
- `Channel '${channelName}' request failed before a reply was received.`,
240
- true,
241
- error
242
- );
221
+ throw error;
243
222
  }
244
223
  return decodeChannelReply<TReply>(replyParts, this.codecs);
245
224
  } finally {
@@ -559,7 +538,7 @@ function publishResult(status: ZLinkSubmitStatus): ZLinkSubmitResult {
559
538
  return { status };
560
539
  }
561
540
 
562
- function requestTerminalResult(
541
+ export function requestTerminalResult(
563
542
  error: unknown,
564
543
  signal: AbortSignal | undefined
565
544
  ): ZLinkRuntimeMessageFlowResult {
@@ -570,7 +549,7 @@ function requestTerminalResult(
570
549
  return 'failed';
571
550
  }
572
551
 
573
- function isRemoteChannelErrorReply(error: unknown): boolean {
552
+ export function isRemoteChannelErrorReply(error: unknown): boolean {
574
553
  return (
575
554
  error instanceof ZLinkFrameworkException &&
576
555
  'origin' in error &&