@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
@@ -21,21 +21,151 @@ import {
21
21
  } from './runtime-observation-queue';
22
22
  import {
23
23
  runtimeStateIsReady,
24
- topologyRuntimeIsReady
24
+ topologyRuntimeIsReady,
25
+ topologyObservationIsTerminal
25
26
  } from '../foundation/runtime-state-projections';
27
+ import type {
28
+ ClientServerDescriptor,
29
+ FanoutPublisherDescriptor
30
+ } from '../foundation/service-discovery-registry';
26
31
 
27
32
  export { RuntimeEventQueue } from './runtime-observation-queue';
28
33
 
29
34
  type RuntimeAccessor = () => ZLinkChannelRuntimeManager | undefined;
30
35
  type HostStateAccessor = () => ZLinkFrameworkRuntimeState;
31
- interface HostObserver {
32
- readonly changed: () => void;
33
- readonly stop: () => void;
36
+ type TopologyStatus = ZLinkClientServerStatus | ZLinkFanoutStatus;
37
+ interface TopologySource<T extends TopologyStatus> {
38
+ lastSnapshot?: T;
39
+ readonly observers: Set<RuntimeEventQueue<T>>;
40
+ stop?: () => void;
41
+ }
42
+
43
+ class TopologyStatusSources<T extends TopologyStatus> {
44
+ private readonly sources = new Map<string, TopologySource<T>>();
45
+
46
+ constructor(
47
+ private readonly read: (channelName: string, sequence: bigint) => T,
48
+ private readonly subscribe: (channelName: string, changed: () => void) => () => void,
49
+ private readonly equivalent: (left: T, right: T) => boolean
50
+ ) {}
51
+
52
+ snapshot(channelName: string): T {
53
+ let source = this.sources.get(channelName);
54
+ const current = source?.lastSnapshot;
55
+ if (current !== undefined && topologyObservationIsTerminal(current.state)) return current;
56
+ const snapshot = this.read(channelName, current?.sequence ?? 0n);
57
+ if (source === undefined) {
58
+ source = { observers: new Set() };
59
+ this.sources.set(channelName, source);
60
+ }
61
+ const published = this.publish(channelName, source, snapshot);
62
+ if (source.stop === undefined && !topologyObservationIsTerminal(published.state)) {
63
+ source.stop = this.subscribe(channelName, () => this.snapshot(channelName));
64
+ }
65
+ return published;
66
+ }
67
+
68
+ observe(
69
+ channelName: string,
70
+ capacity: number,
71
+ signal?: AbortSignal
72
+ ): AsyncIterable<ZLinkObservedStatus<T>> {
73
+ const queue = new RuntimeEventQueue<T>(capacity, signal);
74
+ const snapshot = this.snapshot(channelName);
75
+ const current = this.sources.get(channelName)!;
76
+ current.observers.add(queue);
77
+ queue.onClose(() => {
78
+ current.observers.delete(queue);
79
+ });
80
+ this.deliver(queue, snapshot, channelName);
81
+ return queue;
82
+ }
83
+
84
+ hostStateChanged(): void {
85
+ for (const channelName of this.sources.keys()) this.snapshot(channelName);
86
+ }
87
+
88
+ stopObservers(): void {
89
+ for (const [channelName, source] of this.sources) {
90
+ if (
91
+ source.lastSnapshot === undefined ||
92
+ topologyObservationIsTerminal(source.lastSnapshot.state)
93
+ )
94
+ continue;
95
+ this.publish(channelName, source, {
96
+ ...source.lastSnapshot,
97
+ state: ZLinkTopologyState.Stopped,
98
+ isReady: false
99
+ });
100
+ }
101
+ }
102
+
103
+ private publish(channelName: string, source: TopologySource<T>, snapshot: T): T {
104
+ const previous = source.lastSnapshot;
105
+ if (previous !== undefined && this.equivalent(previous, snapshot)) return previous;
106
+ source.lastSnapshot = {
107
+ ...snapshot,
108
+ sequence: (previous?.sequence ?? 0n) + 1n,
109
+ observedAt: new Date()
110
+ };
111
+ for (const queue of source.observers) this.deliver(queue, source.lastSnapshot, channelName);
112
+ if (topologyObservationIsTerminal(source.lastSnapshot.state)) {
113
+ source.stop?.();
114
+ source.stop = undefined;
115
+ }
116
+ return source.lastSnapshot;
117
+ }
118
+
119
+ private deliver(queue: RuntimeEventQueue<T>, snapshot: T, channelName: string): void {
120
+ if (topologyObservationIsTerminal(snapshot.state)) queue.seal(snapshot, channelName);
121
+ else queue.push(snapshot, channelName);
122
+ }
123
+ }
124
+
125
+ function sameTopologyState(left: TopologyStatus, right: TopologyStatus): boolean {
126
+ return left.state === right.state && left.isReady === right.isReady;
127
+ }
128
+
129
+ function samePeer(left: ZLinkPeerStatus, right: ZLinkPeerStatus): boolean {
130
+ return (
131
+ left.nodeRid === right.nodeRid &&
132
+ left.state === right.state &&
133
+ left.unavailableReason === right.unavailableReason
134
+ );
135
+ }
136
+
137
+ function sameClientServerStatus(
138
+ left: ZLinkClientServerStatus,
139
+ right: ZLinkClientServerStatus
140
+ ): boolean {
141
+ return (
142
+ sameTopologyState(left, right) &&
143
+ left.localRole === right.localRole &&
144
+ left.readyTargetCount === right.readyTargetCount &&
145
+ left.targets.length === right.targets.length &&
146
+ left.targets.every(
147
+ (target, index) =>
148
+ samePeer(target, right.targets[index]!) && target.weight === right.targets[index]!.weight
149
+ )
150
+ );
151
+ }
152
+
153
+ function sameFanoutStatus(left: ZLinkFanoutStatus, right: ZLinkFanoutStatus): boolean {
154
+ return (
155
+ sameTopologyState(left, right) &&
156
+ left.readyPublisherCount === right.readyPublisherCount &&
157
+ left.publishers.length === right.publishers.length &&
158
+ left.publishers.every((publisher, index) => samePeer(publisher, right.publishers[index]!))
159
+ );
34
160
  }
35
161
 
36
162
  export class ZLinkClientServerRuntimeProjection implements ZLinkClientServerRuntime {
37
- private sequence = 0n;
38
- private readonly hostObservers = new Set<HostObserver>();
163
+ private readonly sources = new TopologyStatusSources<ZLinkClientServerStatus>(
164
+ (channelName, sequence) => this.snapshotCore(channelName, sequence),
165
+ (channelName, changed) =>
166
+ this.requireRuntime().observeClientServerTopology(channelName, changed),
167
+ sameClientServerStatus
168
+ );
39
169
 
40
170
  constructor(
41
171
  private readonly runtime: RuntimeAccessor,
@@ -43,34 +173,19 @@ export class ZLinkClientServerRuntimeProjection implements ZLinkClientServerRunt
43
173
  ) {}
44
174
 
45
175
  snapshot(channelName: string): ZLinkClientServerStatus {
46
- return this.snapshotCore(channelName);
176
+ return this.sources.snapshot(channelName);
47
177
  }
48
178
 
49
- private snapshotCore(channelName: string): ZLinkClientServerStatus {
179
+ private snapshotCore(channelName: string, sequence: bigint): ZLinkClientServerStatus {
50
180
  const topology = this.requireRuntime().clientServerTopology(channelName);
51
181
  if (topology.localRole === undefined) {
52
182
  throw new ZLinkConfigurationException(
53
183
  `ClientServer channel '${channelName}' is not registered.`
54
184
  );
55
185
  }
56
- const targets = topology.descriptors.map((descriptor): ZLinkClientServerTargetStatus => ({
57
- nodeRid: descriptor.serverRoutingId,
58
- weight: descriptor.weight,
59
- state:
60
- descriptor.state === 'serving'
61
- ? ZLinkPeerState.Ready
62
- : descriptor.state === 'retiring'
63
- ? ZLinkPeerState.Draining
64
- : descriptor.state === 'preparing'
65
- ? ZLinkPeerState.Connecting
66
- : ZLinkPeerState.NotConnected,
67
- unavailableReason:
68
- descriptor.state === 'serving' && descriptor.weight > 0
69
- ? undefined
70
- : descriptor.state === 'retiring'
71
- ? ZLinkTopologyReason.Draining
72
- : ZLinkTopologyReason.NoReadyTarget
73
- }));
186
+ const targets = topology.descriptors.map((descriptor) =>
187
+ peerStatusForAvailability(descriptor, ZLinkTopologyReason.NoReadyTarget)
188
+ );
74
189
  const readyTargetCount = targets.filter(
75
190
  (target) => target.state === ZLinkPeerState.Ready && target.weight > 0
76
191
  ).length;
@@ -83,7 +198,7 @@ export class ZLinkClientServerRuntimeProjection implements ZLinkClientServerRunt
83
198
  isReady,
84
199
  readyTargetCount,
85
200
  targets,
86
- sequence: this.sequence,
201
+ sequence,
87
202
  observedAt: new Date()
88
203
  };
89
204
  }
@@ -93,72 +208,19 @@ export class ZLinkClientServerRuntimeProjection implements ZLinkClientServerRunt
93
208
  capacity = ZLINK_DEFAULT_TERMINAL_OBSERVATION_CAPACITY,
94
209
  signal?: AbortSignal
95
210
  ): AsyncIterable<ZLinkObservedStatus<ZLinkClientServerStatus>> {
96
- const runtime = this.requireRuntime();
97
- const queue = new RuntimeEventQueue<ZLinkClientServerStatus>(capacity, signal);
98
- let lastSnapshot = this.snapshotCore(channelName);
99
- const stop = runtime.observeClientServerTopology(channelName, () => {
100
- this.sequence += 1n;
101
- lastSnapshot = this.snapshotCore(channelName);
102
- queue.push(lastSnapshot, channelName);
103
- });
104
- const hostObserver: HostObserver = {
105
- changed: () => {
106
- this.sequence += 1n;
107
- lastSnapshot = this.snapshotCore(channelName);
108
- queue.push(lastSnapshot, channelName);
109
- },
110
- stop: () => {
111
- this.sequence += 1n;
112
- let current = lastSnapshot;
113
- try {
114
- current = this.snapshotCore(channelName);
115
- lastSnapshot = current;
116
- } catch {
117
- // The last complete projection remains valid after native teardown.
118
- }
119
- queue.seal(
120
- {
121
- ...current,
122
- state: ZLinkTopologyState.Stopped,
123
- isReady: false,
124
- sequence: this.sequence,
125
- observedAt: new Date()
126
- },
127
- channelName
128
- );
129
- }
130
- };
131
- this.hostObservers.add(hostObserver);
132
- queue.onClose(() => {
133
- stop();
134
- this.hostObservers.delete(hostObserver);
135
- });
136
- return queue;
211
+ return this.sources.observe(channelName, capacity, signal);
137
212
  }
138
213
 
139
214
  hostStateChanged(): void {
140
- for (const observer of this.hostObservers) {
141
- try {
142
- observer.changed();
143
- } catch {
144
- // Monitoring projection failures do not change host lifecycle results.
145
- }
146
- }
215
+ this.sources.hostStateChanged();
147
216
  }
148
217
 
149
218
  stopObservers(): void {
150
- for (const observer of [...this.hostObservers]) {
151
- try {
152
- observer.stop();
153
- } catch {
154
- // The observer is still removed when its terminal snapshot fails.
155
- }
156
- }
157
- this.hostObservers.clear();
219
+ this.sources.stopObservers();
158
220
  }
159
221
 
160
222
  isReady(channelName: string): boolean {
161
- return this.snapshotCore(channelName).isReady;
223
+ return this.snapshot(channelName).isReady;
162
224
  }
163
225
 
164
226
  private requireRuntime(): ZLinkChannelRuntimeManager {
@@ -170,8 +232,11 @@ export class ZLinkClientServerRuntimeProjection implements ZLinkClientServerRunt
170
232
  }
171
233
 
172
234
  export class ZLinkFanoutRuntimeProjection implements ZLinkFanoutRuntime {
173
- private sequence = 0n;
174
- private readonly hostObservers = new Set<HostObserver>();
235
+ private readonly sources = new TopologyStatusSources<ZLinkFanoutStatus>(
236
+ (channelName, sequence) => this.snapshotCore(channelName, sequence),
237
+ (channelName, changed) => this.requireRuntime().observeFanoutTopology(channelName, changed),
238
+ sameFanoutStatus
239
+ );
175
240
 
176
241
  constructor(
177
242
  private readonly runtime: RuntimeAccessor,
@@ -179,29 +244,15 @@ export class ZLinkFanoutRuntimeProjection implements ZLinkFanoutRuntime {
179
244
  ) {}
180
245
 
181
246
  snapshot(channelName: string): ZLinkFanoutStatus {
182
- return this.snapshotCore(channelName);
247
+ return this.sources.snapshot(channelName);
183
248
  }
184
249
 
185
- private snapshotCore(channelName: string): ZLinkFanoutStatus {
250
+ private snapshotCore(channelName: string, sequence: bigint): ZLinkFanoutStatus {
186
251
  const publishers = this.requireRuntime()
187
252
  .fanoutTopology(channelName)
188
- .descriptors.map((descriptor): ZLinkPeerStatus => ({
189
- nodeRid: descriptor.publisherRoutingId,
190
- state:
191
- descriptor.state === 'serving'
192
- ? ZLinkPeerState.Ready
193
- : descriptor.state === 'retiring'
194
- ? ZLinkPeerState.Draining
195
- : descriptor.state === 'preparing'
196
- ? ZLinkPeerState.Connecting
197
- : ZLinkPeerState.NotConnected,
198
- unavailableReason:
199
- descriptor.state === 'serving'
200
- ? undefined
201
- : descriptor.state === 'retiring'
202
- ? ZLinkTopologyReason.Draining
203
- : ZLinkTopologyReason.NoReadyTarget
204
- }));
253
+ .descriptors.map((descriptor) =>
254
+ peerStatusForAvailability(descriptor, ZLinkTopologyReason.NoReadyPeer)
255
+ );
205
256
  const readyPublisherCount = publishers.filter(
206
257
  (publisher) => publisher.state === ZLinkPeerState.Ready
207
258
  ).length;
@@ -217,7 +268,7 @@ export class ZLinkFanoutRuntimeProjection implements ZLinkFanoutRuntime {
217
268
  isReady: topologyRuntimeIsReady(hostState, readyPublisherCount),
218
269
  readyPublisherCount,
219
270
  publishers,
220
- sequence: this.sequence,
271
+ sequence,
221
272
  observedAt: new Date()
222
273
  };
223
274
  }
@@ -227,68 +278,15 @@ export class ZLinkFanoutRuntimeProjection implements ZLinkFanoutRuntime {
227
278
  capacity = ZLINK_DEFAULT_TERMINAL_OBSERVATION_CAPACITY,
228
279
  signal?: AbortSignal
229
280
  ): AsyncIterable<ZLinkObservedStatus<ZLinkFanoutStatus>> {
230
- const runtime = this.requireRuntime();
231
- const queue = new RuntimeEventQueue<ZLinkFanoutStatus>(capacity, signal);
232
- let lastSnapshot = this.snapshotCore(channelName);
233
- const stop = runtime.observeFanoutTopology(channelName, () => {
234
- this.sequence += 1n;
235
- lastSnapshot = this.snapshotCore(channelName);
236
- queue.push(lastSnapshot, channelName);
237
- });
238
- const hostObserver: HostObserver = {
239
- changed: () => {
240
- this.sequence += 1n;
241
- lastSnapshot = this.snapshotCore(channelName);
242
- queue.push(lastSnapshot, channelName);
243
- },
244
- stop: () => {
245
- this.sequence += 1n;
246
- let current = lastSnapshot;
247
- try {
248
- current = this.snapshotCore(channelName);
249
- lastSnapshot = current;
250
- } catch {
251
- // The last complete projection remains valid after native teardown.
252
- }
253
- queue.seal(
254
- {
255
- ...current,
256
- state: ZLinkTopologyState.Stopped,
257
- isReady: false,
258
- sequence: this.sequence,
259
- observedAt: new Date()
260
- },
261
- channelName
262
- );
263
- }
264
- };
265
- this.hostObservers.add(hostObserver);
266
- queue.onClose(() => {
267
- stop();
268
- this.hostObservers.delete(hostObserver);
269
- });
270
- return queue;
281
+ return this.sources.observe(channelName, capacity, signal);
271
282
  }
272
283
 
273
284
  hostStateChanged(): void {
274
- for (const observer of this.hostObservers) {
275
- try {
276
- observer.changed();
277
- } catch {
278
- // Monitoring projection failures do not change host lifecycle results.
279
- }
280
- }
285
+ this.sources.hostStateChanged();
281
286
  }
282
287
 
283
288
  stopObservers(): void {
284
- for (const observer of [...this.hostObservers]) {
285
- try {
286
- observer.stop();
287
- } catch {
288
- // The observer is still removed when its terminal snapshot fails.
289
- }
290
- }
291
- this.hostObservers.clear();
289
+ this.sources.stopObservers();
292
290
  }
293
291
 
294
292
  private requireRuntime(): ZLinkChannelRuntimeManager {
@@ -299,6 +297,40 @@ export class ZLinkFanoutRuntimeProjection implements ZLinkFanoutRuntime {
299
297
  }
300
298
  }
301
299
 
300
+ function peerStatusForAvailability(
301
+ descriptor: Pick<ClientServerDescriptor, 'serverRoutingId' | 'weight' | 'state'>,
302
+ unavailableReason: ZLinkTopologyReason.NoReadyTarget
303
+ ): ZLinkClientServerTargetStatus;
304
+ function peerStatusForAvailability(
305
+ descriptor: Pick<FanoutPublisherDescriptor, 'publisherRoutingId' | 'state'>,
306
+ unavailableReason: ZLinkTopologyReason.NoReadyPeer
307
+ ): ZLinkPeerStatus;
308
+ function peerStatusForAvailability(
309
+ descriptor:
310
+ | Pick<ClientServerDescriptor, 'serverRoutingId' | 'weight' | 'state'>
311
+ | Pick<FanoutPublisherDescriptor, 'publisherRoutingId' | 'state'>,
312
+ noReadyReason: ZLinkTopologyReason.NoReadyTarget | ZLinkTopologyReason.NoReadyPeer
313
+ ): ZLinkClientServerTargetStatus | ZLinkPeerStatus {
314
+ let state = ZLinkPeerState.NotConnected;
315
+ let unavailableReason: ZLinkTopologyReason | undefined = noReadyReason;
316
+ switch (descriptor.state) {
317
+ case 'retiring':
318
+ state = ZLinkPeerState.Draining;
319
+ unavailableReason = ZLinkTopologyReason.Draining;
320
+ break;
321
+ case 'serving':
322
+ state = ZLinkPeerState.Ready;
323
+ unavailableReason = undefined;
324
+ break;
325
+ case 'preparing':
326
+ state = ZLinkPeerState.Connecting;
327
+ break;
328
+ }
329
+ return 'serverRoutingId' in descriptor
330
+ ? { nodeRid: descriptor.serverRoutingId, weight: descriptor.weight, state, unavailableReason }
331
+ : { nodeRid: descriptor.publisherRoutingId, state, unavailableReason };
332
+ }
333
+
302
334
  function topologyStateForHost(state: ZLinkFrameworkRuntimeState): ZLinkTopologyState {
303
335
  switch (state) {
304
336
  case ZLinkFrameworkRuntimeState.Preparing:
@@ -0,0 +1,19 @@
1
+ export class RuntimeDisposal {
2
+ private task?: Promise<void> | null;
3
+
4
+ get started(): boolean {
5
+ return this.task !== undefined;
6
+ }
7
+
8
+ run(close: () => Promise<void>): Promise<void> {
9
+ if (this.task != null) return this.task;
10
+ const task = Promise.resolve()
11
+ .then(close)
12
+ .catch((error: unknown) => {
13
+ this.task = null;
14
+ throw error;
15
+ });
16
+ this.task = task;
17
+ return task;
18
+ }
19
+ }
@@ -241,12 +241,7 @@ export function isCurrentZLinkSpotSerialTurn(executor: ZLinkSpotSerialTurnExecut
241
241
 
242
242
  export interface ZLinkExecutionBarrierSeal {
243
243
  readonly generation: bigint;
244
- /**
245
- * A Spot Close seal waits for yielded turns accepted before it and lets them
246
- * resume (Spot address messaging §7 step 2); a relocation seal does not, and
247
- * their continuation fails (execution gate §4).
248
- */
249
- readonly drainsYieldedTurns: boolean;
244
+ readonly kind: 'close' | 'relocation';
250
245
  }
251
246
 
252
247
  export interface ZLinkExecutionBarrierClaim {
@@ -270,32 +265,46 @@ export class ZLinkExecutionBarrier {
270
265
  private generation = 0n;
271
266
  private activeClaims = 0;
272
267
  private suspendedClaims = 0;
268
+ /** Claims whose turn has started and yielded at least once, until released. */
269
+ private yieldedTurnClaims = 0;
273
270
  private currentSeal: ZLinkExecutionBarrierSeal | undefined;
274
271
  private readonly admissionWaiters: ZLinkExecutionBarrierWaiter[] = [];
275
272
  private readonly quiescenceWaiters = new Set<() => void>();
276
- private committed = false;
273
+ private committedSeal?: ZLinkExecutionBarrierSeal;
277
274
 
278
275
  get isSealed(): boolean {
279
- return this.currentSeal !== undefined || this.committed;
276
+ return this.currentSeal !== undefined || this.committedSeal !== undefined;
277
+ }
278
+
279
+ get isCloseSealed(): boolean {
280
+ return (this.currentSeal ?? this.committedSeal)?.kind === 'close';
280
281
  }
281
282
 
282
- async enter(): Promise<ZLinkExecutionBarrierClaim> {
283
- if (this.committed) {
283
+ enter(): ZLinkExecutionBarrierClaim | Promise<ZLinkExecutionBarrierClaim> {
284
+ if (this.committedSeal !== undefined) {
284
285
  throw createInternalFrameworkException(
285
- ZLinkFrameworkInternalErrorKind.SpotMoving,
286
+ this.committedSeal.kind === 'close'
287
+ ? ZLinkFrameworkInternalErrorKind.RequestRejected
288
+ : ZLinkFrameworkInternalErrorKind.SpotMoving,
286
289
  'ZLink execution barrier is committed.'
287
290
  );
288
291
  }
289
292
  if (this.currentSeal !== undefined) {
290
- return await new Promise<ZLinkExecutionBarrierClaim>((resolve, reject) => {
293
+ if (this.currentSeal.kind === 'close') {
294
+ throw createInternalFrameworkException(
295
+ ZLinkFrameworkInternalErrorKind.RequestRejected,
296
+ 'ZLink execution barrier is sealed for Close.'
297
+ );
298
+ }
299
+ return new Promise<ZLinkExecutionBarrierClaim>((resolve, reject) => {
291
300
  this.admissionWaiters.push({ resolve, reject });
292
301
  });
293
302
  }
294
303
  return this.createClaim();
295
304
  }
296
305
 
297
- seal(drainsYieldedTurns = false): ZLinkExecutionBarrierSeal {
298
- if (this.committed) {
306
+ seal(kind: ZLinkExecutionBarrierSeal['kind'] = 'relocation'): ZLinkExecutionBarrierSeal {
307
+ if (this.committedSeal !== undefined) {
299
308
  throw createInternalFrameworkException(
300
309
  ZLinkFrameworkInternalErrorKind.SpotMoving,
301
310
  'ZLink execution barrier is committed.'
@@ -304,7 +313,7 @@ export class ZLinkExecutionBarrier {
304
313
  if (this.currentSeal !== undefined) {
305
314
  throw new Error('ZLink execution barrier is already sealed.');
306
315
  }
307
- const seal = Object.freeze({ generation: ++this.generation, drainsYieldedTurns });
316
+ const seal = Object.freeze({ generation: ++this.generation, kind });
308
317
  this.currentSeal = seal;
309
318
  return seal;
310
319
  }
@@ -330,6 +339,29 @@ export class ZLinkExecutionBarrier {
330
339
  this.requireCurrent(seal);
331
340
  }
332
341
 
342
+ /**
343
+ * Spot messaging §7 step 1: a Close that keeps admission open still lets every
344
+ * already-started (yielded) turn finish in its generation before cleanup.
345
+ */
346
+ async waitForStartedTurns(signal?: AbortSignal): Promise<void> {
347
+ if (this.yieldedTurnClaims === 0) return;
348
+ if (signal?.aborted === true) throw signal.reason;
349
+ await new Promise<void>((resolve, reject) => {
350
+ const complete = () => {
351
+ if (this.yieldedTurnClaims !== 0) return;
352
+ this.quiescenceWaiters.delete(complete);
353
+ signal?.removeEventListener('abort', abort);
354
+ resolve();
355
+ };
356
+ const abort = () => {
357
+ this.quiescenceWaiters.delete(complete);
358
+ reject(signal?.reason);
359
+ };
360
+ this.quiescenceWaiters.add(complete);
361
+ signal?.addEventListener('abort', abort, { once: true });
362
+ });
363
+ }
364
+
333
365
  abort(seal: ZLinkExecutionBarrierSeal): boolean {
334
366
  if (!this.isCurrent(seal)) return false;
335
367
  this.currentSeal = undefined;
@@ -341,9 +373,11 @@ export class ZLinkExecutionBarrier {
341
373
  commit(seal: ZLinkExecutionBarrierSeal): boolean {
342
374
  if (!this.isCurrent(seal)) return false;
343
375
  this.currentSeal = undefined;
344
- this.committed = true;
376
+ this.committedSeal = seal;
345
377
  const error = createInternalFrameworkException(
346
- ZLinkFrameworkInternalErrorKind.SpotMoving,
378
+ seal.kind === 'close'
379
+ ? ZLinkFrameworkInternalErrorKind.RequestRejected
380
+ : ZLinkFrameworkInternalErrorKind.SpotMoving,
347
381
  'ZLink execution barrier is committed.'
348
382
  );
349
383
  for (const waiter of this.admissionWaiters) waiter.reject(error);
@@ -356,7 +390,7 @@ export class ZLinkExecutionBarrier {
356
390
  }
357
391
 
358
392
  private isQuiescent(seal: ZLinkExecutionBarrierSeal): boolean {
359
- return this.activeClaims === 0 && (!seal.drainsYieldedTurns || this.suspendedClaims === 0);
393
+ return this.activeClaims === 0 && (seal.kind !== 'close' || this.suspendedClaims === 0);
360
394
  }
361
395
 
362
396
  private notifyQuiescence(): void {
@@ -366,10 +400,12 @@ export class ZLinkExecutionBarrier {
366
400
  private createClaim(): ZLinkExecutionBarrierClaim {
367
401
  this.activeClaims++;
368
402
  let state: 'active' | 'suspended' | 'released' = 'active';
403
+ let yielded = false;
369
404
  const release = () => {
370
405
  if (state === 'released') return;
371
406
  if (state === 'active') this.activeClaims--;
372
407
  else this.suspendedClaims--;
408
+ if (yielded) this.yieldedTurnClaims--;
373
409
  state = 'released';
374
410
  this.notifyQuiescence();
375
411
  };
@@ -378,6 +414,10 @@ export class ZLinkExecutionBarrier {
378
414
  suspend: () => {
379
415
  if (state !== 'active') return;
380
416
  state = 'suspended';
417
+ if (!yielded) {
418
+ yielded = true;
419
+ this.yieldedTurnClaims++;
420
+ }
381
421
  this.activeClaims--;
382
422
  this.suspendedClaims++;
383
423
  this.notifyQuiescence();
@@ -385,8 +425,8 @@ export class ZLinkExecutionBarrier {
385
425
  resume: () => {
386
426
  if (state !== 'suspended') return state === 'active';
387
427
  if (
388
- this.committed ||
389
- (this.currentSeal !== undefined && !this.currentSeal.drainsYieldedTurns)
428
+ this.committedSeal !== undefined ||
429
+ (this.currentSeal !== undefined && this.currentSeal.kind !== 'close')
390
430
  ) {
391
431
  release();
392
432
  return false;