@zlink-systems/framework 0.25.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (557) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Channels/IZLinkFanoutClient.d.ts +0 -6
  3. package/dist/contracts/Common/CoreTypes.d.ts +6 -0
  4. package/dist/contracts/Common/CoreTypes.js +7 -0
  5. package/dist/contracts/Common/index.d.ts +1 -1
  6. package/dist/contracts/Common/index.js +0 -1
  7. package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
  8. package/dist/contracts/Configuration/InternalDefaults.js +9 -1
  9. package/dist/contracts/Configuration/Registration.d.ts +13 -2
  10. package/dist/contracts/Configuration/Registration.js +58 -36
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
  12. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
  13. package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
  14. package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
  15. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  16. package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
  17. package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
  18. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
  19. package/dist/contracts/Handlers/JsonContract.js +10 -4
  20. package/dist/contracts/Locations/Authority.d.ts +1 -1
  21. package/dist/contracts/Locations/Authority.js +3 -2
  22. package/dist/contracts/Locations/Options.js +1 -1
  23. package/dist/contracts/Locations/Stores.d.ts +12 -0
  24. package/dist/contracts/Locations/Stores.js +9 -0
  25. package/dist/contracts/RouteMesh/RuntimeTopology.d.ts +8 -0
  26. package/dist/contracts/Spots/Contracts.d.ts +1 -1
  27. package/dist/internal.d.ts +5 -0
  28. package/dist/internal.js +16 -1
  29. package/dist/nest-integration.d.ts +4 -2
  30. package/dist/nest-integration.js +14 -4
  31. package/dist/runtime/abort.d.ts +1 -0
  32. package/dist/runtime/abort.js +8 -5
  33. package/dist/runtime/activation-admission.d.ts +28 -0
  34. package/dist/runtime/activation-admission.js +57 -0
  35. package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
  36. package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
  37. package/dist/runtime/actors/actor-client.d.ts +2 -2
  38. package/dist/runtime/actors/actor-client.js +42 -143
  39. package/dist/runtime/actors/actor-context.d.ts +3 -5
  40. package/dist/runtime/actors/actor-context.js +19 -17
  41. package/dist/runtime/actors/actor-handoff.d.ts +13 -7
  42. package/dist/runtime/actors/actor-handoff.js +36 -25
  43. package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
  44. package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
  45. package/dist/runtime/actors/actor-local-native-join.js +85 -123
  46. package/dist/runtime/actors/actor-native-lookup.js +2 -8
  47. package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
  48. package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
  49. package/dist/runtime/actors/actor-remote-joiner.d.ts +3 -3
  50. package/dist/runtime/actors/actor-remote-joiner.js +11 -17
  51. package/dist/runtime/actors/actor-remote-wire.js +5 -3
  52. package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
  53. package/dist/runtime/actors/actor-request-deadline.js +31 -0
  54. package/dist/runtime/actors/actor-retry-delay.js +2 -1
  55. package/dist/runtime/actors/actor-runtime-contracts.d.ts +4 -2
  56. package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
  57. package/dist/runtime/actors/actor-runtime-state.js +70 -187
  58. package/dist/runtime/actors/actor-source-transfer.d.ts +5 -5
  59. package/dist/runtime/actors/bound-session-wire.js +2 -7
  60. package/dist/runtime/actors/deferred-join-completion.d.ts +19 -0
  61. package/dist/runtime/actors/deferred-join-completion.js +21 -0
  62. package/dist/runtime/actors/index.d.ts +10 -8
  63. package/dist/runtime/actors/index.js +101 -73
  64. package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
  65. package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
  66. package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
  67. package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
  68. package/dist/runtime/admission.d.ts +7 -1
  69. package/dist/runtime/admission.js +11 -1
  70. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
  71. package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
  72. package/dist/runtime/backend/contracts/index.d.ts +8 -33
  73. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +3 -26
  74. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
  75. package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
  76. package/dist/runtime/backend/node/node-backend-adapter-factory.d.ts +1 -2
  77. package/dist/runtime/backend/node/node-backend-adapter-factory.js +4 -18
  78. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +7 -4
  79. package/dist/runtime/backend/node/node-backend-adapter-support.js +28 -34
  80. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
  81. package/dist/runtime/backend/node/node-event-loop-poller.js +11 -6
  82. package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
  83. package/dist/runtime/backend/node/node-raw-binding-port.d.ts +1 -1
  84. package/dist/runtime/backend/node/node-raw-binding-port.js +51 -19
  85. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +21 -19
  86. package/dist/runtime/backend/node/node-raw-mesh-backend.js +171 -111
  87. package/dist/runtime/backend/node/node-socket-backend-adapter.js +4 -3
  88. package/dist/runtime/backend/raw-binding-port.d.ts +13 -1
  89. package/dist/runtime/backend/runtime-values.d.ts +4 -1
  90. package/dist/runtime/backend/runtime-values.js +2 -0
  91. package/dist/runtime/channels/channel-clients.d.ts +20 -9
  92. package/dist/runtime/channels/channel-clients.js +68 -60
  93. package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
  94. package/dist/runtime/channels/channel-envelope.js +47 -29
  95. package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
  96. package/dist/runtime/channels/channel-outbound-operations.js +9 -18
  97. package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
  98. package/dist/runtime/channels/channel-receive-loops.js +27 -6
  99. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
  100. package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
  101. package/dist/runtime/channels/channel-runtime-manager.d.ts +2 -5
  102. package/dist/runtime/channels/channel-runtime-manager.js +4 -12
  103. package/dist/runtime/channels/channel-socket-options.js +3 -2
  104. package/dist/runtime/channels/channel-socket-registry.d.ts +30 -32
  105. package/dist/runtime/channels/channel-socket-registry.js +296 -235
  106. package/dist/runtime/channels/channel-transports.d.ts +11 -20
  107. package/dist/runtime/channels/channel-transports.js +68 -47
  108. package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
  109. package/dist/runtime/channels/client-server-location-runtime.js +10 -11
  110. package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
  111. package/dist/runtime/channels/client-server-service-wire.js +32 -11
  112. package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
  113. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  114. package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
  115. package/dist/runtime/channels/fanout-location-runtime.js +133 -81
  116. package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
  117. package/dist/runtime/channels/spot-direct-envelope.js +4 -3
  118. package/dist/runtime/channels/spot-node-route-transport.js +3 -2
  119. package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
  120. package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
  121. package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
  122. package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
  123. package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
  124. package/dist/runtime/diagnostics/flow-context.js +16 -2
  125. package/dist/runtime/diagnostics/index.d.ts +4 -2
  126. package/dist/runtime/diagnostics/index.js +14 -4
  127. package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
  128. package/dist/runtime/diagnostics/message-flow.js +10 -19
  129. package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
  130. package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
  131. package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
  132. package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
  133. package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
  134. package/dist/runtime/disposal.d.ts +5 -0
  135. package/dist/runtime/disposal.js +22 -0
  136. package/dist/runtime/execution/index.d.ts +22 -9
  137. package/dist/runtime/execution/index.js +107 -37
  138. package/dist/runtime/execution/serial-execution-queue.d.ts +12 -7
  139. package/dist/runtime/execution/serial-execution-queue.js +99 -26
  140. package/dist/runtime/execution/state-lane.d.ts +8 -1
  141. package/dist/runtime/execution/state-lane.js +118 -3
  142. package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
  143. package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
  144. package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
  145. package/dist/runtime/foundation/event-loop-resources.js +6 -119
  146. package/dist/runtime/foundation/listener-records.d.ts +11 -0
  147. package/dist/runtime/foundation/listener-records.js +20 -0
  148. package/dist/runtime/foundation/operation-identity.d.ts +2 -0
  149. package/dist/runtime/foundation/operation-identity.js +9 -5
  150. package/dist/runtime/foundation/operation-registry.d.ts +5 -7
  151. package/dist/runtime/foundation/operation-registry.js +34 -44
  152. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +18 -26
  153. package/dist/runtime/foundation/raw-service-mesh-runtime.js +122 -469
  154. package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
  155. package/dist/runtime/foundation/runtime-state-projections.js +8 -0
  156. package/dist/runtime/foundation/service-authority-payload-codec.d.ts +1 -0
  157. package/dist/runtime/foundation/service-authority-payload-codec.js +30 -12
  158. package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
  159. package/dist/runtime/foundation/service-discovery-registry.js +22 -3
  160. package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
  161. package/dist/runtime/foundation/service-liveness-registry.js +2 -1
  162. package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
  163. package/dist/runtime/foundation/service-maintenance-runtime.js +23 -8
  164. package/dist/runtime/foundation/service-metadata-codec.js +3 -3
  165. package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
  166. package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
  167. package/dist/runtime/foundation/service-relocation-coordinator.d.ts +9 -0
  168. package/dist/runtime/foundation/service-relocation-coordinator.js +14 -1
  169. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +8 -0
  170. package/dist/runtime/foundation/service-relocation-object-owner.js +19 -6
  171. package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
  172. package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
  173. package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
  174. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -19
  175. package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
  176. package/dist/runtime/foundation/service-stateful-registry.js +10 -2
  177. package/dist/runtime/foundation/service-stateful-runtime.d.ts +28 -24
  178. package/dist/runtime/foundation/service-stateful-runtime.js +297 -244
  179. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +12 -7
  180. package/dist/runtime/foundation/service-stateful-wire-codec.js +240 -143
  181. package/dist/runtime/foundation/service-topology-registry.d.ts +1 -3
  182. package/dist/runtime/foundation/service-topology-registry.js +22 -61
  183. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
  184. package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
  185. package/dist/runtime/foundation/service-wire-codec.js +10 -8
  186. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  187. package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
  188. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
  189. package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
  190. package/dist/runtime/framework-errors-internal.d.ts +2 -1
  191. package/dist/runtime/framework-errors-internal.js +343 -122
  192. package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
  193. package/dist/runtime/handlers/handler-instance-scope.js +61 -74
  194. package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
  195. package/dist/runtime/host/actor-packet-relay.js +48 -91
  196. package/dist/runtime/host/actor-placement-coordinator.js +7 -5
  197. package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
  198. package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
  199. package/dist/runtime/host/actor-transfer-runtime.d.ts +28 -28
  200. package/dist/runtime/host/actor-transfer-runtime.js +210 -256
  201. package/dist/runtime/host/application-job-queue.js +16 -33
  202. package/dist/runtime/host/bound-session-relay.js +1 -1
  203. package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
  204. package/dist/runtime/host/index.d.ts +19 -14
  205. package/dist/runtime/host/index.js +234 -175
  206. package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
  207. package/dist/runtime/host/instance-activation-authority.js +17 -45
  208. package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
  209. package/dist/runtime/host/location-runtime-owner.js +2 -2
  210. package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
  211. package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
  212. package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
  213. package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
  214. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
  215. package/dist/runtime/host/remote-bound-session-relay.js +11 -23
  216. package/dist/runtime/host/route-mesh-runtime.d.ts +14 -10
  217. package/dist/runtime/host/route-mesh-runtime.js +178 -257
  218. package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
  219. package/dist/runtime/host/runtime-shutdown.js +18 -21
  220. package/dist/runtime/host/service-relocation-control.js +6 -1
  221. package/dist/runtime/host/service-relocation-host-runtime.d.ts +71 -38
  222. package/dist/runtime/host/service-relocation-host-runtime.js +816 -651
  223. package/dist/runtime/host/spot-address-transport.d.ts +2 -3
  224. package/dist/runtime/host/spot-address-transport.js +34 -136
  225. package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
  226. package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
  227. package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -7
  228. package/dist/runtime/host/spot-runtime-options-factory.js +53 -21
  229. package/dist/runtime/host/stateful-authority-route-runtime.js +6 -2
  230. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +14 -6
  231. package/dist/runtime/host/user-spot-creation-coordinator.js +96 -95
  232. package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
  233. package/dist/runtime/locations/authority-key-codec.js +4 -3
  234. package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
  235. package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
  236. package/dist/runtime/locations/creation-operation-id.js +6 -4
  237. package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
  238. package/dist/runtime/locations/in-memory-authority-store.js +31 -15
  239. package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
  240. package/dist/runtime/locations/in-memory-location-store.js +17 -14
  241. package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
  242. package/dist/runtime/locations/in-memory-provider-location-store.js +79 -27
  243. package/dist/runtime/locations/key-codec.js +3 -2
  244. package/dist/runtime/locations/lease-tracker.d.ts +3 -5
  245. package/dist/runtime/locations/lease-tracker.js +7 -11
  246. package/dist/runtime/locations/lifecycle.d.ts +5 -10
  247. package/dist/runtime/locations/lifecycle.js +4 -33
  248. package/dist/runtime/locations/location-store-failure.d.ts +2 -0
  249. package/dist/runtime/locations/location-store-failure.js +7 -0
  250. package/dist/runtime/locations/location-store-pages.d.ts +3 -0
  251. package/dist/runtime/locations/location-store-pages.js +13 -0
  252. package/dist/runtime/locations/location-store-repository.d.ts +5 -7
  253. package/dist/runtime/locations/location-store-repository.js +303 -332
  254. package/dist/runtime/locations/relocation-blob.js +18 -5
  255. package/dist/runtime/locations/resolvers.d.ts +5 -5
  256. package/dist/runtime/locations/resolvers.js +44 -30
  257. package/dist/runtime/locations/runtime.d.ts +5 -4
  258. package/dist/runtime/locations/runtime.js +123 -92
  259. package/dist/runtime/locations/spot-location-claims.d.ts +8 -2
  260. package/dist/runtime/locations/spot-location-claims.js +40 -23
  261. package/dist/runtime/messaging/payload-codec.js +26 -20
  262. package/dist/runtime/messaging/submission-result.d.ts +3 -0
  263. package/dist/runtime/messaging/submission-result.js +48 -0
  264. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +2 -0
  265. package/dist/runtime/protocol/service_wire_codec.generated.js +17 -8
  266. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +1 -0
  267. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +3 -2
  268. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +3 -3
  269. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +4 -4
  270. package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +6 -3
  271. package/dist/runtime/spots/index.d.ts +29 -29
  272. package/dist/runtime/spots/index.js +441 -313
  273. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -4
  274. package/dist/runtime/spots/spot-activation-registry.js +27 -60
  275. package/dist/runtime/spots/spot-activation-state.d.ts +2 -11
  276. package/dist/runtime/spots/spot-activation-state.js +4 -17
  277. package/dist/runtime/spots/spot-activation.d.ts +10 -9
  278. package/dist/runtime/spots/spot-activation.js +103 -81
  279. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
  280. package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
  281. package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
  282. package/dist/runtime/spots/spot-actor-join-dispatch.js +5 -55
  283. package/dist/runtime/spots/spot-actor-lifecycle-drain.js +2 -2
  284. package/dist/runtime/spots/spot-actor-membership.d.ts +7 -5
  285. package/dist/runtime/spots/spot-actor-membership.js +44 -53
  286. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
  287. package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
  288. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
  289. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
  290. package/dist/runtime/spots/spot-context.d.ts +2 -2
  291. package/dist/runtime/spots/spot-entry-activation.d.ts +3 -4
  292. package/dist/runtime/spots/spot-entry-activation.js +9 -21
  293. package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
  294. package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
  295. package/dist/runtime/spots/spot-manager-public.js +6 -5
  296. package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
  297. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +22 -21
  298. package/dist/runtime/spots/spot-node-runtime-manager.js +73 -82
  299. package/dist/runtime/spots/spot-outbound.d.ts +4 -3
  300. package/dist/runtime/spots/spot-outbound.js +10 -37
  301. package/dist/runtime/spots/spot-remote-codec.js +5 -3
  302. package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
  303. package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
  304. package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
  305. package/dist/runtime/spots/spot-route-replies.js +3 -1
  306. package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -2
  307. package/dist/runtime/spots/spot-routed-actor-admission.js +3 -2
  308. package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +2 -7
  309. package/dist/runtime/spots/spot-routed-frame-dispatch.js +1 -70
  310. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
  311. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
  312. package/dist/runtime/spots/spot-runtime-ports.d.ts +4 -20
  313. package/dist/runtime/spots/spot-serial-executor.d.ts +5 -0
  314. package/dist/runtime/spots/spot-serial-executor.js +9 -2
  315. package/dist/runtime/spots/spot-serial-turn-executor.d.ts +29 -6
  316. package/dist/runtime/spots/spot-serial-turn-executor.js +89 -13
  317. package/dist/runtime/spots/spot-timer.d.ts +3 -2
  318. package/dist/runtime/streams/actor-session-binding-registry.d.ts +17 -32
  319. package/dist/runtime/streams/actor-session-binding-registry.js +145 -367
  320. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +2 -6
  321. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
  322. package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
  323. package/dist/runtime/streams/bound-session-service.d.ts +7 -0
  324. package/dist/runtime/streams/bound-session-service.js +12 -19
  325. package/dist/runtime/streams/index.d.ts +15 -14
  326. package/dist/runtime/streams/index.js +38 -39
  327. package/dist/runtime/streams/managed-stream.d.ts +3 -0
  328. package/dist/runtime/streams/managed-stream.js +17 -8
  329. package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
  330. package/dist/runtime/streams/protocol.d.ts +6 -33
  331. package/dist/runtime/streams/protocol.js +38 -110
  332. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
  333. package/dist/runtime/streams/session-actor-coordinator.js +12 -4
  334. package/dist/runtime/streams/session-calls.d.ts +1 -1
  335. package/dist/runtime/streams/session-calls.js +5 -4
  336. package/dist/runtime/streams/session-context.d.ts +6 -6
  337. package/dist/runtime/streams/session-context.js +22 -4
  338. package/dist/runtime/streams/session-requests.js +2 -1
  339. package/dist/runtime/streams/session-serial-executor.js +2 -2
  340. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
  341. package/dist/runtime/streams/stream-frame-factory.js +2 -2
  342. package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
  343. package/dist/runtime/streams/stream-session-runtime.js +25 -33
  344. package/dist/runtime/workers/index.d.ts +2 -2
  345. package/dist/runtime/workers/index.js +5 -4
  346. package/package.json +3 -3
  347. package/src/contracts/Channels/IZLinkFanoutClient.ts +0 -7
  348. package/src/contracts/Common/CoreTypes.ts +7 -0
  349. package/src/contracts/Common/index.ts +1 -1
  350. package/src/contracts/Configuration/InternalDefaults.ts +12 -0
  351. package/src/contracts/Configuration/Registration.ts +92 -48
  352. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
  353. package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
  354. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  355. package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
  356. package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
  357. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
  358. package/src/contracts/Handlers/JsonContract.ts +14 -4
  359. package/src/contracts/Locations/Authority.ts +7 -3
  360. package/src/contracts/Locations/Options.ts +1 -1
  361. package/src/contracts/Locations/Stores.ts +14 -0
  362. package/src/contracts/RouteMesh/RuntimeTopology.ts +10 -0
  363. package/src/contracts/Spots/Contracts.ts +1 -1
  364. package/src/internal.ts +15 -0
  365. package/src/nest-integration.ts +28 -10
  366. package/src/runtime/abort.ts +6 -5
  367. package/src/runtime/activation-admission.ts +72 -0
  368. package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
  369. package/src/runtime/actors/actor-client.ts +77 -204
  370. package/src/runtime/actors/actor-context.ts +45 -39
  371. package/src/runtime/actors/actor-handoff.ts +55 -45
  372. package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
  373. package/src/runtime/actors/actor-local-native-join.ts +174 -215
  374. package/src/runtime/actors/actor-native-lookup.ts +2 -9
  375. package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
  376. package/src/runtime/actors/actor-remote-joiner.ts +15 -36
  377. package/src/runtime/actors/actor-remote-wire.ts +5 -3
  378. package/src/runtime/actors/actor-request-deadline.ts +49 -0
  379. package/src/runtime/actors/actor-retry-delay.ts +2 -1
  380. package/src/runtime/actors/actor-runtime-contracts.ts +4 -10
  381. package/src/runtime/actors/actor-runtime-state.ts +85 -247
  382. package/src/runtime/actors/actor-source-transfer.ts +5 -18
  383. package/src/runtime/actors/bound-session-wire.ts +2 -8
  384. package/src/runtime/actors/deferred-join-completion.ts +44 -0
  385. package/src/runtime/actors/index.ts +122 -88
  386. package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
  387. package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
  388. package/src/runtime/admission.ts +13 -2
  389. package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
  390. package/src/runtime/backend/contracts/index.ts +15 -42
  391. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -28
  392. package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
  393. package/src/runtime/backend/node/node-backend-adapter-factory.ts +5 -25
  394. package/src/runtime/backend/node/node-backend-adapter-support.ts +32 -35
  395. package/src/runtime/backend/node/node-event-loop-poller.ts +16 -8
  396. package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
  397. package/src/runtime/backend/node/node-raw-binding-port.ts +58 -23
  398. package/src/runtime/backend/node/node-raw-mesh-backend.ts +252 -162
  399. package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -4
  400. package/src/runtime/backend/raw-binding-port.ts +14 -1
  401. package/src/runtime/backend/runtime-values.ts +4 -1
  402. package/src/runtime/channels/channel-clients.ts +132 -96
  403. package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
  404. package/src/runtime/channels/channel-envelope.ts +58 -29
  405. package/src/runtime/channels/channel-outbound-operations.ts +10 -31
  406. package/src/runtime/channels/channel-receive-loops.ts +39 -7
  407. package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
  408. package/src/runtime/channels/channel-runtime-manager.ts +8 -15
  409. package/src/runtime/channels/channel-socket-options.ts +8 -2
  410. package/src/runtime/channels/channel-socket-registry.ts +369 -262
  411. package/src/runtime/channels/channel-transports.ts +161 -115
  412. package/src/runtime/channels/client-server-location-runtime.ts +17 -17
  413. package/src/runtime/channels/client-server-service-wire.ts +40 -12
  414. package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
  415. package/src/runtime/channels/fanout-location-runtime.ts +175 -106
  416. package/src/runtime/channels/spot-direct-envelope.ts +1 -1
  417. package/src/runtime/channels/spot-node-route-transport.ts +5 -2
  418. package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
  419. package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
  420. package/src/runtime/diagnostics/flow-context.ts +16 -2
  421. package/src/runtime/diagnostics/index.ts +27 -17
  422. package/src/runtime/diagnostics/message-flow.ts +15 -25
  423. package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
  424. package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
  425. package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
  426. package/src/runtime/disposal.ts +19 -0
  427. package/src/runtime/execution/index.ts +116 -38
  428. package/src/runtime/execution/serial-execution-queue.ts +179 -34
  429. package/src/runtime/execution/state-lane.ts +142 -4
  430. package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
  431. package/src/runtime/foundation/event-loop-resources.ts +5 -122
  432. package/src/runtime/foundation/listener-records.ts +21 -0
  433. package/src/runtime/foundation/operation-identity.ts +11 -5
  434. package/src/runtime/foundation/operation-registry.ts +33 -50
  435. package/src/runtime/foundation/raw-service-mesh-runtime.ts +170 -571
  436. package/src/runtime/foundation/runtime-state-projections.ts +9 -1
  437. package/src/runtime/foundation/service-authority-payload-codec.ts +41 -13
  438. package/src/runtime/foundation/service-discovery-registry.ts +32 -3
  439. package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
  440. package/src/runtime/foundation/service-liveness-registry.ts +2 -1
  441. package/src/runtime/foundation/service-maintenance-runtime.ts +30 -19
  442. package/src/runtime/foundation/service-metadata-codec.ts +2 -2
  443. package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
  444. package/src/runtime/foundation/service-relocation-coordinator.ts +13 -0
  445. package/src/runtime/foundation/service-relocation-object-owner.ts +23 -7
  446. package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
  447. package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
  448. package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -25
  449. package/src/runtime/foundation/service-stateful-registry.ts +14 -2
  450. package/src/runtime/foundation/service-stateful-runtime.ts +435 -327
  451. package/src/runtime/foundation/service-stateful-wire-codec.ts +329 -199
  452. package/src/runtime/foundation/service-topology-registry.ts +30 -79
  453. package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
  454. package/src/runtime/foundation/service-wire-codec.ts +15 -8
  455. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  456. package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
  457. package/src/runtime/framework-errors-internal.ts +380 -134
  458. package/src/runtime/handlers/handler-instance-scope.ts +68 -95
  459. package/src/runtime/host/actor-packet-relay.ts +57 -147
  460. package/src/runtime/host/actor-placement-coordinator.ts +8 -5
  461. package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
  462. package/src/runtime/host/actor-transfer-runtime.ts +266 -418
  463. package/src/runtime/host/application-job-queue.ts +28 -34
  464. package/src/runtime/host/bound-session-relay.ts +1 -2
  465. package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
  466. package/src/runtime/host/index.ts +408 -312
  467. package/src/runtime/host/instance-activation-authority.ts +89 -109
  468. package/src/runtime/host/location-runtime-owner.ts +4 -2
  469. package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
  470. package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
  471. package/src/runtime/host/remote-bound-session-relay.ts +12 -44
  472. package/src/runtime/host/route-mesh-runtime.ts +236 -275
  473. package/src/runtime/host/runtime-shutdown.ts +17 -21
  474. package/src/runtime/host/service-relocation-control.ts +14 -1
  475. package/src/runtime/host/service-relocation-host-runtime.ts +1161 -904
  476. package/src/runtime/host/spot-address-transport.ts +73 -195
  477. package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
  478. package/src/runtime/host/spot-runtime-options-factory.ts +92 -30
  479. package/src/runtime/host/stateful-authority-route-runtime.ts +8 -4
  480. package/src/runtime/host/user-spot-creation-coordinator.ts +182 -163
  481. package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
  482. package/src/runtime/locations/authority-key-codec.ts +7 -3
  483. package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
  484. package/src/runtime/locations/creation-operation-id.ts +6 -3
  485. package/src/runtime/locations/domain-store-contract.ts +12 -3
  486. package/src/runtime/locations/in-memory-authority-store.ts +44 -15
  487. package/src/runtime/locations/in-memory-location-store.ts +50 -39
  488. package/src/runtime/locations/in-memory-provider-location-store.ts +110 -31
  489. package/src/runtime/locations/key-codec.ts +3 -2
  490. package/src/runtime/locations/lease-tracker.ts +8 -14
  491. package/src/runtime/locations/lifecycle.ts +16 -45
  492. package/src/runtime/locations/location-store-failure.ts +4 -0
  493. package/src/runtime/locations/location-store-pages.ts +18 -0
  494. package/src/runtime/locations/location-store-repository.ts +450 -478
  495. package/src/runtime/locations/relocation-blob.ts +17 -6
  496. package/src/runtime/locations/resolvers.ts +90 -58
  497. package/src/runtime/locations/runtime.ts +220 -110
  498. package/src/runtime/locations/spot-location-claims.ts +54 -26
  499. package/src/runtime/messaging/payload-codec.ts +35 -24
  500. package/src/runtime/messaging/submission-result.ts +57 -1
  501. package/src/runtime/protocol/service_wire_codec.generated.ts +27 -10
  502. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +4 -4
  503. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +6 -6
  504. package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +6 -3
  505. package/src/runtime/spots/index.ts +687 -437
  506. package/src/runtime/spots/spot-activation-registry.ts +42 -71
  507. package/src/runtime/spots/spot-activation-state.ts +4 -16
  508. package/src/runtime/spots/spot-activation.ts +167 -115
  509. package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
  510. package/src/runtime/spots/spot-actor-join-dispatch.ts +25 -79
  511. package/src/runtime/spots/spot-actor-lifecycle-drain.ts +20 -18
  512. package/src/runtime/spots/spot-actor-membership.ts +107 -75
  513. package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
  514. package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
  515. package/src/runtime/spots/spot-context.ts +3 -3
  516. package/src/runtime/spots/spot-entry-activation.ts +13 -33
  517. package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
  518. package/src/runtime/spots/spot-manager-public.ts +29 -21
  519. package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
  520. package/src/runtime/spots/spot-node-runtime-manager.ts +145 -140
  521. package/src/runtime/spots/spot-outbound.ts +47 -68
  522. package/src/runtime/spots/spot-remote-codec.ts +7 -3
  523. package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
  524. package/src/runtime/spots/spot-route-replies.ts +6 -4
  525. package/src/runtime/spots/spot-routed-actor-admission.ts +13 -6
  526. package/src/runtime/spots/spot-routed-frame-dispatch.ts +6 -77
  527. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
  528. package/src/runtime/spots/spot-runtime-ports.ts +10 -43
  529. package/src/runtime/spots/spot-serial-executor.ts +10 -2
  530. package/src/runtime/spots/spot-serial-turn-executor.ts +120 -13
  531. package/src/runtime/spots/spot-timer.ts +3 -2
  532. package/src/runtime/streams/actor-session-binding-registry.ts +182 -560
  533. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +1 -19
  534. package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
  535. package/src/runtime/streams/bound-session-service.ts +23 -37
  536. package/src/runtime/streams/index.ts +102 -88
  537. package/src/runtime/streams/managed-stream.ts +29 -10
  538. package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
  539. package/src/runtime/streams/protocol.ts +34 -88
  540. package/src/runtime/streams/session-actor-coordinator.ts +17 -5
  541. package/src/runtime/streams/session-calls.ts +6 -5
  542. package/src/runtime/streams/session-context.ts +54 -10
  543. package/src/runtime/streams/session-requests.ts +2 -1
  544. package/src/runtime/streams/session-serial-executor.ts +2 -2
  545. package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
  546. package/src/runtime/streams/stream-frame-factory.ts +2 -3
  547. package/src/runtime/streams/stream-session-runtime.ts +57 -59
  548. package/src/runtime/workers/index.ts +13 -12
  549. package/dist/runtime/actors/deferred-join-accepted-journal.d.ts +0 -47
  550. package/dist/runtime/actors/deferred-join-accepted-journal.js +0 -992
  551. package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
  552. package/dist/runtime/actors/post-commit-actor-location.js +0 -72
  553. package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
  554. package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
  555. package/src/runtime/actors/deferred-join-accepted-journal.ts +0 -1346
  556. package/src/runtime/actors/post-commit-actor-location.ts +0 -121
  557. package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
@@ -1,27 +1,46 @@
1
1
  import {
2
- ZLinkFrameworkInternalErrorKind,
3
- createInternalFrameworkException
4
- } from '../framework-errors-internal';
5
- import type { RoutingId } from '../../contracts';
6
- import {
2
+ type RoutingId,
7
3
  ZLinkFrameworkException,
8
4
  ZLinkFrameworkRuntimeState,
9
- ZLinkTopologyState,
10
- ZLinkTopologyReason,
5
+ ZLinkObjectRole,
11
6
  ZLinkPeerState,
7
+ ZLinkTopologyReason,
8
+ ZLinkTopologyState,
9
+ type ZLinkMeshNodeDescriptor,
12
10
  type ZLinkObservedStatus,
13
- type ZLinkRouteMeshStatus,
14
- type ZLinkRouteMeshRuntime
11
+ type ZLinkRouteMeshRuntime,
12
+ type ZLinkRouteMeshStatus
15
13
  } from '../../contracts';
14
+
15
+ import { ZLINK_DEFAULT_PUBLIC_WEIGHT } from '../../contracts/Configuration/RegistrationBuilderPolicy';
16
+ import { createDeadlineExceededError } from '../abort';
17
+ import type { ZLinkActivationAdmission } from '../activation-admission';
18
+ import type { ZLinkRuntimeAdmissionGate } from '../admission';
19
+ import type { ZLinkBackendMeshNode } from '../backend';
20
+ import type { ZLinkSpotNodeOptions } from '../configuration';
21
+ import { isRelocationDebugEnabled } from '../diagnostics';
16
22
  import {
17
23
  RuntimeEventQueue,
18
24
  ZLINK_DEFAULT_TERMINAL_OBSERVATION_CAPACITY
19
25
  } from '../diagnostics/runtime-observation-queue';
20
- import { createDeadlineExceededError } from '../abort';
26
+ import { debugPendingWorkNames, isStructuralGuardEnabled } from '../execution/state-lane';
21
27
  import {
22
28
  runtimeStateIsReady,
29
+ topologyObservationIsTerminal,
23
30
  topologyRuntimeIsReady
24
31
  } from '../foundation/runtime-state-projections';
32
+ import {
33
+ MeshNodeRuntimeState,
34
+ MeshPeerRuntimeState
35
+ } from '../foundation/service-runtime-contracts';
36
+ import {
37
+ ZLinkFrameworkInternalErrorKind,
38
+ createInternalFrameworkException
39
+ } from '../framework-errors-internal';
40
+ import { ZLinkOwnerCleanupError } from '../locations/runtime';
41
+ const DEFAULT_ROUTE_MESH_DRAIN_TIMEOUT_MS = 30_000;
42
+ const MAX_ROUTE_MESH_OBSERVATION_WAIT_MS = 1000;
43
+ const PLACEMENT_OBSERVATION_INTERVAL_MS = 100;
25
44
 
26
45
  type ZLinkDrainForceReason =
27
46
  'deadline_exceeded' | 'drain_state_publish_failed' | 'owner_cleanup_failed' | 'teardown_failed';
@@ -33,10 +52,6 @@ type ZLinkMeshDrainResult =
33
52
  readonly reason: ZLinkDrainForceReason;
34
53
  readonly error?: unknown;
35
54
  };
36
- import type { ZLinkBackendMeshNode } from '../backend';
37
- import type { ZLinkRuntimeAdmissionGate } from '../admission';
38
- import type { ZLinkSpotNodeOptions } from '../configuration';
39
- import { ZLinkObjectRole, type ZLinkMeshNodeDescriptor } from '../../contracts';
40
55
 
41
56
  export interface ZLinkRouteMeshRuntimeCoordinatorOptions {
42
57
  readonly meshNames: readonly string[];
@@ -47,6 +62,7 @@ export interface ZLinkRouteMeshRuntimeCoordinatorOptions {
47
62
  readonly isLocationStoreHealthy?: () => boolean;
48
63
  readonly hostState?: () => ZLinkFrameworkRuntimeState;
49
64
  readonly admission: ZLinkRuntimeAdmissionGate;
65
+ readonly activationAdmission?: ZLinkActivationAdmission;
50
66
  readonly publishRetiring: (meshName: string, signal: AbortSignal) => Promise<void>;
51
67
  readonly rollbackRetiring: (meshName: string, signal: AbortSignal) => Promise<void>;
52
68
  readonly publishDraining: (meshName: string, signal: AbortSignal) => Promise<void>;
@@ -68,7 +84,6 @@ export interface ZLinkLocalPlacementCounts {
68
84
 
69
85
  interface ZLinkMeshDrainState {
70
86
  state: ZLinkTopologyState;
71
- sequence: bigint;
72
87
  deadline?: Date;
73
88
  operation?: Promise<ZLinkMeshDrainResult>;
74
89
  result?: ZLinkMeshDrainResult;
@@ -79,9 +94,6 @@ interface ZLinkMeshDrainState {
79
94
 
80
95
  export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
81
96
  private readonly states = new Map<string, ZLinkMeshDrainState>();
82
- private readonly placementFingerprints = new Map<string, string>();
83
- private readonly peerFingerprints = new Map<string, Map<string, string>>();
84
- private readonly locationStoreHealthFingerprints = new Map<string, boolean>();
85
97
  private placementObserver?: ReturnType<typeof setInterval>;
86
98
  private hostOperation?: Promise<ZLinkMeshDrainResult>;
87
99
  private shutdownOperation?: Promise<ZLinkMeshDrainResult>;
@@ -92,7 +104,6 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
92
104
  options.admission.register(meshName);
93
105
  this.states.set(meshName, {
94
106
  state: ZLinkTopologyState.Starting,
95
- sequence: 0n,
96
107
  waiters: [],
97
108
  observers: new Set()
98
109
  });
@@ -107,24 +118,32 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
107
118
  }
108
119
 
109
120
  snapshot(meshName: string): ZLinkRouteMeshStatus {
121
+ const published = this.publishCurrentStatus(meshName, this.requireState(meshName));
122
+ if (published === undefined) throw routeNotFound(meshName);
123
+ return published;
124
+ }
125
+
126
+ private buildSnapshot(meshName: string, sequence: bigint): ZLinkRouteMeshStatus {
110
127
  const drain = this.requireState(meshName);
111
128
  const node = this.options.meshNode(meshName);
112
129
  if (node === undefined) throw routeNotFound(meshName);
113
130
  const status = node.status();
114
131
  const descriptor = this.options.meshNodeDescriptor?.(meshName);
115
132
  const localPlacementCounts = this.options.localPlacementCounts?.(meshName);
133
+ // Active counts come only from this MeshNode's activation records (runtime monitoring §5);
134
+ // before the object managers exist nothing is active on it.
116
135
  const populationCapacity =
117
- descriptor === undefined || localPlacementCounts === undefined
118
- ? descriptor?.populationCapacity
136
+ descriptor === undefined
137
+ ? undefined
119
138
  : {
120
139
  ...descriptor.populationCapacity,
121
140
  actors: {
122
141
  ...descriptor.populationCapacity.actors,
123
- active: localPlacementCounts.activeActorCount
142
+ active: localPlacementCounts?.activeActorCount ?? 0
124
143
  },
125
144
  spots: {
126
145
  ...descriptor.populationCapacity.spots,
127
- active: localPlacementCounts.activeSpotCount
146
+ active: localPlacementCounts?.activeSpotCount ?? 0
128
147
  }
129
148
  };
130
149
  const backendPeers = node.peers();
@@ -153,7 +172,8 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
153
172
  )
154
173
  ).length
155
174
  );
156
- const localWeight = descriptor?.channelWeights[channelName] ?? channel.weight ?? 100;
175
+ const localWeight =
176
+ descriptor?.channelWeights[channelName] ?? channel.weight ?? ZLINK_DEFAULT_PUBLIC_WEIGHT;
157
177
  const readyTargetCount =
158
178
  Number(readyMemberCount) + (channel.server === true && localWeight > 0 ? 1 : 0);
159
179
  return { channelName, isReady: readyTargetCount > 0, readyTargetCount };
@@ -180,7 +200,7 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
180
200
  const capacityAvailable =
181
201
  descriptor !== undefined &&
182
202
  populationCapacity !== undefined &&
183
- hasRemainingCapacity(descriptor.activationConcurrency) &&
203
+ (this.options.activationAdmission?.hasHeadroom(meshName) ?? true) &&
184
204
  (hasRemainingCapacity(populationCapacity.actors) ||
185
205
  hasRemainingCapacity(populationCapacity.spots));
186
206
  const placementAvailable =
@@ -201,20 +221,15 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
201
221
  isAvailable: placementAvailable,
202
222
  activeActorCount: populationCapacity?.actors.active ?? 0,
203
223
  activeSpotCount: populationCapacity?.spots.active ?? 0,
204
- unavailableReason: placementAvailable
205
- ? undefined
206
- : localTopologyState !== ZLinkTopologyState.Ready
207
- ? ZLinkTopologyReason.RuntimeNotReady
208
- : !locationStoreHealthy
209
- ? ZLinkTopologyReason.LocationUnavailable
210
- : placementWeight <= 0
211
- ? ZLinkTopologyReason.NoReadyTarget
212
- : ZLinkTopologyReason.CapacityExceeded
224
+ unavailableReason: placementUnavailableReason(
225
+ placementAvailable,
226
+ hostState,
227
+ locationStoreHealthy
228
+ )
213
229
  },
214
- sequence: drain.sequence > status.lastChangedMs ? drain.sequence : status.lastChangedMs,
230
+ sequence,
215
231
  observedAt: new Date()
216
232
  };
217
- drain.lastSnapshot = snapshot;
218
233
  return snapshot;
219
234
  }
220
235
 
@@ -226,15 +241,15 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
226
241
  const state = this.requireState(meshName);
227
242
  if (!Number.isInteger(capacity) || capacity <= 0)
228
243
  throw new RangeError('Observer capacity must be positive.');
229
- if (state.observers.size === 0) this.seedPlacementFingerprint(meshName);
244
+ const snapshot = this.snapshot(meshName);
230
245
  const queue = new RuntimeEventQueue<ZLinkRouteMeshStatus>(capacity, signal);
246
+ state.observers.add(queue);
247
+ this.startPlacementObserver();
231
248
  queue.onClose(() => {
232
249
  state.observers.delete(queue);
233
250
  this.stopPlacementObserverIfIdle();
234
251
  });
235
- this.snapshot(meshName);
236
- state.observers.add(queue);
237
- this.startPlacementObserver();
252
+ this.publishStatus(meshName, queue, snapshot);
238
253
  return queue;
239
254
  }
240
255
 
@@ -243,78 +258,29 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
243
258
  }
244
259
 
245
260
  hostStateChanged(): void {
246
- for (const [meshName, state] of this.states) {
247
- state.sequence += 1n;
248
- let snapshot: ZLinkRouteMeshStatus;
249
- try {
250
- snapshot = this.snapshot(meshName);
251
- } catch {
252
- continue;
253
- }
254
- for (const observer of state.observers) observer.push(snapshot, meshName);
255
- }
261
+ for (const [meshName, state] of this.states) this.publishCurrentStatus(meshName, state);
256
262
  }
257
263
 
258
264
  stopObservers(): void {
259
265
  for (const [meshName, state] of this.states) {
260
- state.sequence += 1n;
261
- let terminal: ZLinkRouteMeshStatus | undefined;
262
- try {
263
- const current = this.snapshot(meshName);
264
- const terminalSequence =
265
- current.sequence >= state.sequence ? current.sequence + 1n : state.sequence;
266
- state.sequence = terminalSequence;
267
- terminal = {
268
- ...current,
269
- state: ZLinkTopologyState.Stopped,
270
- isReady: false,
271
- channels: current.channels.map((channel) => ({
272
- ...channel,
273
- isReady: false
274
- })),
275
- placement: {
276
- ...current.placement,
277
- isAvailable: false,
278
- unavailableReason: ZLinkTopologyReason.RuntimeNotReady
279
- },
280
- sequence: terminalSequence,
281
- observedAt: new Date()
282
- };
283
- } catch {
284
- const current = state.lastSnapshot;
285
- if (current !== undefined) {
286
- const terminalSequence =
287
- current.sequence >= state.sequence ? current.sequence + 1n : state.sequence;
288
- state.sequence = terminalSequence;
289
- terminal = {
290
- ...current,
291
- state: ZLinkTopologyState.Stopped,
292
- isReady: false,
293
- channels: current.channels.map((channel) => ({
294
- ...channel,
295
- isReady: false
296
- })),
297
- placement: {
298
- ...current.placement,
299
- isAvailable: false,
300
- unavailableReason: ZLinkTopologyReason.RuntimeNotReady
301
- },
302
- sequence: terminalSequence,
303
- observedAt: new Date()
304
- };
305
- }
306
- }
307
- for (const observer of [...state.observers]) {
308
- if (terminal === undefined) observer.close();
309
- else observer.seal(terminal, meshName);
266
+ const published = state.lastSnapshot;
267
+ if (published !== undefined && topologyObservationIsTerminal(published.state)) continue;
268
+ const current = published ?? this.publishCurrentStatus(meshName, state);
269
+ if (current === undefined) {
270
+ for (const observer of [...state.observers]) observer.close();
271
+ } else {
272
+ this.publishSnapshot(
273
+ meshName,
274
+ state,
275
+ terminalSnapshot(current, ZLinkTopologyState.Stopped)
276
+ );
310
277
  }
311
- state.observers.clear();
312
278
  }
313
279
  }
314
280
 
315
281
  drain(
316
282
  meshName: string,
317
- deadlineMs = 30_000,
283
+ deadlineMs: number = DEFAULT_ROUTE_MESH_DRAIN_TIMEOUT_MS,
318
284
  signal?: AbortSignal
319
285
  ): Promise<ZLinkMeshDrainResult> {
320
286
  const state = this.requireState(meshName);
@@ -335,7 +301,10 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
335
301
  return waitForOperation(operation, signal);
336
302
  }
337
303
 
338
- drainHost(deadlineMs = 30_000, signal?: AbortSignal): Promise<ZLinkMeshDrainResult> {
304
+ drainHost(
305
+ deadlineMs: number = DEFAULT_ROUTE_MESH_DRAIN_TIMEOUT_MS,
306
+ signal?: AbortSignal
307
+ ): Promise<ZLinkMeshDrainResult> {
339
308
  if (!Number.isFinite(deadlineMs) || deadlineMs <= 0) {
340
309
  return Promise.reject(new TypeError('Drain deadlineMs must be greater than zero.'));
341
310
  }
@@ -348,16 +317,12 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
348
317
  return waitForOperation(this.hostOperation, signal);
349
318
  }
350
319
 
351
- shutdownHost(
352
- deadline: number | Date = 30_000,
353
- signal?: AbortSignal,
354
- remainingTimeoutMs?: number
355
- ): Promise<ZLinkMeshDrainResult> {
320
+ shutdownHost(deadline: number | Date, signal: AbortSignal): Promise<ZLinkMeshDrainResult> {
356
321
  if (typeof deadline === 'number' && (!Number.isFinite(deadline) || deadline <= 0)) {
357
322
  return Promise.reject(new TypeError('Shutdown deadlineMs must be greater than zero.'));
358
323
  }
359
324
  if (this.shutdownOperation === undefined) {
360
- const operation = this.performHostShutdown(deadline, remainingTimeoutMs);
325
+ const operation = this.performHostShutdown(deadline, signal);
361
326
  this.shutdownOperation = operation;
362
327
  for (const state of this.states.values()) state.operation ??= operation;
363
328
  }
@@ -393,7 +358,7 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
393
358
  rollback.abort(
394
359
  createDeadlineExceededError('Retire descriptor rollback deadline exceeded.')
395
360
  ),
396
- Math.min(deadlineMs, 1000)
361
+ Math.min(deadlineMs, MAX_ROUTE_MESH_OBSERVATION_WAIT_MS)
397
362
  );
398
363
  let rollbackFailed = false;
399
364
  for (const meshName of attempted.reverse()) {
@@ -440,7 +405,7 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
440
405
  return { kind: 'drained' };
441
406
  } catch (error) {
442
407
  const classified = drainFailureReason(error);
443
- if (process.env.ZLINK_DEBUG_FRAMEWORK_RELOCATION === '1') {
408
+ if (isRelocationDebugEnabled()) {
444
409
  console.error('[zlink.runtime.relocation.drain_failed]', classified, error);
445
410
  }
446
411
  const reason: ZLinkDrainForceReason = deadline.signal.aborted
@@ -452,7 +417,7 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
452
417
  rollback.abort(
453
418
  createDeadlineExceededError('Relocation descriptor rollback deadline exceeded.')
454
419
  ),
455
- Math.min(Math.max(1, deadlineMs), 1000)
420
+ Math.min(Math.max(1, deadlineMs), MAX_ROUTE_MESH_OBSERVATION_WAIT_MS)
456
421
  );
457
422
  try {
458
423
  await Promise.all(
@@ -581,25 +546,14 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
581
546
 
582
547
  private async performHostShutdown(
583
548
  cleanupDeadline: Date | number,
584
- remainingTimeoutMs?: number
549
+ signal: AbortSignal
585
550
  ): Promise<ZLinkMeshDrainResult> {
586
- const timeoutMs = Math.max(
587
- 0,
588
- remainingTimeoutMs ??
589
- (cleanupDeadline instanceof Date ? cleanupDeadline.getTime() - Date.now() : cleanupDeadline)
590
- );
591
551
  const deadlineAt =
592
552
  cleanupDeadline instanceof Date ? cleanupDeadline : new Date(Date.now() + cleanupDeadline);
593
553
  const entries = [...this.states.entries()];
594
- if (entries.length === 0) return { kind: 'drained' };
595
554
  for (const [, state] of entries) {
596
555
  state.deadline = deadlineAt;
597
556
  }
598
- const deadline = new AbortController();
599
- const timer = setTimeout(
600
- () => deadline.abort(createDeadlineExceededError('Shutdown deadline exceeded.')),
601
- timeoutMs
602
- );
603
557
  let result: ZLinkMeshDrainResult;
604
558
  try {
605
559
  for (const [meshName, state] of entries) {
@@ -607,16 +561,16 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
607
561
  this.transition(meshName, state, ZLinkTopologyState.Stopping);
608
562
  }
609
563
  await Promise.all(
610
- entries.map(([meshName]) => this.options.publishDraining(meshName, deadline.signal))
564
+ entries.map(([meshName]) => this.options.publishDraining(meshName, signal))
611
565
  );
612
- await this.options.publishHostDraining(deadline.signal);
566
+ await this.options.publishHostDraining(signal);
613
567
  await Promise.all(
614
- entries.map(([meshName]) => this.options.admission.awaitZero(meshName, deadline.signal))
568
+ entries.map(([meshName]) => this.options.admission.awaitZero(meshName, signal))
615
569
  );
616
570
  await Promise.all(
617
- entries.map(([meshName]) => this.options.shutdownResources?.(meshName, deadline.signal))
571
+ entries.map(([meshName]) => this.options.shutdownResources?.(meshName, signal))
618
572
  );
619
- await this.options.cleanupHostResources(deadline.signal);
573
+ await this.options.cleanupHostResources(signal);
620
574
  result = { kind: 'drained' };
621
575
  for (const [meshName, state] of entries) {
622
576
  this.transition(meshName, state, ZLinkTopologyState.Stopped);
@@ -626,7 +580,7 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
626
580
  const reason: ZLinkDrainForceReason =
627
581
  classified !== 'teardown_failed'
628
582
  ? classified
629
- : deadline.signal.aborted
583
+ : signal.aborted
630
584
  ? 'deadline_exceeded'
631
585
  : classified;
632
586
  await Promise.all(
@@ -638,8 +592,6 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
638
592
  for (const [meshName, state] of entries) {
639
593
  this.transition(meshName, state, ZLinkTopologyState.Failed);
640
594
  }
641
- } finally {
642
- clearTimeout(timer);
643
595
  }
644
596
  for (const [, state] of entries) {
645
597
  state.result = result;
@@ -652,113 +604,83 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
652
604
  private transition(meshName: string, state: ZLinkMeshDrainState, next: ZLinkTopologyState): void {
653
605
  if (state.state === next) return;
654
606
  state.state = next;
655
- state.sequence += 1n;
656
- let current: ZLinkRouteMeshStatus | undefined;
657
- let snapshotAvailable = false;
658
- try {
659
- current = this.snapshot(meshName);
660
- snapshotAvailable = true;
661
- } catch {
662
- current = state.lastSnapshot;
663
- }
664
- const terminal = next === ZLinkTopologyState.Stopped || next === ZLinkTopologyState.Failed;
665
- if (current !== undefined) {
666
- if (terminal) {
667
- const terminalSequence =
668
- current.sequence >= state.sequence ? current.sequence + 1n : state.sequence;
669
- state.sequence = terminalSequence;
670
- const terminalStatus = {
671
- ...current,
672
- state: next,
673
- isReady: false,
674
- channels: current.channels.map((channel) => ({
675
- ...channel,
676
- isReady: false
677
- })),
678
- placement: {
679
- ...current.placement,
680
- isAvailable: false,
681
- unavailableReason: ZLinkTopologyReason.RuntimeNotReady
682
- },
683
- sequence: terminalSequence,
684
- observedAt: new Date()
685
- };
686
- for (const observer of state.observers) observer.seal(terminalStatus, meshName);
687
- } else if (snapshotAvailable) {
688
- for (const observer of state.observers) observer.push(current, meshName);
689
- }
690
- }
691
- if (terminal) {
692
- if (current === undefined) {
693
- for (const observer of state.observers) observer.close();
694
- }
695
- state.observers.clear();
696
- this.stopPlacementObserverIfIdle();
607
+ const published = this.publishCurrentStatus(meshName, state);
608
+ if (topologyObservationIsTerminal(next) && published === undefined) {
609
+ for (const observer of [...state.observers]) observer.close();
697
610
  }
698
611
  }
699
612
 
700
- private seedPlacementFingerprint(meshName: string): void {
701
- this.locationStoreHealthFingerprints.set(
702
- meshName,
703
- this.options.isLocationStoreHealthy?.() ?? true
704
- );
705
- const descriptor = this.options.meshNodeDescriptor?.(meshName);
706
- if (descriptor !== undefined) {
707
- this.placementFingerprints.set(meshName, placementFingerprint(descriptor));
613
+ private publishCurrentStatus(
614
+ meshName: string,
615
+ state: ZLinkMeshDrainState
616
+ ): ZLinkRouteMeshStatus | undefined {
617
+ const published = state.lastSnapshot;
618
+ if (published !== undefined && topologyObservationIsTerminal(published.state)) return published;
619
+ const desired = topologyObservationIsTerminal(state.state)
620
+ ? state.state
621
+ : topologyStateForHost(
622
+ this.options.hostState?.() ?? ZLinkFrameworkRuntimeState.Serving,
623
+ state.state
624
+ );
625
+ if (published !== undefined && topologyObservationIsTerminal(desired)) {
626
+ return this.publishSnapshot(meshName, state, terminalSnapshot(published, desired));
708
627
  }
709
- this.peerFingerprints.set(
628
+ if (this.options.meshNode(meshName) === undefined) return undefined;
629
+ const current = this.buildSnapshot(meshName, published?.sequence ?? 0n);
630
+ return this.publishSnapshot(
710
631
  meshName,
711
- peerFingerprintMap(this.options.meshNode(meshName)?.peers() ?? [])
632
+ state,
633
+ topologyObservationIsTerminal(current.state)
634
+ ? terminalSnapshot(current, current.state)
635
+ : current
712
636
  );
713
637
  }
714
638
 
639
+ private publishSnapshot(
640
+ meshName: string,
641
+ state: ZLinkMeshDrainState,
642
+ current: ZLinkRouteMeshStatus
643
+ ): ZLinkRouteMeshStatus {
644
+ const published = state.lastSnapshot;
645
+ if (published !== undefined && samePublicRouteMeshStatus(published, current)) return published;
646
+ const next = { ...current, sequence: (published?.sequence ?? 0n) + 1n, observedAt: new Date() };
647
+ state.lastSnapshot = next;
648
+ for (const observer of [...state.observers]) this.publishStatus(meshName, observer, next);
649
+ return next;
650
+ }
651
+
652
+ private publishStatus(
653
+ meshName: string,
654
+ observer: RuntimeEventQueue<ZLinkRouteMeshStatus>,
655
+ status: ZLinkRouteMeshStatus
656
+ ): void {
657
+ if (topologyObservationIsTerminal(status.state)) {
658
+ observer.seal(status, meshName);
659
+ } else {
660
+ observer.push(status, meshName);
661
+ }
662
+ }
663
+
715
664
  private startPlacementObserver(): void {
716
665
  if (this.placementObserver !== undefined) return;
717
- this.placementObserver = setInterval(() => this.observePlacementChanges(), 100);
666
+ this.placementObserver = setInterval(
667
+ () => this.observePlacementChanges(),
668
+ PLACEMENT_OBSERVATION_INTERVAL_MS
669
+ );
718
670
  this.placementObserver.unref();
719
671
  }
720
672
 
721
673
  private stopPlacementObserverIfIdle(): void {
722
- if ([...this.states.values()].some((state) => state.observers.size > 0)) return;
674
+ for (const state of this.states.values()) {
675
+ if (state.observers.size > 0) return;
676
+ }
723
677
  if (this.placementObserver !== undefined) clearInterval(this.placementObserver);
724
678
  this.placementObserver = undefined;
725
679
  }
726
680
 
727
681
  private observePlacementChanges(): void {
728
682
  for (const [meshName, state] of this.states) {
729
- if (state.observers.size === 0) continue;
730
- const locationStoreHealthy = this.options.isLocationStoreHealthy?.() ?? true;
731
- if (locationStoreHealthy !== this.locationStoreHealthFingerprints.get(meshName)) {
732
- this.locationStoreHealthFingerprints.set(meshName, locationStoreHealthy);
733
- state.sequence += 1n;
734
- for (const observer of state.observers) {
735
- observer.push(this.snapshot(meshName), meshName);
736
- }
737
- }
738
- const descriptor = this.options.meshNodeDescriptor?.(meshName);
739
- if (descriptor === undefined) continue;
740
- const fingerprint = placementFingerprint(descriptor);
741
- const previous = this.placementFingerprints.get(meshName);
742
- this.placementFingerprints.set(meshName, fingerprint);
743
- const node = this.options.meshNode(meshName);
744
- if (previous !== undefined && previous !== fingerprint) {
745
- state.sequence += 1n;
746
- for (const observer of state.observers) {
747
- observer.push(this.snapshot(meshName), meshName);
748
- }
749
- }
750
-
751
- const previousPeers = this.peerFingerprints.get(meshName) ?? new Map();
752
- const peers = node?.peers() ?? [];
753
- const nextPeers = peerFingerprintMap(peers);
754
- this.peerFingerprints.set(meshName, nextPeers);
755
- for (const peerRid of new Set([...previousPeers.keys(), ...nextPeers.keys()])) {
756
- if (previousPeers.get(peerRid) === nextPeers.get(peerRid)) continue;
757
- state.sequence += 1n;
758
- for (const observer of state.observers) {
759
- observer.push(this.snapshot(meshName), meshName);
760
- }
761
- }
683
+ this.publishCurrentStatus(meshName, state);
762
684
  }
763
685
  }
764
686
 
@@ -769,6 +691,77 @@ export class ZLinkRouteMeshRuntimeCoordinator implements ZLinkRouteMeshRuntime {
769
691
  }
770
692
  }
771
693
 
694
+ function terminalSnapshot(
695
+ current: ZLinkRouteMeshStatus,
696
+ state: ZLinkTopologyState
697
+ ): ZLinkRouteMeshStatus {
698
+ return {
699
+ ...current,
700
+ state,
701
+ isReady: false,
702
+ channels: current.channels.map((channel) => ({ ...channel, isReady: false })),
703
+ placement: {
704
+ ...current.placement,
705
+ isAvailable: false,
706
+ unavailableReason: ZLinkTopologyReason.RuntimeNotReady
707
+ }
708
+ };
709
+ }
710
+
711
+ function samePublicRouteMeshStatus(
712
+ left: ZLinkRouteMeshStatus,
713
+ right: ZLinkRouteMeshStatus
714
+ ): boolean {
715
+ return (
716
+ left.meshName === right.meshName &&
717
+ left.state === right.state &&
718
+ left.isReady === right.isReady &&
719
+ left.readyPeerCount === right.readyPeerCount &&
720
+ left.placement.isAvailable === right.placement.isAvailable &&
721
+ left.placement.activeActorCount === right.placement.activeActorCount &&
722
+ left.placement.activeSpotCount === right.placement.activeSpotCount &&
723
+ left.placement.unavailableReason === right.placement.unavailableReason &&
724
+ left.channels.length === right.channels.length &&
725
+ left.channels.every((channel, index) => {
726
+ const other = right.channels[index]!;
727
+ return (
728
+ channel.channelName === other.channelName &&
729
+ channel.isReady === other.isReady &&
730
+ channel.readyTargetCount === other.readyTargetCount
731
+ );
732
+ }) &&
733
+ left.peers.length === right.peers.length &&
734
+ left.peers.every((peer, index) => {
735
+ const other = right.peers[index]!;
736
+ return (
737
+ peer.nodeRid === other.nodeRid &&
738
+ peer.state === other.state &&
739
+ peer.unavailableReason === other.unavailableReason
740
+ );
741
+ })
742
+ );
743
+ }
744
+
745
+ function placementUnavailableReason(
746
+ available: boolean,
747
+ hostState: ZLinkFrameworkRuntimeState,
748
+ locationStoreHealthy: boolean
749
+ ): ZLinkTopologyReason | undefined {
750
+ if (available) return undefined;
751
+ switch (hostState) {
752
+ case ZLinkFrameworkRuntimeState.Relocating:
753
+ case ZLinkFrameworkRuntimeState.Relocated:
754
+ case ZLinkFrameworkRuntimeState.Draining:
755
+ return ZLinkTopologyReason.Draining;
756
+ case ZLinkFrameworkRuntimeState.Serving:
757
+ return !locationStoreHealthy
758
+ ? ZLinkTopologyReason.LocationUnavailable
759
+ : ZLinkTopologyReason.CapacityExceeded;
760
+ default:
761
+ return ZLinkTopologyReason.RuntimeNotReady;
762
+ }
763
+ }
764
+
772
765
  function topologyStateForHost(
773
766
  state: ZLinkFrameworkRuntimeState,
774
767
  fallback: ZLinkTopologyState
@@ -789,30 +782,6 @@ function topologyStateForHost(
789
782
  }
790
783
  }
791
784
 
792
- function placementFingerprint(descriptor: ZLinkMeshNodeDescriptor): string {
793
- const spotTypes = [...descriptor.populationCapacity.spotTypes]
794
- .sort((left, right) => {
795
- const kind = left.objectKind.localeCompare(right.objectKind);
796
- return kind !== 0 ? kind : left.stableType.localeCompare(right.stableType);
797
- })
798
- .map((entry) => [
799
- entry.objectKind,
800
- entry.stableType,
801
- entry.active,
802
- entry.reserved,
803
- entry.limit
804
- ]);
805
- return JSON.stringify([
806
- descriptor.objectRole,
807
- descriptor.placementWeight,
808
- descriptor.populationCapacity.actors,
809
- descriptor.populationCapacity.spots,
810
- spotTypes,
811
- descriptor.activationConcurrency,
812
- Object.entries(descriptor.channelWeights).sort(([left], [right]) => left.localeCompare(right))
813
- ]);
814
- }
815
-
816
785
  function hasRemainingCapacity(capacity: {
817
786
  readonly active: number;
818
787
  readonly limit: number;
@@ -821,19 +790,11 @@ function hasRemainingCapacity(capacity: {
821
790
  return capacity.limit === 0 || capacity.active + (capacity.reserved ?? 0) < capacity.limit;
822
791
  }
823
792
 
824
- function peerFingerprintMap(peers: ReturnType<ZLinkBackendMeshNode['peers']>): Map<string, string> {
825
- return new Map(
826
- peers.map((peer) => [
827
- String(peer.routingId),
828
- JSON.stringify([
829
- peer.lifecycleGeneration.toString(),
830
- peer.descriptorRevision.toString(),
831
- peer.endpoint,
832
- peer.state,
833
- peer.lastError
834
- ])
835
- ])
836
- );
793
+ export class ZLinkDrainingStatePublishError extends Error {
794
+ constructor(cause: unknown) {
795
+ super('Failed to publish draining peer rows.', { cause });
796
+ this.name = 'ZLinkDrainingStatePublishError';
797
+ }
837
798
  }
838
799
 
839
800
  export class ZLinkRetiringRollbackError extends Error {
@@ -857,33 +818,32 @@ function multiMeshDrainError(): ZLinkFrameworkException {
857
818
  );
858
819
  }
859
820
 
860
- function backendState(state: number): ZLinkTopologyState {
821
+ function backendState(state: MeshNodeRuntimeState): ZLinkTopologyState {
861
822
  switch (state) {
862
- case 1:
823
+ case MeshNodeRuntimeState.Preparing:
863
824
  return ZLinkTopologyState.Starting;
864
- case 2:
865
- case 3:
866
- case 4:
825
+ case MeshNodeRuntimeState.Serving:
867
826
  return ZLinkTopologyState.Ready;
868
- case 5:
827
+ case MeshNodeRuntimeState.Retiring:
828
+ case MeshNodeRuntimeState.Draining:
869
829
  return ZLinkTopologyState.Stopping;
870
- case 6:
830
+ case MeshNodeRuntimeState.Stopped:
871
831
  return ZLinkTopologyState.Stopped;
872
832
  default:
873
833
  return ZLinkTopologyState.Failed;
874
834
  }
875
835
  }
876
836
 
877
- function peerState(state: number): ZLinkPeerState {
837
+ function peerState(state: MeshPeerRuntimeState): ZLinkPeerState {
878
838
  switch (state) {
879
- case 3:
839
+ case MeshPeerRuntimeState.Serving:
880
840
  return ZLinkPeerState.Ready;
881
- case 4:
841
+ case MeshPeerRuntimeState.Draining:
882
842
  return ZLinkPeerState.Draining;
883
- case 6:
843
+ case MeshPeerRuntimeState.NotRequired:
884
844
  return ZLinkPeerState.NotRequired;
885
- case 1:
886
- case 2:
845
+ case MeshPeerRuntimeState.Connecting:
846
+ case MeshPeerRuntimeState.Preparing:
887
847
  return ZLinkPeerState.Connecting;
888
848
  default:
889
849
  return ZLinkPeerState.NotConnected;
@@ -903,14 +863,15 @@ function peerUnavailableReason(state: ZLinkPeerState): ZLinkTopologyReason | und
903
863
  }
904
864
 
905
865
  function drainFailureReason(error: unknown): ZLinkDrainForceReason {
906
- const name = error instanceof Error ? error.name : '';
907
- if (name === 'ZLinkDrainingStatePublishError') return 'drain_state_publish_failed';
866
+ if (isStructuralGuardEnabled()) {
867
+ const pending = debugPendingWorkNames();
868
+ if (pending.length > 0) console.error('[zlink.runtime.drain.pending]', pending);
869
+ }
870
+ if (error instanceof ZLinkDrainingStatePublishError) return 'drain_state_publish_failed';
908
871
  if (
909
- name === 'ZLinkOwnerCleanupError' ||
872
+ error instanceof ZLinkOwnerCleanupError ||
910
873
  (error instanceof AggregateError &&
911
- error.errors.some(
912
- (nested) => nested instanceof Error && nested.name === 'ZLinkOwnerCleanupError'
913
- ))
874
+ error.errors.some((nested) => nested instanceof ZLinkOwnerCleanupError))
914
875
  ) {
915
876
  return 'owner_cleanup_failed';
916
877
  }