@zlink-systems/framework 0.26.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 (521) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Common/CoreTypes.d.ts +6 -0
  3. package/dist/contracts/Common/CoreTypes.js +7 -0
  4. package/dist/contracts/Common/index.d.ts +1 -1
  5. package/dist/contracts/Common/index.js +0 -1
  6. package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
  7. package/dist/contracts/Configuration/InternalDefaults.js +9 -1
  8. package/dist/contracts/Configuration/Registration.d.ts +13 -2
  9. package/dist/contracts/Configuration/Registration.js +58 -36
  10. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
  12. package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
  13. package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
  14. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  15. package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
  16. package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
  17. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
  18. package/dist/contracts/Handlers/JsonContract.js +10 -4
  19. package/dist/contracts/Locations/Authority.d.ts +1 -1
  20. package/dist/contracts/Locations/Authority.js +3 -2
  21. package/dist/contracts/Locations/Options.js +1 -1
  22. package/dist/contracts/Locations/Stores.d.ts +12 -0
  23. package/dist/contracts/Locations/Stores.js +9 -0
  24. package/dist/contracts/Spots/Contracts.d.ts +1 -1
  25. package/dist/internal.d.ts +4 -0
  26. package/dist/internal.js +15 -1
  27. package/dist/nest-integration.d.ts +4 -2
  28. package/dist/nest-integration.js +14 -4
  29. package/dist/runtime/abort.d.ts +1 -0
  30. package/dist/runtime/abort.js +8 -5
  31. package/dist/runtime/activation-admission.d.ts +1 -2
  32. package/dist/runtime/activation-admission.js +2 -6
  33. package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
  34. package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
  35. package/dist/runtime/actors/actor-client.d.ts +2 -2
  36. package/dist/runtime/actors/actor-client.js +42 -143
  37. package/dist/runtime/actors/actor-context.d.ts +3 -5
  38. package/dist/runtime/actors/actor-context.js +13 -11
  39. package/dist/runtime/actors/actor-handoff.d.ts +4 -4
  40. package/dist/runtime/actors/actor-handoff.js +8 -8
  41. package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
  42. package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
  43. package/dist/runtime/actors/actor-local-native-join.js +83 -105
  44. package/dist/runtime/actors/actor-native-lookup.js +2 -8
  45. package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
  46. package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
  47. package/dist/runtime/actors/actor-remote-joiner.d.ts +1 -1
  48. package/dist/runtime/actors/actor-remote-joiner.js +5 -9
  49. package/dist/runtime/actors/actor-remote-wire.js +5 -3
  50. package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
  51. package/dist/runtime/actors/actor-request-deadline.js +31 -0
  52. package/dist/runtime/actors/actor-retry-delay.js +2 -1
  53. package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
  54. package/dist/runtime/actors/actor-runtime-state.js +70 -187
  55. package/dist/runtime/actors/bound-session-wire.js +2 -7
  56. package/dist/runtime/actors/deferred-join-completion.d.ts +11 -6
  57. package/dist/runtime/actors/deferred-join-completion.js +1 -0
  58. package/dist/runtime/actors/index.d.ts +9 -7
  59. package/dist/runtime/actors/index.js +87 -69
  60. package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
  61. package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
  62. package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
  63. package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
  64. package/dist/runtime/admission.d.ts +2 -0
  65. package/dist/runtime/admission.js +7 -1
  66. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
  67. package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
  68. package/dist/runtime/backend/contracts/index.d.ts +6 -23
  69. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +1 -17
  70. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
  71. package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
  72. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +1 -1
  73. package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -6
  74. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
  75. package/dist/runtime/backend/node/node-event-loop-poller.js +6 -7
  76. package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
  77. package/dist/runtime/backend/node/node-raw-binding-port.js +40 -16
  78. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +14 -15
  79. package/dist/runtime/backend/node/node-raw-mesh-backend.js +146 -118
  80. package/dist/runtime/backend/node/node-socket-backend-adapter.js +3 -2
  81. package/dist/runtime/backend/raw-binding-port.d.ts +1 -1
  82. package/dist/runtime/backend/runtime-values.d.ts +4 -1
  83. package/dist/runtime/backend/runtime-values.js +2 -0
  84. package/dist/runtime/channels/channel-clients.d.ts +20 -8
  85. package/dist/runtime/channels/channel-clients.js +68 -52
  86. package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
  87. package/dist/runtime/channels/channel-envelope.js +47 -29
  88. package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
  89. package/dist/runtime/channels/channel-outbound-operations.js +9 -10
  90. package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
  91. package/dist/runtime/channels/channel-receive-loops.js +27 -6
  92. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
  93. package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
  94. package/dist/runtime/channels/channel-runtime-manager.js +5 -2
  95. package/dist/runtime/channels/channel-socket-options.js +3 -2
  96. package/dist/runtime/channels/channel-socket-registry.d.ts +14 -29
  97. package/dist/runtime/channels/channel-socket-registry.js +248 -174
  98. package/dist/runtime/channels/channel-transports.d.ts +11 -17
  99. package/dist/runtime/channels/channel-transports.js +68 -47
  100. package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
  101. package/dist/runtime/channels/client-server-location-runtime.js +10 -11
  102. package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
  103. package/dist/runtime/channels/client-server-service-wire.js +32 -11
  104. package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
  105. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  106. package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
  107. package/dist/runtime/channels/fanout-location-runtime.js +130 -72
  108. package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
  109. package/dist/runtime/channels/spot-direct-envelope.js +4 -3
  110. package/dist/runtime/channels/spot-node-route-transport.js +3 -2
  111. package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
  112. package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
  113. package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
  114. package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
  115. package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
  116. package/dist/runtime/diagnostics/flow-context.js +16 -2
  117. package/dist/runtime/diagnostics/index.d.ts +4 -2
  118. package/dist/runtime/diagnostics/index.js +14 -4
  119. package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
  120. package/dist/runtime/diagnostics/message-flow.js +10 -19
  121. package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
  122. package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
  123. package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
  124. package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
  125. package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
  126. package/dist/runtime/disposal.d.ts +5 -0
  127. package/dist/runtime/disposal.js +22 -0
  128. package/dist/runtime/execution/index.d.ts +12 -9
  129. package/dist/runtime/execution/index.js +58 -14
  130. package/dist/runtime/execution/serial-execution-queue.d.ts +8 -2
  131. package/dist/runtime/execution/serial-execution-queue.js +54 -15
  132. package/dist/runtime/execution/state-lane.d.ts +8 -1
  133. package/dist/runtime/execution/state-lane.js +118 -3
  134. package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
  135. package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
  136. package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
  137. package/dist/runtime/foundation/event-loop-resources.js +6 -119
  138. package/dist/runtime/foundation/operation-identity.d.ts +2 -0
  139. package/dist/runtime/foundation/operation-identity.js +9 -5
  140. package/dist/runtime/foundation/operation-registry.d.ts +5 -7
  141. package/dist/runtime/foundation/operation-registry.js +34 -44
  142. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +8 -5
  143. package/dist/runtime/foundation/raw-service-mesh-runtime.js +62 -83
  144. package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
  145. package/dist/runtime/foundation/runtime-state-projections.js +8 -0
  146. package/dist/runtime/foundation/service-authority-payload-codec.js +22 -12
  147. package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
  148. package/dist/runtime/foundation/service-discovery-registry.js +22 -3
  149. package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
  150. package/dist/runtime/foundation/service-liveness-registry.js +2 -1
  151. package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
  152. package/dist/runtime/foundation/service-maintenance-runtime.js +0 -6
  153. package/dist/runtime/foundation/service-metadata-codec.js +3 -3
  154. package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
  155. package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
  156. package/dist/runtime/foundation/service-relocation-object-owner.js +3 -2
  157. package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
  158. package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
  159. package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
  160. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -12
  161. package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
  162. package/dist/runtime/foundation/service-stateful-registry.js +10 -2
  163. package/dist/runtime/foundation/service-stateful-runtime.d.ts +26 -25
  164. package/dist/runtime/foundation/service-stateful-runtime.js +217 -204
  165. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -3
  166. package/dist/runtime/foundation/service-stateful-wire-codec.js +89 -55
  167. package/dist/runtime/foundation/service-topology-registry.d.ts +0 -1
  168. package/dist/runtime/foundation/service-topology-registry.js +17 -32
  169. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
  170. package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
  171. package/dist/runtime/foundation/service-wire-codec.js +10 -8
  172. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  173. package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
  174. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
  175. package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
  176. package/dist/runtime/framework-errors-internal.d.ts +2 -1
  177. package/dist/runtime/framework-errors-internal.js +343 -122
  178. package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
  179. package/dist/runtime/handlers/handler-instance-scope.js +61 -74
  180. package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
  181. package/dist/runtime/host/actor-packet-relay.js +48 -91
  182. package/dist/runtime/host/actor-placement-coordinator.js +7 -5
  183. package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
  184. package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
  185. package/dist/runtime/host/actor-transfer-runtime.d.ts +16 -18
  186. package/dist/runtime/host/actor-transfer-runtime.js +143 -176
  187. package/dist/runtime/host/application-job-queue.js +16 -33
  188. package/dist/runtime/host/bound-session-relay.js +1 -1
  189. package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
  190. package/dist/runtime/host/index.d.ts +14 -13
  191. package/dist/runtime/host/index.js +190 -157
  192. package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
  193. package/dist/runtime/host/instance-activation-authority.js +17 -45
  194. package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
  195. package/dist/runtime/host/location-runtime-owner.js +2 -2
  196. package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
  197. package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
  198. package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
  199. package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
  200. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
  201. package/dist/runtime/host/remote-bound-session-relay.js +7 -20
  202. package/dist/runtime/host/route-mesh-runtime.d.ts +13 -11
  203. package/dist/runtime/host/route-mesh-runtime.js +171 -252
  204. package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
  205. package/dist/runtime/host/runtime-shutdown.js +18 -21
  206. package/dist/runtime/host/service-relocation-control.js +6 -1
  207. package/dist/runtime/host/service-relocation-host-runtime.d.ts +21 -30
  208. package/dist/runtime/host/service-relocation-host-runtime.js +508 -416
  209. package/dist/runtime/host/spot-address-transport.d.ts +2 -3
  210. package/dist/runtime/host/spot-address-transport.js +34 -136
  211. package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
  212. package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
  213. package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -10
  214. package/dist/runtime/host/spot-runtime-options-factory.js +50 -14
  215. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -3
  216. package/dist/runtime/host/user-spot-creation-coordinator.js +11 -8
  217. package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
  218. package/dist/runtime/locations/authority-key-codec.js +4 -3
  219. package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
  220. package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
  221. package/dist/runtime/locations/creation-operation-id.js +6 -4
  222. package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
  223. package/dist/runtime/locations/in-memory-authority-store.js +31 -15
  224. package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
  225. package/dist/runtime/locations/in-memory-location-store.js +17 -14
  226. package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
  227. package/dist/runtime/locations/in-memory-provider-location-store.js +72 -22
  228. package/dist/runtime/locations/key-codec.js +3 -2
  229. package/dist/runtime/locations/lease-tracker.d.ts +3 -5
  230. package/dist/runtime/locations/lease-tracker.js +7 -11
  231. package/dist/runtime/locations/lifecycle.d.ts +4 -9
  232. package/dist/runtime/locations/lifecycle.js +2 -31
  233. package/dist/runtime/locations/location-store-failure.d.ts +2 -0
  234. package/dist/runtime/locations/location-store-failure.js +7 -0
  235. package/dist/runtime/locations/location-store-pages.d.ts +3 -0
  236. package/dist/runtime/locations/location-store-pages.js +13 -0
  237. package/dist/runtime/locations/location-store-repository.d.ts +5 -7
  238. package/dist/runtime/locations/location-store-repository.js +303 -332
  239. package/dist/runtime/locations/relocation-blob.js +18 -5
  240. package/dist/runtime/locations/resolvers.d.ts +5 -5
  241. package/dist/runtime/locations/resolvers.js +37 -28
  242. package/dist/runtime/locations/runtime.d.ts +5 -4
  243. package/dist/runtime/locations/runtime.js +123 -92
  244. package/dist/runtime/locations/spot-location-claims.d.ts +6 -0
  245. package/dist/runtime/locations/spot-location-claims.js +42 -1
  246. package/dist/runtime/messaging/payload-codec.js +26 -20
  247. package/dist/runtime/messaging/submission-result.d.ts +3 -0
  248. package/dist/runtime/messaging/submission-result.js +48 -0
  249. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +1 -0
  250. package/dist/runtime/protocol/service_wire_codec.generated.js +12 -7
  251. package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +4 -1
  252. package/dist/runtime/spots/index.d.ts +14 -20
  253. package/dist/runtime/spots/index.js +302 -176
  254. package/dist/runtime/spots/spot-activation-registry.d.ts +3 -5
  255. package/dist/runtime/spots/spot-activation-registry.js +14 -50
  256. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  257. package/dist/runtime/spots/spot-activation-state.js +2 -2
  258. package/dist/runtime/spots/spot-activation.d.ts +3 -4
  259. package/dist/runtime/spots/spot-activation.js +49 -32
  260. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
  261. package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
  262. package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
  263. package/dist/runtime/spots/spot-actor-join-dispatch.js +4 -52
  264. package/dist/runtime/spots/spot-actor-membership.d.ts +4 -6
  265. package/dist/runtime/spots/spot-actor-membership.js +22 -45
  266. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
  267. package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
  268. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
  269. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
  270. package/dist/runtime/spots/spot-context.d.ts +2 -2
  271. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -2
  272. package/dist/runtime/spots/spot-entry-activation.js +9 -20
  273. package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
  274. package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
  275. package/dist/runtime/spots/spot-manager-public.js +5 -4
  276. package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
  277. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -18
  278. package/dist/runtime/spots/spot-node-runtime-manager.js +67 -72
  279. package/dist/runtime/spots/spot-outbound.d.ts +4 -3
  280. package/dist/runtime/spots/spot-outbound.js +9 -8
  281. package/dist/runtime/spots/spot-remote-codec.js +5 -3
  282. package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
  283. package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
  284. package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
  285. package/dist/runtime/spots/spot-route-replies.js +3 -1
  286. package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -3
  287. package/dist/runtime/spots/spot-routed-actor-admission.js +3 -12
  288. package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +1 -2
  289. package/dist/runtime/spots/spot-routed-frame-dispatch.js +0 -1
  290. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
  291. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
  292. package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -16
  293. package/dist/runtime/spots/spot-serial-executor.js +2 -2
  294. package/dist/runtime/spots/spot-serial-turn-executor.d.ts +27 -7
  295. package/dist/runtime/spots/spot-serial-turn-executor.js +83 -11
  296. package/dist/runtime/spots/spot-timer.d.ts +3 -2
  297. package/dist/runtime/streams/actor-session-binding-registry.d.ts +16 -29
  298. package/dist/runtime/streams/actor-session-binding-registry.js +142 -212
  299. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +1 -4
  300. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
  301. package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
  302. package/dist/runtime/streams/bound-session-service.d.ts +7 -0
  303. package/dist/runtime/streams/bound-session-service.js +11 -1
  304. package/dist/runtime/streams/index.d.ts +14 -15
  305. package/dist/runtime/streams/index.js +20 -21
  306. package/dist/runtime/streams/managed-stream.d.ts +3 -0
  307. package/dist/runtime/streams/managed-stream.js +17 -8
  308. package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
  309. package/dist/runtime/streams/protocol.d.ts +6 -33
  310. package/dist/runtime/streams/protocol.js +38 -110
  311. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
  312. package/dist/runtime/streams/session-actor-coordinator.js +12 -4
  313. package/dist/runtime/streams/session-calls.d.ts +1 -1
  314. package/dist/runtime/streams/session-calls.js +5 -4
  315. package/dist/runtime/streams/session-context.d.ts +6 -6
  316. package/dist/runtime/streams/session-context.js +22 -4
  317. package/dist/runtime/streams/session-requests.js +2 -1
  318. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
  319. package/dist/runtime/streams/stream-frame-factory.js +2 -2
  320. package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
  321. package/dist/runtime/streams/stream-session-runtime.js +25 -33
  322. package/dist/runtime/workers/index.d.ts +2 -2
  323. package/dist/runtime/workers/index.js +5 -4
  324. package/package.json +3 -3
  325. package/src/contracts/Common/CoreTypes.ts +7 -0
  326. package/src/contracts/Common/index.ts +1 -1
  327. package/src/contracts/Configuration/InternalDefaults.ts +12 -0
  328. package/src/contracts/Configuration/Registration.ts +92 -48
  329. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
  330. package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
  331. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  332. package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
  333. package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
  334. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
  335. package/src/contracts/Handlers/JsonContract.ts +14 -4
  336. package/src/contracts/Locations/Authority.ts +7 -3
  337. package/src/contracts/Locations/Options.ts +1 -1
  338. package/src/contracts/Locations/Stores.ts +14 -0
  339. package/src/contracts/Spots/Contracts.ts +1 -1
  340. package/src/internal.ts +14 -0
  341. package/src/nest-integration.ts +28 -10
  342. package/src/runtime/abort.ts +6 -5
  343. package/src/runtime/activation-admission.ts +2 -8
  344. package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
  345. package/src/runtime/actors/actor-client.ts +77 -204
  346. package/src/runtime/actors/actor-context.ts +39 -33
  347. package/src/runtime/actors/actor-handoff.ts +24 -22
  348. package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
  349. package/src/runtime/actors/actor-local-native-join.ts +172 -174
  350. package/src/runtime/actors/actor-native-lookup.ts +2 -9
  351. package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
  352. package/src/runtime/actors/actor-remote-joiner.ts +9 -11
  353. package/src/runtime/actors/actor-remote-wire.ts +5 -3
  354. package/src/runtime/actors/actor-request-deadline.ts +49 -0
  355. package/src/runtime/actors/actor-retry-delay.ts +2 -1
  356. package/src/runtime/actors/actor-runtime-state.ts +85 -247
  357. package/src/runtime/actors/bound-session-wire.ts +2 -8
  358. package/src/runtime/actors/deferred-join-completion.ts +10 -6
  359. package/src/runtime/actors/index.ts +100 -79
  360. package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
  361. package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
  362. package/src/runtime/admission.ts +8 -1
  363. package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
  364. package/src/runtime/backend/contracts/index.ts +13 -29
  365. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +2 -18
  366. package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
  367. package/src/runtime/backend/node/node-backend-adapter-support.ts +23 -6
  368. package/src/runtime/backend/node/node-event-loop-poller.ts +8 -12
  369. package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
  370. package/src/runtime/backend/node/node-raw-binding-port.ts +41 -20
  371. package/src/runtime/backend/node/node-raw-mesh-backend.ts +227 -170
  372. package/src/runtime/backend/node/node-socket-backend-adapter.ts +3 -2
  373. package/src/runtime/backend/raw-binding-port.ts +1 -1
  374. package/src/runtime/backend/runtime-values.ts +4 -1
  375. package/src/runtime/channels/channel-clients.ts +132 -85
  376. package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
  377. package/src/runtime/channels/channel-envelope.ts +58 -29
  378. package/src/runtime/channels/channel-outbound-operations.ts +10 -23
  379. package/src/runtime/channels/channel-receive-loops.ts +39 -7
  380. package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
  381. package/src/runtime/channels/channel-runtime-manager.ts +6 -2
  382. package/src/runtime/channels/channel-socket-options.ts +8 -2
  383. package/src/runtime/channels/channel-socket-registry.ts +301 -192
  384. package/src/runtime/channels/channel-transports.ts +161 -112
  385. package/src/runtime/channels/client-server-location-runtime.ts +17 -17
  386. package/src/runtime/channels/client-server-service-wire.ts +40 -12
  387. package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
  388. package/src/runtime/channels/fanout-location-runtime.ts +172 -91
  389. package/src/runtime/channels/spot-direct-envelope.ts +1 -1
  390. package/src/runtime/channels/spot-node-route-transport.ts +5 -2
  391. package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
  392. package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
  393. package/src/runtime/diagnostics/flow-context.ts +16 -2
  394. package/src/runtime/diagnostics/index.ts +27 -17
  395. package/src/runtime/diagnostics/message-flow.ts +15 -25
  396. package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
  397. package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
  398. package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
  399. package/src/runtime/disposal.ts +19 -0
  400. package/src/runtime/execution/index.ts +60 -20
  401. package/src/runtime/execution/serial-execution-queue.ts +131 -18
  402. package/src/runtime/execution/state-lane.ts +142 -4
  403. package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
  404. package/src/runtime/foundation/event-loop-resources.ts +5 -122
  405. package/src/runtime/foundation/operation-identity.ts +11 -5
  406. package/src/runtime/foundation/operation-registry.ts +33 -50
  407. package/src/runtime/foundation/raw-service-mesh-runtime.ts +110 -111
  408. package/src/runtime/foundation/runtime-state-projections.ts +9 -1
  409. package/src/runtime/foundation/service-authority-payload-codec.ts +31 -13
  410. package/src/runtime/foundation/service-discovery-registry.ts +32 -3
  411. package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
  412. package/src/runtime/foundation/service-liveness-registry.ts +2 -1
  413. package/src/runtime/foundation/service-maintenance-runtime.ts +0 -10
  414. package/src/runtime/foundation/service-metadata-codec.ts +2 -2
  415. package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
  416. package/src/runtime/foundation/service-relocation-object-owner.ts +5 -2
  417. package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
  418. package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
  419. package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -17
  420. package/src/runtime/foundation/service-stateful-registry.ts +14 -2
  421. package/src/runtime/foundation/service-stateful-runtime.ts +322 -276
  422. package/src/runtime/foundation/service-stateful-wire-codec.ts +128 -80
  423. package/src/runtime/foundation/service-topology-registry.ts +23 -32
  424. package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
  425. package/src/runtime/foundation/service-wire-codec.ts +15 -8
  426. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  427. package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
  428. package/src/runtime/framework-errors-internal.ts +380 -134
  429. package/src/runtime/handlers/handler-instance-scope.ts +68 -95
  430. package/src/runtime/host/actor-packet-relay.ts +57 -147
  431. package/src/runtime/host/actor-placement-coordinator.ts +8 -5
  432. package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
  433. package/src/runtime/host/actor-transfer-runtime.ts +180 -260
  434. package/src/runtime/host/application-job-queue.ts +28 -34
  435. package/src/runtime/host/bound-session-relay.ts +1 -2
  436. package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
  437. package/src/runtime/host/index.ts +327 -296
  438. package/src/runtime/host/instance-activation-authority.ts +89 -109
  439. package/src/runtime/host/location-runtime-owner.ts +4 -2
  440. package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
  441. package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
  442. package/src/runtime/host/remote-bound-session-relay.ts +8 -41
  443. package/src/runtime/host/route-mesh-runtime.ts +228 -271
  444. package/src/runtime/host/runtime-shutdown.ts +17 -21
  445. package/src/runtime/host/service-relocation-control.ts +14 -1
  446. package/src/runtime/host/service-relocation-host-runtime.ts +699 -561
  447. package/src/runtime/host/spot-address-transport.ts +73 -195
  448. package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
  449. package/src/runtime/host/spot-runtime-options-factory.ts +73 -22
  450. package/src/runtime/host/user-spot-creation-coordinator.ts +36 -22
  451. package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
  452. package/src/runtime/locations/authority-key-codec.ts +7 -3
  453. package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
  454. package/src/runtime/locations/creation-operation-id.ts +6 -3
  455. package/src/runtime/locations/domain-store-contract.ts +12 -3
  456. package/src/runtime/locations/in-memory-authority-store.ts +44 -15
  457. package/src/runtime/locations/in-memory-location-store.ts +50 -39
  458. package/src/runtime/locations/in-memory-provider-location-store.ts +100 -25
  459. package/src/runtime/locations/key-codec.ts +3 -2
  460. package/src/runtime/locations/lease-tracker.ts +8 -14
  461. package/src/runtime/locations/lifecycle.ts +13 -43
  462. package/src/runtime/locations/location-store-failure.ts +4 -0
  463. package/src/runtime/locations/location-store-pages.ts +18 -0
  464. package/src/runtime/locations/location-store-repository.ts +450 -478
  465. package/src/runtime/locations/relocation-blob.ts +17 -6
  466. package/src/runtime/locations/resolvers.ts +75 -49
  467. package/src/runtime/locations/runtime.ts +220 -110
  468. package/src/runtime/locations/spot-location-claims.ts +58 -1
  469. package/src/runtime/messaging/payload-codec.ts +35 -24
  470. package/src/runtime/messaging/submission-result.ts +57 -1
  471. package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
  472. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
  473. package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +4 -1
  474. package/src/runtime/spots/index.ts +433 -229
  475. package/src/runtime/spots/spot-activation-registry.ts +30 -69
  476. package/src/runtime/spots/spot-activation-state.ts +2 -2
  477. package/src/runtime/spots/spot-activation.ts +67 -37
  478. package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
  479. package/src/runtime/spots/spot-actor-join-dispatch.ts +24 -77
  480. package/src/runtime/spots/spot-actor-membership.ts +40 -72
  481. package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
  482. package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
  483. package/src/runtime/spots/spot-context.ts +3 -3
  484. package/src/runtime/spots/spot-entry-activation.ts +13 -30
  485. package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
  486. package/src/runtime/spots/spot-manager-public.ts +21 -17
  487. package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
  488. package/src/runtime/spots/spot-node-runtime-manager.ts +136 -125
  489. package/src/runtime/spots/spot-outbound.ts +45 -23
  490. package/src/runtime/spots/spot-remote-codec.ts +7 -3
  491. package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
  492. package/src/runtime/spots/spot-route-replies.ts +6 -4
  493. package/src/runtime/spots/spot-routed-actor-admission.ts +13 -26
  494. package/src/runtime/spots/spot-routed-frame-dispatch.ts +2 -3
  495. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
  496. package/src/runtime/spots/spot-runtime-ports.ts +5 -27
  497. package/src/runtime/spots/spot-serial-executor.ts +2 -2
  498. package/src/runtime/spots/spot-serial-turn-executor.ts +112 -11
  499. package/src/runtime/spots/spot-timer.ts +3 -2
  500. package/src/runtime/streams/actor-session-binding-registry.ts +179 -269
  501. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +0 -8
  502. package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
  503. package/src/runtime/streams/bound-session-service.ts +21 -1
  504. package/src/runtime/streams/index.ts +76 -64
  505. package/src/runtime/streams/managed-stream.ts +29 -10
  506. package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
  507. package/src/runtime/streams/protocol.ts +34 -88
  508. package/src/runtime/streams/session-actor-coordinator.ts +17 -5
  509. package/src/runtime/streams/session-calls.ts +6 -5
  510. package/src/runtime/streams/session-context.ts +54 -10
  511. package/src/runtime/streams/session-requests.ts +2 -1
  512. package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
  513. package/src/runtime/streams/stream-frame-factory.ts +2 -3
  514. package/src/runtime/streams/stream-session-runtime.ts +57 -59
  515. package/src/runtime/workers/index.ts +13 -12
  516. package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
  517. package/dist/runtime/actors/post-commit-actor-location.js +0 -72
  518. package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
  519. package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
  520. package/src/runtime/actors/post-commit-actor-location.ts +0 -121
  521. package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
@@ -1,3 +1,4 @@
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 {
@@ -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
  }
@@ -26,7 +26,7 @@ export interface ZLinkRawMonitorRecord {
26
26
  }
27
27
 
28
28
  export interface ZLinkRawSocketPort {
29
- setReadableHandler(handler: () => void): void;
29
+ setReadableHandler(handler: (receiveReady: boolean, routeReady: boolean) => void): void;
30
30
  bind(endpoint: string): void;
31
31
  unbind(endpoint: string): void;
32
32
  connect(endpoint: string): void;
@@ -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
 
@@ -160,7 +169,8 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
160
169
  private readonly registration: ZLinkFrameworkRegistration,
161
170
  private readonly transport?: ZLinkRouteClientTransport,
162
171
  private readonly spotRouterChannelIdForMesh: (meshName: string) => string = (meshName) =>
163
- meshName
172
+ meshName,
173
+ private readonly channelTransport?: ZLinkChannelClientTransportSource
164
174
  ) {}
165
175
 
166
176
  sendToNode(meshName: string, targetNodeRid: string, message: unknown): ZLinkSendCall {
@@ -199,14 +209,23 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
199
209
 
200
210
  sendToChannel(channelName: string, message: unknown): ZLinkSendCall {
201
211
  return new DefaultZLinkSendCall(
202
- () => {
203
- this.resolveMeshChannel(channelName);
204
- },
212
+ () => this.requireChannelRoute(channelName),
205
213
  async (packetName, metadata, signal) => {
206
- 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
+ }
207
227
  return normalizeSubmitResult(
208
- await this.requireTransport().submitToChannel(
209
- meshName,
228
+ await this.requireChannelTransport().send(
210
229
  channelName,
211
230
  packetName,
212
231
  message,
@@ -220,13 +239,21 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
220
239
 
221
240
  requestToChannel(channelName: string, request: unknown): ZLinkChannelRequestCall {
222
241
  return new DefaultZLinkRequestCall(
223
- () => {
224
- this.resolveMeshChannel(channelName);
225
- },
242
+ () => this.requireChannelRoute(channelName),
226
243
  (packetName, timeoutMs, metadata, signal) => {
227
- const meshName = this.resolveMeshChannel(channelName);
228
- return this.requireTransport().requestToChannel(
229
- 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(
230
257
  channelName,
231
258
  packetName,
232
259
  request,
@@ -267,7 +294,7 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
267
294
  metadata,
268
295
  spotRouterChannelIdForMesh: this.spotRouterChannelIdForMesh
269
296
  }),
270
- this.registration.requestTimeoutMs ?? 30_000
297
+ this.registration.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS
271
298
  );
272
299
  }
273
300
 
@@ -276,7 +303,7 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
276
303
  this.registration.spotNodes.get(meshName)?.requestTimeoutMs ??
277
304
  this.registration.routeChannelOptions.get(meshName)?.requestTimeoutMs ??
278
305
  this.registration.requestTimeoutMs ??
279
- 30_000
306
+ DEFAULT_REQUEST_TIMEOUT_MS
280
307
  );
281
308
  }
282
309
 
@@ -289,31 +316,42 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
289
316
  }
290
317
  }
291
318
 
292
- private resolveMeshChannel(channelName: string): string {
293
- const matches = [...this.registration.spotNodes.entries()]
294
- .filter(([, mesh]) =>
295
- Object.prototype.hasOwnProperty.call(mesh.meshChannels ?? {}, channelName)
296
- )
297
- .map(([meshName]) => meshName);
298
- if (matches.length === 0) {
319
+ private requireChannelRoute(channelName: string): ResolvedChannelRoute {
320
+ const resolution = resolveChannelRoute(this.registration, channelName);
321
+ if (resolution === undefined) {
299
322
  throw createInternalFrameworkException(
300
323
  ZLinkFrameworkInternalErrorKind.RequestTargetNotFound,
301
- `RouteMesh channel '${channelName}' is not registered.`
324
+ `ChannelName '${channelName}' is not registered.`
302
325
  );
303
326
  }
304
- if (matches.length !== 1) {
305
- throw new ZLinkConfigurationException(
306
- `RouteMesh channel '${channelName}' must be unique across the Framework host.`
307
- );
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;
308
335
  }
309
- 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
+ };
310
344
  }
311
345
 
312
346
  private defaultRequestTimeoutForChannel(channelName: string): number {
313
- const match = [...this.registration.spotNodes.entries()].find(([, mesh]) =>
314
- Object.prototype.hasOwnProperty.call(mesh.meshChannels ?? {}, channelName)
315
- );
316
- 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;
317
355
  }
318
356
 
319
357
  private requireTransport(): ZLinkRouteClientTransport {
@@ -323,6 +361,15 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
323
361
  return this.transport;
324
362
  }
325
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
+
326
373
  private requireSpotTransport(): ZLinkSpotRoutedTransport {
327
374
  const transport = this.requireTransport();
328
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,7 +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 { status: ZLinkSubmitStatus.RouteNotConnected };
75
+ return { status: ZLinkSubmitStatus.TimedOut };
76
76
  }
77
77
  const parts = encodeChannelEnvelopeParts(
78
78
  ZLinkChannelMessageKind.Command,
@@ -151,7 +151,6 @@ export class ZLinkChannelOutboundOperations {
151
151
  signal?: AbortSignal,
152
152
  metadata?: ReadonlyMap<string, string>
153
153
  ): Promise<TReply> {
154
- const deadlineAtMs = timeoutMs === undefined ? undefined : performance.now() + timeoutMs;
155
154
  let correlationId: string | undefined;
156
155
  let selectedServerRid: string | undefined;
157
156
  let terminalRecorded = false;
@@ -171,18 +170,11 @@ export class ZLinkChannelOutboundOperations {
171
170
  };
172
171
  try {
173
172
  throwIfAborted(signal);
174
- const dealer = await this.sockets.awaitClientDealerForOutbound(
175
- channelName,
176
- signal,
177
- deadlineAtMs
178
- );
179
- // Binding timeouts are whole milliseconds; rounding down keeps the call's deadline.
180
- const remainingMs =
181
- deadlineAtMs === undefined ? undefined : Math.floor(deadlineAtMs - performance.now());
182
- if (dealer === undefined || (remainingMs !== undefined && remainingMs <= 0)) {
173
+ const dealer = await this.sockets.awaitClientDealerForOutbound(channelName, signal);
174
+ if (dealer === undefined) {
183
175
  throw createInternalFrameworkException(
184
- ZLinkFrameworkInternalErrorKind.RouteNotConnected,
185
- `Channel '${channelName}' has no ready ClientServer server.`
176
+ ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
177
+ `Channel '${channelName}' has no ready ClientServer server before its admission deadline.`
186
178
  );
187
179
  }
188
180
  const serverRid = this.sockets.selectedClientServerRid(channelName, dealer);
@@ -193,7 +185,7 @@ export class ZLinkChannelOutboundOperations {
193
185
  channelName,
194
186
  packetName,
195
187
  request,
196
- remainingMs,
188
+ timeoutMs,
197
189
  undefined,
198
190
  this.codecs,
199
191
  correlationId,
@@ -213,7 +205,7 @@ export class ZLinkChannelOutboundOperations {
213
205
  let replyParts: readonly Message[] = [];
214
206
  try {
215
207
  try {
216
- replyParts = await awaitWithAbort(dealer.request(parts, remainingMs), signal);
208
+ replyParts = await awaitWithAbort(dealer.request(parts, timeoutMs), signal);
217
209
  } catch (error) {
218
210
  if (signal?.aborted === true) throw error;
219
211
  // Spec 32-framework-error-model:81-92 — classify the backend request
@@ -226,12 +218,7 @@ export class ZLinkChannelOutboundOperations {
226
218
  error
227
219
  );
228
220
  }
229
- throw createInternalFrameworkException(
230
- ZLinkFrameworkInternalErrorKind.RouteNotConnected,
231
- `Channel '${channelName}' request failed before a reply was received.`,
232
- true,
233
- error
234
- );
221
+ throw error;
235
222
  }
236
223
  return decodeChannelReply<TReply>(replyParts, this.codecs);
237
224
  } finally {
@@ -551,7 +538,7 @@ function publishResult(status: ZLinkSubmitStatus): ZLinkSubmitResult {
551
538
  return { status };
552
539
  }
553
540
 
554
- function requestTerminalResult(
541
+ export function requestTerminalResult(
555
542
  error: unknown,
556
543
  signal: AbortSignal | undefined
557
544
  ): ZLinkRuntimeMessageFlowResult {
@@ -562,7 +549,7 @@ function requestTerminalResult(
562
549
  return 'failed';
563
550
  }
564
551
 
565
- function isRemoteChannelErrorReply(error: unknown): boolean {
552
+ export function isRemoteChannelErrorReply(error: unknown): boolean {
566
553
  return (
567
554
  error instanceof ZLinkFrameworkException &&
568
555
  'origin' in error &&