@zlink-systems/framework 0.25.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (557) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Channels/IZLinkFanoutClient.d.ts +0 -6
  3. package/dist/contracts/Common/CoreTypes.d.ts +6 -0
  4. package/dist/contracts/Common/CoreTypes.js +7 -0
  5. package/dist/contracts/Common/index.d.ts +1 -1
  6. package/dist/contracts/Common/index.js +0 -1
  7. package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
  8. package/dist/contracts/Configuration/InternalDefaults.js +9 -1
  9. package/dist/contracts/Configuration/Registration.d.ts +13 -2
  10. package/dist/contracts/Configuration/Registration.js +58 -36
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
  12. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
  13. package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
  14. package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
  15. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  16. package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
  17. package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
  18. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
  19. package/dist/contracts/Handlers/JsonContract.js +10 -4
  20. package/dist/contracts/Locations/Authority.d.ts +1 -1
  21. package/dist/contracts/Locations/Authority.js +3 -2
  22. package/dist/contracts/Locations/Options.js +1 -1
  23. package/dist/contracts/Locations/Stores.d.ts +12 -0
  24. package/dist/contracts/Locations/Stores.js +9 -0
  25. package/dist/contracts/RouteMesh/RuntimeTopology.d.ts +8 -0
  26. package/dist/contracts/Spots/Contracts.d.ts +1 -1
  27. package/dist/internal.d.ts +5 -0
  28. package/dist/internal.js +16 -1
  29. package/dist/nest-integration.d.ts +4 -2
  30. package/dist/nest-integration.js +14 -4
  31. package/dist/runtime/abort.d.ts +1 -0
  32. package/dist/runtime/abort.js +8 -5
  33. package/dist/runtime/activation-admission.d.ts +28 -0
  34. package/dist/runtime/activation-admission.js +57 -0
  35. package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
  36. package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
  37. package/dist/runtime/actors/actor-client.d.ts +2 -2
  38. package/dist/runtime/actors/actor-client.js +42 -143
  39. package/dist/runtime/actors/actor-context.d.ts +3 -5
  40. package/dist/runtime/actors/actor-context.js +19 -17
  41. package/dist/runtime/actors/actor-handoff.d.ts +13 -7
  42. package/dist/runtime/actors/actor-handoff.js +36 -25
  43. package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
  44. package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
  45. package/dist/runtime/actors/actor-local-native-join.js +85 -123
  46. package/dist/runtime/actors/actor-native-lookup.js +2 -8
  47. package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
  48. package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
  49. package/dist/runtime/actors/actor-remote-joiner.d.ts +3 -3
  50. package/dist/runtime/actors/actor-remote-joiner.js +11 -17
  51. package/dist/runtime/actors/actor-remote-wire.js +5 -3
  52. package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
  53. package/dist/runtime/actors/actor-request-deadline.js +31 -0
  54. package/dist/runtime/actors/actor-retry-delay.js +2 -1
  55. package/dist/runtime/actors/actor-runtime-contracts.d.ts +4 -2
  56. package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
  57. package/dist/runtime/actors/actor-runtime-state.js +70 -187
  58. package/dist/runtime/actors/actor-source-transfer.d.ts +5 -5
  59. package/dist/runtime/actors/bound-session-wire.js +2 -7
  60. package/dist/runtime/actors/deferred-join-completion.d.ts +19 -0
  61. package/dist/runtime/actors/deferred-join-completion.js +21 -0
  62. package/dist/runtime/actors/index.d.ts +10 -8
  63. package/dist/runtime/actors/index.js +101 -73
  64. package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
  65. package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
  66. package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
  67. package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
  68. package/dist/runtime/admission.d.ts +7 -1
  69. package/dist/runtime/admission.js +11 -1
  70. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
  71. package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
  72. package/dist/runtime/backend/contracts/index.d.ts +8 -33
  73. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +3 -26
  74. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
  75. package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
  76. package/dist/runtime/backend/node/node-backend-adapter-factory.d.ts +1 -2
  77. package/dist/runtime/backend/node/node-backend-adapter-factory.js +4 -18
  78. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +7 -4
  79. package/dist/runtime/backend/node/node-backend-adapter-support.js +28 -34
  80. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
  81. package/dist/runtime/backend/node/node-event-loop-poller.js +11 -6
  82. package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
  83. package/dist/runtime/backend/node/node-raw-binding-port.d.ts +1 -1
  84. package/dist/runtime/backend/node/node-raw-binding-port.js +51 -19
  85. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +21 -19
  86. package/dist/runtime/backend/node/node-raw-mesh-backend.js +171 -111
  87. package/dist/runtime/backend/node/node-socket-backend-adapter.js +4 -3
  88. package/dist/runtime/backend/raw-binding-port.d.ts +13 -1
  89. package/dist/runtime/backend/runtime-values.d.ts +4 -1
  90. package/dist/runtime/backend/runtime-values.js +2 -0
  91. package/dist/runtime/channels/channel-clients.d.ts +20 -9
  92. package/dist/runtime/channels/channel-clients.js +68 -60
  93. package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
  94. package/dist/runtime/channels/channel-envelope.js +47 -29
  95. package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
  96. package/dist/runtime/channels/channel-outbound-operations.js +9 -18
  97. package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
  98. package/dist/runtime/channels/channel-receive-loops.js +27 -6
  99. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
  100. package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
  101. package/dist/runtime/channels/channel-runtime-manager.d.ts +2 -5
  102. package/dist/runtime/channels/channel-runtime-manager.js +4 -12
  103. package/dist/runtime/channels/channel-socket-options.js +3 -2
  104. package/dist/runtime/channels/channel-socket-registry.d.ts +30 -32
  105. package/dist/runtime/channels/channel-socket-registry.js +296 -235
  106. package/dist/runtime/channels/channel-transports.d.ts +11 -20
  107. package/dist/runtime/channels/channel-transports.js +68 -47
  108. package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
  109. package/dist/runtime/channels/client-server-location-runtime.js +10 -11
  110. package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
  111. package/dist/runtime/channels/client-server-service-wire.js +32 -11
  112. package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
  113. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  114. package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
  115. package/dist/runtime/channels/fanout-location-runtime.js +133 -81
  116. package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
  117. package/dist/runtime/channels/spot-direct-envelope.js +4 -3
  118. package/dist/runtime/channels/spot-node-route-transport.js +3 -2
  119. package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
  120. package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
  121. package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
  122. package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
  123. package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
  124. package/dist/runtime/diagnostics/flow-context.js +16 -2
  125. package/dist/runtime/diagnostics/index.d.ts +4 -2
  126. package/dist/runtime/diagnostics/index.js +14 -4
  127. package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
  128. package/dist/runtime/diagnostics/message-flow.js +10 -19
  129. package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
  130. package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
  131. package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
  132. package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
  133. package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
  134. package/dist/runtime/disposal.d.ts +5 -0
  135. package/dist/runtime/disposal.js +22 -0
  136. package/dist/runtime/execution/index.d.ts +22 -9
  137. package/dist/runtime/execution/index.js +107 -37
  138. package/dist/runtime/execution/serial-execution-queue.d.ts +12 -7
  139. package/dist/runtime/execution/serial-execution-queue.js +99 -26
  140. package/dist/runtime/execution/state-lane.d.ts +8 -1
  141. package/dist/runtime/execution/state-lane.js +118 -3
  142. package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
  143. package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
  144. package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
  145. package/dist/runtime/foundation/event-loop-resources.js +6 -119
  146. package/dist/runtime/foundation/listener-records.d.ts +11 -0
  147. package/dist/runtime/foundation/listener-records.js +20 -0
  148. package/dist/runtime/foundation/operation-identity.d.ts +2 -0
  149. package/dist/runtime/foundation/operation-identity.js +9 -5
  150. package/dist/runtime/foundation/operation-registry.d.ts +5 -7
  151. package/dist/runtime/foundation/operation-registry.js +34 -44
  152. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +18 -26
  153. package/dist/runtime/foundation/raw-service-mesh-runtime.js +122 -469
  154. package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
  155. package/dist/runtime/foundation/runtime-state-projections.js +8 -0
  156. package/dist/runtime/foundation/service-authority-payload-codec.d.ts +1 -0
  157. package/dist/runtime/foundation/service-authority-payload-codec.js +30 -12
  158. package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
  159. package/dist/runtime/foundation/service-discovery-registry.js +22 -3
  160. package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
  161. package/dist/runtime/foundation/service-liveness-registry.js +2 -1
  162. package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
  163. package/dist/runtime/foundation/service-maintenance-runtime.js +23 -8
  164. package/dist/runtime/foundation/service-metadata-codec.js +3 -3
  165. package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
  166. package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
  167. package/dist/runtime/foundation/service-relocation-coordinator.d.ts +9 -0
  168. package/dist/runtime/foundation/service-relocation-coordinator.js +14 -1
  169. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +8 -0
  170. package/dist/runtime/foundation/service-relocation-object-owner.js +19 -6
  171. package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
  172. package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
  173. package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
  174. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -19
  175. package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
  176. package/dist/runtime/foundation/service-stateful-registry.js +10 -2
  177. package/dist/runtime/foundation/service-stateful-runtime.d.ts +28 -24
  178. package/dist/runtime/foundation/service-stateful-runtime.js +297 -244
  179. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +12 -7
  180. package/dist/runtime/foundation/service-stateful-wire-codec.js +240 -143
  181. package/dist/runtime/foundation/service-topology-registry.d.ts +1 -3
  182. package/dist/runtime/foundation/service-topology-registry.js +22 -61
  183. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
  184. package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
  185. package/dist/runtime/foundation/service-wire-codec.js +10 -8
  186. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  187. package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
  188. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
  189. package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
  190. package/dist/runtime/framework-errors-internal.d.ts +2 -1
  191. package/dist/runtime/framework-errors-internal.js +343 -122
  192. package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
  193. package/dist/runtime/handlers/handler-instance-scope.js +61 -74
  194. package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
  195. package/dist/runtime/host/actor-packet-relay.js +48 -91
  196. package/dist/runtime/host/actor-placement-coordinator.js +7 -5
  197. package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
  198. package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
  199. package/dist/runtime/host/actor-transfer-runtime.d.ts +28 -28
  200. package/dist/runtime/host/actor-transfer-runtime.js +210 -256
  201. package/dist/runtime/host/application-job-queue.js +16 -33
  202. package/dist/runtime/host/bound-session-relay.js +1 -1
  203. package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
  204. package/dist/runtime/host/index.d.ts +19 -14
  205. package/dist/runtime/host/index.js +234 -175
  206. package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
  207. package/dist/runtime/host/instance-activation-authority.js +17 -45
  208. package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
  209. package/dist/runtime/host/location-runtime-owner.js +2 -2
  210. package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
  211. package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
  212. package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
  213. package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
  214. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
  215. package/dist/runtime/host/remote-bound-session-relay.js +11 -23
  216. package/dist/runtime/host/route-mesh-runtime.d.ts +14 -10
  217. package/dist/runtime/host/route-mesh-runtime.js +178 -257
  218. package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
  219. package/dist/runtime/host/runtime-shutdown.js +18 -21
  220. package/dist/runtime/host/service-relocation-control.js +6 -1
  221. package/dist/runtime/host/service-relocation-host-runtime.d.ts +71 -38
  222. package/dist/runtime/host/service-relocation-host-runtime.js +816 -651
  223. package/dist/runtime/host/spot-address-transport.d.ts +2 -3
  224. package/dist/runtime/host/spot-address-transport.js +34 -136
  225. package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
  226. package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
  227. package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -7
  228. package/dist/runtime/host/spot-runtime-options-factory.js +53 -21
  229. package/dist/runtime/host/stateful-authority-route-runtime.js +6 -2
  230. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +14 -6
  231. package/dist/runtime/host/user-spot-creation-coordinator.js +96 -95
  232. package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
  233. package/dist/runtime/locations/authority-key-codec.js +4 -3
  234. package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
  235. package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
  236. package/dist/runtime/locations/creation-operation-id.js +6 -4
  237. package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
  238. package/dist/runtime/locations/in-memory-authority-store.js +31 -15
  239. package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
  240. package/dist/runtime/locations/in-memory-location-store.js +17 -14
  241. package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
  242. package/dist/runtime/locations/in-memory-provider-location-store.js +79 -27
  243. package/dist/runtime/locations/key-codec.js +3 -2
  244. package/dist/runtime/locations/lease-tracker.d.ts +3 -5
  245. package/dist/runtime/locations/lease-tracker.js +7 -11
  246. package/dist/runtime/locations/lifecycle.d.ts +5 -10
  247. package/dist/runtime/locations/lifecycle.js +4 -33
  248. package/dist/runtime/locations/location-store-failure.d.ts +2 -0
  249. package/dist/runtime/locations/location-store-failure.js +7 -0
  250. package/dist/runtime/locations/location-store-pages.d.ts +3 -0
  251. package/dist/runtime/locations/location-store-pages.js +13 -0
  252. package/dist/runtime/locations/location-store-repository.d.ts +5 -7
  253. package/dist/runtime/locations/location-store-repository.js +303 -332
  254. package/dist/runtime/locations/relocation-blob.js +18 -5
  255. package/dist/runtime/locations/resolvers.d.ts +5 -5
  256. package/dist/runtime/locations/resolvers.js +44 -30
  257. package/dist/runtime/locations/runtime.d.ts +5 -4
  258. package/dist/runtime/locations/runtime.js +123 -92
  259. package/dist/runtime/locations/spot-location-claims.d.ts +8 -2
  260. package/dist/runtime/locations/spot-location-claims.js +40 -23
  261. package/dist/runtime/messaging/payload-codec.js +26 -20
  262. package/dist/runtime/messaging/submission-result.d.ts +3 -0
  263. package/dist/runtime/messaging/submission-result.js +48 -0
  264. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +2 -0
  265. package/dist/runtime/protocol/service_wire_codec.generated.js +17 -8
  266. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +1 -0
  267. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +3 -2
  268. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +3 -3
  269. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +4 -4
  270. package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +6 -3
  271. package/dist/runtime/spots/index.d.ts +29 -29
  272. package/dist/runtime/spots/index.js +441 -313
  273. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -4
  274. package/dist/runtime/spots/spot-activation-registry.js +27 -60
  275. package/dist/runtime/spots/spot-activation-state.d.ts +2 -11
  276. package/dist/runtime/spots/spot-activation-state.js +4 -17
  277. package/dist/runtime/spots/spot-activation.d.ts +10 -9
  278. package/dist/runtime/spots/spot-activation.js +103 -81
  279. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
  280. package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
  281. package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
  282. package/dist/runtime/spots/spot-actor-join-dispatch.js +5 -55
  283. package/dist/runtime/spots/spot-actor-lifecycle-drain.js +2 -2
  284. package/dist/runtime/spots/spot-actor-membership.d.ts +7 -5
  285. package/dist/runtime/spots/spot-actor-membership.js +44 -53
  286. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
  287. package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
  288. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
  289. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
  290. package/dist/runtime/spots/spot-context.d.ts +2 -2
  291. package/dist/runtime/spots/spot-entry-activation.d.ts +3 -4
  292. package/dist/runtime/spots/spot-entry-activation.js +9 -21
  293. package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
  294. package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
  295. package/dist/runtime/spots/spot-manager-public.js +6 -5
  296. package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
  297. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +22 -21
  298. package/dist/runtime/spots/spot-node-runtime-manager.js +73 -82
  299. package/dist/runtime/spots/spot-outbound.d.ts +4 -3
  300. package/dist/runtime/spots/spot-outbound.js +10 -37
  301. package/dist/runtime/spots/spot-remote-codec.js +5 -3
  302. package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
  303. package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
  304. package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
  305. package/dist/runtime/spots/spot-route-replies.js +3 -1
  306. package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -2
  307. package/dist/runtime/spots/spot-routed-actor-admission.js +3 -2
  308. package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +2 -7
  309. package/dist/runtime/spots/spot-routed-frame-dispatch.js +1 -70
  310. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
  311. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
  312. package/dist/runtime/spots/spot-runtime-ports.d.ts +4 -20
  313. package/dist/runtime/spots/spot-serial-executor.d.ts +5 -0
  314. package/dist/runtime/spots/spot-serial-executor.js +9 -2
  315. package/dist/runtime/spots/spot-serial-turn-executor.d.ts +29 -6
  316. package/dist/runtime/spots/spot-serial-turn-executor.js +89 -13
  317. package/dist/runtime/spots/spot-timer.d.ts +3 -2
  318. package/dist/runtime/streams/actor-session-binding-registry.d.ts +17 -32
  319. package/dist/runtime/streams/actor-session-binding-registry.js +145 -367
  320. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +2 -6
  321. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
  322. package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
  323. package/dist/runtime/streams/bound-session-service.d.ts +7 -0
  324. package/dist/runtime/streams/bound-session-service.js +12 -19
  325. package/dist/runtime/streams/index.d.ts +15 -14
  326. package/dist/runtime/streams/index.js +38 -39
  327. package/dist/runtime/streams/managed-stream.d.ts +3 -0
  328. package/dist/runtime/streams/managed-stream.js +17 -8
  329. package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
  330. package/dist/runtime/streams/protocol.d.ts +6 -33
  331. package/dist/runtime/streams/protocol.js +38 -110
  332. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
  333. package/dist/runtime/streams/session-actor-coordinator.js +12 -4
  334. package/dist/runtime/streams/session-calls.d.ts +1 -1
  335. package/dist/runtime/streams/session-calls.js +5 -4
  336. package/dist/runtime/streams/session-context.d.ts +6 -6
  337. package/dist/runtime/streams/session-context.js +22 -4
  338. package/dist/runtime/streams/session-requests.js +2 -1
  339. package/dist/runtime/streams/session-serial-executor.js +2 -2
  340. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
  341. package/dist/runtime/streams/stream-frame-factory.js +2 -2
  342. package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
  343. package/dist/runtime/streams/stream-session-runtime.js +25 -33
  344. package/dist/runtime/workers/index.d.ts +2 -2
  345. package/dist/runtime/workers/index.js +5 -4
  346. package/package.json +3 -3
  347. package/src/contracts/Channels/IZLinkFanoutClient.ts +0 -7
  348. package/src/contracts/Common/CoreTypes.ts +7 -0
  349. package/src/contracts/Common/index.ts +1 -1
  350. package/src/contracts/Configuration/InternalDefaults.ts +12 -0
  351. package/src/contracts/Configuration/Registration.ts +92 -48
  352. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
  353. package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
  354. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  355. package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
  356. package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
  357. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
  358. package/src/contracts/Handlers/JsonContract.ts +14 -4
  359. package/src/contracts/Locations/Authority.ts +7 -3
  360. package/src/contracts/Locations/Options.ts +1 -1
  361. package/src/contracts/Locations/Stores.ts +14 -0
  362. package/src/contracts/RouteMesh/RuntimeTopology.ts +10 -0
  363. package/src/contracts/Spots/Contracts.ts +1 -1
  364. package/src/internal.ts +15 -0
  365. package/src/nest-integration.ts +28 -10
  366. package/src/runtime/abort.ts +6 -5
  367. package/src/runtime/activation-admission.ts +72 -0
  368. package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
  369. package/src/runtime/actors/actor-client.ts +77 -204
  370. package/src/runtime/actors/actor-context.ts +45 -39
  371. package/src/runtime/actors/actor-handoff.ts +55 -45
  372. package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
  373. package/src/runtime/actors/actor-local-native-join.ts +174 -215
  374. package/src/runtime/actors/actor-native-lookup.ts +2 -9
  375. package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
  376. package/src/runtime/actors/actor-remote-joiner.ts +15 -36
  377. package/src/runtime/actors/actor-remote-wire.ts +5 -3
  378. package/src/runtime/actors/actor-request-deadline.ts +49 -0
  379. package/src/runtime/actors/actor-retry-delay.ts +2 -1
  380. package/src/runtime/actors/actor-runtime-contracts.ts +4 -10
  381. package/src/runtime/actors/actor-runtime-state.ts +85 -247
  382. package/src/runtime/actors/actor-source-transfer.ts +5 -18
  383. package/src/runtime/actors/bound-session-wire.ts +2 -8
  384. package/src/runtime/actors/deferred-join-completion.ts +44 -0
  385. package/src/runtime/actors/index.ts +122 -88
  386. package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
  387. package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
  388. package/src/runtime/admission.ts +13 -2
  389. package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
  390. package/src/runtime/backend/contracts/index.ts +15 -42
  391. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -28
  392. package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
  393. package/src/runtime/backend/node/node-backend-adapter-factory.ts +5 -25
  394. package/src/runtime/backend/node/node-backend-adapter-support.ts +32 -35
  395. package/src/runtime/backend/node/node-event-loop-poller.ts +16 -8
  396. package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
  397. package/src/runtime/backend/node/node-raw-binding-port.ts +58 -23
  398. package/src/runtime/backend/node/node-raw-mesh-backend.ts +252 -162
  399. package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -4
  400. package/src/runtime/backend/raw-binding-port.ts +14 -1
  401. package/src/runtime/backend/runtime-values.ts +4 -1
  402. package/src/runtime/channels/channel-clients.ts +132 -96
  403. package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
  404. package/src/runtime/channels/channel-envelope.ts +58 -29
  405. package/src/runtime/channels/channel-outbound-operations.ts +10 -31
  406. package/src/runtime/channels/channel-receive-loops.ts +39 -7
  407. package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
  408. package/src/runtime/channels/channel-runtime-manager.ts +8 -15
  409. package/src/runtime/channels/channel-socket-options.ts +8 -2
  410. package/src/runtime/channels/channel-socket-registry.ts +369 -262
  411. package/src/runtime/channels/channel-transports.ts +161 -115
  412. package/src/runtime/channels/client-server-location-runtime.ts +17 -17
  413. package/src/runtime/channels/client-server-service-wire.ts +40 -12
  414. package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
  415. package/src/runtime/channels/fanout-location-runtime.ts +175 -106
  416. package/src/runtime/channels/spot-direct-envelope.ts +1 -1
  417. package/src/runtime/channels/spot-node-route-transport.ts +5 -2
  418. package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
  419. package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
  420. package/src/runtime/diagnostics/flow-context.ts +16 -2
  421. package/src/runtime/diagnostics/index.ts +27 -17
  422. package/src/runtime/diagnostics/message-flow.ts +15 -25
  423. package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
  424. package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
  425. package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
  426. package/src/runtime/disposal.ts +19 -0
  427. package/src/runtime/execution/index.ts +116 -38
  428. package/src/runtime/execution/serial-execution-queue.ts +179 -34
  429. package/src/runtime/execution/state-lane.ts +142 -4
  430. package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
  431. package/src/runtime/foundation/event-loop-resources.ts +5 -122
  432. package/src/runtime/foundation/listener-records.ts +21 -0
  433. package/src/runtime/foundation/operation-identity.ts +11 -5
  434. package/src/runtime/foundation/operation-registry.ts +33 -50
  435. package/src/runtime/foundation/raw-service-mesh-runtime.ts +170 -571
  436. package/src/runtime/foundation/runtime-state-projections.ts +9 -1
  437. package/src/runtime/foundation/service-authority-payload-codec.ts +41 -13
  438. package/src/runtime/foundation/service-discovery-registry.ts +32 -3
  439. package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
  440. package/src/runtime/foundation/service-liveness-registry.ts +2 -1
  441. package/src/runtime/foundation/service-maintenance-runtime.ts +30 -19
  442. package/src/runtime/foundation/service-metadata-codec.ts +2 -2
  443. package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
  444. package/src/runtime/foundation/service-relocation-coordinator.ts +13 -0
  445. package/src/runtime/foundation/service-relocation-object-owner.ts +23 -7
  446. package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
  447. package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
  448. package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -25
  449. package/src/runtime/foundation/service-stateful-registry.ts +14 -2
  450. package/src/runtime/foundation/service-stateful-runtime.ts +435 -327
  451. package/src/runtime/foundation/service-stateful-wire-codec.ts +329 -199
  452. package/src/runtime/foundation/service-topology-registry.ts +30 -79
  453. package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
  454. package/src/runtime/foundation/service-wire-codec.ts +15 -8
  455. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  456. package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
  457. package/src/runtime/framework-errors-internal.ts +380 -134
  458. package/src/runtime/handlers/handler-instance-scope.ts +68 -95
  459. package/src/runtime/host/actor-packet-relay.ts +57 -147
  460. package/src/runtime/host/actor-placement-coordinator.ts +8 -5
  461. package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
  462. package/src/runtime/host/actor-transfer-runtime.ts +266 -418
  463. package/src/runtime/host/application-job-queue.ts +28 -34
  464. package/src/runtime/host/bound-session-relay.ts +1 -2
  465. package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
  466. package/src/runtime/host/index.ts +408 -312
  467. package/src/runtime/host/instance-activation-authority.ts +89 -109
  468. package/src/runtime/host/location-runtime-owner.ts +4 -2
  469. package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
  470. package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
  471. package/src/runtime/host/remote-bound-session-relay.ts +12 -44
  472. package/src/runtime/host/route-mesh-runtime.ts +236 -275
  473. package/src/runtime/host/runtime-shutdown.ts +17 -21
  474. package/src/runtime/host/service-relocation-control.ts +14 -1
  475. package/src/runtime/host/service-relocation-host-runtime.ts +1161 -904
  476. package/src/runtime/host/spot-address-transport.ts +73 -195
  477. package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
  478. package/src/runtime/host/spot-runtime-options-factory.ts +92 -30
  479. package/src/runtime/host/stateful-authority-route-runtime.ts +8 -4
  480. package/src/runtime/host/user-spot-creation-coordinator.ts +182 -163
  481. package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
  482. package/src/runtime/locations/authority-key-codec.ts +7 -3
  483. package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
  484. package/src/runtime/locations/creation-operation-id.ts +6 -3
  485. package/src/runtime/locations/domain-store-contract.ts +12 -3
  486. package/src/runtime/locations/in-memory-authority-store.ts +44 -15
  487. package/src/runtime/locations/in-memory-location-store.ts +50 -39
  488. package/src/runtime/locations/in-memory-provider-location-store.ts +110 -31
  489. package/src/runtime/locations/key-codec.ts +3 -2
  490. package/src/runtime/locations/lease-tracker.ts +8 -14
  491. package/src/runtime/locations/lifecycle.ts +16 -45
  492. package/src/runtime/locations/location-store-failure.ts +4 -0
  493. package/src/runtime/locations/location-store-pages.ts +18 -0
  494. package/src/runtime/locations/location-store-repository.ts +450 -478
  495. package/src/runtime/locations/relocation-blob.ts +17 -6
  496. package/src/runtime/locations/resolvers.ts +90 -58
  497. package/src/runtime/locations/runtime.ts +220 -110
  498. package/src/runtime/locations/spot-location-claims.ts +54 -26
  499. package/src/runtime/messaging/payload-codec.ts +35 -24
  500. package/src/runtime/messaging/submission-result.ts +57 -1
  501. package/src/runtime/protocol/service_wire_codec.generated.ts +27 -10
  502. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +4 -4
  503. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +6 -6
  504. package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +6 -3
  505. package/src/runtime/spots/index.ts +687 -437
  506. package/src/runtime/spots/spot-activation-registry.ts +42 -71
  507. package/src/runtime/spots/spot-activation-state.ts +4 -16
  508. package/src/runtime/spots/spot-activation.ts +167 -115
  509. package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
  510. package/src/runtime/spots/spot-actor-join-dispatch.ts +25 -79
  511. package/src/runtime/spots/spot-actor-lifecycle-drain.ts +20 -18
  512. package/src/runtime/spots/spot-actor-membership.ts +107 -75
  513. package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
  514. package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
  515. package/src/runtime/spots/spot-context.ts +3 -3
  516. package/src/runtime/spots/spot-entry-activation.ts +13 -33
  517. package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
  518. package/src/runtime/spots/spot-manager-public.ts +29 -21
  519. package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
  520. package/src/runtime/spots/spot-node-runtime-manager.ts +145 -140
  521. package/src/runtime/spots/spot-outbound.ts +47 -68
  522. package/src/runtime/spots/spot-remote-codec.ts +7 -3
  523. package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
  524. package/src/runtime/spots/spot-route-replies.ts +6 -4
  525. package/src/runtime/spots/spot-routed-actor-admission.ts +13 -6
  526. package/src/runtime/spots/spot-routed-frame-dispatch.ts +6 -77
  527. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
  528. package/src/runtime/spots/spot-runtime-ports.ts +10 -43
  529. package/src/runtime/spots/spot-serial-executor.ts +10 -2
  530. package/src/runtime/spots/spot-serial-turn-executor.ts +120 -13
  531. package/src/runtime/spots/spot-timer.ts +3 -2
  532. package/src/runtime/streams/actor-session-binding-registry.ts +182 -560
  533. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +1 -19
  534. package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
  535. package/src/runtime/streams/bound-session-service.ts +23 -37
  536. package/src/runtime/streams/index.ts +102 -88
  537. package/src/runtime/streams/managed-stream.ts +29 -10
  538. package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
  539. package/src/runtime/streams/protocol.ts +34 -88
  540. package/src/runtime/streams/session-actor-coordinator.ts +17 -5
  541. package/src/runtime/streams/session-calls.ts +6 -5
  542. package/src/runtime/streams/session-context.ts +54 -10
  543. package/src/runtime/streams/session-requests.ts +2 -1
  544. package/src/runtime/streams/session-serial-executor.ts +2 -2
  545. package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
  546. package/src/runtime/streams/stream-frame-factory.ts +2 -3
  547. package/src/runtime/streams/stream-session-runtime.ts +57 -59
  548. package/src/runtime/workers/index.ts +13 -12
  549. package/dist/runtime/actors/deferred-join-accepted-journal.d.ts +0 -47
  550. package/dist/runtime/actors/deferred-join-accepted-journal.js +0 -992
  551. package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
  552. package/dist/runtime/actors/post-commit-actor-location.js +0 -72
  553. package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
  554. package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
  555. package/src/runtime/actors/deferred-join-accepted-journal.ts +0 -1346
  556. package/src/runtime/actors/post-commit-actor-location.ts +0 -121
  557. package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
@@ -1,29 +1,29 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RawServiceMeshRuntime = void 0;
4
- const node_crypto_1 = require("node:crypto");
5
- const runtime_values_1 = require("../backend/runtime-values");
3
+ exports.RawServiceMeshRuntime = exports.RAW_MESH_RECEIVE_TIME_BUDGET_MS = void 0;
4
+ const node_os_1 = require("node:os");
6
5
  const application_ingress_record_owner_1 = require("../application-jobs/application-ingress-record-owner");
6
+ const runtime_values_1 = require("../backend/runtime-values");
7
+ const service_wire_codec_generated_1 = require("../protocol/service_wire_codec.generated");
7
8
  const operation_registry_1 = require("./operation-registry");
8
9
  const service_liveness_registry_1 = require("./service-liveness-registry");
9
10
  const service_mailbox_1 = require("./service-mailbox");
10
11
  const service_topology_registry_1 = require("./service-topology-registry");
11
- const service_wire_m6a_codec_1 = require("./service-wire-m6a-codec");
12
12
  const service_wire_codec_1 = require("./service-wire-codec");
13
13
  const service_wire_constants_generated_1 = require("./service-wire-constants.generated");
14
- const MONITOR_DISCONNECTED = 0x0200;
15
- const MONITOR_CONNECTION_READY = 0x1000;
16
- const MONITOR_CONNECTION_READY_EDGE = 1;
14
+ const service_wire_m6a_codec_1 = require("./service-wire-m6a-codec");
15
+ const nativeErrnoValues = node_os_1.constants.errno;
17
16
  // Framework error code 13 (RequestTargetNotFound) is encoded as 14 on a
18
17
  // RequestResult.NotFound reply. Boundary transport results keep failureCode 0.
19
- const REQUEST_TARGET_NOT_FOUND_FAILURE_CODE = 14;
18
+ const RAW_MESH_RECEIVE_RECORD_BUDGET = 64;
19
+ const RAW_MESH_RECEIVE_BYTE_BUDGET = 4 * 1024 * 1024;
20
+ exports.RAW_MESH_RECEIVE_TIME_BUDGET_MS = 2;
21
+ const REQUEST_TARGET_NOT_FOUND_FAILURE_CODE = service_wire_constants_generated_1.ServiceWireFrameworkErrorCode.requestTargetNotFound;
20
22
  const livenessCodec = (0, service_wire_codec_1.createServiceWireCodec)({
21
- magic: [0x5a, 0x4d],
22
- major: 1,
23
+ magic: service_wire_constants_generated_1.SERVICE_WIRE_MAGIC,
24
+ major: service_wire_constants_generated_1.SERVICE_WIRE_MAJOR,
23
25
  commands: service_wire_m6a_codec_1.M6aServiceWireCommand
24
26
  });
25
- const MAX_PENDING_MONITOR_EVENTS = 8192;
26
- const MAX_UNRESOLVED_CONNECTION_CANDIDATES = 4096;
27
27
  /**
28
28
  * RouteMesh M6A runtime built only on the public raw binding package.
29
29
  * It owns protocol, admission, mailbox, request and liveness state.
@@ -32,21 +32,15 @@ class RawServiceMeshRuntime {
32
32
  topology;
33
33
  mailbox;
34
34
  liveness;
35
- operations = new operation_registry_1.OperationRegistry();
35
+ operations;
36
36
  expectedPeers = new Map();
37
37
  endpointOnlyPeers = new Set();
38
38
  peerConnectionIntentRemoved = new Set();
39
- connectionCandidates = new Map();
40
- unresolvedConnectionCandidates = [];
41
- connectionIds = new Map();
42
39
  /**
43
- * The monitor drain updates this fence before the event reaches the
44
- * normal runtime handler. `null` means that the last observed pair is no
45
- * longer usable by the application route.
40
+ * The last observed Core selected route of each RID (Core ROUTER §10.1):
41
+ * RID -> route generation. Only `observeSelectedRoutes` replaces it.
46
42
  */
47
- monitorConnectionStates = new Map();
48
- monitorEvents = [];
49
- monitorDrainBuffer = [];
43
+ selectedRoutes = new Map();
50
44
  bindingPort;
51
45
  applicationJobQueue;
52
46
  peerAdmissionSealed;
@@ -59,11 +53,11 @@ class RawServiceMeshRuntime {
59
53
  descriptor;
60
54
  host;
61
55
  router;
62
- monitor;
63
56
  nextCorrelation = 1n;
64
57
  serviceIngress;
65
58
  closed = false;
66
59
  constructor(options) {
60
+ this.operations = new operation_registry_1.OperationRegistry(undefined, options.onPendingOperationsChanged);
67
61
  this.descriptor = options.descriptor;
68
62
  this.topology = new service_topology_registry_1.ServiceTopologyRegistry(options.descriptor);
69
63
  this.mailbox = new service_mailbox_1.ServiceMailbox(options.onMailboxReady);
@@ -102,8 +96,6 @@ class RawServiceMeshRuntime {
102
96
  };
103
97
  this.topology.publishLocal(next);
104
98
  this.descriptor = next;
105
- this.monitor = router.monitor();
106
- this.pullMonitorEvents();
107
99
  this.host = host;
108
100
  this.router = router;
109
101
  }
@@ -117,32 +109,32 @@ class RawServiceMeshRuntime {
117
109
  }
118
110
  connectPeer(endpoint, expected) {
119
111
  this.requireStarted().connectToRoutingId(expected.nodeRoutingId, endpoint);
120
- this.expectedPeers.set(expected.nodeRoutingId, {
112
+ this.expectedPeers.set(expected.nodeRoutingId, Object.assign(this.expectedPeers.get(expected.nodeRoutingId) ?? {}, {
121
113
  meshName: expected.meshName,
122
114
  nodeRoutingId: expected.nodeRoutingId,
123
115
  endpoint,
124
116
  securityIdentity: expected.securityIdentity,
125
117
  lifecycleGeneration: expected.lifecycleGeneration
126
- });
118
+ }));
127
119
  }
128
120
  connectPeerByRoutingId(endpoint, nodeRoutingId, securityIdentity, lifecycleGeneration) {
129
121
  this.requireStarted().connectToRoutingId(nodeRoutingId, endpoint);
130
- this.expectedPeers.set(nodeRoutingId, {
122
+ this.expectedPeers.set(nodeRoutingId, Object.assign(this.expectedPeers.get(nodeRoutingId) ?? {}, {
131
123
  meshName: this.topology.localDescriptor().meshName,
132
124
  nodeRoutingId,
133
125
  endpoint,
134
126
  securityIdentity,
135
127
  lifecycleGeneration
136
- });
128
+ }));
137
129
  }
138
130
  expectPeerByRoutingId(endpoint, nodeRoutingId, securityIdentity, lifecycleGeneration) {
139
- this.expectedPeers.set(nodeRoutingId, {
131
+ this.expectedPeers.set(nodeRoutingId, Object.assign(this.expectedPeers.get(nodeRoutingId) ?? {}, {
140
132
  meshName: this.topology.localDescriptor().meshName,
141
133
  nodeRoutingId,
142
134
  endpoint,
143
135
  securityIdentity,
144
136
  lifecycleGeneration
145
- });
137
+ }));
146
138
  }
147
139
  connectPeerEndpoint(endpoint) {
148
140
  this.requireStarted().connect(endpoint);
@@ -230,31 +222,34 @@ class RawServiceMeshRuntime {
230
222
  listener(nodeRoutingId);
231
223
  }
232
224
  async announcePeer(nodeRoutingId) {
233
- if (!this.expectedPeers.has(nodeRoutingId) || this.peerAdmissionSealed?.() === true)
225
+ const expected = this.expectedPeers.get(nodeRoutingId);
226
+ const generation = this.selectedRoutes.get(nodeRoutingId);
227
+ if (expected === undefined ||
228
+ generation === undefined ||
229
+ expected.helloSubmittedGeneration === generation ||
230
+ this.peerAdmissionSealed?.() === true)
234
231
  return false;
235
- return this.send(nodeRoutingId, [
232
+ const accepted = await this.send(nodeRoutingId, [
236
233
  (0, service_wire_m6a_codec_1.encodeRouteMeshAdmission)(service_wire_m6a_codec_1.M6aServiceWireCommand.hello, this.topology.localDescriptor())
237
234
  ]);
235
+ if (accepted &&
236
+ this.expectedPeers.get(nodeRoutingId) === expected &&
237
+ this.selectedRoutes.get(nodeRoutingId) === generation)
238
+ expected.helloSubmittedGeneration = generation;
239
+ return accepted;
238
240
  }
239
241
  isPeerRouteReady(nodeRoutingId, lifecycleGeneration) {
242
+ // Admission is bound to the observed selected route: the route observer
243
+ // removes the peer when that route ends or is replaced.
240
244
  const peer = this.topology.peer(nodeRoutingId);
241
- const monitorConnection = this.monitorConnectionStates.get(nodeRoutingId);
242
- const applicationRouteReady = monitorConnection === undefined || monitorConnection === peer?.connectionId;
243
- const ready = peer !== undefined &&
245
+ return (peer !== undefined &&
244
246
  (lifecycleGeneration === undefined ||
245
247
  peer.descriptor.lifecycleGeneration === lifecycleGeneration) &&
246
- applicationRouteReady &&
247
- this.liveness.isReady(nodeRoutingId, peer.connectionId);
248
- return ready;
248
+ this.liveness.isReady(nodeRoutingId, peer.connectionId));
249
249
  }
250
250
  async announceExpectedPeers() {
251
251
  let accepted = 0;
252
252
  for (const nodeRoutingId of this.expectedPeers.keys()) {
253
- // Admission is a one-time fence for the current physical connection.
254
- // Re-sending Hello after the peer is admitted would re-run admission on
255
- // every poll and reset the liveness record before application traffic
256
- // can use the route. A disconnected peer is removed by monitor handling
257
- // and remains eligible for the next admission attempt.
258
253
  if (this.topology.peer(nodeRoutingId) !== undefined)
259
254
  continue;
260
255
  if (await this.announcePeer(nodeRoutingId))
@@ -288,7 +283,6 @@ class RawServiceMeshRuntime {
288
283
  for (const peer of this.topology.peers()) {
289
284
  await this.send(peer.descriptor.nodeRoutingId, [update]);
290
285
  }
291
- await this.announceExpectedPeers();
292
286
  }
293
287
  replaceDiscoveredNotRequired(descriptors) {
294
288
  this.topology.replaceDiscoveredNotRequired(descriptors);
@@ -308,25 +302,6 @@ class RawServiceMeshRuntime {
308
302
  return selection.submitResult;
309
303
  const selected = selection.peer;
310
304
  const applicationFrame = this.applicationFrame(payload);
311
- if (selected.descriptor.nodeRoutingId === this.descriptor.nodeRoutingId) {
312
- const applicationJobOwner = await this.reserveLocalIngress();
313
- try {
314
- const applicationJob = await applicationJobOwner.acquire('application');
315
- const accepted = this.mailbox.tryEnqueue({
316
- owner: `channel:${channelName}`,
317
- domain: 'application',
318
- parts: [(0, service_wire_m6a_codec_1.encodeChannelSendHeader)(channelName), applicationFrame],
319
- sourceRoutingId: this.descriptor.nodeRoutingId,
320
- applicationJob
321
- });
322
- if (!accepted)
323
- applicationJob.close();
324
- return accepted ? runtime_values_1.SubmitResult.Ok : runtime_values_1.SubmitResult.NotAdmitted;
325
- }
326
- finally {
327
- applicationJobOwner.close();
328
- }
329
- }
330
305
  return (await this.send(selected.descriptor.nodeRoutingId, [
331
306
  (0, service_wire_m6a_codec_1.encodeChannelSendHeader)(channelName),
332
307
  applicationFrame
@@ -347,7 +322,7 @@ class RawServiceMeshRuntime {
347
322
  return this.requestToTarget(selection.peer.descriptor.nodeRoutingId, payload, timeoutMs, channelName);
348
323
  }
349
324
  selectChannelTarget(channelName) {
350
- const selected = this.topology.selectChannel(channelName, (peer) => this.isLocalOrReadyPeer(peer.descriptor.nodeRoutingId));
325
+ const selected = this.topology.selectChannel(channelName, (peer) => this.isPeerRouteReady(peer.descriptor.nodeRoutingId));
351
326
  if (selected !== undefined)
352
327
  return { kind: 'selected', peer: selected };
353
328
  return this.topology.hasKnownChannelTarget(channelName)
@@ -365,9 +340,6 @@ class RawServiceMeshRuntime {
365
340
  }
366
341
  };
367
342
  }
368
- isLocalOrReadyPeer(nodeRoutingId) {
369
- return nodeRoutingId === this.descriptor.nodeRoutingId || this.isPeerRouteReady(nodeRoutingId);
370
- }
371
343
  setServiceIngress(handler) {
372
344
  if (this.serviceIngress !== undefined && this.serviceIngress !== handler) {
373
345
  throw new Error('Raw service ingress is already registered.');
@@ -410,22 +382,22 @@ class RawServiceMeshRuntime {
410
382
  ]);
411
383
  }
412
384
  async pumpOne(nowMs = performance.now(), observe) {
413
- this.pullMonitorEvents();
414
385
  return this.receiveOne(nowMs, observe);
415
386
  }
416
387
  setReadableHandler(handler) {
417
388
  this.requireStarted().setReadableHandler(handler);
418
389
  }
419
390
  /** Returns whether a receive budget ended before no-data; idle ticks only maintain peers. */
420
- async pumpBatch(receiveReady = true) {
421
- await this.drainMonitorEvents();
391
+ async pumpBatch(receiveReady = true, routeReady = false) {
392
+ if (routeReady)
393
+ await this.observeSelectedRoutes();
422
394
  const startedAtMs = performance.now();
423
395
  let messages = 0;
424
396
  let bytes = 0;
425
397
  const observe = (_source, byteCount) => {
426
398
  bytes += byteCount;
427
399
  };
428
- while (receiveReady && messages < 64 && !this.closed) {
400
+ while (receiveReady && messages < RAW_MESH_RECEIVE_RECORD_BUDGET && !this.closed) {
429
401
  const result = await this.receiveOne(performance.now(), observe);
430
402
  if (result === 'noData') {
431
403
  receiveReady = false;
@@ -434,7 +406,8 @@ class RawServiceMeshRuntime {
434
406
  messages += 1;
435
407
  // Core owns the per-peer fair-queue cursor. The Framework limit bounds
436
408
  // the entire round, so changing peers does not renew its byte/count budget.
437
- if (bytes >= 4 * 1024 * 1024 || performance.now() - startedAtMs >= 2)
409
+ if (bytes >= RAW_MESH_RECEIVE_BYTE_BUDGET ||
410
+ performance.now() - startedAtMs >= exports.RAW_MESH_RECEIVE_TIME_BUDGET_MS)
438
411
  break;
439
412
  }
440
413
  if (!this.closed) {
@@ -483,22 +456,6 @@ class RawServiceMeshRuntime {
483
456
  applicationJobOwner.close();
484
457
  }
485
458
  }
486
- pullMonitorEvents() {
487
- this.monitor?.drain((event) => {
488
- this.observeMonitorEvent(event);
489
- if (this.monitorEvents.length < MAX_PENDING_MONITOR_EVENTS) {
490
- this.monitorEvents.push(event);
491
- return;
492
- }
493
- const existingIndex = this.monitorEvents.findIndex((candidate) => sameMonitorConnection(candidate, event));
494
- if (existingIndex >= 0)
495
- this.monitorEvents[existingIndex] = event;
496
- else {
497
- this.monitorEvents.shift();
498
- this.monitorEvents.push(event);
499
- }
500
- });
501
- }
502
459
  reportProtocolError(received) {
503
460
  const request = received.requestSeq !== undefined;
504
461
  const replied = request && this.replyGenericProtocolError(received);
@@ -561,11 +518,12 @@ class RawServiceMeshRuntime {
561
518
  if (expected !== undefined &&
562
519
  (expected.meshName !== descriptor.meshName ||
563
520
  expected.nodeRoutingId !== descriptor.nodeRoutingId)) {
564
- await this.send(received.sourceRid, [(0, service_wire_m6a_codec_1.encodeReject)(3)]);
521
+ await this.send(received.sourceRid, [
522
+ (0, service_wire_m6a_codec_1.encodeReject)((0, service_wire_codec_generated_1.enumWireRejectReason)('identityMismatch'))
523
+ ]);
565
524
  return 'infrastructure';
566
525
  }
567
- const connection = this.currentConnectionCandidate(received.sourceRid, descriptor.advertisedEndpoint);
568
- const result = this.admitPeer(descriptor, connection, nowMs, expected);
526
+ const result = this.admitPeer(descriptor, routeConnectionId(received.routeGeneration), nowMs, expected);
569
527
  if (result !== 'admitted' && result !== 'notRequired') {
570
528
  const detail = result === 'invalidDescriptor'
571
529
  ? describeInvalidAdmissionDescriptor(descriptor, expected, this.topology.peer(descriptor.nodeRoutingId)?.descriptor)
@@ -593,25 +551,7 @@ class RawServiceMeshRuntime {
593
551
  if (header.command === service_wire_m6a_codec_1.M6aServiceWireCommand.reject) {
594
552
  if (received.parts.length !== 1)
595
553
  return 'protocolError';
596
- const reason = (0, service_wire_m6a_codec_1.decodeReject)(received.parts[0]);
597
- // A reject belongs to one physical candidate, but the wire record does
598
- // not carry that candidate's connection id. Keep an already admitted
599
- // peer: bilateral manual connect can reject the duplicate after the
600
- // other candidate has become Ready.
601
- if (reason === 4 && this.topology.peer(received.sourceRid) === undefined) {
602
- const expected = this.expectedPeers.get(received.sourceRid);
603
- const local = this.topology.localDescriptor();
604
- this.topology.markNotRequired({
605
- ...local,
606
- nodeRoutingId: received.sourceRid,
607
- lifecycleGeneration: 1n,
608
- descriptorRevision: 1n,
609
- advertisedEndpoint: expected?.endpoint ?? local.advertisedEndpoint,
610
- channels: [],
611
- objectRole: 'client'
612
- });
613
- this.retireNotRequiredExpectedPeer(received.sourceRid);
614
- }
554
+ (0, service_wire_m6a_codec_1.decodeReject)(received.parts[0]);
615
555
  return 'infrastructure';
616
556
  }
617
557
  const peer = this.topology.peer(received.sourceRid);
@@ -737,6 +677,12 @@ class RawServiceMeshRuntime {
737
677
  throw error;
738
678
  }
739
679
  }
680
+ expireOperations(nowMs, turnDeadlineMs) {
681
+ return this.operations.expire(nowMs, turnDeadlineMs);
682
+ }
683
+ get pendingOperationCount() {
684
+ return this.operations.size;
685
+ }
740
686
  async tickLiveness(nowMs = performance.now()) {
741
687
  const result = this.liveness.tick(nowMs);
742
688
  this.requireStarted();
@@ -752,126 +698,55 @@ class RawServiceMeshRuntime {
752
698
  const peer = this.topology.peer(nodeRoutingId);
753
699
  if (peer === undefined)
754
700
  continue;
755
- // Liveness timeout is a semantic peer removal. Route topology,
756
- // physical candidate state, and auto-connect intent must be retired by
757
- // the same owner so a failed endpoint cannot be selected again.
758
- this.removeConnectionCandidate(nodeRoutingId, peer.connectionId);
701
+ // Liveness timeout is a semantic peer removal of the admitted route.
759
702
  this.removePeer(peer);
760
703
  }
761
704
  return result;
762
705
  }
763
- async drainMonitorEvents(nowMs = performance.now()) {
764
- this.pullMonitorEvents();
765
- let handled = 0;
766
- // Detach the current batch so monitor pulls that run while an event is
767
- // being handled append to the next batch without copying or reindexing it.
768
- const events = this.monitorEvents;
769
- this.monitorEvents = this.monitorDrainBuffer;
770
- this.monitorDrainBuffer = events;
771
- this.monitorEvents.length = 0;
772
- for (const event of events) {
773
- handled++;
774
- const nodeRoutingId = event.routingId ?? this.expectedPeerRoutingId(event.remoteAddress);
775
- if (event.event === MONITOR_CONNECTION_READY && isConnectionReadyEdge(event)) {
776
- if (nodeRoutingId === undefined) {
777
- const candidate = this.createUnresolvedConnectionCandidate(event);
778
- const alreadyQueued = this.unresolvedConnectionCandidates.some((value) => value.connectionId === candidate.connectionId);
779
- if (!alreadyQueued &&
780
- this.unresolvedConnectionCandidates.length < MAX_UNRESOLVED_CONNECTION_CANDIDATES) {
781
- this.unresolvedConnectionCandidates.push(candidate);
782
- }
783
- continue;
784
- }
785
- if (!this.acceptsExpectedMonitorEndpoint(nodeRoutingId, event)) {
786
- continue;
787
- }
788
- const candidate = this.createConnectionCandidate(nodeRoutingId, event);
789
- const existingPeer = this.topology.peer(nodeRoutingId);
790
- if (existingPeer !== undefined && existingPeer.connectionId === candidate.connectionId) {
791
- this.monitorConnectionStates.set(nodeRoutingId, candidate.connectionId);
792
- continue;
793
- }
794
- if (existingPeer !== undefined) {
795
- if (this.liveness.isReady(nodeRoutingId, existingPeer.connectionId)) {
796
- const existingCandidate = this.connectionCandidates
797
- .get(nodeRoutingId)
798
- ?.get(existingPeer.connectionId);
799
- if (this.isDiscoveredLifecycleReplacement(existingPeer, nodeRoutingId)) {
800
- // A current discovery descriptor with the same RID but a
801
- // different lifecycle token denotes a replacement process.
802
- // Keep its physical pair provisional until its Hello passes
803
- // the descriptor fence; the old ready peer remains semantic
804
- // current until then.
805
- let provisionalCandidates = this.connectionCandidates.get(nodeRoutingId);
806
- if (provisionalCandidates === undefined) {
807
- provisionalCandidates = new Map();
808
- this.connectionCandidates.set(nodeRoutingId, provisionalCandidates);
809
- }
810
- provisionalCandidates.set(candidate.connectionId, candidate);
811
- await this.announcePeer(nodeRoutingId);
812
- continue;
813
- }
814
- if (existingCandidate?.connectionId === candidate.connectionId) {
815
- this.removeConnectionCandidate(nodeRoutingId, candidate.connectionId);
816
- this.monitorConnectionStates.set(nodeRoutingId, existingPeer.connectionId);
817
- continue;
818
- }
819
- // A non-replacement ready route is the current semantic owner.
820
- // A second physical candidate may be admitted only after the
821
- // current lease expires; this also prevents a late old-process
822
- // reconnect from replacing the ready replacement by arrival order.
823
- this.removeConnectionCandidate(nodeRoutingId, candidate.connectionId);
824
- continue;
825
- }
826
- // Keep the physical candidate until the wire descriptor decides
827
- // whether it is the current logical peer. READY events can race
828
- // with DISCONNECTED events during reconnect; rejecting the READY
829
- // here can terminate the replacement before admission evaluates its
830
- // lifecycle generation.
831
- let provisionalCandidates = this.connectionCandidates.get(nodeRoutingId);
832
- if (provisionalCandidates === undefined) {
833
- provisionalCandidates = new Map();
834
- this.connectionCandidates.set(nodeRoutingId, provisionalCandidates);
835
- }
836
- provisionalCandidates.set(candidate.connectionId, candidate);
837
- this.connectionIds.set(nodeRoutingId, candidate.connectionId);
838
- await this.announcePeer(nodeRoutingId);
839
- continue;
840
- }
841
- let candidates = this.connectionCandidates.get(nodeRoutingId);
842
- if (candidates === undefined) {
843
- candidates = new Map();
844
- this.connectionCandidates.set(nodeRoutingId, candidates);
845
- }
846
- candidates.set(candidate.connectionId, candidate);
847
- // Before wire admission the monitor candidate is the only physical
848
- // route evidence available to the admission message.
849
- this.connectionIds.set(nodeRoutingId, candidate.connectionId);
850
- await this.announcePeer(nodeRoutingId);
851
- }
852
- else if (event.event === MONITOR_DISCONNECTED && nodeRoutingId !== undefined) {
853
- const peer = this.topology.peer(nodeRoutingId);
854
- const disconnectedId = monitorConnectionId(event, nodeRoutingId);
855
- this.removeConnectionCandidate(nodeRoutingId, disconnectedId);
856
- if (peer !== undefined && peer.connectionId === disconnectedId) {
857
- this.removePeer(peer);
858
- }
859
- }
860
- else if (event.event === MONITOR_DISCONNECTED) {
861
- const disconnectedId = monitorConnectionId(event);
862
- const index = this.unresolvedConnectionCandidates.findIndex((candidate) => candidate.connectionId === disconnectedId);
863
- if (index >= 0)
864
- this.unresolvedConnectionCandidates.splice(index, 1);
706
+ /**
707
+ * The socket's one route observer (Core ROUTER §10.1). It replaces the
708
+ * observation with Core's selected-route snapshot, ends the admission of
709
+ * every RID whose observed route disappeared or was replaced, and starts the
710
+ * handshake of every newly selected route. Returns the number of changes.
711
+ */
712
+ async observeSelectedRoutes() {
713
+ const router = this.router;
714
+ if (router === undefined || this.closed)
715
+ return 0;
716
+ const observed = new Map();
717
+ for (const route of router.routesSnapshot()) {
718
+ observed.set(route.routingId, route.routeGeneration);
719
+ }
720
+ let changes = 0;
721
+ for (const [nodeRoutingId, generation] of this.selectedRoutes) {
722
+ if (observed.get(nodeRoutingId) === generation)
723
+ continue;
724
+ changes++;
725
+ const expected = this.expectedPeers.get(nodeRoutingId);
726
+ if (expected !== undefined)
727
+ delete expected.helloSubmittedGeneration;
728
+ const peer = this.topology.peer(nodeRoutingId);
729
+ if (peer !== undefined && peer.connectionId === routeConnectionId(generation)) {
730
+ this.removePeer(peer);
865
731
  }
866
732
  }
867
- this.monitorDrainBuffer.length = 0;
868
- void nowMs;
869
- return handled;
733
+ const selected = [];
734
+ for (const [nodeRoutingId, generation] of observed) {
735
+ if (this.selectedRoutes.get(nodeRoutingId) === generation)
736
+ continue;
737
+ if (!this.selectedRoutes.has(nodeRoutingId))
738
+ changes++;
739
+ selected.push(nodeRoutingId);
740
+ }
741
+ this.selectedRoutes = observed;
742
+ // A new selected route admits only through a new handshake.
743
+ for (const nodeRoutingId of selected)
744
+ await this.announcePeer(nodeRoutingId);
745
+ return changes;
870
746
  }
871
747
  close() {
872
748
  if (this.closed)
873
749
  return;
874
- this.closed = true;
875
750
  this.applicationJobStop.abort(new Error('Raw service runtime application job admission stopped.'));
876
751
  this.mailbox.close();
877
752
  this.operations.close('Raw service runtime closed.');
@@ -880,13 +755,12 @@ class RawServiceMeshRuntime {
880
755
  if (router !== undefined) {
881
756
  this.applicationJobQueue.unregisterReceiveFlowTarget?.(router);
882
757
  }
883
- this.monitor?.close();
884
- this.monitor = undefined;
885
758
  const host = this.host;
886
- this.router = undefined;
887
- this.host = undefined;
888
759
  if (host !== undefined)
889
760
  host.close();
761
+ this.router = undefined;
762
+ this.host = undefined;
763
+ this.closed = true;
890
764
  }
891
765
  requestToTarget(targetNodeRoutingId, payload, timeoutMs, channelName) {
892
766
  const correlation = this.nextCorrelation++;
@@ -908,13 +782,12 @@ class RawServiceMeshRuntime {
908
782
  for (;;) {
909
783
  const alternate = this.topology.selectChannel(channelName, (peer) => {
910
784
  const candidate = peer.descriptor.nodeRoutingId;
911
- return !excludedTargets.has(candidate) && this.isLocalOrReadyPeer(candidate);
785
+ return !excludedTargets.has(candidate) && this.isPeerRouteReady(candidate);
912
786
  });
913
787
  if (alternate === undefined)
914
788
  break;
915
789
  selectedTargetNodeRoutingId = alternate.descriptor.nodeRoutingId;
916
- if (selectedTargetNodeRoutingId === this.descriptor.nodeRoutingId ||
917
- this.isPeerRouteReady(selectedTargetNodeRoutingId)) {
790
+ if (this.isPeerRouteReady(selectedTargetNodeRoutingId)) {
918
791
  break;
919
792
  }
920
793
  excludedTargets.add(selectedTargetNodeRoutingId);
@@ -936,9 +809,7 @@ class RawServiceMeshRuntime {
936
809
  return;
937
810
  }
938
811
  const accepted = this.mailbox.tryEnqueue({
939
- owner: channelName === undefined
940
- ? `node:${this.descriptor.nodeRoutingId}`
941
- : `channel:${channelName}`,
812
+ owner: `node:${this.descriptor.nodeRoutingId}`,
942
813
  domain: 'application',
943
814
  parts,
944
815
  sourceRoutingId: this.descriptor.nodeRoutingId,
@@ -964,16 +835,13 @@ class RawServiceMeshRuntime {
964
835
  })().catch((error) => this.operations.fail(pending.id, error));
965
836
  return pending;
966
837
  }
967
- if (!this.isPeerRouteReady(selectedTargetNodeRoutingId)) {
968
- // Preserve Core's distinct target-not-found result for an RID the
969
- // topology has never observed. A known peer without a usable route is
970
- // a Framework NotConnected result; an unknown RID is completed locally
971
- // as RequestTargetNotFound without submitting an application frame.
972
- const knownTarget = this.topology.peer(selectedTargetNodeRoutingId) !== undefined ||
973
- this.topology.knownDescriptor(selectedTargetNodeRoutingId) !== undefined;
838
+ if (this.topology.peer(selectedTargetNodeRoutingId) === undefined) {
839
+ // Logical target selection is the requester's decision: an RID that is
840
+ // not an admitted peer is not a target. Whether an admitted target's
841
+ // route can carry the request is Core's REQUEST result.
974
842
  this.operations.complete(pending.id, {
975
- terminalResult: knownTarget ? runtime_values_1.RequestResult.NotConnected : runtime_values_1.RequestResult.NotFound,
976
- failureCode: knownTarget ? 0 : REQUEST_TARGET_NOT_FOUND_FAILURE_CODE
843
+ terminalResult: runtime_values_1.RequestResult.NotFound,
844
+ failureCode: REQUEST_TARGET_NOT_FOUND_FAILURE_CODE
977
845
  });
978
846
  return pending;
979
847
  }
@@ -1031,7 +899,7 @@ class RawServiceMeshRuntime {
1031
899
  applicationPayload(payload) {
1032
900
  return Buffer.isBuffer(payload) ? (0, service_wire_m6a_codec_1.decodeApplicationPayloadView)(payload) : payload;
1033
901
  }
1034
- admitPeer(descriptor, connection, nowMs, expected) {
902
+ admitPeer(descriptor, connectionId, nowMs, expected) {
1035
903
  const previous = this.topology.peer(descriptor.nodeRoutingId);
1036
904
  if (previous !== undefined &&
1037
905
  previous.descriptor.lifecycleGeneration === descriptor.lifecycleGeneration &&
@@ -1040,190 +908,16 @@ class RawServiceMeshRuntime {
1040
908
  !(0, service_topology_registry_1.sameServiceNodeDescriptor)(previous.descriptor, descriptor)))) {
1041
909
  throw new service_wire_m6a_codec_1.ServiceWireProtocolError(`RouteMesh peer '${descriptor.nodeRoutingId}' descriptor revision is stale or conflicting.`);
1042
910
  }
1043
- const result = this.topology.admit(descriptor, connection.connectionId, expected, connection.discriminator);
911
+ const result = this.topology.admit(descriptor, connectionId, expected);
1044
912
  if (result === 'admitted') {
1045
- this.connectionIds.set(descriptor.nodeRoutingId, connection.connectionId);
1046
- this.liveness.admit(descriptor.nodeRoutingId, connection.connectionId, nowMs);
1047
- this.liveness.requestProbe(descriptor.nodeRoutingId, connection.connectionId, nowMs);
1048
- this.monitorConnectionStates.set(descriptor.nodeRoutingId, connection.connectionId);
1049
- if (previous !== undefined && previous.connectionId !== connection.connectionId) {
1050
- const previousCandidate = this.connectionCandidates
1051
- .get(descriptor.nodeRoutingId)
1052
- ?.get(previous.connectionId);
1053
- if (previousCandidate !== undefined) {
1054
- this.removeConnectionCandidate(descriptor.nodeRoutingId, previousCandidate.connectionId);
1055
- }
1056
- }
913
+ this.liveness.admit(descriptor.nodeRoutingId, connectionId, nowMs);
914
+ this.liveness.requestProbe(descriptor.nodeRoutingId, connectionId, nowMs);
1057
915
  }
1058
916
  else if (result === 'notRequired' && previous !== undefined) {
1059
917
  this.liveness.disconnect(descriptor.nodeRoutingId, previous.connectionId);
1060
918
  }
1061
- else if (previous !== undefined) {
1062
- this.connectionIds.set(descriptor.nodeRoutingId, previous.connectionId);
1063
- if (connection.connectionId !== previous.connectionId) {
1064
- this.removeConnectionCandidate(descriptor.nodeRoutingId, connection.connectionId);
1065
- }
1066
- }
1067
919
  return result;
1068
920
  }
1069
- currentConnectionCandidate(nodeRoutingId, advertisedEndpoint) {
1070
- let connectionId = this.connectionIds.get(nodeRoutingId);
1071
- let candidate = connectionId === undefined
1072
- ? undefined
1073
- : this.connectionCandidates.get(nodeRoutingId)?.get(connectionId);
1074
- if (candidate === undefined) {
1075
- candidate = this.promoteUnresolvedConnectionCandidate(nodeRoutingId, advertisedEndpoint);
1076
- connectionId = candidate?.connectionId;
1077
- }
1078
- if (candidate === undefined) {
1079
- const localRid = this.topology.localDescriptor().nodeRoutingId;
1080
- const endpointOnly = this.endpointOnlyPeers.has(advertisedEndpoint);
1081
- const direction = this.expectedPeers.has(nodeRoutingId)
1082
- ? 'outbound'
1083
- : endpointOnly
1084
- ? localRid.localeCompare(nodeRoutingId) <= 0
1085
- ? 'outbound'
1086
- : 'inbound'
1087
- : 'inbound';
1088
- const initiator = endpointOnly && localRid.localeCompare(nodeRoutingId) > 0
1089
- ? nodeRoutingId
1090
- : direction === 'outbound'
1091
- ? localRid
1092
- : nodeRoutingId;
1093
- connectionId = `unmonitored:${direction}:${(0, node_crypto_1.randomUUID)()}`;
1094
- candidate = {
1095
- connectionId,
1096
- direction,
1097
- discriminator: `initiator:${initiator}`,
1098
- localAddress: '',
1099
- remoteAddress: advertisedEndpoint
1100
- };
1101
- let candidates = this.connectionCandidates.get(nodeRoutingId);
1102
- if (candidates === undefined) {
1103
- candidates = new Map();
1104
- this.connectionCandidates.set(nodeRoutingId, candidates);
1105
- }
1106
- candidates.set(connectionId, candidate);
1107
- this.connectionIds.set(nodeRoutingId, connectionId);
1108
- }
1109
- return candidate;
1110
- }
1111
- createConnectionCandidate(nodeRoutingId, event) {
1112
- const local = this.topology.localDescriptor();
1113
- const expected = this.expectedPeers.get(nodeRoutingId);
1114
- const direction = event.localAddress === local.advertisedEndpoint
1115
- ? 'inbound'
1116
- : expected?.endpoint === event.remoteAddress
1117
- ? 'outbound'
1118
- : this.endpointOnlyPeers.has(event.remoteAddress)
1119
- ? 'outbound'
1120
- : 'unknown';
1121
- const initiator = direction === 'outbound'
1122
- ? local.nodeRoutingId
1123
- : direction === 'inbound'
1124
- ? nodeRoutingId
1125
- : undefined;
1126
- return {
1127
- connectionId: monitorConnectionId(event, nodeRoutingId),
1128
- direction,
1129
- discriminator: initiator === undefined
1130
- ? `unknown:${monitorConnectionId(event, nodeRoutingId)}`
1131
- : `initiator:${initiator}`,
1132
- localAddress: event.localAddress,
1133
- remoteAddress: event.remoteAddress
1134
- };
1135
- }
1136
- createUnresolvedConnectionCandidate(event) {
1137
- const connectionId = monitorConnectionId(event);
1138
- const local = this.topology.localDescriptor();
1139
- const direction = this.endpointOnlyPeers.has(event.remoteAddress) ||
1140
- this.expectedPeerRoutingId(event.remoteAddress) !== undefined
1141
- ? 'outbound'
1142
- : event.localAddress === local.advertisedEndpoint
1143
- ? 'inbound'
1144
- : 'unknown';
1145
- return {
1146
- connectionId,
1147
- direction,
1148
- discriminator: `unresolved:${connectionId}`,
1149
- localAddress: event.localAddress,
1150
- remoteAddress: event.remoteAddress
1151
- };
1152
- }
1153
- promoteUnresolvedConnectionCandidate(nodeRoutingId, advertisedEndpoint) {
1154
- const relevant = this.unresolvedConnectionCandidates
1155
- .map((candidate, index) => ({ candidate, index }))
1156
- .filter(({ candidate }) => candidate.remoteAddress === advertisedEndpoint || candidate.direction === 'inbound');
1157
- if (relevant.length === 0)
1158
- return undefined;
1159
- const directions = new Set(relevant.map((value) => value.candidate.direction));
1160
- const localRid = this.topology.localDescriptor().nodeRoutingId;
1161
- const preferredDirection = directions.has('inbound') && directions.has('outbound')
1162
- ? localRid.localeCompare(nodeRoutingId) <= 0
1163
- ? 'outbound'
1164
- : 'inbound'
1165
- : relevant.at(-1).candidate.direction;
1166
- const selected = [...relevant].reverse().find((value) => value.candidate.direction === preferredDirection) ??
1167
- relevant.at(-1);
1168
- this.unresolvedConnectionCandidates.splice(selected.index, 1);
1169
- const initiator = selected.candidate.direction === 'outbound'
1170
- ? localRid
1171
- : selected.candidate.direction === 'inbound'
1172
- ? nodeRoutingId
1173
- : undefined;
1174
- const candidate = {
1175
- ...selected.candidate,
1176
- discriminator: initiator === undefined
1177
- ? `unknown:${selected.candidate.connectionId}`
1178
- : `initiator:${initiator}`
1179
- };
1180
- let candidates = this.connectionCandidates.get(nodeRoutingId);
1181
- if (candidates === undefined) {
1182
- candidates = new Map();
1183
- this.connectionCandidates.set(nodeRoutingId, candidates);
1184
- }
1185
- candidates.set(candidate.connectionId, candidate);
1186
- this.connectionIds.set(nodeRoutingId, candidate.connectionId);
1187
- return candidate;
1188
- }
1189
- removeConnectionCandidate(nodeRoutingId, connectionId) {
1190
- const candidates = this.connectionCandidates.get(nodeRoutingId);
1191
- candidates?.delete(connectionId);
1192
- if (candidates?.size === 0)
1193
- this.connectionCandidates.delete(nodeRoutingId);
1194
- if (this.connectionIds.get(nodeRoutingId) === connectionId) {
1195
- this.connectionIds.delete(nodeRoutingId);
1196
- }
1197
- }
1198
- isDiscoveredLifecycleReplacement(admitted, nodeRoutingId) {
1199
- const expected = this.expectedPeers.get(nodeRoutingId);
1200
- // A same-RID replacement is permitted only from a complete discovery
1201
- // fence. Manual/endpoint-only intent has no authority to replace a ready
1202
- // peer, and lifecycle generations are opaque equality tokens.
1203
- return (expected?.endpoint !== undefined &&
1204
- expected.securityIdentity !== undefined &&
1205
- expected.lifecycleGeneration !== undefined &&
1206
- admitted.descriptor.lifecycleGeneration !== expected.lifecycleGeneration);
1207
- }
1208
- expectedPeerRoutingId(endpoint) {
1209
- for (const [nodeRoutingId, expected] of this.expectedPeers) {
1210
- if (expected.endpoint === endpoint)
1211
- return nodeRoutingId;
1212
- }
1213
- return undefined;
1214
- }
1215
- acceptsExpectedMonitorEndpoint(nodeRoutingId, event) {
1216
- // A monitor address is the physical socket address, which may be an
1217
- // ephemeral port. Once Core has resolved the peer routing ID, that ID is
1218
- // the semantic identity; comparing the physical address with the
1219
- // discovery advertised endpoint would reject valid READY events.
1220
- if (event.routingId === nodeRoutingId)
1221
- return true;
1222
- const expected = this.expectedPeers.get(nodeRoutingId);
1223
- return (expected === undefined ||
1224
- expected.endpoint === undefined ||
1225
- expected.endpoint === event.remoteAddress);
1226
- }
1227
921
  retireNotRequiredExpectedPeer(nodeRoutingId, advertisedEndpoint) {
1228
922
  const expected = this.expectedPeers.get(nodeRoutingId);
1229
923
  const endpoint = expected?.endpoint ??
@@ -1254,31 +948,10 @@ class RawServiceMeshRuntime {
1254
948
  this.endpointOnlyPeers.delete(endpoint);
1255
949
  }
1256
950
  removePeer(peer) {
1257
- if (this.monitorConnectionStates.get(peer.descriptor.nodeRoutingId) === peer.connectionId) {
1258
- this.monitorConnectionStates.set(peer.descriptor.nodeRoutingId, null);
1259
- }
1260
951
  this.topology.disconnect(peer.descriptor.nodeRoutingId, peer.connectionId);
1261
952
  this.liveness.disconnect(peer.descriptor.nodeRoutingId, peer.connectionId);
1262
953
  this.onPeerDisconnected?.(peer.descriptor.nodeRoutingId, peer.descriptor.advertisedEndpoint, peer.descriptor.lifecycleGeneration);
1263
954
  }
1264
- observeMonitorEvent(event) {
1265
- const nodeRoutingId = event.routingId ?? this.expectedPeerRoutingId(event.remoteAddress);
1266
- if (nodeRoutingId === undefined)
1267
- return;
1268
- const connectionId = monitorConnectionId(event, nodeRoutingId);
1269
- if (event.event === MONITOR_CONNECTION_READY && isConnectionReadyEdge(event)) {
1270
- if (!this.acceptsExpectedMonitorEndpoint(nodeRoutingId, event))
1271
- return;
1272
- // The event is queued for admission. Updating monitor state here would
1273
- // allow a late stale READY to overwrite the admitted replacement.
1274
- return;
1275
- }
1276
- if (event.event === MONITOR_DISCONNECTED &&
1277
- this.monitorConnectionStates.get(nodeRoutingId) === connectionId &&
1278
- this.topology.peer(nodeRoutingId)?.connectionId === connectionId) {
1279
- this.monitorConnectionStates.set(nodeRoutingId, null);
1280
- }
1281
- }
1282
955
  requireStarted() {
1283
956
  if (this.router === undefined)
1284
957
  throw new Error('Raw service runtime is not started.');
@@ -1329,30 +1002,14 @@ function isAlreadyDisconnectedError(error) {
1329
1002
  if (typeof error !== 'object' || error === null || !('nativeErrno' in error)) {
1330
1003
  return false;
1331
1004
  }
1332
- return error.nativeErrno === 2;
1005
+ return error.nativeErrno === nativeErrnoValues.ENOENT;
1333
1006
  }
1334
- function monitorConnectionId(event, resolvedNodeRoutingId = event.routingId ?? '') {
1335
- if (event.connectionId !== undefined && event.connectionId !== 0n) {
1336
- return JSON.stringify([resolvedNodeRoutingId, 'connection', event.connectionId.toString()]);
1337
- }
1338
- return JSON.stringify([
1339
- // Monitor `value` is event-specific: CONNECTION_READY reports the
1340
- // socket's ready count and DISCONNECTED reports its reason. It is not a
1341
- // connection identity. The public monitor record has no native
1342
- // connection id, so use the stable routing and endpoint tuple instead.
1343
- resolvedNodeRoutingId,
1344
- event.localAddress,
1345
- event.remoteAddress
1346
- ]);
1347
- }
1348
- function sameMonitorConnection(left, right) {
1349
- return (monitorConnectionId(left) === monitorConnectionId(right) &&
1350
- left.remoteAddress === right.remoteAddress);
1351
- }
1352
- function isConnectionReadyEdge(event) {
1353
- return event.flags === undefined
1354
- ? event.value > 0n
1355
- : (event.flags & MONITOR_CONNECTION_READY_EDGE) !== 0;
1007
+ /**
1008
+ * An admission belongs to one Core selected route. Its connection identity is
1009
+ * that route's generation, an opaque token compared only for equality.
1010
+ */
1011
+ function routeConnectionId(routeGeneration) {
1012
+ return `route:${routeGeneration.toString()}`;
1356
1013
  }
1357
1014
  function describeInvalidAdmissionDescriptor(descriptor, expected, current) {
1358
1015
  try {
@@ -1407,14 +1064,10 @@ function immutableDescriptorMismatch(current, descriptor) {
1407
1064
  function admissionReason(result) {
1408
1065
  switch (result) {
1409
1066
  case 'meshMismatch':
1410
- return 2;
1067
+ return (0, service_wire_codec_generated_1.enumWireRejectReason)('topologyMismatch');
1411
1068
  case 'staleDescriptor':
1412
- return 7;
1069
+ return (0, service_wire_codec_generated_1.enumWireRejectReason)('descriptorRevisionStale');
1413
1070
  case 'invalidDescriptor':
1414
- return 11;
1415
- case 'notRequired':
1416
- return 4;
1417
- case 'admitted':
1418
- return 1;
1071
+ return (0, service_wire_codec_generated_1.enumWireRejectReason)('invalidDescriptor');
1419
1072
  }
1420
1073
  }