@zlink-systems/framework 0.26.0 → 0.28.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 (561) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Actors/ZLinkActorClient.d.ts +1 -1
  3. package/dist/contracts/Channels/Calls.d.ts +1 -1
  4. package/dist/contracts/Common/CoreTypes.d.ts +6 -0
  5. package/dist/contracts/Common/CoreTypes.js +7 -0
  6. package/dist/contracts/Common/index.d.ts +1 -1
  7. package/dist/contracts/Common/index.js +0 -1
  8. package/dist/contracts/Configuration/Builders.d.ts +0 -1
  9. package/dist/contracts/Configuration/Configs.d.ts +0 -1
  10. package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
  11. package/dist/contracts/Configuration/InternalDefaults.js +9 -1
  12. package/dist/contracts/Configuration/Registration.d.ts +13 -2
  13. package/dist/contracts/Configuration/Registration.js +58 -36
  14. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
  15. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
  16. package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
  17. package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
  18. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -5
  19. package/dist/contracts/Configuration/RegistrationValidators.js +15 -14
  20. package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
  21. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
  22. package/dist/contracts/Handlers/JsonContract.js +10 -4
  23. package/dist/contracts/Locations/Authority.d.ts +1 -1
  24. package/dist/contracts/Locations/Authority.js +3 -2
  25. package/dist/contracts/Locations/Options.js +1 -1
  26. package/dist/contracts/Locations/Stores.d.ts +12 -0
  27. package/dist/contracts/Locations/Stores.js +9 -0
  28. package/dist/contracts/Spots/Contracts.d.ts +2 -2
  29. package/dist/contracts/Streams/BoundSessionContracts.d.ts +1 -1
  30. package/dist/contracts/Streams/IZLinkSession.d.ts +2 -3
  31. package/dist/contracts/Streams/IZLinkSessionActor.d.ts +2 -2
  32. package/dist/internal.d.ts +4 -0
  33. package/dist/internal.js +15 -1
  34. package/dist/nest-integration.d.ts +4 -2
  35. package/dist/nest-integration.js +14 -4
  36. package/dist/runtime/abort.d.ts +1 -0
  37. package/dist/runtime/abort.js +8 -5
  38. package/dist/runtime/activation-admission.d.ts +1 -2
  39. package/dist/runtime/activation-admission.js +2 -6
  40. package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
  41. package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
  42. package/dist/runtime/actors/actor-client.d.ts +2 -2
  43. package/dist/runtime/actors/actor-client.js +49 -153
  44. package/dist/runtime/actors/actor-context.d.ts +3 -5
  45. package/dist/runtime/actors/actor-context.js +13 -11
  46. package/dist/runtime/actors/actor-handoff.d.ts +4 -4
  47. package/dist/runtime/actors/actor-handoff.js +8 -8
  48. package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
  49. package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
  50. package/dist/runtime/actors/actor-local-native-join.js +83 -105
  51. package/dist/runtime/actors/actor-native-lookup.js +2 -8
  52. package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
  53. package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
  54. package/dist/runtime/actors/actor-remote-joiner.d.ts +1 -1
  55. package/dist/runtime/actors/actor-remote-joiner.js +5 -9
  56. package/dist/runtime/actors/actor-remote-wire.js +5 -3
  57. package/dist/runtime/actors/actor-request-deadline.d.ts +1 -0
  58. package/dist/runtime/actors/actor-request-deadline.js +6 -0
  59. package/dist/runtime/actors/actor-retry-delay.js +2 -1
  60. package/dist/runtime/actors/actor-routed-join-transport.d.ts +2 -3
  61. package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
  62. package/dist/runtime/actors/actor-runtime-state.js +70 -187
  63. package/dist/runtime/actors/bound-session-wire.js +2 -7
  64. package/dist/runtime/actors/deferred-join-completion.d.ts +11 -6
  65. package/dist/runtime/actors/deferred-join-completion.js +1 -0
  66. package/dist/runtime/actors/index.d.ts +9 -7
  67. package/dist/runtime/actors/index.js +87 -69
  68. package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
  69. package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
  70. package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
  71. package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
  72. package/dist/runtime/admission.d.ts +2 -0
  73. package/dist/runtime/admission.js +7 -1
  74. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
  75. package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
  76. package/dist/runtime/backend/contracts/index.d.ts +7 -27
  77. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +1 -17
  78. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
  79. package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
  80. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +3 -1
  81. package/dist/runtime/backend/node/node-backend-adapter-support.js +51 -10
  82. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +1 -1
  83. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +1 -2
  84. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
  85. package/dist/runtime/backend/node/node-event-loop-poller.js +6 -7
  86. package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
  87. package/dist/runtime/backend/node/node-raw-binding-port.js +41 -34
  88. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +14 -15
  89. package/dist/runtime/backend/node/node-raw-mesh-backend.js +146 -118
  90. package/dist/runtime/backend/node/node-socket-backend-adapter.js +4 -3
  91. package/dist/runtime/backend/raw-binding-port.d.ts +1 -1
  92. package/dist/runtime/backend/runtime-values.d.ts +4 -1
  93. package/dist/runtime/backend/runtime-values.js +2 -0
  94. package/dist/runtime/channels/channel-clients.d.ts +20 -8
  95. package/dist/runtime/channels/channel-clients.js +73 -59
  96. package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
  97. package/dist/runtime/channels/channel-envelope.d.ts +1 -1
  98. package/dist/runtime/channels/channel-envelope.js +51 -39
  99. package/dist/runtime/channels/channel-outbound-operations.d.ts +5 -2
  100. package/dist/runtime/channels/channel-outbound-operations.js +25 -42
  101. package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
  102. package/dist/runtime/channels/channel-receive-loops.js +27 -6
  103. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
  104. package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
  105. package/dist/runtime/channels/channel-runtime-manager.d.ts +4 -4
  106. package/dist/runtime/channels/channel-runtime-manager.js +13 -10
  107. package/dist/runtime/channels/channel-socket-options.js +3 -12
  108. package/dist/runtime/channels/channel-socket-registry.d.ts +14 -29
  109. package/dist/runtime/channels/channel-socket-registry.js +240 -177
  110. package/dist/runtime/channels/channel-transports.d.ts +21 -31
  111. package/dist/runtime/channels/channel-transports.js +80 -62
  112. package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
  113. package/dist/runtime/channels/client-server-location-runtime.js +10 -11
  114. package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
  115. package/dist/runtime/channels/client-server-service-wire.js +32 -11
  116. package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
  117. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  118. package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
  119. package/dist/runtime/channels/fanout-location-runtime.js +130 -72
  120. package/dist/runtime/channels/local-spot-route-transport.d.ts +1 -1
  121. package/dist/runtime/channels/local-spot-route-transport.js +1 -3
  122. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +1 -1
  123. package/dist/runtime/channels/router-socket-spot-route-transport.js +2 -2
  124. package/dist/runtime/channels/source-spot-router.d.ts +1 -1
  125. package/dist/runtime/channels/source-spot-router.js +2 -4
  126. package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
  127. package/dist/runtime/channels/spot-direct-envelope.js +4 -3
  128. package/dist/runtime/channels/spot-node-route-transport.d.ts +1 -1
  129. package/dist/runtime/channels/spot-node-route-transport.js +5 -5
  130. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +1 -1
  131. package/dist/runtime/channels/spot-route-bridge-transport.js +2 -2
  132. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +2 -4
  133. package/dist/runtime/channels/spot-route-dispatch-strategy.js +11 -12
  134. package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
  135. package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
  136. package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
  137. package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
  138. package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
  139. package/dist/runtime/diagnostics/flow-context.js +16 -2
  140. package/dist/runtime/diagnostics/index.d.ts +4 -2
  141. package/dist/runtime/diagnostics/index.js +14 -4
  142. package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
  143. package/dist/runtime/diagnostics/message-flow.js +10 -19
  144. package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
  145. package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
  146. package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
  147. package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
  148. package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
  149. package/dist/runtime/disposal.d.ts +5 -0
  150. package/dist/runtime/disposal.js +22 -0
  151. package/dist/runtime/execution/index.d.ts +12 -9
  152. package/dist/runtime/execution/index.js +58 -14
  153. package/dist/runtime/execution/serial-execution-queue.d.ts +8 -2
  154. package/dist/runtime/execution/serial-execution-queue.js +54 -15
  155. package/dist/runtime/execution/state-lane.d.ts +8 -1
  156. package/dist/runtime/execution/state-lane.js +118 -3
  157. package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
  158. package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
  159. package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
  160. package/dist/runtime/foundation/event-loop-resources.js +6 -119
  161. package/dist/runtime/foundation/operation-identity.d.ts +2 -0
  162. package/dist/runtime/foundation/operation-identity.js +9 -5
  163. package/dist/runtime/foundation/operation-registry.d.ts +5 -7
  164. package/dist/runtime/foundation/operation-registry.js +34 -44
  165. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +8 -5
  166. package/dist/runtime/foundation/raw-service-mesh-runtime.js +79 -94
  167. package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
  168. package/dist/runtime/foundation/runtime-state-projections.js +8 -0
  169. package/dist/runtime/foundation/service-authority-payload-codec.js +22 -12
  170. package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
  171. package/dist/runtime/foundation/service-discovery-registry.js +22 -3
  172. package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
  173. package/dist/runtime/foundation/service-liveness-registry.js +2 -1
  174. package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
  175. package/dist/runtime/foundation/service-maintenance-runtime.js +0 -6
  176. package/dist/runtime/foundation/service-metadata-codec.js +3 -3
  177. package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
  178. package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
  179. package/dist/runtime/foundation/service-relocation-object-owner.js +3 -2
  180. package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
  181. package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
  182. package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
  183. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -12
  184. package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
  185. package/dist/runtime/foundation/service-stateful-registry.js +10 -2
  186. package/dist/runtime/foundation/service-stateful-runtime.d.ts +26 -25
  187. package/dist/runtime/foundation/service-stateful-runtime.js +217 -204
  188. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -3
  189. package/dist/runtime/foundation/service-stateful-wire-codec.js +89 -55
  190. package/dist/runtime/foundation/service-topology-registry.d.ts +0 -1
  191. package/dist/runtime/foundation/service-topology-registry.js +17 -32
  192. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
  193. package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
  194. package/dist/runtime/foundation/service-wire-codec.js +10 -8
  195. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  196. package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
  197. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
  198. package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
  199. package/dist/runtime/framework-errors-internal.d.ts +2 -1
  200. package/dist/runtime/framework-errors-internal.js +343 -122
  201. package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
  202. package/dist/runtime/handlers/handler-instance-scope.js +61 -74
  203. package/dist/runtime/host/actor-packet-relay.d.ts +11 -8
  204. package/dist/runtime/host/actor-packet-relay.js +54 -99
  205. package/dist/runtime/host/actor-placement-coordinator.js +7 -5
  206. package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
  207. package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
  208. package/dist/runtime/host/actor-transfer-runtime.d.ts +16 -18
  209. package/dist/runtime/host/actor-transfer-runtime.js +143 -176
  210. package/dist/runtime/host/application-job-queue.js +16 -33
  211. package/dist/runtime/host/bound-session-relay.js +1 -1
  212. package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
  213. package/dist/runtime/host/index.d.ts +14 -13
  214. package/dist/runtime/host/index.js +190 -171
  215. package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
  216. package/dist/runtime/host/instance-activation-authority.js +17 -45
  217. package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
  218. package/dist/runtime/host/location-runtime-owner.js +2 -2
  219. package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
  220. package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
  221. package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
  222. package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
  223. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
  224. package/dist/runtime/host/remote-bound-session-relay.js +15 -28
  225. package/dist/runtime/host/route-mesh-runtime.d.ts +13 -11
  226. package/dist/runtime/host/route-mesh-runtime.js +171 -252
  227. package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
  228. package/dist/runtime/host/runtime-shutdown.js +18 -21
  229. package/dist/runtime/host/service-relocation-control.js +6 -1
  230. package/dist/runtime/host/service-relocation-host-runtime.d.ts +21 -30
  231. package/dist/runtime/host/service-relocation-host-runtime.js +508 -416
  232. package/dist/runtime/host/spot-address-transport.d.ts +3 -12
  233. package/dist/runtime/host/spot-address-transport.js +78 -220
  234. package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
  235. package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
  236. package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -10
  237. package/dist/runtime/host/spot-runtime-options-factory.js +50 -14
  238. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -3
  239. package/dist/runtime/host/user-spot-creation-coordinator.js +11 -8
  240. package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
  241. package/dist/runtime/locations/authority-key-codec.js +4 -3
  242. package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
  243. package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
  244. package/dist/runtime/locations/creation-operation-id.js +6 -4
  245. package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
  246. package/dist/runtime/locations/in-memory-authority-store.js +31 -15
  247. package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
  248. package/dist/runtime/locations/in-memory-location-store.js +17 -14
  249. package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
  250. package/dist/runtime/locations/in-memory-provider-location-store.js +72 -22
  251. package/dist/runtime/locations/key-codec.js +3 -2
  252. package/dist/runtime/locations/lease-tracker.d.ts +3 -5
  253. package/dist/runtime/locations/lease-tracker.js +7 -11
  254. package/dist/runtime/locations/lifecycle.d.ts +4 -9
  255. package/dist/runtime/locations/lifecycle.js +2 -31
  256. package/dist/runtime/locations/location-store-failure.d.ts +2 -0
  257. package/dist/runtime/locations/location-store-failure.js +7 -0
  258. package/dist/runtime/locations/location-store-pages.d.ts +3 -0
  259. package/dist/runtime/locations/location-store-pages.js +13 -0
  260. package/dist/runtime/locations/location-store-repository.d.ts +5 -7
  261. package/dist/runtime/locations/location-store-repository.js +309 -336
  262. package/dist/runtime/locations/relocation-blob.js +18 -5
  263. package/dist/runtime/locations/resolvers.d.ts +5 -5
  264. package/dist/runtime/locations/resolvers.js +37 -28
  265. package/dist/runtime/locations/runtime.d.ts +5 -4
  266. package/dist/runtime/locations/runtime.js +123 -92
  267. package/dist/runtime/locations/spot-location-claims.d.ts +6 -0
  268. package/dist/runtime/locations/spot-location-claims.js +42 -1
  269. package/dist/runtime/messaging/payload-codec.js +26 -20
  270. package/dist/runtime/messaging/request-deadline.d.ts +3 -0
  271. package/dist/runtime/messaging/request-deadline.js +39 -0
  272. package/dist/runtime/messaging/submission-result.d.ts +4 -0
  273. package/dist/runtime/messaging/submission-result.js +56 -1
  274. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +1 -0
  275. package/dist/runtime/protocol/service_wire_codec.generated.js +12 -7
  276. package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +4 -1
  277. package/dist/runtime/spots/index.d.ts +14 -20
  278. package/dist/runtime/spots/index.js +302 -176
  279. package/dist/runtime/spots/spot-activation-registry.d.ts +3 -5
  280. package/dist/runtime/spots/spot-activation-registry.js +14 -50
  281. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  282. package/dist/runtime/spots/spot-activation-state.js +2 -2
  283. package/dist/runtime/spots/spot-activation.d.ts +3 -4
  284. package/dist/runtime/spots/spot-activation.js +49 -32
  285. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
  286. package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
  287. package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
  288. package/dist/runtime/spots/spot-actor-join-dispatch.js +4 -52
  289. package/dist/runtime/spots/spot-actor-membership.d.ts +4 -6
  290. package/dist/runtime/spots/spot-actor-membership.js +22 -45
  291. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
  292. package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
  293. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
  294. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
  295. package/dist/runtime/spots/spot-context.d.ts +2 -2
  296. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -2
  297. package/dist/runtime/spots/spot-entry-activation.js +9 -20
  298. package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
  299. package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
  300. package/dist/runtime/spots/spot-manager-public.js +5 -4
  301. package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
  302. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -18
  303. package/dist/runtime/spots/spot-node-runtime-manager.js +67 -72
  304. package/dist/runtime/spots/spot-outbound.d.ts +7 -8
  305. package/dist/runtime/spots/spot-outbound.js +21 -23
  306. package/dist/runtime/spots/spot-remote-codec.js +5 -3
  307. package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
  308. package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
  309. package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
  310. package/dist/runtime/spots/spot-route-replies.js +3 -1
  311. package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -3
  312. package/dist/runtime/spots/spot-routed-actor-admission.js +3 -12
  313. package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +1 -2
  314. package/dist/runtime/spots/spot-routed-frame-dispatch.js +0 -1
  315. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
  316. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
  317. package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -16
  318. package/dist/runtime/spots/spot-serial-executor.js +2 -2
  319. package/dist/runtime/spots/spot-serial-turn-executor.d.ts +27 -7
  320. package/dist/runtime/spots/spot-serial-turn-executor.js +83 -11
  321. package/dist/runtime/spots/spot-timer.d.ts +3 -2
  322. package/dist/runtime/streams/actor-session-binding-registry.d.ts +16 -29
  323. package/dist/runtime/streams/actor-session-binding-registry.js +142 -212
  324. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +1 -4
  325. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +8 -4
  326. package/dist/runtime/streams/bound-actor-relay-sender.js +65 -41
  327. package/dist/runtime/streams/bound-session-service.d.ts +7 -0
  328. package/dist/runtime/streams/bound-session-service.js +12 -2
  329. package/dist/runtime/streams/index.d.ts +16 -17
  330. package/dist/runtime/streams/index.js +22 -23
  331. package/dist/runtime/streams/managed-stream.d.ts +5 -2
  332. package/dist/runtime/streams/managed-stream.js +20 -13
  333. package/dist/runtime/streams/native-fallback-bound-session.js +14 -19
  334. package/dist/runtime/streams/protocol.d.ts +6 -33
  335. package/dist/runtime/streams/protocol.js +38 -110
  336. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
  337. package/dist/runtime/streams/session-actor-coordinator.js +12 -4
  338. package/dist/runtime/streams/session-calls.d.ts +6 -8
  339. package/dist/runtime/streams/session-calls.js +6 -22
  340. package/dist/runtime/streams/session-context.d.ts +10 -10
  341. package/dist/runtime/streams/session-context.js +25 -10
  342. package/dist/runtime/streams/session-requests.js +2 -1
  343. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
  344. package/dist/runtime/streams/stream-frame-factory.js +2 -2
  345. package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
  346. package/dist/runtime/streams/stream-session-runtime.js +25 -33
  347. package/dist/runtime/workers/index.d.ts +2 -2
  348. package/dist/runtime/workers/index.js +5 -4
  349. package/package.json +3 -3
  350. package/src/contracts/Actors/ZLinkActorClient.ts +1 -1
  351. package/src/contracts/Channels/Calls.ts +1 -1
  352. package/src/contracts/Common/CoreTypes.ts +7 -0
  353. package/src/contracts/Common/index.ts +1 -1
  354. package/src/contracts/Configuration/Builders.ts +0 -1
  355. package/src/contracts/Configuration/Configs.ts +0 -1
  356. package/src/contracts/Configuration/InternalDefaults.ts +12 -0
  357. package/src/contracts/Configuration/Registration.ts +92 -48
  358. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
  359. package/src/contracts/Configuration/RegistrationBuilders.ts +77 -71
  360. package/src/contracts/Configuration/RegistrationTypes.ts +1 -5
  361. package/src/contracts/Configuration/RegistrationValidators.ts +19 -17
  362. package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
  363. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
  364. package/src/contracts/Handlers/JsonContract.ts +14 -4
  365. package/src/contracts/Locations/Authority.ts +7 -3
  366. package/src/contracts/Locations/Options.ts +1 -1
  367. package/src/contracts/Locations/Stores.ts +14 -0
  368. package/src/contracts/Spots/Contracts.ts +2 -2
  369. package/src/contracts/Streams/BoundSessionContracts.ts +1 -1
  370. package/src/contracts/Streams/IZLinkSession.ts +2 -3
  371. package/src/contracts/Streams/IZLinkSessionActor.ts +2 -6
  372. package/src/internal.ts +14 -0
  373. package/src/nest-integration.ts +28 -10
  374. package/src/runtime/abort.ts +6 -5
  375. package/src/runtime/activation-admission.ts +2 -8
  376. package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
  377. package/src/runtime/actors/actor-client.ts +85 -218
  378. package/src/runtime/actors/actor-context.ts +39 -33
  379. package/src/runtime/actors/actor-handoff.ts +24 -22
  380. package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
  381. package/src/runtime/actors/actor-local-native-join.ts +172 -174
  382. package/src/runtime/actors/actor-native-lookup.ts +2 -9
  383. package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
  384. package/src/runtime/actors/actor-remote-joiner.ts +9 -11
  385. package/src/runtime/actors/actor-remote-wire.ts +5 -3
  386. package/src/runtime/actors/actor-request-deadline.ts +4 -0
  387. package/src/runtime/actors/actor-retry-delay.ts +2 -1
  388. package/src/runtime/actors/actor-routed-join-transport.ts +3 -5
  389. package/src/runtime/actors/actor-runtime-state.ts +85 -247
  390. package/src/runtime/actors/bound-session-wire.ts +2 -8
  391. package/src/runtime/actors/deferred-join-completion.ts +10 -6
  392. package/src/runtime/actors/index.ts +100 -79
  393. package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
  394. package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
  395. package/src/runtime/admission.ts +8 -1
  396. package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
  397. package/src/runtime/backend/contracts/index.ts +14 -37
  398. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +2 -18
  399. package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
  400. package/src/runtime/backend/node/node-backend-adapter-support.ts +67 -10
  401. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +0 -2
  402. package/src/runtime/backend/node/node-event-loop-poller.ts +8 -12
  403. package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
  404. package/src/runtime/backend/node/node-raw-binding-port.ts +44 -49
  405. package/src/runtime/backend/node/node-raw-mesh-backend.ts +227 -170
  406. package/src/runtime/backend/node/node-socket-backend-adapter.ts +4 -3
  407. package/src/runtime/backend/raw-binding-port.ts +1 -1
  408. package/src/runtime/backend/runtime-values.ts +4 -1
  409. package/src/runtime/channels/channel-clients.ts +139 -102
  410. package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
  411. package/src/runtime/channels/channel-envelope.ts +74 -57
  412. package/src/runtime/channels/channel-outbound-operations.ts +40 -55
  413. package/src/runtime/channels/channel-receive-loops.ts +39 -7
  414. package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
  415. package/src/runtime/channels/channel-runtime-manager.ts +12 -30
  416. package/src/runtime/channels/channel-socket-options.ts +8 -15
  417. package/src/runtime/channels/channel-socket-registry.ts +291 -196
  418. package/src/runtime/channels/channel-transports.ts +168 -145
  419. package/src/runtime/channels/client-server-location-runtime.ts +17 -17
  420. package/src/runtime/channels/client-server-service-wire.ts +40 -12
  421. package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
  422. package/src/runtime/channels/fanout-location-runtime.ts +172 -91
  423. package/src/runtime/channels/local-spot-route-transport.ts +1 -5
  424. package/src/runtime/channels/router-socket-spot-route-transport.ts +2 -6
  425. package/src/runtime/channels/source-spot-router.ts +2 -9
  426. package/src/runtime/channels/spot-direct-envelope.ts +1 -1
  427. package/src/runtime/channels/spot-node-route-transport.ts +7 -9
  428. package/src/runtime/channels/spot-route-bridge-transport.ts +5 -12
  429. package/src/runtime/channels/spot-route-dispatch-strategy.ts +11 -30
  430. package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
  431. package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
  432. package/src/runtime/diagnostics/flow-context.ts +16 -2
  433. package/src/runtime/diagnostics/index.ts +27 -17
  434. package/src/runtime/diagnostics/message-flow.ts +15 -25
  435. package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
  436. package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
  437. package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
  438. package/src/runtime/disposal.ts +19 -0
  439. package/src/runtime/execution/index.ts +60 -20
  440. package/src/runtime/execution/serial-execution-queue.ts +131 -18
  441. package/src/runtime/execution/state-lane.ts +142 -4
  442. package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
  443. package/src/runtime/foundation/event-loop-resources.ts +5 -122
  444. package/src/runtime/foundation/operation-identity.ts +11 -5
  445. package/src/runtime/foundation/operation-registry.ts +33 -50
  446. package/src/runtime/foundation/raw-service-mesh-runtime.ts +127 -125
  447. package/src/runtime/foundation/runtime-state-projections.ts +9 -1
  448. package/src/runtime/foundation/service-authority-payload-codec.ts +31 -13
  449. package/src/runtime/foundation/service-discovery-registry.ts +32 -3
  450. package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
  451. package/src/runtime/foundation/service-liveness-registry.ts +2 -1
  452. package/src/runtime/foundation/service-maintenance-runtime.ts +0 -10
  453. package/src/runtime/foundation/service-metadata-codec.ts +2 -2
  454. package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
  455. package/src/runtime/foundation/service-relocation-object-owner.ts +5 -2
  456. package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
  457. package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
  458. package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -17
  459. package/src/runtime/foundation/service-stateful-registry.ts +14 -2
  460. package/src/runtime/foundation/service-stateful-runtime.ts +322 -276
  461. package/src/runtime/foundation/service-stateful-wire-codec.ts +128 -80
  462. package/src/runtime/foundation/service-topology-registry.ts +23 -32
  463. package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
  464. package/src/runtime/foundation/service-wire-codec.ts +15 -8
  465. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  466. package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
  467. package/src/runtime/framework-errors-internal.ts +380 -134
  468. package/src/runtime/handlers/handler-instance-scope.ts +68 -95
  469. package/src/runtime/host/actor-packet-relay.ts +63 -160
  470. package/src/runtime/host/actor-placement-coordinator.ts +8 -5
  471. package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
  472. package/src/runtime/host/actor-transfer-runtime.ts +180 -260
  473. package/src/runtime/host/application-job-queue.ts +28 -34
  474. package/src/runtime/host/bound-session-relay.ts +1 -2
  475. package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
  476. package/src/runtime/host/index.ts +327 -320
  477. package/src/runtime/host/instance-activation-authority.ts +89 -109
  478. package/src/runtime/host/location-runtime-owner.ts +4 -2
  479. package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
  480. package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
  481. package/src/runtime/host/remote-bound-session-relay.ts +16 -57
  482. package/src/runtime/host/route-mesh-runtime.ts +228 -271
  483. package/src/runtime/host/runtime-shutdown.ts +17 -21
  484. package/src/runtime/host/service-relocation-control.ts +14 -1
  485. package/src/runtime/host/service-relocation-host-runtime.ts +699 -561
  486. package/src/runtime/host/spot-address-transport.ts +175 -356
  487. package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
  488. package/src/runtime/host/spot-runtime-options-factory.ts +73 -22
  489. package/src/runtime/host/user-spot-creation-coordinator.ts +36 -22
  490. package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
  491. package/src/runtime/locations/authority-key-codec.ts +7 -3
  492. package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
  493. package/src/runtime/locations/creation-operation-id.ts +6 -3
  494. package/src/runtime/locations/domain-store-contract.ts +12 -3
  495. package/src/runtime/locations/in-memory-authority-store.ts +44 -15
  496. package/src/runtime/locations/in-memory-location-store.ts +50 -39
  497. package/src/runtime/locations/in-memory-provider-location-store.ts +100 -25
  498. package/src/runtime/locations/key-codec.ts +3 -2
  499. package/src/runtime/locations/lease-tracker.ts +8 -14
  500. package/src/runtime/locations/lifecycle.ts +13 -43
  501. package/src/runtime/locations/location-store-failure.ts +4 -0
  502. package/src/runtime/locations/location-store-pages.ts +18 -0
  503. package/src/runtime/locations/location-store-repository.ts +457 -482
  504. package/src/runtime/locations/relocation-blob.ts +17 -6
  505. package/src/runtime/locations/resolvers.ts +75 -49
  506. package/src/runtime/locations/runtime.ts +220 -110
  507. package/src/runtime/locations/spot-location-claims.ts +58 -1
  508. package/src/runtime/messaging/payload-codec.ts +35 -24
  509. package/src/runtime/messaging/request-deadline.ts +58 -0
  510. package/src/runtime/messaging/submission-result.ts +72 -2
  511. package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
  512. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
  513. package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +4 -1
  514. package/src/runtime/spots/index.ts +433 -229
  515. package/src/runtime/spots/spot-activation-registry.ts +30 -69
  516. package/src/runtime/spots/spot-activation-state.ts +2 -2
  517. package/src/runtime/spots/spot-activation.ts +67 -37
  518. package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
  519. package/src/runtime/spots/spot-actor-join-dispatch.ts +24 -77
  520. package/src/runtime/spots/spot-actor-membership.ts +40 -72
  521. package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
  522. package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
  523. package/src/runtime/spots/spot-context.ts +3 -3
  524. package/src/runtime/spots/spot-entry-activation.ts +13 -30
  525. package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
  526. package/src/runtime/spots/spot-manager-public.ts +21 -17
  527. package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
  528. package/src/runtime/spots/spot-node-runtime-manager.ts +136 -125
  529. package/src/runtime/spots/spot-outbound.ts +59 -47
  530. package/src/runtime/spots/spot-remote-codec.ts +7 -3
  531. package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
  532. package/src/runtime/spots/spot-route-replies.ts +6 -4
  533. package/src/runtime/spots/spot-routed-actor-admission.ts +13 -26
  534. package/src/runtime/spots/spot-routed-frame-dispatch.ts +2 -3
  535. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
  536. package/src/runtime/spots/spot-runtime-ports.ts +5 -27
  537. package/src/runtime/spots/spot-serial-executor.ts +2 -2
  538. package/src/runtime/spots/spot-serial-turn-executor.ts +112 -11
  539. package/src/runtime/spots/spot-timer.ts +3 -2
  540. package/src/runtime/streams/actor-session-binding-registry.ts +179 -269
  541. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +0 -8
  542. package/src/runtime/streams/bound-actor-relay-sender.ts +98 -66
  543. package/src/runtime/streams/bound-session-service.ts +22 -2
  544. package/src/runtime/streams/index.ts +78 -68
  545. package/src/runtime/streams/managed-stream.ts +32 -23
  546. package/src/runtime/streams/native-fallback-bound-session.ts +14 -28
  547. package/src/runtime/streams/protocol.ts +34 -88
  548. package/src/runtime/streams/session-actor-coordinator.ts +17 -5
  549. package/src/runtime/streams/session-calls.ts +11 -36
  550. package/src/runtime/streams/session-context.ts +60 -25
  551. package/src/runtime/streams/session-requests.ts +2 -1
  552. package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
  553. package/src/runtime/streams/stream-frame-factory.ts +2 -3
  554. package/src/runtime/streams/stream-session-runtime.ts +57 -59
  555. package/src/runtime/workers/index.ts +13 -12
  556. package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
  557. package/dist/runtime/actors/post-commit-actor-location.js +0 -72
  558. package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
  559. package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
  560. package/src/runtime/actors/post-commit-actor-location.ts +0 -121
  561. 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;
@@ -193,7 +194,7 @@ export function wrapSocket<T extends { close(): void }>(
193
194
  }
194
195
  return submitBindingAsyncSend(operation, payload);
195
196
  },
196
- submit(routingId: unknown, payload: unknown, _timeoutMs?: number): Promise<void> {
197
+ submit(routingId: unknown, payload: unknown): Promise<void> {
197
198
  if (!hasStream) throw new TypeError('Async stream send requires a STREAM socket.');
198
199
  return submitBindingAsyncSend(
199
200
  (nativeInstance as T & { send(routingId: unknown): ZLinkBindingAsyncSendOperation }).send(
@@ -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,
@@ -19,6 +20,7 @@ import {
19
20
  import {
20
21
  requireOneWayCompletion,
21
22
  requirePublishCompletion,
23
+ requireClassicFanoutCompletion,
22
24
  throwAlreadySubmitted,
23
25
  ZLinkSubmitStatus,
24
26
  type ZLinkSubmitResult
@@ -43,68 +45,76 @@ import {
43
45
  } from '../spots/spot-outbound';
44
46
  import { resolveFrameworkPacketName } from '../messaging/packet-name';
45
47
 
46
- export class DefaultZLinkChannelClient implements ZLinkChannelClient {
47
- constructor(
48
- private readonly registration: ZLinkFrameworkRegistration,
49
- private readonly transport?: ZLinkChannelClientTransportSource
50
- ) {}
48
+ type RouteMeshChannelMatch = {
49
+ readonly meshName: string;
50
+ readonly mesh: NonNullable<ReturnType<ZLinkFrameworkRegistration['spotNodes']['get']>>;
51
+ };
51
52
 
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
- }
53
+ type ChannelRouteResolution =
54
+ | {
55
+ readonly kind: 'client-server';
56
+ readonly channel: NonNullable<ReturnType<ZLinkFrameworkRegistration['channels']['get']>>;
57
+ }
58
+ | { readonly kind: 'route-mesh'; readonly matches: readonly RouteMeshChannelMatch[] };
59
+
60
+ type ResolvedChannelRoute =
61
+ | Extract<ChannelRouteResolution, { readonly kind: 'client-server' }>
62
+ | {
63
+ readonly kind: 'route-mesh';
64
+ readonly meshName: string;
65
+ readonly mesh: RouteMeshChannelMatch['mesh'];
66
+ };
67
+
68
+ export function resolveChannelRoute(
69
+ registration: ZLinkFrameworkRegistration,
70
+ channelName: string
71
+ ): ChannelRouteResolution | undefined {
72
+ const clientServerChannel = registration.channels.get(channelName);
73
+ if (clientServerChannel !== undefined) {
74
+ return { kind: 'client-server', channel: clientServerChannel };
75
+ }
76
+
77
+ const matches = [...registration.spotNodes.entries()]
78
+ .filter(([, mesh]) =>
79
+ Object.prototype.hasOwnProperty.call(mesh.meshChannels ?? {}, channelName)
80
+ )
81
+ .map(([meshName, mesh]) => ({ meshName, mesh }));
82
+ return matches.length === 0 ? undefined : { kind: 'route-mesh', matches };
83
+ }
61
84
 
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
- );
85
+ export function requireUniqueRouteMeshChannel(
86
+ matches: readonly RouteMeshChannelMatch[],
87
+ duplicateMessage: string
88
+ ): RouteMeshChannelMatch {
89
+ if (matches.length !== 1) {
90
+ throw new ZLinkConfigurationException(duplicateMessage);
76
91
  }
92
+ return matches[0]!;
93
+ }
77
94
 
78
- private defaultRequestTimeout(channelName: string): number {
79
- return (
80
- this.registration.channels.get(channelName)?.requestTimeoutMs ??
81
- this.registration.requestTimeoutMs ??
82
- 30_000
95
+ export class DefaultZLinkChannelClient implements ZLinkChannelClient {
96
+ private readonly routeClient: DefaultZLinkRouteClient;
97
+
98
+ constructor(
99
+ registration: ZLinkFrameworkRegistration,
100
+ channelTransport?: ZLinkChannelClientTransportSource,
101
+ routeTransport?: ZLinkRouteClientTransport,
102
+ spotRouterChannelIdForMesh: (meshName: string) => string = (meshName) => meshName
103
+ ) {
104
+ this.routeClient = new DefaultZLinkRouteClient(
105
+ registration,
106
+ routeTransport,
107
+ spotRouterChannelIdForMesh,
108
+ channelTransport
83
109
  );
84
110
  }
85
111
 
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
- }
112
+ sendToChannel(channelName: string, message: unknown): ZLinkSendCall {
113
+ return this.routeClient.sendToChannel(channelName, message);
100
114
  }
101
115
 
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;
116
+ requestToChannel(channelName: string, request: unknown): ZLinkChannelRequestCall {
117
+ return this.routeClient.requestToChannel(channelName, request);
108
118
  }
109
119
  }
110
120
 
@@ -160,20 +170,20 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
160
170
  private readonly registration: ZLinkFrameworkRegistration,
161
171
  private readonly transport?: ZLinkRouteClientTransport,
162
172
  private readonly spotRouterChannelIdForMesh: (meshName: string) => string = (meshName) =>
163
- meshName
173
+ meshName,
174
+ private readonly channelTransport?: ZLinkChannelClientTransportSource
164
175
  ) {}
165
176
 
166
177
  sendToNode(meshName: string, targetNodeRid: string, message: unknown): ZLinkSendCall {
167
178
  return new DefaultZLinkSendCall(
168
179
  () => this.requireMesh(meshName),
169
- async (packetName, metadata, signal) =>
180
+ async (packetName, metadata) =>
170
181
  normalizeSubmitResult(
171
182
  await this.requireTransport().submit(
172
183
  meshName,
173
184
  targetNodeRid,
174
185
  packetName,
175
186
  message,
176
- signal,
177
187
  metadata
178
188
  )
179
189
  )
@@ -199,20 +209,22 @@ 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
- },
205
- async (packetName, metadata, signal) => {
206
- const meshName = this.resolveMeshChannel(channelName);
212
+ () => this.requireChannelRoute(channelName),
213
+ async (packetName, metadata) => {
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
+ metadata
223
+ )
224
+ );
225
+ }
207
226
  return normalizeSubmitResult(
208
- await this.requireTransport().submitToChannel(
209
- meshName,
210
- channelName,
211
- packetName,
212
- message,
213
- signal,
214
- metadata
215
- )
227
+ await this.requireChannelTransport().send(channelName, packetName, message, metadata)
216
228
  );
217
229
  }
218
230
  );
@@ -220,13 +232,21 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
220
232
 
221
233
  requestToChannel(channelName: string, request: unknown): ZLinkChannelRequestCall {
222
234
  return new DefaultZLinkRequestCall(
223
- () => {
224
- this.resolveMeshChannel(channelName);
225
- },
235
+ () => this.requireChannelRoute(channelName),
226
236
  (packetName, timeoutMs, metadata, signal) => {
227
- const meshName = this.resolveMeshChannel(channelName);
228
- return this.requireTransport().requestToChannel(
229
- meshName,
237
+ const route = this.requireChannelRoute(channelName);
238
+ if (route.kind === 'route-mesh') {
239
+ return this.requireTransport().requestToChannel(
240
+ route.meshName,
241
+ channelName,
242
+ packetName,
243
+ request,
244
+ timeoutMs,
245
+ signal,
246
+ metadata
247
+ );
248
+ }
249
+ return this.requireChannelTransport().request(
230
250
  channelName,
231
251
  packetName,
232
252
  request,
@@ -244,9 +264,8 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
244
264
  () => {
245
265
  this.requireSpotTransport();
246
266
  },
247
- async (_packetName, metadata, signal) => {
267
+ async (_packetName, metadata) => {
248
268
  await sendToSpotHandle(this.requireSpotTransport(), spot, message, {
249
- signal,
250
269
  metadata,
251
270
  spotRouterChannelIdForMesh: this.spotRouterChannelIdForMesh
252
271
  });
@@ -267,7 +286,7 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
267
286
  metadata,
268
287
  spotRouterChannelIdForMesh: this.spotRouterChannelIdForMesh
269
288
  }),
270
- this.registration.requestTimeoutMs ?? 30_000
289
+ this.registration.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS
271
290
  );
272
291
  }
273
292
 
@@ -276,7 +295,7 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
276
295
  this.registration.spotNodes.get(meshName)?.requestTimeoutMs ??
277
296
  this.registration.routeChannelOptions.get(meshName)?.requestTimeoutMs ??
278
297
  this.registration.requestTimeoutMs ??
279
- 30_000
298
+ DEFAULT_REQUEST_TIMEOUT_MS
280
299
  );
281
300
  }
282
301
 
@@ -289,31 +308,42 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
289
308
  }
290
309
  }
291
310
 
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) {
311
+ private requireChannelRoute(channelName: string): ResolvedChannelRoute {
312
+ const resolution = resolveChannelRoute(this.registration, channelName);
313
+ if (resolution === undefined) {
299
314
  throw createInternalFrameworkException(
300
315
  ZLinkFrameworkInternalErrorKind.RequestTargetNotFound,
301
- `RouteMesh channel '${channelName}' is not registered.`
316
+ `ChannelName '${channelName}' is not registered.`
302
317
  );
303
318
  }
304
- if (matches.length !== 1) {
305
- throw new ZLinkConfigurationException(
306
- `RouteMesh channel '${channelName}' must be unique across the Framework host.`
307
- );
319
+ if (resolution.kind === 'client-server') {
320
+ if (resolution.channel.client === undefined) {
321
+ throw createInternalFrameworkException(
322
+ ZLinkFrameworkInternalErrorKind.InvalidConfiguration,
323
+ `Channel client role '${channelName}' is not configured.`
324
+ );
325
+ }
326
+ return resolution;
308
327
  }
309
- return matches[0]!;
328
+
329
+ return {
330
+ kind: 'route-mesh',
331
+ ...requireUniqueRouteMeshChannel(
332
+ resolution.matches,
333
+ `RouteMesh channel '${channelName}' must be unique across the Framework host.`
334
+ )
335
+ };
310
336
  }
311
337
 
312
338
  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;
339
+ const route = resolveChannelRoute(this.registration, channelName);
340
+ const timeoutMs =
341
+ route?.kind === 'client-server'
342
+ ? route.channel.requestTimeoutMs
343
+ : route?.kind === 'route-mesh'
344
+ ? route.matches[0]?.mesh.requestTimeoutMs
345
+ : undefined;
346
+ return timeoutMs ?? this.registration.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
317
347
  }
318
348
 
319
349
  private requireTransport(): ZLinkRouteClientTransport {
@@ -323,6 +353,15 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
323
353
  return this.transport;
324
354
  }
325
355
 
356
+ private requireChannelTransport(): ZLinkChannelClientTransport {
357
+ const transport =
358
+ typeof this.channelTransport === 'function' ? this.channelTransport() : this.channelTransport;
359
+ if (transport === undefined) {
360
+ throw new ZLinkConfigurationException('Channel runtime is not started.');
361
+ }
362
+ return transport;
363
+ }
364
+
326
365
  private requireSpotTransport(): ZLinkSpotRoutedTransport {
327
366
  const transport = this.requireTransport();
328
367
  if (transport.sendToSpot === undefined || transport.requestToSpot === undefined) {
@@ -384,8 +423,7 @@ class DefaultZLinkSendCall implements ZLinkSendCall {
384
423
  private readonly validate: () => void,
385
424
  private readonly submitter: (
386
425
  packetName: string | undefined,
387
- metadata: ReadonlyMap<string, string>,
388
- signal?: AbortSignal
426
+ metadata: ReadonlyMap<string, string>
389
427
  ) => Promise<ZLinkSubmitResult>
390
428
  ) {}
391
429
 
@@ -403,12 +441,11 @@ class DefaultZLinkSendCall implements ZLinkSendCall {
403
441
  return this;
404
442
  }
405
443
 
406
- async submit(signal?: AbortSignal): Promise<void> {
444
+ async submit(): Promise<void> {
407
445
  ensureNotExecuted(this.executed);
408
446
  this.validate();
409
447
  this.executed = true;
410
- throwIfAborted(signal);
411
- const result = await this.submitter(undefined, new Map(this.selectedMetadata), signal);
448
+ const result = await this.submitter(undefined, new Map(this.selectedMetadata));
412
449
  requireOneWayCompletion(result, 'One-way send');
413
450
  }
414
451
  }
@@ -533,6 +570,6 @@ class DefaultZLinkFanoutPublishCall implements ZLinkFanoutPublishCall {
533
570
  this.executed = true;
534
571
  throwIfAborted(signal);
535
572
  const result = await this.submitter(signal);
536
- requireOneWayCompletion(result, 'Classic fanout publish');
573
+ requireClassicFanoutCompletion(result, 'Classic fanout publish');
537
574
  }
538
575
  }
@@ -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';
@@ -84,33 +86,18 @@ export function encodeChannelEnvelopeParts(
84
86
  createFlow = true,
85
87
  metadata: ReadonlyMap<string, string> = EMPTY_OUTBOUND_METADATA
86
88
  ): readonly MessageLike[] {
87
- const messageName = resolveFrameworkPacketName(payload, packetName, 'Channel');
88
- const encoded = encodePayload(
89
+ return encodeChannelEnvelopePartsAtDeadline(
90
+ kind,
91
+ channelName,
92
+ packetName,
89
93
  payload,
90
- codecsForFrameworkPacket(messageName, codecs),
91
- messageName,
92
- 'payload'
94
+ timeoutMs === undefined ? undefined : Date.now() + timeoutMs,
95
+ topic,
96
+ codecs,
97
+ correlationId,
98
+ createFlow,
99
+ metadata
93
100
  );
94
- const flow = createFlow ? currentOrCreateFlow('Application') : undefined;
95
- const envelopeCorrelationId = correlationIdForOutboundKind(kind, correlationId);
96
- return [
97
- encodeChannelHeader(
98
- kind,
99
- channelName,
100
- messageName,
101
- encoded.contentType,
102
- envelopeCorrelationId,
103
- timeoutMs === undefined ? null : new Date(Date.now() + timeoutMs).toISOString(),
104
- topic ?? null,
105
- null,
106
- null,
107
- undefined,
108
- applicationMetadataRecord(metadata),
109
- flow?.flowId,
110
- flow?.flowOrigin
111
- ),
112
- encoded.message
113
- ];
114
101
  }
115
102
 
116
103
  /**
@@ -124,14 +111,17 @@ export function encodeChannelEnvelopePartsAtDeadline(
124
111
  channelName: string,
125
112
  packetName: string | undefined,
126
113
  payload: unknown,
127
- deadlineUnixMs: number,
114
+ deadlineUnixMs: number | undefined,
128
115
  topic?: string,
129
116
  codecs?: ZLinkChannelEnvelopeCodecRegistry,
130
117
  correlationId?: string,
131
118
  createFlow = true,
132
119
  metadata: ReadonlyMap<string, string> = EMPTY_OUTBOUND_METADATA
133
120
  ): readonly MessageLike[] {
134
- if (!Number.isSafeInteger(deadlineUnixMs) || deadlineUnixMs <= 0) {
121
+ if (
122
+ deadlineUnixMs !== undefined &&
123
+ (!Number.isSafeInteger(deadlineUnixMs) || deadlineUnixMs <= 0)
124
+ ) {
135
125
  throw new RangeError('deadlineUnixMs must be a positive safe integer.');
136
126
  }
137
127
  const messageName = resolveFrameworkPacketName(payload, packetName, 'Channel');
@@ -150,7 +140,7 @@ export function encodeChannelEnvelopePartsAtDeadline(
150
140
  messageName,
151
141
  encoded.contentType,
152
142
  envelopeCorrelationId,
153
- new Date(deadlineUnixMs).toISOString(),
143
+ deadlineUnixMs === undefined ? null : new Date(deadlineUnixMs).toISOString(),
154
144
  topic ?? null,
155
145
  null,
156
146
  null,
@@ -614,7 +604,24 @@ function writeChannelHeader(
614
604
  writer.append(',"source":');
615
605
  writer.nullableString(source);
616
606
  }
617
- writer.append(',"metadata":{');
607
+ writer.append(',"metadata":');
608
+ writeApplicationMetadata(writer, metadata);
609
+ if (flowId !== undefined) {
610
+ writer.append(',"flowId":');
611
+ writer.string(flowId);
612
+ }
613
+ if (flowOrigin !== undefined) {
614
+ writer.append(',"flowOrigin":');
615
+ writer.append(String(encodeFlowOrigin(flowOrigin)));
616
+ }
617
+ writer.append('}');
618
+ }
619
+
620
+ function writeApplicationMetadata(
621
+ writer: ChannelHeaderWriter,
622
+ metadata: Readonly<Record<string, string>>
623
+ ): void {
624
+ writer.append('{');
618
625
  let first = true;
619
626
  for (const name in metadata) {
620
627
  if (!Object.prototype.hasOwnProperty.call(metadata, name)) continue;
@@ -625,15 +632,6 @@ function writeChannelHeader(
625
632
  writer.string(metadata[name]!);
626
633
  }
627
634
  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
635
  }
638
636
 
639
637
  class ChannelHeaderWriter {
@@ -744,14 +742,20 @@ function parseWireJson(payload: string, schema?: ZLinkJsonSchema): unknown {
744
742
  }
745
743
 
746
744
  function parseChannelHeaderBytes(payload: Buffer): unknown {
747
- return tryParseCanonicalChannelHeader(payload) ?? parseWireJson(payload.toString());
745
+ if (!isUtf8(payload)) {
746
+ throw new ZLinkFrameworkException(
747
+ ZLinkFrameworkErrorKind.ProtocolError,
748
+ 'Channel envelope header must contain valid UTF-8.'
749
+ );
750
+ }
751
+ return tryParseCanonicalChannelHeader(payload) ?? parseFrameworkJsonV1(payload.toString());
748
752
  }
749
753
 
750
754
  /**
751
755
  * Accept the byte layout emitted by writeChannelHeader without materializing
752
756
  * the enclosing JSON text. Any variation falls through to the established
753
757
  * framework-json-v1 parser, which remains the sole authority for JSON
754
- * failures, unknown properties, and prototype-key rejection.
758
+ * failures and unknown properties. Header metadata accepts every valid string key.
755
759
  */
756
760
  function tryParseCanonicalChannelHeader(payload: Buffer): Record<string, unknown> | undefined {
757
761
  const reader = new CanonicalChannelHeaderReader(payload);
@@ -1019,38 +1023,51 @@ const EMPTY_APPLICATION_METADATA: Readonly<Record<string, string>> = Object.free
1019
1023
  function applicationMetadataRecord(
1020
1024
  metadata: ReadonlyMap<string, string>
1021
1025
  ): Readonly<Record<string, string>> {
1022
- // The common case carries no metadata; skip the record + JSON.stringify
1023
- // byte-limit walk entirely.
1024
1026
  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')) {
1027
+ const record: Record<string, string> = Object.create(null) as Record<string, string>;
1028
+ for (const [key, value] of metadata) record[key] = value;
1029
+ return validateApplicationMetadata(record);
1030
+ }
1031
+
1032
+ const INVALID_METADATA_UNICODE =
1033
+ /[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/u;
1034
+
1035
+ function validateApplicationMetadata(
1036
+ metadata: Record<string, unknown>
1037
+ ): Readonly<Record<string, string>> {
1038
+ const keys = Object.keys(metadata);
1039
+ if (keys.length === 0) return EMPTY_APPLICATION_METADATA;
1040
+ for (const key of keys) {
1041
+ const value = requireString(metadata[key], `metadata.${key}`);
1042
+ if (
1043
+ key.length === 0 ||
1044
+ key.includes('\0') ||
1045
+ value.includes('\0') ||
1046
+ INVALID_METADATA_UNICODE.test(key) ||
1047
+ INVALID_METADATA_UNICODE.test(value)
1048
+ ) {
1028
1049
  throw new ZLinkConfigurationException(
1029
- 'Channel application metadata keys must be non-empty and keys and values must not contain NUL.'
1050
+ 'Channel application metadata keys must be non-empty and keys and values must be valid Unicode without NUL.'
1030
1051
  );
1031
1052
  }
1032
- record[key] = value;
1033
1053
  }
1034
- if (Buffer.byteLength(JSON.stringify(record), 'utf8') > 1024) {
1054
+ const record = metadata as Record<string, string>;
1055
+ const writer = new ChannelHeaderWriter();
1056
+ writeApplicationMetadata(writer, record);
1057
+ if (writer.byteLength > SERVICE_WIRE_METADATA_BYTES) {
1035
1058
  throw new ZLinkConfigurationException(
1036
- 'Channel application metadata exceeds the 1024-byte limit.'
1059
+ `Channel application metadata exceeds the ${SERVICE_WIRE_METADATA_BYTES}-byte limit.`
1037
1060
  );
1038
1061
  }
1039
1062
  return Object.freeze(record);
1040
1063
  }
1041
1064
 
1042
1065
  function requireApplicationMetadata(value: unknown): Readonly<Record<string, string>> {
1043
- if (value === undefined) {
1044
- return Object.freeze({});
1045
- }
1066
+ if (value === undefined) return EMPTY_APPLICATION_METADATA;
1046
1067
  if (!isRecord(value)) {
1047
1068
  throw new ZLinkConfigurationException('Channel application metadata must be a JSON object.');
1048
1069
  }
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);
1070
+ return validateApplicationMetadata(value);
1054
1071
  }
1055
1072
 
1056
1073
  function optionalFlowId(value: unknown): string | undefined {