@zlink-systems/framework 0.26.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (521) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Common/CoreTypes.d.ts +6 -0
  3. package/dist/contracts/Common/CoreTypes.js +7 -0
  4. package/dist/contracts/Common/index.d.ts +1 -1
  5. package/dist/contracts/Common/index.js +0 -1
  6. package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
  7. package/dist/contracts/Configuration/InternalDefaults.js +9 -1
  8. package/dist/contracts/Configuration/Registration.d.ts +13 -2
  9. package/dist/contracts/Configuration/Registration.js +58 -36
  10. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
  12. package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
  13. package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
  14. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  15. package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
  16. package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
  17. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
  18. package/dist/contracts/Handlers/JsonContract.js +10 -4
  19. package/dist/contracts/Locations/Authority.d.ts +1 -1
  20. package/dist/contracts/Locations/Authority.js +3 -2
  21. package/dist/contracts/Locations/Options.js +1 -1
  22. package/dist/contracts/Locations/Stores.d.ts +12 -0
  23. package/dist/contracts/Locations/Stores.js +9 -0
  24. package/dist/contracts/Spots/Contracts.d.ts +1 -1
  25. package/dist/internal.d.ts +4 -0
  26. package/dist/internal.js +15 -1
  27. package/dist/nest-integration.d.ts +4 -2
  28. package/dist/nest-integration.js +14 -4
  29. package/dist/runtime/abort.d.ts +1 -0
  30. package/dist/runtime/abort.js +8 -5
  31. package/dist/runtime/activation-admission.d.ts +1 -2
  32. package/dist/runtime/activation-admission.js +2 -6
  33. package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
  34. package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
  35. package/dist/runtime/actors/actor-client.d.ts +2 -2
  36. package/dist/runtime/actors/actor-client.js +42 -143
  37. package/dist/runtime/actors/actor-context.d.ts +3 -5
  38. package/dist/runtime/actors/actor-context.js +13 -11
  39. package/dist/runtime/actors/actor-handoff.d.ts +4 -4
  40. package/dist/runtime/actors/actor-handoff.js +8 -8
  41. package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
  42. package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
  43. package/dist/runtime/actors/actor-local-native-join.js +83 -105
  44. package/dist/runtime/actors/actor-native-lookup.js +2 -8
  45. package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
  46. package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
  47. package/dist/runtime/actors/actor-remote-joiner.d.ts +1 -1
  48. package/dist/runtime/actors/actor-remote-joiner.js +5 -9
  49. package/dist/runtime/actors/actor-remote-wire.js +5 -3
  50. package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
  51. package/dist/runtime/actors/actor-request-deadline.js +31 -0
  52. package/dist/runtime/actors/actor-retry-delay.js +2 -1
  53. package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
  54. package/dist/runtime/actors/actor-runtime-state.js +70 -187
  55. package/dist/runtime/actors/bound-session-wire.js +2 -7
  56. package/dist/runtime/actors/deferred-join-completion.d.ts +11 -6
  57. package/dist/runtime/actors/deferred-join-completion.js +1 -0
  58. package/dist/runtime/actors/index.d.ts +9 -7
  59. package/dist/runtime/actors/index.js +87 -69
  60. package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
  61. package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
  62. package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
  63. package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
  64. package/dist/runtime/admission.d.ts +2 -0
  65. package/dist/runtime/admission.js +7 -1
  66. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
  67. package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
  68. package/dist/runtime/backend/contracts/index.d.ts +6 -23
  69. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +1 -17
  70. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
  71. package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
  72. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +1 -1
  73. package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -6
  74. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
  75. package/dist/runtime/backend/node/node-event-loop-poller.js +6 -7
  76. package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
  77. package/dist/runtime/backend/node/node-raw-binding-port.js +40 -16
  78. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +14 -15
  79. package/dist/runtime/backend/node/node-raw-mesh-backend.js +146 -118
  80. package/dist/runtime/backend/node/node-socket-backend-adapter.js +3 -2
  81. package/dist/runtime/backend/raw-binding-port.d.ts +1 -1
  82. package/dist/runtime/backend/runtime-values.d.ts +4 -1
  83. package/dist/runtime/backend/runtime-values.js +2 -0
  84. package/dist/runtime/channels/channel-clients.d.ts +20 -8
  85. package/dist/runtime/channels/channel-clients.js +68 -52
  86. package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
  87. package/dist/runtime/channels/channel-envelope.js +47 -29
  88. package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
  89. package/dist/runtime/channels/channel-outbound-operations.js +9 -10
  90. package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
  91. package/dist/runtime/channels/channel-receive-loops.js +27 -6
  92. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
  93. package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
  94. package/dist/runtime/channels/channel-runtime-manager.js +5 -2
  95. package/dist/runtime/channels/channel-socket-options.js +3 -2
  96. package/dist/runtime/channels/channel-socket-registry.d.ts +14 -29
  97. package/dist/runtime/channels/channel-socket-registry.js +248 -174
  98. package/dist/runtime/channels/channel-transports.d.ts +11 -17
  99. package/dist/runtime/channels/channel-transports.js +68 -47
  100. package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
  101. package/dist/runtime/channels/client-server-location-runtime.js +10 -11
  102. package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
  103. package/dist/runtime/channels/client-server-service-wire.js +32 -11
  104. package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
  105. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  106. package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
  107. package/dist/runtime/channels/fanout-location-runtime.js +130 -72
  108. package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
  109. package/dist/runtime/channels/spot-direct-envelope.js +4 -3
  110. package/dist/runtime/channels/spot-node-route-transport.js +3 -2
  111. package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
  112. package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
  113. package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
  114. package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
  115. package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
  116. package/dist/runtime/diagnostics/flow-context.js +16 -2
  117. package/dist/runtime/diagnostics/index.d.ts +4 -2
  118. package/dist/runtime/diagnostics/index.js +14 -4
  119. package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
  120. package/dist/runtime/diagnostics/message-flow.js +10 -19
  121. package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
  122. package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
  123. package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
  124. package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
  125. package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
  126. package/dist/runtime/disposal.d.ts +5 -0
  127. package/dist/runtime/disposal.js +22 -0
  128. package/dist/runtime/execution/index.d.ts +12 -9
  129. package/dist/runtime/execution/index.js +58 -14
  130. package/dist/runtime/execution/serial-execution-queue.d.ts +8 -2
  131. package/dist/runtime/execution/serial-execution-queue.js +54 -15
  132. package/dist/runtime/execution/state-lane.d.ts +8 -1
  133. package/dist/runtime/execution/state-lane.js +118 -3
  134. package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
  135. package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
  136. package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
  137. package/dist/runtime/foundation/event-loop-resources.js +6 -119
  138. package/dist/runtime/foundation/operation-identity.d.ts +2 -0
  139. package/dist/runtime/foundation/operation-identity.js +9 -5
  140. package/dist/runtime/foundation/operation-registry.d.ts +5 -7
  141. package/dist/runtime/foundation/operation-registry.js +34 -44
  142. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +8 -5
  143. package/dist/runtime/foundation/raw-service-mesh-runtime.js +62 -83
  144. package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
  145. package/dist/runtime/foundation/runtime-state-projections.js +8 -0
  146. package/dist/runtime/foundation/service-authority-payload-codec.js +22 -12
  147. package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
  148. package/dist/runtime/foundation/service-discovery-registry.js +22 -3
  149. package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
  150. package/dist/runtime/foundation/service-liveness-registry.js +2 -1
  151. package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
  152. package/dist/runtime/foundation/service-maintenance-runtime.js +0 -6
  153. package/dist/runtime/foundation/service-metadata-codec.js +3 -3
  154. package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
  155. package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
  156. package/dist/runtime/foundation/service-relocation-object-owner.js +3 -2
  157. package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
  158. package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
  159. package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
  160. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -12
  161. package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
  162. package/dist/runtime/foundation/service-stateful-registry.js +10 -2
  163. package/dist/runtime/foundation/service-stateful-runtime.d.ts +26 -25
  164. package/dist/runtime/foundation/service-stateful-runtime.js +217 -204
  165. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -3
  166. package/dist/runtime/foundation/service-stateful-wire-codec.js +89 -55
  167. package/dist/runtime/foundation/service-topology-registry.d.ts +0 -1
  168. package/dist/runtime/foundation/service-topology-registry.js +17 -32
  169. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
  170. package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
  171. package/dist/runtime/foundation/service-wire-codec.js +10 -8
  172. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  173. package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
  174. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
  175. package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
  176. package/dist/runtime/framework-errors-internal.d.ts +2 -1
  177. package/dist/runtime/framework-errors-internal.js +343 -122
  178. package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
  179. package/dist/runtime/handlers/handler-instance-scope.js +61 -74
  180. package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
  181. package/dist/runtime/host/actor-packet-relay.js +48 -91
  182. package/dist/runtime/host/actor-placement-coordinator.js +7 -5
  183. package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
  184. package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
  185. package/dist/runtime/host/actor-transfer-runtime.d.ts +16 -18
  186. package/dist/runtime/host/actor-transfer-runtime.js +143 -176
  187. package/dist/runtime/host/application-job-queue.js +16 -33
  188. package/dist/runtime/host/bound-session-relay.js +1 -1
  189. package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
  190. package/dist/runtime/host/index.d.ts +14 -13
  191. package/dist/runtime/host/index.js +190 -157
  192. package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
  193. package/dist/runtime/host/instance-activation-authority.js +17 -45
  194. package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
  195. package/dist/runtime/host/location-runtime-owner.js +2 -2
  196. package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
  197. package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
  198. package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
  199. package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
  200. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
  201. package/dist/runtime/host/remote-bound-session-relay.js +7 -20
  202. package/dist/runtime/host/route-mesh-runtime.d.ts +13 -11
  203. package/dist/runtime/host/route-mesh-runtime.js +171 -252
  204. package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
  205. package/dist/runtime/host/runtime-shutdown.js +18 -21
  206. package/dist/runtime/host/service-relocation-control.js +6 -1
  207. package/dist/runtime/host/service-relocation-host-runtime.d.ts +21 -30
  208. package/dist/runtime/host/service-relocation-host-runtime.js +508 -416
  209. package/dist/runtime/host/spot-address-transport.d.ts +2 -3
  210. package/dist/runtime/host/spot-address-transport.js +34 -136
  211. package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
  212. package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
  213. package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -10
  214. package/dist/runtime/host/spot-runtime-options-factory.js +50 -14
  215. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -3
  216. package/dist/runtime/host/user-spot-creation-coordinator.js +11 -8
  217. package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
  218. package/dist/runtime/locations/authority-key-codec.js +4 -3
  219. package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
  220. package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
  221. package/dist/runtime/locations/creation-operation-id.js +6 -4
  222. package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
  223. package/dist/runtime/locations/in-memory-authority-store.js +31 -15
  224. package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
  225. package/dist/runtime/locations/in-memory-location-store.js +17 -14
  226. package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
  227. package/dist/runtime/locations/in-memory-provider-location-store.js +72 -22
  228. package/dist/runtime/locations/key-codec.js +3 -2
  229. package/dist/runtime/locations/lease-tracker.d.ts +3 -5
  230. package/dist/runtime/locations/lease-tracker.js +7 -11
  231. package/dist/runtime/locations/lifecycle.d.ts +4 -9
  232. package/dist/runtime/locations/lifecycle.js +2 -31
  233. package/dist/runtime/locations/location-store-failure.d.ts +2 -0
  234. package/dist/runtime/locations/location-store-failure.js +7 -0
  235. package/dist/runtime/locations/location-store-pages.d.ts +3 -0
  236. package/dist/runtime/locations/location-store-pages.js +13 -0
  237. package/dist/runtime/locations/location-store-repository.d.ts +5 -7
  238. package/dist/runtime/locations/location-store-repository.js +303 -332
  239. package/dist/runtime/locations/relocation-blob.js +18 -5
  240. package/dist/runtime/locations/resolvers.d.ts +5 -5
  241. package/dist/runtime/locations/resolvers.js +37 -28
  242. package/dist/runtime/locations/runtime.d.ts +5 -4
  243. package/dist/runtime/locations/runtime.js +123 -92
  244. package/dist/runtime/locations/spot-location-claims.d.ts +6 -0
  245. package/dist/runtime/locations/spot-location-claims.js +42 -1
  246. package/dist/runtime/messaging/payload-codec.js +26 -20
  247. package/dist/runtime/messaging/submission-result.d.ts +3 -0
  248. package/dist/runtime/messaging/submission-result.js +48 -0
  249. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +1 -0
  250. package/dist/runtime/protocol/service_wire_codec.generated.js +12 -7
  251. package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +4 -1
  252. package/dist/runtime/spots/index.d.ts +14 -20
  253. package/dist/runtime/spots/index.js +302 -176
  254. package/dist/runtime/spots/spot-activation-registry.d.ts +3 -5
  255. package/dist/runtime/spots/spot-activation-registry.js +14 -50
  256. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  257. package/dist/runtime/spots/spot-activation-state.js +2 -2
  258. package/dist/runtime/spots/spot-activation.d.ts +3 -4
  259. package/dist/runtime/spots/spot-activation.js +49 -32
  260. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
  261. package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
  262. package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
  263. package/dist/runtime/spots/spot-actor-join-dispatch.js +4 -52
  264. package/dist/runtime/spots/spot-actor-membership.d.ts +4 -6
  265. package/dist/runtime/spots/spot-actor-membership.js +22 -45
  266. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
  267. package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
  268. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
  269. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
  270. package/dist/runtime/spots/spot-context.d.ts +2 -2
  271. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -2
  272. package/dist/runtime/spots/spot-entry-activation.js +9 -20
  273. package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
  274. package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
  275. package/dist/runtime/spots/spot-manager-public.js +5 -4
  276. package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
  277. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -18
  278. package/dist/runtime/spots/spot-node-runtime-manager.js +67 -72
  279. package/dist/runtime/spots/spot-outbound.d.ts +4 -3
  280. package/dist/runtime/spots/spot-outbound.js +9 -8
  281. package/dist/runtime/spots/spot-remote-codec.js +5 -3
  282. package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
  283. package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
  284. package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
  285. package/dist/runtime/spots/spot-route-replies.js +3 -1
  286. package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -3
  287. package/dist/runtime/spots/spot-routed-actor-admission.js +3 -12
  288. package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +1 -2
  289. package/dist/runtime/spots/spot-routed-frame-dispatch.js +0 -1
  290. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
  291. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
  292. package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -16
  293. package/dist/runtime/spots/spot-serial-executor.js +2 -2
  294. package/dist/runtime/spots/spot-serial-turn-executor.d.ts +27 -7
  295. package/dist/runtime/spots/spot-serial-turn-executor.js +83 -11
  296. package/dist/runtime/spots/spot-timer.d.ts +3 -2
  297. package/dist/runtime/streams/actor-session-binding-registry.d.ts +16 -29
  298. package/dist/runtime/streams/actor-session-binding-registry.js +142 -212
  299. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +1 -4
  300. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
  301. package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
  302. package/dist/runtime/streams/bound-session-service.d.ts +7 -0
  303. package/dist/runtime/streams/bound-session-service.js +11 -1
  304. package/dist/runtime/streams/index.d.ts +14 -15
  305. package/dist/runtime/streams/index.js +20 -21
  306. package/dist/runtime/streams/managed-stream.d.ts +3 -0
  307. package/dist/runtime/streams/managed-stream.js +17 -8
  308. package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
  309. package/dist/runtime/streams/protocol.d.ts +6 -33
  310. package/dist/runtime/streams/protocol.js +38 -110
  311. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
  312. package/dist/runtime/streams/session-actor-coordinator.js +12 -4
  313. package/dist/runtime/streams/session-calls.d.ts +1 -1
  314. package/dist/runtime/streams/session-calls.js +5 -4
  315. package/dist/runtime/streams/session-context.d.ts +6 -6
  316. package/dist/runtime/streams/session-context.js +22 -4
  317. package/dist/runtime/streams/session-requests.js +2 -1
  318. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
  319. package/dist/runtime/streams/stream-frame-factory.js +2 -2
  320. package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
  321. package/dist/runtime/streams/stream-session-runtime.js +25 -33
  322. package/dist/runtime/workers/index.d.ts +2 -2
  323. package/dist/runtime/workers/index.js +5 -4
  324. package/package.json +3 -3
  325. package/src/contracts/Common/CoreTypes.ts +7 -0
  326. package/src/contracts/Common/index.ts +1 -1
  327. package/src/contracts/Configuration/InternalDefaults.ts +12 -0
  328. package/src/contracts/Configuration/Registration.ts +92 -48
  329. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
  330. package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
  331. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  332. package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
  333. package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
  334. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
  335. package/src/contracts/Handlers/JsonContract.ts +14 -4
  336. package/src/contracts/Locations/Authority.ts +7 -3
  337. package/src/contracts/Locations/Options.ts +1 -1
  338. package/src/contracts/Locations/Stores.ts +14 -0
  339. package/src/contracts/Spots/Contracts.ts +1 -1
  340. package/src/internal.ts +14 -0
  341. package/src/nest-integration.ts +28 -10
  342. package/src/runtime/abort.ts +6 -5
  343. package/src/runtime/activation-admission.ts +2 -8
  344. package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
  345. package/src/runtime/actors/actor-client.ts +77 -204
  346. package/src/runtime/actors/actor-context.ts +39 -33
  347. package/src/runtime/actors/actor-handoff.ts +24 -22
  348. package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
  349. package/src/runtime/actors/actor-local-native-join.ts +172 -174
  350. package/src/runtime/actors/actor-native-lookup.ts +2 -9
  351. package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
  352. package/src/runtime/actors/actor-remote-joiner.ts +9 -11
  353. package/src/runtime/actors/actor-remote-wire.ts +5 -3
  354. package/src/runtime/actors/actor-request-deadline.ts +49 -0
  355. package/src/runtime/actors/actor-retry-delay.ts +2 -1
  356. package/src/runtime/actors/actor-runtime-state.ts +85 -247
  357. package/src/runtime/actors/bound-session-wire.ts +2 -8
  358. package/src/runtime/actors/deferred-join-completion.ts +10 -6
  359. package/src/runtime/actors/index.ts +100 -79
  360. package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
  361. package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
  362. package/src/runtime/admission.ts +8 -1
  363. package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
  364. package/src/runtime/backend/contracts/index.ts +13 -29
  365. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +2 -18
  366. package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
  367. package/src/runtime/backend/node/node-backend-adapter-support.ts +23 -6
  368. package/src/runtime/backend/node/node-event-loop-poller.ts +8 -12
  369. package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
  370. package/src/runtime/backend/node/node-raw-binding-port.ts +41 -20
  371. package/src/runtime/backend/node/node-raw-mesh-backend.ts +227 -170
  372. package/src/runtime/backend/node/node-socket-backend-adapter.ts +3 -2
  373. package/src/runtime/backend/raw-binding-port.ts +1 -1
  374. package/src/runtime/backend/runtime-values.ts +4 -1
  375. package/src/runtime/channels/channel-clients.ts +132 -85
  376. package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
  377. package/src/runtime/channels/channel-envelope.ts +58 -29
  378. package/src/runtime/channels/channel-outbound-operations.ts +10 -23
  379. package/src/runtime/channels/channel-receive-loops.ts +39 -7
  380. package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
  381. package/src/runtime/channels/channel-runtime-manager.ts +6 -2
  382. package/src/runtime/channels/channel-socket-options.ts +8 -2
  383. package/src/runtime/channels/channel-socket-registry.ts +301 -192
  384. package/src/runtime/channels/channel-transports.ts +161 -112
  385. package/src/runtime/channels/client-server-location-runtime.ts +17 -17
  386. package/src/runtime/channels/client-server-service-wire.ts +40 -12
  387. package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
  388. package/src/runtime/channels/fanout-location-runtime.ts +172 -91
  389. package/src/runtime/channels/spot-direct-envelope.ts +1 -1
  390. package/src/runtime/channels/spot-node-route-transport.ts +5 -2
  391. package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
  392. package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
  393. package/src/runtime/diagnostics/flow-context.ts +16 -2
  394. package/src/runtime/diagnostics/index.ts +27 -17
  395. package/src/runtime/diagnostics/message-flow.ts +15 -25
  396. package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
  397. package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
  398. package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
  399. package/src/runtime/disposal.ts +19 -0
  400. package/src/runtime/execution/index.ts +60 -20
  401. package/src/runtime/execution/serial-execution-queue.ts +131 -18
  402. package/src/runtime/execution/state-lane.ts +142 -4
  403. package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
  404. package/src/runtime/foundation/event-loop-resources.ts +5 -122
  405. package/src/runtime/foundation/operation-identity.ts +11 -5
  406. package/src/runtime/foundation/operation-registry.ts +33 -50
  407. package/src/runtime/foundation/raw-service-mesh-runtime.ts +110 -111
  408. package/src/runtime/foundation/runtime-state-projections.ts +9 -1
  409. package/src/runtime/foundation/service-authority-payload-codec.ts +31 -13
  410. package/src/runtime/foundation/service-discovery-registry.ts +32 -3
  411. package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
  412. package/src/runtime/foundation/service-liveness-registry.ts +2 -1
  413. package/src/runtime/foundation/service-maintenance-runtime.ts +0 -10
  414. package/src/runtime/foundation/service-metadata-codec.ts +2 -2
  415. package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
  416. package/src/runtime/foundation/service-relocation-object-owner.ts +5 -2
  417. package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
  418. package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
  419. package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -17
  420. package/src/runtime/foundation/service-stateful-registry.ts +14 -2
  421. package/src/runtime/foundation/service-stateful-runtime.ts +322 -276
  422. package/src/runtime/foundation/service-stateful-wire-codec.ts +128 -80
  423. package/src/runtime/foundation/service-topology-registry.ts +23 -32
  424. package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
  425. package/src/runtime/foundation/service-wire-codec.ts +15 -8
  426. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  427. package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
  428. package/src/runtime/framework-errors-internal.ts +380 -134
  429. package/src/runtime/handlers/handler-instance-scope.ts +68 -95
  430. package/src/runtime/host/actor-packet-relay.ts +57 -147
  431. package/src/runtime/host/actor-placement-coordinator.ts +8 -5
  432. package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
  433. package/src/runtime/host/actor-transfer-runtime.ts +180 -260
  434. package/src/runtime/host/application-job-queue.ts +28 -34
  435. package/src/runtime/host/bound-session-relay.ts +1 -2
  436. package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
  437. package/src/runtime/host/index.ts +327 -296
  438. package/src/runtime/host/instance-activation-authority.ts +89 -109
  439. package/src/runtime/host/location-runtime-owner.ts +4 -2
  440. package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
  441. package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
  442. package/src/runtime/host/remote-bound-session-relay.ts +8 -41
  443. package/src/runtime/host/route-mesh-runtime.ts +228 -271
  444. package/src/runtime/host/runtime-shutdown.ts +17 -21
  445. package/src/runtime/host/service-relocation-control.ts +14 -1
  446. package/src/runtime/host/service-relocation-host-runtime.ts +699 -561
  447. package/src/runtime/host/spot-address-transport.ts +73 -195
  448. package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
  449. package/src/runtime/host/spot-runtime-options-factory.ts +73 -22
  450. package/src/runtime/host/user-spot-creation-coordinator.ts +36 -22
  451. package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
  452. package/src/runtime/locations/authority-key-codec.ts +7 -3
  453. package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
  454. package/src/runtime/locations/creation-operation-id.ts +6 -3
  455. package/src/runtime/locations/domain-store-contract.ts +12 -3
  456. package/src/runtime/locations/in-memory-authority-store.ts +44 -15
  457. package/src/runtime/locations/in-memory-location-store.ts +50 -39
  458. package/src/runtime/locations/in-memory-provider-location-store.ts +100 -25
  459. package/src/runtime/locations/key-codec.ts +3 -2
  460. package/src/runtime/locations/lease-tracker.ts +8 -14
  461. package/src/runtime/locations/lifecycle.ts +13 -43
  462. package/src/runtime/locations/location-store-failure.ts +4 -0
  463. package/src/runtime/locations/location-store-pages.ts +18 -0
  464. package/src/runtime/locations/location-store-repository.ts +450 -478
  465. package/src/runtime/locations/relocation-blob.ts +17 -6
  466. package/src/runtime/locations/resolvers.ts +75 -49
  467. package/src/runtime/locations/runtime.ts +220 -110
  468. package/src/runtime/locations/spot-location-claims.ts +58 -1
  469. package/src/runtime/messaging/payload-codec.ts +35 -24
  470. package/src/runtime/messaging/submission-result.ts +57 -1
  471. package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
  472. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
  473. package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +4 -1
  474. package/src/runtime/spots/index.ts +433 -229
  475. package/src/runtime/spots/spot-activation-registry.ts +30 -69
  476. package/src/runtime/spots/spot-activation-state.ts +2 -2
  477. package/src/runtime/spots/spot-activation.ts +67 -37
  478. package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
  479. package/src/runtime/spots/spot-actor-join-dispatch.ts +24 -77
  480. package/src/runtime/spots/spot-actor-membership.ts +40 -72
  481. package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
  482. package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
  483. package/src/runtime/spots/spot-context.ts +3 -3
  484. package/src/runtime/spots/spot-entry-activation.ts +13 -30
  485. package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
  486. package/src/runtime/spots/spot-manager-public.ts +21 -17
  487. package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
  488. package/src/runtime/spots/spot-node-runtime-manager.ts +136 -125
  489. package/src/runtime/spots/spot-outbound.ts +45 -23
  490. package/src/runtime/spots/spot-remote-codec.ts +7 -3
  491. package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
  492. package/src/runtime/spots/spot-route-replies.ts +6 -4
  493. package/src/runtime/spots/spot-routed-actor-admission.ts +13 -26
  494. package/src/runtime/spots/spot-routed-frame-dispatch.ts +2 -3
  495. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
  496. package/src/runtime/spots/spot-runtime-ports.ts +5 -27
  497. package/src/runtime/spots/spot-serial-executor.ts +2 -2
  498. package/src/runtime/spots/spot-serial-turn-executor.ts +112 -11
  499. package/src/runtime/spots/spot-timer.ts +3 -2
  500. package/src/runtime/streams/actor-session-binding-registry.ts +179 -269
  501. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +0 -8
  502. package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
  503. package/src/runtime/streams/bound-session-service.ts +21 -1
  504. package/src/runtime/streams/index.ts +76 -64
  505. package/src/runtime/streams/managed-stream.ts +29 -10
  506. package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
  507. package/src/runtime/streams/protocol.ts +34 -88
  508. package/src/runtime/streams/session-actor-coordinator.ts +17 -5
  509. package/src/runtime/streams/session-calls.ts +6 -5
  510. package/src/runtime/streams/session-context.ts +54 -10
  511. package/src/runtime/streams/session-requests.ts +2 -1
  512. package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
  513. package/src/runtime/streams/stream-frame-factory.ts +2 -3
  514. package/src/runtime/streams/stream-session-runtime.ts +57 -59
  515. package/src/runtime/workers/index.ts +13 -12
  516. package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
  517. package/dist/runtime/actors/post-commit-actor-location.js +0 -72
  518. package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
  519. package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
  520. package/src/runtime/actors/post-commit-actor-location.ts +0 -121
  521. package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
@@ -1,15 +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 type { ServiceSessionBindingAdmissionResult } from '../foundation/service-session-binding-ingress-port';
13
+ export const DEFAULT_TERMINAL_RELOCATION_CAPACITY = 4096;
9
14
 
10
15
  const detachedStateLaneResource = new AsyncResource('zlink:actor-session-binding-registry');
11
16
  export interface ZLinkActorSessionBindingActor {
12
17
  readonly actorId: string;
18
+ readonly ref: { readonly actorId: string; readonly bindingGeneration?: bigint };
13
19
  }
14
20
 
15
21
  export interface ZLinkActorSessionBindingContext<TActor extends ZLinkActorSessionBindingActor> {
@@ -46,11 +52,6 @@ export interface ZLinkActorSessionRelocationClaim {
46
52
  readonly sealId: string;
47
53
  }
48
54
 
49
- export interface ZLinkActorSessionRetainedOutbound {
50
- deliver(): Promise<boolean>;
51
- fail(error: unknown): void;
52
- }
53
-
54
55
  export interface ZLinkActorSessionRelocationSnapshot extends ZLinkActorSessionRelocationClaim {
55
56
  readonly phase: 'sealed' | 'applying' | 'applied' | 'terminal';
56
57
  readonly applyFingerprint?: string;
@@ -99,22 +100,16 @@ interface ZLinkActorSessionRelocationState {
99
100
  readonly resolveTerminal: () => void;
100
101
  }
101
102
 
102
- interface ZLinkActorSessionOutboundEntry {
103
- readonly sealId?: string;
104
- readonly operation: ZLinkActorSessionRetainedOutbound;
105
- readonly arrivalOrder: bigint;
106
- released: boolean;
107
- settled: boolean;
108
- }
109
-
110
103
  interface ZLinkActorSessionRelocationQueue {
111
104
  readonly actorId: string;
112
105
  activeSealId?: string;
113
106
  readonly seals: Map<string, ZLinkActorSessionRelocationState>;
114
- readonly outbound: ZLinkActorSessionOutboundEntry[];
115
- nextArrivalOrder: bigint;
116
- outboundCount: number;
117
- 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>;
118
113
  }
119
114
 
120
115
  export interface ZLinkActorSessionAuthorityFence {
@@ -151,24 +146,20 @@ export class ZLinkActorSessionBindingRegistry<
151
146
  private readonly terminalRelocations = new Map<ZLinkActorSessionRelocationState, true>();
152
147
 
153
148
  constructor(
154
- private readonly terminalRelocationCapacity = 4096,
155
- private readonly outboundCapacity = 4096,
149
+ private readonly terminalRelocationCapacity: number = DEFAULT_TERMINAL_RELOCATION_CAPACITY,
156
150
  // Spec 06 — SessionRelocationSealTimeout bounds how long a session
157
151
  // relocation seal may hold ingress (default 3,000 ms, finite only).
158
152
  // Every wait on the seal (accept paths) and on active-frame drain
159
153
  // (the sealing side) must observe that bound; an unbounded wait here
160
154
  // turns a lost control or a lifecycle interlock into a silent stall
161
155
  // (spec 48:205 — transport/deadline limits apply during relocation).
162
- private readonly sealWaitTimeoutMs = 3_000,
156
+ private readonly sealWaitTimeoutMs: number = zlinkDefaultLocationOptions.sessionRelocationSealTimeoutMs,
163
157
  private readonly errorSink?: () =>
164
158
  { reportRuntimeTaskException(taskName: string, error: unknown): void } | undefined
165
159
  ) {
166
160
  if (!Number.isSafeInteger(terminalRelocationCapacity) || terminalRelocationCapacity <= 0) {
167
161
  throw new RangeError('Session relocation terminal capacity must be a positive safe integer.');
168
162
  }
169
- if (!Number.isSafeInteger(outboundCapacity) || outboundCapacity <= 0) {
170
- throw new RangeError('Session relocation outbound capacity must be a positive safe integer.');
171
- }
172
163
  if (!Number.isSafeInteger(sealWaitTimeoutMs) || sealWaitTimeoutMs <= 0) {
173
164
  throw new RangeError('Session relocation seal timeout must be a positive safe integer.');
174
165
  }
@@ -195,7 +186,7 @@ export class ZLinkActorSessionBindingRegistry<
195
186
  );
196
187
  }
197
188
 
198
- private async commitCore(
189
+ private commitCore(
199
190
  previous: ZLinkActorSessionRoute<TContext, TActor> | undefined,
200
191
  context: TContext,
201
192
  actor: TActor,
@@ -203,7 +194,7 @@ export class ZLinkActorSessionBindingRegistry<
203
194
  authorityFence?: ZLinkActorSessionAuthorityFence,
204
195
  sessionIdentity?: string,
205
196
  commitActor?: () => void
206
- ): Promise<void> {
197
+ ): void {
207
198
  const current = this.routes.get(actor.actorId);
208
199
  if (current !== previous) {
209
200
  throw createInternalFrameworkException(
@@ -239,7 +230,24 @@ export class ZLinkActorSessionBindingRegistry<
239
230
  }
240
231
 
241
232
  if (!sameBinding && actorSlot !== undefined) {
242
- 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
+ });
243
251
  }
244
252
  } catch (error) {
245
253
  context.unbindLocal(actor.actorId, bindingToken);
@@ -317,7 +325,7 @@ export class ZLinkActorSessionBindingRegistry<
317
325
  );
318
326
  }
319
327
 
320
- private async replaceAndReleaseSealCore(
328
+ private replaceAndReleaseSealCore(
321
329
  previous: ZLinkActorSessionRoute<TContext, TActor>,
322
330
  context: TContext,
323
331
  actor: TActor,
@@ -326,7 +334,7 @@ export class ZLinkActorSessionBindingRegistry<
326
334
  authorityFence?: ZLinkActorSessionAuthorityFence,
327
335
  sessionIdentity?: string,
328
336
  commitActor?: () => void
329
- ): Promise<void> {
337
+ ): void {
330
338
  if (previous.sealId !== sealId) {
331
339
  throw createInternalFrameworkException(
332
340
  ZLinkFrameworkInternalErrorKind.ActorLocationStale,
@@ -337,7 +345,7 @@ export class ZLinkActorSessionBindingRegistry<
337
345
  // JavaScript cannot interleave another ingress turn between these two
338
346
  // synchronous mutations. The replacement preserves the seal, then the
339
347
  // exact release publishes the route to held ingress as one owner turn.
340
- await this.commitCore(
348
+ this.commitCore(
341
349
  previous,
342
350
  context,
343
351
  actor,
@@ -367,6 +375,22 @@ export class ZLinkActorSessionBindingRegistry<
367
375
  return await this.lane.run(() => this.routeCore(actorId));
368
376
  }
369
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
+
370
394
  private routeCore(actorId: string): ZLinkActorSessionRoute<TContext, TActor> | undefined {
371
395
  return this.routes.get(actorId);
372
396
  }
@@ -399,15 +423,19 @@ export class ZLinkActorSessionBindingRegistry<
399
423
  bindingToken: string,
400
424
  termination = ZLinkActorSessionBindingTermination.BindingEnd
401
425
  ): Promise<void> {
402
- 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;
403
430
  }
404
431
 
405
- private async unbindCore(
432
+ /** Fixes the unbind order in the lane; the caller awaits transport completion outside it. */
433
+ private unbindCore(
406
434
  actorId: string,
407
435
  context: TContext,
408
436
  bindingToken: string,
409
437
  termination: ZLinkActorSessionBindingTermination
410
- ): Promise<void> {
438
+ ): Promise<void> | undefined {
411
439
  const route = this.routes.get(actorId);
412
440
  if (route === undefined || route.context !== context || route.bindingToken !== bindingToken) {
413
441
  return;
@@ -422,29 +450,29 @@ export class ZLinkActorSessionBindingRegistry<
422
450
  actorId,
423
451
  new Error(`Actor '${actorId}' session binding was removed while accepted frames were active.`)
424
452
  );
425
- this.clearRouteRelocation(
426
- actorId,
427
- route,
428
- new Error(`Actor '${actorId}' session binding was removed.`)
429
- );
453
+ this.clearRouteRelocation(actorId, route);
430
454
  if (
431
455
  termination === ZLinkActorSessionBindingTermination.BindingEnd &&
432
456
  route.actorSlot !== undefined
433
457
  ) {
434
- await context.actorSlotControls?.enqueueUnbound(route.actorSlot);
458
+ return context.actorSlotControls?.enqueueUnbound(route.actorSlot);
435
459
  }
460
+ return undefined;
436
461
  }
437
462
 
438
463
  async unbindActor(actorId: string): Promise<void> {
439
- await this.lane.run(() => this.unbindActorCore(actorId));
464
+ const { submission } = await this.lane.run(() => ({
465
+ submission: this.unbindActorCore(actorId)
466
+ }));
467
+ await submission;
440
468
  }
441
469
 
442
- private async unbindActorCore(actorId: string): Promise<void> {
470
+ private unbindActorCore(actorId: string): Promise<void> | undefined {
443
471
  const route = this.routes.get(actorId);
444
472
  if (route === undefined) {
445
- return;
473
+ return undefined;
446
474
  }
447
- await this.unbindCore(
475
+ return this.unbindCore(
448
476
  actorId,
449
477
  route.context,
450
478
  route.bindingToken,
@@ -456,10 +484,10 @@ export class ZLinkActorSessionBindingRegistry<
456
484
  await this.lane.run(() => this.cleanupCore(context));
457
485
  }
458
486
 
459
- private async cleanupCore(context: TContext): Promise<void> {
487
+ private cleanupCore(context: TContext): void {
460
488
  for (const route of [...this.routes.values()]) {
461
489
  if (route.context === context) {
462
- await this.unbindCore(
490
+ this.unbindCore(
463
491
  route.actor.actorId,
464
492
  context,
465
493
  route.bindingToken,
@@ -523,6 +551,37 @@ export class ZLinkActorSessionBindingRegistry<
523
551
  }
524
552
  }
525
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
+
526
585
  /**
527
586
  * Holds Session ingress accepted after a relocation seal until the target
528
587
  * route is published and the seal is released. The caller keeps the
@@ -698,6 +757,9 @@ export class ZLinkActorSessionBindingRegistry<
698
757
  );
699
758
  }
700
759
  route.sealId = sealId;
760
+ if (!this.relocations.has(actorId)) {
761
+ this.relocations.set(actorId, { actorId, seals: new Map(), ingress: [] });
762
+ }
701
763
  // A pre-seal REQUEST is captured as part of installing command 42. Its
702
764
  // Session frame no longer gates the seal; its single submission attempt
703
765
  // and terminal continue under the request admission state above.
@@ -770,13 +832,7 @@ export class ZLinkActorSessionBindingRegistry<
770
832
  resolveTerminal = resolve;
771
833
  });
772
834
  const ready = this.waitForActiveFramesCore(claim.actorId, signal);
773
- const actorQueue: ZLinkActorSessionRelocationQueue = queue ?? {
774
- actorId: claim.actorId,
775
- seals: new Map(),
776
- outbound: [],
777
- nextArrivalOrder: 1n,
778
- outboundCount: 0
779
- };
835
+ const actorQueue = this.relocations.get(claim.actorId)!;
780
836
  const state: ZLinkActorSessionRelocationState = {
781
837
  ...claim,
782
838
  phase: 'sealed',
@@ -804,93 +860,6 @@ export class ZLinkActorSessionBindingRegistry<
804
860
  return this.relocations.get(actorId)?.seals.get(sealId);
805
861
  }
806
862
 
807
- async retainRelocationOutbound(
808
- actorId: string,
809
- operation: ZLinkActorSessionRetainedOutbound,
810
- sealId?: string
811
- ): Promise<ServiceSessionBindingAdmissionResult> {
812
- return await this.lane.run(() =>
813
- this.retainRelocationOutboundCorePublic(actorId, operation, sealId)
814
- );
815
- }
816
-
817
- private retainRelocationOutboundCorePublic(
818
- actorId: string,
819
- operation: ZLinkActorSessionRetainedOutbound,
820
- sealId?: string
821
- ): ServiceSessionBindingAdmissionResult {
822
- if (sealId !== undefined) {
823
- const queue = this.relocations.get(actorId);
824
- const state = queue?.seals.get(sealId);
825
- if (
826
- queue === undefined ||
827
- state === undefined ||
828
- (queue.activeSealId !== sealId &&
829
- !(queue.activeSealId === undefined && state.phase === 'terminal'))
830
- ) {
831
- failRetainedOutbound(
832
- operation,
833
- new Error(`Actor '${actorId}' Session outbound did not match its exact relocation seal.`)
834
- );
835
- return 'rejected';
836
- }
837
- }
838
- return this.retainRelocationOutboundCore(actorId, operation);
839
- }
840
-
841
- /**
842
- * Session–Actor binding §8.1: the Session owner holds a push only while the
843
- * binding's relocation seal is open, and keeps it behind earlier held pushes.
844
- * Whether the push names the current binding was decided once by the Session
845
- * owner's binding record before this call.
846
- */
847
- private retainRelocationOutboundCore(
848
- actorId: string,
849
- operation: ZLinkActorSessionRetainedOutbound
850
- ): ServiceSessionBindingAdmissionResult {
851
- const queue = this.relocations.get(actorId);
852
- const state =
853
- queue?.activeSealId === undefined ? undefined : queue.seals.get(queue.activeSealId);
854
- if (queue === undefined) return 'passThrough';
855
- if (state === undefined || state.phase === 'applied' || state.phase === 'terminal') {
856
- if (queue.drainPromise === undefined && queue.outbound.length === 0) return 'passThrough';
857
- if (!this.reserveOutbound(queue, operation)) return 'rejected';
858
- queue.outbound.push({
859
- operation,
860
- arrivalOrder: queue.nextArrivalOrder++,
861
- released: true,
862
- settled: false
863
- });
864
- this.startOutboundDrain(queue);
865
- return 'retained';
866
- }
867
- if (!this.reserveOutbound(queue, operation)) return 'rejected';
868
- queue.outbound.push({
869
- sealId: state.sealId,
870
- operation,
871
- arrivalOrder: queue.nextArrivalOrder++,
872
- released: false,
873
- settled: false
874
- });
875
- return 'retained';
876
- }
877
-
878
- async discardRelocationOutbound(actorId: string, sealId: string, error: unknown): Promise<void> {
879
- await this.lane.run(() => this.discardRelocationOutboundCore(actorId, sealId, error));
880
- }
881
-
882
- private discardRelocationOutboundCore(actorId: string, sealId: string, error: unknown): void {
883
- const queue = this.relocations.get(actorId);
884
- if (queue === undefined) return;
885
- for (let index = queue.outbound.length - 1; index >= 0; index--) {
886
- const entry = queue.outbound[index]!;
887
- if (entry.sealId !== sealId) continue;
888
- queue.outbound.splice(index, 1);
889
- this.failOutbound(queue, entry, error);
890
- }
891
- this.deleteEmptyRelocationQueue(queue);
892
- }
893
-
894
863
  async applyRelocation(
895
864
  actorId: string,
896
865
  sealId: string,
@@ -924,13 +893,11 @@ export class ZLinkActorSessionBindingRegistry<
924
893
  sealId: string,
925
894
  applyFingerprint: string
926
895
  ): {
927
- readonly queue: ZLinkActorSessionRelocationQueue;
928
896
  readonly state: ZLinkActorSessionRelocationState;
929
897
  readonly applyPromise?: Promise<void>;
930
898
  readonly promise?: Promise<void>;
931
899
  readonly resolve?: () => void;
932
900
  readonly reject?: (error: unknown) => void;
933
- readonly sealId?: string;
934
901
  } {
935
902
  const queue = this.relocations.get(actorId);
936
903
  const state = queue?.seals.get(sealId);
@@ -949,7 +916,7 @@ export class ZLinkActorSessionBindingRegistry<
949
916
  true
950
917
  );
951
918
  }
952
- return { queue, state, applyPromise: state.applyPromise };
919
+ return { state, applyPromise: state.applyPromise };
953
920
  }
954
921
 
955
922
  state.phase = 'applying';
@@ -962,31 +929,17 @@ export class ZLinkActorSessionBindingRegistry<
962
929
  });
963
930
  state.applyPromise = promise;
964
931
  return {
965
- queue,
966
932
  state,
967
933
  promise,
968
934
  resolve,
969
- reject,
970
- sealId
935
+ reject
971
936
  };
972
937
  }
973
938
 
974
- /**
975
- * Command 44 commit or abort releases every push held under this seal in
976
- * arrival order (Session–Actor binding §8.1). The held pushes were admitted
977
- * by the current binding; the route change does not judge them again.
978
- */
979
939
  private completeRelocationApply(prepared: {
980
- readonly queue: ZLinkActorSessionRelocationQueue;
981
940
  readonly state: ZLinkActorSessionRelocationState;
982
- readonly sealId?: string;
983
941
  }): void {
984
- const { queue, state, sealId } = prepared;
985
- for (const entry of queue.outbound) {
986
- if (entry.sealId === sealId) entry.released = true;
987
- }
988
- this.startOutboundDrain(queue);
989
- state.phase = 'applied';
942
+ prepared.state.phase = 'applied';
990
943
  }
991
944
 
992
945
  private failRelocationApply(prepared: {
@@ -1038,7 +991,7 @@ export class ZLinkActorSessionBindingRegistry<
1038
991
 
1039
992
  /**
1040
993
  * Actor-wide relocation teardown: every seal (active and terminal-retained)
1041
- * and every held outbound entry for `actorId` is discarded unconditionally.
994
+ * for `actorId` is discarded unconditionally.
1042
995
  * Reserved for paths where the Actor itself is gone or being torn down
1043
996
  * (destroy, ownership clear, relocation-seal expiry/failure) — never for a
1044
997
  * single physical route's disconnect, which must not disturb a relocation
@@ -1051,8 +1004,18 @@ export class ZLinkActorSessionBindingRegistry<
1051
1004
  private clearRelocationCore(actorId: string, error: unknown): void {
1052
1005
  const queue = this.relocations.get(actorId);
1053
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
+ );
1054
1018
  this.relocations.delete(actorId);
1055
- for (const entry of queue.outbound.splice(0)) this.failOutbound(queue, entry, error);
1056
1019
  for (const state of queue.seals.values()) {
1057
1020
  this.terminalRelocations.delete(state);
1058
1021
  if (state.phase !== 'terminal') state.resolveTerminal();
@@ -1063,7 +1026,7 @@ export class ZLinkActorSessionBindingRegistry<
1063
1026
  * Spec 48 §137: a relocation seal's lifecycle is independent of any single
1064
1027
  * physical route's binding. Unbinding one physical route (a disconnect)
1065
1028
  * must retire only the still-open (nonterminal) relocation seal that this
1066
- * exact route's Session owns, and the outbound held against that seal — it
1029
+ * exact route's Session owns — it
1067
1030
  * must never reach into a seal that has already reached 'terminal' (its
1068
1031
  * bounded retention exists precisely so a late same-seal relay can still
1069
1032
  * pass on a successor route) nor into a different Session's active seal
@@ -1072,8 +1035,7 @@ export class ZLinkActorSessionBindingRegistry<
1072
1035
  */
1073
1036
  private clearRouteRelocation(
1074
1037
  actorId: string,
1075
- route: ZLinkActorSessionRoute<TContext, TActor>,
1076
- error: unknown
1038
+ route: ZLinkActorSessionRoute<TContext, TActor>
1077
1039
  ): void {
1078
1040
  const queue = this.relocations.get(actorId);
1079
1041
  if (queue === undefined) return;
@@ -1089,12 +1051,6 @@ export class ZLinkActorSessionBindingRegistry<
1089
1051
  this.deleteEmptyRelocationQueue(queue);
1090
1052
  return;
1091
1053
  }
1092
- for (let index = queue.outbound.length - 1; index >= 0; index--) {
1093
- const entry = queue.outbound[index]!;
1094
- if (entry.sealId !== activeSealId) continue;
1095
- queue.outbound.splice(index, 1);
1096
- this.failOutbound(queue, entry, error);
1097
- }
1098
1054
  queue.activeSealId = undefined;
1099
1055
  queue.seals.delete(activeSealId!);
1100
1056
  this.terminalRelocations.delete(activeState);
@@ -1303,90 +1259,6 @@ export class ZLinkActorSessionBindingRegistry<
1303
1259
  for (const waiter of waiters) waiter.reject(error);
1304
1260
  }
1305
1261
 
1306
- private startOutboundDrain(queue: ZLinkActorSessionRelocationQueue): void {
1307
- if (queue.drainPromise !== undefined) return;
1308
- const drain = startOutsideStateLane(async () => {
1309
- for (;;) {
1310
- const entry = await this.lane.run(() => {
1311
- const current = queue.outbound.at(0);
1312
- if (current === undefined || !current.released) return undefined;
1313
- if (current.settled) {
1314
- queue.outbound.shift();
1315
- return null;
1316
- }
1317
- return current;
1318
- });
1319
- if (entry === undefined) return;
1320
- if (entry === null) continue;
1321
- try {
1322
- const delivered = await entry.operation.deliver();
1323
- await this.lane.run(() => {
1324
- if (delivered) this.settleOutbound(queue, entry);
1325
- else
1326
- this.failOutbound(
1327
- queue,
1328
- entry,
1329
- new Error(
1330
- `Actor '${queue.actorId}' retained Session outbound delivery was rejected.`
1331
- )
1332
- );
1333
- if (queue.outbound[0] === entry) queue.outbound.shift();
1334
- });
1335
- } catch (error) {
1336
- await this.lane.run(() => {
1337
- this.failOutbound(queue, entry, error);
1338
- if (queue.outbound[0] === entry) queue.outbound.shift();
1339
- });
1340
- }
1341
- }
1342
- });
1343
- startOutsideStateLane(() => {
1344
- void drain.finally(
1345
- async () =>
1346
- await this.lane.run(() => {
1347
- if (queue.drainPromise === drain) queue.drainPromise = undefined;
1348
- if (queue.outbound[0]?.released === true) this.startOutboundDrain(queue);
1349
- else this.deleteEmptyRelocationQueue(queue);
1350
- })
1351
- );
1352
- });
1353
- queue.drainPromise = drain;
1354
- }
1355
-
1356
- private reserveOutbound(
1357
- queue: ZLinkActorSessionRelocationQueue,
1358
- operation: ZLinkActorSessionRetainedOutbound
1359
- ): boolean {
1360
- if (queue.outboundCount < this.outboundCapacity) {
1361
- queue.outboundCount++;
1362
- return true;
1363
- }
1364
- failRetainedOutbound(
1365
- operation,
1366
- new Error(`Actor '${queue.actorId}' Session relocation outbound capacity was exhausted.`)
1367
- );
1368
- return false;
1369
- }
1370
-
1371
- private settleOutbound(
1372
- queue: ZLinkActorSessionRelocationQueue,
1373
- entry: ZLinkActorSessionOutboundEntry
1374
- ): void {
1375
- if (entry.settled) return;
1376
- entry.settled = true;
1377
- queue.outboundCount--;
1378
- }
1379
-
1380
- private failOutbound(
1381
- queue: ZLinkActorSessionRelocationQueue,
1382
- entry: ZLinkActorSessionOutboundEntry,
1383
- error: unknown
1384
- ): void {
1385
- if (entry.settled) return;
1386
- this.settleOutbound(queue, entry);
1387
- failRetainedOutbound(entry.operation, error);
1388
- }
1389
-
1390
1262
  private rememberTerminalRelocation(state: ZLinkActorSessionRelocationState): void {
1391
1263
  this.terminalRelocations.delete(state);
1392
1264
  this.terminalRelocations.set(state, true);
@@ -1407,27 +1279,74 @@ export class ZLinkActorSessionBindingRegistry<
1407
1279
  if (
1408
1280
  queue.activeSealId === undefined &&
1409
1281
  queue.seals.size === 0 &&
1410
- queue.outbound.length === 0 &&
1411
- queue.drainPromise === undefined &&
1282
+ queue.ingress.length === 0 &&
1283
+ queue.ingressDrain === undefined &&
1412
1284
  this.relocations.get(queue.actorId) === queue
1413
1285
  ) {
1414
1286
  this.relocations.delete(queue.actorId);
1415
1287
  }
1416
1288
  }
1417
1289
 
1418
- 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
+ }
1419
1298
  const waiters = this.sealWaiters.get(actorId);
1420
1299
  if (waiters === undefined) return;
1421
1300
  this.sealWaiters.delete(actorId);
1422
1301
  for (const waiter of waiters) waiter.resolve();
1423
1302
  }
1424
1303
 
1425
- 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
+ }
1426
1313
  const waiters = this.sealWaiters.get(actorId);
1427
1314
  if (waiters === undefined) return;
1428
1315
  this.sealWaiters.delete(actorId);
1429
1316
  for (const waiter of waiters) waiter.reject(error);
1430
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
+ }
1431
1350
  }
1432
1351
 
1433
1352
  function assertRelocationClaim(
@@ -1453,15 +1372,6 @@ function startOutsideStateLane<T>(work: () => T): T {
1453
1372
  return detachedStateLaneResource.runInAsyncScope(work);
1454
1373
  }
1455
1374
 
1456
- function failRetainedOutbound(operation: ZLinkActorSessionRetainedOutbound, error: unknown): void {
1457
- try {
1458
- operation.fail(error);
1459
- } catch {
1460
- // The aggregate has already removed the entry. A failure observer cannot
1461
- // retain or settle the same delivery a second time.
1462
- }
1463
- }
1464
-
1465
1375
  function assertSuccessorSessionIdentity(
1466
1376
  predecessor: ZLinkActorSessionRelocationState,
1467
1377
  successor: ZLinkActorSessionRelocationClaim