@zlink-systems/framework 0.10.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 (1121) hide show
  1. package/LICENSE +105 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/contracts/Actors/ZLinkActor.d.ts +7 -0
  4. package/dist/contracts/Actors/ZLinkActor.js +2 -0
  5. package/dist/contracts/Actors/ZLinkActorClient.d.ts +15 -0
  6. package/dist/contracts/Actors/ZLinkActorClient.js +2 -0
  7. package/dist/contracts/Actors/ZLinkActorContext.d.ts +14 -0
  8. package/dist/contracts/Actors/ZLinkActorContext.js +2 -0
  9. package/dist/contracts/Actors/ZLinkActorFactory.d.ts +34 -0
  10. package/dist/contracts/Actors/ZLinkActorFactory.js +2 -0
  11. package/dist/contracts/Actors/ZLinkActorManager.d.ts +34 -0
  12. package/dist/contracts/Actors/ZLinkActorManager.js +2 -0
  13. package/dist/contracts/Actors/index.d.ts +5 -0
  14. package/dist/contracts/Actors/index.js +21 -0
  15. package/dist/contracts/Channels/Calls.d.ts +28 -0
  16. package/dist/contracts/Channels/Calls.js +2 -0
  17. package/dist/contracts/Channels/IZLinkChannelClient.d.ts +5 -0
  18. package/dist/contracts/Channels/IZLinkChannelClient.js +2 -0
  19. package/dist/contracts/Channels/IZLinkFanoutClient.d.ts +11 -0
  20. package/dist/contracts/Channels/IZLinkFanoutClient.js +2 -0
  21. package/dist/contracts/Channels/RouteCalls.d.ts +11 -0
  22. package/dist/contracts/Channels/RouteCalls.js +2 -0
  23. package/dist/contracts/Channels/index.d.ts +4 -0
  24. package/dist/contracts/Channels/index.js +20 -0
  25. package/dist/contracts/Codecs/IZLinkCodecRegistryBuilder.d.ts +14 -0
  26. package/dist/contracts/Codecs/IZLinkCodecRegistryBuilder.js +2 -0
  27. package/dist/contracts/Codecs/ZLinkMessageSerializer.d.ts +5 -0
  28. package/dist/contracts/Codecs/ZLinkMessageSerializer.js +2 -0
  29. package/dist/contracts/Codecs/index.d.ts +2 -0
  30. package/dist/contracts/Codecs/index.js +18 -0
  31. package/dist/contracts/Common/ActorRef.d.ts +7 -0
  32. package/dist/contracts/Common/ActorRef.js +2 -0
  33. package/dist/contracts/Common/CoreTypes.d.ts +6 -0
  34. package/dist/contracts/Common/CoreTypes.js +2 -0
  35. package/dist/contracts/Common/Message.d.ts +9 -0
  36. package/dist/contracts/Common/Message.js +2 -0
  37. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +12 -0
  38. package/dist/contracts/Common/ZLinkEncodedPayload.js +41 -0
  39. package/dist/contracts/Common/ZLinkMessage.d.ts +25 -0
  40. package/dist/contracts/Common/ZLinkMessage.js +127 -0
  41. package/dist/contracts/Common/ZLinkMessageMetadata.d.ts +10 -0
  42. package/dist/contracts/Common/ZLinkMessageMetadata.js +49 -0
  43. package/dist/contracts/Common/ZLinkProviderResolver.d.ts +5 -0
  44. package/dist/contracts/Common/ZLinkProviderResolver.js +2 -0
  45. package/dist/contracts/Common/encoded-payload-storage.d.ts +3 -0
  46. package/dist/contracts/Common/encoded-payload-storage.js +18 -0
  47. package/dist/contracts/Common/index.d.ts +5 -0
  48. package/dist/contracts/Common/index.js +24 -0
  49. package/dist/contracts/Configuration/Builders.d.ts +153 -0
  50. package/dist/contracts/Configuration/Builders.js +2 -0
  51. package/dist/contracts/Configuration/CodecContentType.d.ts +2 -0
  52. package/dist/contracts/Configuration/CodecContentType.js +68 -0
  53. package/dist/contracts/Configuration/CodecSerializerSelection.d.ts +9 -0
  54. package/dist/contracts/Configuration/CodecSerializerSelection.js +15 -0
  55. package/dist/contracts/Configuration/Configs.d.ts +23 -0
  56. package/dist/contracts/Configuration/Configs.js +2 -0
  57. package/dist/contracts/Configuration/ConfigurationException.d.ts +3 -0
  58. package/dist/contracts/Configuration/ConfigurationException.js +10 -0
  59. package/dist/contracts/Configuration/Connections.d.ts +5 -0
  60. package/dist/contracts/Configuration/Connections.js +2 -0
  61. package/dist/contracts/Configuration/DiagnosticsValidation.d.ts +3 -0
  62. package/dist/contracts/Configuration/DiagnosticsValidation.js +23 -0
  63. package/dist/contracts/Configuration/EndpointNotation.d.ts +77 -0
  64. package/dist/contracts/Configuration/EndpointNotation.js +218 -0
  65. package/dist/contracts/Configuration/InternalDefaults.d.ts +7 -0
  66. package/dist/contracts/Configuration/InternalDefaults.js +47 -0
  67. package/dist/contracts/Configuration/ObjectRoles.d.ts +38 -0
  68. package/dist/contracts/Configuration/ObjectRoles.js +13 -0
  69. package/dist/contracts/Configuration/Registration.d.ts +11 -0
  70. package/dist/contracts/Configuration/Registration.js +162 -0
  71. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +14 -0
  72. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +61 -0
  73. package/dist/contracts/Configuration/RegistrationBuilders.d.ts +61 -0
  74. package/dist/contracts/Configuration/RegistrationBuilders.js +1181 -0
  75. package/dist/contracts/Configuration/RegistrationCodecRegistry.d.ts +19 -0
  76. package/dist/contracts/Configuration/RegistrationCodecRegistry.js +79 -0
  77. package/dist/contracts/Configuration/RegistrationNormalizers.d.ts +23 -0
  78. package/dist/contracts/Configuration/RegistrationNormalizers.js +319 -0
  79. package/dist/contracts/Configuration/RegistrationTypes.d.ts +414 -0
  80. package/dist/contracts/Configuration/RegistrationTypes.js +2 -0
  81. package/dist/contracts/Configuration/RegistrationValidators.d.ts +2 -0
  82. package/dist/contracts/Configuration/RegistrationValidators.js +461 -0
  83. package/dist/contracts/Configuration/RouteChannelInternalState.d.ts +10 -0
  84. package/dist/contracts/Configuration/RouteChannelInternalState.js +39 -0
  85. package/dist/contracts/Configuration/RuntimeEndpointConnections.d.ts +9 -0
  86. package/dist/contracts/Configuration/RuntimeEndpointConnections.js +80 -0
  87. package/dist/contracts/Configuration/SendTimeoutValidation.d.ts +2 -0
  88. package/dist/contracts/Configuration/SendTimeoutValidation.js +16 -0
  89. package/dist/contracts/Configuration/TimerRegistrationValidator.d.ts +2 -0
  90. package/dist/contracts/Configuration/TimerRegistrationValidator.js +24 -0
  91. package/dist/contracts/Configuration/index.d.ts +5 -0
  92. package/dist/contracts/Configuration/index.js +18 -0
  93. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +181 -0
  94. package/dist/contracts/Dispatch/ZLinkDispatchOptions.js +89 -0
  95. package/dist/contracts/Dispatch/ZLinkFlowOrigin.d.ts +1 -0
  96. package/dist/contracts/Dispatch/ZLinkFlowOrigin.js +2 -0
  97. package/dist/contracts/Dispatch/index.d.ts +2 -0
  98. package/dist/contracts/Dispatch/index.js +18 -0
  99. package/dist/contracts/Errors/ZLinkFrameworkException.d.ts +20 -0
  100. package/dist/contracts/Errors/ZLinkFrameworkException.js +29 -0
  101. package/dist/contracts/Errors/index.d.ts +1 -0
  102. package/dist/contracts/Errors/index.js +6 -0
  103. package/dist/contracts/Eventing/Metrics.d.ts +29 -0
  104. package/dist/contracts/Eventing/Metrics.js +4 -0
  105. package/dist/contracts/Eventing/index.d.ts +1 -0
  106. package/dist/contracts/Eventing/index.js +17 -0
  107. package/dist/contracts/Handlers/Attributes.d.ts +24 -0
  108. package/dist/contracts/Handlers/Attributes.js +84 -0
  109. package/dist/contracts/Handlers/Contexts.d.ts +18 -0
  110. package/dist/contracts/Handlers/Contexts.js +2 -0
  111. package/dist/contracts/Handlers/IZLinkChannelHandlers.d.ts +43 -0
  112. package/dist/contracts/Handlers/IZLinkChannelHandlers.js +2 -0
  113. package/dist/contracts/Handlers/IZLinkHandlerFilter.d.ts +15 -0
  114. package/dist/contracts/Handlers/IZLinkHandlerFilter.js +11 -0
  115. package/dist/contracts/Handlers/JsonContract.d.ts +46 -0
  116. package/dist/contracts/Handlers/JsonContract.js +137 -0
  117. package/dist/contracts/Handlers/ZLinkHandlerFilterNext.d.ts +1 -0
  118. package/dist/contracts/Handlers/ZLinkHandlerFilterNext.js +2 -0
  119. package/dist/contracts/Handlers/index.d.ts +5 -0
  120. package/dist/contracts/Handlers/index.js +33 -0
  121. package/dist/contracts/Locations/ActorTransfer.d.ts +41 -0
  122. package/dist/contracts/Locations/ActorTransfer.js +2 -0
  123. package/dist/contracts/Locations/Authority.d.ts +296 -0
  124. package/dist/contracts/Locations/Authority.js +17 -0
  125. package/dist/contracts/Locations/Diagnostics.d.ts +42 -0
  126. package/dist/contracts/Locations/Diagnostics.js +12 -0
  127. package/dist/contracts/Locations/Keys.d.ts +86 -0
  128. package/dist/contracts/Locations/Keys.js +2 -0
  129. package/dist/contracts/Locations/Models.d.ts +7 -0
  130. package/dist/contracts/Locations/Models.js +23 -0
  131. package/dist/contracts/Locations/Options.d.ts +23 -0
  132. package/dist/contracts/Locations/Options.js +20 -0
  133. package/dist/contracts/Locations/Readiness.d.ts +5 -0
  134. package/dist/contracts/Locations/Readiness.js +2 -0
  135. package/dist/contracts/Locations/RelocationStore.d.ts +38 -0
  136. package/dist/contracts/Locations/RelocationStore.js +2 -0
  137. package/dist/contracts/Locations/Resolvers.d.ts +4 -0
  138. package/dist/contracts/Locations/Resolvers.js +2 -0
  139. package/dist/contracts/Locations/Rows.d.ts +152 -0
  140. package/dist/contracts/Locations/Rows.js +19 -0
  141. package/dist/contracts/Locations/RuntimeQuery.d.ts +25 -0
  142. package/dist/contracts/Locations/RuntimeQuery.js +2 -0
  143. package/dist/contracts/Locations/Stores.d.ts +88 -0
  144. package/dist/contracts/Locations/Stores.js +2 -0
  145. package/dist/contracts/Locations/Values.d.ts +27 -0
  146. package/dist/contracts/Locations/Values.js +36 -0
  147. package/dist/contracts/Locations/Watch.d.ts +14 -0
  148. package/dist/contracts/Locations/Watch.js +12 -0
  149. package/dist/contracts/Locations/Writes.d.ts +48 -0
  150. package/dist/contracts/Locations/Writes.js +15 -0
  151. package/dist/contracts/Locations/index.d.ts +12 -0
  152. package/dist/contracts/Locations/index.js +30 -0
  153. package/dist/contracts/RouteMesh/Contracts.d.ts +102 -0
  154. package/dist/contracts/RouteMesh/Contracts.js +39 -0
  155. package/dist/contracts/RouteMesh/RuntimeTopology.d.ts +165 -0
  156. package/dist/contracts/RouteMesh/RuntimeTopology.js +38 -0
  157. package/dist/contracts/RouteMesh/index.d.ts +2 -0
  158. package/dist/contracts/RouteMesh/index.js +18 -0
  159. package/dist/contracts/Spots/Builders.d.ts +10 -0
  160. package/dist/contracts/Spots/Builders.js +2 -0
  161. package/dist/contracts/Spots/Contracts.d.ts +110 -0
  162. package/dist/contracts/Spots/Contracts.js +9 -0
  163. package/dist/contracts/Spots/SpotKind.d.ts +8 -0
  164. package/dist/contracts/Spots/SpotKind.js +28 -0
  165. package/dist/contracts/Spots/ZLinkSpot.d.ts +62 -0
  166. package/dist/contracts/Spots/ZLinkSpot.js +15 -0
  167. package/dist/contracts/Spots/index.d.ts +3 -0
  168. package/dist/contracts/Spots/index.js +19 -0
  169. package/dist/contracts/Streams/BoundSessionContracts.d.ts +8 -0
  170. package/dist/contracts/Streams/BoundSessionContracts.js +2 -0
  171. package/dist/contracts/Streams/IZLinkSession.d.ts +44 -0
  172. package/dist/contracts/Streams/IZLinkSession.js +2 -0
  173. package/dist/contracts/Streams/IZLinkSessionActor.d.ts +15 -0
  174. package/dist/contracts/Streams/IZLinkSessionActor.js +2 -0
  175. package/dist/contracts/Streams/IZLinkSessionPacketHandler.d.ts +9 -0
  176. package/dist/contracts/Streams/IZLinkSessionPacketHandler.js +2 -0
  177. package/dist/contracts/Streams/IZLinkStream.d.ts +9 -0
  178. package/dist/contracts/Streams/IZLinkStream.js +2 -0
  179. package/dist/contracts/Streams/ZLinkMessageMetadata.d.ts +1 -0
  180. package/dist/contracts/Streams/ZLinkMessageMetadata.js +2 -0
  181. package/dist/contracts/Streams/ZLinkStreamCompression.d.ts +8 -0
  182. package/dist/contracts/Streams/ZLinkStreamCompression.js +2 -0
  183. package/dist/contracts/Streams/ZLinkStreamError.d.ts +8 -0
  184. package/dist/contracts/Streams/ZLinkStreamError.js +8 -0
  185. package/dist/contracts/Streams/index.d.ts +8 -0
  186. package/dist/contracts/Streams/index.js +24 -0
  187. package/dist/contracts/Timers/IZLinkTimer.d.ts +5 -0
  188. package/dist/contracts/Timers/IZLinkTimer.js +2 -0
  189. package/dist/contracts/Timers/ZLinkTimerOptions.d.ts +10 -0
  190. package/dist/contracts/Timers/ZLinkTimerOptions.js +9 -0
  191. package/dist/contracts/Timers/ZLinkTimerTick.d.ts +12 -0
  192. package/dist/contracts/Timers/ZLinkTimerTick.js +2 -0
  193. package/dist/contracts/Timers/index.d.ts +3 -0
  194. package/dist/contracts/Timers/index.js +19 -0
  195. package/dist/contracts/index.d.ts +25 -0
  196. package/dist/contracts/index.js +45 -0
  197. package/dist/index.d.ts +1 -0
  198. package/dist/index.js +17 -0
  199. package/dist/internal.d.ts +26 -0
  200. package/dist/internal.js +48 -0
  201. package/dist/location-store-integration.d.ts +5 -0
  202. package/dist/location-store-integration.js +31 -0
  203. package/dist/nest-integration.d.ts +49 -0
  204. package/dist/nest-integration.js +143 -0
  205. package/dist/runtime/abort.d.ts +13 -0
  206. package/dist/runtime/abort.js +71 -0
  207. package/dist/runtime/actors/actor-authority-payload-codec.d.ts +33 -0
  208. package/dist/runtime/actors/actor-authority-payload-codec.js +366 -0
  209. package/dist/runtime/actors/actor-authority-publication.d.ts +28 -0
  210. package/dist/runtime/actors/actor-authority-publication.js +207 -0
  211. package/dist/runtime/actors/actor-client.d.ts +36 -0
  212. package/dist/runtime/actors/actor-client.js +612 -0
  213. package/dist/runtime/actors/actor-context.d.ts +26 -0
  214. package/dist/runtime/actors/actor-context.js +433 -0
  215. package/dist/runtime/actors/actor-creation.d.ts +19 -0
  216. package/dist/runtime/actors/actor-creation.js +158 -0
  217. package/dist/runtime/actors/actor-execution-context.d.ts +6 -0
  218. package/dist/runtime/actors/actor-execution-context.js +27 -0
  219. package/dist/runtime/actors/actor-handoff.d.ts +191 -0
  220. package/dist/runtime/actors/actor-handoff.js +1252 -0
  221. package/dist/runtime/actors/actor-join-deferred-scope.d.ts +11 -0
  222. package/dist/runtime/actors/actor-join-deferred-scope.js +144 -0
  223. package/dist/runtime/actors/actor-join-relocation.d.ts +38 -0
  224. package/dist/runtime/actors/actor-join-relocation.js +2 -0
  225. package/dist/runtime/actors/actor-lifecycle-snapshot.d.ts +21 -0
  226. package/dist/runtime/actors/actor-lifecycle-snapshot.js +58 -0
  227. package/dist/runtime/actors/actor-local-native-join.d.ts +27 -0
  228. package/dist/runtime/actors/actor-local-native-join.js +409 -0
  229. package/dist/runtime/actors/actor-mailbox.d.ts +10 -0
  230. package/dist/runtime/actors/actor-mailbox.js +53 -0
  231. package/dist/runtime/actors/actor-message-follow-context.d.ts +46 -0
  232. package/dist/runtime/actors/actor-message-follow-context.js +257 -0
  233. package/dist/runtime/actors/actor-native-lookup.d.ts +4 -0
  234. package/dist/runtime/actors/actor-native-lookup.js +30 -0
  235. package/dist/runtime/actors/actor-packet-relay-wire.d.ts +73 -0
  236. package/dist/runtime/actors/actor-packet-relay-wire.js +144 -0
  237. package/dist/runtime/actors/actor-remote-joiner.d.ts +37 -0
  238. package/dist/runtime/actors/actor-remote-joiner.js +122 -0
  239. package/dist/runtime/actors/actor-remote-wire.d.ts +73 -0
  240. package/dist/runtime/actors/actor-remote-wire.js +84 -0
  241. package/dist/runtime/actors/actor-retry-delay.d.ts +5 -0
  242. package/dist/runtime/actors/actor-retry-delay.js +40 -0
  243. package/dist/runtime/actors/actor-routed-join-transport.d.ts +33 -0
  244. package/dist/runtime/actors/actor-routed-join-transport.js +2 -0
  245. package/dist/runtime/actors/actor-routed-json-request.d.ts +11 -0
  246. package/dist/runtime/actors/actor-routed-json-request.js +39 -0
  247. package/dist/runtime/actors/actor-runtime-contracts.d.ts +63 -0
  248. package/dist/runtime/actors/actor-runtime-contracts.js +2 -0
  249. package/dist/runtime/actors/actor-runtime-state.d.ts +152 -0
  250. package/dist/runtime/actors/actor-runtime-state.js +545 -0
  251. package/dist/runtime/actors/actor-source-transfer.d.ts +27 -0
  252. package/dist/runtime/actors/actor-source-transfer.js +2 -0
  253. package/dist/runtime/actors/actor-transfer-registry.d.ts +18 -0
  254. package/dist/runtime/actors/actor-transfer-registry.js +71 -0
  255. package/dist/runtime/actors/actor-transport-delivery-gate.d.ts +6 -0
  256. package/dist/runtime/actors/actor-transport-delivery-gate.js +4 -0
  257. package/dist/runtime/actors/bound-session-wire.d.ts +81 -0
  258. package/dist/runtime/actors/bound-session-wire.js +184 -0
  259. package/dist/runtime/actors/deferred-join-accepted-journal.d.ts +47 -0
  260. package/dist/runtime/actors/deferred-join-accepted-journal.js +962 -0
  261. package/dist/runtime/actors/index.d.ts +79 -0
  262. package/dist/runtime/actors/index.js +639 -0
  263. package/dist/runtime/actors/post-commit-actor-binder.d.ts +18 -0
  264. package/dist/runtime/actors/post-commit-actor-binder.js +68 -0
  265. package/dist/runtime/actors/post-commit-actor-location.d.ts +19 -0
  266. package/dist/runtime/actors/post-commit-actor-location.js +72 -0
  267. package/dist/runtime/actors/spot-actor-dispatch.d.ts +59 -0
  268. package/dist/runtime/actors/spot-actor-dispatch.js +179 -0
  269. package/dist/runtime/actors/transferred-actor-rollback.d.ts +16 -0
  270. package/dist/runtime/actors/transferred-actor-rollback.js +91 -0
  271. package/dist/runtime/admission.d.ts +20 -0
  272. package/dist/runtime/admission.js +166 -0
  273. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +57 -0
  274. package/dist/runtime/application-jobs/application-ingress-record-owner.js +185 -0
  275. package/dist/runtime/application-jobs/application-job-queue-handler-start-gate.d.ts +8 -0
  276. package/dist/runtime/application-jobs/application-job-queue-handler-start-gate.js +8 -0
  277. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +17 -0
  278. package/dist/runtime/application-jobs/application-job-queue-scope.js +57 -0
  279. package/dist/runtime/application-jobs/contracts.d.ts +19 -0
  280. package/dist/runtime/application-jobs/contracts.js +2 -0
  281. package/dist/runtime/application-jobs/receive-flow-controller.d.ts +32 -0
  282. package/dist/runtime/application-jobs/receive-flow-controller.js +165 -0
  283. package/dist/runtime/backend/contracts/index.d.ts +487 -0
  284. package/dist/runtime/backend/contracts/index.js +29 -0
  285. package/dist/runtime/backend/index.d.ts +9 -0
  286. package/dist/runtime/backend/index.js +25 -0
  287. package/dist/runtime/backend/mesh-actor-session-node-adapter.d.ts +3 -0
  288. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +51 -0
  289. package/dist/runtime/backend/mesh-completion-table.d.ts +34 -0
  290. package/dist/runtime/backend/mesh-completion-table.js +124 -0
  291. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +48 -0
  292. package/dist/runtime/backend/mesh-dispatch-pump.js +322 -0
  293. package/dist/runtime/backend/mesh-record-dispatcher.d.ts +19 -0
  294. package/dist/runtime/backend/mesh-record-dispatcher.js +53 -0
  295. package/dist/runtime/backend/node/index.d.ts +4 -0
  296. package/dist/runtime/backend/node/index.js +22 -0
  297. package/dist/runtime/backend/node/node-backend-adapter-factory.d.ts +12 -0
  298. package/dist/runtime/backend/node/node-backend-adapter-factory.js +161 -0
  299. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +52 -0
  300. package/dist/runtime/backend/node/node-backend-adapter-support.js +203 -0
  301. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +13 -0
  302. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +52 -0
  303. package/dist/runtime/backend/node/node-mesh-backend-adapter.d.ts +11 -0
  304. package/dist/runtime/backend/node/node-mesh-backend-adapter.js +23 -0
  305. package/dist/runtime/backend/node/node-monitor-backend-adapter.d.ts +6 -0
  306. package/dist/runtime/backend/node/node-monitor-backend-adapter.js +38 -0
  307. package/dist/runtime/backend/node/node-raw-binding-port.d.ts +8 -0
  308. package/dist/runtime/backend/node/node-raw-binding-port.js +411 -0
  309. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +266 -0
  310. package/dist/runtime/backend/node/node-raw-mesh-backend.js +1707 -0
  311. package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +9 -0
  312. package/dist/runtime/backend/node/node-socket-backend-adapter.js +286 -0
  313. package/dist/runtime/backend/node-backend-adapter.d.ts +9 -0
  314. package/dist/runtime/backend/node-backend-adapter.js +12 -0
  315. package/dist/runtime/backend/raw-binding-port.d.ts +58 -0
  316. package/dist/runtime/backend/raw-binding-port.js +2 -0
  317. package/dist/runtime/backend/runtime-message.d.ts +14 -0
  318. package/dist/runtime/backend/runtime-message.js +44 -0
  319. package/dist/runtime/backend/runtime-values.d.ts +78 -0
  320. package/dist/runtime/backend/runtime-values.js +66 -0
  321. package/dist/runtime/channels/channel-autoconnect.d.ts +14 -0
  322. package/dist/runtime/channels/channel-autoconnect.js +23 -0
  323. package/dist/runtime/channels/channel-clients.d.ts +50 -0
  324. package/dist/runtime/channels/channel-clients.js +329 -0
  325. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +76 -0
  326. package/dist/runtime/channels/channel-dispatch-pipeline.js +237 -0
  327. package/dist/runtime/channels/channel-dispatch-services.d.ts +52 -0
  328. package/dist/runtime/channels/channel-dispatch-services.js +132 -0
  329. package/dist/runtime/channels/channel-dispatchers.d.ts +125 -0
  330. package/dist/runtime/channels/channel-dispatchers.js +575 -0
  331. package/dist/runtime/channels/channel-envelope-inspection.d.ts +25 -0
  332. package/dist/runtime/channels/channel-envelope-inspection.js +96 -0
  333. package/dist/runtime/channels/channel-envelope.d.ts +73 -0
  334. package/dist/runtime/channels/channel-envelope.js +546 -0
  335. package/dist/runtime/channels/channel-framework-packets.d.ts +2 -0
  336. package/dist/runtime/channels/channel-framework-packets.js +6 -0
  337. package/dist/runtime/channels/channel-multipart.d.ts +16 -0
  338. package/dist/runtime/channels/channel-multipart.js +31 -0
  339. package/dist/runtime/channels/channel-outbound-operations.d.ts +33 -0
  340. package/dist/runtime/channels/channel-outbound-operations.js +343 -0
  341. package/dist/runtime/channels/channel-receive-loops.d.ts +151 -0
  342. package/dist/runtime/channels/channel-receive-loops.js +728 -0
  343. package/dist/runtime/channels/channel-receive-task-tracker.d.ts +14 -0
  344. package/dist/runtime/channels/channel-receive-task-tracker.js +37 -0
  345. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +77 -0
  346. package/dist/runtime/channels/channel-runtime-lifecycle.js +630 -0
  347. package/dist/runtime/channels/channel-runtime-manager.d.ts +84 -0
  348. package/dist/runtime/channels/channel-runtime-manager.js +193 -0
  349. package/dist/runtime/channels/channel-socket-options.d.ts +18 -0
  350. package/dist/runtime/channels/channel-socket-options.js +119 -0
  351. package/dist/runtime/channels/channel-socket-registry.d.ts +157 -0
  352. package/dist/runtime/channels/channel-socket-registry.js +1428 -0
  353. package/dist/runtime/channels/channel-transports.d.ts +126 -0
  354. package/dist/runtime/channels/channel-transports.js +448 -0
  355. package/dist/runtime/channels/client-server-location-runtime.d.ts +41 -0
  356. package/dist/runtime/channels/client-server-location-runtime.js +465 -0
  357. package/dist/runtime/channels/client-server-service-wire.d.ts +48 -0
  358. package/dist/runtime/channels/client-server-service-wire.js +306 -0
  359. package/dist/runtime/channels/dispatch-error-reporter.d.ts +22 -0
  360. package/dist/runtime/channels/dispatch-error-reporter.js +133 -0
  361. package/dist/runtime/channels/fanout-location-runtime.d.ts +38 -0
  362. package/dist/runtime/channels/fanout-location-runtime.js +356 -0
  363. package/dist/runtime/channels/fanout-service-wire.d.ts +12 -0
  364. package/dist/runtime/channels/fanout-service-wire.js +29 -0
  365. package/dist/runtime/channels/handler-filter-scope.d.ts +8 -0
  366. package/dist/runtime/channels/handler-filter-scope.js +11 -0
  367. package/dist/runtime/channels/index.d.ts +9 -0
  368. package/dist/runtime/channels/index.js +30 -0
  369. package/dist/runtime/channels/local-spot-route-transport.d.ts +9 -0
  370. package/dist/runtime/channels/local-spot-route-transport.js +40 -0
  371. package/dist/runtime/channels/route-disconnected-error.d.ts +3 -0
  372. package/dist/runtime/channels/route-disconnected-error.js +10 -0
  373. package/dist/runtime/channels/route-member-snapshot.d.ts +10 -0
  374. package/dist/runtime/channels/route-member-snapshot.js +55 -0
  375. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +12 -0
  376. package/dist/runtime/channels/router-socket-spot-route-transport.js +43 -0
  377. package/dist/runtime/channels/source-spot-router.d.ts +10 -0
  378. package/dist/runtime/channels/source-spot-router.js +46 -0
  379. package/dist/runtime/channels/spot-direct-envelope.d.ts +5 -0
  380. package/dist/runtime/channels/spot-direct-envelope.js +29 -0
  381. package/dist/runtime/channels/spot-node-route-transport.d.ts +13 -0
  382. package/dist/runtime/channels/spot-node-route-transport.js +60 -0
  383. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +14 -0
  384. package/dist/runtime/channels/spot-route-bridge-transport.js +58 -0
  385. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +50 -0
  386. package/dist/runtime/channels/spot-route-dispatch-strategy.js +128 -0
  387. package/dist/runtime/channels/spot-route-target-resolver.d.ts +16 -0
  388. package/dist/runtime/channels/spot-route-target-resolver.js +92 -0
  389. package/dist/runtime/codecs/index.d.ts +14 -0
  390. package/dist/runtime/codecs/index.js +44 -0
  391. package/dist/runtime/configuration/index.d.ts +1 -0
  392. package/dist/runtime/configuration/index.js +17 -0
  393. package/dist/runtime/diagnostics/dispatch-error-port.d.ts +8 -0
  394. package/dist/runtime/diagnostics/dispatch-error-port.js +2 -0
  395. package/dist/runtime/diagnostics/flow-context.d.ts +21 -0
  396. package/dist/runtime/diagnostics/flow-context.js +68 -0
  397. package/dist/runtime/diagnostics/index.d.ts +82 -0
  398. package/dist/runtime/diagnostics/index.js +335 -0
  399. package/dist/runtime/diagnostics/internal-event-contracts.d.ts +139 -0
  400. package/dist/runtime/diagnostics/internal-event-contracts.js +68 -0
  401. package/dist/runtime/diagnostics/message-flow.d.ts +55 -0
  402. package/dist/runtime/diagnostics/message-flow.js +420 -0
  403. package/dist/runtime/diagnostics/runtime-metrics.d.ts +123 -0
  404. package/dist/runtime/diagnostics/runtime-metrics.js +454 -0
  405. package/dist/runtime/diagnostics/runtime-observation-queue.d.ts +58 -0
  406. package/dist/runtime/diagnostics/runtime-observation-queue.js +324 -0
  407. package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +33 -0
  408. package/dist/runtime/diagnostics/topology-runtime-projections.js +255 -0
  409. package/dist/runtime/execution/index.d.ts +114 -0
  410. package/dist/runtime/execution/index.js +363 -0
  411. package/dist/runtime/execution/serial-execution-queue.d.ts +94 -0
  412. package/dist/runtime/execution/serial-execution-queue.js +411 -0
  413. package/dist/runtime/execution/serial-work-size.d.ts +4 -0
  414. package/dist/runtime/execution/serial-work-size.js +28 -0
  415. package/dist/runtime/execution/state-lane.d.ts +28 -0
  416. package/dist/runtime/execution/state-lane.js +105 -0
  417. package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +72 -0
  418. package/dist/runtime/foundation/actor-join-recovery-codec.js +333 -0
  419. package/dist/runtime/foundation/event-loop-resources.d.ts +37 -0
  420. package/dist/runtime/foundation/event-loop-resources.js +163 -0
  421. package/dist/runtime/foundation/index.d.ts +18 -0
  422. package/dist/runtime/foundation/index.js +34 -0
  423. package/dist/runtime/foundation/message-follow-suppression-registry.d.ts +38 -0
  424. package/dist/runtime/foundation/message-follow-suppression-registry.js +89 -0
  425. package/dist/runtime/foundation/operation-identity.d.ts +12 -0
  426. package/dist/runtime/foundation/operation-identity.js +33 -0
  427. package/dist/runtime/foundation/operation-registry.d.ts +42 -0
  428. package/dist/runtime/foundation/operation-registry.js +146 -0
  429. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +143 -0
  430. package/dist/runtime/foundation/raw-service-mesh-runtime.js +1349 -0
  431. package/dist/runtime/foundation/route-mesh-connection-policy.d.ts +3 -0
  432. package/dist/runtime/foundation/route-mesh-connection-policy.js +13 -0
  433. package/dist/runtime/foundation/runtime-state-projections.d.ts +13 -0
  434. package/dist/runtime/foundation/runtime-state-projections.js +44 -0
  435. package/dist/runtime/foundation/service-authority-payload-codec.d.ts +56 -0
  436. package/dist/runtime/foundation/service-authority-payload-codec.js +411 -0
  437. package/dist/runtime/foundation/service-discovery-registry.d.ts +42 -0
  438. package/dist/runtime/foundation/service-discovery-registry.js +175 -0
  439. package/dist/runtime/foundation/service-instance-activation-recovery-codec.d.ts +19 -0
  440. package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +287 -0
  441. package/dist/runtime/foundation/service-liveness-registry.d.ts +28 -0
  442. package/dist/runtime/foundation/service-liveness-registry.js +109 -0
  443. package/dist/runtime/foundation/service-mailbox.d.ts +60 -0
  444. package/dist/runtime/foundation/service-mailbox.js +283 -0
  445. package/dist/runtime/foundation/service-maintenance-runtime.d.ts +45 -0
  446. package/dist/runtime/foundation/service-maintenance-runtime.js +198 -0
  447. package/dist/runtime/foundation/service-metadata-codec.d.ts +2 -0
  448. package/dist/runtime/foundation/service-metadata-codec.js +69 -0
  449. package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +35 -0
  450. package/dist/runtime/foundation/service-relocation-aggregate-committer.js +139 -0
  451. package/dist/runtime/foundation/service-relocation-coordinator.d.ts +19 -0
  452. package/dist/runtime/foundation/service-relocation-coordinator.js +16 -0
  453. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +71 -0
  454. package/dist/runtime/foundation/service-relocation-object-owner.js +242 -0
  455. package/dist/runtime/foundation/service-relocation-runtime.d.ts +143 -0
  456. package/dist/runtime/foundation/service-relocation-runtime.js +1080 -0
  457. package/dist/runtime/foundation/service-runtime-contracts.d.ts +332 -0
  458. package/dist/runtime/foundation/service-runtime-contracts.js +66 -0
  459. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +23 -0
  460. package/dist/runtime/foundation/service-session-binding-ingress-port.js +11 -0
  461. package/dist/runtime/foundation/service-stateful-registry.d.ts +142 -0
  462. package/dist/runtime/foundation/service-stateful-registry.js +465 -0
  463. package/dist/runtime/foundation/service-stateful-runtime.d.ts +393 -0
  464. package/dist/runtime/foundation/service-stateful-runtime.js +3898 -0
  465. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +597 -0
  466. package/dist/runtime/foundation/service-stateful-wire-codec.js +2006 -0
  467. package/dist/runtime/foundation/service-topology-registry.d.ts +68 -0
  468. package/dist/runtime/foundation/service-topology-registry.js +393 -0
  469. package/dist/runtime/foundation/service-weighted-selection.d.ts +14 -0
  470. package/dist/runtime/foundation/service-weighted-selection.js +128 -0
  471. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +10 -0
  472. package/dist/runtime/foundation/service-wire-binary-primitives.js +53 -0
  473. package/dist/runtime/foundation/service-wire-codec.d.ts +22 -0
  474. package/dist/runtime/foundation/service-wire-codec.js +67 -0
  475. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +110 -0
  476. package/dist/runtime/foundation/service-wire-constants.generated.js +132 -0
  477. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +102 -0
  478. package/dist/runtime/foundation/service-wire-m6a-codec.js +568 -0
  479. package/dist/runtime/framework-errors-internal.d.ts +95 -0
  480. package/dist/runtime/framework-errors-internal.js +301 -0
  481. package/dist/runtime/handlers/handler-instance-scope.d.ts +11 -0
  482. package/dist/runtime/handlers/handler-instance-scope.js +284 -0
  483. package/dist/runtime/handlers/index.d.ts +13 -0
  484. package/dist/runtime/handlers/index.js +57 -0
  485. package/dist/runtime/host/actor-packet-relay.d.ts +60 -0
  486. package/dist/runtime/host/actor-packet-relay.js +664 -0
  487. package/dist/runtime/host/actor-placement-coordinator.d.ts +32 -0
  488. package/dist/runtime/host/actor-placement-coordinator.js +386 -0
  489. package/dist/runtime/host/actor-runtime-options-factory.d.ts +65 -0
  490. package/dist/runtime/host/actor-runtime-options-factory.js +160 -0
  491. package/dist/runtime/host/actor-transfer-authority-runtime.d.ts +26 -0
  492. package/dist/runtime/host/actor-transfer-authority-runtime.js +138 -0
  493. package/dist/runtime/host/actor-transfer-runtime.d.ts +149 -0
  494. package/dist/runtime/host/actor-transfer-runtime.js +1245 -0
  495. package/dist/runtime/host/application-job-queue.d.ts +99 -0
  496. package/dist/runtime/host/application-job-queue.js +409 -0
  497. package/dist/runtime/host/bound-session-relay.d.ts +41 -0
  498. package/dist/runtime/host/bound-session-relay.js +52 -0
  499. package/dist/runtime/host/bounded-replay-map.d.ts +12 -0
  500. package/dist/runtime/host/bounded-replay-map.js +42 -0
  501. package/dist/runtime/host/channel-runtime-options-factory.d.ts +22 -0
  502. package/dist/runtime/host/channel-runtime-options-factory.js +76 -0
  503. package/dist/runtime/host/entry-actor-runtime.d.ts +30 -0
  504. package/dist/runtime/host/entry-actor-runtime.js +80 -0
  505. package/dist/runtime/host/host-capacity-status.d.ts +11 -0
  506. package/dist/runtime/host/host-capacity-status.js +85 -0
  507. package/dist/runtime/host/index.d.ts +188 -0
  508. package/dist/runtime/host/index.js +2552 -0
  509. package/dist/runtime/host/instance-activation-authority.d.ts +33 -0
  510. package/dist/runtime/host/instance-activation-authority.js +496 -0
  511. package/dist/runtime/host/location-runtime-owner.d.ts +48 -0
  512. package/dist/runtime/host/location-runtime-owner.js +227 -0
  513. package/dist/runtime/host/mesh-router-resolver.d.ts +16 -0
  514. package/dist/runtime/host/mesh-router-resolver.js +108 -0
  515. package/dist/runtime/host/relocation-direct-transfer.d.ts +81 -0
  516. package/dist/runtime/host/relocation-direct-transfer.js +240 -0
  517. package/dist/runtime/host/relocation-integrity-fault-gate.d.ts +6 -0
  518. package/dist/runtime/host/relocation-integrity-fault-gate.js +5 -0
  519. package/dist/runtime/host/relocation-state-adapter.d.ts +8 -0
  520. package/dist/runtime/host/relocation-state-adapter.js +13 -0
  521. package/dist/runtime/host/remote-actor-join-receiver.d.ts +47 -0
  522. package/dist/runtime/host/remote-actor-join-receiver.js +161 -0
  523. package/dist/runtime/host/remote-actor-packet-target-store.d.ts +29 -0
  524. package/dist/runtime/host/remote-actor-packet-target-store.js +185 -0
  525. package/dist/runtime/host/remote-bound-session-relay.d.ts +58 -0
  526. package/dist/runtime/host/remote-bound-session-relay.js +540 -0
  527. package/dist/runtime/host/route-mesh-runtime-options.d.ts +9 -0
  528. package/dist/runtime/host/route-mesh-runtime-options.js +41 -0
  529. package/dist/runtime/host/route-mesh-runtime.d.ts +76 -0
  530. package/dist/runtime/host/route-mesh-runtime.js +746 -0
  531. package/dist/runtime/host/runtime-shutdown.d.ts +33 -0
  532. package/dist/runtime/host/runtime-shutdown.js +68 -0
  533. package/dist/runtime/host/service-relocation-control.d.ts +7 -0
  534. package/dist/runtime/host/service-relocation-control.js +24 -0
  535. package/dist/runtime/host/service-relocation-host-runtime.d.ts +241 -0
  536. package/dist/runtime/host/service-relocation-host-runtime.js +4113 -0
  537. package/dist/runtime/host/spot-address-transport.d.ts +47 -0
  538. package/dist/runtime/host/spot-address-transport.js +601 -0
  539. package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +38 -0
  540. package/dist/runtime/host/spot-node-runtime-options-factory.js +36 -0
  541. package/dist/runtime/host/spot-runtime-options-factory.d.ts +48 -0
  542. package/dist/runtime/host/spot-runtime-options-factory.js +169 -0
  543. package/dist/runtime/host/stateful-authority-route-runtime.d.ts +34 -0
  544. package/dist/runtime/host/stateful-authority-route-runtime.js +440 -0
  545. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +69 -0
  546. package/dist/runtime/host/user-spot-creation-coordinator.js +759 -0
  547. package/dist/runtime/locations/actor-location-claims.d.ts +43 -0
  548. package/dist/runtime/locations/actor-location-claims.js +319 -0
  549. package/dist/runtime/locations/actor-session-route-claims.d.ts +10 -0
  550. package/dist/runtime/locations/actor-session-route-claims.js +51 -0
  551. package/dist/runtime/locations/aggregate-inventory-store.d.ts +18 -0
  552. package/dist/runtime/locations/aggregate-inventory-store.js +399 -0
  553. package/dist/runtime/locations/authority-key-codec.d.ts +6 -0
  554. package/dist/runtime/locations/authority-key-codec.js +78 -0
  555. package/dist/runtime/locations/auto-connect-loop.d.ts +37 -0
  556. package/dist/runtime/locations/auto-connect-loop.js +112 -0
  557. package/dist/runtime/locations/auto-connect-planner.d.ts +9 -0
  558. package/dist/runtime/locations/auto-connect-planner.js +137 -0
  559. package/dist/runtime/locations/auto-connect-reconciler.d.ts +57 -0
  560. package/dist/runtime/locations/auto-connect-reconciler.js +358 -0
  561. package/dist/runtime/locations/auto-connect-types.d.ts +42 -0
  562. package/dist/runtime/locations/auto-connect-types.js +2 -0
  563. package/dist/runtime/locations/auto-connect.d.ts +4 -0
  564. package/dist/runtime/locations/auto-connect.js +20 -0
  565. package/dist/runtime/locations/canonical-codec.d.ts +7 -0
  566. package/dist/runtime/locations/canonical-codec.js +48 -0
  567. package/dist/runtime/locations/domain-store-contract.d.ts +34 -0
  568. package/dist/runtime/locations/domain-store-contract.js +2 -0
  569. package/dist/runtime/locations/in-memory-authority-store.d.ts +51 -0
  570. package/dist/runtime/locations/in-memory-authority-store.js +895 -0
  571. package/dist/runtime/locations/in-memory-location-store.d.ts +78 -0
  572. package/dist/runtime/locations/in-memory-location-store.js +1008 -0
  573. package/dist/runtime/locations/in-memory-provider-location-store.d.ts +19 -0
  574. package/dist/runtime/locations/in-memory-provider-location-store.js +183 -0
  575. package/dist/runtime/locations/index.d.ts +11 -0
  576. package/dist/runtime/locations/index.js +27 -0
  577. package/dist/runtime/locations/internal-location-contracts.d.ts +7 -0
  578. package/dist/runtime/locations/internal-location-contracts.js +21 -0
  579. package/dist/runtime/locations/internal-store-contracts.d.ts +35 -0
  580. package/dist/runtime/locations/internal-store-contracts.js +2 -0
  581. package/dist/runtime/locations/key-codec.d.ts +13 -0
  582. package/dist/runtime/locations/key-codec.js +41 -0
  583. package/dist/runtime/locations/lease-tracker.d.ts +36 -0
  584. package/dist/runtime/locations/lease-tracker.js +155 -0
  585. package/dist/runtime/locations/lifecycle-runtime.d.ts +19 -0
  586. package/dist/runtime/locations/lifecycle-runtime.js +2 -0
  587. package/dist/runtime/locations/lifecycle.d.ts +40 -0
  588. package/dist/runtime/locations/lifecycle.js +120 -0
  589. package/dist/runtime/locations/location-store-repository.d.ts +72 -0
  590. package/dist/runtime/locations/location-store-repository.js +3198 -0
  591. package/dist/runtime/locations/relocation-blob.d.ts +7 -0
  592. package/dist/runtime/locations/relocation-blob.js +24 -0
  593. package/dist/runtime/locations/resolvers.d.ts +145 -0
  594. package/dist/runtime/locations/resolvers.js +693 -0
  595. package/dist/runtime/locations/runtime.d.ts +144 -0
  596. package/dist/runtime/locations/runtime.js +792 -0
  597. package/dist/runtime/locations/spot-location-claims.d.ts +36 -0
  598. package/dist/runtime/locations/spot-location-claims.js +305 -0
  599. package/dist/runtime/messaging/creation-payload-codec.d.ts +4 -0
  600. package/dist/runtime/messaging/creation-payload-codec.js +40 -0
  601. package/dist/runtime/messaging/framework-json-v1.d.ts +7 -0
  602. package/dist/runtime/messaging/framework-json-v1.js +296 -0
  603. package/dist/runtime/messaging/index.d.ts +1 -0
  604. package/dist/runtime/messaging/index.js +2 -0
  605. package/dist/runtime/messaging/packet-name.d.ts +4 -0
  606. package/dist/runtime/messaging/packet-name.js +79 -0
  607. package/dist/runtime/messaging/payload-codec.d.ts +25 -0
  608. package/dist/runtime/messaging/payload-codec.js +255 -0
  609. package/dist/runtime/messaging/submission-result.d.ts +15 -0
  610. package/dist/runtime/messaging/submission-result.js +37 -0
  611. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +395 -0
  612. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +645 -0
  613. package/dist/runtime/routing-id.d.ts +8 -0
  614. package/dist/runtime/routing-id.js +112 -0
  615. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +124 -0
  616. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +269 -0
  617. package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +33 -0
  618. package/dist/runtime/spots/formal-remote-actor-transfer-registry.js +94 -0
  619. package/dist/runtime/spots/index.d.ts +247 -0
  620. package/dist/runtime/spots/index.js +2090 -0
  621. package/dist/runtime/spots/spot-activation-registry.d.ts +47 -0
  622. package/dist/runtime/spots/spot-activation-registry.js +272 -0
  623. package/dist/runtime/spots/spot-activation-state.d.ts +104 -0
  624. package/dist/runtime/spots/spot-activation-state.js +288 -0
  625. package/dist/runtime/spots/spot-activation.d.ts +89 -0
  626. package/dist/runtime/spots/spot-activation.js +601 -0
  627. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +20 -0
  628. package/dist/runtime/spots/spot-actor-admission-coordinator.js +194 -0
  629. package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +83 -0
  630. package/dist/runtime/spots/spot-actor-join-dispatch.js +185 -0
  631. package/dist/runtime/spots/spot-actor-lifecycle-drain.d.ts +22 -0
  632. package/dist/runtime/spots/spot-actor-lifecycle-drain.js +51 -0
  633. package/dist/runtime/spots/spot-actor-membership.d.ts +39 -0
  634. package/dist/runtime/spots/spot-actor-membership.js +179 -0
  635. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +91 -0
  636. package/dist/runtime/spots/spot-actor-packet-dispatch.js +315 -0
  637. package/dist/runtime/spots/spot-actor-packet-drain.d.ts +40 -0
  638. package/dist/runtime/spots/spot-actor-packet-drain.js +235 -0
  639. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +18 -0
  640. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +110 -0
  641. package/dist/runtime/spots/spot-closing.d.ts +2 -0
  642. package/dist/runtime/spots/spot-closing.js +30 -0
  643. package/dist/runtime/spots/spot-context.d.ts +46 -0
  644. package/dist/runtime/spots/spot-context.js +113 -0
  645. package/dist/runtime/spots/spot-entry-activation.d.ts +107 -0
  646. package/dist/runtime/spots/spot-entry-activation.js +342 -0
  647. package/dist/runtime/spots/spot-handle.d.ts +28 -0
  648. package/dist/runtime/spots/spot-handle.js +38 -0
  649. package/dist/runtime/spots/spot-handler-registry.d.ts +52 -0
  650. package/dist/runtime/spots/spot-handler-registry.js +155 -0
  651. package/dist/runtime/spots/spot-lifecycle-metrics.d.ts +8 -0
  652. package/dist/runtime/spots/spot-lifecycle-metrics.js +16 -0
  653. package/dist/runtime/spots/spot-location-claim.d.ts +25 -0
  654. package/dist/runtime/spots/spot-location-claim.js +55 -0
  655. package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +10 -0
  656. package/dist/runtime/spots/spot-manager-internal-contracts.js +2 -0
  657. package/dist/runtime/spots/spot-manager-public.d.ts +32 -0
  658. package/dist/runtime/spots/spot-manager-public.js +219 -0
  659. package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +26 -0
  660. package/dist/runtime/spots/spot-native-actor-join-admission.js +105 -0
  661. package/dist/runtime/spots/spot-native-flags.d.ts +2 -0
  662. package/dist/runtime/spots/spot-native-flags.js +5 -0
  663. package/dist/runtime/spots/spot-node-autoconnect.d.ts +23 -0
  664. package/dist/runtime/spots/spot-node-autoconnect.js +246 -0
  665. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +137 -0
  666. package/dist/runtime/spots/spot-node-runtime-manager.js +1111 -0
  667. package/dist/runtime/spots/spot-outbound.d.ts +78 -0
  668. package/dist/runtime/spots/spot-outbound.js +460 -0
  669. package/dist/runtime/spots/spot-provider.d.ts +4 -0
  670. package/dist/runtime/spots/spot-provider.js +28 -0
  671. package/dist/runtime/spots/spot-publisher-transport.d.ts +14 -0
  672. package/dist/runtime/spots/spot-publisher-transport.js +28 -0
  673. package/dist/runtime/spots/spot-remote-codec.d.ts +50 -0
  674. package/dist/runtime/spots/spot-remote-codec.js +190 -0
  675. package/dist/runtime/spots/spot-remote-route-codec.d.ts +47 -0
  676. package/dist/runtime/spots/spot-remote-route-codec.js +168 -0
  677. package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +25 -0
  678. package/dist/runtime/spots/spot-route-packet-dispatch.js +238 -0
  679. package/dist/runtime/spots/spot-route-replies.d.ts +17 -0
  680. package/dist/runtime/spots/spot-route-replies.js +76 -0
  681. package/dist/runtime/spots/spot-route-reply-wire.d.ts +10 -0
  682. package/dist/runtime/spots/spot-route-reply-wire.js +6 -0
  683. package/dist/runtime/spots/spot-routed-actor-admission.d.ts +36 -0
  684. package/dist/runtime/spots/spot-routed-actor-admission.js +240 -0
  685. package/dist/runtime/spots/spot-routed-bound-session-dispatch.d.ts +19 -0
  686. package/dist/runtime/spots/spot-routed-bound-session-dispatch.js +46 -0
  687. package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +54 -0
  688. package/dist/runtime/spots/spot-routed-frame-dispatch.js +162 -0
  689. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +43 -0
  690. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +152 -0
  691. package/dist/runtime/spots/spot-routing-internal.d.ts +28 -0
  692. package/dist/runtime/spots/spot-routing-internal.js +2 -0
  693. package/dist/runtime/spots/spot-runtime-ports.d.ts +64 -0
  694. package/dist/runtime/spots/spot-runtime-ports.js +2 -0
  695. package/dist/runtime/spots/spot-serial-executor.d.ts +38 -0
  696. package/dist/runtime/spots/spot-serial-executor.js +133 -0
  697. package/dist/runtime/spots/spot-serial-turn-executor.d.ts +54 -0
  698. package/dist/runtime/spots/spot-serial-turn-executor.js +219 -0
  699. package/dist/runtime/spots/spot-subscription-dispatch.d.ts +32 -0
  700. package/dist/runtime/spots/spot-subscription-dispatch.js +194 -0
  701. package/dist/runtime/spots/spot-timer.d.ts +110 -0
  702. package/dist/runtime/spots/spot-timer.js +419 -0
  703. package/dist/runtime/streams/actor-session-binding-registry.d.ts +193 -0
  704. package/dist/runtime/streams/actor-session-binding-registry.js +1127 -0
  705. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +20 -0
  706. package/dist/runtime/streams/actor-session-binding-runtime-owner.js +19 -0
  707. package/dist/runtime/streams/actor-session-lifecycle-coordinator.d.ts +4 -0
  708. package/dist/runtime/streams/actor-session-lifecycle-coordinator.js +24 -0
  709. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +29 -0
  710. package/dist/runtime/streams/bound-actor-relay-sender.js +181 -0
  711. package/dist/runtime/streams/bound-session-response-target.d.ts +25 -0
  712. package/dist/runtime/streams/bound-session-response-target.js +54 -0
  713. package/dist/runtime/streams/bound-session-service.d.ts +48 -0
  714. package/dist/runtime/streams/bound-session-service.js +201 -0
  715. package/dist/runtime/streams/index.d.ts +152 -0
  716. package/dist/runtime/streams/index.js +338 -0
  717. package/dist/runtime/streams/managed-stream.d.ts +53 -0
  718. package/dist/runtime/streams/managed-stream.js +329 -0
  719. package/dist/runtime/streams/native-fallback-bound-session.d.ts +24 -0
  720. package/dist/runtime/streams/native-fallback-bound-session.js +201 -0
  721. package/dist/runtime/streams/protocol.d.ts +67 -0
  722. package/dist/runtime/streams/protocol.js +244 -0
  723. package/dist/runtime/streams/session-actor-coordinator.d.ts +56 -0
  724. package/dist/runtime/streams/session-actor-coordinator.js +371 -0
  725. package/dist/runtime/streams/session-calls.d.ts +59 -0
  726. package/dist/runtime/streams/session-calls.js +123 -0
  727. package/dist/runtime/streams/session-context.d.ts +108 -0
  728. package/dist/runtime/streams/session-context.js +377 -0
  729. package/dist/runtime/streams/session-local-actors.d.ts +10 -0
  730. package/dist/runtime/streams/session-local-actors.js +26 -0
  731. package/dist/runtime/streams/session-provider.d.ts +4 -0
  732. package/dist/runtime/streams/session-provider.js +30 -0
  733. package/dist/runtime/streams/session-requests.d.ts +25 -0
  734. package/dist/runtime/streams/session-requests.js +100 -0
  735. package/dist/runtime/streams/session-serial-executor.d.ts +12 -0
  736. package/dist/runtime/streams/session-serial-executor.js +58 -0
  737. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +62 -0
  738. package/dist/runtime/streams/stream-binding-runtime-ports.js +2 -0
  739. package/dist/runtime/streams/stream-frame-factory.d.ts +44 -0
  740. package/dist/runtime/streams/stream-frame-factory.js +149 -0
  741. package/dist/runtime/streams/stream-message-utils.d.ts +5 -0
  742. package/dist/runtime/streams/stream-message-utils.js +74 -0
  743. package/dist/runtime/streams/stream-session-runtime.d.ts +166 -0
  744. package/dist/runtime/streams/stream-session-runtime.js +1144 -0
  745. package/dist/runtime/workers/index.d.ts +38 -0
  746. package/dist/runtime/workers/index.js +474 -0
  747. package/package.json +19 -0
  748. package/src/contracts/Actors/ZLinkActor.ts +8 -0
  749. package/src/contracts/Actors/ZLinkActorClient.ts +18 -0
  750. package/src/contracts/Actors/ZLinkActorContext.ts +15 -0
  751. package/src/contracts/Actors/ZLinkActorFactory.ts +41 -0
  752. package/src/contracts/Actors/ZLinkActorManager.ts +31 -0
  753. package/src/contracts/Actors/index.ts +5 -0
  754. package/src/contracts/Channels/Calls.ts +33 -0
  755. package/src/contracts/Channels/IZLinkChannelClient.ts +6 -0
  756. package/src/contracts/Channels/IZLinkFanoutClient.ts +13 -0
  757. package/src/contracts/Channels/RouteCalls.ts +13 -0
  758. package/src/contracts/Channels/index.ts +4 -0
  759. package/src/contracts/Codecs/IZLinkCodecRegistryBuilder.ts +22 -0
  760. package/src/contracts/Codecs/ZLinkMessageSerializer.ts +6 -0
  761. package/src/contracts/Codecs/index.ts +2 -0
  762. package/src/contracts/Common/ActorRef.ts +8 -0
  763. package/src/contracts/Common/CoreTypes.ts +6 -0
  764. package/src/contracts/Common/Message.ts +9 -0
  765. package/src/contracts/Common/ZLinkEncodedPayload.ts +47 -0
  766. package/src/contracts/Common/ZLinkMessage.ts +135 -0
  767. package/src/contracts/Common/ZLinkMessageMetadata.ts +77 -0
  768. package/src/contracts/Common/ZLinkProviderResolver.ts +6 -0
  769. package/src/contracts/Common/encoded-payload-storage.ts +16 -0
  770. package/src/contracts/Common/index.ts +5 -0
  771. package/src/contracts/Configuration/Builders.ts +200 -0
  772. package/src/contracts/Configuration/CodecContentType.ts +68 -0
  773. package/src/contracts/Configuration/CodecSerializerSelection.ts +28 -0
  774. package/src/contracts/Configuration/Configs.ts +27 -0
  775. package/src/contracts/Configuration/ConfigurationException.ts +6 -0
  776. package/src/contracts/Configuration/Connections.ts +5 -0
  777. package/src/contracts/Configuration/DiagnosticsValidation.ts +25 -0
  778. package/src/contracts/Configuration/EndpointNotation.ts +232 -0
  779. package/src/contracts/Configuration/InternalDefaults.ts +13 -0
  780. package/src/contracts/Configuration/ObjectRoles.ts +47 -0
  781. package/src/contracts/Configuration/Registration.ts +191 -0
  782. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +76 -0
  783. package/src/contracts/Configuration/RegistrationBuilders.ts +1705 -0
  784. package/src/contracts/Configuration/RegistrationCodecRegistry.ts +118 -0
  785. package/src/contracts/Configuration/RegistrationNormalizers.ts +404 -0
  786. package/src/contracts/Configuration/RegistrationTypes.ts +499 -0
  787. package/src/contracts/Configuration/RegistrationValidators.ts +698 -0
  788. package/src/contracts/Configuration/RouteChannelInternalState.ts +50 -0
  789. package/src/contracts/Configuration/RuntimeEndpointConnections.ts +91 -0
  790. package/src/contracts/Configuration/SendTimeoutValidation.ts +15 -0
  791. package/src/contracts/Configuration/TimerRegistrationValidator.ts +37 -0
  792. package/src/contracts/Configuration/index.ts +35 -0
  793. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +222 -0
  794. package/src/contracts/Dispatch/ZLinkFlowOrigin.ts +1 -0
  795. package/src/contracts/Dispatch/index.ts +2 -0
  796. package/src/contracts/Errors/ZLinkFrameworkException.ts +27 -0
  797. package/src/contracts/Errors/index.ts +4 -0
  798. package/src/contracts/Eventing/Metrics.ts +27 -0
  799. package/src/contracts/Eventing/index.ts +1 -0
  800. package/src/contracts/Handlers/Attributes.ts +111 -0
  801. package/src/contracts/Handlers/Contexts.ts +21 -0
  802. package/src/contracts/Handlers/IZLinkChannelHandlers.ts +69 -0
  803. package/src/contracts/Handlers/IZLinkHandlerFilter.ts +22 -0
  804. package/src/contracts/Handlers/JsonContract.ts +172 -0
  805. package/src/contracts/Handlers/ZLinkHandlerFilterNext.ts +1 -0
  806. package/src/contracts/Handlers/index.ts +17 -0
  807. package/src/contracts/Locations/ActorTransfer.ts +84 -0
  808. package/src/contracts/Locations/Authority.ts +308 -0
  809. package/src/contracts/Locations/Diagnostics.ts +48 -0
  810. package/src/contracts/Locations/Keys.ts +93 -0
  811. package/src/contracts/Locations/Models.ts +7 -0
  812. package/src/contracts/Locations/Options.ts +42 -0
  813. package/src/contracts/Locations/Readiness.ts +11 -0
  814. package/src/contracts/Locations/RelocationStore.ts +51 -0
  815. package/src/contracts/Locations/Resolvers.ts +8 -0
  816. package/src/contracts/Locations/Rows.ts +164 -0
  817. package/src/contracts/Locations/RuntimeQuery.ts +56 -0
  818. package/src/contracts/Locations/Stores.ts +92 -0
  819. package/src/contracts/Locations/Values.ts +32 -0
  820. package/src/contracts/Locations/Watch.ts +16 -0
  821. package/src/contracts/Locations/Writes.ts +56 -0
  822. package/src/contracts/Locations/index.ts +48 -0
  823. package/src/contracts/RouteMesh/Contracts.ts +145 -0
  824. package/src/contracts/RouteMesh/RuntimeTopology.ts +201 -0
  825. package/src/contracts/RouteMesh/index.ts +2 -0
  826. package/src/contracts/Spots/Builders.ts +11 -0
  827. package/src/contracts/Spots/Contracts.ts +150 -0
  828. package/src/contracts/Spots/SpotKind.ts +24 -0
  829. package/src/contracts/Spots/ZLinkSpot.ts +88 -0
  830. package/src/contracts/Spots/index.ts +3 -0
  831. package/src/contracts/Streams/BoundSessionContracts.ts +9 -0
  832. package/src/contracts/Streams/IZLinkSession.ts +52 -0
  833. package/src/contracts/Streams/IZLinkSessionActor.ts +17 -0
  834. package/src/contracts/Streams/IZLinkSessionPacketHandler.ts +11 -0
  835. package/src/contracts/Streams/IZLinkStream.ts +10 -0
  836. package/src/contracts/Streams/ZLinkMessageMetadata.ts +1 -0
  837. package/src/contracts/Streams/ZLinkStreamCompression.ts +9 -0
  838. package/src/contracts/Streams/ZLinkStreamError.ts +9 -0
  839. package/src/contracts/Streams/index.ts +8 -0
  840. package/src/contracts/Timers/IZLinkTimer.ts +5 -0
  841. package/src/contracts/Timers/ZLinkTimerOptions.ts +11 -0
  842. package/src/contracts/Timers/ZLinkTimerTick.ts +12 -0
  843. package/src/contracts/Timers/index.ts +3 -0
  844. package/src/contracts/index.ts +71 -0
  845. package/src/index.ts +1 -0
  846. package/src/internal.ts +29 -0
  847. package/src/location-store-integration.ts +51 -0
  848. package/src/nest-integration.ts +251 -0
  849. package/src/runtime/abort.ts +70 -0
  850. package/src/runtime/actors/actor-authority-payload-codec.ts +454 -0
  851. package/src/runtime/actors/actor-authority-publication.ts +277 -0
  852. package/src/runtime/actors/actor-client.ts +1018 -0
  853. package/src/runtime/actors/actor-context.ts +583 -0
  854. package/src/runtime/actors/actor-creation.ts +254 -0
  855. package/src/runtime/actors/actor-execution-context.ts +38 -0
  856. package/src/runtime/actors/actor-handoff.ts +1911 -0
  857. package/src/runtime/actors/actor-join-deferred-scope.ts +183 -0
  858. package/src/runtime/actors/actor-join-relocation.ts +39 -0
  859. package/src/runtime/actors/actor-lifecycle-snapshot.ts +90 -0
  860. package/src/runtime/actors/actor-local-native-join.ts +725 -0
  861. package/src/runtime/actors/actor-mailbox.ts +92 -0
  862. package/src/runtime/actors/actor-message-follow-context.ts +347 -0
  863. package/src/runtime/actors/actor-native-lookup.ts +38 -0
  864. package/src/runtime/actors/actor-packet-relay-wire.ts +223 -0
  865. package/src/runtime/actors/actor-remote-joiner.ts +238 -0
  866. package/src/runtime/actors/actor-remote-wire.ts +169 -0
  867. package/src/runtime/actors/actor-retry-delay.ts +37 -0
  868. package/src/runtime/actors/actor-routed-join-transport.ts +58 -0
  869. package/src/runtime/actors/actor-routed-json-request.ts +44 -0
  870. package/src/runtime/actors/actor-runtime-contracts.ts +126 -0
  871. package/src/runtime/actors/actor-runtime-state.ts +805 -0
  872. package/src/runtime/actors/actor-source-transfer.ts +62 -0
  873. package/src/runtime/actors/actor-transfer-registry.ts +112 -0
  874. package/src/runtime/actors/actor-transport-delivery-gate.ts +17 -0
  875. package/src/runtime/actors/bound-session-wire.ts +257 -0
  876. package/src/runtime/actors/deferred-join-accepted-journal.ts +1319 -0
  877. package/src/runtime/actors/index.ts +972 -0
  878. package/src/runtime/actors/post-commit-actor-binder.ts +70 -0
  879. package/src/runtime/actors/post-commit-actor-location.ts +114 -0
  880. package/src/runtime/actors/spot-actor-dispatch.ts +362 -0
  881. package/src/runtime/actors/transferred-actor-rollback.ts +123 -0
  882. package/src/runtime/admission.ts +192 -0
  883. package/src/runtime/application-jobs/application-ingress-record-owner.ts +216 -0
  884. package/src/runtime/application-jobs/application-job-queue-handler-start-gate.ts +10 -0
  885. package/src/runtime/application-jobs/application-job-queue-scope.ts +64 -0
  886. package/src/runtime/application-jobs/contracts.ts +26 -0
  887. package/src/runtime/application-jobs/receive-flow-controller.ts +188 -0
  888. package/src/runtime/backend/contracts/index.ts +765 -0
  889. package/src/runtime/backend/index.ts +9 -0
  890. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +73 -0
  891. package/src/runtime/backend/mesh-completion-table.ts +165 -0
  892. package/src/runtime/backend/mesh-dispatch-pump.ts +363 -0
  893. package/src/runtime/backend/mesh-record-dispatcher.ts +65 -0
  894. package/src/runtime/backend/node/index.ts +4 -0
  895. package/src/runtime/backend/node/node-backend-adapter-factory.ts +204 -0
  896. package/src/runtime/backend/node/node-backend-adapter-support.ts +257 -0
  897. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +133 -0
  898. package/src/runtime/backend/node/node-mesh-backend-adapter.ts +44 -0
  899. package/src/runtime/backend/node/node-monitor-backend-adapter.ts +39 -0
  900. package/src/runtime/backend/node/node-raw-binding-port.contract.ts +21 -0
  901. package/src/runtime/backend/node/node-raw-binding-port.ts +518 -0
  902. package/src/runtime/backend/node/node-raw-mesh-backend.ts +2669 -0
  903. package/src/runtime/backend/node/node-socket-backend-adapter.ts +372 -0
  904. package/src/runtime/backend/node-backend-adapter.ts +19 -0
  905. package/src/runtime/backend/raw-binding-port.ts +69 -0
  906. package/src/runtime/backend/runtime-message.ts +51 -0
  907. package/src/runtime/backend/runtime-values.ts +107 -0
  908. package/src/runtime/channels/channel-autoconnect.ts +46 -0
  909. package/src/runtime/channels/channel-clients.ts +527 -0
  910. package/src/runtime/channels/channel-dispatch-pipeline.ts +408 -0
  911. package/src/runtime/channels/channel-dispatch-services.ts +234 -0
  912. package/src/runtime/channels/channel-dispatchers.ts +790 -0
  913. package/src/runtime/channels/channel-envelope-inspection.ts +125 -0
  914. package/src/runtime/channels/channel-envelope.ts +743 -0
  915. package/src/runtime/channels/channel-framework-packets.ts +8 -0
  916. package/src/runtime/channels/channel-multipart.ts +61 -0
  917. package/src/runtime/channels/channel-outbound-operations.ts +584 -0
  918. package/src/runtime/channels/channel-receive-loops.ts +901 -0
  919. package/src/runtime/channels/channel-receive-task-tracker.ts +39 -0
  920. package/src/runtime/channels/channel-runtime-lifecycle.ts +969 -0
  921. package/src/runtime/channels/channel-runtime-manager.ts +444 -0
  922. package/src/runtime/channels/channel-socket-options.ts +153 -0
  923. package/src/runtime/channels/channel-socket-registry.ts +1837 -0
  924. package/src/runtime/channels/channel-transports.ts +1154 -0
  925. package/src/runtime/channels/client-server-location-runtime.ts +576 -0
  926. package/src/runtime/channels/client-server-service-wire.ts +390 -0
  927. package/src/runtime/channels/dispatch-error-reporter.ts +165 -0
  928. package/src/runtime/channels/fanout-location-runtime.ts +459 -0
  929. package/src/runtime/channels/fanout-service-wire.ts +43 -0
  930. package/src/runtime/channels/handler-filter-scope.ts +29 -0
  931. package/src/runtime/channels/index.ts +45 -0
  932. package/src/runtime/channels/local-spot-route-transport.ts +59 -0
  933. package/src/runtime/channels/route-disconnected-error.ts +6 -0
  934. package/src/runtime/channels/route-member-snapshot.ts +55 -0
  935. package/src/runtime/channels/router-socket-spot-route-transport.ts +77 -0
  936. package/src/runtime/channels/source-spot-router.ts +89 -0
  937. package/src/runtime/channels/spot-direct-envelope.ts +44 -0
  938. package/src/runtime/channels/spot-node-route-transport.ts +92 -0
  939. package/src/runtime/channels/spot-route-bridge-transport.ts +75 -0
  940. package/src/runtime/channels/spot-route-dispatch-strategy.ts +329 -0
  941. package/src/runtime/channels/spot-route-target-resolver.ts +101 -0
  942. package/src/runtime/codecs/index.ts +69 -0
  943. package/src/runtime/configuration/index.ts +1 -0
  944. package/src/runtime/diagnostics/dispatch-error-port.ts +8 -0
  945. package/src/runtime/diagnostics/flow-context.ts +84 -0
  946. package/src/runtime/diagnostics/index.ts +441 -0
  947. package/src/runtime/diagnostics/internal-event-contracts.ts +135 -0
  948. package/src/runtime/diagnostics/message-flow.ts +560 -0
  949. package/src/runtime/diagnostics/runtime-metrics.ts +601 -0
  950. package/src/runtime/diagnostics/runtime-observation-queue.ts +362 -0
  951. package/src/runtime/diagnostics/topology-runtime-projections.ts +298 -0
  952. package/src/runtime/execution/index.ts +466 -0
  953. package/src/runtime/execution/serial-execution-queue.ts +534 -0
  954. package/src/runtime/execution/serial-work-size.ts +31 -0
  955. package/src/runtime/execution/state-lane.ts +116 -0
  956. package/src/runtime/foundation/actor-join-recovery-codec.ts +465 -0
  957. package/src/runtime/foundation/event-loop-resources.ts +162 -0
  958. package/src/runtime/foundation/index.ts +18 -0
  959. package/src/runtime/foundation/message-follow-suppression-registry.ts +130 -0
  960. package/src/runtime/foundation/operation-identity.ts +49 -0
  961. package/src/runtime/foundation/operation-registry.ts +162 -0
  962. package/src/runtime/foundation/raw-service-mesh-runtime.ts +1771 -0
  963. package/src/runtime/foundation/route-mesh-connection-policy.ts +28 -0
  964. package/src/runtime/foundation/runtime-state-projections.ts +68 -0
  965. package/src/runtime/foundation/service-authority-payload-codec.ts +566 -0
  966. package/src/runtime/foundation/service-discovery-registry.ts +263 -0
  967. package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +329 -0
  968. package/src/runtime/foundation/service-liveness-registry.ts +144 -0
  969. package/src/runtime/foundation/service-mailbox.ts +369 -0
  970. package/src/runtime/foundation/service-maintenance-runtime.ts +242 -0
  971. package/src/runtime/foundation/service-metadata-codec.ts +75 -0
  972. package/src/runtime/foundation/service-relocation-aggregate-committer.ts +218 -0
  973. package/src/runtime/foundation/service-relocation-coordinator.ts +37 -0
  974. package/src/runtime/foundation/service-relocation-object-owner.ts +428 -0
  975. package/src/runtime/foundation/service-relocation-runtime.ts +1407 -0
  976. package/src/runtime/foundation/service-runtime-contracts.ts +423 -0
  977. package/src/runtime/foundation/service-session-binding-ingress-port.ts +45 -0
  978. package/src/runtime/foundation/service-stateful-registry.ts +664 -0
  979. package/src/runtime/foundation/service-stateful-runtime.ts +5753 -0
  980. package/src/runtime/foundation/service-stateful-wire-codec.ts +3008 -0
  981. package/src/runtime/foundation/service-topology-registry.ts +599 -0
  982. package/src/runtime/foundation/service-weighted-selection.ts +166 -0
  983. package/src/runtime/foundation/service-wire-binary-primitives.ts +80 -0
  984. package/src/runtime/foundation/service-wire-codec.ts +91 -0
  985. package/src/runtime/foundation/service-wire-constants.generated.ts +131 -0
  986. package/src/runtime/foundation/service-wire-m6a-codec.ts +647 -0
  987. package/src/runtime/framework-errors-internal.ts +338 -0
  988. package/src/runtime/handlers/handler-instance-scope.ts +372 -0
  989. package/src/runtime/handlers/index.ts +93 -0
  990. package/src/runtime/host/actor-packet-relay.ts +1070 -0
  991. package/src/runtime/host/actor-placement-coordinator.ts +573 -0
  992. package/src/runtime/host/actor-runtime-options-factory.ts +282 -0
  993. package/src/runtime/host/actor-transfer-authority-runtime.ts +225 -0
  994. package/src/runtime/host/actor-transfer-runtime.ts +1958 -0
  995. package/src/runtime/host/application-job-queue.ts +518 -0
  996. package/src/runtime/host/bound-session-relay.ts +94 -0
  997. package/src/runtime/host/bounded-replay-map.ts +42 -0
  998. package/src/runtime/host/channel-runtime-options-factory.ts +104 -0
  999. package/src/runtime/host/entry-actor-runtime.ts +115 -0
  1000. package/src/runtime/host/host-capacity-status.ts +103 -0
  1001. package/src/runtime/host/index.ts +3492 -0
  1002. package/src/runtime/host/instance-activation-authority.ts +658 -0
  1003. package/src/runtime/host/location-runtime-owner.ts +313 -0
  1004. package/src/runtime/host/mesh-router-resolver.ts +114 -0
  1005. package/src/runtime/host/relocation-direct-transfer.ts +273 -0
  1006. package/src/runtime/host/relocation-integrity-fault-gate.ts +8 -0
  1007. package/src/runtime/host/relocation-state-adapter.ts +24 -0
  1008. package/src/runtime/host/remote-actor-join-receiver.ts +264 -0
  1009. package/src/runtime/host/remote-actor-packet-target-store.ts +244 -0
  1010. package/src/runtime/host/remote-bound-session-relay.ts +900 -0
  1011. package/src/runtime/host/route-mesh-runtime-options.ts +46 -0
  1012. package/src/runtime/host/route-mesh-runtime.ts +891 -0
  1013. package/src/runtime/host/runtime-shutdown.ts +101 -0
  1014. package/src/runtime/host/service-relocation-control.ts +28 -0
  1015. package/src/runtime/host/service-relocation-host-runtime.ts +5817 -0
  1016. package/src/runtime/host/spot-address-transport.ts +997 -0
  1017. package/src/runtime/host/spot-node-runtime-options-factory.ts +82 -0
  1018. package/src/runtime/host/spot-runtime-options-factory.ts +286 -0
  1019. package/src/runtime/host/stateful-authority-route-runtime.ts +662 -0
  1020. package/src/runtime/host/user-spot-creation-coordinator.ts +1176 -0
  1021. package/src/runtime/locations/actor-location-claims.ts +426 -0
  1022. package/src/runtime/locations/actor-session-route-claims.ts +64 -0
  1023. package/src/runtime/locations/aggregate-inventory-store.ts +581 -0
  1024. package/src/runtime/locations/authority-key-codec.ts +80 -0
  1025. package/src/runtime/locations/auto-connect-loop.ts +131 -0
  1026. package/src/runtime/locations/auto-connect-planner.ts +178 -0
  1027. package/src/runtime/locations/auto-connect-reconciler.ts +425 -0
  1028. package/src/runtime/locations/auto-connect-types.ts +62 -0
  1029. package/src/runtime/locations/auto-connect.ts +4 -0
  1030. package/src/runtime/locations/canonical-codec.ts +54 -0
  1031. package/src/runtime/locations/domain-store-contract.ts +149 -0
  1032. package/src/runtime/locations/in-memory-authority-store.ts +1172 -0
  1033. package/src/runtime/locations/in-memory-location-store.ts +1467 -0
  1034. package/src/runtime/locations/in-memory-provider-location-store.ts +213 -0
  1035. package/src/runtime/locations/index.ts +11 -0
  1036. package/src/runtime/locations/internal-location-contracts.ts +22 -0
  1037. package/src/runtime/locations/internal-store-contracts.ts +90 -0
  1038. package/src/runtime/locations/key-codec.ts +61 -0
  1039. package/src/runtime/locations/lease-tracker.ts +221 -0
  1040. package/src/runtime/locations/lifecycle-runtime.ts +44 -0
  1041. package/src/runtime/locations/lifecycle.ts +272 -0
  1042. package/src/runtime/locations/location-store-repository.ts +4211 -0
  1043. package/src/runtime/locations/relocation-blob.ts +36 -0
  1044. package/src/runtime/locations/resolvers.ts +1054 -0
  1045. package/src/runtime/locations/runtime.ts +1126 -0
  1046. package/src/runtime/locations/spot-location-claims.ts +435 -0
  1047. package/src/runtime/messaging/creation-payload-codec.ts +59 -0
  1048. package/src/runtime/messaging/framework-json-v1.ts +307 -0
  1049. package/src/runtime/messaging/index.ts +1 -0
  1050. package/src/runtime/messaging/packet-name.ts +94 -0
  1051. package/src/runtime/messaging/payload-codec.ts +418 -0
  1052. package/src/runtime/messaging/submission-result.ts +61 -0
  1053. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +189 -0
  1054. package/src/runtime/routing-id.ts +125 -0
  1055. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +418 -0
  1056. package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +147 -0
  1057. package/src/runtime/spots/index.ts +3303 -0
  1058. package/src/runtime/spots/spot-activation-registry.ts +335 -0
  1059. package/src/runtime/spots/spot-activation-state.ts +414 -0
  1060. package/src/runtime/spots/spot-activation.ts +1027 -0
  1061. package/src/runtime/spots/spot-actor-admission-coordinator.ts +354 -0
  1062. package/src/runtime/spots/spot-actor-join-dispatch.ts +303 -0
  1063. package/src/runtime/spots/spot-actor-lifecycle-drain.ts +79 -0
  1064. package/src/runtime/spots/spot-actor-membership.ts +266 -0
  1065. package/src/runtime/spots/spot-actor-packet-dispatch.ts +593 -0
  1066. package/src/runtime/spots/spot-actor-packet-drain.ts +328 -0
  1067. package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +162 -0
  1068. package/src/runtime/spots/spot-closing.ts +34 -0
  1069. package/src/runtime/spots/spot-context.ts +259 -0
  1070. package/src/runtime/spots/spot-entry-activation.ts +551 -0
  1071. package/src/runtime/spots/spot-handle.ts +101 -0
  1072. package/src/runtime/spots/spot-handler-registry.ts +273 -0
  1073. package/src/runtime/spots/spot-lifecycle-metrics.ts +15 -0
  1074. package/src/runtime/spots/spot-location-claim.ts +86 -0
  1075. package/src/runtime/spots/spot-manager-internal-contracts.ts +11 -0
  1076. package/src/runtime/spots/spot-manager-public.ts +361 -0
  1077. package/src/runtime/spots/spot-native-actor-join-admission.ts +151 -0
  1078. package/src/runtime/spots/spot-native-flags.ts +4 -0
  1079. package/src/runtime/spots/spot-node-autoconnect.ts +325 -0
  1080. package/src/runtime/spots/spot-node-runtime-manager.ts +1573 -0
  1081. package/src/runtime/spots/spot-outbound.ts +761 -0
  1082. package/src/runtime/spots/spot-provider.ts +36 -0
  1083. package/src/runtime/spots/spot-publisher-transport.ts +69 -0
  1084. package/src/runtime/spots/spot-remote-codec.ts +308 -0
  1085. package/src/runtime/spots/spot-remote-route-codec.ts +284 -0
  1086. package/src/runtime/spots/spot-route-packet-dispatch.ts +359 -0
  1087. package/src/runtime/spots/spot-route-replies.ts +126 -0
  1088. package/src/runtime/spots/spot-route-reply-wire.ts +15 -0
  1089. package/src/runtime/spots/spot-routed-actor-admission.ts +351 -0
  1090. package/src/runtime/spots/spot-routed-bound-session-dispatch.ts +132 -0
  1091. package/src/runtime/spots/spot-routed-frame-dispatch.ts +250 -0
  1092. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +254 -0
  1093. package/src/runtime/spots/spot-routing-internal.ts +33 -0
  1094. package/src/runtime/spots/spot-runtime-ports.ts +196 -0
  1095. package/src/runtime/spots/spot-serial-executor.ts +170 -0
  1096. package/src/runtime/spots/spot-serial-turn-executor.ts +319 -0
  1097. package/src/runtime/spots/spot-subscription-dispatch.ts +252 -0
  1098. package/src/runtime/spots/spot-timer.ts +609 -0
  1099. package/src/runtime/streams/actor-session-binding-registry.ts +1691 -0
  1100. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +78 -0
  1101. package/src/runtime/streams/actor-session-lifecycle-coordinator.ts +20 -0
  1102. package/src/runtime/streams/bound-actor-relay-sender.ts +275 -0
  1103. package/src/runtime/streams/bound-session-response-target.ts +91 -0
  1104. package/src/runtime/streams/bound-session-service.ts +500 -0
  1105. package/src/runtime/streams/index.ts +706 -0
  1106. package/src/runtime/streams/managed-stream.ts +509 -0
  1107. package/src/runtime/streams/native-fallback-bound-session.ts +321 -0
  1108. package/src/runtime/streams/protocol.ts +291 -0
  1109. package/src/runtime/streams/session-actor-coordinator.ts +605 -0
  1110. package/src/runtime/streams/session-calls.ts +221 -0
  1111. package/src/runtime/streams/session-context.ts +609 -0
  1112. package/src/runtime/streams/session-local-actors.ts +30 -0
  1113. package/src/runtime/streams/session-provider.ts +50 -0
  1114. package/src/runtime/streams/session-requests.ts +109 -0
  1115. package/src/runtime/streams/session-serial-executor.ts +97 -0
  1116. package/src/runtime/streams/stream-binding-runtime-ports.ts +106 -0
  1117. package/src/runtime/streams/stream-frame-factory.ts +255 -0
  1118. package/src/runtime/streams/stream-message-utils.ts +89 -0
  1119. package/src/runtime/streams/stream-session-runtime.ts +1420 -0
  1120. package/src/runtime/workers/index.ts +580 -0
  1121. package/tsconfig.json +17 -0
@@ -0,0 +1,1837 @@
1
+ import {
2
+ ZLinkFrameworkRuntimeState,
3
+ type RoutingId,
4
+ type ZLinkClientServerServerDescriptor,
5
+ type ZLinkFanoutPublisherDescriptor
6
+ } from '../../contracts';
7
+ import { ZLinkSocketNativeEventType } from '../diagnostics/internal-event-contracts';
8
+ import {
9
+ buildAdvertisedEndpoint,
10
+ ZLinkConfigurationException,
11
+ type ZLinkFrameworkRegistration
12
+ } from '../configuration';
13
+ import type {
14
+ ZLinkBackendContext,
15
+ ZLinkBackendDealerSocket,
16
+ ZLinkBackendPublisherSocket,
17
+ ZLinkBackendRouterSocket,
18
+ ZLinkBackendReadablePoller,
19
+ ZLinkBackendSocketMonitor,
20
+ ZLinkBackendSocketMonitorEvent,
21
+ ZLinkBackendSubscriberSocket,
22
+ ZLinkChannelBackendAdapter,
23
+ ZLinkMonitoringBackendAdapter
24
+ } from '../backend/contracts';
25
+ import { throwIfAborted } from '../abort';
26
+ import { attachEndpointConnections } from '../../contracts/Configuration/RuntimeEndpointConnections';
27
+ import { ZLinkRouteMemberSnapshot } from './route-member-snapshot';
28
+ import {
29
+ ZLinkFrameworkInternalErrorKind,
30
+ createInternalFrameworkException
31
+ } from '../framework-errors-internal';
32
+ import { randomBytes, randomUUID } from 'node:crypto';
33
+ import { ZLinkBufferMessage as RuntimeMessage } from '../backend/runtime-message';
34
+ import type { Message } from '../../contracts/Common/Message';
35
+ import { ServiceDiscoveryRegistry } from '../foundation/service-discovery-registry';
36
+ import { discoveryAvailabilityForRuntimeState } from '../foundation/runtime-state-projections';
37
+ import { ServiceWireProtocolError } from '../foundation/service-wire-m6a-codec';
38
+ import {
39
+ decodeClientServerControl,
40
+ encodeClientServerAdmit,
41
+ encodeClientServerHello,
42
+ encodeClientServerLivenessAck,
43
+ encodeClientServerLivenessProbe,
44
+ encodeClientServerReject,
45
+ encodeClientServerUpdate,
46
+ isClientServerControlFrame,
47
+ type ZLinkClientServerAdmission
48
+ } from './client-server-service-wire';
49
+ import {
50
+ FANOUT_LIVENESS_PAYLOAD,
51
+ FANOUT_LIVENESS_TOPIC,
52
+ inspectFanoutInbound
53
+ } from './fanout-service-wire';
54
+ import type { ZLinkChannelEnvelopeHeader } from './channel-envelope';
55
+ import type { ApplicationJobQueue } from '../host/application-job-queue';
56
+
57
+ const MAX_LIFECYCLE_GENERATION = 0x7fff_ffff_ffff_ffffn;
58
+ const CLIENT_SERVER_PROBE_INTERVAL_MS = 5_000;
59
+ const CLIENT_SERVER_PEER_DEADLINE_MS = 15_000;
60
+ const CLIENT_SERVER_READY_WAIT_CAP_MS = 5_000;
61
+ const CLIENT_SERVER_READY_POLL_INTERVAL_MS = 5;
62
+ const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
63
+
64
+ export interface ZLinkClientServerServerSocketIdentity {
65
+ readonly serverRid: string;
66
+ readonly lifecycleGeneration: bigint;
67
+ readonly endpoint: string;
68
+ }
69
+
70
+ export interface ZLinkClientServerConnectionCallbacks {
71
+ readonly onTransportReady: (routingId: string, endpoint: string) => void;
72
+ readonly onTerminated: (routingId: string | undefined, endpoint: string) => void;
73
+ }
74
+
75
+ type ClientServerDiscoveryDescriptor =
76
+ Parameters<ServiceDiscoveryRegistry['admitClientServer']>[0];
77
+
78
+ interface ClientServerPhysicalConnection {
79
+ readonly channelName: string;
80
+ readonly endpoint: string;
81
+ readonly dealer: ZLinkBackendDealerSocket;
82
+ readonly readablePoller: ZLinkBackendReadablePoller;
83
+ readonly monitor: ZLinkBackendSocketMonitor;
84
+ readonly aliases: Set<string>;
85
+ readonly callbacksByAlias: Map<string, ZLinkClientServerConnectionCallbacks>;
86
+ physicalConnectionId: symbol;
87
+ terminationRequested: boolean;
88
+ readyConnectionId?: string;
89
+ admittedDescriptor?: ClientServerDiscoveryDescriptor;
90
+ nextProbeAt?: number;
91
+ deadlineAt?: number;
92
+ outstandingProbeId?: bigint;
93
+ admissionAttempt?: symbol;
94
+ }
95
+
96
+ export interface ZLinkFanoutConnectionCallbacks {
97
+ readonly onReady: () => void;
98
+ readonly onTerminated: (reason: 'disconnect' | 'deadline' | 'protocol') => void;
99
+ }
100
+
101
+ interface FanoutPublisherConnection {
102
+ readonly channelName: string;
103
+ readonly endpoint: string;
104
+ readonly subscriber: ZLinkBackendSubscriberSocket;
105
+ readonly monitor: ZLinkBackendSocketMonitor;
106
+ readonly callbacks: ZLinkFanoutConnectionCallbacks;
107
+ readonly physicalConnectionId: symbol;
108
+ transportReady: boolean;
109
+ ready: boolean;
110
+ deadlineAt?: number;
111
+ }
112
+
113
+ type ReceiveFlowSocket = ZLinkBackendDealerSocket | ZLinkBackendRouterSocket;
114
+
115
+ export class ZLinkChannelSocketRegistry {
116
+ private readonly clientDealers = new Map<string, ZLinkBackendDealerSocket>();
117
+ private readonly channelRouters = new Map<string, ZLinkBackendRouterSocket>();
118
+ private readonly publishers = new Map<string, ZLinkBackendPublisherSocket>();
119
+ private readonly routeRouters = new Map<string, ZLinkBackendRouterSocket>();
120
+ private readonly routeMembers = new ZLinkRouteMemberSnapshot();
121
+ private readonly clientServerIdentities = new Map<string, {
122
+ readonly serverRid: string;
123
+ readonly lifecycleGeneration: bigint;
124
+ }>();
125
+ private readonly clientServerConnections =
126
+ new Map<string, ClientServerPhysicalConnection>();
127
+ private readonly clientServerDiscovery = new ServiceDiscoveryRegistry();
128
+ private readonly clientServerReadyIdentities = new Map<string, {
129
+ readonly channelName: string;
130
+ readonly serverRoutingId: string;
131
+ readonly lifecycleGeneration: bigint;
132
+ }>();
133
+ private readonly clientServerServerDescriptors =
134
+ new Map<string, ZLinkClientServerServerDescriptor>();
135
+ private readonly clientServerPublicWeights = new Map<string, number>();
136
+ private readonly routeMeshPublicWeights = new Map<string, number>();
137
+ private readonly clientServerAdmittedClients = new Map<string, Set<RoutingId>>();
138
+ private readonly clientServerServerPeers = new Map<string, {
139
+ readonly channelName: string;
140
+ readonly routingId: RoutingId;
141
+ readonly physicalConnectionId: symbol;
142
+ readonly normalizedEffectiveMaxMessageBytes: number;
143
+ nextProbeAt: number;
144
+ deadlineAt: number;
145
+ outstandingProbeId?: bigint;
146
+ }>();
147
+ private readonly ownedMonitors = new Set<ZLinkBackendSocketMonitor>();
148
+ private readonly fanoutConnections =
149
+ new Map<string, FanoutPublisherConnection>();
150
+ private readonly fanoutPublisherNextBeacon = new Map<string, number>();
151
+ private clientServerLivenessTimer?: NodeJS.Timeout;
152
+ private nextClientServerProbeId = 1n;
153
+ private readonly clientServerMonitorHandlers =
154
+ new Map<string, Set<(event: ZLinkBackendSocketMonitorEvent) => void>>();
155
+ private readonly fanoutMonitorHandlers =
156
+ new Map<string, Set<(event: ZLinkBackendSocketMonitorEvent) => void>>();
157
+ private readonly fanoutTopologyHandlers =
158
+ new Map<string, Set<() => void>>();
159
+
160
+ constructor(
161
+ private readonly registration: ZLinkFrameworkRegistration,
162
+ private readonly adapter: ZLinkChannelBackendAdapter,
163
+ private readonly context: ZLinkBackendContext,
164
+ private readonly monitoringAdapter?: ZLinkMonitoringBackendAdapter,
165
+ private readonly oneWayFailureSink?: (error: unknown) => void,
166
+ private readonly applicationJobQueue?: ApplicationJobQueue
167
+ ) {}
168
+
169
+ async dispose(): Promise<void> {
170
+ const clientServerConnections = [...new Set(this.clientServerConnections.values())];
171
+ const clientServerPollers = clientServerConnections.map(
172
+ (connection) => connection.readablePoller
173
+ );
174
+ const sockets = [
175
+ ...this.clientDealers.values(),
176
+ ...clientServerConnections.map(value => value.dealer),
177
+ ...[...this.fanoutConnections.values()].map(value => value.subscriber),
178
+ ...this.channelRouters.values(),
179
+ ...this.publishers.values(),
180
+ ...this.routeRouters.values()
181
+ ];
182
+ for (const socket of new Set<ReceiveFlowSocket>([
183
+ ...this.clientDealers.values(),
184
+ ...clientServerConnections.map(value => value.dealer),
185
+ ...this.channelRouters.values(),
186
+ ...this.routeRouters.values()
187
+ ])) this.unregisterReceiveFlowSocket(socket);
188
+ this.clientDealers.clear();
189
+ this.clientServerConnections.clear();
190
+ this.clientServerReadyIdentities.clear();
191
+ this.clientServerServerDescriptors.clear();
192
+ this.clientServerPublicWeights.clear();
193
+ this.routeMeshPublicWeights.clear();
194
+ this.clientServerAdmittedClients.clear();
195
+ this.clientServerServerPeers.clear();
196
+ this.clientServerMonitorHandlers.clear();
197
+ this.fanoutMonitorHandlers.clear();
198
+ this.fanoutTopologyHandlers.clear();
199
+ this.fanoutConnections.clear();
200
+ this.fanoutPublisherNextBeacon.clear();
201
+ if (this.clientServerLivenessTimer !== undefined) {
202
+ clearInterval(this.clientServerLivenessTimer);
203
+ this.clientServerLivenessTimer = undefined;
204
+ }
205
+ this.channelRouters.clear();
206
+ this.publishers.clear();
207
+ this.routeRouters.clear();
208
+ this.routeMembers.clear();
209
+ const monitors = [...this.ownedMonitors];
210
+ this.ownedMonitors.clear();
211
+ const cleanup = await Promise.allSettled([
212
+ ...clientServerPollers.map((poller) => poller.dispose()),
213
+ ...monitors.map((monitor) => monitor.dispose()),
214
+ ...sockets.map((socket) => socket.dispose())
215
+ ]);
216
+ const errors = cleanup
217
+ .filter((result): result is PromiseRejectedResult => result.status === 'rejected')
218
+ .map((result) => result.reason);
219
+ if (errors.length === 1) throw errors[0];
220
+ if (errors.length > 1) throw new AggregateError(errors, 'Channel socket cleanup failed.');
221
+ }
222
+
223
+
224
+ clientDealer(channelName: string): ZLinkBackendDealerSocket {
225
+ const existing = this.clientDealers.get(channelName);
226
+ if (existing !== undefined) {
227
+ return existing;
228
+ }
229
+
230
+ const channel = this.registration.channels.get(channelName);
231
+ const client = channel?.client;
232
+ if (client === undefined) {
233
+ throw new ZLinkConfigurationException(`Channel client '${channelName}' is not registered.`);
234
+ }
235
+
236
+ const dealer = this.adapter.createDealerSocket(this.context);
237
+ this.registerReceiveFlowSocket(dealer);
238
+ dealer.setChannelName(channelName);
239
+ if (channel?.routingId !== undefined && channel.routingId.length > 0) {
240
+ dealer.setRoutingId(deriveRoutingId(channel.routingId, 'dealer'));
241
+ }
242
+ applySocketConfig(dealer, client);
243
+ this.clientDealers.set(channelName, dealer);
244
+ return dealer;
245
+ }
246
+
247
+ channelRouter(channelName: string): ZLinkBackendRouterSocket {
248
+ const existing = this.channelRouters.get(channelName);
249
+ if (existing !== undefined) {
250
+ return existing;
251
+ }
252
+
253
+ const channel = this.registration.channels.get(channelName);
254
+ if (channel?.server === undefined) {
255
+ throw new ZLinkConfigurationException(`Channel server '${channelName}' is not registered.`);
256
+ }
257
+ if (channel.server.bind === undefined) {
258
+ throw new ZLinkConfigurationException(`Channel server '${channelName}' does not define a bind endpoint.`);
259
+ }
260
+
261
+ const router = this.adapter.createRouterSocket(this.context);
262
+ this.registerReceiveFlowSocket(router);
263
+ router.setChannelName(channelName);
264
+ const identity = this.clientServerIdentities.get(channelName) ?? {
265
+ serverRid: channel.server.routingId
266
+ ?? `${channel.routingIdPrefix ?? 'cs'}-${randomUUID()}`,
267
+ lifecycleGeneration: newLifecycleGeneration()
268
+ };
269
+ this.clientServerIdentities.set(channelName, identity);
270
+ router.setRoutingId(identity.serverRid);
271
+ const publicWeight = channel.server.weight ?? 100;
272
+ this.clientServerPublicWeights.set(channelName, publicWeight);
273
+ router.peerWeight = rawAvailabilityWeight(publicWeight);
274
+ applySocketConfig(router, channel.server);
275
+ router.bind(channel.server.bind);
276
+ if (this.monitoringAdapter !== undefined) {
277
+ const monitor = this.monitoringAdapter.openSocketMonitor(router);
278
+ this.ownedMonitors.add(monitor);
279
+ monitor.onEvent((event) => {
280
+ if (event.routingId === undefined) return;
281
+ if (event.nativeEvent !== ZLinkSocketNativeEventType.Disconnected
282
+ && event.nativeEvent !== ZLinkSocketNativeEventType.Closed
283
+ && event.nativeEvent !== ZLinkSocketNativeEventType.HandshakeFailedNoDetail
284
+ && event.nativeEvent !== ZLinkSocketNativeEventType.HandshakeFailedProtocol
285
+ && event.nativeEvent !== ZLinkSocketNativeEventType.HandshakeFailedAuth) return;
286
+ const routingId = String(event.routingId);
287
+ this.clientServerServerPeers.delete(clientServerServerPeerKey(channelName, routingId));
288
+ this.clientServerAdmittedClients.get(channelName)?.delete(routingId);
289
+ });
290
+ }
291
+ this.channelRouters.set(channelName, router);
292
+ if (!this.clientServerServerDescriptors.has(channelName)) {
293
+ const boundEndpoint = router.lastEndpoint ?? channel.server.bind;
294
+ this.clientServerServerDescriptors.set(channelName, {
295
+ channelName,
296
+ serverRid: identity.serverRid,
297
+ lifecycleGeneration: identity.lifecycleGeneration,
298
+ descriptorRevision: 1n,
299
+ endpoint: advertisedEndpoint(boundEndpoint, channel.server.advertiseHost),
300
+ weight: publicWeight,
301
+ state: ZLinkFrameworkRuntimeState.Serving,
302
+ securityIdentity: 'default',
303
+ ownerId: 'manual',
304
+ leaseGeneration: 1n,
305
+ updatedAt: new Date()
306
+ });
307
+ }
308
+ return router;
309
+ }
310
+
311
+ clientServerServerIdentity(channelName: string): ZLinkClientServerServerSocketIdentity {
312
+ const router = this.channelRouter(channelName);
313
+ const identity = this.clientServerIdentities.get(channelName);
314
+ const channel = this.registration.channels.get(channelName);
315
+ if (identity === undefined || channel?.server === undefined) {
316
+ throw new ZLinkConfigurationException(`Channel server '${channelName}' is not registered.`);
317
+ }
318
+ const boundEndpoint = router.lastEndpoint ?? channel.server.bind;
319
+ if (boundEndpoint === undefined || boundEndpoint.length === 0) {
320
+ throw new ZLinkConfigurationException(
321
+ `Channel server '${channelName}' did not report its bound endpoint.`
322
+ );
323
+ }
324
+ return {
325
+ ...identity,
326
+ endpoint: advertisedEndpoint(boundEndpoint, channel.server.advertiseHost)
327
+ };
328
+ }
329
+
330
+ clientServerServerSocket(channelName: string): ZLinkBackendRouterSocket {
331
+ return this.channelRouter(channelName);
332
+ }
333
+
334
+ clientServerServerWeight(channelName: string): number {
335
+ this.channelRouter(channelName);
336
+ return this.clientServerPublicWeights.get(channelName) ?? 100;
337
+ }
338
+
339
+ setClientServerServerWeight(channelName: string, weight: number): void {
340
+ requirePublicWeight(weight);
341
+ const router = this.channelRouter(channelName);
342
+ this.clientServerPublicWeights.set(channelName, weight);
343
+ router.peerWeight = rawAvailabilityWeight(weight);
344
+ }
345
+
346
+ openClientServerConnection(
347
+ channelName: string,
348
+ connectionId: string,
349
+ endpoint: string,
350
+ callbacks: ZLinkClientServerConnectionCallbacks
351
+ ): ZLinkBackendDealerSocket {
352
+ if (this.clientServerConnections.has(connectionId)) {
353
+ throw new ZLinkConfigurationException(
354
+ `ClientServer connection '${connectionId}' is already open.`
355
+ );
356
+ }
357
+ if (this.monitoringAdapter === undefined) {
358
+ throw new ZLinkConfigurationException(
359
+ 'Automatic ClientServer admission requires socket monitoring.'
360
+ );
361
+ }
362
+ const channel = this.registration.channels.get(channelName);
363
+ const client = channel?.client;
364
+ if (client === undefined) {
365
+ throw new ZLinkConfigurationException(`Channel client '${channelName}' is not registered.`);
366
+ }
367
+ const dealer = this.adapter.createDealerSocket(this.context);
368
+ this.registerReceiveFlowSocket(dealer);
369
+ dealer.setChannelName(channelName);
370
+ dealer.setRoutingId(`cs-client-${randomUUID()}`);
371
+ applySocketConfig(dealer, client);
372
+ const cleanupDealer = (): void => {
373
+ this.unregisterReceiveFlowSocket(dealer);
374
+ void Promise.allSettled([dealer.dispose()]);
375
+ };
376
+ let readablePoller: ZLinkBackendReadablePoller;
377
+ try {
378
+ readablePoller = this.adapter.createReadablePoller(dealer);
379
+ } catch (error) {
380
+ cleanupDealer();
381
+ throw error;
382
+ }
383
+ let monitor: ZLinkBackendSocketMonitor;
384
+ try {
385
+ monitor = this.monitoringAdapter.openSocketMonitor(dealer);
386
+ } catch (error) {
387
+ try {
388
+ readablePoller.dispose();
389
+ } finally {
390
+ cleanupDealer();
391
+ }
392
+ throw error;
393
+ }
394
+ this.ownedMonitors.add(monitor);
395
+ const connection: ClientServerPhysicalConnection = {
396
+ channelName,
397
+ endpoint,
398
+ dealer,
399
+ readablePoller,
400
+ monitor,
401
+ aliases: new Set([connectionId]),
402
+ callbacksByAlias: new Map([[connectionId, callbacks]]),
403
+ physicalConnectionId: Symbol(connectionId),
404
+ terminationRequested: false
405
+ };
406
+ this.clientServerConnections.set(connectionId, connection);
407
+ this.ensureClientServerLivenessTimer();
408
+ try {
409
+ monitor.onEvent((event) => {
410
+ if (![...connection.aliases].some(
411
+ alias => this.clientServerConnections.get(alias) === connection
412
+ )) return;
413
+ for (const handler of this.clientServerMonitorHandlers.get(channelName) ?? []) {
414
+ handler(event);
415
+ }
416
+ const routingId = event.routingId === undefined ? undefined : String(event.routingId);
417
+ if (event.nativeEvent === ZLinkSocketNativeEventType.ConnectionReady) {
418
+ // This single-endpoint DEALER also receives its disconnected ready-count snapshot.
419
+ if (event.value === 0n || connection.terminationRequested) return;
420
+ connection.physicalConnectionId = Symbol(connectionId);
421
+ connection.admissionAttempt = undefined;
422
+ for (const currentCallbacks of [...connection.callbacksByAlias.values()]) {
423
+ currentCallbacks.onTransportReady(routingId ?? '', event.remoteAddr);
424
+ }
425
+ return;
426
+ }
427
+ if (event.nativeEvent === ZLinkSocketNativeEventType.Disconnected
428
+ || event.nativeEvent === ZLinkSocketNativeEventType.Closed
429
+ || event.nativeEvent === ZLinkSocketNativeEventType.HandshakeFailedNoDetail
430
+ || event.nativeEvent === ZLinkSocketNativeEventType.HandshakeFailedProtocol
431
+ || event.nativeEvent === ZLinkSocketNativeEventType.HandshakeFailedAuth) {
432
+ if (connection.terminationRequested
433
+ && (event.remoteAddr !== connection.endpoint
434
+ || (event.nativeEvent !== ZLinkSocketNativeEventType.Disconnected
435
+ && event.nativeEvent !== ZLinkSocketNativeEventType.Closed))) return;
436
+ connection.physicalConnectionId = Symbol(connectionId);
437
+ connection.admissionAttempt = undefined;
438
+ if (connection.readyConnectionId !== undefined) {
439
+ this.removeReadyConnection(connection.readyConnectionId);
440
+ }
441
+ for (const currentCallbacks of [...connection.callbacksByAlias.values()]) {
442
+ currentCallbacks.onTerminated(routingId, event.remoteAddr);
443
+ }
444
+ if (connection.terminationRequested) {
445
+ connection.terminationRequested = false;
446
+ // Explicit disconnect removes intent; restore it once after this endpoint closes.
447
+ connection.dealer.connect(connection.endpoint);
448
+ }
449
+ }
450
+ });
451
+ dealer.connect(endpoint);
452
+ } catch (error) {
453
+ this.clientServerConnections.delete(connectionId);
454
+ this.ownedMonitors.delete(monitor);
455
+ try {
456
+ readablePoller.dispose();
457
+ } finally {
458
+ cleanupDealer();
459
+ void Promise.allSettled([monitor.dispose()]);
460
+ }
461
+ throw error;
462
+ }
463
+ return dealer;
464
+ }
465
+
466
+ async closeClientServerConnection(connectionId: string): Promise<void> {
467
+ const current = this.clientServerConnections.get(connectionId);
468
+ if (current === undefined) return;
469
+ this.clientServerConnections.delete(connectionId);
470
+ current.aliases.delete(connectionId);
471
+ current.callbacksByAlias.delete(connectionId);
472
+ const ready = this.clientServerReadyIdentities.get(connectionId);
473
+ this.clientServerReadyIdentities.delete(connectionId);
474
+ if (ready !== undefined && current.readyConnectionId === connectionId) {
475
+ this.clientServerDiscovery.removeClientServer(
476
+ ready.channelName,
477
+ ready.serverRoutingId,
478
+ connectionId
479
+ );
480
+ current.readyConnectionId = undefined;
481
+ const replacement = current.aliases.values().next().value as string | undefined;
482
+ if (replacement !== undefined && current.admittedDescriptor !== undefined
483
+ && this.clientServerDiscovery.admitClientServer(
484
+ current.admittedDescriptor,
485
+ replacement
486
+ )) {
487
+ current.readyConnectionId = replacement;
488
+ this.clientServerReadyIdentities.set(replacement, {
489
+ channelName: current.admittedDescriptor.channelName,
490
+ serverRoutingId: current.admittedDescriptor.serverRoutingId,
491
+ lifecycleGeneration: current.admittedDescriptor.lifecycleGeneration
492
+ });
493
+ }
494
+ }
495
+ if (current.aliases.size > 0) return;
496
+ await this.disposeClientServerPhysical(connectionId, current);
497
+ }
498
+
499
+ private async disposeClientServerPhysical(
500
+ connectionId: string,
501
+ current: ClientServerPhysicalConnection
502
+ ): Promise<void> {
503
+ try {
504
+ current.dealer.disconnect(current.endpoint);
505
+ } catch {
506
+ // Disposal below is the terminal cleanup if the transport already closed.
507
+ }
508
+ this.ownedMonitors.delete(current.monitor);
509
+ this.unregisterReceiveFlowSocket(current.dealer);
510
+ current.readablePoller.dispose();
511
+ const results = await Promise.allSettled([
512
+ current.monitor.dispose(),
513
+ current.dealer.dispose()
514
+ ]);
515
+ const errors = results
516
+ .filter((result): result is PromiseRejectedResult => result.status === 'rejected')
517
+ .map(result => result.reason);
518
+ if (errors.length === 1) throw errors[0];
519
+ if (errors.length > 1) {
520
+ throw new AggregateError(errors, `ClientServer connection '${connectionId}' cleanup failed.`);
521
+ }
522
+ }
523
+
524
+ admitClientServerConnection(
525
+ descriptor: ClientServerDiscoveryDescriptor,
526
+ connectionId: string
527
+ ): boolean {
528
+ const connection = this.clientServerConnections.get(connectionId);
529
+ if (connection === undefined) return false;
530
+ if (connection.readyConnectionId !== undefined) {
531
+ const admitted = this.clientServerDiscovery.admitClientServer(
532
+ descriptor,
533
+ connection.readyConnectionId
534
+ );
535
+ if (admitted) connection.admittedDescriptor = descriptor;
536
+ return admitted;
537
+ }
538
+ const duplicateId = [...this.clientServerReadyIdentities]
539
+ .find(([, identity]) =>
540
+ identity.channelName === descriptor.channelName
541
+ && identity.serverRoutingId === descriptor.serverRoutingId
542
+ && identity.lifecycleGeneration === descriptor.lifecycleGeneration)?.[0];
543
+ if (duplicateId !== undefined) {
544
+ const shared = this.clientServerConnections.get(duplicateId);
545
+ if (shared !== undefined && shared !== connection) {
546
+ this.clientServerConnections.set(connectionId, shared);
547
+ shared.aliases.add(connectionId);
548
+ const callbacks = connection.callbacksByAlias.get(connectionId);
549
+ if (callbacks !== undefined) shared.callbacksByAlias.set(connectionId, callbacks);
550
+ connection.aliases.clear();
551
+ connection.callbacksByAlias.clear();
552
+ void this.disposeClientServerPhysical(connectionId, connection)
553
+ .catch(error => this.oneWayFailureSink?.(error));
554
+ return true;
555
+ }
556
+ }
557
+ const admitted = this.clientServerDiscovery.admitClientServer(descriptor, connectionId);
558
+ if (admitted) {
559
+ const now = performance.now();
560
+ connection.nextProbeAt = now + CLIENT_SERVER_PROBE_INTERVAL_MS;
561
+ connection.deadlineAt = now + CLIENT_SERVER_PEER_DEADLINE_MS;
562
+ connection.outstandingProbeId = undefined;
563
+ this.clientServerReadyIdentities.set(connectionId, {
564
+ channelName: descriptor.channelName,
565
+ serverRoutingId: descriptor.serverRoutingId,
566
+ lifecycleGeneration: descriptor.lifecycleGeneration
567
+ });
568
+ connection.readyConnectionId = connectionId;
569
+ connection.admittedDescriptor = descriptor;
570
+ }
571
+ return admitted;
572
+ }
573
+
574
+ removeClientServerReady(
575
+ channelName: string,
576
+ serverRoutingId: string,
577
+ connectionId: string
578
+ ): boolean {
579
+ const removed = this.clientServerDiscovery.removeClientServer(
580
+ channelName,
581
+ serverRoutingId,
582
+ connectionId
583
+ );
584
+ if (removed) {
585
+ this.clientServerReadyIdentities.delete(connectionId);
586
+ const connection = this.clientServerConnections.get(connectionId);
587
+ if (connection?.readyConnectionId === connectionId) {
588
+ connection.readyConnectionId = undefined;
589
+ connection.deadlineAt = undefined;
590
+ connection.nextProbeAt = undefined;
591
+ connection.outstandingProbeId = undefined;
592
+ }
593
+ }
594
+ return removed;
595
+ }
596
+
597
+ selectClientServerDealer(channelName: string): ZLinkBackendDealerSocket | undefined {
598
+ const selected = this.clientServerDiscovery.selectClientServerConnection(channelName);
599
+ if (selected === undefined) return undefined;
600
+ return this.clientServerConnections.get(selected.connectionId)?.dealer;
601
+ }
602
+
603
+ clientDealerForOutbound(channelName: string): ZLinkBackendDealerSocket | undefined {
604
+ const channel = this.registration.channels.get(channelName);
605
+ if (channel?.client === undefined) {
606
+ throw createInternalFrameworkException(
607
+ ZLinkFrameworkInternalErrorKind.InvalidConfiguration,
608
+ `Channel client role '${channelName}' is not configured.`
609
+ );
610
+ }
611
+ return this.selectClientServerDealer(channelName);
612
+ }
613
+
614
+ selectedClientServerRid(
615
+ channelName: string,
616
+ dealer: ZLinkBackendDealerSocket
617
+ ): string | undefined {
618
+ for (const connection of this.clientServerConnections.values()) {
619
+ if (connection.channelName !== channelName || connection.dealer !== dealer) continue;
620
+ return connection.admittedDescriptor?.serverRoutingId;
621
+ }
622
+ return undefined;
623
+ }
624
+
625
+ /**
626
+ * Resolves a ClientServer send target, waiting when the ready candidate set is still empty, as
627
+ * `framework/doc/framework/common/spec/server/02-channel-transport/02-channel-messaging.ko.md` §3.2 requires: the call waits
628
+ * at call time for a bounded period and then fails with no-target. The bound is the shorter of
629
+ * the call's remaining deadline and five seconds, mirroring the .NET reference
630
+ * `ZLinkClientServerClientRuntime.WaitForReadyAsync`. The wait lives here because this registry
631
+ * owns ClientServer connections, admission and weighted selection. Sends have no per-call
632
+ * timeout, so they use the Channel's request timeout.
633
+ *
634
+ * The wait only observes admission that is already in flight: it never opens or reconnects a
635
+ * connection, so it cannot trigger the admission it waits for, and Framework startup keeps not
636
+ * waiting for local ClientServer admission. It applies whenever nothing is selectable, including
637
+ * candidate sets excluded by weight 0 or drain, because `selectClientServerDealer` filters the
638
+ * same way the reference `SelectReady()` does.
639
+ *
640
+ * Every attempt yields to the event loop between polls. ClientServer admission completes on the
641
+ * monitor drains that the backend poll timer pumps, so a synchronous wait would starve the
642
+ * admission it is waiting for and burn the whole bound before failing anyway. That is this
643
+ * execution model's form of the hazard the JVM mirror avoids by not holding the admission
644
+ * monitor across its sleep.
645
+ */
646
+ async awaitClientDealerForOutbound(
647
+ channelName: string,
648
+ signal?: AbortSignal,
649
+ deadlineAtMs?: number
650
+ ): Promise<ZLinkBackendDealerSocket | undefined> {
651
+ const startedAtMs = performance.now();
652
+ const deadline = Math.min(
653
+ deadlineAtMs ?? startedAtMs + (
654
+ this.registration.channels.get(channelName)?.requestTimeoutMs
655
+ ?? this.registration.requestTimeoutMs
656
+ ?? DEFAULT_REQUEST_TIMEOUT_MS
657
+ ),
658
+ startedAtMs + CLIENT_SERVER_READY_WAIT_CAP_MS
659
+ );
660
+ for (;;) {
661
+ this.drainSocketMonitors();
662
+ const dealer = this.clientDealerForOutbound(channelName);
663
+ if (dealer !== undefined) return dealer;
664
+ const remainingMs = deadline - performance.now();
665
+ if (remainingMs <= 0) return undefined;
666
+ throwIfAborted(signal);
667
+ await new Promise<void>(resolve => {
668
+ setTimeout(resolve, Math.min(CLIENT_SERVER_READY_POLL_INTERVAL_MS, remainingMs));
669
+ });
670
+ }
671
+ }
672
+
673
+ startManualClientServerConnections(): void {
674
+ for (const [channelName, channel] of this.registration.channels) {
675
+ const client = channel.client;
676
+ if (client === undefined) continue;
677
+ const endpoints = channel.client?.manualConnections ?? [];
678
+ if (endpoints.length === 0) continue;
679
+ const open = (endpoint: string) => this.openManualClientServerConnection(channelName, endpoint);
680
+ const close = (endpoint: string) => {
681
+ void this.closeClientServerConnection(manualClientServerConnectionId(channelName, endpoint))
682
+ .catch(error => this.oneWayFailureSink?.(error));
683
+ };
684
+ attachEndpointConnections(client, { connect: open, disconnect: close });
685
+ for (const endpoint of endpoints) {
686
+ open(endpoint);
687
+ }
688
+ }
689
+ }
690
+
691
+ startLocalClientServerConnections(): void {
692
+ for (const [channelName, channel] of this.registration.channels) {
693
+ if (channel.client === undefined || channel.server === undefined) continue;
694
+ const identity = this.clientServerServerIdentity(channelName);
695
+ this.openConfiguredClientServerConnection(
696
+ channelName,
697
+ localClientServerConnectionId(channelName),
698
+ identity.endpoint
699
+ );
700
+ }
701
+ }
702
+
703
+ clientServerMonitoringSource(channelName: string): ZLinkBackendSocketMonitor {
704
+ if (this.registration.channels.get(channelName)?.client === undefined) {
705
+ throw new ZLinkConfigurationException(`Channel client '${channelName}' is not registered.`);
706
+ }
707
+ let disposed = false;
708
+ let handler: ((event: ZLinkBackendSocketMonitorEvent) => void) | undefined;
709
+ return {
710
+ nativeInstance: {},
711
+ onEvent: (next) => {
712
+ if (disposed) return;
713
+ if (handler !== undefined) {
714
+ this.clientServerMonitorHandlers.get(channelName)?.delete(handler);
715
+ }
716
+ handler = next;
717
+ let handlers = this.clientServerMonitorHandlers.get(channelName);
718
+ if (handlers === undefined) {
719
+ handlers = new Set();
720
+ this.clientServerMonitorHandlers.set(channelName, handlers);
721
+ }
722
+ handlers.add(next);
723
+ },
724
+ drain: () => 0,
725
+ dispose: async () => {
726
+ disposed = true;
727
+ if (handler !== undefined) {
728
+ const handlers = this.clientServerMonitorHandlers.get(channelName);
729
+ handlers?.delete(handler);
730
+ if (handlers?.size === 0) this.clientServerMonitorHandlers.delete(channelName);
731
+ }
732
+ }
733
+ };
734
+ }
735
+
736
+ clientServerActiveTargets(
737
+ channelName: string
738
+ ): readonly Pick<ClientServerDiscoveryDescriptor, 'serverRoutingId' | 'weight' | 'state'>[] {
739
+ const descriptors = this.clientServerDiscovery.clientServerDescriptors(channelName);
740
+ const local = this.clientServerServerDescriptors.get(channelName);
741
+ if (local === undefined || descriptors.some(descriptor =>
742
+ descriptor.serverRoutingId === local.serverRid
743
+ && descriptor.lifecycleGeneration === local.lifecycleGeneration)) return descriptors;
744
+
745
+ return [...descriptors, {
746
+ serverRoutingId: local.serverRid,
747
+ weight: local.weight,
748
+ state: discoveryAvailabilityForRuntimeState(local.state)
749
+ }].sort((left, right) =>
750
+ left.serverRoutingId < right.serverRoutingId ? -1
751
+ : left.serverRoutingId > right.serverRoutingId ? 1 : 0);
752
+ }
753
+
754
+ hasKnownClientServerTargets(channelName: string): boolean {
755
+ return this.clientServerDiscovery.clientServerDescriptors(channelName).length > 0;
756
+ }
757
+
758
+ fanoutActiveTargets(channelName: string) {
759
+ return this.clientServerDiscovery.fanoutEndpoints(channelName);
760
+ }
761
+
762
+ admitFanoutPublisher(
763
+ descriptor: ZLinkFanoutPublisherDescriptor,
764
+ connectionId: string
765
+ ): boolean {
766
+ const connection = this.fanoutConnections.get(connectionId);
767
+ if (connection === undefined || !connection.ready) return false;
768
+ const admitted = this.clientServerDiscovery.admitFanoutPublisher({
769
+ channelName: descriptor.channelName,
770
+ publisherRoutingId: String(descriptor.publisherRid),
771
+ lifecycleGeneration: descriptor.lifecycleGeneration,
772
+ descriptorRevision: descriptor.descriptorRevision,
773
+ advertisedEndpoint: descriptor.endpoint,
774
+ state: discoveryAvailabilityForRuntimeState(descriptor.state)
775
+ }, fanoutDiscoveryConnectionId(connectionId));
776
+ this.notifyFanoutTopology(descriptor.channelName);
777
+ return admitted;
778
+ }
779
+
780
+ removeFanoutPublisher(
781
+ descriptor: ZLinkFanoutPublisherDescriptor,
782
+ connectionId: string
783
+ ): boolean {
784
+ const removed = this.clientServerDiscovery.removeFanoutPublisher(
785
+ descriptor.channelName,
786
+ String(descriptor.publisherRid),
787
+ fanoutDiscoveryConnectionId(connectionId)
788
+ );
789
+ this.notifyFanoutTopology(descriptor.channelName);
790
+ return removed;
791
+ }
792
+
793
+ setClientServerServerDescriptor(
794
+ descriptor: ZLinkClientServerServerDescriptor | undefined,
795
+ channelName: string
796
+ ): void {
797
+ if (descriptor === undefined) {
798
+ this.clientServerServerDescriptors.delete(channelName);
799
+ } else {
800
+ this.clientServerServerDescriptors.set(channelName, descriptor);
801
+ this.pushClientServerDescriptorUpdate(channelName, descriptor);
802
+ }
803
+ }
804
+
805
+ tryHandleClientServerControl(
806
+ channelName: string,
807
+ received: {
808
+ readonly parts: readonly Message[];
809
+ readonly replyToken: unknown | null;
810
+ readonly routingId: unknown;
811
+ },
812
+ router: ZLinkBackendRouterSocket
813
+ ): boolean {
814
+ if (received.parts.length === 0) return false;
815
+ const first = received.parts[0];
816
+ if (!isClientServerControlFrame(first.data())) return false;
817
+ let reply: Buffer;
818
+ try {
819
+ const record = decodeClientServerControl(first.data());
820
+ if (record.kind === 'livenessProbe'
821
+ && received.parts.length === 1
822
+ && received.replyToken !== null) {
823
+ reply = encodeClientServerLivenessAck(record.probeId);
824
+ } else if (record.kind === 'livenessAck'
825
+ && received.parts.length === 1
826
+ && received.replyToken === null) {
827
+ if (!this.acceptClientServerServerLivenessAck(
828
+ channelName,
829
+ String(received.routingId),
830
+ record.probeId
831
+ )) {
832
+ this.reportStaleClientServerLivenessAck(
833
+ channelName,
834
+ String(received.routingId),
835
+ record.probeId
836
+ );
837
+ }
838
+ return true;
839
+ } else if (record.kind !== 'hello'
840
+ || received.parts.length !== 1
841
+ || received.replyToken === null) {
842
+ reply = encodeClientServerReject(1);
843
+ } else {
844
+ const descriptor = this.clientServerServerDescriptors.get(channelName);
845
+ if (descriptor === undefined
846
+ || record.hello.channelName !== channelName
847
+ || record.hello.securityIdentity !== descriptor.securityIdentity) {
848
+ reply = encodeClientServerReject(3);
849
+ } else {
850
+ const normalizedEffectiveMaxMessageBytes = Math.min(
851
+ normalizedMessageLimit(router.maxMessageSize),
852
+ record.hello.normalizedEffectiveMaxMessageBytes
853
+ );
854
+ reply = encodeClientServerAdmit(
855
+ descriptor,
856
+ normalizedEffectiveMaxMessageBytes
857
+ );
858
+ this.admitClientServerServerPeer(
859
+ channelName,
860
+ String(received.routingId),
861
+ normalizedEffectiveMaxMessageBytes
862
+ );
863
+ }
864
+ }
865
+ } catch {
866
+ reply = encodeClientServerReject(1);
867
+ }
868
+ if (received.replyToken !== null) {
869
+ const message = RuntimeMessage.from(reply);
870
+ try {
871
+ router.reply(received.routingId as RoutingId, received.replyToken, message);
872
+ } finally {
873
+ message.close();
874
+ }
875
+ }
876
+ return true;
877
+ }
878
+
879
+ tickClientServerLiveness(nowMs = performance.now()): void {
880
+ this.drainSocketMonitors();
881
+ for (const connection of new Set(this.clientServerConnections.values())) {
882
+ const connectionId = connection.readyConnectionId
883
+ ?? connection.aliases.values().next().value as string | undefined;
884
+ if (connectionId === undefined) continue;
885
+ this.drainClientServerControl(connectionId, connection);
886
+ if (connection.deadlineAt === undefined) continue;
887
+ if (nowMs >= connection.deadlineAt) {
888
+ this.requestClientServerEndpointTermination(connectionId, connection);
889
+ continue;
890
+ }
891
+ if (connection.nextProbeAt === undefined || nowMs < connection.nextProbeAt) continue;
892
+ connection.nextProbeAt = nowMs + CLIENT_SERVER_PROBE_INTERVAL_MS;
893
+ const probeId = connection.outstandingProbeId ?? this.allocateClientServerProbeId();
894
+ connection.outstandingProbeId = probeId;
895
+ this.requestClientServerLiveness(connectionId, connection, probeId);
896
+ }
897
+
898
+ for (const [key, peer] of [...this.clientServerServerPeers]) {
899
+ if (nowMs >= peer.deadlineAt) {
900
+ this.clientServerServerPeers.delete(key);
901
+ this.clientServerAdmittedClients.get(peer.channelName)?.delete(peer.routingId);
902
+ try {
903
+ this.channelRouters.get(peer.channelName)?.disconnectPeer(peer.routingId);
904
+ } catch (error) {
905
+ this.oneWayFailureSink?.(error);
906
+ }
907
+ continue;
908
+ }
909
+ if (nowMs < peer.nextProbeAt) continue;
910
+ peer.nextProbeAt = nowMs + CLIENT_SERVER_PROBE_INTERVAL_MS;
911
+ const probeId = peer.outstandingProbeId ?? this.allocateClientServerProbeId();
912
+ peer.outstandingProbeId = probeId;
913
+ this.requestClientServerServerLiveness(peer, probeId);
914
+ }
915
+ this.tickFanoutLiveness(nowMs);
916
+ }
917
+
918
+ openFanoutSubscriberConnection(
919
+ channelName: string,
920
+ connectionId: string,
921
+ endpoint: string,
922
+ callbacks: ZLinkFanoutConnectionCallbacks
923
+ ): ZLinkBackendSubscriberSocket {
924
+ if (this.fanoutConnections.has(connectionId)) {
925
+ throw new ZLinkConfigurationException(
926
+ `Fanout connection '${connectionId}' is already open.`
927
+ );
928
+ }
929
+ if (this.monitoringAdapter === undefined) {
930
+ throw new ZLinkConfigurationException(
931
+ 'Fanout subscriber connections require socket monitoring.'
932
+ );
933
+ }
934
+ const channel = this.registration.channels.get(channelName);
935
+ if (channel?.subscriber === undefined) {
936
+ throw new ZLinkConfigurationException(
937
+ `Fanout subscriber '${channelName}' is not registered.`
938
+ );
939
+ }
940
+ const subscriber = this.adapter.createSubscriberSocket(this.context);
941
+ subscriber.setChannelName(channelName);
942
+ subscriber.setSubscription('');
943
+ subscriber.setSubscription(FANOUT_LIVENESS_TOPIC);
944
+ const monitor = this.monitoringAdapter.openSocketMonitor(subscriber);
945
+ const connection: FanoutPublisherConnection = {
946
+ channelName,
947
+ endpoint,
948
+ subscriber,
949
+ monitor,
950
+ callbacks,
951
+ physicalConnectionId: Symbol(connectionId),
952
+ transportReady: false,
953
+ ready: false
954
+ };
955
+ this.fanoutConnections.set(connectionId, connection);
956
+ this.ownedMonitors.add(monitor);
957
+ this.ensureClientServerLivenessTimer();
958
+ try {
959
+ monitor.onEvent((event) => {
960
+ if (this.fanoutConnections.get(connectionId) !== connection) return;
961
+ for (const handler of this.fanoutMonitorHandlers.get(channelName) ?? []) {
962
+ handler(event);
963
+ }
964
+ if (event.nativeEvent === ZLinkSocketNativeEventType.ConnectionReady) {
965
+ connection.transportReady = true;
966
+ return;
967
+ }
968
+ if (event.nativeEvent === ZLinkSocketNativeEventType.Disconnected
969
+ || event.nativeEvent === ZLinkSocketNativeEventType.Closed
970
+ || event.nativeEvent === ZLinkSocketNativeEventType.HandshakeFailedNoDetail
971
+ || event.nativeEvent === ZLinkSocketNativeEventType.HandshakeFailedProtocol
972
+ || event.nativeEvent === ZLinkSocketNativeEventType.HandshakeFailedAuth) {
973
+ connection.transportReady = false;
974
+ connection.ready = false;
975
+ connection.deadlineAt = undefined;
976
+ callbacks.onTerminated('disconnect');
977
+ }
978
+ });
979
+ subscriber.connect(endpoint);
980
+ } catch (error) {
981
+ this.fanoutConnections.delete(connectionId);
982
+ this.ownedMonitors.delete(monitor);
983
+ void Promise.allSettled([monitor.dispose(), subscriber.dispose()]);
984
+ throw error;
985
+ }
986
+ return subscriber;
987
+ }
988
+
989
+ async closeFanoutSubscriberConnection(
990
+ connectionId: string
991
+ ): Promise<void> {
992
+ const connection = this.fanoutConnections.get(connectionId);
993
+ if (connection === undefined) return;
994
+ this.fanoutConnections.delete(connectionId);
995
+ try {
996
+ connection.subscriber.disconnect(connection.endpoint);
997
+ } catch {
998
+ // Disposal remains the terminal cleanup path.
999
+ }
1000
+ this.ownedMonitors.delete(connection.monitor);
1001
+ const results = await Promise.allSettled([
1002
+ connection.monitor.dispose(),
1003
+ connection.subscriber.dispose()
1004
+ ]);
1005
+ const errors = results
1006
+ .filter((result): result is PromiseRejectedResult =>
1007
+ result.status === 'rejected')
1008
+ .map(result => result.reason);
1009
+ if (errors.length === 1) throw errors[0];
1010
+ if (errors.length > 1) {
1011
+ throw new AggregateError(
1012
+ errors,
1013
+ `Fanout connection '${connectionId}' cleanup failed.`
1014
+ );
1015
+ }
1016
+ }
1017
+
1018
+ handleFanoutInbound(
1019
+ connectionId: string,
1020
+ topicMessage: {
1021
+ readonly topic: string;
1022
+ readonly parts: readonly { data(): Uint8Array }[];
1023
+ },
1024
+ source: ZLinkBackendSubscriberSocket,
1025
+ nowMs = performance.now()
1026
+ ): boolean {
1027
+ return this.handleFanoutInboundResult(
1028
+ connectionId,
1029
+ topicMessage,
1030
+ source,
1031
+ nowMs
1032
+ ).consumed;
1033
+ }
1034
+
1035
+ handleFanoutInboundResult(
1036
+ connectionId: string,
1037
+ topicMessage: {
1038
+ readonly topic: string;
1039
+ readonly parts: readonly { data(): Uint8Array }[];
1040
+ },
1041
+ source: ZLinkBackendSubscriberSocket,
1042
+ nowMs = performance.now()
1043
+ ): {
1044
+ readonly consumed: boolean;
1045
+ readonly decodedHeader?: ZLinkChannelEnvelopeHeader;
1046
+ } {
1047
+ const connection = this.fanoutConnections.get(connectionId);
1048
+ if (connection === undefined || connection.subscriber !== source) {
1049
+ return { consumed: true };
1050
+ }
1051
+ const classification = inspectFanoutInbound(
1052
+ topicMessage.topic,
1053
+ topicMessage.parts
1054
+ );
1055
+ if (classification.kind === 'protocolError') {
1056
+ connection.ready = false;
1057
+ connection.deadlineAt = undefined;
1058
+ connection.callbacks.onTerminated('protocol');
1059
+ return { consumed: true };
1060
+ }
1061
+ connection.deadlineAt = nowMs + CLIENT_SERVER_PEER_DEADLINE_MS;
1062
+ if (!connection.ready) {
1063
+ connection.ready = true;
1064
+ connection.callbacks.onReady();
1065
+ }
1066
+ return classification.kind === 'beacon'
1067
+ ? { consumed: true }
1068
+ : { consumed: false, decodedHeader: classification.header };
1069
+ }
1070
+
1071
+ isFanoutConnectionReady(connectionId: string): boolean {
1072
+ return this.fanoutConnections.get(connectionId)?.ready === true;
1073
+ }
1074
+
1075
+ fanoutMonitoringSource(channelName: string): ZLinkBackendSocketMonitor {
1076
+ if (this.registration.channels.get(channelName)?.subscriber === undefined) {
1077
+ throw new ZLinkConfigurationException(
1078
+ `Fanout subscriber '${channelName}' is not registered.`
1079
+ );
1080
+ }
1081
+ let handler:
1082
+ ((event: ZLinkBackendSocketMonitorEvent) => void) | undefined;
1083
+ let disposed = false;
1084
+ return {
1085
+ nativeInstance: {},
1086
+ onEvent: next => {
1087
+ if (disposed) return;
1088
+ if (handler !== undefined) {
1089
+ this.fanoutMonitorHandlers.get(channelName)?.delete(handler);
1090
+ }
1091
+ handler = next;
1092
+ let handlers = this.fanoutMonitorHandlers.get(channelName);
1093
+ if (handlers === undefined) {
1094
+ handlers = new Set();
1095
+ this.fanoutMonitorHandlers.set(channelName, handlers);
1096
+ }
1097
+ handlers.add(next);
1098
+ },
1099
+ drain: () => 0,
1100
+ dispose: async () => {
1101
+ disposed = true;
1102
+ if (handler !== undefined) {
1103
+ this.fanoutMonitorHandlers.get(channelName)?.delete(handler);
1104
+ }
1105
+ }
1106
+ };
1107
+ }
1108
+
1109
+ fanoutTopologyMonitoringSource(channelName: string): {
1110
+ onChange(handler: () => void): void;
1111
+ dispose(): Promise<void>;
1112
+ } {
1113
+ if (this.registration.channels.get(channelName)?.subscriber === undefined) {
1114
+ throw new ZLinkConfigurationException(
1115
+ `Fanout subscriber '${channelName}' is not registered.`
1116
+ );
1117
+ }
1118
+ let handler: (() => void) | undefined;
1119
+ let disposed = false;
1120
+ return {
1121
+ onChange: next => {
1122
+ if (disposed) return;
1123
+ if (handler !== undefined) {
1124
+ this.fanoutTopologyHandlers.get(channelName)?.delete(handler);
1125
+ }
1126
+ handler = next;
1127
+ let handlers = this.fanoutTopologyHandlers.get(channelName);
1128
+ if (handlers === undefined) {
1129
+ handlers = new Set();
1130
+ this.fanoutTopologyHandlers.set(channelName, handlers);
1131
+ }
1132
+ handlers.add(next);
1133
+ },
1134
+ dispose: async () => {
1135
+ disposed = true;
1136
+ if (handler !== undefined) {
1137
+ const handlers = this.fanoutTopologyHandlers.get(channelName);
1138
+ handlers?.delete(handler);
1139
+ if (handlers?.size === 0) this.fanoutTopologyHandlers.delete(channelName);
1140
+ }
1141
+ }
1142
+ };
1143
+ }
1144
+
1145
+ private notifyFanoutTopology(channelName: string): void {
1146
+ for (const handler of this.fanoutTopologyHandlers.get(channelName) ?? []) {
1147
+ try {
1148
+ handler();
1149
+ } catch {
1150
+ // Monitoring observers cannot change transport lifecycle results.
1151
+ }
1152
+ }
1153
+ }
1154
+
1155
+ private tickFanoutLiveness(nowMs: number): void {
1156
+ for (const [channelName, publisher] of this.publishers) {
1157
+ const next = this.fanoutPublisherNextBeacon.get(channelName) ?? nowMs;
1158
+ if (nowMs < next) continue;
1159
+ this.fanoutPublisherNextBeacon.set(
1160
+ channelName,
1161
+ nowMs + CLIENT_SERVER_PROBE_INTERVAL_MS
1162
+ );
1163
+ const payload = RuntimeMessage.from(FANOUT_LIVENESS_PAYLOAD);
1164
+ try {
1165
+ publisher.publish(FANOUT_LIVENESS_TOPIC, payload);
1166
+ } finally {
1167
+ payload.close();
1168
+ }
1169
+ }
1170
+ for (const [connectionId, connection] of [...this.fanoutConnections]) {
1171
+ if (connection.deadlineAt === undefined
1172
+ || nowMs < connection.deadlineAt) continue;
1173
+ connection.ready = false;
1174
+ connection.deadlineAt = undefined;
1175
+ connection.callbacks.onTerminated('deadline');
1176
+ if (this.fanoutConnections.get(connectionId) === connection) {
1177
+ void this.closeFanoutSubscriberConnection(connectionId)
1178
+ .catch(error => this.oneWayFailureSink?.(error));
1179
+ }
1180
+ }
1181
+ }
1182
+
1183
+ private openManualClientServerConnection(channelName: string, endpoint: string): void {
1184
+ this.openConfiguredClientServerConnection(
1185
+ channelName,
1186
+ manualClientServerConnectionId(channelName, endpoint),
1187
+ endpoint
1188
+ );
1189
+ }
1190
+
1191
+ private openConfiguredClientServerConnection(
1192
+ channelName: string,
1193
+ connectionId: string,
1194
+ endpoint: string
1195
+ ): void {
1196
+ if (this.clientServerConnections.has(connectionId)) return;
1197
+ this.openClientServerConnection(channelName, connectionId, endpoint, {
1198
+ onTransportReady: () => {
1199
+ void this.admitConfiguredClientServerConnection(channelName, connectionId)
1200
+ .catch(error => this.oneWayFailureSink?.(error));
1201
+ },
1202
+ onTerminated: () => this.removeReadyConnection(connectionId)
1203
+ });
1204
+ }
1205
+
1206
+ private async admitConfiguredClientServerConnection(
1207
+ channelName: string,
1208
+ connectionId: string
1209
+ ): Promise<void> {
1210
+ const connection = this.clientServerConnections.get(connectionId);
1211
+ if (connection === undefined) return;
1212
+ const physicalConnectionId = connection.physicalConnectionId;
1213
+ if (connection.admissionAttempt !== undefined) return;
1214
+ const admissionAttempt = Symbol(connectionId);
1215
+ connection.admissionAttempt = admissionAttempt;
1216
+ try {
1217
+ const admission = await requestClientServerAdmission(
1218
+ connection.dealer,
1219
+ channelName,
1220
+ 'default',
1221
+ 15_000
1222
+ );
1223
+ if (this.clientServerConnections.get(connectionId) !== connection
1224
+ || connection.physicalConnectionId !== physicalConnectionId
1225
+ || connection.admissionAttempt !== admissionAttempt) return;
1226
+ if (admission.channelName !== channelName
1227
+ || admission.securityIdentity !== 'default') {
1228
+ throw new ZLinkConfigurationException(
1229
+ `ClientServer '${channelName}' admission does not match its configured identity.`
1230
+ );
1231
+ }
1232
+ if (!this.admitClientServerConnection(
1233
+ admissionToDiscoveryDescriptor(admission),
1234
+ connectionId
1235
+ )) {
1236
+ throw new ZLinkConfigurationException(
1237
+ `ClientServer '${channelName}' admission was stale.`
1238
+ );
1239
+ }
1240
+ } catch (error) {
1241
+ if (this.clientServerConnections.get(connectionId) !== connection
1242
+ || connection.physicalConnectionId !== physicalConnectionId
1243
+ || connection.admissionAttempt !== admissionAttempt) return;
1244
+ this.removeReadyConnection(connectionId);
1245
+ throw error;
1246
+ } finally {
1247
+ if (this.clientServerConnections.get(connectionId) === connection
1248
+ && connection.admissionAttempt === admissionAttempt) {
1249
+ connection.admissionAttempt = undefined;
1250
+ }
1251
+ }
1252
+ }
1253
+
1254
+ private drainClientServerControl(
1255
+ connectionId: string,
1256
+ connection: ClientServerPhysicalConnection
1257
+ ): void {
1258
+ if (connection.terminationRequested) return;
1259
+ for (;;) {
1260
+ if (!connection.readablePoller.wait(0)) return;
1261
+ const received = connection.dealer.recv(1);
1262
+ if (received === undefined) return;
1263
+ try {
1264
+ if (received.parts.length !== 1
1265
+ || !isClientServerControlFrame(received.parts[0]!.data())) {
1266
+ throw new ZLinkConfigurationException(
1267
+ `ClientServer '${connection.channelName}' received an unsolicited application frame.`
1268
+ );
1269
+ }
1270
+ const record = decodeClientServerControl(received.parts[0]!.data());
1271
+ if (record.kind === 'livenessProbe') {
1272
+ const ack = RuntimeMessage.from(encodeClientServerLivenessAck(record.probeId));
1273
+ void connection.dealer.send(ack)
1274
+ .catch((error) => {
1275
+ this.removeReadyConnection(connectionId);
1276
+ this.oneWayFailureSink?.(error);
1277
+ })
1278
+ .finally(() => ack.close());
1279
+ continue;
1280
+ }
1281
+ if (record.kind !== 'update') {
1282
+ throw new ZLinkConfigurationException(
1283
+ `ClientServer '${connection.channelName}' received an invalid pushed control record.`
1284
+ );
1285
+ }
1286
+ this.applyClientServerDescriptorUpdate(connectionId, connection, record.admission);
1287
+ } catch (error) {
1288
+ this.requestClientServerEndpointTermination(connectionId, connection);
1289
+ this.oneWayFailureSink?.(error);
1290
+ return;
1291
+ } finally {
1292
+ received.close();
1293
+ }
1294
+ }
1295
+ }
1296
+
1297
+ private requestClientServerEndpointTermination(
1298
+ connectionId: string,
1299
+ connection: ClientServerPhysicalConnection
1300
+ ): void {
1301
+ if (connection.terminationRequested) return;
1302
+ connection.terminationRequested = true;
1303
+ connection.physicalConnectionId = Symbol(connectionId);
1304
+ connection.admissionAttempt = undefined;
1305
+ this.removeReadyConnection(connectionId);
1306
+ try {
1307
+ connection.dealer.disconnect(connection.endpoint);
1308
+ } catch (error) {
1309
+ this.oneWayFailureSink?.(error);
1310
+ }
1311
+ }
1312
+
1313
+ private applyClientServerDescriptorUpdate(
1314
+ connectionId: string,
1315
+ connection: { readonly channelName: string; readonly physicalConnectionId: symbol },
1316
+ admission: ZLinkClientServerAdmission
1317
+ ): void {
1318
+ const currentConnection = this.clientServerConnections.get(connectionId);
1319
+ if (currentConnection === undefined
1320
+ || currentConnection.physicalConnectionId !== connection.physicalConnectionId) return;
1321
+ const identity = this.clientServerReadyIdentities.get(connectionId);
1322
+ if (identity === undefined) return;
1323
+ const current = this.clientServerDiscovery.clientServerDescriptors(connection.channelName)
1324
+ .find(value =>
1325
+ value.serverRoutingId === identity.serverRoutingId);
1326
+ if (current === undefined) return;
1327
+ if (admission.channelName !== current.channelName
1328
+ || admission.serverRid !== current.serverRoutingId
1329
+ || admission.lifecycleGeneration !== current.lifecycleGeneration
1330
+ || admission.securityIdentity !== current.securityIdentity
1331
+ || admission.advertisedEndpoint !== current.advertisedEndpoint) {
1332
+ throw new ZLinkConfigurationException(
1333
+ `ClientServer '${connection.channelName}' descriptor update changed immutable identity.`
1334
+ );
1335
+ }
1336
+ const candidate = admissionToDiscoveryDescriptor(admission);
1337
+ if (candidate.effectiveMaxMessageBytes !== current.effectiveMaxMessageBytes) {
1338
+ throw new ServiceWireProtocolError(
1339
+ `ClientServer '${connection.channelName}' descriptor update changed the admitted message bound.`
1340
+ );
1341
+ }
1342
+ if (candidate.descriptorRevision < current.descriptorRevision) {
1343
+ throw new ServiceWireProtocolError(
1344
+ `ClientServer '${connection.channelName}' descriptor revision is stale.`
1345
+ );
1346
+ }
1347
+ if (candidate.descriptorRevision === current.descriptorRevision) {
1348
+ if (!sameClientServerDiscoveryDescriptor(candidate, current)) {
1349
+ throw new ServiceWireProtocolError(
1350
+ `ClientServer '${connection.channelName}' descriptor revision conflicts.`
1351
+ );
1352
+ }
1353
+ return;
1354
+ }
1355
+ if (!this.admitClientServerConnection(candidate, connectionId)) {
1356
+ throw new ZLinkConfigurationException(
1357
+ `ClientServer '${connection.channelName}' descriptor update was fenced.`
1358
+ );
1359
+ }
1360
+ }
1361
+
1362
+ private ensureClientServerLivenessTimer(): void {
1363
+ if (this.clientServerLivenessTimer !== undefined) return;
1364
+ this.clientServerLivenessTimer = setInterval(
1365
+ () => this.tickClientServerLiveness(),
1366
+ 100
1367
+ );
1368
+ this.clientServerLivenessTimer.unref();
1369
+ }
1370
+
1371
+ private drainSocketMonitors(): void {
1372
+ for (const monitor of this.ownedMonitors) monitor.drain();
1373
+ }
1374
+
1375
+ private removeReadyConnection(connectionId: string): void {
1376
+ const identity = this.clientServerReadyIdentities.get(connectionId);
1377
+ if (identity === undefined) return;
1378
+ this.clientServerDiscovery.markClientServerDisconnected(
1379
+ identity.channelName,
1380
+ identity.serverRoutingId,
1381
+ connectionId
1382
+ );
1383
+ this.clientServerReadyIdentities.delete(connectionId);
1384
+ const connection = this.clientServerConnections.get(connectionId);
1385
+ if (connection !== undefined) {
1386
+ if (connection.readyConnectionId === connectionId) {
1387
+ connection.readyConnectionId = undefined;
1388
+ }
1389
+ connection.deadlineAt = undefined;
1390
+ connection.nextProbeAt = undefined;
1391
+ connection.outstandingProbeId = undefined;
1392
+ }
1393
+ }
1394
+
1395
+ private requestClientServerLiveness(
1396
+ connectionId: string,
1397
+ connection: {
1398
+ readonly channelName: string;
1399
+ readonly dealer: ZLinkBackendDealerSocket;
1400
+ readonly physicalConnectionId: symbol;
1401
+ outstandingProbeId?: bigint;
1402
+ deadlineAt?: number;
1403
+ },
1404
+ probeId: bigint
1405
+ ): void {
1406
+ const message = RuntimeMessage.from(encodeClientServerLivenessProbe(probeId));
1407
+ void connection.dealer.request(message, CLIENT_SERVER_PEER_DEADLINE_MS)
1408
+ .then((parts) => {
1409
+ try {
1410
+ const current = this.clientServerConnections.get(connectionId);
1411
+ if (current === undefined
1412
+ || current.physicalConnectionId !== connection.physicalConnectionId
1413
+ || parts.length !== 1) return;
1414
+ const record = decodeClientServerControl(parts[0]!.data());
1415
+ if (record.kind !== 'livenessAck') return;
1416
+ if (current.outstandingProbeId !== probeId || record.probeId !== probeId) {
1417
+ this.reportStaleClientServerLivenessAck(
1418
+ connection.channelName,
1419
+ connectionId,
1420
+ record.probeId
1421
+ );
1422
+ return;
1423
+ }
1424
+ current.outstandingProbeId = undefined;
1425
+ current.deadlineAt = performance.now() + CLIENT_SERVER_PEER_DEADLINE_MS;
1426
+ } finally {
1427
+ closeMessages(parts);
1428
+ }
1429
+ })
1430
+ .catch((error) => this.oneWayFailureSink?.(error))
1431
+ .finally(() => message.close());
1432
+ }
1433
+
1434
+ private admitClientServerServerPeer(
1435
+ channelName: string,
1436
+ routingId: RoutingId,
1437
+ normalizedEffectiveMaxMessageBytes: number
1438
+ ): void {
1439
+ const key = clientServerServerPeerKey(channelName, routingId);
1440
+ const now = performance.now();
1441
+ const peer = {
1442
+ channelName,
1443
+ routingId,
1444
+ physicalConnectionId: Symbol(key),
1445
+ normalizedEffectiveMaxMessageBytes,
1446
+ nextProbeAt: now + CLIENT_SERVER_PROBE_INTERVAL_MS,
1447
+ deadlineAt: now + CLIENT_SERVER_PEER_DEADLINE_MS
1448
+ };
1449
+ this.clientServerServerPeers.set(key, peer);
1450
+ let clients = this.clientServerAdmittedClients.get(channelName);
1451
+ if (clients === undefined) {
1452
+ clients = new Set();
1453
+ this.clientServerAdmittedClients.set(channelName, clients);
1454
+ }
1455
+ clients.add(routingId);
1456
+ this.ensureClientServerLivenessTimer();
1457
+ }
1458
+
1459
+ private requestClientServerServerLiveness(
1460
+ peer: {
1461
+ readonly channelName: string;
1462
+ readonly routingId: RoutingId;
1463
+ readonly physicalConnectionId: symbol;
1464
+ outstandingProbeId?: bigint;
1465
+ deadlineAt: number;
1466
+ },
1467
+ probeId: bigint
1468
+ ): void {
1469
+ const router = this.channelRouters.get(peer.channelName);
1470
+ if (router === undefined) return;
1471
+ const message = RuntimeMessage.from(encodeClientServerLivenessProbe(probeId));
1472
+ void router.send(peer.routingId, message)
1473
+ .catch((error) => this.oneWayFailureSink?.(error))
1474
+ .finally(() => message.close());
1475
+ }
1476
+
1477
+ private acceptClientServerServerLivenessAck(
1478
+ channelName: string,
1479
+ routingId: RoutingId,
1480
+ probeId: bigint
1481
+ ): boolean {
1482
+ const peer = this.clientServerServerPeers.get(
1483
+ clientServerServerPeerKey(channelName, routingId)
1484
+ );
1485
+ if (peer === undefined || peer.outstandingProbeId !== probeId) return false;
1486
+ peer.outstandingProbeId = undefined;
1487
+ peer.deadlineAt = performance.now() + CLIENT_SERVER_PEER_DEADLINE_MS;
1488
+ return true;
1489
+ }
1490
+
1491
+ private reportStaleClientServerLivenessAck(
1492
+ channelName: string,
1493
+ peer: string,
1494
+ probeId: bigint
1495
+ ): void {
1496
+ this.oneWayFailureSink?.(createInternalFrameworkException(
1497
+ ZLinkFrameworkInternalErrorKind.RequestProtocolError,
1498
+ `ClientServer '${channelName}' ignored stale or duplicate liveness ACK '${probeId}' from '${peer}'.`,
1499
+ false
1500
+ ));
1501
+ }
1502
+
1503
+ private pushClientServerDescriptorUpdate(
1504
+ channelName: string,
1505
+ descriptor: ZLinkClientServerServerDescriptor
1506
+ ): void {
1507
+ const router = this.channelRouters.get(channelName);
1508
+ const clients = this.clientServerAdmittedClients.get(channelName);
1509
+ if (router === undefined || clients === undefined) return;
1510
+ for (const routingId of [...clients]) {
1511
+ const peer = this.clientServerServerPeers.get(
1512
+ clientServerServerPeerKey(channelName, routingId)
1513
+ );
1514
+ if (peer === undefined) {
1515
+ clients.delete(routingId);
1516
+ continue;
1517
+ }
1518
+ const message = RuntimeMessage.from(encodeClientServerUpdate(
1519
+ descriptor,
1520
+ peer.normalizedEffectiveMaxMessageBytes
1521
+ ));
1522
+ void router.send(routingId, message)
1523
+ .catch((error) => {
1524
+ clients.delete(routingId);
1525
+ this.oneWayFailureSink?.(error);
1526
+ })
1527
+ .finally(() => message.close());
1528
+ }
1529
+ }
1530
+
1531
+ private allocateClientServerProbeId(): bigint {
1532
+ const result = this.nextClientServerProbeId;
1533
+ this.nextClientServerProbeId = result === 0xffff_ffff_ffff_ffffn ? 1n : result + 1n;
1534
+ return result;
1535
+ }
1536
+
1537
+ publisher(channelName: string): ZLinkBackendPublisherSocket {
1538
+ const existing = this.publishers.get(channelName);
1539
+ if (existing !== undefined) {
1540
+ return existing;
1541
+ }
1542
+
1543
+ const channel = this.registration.channels.get(channelName);
1544
+ if (channel?.publisher === undefined) {
1545
+ throw new ZLinkConfigurationException(`Channel publisher '${channelName}' is not registered.`);
1546
+ }
1547
+ if (channel.publisher.bind === undefined) {
1548
+ throw new ZLinkConfigurationException(`Channel publisher '${channelName}' does not define a bind endpoint.`);
1549
+ }
1550
+
1551
+ const publisher = this.adapter.createPublisherSocket(this.context);
1552
+ publisher.setChannelName(channelName);
1553
+ publisher.bind(channel.publisher.bind);
1554
+ this.publishers.set(channelName, publisher);
1555
+ this.fanoutPublisherNextBeacon.set(
1556
+ channelName,
1557
+ performance.now() + CLIENT_SERVER_PROBE_INTERVAL_MS
1558
+ );
1559
+ this.ensureClientServerLivenessTimer();
1560
+ return publisher;
1561
+ }
1562
+
1563
+ fanoutPublisherEndpoint(channelName: string): string | undefined {
1564
+ const channel = this.registration.channels.get(channelName);
1565
+ const publisher = this.publishers.get(channelName);
1566
+ const boundEndpoint = publisher?.lastEndpoint;
1567
+ if (channel?.publisher === undefined || boundEndpoint === undefined || boundEndpoint.length === 0) {
1568
+ return undefined;
1569
+ }
1570
+ return advertisedEndpoint(boundEndpoint, channel.publisher.advertiseHost);
1571
+ }
1572
+
1573
+ routeRouter(routerChannelId: string): ZLinkBackendRouterSocket {
1574
+ const existing = this.routeRouters.get(routerChannelId);
1575
+ if (existing !== undefined) {
1576
+ return existing;
1577
+ }
1578
+
1579
+ const routeChannel = this.registration.routeChannelOptions.get(routerChannelId);
1580
+ if (routeChannel === undefined) {
1581
+ throw new ZLinkConfigurationException(`Route channel '${routerChannelId}' is not registered.`);
1582
+ }
1583
+ const router = this.adapter.createRouterSocket(this.context);
1584
+ this.registerReceiveFlowSocket(router);
1585
+ router.setChannelName(routerChannelId);
1586
+ if (
1587
+ (routeChannel.manualConnections?.length ?? 0) > 0 &&
1588
+ typeof router.setProbe === 'function'
1589
+ ) {
1590
+ router.setProbe(true);
1591
+ }
1592
+ router.setRoutingId(
1593
+ routeChannel.routingId
1594
+ ?? `${routeChannel.routingIdPrefix ?? routerChannelId}-${randomUUID()}`
1595
+ );
1596
+ const publicWeight = routeChannel.weight ?? 100;
1597
+ this.routeMeshPublicWeights.set(routerChannelId, publicWeight);
1598
+ router.peerWeight = rawAvailabilityWeight(publicWeight);
1599
+ applySocketConfig(router, routeChannel);
1600
+ this.trackRouteMonitor(routerChannelId, router);
1601
+ if ((routeChannel.manualConnections ?? []).length > 0) {
1602
+ for (const endpoint of routeChannel.manualConnections ?? []) {
1603
+ router.connect(endpoint);
1604
+ }
1605
+ }
1606
+ attachEndpointConnections(routeChannel, router);
1607
+ if (routeChannel.bind !== undefined && routeChannel.bind.trim().length > 0) {
1608
+ router.bind(routeChannel.bind);
1609
+ }
1610
+ this.routeRouters.set(routerChannelId, router);
1611
+ return router;
1612
+ }
1613
+
1614
+ routeMeshSocket(routerChannelId: string): ZLinkBackendRouterSocket {
1615
+ return this.routeRouter(routerChannelId);
1616
+ }
1617
+
1618
+ routeMeshWeight(routerChannelId: string): number {
1619
+ this.routeRouter(routerChannelId);
1620
+ return this.routeMeshPublicWeights.get(routerChannelId) ?? 100;
1621
+ }
1622
+
1623
+ setRouteMeshWeight(routerChannelId: string, weight: number): void {
1624
+ requirePublicWeight(weight);
1625
+ const router = this.routeRouter(routerChannelId);
1626
+ this.routeMeshPublicWeights.set(routerChannelId, weight);
1627
+ router.peerWeight = rawAvailabilityWeight(weight);
1628
+ }
1629
+
1630
+ private registerReceiveFlowSocket(socket: ReceiveFlowSocket): void {
1631
+ this.applicationJobQueue?.registerReceiveFlowTarget(
1632
+ socket,
1633
+ state => socket.setReceiveFlowState(state === 'paused' ? 1 : 0),
1634
+ this.oneWayFailureSink
1635
+ );
1636
+ }
1637
+
1638
+ private unregisterReceiveFlowSocket(socket: ReceiveFlowSocket): void {
1639
+ this.applicationJobQueue?.unregisterReceiveFlowTarget(socket);
1640
+ }
1641
+
1642
+ routeMemberStatus(routerChannelId: string, targetNodeRid: string): 'unknown' | 'missing' | 'connected' | 'disconnected' {
1643
+ return this.routeMembers.status(routerChannelId, targetNodeRid);
1644
+ }
1645
+
1646
+ monitorDisconnects(
1647
+ socket: ZLinkBackendDealerSocket | ZLinkBackendSubscriberSocket,
1648
+ handler: (endpoint: string) => void
1649
+ ): void {
1650
+ if (this.monitoringAdapter === undefined) {
1651
+ return;
1652
+ }
1653
+ const monitor = this.monitoringAdapter.openSocketMonitor(socket);
1654
+ this.ownedMonitors.add(monitor);
1655
+ monitor.onEvent((event) => {
1656
+ if (event.nativeEvent === ZLinkSocketNativeEventType.Disconnected && event.remoteAddr.length > 0) {
1657
+ handler(event.remoteAddr);
1658
+ }
1659
+ });
1660
+ }
1661
+
1662
+ private trackRouteMonitor(routerChannelId: string, router: ZLinkBackendRouterSocket): void {
1663
+ if (this.monitoringAdapter === undefined) {
1664
+ return;
1665
+ }
1666
+ const monitor = this.monitoringAdapter.openSocketMonitor(router);
1667
+ this.ownedMonitors.add(monitor);
1668
+ monitor.onEvent((event) => {
1669
+ const routingId = event.routingId === undefined ? undefined : String(event.routingId);
1670
+ if (event.nativeEvent === ZLinkSocketNativeEventType.ConnectionReady && routingId !== undefined) {
1671
+ this.routeMembers.observeReady(routerChannelId, routingId, event.remoteAddr);
1672
+ return;
1673
+ }
1674
+ if (
1675
+ event.nativeEvent !== ZLinkSocketNativeEventType.Disconnected
1676
+ && event.nativeEvent !== ZLinkSocketNativeEventType.Closed
1677
+ ) return;
1678
+ this.routeMembers.observeTermination(routerChannelId, routingId, event.remoteAddr);
1679
+ });
1680
+ }
1681
+ }
1682
+
1683
+ function manualClientServerConnectionId(channelName: string, endpoint: string): string {
1684
+ return `manual:${channelName.length}:${channelName}:${endpoint.length}:${endpoint}`;
1685
+ }
1686
+
1687
+ function localClientServerConnectionId(channelName: string): string {
1688
+ return `local:${channelName.length}:${channelName}`;
1689
+ }
1690
+
1691
+ function clientServerServerPeerKey(channelName: string, routingId: RoutingId): string {
1692
+ return `${channelName.length}:${channelName}:${String(routingId)}`;
1693
+ }
1694
+
1695
+ async function requestClientServerAdmission(
1696
+ dealer: ZLinkBackendDealerSocket,
1697
+ channelName: string,
1698
+ securityIdentity: string,
1699
+ timeoutMs: number
1700
+ ): Promise<ZLinkClientServerAdmission> {
1701
+ const message = RuntimeMessage.from(encodeClientServerHello({
1702
+ channelName,
1703
+ securityIdentity,
1704
+ normalizedEffectiveMaxMessageBytes: normalizedMessageLimit(dealer.maxMessageSize)
1705
+ }));
1706
+ try {
1707
+ const parts = await dealer.request(message, timeoutMs);
1708
+ try {
1709
+ if (parts.length !== 1) {
1710
+ throw new ZLinkConfigurationException(
1711
+ `ClientServer '${channelName}' admission request returned an invalid reply.`
1712
+ );
1713
+ }
1714
+ const record = decodeClientServerControl(parts[0]!.data());
1715
+ if (record.kind === 'reject') {
1716
+ throw new ZLinkConfigurationException(
1717
+ `ClientServer '${channelName}' admission was rejected (${record.reason}).`
1718
+ );
1719
+ }
1720
+ if (record.kind !== 'admit') {
1721
+ throw new ZLinkConfigurationException(
1722
+ `ClientServer '${channelName}' admission reply has an invalid command.`
1723
+ );
1724
+ }
1725
+ return record.admission;
1726
+ } finally {
1727
+ closeMessages(parts);
1728
+ }
1729
+ } finally {
1730
+ message.close();
1731
+ }
1732
+ }
1733
+
1734
+ function admissionToDiscoveryDescriptor(admission: ZLinkClientServerAdmission) {
1735
+ return {
1736
+ channelName: admission.channelName,
1737
+ serverRoutingId: admission.serverRid,
1738
+ lifecycleGeneration: admission.lifecycleGeneration,
1739
+ descriptorRevision: admission.descriptorRevision,
1740
+ weight: admission.weight,
1741
+ state: discoveryAvailabilityForRuntimeState(admission.state),
1742
+ securityIdentity: admission.securityIdentity,
1743
+ effectiveMaxMessageBytes: admission.normalizedEffectiveMaxMessageBytes,
1744
+ advertisedEndpoint: admission.advertisedEndpoint
1745
+ };
1746
+ }
1747
+
1748
+ function sameClientServerDiscoveryDescriptor(
1749
+ left: ClientServerDiscoveryDescriptor,
1750
+ right: ClientServerDiscoveryDescriptor
1751
+ ): boolean {
1752
+ return left.channelName === right.channelName
1753
+ && left.serverRoutingId === right.serverRoutingId
1754
+ && left.lifecycleGeneration === right.lifecycleGeneration
1755
+ && left.descriptorRevision === right.descriptorRevision
1756
+ && left.weight === right.weight
1757
+ && left.state === right.state
1758
+ && left.securityIdentity === right.securityIdentity
1759
+ && left.effectiveMaxMessageBytes === right.effectiveMaxMessageBytes
1760
+ && left.advertisedEndpoint === right.advertisedEndpoint;
1761
+ }
1762
+
1763
+ function closeMessages(parts: readonly Message[]): void {
1764
+ for (const part of parts) part.close();
1765
+ }
1766
+
1767
+ function deriveRoutingId(baseRoutingId: string, suffix: string): string {
1768
+ const derived = `${baseRoutingId}\0${suffix}`;
1769
+ if (Buffer.byteLength(derived, 'utf8') > 255) {
1770
+ throw new ZLinkConfigurationException(
1771
+ `Derived routing id with suffix '${suffix}' exceeds the 255 byte limit.`
1772
+ );
1773
+ }
1774
+ return derived;
1775
+ }
1776
+
1777
+ function fanoutDiscoveryConnectionId(connectionId: string): string {
1778
+ return `fanout:${connectionId.replaceAll('\0', '/')}`;
1779
+ }
1780
+
1781
+ function newLifecycleGeneration(): bigint {
1782
+ for (;;) {
1783
+ const value = randomBytes(8).readBigUInt64BE() & MAX_LIFECYCLE_GENERATION;
1784
+ if (value !== 0n) return value;
1785
+ }
1786
+ }
1787
+
1788
+ function advertisedEndpoint(boundEndpoint: string, advertiseHost: string | undefined): string {
1789
+ const result = buildAdvertisedEndpoint(boundEndpoint, advertiseHost, 'tcp');
1790
+ if (result === undefined) {
1791
+ throw new ZLinkConfigurationException(
1792
+ `ClientServer advertised host requires a TCP endpoint, received '${boundEndpoint}'.`
1793
+ );
1794
+ }
1795
+ return result;
1796
+ }
1797
+
1798
+ function normalizedMessageLimit(value: number): number {
1799
+ return Number.isSafeInteger(value) && value > 0
1800
+ ? Math.min(value, 0xffff_ffff)
1801
+ : 0x7fff_ffff;
1802
+ }
1803
+
1804
+ function requirePublicWeight(weight: number): void {
1805
+ if (!Number.isInteger(weight) || weight < 0 || weight > 10_000) {
1806
+ throw new ZLinkConfigurationException('Weight must be an integer in 0..10000.');
1807
+ }
1808
+ }
1809
+
1810
+ function rawAvailabilityWeight(weight: number): number {
1811
+ // Core raw peer weight remains a transport availability signal in 0..100.
1812
+ // Framework descriptors and selectors retain the exact public weight.
1813
+ return weight === 0 ? 0 : 100;
1814
+ }
1815
+
1816
+ function applySocketConfig(
1817
+ socket: ZLinkBackendDealerSocket | ZLinkBackendRouterSocket,
1818
+ config: {
1819
+ readonly sendHighWaterMark?: number;
1820
+ readonly receiveHighWaterMark?: number;
1821
+ readonly sendTimeoutMs?: number;
1822
+ readonly maxMessageSize?: number;
1823
+ }
1824
+ ): void {
1825
+ if (config.sendHighWaterMark !== undefined) {
1826
+ socket.sendHighWaterMark = config.sendHighWaterMark;
1827
+ }
1828
+ if (config.receiveHighWaterMark !== undefined) {
1829
+ socket.receiveHighWaterMark = config.receiveHighWaterMark;
1830
+ }
1831
+ if (config.sendTimeoutMs !== undefined) {
1832
+ socket.sendTimeoutMs = config.sendTimeoutMs;
1833
+ }
1834
+ if (config.maxMessageSize !== undefined) {
1835
+ socket.maxMessageSize = config.maxMessageSize;
1836
+ }
1837
+ }