@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,1771 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import type {
3
+ ZLinkRawBindingPort,
4
+ ZLinkRawHostPort,
5
+ ZLinkRawMonitorRecord,
6
+ ZLinkRawMonitorPort,
7
+ ZLinkRawReceivedRecord,
8
+ ZLinkRawRouterPort
9
+ } from '../backend/raw-binding-port';
10
+ import { RequestResult } from '../backend/runtime-values';
11
+ import type {
12
+ ApplicationJobPermitPort,
13
+ ApplicationJobQueuePort
14
+ } from '../application-jobs/contracts';
15
+ import {
16
+ ApplicationIngressRecordOwner
17
+ } from '../application-jobs/application-ingress-record-owner';
18
+ import { OperationRegistry, type PendingOperation } from './operation-registry';
19
+ import { ServiceLivenessRegistry, type ServiceLivenessTick } from './service-liveness-registry';
20
+ import { ServiceMailbox, type ServiceMailboxLimits, type ServiceMailboxRecord } from './service-mailbox';
21
+ import {
22
+ ServiceTopologyRegistry,
23
+ sameServiceNodeDescriptor,
24
+ validateDescriptor,
25
+ type AdmittedServicePeer,
26
+ type PeerAdmissionResult,
27
+ type ServicePeerAdmissionExpectation,
28
+ type ServiceNodeDescriptor
29
+ } from './service-topology-registry';
30
+ import {
31
+ decodeApplicationPayload,
32
+ decodeChannelRequestHeader,
33
+ decodeChannelSendHeader,
34
+ decodeHeader,
35
+ decodeNodeRequestHeader,
36
+ decodeReject,
37
+ decodeReplyHeader,
38
+ decodeRouteMeshAdmission,
39
+ encodeApplicationPayload,
40
+ encodeChannelRequestHeader,
41
+ encodeChannelSendHeader,
42
+ encodeNodeRequestHeader,
43
+ encodeNodeSendHeader,
44
+ encodeReject,
45
+ encodeReplyHeader,
46
+ encodeRouteMeshAdmission,
47
+ M6aServiceWireCommand,
48
+ type ServiceApplicationPayload,
49
+ ServiceWireProtocolError
50
+ } from './service-wire-m6a-codec';
51
+ import { createServiceWireCodec } from './service-wire-codec';
52
+ import {
53
+ ServiceWireCommand,
54
+ ServiceWireFrameworkErrorCode
55
+ } from './service-wire-constants.generated';
56
+
57
+ export type RawServicePumpResult =
58
+ | 'noData'
59
+ | 'infrastructure'
60
+ | 'application'
61
+ | 'dropped'
62
+ | 'protocolError';
63
+
64
+ export type RawServicePumpObserver = (
65
+ sourceRoutingId: string,
66
+ byteCount: number
67
+ ) => void;
68
+
69
+ export interface RawServiceRequestResult {
70
+ readonly terminalResult: number;
71
+ readonly failureCode: number;
72
+ readonly payload?: ServiceApplicationPayload;
73
+ }
74
+
75
+ export interface RawServiceIngressRecord {
76
+ readonly command: number;
77
+ readonly flags: number;
78
+ readonly sourceRoutingId: string;
79
+ readonly sourceNodeGeneration?: bigint;
80
+ readonly sourceRoute?: Uint8Array;
81
+ readonly requestSequence?: bigint;
82
+ readonly reply?: (parts: readonly Uint8Array[]) => void;
83
+ readonly parts: readonly Buffer[];
84
+ readonly applicationJobOwner?: ApplicationIngressRecordOwner;
85
+ }
86
+
87
+ export type RawServiceIngressHandler = (
88
+ record: RawServiceIngressRecord
89
+ ) => RawServicePumpResult | undefined | Promise<RawServicePumpResult | undefined>;
90
+
91
+ export interface RawServiceMeshRuntimeOptions {
92
+ readonly descriptor: ServiceNodeDescriptor;
93
+ readonly resolveAdvertisedEndpoint?: (boundEndpoint: string) => string;
94
+ readonly mailbox?: Partial<ServiceMailboxLimits>;
95
+ readonly probeIntervalMs?: number;
96
+ readonly peerTimeoutMs?: number;
97
+ readonly bindingPort: ZLinkRawBindingPort;
98
+ readonly applicationJobQueue?: ApplicationJobQueuePort;
99
+ readonly peerAdmissionSealed?: () => boolean;
100
+ readonly onReceiveFlowConfigFailure?: (error: unknown) => void;
101
+ readonly onMailboxReady?: (domain: 'application' | 'infrastructure') => void;
102
+ readonly onPeerNotRequired?: (
103
+ nodeRoutingId: string,
104
+ endpoint: string
105
+ ) => void;
106
+ readonly onPeerDisconnected?: (
107
+ nodeRoutingId: string,
108
+ endpoint: string,
109
+ lifecycleGeneration: bigint
110
+ ) => void;
111
+ readonly onProtocolError?: (record: {
112
+ readonly sourceRoutingId: string;
113
+ readonly request: boolean;
114
+ readonly replied: boolean;
115
+ readonly command?: number;
116
+ }) => void;
117
+ }
118
+
119
+ const MONITOR_DISCONNECTED = 0x0200;
120
+ const MONITOR_CONNECTION_READY = 0x1000;
121
+ const MONITOR_CONNECTION_READY_EDGE = 1;
122
+ // Framework error code 13 (RequestTargetNotFound) is encoded as 14 on a
123
+ // RequestResult.NotFound reply. Boundary transport results keep failureCode 0.
124
+ const REQUEST_TARGET_NOT_FOUND_FAILURE_CODE = 14;
125
+ type PhysicalConnectionDirection = 'inbound' | 'outbound' | 'unknown';
126
+
127
+ interface PhysicalConnectionCandidate {
128
+ readonly connectionId: string;
129
+ readonly direction: PhysicalConnectionDirection;
130
+ readonly discriminator: string;
131
+ readonly localAddress: string;
132
+ readonly remoteAddress: string;
133
+ }
134
+
135
+ const livenessCodec = createServiceWireCodec({
136
+ magic: [0x5a, 0x4d],
137
+ major: 1,
138
+ commands: M6aServiceWireCommand
139
+ });
140
+
141
+ const MAX_PENDING_MONITOR_EVENTS = 8192;
142
+ const MAX_UNRESOLVED_CONNECTION_CANDIDATES = 4096;
143
+
144
+ /**
145
+ * RouteMesh M6A runtime built only on the public raw binding package.
146
+ * It owns protocol, admission, mailbox, request and liveness state.
147
+ */
148
+ export class RawServiceMeshRuntime {
149
+ readonly topology: ServiceTopologyRegistry;
150
+ readonly mailbox: ServiceMailbox;
151
+ readonly liveness: ServiceLivenessRegistry;
152
+
153
+ private readonly operations = new OperationRegistry<RawServiceRequestResult>();
154
+ private readonly expectedPeers = new Map<string, {
155
+ readonly meshName: string;
156
+ readonly nodeRoutingId: string;
157
+ readonly endpoint?: string;
158
+ readonly securityIdentity?: string;
159
+ readonly lifecycleGeneration?: bigint;
160
+ }>();
161
+ private readonly endpointOnlyPeers = new Set<string>();
162
+ private readonly peerConnectionIntentRemoved = new Set<(nodeRoutingId: string) => void>();
163
+ private readonly connectionCandidates = new Map<
164
+ string,
165
+ Map<string, PhysicalConnectionCandidate>
166
+ >();
167
+ private readonly unresolvedConnectionCandidates: PhysicalConnectionCandidate[] = [];
168
+ private readonly connectionIds = new Map<string, string>();
169
+ /**
170
+ * The monitor drain updates this fence before the event reaches the
171
+ * normal runtime handler. `null` means that the last observed pair is no
172
+ * longer usable by the application route.
173
+ */
174
+ private readonly monitorConnectionStates = new Map<string, string | null>();
175
+ private monitorEvents: ZLinkRawMonitorRecord[] = [];
176
+ private monitorDrainBuffer: ZLinkRawMonitorRecord[] = [];
177
+ private readonly bindingPort: ZLinkRawBindingPort;
178
+ private readonly applicationJobQueue: ApplicationJobQueuePort;
179
+ private readonly peerAdmissionSealed?: () => boolean;
180
+ private readonly applicationJobStop = new AbortController();
181
+ private readonly onPeerNotRequired?: RawServiceMeshRuntimeOptions['onPeerNotRequired'];
182
+ private readonly onPeerDisconnected?: RawServiceMeshRuntimeOptions['onPeerDisconnected'];
183
+ private readonly onProtocolError?: RawServiceMeshRuntimeOptions['onProtocolError'];
184
+ private readonly onReceiveFlowConfigFailure?:
185
+ RawServiceMeshRuntimeOptions['onReceiveFlowConfigFailure'];
186
+ private readonly resolveAdvertisedEndpoint?: RawServiceMeshRuntimeOptions['resolveAdvertisedEndpoint'];
187
+ private descriptor: ServiceNodeDescriptor;
188
+ private host?: ZLinkRawHostPort;
189
+ private router?: ZLinkRawRouterPort;
190
+ private monitor?: ZLinkRawMonitorPort;
191
+ private nextCorrelation = 1n;
192
+ private serviceIngress?: RawServiceIngressHandler;
193
+ private closed = false;
194
+
195
+ constructor(options: RawServiceMeshRuntimeOptions) {
196
+ this.descriptor = options.descriptor;
197
+ this.topology = new ServiceTopologyRegistry(options.descriptor);
198
+ this.mailbox = new ServiceMailbox(undefined, options.onMailboxReady);
199
+ this.liveness = new ServiceLivenessRegistry(options.probeIntervalMs, options.peerTimeoutMs);
200
+ this.bindingPort = options.bindingPort;
201
+ if (options.applicationJobQueue === undefined) {
202
+ throw new TypeError('Raw service runtime requires the host Application Job Queue.');
203
+ }
204
+ this.applicationJobQueue = options.applicationJobQueue;
205
+ this.peerAdmissionSealed = options.peerAdmissionSealed;
206
+ this.onPeerNotRequired = options.onPeerNotRequired;
207
+ this.onPeerDisconnected = options.onPeerDisconnected;
208
+ this.onProtocolError = options.onProtocolError;
209
+ this.onReceiveFlowConfigFailure = options.onReceiveFlowConfigFailure;
210
+ this.resolveAdvertisedEndpoint = options.resolveAdvertisedEndpoint;
211
+ }
212
+
213
+ start(): void {
214
+ if (this.router !== undefined) return;
215
+ if (this.closed) throw new Error('Raw service runtime cannot restart after close.');
216
+ const host = this.bindingPort.createHost();
217
+ let router: ZLinkRawRouterPort | undefined;
218
+ try {
219
+ router = host.createRouter();
220
+ const receiveFlowRouter = router;
221
+ router.setRoutingId(this.descriptor.nodeRoutingId);
222
+ this.applicationJobQueue.registerReceiveFlowTarget?.(
223
+ router,
224
+ state => receiveFlowRouter.setReceiveFlowState(state),
225
+ this.onReceiveFlowConfigFailure
226
+ );
227
+ router.bind(this.descriptor.advertisedEndpoint);
228
+ const boundEndpoint = router.localEndpoint();
229
+ const next = {
230
+ ...this.descriptor,
231
+ advertisedEndpoint: this.resolveAdvertisedEndpoint?.(boundEndpoint)
232
+ ?? boundEndpoint,
233
+ descriptorRevision: this.descriptor.descriptorRevision + 1n,
234
+ state: 'serving' as const
235
+ };
236
+ this.topology.publishLocal(next);
237
+ this.descriptor = next;
238
+ this.monitor = router.monitor();
239
+ this.pullMonitorEvents();
240
+ this.host = host;
241
+ this.router = router;
242
+ } catch (error) {
243
+ if (router !== undefined) {
244
+ this.applicationJobQueue.unregisterReceiveFlowTarget?.(router);
245
+ }
246
+ host.close();
247
+ throw error;
248
+ }
249
+ }
250
+
251
+ connectPeer(endpoint: string, expected: ServiceNodeDescriptor): void {
252
+ this.requireStarted().connectToRoutingId(expected.nodeRoutingId, endpoint);
253
+ this.expectedPeers.set(expected.nodeRoutingId, {
254
+ meshName: expected.meshName,
255
+ nodeRoutingId: expected.nodeRoutingId,
256
+ endpoint,
257
+ securityIdentity: expected.securityIdentity,
258
+ lifecycleGeneration: expected.lifecycleGeneration
259
+ });
260
+ }
261
+
262
+ connectPeerByRoutingId(
263
+ endpoint: string,
264
+ nodeRoutingId: string,
265
+ securityIdentity?: string,
266
+ lifecycleGeneration?: bigint
267
+ ): void {
268
+ this.requireStarted().connectToRoutingId(nodeRoutingId, endpoint);
269
+ this.expectedPeers.set(nodeRoutingId, {
270
+ meshName: this.topology.localDescriptor().meshName,
271
+ nodeRoutingId,
272
+ endpoint,
273
+ securityIdentity,
274
+ lifecycleGeneration
275
+ });
276
+ }
277
+
278
+ expectPeerByRoutingId(
279
+ endpoint: string,
280
+ nodeRoutingId: string,
281
+ securityIdentity?: string,
282
+ lifecycleGeneration?: bigint
283
+ ): void {
284
+ this.expectedPeers.set(nodeRoutingId, {
285
+ meshName: this.topology.localDescriptor().meshName,
286
+ nodeRoutingId,
287
+ endpoint,
288
+ securityIdentity,
289
+ lifecycleGeneration
290
+ });
291
+ }
292
+
293
+ connectPeerEndpoint(endpoint: string): void {
294
+ this.requireStarted().connect(endpoint);
295
+ this.endpointOnlyPeers.add(endpoint);
296
+ }
297
+
298
+ disconnectPeer(
299
+ endpoint: string,
300
+ nodeRoutingId: string,
301
+ lifecycleGeneration?: bigint
302
+ ): void {
303
+ const current = this.topology.peer(nodeRoutingId);
304
+ const expected = this.expectedPeers.get(nodeRoutingId);
305
+ if (
306
+ lifecycleGeneration !== undefined
307
+ && (
308
+ // Discovery has already fenced this RID to a replacement process.
309
+ // The old auto-connect intent must not use disconnectRid here: that
310
+ // is RID-wide and can close the provisional replacement before its
311
+ // Hello/admission promotes it. admitPeer owns exact old-pair teardown
312
+ // after the replacement descriptor is accepted.
313
+ (
314
+ expected?.lifecycleGeneration !== undefined
315
+ && expected.lifecycleGeneration !== lifecycleGeneration
316
+ )
317
+ ||
318
+ (
319
+ current !== undefined
320
+ && current.descriptor.lifecycleGeneration !== lifecycleGeneration
321
+ )
322
+ || (
323
+ current === undefined
324
+ && expected?.lifecycleGeneration !== lifecycleGeneration
325
+ )
326
+ )
327
+ ) {
328
+ return;
329
+ }
330
+ try {
331
+ const router = this.requireStarted();
332
+ if (router.disconnectRid !== undefined) {
333
+ router.disconnectRid(nodeRoutingId);
334
+ } else {
335
+ router.disconnect(endpoint);
336
+ }
337
+ } catch (error) {
338
+ if (!isAlreadyDisconnectedError(error)) throw error;
339
+ } finally {
340
+ if (current !== undefined) this.removePeer(current);
341
+ this.topology.forgetNotRequired(nodeRoutingId);
342
+ if (
343
+ lifecycleGeneration === undefined
344
+ || expected?.lifecycleGeneration === undefined
345
+ || expected.lifecycleGeneration === lifecycleGeneration
346
+ ) {
347
+ this.expectedPeers.delete(nodeRoutingId);
348
+ }
349
+ this.notifyPeerConnectionIntentRemoved(nodeRoutingId);
350
+ }
351
+ }
352
+
353
+ disconnectPeerEndpoint(endpoint: string): void {
354
+ try {
355
+ this.requireStarted().disconnect(endpoint);
356
+ } catch (error) {
357
+ if (!isAlreadyDisconnectedError(error)) throw error;
358
+ } finally {
359
+ this.endpointOnlyPeers.delete(endpoint);
360
+ const removed = new Set<string>();
361
+ for (const [nodeRoutingId, expected] of this.expectedPeers) {
362
+ if (expected.endpoint === endpoint) {
363
+ this.expectedPeers.delete(nodeRoutingId);
364
+ removed.add(nodeRoutingId);
365
+ }
366
+ }
367
+ for (const peer of this.topology.peers()) {
368
+ if (peer.descriptor.advertisedEndpoint === endpoint) {
369
+ this.removePeer(peer);
370
+ removed.add(peer.descriptor.nodeRoutingId);
371
+ }
372
+ }
373
+ for (const nodeRoutingId of removed) this.notifyPeerConnectionIntentRemoved(nodeRoutingId);
374
+ }
375
+ }
376
+
377
+ observePeerConnectionIntentRemoved(listener: (nodeRoutingId: string) => void): () => void {
378
+ this.peerConnectionIntentRemoved.add(listener);
379
+ return () => { this.peerConnectionIntentRemoved.delete(listener); };
380
+ }
381
+
382
+ private notifyPeerConnectionIntentRemoved(nodeRoutingId: string): void {
383
+ // Only the logical owner's removal publishes lifecycle termination.
384
+ // A physical disconnect alone retains the connection expectation.
385
+ if (this.expectedPeers.has(nodeRoutingId) || this.topology.peer(nodeRoutingId) !== undefined) return;
386
+ for (const listener of this.peerConnectionIntentRemoved) listener(nodeRoutingId);
387
+ }
388
+
389
+ async announcePeer(nodeRoutingId: string): Promise<boolean> {
390
+ if (!this.expectedPeers.has(nodeRoutingId) || this.peerAdmissionSealed?.() === true) return false;
391
+ return this.send(
392
+ nodeRoutingId,
393
+ [encodeRouteMeshAdmission(M6aServiceWireCommand.hello, this.topology.localDescriptor())]
394
+ );
395
+ }
396
+
397
+ isPeerRouteReady(nodeRoutingId: string, lifecycleGeneration?: bigint): boolean {
398
+ const peer = this.topology.peer(nodeRoutingId);
399
+ const monitorConnection = this.monitorConnectionStates.get(nodeRoutingId);
400
+ const applicationRouteReady = monitorConnection === undefined
401
+ || monitorConnection === peer?.connectionId;
402
+ const ready = peer !== undefined
403
+ && (lifecycleGeneration === undefined
404
+ || peer.descriptor.lifecycleGeneration === lifecycleGeneration)
405
+ && applicationRouteReady
406
+ && this.liveness.isReady(nodeRoutingId, peer.connectionId);
407
+ return ready;
408
+ }
409
+
410
+ async announceExpectedPeers(): Promise<number> {
411
+ let accepted = 0;
412
+ for (const nodeRoutingId of this.expectedPeers.keys()) {
413
+ // Admission is a one-time fence for the current physical connection.
414
+ // Re-sending Hello after the peer is admitted would re-run admission on
415
+ // every poll and reset the liveness record before application traffic
416
+ // can use the route. A disconnected peer is removed by monitor handling
417
+ // and remains eligible for the next admission attempt.
418
+ if (this.topology.peer(nodeRoutingId) !== undefined) continue;
419
+ if (await this.announcePeer(nodeRoutingId)) accepted++;
420
+ }
421
+ return accepted;
422
+ }
423
+
424
+ async updateLocalDescriptor(options: {
425
+ readonly placementWeight?: number;
426
+ readonly channelName?: string;
427
+ readonly channelWeight?: number;
428
+ readonly state?: 'draining';
429
+ }): Promise<void> {
430
+ const current = this.topology.localDescriptor();
431
+ const channels = options.state === 'draining'
432
+ ? current.channels.map(channel => ({ ...channel, weight: 0 }))
433
+ : options.channelName === undefined
434
+ ? current.channels
435
+ : current.channels.map(channel =>
436
+ channel.name === options.channelName
437
+ ? { ...channel, weight: options.channelWeight! }
438
+ : channel);
439
+ const next = {
440
+ ...current,
441
+ descriptorRevision: current.descriptorRevision + 1n,
442
+ state: options.state ?? current.state,
443
+ placementWeight: options.placementWeight ?? current.placementWeight,
444
+ channels
445
+ };
446
+ this.topology.publishLocal(next);
447
+ this.descriptor = next;
448
+ // An admitted peer keeps the descriptor it received at admission. The
449
+ // placement and channel selectors therefore need the new mutable fields
450
+ // on that same connection before the next request is selected; waiting for
451
+ // a reconnect would leave a race where a drained node is selected again.
452
+ const update = encodeRouteMeshAdmission(
453
+ M6aServiceWireCommand.update,
454
+ this.topology.localDescriptor()
455
+ );
456
+ for (const peer of this.topology.peers()) {
457
+ await this.send(peer.descriptor.nodeRoutingId, [update]);
458
+ }
459
+ await this.announceExpectedPeers();
460
+ }
461
+
462
+ replaceDiscoveredNotRequired(
463
+ descriptors: readonly ServiceNodeDescriptor[]
464
+ ): void {
465
+ this.topology.replaceDiscoveredNotRequired(descriptors);
466
+ }
467
+
468
+ isObjectClientNodeDirectTarget(nodeRoutingId: string): boolean {
469
+ const descriptor = nodeRoutingId === this.descriptor.nodeRoutingId
470
+ ? this.topology.localDescriptor()
471
+ : this.topology.knownDescriptor(nodeRoutingId);
472
+ return descriptor?.objectRole === 'client';
473
+ }
474
+
475
+ async sendToNode(
476
+ targetNodeRoutingId: string,
477
+ payload: ServiceApplicationPayload
478
+ ): Promise<boolean> {
479
+ return this.send(
480
+ targetNodeRoutingId,
481
+ [encodeNodeSendHeader(), encodeApplicationPayload(payload)]
482
+ );
483
+ }
484
+
485
+ async sendToChannel(
486
+ channelName: string,
487
+ payload: ServiceApplicationPayload
488
+ ): Promise<boolean> {
489
+ const selected = this.topology.selectChannel(
490
+ channelName,
491
+ peer => this.isLocalOrReadyPeer(peer.descriptor.nodeRoutingId)
492
+ );
493
+ if (selected === undefined) return false;
494
+ if (selected.descriptor.nodeRoutingId === this.descriptor.nodeRoutingId) {
495
+ const applicationJobOwner = await this.reserveLocalIngress();
496
+ try {
497
+ const applicationJob = await applicationJobOwner.acquire('application');
498
+ const accepted = this.mailbox.tryEnqueue({
499
+ owner: `channel:${channelName}`,
500
+ domain: 'application',
501
+ parts: [encodeChannelSendHeader(channelName), encodeApplicationPayload(payload)],
502
+ sourceRoutingId: this.descriptor.nodeRoutingId,
503
+ applicationJob
504
+ });
505
+ if (!accepted) applicationJob.close();
506
+ return accepted;
507
+ } finally {
508
+ applicationJobOwner.close();
509
+ }
510
+ }
511
+ return this.send(selected.descriptor.nodeRoutingId, [
512
+ encodeChannelSendHeader(channelName),
513
+ encodeApplicationPayload(payload)
514
+ ]);
515
+ }
516
+
517
+ requestToNode(
518
+ targetNodeRoutingId: string,
519
+ payload: ServiceApplicationPayload,
520
+ timeoutMs: number
521
+ ): PendingOperation<RawServiceRequestResult> {
522
+ return this.requestToTarget(targetNodeRoutingId, payload, timeoutMs);
523
+ }
524
+
525
+ requestToChannel(
526
+ channelName: string,
527
+ payload: ServiceApplicationPayload,
528
+ timeoutMs: number
529
+ ): PendingOperation<RawServiceRequestResult> | undefined {
530
+ const selected = this.topology.selectChannel(
531
+ channelName,
532
+ peer => this.isLocalOrReadyPeer(peer.descriptor.nodeRoutingId)
533
+ );
534
+ return selected === undefined
535
+ ? undefined
536
+ : this.requestToTarget(selected.descriptor.nodeRoutingId, payload, timeoutMs, channelName);
537
+ }
538
+
539
+ private isLocalOrReadyPeer(nodeRoutingId: string): boolean {
540
+ return nodeRoutingId === this.descriptor.nodeRoutingId
541
+ || this.isPeerRouteReady(nodeRoutingId);
542
+ }
543
+
544
+ setServiceIngress(handler: RawServiceIngressHandler): void {
545
+ if (this.serviceIngress !== undefined && this.serviceIngress !== handler) {
546
+ throw new Error('Raw service ingress is already registered.');
547
+ }
548
+ this.serviceIngress = handler;
549
+ }
550
+
551
+ async reserveLocalIngress(
552
+ signal?: AbortSignal
553
+ ): Promise<ApplicationIngressRecordOwner> {
554
+ const waitSignal = signal === undefined
555
+ ? this.applicationJobStop.signal
556
+ : AbortSignal.any([this.applicationJobStop.signal, signal]);
557
+ const permit = await this.applicationJobQueue.acquire(waitSignal);
558
+ return ApplicationIngressRecordOwner.create(
559
+ this.applicationJobQueue,
560
+ permit,
561
+ { close() {} }
562
+ );
563
+ }
564
+
565
+ async sendService(
566
+ targetNodeRoutingId: string,
567
+ parts: readonly Uint8Array[]
568
+ ): Promise<boolean> {
569
+ return this.send(targetNodeRoutingId, parts);
570
+ }
571
+
572
+ requestService(
573
+ targetNodeRoutingId: string,
574
+ parts: readonly Uint8Array[],
575
+ timeoutMs: number
576
+ ): Promise<readonly Buffer[]> {
577
+ return this.requireStarted().request(targetNodeRoutingId, parts, timeoutMs);
578
+ }
579
+
580
+ replyService(
581
+ record: Pick<
582
+ RawServiceIngressRecord,
583
+ 'sourceRoutingId' | 'sourceRoute' | 'requestSequence' | 'reply'
584
+ >,
585
+ parts: readonly Uint8Array[]
586
+ ): void {
587
+ if (record.requestSequence === undefined) {
588
+ throw new TypeError('Service reply requires a request sequence.');
589
+ }
590
+ if (record.reply === undefined) {
591
+ throw new TypeError('Service reply requires an opaque reply capability.');
592
+ }
593
+ record.reply(parts);
594
+ }
595
+
596
+ reply(
597
+ request: ServiceMailboxRecord,
598
+ payload: ServiceApplicationPayload,
599
+ terminalResult = 0,
600
+ failureCode = 0
601
+ ): void {
602
+ if (request.localReply !== undefined) {
603
+ request.localReply(
604
+ terminalResult,
605
+ failureCode,
606
+ terminalResult === 0 ? payload : undefined
607
+ );
608
+ return;
609
+ }
610
+ if (request.reply === undefined || request.correlation === undefined) {
611
+ throw new TypeError('Reply requires a request mailbox record.');
612
+ }
613
+ request.reply([
614
+ encodeReplyHeader(request.correlation, terminalResult, failureCode),
615
+ ...(terminalResult === 0 ? [encodeApplicationPayload(payload)] : [])
616
+ ]);
617
+ }
618
+
619
+ async pumpOne(
620
+ nowMs = performance.now(),
621
+ observe?: RawServicePumpObserver
622
+ ): Promise<RawServicePumpResult> {
623
+ const router = this.requireStarted();
624
+ this.pullMonitorEvents();
625
+ let permit: ApplicationJobPermitPort;
626
+ try {
627
+ permit = await this.applicationJobQueue.acquire(this.applicationJobStop.signal);
628
+ } catch (error) {
629
+ if (this.closed || this.applicationJobStop.signal.aborted) return 'noData';
630
+ throw error;
631
+ }
632
+ let received: ZLinkRawReceivedRecord | undefined;
633
+ try {
634
+ received = router.receive(true);
635
+ } catch (error) {
636
+ permit.releaseAfterInternalProcessing();
637
+ throw error;
638
+ }
639
+ if (received === undefined) {
640
+ permit.releaseAfterInternalProcessing();
641
+ return 'noData';
642
+ }
643
+ const applicationJobOwner = ApplicationIngressRecordOwner.create(
644
+ this.applicationJobQueue,
645
+ permit,
646
+ received
647
+ );
648
+ try {
649
+ const result = await this.processReceived(received, nowMs, applicationJobOwner);
650
+ if (result === 'protocolError') {
651
+ this.reportProtocolError(received);
652
+ }
653
+ observe?.(
654
+ received.sourceRid,
655
+ received.parts.reduce((sum, part) => sum + part.byteLength, 0)
656
+ );
657
+ return result;
658
+ } finally {
659
+ applicationJobOwner.close();
660
+ }
661
+ }
662
+
663
+ private pullMonitorEvents(): void {
664
+ this.monitor?.drain(event => {
665
+ this.observeMonitorEvent(event);
666
+ if (this.monitorEvents.length < MAX_PENDING_MONITOR_EVENTS) {
667
+ this.monitorEvents.push(event);
668
+ return;
669
+ }
670
+ const existingIndex = this.monitorEvents.findIndex(candidate =>
671
+ sameMonitorConnection(candidate, event)
672
+ );
673
+ if (existingIndex >= 0) this.monitorEvents[existingIndex] = event;
674
+ else {
675
+ this.monitorEvents.shift();
676
+ this.monitorEvents.push(event);
677
+ }
678
+ });
679
+ }
680
+
681
+ private reportProtocolError(
682
+ received: import('../backend/node/node-raw-binding-port').ZLinkRawReceivedRecord
683
+ ): void {
684
+ const request = received.requestSeq !== undefined;
685
+ const replied = request && this.replyGenericProtocolError(received);
686
+ this.onProtocolError?.({
687
+ sourceRoutingId: received.sourceRid,
688
+ request,
689
+ replied,
690
+ ...protocolCommand(received.parts)
691
+ });
692
+ }
693
+
694
+ private replyGenericProtocolError(
695
+ received: import('../backend/node/node-raw-binding-port').ZLinkRawReceivedRecord
696
+ ): boolean {
697
+ if (received.requestSeq === undefined || received.parts.length === 0) return false;
698
+ try {
699
+ const header = decodeHeader(received.parts[0]!);
700
+ const correlation = header.command === M6aServiceWireCommand.nodeRequest
701
+ ? decodeNodeRequestHeader(received.parts[0]!)
702
+ : header.command === M6aServiceWireCommand.channelRequest
703
+ ? decodeChannelRequestHeader(received.parts[0]!).correlation
704
+ : undefined;
705
+ if (correlation === undefined) return false;
706
+ const reply = [encodeReplyHeader(
707
+ correlation,
708
+ RequestResult.ProtocolError,
709
+ ServiceWireFrameworkErrorCode.requestProtocolError
710
+ )];
711
+ if (received.reply === undefined) return false;
712
+ received.reply(reply);
713
+ return true;
714
+ } catch (error) {
715
+ if (error instanceof ServiceWireProtocolError) return false;
716
+ throw error;
717
+ }
718
+ }
719
+
720
+ private async processReceived(
721
+ received: ZLinkRawReceivedRecord,
722
+ nowMs: number,
723
+ applicationJobOwner: ApplicationIngressRecordOwner
724
+ ): Promise<RawServicePumpResult> {
725
+ if (
726
+ received.parts.length === 0
727
+ || (
728
+ received.parts.length === 1
729
+ && received.parts[0]!.byteLength === 0
730
+ )
731
+ ) {
732
+ if (this.peerAdmissionSealed?.() === true) return 'dropped';
733
+ return await this.send(
734
+ received.sourceRid,
735
+ [encodeRouteMeshAdmission(M6aServiceWireCommand.hello, this.topology.localDescriptor())]
736
+ )
737
+ ? 'infrastructure'
738
+ : 'dropped';
739
+ }
740
+ try {
741
+ const header = decodeHeader(received.parts[0]!);
742
+ if (header.command === M6aServiceWireCommand.hello && this.peerAdmissionSealed?.() === true) {
743
+ return 'dropped';
744
+ }
745
+ if (
746
+ header.command === M6aServiceWireCommand.hello
747
+ || header.command === M6aServiceWireCommand.admit
748
+ || header.command === M6aServiceWireCommand.update
749
+ ) {
750
+ if (received.parts.length !== 1) return 'protocolError';
751
+ const descriptor = decodeRouteMeshAdmission(
752
+ received.parts[0]!,
753
+ header.command,
754
+ received.sourceRid
755
+ );
756
+ const expected = this.expectedPeers.get(received.sourceRid);
757
+ if (
758
+ expected !== undefined
759
+ && (
760
+ expected.meshName !== descriptor.meshName
761
+ || expected.nodeRoutingId !== descriptor.nodeRoutingId
762
+ )
763
+ ) {
764
+ await this.send(received.sourceRid, [encodeReject(3)]);
765
+ return 'infrastructure';
766
+ }
767
+ const connection = this.currentConnectionCandidate(
768
+ received.sourceRid,
769
+ descriptor.advertisedEndpoint
770
+ );
771
+ const result = this.admitPeer(
772
+ descriptor,
773
+ connection,
774
+ nowMs,
775
+ expected
776
+ );
777
+ if (result !== 'admitted' && result !== 'notRequired') {
778
+ const detail = result === 'invalidDescriptor'
779
+ ? describeInvalidAdmissionDescriptor(
780
+ descriptor,
781
+ expected,
782
+ this.topology.peer(descriptor.nodeRoutingId)?.descriptor
783
+ )
784
+ : undefined;
785
+ console.warn(
786
+ `RouteMesh admission rejected peer '${received.sourceRid}' as ${result}`
787
+ + (detail === undefined ? '.' : ` (${detail}).`)
788
+ );
789
+ await this.send(received.sourceRid, [encodeReject(admissionReason(result))]);
790
+ return 'infrastructure';
791
+ }
792
+ if (result === 'admitted') this.selectBilateralConnection(descriptor);
793
+ if (header.command === M6aServiceWireCommand.hello) {
794
+ // Hello supplies only the sender's descriptor. Even NotRequired
795
+ // peers must receive ours before the intent owner closes transport;
796
+ // submitting a response does not guarantee delivery before close.
797
+ await this.send(
798
+ received.sourceRid,
799
+ [encodeRouteMeshAdmission(M6aServiceWireCommand.admit, this.topology.localDescriptor())]
800
+ );
801
+ } else if (result === 'notRequired') {
802
+ this.retireNotRequiredExpectedPeer(
803
+ received.sourceRid,
804
+ descriptor.advertisedEndpoint
805
+ );
806
+ }
807
+ return 'infrastructure';
808
+ }
809
+ if (header.command === M6aServiceWireCommand.reject) {
810
+ if (received.parts.length !== 1) return 'protocolError';
811
+ const reason = decodeReject(received.parts[0]!);
812
+ // A reject belongs to one physical candidate, but the wire record does
813
+ // not carry that candidate's connection id. Keep an already admitted
814
+ // peer: bilateral manual connect can reject the duplicate after the
815
+ // other candidate has become Ready.
816
+ if (reason === 4 && this.topology.peer(received.sourceRid) === undefined) {
817
+ const expected = this.expectedPeers.get(received.sourceRid);
818
+ const local = this.topology.localDescriptor();
819
+ this.topology.markNotRequired({
820
+ ...local,
821
+ nodeRoutingId: received.sourceRid,
822
+ lifecycleGeneration: 1n,
823
+ descriptorRevision: 1n,
824
+ advertisedEndpoint: expected?.endpoint ?? local.advertisedEndpoint,
825
+ channels: [],
826
+ objectRole: 'client'
827
+ });
828
+ this.retireNotRequiredExpectedPeer(received.sourceRid);
829
+ }
830
+ return 'infrastructure';
831
+ }
832
+ const peer = this.topology.peer(received.sourceRid);
833
+ if (peer === undefined) return 'protocolError';
834
+ if (
835
+ header.command === M6aServiceWireCommand.livenessProbe
836
+ || header.command === M6aServiceWireCommand.livenessAck
837
+ ) {
838
+ if (received.parts.length !== 1) return 'protocolError';
839
+ const record = livenessCodec.decodeLivenessRecord(received.parts[0]!);
840
+ if (record.command === M6aServiceWireCommand.livenessProbe) {
841
+ const ack = this.liveness.acknowledgeProbe(
842
+ received.sourceRid,
843
+ peer.connectionId,
844
+ record.probeId
845
+ );
846
+ const sent = ack !== undefined && await this.send(
847
+ received.sourceRid,
848
+ [livenessCodec.encodeLivenessRecord({
849
+ command: M6aServiceWireCommand.livenessAck,
850
+ probeId: record.probeId
851
+ })]
852
+ );
853
+ if (!sent) {
854
+ return 'protocolError';
855
+ }
856
+ } else {
857
+ this.liveness.acknowledge(
858
+ received.sourceRid,
859
+ peer.connectionId,
860
+ record.probeId,
861
+ nowMs
862
+ );
863
+ }
864
+ return 'infrastructure';
865
+ }
866
+ const stateful = await this.serviceIngress?.({
867
+ command: header.command,
868
+ flags: header.flags,
869
+ sourceRoutingId: received.sourceRid,
870
+ sourceNodeGeneration: peer.descriptor.lifecycleGeneration,
871
+ sourceRoute: received.sourceRoute,
872
+ ...(received.reply === undefined ? {} : { reply: received.reply }),
873
+ ...(received.requestSeq === undefined ? {} : { requestSequence: received.requestSeq }),
874
+ parts: received.parts,
875
+ applicationJobOwner
876
+ });
877
+ if (stateful !== undefined) return stateful;
878
+ if (
879
+ header.flags === 0
880
+ // A bare infrastructure control is normally exactly one frame, but a
881
+ // relocation Prepare now rides its bound-session journal as
882
+ // node-internal ZLNI frames trailing the canonical command frame
883
+ // (spec 28 §4.4). Gating on the command vocabulary alone — instead
884
+ // of also requiring exactly one part — keeps that multi-frame
885
+ // Prepare from missing this infrastructure-mailbox acceptance and
886
+ // falling through to the two-frame application-envelope check below,
887
+ // which does not recognize command 40 and rejected it as a
888
+ // protocolError (surfaced downstream as `invalid_frame`, stalling
889
+ // the source's Prepare resend loop past the relocation admission
890
+ // budget).
891
+ && received.parts.length >= 1
892
+ && isBareInfrastructureControl(header.command)
893
+ ) {
894
+ const accepted = this.mailbox.tryEnqueue({
895
+ owner: `node:${this.descriptor.nodeRoutingId}`,
896
+ domain: 'infrastructure',
897
+ parts: received.parts,
898
+ sourceRoutingId: received.sourceRid,
899
+ sourceRoute: received.sourceRoute,
900
+ ...(received.reply === undefined ? {} : { reply: received.reply }),
901
+ ...(received.requestSeq === undefined ? {} : { requestSequence: received.requestSeq })
902
+ });
903
+ return accepted ? 'infrastructure' : 'dropped';
904
+ }
905
+ if (
906
+ header.flags !== 0
907
+ || received.parts.length !== 2
908
+ || ![
909
+ M6aServiceWireCommand.nodeSend,
910
+ M6aServiceWireCommand.nodeRequest,
911
+ M6aServiceWireCommand.channelSend,
912
+ M6aServiceWireCommand.channelRequest
913
+ ].includes(header.command as never)
914
+ ) {
915
+ return 'protocolError';
916
+ }
917
+ let owner: string;
918
+ let correlation: bigint | undefined;
919
+ if (header.command === M6aServiceWireCommand.nodeSend) {
920
+ owner = `node:${this.descriptor.nodeRoutingId}`;
921
+ } else if (header.command === M6aServiceWireCommand.nodeRequest) {
922
+ owner = `node:${this.descriptor.nodeRoutingId}`;
923
+ correlation = decodeNodeRequestHeader(received.parts[0]!);
924
+ } else if (header.command === M6aServiceWireCommand.channelSend) {
925
+ owner = `channel:${decodeChannelSendHeader(received.parts[0]!)}`;
926
+ } else {
927
+ const channel = decodeChannelRequestHeader(received.parts[0]!);
928
+ owner = `channel:${channel.channelName}`;
929
+ correlation = channel.correlation;
930
+ }
931
+ const applicationJob = await applicationJobOwner.acquire('application');
932
+ const accepted = this.mailbox.tryEnqueue({
933
+ owner,
934
+ domain: 'application',
935
+ parts: received.parts,
936
+ sourceRoutingId: received.sourceRid,
937
+ sourceRoute: received.sourceRoute,
938
+ ...(received.reply === undefined ? {} : { reply: received.reply }),
939
+ requestSequence: received.requestSeq,
940
+ ...(correlation === undefined ? {} : { correlation }),
941
+ applicationJob
942
+ });
943
+ if (accepted) return 'application';
944
+ applicationJob.close();
945
+ if (correlation !== undefined && received.requestSeq !== undefined) {
946
+ this.replyService({
947
+ sourceRoutingId: received.sourceRid,
948
+ sourceRoute: received.sourceRoute,
949
+ requestSequence: received.requestSeq,
950
+ ...(received.reply === undefined ? {} : { reply: received.reply })
951
+ }, [
952
+ encodeReplyHeader(
953
+ correlation,
954
+ RequestResult.NotConnected,
955
+ 0
956
+ )
957
+ ]);
958
+ return 'infrastructure';
959
+ }
960
+ return 'dropped';
961
+ } catch (error) {
962
+ if (error instanceof ServiceWireProtocolError) return 'protocolError';
963
+ throw error;
964
+ }
965
+ }
966
+
967
+ async tickLiveness(nowMs = performance.now()): Promise<ServiceLivenessTick> {
968
+ const result = this.liveness.tick(nowMs);
969
+ this.requireStarted();
970
+ for (const probe of result.probes) {
971
+ await this.send(probe.nodeRoutingId, [livenessCodec.encodeLivenessRecord({
972
+ command: M6aServiceWireCommand.livenessProbe,
973
+ probeId: probe.probeId
974
+ })]);
975
+ }
976
+ for (const nodeRoutingId of result.timedOutNodes) {
977
+ const peer = this.topology.peer(nodeRoutingId);
978
+ if (peer === undefined) continue;
979
+ // Liveness timeout is a semantic peer removal. Route topology,
980
+ // physical candidate state, and auto-connect intent must be retired by
981
+ // the same owner so a failed endpoint cannot be selected again.
982
+ this.removeConnectionCandidate(nodeRoutingId, peer.connectionId);
983
+ this.removePeer(peer);
984
+ }
985
+ return result;
986
+ }
987
+
988
+ async drainMonitorEvents(nowMs = performance.now()): Promise<number> {
989
+ this.pullMonitorEvents();
990
+ let handled = 0;
991
+ // Detach the current batch so monitor pulls that run while an event is
992
+ // being handled append to the next batch without copying or reindexing it.
993
+ const events = this.monitorEvents;
994
+ this.monitorEvents = this.monitorDrainBuffer;
995
+ this.monitorDrainBuffer = events;
996
+ this.monitorEvents.length = 0;
997
+ for (const event of events) {
998
+ handled++;
999
+ const nodeRoutingId = event.routingId
1000
+ ?? this.expectedPeerRoutingId(event.remoteAddress);
1001
+ if (event.event === MONITOR_CONNECTION_READY && isConnectionReadyEdge(event)) {
1002
+ if (nodeRoutingId === undefined) {
1003
+ const candidate = this.createUnresolvedConnectionCandidate(event);
1004
+ const alreadyQueued = this.unresolvedConnectionCandidates.some(
1005
+ value => value.connectionId === candidate.connectionId
1006
+ );
1007
+ if (!alreadyQueued && this.unresolvedConnectionCandidates.length < MAX_UNRESOLVED_CONNECTION_CANDIDATES) {
1008
+ this.unresolvedConnectionCandidates.push(candidate);
1009
+ }
1010
+ continue;
1011
+ }
1012
+ if (!this.acceptsExpectedMonitorEndpoint(nodeRoutingId, event)) {
1013
+ continue;
1014
+ }
1015
+ const candidate = this.createConnectionCandidate(nodeRoutingId, event);
1016
+ const existingPeer = this.topology.peer(nodeRoutingId);
1017
+ if (existingPeer !== undefined && existingPeer.connectionId === candidate.connectionId) {
1018
+ this.monitorConnectionStates.set(nodeRoutingId, candidate.connectionId);
1019
+ continue;
1020
+ }
1021
+ if (existingPeer !== undefined) {
1022
+ if (this.liveness.isReady(nodeRoutingId, existingPeer.connectionId)) {
1023
+ const existingCandidate = this.connectionCandidates
1024
+ .get(nodeRoutingId)?.get(existingPeer.connectionId);
1025
+ if (this.isDiscoveredLifecycleReplacement(existingPeer, nodeRoutingId)) {
1026
+ // A current discovery descriptor with the same RID but a
1027
+ // different lifecycle token denotes a replacement process.
1028
+ // Keep its physical pair provisional until its Hello passes
1029
+ // the descriptor fence; the old ready peer remains semantic
1030
+ // current until then.
1031
+ let provisionalCandidates = this.connectionCandidates.get(nodeRoutingId);
1032
+ if (provisionalCandidates === undefined) {
1033
+ provisionalCandidates = new Map();
1034
+ this.connectionCandidates.set(nodeRoutingId, provisionalCandidates);
1035
+ }
1036
+ provisionalCandidates.set(candidate.connectionId, candidate);
1037
+ await this.announcePeer(nodeRoutingId);
1038
+ continue;
1039
+ }
1040
+ if (existingCandidate?.connectionId === candidate.connectionId) {
1041
+ this.removeConnectionCandidate(nodeRoutingId, candidate.connectionId);
1042
+ this.monitorConnectionStates.set(nodeRoutingId, existingPeer.connectionId);
1043
+ continue;
1044
+ }
1045
+ // A non-replacement ready route is the current semantic owner.
1046
+ // A second physical candidate may be admitted only after the
1047
+ // current lease expires; this also prevents a late old-process
1048
+ // reconnect from replacing the ready replacement by arrival order.
1049
+ this.removeConnectionCandidate(nodeRoutingId, candidate.connectionId);
1050
+ continue;
1051
+ }
1052
+ // Keep the physical candidate until the wire descriptor decides
1053
+ // whether it is the current logical peer. READY events can race
1054
+ // with DISCONNECTED events during reconnect; rejecting the READY
1055
+ // here can terminate the replacement before admission evaluates its
1056
+ // lifecycle generation.
1057
+ let provisionalCandidates = this.connectionCandidates.get(nodeRoutingId);
1058
+ if (provisionalCandidates === undefined) {
1059
+ provisionalCandidates = new Map();
1060
+ this.connectionCandidates.set(nodeRoutingId, provisionalCandidates);
1061
+ }
1062
+ provisionalCandidates.set(candidate.connectionId, candidate);
1063
+ this.connectionIds.set(nodeRoutingId, candidate.connectionId);
1064
+ await this.announcePeer(nodeRoutingId);
1065
+ continue;
1066
+ }
1067
+ let candidates = this.connectionCandidates.get(nodeRoutingId);
1068
+ if (candidates === undefined) {
1069
+ candidates = new Map();
1070
+ this.connectionCandidates.set(nodeRoutingId, candidates);
1071
+ }
1072
+ candidates.set(candidate.connectionId, candidate);
1073
+ // Before wire admission the monitor candidate is the only physical
1074
+ // route evidence available to the admission message.
1075
+ this.connectionIds.set(nodeRoutingId, candidate.connectionId);
1076
+ await this.announcePeer(nodeRoutingId);
1077
+ } else if (
1078
+ event.event === MONITOR_DISCONNECTED
1079
+ && nodeRoutingId !== undefined
1080
+ ) {
1081
+ const peer = this.topology.peer(nodeRoutingId);
1082
+ const disconnectedId = monitorConnectionId(event, nodeRoutingId);
1083
+ this.removeConnectionCandidate(nodeRoutingId, disconnectedId);
1084
+ if (peer !== undefined && peer.connectionId === disconnectedId) {
1085
+ this.removePeer(peer);
1086
+ }
1087
+ } else if (
1088
+ event.event === MONITOR_DISCONNECTED
1089
+ ) {
1090
+ const disconnectedId = monitorConnectionId(event);
1091
+ const index = this.unresolvedConnectionCandidates.findIndex(
1092
+ candidate => candidate.connectionId === disconnectedId
1093
+ );
1094
+ if (index >= 0) this.unresolvedConnectionCandidates.splice(index, 1);
1095
+ }
1096
+ }
1097
+ this.monitorDrainBuffer.length = 0;
1098
+ void nowMs;
1099
+ return handled;
1100
+ }
1101
+
1102
+ close(): void {
1103
+ if (this.closed) return;
1104
+ this.closed = true;
1105
+ this.applicationJobStop.abort(
1106
+ new Error('Raw service runtime application job admission stopped.')
1107
+ );
1108
+ this.mailbox.close();
1109
+ this.operations.close('Raw service runtime closed.');
1110
+ this.serviceIngress = undefined;
1111
+ const router = this.router;
1112
+ if (router !== undefined) {
1113
+ this.applicationJobQueue.unregisterReceiveFlowTarget?.(router);
1114
+ }
1115
+ this.monitor?.close();
1116
+ this.monitor = undefined;
1117
+ const host = this.host;
1118
+ this.router = undefined;
1119
+ this.host = undefined;
1120
+ if (host !== undefined) host.close();
1121
+ }
1122
+
1123
+ private requestToTarget(
1124
+ targetNodeRoutingId: string,
1125
+ payload: ServiceApplicationPayload,
1126
+ timeoutMs: number,
1127
+ channelName?: string
1128
+ ): PendingOperation<RawServiceRequestResult> {
1129
+ const correlation = this.nextCorrelation++;
1130
+ const header = channelName === undefined
1131
+ ? encodeNodeRequestHeader(correlation)
1132
+ : encodeChannelRequestHeader(correlation, channelName);
1133
+ const encodedPayload = encodeApplicationPayload(payload);
1134
+ const pending = this.operations.reserve(timeoutMs);
1135
+ let selectedTargetNodeRoutingId = targetNodeRoutingId;
1136
+ if (
1137
+ selectedTargetNodeRoutingId !== this.descriptor.nodeRoutingId
1138
+ && !this.isPeerRouteReady(selectedTargetNodeRoutingId)
1139
+ ) {
1140
+ // Channel selection happens before native admission. If that selection
1141
+ // becomes stale during a peer drain, choose another ready channel peer
1142
+ // while no request has been submitted yet. Reusing the same pending
1143
+ // operation and correlation keeps this recovery pre-admission and
1144
+ // cannot duplicate an application request.
1145
+ if (channelName !== undefined) {
1146
+ const excludedTargets = new Set([selectedTargetNodeRoutingId]);
1147
+ for (;;) {
1148
+ const alternate = this.topology.selectChannel(
1149
+ channelName,
1150
+ peer => {
1151
+ const candidate = peer.descriptor.nodeRoutingId;
1152
+ return !excludedTargets.has(candidate)
1153
+ && this.isLocalOrReadyPeer(candidate);
1154
+ }
1155
+ );
1156
+ if (alternate === undefined) break;
1157
+ selectedTargetNodeRoutingId = alternate.descriptor.nodeRoutingId;
1158
+ if (
1159
+ selectedTargetNodeRoutingId === this.descriptor.nodeRoutingId
1160
+ || this.isPeerRouteReady(selectedTargetNodeRoutingId)
1161
+ ) {
1162
+ break;
1163
+ }
1164
+ excludedTargets.add(selectedTargetNodeRoutingId);
1165
+ }
1166
+ }
1167
+ }
1168
+ if (selectedTargetNodeRoutingId === this.descriptor.nodeRoutingId) {
1169
+ const parts = [header, encodedPayload];
1170
+ const capacityStop = new AbortController();
1171
+ void pending.promise.finally(() => capacityStop.abort()).catch(() => undefined);
1172
+ void (async () => {
1173
+ const applicationJobOwner = await this.reserveLocalIngress(capacityStop.signal);
1174
+ try {
1175
+ if (!this.operations.isPending(pending.id)) return;
1176
+ const applicationJob = await applicationJobOwner.acquire(
1177
+ 'application',
1178
+ capacityStop.signal
1179
+ );
1180
+ if (!this.operations.isPending(pending.id)) {
1181
+ applicationJob.close();
1182
+ return;
1183
+ }
1184
+ const accepted = this.mailbox.tryEnqueue({
1185
+ owner: channelName === undefined
1186
+ ? `node:${this.descriptor.nodeRoutingId}`
1187
+ : `channel:${channelName}`,
1188
+ domain: 'application',
1189
+ parts,
1190
+ sourceRoutingId: this.descriptor.nodeRoutingId,
1191
+ correlation,
1192
+ localReply: (terminalResult, failureCode, reply) =>
1193
+ this.operations.complete(pending.id, {
1194
+ terminalResult,
1195
+ failureCode,
1196
+ ...(reply === undefined ? {} : { payload: reply })
1197
+ }),
1198
+ applicationJob
1199
+ });
1200
+ if (!accepted) {
1201
+ applicationJob.close();
1202
+ this.operations.complete(pending.id, {
1203
+ terminalResult: RequestResult.NotConnected,
1204
+ failureCode: 0
1205
+ });
1206
+ }
1207
+ } finally {
1208
+ applicationJobOwner.close();
1209
+ }
1210
+ })().catch(error => this.operations.fail(pending.id, error));
1211
+ return pending;
1212
+ }
1213
+ if (!this.isPeerRouteReady(selectedTargetNodeRoutingId)) {
1214
+ // Preserve Core's distinct target-not-found result for an RID the
1215
+ // topology has never observed. A known peer without a usable route is
1216
+ // a Framework NotConnected result; an unknown RID is completed locally
1217
+ // as RequestTargetNotFound without submitting an application frame.
1218
+ const knownTarget = this.topology.peer(selectedTargetNodeRoutingId) !== undefined
1219
+ || this.topology.knownDescriptor(selectedTargetNodeRoutingId) !== undefined;
1220
+ this.operations.complete(pending.id, {
1221
+ terminalResult: knownTarget
1222
+ ? RequestResult.NotConnected
1223
+ : RequestResult.NotFound,
1224
+ failureCode: knownTarget ? 0 : REQUEST_TARGET_NOT_FOUND_FAILURE_CODE
1225
+ });
1226
+ return pending;
1227
+ }
1228
+ const parts = [header, encodedPayload];
1229
+ let router: ZLinkRawRouterPort;
1230
+ let request: Promise<readonly Uint8Array[]>;
1231
+ try {
1232
+ router = this.requireStarted();
1233
+ request = router.request(
1234
+ selectedTargetNodeRoutingId,
1235
+ parts,
1236
+ timeoutMs
1237
+ );
1238
+ } catch (error) {
1239
+ this.operations.fail(pending.id, error);
1240
+ return pending;
1241
+ }
1242
+ void request.then(
1243
+ replyParts => {
1244
+ try {
1245
+ if (replyParts.length < 1 || replyParts.length > 2) {
1246
+ throw new ServiceWireProtocolError('Invalid reply parts.');
1247
+ }
1248
+ const reply = decodeReplyHeader(replyParts[0]!);
1249
+ if (reply.correlation !== correlation) throw new ServiceWireProtocolError('Reply correlation mismatch.');
1250
+ if (reply.tail.byteLength !== 0) {
1251
+ throw new ServiceWireProtocolError('Generic node/channel reply carries an operation-specific tail.');
1252
+ }
1253
+ if (reply.terminalResult === 0 && replyParts.length !== 2) {
1254
+ throw new ServiceWireProtocolError('Successful reply omits its payload.');
1255
+ }
1256
+ if (reply.terminalResult !== 0 && replyParts.length !== 1) {
1257
+ throw new ServiceWireProtocolError('Failed reply carries a payload.');
1258
+ }
1259
+ const result: RawServiceRequestResult = {
1260
+ terminalResult: reply.terminalResult,
1261
+ failureCode: reply.failureCode
1262
+ };
1263
+ this.operations.complete(
1264
+ pending.id,
1265
+ reply.terminalResult === 0
1266
+ ? { ...result, payload: decodeApplicationPayload(replyParts[1]!) }
1267
+ : result
1268
+ );
1269
+ } catch (error) {
1270
+ this.operations.fail(pending.id, error);
1271
+ }
1272
+ },
1273
+ error => {
1274
+ this.operations.fail(pending.id, error);
1275
+ }
1276
+ );
1277
+ return pending;
1278
+ }
1279
+
1280
+ private admitPeer(
1281
+ descriptor: ServiceNodeDescriptor,
1282
+ connection: PhysicalConnectionCandidate,
1283
+ nowMs: number,
1284
+ expected?: {
1285
+ readonly endpoint?: string;
1286
+ readonly securityIdentity?: string;
1287
+ readonly lifecycleGeneration?: bigint;
1288
+ }
1289
+ ): PeerAdmissionResult {
1290
+ const previous = this.topology.peer(descriptor.nodeRoutingId);
1291
+ if (
1292
+ previous !== undefined
1293
+ && previous.descriptor.lifecycleGeneration === descriptor.lifecycleGeneration
1294
+ && (
1295
+ descriptor.descriptorRevision < previous.descriptor.descriptorRevision
1296
+ || (
1297
+ descriptor.descriptorRevision === previous.descriptor.descriptorRevision
1298
+ && !sameServiceNodeDescriptor(previous.descriptor, descriptor)
1299
+ )
1300
+ )
1301
+ ) {
1302
+ throw new ServiceWireProtocolError(
1303
+ `RouteMesh peer '${descriptor.nodeRoutingId}' descriptor revision is stale or conflicting.`
1304
+ );
1305
+ }
1306
+ const result = this.topology.admit(
1307
+ descriptor,
1308
+ connection.connectionId,
1309
+ expected,
1310
+ connection.discriminator
1311
+ );
1312
+ if (result === 'admitted') {
1313
+ this.connectionIds.set(
1314
+ descriptor.nodeRoutingId,
1315
+ connection.connectionId
1316
+ );
1317
+ this.liveness.admit(descriptor.nodeRoutingId, connection.connectionId, nowMs);
1318
+ this.liveness.requestProbe(
1319
+ descriptor.nodeRoutingId,
1320
+ connection.connectionId,
1321
+ nowMs
1322
+ );
1323
+ this.monitorConnectionStates.set(
1324
+ descriptor.nodeRoutingId,
1325
+ connection.connectionId
1326
+ );
1327
+ if (previous !== undefined && previous.connectionId !== connection.connectionId) {
1328
+ const previousCandidate = this.connectionCandidates
1329
+ .get(descriptor.nodeRoutingId)?.get(previous.connectionId);
1330
+ if (previousCandidate !== undefined) {
1331
+ this.removeConnectionCandidate(
1332
+ descriptor.nodeRoutingId,
1333
+ previousCandidate.connectionId
1334
+ );
1335
+ }
1336
+ }
1337
+ } else if (result === 'notRequired' && previous !== undefined) {
1338
+ this.liveness.disconnect(
1339
+ descriptor.nodeRoutingId,
1340
+ previous.connectionId
1341
+ );
1342
+ } else if (previous !== undefined) {
1343
+ this.connectionIds.set(
1344
+ descriptor.nodeRoutingId,
1345
+ previous.connectionId
1346
+ );
1347
+ if (connection.connectionId !== previous.connectionId) {
1348
+ this.removeConnectionCandidate(
1349
+ descriptor.nodeRoutingId,
1350
+ connection.connectionId
1351
+ );
1352
+ }
1353
+ }
1354
+ return result;
1355
+ }
1356
+
1357
+ private currentConnectionCandidate(
1358
+ nodeRoutingId: string,
1359
+ advertisedEndpoint: string
1360
+ ): PhysicalConnectionCandidate {
1361
+ let connectionId = this.connectionIds.get(nodeRoutingId);
1362
+ let candidate = connectionId === undefined
1363
+ ? undefined
1364
+ : this.connectionCandidates.get(nodeRoutingId)?.get(connectionId);
1365
+ if (candidate === undefined) {
1366
+ candidate = this.promoteUnresolvedConnectionCandidate(
1367
+ nodeRoutingId,
1368
+ advertisedEndpoint
1369
+ );
1370
+ connectionId = candidate?.connectionId;
1371
+ }
1372
+ if (candidate === undefined) {
1373
+ const localRid = this.topology.localDescriptor().nodeRoutingId;
1374
+ const endpointOnly = this.endpointOnlyPeers.has(advertisedEndpoint);
1375
+ const direction: PhysicalConnectionDirection =
1376
+ this.expectedPeers.has(nodeRoutingId)
1377
+ ? 'outbound'
1378
+ : endpointOnly
1379
+ ? localRid.localeCompare(nodeRoutingId) <= 0
1380
+ ? 'outbound'
1381
+ : 'inbound'
1382
+ : 'inbound';
1383
+ const initiator = endpointOnly && localRid.localeCompare(nodeRoutingId) > 0
1384
+ ? nodeRoutingId
1385
+ : direction === 'outbound'
1386
+ ? localRid
1387
+ : nodeRoutingId;
1388
+ connectionId = `unmonitored:${direction}:${randomUUID()}`;
1389
+ candidate = {
1390
+ connectionId,
1391
+ direction,
1392
+ discriminator: `initiator:${initiator}`,
1393
+ localAddress: '',
1394
+ remoteAddress: advertisedEndpoint
1395
+ };
1396
+ let candidates = this.connectionCandidates.get(nodeRoutingId);
1397
+ if (candidates === undefined) {
1398
+ candidates = new Map();
1399
+ this.connectionCandidates.set(nodeRoutingId, candidates);
1400
+ }
1401
+ candidates.set(connectionId, candidate);
1402
+ this.connectionIds.set(nodeRoutingId, connectionId);
1403
+ }
1404
+ return candidate;
1405
+ }
1406
+
1407
+ private createConnectionCandidate(
1408
+ nodeRoutingId: string,
1409
+ event: ZLinkRawMonitorRecord
1410
+ ): PhysicalConnectionCandidate {
1411
+ const local = this.topology.localDescriptor();
1412
+ const expected = this.expectedPeers.get(nodeRoutingId);
1413
+ const direction: PhysicalConnectionDirection =
1414
+ event.localAddress === local.advertisedEndpoint
1415
+ ? 'inbound'
1416
+ : expected?.endpoint === event.remoteAddress
1417
+ ? 'outbound'
1418
+ : this.endpointOnlyPeers.has(event.remoteAddress)
1419
+ ? 'outbound'
1420
+ : 'unknown';
1421
+ const initiator = direction === 'outbound'
1422
+ ? local.nodeRoutingId
1423
+ : direction === 'inbound'
1424
+ ? nodeRoutingId
1425
+ : undefined;
1426
+ return {
1427
+ connectionId: monitorConnectionId(event, nodeRoutingId),
1428
+ direction,
1429
+ discriminator: initiator === undefined
1430
+ ? `unknown:${monitorConnectionId(event, nodeRoutingId)}`
1431
+ : `initiator:${initiator}`,
1432
+ localAddress: event.localAddress,
1433
+ remoteAddress: event.remoteAddress
1434
+ };
1435
+ }
1436
+
1437
+ private createUnresolvedConnectionCandidate(
1438
+ event: ZLinkRawMonitorRecord
1439
+ ): PhysicalConnectionCandidate {
1440
+ const connectionId = monitorConnectionId(event);
1441
+ const local = this.topology.localDescriptor();
1442
+ const direction: PhysicalConnectionDirection =
1443
+ this.endpointOnlyPeers.has(event.remoteAddress)
1444
+ || this.expectedPeerRoutingId(event.remoteAddress) !== undefined
1445
+ ? 'outbound'
1446
+ : event.localAddress === local.advertisedEndpoint
1447
+ ? 'inbound'
1448
+ : 'unknown';
1449
+ return {
1450
+ connectionId,
1451
+ direction,
1452
+ discriminator: `unresolved:${connectionId}`,
1453
+ localAddress: event.localAddress,
1454
+ remoteAddress: event.remoteAddress
1455
+ };
1456
+ }
1457
+
1458
+ private promoteUnresolvedConnectionCandidate(
1459
+ nodeRoutingId: string,
1460
+ advertisedEndpoint: string
1461
+ ): PhysicalConnectionCandidate | undefined {
1462
+ const relevant = this.unresolvedConnectionCandidates
1463
+ .map((candidate, index) => ({ candidate, index }))
1464
+ .filter(({ candidate }) =>
1465
+ candidate.remoteAddress === advertisedEndpoint
1466
+ || candidate.direction === 'inbound');
1467
+ if (relevant.length === 0) return undefined;
1468
+ const directions = new Set(relevant.map(value => value.candidate.direction));
1469
+ const localRid = this.topology.localDescriptor().nodeRoutingId;
1470
+ const preferredDirection: PhysicalConnectionDirection =
1471
+ directions.has('inbound') && directions.has('outbound')
1472
+ ? localRid.localeCompare(nodeRoutingId) <= 0
1473
+ ? 'outbound'
1474
+ : 'inbound'
1475
+ : relevant.at(-1)!.candidate.direction;
1476
+ const selected = [...relevant]
1477
+ .reverse()
1478
+ .find(value => value.candidate.direction === preferredDirection)
1479
+ ?? relevant.at(-1)!;
1480
+ this.unresolvedConnectionCandidates.splice(selected.index, 1);
1481
+ const initiator = selected.candidate.direction === 'outbound'
1482
+ ? localRid
1483
+ : selected.candidate.direction === 'inbound'
1484
+ ? nodeRoutingId
1485
+ : undefined;
1486
+ const candidate: PhysicalConnectionCandidate = {
1487
+ ...selected.candidate,
1488
+ discriminator: initiator === undefined
1489
+ ? `unknown:${selected.candidate.connectionId}`
1490
+ : `initiator:${initiator}`
1491
+ };
1492
+ let candidates = this.connectionCandidates.get(nodeRoutingId);
1493
+ if (candidates === undefined) {
1494
+ candidates = new Map();
1495
+ this.connectionCandidates.set(nodeRoutingId, candidates);
1496
+ }
1497
+ candidates.set(candidate.connectionId, candidate);
1498
+ this.connectionIds.set(nodeRoutingId, candidate.connectionId);
1499
+ return candidate;
1500
+ }
1501
+
1502
+ private removeConnectionCandidate(nodeRoutingId: string, connectionId: string): void {
1503
+ const candidates = this.connectionCandidates.get(nodeRoutingId);
1504
+ candidates?.delete(connectionId);
1505
+ if (candidates?.size === 0) this.connectionCandidates.delete(nodeRoutingId);
1506
+ if (this.connectionIds.get(nodeRoutingId) === connectionId) {
1507
+ this.connectionIds.delete(nodeRoutingId);
1508
+ }
1509
+ }
1510
+
1511
+ private isDiscoveredLifecycleReplacement(
1512
+ admitted: AdmittedServicePeer,
1513
+ nodeRoutingId: string
1514
+ ): boolean {
1515
+ const expected = this.expectedPeers.get(nodeRoutingId);
1516
+ // A same-RID replacement is permitted only from a complete discovery
1517
+ // fence. Manual/endpoint-only intent has no authority to replace a ready
1518
+ // peer, and lifecycle generations are opaque equality tokens.
1519
+ return expected?.endpoint !== undefined
1520
+ && expected.securityIdentity !== undefined
1521
+ && expected.lifecycleGeneration !== undefined
1522
+ && admitted.descriptor.lifecycleGeneration !== expected.lifecycleGeneration;
1523
+ }
1524
+
1525
+ private expectedPeerRoutingId(endpoint: string): string | undefined {
1526
+ for (const [nodeRoutingId, expected] of this.expectedPeers) {
1527
+ if (expected.endpoint === endpoint) return nodeRoutingId;
1528
+ }
1529
+ return undefined;
1530
+ }
1531
+
1532
+ private acceptsExpectedMonitorEndpoint(
1533
+ nodeRoutingId: string,
1534
+ event: Pick<ZLinkRawMonitorRecord, 'remoteAddress' | 'routingId'>
1535
+ ): boolean {
1536
+ // A monitor address is the physical socket address, which may be an
1537
+ // ephemeral port. Once Core has resolved the peer routing ID, that ID is
1538
+ // the semantic identity; comparing the physical address with the
1539
+ // discovery advertised endpoint would reject valid READY events.
1540
+ if (event.routingId === nodeRoutingId) return true;
1541
+ const expected = this.expectedPeers.get(nodeRoutingId);
1542
+ return expected === undefined || expected.endpoint === undefined
1543
+ || expected.endpoint === event.remoteAddress;
1544
+ }
1545
+
1546
+ private retireNotRequiredExpectedPeer(
1547
+ nodeRoutingId: string,
1548
+ advertisedEndpoint?: string
1549
+ ): void {
1550
+ const expected = this.expectedPeers.get(nodeRoutingId);
1551
+ const endpoint = expected?.endpoint
1552
+ ?? (
1553
+ advertisedEndpoint !== undefined
1554
+ && this.endpointOnlyPeers.has(advertisedEndpoint)
1555
+ ? advertisedEndpoint
1556
+ : undefined
1557
+ );
1558
+ if (endpoint !== undefined) {
1559
+ this.requireStarted().disconnect(endpoint);
1560
+ this.endpointOnlyPeers.delete(endpoint);
1561
+ this.onPeerNotRequired?.(nodeRoutingId, endpoint);
1562
+ }
1563
+ this.expectedPeers.delete(nodeRoutingId);
1564
+ this.notifyPeerConnectionIntentRemoved(nodeRoutingId);
1565
+ }
1566
+
1567
+ private selectBilateralConnection(descriptor: ServiceNodeDescriptor): void {
1568
+ const endpoint = descriptor.advertisedEndpoint;
1569
+ if (!this.endpointOnlyPeers.has(endpoint)) return;
1570
+ if (this.expectedPeers.has(descriptor.nodeRoutingId)) return;
1571
+ this.expectedPeers.set(descriptor.nodeRoutingId, {
1572
+ meshName: descriptor.meshName,
1573
+ nodeRoutingId: descriptor.nodeRoutingId,
1574
+ endpoint,
1575
+ securityIdentity: descriptor.securityIdentity,
1576
+ lifecycleGeneration: descriptor.lifecycleGeneration
1577
+ });
1578
+ this.endpointOnlyPeers.delete(endpoint);
1579
+ }
1580
+
1581
+ private removePeer(peer: AdmittedServicePeer): void {
1582
+ if (this.monitorConnectionStates.get(peer.descriptor.nodeRoutingId) === peer.connectionId) {
1583
+ this.monitorConnectionStates.set(peer.descriptor.nodeRoutingId, null);
1584
+ }
1585
+ this.topology.disconnect(peer.descriptor.nodeRoutingId, peer.connectionId);
1586
+ this.liveness.disconnect(peer.descriptor.nodeRoutingId, peer.connectionId);
1587
+ this.onPeerDisconnected?.(
1588
+ peer.descriptor.nodeRoutingId,
1589
+ peer.descriptor.advertisedEndpoint,
1590
+ peer.descriptor.lifecycleGeneration
1591
+ );
1592
+ }
1593
+
1594
+ private observeMonitorEvent(event: ZLinkRawMonitorRecord): void {
1595
+ const nodeRoutingId = event.routingId
1596
+ ?? this.expectedPeerRoutingId(event.remoteAddress);
1597
+ if (nodeRoutingId === undefined) return;
1598
+ const connectionId = monitorConnectionId(event, nodeRoutingId);
1599
+ if (event.event === MONITOR_CONNECTION_READY && isConnectionReadyEdge(event)) {
1600
+ if (!this.acceptsExpectedMonitorEndpoint(nodeRoutingId, event)) return;
1601
+ // The event is queued for admission. Updating monitor state here would
1602
+ // allow a late stale READY to overwrite the admitted replacement.
1603
+ return;
1604
+ }
1605
+ if (event.event === MONITOR_DISCONNECTED
1606
+ && this.monitorConnectionStates.get(nodeRoutingId) === connectionId
1607
+ && this.topology.peer(nodeRoutingId)?.connectionId === connectionId) {
1608
+ this.monitorConnectionStates.set(nodeRoutingId, null);
1609
+ }
1610
+ }
1611
+
1612
+ private requireStarted(): ZLinkRawRouterPort {
1613
+ if (this.router === undefined) throw new Error('Raw service runtime is not started.');
1614
+ return this.router;
1615
+ }
1616
+
1617
+ private async send(
1618
+ targetNodeRoutingId: string,
1619
+ parts: readonly Uint8Array[]
1620
+ ): Promise<boolean> {
1621
+ try {
1622
+ await this.requireStarted().send(targetNodeRoutingId, parts);
1623
+ return true;
1624
+ } catch {
1625
+ return false;
1626
+ }
1627
+ }
1628
+
1629
+ }
1630
+
1631
+ /**
1632
+ * Relocation and bound-Session controls are service-wire records themselves,
1633
+ * not application NodeSend(16) envelopes. Keep this list closed: a bare
1634
+ * record outside the frozen control vocabulary remains a protocol error.
1635
+ */
1636
+ function isBareInfrastructureControl(command: number): boolean {
1637
+ return [
1638
+ ServiceWireCommand.relocationReady,
1639
+ ServiceWireCommand.relocationData,
1640
+ ServiceWireCommand.replyRelay,
1641
+ ServiceWireCommand.relocationCutover,
1642
+ ServiceWireCommand.relocationPrepare,
1643
+ ServiceWireCommand.sessionRelocationSeal,
1644
+ ServiceWireCommand.sessionRelocationSealed,
1645
+ ServiceWireCommand.sessionRelocationRoute,
1646
+ ServiceWireCommand.replyRelayAck,
1647
+ ServiceWireCommand.relocationState,
1648
+ ServiceWireCommand.relocationFailed
1649
+ ].includes(command as never);
1650
+ }
1651
+
1652
+ function protocolCommand(parts: readonly Uint8Array[]): { readonly command?: number } {
1653
+ if (parts.length === 0) return {};
1654
+ try {
1655
+ return { command: decodeHeader(parts[0]!).command };
1656
+ } catch {
1657
+ return {};
1658
+ }
1659
+ }
1660
+
1661
+ function isAlreadyDisconnectedError(error: unknown): boolean {
1662
+ if (typeof error !== 'object' || error === null || !('nativeErrno' in error)) {
1663
+ return false;
1664
+ }
1665
+ return (error as { readonly nativeErrno?: unknown }).nativeErrno === 2;
1666
+ }
1667
+
1668
+ function monitorConnectionId(
1669
+ event: ZLinkRawMonitorRecord,
1670
+ resolvedNodeRoutingId = event.routingId ?? ''
1671
+ ): string {
1672
+ if (event.connectionId !== undefined && event.connectionId !== 0n) {
1673
+ return JSON.stringify([
1674
+ resolvedNodeRoutingId,
1675
+ 'connection',
1676
+ event.connectionId.toString()
1677
+ ]);
1678
+ }
1679
+ return JSON.stringify([
1680
+ // Monitor `value` is event-specific: CONNECTION_READY reports the
1681
+ // socket's ready count and DISCONNECTED reports its reason. It is not a
1682
+ // connection identity. The public monitor record has no native
1683
+ // connection id, so use the stable routing and endpoint tuple instead.
1684
+ resolvedNodeRoutingId,
1685
+ event.localAddress,
1686
+ event.remoteAddress
1687
+ ]);
1688
+ }
1689
+
1690
+ function sameMonitorConnection(
1691
+ left: ZLinkRawMonitorRecord,
1692
+ right: ZLinkRawMonitorRecord
1693
+ ): boolean {
1694
+ return monitorConnectionId(left) === monitorConnectionId(right)
1695
+ && left.remoteAddress === right.remoteAddress;
1696
+ }
1697
+
1698
+ function isConnectionReadyEdge(event: ZLinkRawMonitorRecord): boolean {
1699
+ return event.flags === undefined
1700
+ ? event.value > 0n
1701
+ : (event.flags & MONITOR_CONNECTION_READY_EDGE) !== 0;
1702
+ }
1703
+
1704
+ function describeInvalidAdmissionDescriptor(
1705
+ descriptor: ServiceNodeDescriptor,
1706
+ expected: ServicePeerAdmissionExpectation | undefined,
1707
+ current: ServiceNodeDescriptor | undefined
1708
+ ): string {
1709
+ try {
1710
+ validateDescriptor(descriptor);
1711
+ } catch (error) {
1712
+ return `descriptor validation: ${error instanceof Error ? error.message : String(error)}`;
1713
+ }
1714
+ if (expected?.endpoint !== undefined
1715
+ && descriptor.advertisedEndpoint !== expected.endpoint) {
1716
+ return `advertisedEndpoint expected='${expected.endpoint}' actual='${descriptor.advertisedEndpoint}'`;
1717
+ }
1718
+ if (expected?.securityIdentity !== undefined
1719
+ && descriptor.securityIdentity !== expected.securityIdentity) {
1720
+ return `securityIdentity expected='${expected.securityIdentity}' actual='${descriptor.securityIdentity}'`;
1721
+ }
1722
+ if (expected?.lifecycleGeneration !== undefined
1723
+ && descriptor.lifecycleGeneration !== expected.lifecycleGeneration) {
1724
+ return `lifecycleGeneration expected=${expected.lifecycleGeneration} actual=${descriptor.lifecycleGeneration}`;
1725
+ }
1726
+ if (current !== undefined
1727
+ && current.lifecycleGeneration === descriptor.lifecycleGeneration
1728
+ && descriptor.descriptorRevision > current.descriptorRevision) {
1729
+ const immutableField = immutableDescriptorMismatch(current, descriptor);
1730
+ if (immutableField !== undefined) return immutableField;
1731
+ }
1732
+ return 'self routing id or immutable descriptor field';
1733
+ }
1734
+
1735
+ function immutableDescriptorMismatch(
1736
+ current: ServiceNodeDescriptor,
1737
+ descriptor: ServiceNodeDescriptor
1738
+ ): string | undefined {
1739
+ const fields: ReadonlyArray<keyof ServiceNodeDescriptor> = [
1740
+ 'advertisedEndpoint', 'securityIdentity', 'applicationVersion', 'objectRole',
1741
+ 'activeCapacityLimit', 'pendingCapacityLimit'
1742
+ ];
1743
+ for (const field of fields) {
1744
+ if (current[field] !== descriptor[field]) {
1745
+ return `${field} changed within lifecycle expected=${String(current[field])} actual=${String(descriptor[field])}`;
1746
+ }
1747
+ }
1748
+ if (JSON.stringify(current.protocolCapabilities) !== JSON.stringify(descriptor.protocolCapabilities)) {
1749
+ return `protocolCapabilities changed within lifecycle expected=${JSON.stringify(current.protocolCapabilities)} actual=${JSON.stringify(descriptor.protocolCapabilities)}`;
1750
+ }
1751
+ if (JSON.stringify(current.channels.map(channel => channel.name))
1752
+ !== JSON.stringify(descriptor.channels.map(channel => channel.name))) {
1753
+ return 'channels changed within lifecycle';
1754
+ }
1755
+ return undefined;
1756
+ }
1757
+
1758
+ function admissionReason(result: PeerAdmissionResult): number {
1759
+ switch (result) {
1760
+ case 'meshMismatch':
1761
+ return 2;
1762
+ case 'staleDescriptor':
1763
+ return 7;
1764
+ case 'invalidDescriptor':
1765
+ return 11;
1766
+ case 'notRequired':
1767
+ return 4;
1768
+ case 'admitted':
1769
+ return 1;
1770
+ }
1771
+ }