@zlink-systems/framework 0.25.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (557) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Channels/IZLinkFanoutClient.d.ts +0 -6
  3. package/dist/contracts/Common/CoreTypes.d.ts +6 -0
  4. package/dist/contracts/Common/CoreTypes.js +7 -0
  5. package/dist/contracts/Common/index.d.ts +1 -1
  6. package/dist/contracts/Common/index.js +0 -1
  7. package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
  8. package/dist/contracts/Configuration/InternalDefaults.js +9 -1
  9. package/dist/contracts/Configuration/Registration.d.ts +13 -2
  10. package/dist/contracts/Configuration/Registration.js +58 -36
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
  12. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
  13. package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
  14. package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
  15. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  16. package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
  17. package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
  18. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
  19. package/dist/contracts/Handlers/JsonContract.js +10 -4
  20. package/dist/contracts/Locations/Authority.d.ts +1 -1
  21. package/dist/contracts/Locations/Authority.js +3 -2
  22. package/dist/contracts/Locations/Options.js +1 -1
  23. package/dist/contracts/Locations/Stores.d.ts +12 -0
  24. package/dist/contracts/Locations/Stores.js +9 -0
  25. package/dist/contracts/RouteMesh/RuntimeTopology.d.ts +8 -0
  26. package/dist/contracts/Spots/Contracts.d.ts +1 -1
  27. package/dist/internal.d.ts +5 -0
  28. package/dist/internal.js +16 -1
  29. package/dist/nest-integration.d.ts +4 -2
  30. package/dist/nest-integration.js +14 -4
  31. package/dist/runtime/abort.d.ts +1 -0
  32. package/dist/runtime/abort.js +8 -5
  33. package/dist/runtime/activation-admission.d.ts +28 -0
  34. package/dist/runtime/activation-admission.js +57 -0
  35. package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
  36. package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
  37. package/dist/runtime/actors/actor-client.d.ts +2 -2
  38. package/dist/runtime/actors/actor-client.js +42 -143
  39. package/dist/runtime/actors/actor-context.d.ts +3 -5
  40. package/dist/runtime/actors/actor-context.js +19 -17
  41. package/dist/runtime/actors/actor-handoff.d.ts +13 -7
  42. package/dist/runtime/actors/actor-handoff.js +36 -25
  43. package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
  44. package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
  45. package/dist/runtime/actors/actor-local-native-join.js +85 -123
  46. package/dist/runtime/actors/actor-native-lookup.js +2 -8
  47. package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
  48. package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
  49. package/dist/runtime/actors/actor-remote-joiner.d.ts +3 -3
  50. package/dist/runtime/actors/actor-remote-joiner.js +11 -17
  51. package/dist/runtime/actors/actor-remote-wire.js +5 -3
  52. package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
  53. package/dist/runtime/actors/actor-request-deadline.js +31 -0
  54. package/dist/runtime/actors/actor-retry-delay.js +2 -1
  55. package/dist/runtime/actors/actor-runtime-contracts.d.ts +4 -2
  56. package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
  57. package/dist/runtime/actors/actor-runtime-state.js +70 -187
  58. package/dist/runtime/actors/actor-source-transfer.d.ts +5 -5
  59. package/dist/runtime/actors/bound-session-wire.js +2 -7
  60. package/dist/runtime/actors/deferred-join-completion.d.ts +19 -0
  61. package/dist/runtime/actors/deferred-join-completion.js +21 -0
  62. package/dist/runtime/actors/index.d.ts +10 -8
  63. package/dist/runtime/actors/index.js +101 -73
  64. package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
  65. package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
  66. package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
  67. package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
  68. package/dist/runtime/admission.d.ts +7 -1
  69. package/dist/runtime/admission.js +11 -1
  70. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
  71. package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
  72. package/dist/runtime/backend/contracts/index.d.ts +8 -33
  73. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +3 -26
  74. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
  75. package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
  76. package/dist/runtime/backend/node/node-backend-adapter-factory.d.ts +1 -2
  77. package/dist/runtime/backend/node/node-backend-adapter-factory.js +4 -18
  78. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +7 -4
  79. package/dist/runtime/backend/node/node-backend-adapter-support.js +28 -34
  80. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
  81. package/dist/runtime/backend/node/node-event-loop-poller.js +11 -6
  82. package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
  83. package/dist/runtime/backend/node/node-raw-binding-port.d.ts +1 -1
  84. package/dist/runtime/backend/node/node-raw-binding-port.js +51 -19
  85. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +21 -19
  86. package/dist/runtime/backend/node/node-raw-mesh-backend.js +171 -111
  87. package/dist/runtime/backend/node/node-socket-backend-adapter.js +4 -3
  88. package/dist/runtime/backend/raw-binding-port.d.ts +13 -1
  89. package/dist/runtime/backend/runtime-values.d.ts +4 -1
  90. package/dist/runtime/backend/runtime-values.js +2 -0
  91. package/dist/runtime/channels/channel-clients.d.ts +20 -9
  92. package/dist/runtime/channels/channel-clients.js +68 -60
  93. package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
  94. package/dist/runtime/channels/channel-envelope.js +47 -29
  95. package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
  96. package/dist/runtime/channels/channel-outbound-operations.js +9 -18
  97. package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
  98. package/dist/runtime/channels/channel-receive-loops.js +27 -6
  99. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
  100. package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
  101. package/dist/runtime/channels/channel-runtime-manager.d.ts +2 -5
  102. package/dist/runtime/channels/channel-runtime-manager.js +4 -12
  103. package/dist/runtime/channels/channel-socket-options.js +3 -2
  104. package/dist/runtime/channels/channel-socket-registry.d.ts +30 -32
  105. package/dist/runtime/channels/channel-socket-registry.js +296 -235
  106. package/dist/runtime/channels/channel-transports.d.ts +11 -20
  107. package/dist/runtime/channels/channel-transports.js +68 -47
  108. package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
  109. package/dist/runtime/channels/client-server-location-runtime.js +10 -11
  110. package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
  111. package/dist/runtime/channels/client-server-service-wire.js +32 -11
  112. package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
  113. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  114. package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
  115. package/dist/runtime/channels/fanout-location-runtime.js +133 -81
  116. package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
  117. package/dist/runtime/channels/spot-direct-envelope.js +4 -3
  118. package/dist/runtime/channels/spot-node-route-transport.js +3 -2
  119. package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
  120. package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
  121. package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
  122. package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
  123. package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
  124. package/dist/runtime/diagnostics/flow-context.js +16 -2
  125. package/dist/runtime/diagnostics/index.d.ts +4 -2
  126. package/dist/runtime/diagnostics/index.js +14 -4
  127. package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
  128. package/dist/runtime/diagnostics/message-flow.js +10 -19
  129. package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
  130. package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
  131. package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
  132. package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
  133. package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
  134. package/dist/runtime/disposal.d.ts +5 -0
  135. package/dist/runtime/disposal.js +22 -0
  136. package/dist/runtime/execution/index.d.ts +22 -9
  137. package/dist/runtime/execution/index.js +107 -37
  138. package/dist/runtime/execution/serial-execution-queue.d.ts +12 -7
  139. package/dist/runtime/execution/serial-execution-queue.js +99 -26
  140. package/dist/runtime/execution/state-lane.d.ts +8 -1
  141. package/dist/runtime/execution/state-lane.js +118 -3
  142. package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
  143. package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
  144. package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
  145. package/dist/runtime/foundation/event-loop-resources.js +6 -119
  146. package/dist/runtime/foundation/listener-records.d.ts +11 -0
  147. package/dist/runtime/foundation/listener-records.js +20 -0
  148. package/dist/runtime/foundation/operation-identity.d.ts +2 -0
  149. package/dist/runtime/foundation/operation-identity.js +9 -5
  150. package/dist/runtime/foundation/operation-registry.d.ts +5 -7
  151. package/dist/runtime/foundation/operation-registry.js +34 -44
  152. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +18 -26
  153. package/dist/runtime/foundation/raw-service-mesh-runtime.js +122 -469
  154. package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
  155. package/dist/runtime/foundation/runtime-state-projections.js +8 -0
  156. package/dist/runtime/foundation/service-authority-payload-codec.d.ts +1 -0
  157. package/dist/runtime/foundation/service-authority-payload-codec.js +30 -12
  158. package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
  159. package/dist/runtime/foundation/service-discovery-registry.js +22 -3
  160. package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
  161. package/dist/runtime/foundation/service-liveness-registry.js +2 -1
  162. package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
  163. package/dist/runtime/foundation/service-maintenance-runtime.js +23 -8
  164. package/dist/runtime/foundation/service-metadata-codec.js +3 -3
  165. package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
  166. package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
  167. package/dist/runtime/foundation/service-relocation-coordinator.d.ts +9 -0
  168. package/dist/runtime/foundation/service-relocation-coordinator.js +14 -1
  169. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +8 -0
  170. package/dist/runtime/foundation/service-relocation-object-owner.js +19 -6
  171. package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
  172. package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
  173. package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
  174. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -19
  175. package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
  176. package/dist/runtime/foundation/service-stateful-registry.js +10 -2
  177. package/dist/runtime/foundation/service-stateful-runtime.d.ts +28 -24
  178. package/dist/runtime/foundation/service-stateful-runtime.js +297 -244
  179. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +12 -7
  180. package/dist/runtime/foundation/service-stateful-wire-codec.js +240 -143
  181. package/dist/runtime/foundation/service-topology-registry.d.ts +1 -3
  182. package/dist/runtime/foundation/service-topology-registry.js +22 -61
  183. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
  184. package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
  185. package/dist/runtime/foundation/service-wire-codec.js +10 -8
  186. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  187. package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
  188. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
  189. package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
  190. package/dist/runtime/framework-errors-internal.d.ts +2 -1
  191. package/dist/runtime/framework-errors-internal.js +343 -122
  192. package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
  193. package/dist/runtime/handlers/handler-instance-scope.js +61 -74
  194. package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
  195. package/dist/runtime/host/actor-packet-relay.js +48 -91
  196. package/dist/runtime/host/actor-placement-coordinator.js +7 -5
  197. package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
  198. package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
  199. package/dist/runtime/host/actor-transfer-runtime.d.ts +28 -28
  200. package/dist/runtime/host/actor-transfer-runtime.js +210 -256
  201. package/dist/runtime/host/application-job-queue.js +16 -33
  202. package/dist/runtime/host/bound-session-relay.js +1 -1
  203. package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
  204. package/dist/runtime/host/index.d.ts +19 -14
  205. package/dist/runtime/host/index.js +234 -175
  206. package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
  207. package/dist/runtime/host/instance-activation-authority.js +17 -45
  208. package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
  209. package/dist/runtime/host/location-runtime-owner.js +2 -2
  210. package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
  211. package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
  212. package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
  213. package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
  214. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
  215. package/dist/runtime/host/remote-bound-session-relay.js +11 -23
  216. package/dist/runtime/host/route-mesh-runtime.d.ts +14 -10
  217. package/dist/runtime/host/route-mesh-runtime.js +178 -257
  218. package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
  219. package/dist/runtime/host/runtime-shutdown.js +18 -21
  220. package/dist/runtime/host/service-relocation-control.js +6 -1
  221. package/dist/runtime/host/service-relocation-host-runtime.d.ts +71 -38
  222. package/dist/runtime/host/service-relocation-host-runtime.js +816 -651
  223. package/dist/runtime/host/spot-address-transport.d.ts +2 -3
  224. package/dist/runtime/host/spot-address-transport.js +34 -136
  225. package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
  226. package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
  227. package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -7
  228. package/dist/runtime/host/spot-runtime-options-factory.js +53 -21
  229. package/dist/runtime/host/stateful-authority-route-runtime.js +6 -2
  230. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +14 -6
  231. package/dist/runtime/host/user-spot-creation-coordinator.js +96 -95
  232. package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
  233. package/dist/runtime/locations/authority-key-codec.js +4 -3
  234. package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
  235. package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
  236. package/dist/runtime/locations/creation-operation-id.js +6 -4
  237. package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
  238. package/dist/runtime/locations/in-memory-authority-store.js +31 -15
  239. package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
  240. package/dist/runtime/locations/in-memory-location-store.js +17 -14
  241. package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
  242. package/dist/runtime/locations/in-memory-provider-location-store.js +79 -27
  243. package/dist/runtime/locations/key-codec.js +3 -2
  244. package/dist/runtime/locations/lease-tracker.d.ts +3 -5
  245. package/dist/runtime/locations/lease-tracker.js +7 -11
  246. package/dist/runtime/locations/lifecycle.d.ts +5 -10
  247. package/dist/runtime/locations/lifecycle.js +4 -33
  248. package/dist/runtime/locations/location-store-failure.d.ts +2 -0
  249. package/dist/runtime/locations/location-store-failure.js +7 -0
  250. package/dist/runtime/locations/location-store-pages.d.ts +3 -0
  251. package/dist/runtime/locations/location-store-pages.js +13 -0
  252. package/dist/runtime/locations/location-store-repository.d.ts +5 -7
  253. package/dist/runtime/locations/location-store-repository.js +303 -332
  254. package/dist/runtime/locations/relocation-blob.js +18 -5
  255. package/dist/runtime/locations/resolvers.d.ts +5 -5
  256. package/dist/runtime/locations/resolvers.js +44 -30
  257. package/dist/runtime/locations/runtime.d.ts +5 -4
  258. package/dist/runtime/locations/runtime.js +123 -92
  259. package/dist/runtime/locations/spot-location-claims.d.ts +8 -2
  260. package/dist/runtime/locations/spot-location-claims.js +40 -23
  261. package/dist/runtime/messaging/payload-codec.js +26 -20
  262. package/dist/runtime/messaging/submission-result.d.ts +3 -0
  263. package/dist/runtime/messaging/submission-result.js +48 -0
  264. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +2 -0
  265. package/dist/runtime/protocol/service_wire_codec.generated.js +17 -8
  266. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +1 -0
  267. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +3 -2
  268. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +3 -3
  269. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +4 -4
  270. package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +6 -3
  271. package/dist/runtime/spots/index.d.ts +29 -29
  272. package/dist/runtime/spots/index.js +441 -313
  273. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -4
  274. package/dist/runtime/spots/spot-activation-registry.js +27 -60
  275. package/dist/runtime/spots/spot-activation-state.d.ts +2 -11
  276. package/dist/runtime/spots/spot-activation-state.js +4 -17
  277. package/dist/runtime/spots/spot-activation.d.ts +10 -9
  278. package/dist/runtime/spots/spot-activation.js +103 -81
  279. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
  280. package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
  281. package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
  282. package/dist/runtime/spots/spot-actor-join-dispatch.js +5 -55
  283. package/dist/runtime/spots/spot-actor-lifecycle-drain.js +2 -2
  284. package/dist/runtime/spots/spot-actor-membership.d.ts +7 -5
  285. package/dist/runtime/spots/spot-actor-membership.js +44 -53
  286. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
  287. package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
  288. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
  289. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
  290. package/dist/runtime/spots/spot-context.d.ts +2 -2
  291. package/dist/runtime/spots/spot-entry-activation.d.ts +3 -4
  292. package/dist/runtime/spots/spot-entry-activation.js +9 -21
  293. package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
  294. package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
  295. package/dist/runtime/spots/spot-manager-public.js +6 -5
  296. package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
  297. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +22 -21
  298. package/dist/runtime/spots/spot-node-runtime-manager.js +73 -82
  299. package/dist/runtime/spots/spot-outbound.d.ts +4 -3
  300. package/dist/runtime/spots/spot-outbound.js +10 -37
  301. package/dist/runtime/spots/spot-remote-codec.js +5 -3
  302. package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
  303. package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
  304. package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
  305. package/dist/runtime/spots/spot-route-replies.js +3 -1
  306. package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -2
  307. package/dist/runtime/spots/spot-routed-actor-admission.js +3 -2
  308. package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +2 -7
  309. package/dist/runtime/spots/spot-routed-frame-dispatch.js +1 -70
  310. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
  311. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
  312. package/dist/runtime/spots/spot-runtime-ports.d.ts +4 -20
  313. package/dist/runtime/spots/spot-serial-executor.d.ts +5 -0
  314. package/dist/runtime/spots/spot-serial-executor.js +9 -2
  315. package/dist/runtime/spots/spot-serial-turn-executor.d.ts +29 -6
  316. package/dist/runtime/spots/spot-serial-turn-executor.js +89 -13
  317. package/dist/runtime/spots/spot-timer.d.ts +3 -2
  318. package/dist/runtime/streams/actor-session-binding-registry.d.ts +17 -32
  319. package/dist/runtime/streams/actor-session-binding-registry.js +145 -367
  320. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +2 -6
  321. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
  322. package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
  323. package/dist/runtime/streams/bound-session-service.d.ts +7 -0
  324. package/dist/runtime/streams/bound-session-service.js +12 -19
  325. package/dist/runtime/streams/index.d.ts +15 -14
  326. package/dist/runtime/streams/index.js +38 -39
  327. package/dist/runtime/streams/managed-stream.d.ts +3 -0
  328. package/dist/runtime/streams/managed-stream.js +17 -8
  329. package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
  330. package/dist/runtime/streams/protocol.d.ts +6 -33
  331. package/dist/runtime/streams/protocol.js +38 -110
  332. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
  333. package/dist/runtime/streams/session-actor-coordinator.js +12 -4
  334. package/dist/runtime/streams/session-calls.d.ts +1 -1
  335. package/dist/runtime/streams/session-calls.js +5 -4
  336. package/dist/runtime/streams/session-context.d.ts +6 -6
  337. package/dist/runtime/streams/session-context.js +22 -4
  338. package/dist/runtime/streams/session-requests.js +2 -1
  339. package/dist/runtime/streams/session-serial-executor.js +2 -2
  340. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
  341. package/dist/runtime/streams/stream-frame-factory.js +2 -2
  342. package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
  343. package/dist/runtime/streams/stream-session-runtime.js +25 -33
  344. package/dist/runtime/workers/index.d.ts +2 -2
  345. package/dist/runtime/workers/index.js +5 -4
  346. package/package.json +3 -3
  347. package/src/contracts/Channels/IZLinkFanoutClient.ts +0 -7
  348. package/src/contracts/Common/CoreTypes.ts +7 -0
  349. package/src/contracts/Common/index.ts +1 -1
  350. package/src/contracts/Configuration/InternalDefaults.ts +12 -0
  351. package/src/contracts/Configuration/Registration.ts +92 -48
  352. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
  353. package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
  354. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  355. package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
  356. package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
  357. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
  358. package/src/contracts/Handlers/JsonContract.ts +14 -4
  359. package/src/contracts/Locations/Authority.ts +7 -3
  360. package/src/contracts/Locations/Options.ts +1 -1
  361. package/src/contracts/Locations/Stores.ts +14 -0
  362. package/src/contracts/RouteMesh/RuntimeTopology.ts +10 -0
  363. package/src/contracts/Spots/Contracts.ts +1 -1
  364. package/src/internal.ts +15 -0
  365. package/src/nest-integration.ts +28 -10
  366. package/src/runtime/abort.ts +6 -5
  367. package/src/runtime/activation-admission.ts +72 -0
  368. package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
  369. package/src/runtime/actors/actor-client.ts +77 -204
  370. package/src/runtime/actors/actor-context.ts +45 -39
  371. package/src/runtime/actors/actor-handoff.ts +55 -45
  372. package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
  373. package/src/runtime/actors/actor-local-native-join.ts +174 -215
  374. package/src/runtime/actors/actor-native-lookup.ts +2 -9
  375. package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
  376. package/src/runtime/actors/actor-remote-joiner.ts +15 -36
  377. package/src/runtime/actors/actor-remote-wire.ts +5 -3
  378. package/src/runtime/actors/actor-request-deadline.ts +49 -0
  379. package/src/runtime/actors/actor-retry-delay.ts +2 -1
  380. package/src/runtime/actors/actor-runtime-contracts.ts +4 -10
  381. package/src/runtime/actors/actor-runtime-state.ts +85 -247
  382. package/src/runtime/actors/actor-source-transfer.ts +5 -18
  383. package/src/runtime/actors/bound-session-wire.ts +2 -8
  384. package/src/runtime/actors/deferred-join-completion.ts +44 -0
  385. package/src/runtime/actors/index.ts +122 -88
  386. package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
  387. package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
  388. package/src/runtime/admission.ts +13 -2
  389. package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
  390. package/src/runtime/backend/contracts/index.ts +15 -42
  391. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -28
  392. package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
  393. package/src/runtime/backend/node/node-backend-adapter-factory.ts +5 -25
  394. package/src/runtime/backend/node/node-backend-adapter-support.ts +32 -35
  395. package/src/runtime/backend/node/node-event-loop-poller.ts +16 -8
  396. package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
  397. package/src/runtime/backend/node/node-raw-binding-port.ts +58 -23
  398. package/src/runtime/backend/node/node-raw-mesh-backend.ts +252 -162
  399. package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -4
  400. package/src/runtime/backend/raw-binding-port.ts +14 -1
  401. package/src/runtime/backend/runtime-values.ts +4 -1
  402. package/src/runtime/channels/channel-clients.ts +132 -96
  403. package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
  404. package/src/runtime/channels/channel-envelope.ts +58 -29
  405. package/src/runtime/channels/channel-outbound-operations.ts +10 -31
  406. package/src/runtime/channels/channel-receive-loops.ts +39 -7
  407. package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
  408. package/src/runtime/channels/channel-runtime-manager.ts +8 -15
  409. package/src/runtime/channels/channel-socket-options.ts +8 -2
  410. package/src/runtime/channels/channel-socket-registry.ts +369 -262
  411. package/src/runtime/channels/channel-transports.ts +161 -115
  412. package/src/runtime/channels/client-server-location-runtime.ts +17 -17
  413. package/src/runtime/channels/client-server-service-wire.ts +40 -12
  414. package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
  415. package/src/runtime/channels/fanout-location-runtime.ts +175 -106
  416. package/src/runtime/channels/spot-direct-envelope.ts +1 -1
  417. package/src/runtime/channels/spot-node-route-transport.ts +5 -2
  418. package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
  419. package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
  420. package/src/runtime/diagnostics/flow-context.ts +16 -2
  421. package/src/runtime/diagnostics/index.ts +27 -17
  422. package/src/runtime/diagnostics/message-flow.ts +15 -25
  423. package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
  424. package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
  425. package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
  426. package/src/runtime/disposal.ts +19 -0
  427. package/src/runtime/execution/index.ts +116 -38
  428. package/src/runtime/execution/serial-execution-queue.ts +179 -34
  429. package/src/runtime/execution/state-lane.ts +142 -4
  430. package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
  431. package/src/runtime/foundation/event-loop-resources.ts +5 -122
  432. package/src/runtime/foundation/listener-records.ts +21 -0
  433. package/src/runtime/foundation/operation-identity.ts +11 -5
  434. package/src/runtime/foundation/operation-registry.ts +33 -50
  435. package/src/runtime/foundation/raw-service-mesh-runtime.ts +170 -571
  436. package/src/runtime/foundation/runtime-state-projections.ts +9 -1
  437. package/src/runtime/foundation/service-authority-payload-codec.ts +41 -13
  438. package/src/runtime/foundation/service-discovery-registry.ts +32 -3
  439. package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
  440. package/src/runtime/foundation/service-liveness-registry.ts +2 -1
  441. package/src/runtime/foundation/service-maintenance-runtime.ts +30 -19
  442. package/src/runtime/foundation/service-metadata-codec.ts +2 -2
  443. package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
  444. package/src/runtime/foundation/service-relocation-coordinator.ts +13 -0
  445. package/src/runtime/foundation/service-relocation-object-owner.ts +23 -7
  446. package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
  447. package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
  448. package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -25
  449. package/src/runtime/foundation/service-stateful-registry.ts +14 -2
  450. package/src/runtime/foundation/service-stateful-runtime.ts +435 -327
  451. package/src/runtime/foundation/service-stateful-wire-codec.ts +329 -199
  452. package/src/runtime/foundation/service-topology-registry.ts +30 -79
  453. package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
  454. package/src/runtime/foundation/service-wire-codec.ts +15 -8
  455. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  456. package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
  457. package/src/runtime/framework-errors-internal.ts +380 -134
  458. package/src/runtime/handlers/handler-instance-scope.ts +68 -95
  459. package/src/runtime/host/actor-packet-relay.ts +57 -147
  460. package/src/runtime/host/actor-placement-coordinator.ts +8 -5
  461. package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
  462. package/src/runtime/host/actor-transfer-runtime.ts +266 -418
  463. package/src/runtime/host/application-job-queue.ts +28 -34
  464. package/src/runtime/host/bound-session-relay.ts +1 -2
  465. package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
  466. package/src/runtime/host/index.ts +408 -312
  467. package/src/runtime/host/instance-activation-authority.ts +89 -109
  468. package/src/runtime/host/location-runtime-owner.ts +4 -2
  469. package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
  470. package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
  471. package/src/runtime/host/remote-bound-session-relay.ts +12 -44
  472. package/src/runtime/host/route-mesh-runtime.ts +236 -275
  473. package/src/runtime/host/runtime-shutdown.ts +17 -21
  474. package/src/runtime/host/service-relocation-control.ts +14 -1
  475. package/src/runtime/host/service-relocation-host-runtime.ts +1161 -904
  476. package/src/runtime/host/spot-address-transport.ts +73 -195
  477. package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
  478. package/src/runtime/host/spot-runtime-options-factory.ts +92 -30
  479. package/src/runtime/host/stateful-authority-route-runtime.ts +8 -4
  480. package/src/runtime/host/user-spot-creation-coordinator.ts +182 -163
  481. package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
  482. package/src/runtime/locations/authority-key-codec.ts +7 -3
  483. package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
  484. package/src/runtime/locations/creation-operation-id.ts +6 -3
  485. package/src/runtime/locations/domain-store-contract.ts +12 -3
  486. package/src/runtime/locations/in-memory-authority-store.ts +44 -15
  487. package/src/runtime/locations/in-memory-location-store.ts +50 -39
  488. package/src/runtime/locations/in-memory-provider-location-store.ts +110 -31
  489. package/src/runtime/locations/key-codec.ts +3 -2
  490. package/src/runtime/locations/lease-tracker.ts +8 -14
  491. package/src/runtime/locations/lifecycle.ts +16 -45
  492. package/src/runtime/locations/location-store-failure.ts +4 -0
  493. package/src/runtime/locations/location-store-pages.ts +18 -0
  494. package/src/runtime/locations/location-store-repository.ts +450 -478
  495. package/src/runtime/locations/relocation-blob.ts +17 -6
  496. package/src/runtime/locations/resolvers.ts +90 -58
  497. package/src/runtime/locations/runtime.ts +220 -110
  498. package/src/runtime/locations/spot-location-claims.ts +54 -26
  499. package/src/runtime/messaging/payload-codec.ts +35 -24
  500. package/src/runtime/messaging/submission-result.ts +57 -1
  501. package/src/runtime/protocol/service_wire_codec.generated.ts +27 -10
  502. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +4 -4
  503. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +6 -6
  504. package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +6 -3
  505. package/src/runtime/spots/index.ts +687 -437
  506. package/src/runtime/spots/spot-activation-registry.ts +42 -71
  507. package/src/runtime/spots/spot-activation-state.ts +4 -16
  508. package/src/runtime/spots/spot-activation.ts +167 -115
  509. package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
  510. package/src/runtime/spots/spot-actor-join-dispatch.ts +25 -79
  511. package/src/runtime/spots/spot-actor-lifecycle-drain.ts +20 -18
  512. package/src/runtime/spots/spot-actor-membership.ts +107 -75
  513. package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
  514. package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
  515. package/src/runtime/spots/spot-context.ts +3 -3
  516. package/src/runtime/spots/spot-entry-activation.ts +13 -33
  517. package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
  518. package/src/runtime/spots/spot-manager-public.ts +29 -21
  519. package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
  520. package/src/runtime/spots/spot-node-runtime-manager.ts +145 -140
  521. package/src/runtime/spots/spot-outbound.ts +47 -68
  522. package/src/runtime/spots/spot-remote-codec.ts +7 -3
  523. package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
  524. package/src/runtime/spots/spot-route-replies.ts +6 -4
  525. package/src/runtime/spots/spot-routed-actor-admission.ts +13 -6
  526. package/src/runtime/spots/spot-routed-frame-dispatch.ts +6 -77
  527. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
  528. package/src/runtime/spots/spot-runtime-ports.ts +10 -43
  529. package/src/runtime/spots/spot-serial-executor.ts +10 -2
  530. package/src/runtime/spots/spot-serial-turn-executor.ts +120 -13
  531. package/src/runtime/spots/spot-timer.ts +3 -2
  532. package/src/runtime/streams/actor-session-binding-registry.ts +182 -560
  533. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +1 -19
  534. package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
  535. package/src/runtime/streams/bound-session-service.ts +23 -37
  536. package/src/runtime/streams/index.ts +102 -88
  537. package/src/runtime/streams/managed-stream.ts +29 -10
  538. package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
  539. package/src/runtime/streams/protocol.ts +34 -88
  540. package/src/runtime/streams/session-actor-coordinator.ts +17 -5
  541. package/src/runtime/streams/session-calls.ts +6 -5
  542. package/src/runtime/streams/session-context.ts +54 -10
  543. package/src/runtime/streams/session-requests.ts +2 -1
  544. package/src/runtime/streams/session-serial-executor.ts +2 -2
  545. package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
  546. package/src/runtime/streams/stream-frame-factory.ts +2 -3
  547. package/src/runtime/streams/stream-session-runtime.ts +57 -59
  548. package/src/runtime/workers/index.ts +13 -12
  549. package/dist/runtime/actors/deferred-join-accepted-journal.d.ts +0 -47
  550. package/dist/runtime/actors/deferred-join-accepted-journal.js +0 -992
  551. package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
  552. package/dist/runtime/actors/post-commit-actor-location.js +0 -72
  553. package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
  554. package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
  555. package/src/runtime/actors/deferred-join-accepted-journal.ts +0 -1346
  556. package/src/runtime/actors/post-commit-actor-location.ts +0 -121
  557. package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
@@ -1,27 +1,32 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ZLinkChannelSocketRegistry = void 0;
4
+ const disposal_1 = require("../disposal");
5
+ const stream_wire_1 = require("@zlink-systems/stream-wire");
6
+ const node_crypto_1 = require("node:crypto");
4
7
  const contracts_1 = require("../../contracts");
5
- const internal_event_contracts_1 = require("../diagnostics/internal-event-contracts");
6
- const configuration_1 = require("../configuration");
7
- const abort_1 = require("../abort");
8
+ const CoreTypes_1 = require("../../contracts/Common/CoreTypes");
9
+ const RegistrationBuilderPolicy_1 = require("../../contracts/Configuration/RegistrationBuilderPolicy");
8
10
  const RuntimeEndpointConnections_1 = require("../../contracts/Configuration/RuntimeEndpointConnections");
9
- const route_member_snapshot_1 = require("./route-member-snapshot");
10
- const framework_errors_internal_1 = require("../framework-errors-internal");
11
- const node_crypto_1 = require("node:crypto");
11
+ const abort_1 = require("../abort");
12
12
  const runtime_message_1 = require("../backend/runtime-message");
13
- const service_discovery_registry_1 = require("../foundation/service-discovery-registry");
13
+ const runtime_values_1 = require("../backend/runtime-values");
14
+ const configuration_1 = require("../configuration");
15
+ const internal_event_contracts_1 = require("../diagnostics/internal-event-contracts");
16
+ const listener_records_1 = require("../foundation/listener-records");
14
17
  const runtime_state_projections_1 = require("../foundation/runtime-state-projections");
18
+ const service_discovery_registry_1 = require("../foundation/service-discovery-registry");
19
+ const service_liveness_registry_1 = require("../foundation/service-liveness-registry");
15
20
  const service_wire_m6a_codec_1 = require("../foundation/service-wire-m6a-codec");
21
+ const framework_errors_internal_1 = require("../framework-errors-internal");
16
22
  const client_server_service_wire_1 = require("./client-server-service-wire");
17
23
  const fanout_service_wire_1 = require("./fanout-service-wire");
18
- const runtime_values_1 = require("../backend/runtime-values");
24
+ const route_member_snapshot_1 = require("./route-member-snapshot");
19
25
  const MAX_LIFECYCLE_GENERATION = 0x7fffffffffffffffn;
20
- const CLIENT_SERVER_PROBE_INTERVAL_MS = 5_000;
21
- const CLIENT_SERVER_PEER_DEADLINE_MS = 15_000;
22
- const CLIENT_SERVER_READY_WAIT_CAP_MS = 5_000;
23
- const CLIENT_SERVER_READY_POLL_INTERVAL_MS = 5;
24
- const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
26
+ const CLIENT_SERVER_PROBE_INTERVAL_MS = service_liveness_registry_1.DEFAULT_SERVICE_PROBE_INTERVAL_MS;
27
+ const CLIENT_SERVER_PEER_DEADLINE_MS = service_liveness_registry_1.DEFAULT_SERVICE_PEER_TIMEOUT_MS;
28
+ const CLIENT_SERVER_LIVENESS_TICK_MS = 100;
29
+ const DEFAULT_SEND_TIMEOUT_MS = 1_000;
25
30
  class ZLinkChannelSocketRegistry {
26
31
  registration;
27
32
  adapter;
@@ -43,7 +48,8 @@ class ZLinkChannelSocketRegistry {
43
48
  routeMeshPublicWeights = new Map();
44
49
  clientServerAdmittedClients = new Map();
45
50
  clientServerServerPeers = new Map();
46
- ownedMonitors = new Set();
51
+ disposal = new disposal_1.RuntimeDisposal();
52
+ ownedResources = new Set();
47
53
  fanoutConnections = new Map();
48
54
  fanoutPublisherNextBeacon = new Map();
49
55
  clientServerLivenessTimer;
@@ -51,17 +57,23 @@ class ZLinkChannelSocketRegistry {
51
57
  clientServerMonitorHandlers = new Map();
52
58
  fanoutMonitorHandlers = new Map();
53
59
  fanoutTopologyHandlers = new Map();
54
- constructor(registration, adapter, context, monitoringAdapter, oneWayFailureSink, applicationJobQueue) {
60
+ listenerRecords;
61
+ constructor(registration, adapter, context, monitoringAdapter, oneWayFailureSink, applicationJobQueue, listenerRecords) {
55
62
  this.registration = registration;
56
63
  this.adapter = adapter;
57
64
  this.context = context;
58
65
  this.monitoringAdapter = monitoringAdapter;
59
66
  this.oneWayFailureSink = oneWayFailureSink;
60
67
  this.applicationJobQueue = applicationJobQueue;
68
+ this.listenerRecords = listenerRecords ?? new listener_records_1.ZLinkListenerRecords();
61
69
  }
62
- async dispose() {
70
+ dispose() {
71
+ return this.disposal.run(() => this.disposeCore());
72
+ }
73
+ async disposeCore() {
74
+ this.clientServerDiscovery.dispose((0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RuntimeShutdown, 'Channel sockets are shutting down.'));
63
75
  const clientServerConnections = [...new Set(this.clientServerConnections.values())];
64
- const clientServerPollers = clientServerConnections.map((connection) => connection.readablePoller);
76
+ const clientServerPollers = clientServerConnections.flatMap((connection) => connection.readablePoller === undefined ? [] : [connection.readablePoller]);
65
77
  const sockets = [
66
78
  ...this.clientDealers.values(),
67
79
  ...clientServerConnections.map((value) => value.dealer),
@@ -77,8 +89,6 @@ class ZLinkChannelSocketRegistry {
77
89
  ...this.routeRouters.values()
78
90
  ]))
79
91
  this.unregisterReceiveFlowSocket(socket);
80
- this.clientDealers.clear();
81
- this.clientServerConnections.clear();
82
92
  this.clientServerReadyIdentities.clear();
83
93
  this.clientServerServerDescriptors.clear();
84
94
  this.clientServerPublicWeights.clear();
@@ -88,23 +98,40 @@ class ZLinkChannelSocketRegistry {
88
98
  this.clientServerMonitorHandlers.clear();
89
99
  this.fanoutMonitorHandlers.clear();
90
100
  this.fanoutTopologyHandlers.clear();
91
- this.fanoutConnections.clear();
92
101
  this.fanoutPublisherNextBeacon.clear();
93
102
  if (this.clientServerLivenessTimer !== undefined) {
94
103
  clearInterval(this.clientServerLivenessTimer);
95
104
  this.clientServerLivenessTimer = undefined;
96
105
  }
97
- this.channelRouters.clear();
98
- this.publishers.clear();
99
- this.routeRouters.clear();
100
106
  this.routeMembers.clear();
101
- const monitors = [...this.ownedMonitors];
102
- this.ownedMonitors.clear();
103
- const cleanup = await Promise.allSettled([
104
- ...clientServerPollers.map((poller) => poller.dispose()),
105
- ...monitors.map((monitor) => monitor.dispose()),
106
- ...sockets.map((socket) => socket.dispose())
107
- ]);
107
+ const cleanup = await Promise.allSettled([...new Set([...clientServerPollers, ...this.ownedResources, ...sockets])].map(async (resource) => {
108
+ await resource.dispose();
109
+ this.ownedResources.delete(resource);
110
+ for (const owners of [
111
+ this.clientDealers,
112
+ this.channelRouters,
113
+ this.publishers,
114
+ this.routeRouters
115
+ ]) {
116
+ for (const [name, owned] of owners)
117
+ if (owned === resource)
118
+ owners.delete(name);
119
+ }
120
+ for (const [name, owned] of this.clientServerConnections) {
121
+ if (owned.dealer === resource)
122
+ this.clientServerConnections.delete(name);
123
+ if (owned.readablePoller === resource)
124
+ owned.readablePoller = undefined;
125
+ if (owned.monitor === resource)
126
+ owned.monitor = undefined;
127
+ }
128
+ for (const [name, owned] of this.fanoutConnections) {
129
+ if (owned.subscriber === resource)
130
+ this.fanoutConnections.delete(name);
131
+ if (owned.monitor === resource)
132
+ owned.monitor = undefined;
133
+ }
134
+ }));
108
135
  const errors = cleanup
109
136
  .filter((result) => result.status === 'rejected')
110
137
  .map((result) => result.reason);
@@ -124,13 +151,16 @@ class ZLinkChannelSocketRegistry {
124
151
  throw new configuration_1.ZLinkConfigurationException(`Channel client '${channelName}' is not registered.`);
125
152
  }
126
153
  const dealer = this.adapter.createDealerSocket(this.context);
154
+ this.clientDealers.set(channelName, dealer);
127
155
  this.registerReceiveFlowSocket(dealer);
128
156
  dealer.setChannelName(channelName);
129
157
  if (channel?.routingId !== undefined && channel.routingId.length > 0) {
130
158
  dealer.setRoutingId(deriveRoutingId(channel.routingId, 'dealer'));
131
159
  }
132
- applySocketConfig(dealer, client);
133
- this.clientDealers.set(channelName, dealer);
160
+ applySocketConfig(dealer, {
161
+ ...client,
162
+ sendTimeoutMs: configuredSendTimeoutMs(client.sendTimeoutMs)
163
+ });
134
164
  return dealer;
135
165
  }
136
166
  channelRouter(channelName) {
@@ -146,6 +176,7 @@ class ZLinkChannelSocketRegistry {
146
176
  throw new configuration_1.ZLinkConfigurationException(`Channel server '${channelName}' does not define a bind endpoint.`);
147
177
  }
148
178
  const router = this.adapter.createRouterSocket(this.context);
179
+ this.channelRouters.set(channelName, router);
149
180
  this.registerReceiveFlowSocket(router);
150
181
  router.setChannelName(channelName);
151
182
  const identity = this.clientServerIdentities.get(channelName) ?? {
@@ -154,14 +185,14 @@ class ZLinkChannelSocketRegistry {
154
185
  };
155
186
  this.clientServerIdentities.set(channelName, identity);
156
187
  router.setRoutingId(identity.serverRid);
157
- const publicWeight = channel.server.weight ?? 100;
188
+ const publicWeight = channel.server.weight ?? RegistrationBuilderPolicy_1.ZLINK_DEFAULT_PUBLIC_WEIGHT;
158
189
  this.clientServerPublicWeights.set(channelName, publicWeight);
159
190
  router.peerWeight = rawAvailabilityWeight(publicWeight);
160
191
  applySocketConfig(router, channel.server);
161
192
  router.bind(channel.server.bind);
162
193
  if (this.monitoringAdapter !== undefined) {
163
194
  const monitor = this.monitoringAdapter.openSocketMonitor(router);
164
- this.ownedMonitors.add(monitor);
195
+ this.ownedResources.add(monitor);
165
196
  monitor.onEvent((event) => {
166
197
  if (event.routingId === undefined)
167
198
  return;
@@ -176,15 +207,15 @@ class ZLinkChannelSocketRegistry {
176
207
  this.clientServerAdmittedClients.get(channelName)?.delete(routingId);
177
208
  });
178
209
  }
179
- this.channelRouters.set(channelName, router);
210
+ const endpoint = advertisedEndpoint(router.lastEndpoint ?? channel.server.bind, channel.server.advertiseHost);
211
+ this.recordListener('clientServer', channelName, endpoint);
180
212
  if (!this.clientServerServerDescriptors.has(channelName)) {
181
- const boundEndpoint = router.lastEndpoint ?? channel.server.bind;
182
213
  this.clientServerServerDescriptors.set(channelName, {
183
214
  channelName,
184
215
  serverRid: identity.serverRid,
185
216
  lifecycleGeneration: identity.lifecycleGeneration,
186
217
  descriptorRevision: 1n,
187
- endpoint: advertisedEndpoint(boundEndpoint, channel.server.advertiseHost),
218
+ endpoint,
188
219
  weight: publicWeight,
189
220
  state: contracts_1.ZLinkFrameworkRuntimeState.Serving,
190
221
  securityIdentity: 'default',
@@ -196,27 +227,26 @@ class ZLinkChannelSocketRegistry {
196
227
  return router;
197
228
  }
198
229
  clientServerServerIdentity(channelName) {
199
- const router = this.channelRouter(channelName);
230
+ this.channelRouter(channelName);
200
231
  const identity = this.clientServerIdentities.get(channelName);
201
- const channel = this.registration.channels.get(channelName);
202
- if (identity === undefined || channel?.server === undefined) {
232
+ const endpoint = this.listenerRecords.endpoint('clientServer', channelName);
233
+ if (identity === undefined || endpoint === undefined) {
203
234
  throw new configuration_1.ZLinkConfigurationException(`Channel server '${channelName}' is not registered.`);
204
235
  }
205
- const boundEndpoint = router.lastEndpoint ?? channel.server.bind;
206
- if (boundEndpoint === undefined || boundEndpoint.length === 0) {
207
- throw new configuration_1.ZLinkConfigurationException(`Channel server '${channelName}' did not report its bound endpoint.`);
208
- }
209
- return {
210
- ...identity,
211
- endpoint: advertisedEndpoint(boundEndpoint, channel.server.advertiseHost)
212
- };
236
+ return { ...identity, endpoint };
237
+ }
238
+ fanoutPublisherEndpoint(channelName) {
239
+ return this.listenerRecords.endpoint('fanout', channelName);
240
+ }
241
+ recordListener(kind, name, endpoint) {
242
+ this.listenerRecords.record(kind, name, endpoint);
213
243
  }
214
244
  clientServerServerSocket(channelName) {
215
245
  return this.channelRouter(channelName);
216
246
  }
217
247
  clientServerServerWeight(channelName) {
218
248
  this.channelRouter(channelName);
219
- return this.clientServerPublicWeights.get(channelName) ?? 100;
249
+ return this.clientServerPublicWeights.get(channelName) ?? RegistrationBuilderPolicy_1.ZLINK_DEFAULT_PUBLIC_WEIGHT;
220
250
  }
221
251
  setClientServerServerWeight(channelName, weight) {
222
252
  requirePublicWeight(weight);
@@ -237,50 +267,33 @@ class ZLinkChannelSocketRegistry {
237
267
  throw new configuration_1.ZLinkConfigurationException(`Channel client '${channelName}' is not registered.`);
238
268
  }
239
269
  const dealer = this.adapter.createDealerSocket(this.context);
240
- this.registerReceiveFlowSocket(dealer);
241
- dealer.setChannelName(channelName);
242
- dealer.setRoutingId(`cs-client-${(0, node_crypto_1.randomUUID)()}`);
243
- applySocketConfig(dealer, client);
244
- const cleanupDealer = () => {
245
- this.unregisterReceiveFlowSocket(dealer);
246
- void Promise.allSettled([dealer.dispose()]);
247
- };
248
- let readablePoller;
249
- try {
250
- readablePoller = this.adapter.createReadablePoller(dealer);
251
- }
252
- catch (error) {
253
- cleanupDealer();
254
- throw error;
255
- }
256
- let monitor;
257
- try {
258
- monitor = this.monitoringAdapter.openSocketMonitor(dealer);
259
- }
260
- catch (error) {
261
- try {
262
- readablePoller.dispose();
263
- }
264
- finally {
265
- cleanupDealer();
266
- }
267
- throw error;
268
- }
269
- this.ownedMonitors.add(monitor);
270
270
  const connection = {
271
271
  channelName,
272
272
  endpoint,
273
273
  dealer,
274
- readablePoller,
275
- monitor,
276
274
  aliases: new Set([connectionId]),
277
275
  callbacksByAlias: new Map([[connectionId, callbacks]]),
278
- physicalConnectionId: Symbol(connectionId),
279
- terminationRequested: false
276
+ physicalConnectionId: Symbol(connectionId)
280
277
  };
281
- this.clientServerConnections.set(connectionId, connection);
282
- this.ensureClientServerLivenessTimer();
278
+ this.ownedResources.add(dealer);
279
+ const created = [dealer];
283
280
  try {
281
+ this.clientServerConnections.set(connectionId, connection);
282
+ this.registerReceiveFlowSocket(dealer);
283
+ dealer.setChannelName(channelName);
284
+ dealer.setRoutingId(`cs-client-${(0, node_crypto_1.randomUUID)()}`);
285
+ applySocketConfig(dealer, {
286
+ ...client,
287
+ sendTimeoutMs: configuredSendTimeoutMs(client.sendTimeoutMs)
288
+ });
289
+ connection.readablePoller = this.adapter.createReadablePoller(dealer);
290
+ created.push(connection.readablePoller);
291
+ this.ownedResources.add(connection.readablePoller);
292
+ const monitor = this.monitoringAdapter.openSocketMonitor(dealer);
293
+ connection.monitor = monitor;
294
+ created.push(monitor);
295
+ this.ownedResources.add(monitor);
296
+ this.ensureClientServerLivenessTimer();
284
297
  monitor.onEvent((event) => {
285
298
  if (![...connection.aliases].some((alias) => this.clientServerConnections.get(alias) === connection))
286
299
  return;
@@ -290,7 +303,7 @@ class ZLinkChannelSocketRegistry {
290
303
  const routingId = event.routingId === undefined ? undefined : String(event.routingId);
291
304
  if (event.nativeEvent === internal_event_contracts_1.ZLinkSocketNativeEventType.ConnectionReady) {
292
305
  // This single-endpoint DEALER also receives its disconnected ready-count snapshot.
293
- if (event.value === 0n || connection.terminationRequested)
306
+ if (event.value === 0n)
294
307
  return;
295
308
  connection.physicalConnectionId = Symbol(connectionId);
296
309
  connection.admissionAttempt = undefined;
@@ -304,47 +317,32 @@ class ZLinkChannelSocketRegistry {
304
317
  event.nativeEvent === internal_event_contracts_1.ZLinkSocketNativeEventType.HandshakeFailedNoDetail ||
305
318
  event.nativeEvent === internal_event_contracts_1.ZLinkSocketNativeEventType.HandshakeFailedProtocol ||
306
319
  event.nativeEvent === internal_event_contracts_1.ZLinkSocketNativeEventType.HandshakeFailedAuth) {
307
- if (connection.terminationRequested &&
308
- (event.remoteAddr !== connection.endpoint ||
309
- (event.nativeEvent !== internal_event_contracts_1.ZLinkSocketNativeEventType.Disconnected &&
310
- event.nativeEvent !== internal_event_contracts_1.ZLinkSocketNativeEventType.Closed)))
311
- return;
312
- connection.physicalConnectionId = Symbol(connectionId);
313
- connection.admissionAttempt = undefined;
314
- if (connection.readyConnectionId !== undefined) {
315
- this.removeReadyConnection(connection.readyConnectionId);
316
- }
317
- for (const currentCallbacks of [...connection.callbacksByAlias.values()]) {
318
- currentCallbacks.onTerminated(routingId, event.remoteAddr);
319
- }
320
- if (connection.terminationRequested) {
321
- connection.terminationRequested = false;
322
- // Explicit disconnect removes intent; restore it once after this endpoint closes.
323
- connection.dealer.connect(connection.endpoint);
324
- }
320
+ // Core owns the endpoint reconnect (transport liveness §6); the
321
+ // connect intent stays and the next READY starts a new admission.
322
+ this.endClientServerAdmission(connectionId, connection, routingId, event.remoteAddr);
325
323
  }
326
324
  });
327
325
  dealer.connect(endpoint);
326
+ return dealer;
328
327
  }
329
328
  catch (error) {
330
329
  this.clientServerConnections.delete(connectionId);
331
- this.ownedMonitors.delete(monitor);
332
- try {
333
- readablePoller.dispose();
334
- }
335
- finally {
336
- cleanupDealer();
337
- void Promise.allSettled([monitor.dispose()]);
338
- }
330
+ this.unregisterReceiveFlowSocket(dealer);
331
+ void Promise.allSettled(created.map(async (resource) => {
332
+ await resource.dispose();
333
+ this.ownedResources.delete(resource);
334
+ })).then((results) => {
335
+ for (const result of results)
336
+ if (result.status === 'rejected')
337
+ this.oneWayFailureSink?.(result.reason);
338
+ });
339
339
  throw error;
340
340
  }
341
- return dealer;
342
341
  }
343
342
  async closeClientServerConnection(connectionId) {
344
343
  const current = this.clientServerConnections.get(connectionId);
345
344
  if (current === undefined)
346
345
  return;
347
- this.clientServerConnections.delete(connectionId);
348
346
  current.aliases.delete(connectionId);
349
347
  current.callbacksByAlias.delete(connectionId);
350
348
  const ready = this.clientServerReadyIdentities.get(connectionId);
@@ -364,21 +362,34 @@ class ZLinkChannelSocketRegistry {
364
362
  });
365
363
  }
366
364
  }
367
- if (current.aliases.size > 0)
365
+ this.notifyClientServerTopology(current.channelName);
366
+ if (current.aliases.size > 0) {
367
+ this.clientServerConnections.delete(connectionId);
368
368
  return;
369
+ }
369
370
  await this.disposeClientServerPhysical(connectionId, current);
371
+ this.clientServerConnections.delete(connectionId);
370
372
  }
371
373
  async disposeClientServerPhysical(connectionId, current) {
372
374
  try {
373
375
  current.dealer.disconnect(current.endpoint);
374
376
  }
375
377
  catch {
376
- // Disposal below is the terminal cleanup if the transport already closed.
378
+ // The socket close below releases an endpoint that is already disconnected.
377
379
  }
378
- this.ownedMonitors.delete(current.monitor);
379
380
  this.unregisterReceiveFlowSocket(current.dealer);
380
- current.readablePoller.dispose();
381
- const results = await Promise.allSettled([current.monitor.dispose(), current.dealer.dispose()]);
381
+ if (current.readablePoller !== undefined) {
382
+ current.readablePoller.dispose();
383
+ this.ownedResources.delete(current.readablePoller);
384
+ current.readablePoller = undefined;
385
+ }
386
+ const results = await Promise.allSettled([
387
+ current.monitor?.dispose(),
388
+ (async () => {
389
+ await current.dealer.dispose();
390
+ this.ownedResources.delete(current.dealer);
391
+ })()
392
+ ]);
382
393
  const errors = results
383
394
  .filter((result) => result.status === 'rejected')
384
395
  .map((result) => result.reason);
@@ -387,6 +398,8 @@ class ZLinkChannelSocketRegistry {
387
398
  if (errors.length > 1) {
388
399
  throw new AggregateError(errors, `ClientServer connection '${connectionId}' cleanup failed.`);
389
400
  }
401
+ if (current.monitor !== undefined)
402
+ this.ownedResources.delete(current.monitor);
390
403
  }
391
404
  admitClientServerConnection(descriptor, connectionId) {
392
405
  const connection = this.clientServerConnections.get(connectionId);
@@ -396,6 +409,7 @@ class ZLinkChannelSocketRegistry {
396
409
  const admitted = this.clientServerDiscovery.admitClientServer(descriptor, connection.readyConnectionId);
397
410
  if (admitted)
398
411
  connection.admittedDescriptor = descriptor;
412
+ this.notifyClientServerTopology(descriptor.channelName);
399
413
  return admitted;
400
414
  }
401
415
  const duplicateId = [...this.clientServerReadyIdentities].find(([, identity]) => identity.channelName === descriptor.channelName &&
@@ -429,6 +443,7 @@ class ZLinkChannelSocketRegistry {
429
443
  connection.readyConnectionId = connectionId;
430
444
  connection.admittedDescriptor = descriptor;
431
445
  }
446
+ this.notifyClientServerTopology(descriptor.channelName);
432
447
  return admitted;
433
448
  }
434
449
  removeClientServerReady(channelName, serverRoutingId, connectionId) {
@@ -443,6 +458,7 @@ class ZLinkChannelSocketRegistry {
443
458
  connection.outstandingProbeId = undefined;
444
459
  }
445
460
  }
461
+ this.notifyClientServerTopology(channelName);
446
462
  return removed;
447
463
  }
448
464
  selectClientServerDealer(channelName) {
@@ -466,47 +482,58 @@ class ZLinkChannelSocketRegistry {
466
482
  }
467
483
  return undefined;
468
484
  }
469
- /**
470
- * Resolves a ClientServer send target, waiting when the ready candidate set is still empty, as
471
- * `framework/doc/framework/common/spec/server/02-channel-transport/02-channel-messaging.ko.md` §3.2 requires: the call waits
472
- * at call time for a bounded period and then fails with no-target. The bound is the shorter of
473
- * the call's remaining deadline and five seconds, mirroring the .NET reference
474
- * `ZLinkClientServerClientRuntime.WaitForReadyAsync`. The wait lives here because this registry
475
- * owns ClientServer connections, admission and weighted selection. Sends have no per-call
476
- * timeout, so they use the Channel's request timeout.
477
- *
478
- * The wait only observes admission that is already in flight: it never opens or reconnects a
479
- * connection, so it cannot trigger the admission it waits for, and Framework startup keeps not
480
- * waiting for local ClientServer admission. It applies whenever nothing is selectable, including
481
- * candidate sets excluded by weight 0 or drain, because `selectClientServerDealer` filters the
482
- * same way the reference `SelectReady()` does.
483
- *
484
- * Every attempt yields to the event loop between polls. ClientServer admission completes on the
485
- * monitor drains that the backend poll timer pumps, so a synchronous wait would starve the
486
- * admission it is waiting for and burn the whole bound before failing anyway. That is this
487
- * execution model's form of the hazard the JVM mirror avoids by not holding the admission
488
- * monitor across its sleep.
489
- */
490
- async awaitClientDealerForOutbound(channelName, signal, deadlineAtMs) {
491
- const startedAtMs = performance.now();
492
- const deadline = Math.min(deadlineAtMs ??
493
- startedAtMs +
494
- (this.registration.channels.get(channelName)?.requestTimeoutMs ??
495
- this.registration.requestTimeoutMs ??
496
- DEFAULT_REQUEST_TIMEOUT_MS), startedAtMs + CLIENT_SERVER_READY_WAIT_CAP_MS);
497
- for (;;) {
498
- this.drainSocketMonitors();
485
+ /** Observes discovery changes until the client DEALER admission deadline. */
486
+ async awaitClientDealerForOutbound(channelName, signal) {
487
+ (0, abort_1.throwIfAborted)(signal);
488
+ const select = () => {
499
489
  const dealer = this.clientDealerForOutbound(channelName);
500
490
  if (dealer !== undefined)
501
491
  return dealer;
502
- const remainingMs = deadline - performance.now();
503
- if (remainingMs <= 0)
504
- return undefined;
505
- (0, abort_1.throwIfAborted)(signal);
506
- await new Promise((resolve) => {
507
- setTimeout(resolve, Math.min(CLIENT_SERVER_READY_POLL_INTERVAL_MS, remainingMs));
508
- });
509
- }
492
+ if (this.clientServerDiscovery.hasReadyClientServer(channelName)) {
493
+ throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RouteNotConnected, `Channel '${channelName}' has no eligible ClientServer member.`);
494
+ }
495
+ return undefined;
496
+ };
497
+ const dealer = select();
498
+ if (dealer !== undefined)
499
+ return dealer;
500
+ const sendTimeoutMs = configuredSendTimeoutMs(this.registration.channels.get(channelName)?.client?.sendTimeoutMs);
501
+ return new Promise((resolve, reject) => {
502
+ const cleanup = () => {
503
+ clearTimeout(deadline);
504
+ unsubscribe();
505
+ signal?.removeEventListener('abort', abort);
506
+ };
507
+ const abort = () => {
508
+ cleanup();
509
+ reject((0, abort_1.createAbortError)());
510
+ };
511
+ const changed = (error) => {
512
+ try {
513
+ if (error !== undefined)
514
+ throw error;
515
+ const selected = select();
516
+ if (selected === undefined)
517
+ return;
518
+ cleanup();
519
+ resolve(selected);
520
+ }
521
+ catch (error) {
522
+ cleanup();
523
+ reject(error);
524
+ }
525
+ };
526
+ const unsubscribe = this.clientServerDiscovery.onClientServerChanged(changed);
527
+ const deadline = setTimeout(() => {
528
+ cleanup();
529
+ resolve(undefined);
530
+ }, sendTimeoutMs);
531
+ signal?.addEventListener('abort', abort, { once: true });
532
+ // Registration and selection share one event-loop turn; recheck after subscribing.
533
+ changed();
534
+ if (signal?.aborted === true)
535
+ abort();
536
+ });
510
537
  }
511
538
  startManualClientServerConnections() {
512
539
  for (const [channelName, channel] of this.registration.channels) {
@@ -535,26 +562,39 @@ class ZLinkChannelSocketRegistry {
535
562
  }
536
563
  }
537
564
  clientServerMonitoringSource(channelName) {
538
- if (this.registration.channels.get(channelName)?.client === undefined) {
539
- throw new configuration_1.ZLinkConfigurationException(`Channel client '${channelName}' is not registered.`);
565
+ const channel = this.registration.channels.get(channelName);
566
+ if (channel?.client === undefined && channel?.server === undefined) {
567
+ throw new configuration_1.ZLinkConfigurationException(`ClientServer channel '${channelName}' is not registered.`);
540
568
  }
541
569
  let disposed = false;
542
570
  let handler;
571
+ const register = (next) => {
572
+ if (disposed)
573
+ return;
574
+ if (handler !== undefined) {
575
+ this.clientServerMonitorHandlers.get(channelName)?.delete(handler);
576
+ }
577
+ handler = next;
578
+ let handlers = this.clientServerMonitorHandlers.get(channelName);
579
+ if (handlers === undefined) {
580
+ handlers = new Set();
581
+ this.clientServerMonitorHandlers.set(channelName, handlers);
582
+ }
583
+ handlers.add(next);
584
+ };
543
585
  return {
544
586
  nativeInstance: {},
545
587
  onEvent: (next) => {
546
- if (disposed)
547
- return;
548
- if (handler !== undefined) {
549
- this.clientServerMonitorHandlers.get(channelName)?.delete(handler);
550
- }
551
- handler = next;
552
- let handlers = this.clientServerMonitorHandlers.get(channelName);
553
- if (handlers === undefined) {
554
- handlers = new Set();
555
- this.clientServerMonitorHandlers.set(channelName, handlers);
556
- }
557
- handlers.add(next);
588
+ register((event) => {
589
+ if (event !== undefined)
590
+ next(event);
591
+ });
592
+ },
593
+ onChange: (next) => {
594
+ register((event) => {
595
+ if (event === undefined)
596
+ next();
597
+ });
558
598
  },
559
599
  drain: () => 0,
560
600
  dispose: async () => {
@@ -588,9 +628,6 @@ class ZLinkChannelSocketRegistry {
588
628
  ? 1
589
629
  : 0);
590
630
  }
591
- hasKnownClientServerTargets(channelName) {
592
- return this.clientServerDiscovery.clientServerDescriptors(channelName).length > 0;
593
- }
594
631
  fanoutActiveTargets(channelName) {
595
632
  return this.clientServerDiscovery.fanoutEndpoints(channelName);
596
633
  }
@@ -622,6 +659,11 @@ class ZLinkChannelSocketRegistry {
622
659
  this.clientServerServerDescriptors.set(channelName, descriptor);
623
660
  this.pushClientServerDescriptorUpdate(channelName, descriptor);
624
661
  }
662
+ this.notifyClientServerTopology(channelName);
663
+ }
664
+ notifyClientServerTopology(channelName) {
665
+ for (const handler of this.clientServerMonitorHandlers.get(channelName) ?? [])
666
+ handler();
625
667
  }
626
668
  tryHandleClientServerControl(channelName, received, router) {
627
669
  if (received.parts.length === 0)
@@ -648,17 +690,17 @@ class ZLinkChannelSocketRegistry {
648
690
  else if (record.kind !== 'hello' ||
649
691
  received.parts.length !== 1 ||
650
692
  received.replyToken === null) {
651
- reply = (0, client_server_service_wire_1.encodeClientServerReject)(1);
693
+ reply = (0, client_server_service_wire_1.encodeClientServerReject)(client_server_service_wire_1.ClientServerRejectReason.ProtocolVersionUnsupported);
652
694
  }
653
695
  else {
654
696
  const descriptor = this.clientServerServerDescriptors.get(channelName);
655
697
  if (descriptor === undefined ||
656
698
  record.hello.channelName !== channelName ||
657
699
  record.hello.securityIdentity !== descriptor.securityIdentity) {
658
- reply = (0, client_server_service_wire_1.encodeClientServerReject)(3);
700
+ reply = (0, client_server_service_wire_1.encodeClientServerReject)(client_server_service_wire_1.ClientServerRejectReason.AdmissionMismatch);
659
701
  }
660
702
  else {
661
- const normalizedEffectiveMaxMessageBytes = Math.min(normalizedMessageLimit(router.maxMessageSize), record.hello.normalizedEffectiveMaxMessageBytes);
703
+ const normalizedEffectiveMaxMessageBytes = Math.min((0, client_server_service_wire_1.normalizeClientServerMessageLimit)(router.maxMessageSize), record.hello.normalizedEffectiveMaxMessageBytes);
662
704
  reply = (0, client_server_service_wire_1.encodeClientServerAdmit)(descriptor, normalizedEffectiveMaxMessageBytes);
663
705
  this.admitClientServerServerPeer(channelName, String(received.routingId), normalizedEffectiveMaxMessageBytes);
664
706
  }
@@ -689,7 +731,7 @@ class ZLinkChannelSocketRegistry {
689
731
  if (connection.deadlineAt === undefined)
690
732
  continue;
691
733
  if (nowMs >= connection.deadlineAt) {
692
- this.requestClientServerEndpointTermination(connectionId, connection);
734
+ this.restartClientServerAdmission(connectionId, connection);
693
735
  continue;
694
736
  }
695
737
  if (connection.nextProbeAt === undefined || nowMs < connection.nextProbeAt)
@@ -732,23 +774,26 @@ class ZLinkChannelSocketRegistry {
732
774
  throw new configuration_1.ZLinkConfigurationException(`Fanout subscriber '${channelName}' is not registered.`);
733
775
  }
734
776
  const subscriber = this.adapter.createSubscriberSocket(this.context);
735
- subscriber.setChannelName(channelName);
736
- setFanoutSubscriptions(subscriber, channel.subscriptions);
737
- const monitor = this.monitoringAdapter.openSocketMonitor(subscriber);
738
777
  const connection = {
739
778
  channelName,
740
779
  endpoint,
741
780
  subscriber,
742
- monitor,
743
781
  callbacks,
744
782
  physicalConnectionId: Symbol(connectionId),
745
783
  transportReady: false,
746
784
  ready: false
747
785
  };
748
- this.fanoutConnections.set(connectionId, connection);
749
- this.ownedMonitors.add(monitor);
750
- this.ensureClientServerLivenessTimer();
786
+ this.ownedResources.add(subscriber);
787
+ const created = [subscriber];
751
788
  try {
789
+ this.fanoutConnections.set(connectionId, connection);
790
+ subscriber.setChannelName(channelName);
791
+ setFanoutSubscriptions(subscriber, channel.subscriptions);
792
+ const monitor = this.monitoringAdapter.openSocketMonitor(subscriber);
793
+ connection.monitor = monitor;
794
+ created.push(monitor);
795
+ this.ownedResources.add(monitor);
796
+ this.ensureClientServerLivenessTimer();
752
797
  monitor.onEvent((event) => {
753
798
  if (this.fanoutConnections.get(connectionId) !== connection)
754
799
  return;
@@ -771,30 +816,37 @@ class ZLinkChannelSocketRegistry {
771
816
  }
772
817
  });
773
818
  subscriber.connect(endpoint);
819
+ return subscriber;
774
820
  }
775
821
  catch (error) {
776
822
  this.fanoutConnections.delete(connectionId);
777
- this.ownedMonitors.delete(monitor);
778
- void Promise.allSettled([monitor.dispose(), subscriber.dispose()]);
823
+ void Promise.allSettled(created.map(async (resource) => {
824
+ await resource.dispose();
825
+ this.ownedResources.delete(resource);
826
+ })).then((results) => {
827
+ for (const result of results)
828
+ if (result.status === 'rejected')
829
+ this.oneWayFailureSink?.(result.reason);
830
+ });
779
831
  throw error;
780
832
  }
781
- return subscriber;
782
833
  }
783
834
  async closeFanoutSubscriberConnection(connectionId) {
784
835
  const connection = this.fanoutConnections.get(connectionId);
785
836
  if (connection === undefined)
786
837
  return;
787
- this.fanoutConnections.delete(connectionId);
788
838
  try {
789
839
  connection.subscriber.disconnect(connection.endpoint);
790
840
  }
791
841
  catch {
792
- // Disposal remains the terminal cleanup path.
842
+ // The socket close below releases an endpoint that is already disconnected.
793
843
  }
794
- this.ownedMonitors.delete(connection.monitor);
795
844
  const results = await Promise.allSettled([
796
- connection.monitor.dispose(),
797
- connection.subscriber.dispose()
845
+ connection.monitor?.dispose(),
846
+ (async () => {
847
+ await connection.subscriber.dispose();
848
+ this.ownedResources.delete(connection.subscriber);
849
+ })()
798
850
  ]);
799
851
  const errors = results
800
852
  .filter((result) => result.status === 'rejected')
@@ -804,6 +856,9 @@ class ZLinkChannelSocketRegistry {
804
856
  if (errors.length > 1) {
805
857
  throw new AggregateError(errors, `Fanout connection '${connectionId}' cleanup failed.`);
806
858
  }
859
+ this.fanoutConnections.delete(connectionId);
860
+ if (connection.monitor !== undefined)
861
+ this.ownedResources.delete(connection.monitor);
807
862
  }
808
863
  handleFanoutInbound(connectionId, topicMessage, source, nowMs = performance.now()) {
809
864
  return this.handleFanoutInboundResult(connectionId, topicMessage, source, nowMs).consumed;
@@ -993,10 +1048,8 @@ class ZLinkChannelSocketRegistry {
993
1048
  }
994
1049
  }
995
1050
  drainClientServerControl(connectionId, connection) {
996
- if (connection.terminationRequested)
997
- return;
998
1051
  for (;;) {
999
- if (!connection.readablePoller.wait(0))
1052
+ if (connection.readablePoller === undefined || !connection.readablePoller.wait(0))
1000
1053
  return;
1001
1054
  const received = connection.dealer.recv(1);
1002
1055
  if (received === undefined) {
@@ -1025,7 +1078,7 @@ class ZLinkChannelSocketRegistry {
1025
1078
  this.applyClientServerDescriptorUpdate(connectionId, connection, record.admission);
1026
1079
  }
1027
1080
  catch (error) {
1028
- this.requestClientServerEndpointTermination(connectionId, connection);
1081
+ this.restartClientServerAdmission(connectionId, connection);
1029
1082
  this.oneWayFailureSink?.(error);
1030
1083
  return;
1031
1084
  }
@@ -1034,18 +1087,30 @@ class ZLinkChannelSocketRegistry {
1034
1087
  }
1035
1088
  }
1036
1089
  }
1037
- requestClientServerEndpointTermination(connectionId, connection) {
1038
- if (connection.terminationRequested)
1039
- return;
1040
- connection.terminationRequested = true;
1090
+ /**
1091
+ * Ends the current logical admission of this connection: later replies of
1092
+ * the fenced attempt no longer apply and its ready target is withdrawn.
1093
+ */
1094
+ endClientServerAdmission(connectionId, connection, routingId, endpoint) {
1041
1095
  connection.physicalConnectionId = Symbol(connectionId);
1042
1096
  connection.admissionAttempt = undefined;
1043
- this.removeReadyConnection(connectionId);
1044
- try {
1045
- connection.dealer.disconnect(connection.endpoint);
1097
+ if (connection.readyConnectionId !== undefined) {
1098
+ this.removeReadyConnection(connection.readyConnectionId);
1046
1099
  }
1047
- catch (error) {
1048
- this.oneWayFailureSink?.(error);
1100
+ for (const callbacks of [...connection.callbacksByAlias.values()]) {
1101
+ callbacks.onTerminated(routingId, endpoint);
1102
+ }
1103
+ }
1104
+ /**
1105
+ * A peer deadline or an invalid pushed control ends only the current logical
1106
+ * admission. The connect intent stays with Core, which owns the endpoint
1107
+ * reconnect (transport liveness §6); the service handshake starts again on
1108
+ * the existing admission path.
1109
+ */
1110
+ restartClientServerAdmission(connectionId, connection) {
1111
+ this.endClientServerAdmission(connectionId, connection, undefined, connection.endpoint);
1112
+ for (const callbacks of [...connection.callbacksByAlias.values()]) {
1113
+ callbacks.onTransportReady('', connection.endpoint);
1049
1114
  }
1050
1115
  }
1051
1116
  applyClientServerDescriptorUpdate(connectionId, connection, admission) {
@@ -1088,12 +1153,13 @@ class ZLinkChannelSocketRegistry {
1088
1153
  ensureClientServerLivenessTimer() {
1089
1154
  if (this.clientServerLivenessTimer !== undefined)
1090
1155
  return;
1091
- this.clientServerLivenessTimer = setInterval(() => this.tickClientServerLiveness(), 100);
1156
+ this.clientServerLivenessTimer = setInterval(() => this.tickClientServerLiveness(), CLIENT_SERVER_LIVENESS_TICK_MS);
1092
1157
  this.clientServerLivenessTimer.unref();
1093
1158
  }
1094
1159
  drainSocketMonitors() {
1095
- for (const monitor of this.ownedMonitors)
1096
- monitor.drain();
1160
+ for (const monitor of this.ownedResources)
1161
+ if ('drain' in monitor)
1162
+ monitor.drain();
1097
1163
  }
1098
1164
  removeReadyConnection(connectionId) {
1099
1165
  const identity = this.clientServerReadyIdentities.get(connectionId);
@@ -1110,6 +1176,7 @@ class ZLinkChannelSocketRegistry {
1110
1176
  connection.nextProbeAt = undefined;
1111
1177
  connection.outstandingProbeId = undefined;
1112
1178
  }
1179
+ this.notifyClientServerTopology(identity.channelName);
1113
1180
  }
1114
1181
  requestClientServerLiveness(connectionId, connection, probeId) {
1115
1182
  const message = runtime_message_1.ZLinkBufferMessage.from((0, client_server_service_wire_1.encodeClientServerLivenessProbe)(probeId));
@@ -1203,7 +1270,7 @@ class ZLinkChannelSocketRegistry {
1203
1270
  }
1204
1271
  allocateClientServerProbeId() {
1205
1272
  const result = this.nextClientServerProbeId;
1206
- this.nextClientServerProbeId = result === 0xffffffffffffffffn ? 1n : result + 1n;
1273
+ this.nextClientServerProbeId = result === stream_wire_1.UINT64_MAX ? 1n : result + 1n;
1207
1274
  return result;
1208
1275
  }
1209
1276
  publisher(channelName) {
@@ -1219,25 +1286,18 @@ class ZLinkChannelSocketRegistry {
1219
1286
  throw new configuration_1.ZLinkConfigurationException(`Channel publisher '${channelName}' does not define a bind endpoint.`);
1220
1287
  }
1221
1288
  const publisher = this.adapter.createPublisherSocket(this.context);
1289
+ this.publishers.set(channelName, publisher);
1222
1290
  publisher.setChannelName(channelName);
1223
1291
  applyFanoutPublisherSocketOptions(publisher, channel);
1224
1292
  publisher.bind(channel.publisher.bind);
1225
- this.publishers.set(channelName, publisher);
1293
+ const endpoint = (0, configuration_1.buildAdvertisedEndpoint)(publisher.lastEndpoint ?? channel.publisher.bind, channel.publisher.advertiseHost);
1294
+ if (endpoint !== undefined && endpoint.length > 0) {
1295
+ this.recordListener('fanout', channelName, endpoint);
1296
+ }
1226
1297
  this.fanoutPublisherNextBeacon.set(channelName, performance.now() + CLIENT_SERVER_PROBE_INTERVAL_MS);
1227
1298
  this.ensureClientServerLivenessTimer();
1228
1299
  return publisher;
1229
1300
  }
1230
- fanoutPublisherEndpoint(channelName) {
1231
- const channel = this.registration.channels.get(channelName);
1232
- const publisher = this.publishers.get(channelName);
1233
- const boundEndpoint = publisher?.lastEndpoint;
1234
- if (channel?.publisher === undefined ||
1235
- boundEndpoint === undefined ||
1236
- boundEndpoint.length === 0) {
1237
- return undefined;
1238
- }
1239
- return advertisedEndpoint(boundEndpoint, channel.publisher.advertiseHost);
1240
- }
1241
1301
  routeRouter(routerChannelId) {
1242
1302
  const existing = this.routeRouters.get(routerChannelId);
1243
1303
  if (existing !== undefined) {
@@ -1248,6 +1308,7 @@ class ZLinkChannelSocketRegistry {
1248
1308
  throw new configuration_1.ZLinkConfigurationException(`Route channel '${routerChannelId}' is not registered.`);
1249
1309
  }
1250
1310
  const router = this.adapter.createRouterSocket(this.context);
1311
+ this.routeRouters.set(routerChannelId, router);
1251
1312
  this.registerReceiveFlowSocket(router);
1252
1313
  router.setChannelName(routerChannelId);
1253
1314
  if ((routeChannel.manualConnections?.length ?? 0) > 0 &&
@@ -1255,7 +1316,7 @@ class ZLinkChannelSocketRegistry {
1255
1316
  router.setProbe(true);
1256
1317
  }
1257
1318
  router.setRoutingId(routeChannel.routingId ?? `${routeChannel.routingIdPrefix ?? routerChannelId}-${(0, node_crypto_1.randomUUID)()}`);
1258
- const publicWeight = routeChannel.weight ?? 100;
1319
+ const publicWeight = routeChannel.weight ?? RegistrationBuilderPolicy_1.ZLINK_DEFAULT_PUBLIC_WEIGHT;
1259
1320
  this.routeMeshPublicWeights.set(routerChannelId, publicWeight);
1260
1321
  router.peerWeight = rawAvailabilityWeight(publicWeight);
1261
1322
  applySocketConfig(router, routeChannel);
@@ -1269,7 +1330,6 @@ class ZLinkChannelSocketRegistry {
1269
1330
  if (routeChannel.bind !== undefined && routeChannel.bind.trim().length > 0) {
1270
1331
  router.bind(routeChannel.bind);
1271
1332
  }
1272
- this.routeRouters.set(routerChannelId, router);
1273
1333
  return router;
1274
1334
  }
1275
1335
  routeMeshSocket(routerChannelId) {
@@ -1277,7 +1337,7 @@ class ZLinkChannelSocketRegistry {
1277
1337
  }
1278
1338
  routeMeshWeight(routerChannelId) {
1279
1339
  this.routeRouter(routerChannelId);
1280
- return this.routeMeshPublicWeights.get(routerChannelId) ?? 100;
1340
+ return this.routeMeshPublicWeights.get(routerChannelId) ?? RegistrationBuilderPolicy_1.ZLINK_DEFAULT_PUBLIC_WEIGHT;
1281
1341
  }
1282
1342
  setRouteMeshWeight(routerChannelId, weight) {
1283
1343
  requirePublicWeight(weight);
@@ -1299,7 +1359,7 @@ class ZLinkChannelSocketRegistry {
1299
1359
  return;
1300
1360
  }
1301
1361
  const monitor = this.monitoringAdapter.openSocketMonitor(socket);
1302
- this.ownedMonitors.add(monitor);
1362
+ this.ownedResources.add(monitor);
1303
1363
  monitor.onEvent((event) => {
1304
1364
  if (event.nativeEvent === internal_event_contracts_1.ZLinkSocketNativeEventType.Disconnected &&
1305
1365
  event.remoteAddr.length > 0) {
@@ -1312,7 +1372,7 @@ class ZLinkChannelSocketRegistry {
1312
1372
  return;
1313
1373
  }
1314
1374
  const monitor = this.monitoringAdapter.openSocketMonitor(router);
1315
- this.ownedMonitors.add(monitor);
1375
+ this.ownedResources.add(monitor);
1316
1376
  monitor.onEvent((event) => {
1317
1377
  const routingId = event.routingId === undefined ? undefined : String(event.routingId);
1318
1378
  if (event.nativeEvent === internal_event_contracts_1.ZLinkSocketNativeEventType.ConnectionReady &&
@@ -1341,7 +1401,7 @@ async function requestClientServerAdmission(dealer, channelName, securityIdentit
1341
1401
  const message = runtime_message_1.ZLinkBufferMessage.from((0, client_server_service_wire_1.encodeClientServerHello)({
1342
1402
  channelName,
1343
1403
  securityIdentity,
1344
- normalizedEffectiveMaxMessageBytes: normalizedMessageLimit(dealer.maxMessageSize)
1404
+ normalizedEffectiveMaxMessageBytes: (0, client_server_service_wire_1.normalizeClientServerMessageLimit)(dealer.maxMessageSize)
1345
1405
  }));
1346
1406
  try {
1347
1407
  const parts = await dealer.request(message, timeoutMs);
@@ -1404,13 +1464,14 @@ function setFanoutSubscriptions(subscriber, applicationTopics) {
1404
1464
  }
1405
1465
  function deriveRoutingId(baseRoutingId, suffix) {
1406
1466
  const derived = `${baseRoutingId}\0${suffix}`;
1407
- if (Buffer.byteLength(derived, 'utf8') > 255) {
1408
- throw new configuration_1.ZLinkConfigurationException(`Derived routing id with suffix '${suffix}' exceeds the 255 byte limit.`);
1467
+ if (Buffer.byteLength(derived, 'utf8') > CoreTypes_1.ZLINK_MAX_ROUTING_ID_BYTES) {
1468
+ throw new configuration_1.ZLinkConfigurationException(`Derived routing id with suffix '${suffix}' exceeds the ${CoreTypes_1.ZLINK_MAX_ROUTING_ID_BYTES} byte limit.`);
1409
1469
  }
1410
1470
  return derived;
1411
1471
  }
1412
1472
  function applyFanoutPublisherSocketOptions(publisher, channel) {
1413
1473
  publisher.noDrop = channel.noDrop ?? false;
1474
+ publisher.sendTimeoutMs = configuredSendTimeoutMs(channel.publisher?.sendTimeoutMs);
1414
1475
  }
1415
1476
  function fanoutDiscoveryConnectionId(connectionId) {
1416
1477
  return `fanout:${connectionId.replaceAll('\0', '/')}`;
@@ -1429,12 +1490,9 @@ function advertisedEndpoint(boundEndpoint, advertiseHost) {
1429
1490
  }
1430
1491
  return result;
1431
1492
  }
1432
- function normalizedMessageLimit(value) {
1433
- return Number.isSafeInteger(value) && value > 0 ? Math.min(value, 0xffff_ffff) : 0x7fff_ffff;
1434
- }
1435
1493
  function requirePublicWeight(weight) {
1436
- if (!Number.isInteger(weight) || weight < 0 || weight > 10_000) {
1437
- throw new configuration_1.ZLinkConfigurationException('Weight must be an integer in 0..10000.');
1494
+ if (!(0, RegistrationBuilderPolicy_1.isValidPublicWeight)(weight)) {
1495
+ throw new configuration_1.ZLinkConfigurationException(`Weight must be an integer in 0..${RegistrationBuilderPolicy_1.ZLINK_MAX_PUBLIC_WEIGHT}.`);
1438
1496
  }
1439
1497
  }
1440
1498
  function rawAvailabilityWeight(weight) {
@@ -1459,3 +1517,6 @@ function applySocketConfig(socket, config) {
1459
1517
  socket.maxMessageSize = config.maxMessageSize;
1460
1518
  }
1461
1519
  }
1520
+ function configuredSendTimeoutMs(value) {
1521
+ return value ?? DEFAULT_SEND_TIMEOUT_MS;
1522
+ }