@zlink-systems/framework 0.25.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (557) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Channels/IZLinkFanoutClient.d.ts +0 -6
  3. package/dist/contracts/Common/CoreTypes.d.ts +6 -0
  4. package/dist/contracts/Common/CoreTypes.js +7 -0
  5. package/dist/contracts/Common/index.d.ts +1 -1
  6. package/dist/contracts/Common/index.js +0 -1
  7. package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
  8. package/dist/contracts/Configuration/InternalDefaults.js +9 -1
  9. package/dist/contracts/Configuration/Registration.d.ts +13 -2
  10. package/dist/contracts/Configuration/Registration.js +58 -36
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
  12. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
  13. package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
  14. package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
  15. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  16. package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
  17. package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
  18. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
  19. package/dist/contracts/Handlers/JsonContract.js +10 -4
  20. package/dist/contracts/Locations/Authority.d.ts +1 -1
  21. package/dist/contracts/Locations/Authority.js +3 -2
  22. package/dist/contracts/Locations/Options.js +1 -1
  23. package/dist/contracts/Locations/Stores.d.ts +12 -0
  24. package/dist/contracts/Locations/Stores.js +9 -0
  25. package/dist/contracts/RouteMesh/RuntimeTopology.d.ts +8 -0
  26. package/dist/contracts/Spots/Contracts.d.ts +1 -1
  27. package/dist/internal.d.ts +5 -0
  28. package/dist/internal.js +16 -1
  29. package/dist/nest-integration.d.ts +4 -2
  30. package/dist/nest-integration.js +14 -4
  31. package/dist/runtime/abort.d.ts +1 -0
  32. package/dist/runtime/abort.js +8 -5
  33. package/dist/runtime/activation-admission.d.ts +28 -0
  34. package/dist/runtime/activation-admission.js +57 -0
  35. package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
  36. package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
  37. package/dist/runtime/actors/actor-client.d.ts +2 -2
  38. package/dist/runtime/actors/actor-client.js +42 -143
  39. package/dist/runtime/actors/actor-context.d.ts +3 -5
  40. package/dist/runtime/actors/actor-context.js +19 -17
  41. package/dist/runtime/actors/actor-handoff.d.ts +13 -7
  42. package/dist/runtime/actors/actor-handoff.js +36 -25
  43. package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
  44. package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
  45. package/dist/runtime/actors/actor-local-native-join.js +85 -123
  46. package/dist/runtime/actors/actor-native-lookup.js +2 -8
  47. package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
  48. package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
  49. package/dist/runtime/actors/actor-remote-joiner.d.ts +3 -3
  50. package/dist/runtime/actors/actor-remote-joiner.js +11 -17
  51. package/dist/runtime/actors/actor-remote-wire.js +5 -3
  52. package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
  53. package/dist/runtime/actors/actor-request-deadline.js +31 -0
  54. package/dist/runtime/actors/actor-retry-delay.js +2 -1
  55. package/dist/runtime/actors/actor-runtime-contracts.d.ts +4 -2
  56. package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
  57. package/dist/runtime/actors/actor-runtime-state.js +70 -187
  58. package/dist/runtime/actors/actor-source-transfer.d.ts +5 -5
  59. package/dist/runtime/actors/bound-session-wire.js +2 -7
  60. package/dist/runtime/actors/deferred-join-completion.d.ts +19 -0
  61. package/dist/runtime/actors/deferred-join-completion.js +21 -0
  62. package/dist/runtime/actors/index.d.ts +10 -8
  63. package/dist/runtime/actors/index.js +101 -73
  64. package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
  65. package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
  66. package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
  67. package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
  68. package/dist/runtime/admission.d.ts +7 -1
  69. package/dist/runtime/admission.js +11 -1
  70. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
  71. package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
  72. package/dist/runtime/backend/contracts/index.d.ts +8 -33
  73. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +3 -26
  74. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
  75. package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
  76. package/dist/runtime/backend/node/node-backend-adapter-factory.d.ts +1 -2
  77. package/dist/runtime/backend/node/node-backend-adapter-factory.js +4 -18
  78. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +7 -4
  79. package/dist/runtime/backend/node/node-backend-adapter-support.js +28 -34
  80. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
  81. package/dist/runtime/backend/node/node-event-loop-poller.js +11 -6
  82. package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
  83. package/dist/runtime/backend/node/node-raw-binding-port.d.ts +1 -1
  84. package/dist/runtime/backend/node/node-raw-binding-port.js +51 -19
  85. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +21 -19
  86. package/dist/runtime/backend/node/node-raw-mesh-backend.js +171 -111
  87. package/dist/runtime/backend/node/node-socket-backend-adapter.js +4 -3
  88. package/dist/runtime/backend/raw-binding-port.d.ts +13 -1
  89. package/dist/runtime/backend/runtime-values.d.ts +4 -1
  90. package/dist/runtime/backend/runtime-values.js +2 -0
  91. package/dist/runtime/channels/channel-clients.d.ts +20 -9
  92. package/dist/runtime/channels/channel-clients.js +68 -60
  93. package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
  94. package/dist/runtime/channels/channel-envelope.js +47 -29
  95. package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
  96. package/dist/runtime/channels/channel-outbound-operations.js +9 -18
  97. package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
  98. package/dist/runtime/channels/channel-receive-loops.js +27 -6
  99. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
  100. package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
  101. package/dist/runtime/channels/channel-runtime-manager.d.ts +2 -5
  102. package/dist/runtime/channels/channel-runtime-manager.js +4 -12
  103. package/dist/runtime/channels/channel-socket-options.js +3 -2
  104. package/dist/runtime/channels/channel-socket-registry.d.ts +30 -32
  105. package/dist/runtime/channels/channel-socket-registry.js +296 -235
  106. package/dist/runtime/channels/channel-transports.d.ts +11 -20
  107. package/dist/runtime/channels/channel-transports.js +68 -47
  108. package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
  109. package/dist/runtime/channels/client-server-location-runtime.js +10 -11
  110. package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
  111. package/dist/runtime/channels/client-server-service-wire.js +32 -11
  112. package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
  113. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  114. package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
  115. package/dist/runtime/channels/fanout-location-runtime.js +133 -81
  116. package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
  117. package/dist/runtime/channels/spot-direct-envelope.js +4 -3
  118. package/dist/runtime/channels/spot-node-route-transport.js +3 -2
  119. package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
  120. package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
  121. package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
  122. package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
  123. package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
  124. package/dist/runtime/diagnostics/flow-context.js +16 -2
  125. package/dist/runtime/diagnostics/index.d.ts +4 -2
  126. package/dist/runtime/diagnostics/index.js +14 -4
  127. package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
  128. package/dist/runtime/diagnostics/message-flow.js +10 -19
  129. package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
  130. package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
  131. package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
  132. package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
  133. package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
  134. package/dist/runtime/disposal.d.ts +5 -0
  135. package/dist/runtime/disposal.js +22 -0
  136. package/dist/runtime/execution/index.d.ts +22 -9
  137. package/dist/runtime/execution/index.js +107 -37
  138. package/dist/runtime/execution/serial-execution-queue.d.ts +12 -7
  139. package/dist/runtime/execution/serial-execution-queue.js +99 -26
  140. package/dist/runtime/execution/state-lane.d.ts +8 -1
  141. package/dist/runtime/execution/state-lane.js +118 -3
  142. package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
  143. package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
  144. package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
  145. package/dist/runtime/foundation/event-loop-resources.js +6 -119
  146. package/dist/runtime/foundation/listener-records.d.ts +11 -0
  147. package/dist/runtime/foundation/listener-records.js +20 -0
  148. package/dist/runtime/foundation/operation-identity.d.ts +2 -0
  149. package/dist/runtime/foundation/operation-identity.js +9 -5
  150. package/dist/runtime/foundation/operation-registry.d.ts +5 -7
  151. package/dist/runtime/foundation/operation-registry.js +34 -44
  152. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +18 -26
  153. package/dist/runtime/foundation/raw-service-mesh-runtime.js +122 -469
  154. package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
  155. package/dist/runtime/foundation/runtime-state-projections.js +8 -0
  156. package/dist/runtime/foundation/service-authority-payload-codec.d.ts +1 -0
  157. package/dist/runtime/foundation/service-authority-payload-codec.js +30 -12
  158. package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
  159. package/dist/runtime/foundation/service-discovery-registry.js +22 -3
  160. package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
  161. package/dist/runtime/foundation/service-liveness-registry.js +2 -1
  162. package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
  163. package/dist/runtime/foundation/service-maintenance-runtime.js +23 -8
  164. package/dist/runtime/foundation/service-metadata-codec.js +3 -3
  165. package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
  166. package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
  167. package/dist/runtime/foundation/service-relocation-coordinator.d.ts +9 -0
  168. package/dist/runtime/foundation/service-relocation-coordinator.js +14 -1
  169. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +8 -0
  170. package/dist/runtime/foundation/service-relocation-object-owner.js +19 -6
  171. package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
  172. package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
  173. package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
  174. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -19
  175. package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
  176. package/dist/runtime/foundation/service-stateful-registry.js +10 -2
  177. package/dist/runtime/foundation/service-stateful-runtime.d.ts +28 -24
  178. package/dist/runtime/foundation/service-stateful-runtime.js +297 -244
  179. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +12 -7
  180. package/dist/runtime/foundation/service-stateful-wire-codec.js +240 -143
  181. package/dist/runtime/foundation/service-topology-registry.d.ts +1 -3
  182. package/dist/runtime/foundation/service-topology-registry.js +22 -61
  183. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
  184. package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
  185. package/dist/runtime/foundation/service-wire-codec.js +10 -8
  186. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  187. package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
  188. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
  189. package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
  190. package/dist/runtime/framework-errors-internal.d.ts +2 -1
  191. package/dist/runtime/framework-errors-internal.js +343 -122
  192. package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
  193. package/dist/runtime/handlers/handler-instance-scope.js +61 -74
  194. package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
  195. package/dist/runtime/host/actor-packet-relay.js +48 -91
  196. package/dist/runtime/host/actor-placement-coordinator.js +7 -5
  197. package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
  198. package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
  199. package/dist/runtime/host/actor-transfer-runtime.d.ts +28 -28
  200. package/dist/runtime/host/actor-transfer-runtime.js +210 -256
  201. package/dist/runtime/host/application-job-queue.js +16 -33
  202. package/dist/runtime/host/bound-session-relay.js +1 -1
  203. package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
  204. package/dist/runtime/host/index.d.ts +19 -14
  205. package/dist/runtime/host/index.js +234 -175
  206. package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
  207. package/dist/runtime/host/instance-activation-authority.js +17 -45
  208. package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
  209. package/dist/runtime/host/location-runtime-owner.js +2 -2
  210. package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
  211. package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
  212. package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
  213. package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
  214. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
  215. package/dist/runtime/host/remote-bound-session-relay.js +11 -23
  216. package/dist/runtime/host/route-mesh-runtime.d.ts +14 -10
  217. package/dist/runtime/host/route-mesh-runtime.js +178 -257
  218. package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
  219. package/dist/runtime/host/runtime-shutdown.js +18 -21
  220. package/dist/runtime/host/service-relocation-control.js +6 -1
  221. package/dist/runtime/host/service-relocation-host-runtime.d.ts +71 -38
  222. package/dist/runtime/host/service-relocation-host-runtime.js +816 -651
  223. package/dist/runtime/host/spot-address-transport.d.ts +2 -3
  224. package/dist/runtime/host/spot-address-transport.js +34 -136
  225. package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
  226. package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
  227. package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -7
  228. package/dist/runtime/host/spot-runtime-options-factory.js +53 -21
  229. package/dist/runtime/host/stateful-authority-route-runtime.js +6 -2
  230. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +14 -6
  231. package/dist/runtime/host/user-spot-creation-coordinator.js +96 -95
  232. package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
  233. package/dist/runtime/locations/authority-key-codec.js +4 -3
  234. package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
  235. package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
  236. package/dist/runtime/locations/creation-operation-id.js +6 -4
  237. package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
  238. package/dist/runtime/locations/in-memory-authority-store.js +31 -15
  239. package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
  240. package/dist/runtime/locations/in-memory-location-store.js +17 -14
  241. package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
  242. package/dist/runtime/locations/in-memory-provider-location-store.js +79 -27
  243. package/dist/runtime/locations/key-codec.js +3 -2
  244. package/dist/runtime/locations/lease-tracker.d.ts +3 -5
  245. package/dist/runtime/locations/lease-tracker.js +7 -11
  246. package/dist/runtime/locations/lifecycle.d.ts +5 -10
  247. package/dist/runtime/locations/lifecycle.js +4 -33
  248. package/dist/runtime/locations/location-store-failure.d.ts +2 -0
  249. package/dist/runtime/locations/location-store-failure.js +7 -0
  250. package/dist/runtime/locations/location-store-pages.d.ts +3 -0
  251. package/dist/runtime/locations/location-store-pages.js +13 -0
  252. package/dist/runtime/locations/location-store-repository.d.ts +5 -7
  253. package/dist/runtime/locations/location-store-repository.js +303 -332
  254. package/dist/runtime/locations/relocation-blob.js +18 -5
  255. package/dist/runtime/locations/resolvers.d.ts +5 -5
  256. package/dist/runtime/locations/resolvers.js +44 -30
  257. package/dist/runtime/locations/runtime.d.ts +5 -4
  258. package/dist/runtime/locations/runtime.js +123 -92
  259. package/dist/runtime/locations/spot-location-claims.d.ts +8 -2
  260. package/dist/runtime/locations/spot-location-claims.js +40 -23
  261. package/dist/runtime/messaging/payload-codec.js +26 -20
  262. package/dist/runtime/messaging/submission-result.d.ts +3 -0
  263. package/dist/runtime/messaging/submission-result.js +48 -0
  264. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +2 -0
  265. package/dist/runtime/protocol/service_wire_codec.generated.js +17 -8
  266. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +1 -0
  267. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +3 -2
  268. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +3 -3
  269. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +4 -4
  270. package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +6 -3
  271. package/dist/runtime/spots/index.d.ts +29 -29
  272. package/dist/runtime/spots/index.js +441 -313
  273. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -4
  274. package/dist/runtime/spots/spot-activation-registry.js +27 -60
  275. package/dist/runtime/spots/spot-activation-state.d.ts +2 -11
  276. package/dist/runtime/spots/spot-activation-state.js +4 -17
  277. package/dist/runtime/spots/spot-activation.d.ts +10 -9
  278. package/dist/runtime/spots/spot-activation.js +103 -81
  279. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
  280. package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
  281. package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
  282. package/dist/runtime/spots/spot-actor-join-dispatch.js +5 -55
  283. package/dist/runtime/spots/spot-actor-lifecycle-drain.js +2 -2
  284. package/dist/runtime/spots/spot-actor-membership.d.ts +7 -5
  285. package/dist/runtime/spots/spot-actor-membership.js +44 -53
  286. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
  287. package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
  288. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
  289. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
  290. package/dist/runtime/spots/spot-context.d.ts +2 -2
  291. package/dist/runtime/spots/spot-entry-activation.d.ts +3 -4
  292. package/dist/runtime/spots/spot-entry-activation.js +9 -21
  293. package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
  294. package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
  295. package/dist/runtime/spots/spot-manager-public.js +6 -5
  296. package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
  297. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +22 -21
  298. package/dist/runtime/spots/spot-node-runtime-manager.js +73 -82
  299. package/dist/runtime/spots/spot-outbound.d.ts +4 -3
  300. package/dist/runtime/spots/spot-outbound.js +10 -37
  301. package/dist/runtime/spots/spot-remote-codec.js +5 -3
  302. package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
  303. package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
  304. package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
  305. package/dist/runtime/spots/spot-route-replies.js +3 -1
  306. package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -2
  307. package/dist/runtime/spots/spot-routed-actor-admission.js +3 -2
  308. package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +2 -7
  309. package/dist/runtime/spots/spot-routed-frame-dispatch.js +1 -70
  310. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
  311. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
  312. package/dist/runtime/spots/spot-runtime-ports.d.ts +4 -20
  313. package/dist/runtime/spots/spot-serial-executor.d.ts +5 -0
  314. package/dist/runtime/spots/spot-serial-executor.js +9 -2
  315. package/dist/runtime/spots/spot-serial-turn-executor.d.ts +29 -6
  316. package/dist/runtime/spots/spot-serial-turn-executor.js +89 -13
  317. package/dist/runtime/spots/spot-timer.d.ts +3 -2
  318. package/dist/runtime/streams/actor-session-binding-registry.d.ts +17 -32
  319. package/dist/runtime/streams/actor-session-binding-registry.js +145 -367
  320. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +2 -6
  321. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
  322. package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
  323. package/dist/runtime/streams/bound-session-service.d.ts +7 -0
  324. package/dist/runtime/streams/bound-session-service.js +12 -19
  325. package/dist/runtime/streams/index.d.ts +15 -14
  326. package/dist/runtime/streams/index.js +38 -39
  327. package/dist/runtime/streams/managed-stream.d.ts +3 -0
  328. package/dist/runtime/streams/managed-stream.js +17 -8
  329. package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
  330. package/dist/runtime/streams/protocol.d.ts +6 -33
  331. package/dist/runtime/streams/protocol.js +38 -110
  332. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
  333. package/dist/runtime/streams/session-actor-coordinator.js +12 -4
  334. package/dist/runtime/streams/session-calls.d.ts +1 -1
  335. package/dist/runtime/streams/session-calls.js +5 -4
  336. package/dist/runtime/streams/session-context.d.ts +6 -6
  337. package/dist/runtime/streams/session-context.js +22 -4
  338. package/dist/runtime/streams/session-requests.js +2 -1
  339. package/dist/runtime/streams/session-serial-executor.js +2 -2
  340. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
  341. package/dist/runtime/streams/stream-frame-factory.js +2 -2
  342. package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
  343. package/dist/runtime/streams/stream-session-runtime.js +25 -33
  344. package/dist/runtime/workers/index.d.ts +2 -2
  345. package/dist/runtime/workers/index.js +5 -4
  346. package/package.json +3 -3
  347. package/src/contracts/Channels/IZLinkFanoutClient.ts +0 -7
  348. package/src/contracts/Common/CoreTypes.ts +7 -0
  349. package/src/contracts/Common/index.ts +1 -1
  350. package/src/contracts/Configuration/InternalDefaults.ts +12 -0
  351. package/src/contracts/Configuration/Registration.ts +92 -48
  352. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
  353. package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
  354. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  355. package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
  356. package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
  357. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
  358. package/src/contracts/Handlers/JsonContract.ts +14 -4
  359. package/src/contracts/Locations/Authority.ts +7 -3
  360. package/src/contracts/Locations/Options.ts +1 -1
  361. package/src/contracts/Locations/Stores.ts +14 -0
  362. package/src/contracts/RouteMesh/RuntimeTopology.ts +10 -0
  363. package/src/contracts/Spots/Contracts.ts +1 -1
  364. package/src/internal.ts +15 -0
  365. package/src/nest-integration.ts +28 -10
  366. package/src/runtime/abort.ts +6 -5
  367. package/src/runtime/activation-admission.ts +72 -0
  368. package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
  369. package/src/runtime/actors/actor-client.ts +77 -204
  370. package/src/runtime/actors/actor-context.ts +45 -39
  371. package/src/runtime/actors/actor-handoff.ts +55 -45
  372. package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
  373. package/src/runtime/actors/actor-local-native-join.ts +174 -215
  374. package/src/runtime/actors/actor-native-lookup.ts +2 -9
  375. package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
  376. package/src/runtime/actors/actor-remote-joiner.ts +15 -36
  377. package/src/runtime/actors/actor-remote-wire.ts +5 -3
  378. package/src/runtime/actors/actor-request-deadline.ts +49 -0
  379. package/src/runtime/actors/actor-retry-delay.ts +2 -1
  380. package/src/runtime/actors/actor-runtime-contracts.ts +4 -10
  381. package/src/runtime/actors/actor-runtime-state.ts +85 -247
  382. package/src/runtime/actors/actor-source-transfer.ts +5 -18
  383. package/src/runtime/actors/bound-session-wire.ts +2 -8
  384. package/src/runtime/actors/deferred-join-completion.ts +44 -0
  385. package/src/runtime/actors/index.ts +122 -88
  386. package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
  387. package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
  388. package/src/runtime/admission.ts +13 -2
  389. package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
  390. package/src/runtime/backend/contracts/index.ts +15 -42
  391. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -28
  392. package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
  393. package/src/runtime/backend/node/node-backend-adapter-factory.ts +5 -25
  394. package/src/runtime/backend/node/node-backend-adapter-support.ts +32 -35
  395. package/src/runtime/backend/node/node-event-loop-poller.ts +16 -8
  396. package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
  397. package/src/runtime/backend/node/node-raw-binding-port.ts +58 -23
  398. package/src/runtime/backend/node/node-raw-mesh-backend.ts +252 -162
  399. package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -4
  400. package/src/runtime/backend/raw-binding-port.ts +14 -1
  401. package/src/runtime/backend/runtime-values.ts +4 -1
  402. package/src/runtime/channels/channel-clients.ts +132 -96
  403. package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
  404. package/src/runtime/channels/channel-envelope.ts +58 -29
  405. package/src/runtime/channels/channel-outbound-operations.ts +10 -31
  406. package/src/runtime/channels/channel-receive-loops.ts +39 -7
  407. package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
  408. package/src/runtime/channels/channel-runtime-manager.ts +8 -15
  409. package/src/runtime/channels/channel-socket-options.ts +8 -2
  410. package/src/runtime/channels/channel-socket-registry.ts +369 -262
  411. package/src/runtime/channels/channel-transports.ts +161 -115
  412. package/src/runtime/channels/client-server-location-runtime.ts +17 -17
  413. package/src/runtime/channels/client-server-service-wire.ts +40 -12
  414. package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
  415. package/src/runtime/channels/fanout-location-runtime.ts +175 -106
  416. package/src/runtime/channels/spot-direct-envelope.ts +1 -1
  417. package/src/runtime/channels/spot-node-route-transport.ts +5 -2
  418. package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
  419. package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
  420. package/src/runtime/diagnostics/flow-context.ts +16 -2
  421. package/src/runtime/diagnostics/index.ts +27 -17
  422. package/src/runtime/diagnostics/message-flow.ts +15 -25
  423. package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
  424. package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
  425. package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
  426. package/src/runtime/disposal.ts +19 -0
  427. package/src/runtime/execution/index.ts +116 -38
  428. package/src/runtime/execution/serial-execution-queue.ts +179 -34
  429. package/src/runtime/execution/state-lane.ts +142 -4
  430. package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
  431. package/src/runtime/foundation/event-loop-resources.ts +5 -122
  432. package/src/runtime/foundation/listener-records.ts +21 -0
  433. package/src/runtime/foundation/operation-identity.ts +11 -5
  434. package/src/runtime/foundation/operation-registry.ts +33 -50
  435. package/src/runtime/foundation/raw-service-mesh-runtime.ts +170 -571
  436. package/src/runtime/foundation/runtime-state-projections.ts +9 -1
  437. package/src/runtime/foundation/service-authority-payload-codec.ts +41 -13
  438. package/src/runtime/foundation/service-discovery-registry.ts +32 -3
  439. package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
  440. package/src/runtime/foundation/service-liveness-registry.ts +2 -1
  441. package/src/runtime/foundation/service-maintenance-runtime.ts +30 -19
  442. package/src/runtime/foundation/service-metadata-codec.ts +2 -2
  443. package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
  444. package/src/runtime/foundation/service-relocation-coordinator.ts +13 -0
  445. package/src/runtime/foundation/service-relocation-object-owner.ts +23 -7
  446. package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
  447. package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
  448. package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -25
  449. package/src/runtime/foundation/service-stateful-registry.ts +14 -2
  450. package/src/runtime/foundation/service-stateful-runtime.ts +435 -327
  451. package/src/runtime/foundation/service-stateful-wire-codec.ts +329 -199
  452. package/src/runtime/foundation/service-topology-registry.ts +30 -79
  453. package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
  454. package/src/runtime/foundation/service-wire-codec.ts +15 -8
  455. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  456. package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
  457. package/src/runtime/framework-errors-internal.ts +380 -134
  458. package/src/runtime/handlers/handler-instance-scope.ts +68 -95
  459. package/src/runtime/host/actor-packet-relay.ts +57 -147
  460. package/src/runtime/host/actor-placement-coordinator.ts +8 -5
  461. package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
  462. package/src/runtime/host/actor-transfer-runtime.ts +266 -418
  463. package/src/runtime/host/application-job-queue.ts +28 -34
  464. package/src/runtime/host/bound-session-relay.ts +1 -2
  465. package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
  466. package/src/runtime/host/index.ts +408 -312
  467. package/src/runtime/host/instance-activation-authority.ts +89 -109
  468. package/src/runtime/host/location-runtime-owner.ts +4 -2
  469. package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
  470. package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
  471. package/src/runtime/host/remote-bound-session-relay.ts +12 -44
  472. package/src/runtime/host/route-mesh-runtime.ts +236 -275
  473. package/src/runtime/host/runtime-shutdown.ts +17 -21
  474. package/src/runtime/host/service-relocation-control.ts +14 -1
  475. package/src/runtime/host/service-relocation-host-runtime.ts +1161 -904
  476. package/src/runtime/host/spot-address-transport.ts +73 -195
  477. package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
  478. package/src/runtime/host/spot-runtime-options-factory.ts +92 -30
  479. package/src/runtime/host/stateful-authority-route-runtime.ts +8 -4
  480. package/src/runtime/host/user-spot-creation-coordinator.ts +182 -163
  481. package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
  482. package/src/runtime/locations/authority-key-codec.ts +7 -3
  483. package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
  484. package/src/runtime/locations/creation-operation-id.ts +6 -3
  485. package/src/runtime/locations/domain-store-contract.ts +12 -3
  486. package/src/runtime/locations/in-memory-authority-store.ts +44 -15
  487. package/src/runtime/locations/in-memory-location-store.ts +50 -39
  488. package/src/runtime/locations/in-memory-provider-location-store.ts +110 -31
  489. package/src/runtime/locations/key-codec.ts +3 -2
  490. package/src/runtime/locations/lease-tracker.ts +8 -14
  491. package/src/runtime/locations/lifecycle.ts +16 -45
  492. package/src/runtime/locations/location-store-failure.ts +4 -0
  493. package/src/runtime/locations/location-store-pages.ts +18 -0
  494. package/src/runtime/locations/location-store-repository.ts +450 -478
  495. package/src/runtime/locations/relocation-blob.ts +17 -6
  496. package/src/runtime/locations/resolvers.ts +90 -58
  497. package/src/runtime/locations/runtime.ts +220 -110
  498. package/src/runtime/locations/spot-location-claims.ts +54 -26
  499. package/src/runtime/messaging/payload-codec.ts +35 -24
  500. package/src/runtime/messaging/submission-result.ts +57 -1
  501. package/src/runtime/protocol/service_wire_codec.generated.ts +27 -10
  502. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +4 -4
  503. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +6 -6
  504. package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +6 -3
  505. package/src/runtime/spots/index.ts +687 -437
  506. package/src/runtime/spots/spot-activation-registry.ts +42 -71
  507. package/src/runtime/spots/spot-activation-state.ts +4 -16
  508. package/src/runtime/spots/spot-activation.ts +167 -115
  509. package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
  510. package/src/runtime/spots/spot-actor-join-dispatch.ts +25 -79
  511. package/src/runtime/spots/spot-actor-lifecycle-drain.ts +20 -18
  512. package/src/runtime/spots/spot-actor-membership.ts +107 -75
  513. package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
  514. package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
  515. package/src/runtime/spots/spot-context.ts +3 -3
  516. package/src/runtime/spots/spot-entry-activation.ts +13 -33
  517. package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
  518. package/src/runtime/spots/spot-manager-public.ts +29 -21
  519. package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
  520. package/src/runtime/spots/spot-node-runtime-manager.ts +145 -140
  521. package/src/runtime/spots/spot-outbound.ts +47 -68
  522. package/src/runtime/spots/spot-remote-codec.ts +7 -3
  523. package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
  524. package/src/runtime/spots/spot-route-replies.ts +6 -4
  525. package/src/runtime/spots/spot-routed-actor-admission.ts +13 -6
  526. package/src/runtime/spots/spot-routed-frame-dispatch.ts +6 -77
  527. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
  528. package/src/runtime/spots/spot-runtime-ports.ts +10 -43
  529. package/src/runtime/spots/spot-serial-executor.ts +10 -2
  530. package/src/runtime/spots/spot-serial-turn-executor.ts +120 -13
  531. package/src/runtime/spots/spot-timer.ts +3 -2
  532. package/src/runtime/streams/actor-session-binding-registry.ts +182 -560
  533. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +1 -19
  534. package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
  535. package/src/runtime/streams/bound-session-service.ts +23 -37
  536. package/src/runtime/streams/index.ts +102 -88
  537. package/src/runtime/streams/managed-stream.ts +29 -10
  538. package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
  539. package/src/runtime/streams/protocol.ts +34 -88
  540. package/src/runtime/streams/session-actor-coordinator.ts +17 -5
  541. package/src/runtime/streams/session-calls.ts +6 -5
  542. package/src/runtime/streams/session-context.ts +54 -10
  543. package/src/runtime/streams/session-requests.ts +2 -1
  544. package/src/runtime/streams/session-serial-executor.ts +2 -2
  545. package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
  546. package/src/runtime/streams/stream-frame-factory.ts +2 -3
  547. package/src/runtime/streams/stream-session-runtime.ts +57 -59
  548. package/src/runtime/workers/index.ts +13 -12
  549. package/dist/runtime/actors/deferred-join-accepted-journal.d.ts +0 -47
  550. package/dist/runtime/actors/deferred-join-accepted-journal.js +0 -992
  551. package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
  552. package/dist/runtime/actors/post-commit-actor-location.js +0 -72
  553. package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
  554. package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
  555. package/src/runtime/actors/deferred-join-accepted-journal.ts +0 -1346
  556. package/src/runtime/actors/post-commit-actor-location.ts +0 -121
  557. package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
@@ -1,19 +1,21 @@
1
+ import { AsyncResource } from 'node:async_hooks';
2
+ import {
3
+ ZLinkFrameworkErrorKind,
4
+ ZLinkFrameworkException
5
+ } from '../../contracts/Errors/ZLinkFrameworkException';
6
+ import { zlinkDefaultLocationOptions } from '../../contracts/Locations/Options';
7
+ import { createAbortError, throwIfAborted } from '../abort';
8
+ import { ZLinkStateLane } from '../execution/state-lane';
1
9
  import {
2
10
  ZLinkFrameworkInternalErrorKind,
3
11
  createInternalFrameworkException
4
12
  } from '../framework-errors-internal';
5
- import { createAbortError, throwIfAborted } from '../abort';
6
- import { AsyncResource } from 'node:async_hooks';
7
- import { ZLinkStateLane } from '../execution/state-lane';
8
- import { routingIdsEqual } from '../routing-id';
9
- import type {
10
- ServiceSessionBindingAdmissionClaim,
11
- ServiceSessionBindingAdmissionResult
12
- } from '../foundation/service-session-binding-ingress-port';
13
+ export const DEFAULT_TERMINAL_RELOCATION_CAPACITY = 4096;
13
14
 
14
15
  const detachedStateLaneResource = new AsyncResource('zlink:actor-session-binding-registry');
15
16
  export interface ZLinkActorSessionBindingActor {
16
17
  readonly actorId: string;
18
+ readonly ref: { readonly actorId: string; readonly bindingGeneration?: bigint };
17
19
  }
18
20
 
19
21
  export interface ZLinkActorSessionBindingContext<TActor extends ZLinkActorSessionBindingActor> {
@@ -50,20 +52,6 @@ export interface ZLinkActorSessionRelocationClaim {
50
52
  readonly sealId: string;
51
53
  }
52
54
 
53
- export interface ZLinkActorSessionRetainedOutbound {
54
- deliver(): Promise<boolean>;
55
- fail(error: unknown): void;
56
- }
57
-
58
- export interface ZLinkActorSessionAcceptedProducerProof {
59
- readonly actorId: string;
60
- readonly objectGeneration: bigint;
61
- readonly actorNodeRid: string;
62
- readonly actorNodeGeneration: bigint;
63
- readonly sessionIdentity: string;
64
- readonly bindingGeneration: bigint;
65
- }
66
-
67
55
  export interface ZLinkActorSessionRelocationSnapshot extends ZLinkActorSessionRelocationClaim {
68
56
  readonly phase: 'sealed' | 'applying' | 'applied' | 'terminal';
69
57
  readonly applyFingerprint?: string;
@@ -107,30 +95,21 @@ interface ZLinkActorSessionRelocationState {
107
95
  phase: 'sealed' | 'applying' | 'applied' | 'terminal';
108
96
  applyFingerprint?: string;
109
97
  applyPromise?: Promise<void>;
110
- acceptedProducerProof?: ZLinkActorSessionAcceptedProducerProof;
111
98
  readonly ready: Promise<void>;
112
99
  readonly terminal: Promise<void>;
113
100
  readonly resolveTerminal: () => void;
114
101
  }
115
102
 
116
- interface ZLinkActorSessionOutboundEntry {
117
- readonly sealId?: string;
118
- readonly operation: ZLinkActorSessionRetainedOutbound;
119
- readonly arrivalOrder: bigint;
120
- readonly claim?: ServiceSessionBindingAdmissionClaim;
121
- readonly authorization: 'legacy' | 'source' | 'pendingTarget';
122
- released: boolean;
123
- settled: boolean;
124
- }
125
-
126
103
  interface ZLinkActorSessionRelocationQueue {
127
104
  readonly actorId: string;
128
105
  activeSealId?: string;
129
106
  readonly seals: Map<string, ZLinkActorSessionRelocationState>;
130
- readonly outbound: ZLinkActorSessionOutboundEntry[];
131
- nextArrivalOrder: bigint;
132
- outboundCount: number;
133
- drainPromise?: Promise<void>;
107
+ readonly ingress: Array<{
108
+ sealId?: string;
109
+ readonly deliver: () => Promise<void>;
110
+ readonly drop: (reason: 'stale_target' | 'target_closed' | 'shutdown', error?: unknown) => void;
111
+ }>;
112
+ ingressDrain?: Promise<void>;
134
113
  }
135
114
 
136
115
  export interface ZLinkActorSessionAuthorityFence {
@@ -167,24 +146,20 @@ export class ZLinkActorSessionBindingRegistry<
167
146
  private readonly terminalRelocations = new Map<ZLinkActorSessionRelocationState, true>();
168
147
 
169
148
  constructor(
170
- private readonly terminalRelocationCapacity = 4096,
171
- private readonly outboundCapacity = 4096,
149
+ private readonly terminalRelocationCapacity: number = DEFAULT_TERMINAL_RELOCATION_CAPACITY,
172
150
  // Spec 06 — SessionRelocationSealTimeout bounds how long a session
173
151
  // relocation seal may hold ingress (default 3,000 ms, finite only).
174
152
  // Every wait on the seal (accept paths) and on active-frame drain
175
153
  // (the sealing side) must observe that bound; an unbounded wait here
176
154
  // turns a lost control or a lifecycle interlock into a silent stall
177
155
  // (spec 48:205 — transport/deadline limits apply during relocation).
178
- private readonly sealWaitTimeoutMs = 3_000,
156
+ private readonly sealWaitTimeoutMs: number = zlinkDefaultLocationOptions.sessionRelocationSealTimeoutMs,
179
157
  private readonly errorSink?: () =>
180
158
  { reportRuntimeTaskException(taskName: string, error: unknown): void } | undefined
181
159
  ) {
182
160
  if (!Number.isSafeInteger(terminalRelocationCapacity) || terminalRelocationCapacity <= 0) {
183
161
  throw new RangeError('Session relocation terminal capacity must be a positive safe integer.');
184
162
  }
185
- if (!Number.isSafeInteger(outboundCapacity) || outboundCapacity <= 0) {
186
- throw new RangeError('Session relocation outbound capacity must be a positive safe integer.');
187
- }
188
163
  if (!Number.isSafeInteger(sealWaitTimeoutMs) || sealWaitTimeoutMs <= 0) {
189
164
  throw new RangeError('Session relocation seal timeout must be a positive safe integer.');
190
165
  }
@@ -211,7 +186,7 @@ export class ZLinkActorSessionBindingRegistry<
211
186
  );
212
187
  }
213
188
 
214
- private async commitCore(
189
+ private commitCore(
215
190
  previous: ZLinkActorSessionRoute<TContext, TActor> | undefined,
216
191
  context: TContext,
217
192
  actor: TActor,
@@ -219,7 +194,7 @@ export class ZLinkActorSessionBindingRegistry<
219
194
  authorityFence?: ZLinkActorSessionAuthorityFence,
220
195
  sessionIdentity?: string,
221
196
  commitActor?: () => void
222
- ): Promise<void> {
197
+ ): void {
223
198
  const current = this.routes.get(actor.actorId);
224
199
  if (current !== previous) {
225
200
  throw createInternalFrameworkException(
@@ -255,7 +230,24 @@ export class ZLinkActorSessionBindingRegistry<
255
230
  }
256
231
 
257
232
  if (!sameBinding && actorSlot !== undefined) {
258
- await context.actorSlotControls!.enqueueBound(actorSlot, actor.actorId);
233
+ // Session–Actor binding §5-2: `$zlink.actor.bound` enters the ordered
234
+ // STREAM queue before the slot is published; transport completion is
235
+ // not awaited inside the state lane (execution gate).
236
+ void context
237
+ .actorSlotControls!.enqueueBound(actorSlot, actor.actorId)
238
+ .catch(async (error) => {
239
+ this.errorSink?.()?.reportRuntimeTaskException('session actor bound', error);
240
+ // The client never learned the slot, so the binding ends through
241
+ // the one unbind path; no `$zlink.actor.unbound` follows.
242
+ await this.unbind(
243
+ actor.actorId,
244
+ context,
245
+ bindingToken,
246
+ ZLinkActorSessionBindingTermination.PhysicalDisconnect
247
+ ).catch((unbindError) =>
248
+ this.errorSink?.()?.reportRuntimeTaskException('session actor bound', unbindError)
249
+ );
250
+ });
259
251
  }
260
252
  } catch (error) {
261
253
  context.unbindLocal(actor.actorId, bindingToken);
@@ -333,7 +325,7 @@ export class ZLinkActorSessionBindingRegistry<
333
325
  );
334
326
  }
335
327
 
336
- private async replaceAndReleaseSealCore(
328
+ private replaceAndReleaseSealCore(
337
329
  previous: ZLinkActorSessionRoute<TContext, TActor>,
338
330
  context: TContext,
339
331
  actor: TActor,
@@ -342,7 +334,7 @@ export class ZLinkActorSessionBindingRegistry<
342
334
  authorityFence?: ZLinkActorSessionAuthorityFence,
343
335
  sessionIdentity?: string,
344
336
  commitActor?: () => void
345
- ): Promise<void> {
337
+ ): void {
346
338
  if (previous.sealId !== sealId) {
347
339
  throw createInternalFrameworkException(
348
340
  ZLinkFrameworkInternalErrorKind.ActorLocationStale,
@@ -353,7 +345,7 @@ export class ZLinkActorSessionBindingRegistry<
353
345
  // JavaScript cannot interleave another ingress turn between these two
354
346
  // synchronous mutations. The replacement preserves the seal, then the
355
347
  // exact release publishes the route to held ingress as one owner turn.
356
- await this.commitCore(
348
+ this.commitCore(
357
349
  previous,
358
350
  context,
359
351
  actor,
@@ -383,6 +375,22 @@ export class ZLinkActorSessionBindingRegistry<
383
375
  return await this.lane.run(() => this.routeCore(actorId));
384
376
  }
385
377
 
378
+ /** Selects the route only when it is the exact Session binding (§8.1 validation values). */
379
+ async routeForSessionBinding(
380
+ actorId: string,
381
+ sessionRid: string,
382
+ bindingGeneration?: bigint
383
+ ): Promise<ZLinkActorSessionRoute<TContext, TActor> | undefined> {
384
+ return await this.lane.run(() => {
385
+ const route = this.routeCore(actorId);
386
+ const generation = route?.actor.ref.bindingGeneration;
387
+ return route?.sessionIdentity === sessionRid &&
388
+ (bindingGeneration === undefined || generation === bindingGeneration)
389
+ ? route
390
+ : undefined;
391
+ });
392
+ }
393
+
386
394
  private routeCore(actorId: string): ZLinkActorSessionRoute<TContext, TActor> | undefined {
387
395
  return this.routes.get(actorId);
388
396
  }
@@ -415,15 +423,19 @@ export class ZLinkActorSessionBindingRegistry<
415
423
  bindingToken: string,
416
424
  termination = ZLinkActorSessionBindingTermination.BindingEnd
417
425
  ): Promise<void> {
418
- await this.lane.run(() => this.unbindCore(actorId, context, bindingToken, termination));
426
+ const { submission } = await this.lane.run(() => ({
427
+ submission: this.unbindCore(actorId, context, bindingToken, termination)
428
+ }));
429
+ await submission;
419
430
  }
420
431
 
421
- private async unbindCore(
432
+ /** Fixes the unbind order in the lane; the caller awaits transport completion outside it. */
433
+ private unbindCore(
422
434
  actorId: string,
423
435
  context: TContext,
424
436
  bindingToken: string,
425
437
  termination: ZLinkActorSessionBindingTermination
426
- ): Promise<void> {
438
+ ): Promise<void> | undefined {
427
439
  const route = this.routes.get(actorId);
428
440
  if (route === undefined || route.context !== context || route.bindingToken !== bindingToken) {
429
441
  return;
@@ -438,29 +450,29 @@ export class ZLinkActorSessionBindingRegistry<
438
450
  actorId,
439
451
  new Error(`Actor '${actorId}' session binding was removed while accepted frames were active.`)
440
452
  );
441
- this.clearRouteRelocation(
442
- actorId,
443
- route,
444
- new Error(`Actor '${actorId}' session binding was removed.`)
445
- );
453
+ this.clearRouteRelocation(actorId, route);
446
454
  if (
447
455
  termination === ZLinkActorSessionBindingTermination.BindingEnd &&
448
456
  route.actorSlot !== undefined
449
457
  ) {
450
- await context.actorSlotControls?.enqueueUnbound(route.actorSlot);
458
+ return context.actorSlotControls?.enqueueUnbound(route.actorSlot);
451
459
  }
460
+ return undefined;
452
461
  }
453
462
 
454
463
  async unbindActor(actorId: string): Promise<void> {
455
- await this.lane.run(() => this.unbindActorCore(actorId));
464
+ const { submission } = await this.lane.run(() => ({
465
+ submission: this.unbindActorCore(actorId)
466
+ }));
467
+ await submission;
456
468
  }
457
469
 
458
- private async unbindActorCore(actorId: string): Promise<void> {
470
+ private unbindActorCore(actorId: string): Promise<void> | undefined {
459
471
  const route = this.routes.get(actorId);
460
472
  if (route === undefined) {
461
- return;
473
+ return undefined;
462
474
  }
463
- await this.unbindCore(
475
+ return this.unbindCore(
464
476
  actorId,
465
477
  route.context,
466
478
  route.bindingToken,
@@ -472,10 +484,10 @@ export class ZLinkActorSessionBindingRegistry<
472
484
  await this.lane.run(() => this.cleanupCore(context));
473
485
  }
474
486
 
475
- private async cleanupCore(context: TContext): Promise<void> {
487
+ private cleanupCore(context: TContext): void {
476
488
  for (const route of [...this.routes.values()]) {
477
489
  if (route.context === context) {
478
- await this.unbindCore(
490
+ this.unbindCore(
479
491
  route.actor.actorId,
480
492
  context,
481
493
  route.bindingToken,
@@ -539,6 +551,37 @@ export class ZLinkActorSessionBindingRegistry<
539
551
  }
540
552
  }
541
553
 
554
+ async acceptOneWay(
555
+ actorId: string,
556
+ bindingToken: string,
557
+ prepare: () => {
558
+ readonly deliver: () => Promise<void>;
559
+ readonly drop: (
560
+ reason: 'stale_target' | 'target_closed' | 'shutdown',
561
+ error?: unknown
562
+ ) => void;
563
+ }
564
+ ): Promise<boolean> {
565
+ return await this.lane.run(() => {
566
+ const route = this.requireRouteCore(actorId);
567
+ this.requireCurrentTokenCore(actorId, bindingToken);
568
+ const queue = this.relocations.get(actorId);
569
+ if (
570
+ queue === undefined ||
571
+ (route.sealId === undefined &&
572
+ queue.ingress.length === 0 &&
573
+ queue.ingressDrain === undefined)
574
+ )
575
+ return false;
576
+ queue.ingress.push({
577
+ ...prepare(),
578
+ sealId: route.sealId
579
+ });
580
+ if (route.sealId === undefined) this.startHeldOneWayDrain(actorId, queue);
581
+ return true;
582
+ });
583
+ }
584
+
542
585
  /**
543
586
  * Holds Session ingress accepted after a relocation seal until the target
544
587
  * route is published and the seal is released. The caller keeps the
@@ -714,6 +757,9 @@ export class ZLinkActorSessionBindingRegistry<
714
757
  );
715
758
  }
716
759
  route.sealId = sealId;
760
+ if (!this.relocations.has(actorId)) {
761
+ this.relocations.set(actorId, { actorId, seals: new Map(), ingress: [] });
762
+ }
717
763
  // A pre-seal REQUEST is captured as part of installing command 42. Its
718
764
  // Session frame no longer gates the seal; its single submission attempt
719
765
  // and terminal continue under the request admission state above.
@@ -786,13 +832,7 @@ export class ZLinkActorSessionBindingRegistry<
786
832
  resolveTerminal = resolve;
787
833
  });
788
834
  const ready = this.waitForActiveFramesCore(claim.actorId, signal);
789
- const actorQueue: ZLinkActorSessionRelocationQueue = queue ?? {
790
- actorId: claim.actorId,
791
- seals: new Map(),
792
- outbound: [],
793
- nextArrivalOrder: 1n,
794
- outboundCount: 0
795
- };
835
+ const actorQueue = this.relocations.get(claim.actorId)!;
796
836
  const state: ZLinkActorSessionRelocationState = {
797
837
  ...claim,
798
838
  phase: 'sealed',
@@ -820,154 +860,14 @@ export class ZLinkActorSessionBindingRegistry<
820
860
  return this.relocations.get(actorId)?.seals.get(sealId);
821
861
  }
822
862
 
823
- async retainRelocationOutbound(
824
- actorId: string,
825
- operation: ZLinkActorSessionRetainedOutbound,
826
- sealId?: string
827
- ): Promise<ServiceSessionBindingAdmissionResult> {
828
- return await this.lane.run(() =>
829
- this.retainRelocationOutboundCorePublic(actorId, operation, sealId)
830
- );
831
- }
832
-
833
- private retainRelocationOutboundCorePublic(
834
- actorId: string,
835
- operation: ZLinkActorSessionRetainedOutbound,
836
- sealId?: string
837
- ): ServiceSessionBindingAdmissionResult {
838
- if (sealId !== undefined) {
839
- const queue = this.relocations.get(actorId);
840
- const state = queue?.seals.get(sealId);
841
- if (
842
- queue === undefined ||
843
- state === undefined ||
844
- (queue.activeSealId !== sealId &&
845
- !(queue.activeSealId === undefined && state.phase === 'terminal'))
846
- ) {
847
- failRetainedOutbound(
848
- operation,
849
- new Error(`Actor '${actorId}' Session outbound did not match its exact relocation seal.`)
850
- );
851
- return 'rejected';
852
- }
853
- }
854
- return this.retainRelocationOutboundCore(actorId, operation, 'legacy');
855
- }
856
-
857
- async admitRelocationOutbound(
858
- claim: ServiceSessionBindingAdmissionClaim,
859
- operation: ZLinkActorSessionRetainedOutbound
860
- ): Promise<ServiceSessionBindingAdmissionResult> {
861
- return await this.lane.run(() => this.admitRelocationOutboundCore(claim, operation));
862
- }
863
-
864
- private admitRelocationOutboundCore(
865
- claim: ServiceSessionBindingAdmissionClaim,
866
- operation: ZLinkActorSessionRetainedOutbound
867
- ): ServiceSessionBindingAdmissionResult {
868
- const queue = this.relocations.get(claim.actorId);
869
- const state =
870
- queue?.activeSealId === undefined ? undefined : queue.seals.get(queue.activeSealId);
871
- const error = this.outboundAdmissionError(claim);
872
- if (error !== undefined) {
873
- failRetainedOutbound(operation, error);
874
- return 'rejected';
875
- }
876
- if (queue === undefined || state === undefined) {
877
- if (!this.matchesCurrentProducerNode(claim)) {
878
- failRetainedOutbound(
879
- operation,
880
- new Error(
881
- `Actor '${claim.actorId}' Session outbound admission was fenced by its current binding.`
882
- )
883
- );
884
- return 'rejected';
885
- }
886
- if (queue === undefined) return 'passThrough';
887
- return this.retainRelocationOutboundCore(claim.actorId, operation, 'source', claim);
888
- }
889
- if (state.phase === 'sealed' || state.phase === 'applying') {
890
- const matchesSource = matchesRelocationSourceProof(state, claim);
891
- const matchesCurrent = this.matchesCurrentProducerNode(claim);
892
- const authorization = matchesSource || matchesCurrent ? 'source' : 'pendingTarget';
893
- return this.retainRelocationOutboundCore(claim.actorId, operation, authorization, claim);
894
- }
895
- const acceptedProof = state.acceptedProducerProof;
896
- if (acceptedProof === undefined || !matchesAcceptedProducerProof(acceptedProof, claim)) {
897
- failRetainedOutbound(
898
- operation,
899
- new Error(
900
- `Actor '${claim.actorId}' Session outbound admission did not match its accepted producer proof.`
901
- )
902
- );
903
- return 'rejected';
904
- }
905
- return this.retainRelocationOutboundCore(claim.actorId, operation, 'source', claim);
906
- }
907
-
908
- private retainRelocationOutboundCore(
909
- actorId: string,
910
- operation: ZLinkActorSessionRetainedOutbound,
911
- authorization: ZLinkActorSessionOutboundEntry['authorization'],
912
- claim?: ServiceSessionBindingAdmissionClaim
913
- ): ServiceSessionBindingAdmissionResult {
914
- const queue = this.relocations.get(actorId);
915
- const state =
916
- queue?.activeSealId === undefined ? undefined : queue.seals.get(queue.activeSealId);
917
- if (queue === undefined) return 'passThrough';
918
- if (state === undefined || state.phase === 'applied' || state.phase === 'terminal') {
919
- if (queue.drainPromise === undefined && queue.outbound.length === 0) return 'passThrough';
920
- if (!this.reserveOutbound(queue, operation)) return 'rejected';
921
- queue.outbound.push({
922
- operation,
923
- authorization,
924
- arrivalOrder: queue.nextArrivalOrder++,
925
- ...(claim === undefined ? {} : { claim }),
926
- released: true,
927
- settled: false
928
- });
929
- this.startOutboundDrain(queue);
930
- return 'retained';
931
- }
932
- if (!this.reserveOutbound(queue, operation)) return 'rejected';
933
- queue.outbound.push({
934
- sealId: state.sealId,
935
- operation,
936
- authorization,
937
- arrivalOrder: queue.nextArrivalOrder++,
938
- ...(claim === undefined ? {} : { claim }),
939
- released: false,
940
- settled: false
941
- });
942
- return 'retained';
943
- }
944
-
945
- async discardRelocationOutbound(actorId: string, sealId: string, error: unknown): Promise<void> {
946
- await this.lane.run(() => this.discardRelocationOutboundCore(actorId, sealId, error));
947
- }
948
-
949
- private discardRelocationOutboundCore(actorId: string, sealId: string, error: unknown): void {
950
- const queue = this.relocations.get(actorId);
951
- if (queue === undefined) return;
952
- for (let index = queue.outbound.length - 1; index >= 0; index--) {
953
- const entry = queue.outbound[index]!;
954
- if (entry.sealId !== sealId) continue;
955
- queue.outbound.splice(index, 1);
956
- this.failOutbound(queue, entry, error);
957
- }
958
- this.deleteEmptyRelocationQueue(queue);
959
- }
960
-
961
863
  async applyRelocation(
962
864
  actorId: string,
963
865
  sealId: string,
964
866
  applyFingerprint: string,
965
- action: 'commit' | 'abort',
966
- commitOwnerTransition: () => Promise<void>,
967
- acceptedProducerProof?: ZLinkActorSessionAcceptedProducerProof
867
+ commitOwnerTransition: () => Promise<void>
968
868
  ): Promise<void> {
969
869
  const prepared = await this.lane.run(() =>
970
- this.prepareRelocationApply(actorId, sealId, applyFingerprint, action, acceptedProducerProof)
870
+ this.prepareRelocationApply(actorId, sealId, applyFingerprint)
971
871
  );
972
872
  if (prepared.applyPromise !== undefined) {
973
873
  await prepared.applyPromise;
@@ -991,20 +891,13 @@ export class ZLinkActorSessionBindingRegistry<
991
891
  private prepareRelocationApply(
992
892
  actorId: string,
993
893
  sealId: string,
994
- applyFingerprint: string,
995
- action: 'commit' | 'abort',
996
- acceptedProducerProof?: ZLinkActorSessionAcceptedProducerProof
894
+ applyFingerprint: string
997
895
  ): {
998
- readonly queue: ZLinkActorSessionRelocationQueue;
999
896
  readonly state: ZLinkActorSessionRelocationState;
1000
897
  readonly applyPromise?: Promise<void>;
1001
- readonly action?: 'commit' | 'abort';
1002
- readonly acceptedProducerProof?: ZLinkActorSessionAcceptedProducerProof;
1003
898
  readonly promise?: Promise<void>;
1004
899
  readonly resolve?: () => void;
1005
900
  readonly reject?: (error: unknown) => void;
1006
- readonly actorId?: string;
1007
- readonly sealId?: string;
1008
901
  } {
1009
902
  const queue = this.relocations.get(actorId);
1010
903
  const state = queue?.seals.get(sealId);
@@ -1023,25 +916,7 @@ export class ZLinkActorSessionBindingRegistry<
1023
916
  true
1024
917
  );
1025
918
  }
1026
- return { queue, state, applyPromise: state.applyPromise };
1027
- }
1028
- if (
1029
- action === 'commit' &&
1030
- acceptedProducerProof !== undefined &&
1031
- !validAcceptedTargetProof(state, acceptedProducerProof)
1032
- ) {
1033
- throw createInternalFrameworkException(
1034
- ZLinkFrameworkInternalErrorKind.ActorLocationStale,
1035
- `Actor '${actorId}' command 44 target producer proof did not match its Session seal.`,
1036
- true
1037
- );
1038
- }
1039
- if (action === 'abort' && acceptedProducerProof !== undefined) {
1040
- throw createInternalFrameworkException(
1041
- ZLinkFrameworkInternalErrorKind.ActorLocationStale,
1042
- `Actor '${actorId}' abort route supplied a target producer proof.`,
1043
- true
1044
- );
919
+ return { state, applyPromise: state.applyPromise };
1045
920
  }
1046
921
 
1047
922
  state.phase = 'applying';
@@ -1054,57 +929,17 @@ export class ZLinkActorSessionBindingRegistry<
1054
929
  });
1055
930
  state.applyPromise = promise;
1056
931
  return {
1057
- queue,
1058
932
  state,
1059
- action,
1060
- acceptedProducerProof,
1061
933
  promise,
1062
934
  resolve,
1063
- reject,
1064
- actorId,
1065
- sealId
935
+ reject
1066
936
  };
1067
937
  }
1068
938
 
1069
939
  private completeRelocationApply(prepared: {
1070
- readonly queue: ZLinkActorSessionRelocationQueue;
1071
940
  readonly state: ZLinkActorSessionRelocationState;
1072
- readonly action?: 'commit' | 'abort';
1073
- readonly acceptedProducerProof?: ZLinkActorSessionAcceptedProducerProof;
1074
- readonly actorId?: string;
1075
- readonly sealId?: string;
1076
941
  }): void {
1077
- const { queue, state, action, acceptedProducerProof, actorId, sealId } = prepared;
1078
- const proof =
1079
- action === 'commit'
1080
- ? (acceptedProducerProof ?? this.currentProducerProof(actorId!))
1081
- : relocationSourceProof(state);
1082
- state.acceptedProducerProof = proof;
1083
- for (let index = queue.outbound.length - 1; index >= 0; index--) {
1084
- const entry = queue.outbound[index]!;
1085
- if (entry.sealId !== sealId) continue;
1086
- if (entry.authorization !== 'pendingTarget') {
1087
- entry.released = true;
1088
- continue;
1089
- }
1090
- if (
1091
- action === 'commit' &&
1092
- proof !== undefined &&
1093
- entry.claim !== undefined &&
1094
- matchesAcceptedProducerProof(proof, entry.claim)
1095
- ) {
1096
- entry.released = true;
1097
- continue;
1098
- }
1099
- queue.outbound.splice(index, 1);
1100
- this.failOutbound(
1101
- queue,
1102
- entry,
1103
- new Error(`Actor '${actorId}' pending Session producer did not match command 44 proof.`)
1104
- );
1105
- }
1106
- this.startOutboundDrain(queue);
1107
- state.phase = 'applied';
942
+ prepared.state.phase = 'applied';
1108
943
  }
1109
944
 
1110
945
  private failRelocationApply(prepared: {
@@ -1113,49 +948,6 @@ export class ZLinkActorSessionBindingRegistry<
1113
948
  prepared.state.phase = 'sealed';
1114
949
  prepared.state.applyFingerprint = undefined;
1115
950
  prepared.state.applyPromise = undefined;
1116
- prepared.state.acceptedProducerProof = undefined;
1117
- }
1118
-
1119
- private currentProducerProof(
1120
- actorId: string
1121
- ): ZLinkActorSessionAcceptedProducerProof | undefined {
1122
- const route = this.routes.get(actorId);
1123
- const actorRef = (
1124
- route?.actor as TActor & {
1125
- readonly ref?: {
1126
- readonly actorId?: unknown;
1127
- readonly objectGeneration?: unknown;
1128
- readonly generation?: unknown;
1129
- readonly nodeRid?: unknown;
1130
- readonly ownerNodeGeneration?: unknown;
1131
- readonly bindingGeneration?: unknown;
1132
- };
1133
- }
1134
- ).ref;
1135
- const sessionIdentity = route?.sessionIdentity;
1136
- if (
1137
- route === undefined ||
1138
- actorRef === undefined ||
1139
- sessionIdentity === undefined ||
1140
- actorRef.ownerNodeGeneration === undefined
1141
- )
1142
- return undefined;
1143
- return {
1144
- actorId,
1145
- objectGeneration: BigInt(
1146
- (actorRef.objectGeneration as bigint | number | string | boolean | undefined) ??
1147
- (actorRef.generation as bigint | number | string | boolean | undefined) ??
1148
- -1
1149
- ),
1150
- actorNodeRid: String(actorRef.nodeRid ?? ''),
1151
- actorNodeGeneration: BigInt(
1152
- actorRef.ownerNodeGeneration as bigint | number | string | boolean
1153
- ),
1154
- sessionIdentity: String(sessionIdentity),
1155
- bindingGeneration: BigInt(
1156
- (actorRef.bindingGeneration as bigint | number | string | boolean | undefined) ?? -1
1157
- )
1158
- };
1159
951
  }
1160
952
 
1161
953
  async observeRelocationTerminal(
@@ -1199,7 +991,7 @@ export class ZLinkActorSessionBindingRegistry<
1199
991
 
1200
992
  /**
1201
993
  * Actor-wide relocation teardown: every seal (active and terminal-retained)
1202
- * and every held outbound entry for `actorId` is discarded unconditionally.
994
+ * for `actorId` is discarded unconditionally.
1203
995
  * Reserved for paths where the Actor itself is gone or being torn down
1204
996
  * (destroy, ownership clear, relocation-seal expiry/failure) — never for a
1205
997
  * single physical route's disconnect, which must not disturb a relocation
@@ -1212,8 +1004,18 @@ export class ZLinkActorSessionBindingRegistry<
1212
1004
  private clearRelocationCore(actorId: string, error: unknown): void {
1213
1005
  const queue = this.relocations.get(actorId);
1214
1006
  if (queue === undefined) return;
1007
+ this.rejectSealWaiters(
1008
+ actorId,
1009
+ error,
1010
+ error instanceof ZLinkFrameworkException &&
1011
+ error.kind === ZLinkFrameworkErrorKind.DeadlineExceeded
1012
+ ? 'target_closed'
1013
+ : error instanceof ZLinkFrameworkException &&
1014
+ error.kind === ZLinkFrameworkErrorKind.ShuttingDown
1015
+ ? 'shutdown'
1016
+ : 'stale_target'
1017
+ );
1215
1018
  this.relocations.delete(actorId);
1216
- for (const entry of queue.outbound.splice(0)) this.failOutbound(queue, entry, error);
1217
1019
  for (const state of queue.seals.values()) {
1218
1020
  this.terminalRelocations.delete(state);
1219
1021
  if (state.phase !== 'terminal') state.resolveTerminal();
@@ -1224,7 +1026,7 @@ export class ZLinkActorSessionBindingRegistry<
1224
1026
  * Spec 48 §137: a relocation seal's lifecycle is independent of any single
1225
1027
  * physical route's binding. Unbinding one physical route (a disconnect)
1226
1028
  * must retire only the still-open (nonterminal) relocation seal that this
1227
- * exact route's Session owns, and the outbound held against that seal — it
1029
+ * exact route's Session owns — it
1228
1030
  * must never reach into a seal that has already reached 'terminal' (its
1229
1031
  * bounded retention exists precisely so a late same-seal relay can still
1230
1032
  * pass on a successor route) nor into a different Session's active seal
@@ -1233,8 +1035,7 @@ export class ZLinkActorSessionBindingRegistry<
1233
1035
  */
1234
1036
  private clearRouteRelocation(
1235
1037
  actorId: string,
1236
- route: ZLinkActorSessionRoute<TContext, TActor>,
1237
- error: unknown
1038
+ route: ZLinkActorSessionRoute<TContext, TActor>
1238
1039
  ): void {
1239
1040
  const queue = this.relocations.get(actorId);
1240
1041
  if (queue === undefined) return;
@@ -1250,12 +1051,6 @@ export class ZLinkActorSessionBindingRegistry<
1250
1051
  this.deleteEmptyRelocationQueue(queue);
1251
1052
  return;
1252
1053
  }
1253
- for (let index = queue.outbound.length - 1; index >= 0; index--) {
1254
- const entry = queue.outbound[index]!;
1255
- if (entry.sealId !== activeSealId) continue;
1256
- queue.outbound.splice(index, 1);
1257
- this.failOutbound(queue, entry, error);
1258
- }
1259
1054
  queue.activeSealId = undefined;
1260
1055
  queue.seals.delete(activeSealId!);
1261
1056
  this.terminalRelocations.delete(activeState);
@@ -1464,155 +1259,6 @@ export class ZLinkActorSessionBindingRegistry<
1464
1259
  for (const waiter of waiters) waiter.reject(error);
1465
1260
  }
1466
1261
 
1467
- private startOutboundDrain(queue: ZLinkActorSessionRelocationQueue): void {
1468
- if (queue.drainPromise !== undefined) return;
1469
- const drain = startOutsideStateLane(async () => {
1470
- for (;;) {
1471
- const entry = await this.lane.run(() => {
1472
- const current = queue.outbound.at(0);
1473
- if (current === undefined || !current.released) return undefined;
1474
- if (current.settled) {
1475
- queue.outbound.shift();
1476
- return null;
1477
- }
1478
- return current;
1479
- });
1480
- if (entry === undefined) return;
1481
- if (entry === null) continue;
1482
- try {
1483
- const delivered = await entry.operation.deliver();
1484
- await this.lane.run(() => {
1485
- if (delivered) this.settleOutbound(queue, entry);
1486
- else
1487
- this.failOutbound(
1488
- queue,
1489
- entry,
1490
- new Error(
1491
- `Actor '${queue.actorId}' retained Session outbound delivery was rejected.`
1492
- )
1493
- );
1494
- if (queue.outbound[0] === entry) queue.outbound.shift();
1495
- });
1496
- } catch (error) {
1497
- await this.lane.run(() => {
1498
- this.failOutbound(queue, entry, error);
1499
- if (queue.outbound[0] === entry) queue.outbound.shift();
1500
- });
1501
- }
1502
- }
1503
- });
1504
- startOutsideStateLane(() => {
1505
- void drain.finally(
1506
- async () =>
1507
- await this.lane.run(() => {
1508
- if (queue.drainPromise === drain) queue.drainPromise = undefined;
1509
- if (queue.outbound[0]?.released === true) this.startOutboundDrain(queue);
1510
- else this.deleteEmptyRelocationQueue(queue);
1511
- })
1512
- );
1513
- });
1514
- queue.drainPromise = drain;
1515
- }
1516
-
1517
- private reserveOutbound(
1518
- queue: ZLinkActorSessionRelocationQueue,
1519
- operation: ZLinkActorSessionRetainedOutbound
1520
- ): boolean {
1521
- if (queue.outboundCount < this.outboundCapacity) {
1522
- queue.outboundCount++;
1523
- return true;
1524
- }
1525
- failRetainedOutbound(
1526
- operation,
1527
- new Error(`Actor '${queue.actorId}' Session relocation outbound capacity was exhausted.`)
1528
- );
1529
- return false;
1530
- }
1531
-
1532
- private settleOutbound(
1533
- queue: ZLinkActorSessionRelocationQueue,
1534
- entry: ZLinkActorSessionOutboundEntry
1535
- ): void {
1536
- if (entry.settled) return;
1537
- entry.settled = true;
1538
- queue.outboundCount--;
1539
- }
1540
-
1541
- private failOutbound(
1542
- queue: ZLinkActorSessionRelocationQueue,
1543
- entry: ZLinkActorSessionOutboundEntry,
1544
- error: unknown
1545
- ): void {
1546
- if (entry.settled) return;
1547
- this.settleOutbound(queue, entry);
1548
- failRetainedOutbound(entry.operation, error);
1549
- }
1550
-
1551
- private outboundAdmissionError(claim: ServiceSessionBindingAdmissionClaim): Error | undefined {
1552
- if (
1553
- claim.actorId.length === 0 ||
1554
- claim.objectGeneration <= 0n ||
1555
- claim.actorNodeRid.length === 0 ||
1556
- claim.actorNodeGeneration <= 0n ||
1557
- claim.producerNodeRid.length === 0 ||
1558
- claim.producerNodeGeneration <= 0n ||
1559
- claim.bindingGeneration <= 0n ||
1560
- claim.sessionIdentity.length === 0 ||
1561
- !routingIdsEqual(claim.producerNodeRid, claim.actorNodeRid) ||
1562
- claim.producerNodeGeneration !== claim.actorNodeGeneration
1563
- ) {
1564
- return new Error(`Actor '${claim.actorId}' Session outbound admission claim is invalid.`);
1565
- }
1566
- const route = this.routes.get(claim.actorId);
1567
- const ref = route?.actor as
1568
- | (TActor & {
1569
- readonly ref?: {
1570
- readonly actorId?: unknown;
1571
- readonly objectGeneration?: unknown;
1572
- readonly generation?: unknown;
1573
- readonly bindingGeneration?: unknown;
1574
- };
1575
- })
1576
- | undefined;
1577
- const actorRef = ref?.ref;
1578
- const routeSessionIdentity = route?.sessionIdentity;
1579
- if (
1580
- route === undefined ||
1581
- actorRef === undefined ||
1582
- String(actorRef.actorId ?? claim.actorId) !== claim.actorId ||
1583
- BigInt(
1584
- (actorRef.objectGeneration as bigint | number | string | boolean | undefined) ??
1585
- (actorRef.generation as bigint | number | string | boolean | undefined) ??
1586
- -1
1587
- ) !== claim.objectGeneration ||
1588
- BigInt(
1589
- (actorRef.bindingGeneration as bigint | number | string | boolean | undefined) ?? -1
1590
- ) !== claim.bindingGeneration ||
1591
- String(routeSessionIdentity ?? '') !== claim.sessionIdentity
1592
- ) {
1593
- return new Error(
1594
- `Actor '${claim.actorId}' Session outbound admission was fenced by its current binding.`
1595
- );
1596
- }
1597
- return undefined;
1598
- }
1599
-
1600
- private matchesCurrentProducerNode(claim: ServiceSessionBindingAdmissionClaim): boolean {
1601
- const route = this.routes.get(claim.actorId);
1602
- const actorRef = (
1603
- route?.actor as TActor & {
1604
- readonly ref?: {
1605
- readonly nodeRid?: unknown;
1606
- };
1607
- }
1608
- ).ref;
1609
- return (
1610
- route !== undefined &&
1611
- actorRef !== undefined &&
1612
- routingIdsEqual(String(actorRef.nodeRid ?? ''), claim.actorNodeRid)
1613
- );
1614
- }
1615
-
1616
1262
  private rememberTerminalRelocation(state: ZLinkActorSessionRelocationState): void {
1617
1263
  this.terminalRelocations.delete(state);
1618
1264
  this.terminalRelocations.set(state, true);
@@ -1633,27 +1279,74 @@ export class ZLinkActorSessionBindingRegistry<
1633
1279
  if (
1634
1280
  queue.activeSealId === undefined &&
1635
1281
  queue.seals.size === 0 &&
1636
- queue.outbound.length === 0 &&
1637
- queue.drainPromise === undefined &&
1282
+ queue.ingress.length === 0 &&
1283
+ queue.ingressDrain === undefined &&
1638
1284
  this.relocations.get(queue.actorId) === queue
1639
1285
  ) {
1640
1286
  this.relocations.delete(queue.actorId);
1641
1287
  }
1642
1288
  }
1643
1289
 
1644
- private resolveSealWaiters(actorId: string, _sealId: string): void {
1290
+ private resolveSealWaiters(actorId: string, sealId: string): void {
1291
+ const queue = this.relocations.get(actorId);
1292
+ if (queue !== undefined) {
1293
+ for (const entry of queue.ingress) {
1294
+ if (entry.sealId === sealId) entry.sealId = undefined;
1295
+ }
1296
+ this.startHeldOneWayDrain(actorId, queue);
1297
+ }
1645
1298
  const waiters = this.sealWaiters.get(actorId);
1646
1299
  if (waiters === undefined) return;
1647
1300
  this.sealWaiters.delete(actorId);
1648
1301
  for (const waiter of waiters) waiter.resolve();
1649
1302
  }
1650
1303
 
1651
- private rejectSealWaiters(actorId: string, error: unknown): void {
1304
+ private rejectSealWaiters(
1305
+ actorId: string,
1306
+ error: unknown,
1307
+ reason: 'stale_target' | 'target_closed' | 'shutdown' = 'target_closed'
1308
+ ): void {
1309
+ const queue = this.relocations.get(actorId);
1310
+ if (queue !== undefined) {
1311
+ for (const delivery of queue.ingress.splice(0)) delivery.drop(reason, error);
1312
+ }
1652
1313
  const waiters = this.sealWaiters.get(actorId);
1653
1314
  if (waiters === undefined) return;
1654
1315
  this.sealWaiters.delete(actorId);
1655
1316
  for (const waiter of waiters) waiter.reject(error);
1656
1317
  }
1318
+
1319
+ private startHeldOneWayDrain(actorId: string, queue: ZLinkActorSessionRelocationQueue): void {
1320
+ if (queue.ingressDrain !== undefined) return;
1321
+ const drain = startOutsideStateLane(async () => {
1322
+ for (;;) {
1323
+ const next = await this.lane.run(() => {
1324
+ if (this.relocations.get(actorId) !== queue) return undefined;
1325
+ const first = queue.ingress.at(0);
1326
+ if (first === undefined || first.sealId !== undefined) return undefined;
1327
+ return queue.ingress.shift();
1328
+ });
1329
+ if (next === undefined) return;
1330
+ try {
1331
+ await next.deliver();
1332
+ } catch (error) {
1333
+ next.drop('stale_target', error);
1334
+ }
1335
+ }
1336
+ });
1337
+ queue.ingressDrain = drain;
1338
+ startOutsideStateLane(() => {
1339
+ void drain.finally(async () => {
1340
+ await this.lane.run(() => {
1341
+ if (queue.ingressDrain !== drain) return;
1342
+ queue.ingressDrain = undefined;
1343
+ if (queue.ingress.at(0)?.sealId === undefined && queue.ingress.length > 0)
1344
+ this.startHeldOneWayDrain(actorId, queue);
1345
+ else this.deleteEmptyRelocationQueue(queue);
1346
+ });
1347
+ });
1348
+ });
1349
+ }
1657
1350
  }
1658
1351
 
1659
1352
  function assertRelocationClaim(
@@ -1679,77 +1372,6 @@ function startOutsideStateLane<T>(work: () => T): T {
1679
1372
  return detachedStateLaneResource.runInAsyncScope(work);
1680
1373
  }
1681
1374
 
1682
- function matchesRelocationSourceProof(
1683
- state: ZLinkActorSessionRelocationState,
1684
- claim: ServiceSessionBindingAdmissionClaim
1685
- ): boolean {
1686
- return (
1687
- state.actorId === claim.actorId &&
1688
- state.actorGeneration === claim.objectGeneration &&
1689
- state.bindingGeneration === claim.bindingGeneration &&
1690
- state.sessionIdentity === claim.sessionIdentity &&
1691
- state.actorNodeRid !== undefined &&
1692
- routingIdsEqual(state.actorNodeRid, claim.actorNodeRid) &&
1693
- state.actorNodeGeneration === claim.actorNodeGeneration
1694
- );
1695
- }
1696
-
1697
- function matchesAcceptedProducerProof(
1698
- proof: ZLinkActorSessionAcceptedProducerProof,
1699
- claim: ServiceSessionBindingAdmissionClaim
1700
- ): boolean {
1701
- return (
1702
- proof.actorId === claim.actorId &&
1703
- proof.objectGeneration === claim.objectGeneration &&
1704
- routingIdsEqual(proof.actorNodeRid, claim.actorNodeRid) &&
1705
- proof.actorNodeGeneration === claim.actorNodeGeneration &&
1706
- proof.sessionIdentity === claim.sessionIdentity &&
1707
- proof.bindingGeneration === claim.bindingGeneration
1708
- );
1709
- }
1710
-
1711
- function validAcceptedTargetProof(
1712
- state: ZLinkActorSessionRelocationState,
1713
- proof: ZLinkActorSessionAcceptedProducerProof
1714
- ): boolean {
1715
- return (
1716
- proof.actorId === state.actorId &&
1717
- proof.objectGeneration === state.actorGeneration &&
1718
- proof.actorNodeRid.length > 0 &&
1719
- proof.actorNodeGeneration > 0n &&
1720
- proof.sessionIdentity === state.sessionIdentity &&
1721
- proof.bindingGeneration === state.bindingGeneration
1722
- );
1723
- }
1724
-
1725
- function relocationSourceProof(
1726
- state: ZLinkActorSessionRelocationState
1727
- ): ZLinkActorSessionAcceptedProducerProof | undefined {
1728
- if (
1729
- state.sessionIdentity === undefined ||
1730
- state.actorNodeRid === undefined ||
1731
- state.actorNodeGeneration === undefined
1732
- )
1733
- return undefined;
1734
- return {
1735
- actorId: state.actorId,
1736
- objectGeneration: state.actorGeneration,
1737
- actorNodeRid: state.actorNodeRid,
1738
- actorNodeGeneration: state.actorNodeGeneration,
1739
- sessionIdentity: state.sessionIdentity,
1740
- bindingGeneration: state.bindingGeneration
1741
- };
1742
- }
1743
-
1744
- function failRetainedOutbound(operation: ZLinkActorSessionRetainedOutbound, error: unknown): void {
1745
- try {
1746
- operation.fail(error);
1747
- } catch {
1748
- // The aggregate has already removed the entry. A failure observer cannot
1749
- // retain or settle the same delivery a second time.
1750
- }
1751
- }
1752
-
1753
1375
  function assertSuccessorSessionIdentity(
1754
1376
  predecessor: ZLinkActorSessionRelocationState,
1755
1377
  successor: ZLinkActorSessionRelocationClaim