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