@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
@@ -6,23 +6,28 @@ import {
6
6
  type ZLinkFanoutPublisherDescriptor,
7
7
  type ZLinkLocationOwnerToken
8
8
  } from '../../contracts/Locations';
9
- import type { ZLinkFanoutLocationStore } from '../locations/internal-store-contracts';
10
9
  import {
11
10
  zlinkRuntimeDefaultLocationOptions,
12
11
  type ZLinkLocationOptionOverrides
13
12
  } from '../../contracts/Locations/Options';
14
- import type { ZLinkFrameworkRegistration } from '../configuration';
15
- import { buildAdvertisedEndpoint, ZLinkConfigurationException } from '../configuration';
16
- import type { ZLinkLocationRuntime, ZLinkLocationRuntimeStores } from '../locations';
13
+ import { ZLINK_PROVIDER_MAX_PAGE_SIZE } from '../../contracts/Locations/Stores';
17
14
  import type { ZLinkBackendSubscriberSocket } from '../backend/contracts';
18
- import { ZLinkChannelSocketRegistry } from './channel-socket-registry';
15
+ import { type ZLinkFrameworkRegistration, ZLinkConfigurationException } from '../configuration';
16
+
19
17
  import { ZLinkStateLane } from '../execution/state-lane';
18
+ import { discoveryAvailabilityForRuntimeState } from '../foundation/runtime-state-projections';
19
+ import { closeResources, finishResourceCleanup } from '../foundation/event-loop-resources';
20
+ import type { ZLinkLocationRuntime, ZLinkLocationRuntimeStores } from '../locations';
21
+ import type { ZLinkFanoutLocationStore } from '../locations/internal-store-contracts';
22
+ import { ZLinkChannelSocketRegistry } from './channel-socket-registry';
20
23
 
21
- interface ActiveFanoutTarget {
24
+ interface FanoutTarget {
22
25
  descriptor: ZLinkFanoutPublisherDescriptor;
26
+ connection?: ActiveFanoutConnection;
27
+ }
28
+
29
+ interface ActiveFanoutConnection {
23
30
  readonly connectionId: string;
24
- readonly subscriber: ZLinkBackendSubscriberSocket;
25
- reconnectEligible: boolean;
26
31
  stopReceiver: () => Promise<void>;
27
32
  state: 'connecting' | 'ready';
28
33
  }
@@ -39,7 +44,7 @@ export class ZLinkFanoutLocationRuntime {
39
44
  readonly lifecycleGeneration: bigint;
40
45
  }
41
46
  >();
42
- private readonly connections = new Map<string, ActiveFanoutTarget>();
47
+ private readonly targets = new Map<string, FanoutTarget>();
43
48
  private controller?: AbortController;
44
49
  private timer?: NodeJS.Timeout;
45
50
 
@@ -95,18 +100,49 @@ export class ZLinkFanoutLocationRuntime {
95
100
  return current;
96
101
  });
97
102
  if (timer !== undefined) clearTimeout(timer);
98
- const connectionIds = await this.lane.run(() => [...this.connections.keys()]);
99
- await Promise.allSettled(connectionIds.map((id) => this.closeConnection(id)));
100
- await this.removeLocalPublishers(signal);
103
+ const targets = await this.lane.run(() => [...this.targets]);
104
+ const targetResults = await Promise.allSettled(
105
+ targets.map(([id, target]) => this.removeTarget(id, target))
106
+ );
107
+ const publisherResults = await Promise.allSettled([this.removeLocalPublishers(signal)]);
108
+ finishResourceCleanup(
109
+ [...targetResults, ...publisherResults].flatMap((result) =>
110
+ result.status === 'rejected' ? [result.reason] : []
111
+ )
112
+ );
101
113
  }
102
114
 
103
115
  activeTargets(channelName: string): readonly ZLinkFanoutPublisherDescriptor[] {
104
- return [...this.connections.values()]
105
- .filter((target) => target.state === 'ready')
116
+ return [...this.targets.values()]
117
+ .filter((target) => target.connection?.state === 'ready')
106
118
  .map((target) => target.descriptor)
107
119
  .filter((descriptor) => descriptor.channelName === channelName);
108
120
  }
109
121
 
122
+ topologyTargets(channelName: string) {
123
+ if (!this.isAutomaticSubscriber(channelName)) return undefined;
124
+ return [...this.targets.values()]
125
+ .filter((target) => target.descriptor.channelName === channelName)
126
+ .map((target) => ({
127
+ channelName,
128
+ publisherRoutingId: String(target.descriptor.publisherRid),
129
+ lifecycleGeneration: target.descriptor.lifecycleGeneration,
130
+ descriptorRevision: target.descriptor.descriptorRevision,
131
+ advertisedEndpoint: target.descriptor.endpoint,
132
+ state:
133
+ target.descriptor.state === ZLinkFrameworkRuntimeState.Serving
134
+ ? target.connection?.state === 'ready'
135
+ ? ('serving' as const)
136
+ : ('preparing' as const)
137
+ : discoveryAvailabilityForRuntimeState(target.descriptor.state)
138
+ }));
139
+ }
140
+
141
+ private isAutomaticSubscriber(channelName: string): boolean {
142
+ const subscriber = this.registration.channels.get(channelName)?.subscriber;
143
+ return subscriber !== undefined && (subscriber.manualConnections?.length ?? 0) === 0;
144
+ }
145
+
110
146
  async reclaimOwnerRows(signal?: AbortSignal): Promise<void> {
111
147
  const owner = this.requireOwnerToken();
112
148
  const descriptors = await this.lane.run(() => [...this.localDescriptors]);
@@ -142,11 +178,9 @@ export class ZLinkFanoutLocationRuntime {
142
178
  const owner = this.requireOwnerToken();
143
179
  for (const [channelName, channel] of this.registration.channels) {
144
180
  if (channel.publisher === undefined) continue;
145
- const publisher = this.sockets.publisher(channelName);
146
- const endpoint = advertisedEndpoint(
147
- publisher.lastEndpoint ?? channel.publisher.bind ?? '',
148
- channel.publisher.advertiseHost
149
- );
181
+ // Opening the publisher binds it and fixes its advertised endpoint.
182
+ this.sockets.publisher(channelName);
183
+ const endpoint = this.sockets.fanoutPublisherEndpoint(channelName) ?? '';
150
184
  if (endpoint.length === 0) {
151
185
  throw new ZLinkConfigurationException(
152
186
  `Fanout publisher '${channelName}' did not report a bound endpoint.`
@@ -217,74 +251,87 @@ export class ZLinkFanoutLocationRuntime {
217
251
  }
218
252
 
219
253
  private async reconcileSubscribers(signal?: AbortSignal): Promise<void> {
220
- for (const [channelName, channel] of this.registration.channels) {
221
- if (
222
- channel.subscriber === undefined ||
223
- (channel.subscriber.manualConnections?.length ?? 0) > 0
224
- ) {
225
- continue;
226
- }
254
+ for (const channelName of this.registration.channels.keys()) {
255
+ if (!this.isAutomaticSubscriber(channelName)) continue;
256
+ const previous = this.topologyTargets(channelName)!;
227
257
  const rows = await this.listLivePublishers(channelName, signal);
228
258
  const desired = new Map(rows.map((row) => [fanoutConnectionId(row), row]));
229
259
  for (const [connectionId, descriptor] of desired) {
230
- const current = await this.lane.run(() => this.connections.get(connectionId));
260
+ let current = await this.lane.run(() => this.targets.get(connectionId));
231
261
  if (current === undefined) {
232
- await this.openConnection(connectionId, descriptor);
233
- continue;
234
- }
235
- if (descriptor.descriptorRevision < current.descriptor.descriptorRevision) {
262
+ const created = { descriptor };
263
+ current = created;
264
+ await this.lane.run(() => this.targets.set(connectionId, created));
265
+ } else if (descriptor.descriptorRevision < current.descriptor.descriptorRevision) {
236
266
  continue;
237
- }
238
- if (descriptor.descriptorRevision === current.descriptor.descriptorRevision) {
267
+ } else if (descriptor.descriptorRevision === current.descriptor.descriptorRevision) {
239
268
  if (!sameFanoutDescriptor(descriptor, current.descriptor)) {
240
- await this.closeConnection(connectionId);
269
+ await this.removeTarget(connectionId, current);
270
+ continue;
241
271
  }
272
+ } else if (!sameFanoutImmutableIdentity(descriptor, current.descriptor)) {
273
+ await this.removeTarget(connectionId, current);
242
274
  continue;
275
+ } else {
276
+ const target = current;
277
+ await this.lane.run(() => {
278
+ if (this.targets.get(connectionId) === target) target.descriptor = descriptor;
279
+ });
280
+ if (current.connection?.state === 'ready') {
281
+ this.sockets.admitFanoutPublisher(current.descriptor, connectionId);
282
+ }
243
283
  }
244
- if (!sameFanoutImmutableIdentity(descriptor, current.descriptor)) {
245
- await this.closeConnection(connectionId);
246
- continue;
247
- }
248
- await this.lane.run(() => {
249
- if (this.connections.get(connectionId) === current) current.descriptor = descriptor;
250
- });
251
- if (current.state === 'ready') {
252
- this.sockets.admitFanoutPublisher(descriptor, connectionId);
253
- }
284
+ await this.reconcileConnection(connectionId, current);
254
285
  }
255
- const connections = await this.lane.run(() => [...this.connections]);
256
- for (const [connectionId, current] of connections) {
286
+ const targets = await this.lane.run(() => [...this.targets]);
287
+ for (const [connectionId, current] of targets) {
257
288
  if (current.descriptor.channelName === channelName && !desired.has(connectionId)) {
258
- await this.closeConnection(connectionId);
289
+ await this.removeTarget(connectionId, current);
259
290
  }
260
291
  }
292
+ const next = this.topologyTargets(channelName)!;
293
+ if (
294
+ previous.length !== next.length ||
295
+ previous.some(
296
+ (publisher, index) =>
297
+ publisher.publisherRoutingId !== next[index]!.publisherRoutingId ||
298
+ publisher.state !== next[index]!.state
299
+ )
300
+ ) {
301
+ this.sockets.notifyFanoutTopology(channelName);
302
+ }
261
303
  }
262
304
  }
263
305
 
264
- private async openConnection(
265
- connectionId: string,
266
- descriptor: ZLinkFanoutPublisherDescriptor
267
- ): Promise<void> {
268
- let target: ActiveFanoutTarget | undefined;
306
+ private async reconcileConnection(connectionId: string, target: FanoutTarget): Promise<void> {
307
+ if (target.descriptor.state !== ZLinkFrameworkRuntimeState.Serving) {
308
+ await this.closeConnection(target);
309
+ } else if (target.connection === undefined) {
310
+ await this.openConnection(connectionId, target);
311
+ }
312
+ }
313
+
314
+ private async openConnection(connectionId: string, target: FanoutTarget): Promise<void> {
315
+ const descriptor = target.descriptor;
316
+ let connection: ActiveFanoutConnection | undefined;
269
317
  const subscriber = this.sockets.openFanoutSubscriberConnection(
270
318
  descriptor.channelName,
271
319
  connectionId,
272
320
  descriptor.endpoint,
273
321
  {
274
322
  onReady: () => {
275
- const current = this.connections.get(connectionId);
276
- if (target !== undefined && current === target) {
277
- current.state = 'ready';
278
- this.sockets.admitFanoutPublisher(descriptor, connectionId);
323
+ if (connection !== undefined && target.connection === connection) {
324
+ connection.state = 'ready';
325
+ this.sockets.admitFanoutPublisher(target.descriptor, connectionId);
279
326
  }
280
327
  },
281
328
  onTerminated: () => {
282
- const current = this.connections.get(connectionId);
283
- if (target !== undefined && current === target && current.reconnectEligible) {
284
- this.sockets.removeFanoutPublisher(descriptor, connectionId);
285
- current.state = 'connecting';
329
+ if (connection !== undefined && target.connection === connection) {
330
+ this.sockets.removeFanoutPublisher(target.descriptor, connectionId);
331
+ connection.state = 'connecting';
332
+ const terminated = connection;
286
333
  setImmediate(() => {
287
- void this.replaceConnection(current).catch((error) =>
334
+ void this.replaceConnection(target, terminated).catch((error) =>
288
335
  this.locationRuntime.reportDiscoveryFailure(error)
289
336
  );
290
337
  });
@@ -292,50 +339,76 @@ export class ZLinkFanoutLocationRuntime {
292
339
  }
293
340
  }
294
341
  );
295
- target = {
296
- descriptor,
342
+ connection = {
297
343
  connectionId,
298
- subscriber,
299
- reconnectEligible: true,
300
344
  stopReceiver: async () => {},
301
345
  state: 'connecting'
302
346
  };
303
- await this.lane.run(() => this.connections.set(connectionId, target));
304
- target.stopReceiver = this.onSubscriberOpened(descriptor.channelName, connectionId, subscriber);
347
+ const opened = connection;
348
+ await this.lane.run(() => (target.connection = opened));
349
+ connection.stopReceiver = this.onSubscriberOpened(
350
+ descriptor.channelName,
351
+ connectionId,
352
+ subscriber
353
+ );
305
354
  }
306
355
 
307
- private async closeConnection(connectionId: string): Promise<void> {
308
- const current = await this.lane.run(() => {
309
- const target = this.connections.get(connectionId);
310
- if (target !== undefined) {
311
- target.reconnectEligible = false;
312
- this.connections.delete(connectionId);
313
- }
314
- return target;
356
+ private async removeTarget(connectionId: string, target: FanoutTarget): Promise<void> {
357
+ const detached = await this.lane.run(() => {
358
+ if (this.targets.get(connectionId) !== target) return undefined;
359
+ this.targets.delete(connectionId);
360
+ return this.detachConnection(target);
315
361
  });
362
+ await this.closeDetachedConnection(target.descriptor, detached);
363
+ }
364
+
365
+ private async closeConnection(target: FanoutTarget): Promise<void> {
366
+ const detached = await this.lane.run(() => this.detachConnection(target));
367
+ await this.closeDetachedConnection(target.descriptor, detached);
368
+ }
369
+
370
+ private detachConnection(target: FanoutTarget): ActiveFanoutConnection | undefined {
371
+ const connection = target.connection;
372
+ target.connection = undefined;
373
+ return connection;
374
+ }
375
+
376
+ private async closeDetachedConnection(
377
+ descriptor: ZLinkFanoutPublisherDescriptor,
378
+ current: ActiveFanoutConnection | undefined
379
+ ): Promise<void> {
316
380
  if (current === undefined) return;
317
- this.sockets.removeFanoutPublisher(current.descriptor, connectionId);
318
- await current.stopReceiver();
319
- await this.sockets.closeFanoutSubscriberConnection(connectionId);
381
+ this.sockets.removeFanoutPublisher(descriptor, current.connectionId);
382
+ await closeResources([
383
+ { close: () => current.stopReceiver() },
384
+ { close: () => this.sockets.closeFanoutSubscriberConnection(current.connectionId) }
385
+ ]);
320
386
  }
321
387
 
322
- private async replaceConnection(expected: ActiveFanoutTarget): Promise<void> {
388
+ private async replaceConnection(
389
+ target: FanoutTarget,
390
+ expected: ActiveFanoutConnection
391
+ ): Promise<void> {
323
392
  const prepared = await this.lane.run(() => {
324
393
  const controller = this.controller;
325
394
  if (
326
- this.connections.get(expected.connectionId) !== expected ||
327
- !expected.reconnectEligible ||
395
+ this.targets.get(expected.connectionId) !== target ||
396
+ target.connection !== expected ||
328
397
  controller === undefined
329
398
  )
330
399
  return undefined;
331
- return { controller, descriptor: expected.descriptor };
400
+ return controller;
332
401
  });
333
402
  if (prepared === undefined) {
334
403
  return;
335
404
  }
336
- await this.closeConnection(expected.connectionId);
337
- if (await this.lane.run(() => this.controller === prepared.controller)) {
338
- await this.openConnection(expected.connectionId, prepared.descriptor);
405
+ await this.closeConnection(target);
406
+ if (
407
+ await this.lane.run(
408
+ () => this.controller === prepared && this.targets.get(expected.connectionId) === target
409
+ )
410
+ ) {
411
+ await this.reconcileConnection(expected.connectionId, target);
339
412
  }
340
413
  }
341
414
 
@@ -348,7 +421,7 @@ export class ZLinkFanoutLocationRuntime {
348
421
  do {
349
422
  const page = await this.store.listFanoutPublishers(
350
423
  channelName,
351
- { pageSize: 1000, continuationToken },
424
+ { pageSize: ZLINK_PROVIDER_MAX_PAGE_SIZE, continuationToken },
352
425
  signal
353
426
  );
354
427
  rows.push(...page.items);
@@ -356,7 +429,6 @@ export class ZLinkFanoutLocationRuntime {
356
429
  } while (continuationToken !== undefined);
357
430
  const live: ZLinkFanoutPublisherDescriptor[] = [];
358
431
  for (const descriptor of rows) {
359
- if (descriptor.state !== ZLinkFrameworkRuntimeState.Serving) continue;
360
432
  const lease = await this.storeOwnerLease(descriptor.ownerId, signal);
361
433
  if (
362
434
  lease.kind === 'found' &&
@@ -377,17 +449,24 @@ export class ZLinkFanoutLocationRuntime {
377
449
  const owner = this.locationRuntime.currentOwnerToken;
378
450
  if (owner === undefined) return;
379
451
  const descriptors = await this.lane.run(() => [...this.localDescriptors.values()]);
380
- for (const descriptor of descriptors) {
381
- await this.store.removeFanoutPublisher(
382
- {
383
- channelName: descriptor.channelName,
384
- publisherRid: descriptor.publisherRid
385
- },
386
- owner,
387
- signal
452
+ try {
453
+ await closeResources(
454
+ descriptors.map((descriptor) => ({
455
+ close: async () => {
456
+ await this.store.removeFanoutPublisher(
457
+ {
458
+ channelName: descriptor.channelName,
459
+ publisherRid: descriptor.publisherRid
460
+ },
461
+ owner,
462
+ signal
463
+ );
464
+ }
465
+ }))
388
466
  );
467
+ } finally {
468
+ await this.lane.run(() => this.localDescriptors.clear());
389
469
  }
390
- await this.lane.run(() => this.localDescriptors.clear());
391
470
  }
392
471
 
393
472
  private requireOwnerToken(): ZLinkLocationOwnerToken {
@@ -412,16 +491,6 @@ export class ZLinkFanoutLocationRuntime {
412
491
  }
413
492
  }
414
493
 
415
- function advertisedEndpoint(boundEndpoint: string, advertiseHost: string | undefined): string {
416
- const result = buildAdvertisedEndpoint(boundEndpoint, advertiseHost);
417
- if (result === undefined) {
418
- throw new ZLinkConfigurationException(
419
- `Fanout publisher bound endpoint '${boundEndpoint}' cannot be advertised.`
420
- );
421
- }
422
- return result;
423
- }
424
-
425
494
  function fanoutConnectionId(descriptor: ZLinkFanoutPublisherDescriptor): string {
426
495
  return (
427
496
  `${descriptor.channelName}\0${String(descriptor.publisherRid)}\0` +
@@ -3,7 +3,7 @@ import type { ZLinkBackendMessageLike as MessageLike } from '../backend/runtime-
3
3
  import { ZLinkConfigurationException } from '../configuration';
4
4
  import { ZLinkChannelMessageKind } from './channel-envelope';
5
5
 
6
- const SPOT_DIRECT_ENVELOPE = 'zlink.framework.spot-direct.v1';
6
+ export const SPOT_DIRECT_ENVELOPE = 'zlink.framework.spot-direct.v1';
7
7
 
8
8
  export function encodeSpotDirectEnvelope(
9
9
  kind: ZLinkChannelMessageKind.Request | ZLinkChannelMessageKind.Command,
@@ -1,3 +1,4 @@
1
+ import { DEFAULT_REQUEST_TIMEOUT_MS } from '../../contracts/Configuration/Registration';
1
2
  import type { Message } from '../../contracts/Common/Message';
2
3
  import type { ZLinkFrameworkRegistration } from '../configuration';
3
4
  import { awaitWithAbort, throwIfAborted } from '../abort';
@@ -44,7 +45,8 @@ export class ZLinkSpotNodeRouteTransport {
44
45
  if (router === undefined) {
45
46
  return undefined;
46
47
  }
47
- const effectiveTimeoutMs = timeoutMs ?? this.registration.requestTimeoutMs ?? 30_000;
48
+ const effectiveTimeoutMs =
49
+ timeoutMs ?? this.registration.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
48
50
  throwIfAborted(signal);
49
51
  const operation = router.requestToSpot(
50
52
  target.targetNodeRid,
@@ -74,7 +76,8 @@ export class ZLinkSpotNodeRouteTransport {
74
76
  if (router === undefined) {
75
77
  return undefined;
76
78
  }
77
- const effectiveTimeoutMs = timeoutMs ?? this.registration.requestTimeoutMs ?? 30_000;
79
+ const effectiveTimeoutMs =
80
+ timeoutMs ?? this.registration.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
78
81
  throwIfAborted(signal);
79
82
  const operation = router.requestToSpot(
80
83
  target.targetNodeRid,
@@ -0,0 +1,4 @@
1
+ /** Formats absent diagnostic text consistently across the Node runtime. */
2
+ export function diagnosticTextOrAbsent(value: string | null | undefined): string {
3
+ return value ?? '<none>';
4
+ }
@@ -1,4 +1,39 @@
1
- const ERROR_MESSAGE_MAX_LENGTH = 512;
1
+ import {
2
+ ZLinkFrameworkErrorKind,
3
+ ZLinkFrameworkException
4
+ } from '../../contracts/Errors/ZLinkFrameworkException';
5
+ import { ZLinkRuntimeDispatchErrorReason as ZLinkDispatchErrorReason } from '../../contracts/Dispatch/ZLinkDispatchOptions';
6
+ import {
7
+ internalFrameworkErrorKind,
8
+ ZLinkFrameworkInternalErrorKind
9
+ } from '../framework-errors-internal';
10
+
11
+ export function dispatchReasonFromError(error: unknown): ZLinkDispatchErrorReason {
12
+ if (!(error instanceof ZLinkFrameworkException)) return ZLinkDispatchErrorReason.HandlerException;
13
+ const origin = internalFrameworkErrorKind(error);
14
+ if (origin === ZLinkFrameworkInternalErrorKind.PayloadDecodeFailed)
15
+ return ZLinkDispatchErrorReason.PayloadDecodeFailed;
16
+ if (
17
+ origin === ZLinkFrameworkInternalErrorKind.SpotGenerationStale ||
18
+ origin === ZLinkFrameworkInternalErrorKind.ActorGenerationStale ||
19
+ origin === ZLinkFrameworkInternalErrorKind.SpotMoving ||
20
+ origin === ZLinkFrameworkInternalErrorKind.ActorMoving ||
21
+ origin === ZLinkFrameworkInternalErrorKind.ActorLocationStale
22
+ )
23
+ return ZLinkDispatchErrorReason.StaleTarget;
24
+ switch (error.kind) {
25
+ case ZLinkFrameworkErrorKind.NotFound:
26
+ return ZLinkDispatchErrorReason.HandlerMissing;
27
+ case ZLinkFrameworkErrorKind.ProtocolError:
28
+ return ZLinkDispatchErrorReason.InvalidFrame;
29
+ case ZLinkFrameworkErrorKind.ShuttingDown:
30
+ return ZLinkDispatchErrorReason.Shutdown;
31
+ default:
32
+ return ZLinkDispatchErrorReason.HandlerException;
33
+ }
34
+ }
35
+
36
+ export const ERROR_MESSAGE_MAX_LENGTH = 512;
2
37
 
3
38
  const CREDENTIAL_PATTERNS: ReadonlyArray<readonly [RegExp, string]> = [
4
39
  [/Authorization\s*:\s*(?:(?:Bearer|Basic)\s+)?[^\s,;]+/gi, 'Authorization: <redacted>'],
@@ -1,6 +1,20 @@
1
1
  import { AsyncLocalStorage } from 'node:async_hooks';
2
2
  import { randomBytes } from 'node:crypto';
3
3
  import type { ZLinkFlowOrigin } from '../../contracts';
4
+ const FLOW_UUID_BYTES = 16;
5
+ const FLOW_UUID_VARIANT_BYTE = 8;
6
+
7
+ /**
8
+ * Spec 27 §3 defines the flow_origin value set as lowercase
9
+ * (`inbound|timer|application|lifecycle`); every language emits these exact
10
+ * strings so records remain comparable across runtimes (spec 26 §3.1).
11
+ */
12
+ export const FLOW_ORIGIN_VALUES: Readonly<Record<ZLinkFlowOrigin, string>> = Object.freeze({
13
+ Inbound: 'inbound',
14
+ Timer: 'timer',
15
+ Application: 'application',
16
+ Lifecycle: 'lifecycle'
17
+ });
4
18
 
5
19
  export interface ZLinkFlowContextValue {
6
20
  readonly flowId: string;
@@ -84,12 +98,12 @@ export function createInboundFlow(
84
98
  }
85
99
 
86
100
  function createFlowId(): string {
87
- const bytes = randomBytes(16);
101
+ const bytes = randomBytes(FLOW_UUID_BYTES);
88
102
  // Date.now() is always within 48 bits, which is exactly the UUIDv7
89
103
  // timestamp field.
90
104
  bytes.writeUIntBE(Date.now(), 0, 6);
91
105
  bytes[6] = 0x70 | (bytes[6] & 0x0f);
92
- bytes[8] = 0x80 | (bytes[8] & 0x3f);
106
+ bytes[FLOW_UUID_VARIANT_BYTE] = 0x80 | (bytes[FLOW_UUID_VARIANT_BYTE] & 0x3f);
93
107
  const hex = bytes.toString('hex');
94
108
  return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
95
109
  }
@@ -1,37 +1,41 @@
1
+ import { AsyncResource } from 'node:async_hooks';
1
2
  import type {
2
3
  ZLinkLocationRuntimeQuery,
3
4
  ZLinkLocationRuntimeStatus,
4
- ZLinkLocationTopologyEntry,
5
- ZLinkLocationServiceSummary
5
+ ZLinkLocationServiceSummary,
6
+ ZLinkLocationTopologyEntry
6
7
  } from '../../contracts';
7
- import type {
8
- ZLinkActorLocation,
9
- ZLinkPeerLocation,
10
- ZLinkRouteLocation,
11
- ZLinkSpotLocation
12
- } from '../../contracts/Locations/Rows';
13
8
  import type {
14
9
  ZLinkActorLocationKey,
15
10
  ZLinkLocationKey,
16
11
  ZLinkRouteLocationKey,
17
12
  ZLinkSpotLocationKey
18
13
  } from '../../contracts/Locations/Keys';
14
+ import type {
15
+ ZLinkActorLocation,
16
+ ZLinkPeerLocation,
17
+ ZLinkRouteLocation,
18
+ ZLinkSpotLocation
19
+ } from '../../contracts/Locations/Rows';
20
+ import type { ZLinkBackendSocketMonitor, ZLinkBackendSocketMonitorEvent } from '../backend';
21
+ import { ZLinkStateLane } from '../execution/state-lane';
22
+ import { normalizeOpaqueRoutingId } from '../routing-id';
19
23
  import {
20
- ZLinkLocationRuntimeEventKind as LocationRuntimeEventKind,
21
24
  ZLinkLocationActorEventKind as ActorLocationEventKind,
25
+ ZLinkLocationRuntimeEventKind as LocationRuntimeEventKind,
22
26
  ZLinkLocationPeerEventKind as PeerLocationEventKind,
23
27
  ZLinkLocationRouteEventKind as RouteLocationEventKind,
24
- ZLinkLocationSpotEventKind as SpotLocationEventKind,
25
28
  ZLinkSocketEventKind as SocketEventKind,
26
- ZLinkSocketNativeEventType,
27
29
  ZLinkSocketNativeEventType as SocketNativeEventType,
30
+ ZLinkLocationSpotEventKind as SpotLocationEventKind,
31
+ ZLinkSocketNativeEventType,
28
32
  type ZLinkAutoConnectDesiredSetChange,
29
33
  type ZLinkLocationActorEvent,
30
34
  type ZLinkLocationMonitoringRegistration,
31
35
  type ZLinkLocationPeerEvent,
36
+ type ZLinkLocationRouteEvent,
32
37
  type ZLinkLocationRuntimeEvent,
33
38
  type ZLinkLocationRuntimeEventKind,
34
- type ZLinkLocationRouteEvent,
35
39
  type ZLinkLocationSpotEvent,
36
40
  type ZLinkPollingMonitoringRegistration,
37
41
  type ZLinkRuntimeEvent,
@@ -40,6 +44,7 @@ import {
40
44
  type ZLinkSocketEventKind,
41
45
  type ZLinkSocketMonitoringRegistration
42
46
  } from './internal-event-contracts';
47
+
43
48
  export {
44
49
  ZLinkLocationActorEventKind,
45
50
  ZLinkLocationPeerEventKind,
@@ -47,10 +52,6 @@ export {
47
52
  ZLinkLocationSpotEventKind,
48
53
  ZLinkSocketNativeEventType
49
54
  } from './internal-event-contracts';
50
- import type { ZLinkBackendSocketMonitor, ZLinkBackendSocketMonitorEvent } from '../backend';
51
- import { AsyncResource } from 'node:async_hooks';
52
- import { ZLinkStateLane } from '../execution/state-lane';
53
- import { normalizeOpaqueRoutingId } from '../routing-id';
54
55
 
55
56
  const ZLINK_DISCONNECT_REASON_HANDSHAKE_FAILED = 3;
56
57
  const detachedStateLaneResource = new AsyncResource('zlink:location-runtime-monitoring-source');
@@ -62,9 +63,18 @@ export interface ZLinkActorOwnerLeaseObservation {
62
63
  readonly decision: 'owner_unavailable';
63
64
  }
64
65
 
66
+ export function isRelocationDebugEnabled(): boolean {
67
+ return process.env.ZLINK_DEBUG_FRAMEWORK_RELOCATION === '1';
68
+ }
69
+
70
+ export function relocationDebug(marker: string, detail: Record<string, unknown>): void {
71
+ if (!isRelocationDebugEnabled()) return;
72
+ console.error('[zlink.runtime.relocation]', marker, detail);
73
+ }
74
+
65
75
  /** Emits high-cardinality resolver detail only on the existing relocation debug path. */
66
76
  export function emitActorOwnerLeaseObservation(observation: ZLinkActorOwnerLeaseObservation): void {
67
- if (process.env.ZLINK_DEBUG_FRAMEWORK_RELOCATION !== '1') return;
77
+ if (!isRelocationDebugEnabled()) return;
68
78
  console.error('[zlink.runtime.relocation]', 'actor_route.owner_lease_observed', observation);
69
79
  }
70
80