@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,28 +1,32 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ZLinkChannelSocketRegistry = void 0;
4
- const listener_records_1 = require("../foundation/listener-records");
4
+ const disposal_1 = require("../disposal");
5
+ const stream_wire_1 = require("@zlink-systems/stream-wire");
6
+ const node_crypto_1 = require("node:crypto");
5
7
  const contracts_1 = require("../../contracts");
6
- const internal_event_contracts_1 = require("../diagnostics/internal-event-contracts");
7
- const configuration_1 = require("../configuration");
8
- const abort_1 = require("../abort");
8
+ const CoreTypes_1 = require("../../contracts/Common/CoreTypes");
9
+ const RegistrationBuilderPolicy_1 = require("../../contracts/Configuration/RegistrationBuilderPolicy");
9
10
  const RuntimeEndpointConnections_1 = require("../../contracts/Configuration/RuntimeEndpointConnections");
10
- const route_member_snapshot_1 = require("./route-member-snapshot");
11
- const framework_errors_internal_1 = require("../framework-errors-internal");
12
- const node_crypto_1 = require("node:crypto");
11
+ const abort_1 = require("../abort");
13
12
  const runtime_message_1 = require("../backend/runtime-message");
14
- 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");
15
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");
16
20
  const service_wire_m6a_codec_1 = require("../foundation/service-wire-m6a-codec");
21
+ const framework_errors_internal_1 = require("../framework-errors-internal");
17
22
  const client_server_service_wire_1 = require("./client-server-service-wire");
18
23
  const fanout_service_wire_1 = require("./fanout-service-wire");
19
- const runtime_values_1 = require("../backend/runtime-values");
24
+ const route_member_snapshot_1 = require("./route-member-snapshot");
20
25
  const MAX_LIFECYCLE_GENERATION = 0x7fffffffffffffffn;
21
- const CLIENT_SERVER_PROBE_INTERVAL_MS = 5_000;
22
- const CLIENT_SERVER_PEER_DEADLINE_MS = 15_000;
23
- const CLIENT_SERVER_READY_WAIT_CAP_MS = 5_000;
24
- const CLIENT_SERVER_READY_POLL_INTERVAL_MS = 5;
25
- 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;
26
30
  class ZLinkChannelSocketRegistry {
27
31
  registration;
28
32
  adapter;
@@ -44,7 +48,8 @@ class ZLinkChannelSocketRegistry {
44
48
  routeMeshPublicWeights = new Map();
45
49
  clientServerAdmittedClients = new Map();
46
50
  clientServerServerPeers = new Map();
47
- ownedMonitors = new Set();
51
+ disposal = new disposal_1.RuntimeDisposal();
52
+ ownedResources = new Set();
48
53
  fanoutConnections = new Map();
49
54
  fanoutPublisherNextBeacon = new Map();
50
55
  clientServerLivenessTimer;
@@ -62,9 +67,13 @@ class ZLinkChannelSocketRegistry {
62
67
  this.applicationJobQueue = applicationJobQueue;
63
68
  this.listenerRecords = listenerRecords ?? new listener_records_1.ZLinkListenerRecords();
64
69
  }
65
- 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.'));
66
75
  const clientServerConnections = [...new Set(this.clientServerConnections.values())];
67
- const clientServerPollers = clientServerConnections.map((connection) => connection.readablePoller);
76
+ const clientServerPollers = clientServerConnections.flatMap((connection) => connection.readablePoller === undefined ? [] : [connection.readablePoller]);
68
77
  const sockets = [
69
78
  ...this.clientDealers.values(),
70
79
  ...clientServerConnections.map((value) => value.dealer),
@@ -80,8 +89,6 @@ class ZLinkChannelSocketRegistry {
80
89
  ...this.routeRouters.values()
81
90
  ]))
82
91
  this.unregisterReceiveFlowSocket(socket);
83
- this.clientDealers.clear();
84
- this.clientServerConnections.clear();
85
92
  this.clientServerReadyIdentities.clear();
86
93
  this.clientServerServerDescriptors.clear();
87
94
  this.clientServerPublicWeights.clear();
@@ -91,23 +98,40 @@ class ZLinkChannelSocketRegistry {
91
98
  this.clientServerMonitorHandlers.clear();
92
99
  this.fanoutMonitorHandlers.clear();
93
100
  this.fanoutTopologyHandlers.clear();
94
- this.fanoutConnections.clear();
95
101
  this.fanoutPublisherNextBeacon.clear();
96
102
  if (this.clientServerLivenessTimer !== undefined) {
97
103
  clearInterval(this.clientServerLivenessTimer);
98
104
  this.clientServerLivenessTimer = undefined;
99
105
  }
100
- this.channelRouters.clear();
101
- this.publishers.clear();
102
- this.routeRouters.clear();
103
106
  this.routeMembers.clear();
104
- const monitors = [...this.ownedMonitors];
105
- this.ownedMonitors.clear();
106
- const cleanup = await Promise.allSettled([
107
- ...clientServerPollers.map((poller) => poller.dispose()),
108
- ...monitors.map((monitor) => monitor.dispose()),
109
- ...sockets.map((socket) => socket.dispose())
110
- ]);
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
+ }));
111
135
  const errors = cleanup
112
136
  .filter((result) => result.status === 'rejected')
113
137
  .map((result) => result.reason);
@@ -127,13 +151,15 @@ class ZLinkChannelSocketRegistry {
127
151
  throw new configuration_1.ZLinkConfigurationException(`Channel client '${channelName}' is not registered.`);
128
152
  }
129
153
  const dealer = this.adapter.createDealerSocket(this.context);
154
+ this.clientDealers.set(channelName, dealer);
130
155
  this.registerReceiveFlowSocket(dealer);
131
156
  dealer.setChannelName(channelName);
132
157
  if (channel?.routingId !== undefined && channel.routingId.length > 0) {
133
158
  dealer.setRoutingId(deriveRoutingId(channel.routingId, 'dealer'));
134
159
  }
135
- applySocketConfig(dealer, client);
136
- this.clientDealers.set(channelName, dealer);
160
+ applySocketConfig(dealer, {
161
+ ...client
162
+ });
137
163
  return dealer;
138
164
  }
139
165
  channelRouter(channelName) {
@@ -149,6 +175,7 @@ class ZLinkChannelSocketRegistry {
149
175
  throw new configuration_1.ZLinkConfigurationException(`Channel server '${channelName}' does not define a bind endpoint.`);
150
176
  }
151
177
  const router = this.adapter.createRouterSocket(this.context);
178
+ this.channelRouters.set(channelName, router);
152
179
  this.registerReceiveFlowSocket(router);
153
180
  router.setChannelName(channelName);
154
181
  const identity = this.clientServerIdentities.get(channelName) ?? {
@@ -157,14 +184,14 @@ class ZLinkChannelSocketRegistry {
157
184
  };
158
185
  this.clientServerIdentities.set(channelName, identity);
159
186
  router.setRoutingId(identity.serverRid);
160
- const publicWeight = channel.server.weight ?? 100;
187
+ const publicWeight = channel.server.weight ?? RegistrationBuilderPolicy_1.ZLINK_DEFAULT_PUBLIC_WEIGHT;
161
188
  this.clientServerPublicWeights.set(channelName, publicWeight);
162
189
  router.peerWeight = rawAvailabilityWeight(publicWeight);
163
190
  applySocketConfig(router, channel.server);
164
191
  router.bind(channel.server.bind);
165
192
  if (this.monitoringAdapter !== undefined) {
166
193
  const monitor = this.monitoringAdapter.openSocketMonitor(router);
167
- this.ownedMonitors.add(monitor);
194
+ this.ownedResources.add(monitor);
168
195
  monitor.onEvent((event) => {
169
196
  if (event.routingId === undefined)
170
197
  return;
@@ -179,7 +206,6 @@ class ZLinkChannelSocketRegistry {
179
206
  this.clientServerAdmittedClients.get(channelName)?.delete(routingId);
180
207
  });
181
208
  }
182
- this.channelRouters.set(channelName, router);
183
209
  const endpoint = advertisedEndpoint(router.lastEndpoint ?? channel.server.bind, channel.server.advertiseHost);
184
210
  this.recordListener('clientServer', channelName, endpoint);
185
211
  if (!this.clientServerServerDescriptors.has(channelName)) {
@@ -219,7 +245,7 @@ class ZLinkChannelSocketRegistry {
219
245
  }
220
246
  clientServerServerWeight(channelName) {
221
247
  this.channelRouter(channelName);
222
- return this.clientServerPublicWeights.get(channelName) ?? 100;
248
+ return this.clientServerPublicWeights.get(channelName) ?? RegistrationBuilderPolicy_1.ZLINK_DEFAULT_PUBLIC_WEIGHT;
223
249
  }
224
250
  setClientServerServerWeight(channelName, weight) {
225
251
  requirePublicWeight(weight);
@@ -240,49 +266,32 @@ class ZLinkChannelSocketRegistry {
240
266
  throw new configuration_1.ZLinkConfigurationException(`Channel client '${channelName}' is not registered.`);
241
267
  }
242
268
  const dealer = this.adapter.createDealerSocket(this.context);
243
- this.registerReceiveFlowSocket(dealer);
244
- dealer.setChannelName(channelName);
245
- dealer.setRoutingId(`cs-client-${(0, node_crypto_1.randomUUID)()}`);
246
- applySocketConfig(dealer, client);
247
- const cleanupDealer = () => {
248
- this.unregisterReceiveFlowSocket(dealer);
249
- void Promise.allSettled([dealer.dispose()]);
250
- };
251
- let readablePoller;
252
- try {
253
- readablePoller = this.adapter.createReadablePoller(dealer);
254
- }
255
- catch (error) {
256
- cleanupDealer();
257
- throw error;
258
- }
259
- let monitor;
260
- try {
261
- monitor = this.monitoringAdapter.openSocketMonitor(dealer);
262
- }
263
- catch (error) {
264
- try {
265
- readablePoller.dispose();
266
- }
267
- finally {
268
- cleanupDealer();
269
- }
270
- throw error;
271
- }
272
- this.ownedMonitors.add(monitor);
273
269
  const connection = {
274
270
  channelName,
275
271
  endpoint,
276
272
  dealer,
277
- readablePoller,
278
- monitor,
279
273
  aliases: new Set([connectionId]),
280
274
  callbacksByAlias: new Map([[connectionId, callbacks]]),
281
275
  physicalConnectionId: Symbol(connectionId)
282
276
  };
283
- this.clientServerConnections.set(connectionId, connection);
284
- this.ensureClientServerLivenessTimer();
277
+ this.ownedResources.add(dealer);
278
+ const created = [dealer];
285
279
  try {
280
+ this.clientServerConnections.set(connectionId, connection);
281
+ this.registerReceiveFlowSocket(dealer);
282
+ dealer.setChannelName(channelName);
283
+ dealer.setRoutingId(`cs-client-${(0, node_crypto_1.randomUUID)()}`);
284
+ applySocketConfig(dealer, {
285
+ ...client
286
+ });
287
+ connection.readablePoller = this.adapter.createReadablePoller(dealer);
288
+ created.push(connection.readablePoller);
289
+ this.ownedResources.add(connection.readablePoller);
290
+ const monitor = this.monitoringAdapter.openSocketMonitor(dealer);
291
+ connection.monitor = monitor;
292
+ created.push(monitor);
293
+ this.ownedResources.add(monitor);
294
+ this.ensureClientServerLivenessTimer();
286
295
  monitor.onEvent((event) => {
287
296
  if (![...connection.aliases].some((alias) => this.clientServerConnections.get(alias) === connection))
288
297
  return;
@@ -312,26 +321,26 @@ class ZLinkChannelSocketRegistry {
312
321
  }
313
322
  });
314
323
  dealer.connect(endpoint);
324
+ return dealer;
315
325
  }
316
326
  catch (error) {
317
327
  this.clientServerConnections.delete(connectionId);
318
- this.ownedMonitors.delete(monitor);
319
- try {
320
- readablePoller.dispose();
321
- }
322
- finally {
323
- cleanupDealer();
324
- void Promise.allSettled([monitor.dispose()]);
325
- }
328
+ this.unregisterReceiveFlowSocket(dealer);
329
+ void Promise.allSettled(created.map(async (resource) => {
330
+ await resource.dispose();
331
+ this.ownedResources.delete(resource);
332
+ })).then((results) => {
333
+ for (const result of results)
334
+ if (result.status === 'rejected')
335
+ this.oneWayFailureSink?.(result.reason);
336
+ });
326
337
  throw error;
327
338
  }
328
- return dealer;
329
339
  }
330
340
  async closeClientServerConnection(connectionId) {
331
341
  const current = this.clientServerConnections.get(connectionId);
332
342
  if (current === undefined)
333
343
  return;
334
- this.clientServerConnections.delete(connectionId);
335
344
  current.aliases.delete(connectionId);
336
345
  current.callbacksByAlias.delete(connectionId);
337
346
  const ready = this.clientServerReadyIdentities.get(connectionId);
@@ -351,21 +360,34 @@ class ZLinkChannelSocketRegistry {
351
360
  });
352
361
  }
353
362
  }
354
- if (current.aliases.size > 0)
363
+ this.notifyClientServerTopology(current.channelName);
364
+ if (current.aliases.size > 0) {
365
+ this.clientServerConnections.delete(connectionId);
355
366
  return;
367
+ }
356
368
  await this.disposeClientServerPhysical(connectionId, current);
369
+ this.clientServerConnections.delete(connectionId);
357
370
  }
358
371
  async disposeClientServerPhysical(connectionId, current) {
359
372
  try {
360
373
  current.dealer.disconnect(current.endpoint);
361
374
  }
362
375
  catch {
363
- // Disposal below is the terminal cleanup if the transport already closed.
376
+ // The socket close below releases an endpoint that is already disconnected.
364
377
  }
365
- this.ownedMonitors.delete(current.monitor);
366
378
  this.unregisterReceiveFlowSocket(current.dealer);
367
- current.readablePoller.dispose();
368
- const results = await Promise.allSettled([current.monitor.dispose(), current.dealer.dispose()]);
379
+ if (current.readablePoller !== undefined) {
380
+ current.readablePoller.dispose();
381
+ this.ownedResources.delete(current.readablePoller);
382
+ current.readablePoller = undefined;
383
+ }
384
+ const results = await Promise.allSettled([
385
+ current.monitor?.dispose(),
386
+ (async () => {
387
+ await current.dealer.dispose();
388
+ this.ownedResources.delete(current.dealer);
389
+ })()
390
+ ]);
369
391
  const errors = results
370
392
  .filter((result) => result.status === 'rejected')
371
393
  .map((result) => result.reason);
@@ -374,6 +396,8 @@ class ZLinkChannelSocketRegistry {
374
396
  if (errors.length > 1) {
375
397
  throw new AggregateError(errors, `ClientServer connection '${connectionId}' cleanup failed.`);
376
398
  }
399
+ if (current.monitor !== undefined)
400
+ this.ownedResources.delete(current.monitor);
377
401
  }
378
402
  admitClientServerConnection(descriptor, connectionId) {
379
403
  const connection = this.clientServerConnections.get(connectionId);
@@ -383,6 +407,7 @@ class ZLinkChannelSocketRegistry {
383
407
  const admitted = this.clientServerDiscovery.admitClientServer(descriptor, connection.readyConnectionId);
384
408
  if (admitted)
385
409
  connection.admittedDescriptor = descriptor;
410
+ this.notifyClientServerTopology(descriptor.channelName);
386
411
  return admitted;
387
412
  }
388
413
  const duplicateId = [...this.clientServerReadyIdentities].find(([, identity]) => identity.channelName === descriptor.channelName &&
@@ -416,6 +441,7 @@ class ZLinkChannelSocketRegistry {
416
441
  connection.readyConnectionId = connectionId;
417
442
  connection.admittedDescriptor = descriptor;
418
443
  }
444
+ this.notifyClientServerTopology(descriptor.channelName);
419
445
  return admitted;
420
446
  }
421
447
  removeClientServerReady(channelName, serverRoutingId, connectionId) {
@@ -430,6 +456,7 @@ class ZLinkChannelSocketRegistry {
430
456
  connection.outstandingProbeId = undefined;
431
457
  }
432
458
  }
459
+ this.notifyClientServerTopology(channelName);
433
460
  return removed;
434
461
  }
435
462
  selectClientServerDealer(channelName) {
@@ -453,47 +480,52 @@ class ZLinkChannelSocketRegistry {
453
480
  }
454
481
  return undefined;
455
482
  }
456
- /**
457
- * Resolves a ClientServer send target, waiting when the ready candidate set is still empty, as
458
- * `framework/doc/framework/common/spec/server/02-channel-transport/02-channel-messaging.ko.md` §3.2 requires: the call waits
459
- * at call time for a bounded period and then fails with no-target. The bound is the shorter of
460
- * the call's remaining deadline and five seconds, mirroring the .NET reference
461
- * `ZLinkClientServerClientRuntime.WaitForReadyAsync`. The wait lives here because this registry
462
- * owns ClientServer connections, admission and weighted selection. Sends have no per-call
463
- * timeout, so they use the Channel's request timeout.
464
- *
465
- * The wait only observes admission that is already in flight: it never opens or reconnects a
466
- * connection, so it cannot trigger the admission it waits for, and Framework startup keeps not
467
- * waiting for local ClientServer admission. It applies whenever nothing is selectable, including
468
- * candidate sets excluded by weight 0 or drain, because `selectClientServerDealer` filters the
469
- * same way the reference `SelectReady()` does.
470
- *
471
- * Every attempt yields to the event loop between polls. ClientServer admission completes on the
472
- * monitor drains that the backend poll timer pumps, so a synchronous wait would starve the
473
- * admission it is waiting for and burn the whole bound before failing anyway. That is this
474
- * execution model's form of the hazard the JVM mirror avoids by not holding the admission
475
- * monitor across its sleep.
476
- */
477
- async awaitClientDealerForOutbound(channelName, signal, deadlineAtMs) {
478
- const startedAtMs = performance.now();
479
- const deadline = Math.min(deadlineAtMs ??
480
- startedAtMs +
481
- (this.registration.channels.get(channelName)?.requestTimeoutMs ??
482
- this.registration.requestTimeoutMs ??
483
- DEFAULT_REQUEST_TIMEOUT_MS), startedAtMs + CLIENT_SERVER_READY_WAIT_CAP_MS);
484
- for (;;) {
485
- this.drainSocketMonitors();
483
+ /** Observes discovery changes until a server is ready or the runtime closes. */
484
+ async awaitClientDealerForOutbound(channelName, signal) {
485
+ (0, abort_1.throwIfAborted)(signal);
486
+ const select = () => {
486
487
  const dealer = this.clientDealerForOutbound(channelName);
487
488
  if (dealer !== undefined)
488
489
  return dealer;
489
- const remainingMs = deadline - performance.now();
490
- if (remainingMs <= 0)
491
- return undefined;
492
- (0, abort_1.throwIfAborted)(signal);
493
- await new Promise((resolve) => {
494
- setTimeout(resolve, Math.min(CLIENT_SERVER_READY_POLL_INTERVAL_MS, remainingMs));
495
- });
496
- }
490
+ if (this.clientServerDiscovery.hasReadyClientServer(channelName)) {
491
+ throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RouteNotConnected, `Channel '${channelName}' has no eligible ClientServer member.`);
492
+ }
493
+ return undefined;
494
+ };
495
+ const dealer = select();
496
+ if (dealer !== undefined)
497
+ return dealer;
498
+ return new Promise((resolve, reject) => {
499
+ const cleanup = () => {
500
+ unsubscribe();
501
+ signal?.removeEventListener('abort', abort);
502
+ };
503
+ const abort = () => {
504
+ cleanup();
505
+ reject((0, abort_1.createAbortError)());
506
+ };
507
+ const changed = (error) => {
508
+ try {
509
+ if (error !== undefined)
510
+ throw error;
511
+ const selected = select();
512
+ if (selected === undefined)
513
+ return;
514
+ cleanup();
515
+ resolve(selected);
516
+ }
517
+ catch (error) {
518
+ cleanup();
519
+ reject(error);
520
+ }
521
+ };
522
+ const unsubscribe = this.clientServerDiscovery.onClientServerChanged(changed);
523
+ signal?.addEventListener('abort', abort, { once: true });
524
+ // Registration and selection share one event-loop turn; recheck after subscribing.
525
+ changed();
526
+ if (signal?.aborted === true)
527
+ abort();
528
+ });
497
529
  }
498
530
  startManualClientServerConnections() {
499
531
  for (const [channelName, channel] of this.registration.channels) {
@@ -522,26 +554,39 @@ class ZLinkChannelSocketRegistry {
522
554
  }
523
555
  }
524
556
  clientServerMonitoringSource(channelName) {
525
- if (this.registration.channels.get(channelName)?.client === undefined) {
526
- throw new configuration_1.ZLinkConfigurationException(`Channel client '${channelName}' is not registered.`);
557
+ const channel = this.registration.channels.get(channelName);
558
+ if (channel?.client === undefined && channel?.server === undefined) {
559
+ throw new configuration_1.ZLinkConfigurationException(`ClientServer channel '${channelName}' is not registered.`);
527
560
  }
528
561
  let disposed = false;
529
562
  let handler;
563
+ const register = (next) => {
564
+ if (disposed)
565
+ return;
566
+ if (handler !== undefined) {
567
+ this.clientServerMonitorHandlers.get(channelName)?.delete(handler);
568
+ }
569
+ handler = next;
570
+ let handlers = this.clientServerMonitorHandlers.get(channelName);
571
+ if (handlers === undefined) {
572
+ handlers = new Set();
573
+ this.clientServerMonitorHandlers.set(channelName, handlers);
574
+ }
575
+ handlers.add(next);
576
+ };
530
577
  return {
531
578
  nativeInstance: {},
532
579
  onEvent: (next) => {
533
- if (disposed)
534
- return;
535
- if (handler !== undefined) {
536
- this.clientServerMonitorHandlers.get(channelName)?.delete(handler);
537
- }
538
- handler = next;
539
- let handlers = this.clientServerMonitorHandlers.get(channelName);
540
- if (handlers === undefined) {
541
- handlers = new Set();
542
- this.clientServerMonitorHandlers.set(channelName, handlers);
543
- }
544
- handlers.add(next);
580
+ register((event) => {
581
+ if (event !== undefined)
582
+ next(event);
583
+ });
584
+ },
585
+ onChange: (next) => {
586
+ register((event) => {
587
+ if (event === undefined)
588
+ next();
589
+ });
545
590
  },
546
591
  drain: () => 0,
547
592
  dispose: async () => {
@@ -606,6 +651,11 @@ class ZLinkChannelSocketRegistry {
606
651
  this.clientServerServerDescriptors.set(channelName, descriptor);
607
652
  this.pushClientServerDescriptorUpdate(channelName, descriptor);
608
653
  }
654
+ this.notifyClientServerTopology(channelName);
655
+ }
656
+ notifyClientServerTopology(channelName) {
657
+ for (const handler of this.clientServerMonitorHandlers.get(channelName) ?? [])
658
+ handler();
609
659
  }
610
660
  tryHandleClientServerControl(channelName, received, router) {
611
661
  if (received.parts.length === 0)
@@ -632,17 +682,17 @@ class ZLinkChannelSocketRegistry {
632
682
  else if (record.kind !== 'hello' ||
633
683
  received.parts.length !== 1 ||
634
684
  received.replyToken === null) {
635
- reply = (0, client_server_service_wire_1.encodeClientServerReject)(1);
685
+ reply = (0, client_server_service_wire_1.encodeClientServerReject)(client_server_service_wire_1.ClientServerRejectReason.ProtocolVersionUnsupported);
636
686
  }
637
687
  else {
638
688
  const descriptor = this.clientServerServerDescriptors.get(channelName);
639
689
  if (descriptor === undefined ||
640
690
  record.hello.channelName !== channelName ||
641
691
  record.hello.securityIdentity !== descriptor.securityIdentity) {
642
- reply = (0, client_server_service_wire_1.encodeClientServerReject)(3);
692
+ reply = (0, client_server_service_wire_1.encodeClientServerReject)(client_server_service_wire_1.ClientServerRejectReason.AdmissionMismatch);
643
693
  }
644
694
  else {
645
- const normalizedEffectiveMaxMessageBytes = Math.min(normalizedMessageLimit(router.maxMessageSize), record.hello.normalizedEffectiveMaxMessageBytes);
695
+ const normalizedEffectiveMaxMessageBytes = Math.min((0, client_server_service_wire_1.normalizeClientServerMessageLimit)(router.maxMessageSize), record.hello.normalizedEffectiveMaxMessageBytes);
646
696
  reply = (0, client_server_service_wire_1.encodeClientServerAdmit)(descriptor, normalizedEffectiveMaxMessageBytes);
647
697
  this.admitClientServerServerPeer(channelName, String(received.routingId), normalizedEffectiveMaxMessageBytes);
648
698
  }
@@ -716,23 +766,26 @@ class ZLinkChannelSocketRegistry {
716
766
  throw new configuration_1.ZLinkConfigurationException(`Fanout subscriber '${channelName}' is not registered.`);
717
767
  }
718
768
  const subscriber = this.adapter.createSubscriberSocket(this.context);
719
- subscriber.setChannelName(channelName);
720
- setFanoutSubscriptions(subscriber, channel.subscriptions);
721
- const monitor = this.monitoringAdapter.openSocketMonitor(subscriber);
722
769
  const connection = {
723
770
  channelName,
724
771
  endpoint,
725
772
  subscriber,
726
- monitor,
727
773
  callbacks,
728
774
  physicalConnectionId: Symbol(connectionId),
729
775
  transportReady: false,
730
776
  ready: false
731
777
  };
732
- this.fanoutConnections.set(connectionId, connection);
733
- this.ownedMonitors.add(monitor);
734
- this.ensureClientServerLivenessTimer();
778
+ this.ownedResources.add(subscriber);
779
+ const created = [subscriber];
735
780
  try {
781
+ this.fanoutConnections.set(connectionId, connection);
782
+ subscriber.setChannelName(channelName);
783
+ setFanoutSubscriptions(subscriber, channel.subscriptions);
784
+ const monitor = this.monitoringAdapter.openSocketMonitor(subscriber);
785
+ connection.monitor = monitor;
786
+ created.push(monitor);
787
+ this.ownedResources.add(monitor);
788
+ this.ensureClientServerLivenessTimer();
736
789
  monitor.onEvent((event) => {
737
790
  if (this.fanoutConnections.get(connectionId) !== connection)
738
791
  return;
@@ -755,30 +808,37 @@ class ZLinkChannelSocketRegistry {
755
808
  }
756
809
  });
757
810
  subscriber.connect(endpoint);
811
+ return subscriber;
758
812
  }
759
813
  catch (error) {
760
814
  this.fanoutConnections.delete(connectionId);
761
- this.ownedMonitors.delete(monitor);
762
- void Promise.allSettled([monitor.dispose(), subscriber.dispose()]);
815
+ void Promise.allSettled(created.map(async (resource) => {
816
+ await resource.dispose();
817
+ this.ownedResources.delete(resource);
818
+ })).then((results) => {
819
+ for (const result of results)
820
+ if (result.status === 'rejected')
821
+ this.oneWayFailureSink?.(result.reason);
822
+ });
763
823
  throw error;
764
824
  }
765
- return subscriber;
766
825
  }
767
826
  async closeFanoutSubscriberConnection(connectionId) {
768
827
  const connection = this.fanoutConnections.get(connectionId);
769
828
  if (connection === undefined)
770
829
  return;
771
- this.fanoutConnections.delete(connectionId);
772
830
  try {
773
831
  connection.subscriber.disconnect(connection.endpoint);
774
832
  }
775
833
  catch {
776
- // Disposal remains the terminal cleanup path.
834
+ // The socket close below releases an endpoint that is already disconnected.
777
835
  }
778
- this.ownedMonitors.delete(connection.monitor);
779
836
  const results = await Promise.allSettled([
780
- connection.monitor.dispose(),
781
- connection.subscriber.dispose()
837
+ connection.monitor?.dispose(),
838
+ (async () => {
839
+ await connection.subscriber.dispose();
840
+ this.ownedResources.delete(connection.subscriber);
841
+ })()
782
842
  ]);
783
843
  const errors = results
784
844
  .filter((result) => result.status === 'rejected')
@@ -788,6 +848,9 @@ class ZLinkChannelSocketRegistry {
788
848
  if (errors.length > 1) {
789
849
  throw new AggregateError(errors, `Fanout connection '${connectionId}' cleanup failed.`);
790
850
  }
851
+ this.fanoutConnections.delete(connectionId);
852
+ if (connection.monitor !== undefined)
853
+ this.ownedResources.delete(connection.monitor);
791
854
  }
792
855
  handleFanoutInbound(connectionId, topicMessage, source, nowMs = performance.now()) {
793
856
  return this.handleFanoutInboundResult(connectionId, topicMessage, source, nowMs).consumed;
@@ -978,7 +1041,7 @@ class ZLinkChannelSocketRegistry {
978
1041
  }
979
1042
  drainClientServerControl(connectionId, connection) {
980
1043
  for (;;) {
981
- if (!connection.readablePoller.wait(0))
1044
+ if (connection.readablePoller === undefined || !connection.readablePoller.wait(0))
982
1045
  return;
983
1046
  const received = connection.dealer.recv(1);
984
1047
  if (received === undefined) {
@@ -1082,12 +1145,13 @@ class ZLinkChannelSocketRegistry {
1082
1145
  ensureClientServerLivenessTimer() {
1083
1146
  if (this.clientServerLivenessTimer !== undefined)
1084
1147
  return;
1085
- this.clientServerLivenessTimer = setInterval(() => this.tickClientServerLiveness(), 100);
1148
+ this.clientServerLivenessTimer = setInterval(() => this.tickClientServerLiveness(), CLIENT_SERVER_LIVENESS_TICK_MS);
1086
1149
  this.clientServerLivenessTimer.unref();
1087
1150
  }
1088
1151
  drainSocketMonitors() {
1089
- for (const monitor of this.ownedMonitors)
1090
- monitor.drain();
1152
+ for (const monitor of this.ownedResources)
1153
+ if ('drain' in monitor)
1154
+ monitor.drain();
1091
1155
  }
1092
1156
  removeReadyConnection(connectionId) {
1093
1157
  const identity = this.clientServerReadyIdentities.get(connectionId);
@@ -1104,6 +1168,7 @@ class ZLinkChannelSocketRegistry {
1104
1168
  connection.nextProbeAt = undefined;
1105
1169
  connection.outstandingProbeId = undefined;
1106
1170
  }
1171
+ this.notifyClientServerTopology(identity.channelName);
1107
1172
  }
1108
1173
  requestClientServerLiveness(connectionId, connection, probeId) {
1109
1174
  const message = runtime_message_1.ZLinkBufferMessage.from((0, client_server_service_wire_1.encodeClientServerLivenessProbe)(probeId));
@@ -1197,7 +1262,7 @@ class ZLinkChannelSocketRegistry {
1197
1262
  }
1198
1263
  allocateClientServerProbeId() {
1199
1264
  const result = this.nextClientServerProbeId;
1200
- this.nextClientServerProbeId = result === 0xffffffffffffffffn ? 1n : result + 1n;
1265
+ this.nextClientServerProbeId = result === stream_wire_1.UINT64_MAX ? 1n : result + 1n;
1201
1266
  return result;
1202
1267
  }
1203
1268
  publisher(channelName) {
@@ -1213,10 +1278,10 @@ class ZLinkChannelSocketRegistry {
1213
1278
  throw new configuration_1.ZLinkConfigurationException(`Channel publisher '${channelName}' does not define a bind endpoint.`);
1214
1279
  }
1215
1280
  const publisher = this.adapter.createPublisherSocket(this.context);
1281
+ this.publishers.set(channelName, publisher);
1216
1282
  publisher.setChannelName(channelName);
1217
1283
  applyFanoutPublisherSocketOptions(publisher, channel);
1218
1284
  publisher.bind(channel.publisher.bind);
1219
- this.publishers.set(channelName, publisher);
1220
1285
  const endpoint = (0, configuration_1.buildAdvertisedEndpoint)(publisher.lastEndpoint ?? channel.publisher.bind, channel.publisher.advertiseHost);
1221
1286
  if (endpoint !== undefined && endpoint.length > 0) {
1222
1287
  this.recordListener('fanout', channelName, endpoint);
@@ -1235,6 +1300,7 @@ class ZLinkChannelSocketRegistry {
1235
1300
  throw new configuration_1.ZLinkConfigurationException(`Route channel '${routerChannelId}' is not registered.`);
1236
1301
  }
1237
1302
  const router = this.adapter.createRouterSocket(this.context);
1303
+ this.routeRouters.set(routerChannelId, router);
1238
1304
  this.registerReceiveFlowSocket(router);
1239
1305
  router.setChannelName(routerChannelId);
1240
1306
  if ((routeChannel.manualConnections?.length ?? 0) > 0 &&
@@ -1242,7 +1308,7 @@ class ZLinkChannelSocketRegistry {
1242
1308
  router.setProbe(true);
1243
1309
  }
1244
1310
  router.setRoutingId(routeChannel.routingId ?? `${routeChannel.routingIdPrefix ?? routerChannelId}-${(0, node_crypto_1.randomUUID)()}`);
1245
- const publicWeight = routeChannel.weight ?? 100;
1311
+ const publicWeight = routeChannel.weight ?? RegistrationBuilderPolicy_1.ZLINK_DEFAULT_PUBLIC_WEIGHT;
1246
1312
  this.routeMeshPublicWeights.set(routerChannelId, publicWeight);
1247
1313
  router.peerWeight = rawAvailabilityWeight(publicWeight);
1248
1314
  applySocketConfig(router, routeChannel);
@@ -1256,7 +1322,6 @@ class ZLinkChannelSocketRegistry {
1256
1322
  if (routeChannel.bind !== undefined && routeChannel.bind.trim().length > 0) {
1257
1323
  router.bind(routeChannel.bind);
1258
1324
  }
1259
- this.routeRouters.set(routerChannelId, router);
1260
1325
  return router;
1261
1326
  }
1262
1327
  routeMeshSocket(routerChannelId) {
@@ -1264,7 +1329,7 @@ class ZLinkChannelSocketRegistry {
1264
1329
  }
1265
1330
  routeMeshWeight(routerChannelId) {
1266
1331
  this.routeRouter(routerChannelId);
1267
- return this.routeMeshPublicWeights.get(routerChannelId) ?? 100;
1332
+ return this.routeMeshPublicWeights.get(routerChannelId) ?? RegistrationBuilderPolicy_1.ZLINK_DEFAULT_PUBLIC_WEIGHT;
1268
1333
  }
1269
1334
  setRouteMeshWeight(routerChannelId, weight) {
1270
1335
  requirePublicWeight(weight);
@@ -1286,7 +1351,7 @@ class ZLinkChannelSocketRegistry {
1286
1351
  return;
1287
1352
  }
1288
1353
  const monitor = this.monitoringAdapter.openSocketMonitor(socket);
1289
- this.ownedMonitors.add(monitor);
1354
+ this.ownedResources.add(monitor);
1290
1355
  monitor.onEvent((event) => {
1291
1356
  if (event.nativeEvent === internal_event_contracts_1.ZLinkSocketNativeEventType.Disconnected &&
1292
1357
  event.remoteAddr.length > 0) {
@@ -1299,7 +1364,7 @@ class ZLinkChannelSocketRegistry {
1299
1364
  return;
1300
1365
  }
1301
1366
  const monitor = this.monitoringAdapter.openSocketMonitor(router);
1302
- this.ownedMonitors.add(monitor);
1367
+ this.ownedResources.add(monitor);
1303
1368
  monitor.onEvent((event) => {
1304
1369
  const routingId = event.routingId === undefined ? undefined : String(event.routingId);
1305
1370
  if (event.nativeEvent === internal_event_contracts_1.ZLinkSocketNativeEventType.ConnectionReady &&
@@ -1328,7 +1393,7 @@ async function requestClientServerAdmission(dealer, channelName, securityIdentit
1328
1393
  const message = runtime_message_1.ZLinkBufferMessage.from((0, client_server_service_wire_1.encodeClientServerHello)({
1329
1394
  channelName,
1330
1395
  securityIdentity,
1331
- normalizedEffectiveMaxMessageBytes: normalizedMessageLimit(dealer.maxMessageSize)
1396
+ normalizedEffectiveMaxMessageBytes: (0, client_server_service_wire_1.normalizeClientServerMessageLimit)(dealer.maxMessageSize)
1332
1397
  }));
1333
1398
  try {
1334
1399
  const parts = await dealer.request(message, timeoutMs);
@@ -1391,13 +1456,14 @@ function setFanoutSubscriptions(subscriber, applicationTopics) {
1391
1456
  }
1392
1457
  function deriveRoutingId(baseRoutingId, suffix) {
1393
1458
  const derived = `${baseRoutingId}\0${suffix}`;
1394
- if (Buffer.byteLength(derived, 'utf8') > 255) {
1395
- throw new configuration_1.ZLinkConfigurationException(`Derived routing id with suffix '${suffix}' exceeds the 255 byte limit.`);
1459
+ if (Buffer.byteLength(derived, 'utf8') > CoreTypes_1.ZLINK_MAX_ROUTING_ID_BYTES) {
1460
+ throw new configuration_1.ZLinkConfigurationException(`Derived routing id with suffix '${suffix}' exceeds the ${CoreTypes_1.ZLINK_MAX_ROUTING_ID_BYTES} byte limit.`);
1396
1461
  }
1397
1462
  return derived;
1398
1463
  }
1399
1464
  function applyFanoutPublisherSocketOptions(publisher, channel) {
1400
1465
  publisher.noDrop = channel.noDrop ?? false;
1466
+ publisher.sendTimeoutMs = configuredSendTimeoutMs(channel.publisher?.sendTimeoutMs);
1401
1467
  }
1402
1468
  function fanoutDiscoveryConnectionId(connectionId) {
1403
1469
  return `fanout:${connectionId.replaceAll('\0', '/')}`;
@@ -1416,12 +1482,9 @@ function advertisedEndpoint(boundEndpoint, advertiseHost) {
1416
1482
  }
1417
1483
  return result;
1418
1484
  }
1419
- function normalizedMessageLimit(value) {
1420
- return Number.isSafeInteger(value) && value > 0 ? Math.min(value, 0xffff_ffff) : 0x7fff_ffff;
1421
- }
1422
1485
  function requirePublicWeight(weight) {
1423
- if (!Number.isInteger(weight) || weight < 0 || weight > 10_000) {
1424
- throw new configuration_1.ZLinkConfigurationException('Weight must be an integer in 0..10000.');
1486
+ if (!(0, RegistrationBuilderPolicy_1.isValidPublicWeight)(weight)) {
1487
+ throw new configuration_1.ZLinkConfigurationException(`Weight must be an integer in 0..${RegistrationBuilderPolicy_1.ZLINK_MAX_PUBLIC_WEIGHT}.`);
1425
1488
  }
1426
1489
  }
1427
1490
  function rawAvailabilityWeight(weight) {
@@ -1439,10 +1502,10 @@ function applySocketConfig(socket, config) {
1439
1502
  if (config.receiveTimeoutMs !== undefined) {
1440
1503
  socket.receiveTimeoutMs = config.receiveTimeoutMs;
1441
1504
  }
1442
- if (config.sendTimeoutMs !== undefined) {
1443
- socket.sendTimeoutMs = config.sendTimeoutMs;
1444
- }
1445
1505
  if (config.maxMessageSize !== undefined) {
1446
1506
  socket.maxMessageSize = config.maxMessageSize;
1447
1507
  }
1448
1508
  }
1509
+ function configuredSendTimeoutMs(value) {
1510
+ return value ?? DEFAULT_SEND_TIMEOUT_MS;
1511
+ }