@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
@@ -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 { 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]);
@@ -215,74 +251,87 @@ export class ZLinkFanoutLocationRuntime {
215
251
  }
216
252
 
217
253
  private async reconcileSubscribers(signal?: AbortSignal): Promise<void> {
218
- for (const [channelName, channel] of this.registration.channels) {
219
- if (
220
- channel.subscriber === undefined ||
221
- (channel.subscriber.manualConnections?.length ?? 0) > 0
222
- ) {
223
- continue;
224
- }
254
+ for (const channelName of this.registration.channels.keys()) {
255
+ if (!this.isAutomaticSubscriber(channelName)) continue;
256
+ const previous = this.topologyTargets(channelName)!;
225
257
  const rows = await this.listLivePublishers(channelName, signal);
226
258
  const desired = new Map(rows.map((row) => [fanoutConnectionId(row), row]));
227
259
  for (const [connectionId, descriptor] of desired) {
228
- const current = await this.lane.run(() => this.connections.get(connectionId));
260
+ let current = await this.lane.run(() => this.targets.get(connectionId));
229
261
  if (current === undefined) {
230
- await this.openConnection(connectionId, descriptor);
231
- continue;
232
- }
233
- 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) {
234
266
  continue;
235
- }
236
- if (descriptor.descriptorRevision === current.descriptor.descriptorRevision) {
267
+ } else if (descriptor.descriptorRevision === current.descriptor.descriptorRevision) {
237
268
  if (!sameFanoutDescriptor(descriptor, current.descriptor)) {
238
- await this.closeConnection(connectionId);
269
+ await this.removeTarget(connectionId, current);
270
+ continue;
239
271
  }
272
+ } else if (!sameFanoutImmutableIdentity(descriptor, current.descriptor)) {
273
+ await this.removeTarget(connectionId, current);
240
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
+ }
241
283
  }
242
- if (!sameFanoutImmutableIdentity(descriptor, current.descriptor)) {
243
- await this.closeConnection(connectionId);
244
- continue;
245
- }
246
- await this.lane.run(() => {
247
- if (this.connections.get(connectionId) === current) current.descriptor = descriptor;
248
- });
249
- if (current.state === 'ready') {
250
- this.sockets.admitFanoutPublisher(descriptor, connectionId);
251
- }
284
+ await this.reconcileConnection(connectionId, current);
252
285
  }
253
- const connections = await this.lane.run(() => [...this.connections]);
254
- for (const [connectionId, current] of connections) {
286
+ const targets = await this.lane.run(() => [...this.targets]);
287
+ for (const [connectionId, current] of targets) {
255
288
  if (current.descriptor.channelName === channelName && !desired.has(connectionId)) {
256
- await this.closeConnection(connectionId);
289
+ await this.removeTarget(connectionId, current);
257
290
  }
258
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
+ }
259
303
  }
260
304
  }
261
305
 
262
- private async openConnection(
263
- connectionId: string,
264
- descriptor: ZLinkFanoutPublisherDescriptor
265
- ): Promise<void> {
266
- 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;
267
317
  const subscriber = this.sockets.openFanoutSubscriberConnection(
268
318
  descriptor.channelName,
269
319
  connectionId,
270
320
  descriptor.endpoint,
271
321
  {
272
322
  onReady: () => {
273
- const current = this.connections.get(connectionId);
274
- if (target !== undefined && current === target) {
275
- current.state = 'ready';
276
- this.sockets.admitFanoutPublisher(descriptor, connectionId);
323
+ if (connection !== undefined && target.connection === connection) {
324
+ connection.state = 'ready';
325
+ this.sockets.admitFanoutPublisher(target.descriptor, connectionId);
277
326
  }
278
327
  },
279
328
  onTerminated: () => {
280
- const current = this.connections.get(connectionId);
281
- if (target !== undefined && current === target && current.reconnectEligible) {
282
- this.sockets.removeFanoutPublisher(descriptor, connectionId);
283
- 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;
284
333
  setImmediate(() => {
285
- void this.replaceConnection(current).catch((error) =>
334
+ void this.replaceConnection(target, terminated).catch((error) =>
286
335
  this.locationRuntime.reportDiscoveryFailure(error)
287
336
  );
288
337
  });
@@ -290,50 +339,76 @@ export class ZLinkFanoutLocationRuntime {
290
339
  }
291
340
  }
292
341
  );
293
- target = {
294
- descriptor,
342
+ connection = {
295
343
  connectionId,
296
- subscriber,
297
- reconnectEligible: true,
298
344
  stopReceiver: async () => {},
299
345
  state: 'connecting'
300
346
  };
301
- await this.lane.run(() => this.connections.set(connectionId, target));
302
- 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
+ );
303
354
  }
304
355
 
305
- private async closeConnection(connectionId: string): Promise<void> {
306
- const current = await this.lane.run(() => {
307
- const target = this.connections.get(connectionId);
308
- if (target !== undefined) {
309
- target.reconnectEligible = false;
310
- this.connections.delete(connectionId);
311
- }
312
- 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);
313
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> {
314
380
  if (current === undefined) return;
315
- this.sockets.removeFanoutPublisher(current.descriptor, connectionId);
316
- await current.stopReceiver();
317
- 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
+ ]);
318
386
  }
319
387
 
320
- private async replaceConnection(expected: ActiveFanoutTarget): Promise<void> {
388
+ private async replaceConnection(
389
+ target: FanoutTarget,
390
+ expected: ActiveFanoutConnection
391
+ ): Promise<void> {
321
392
  const prepared = await this.lane.run(() => {
322
393
  const controller = this.controller;
323
394
  if (
324
- this.connections.get(expected.connectionId) !== expected ||
325
- !expected.reconnectEligible ||
395
+ this.targets.get(expected.connectionId) !== target ||
396
+ target.connection !== expected ||
326
397
  controller === undefined
327
398
  )
328
399
  return undefined;
329
- return { controller, descriptor: expected.descriptor };
400
+ return controller;
330
401
  });
331
402
  if (prepared === undefined) {
332
403
  return;
333
404
  }
334
- await this.closeConnection(expected.connectionId);
335
- if (await this.lane.run(() => this.controller === prepared.controller)) {
336
- 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);
337
412
  }
338
413
  }
339
414
 
@@ -346,7 +421,7 @@ export class ZLinkFanoutLocationRuntime {
346
421
  do {
347
422
  const page = await this.store.listFanoutPublishers(
348
423
  channelName,
349
- { pageSize: 1000, continuationToken },
424
+ { pageSize: ZLINK_PROVIDER_MAX_PAGE_SIZE, continuationToken },
350
425
  signal
351
426
  );
352
427
  rows.push(...page.items);
@@ -354,7 +429,6 @@ export class ZLinkFanoutLocationRuntime {
354
429
  } while (continuationToken !== undefined);
355
430
  const live: ZLinkFanoutPublisherDescriptor[] = [];
356
431
  for (const descriptor of rows) {
357
- if (descriptor.state !== ZLinkFrameworkRuntimeState.Serving) continue;
358
432
  const lease = await this.storeOwnerLease(descriptor.ownerId, signal);
359
433
  if (
360
434
  lease.kind === 'found' &&
@@ -375,17 +449,24 @@ export class ZLinkFanoutLocationRuntime {
375
449
  const owner = this.locationRuntime.currentOwnerToken;
376
450
  if (owner === undefined) return;
377
451
  const descriptors = await this.lane.run(() => [...this.localDescriptors.values()]);
378
- for (const descriptor of descriptors) {
379
- await this.store.removeFanoutPublisher(
380
- {
381
- channelName: descriptor.channelName,
382
- publisherRid: descriptor.publisherRid
383
- },
384
- owner,
385
- 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
+ }))
386
466
  );
467
+ } finally {
468
+ await this.lane.run(() => this.localDescriptors.clear());
387
469
  }
388
- await this.lane.run(() => this.localDescriptors.clear());
389
470
  }
390
471
 
391
472
  private requireOwnerToken(): ZLinkLocationOwnerToken {
@@ -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