@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,72 +1,72 @@
1
- import { createHash, randomUUID } from 'node:crypto';
2
- import type {
3
- ActorRef,
4
- RoutingId,
5
- ZLinkActor,
6
- ZLinkActorJoinOperationId,
1
+ import { createHash } from 'node:crypto';
2
+ import {
3
+ type ActorRef,
4
+ type RoutingId,
5
+ type ZLinkActor,
6
+ type ZLinkActorJoinOperationId,
7
+ type ZLinkMessageSerializer,
8
+ type ZLinkSpot,
9
+ ZLinkEncodedPayload,
7
10
  ZLinkMessage,
8
- ZLinkMessageSerializer,
9
- ZLinkRelocationStore,
10
- ZLinkSpot
11
+ ZLinkSpotKind
11
12
  } from '../../contracts';
12
- import { ZLinkSpotKind } from '../../contracts';
13
- import type {
14
- ZLinkAggregateId,
15
- ZLinkAuthoritySnapshot,
16
- ZLinkLocationOwnerToken
17
- } from '../locations/internal-location-contracts';
18
- import type {
19
- ZLinkAuthorityStore,
20
- ZLinkObjectCreationStore,
21
- ZLinkOwnerLeaseStore
22
- } from '../locations/internal-store-contracts';
23
- import { encodeAuthorityKey } from '../locations/authority-key-codec';
13
+
24
14
  import type { Message } from '../../contracts/Common/Message';
25
- import type { ZLinkBackendActorRef, ZLinkBackendMeshNode } from '../backend';
26
15
  import {
16
+ createDeferredJoinCompletion,
17
+ rewriteActorAuthorityRoute,
27
18
  toFrameworkActorRef,
28
- mergeRemoteBoundSessionTarget,
29
- preferredRemoteBoundSessionTarget,
30
19
  type ZLinkActorHandoffCoordinator,
31
20
  type ZLinkActorHandoffPrefixAdmission,
32
21
  type ZLinkActorHandoffPrefixQueue,
33
22
  type ZLinkActorHandoffReplayPreparation,
34
23
  type ZLinkActorRoutedJoinTransport,
35
24
  type ZLinkActorTransferRegistry,
36
- isDeferredJoinAcceptedRootPublication,
37
- ZLinkDeferredJoinAcceptedJournal,
38
- rewriteActorAuthorityRoute,
39
- type ZLinkDeferredJoinAcceptedRoot,
40
- type ZLinkDeferredJoinRootIdentity,
25
+ type ZLinkDeferredJoinCompletion,
41
26
  type ZLinkRemoteBoundSessionTarget
42
27
  } from '../actors';
43
- import type { ZLinkActorRuntimeState } from '../actors/actor-runtime-state';
44
- import { ZLinkActorRetryDelay } from '../actors/actor-retry-delay';
45
- import { encodeRoutingIdStorageHex, routingIdsEqual } from '../routing-id';
46
- import type { ZLinkLocationLifecycle } from '../locations';
47
- import { wrapFrameworkPayloadMessage } from '../messaging/payload-codec';
48
- import type { DefaultZLinkSpotManager } from '../spots';
49
- import type { ZLinkSpotRouteResolver, ZLinkSpotRouteTarget } from '../spots/spot-routing-internal';
50
28
  import type {
51
29
  ZLinkActorHandoffPacket,
52
30
  ZLinkActorHandoffResult,
53
31
  ZLinkActorHandoffTerminalAcceptance,
54
32
  ZLinkActorHandoffTerminalAck
55
33
  } from '../actors/actor-handoff';
56
- import type { ZLinkNativeActorJoinSnapshot } from '../spots/spot-runtime-ports';
57
34
  import {
58
35
  ownerFence,
59
36
  type ZLinkActorMessageFollowOwnerFence
60
37
  } from '../actors/actor-message-follow-context';
61
- import type {
62
- ServiceSessionRelocationRoute,
63
- ServiceSessionRelocationSeal,
64
- ServiceSessionRelocationSealed,
65
- ServiceWireOperationId
66
- } from '../foundation/service-stateful-wire-codec';
67
- import { serviceSessionRelocationIdentityKey } from '../foundation/service-stateful-wire-codec';
38
+ import type { ZLinkActorRuntimeState } from '../actors/actor-runtime-state';
39
+ import type { ZLinkBackendActorRef, ZLinkBackendMeshNode } from '../backend';
40
+ import { ZLinkBufferMessage as RuntimeMessage } from '../backend/runtime-message';
41
+ import { isRelocationDebugEnabled, relocationDebug } from '../diagnostics';
68
42
  import { operationIdentityKey } from '../foundation/operation-identity';
43
+ import {
44
+ type ServiceSessionRelocationRoute,
45
+ type ServiceSessionRelocationSeal,
46
+ type ServiceSessionRelocationSealed,
47
+ type ServiceWireOperationId,
48
+ serviceSessionRelocationIdentityKey
49
+ } from '../foundation/service-stateful-wire-codec';
50
+
51
+ import type { ZLinkLocationLifecycle } from '../locations';
52
+ import { encodeAuthorityKey } from '../locations/authority-key-codec';
53
+ import type {
54
+ ZLinkAggregateId,
55
+ ZLinkAuthoritySnapshot,
56
+ ZLinkLocationOwnerToken
57
+ } from '../locations/internal-location-contracts';
58
+ import type {
59
+ ZLinkAuthorityStore,
60
+ ZLinkObjectCreationStore,
61
+ ZLinkOwnerLeaseStore
62
+ } from '../locations/internal-store-contracts';
63
+ import { wrapFrameworkPayloadMessage } from '../messaging/payload-codec';
64
+ import { encodeRoutingIdStorageHex, routingIdsEqual } from '../routing-id';
65
+ import type { DefaultZLinkSpotManager } from '../spots';
66
+ import type { ZLinkSpotRouteResolver, ZLinkSpotRouteTarget } from '../spots/spot-routing-internal';
69
67
  import { BoundedReplayMap } from './bounded-replay-map';
68
+ const TRANSFER_RESOLUTION_TIMEOUT_MS = 5_000;
69
+ const TRANSFER_POLL_INTERVAL_MS = 10;
70
70
 
71
71
  const DEFERRED_JOIN_TERMINAL_CAPACITY = 4096;
72
72
 
@@ -168,7 +168,7 @@ export interface ZLinkActorTransferRuntimeActorManager {
168
168
  actorType: string,
169
169
  objectGeneration: bigint,
170
170
  authorityOwnerGeneration: bigint,
171
- spotId: RoutingId,
171
+ spotId: RoutingId | undefined,
172
172
  spotGeneration: bigint,
173
173
  membershipEpoch: bigint,
174
174
  signal?: AbortSignal,
@@ -198,7 +198,6 @@ export interface ZLinkActorTransferRuntimeOptions {
198
198
  readonly authorityStore: () =>
199
199
  (ZLinkAuthorityStore & ZLinkObjectCreationStore & ZLinkOwnerLeaseStore) | undefined;
200
200
  readonly currentOwner: () => ZLinkLocationOwnerToken | undefined;
201
- readonly relocationStore: () => ZLinkRelocationStore | undefined;
202
201
  /** Live admitted peers of a mesh; used to stop retries against a gone session owner. */
203
202
  readonly liveDescriptors?: (
204
203
  meshName: string,
@@ -216,7 +215,6 @@ export interface ZLinkActorTransferRuntimeOptions {
216
215
  }
217
216
 
218
217
  export class ZLinkActorTransferRuntime {
219
- private readonly sourceDepartureTasks = new Map<string, Promise<void>>();
220
218
  private readonly coreSourceLeaves = new Map<
221
219
  string,
222
220
  {
@@ -229,43 +227,31 @@ export class ZLinkActorTransferRuntime {
229
227
  notifySubmitted?: () => Promise<void>;
230
228
  }
231
229
  >();
232
- private readonly activeDeferredJoinTerminals = new Map<
233
- string,
234
- Promise<ZLinkDeferredJoinAcceptedRoot>
235
- >();
236
- private readonly deferredJoinTerminals = new BoundedReplayMap<
237
- string,
238
- ZLinkDeferredJoinAcceptedRoot
239
- >(DEFERRED_JOIN_TERMINAL_CAPACITY);
230
+ // Spot Actor membership sections 4-5: Join completion idempotency is
231
+ // process-local. These maps end with the process; nothing is replayed.
232
+ private readonly activeDeferredJoinTerminals = new Map<string, Promise<void>>();
233
+ private readonly deferredJoinTerminals = new BoundedReplayMap<string, true>(
234
+ DEFERRED_JOIN_TERMINAL_CAPACITY
235
+ );
240
236
 
241
237
  constructor(private readonly options: ZLinkActorTransferRuntimeOptions) {}
242
238
 
243
- beginDeferredActorHandoff(
244
- actor: ZLinkActor,
245
- state: ZLinkActorRuntimeState,
246
- operationId: string
247
- ): void {
239
+ beginDeferredActorHandoff(actor: ZLinkActor, state: ZLinkActorRuntimeState): void {
248
240
  const actorId = actor.context.actorId;
249
241
  this.options.actorHandoff.beginProvisional(
250
242
  actorId,
251
- operationId,
252
243
  requireSourceObjectGeneration(actorId, state)
253
244
  );
254
245
  }
255
246
 
256
- promoteDeferredActorHandoff(
257
- actor: ZLinkActor,
258
- _state: ZLinkActorRuntimeState,
259
- operationId: string
260
- ): void {
261
- this.options.actorHandoff.promoteProvisional(actor.context.actorId, operationId);
247
+ promoteDeferredActorHandoff(actor: ZLinkActor, _state: ZLinkActorRuntimeState): void {
248
+ this.options.actorHandoff.promoteProvisional(actor.context.actorId);
262
249
  }
263
250
 
264
251
  async completeDeferredActorHandoff(
265
252
  actor: ZLinkActor,
266
253
  target: ZLinkSpotRouteTarget,
267
- _targetActorRef: ActorRef,
268
- operationId: string
254
+ _targetActorRef: ActorRef
269
255
  ): Promise<void> {
270
256
  const actorId = actor.context.actorId;
271
257
  if (!this.options.actorHandoff.isProvisional(actorId)) return;
@@ -275,7 +261,6 @@ export class ZLinkActorTransferRuntime {
275
261
  }
276
262
  const admitted = this.options.actorHandoff.admitDeferredPrefix(
277
263
  actorId,
278
- operationId,
279
264
  (drain) => manager.admitRoutedActorPacketPrefix(target.spotId, actorId, drain),
280
265
  this.options.prepareApplicationJob
281
266
  );
@@ -284,110 +269,70 @@ export class ZLinkActorTransferRuntime {
284
269
 
285
270
  async cancelDeferredActorHandoff(
286
271
  actor: ZLinkActor,
287
- _state: ZLinkActorRuntimeState,
288
- operationId: string
272
+ state: ZLinkActorRuntimeState
289
273
  ): Promise<void> {
290
- const admitted = this.admitDeferredSourcePrefix(actor, _state, operationId);
274
+ const admitted = this.admitDeferredSourcePrefix(actor, state);
291
275
  void this.observeHandoffReplay(admitted.terminal);
292
276
  }
293
277
 
294
- async prepareDeferredJoinAccepted(
278
+ prepareDeferredJoinAccepted(
295
279
  actorId: string,
296
280
  operationId: ZLinkActorJoinOperationId,
297
281
  actorRef: ActorRef,
298
282
  rawReply: Uint8Array,
299
- replyContentType?: string,
300
- signal?: AbortSignal,
301
- canonicalInventoryDigest?: string
302
- ): Promise<ZLinkDeferredJoinAcceptedRoot> {
303
- return await this.requireDeferredJoinJournal().prepare(
304
- actorId,
305
- operationId,
306
- actorRef,
307
- rawReply,
308
- replyContentType,
309
- signal,
310
- canonicalInventoryDigest
311
- );
312
- }
313
-
314
- async isDeferredJoinAcceptedRootPublication(
315
- reference: string,
316
- checksumCrc32c: number,
317
- expected: ZLinkDeferredJoinRootIdentity,
318
- signal?: AbortSignal
319
- ): Promise<boolean> {
320
- const relocation = this.options.relocationStore();
321
- return relocation === undefined
322
- ? false
323
- : await isDeferredJoinAcceptedRootPublication(
324
- relocation,
325
- reference,
326
- checksumCrc32c,
327
- expected,
328
- signal
329
- );
330
- }
331
-
332
- async discardDeferredJoinAccepted(
333
- root: ZLinkDeferredJoinAcceptedRoot,
334
- signal?: AbortSignal
335
- ): Promise<void> {
336
- await this.requireDeferredJoinJournal().discardPrepared(root, signal);
283
+ replyContentType?: string
284
+ ): ZLinkDeferredJoinCompletion {
285
+ return createDeferredJoinCompletion(actorId, operationId, actorRef, rawReply, replyContentType);
337
286
  }
338
287
 
339
- markDeferredJoinAcceptedCommitted(
340
- root: ZLinkDeferredJoinAcceptedRoot,
341
- actorRef: ActorRef,
342
- signal?: AbortSignal
343
- ): Promise<ZLinkDeferredJoinAcceptedRoot> {
344
- return this.requireDeferredJoinJournal().markCommitted(root, actorRef, signal);
345
- }
346
-
347
- async commitAndDeliverDeferredJoinAccepted(
348
- root: ZLinkDeferredJoinAcceptedRoot,
288
+ /**
289
+ * Runs the completion callback once in the target Actor mailbox.
290
+ * A repeated delivery of the same OperationId in this process observes the
291
+ * first terminal (completion idempotency only).
292
+ */
293
+ async deliverDeferredJoinCompletion(
294
+ completion: ZLinkDeferredJoinCompletion,
349
295
  actor: ZLinkActor,
350
296
  actorRef: ActorRef,
351
297
  submitMailbox: <T>(operation: () => Promise<T>) => Promise<T>,
352
298
  signal?: AbortSignal
353
- ): Promise<ZLinkDeferredJoinAcceptedRoot> {
354
- const terminalKey = deferredJoinTerminalKey(root);
355
- const terminal = this.deferredJoinTerminals.get(terminalKey);
356
- if (terminal !== undefined) {
299
+ ): Promise<void> {
300
+ const terminalKey = deferredJoinTerminalKey(completion);
301
+ if (this.deferredJoinTerminals.get(terminalKey) !== undefined) {
357
302
  this.deferredJoinTerminals.touch(terminalKey);
358
- return terminal;
303
+ return;
359
304
  }
360
305
  const active = this.activeDeferredJoinTerminals.get(terminalKey);
361
306
  if (active !== undefined) return await waitForOperation(active, signal);
362
- const completion = this.commitAndDeliverDeferredJoinAcceptedCore(
363
- root,
307
+ const delivery = this.deliverDeferredJoinCompletionCore(
308
+ completion,
364
309
  actor,
365
310
  actorRef,
366
311
  submitMailbox
367
312
  );
368
- this.activeDeferredJoinTerminals.set(terminalKey, completion);
369
- void completion.then(
370
- (completed) => {
371
- this.deferredJoinTerminals.remember(terminalKey, completed);
372
- if (this.activeDeferredJoinTerminals.get(terminalKey) === completion) {
313
+ this.activeDeferredJoinTerminals.set(terminalKey, delivery);
314
+ void delivery.then(
315
+ () => {
316
+ this.deferredJoinTerminals.remember(terminalKey, true);
317
+ if (this.activeDeferredJoinTerminals.get(terminalKey) === delivery) {
373
318
  this.activeDeferredJoinTerminals.delete(terminalKey);
374
319
  }
375
320
  },
376
321
  () => {
377
- if (this.activeDeferredJoinTerminals.get(terminalKey) === completion) {
322
+ if (this.activeDeferredJoinTerminals.get(terminalKey) === delivery) {
378
323
  this.activeDeferredJoinTerminals.delete(terminalKey);
379
324
  }
380
325
  }
381
326
  );
382
- return await waitForOperation(completion, signal);
327
+ return await waitForOperation(delivery, signal);
383
328
  }
384
329
 
385
- private async commitAndDeliverDeferredJoinAcceptedCore(
386
- root: ZLinkDeferredJoinAcceptedRoot,
330
+ private async deliverDeferredJoinCompletionCore(
331
+ completion: ZLinkDeferredJoinCompletion,
387
332
  actor: ZLinkActor,
388
333
  actorRef: ActorRef,
389
334
  submitMailbox: <T>(operation: () => Promise<T>) => Promise<T>
390
- ): Promise<ZLinkDeferredJoinAcceptedRoot> {
335
+ ): Promise<void> {
391
336
  const targetActorRef = this.options
392
337
  .actorManager()
393
338
  ?.getState(actor.context.actorId)?.nativeActorRef;
@@ -395,47 +340,43 @@ export class ZLinkActorTransferRuntime {
395
340
  targetActorRef === undefined
396
341
  ? actorRef
397
342
  : toFrameworkActorRef(targetActorRef, actor.context.meshName);
398
- let current =
399
- root.cursor === 'prepared'
400
- ? await this.requireDeferredJoinJournal().markCommitted(root, currentActorRef)
401
- : root;
402
- if (current.cursor === 'delivered') return current;
403
- let lastError: unknown;
404
- for (let attempt = 0; attempt < 3; attempt++) {
405
- try {
406
- current = await this.requireDeferredJoinJournal().deliver(
407
- current,
408
- actor,
409
- currentActorRef,
410
- submitMailbox
411
- );
412
- return current;
413
- } catch (error) {
414
- lastError = error;
415
- if (attempt < 2) {
416
- await new Promise<void>((resolve) => {
417
- const timer = setTimeout(resolve, 10 << attempt);
418
- timer.unref();
419
- });
420
- current =
421
- (await this.requireDeferredJoinJournal().recover(currentActorRef.actorId)) ?? current;
422
- }
423
- }
424
- }
425
- throw lastError;
426
- }
427
-
428
- private requireDeferredJoinJournal(): ZLinkDeferredJoinAcceptedJournal {
429
- const authority = this.options.authorityStore();
430
- const relocation = this.options.relocationStore();
431
- if (authority === undefined || relocation === undefined) {
432
- throw new Error('Cross-node deferred Actor Join requires Location and Relocation Stores.');
343
+ if (
344
+ completion.actor.actorId !== currentActorRef.actorId ||
345
+ completion.actor.objectGeneration !== currentActorRef.objectGeneration
346
+ ) {
347
+ throw new Error(
348
+ 'Deferred Join completion generation fence is stale ' +
349
+ `(completion ${completion.actor.actorId}/${completion.actor.objectGeneration}, ` +
350
+ `actor ${currentActorRef.actorId}/${currentActorRef.objectGeneration}).`
351
+ );
433
352
  }
434
- return new ZLinkDeferredJoinAcceptedJournal(
435
- authority,
436
- relocation,
437
- this.options.messageSerializers
438
- );
353
+ await submitMailbox(async () => {
354
+ if (completion.status === 'failed') {
355
+ await actor.onJoinCompleted?.({
356
+ status: 'failed',
357
+ operationId: completion.operationId,
358
+ kind: completion.kind
359
+ });
360
+ return;
361
+ }
362
+ await actor.onJoinCompleted?.({
363
+ status: 'accepted',
364
+ operationId: completion.operationId,
365
+ actor: currentActorRef,
366
+ reply:
367
+ completion.rawReply.byteLength === 0
368
+ ? undefined
369
+ : completion.replyContentType === undefined
370
+ ? ZLinkMessage.fromEncoded(ZLinkEncodedPayload.from(completion.rawReply))
371
+ : wrapFrameworkPayloadMessage(
372
+ RuntimeMessage.from(completion.rawReply),
373
+ this.options.messageSerializers,
374
+ completion.replyContentType,
375
+ undefined,
376
+ 'reply'
377
+ )
378
+ });
379
+ });
439
380
  }
440
381
 
441
382
  private async prepareSourceActorLeave(
@@ -471,13 +412,10 @@ export class ZLinkActorTransferRuntime {
471
412
  private async beginSourceActorMove(
472
413
  actor: ZLinkActor,
473
414
  state: ZLinkActorRuntimeState,
474
- deferredOperationId?: string
415
+ deferredJoin = false
475
416
  ): Promise<void> {
476
- if (
477
- deferredOperationId !== undefined &&
478
- this.options.actorHandoff.isProvisional(actor.context.actorId)
479
- ) {
480
- this.promoteDeferredActorHandoff(actor, state, deferredOperationId);
417
+ if (deferredJoin && this.options.actorHandoff.isProvisional(actor.context.actorId)) {
418
+ this.promoteDeferredActorHandoff(actor, state);
481
419
  }
482
420
  state.beginMove();
483
421
  if (!this.options.actorHandoff.isActive(actor.context.actorId)) {
@@ -488,21 +426,25 @@ export class ZLinkActorTransferRuntime {
488
426
  }
489
427
  try {
490
428
  if (state.spotId !== undefined) {
491
- relocationDebug('source_actor_move.await_spot_transfer', {
492
- actorId: actor.context.actorId,
493
- spotId: String(state.spotId)
494
- });
429
+ if (isRelocationDebugEnabled()) {
430
+ relocationDebug('source_actor_move.await_spot_transfer', {
431
+ actorId: actor.context.actorId,
432
+ spotId: String(state.spotId)
433
+ });
434
+ }
495
435
  await this.options.spotManager()?.beginActorTransfer(state.spotId, actor.context.actorId);
496
- relocationDebug('source_actor_move.spot_transfer_complete', {
497
- actorId: actor.context.actorId,
498
- spotId: String(state.spotId)
499
- });
436
+ if (isRelocationDebugEnabled()) {
437
+ relocationDebug('source_actor_move.spot_transfer_complete', {
438
+ actorId: actor.context.actorId,
439
+ spotId: String(state.spotId)
440
+ });
441
+ }
500
442
  }
501
443
  } catch (error) {
502
- if (deferredOperationId === undefined) {
444
+ if (!deferredJoin) {
503
445
  this.options.actorHandoff.cancel(actor.context.actorId);
504
446
  } else {
505
- const admitted = this.admitDeferredSourcePrefix(actor, state, deferredOperationId);
447
+ const admitted = this.admitDeferredSourcePrefix(actor, state);
506
448
  void this.observeHandoffReplay(admitted.terminal);
507
449
  }
508
450
  state.endMove();
@@ -513,7 +455,7 @@ export class ZLinkActorTransferRuntime {
513
455
  private async cancelSourceActorMove(
514
456
  actor: ZLinkActor,
515
457
  state: ZLinkActorRuntimeState,
516
- deferredOperationId?: string,
458
+ deferredJoin = false,
517
459
  replayStart: Promise<void> = Promise.resolve()
518
460
  ): Promise<void> {
519
461
  try {
@@ -522,16 +464,11 @@ export class ZLinkActorTransferRuntime {
522
464
  }
523
465
  } finally {
524
466
  try {
525
- if (deferredOperationId === undefined) {
467
+ if (!deferredJoin) {
526
468
  const admitted = this.admitCanceledSourcePrefix(actor, state, replayStart);
527
469
  void this.observeHandoffReplay(admitted.terminal);
528
470
  } else {
529
- const admitted = this.admitDeferredSourcePrefix(
530
- actor,
531
- state,
532
- deferredOperationId,
533
- replayStart
534
- );
471
+ const admitted = this.admitDeferredSourcePrefix(actor, state, replayStart);
535
472
  void this.observeHandoffReplay(admitted.terminal);
536
473
  }
537
474
  } finally {
@@ -564,7 +501,6 @@ export class ZLinkActorTransferRuntime {
564
501
  private admitDeferredSourcePrefix(
565
502
  actor: ZLinkActor,
566
503
  state: ZLinkActorRuntimeState,
567
- operationId: string,
568
504
  replayStart: Promise<void> = Promise.resolve()
569
505
  ): ZLinkActorHandoffPrefixAdmission {
570
506
  const queue = this.sourceHandoffPrefixQueue(actor, state);
@@ -574,7 +510,6 @@ export class ZLinkActorTransferRuntime {
574
510
  }
575
511
  return this.options.actorHandoff.admitDeferredPrefix(
576
512
  actor.context.actorId,
577
- operationId,
578
513
  queue,
579
514
  this.options.prepareApplicationJob,
580
515
  replayStart
@@ -614,10 +549,10 @@ export class ZLinkActorTransferRuntime {
614
549
  state: ZLinkActorRuntimeState,
615
550
  signal?: AbortSignal,
616
551
  lifecycleAuthority: 'framework' | 'core' = 'framework',
617
- deferredOperationId?: string,
552
+ deferredJoin = false,
618
553
  relocation?: ServiceWireOperationId
619
554
  ) {
620
- await this.beginSourceActorMove(actor, state, deferredOperationId);
555
+ await this.beginSourceActorMove(actor, state, deferredJoin);
621
556
  const relocationMetric =
622
557
  state.meshName === undefined
623
558
  ? undefined
@@ -628,12 +563,12 @@ export class ZLinkActorTransferRuntime {
628
563
  );
629
564
  const sourceSpotId = state.spotId;
630
565
  let sourceLeaveStarted = false;
631
- let sealId: string | undefined;
566
+ // The relocation operation owns its Session seal; the Actor keeps only
567
+ // its current binding (Session–Actor binding §8.1).
568
+ let sealedSession: ZLinkRemoteBoundSessionTarget | undefined;
632
569
  try {
633
- if (state.remoteBoundSessionTarget !== undefined) {
634
- sealId = randomUUID();
635
- const sealedTarget = await this.sealBoundSessionRoute(actor, state, signal, relocation);
636
- state.setRemoteBoundSessionTarget(sealedTarget);
570
+ if (state.boundSession !== undefined) {
571
+ sealedSession = await this.sealBoundSessionRoute(actor, state, signal, relocation);
637
572
  this.options.actorHandoff.sealConnectionBoundIngress(actor.context.actorId);
638
573
  }
639
574
  const transfer = await this.options.actorTransferRegistry.transferOut(
@@ -746,8 +681,7 @@ export class ZLinkActorTransferRuntime {
746
681
  void sourceLeaveCompletion.then(
747
682
  () => this.scheduleSourceDeparture(actor, sourceSpotId, true),
748
683
  (error) => {
749
- this.options.reportPostCommitError?.(error);
750
- this.scheduleSourceDeparture(actor, sourceSpotId, true);
684
+ this.scheduleSourceDeparture(actor, sourceSpotId, true, [error]);
751
685
  }
752
686
  );
753
687
  } else {
@@ -762,10 +696,10 @@ export class ZLinkActorTransferRuntime {
762
696
  this.coreSourceLeaves.delete(actor.context.actorId);
763
697
  const replayGate = createHandoffReplayGate();
764
698
  try {
765
- await this.cancelSourceActorMove(actor, state, deferredOperationId, replayGate.start);
699
+ await this.cancelSourceActorMove(actor, state, deferredJoin, replayGate.start);
766
700
  await this.restoreSourceActor(actor, sourceSpotId);
767
- if (sealId !== undefined) {
768
- await this.observeBoundSessionSealAbort(actor, state);
701
+ if (sealedSession !== undefined) {
702
+ await this.observeBoundSessionSealAbort(actor, state, sealedSession);
769
703
  }
770
704
  } finally {
771
705
  replayGate.open();
@@ -776,10 +710,10 @@ export class ZLinkActorTransferRuntime {
776
710
  relocationMetric?.complete('failed');
777
711
  const replayGate = createHandoffReplayGate();
778
712
  try {
779
- await this.cancelSourceActorMove(actor, state, deferredOperationId, replayGate.start);
713
+ await this.cancelSourceActorMove(actor, state, deferredJoin, replayGate.start);
780
714
  if (sourceLeaveStarted) await this.restoreSourceActor(actor, sourceSpotId);
781
- if (sealId !== undefined) {
782
- await this.observeBoundSessionSealAbort(actor, state);
715
+ if (sealedSession !== undefined) {
716
+ await this.observeBoundSessionSealAbort(actor, state, sealedSession);
783
717
  }
784
718
  } catch (rollbackError) {
785
719
  throw new AggregateError(
@@ -810,11 +744,14 @@ export class ZLinkActorTransferRuntime {
810
744
  targetOwnerFence: ZLinkActorMessageFollowOwnerFence
811
745
  ): Promise<void>;
812
746
  rollback(): Promise<void>;
747
+ discard(reason: unknown): void;
813
748
  }> {
814
- relocationDebug('maintenance_session.begin', {
815
- actorId: actor.context.actorId,
816
- spotId: state.spotId === undefined ? undefined : String(state.spotId)
817
- });
749
+ if (isRelocationDebugEnabled()) {
750
+ relocationDebug('maintenance_session.begin', {
751
+ actorId: actor.context.actorId,
752
+ spotId: state.spotId === undefined ? undefined : String(state.spotId)
753
+ });
754
+ }
818
755
  if (manageMembership) {
819
756
  await this.beginSourceActorMove(actor, state);
820
757
  } else {
@@ -824,23 +761,22 @@ export class ZLinkActorTransferRuntime {
824
761
  requireSourceObjectGeneration(actor.context.actorId, state)
825
762
  );
826
763
  }
827
- relocationDebug('maintenance_session.source_move_complete', {
828
- actorId: actor.context.actorId
829
- });
830
- let sealId: string | undefined;
764
+ if (isRelocationDebugEnabled()) {
765
+ relocationDebug('maintenance_session.source_move_complete', {
766
+ actorId: actor.context.actorId
767
+ });
768
+ }
769
+ let sealedSession: ZLinkRemoteBoundSessionTarget | undefined;
831
770
  try {
832
- if (state.remoteBoundSessionTarget !== undefined) {
833
- sealId = randomUUID();
834
- state.setRemoteBoundSessionTarget(
835
- await this.sealBoundSessionRoute(actor, state, signal, relocation)
836
- );
771
+ if (state.boundSession !== undefined) {
772
+ sealedSession = await this.sealBoundSessionRoute(actor, state, signal, relocation);
837
773
  this.options.actorHandoff.sealConnectionBoundIngress(actor.context.actorId);
838
774
  }
839
775
  const handoffBacklog = this.options.actorHandoff.snapshot(actor.context.actorId);
840
776
  let terminal: 'prepared' | 'committed' | 'rolledBack' = 'prepared';
841
777
  let replayResults: readonly import('../actors').ZLinkActorHandoffResult[] = [];
842
778
  return {
843
- target: state.remoteBoundSessionTarget,
779
+ target: sealedSession,
844
780
  handoffBacklog,
845
781
  takeRelocationRelay: () =>
846
782
  this.options.actorHandoff.takeRelocationRelay(actor.context.actorId),
@@ -848,8 +784,10 @@ export class ZLinkActorTransferRuntime {
848
784
  if (terminal === 'prepared') replayResults = [...results];
849
785
  },
850
786
  commit: async (target, targetActorRef, targetOwnerFence) => {
851
- if (terminal === 'rolledBack') return;
852
- if (terminal === 'prepared') {
787
+ if (terminal !== 'prepared') return;
788
+ terminal = 'committed';
789
+ const failures: unknown[] = [];
790
+ try {
853
791
  this.options.actorHandoff.complete(
854
792
  actor.context.actorId,
855
793
  target,
@@ -857,15 +795,34 @@ export class ZLinkActorTransferRuntime {
857
795
  replayResults,
858
796
  targetOwnerFence
859
797
  );
798
+ } catch (error) {
799
+ failures.push(error);
800
+ }
801
+ try {
860
802
  if (manageMembership && state.spotId !== undefined) {
861
803
  await this.options
862
804
  .spotManager()
863
805
  ?.commitActorLeaveAfterTransfer(state.spotId, actor.context.actorId);
864
806
  }
807
+ } catch (error) {
808
+ failures.push(error);
809
+ }
810
+ try {
865
811
  state.endMove();
866
- terminal = 'committed';
812
+ } catch (error) {
813
+ failures.push(error);
814
+ }
815
+ if (failures.length > 0) {
816
+ throw failures.length === 1
817
+ ? failures[0]
818
+ : new AggregateError(failures, 'Actor source retirement failed.');
867
819
  }
868
820
  },
821
+ discard: (reason) => {
822
+ if (terminal !== 'prepared') return;
823
+ terminal = 'rolledBack';
824
+ this.options.actorHandoff.failPending(actor.context.actorId, reason);
825
+ },
869
826
  rollback: async () => {
870
827
  if (terminal !== 'prepared') return;
871
828
  terminal = 'rolledBack';
@@ -881,8 +838,8 @@ export class ZLinkActorTransferRuntime {
881
838
  state.endMove();
882
839
  }
883
840
  }
884
- if (sealId !== undefined) {
885
- await this.observeBoundSessionSealAbort(actor, state);
841
+ if (sealedSession !== undefined) {
842
+ await this.observeBoundSessionSealAbort(actor, state, sealedSession);
886
843
  }
887
844
  } finally {
888
845
  replayGate.open();
@@ -910,8 +867,8 @@ export class ZLinkActorTransferRuntime {
910
867
  state.endMove();
911
868
  }
912
869
  }
913
- if (sourceRestored && sealId !== undefined) {
914
- await this.observeBoundSessionSealAbort(actor, state);
870
+ if (sourceRestored && sealedSession !== undefined) {
871
+ await this.observeBoundSessionSealAbort(actor, state, sealedSession);
915
872
  }
916
873
  } finally {
917
874
  replayGate.open();
@@ -1000,7 +957,7 @@ export class ZLinkActorTransferRuntime {
1000
957
  signal?: AbortSignal,
1001
958
  relocation?: ServiceWireOperationId
1002
959
  ): Promise<ZLinkRemoteBoundSessionTarget> {
1003
- const target = state.remoteBoundSessionTarget;
960
+ const target = state.boundSession;
1004
961
  const actorRef = state.nativeActorRef;
1005
962
  if (
1006
963
  target === undefined ||
@@ -1101,17 +1058,10 @@ export class ZLinkActorTransferRuntime {
1101
1058
  private async abortBoundSessionRouteSeal(
1102
1059
  actor: ZLinkActor,
1103
1060
  state: ZLinkActorRuntimeState,
1104
- targetOverride?: ZLinkRemoteBoundSessionTarget
1061
+ target: ZLinkRemoteBoundSessionTarget
1105
1062
  ): Promise<void> {
1106
- const target =
1107
- targetOverride ??
1108
- preferredRemoteBoundSessionTarget(
1109
- state.remoteBoundSessionTarget,
1110
- state.boundSessionTransferTarget
1111
- );
1112
1063
  const actorRef = state.nativeActorRef;
1113
1064
  if (
1114
- target === undefined ||
1115
1065
  actorRef === undefined ||
1116
1066
  target.bindingGeneration === undefined ||
1117
1067
  target.previousAuthorityOwnerGeneration === undefined ||
@@ -1158,10 +1108,11 @@ export class ZLinkActorTransferRuntime {
1158
1108
 
1159
1109
  private async observeBoundSessionSealAbort(
1160
1110
  actor: ZLinkActor,
1161
- state: ZLinkActorRuntimeState
1111
+ state: ZLinkActorRuntimeState,
1112
+ sealedSession: ZLinkRemoteBoundSessionTarget
1162
1113
  ): Promise<void> {
1163
1114
  try {
1164
- await this.abortBoundSessionRouteSeal(actor, state);
1115
+ await this.abortBoundSessionRouteSeal(actor, state, sealedSession);
1165
1116
  } catch (error) {
1166
1117
  try {
1167
1118
  this.options.reportPostCommitError?.(error);
@@ -1203,49 +1154,58 @@ export class ZLinkActorTransferRuntime {
1203
1154
  private scheduleSourceDeparture(
1204
1155
  actor: ZLinkActor,
1205
1156
  sourceSpotId: RoutingId | undefined,
1206
- releaseLocation: boolean
1157
+ releaseLocation: boolean,
1158
+ failures: unknown[] = []
1207
1159
  ): void {
1208
- if (this.sourceDepartureTasks.has(actor.context.actorId)) return;
1209
- const task = this.finishSourceDeparture(actor, sourceSpotId, releaseLocation).finally(() =>
1210
- this.sourceDepartureTasks.delete(actor.context.actorId)
1211
- );
1212
- this.sourceDepartureTasks.set(actor.context.actorId, task);
1160
+ void this.finishSourceDeparture(actor, sourceSpotId, releaseLocation, failures);
1213
1161
  }
1214
1162
 
1215
1163
  private async finishSourceDeparture(
1216
1164
  actor: ZLinkActor,
1217
1165
  sourceSpotId: RoutingId | undefined,
1218
- releaseLocation: boolean
1166
+ releaseLocation: boolean,
1167
+ failures: unknown[]
1219
1168
  ): Promise<void> {
1220
- const retry = new ZLinkActorRetryDelay();
1221
- while (this.options.shutdownSignal?.()?.aborted !== true) {
1169
+ if (sourceSpotId !== undefined) {
1170
+ try {
1171
+ await this.options
1172
+ .spotManager()
1173
+ ?.commitActorLeaveAfterTransfer(sourceSpotId, actor.context.actorId);
1174
+ } catch (error) {
1175
+ failures.push(error);
1176
+ }
1177
+ }
1178
+ if (releaseLocation) {
1222
1179
  try {
1223
- if (sourceSpotId !== undefined) {
1180
+ const state = this.options.actorManager()?.getState(actor.context.actorId);
1181
+ if (state?.actorType !== undefined && state.ownsLocation) {
1224
1182
  await this.options
1225
- .spotManager()
1226
- ?.commitActorLeaveAfterTransfer(sourceSpotId, actor.context.actorId);
1183
+ .locationLifecycle()
1184
+ ?.releaseActor(state.actorType, actor.context.actorId);
1185
+ state.markLocationReleased();
1227
1186
  }
1228
- if (releaseLocation) {
1229
- const state = this.options.actorManager()?.getState(actor.context.actorId);
1230
- if (state?.actorType !== undefined && state.ownsLocation) {
1231
- await this.options
1232
- .locationLifecycle()
1233
- ?.releaseActor(state.actorType, actor.context.actorId);
1234
- state.markLocationReleased();
1235
- }
1236
- // Message Follow owns the bounded stale route after the native leave.
1237
- // The source Actor shell must therefore be removed from the process
1238
- // registry so a later relocation can materialize the same Actor ID on
1239
- // this node without colliding with its previous incarnation.
1240
- await this.options.actorManager()?.completeCoreRelocationSource(actor.context.actorId);
1241
- }
1242
- this.options.onSourceDepartureCompleted?.(actor.context.actorId);
1243
- return;
1244
1187
  } catch (error) {
1245
- this.options.reportPostCommitError?.(error);
1246
- if (!(await retry.wait(this.options.shutdownSignal?.()))) return;
1188
+ failures.push(error);
1247
1189
  }
1248
1190
  }
1191
+ try {
1192
+ // Message Follow keeps its route separately from the retired application instance.
1193
+ await this.options.actorManager()?.completeCoreRelocationSource(actor.context.actorId);
1194
+ } catch (error) {
1195
+ failures.push(error);
1196
+ }
1197
+ try {
1198
+ this.options.onSourceDepartureCompleted?.(actor.context.actorId);
1199
+ } catch (error) {
1200
+ failures.push(error);
1201
+ }
1202
+ if (failures.length > 0) {
1203
+ this.options.reportPostCommitError?.(
1204
+ failures.length === 1
1205
+ ? failures[0]
1206
+ : new AggregateError(failures, 'Actor source retirement failed.')
1207
+ );
1208
+ }
1249
1209
  }
1250
1210
 
1251
1211
  async getOrCreateRoutedActor(
@@ -1277,7 +1237,9 @@ export class ZLinkActorTransferRuntime {
1277
1237
  }
1278
1238
  if (actorRef !== undefined) {
1279
1239
  state.setNativeActorRef(actorRef as unknown as ZLinkBackendActorRef);
1280
- state.setRemoteBoundSessionTarget(remoteBoundSessionTarget);
1240
+ if (remoteBoundSessionTarget !== undefined) {
1241
+ state.installBoundSessionBinding(remoteBoundSessionTarget);
1242
+ }
1281
1243
  return { actor, actorRef: actorRef as unknown as ZLinkBackendActorRef };
1282
1244
  }
1283
1245
  return { actor, actorRef: state.ensureNativeActorRef(this.options.primaryMeshNode()) };
@@ -1307,14 +1269,10 @@ export class ZLinkActorTransferRuntime {
1307
1269
  throw new Error(`Actor '${actorId}' transfer state was not created.`);
1308
1270
  }
1309
1271
  if (actorEntryNodeRid !== undefined) state.setEntryNodeRid(actorEntryNodeRid);
1310
- state.setBoundSessionTransferTarget(remoteBoundSessionTarget);
1272
+ // The relocation delivers the binding it carried; the target installs it
1273
+ // through the one install rule (Session–Actor binding §6, §8).
1311
1274
  if (remoteBoundSessionTarget !== undefined) {
1312
- state.setRemoteBoundSessionTarget(
1313
- mergeRemoteBoundSessionTarget(remoteBoundSessionTarget, state.remoteBoundSessionTarget)
1314
- );
1315
- }
1316
- if (remoteBoundSessionTarget?.bindingGeneration !== undefined) {
1317
- state.setBoundSessionBindingGeneration(remoteBoundSessionTarget.bindingGeneration);
1275
+ state.installBoundSessionBinding(remoteBoundSessionTarget);
1318
1276
  }
1319
1277
  return {
1320
1278
  actor: materialized.actor,
@@ -1492,29 +1450,11 @@ export class ZLinkActorTransferRuntime {
1492
1450
  }
1493
1451
  }
1494
1452
 
1495
- rememberRoutedActorTransferTarget(
1496
- actorId: string,
1497
- target: ZLinkRemoteBoundSessionTarget | undefined
1498
- ): void {
1499
- if (target === undefined) return;
1500
- const state = this.options.actorManager()?.getState(actorId);
1501
- if (state === undefined) {
1502
- return;
1503
- }
1504
- state.setBoundSessionTransferTarget(target);
1505
- state.setRemoteBoundSessionTarget(
1506
- mergeRemoteBoundSessionTarget(target, state.remoteBoundSessionTarget)
1507
- );
1508
- if (target.bindingGeneration !== undefined) {
1509
- state.setBoundSessionBindingGeneration(target.bindingGeneration);
1510
- }
1511
- }
1512
-
1513
1453
  commitRoutedActor(actor: ZLinkActor, spotId: RoutingId, spot: ZLinkSpot): void {
1514
1454
  const state = this.options.actorManager()?.getState(actor.context.actorId);
1515
1455
  state?.setJoinedSpot(spotId, spot);
1516
1456
  const actorRef = state?.nativeActorRef;
1517
- const binding = state?.boundSessionTransferTarget;
1457
+ const binding = state?.boundSession;
1518
1458
  if (
1519
1459
  actorRef !== undefined &&
1520
1460
  binding?.sessionNodeRid !== undefined &&
@@ -1582,7 +1522,7 @@ export class ZLinkActorTransferRuntime {
1582
1522
  `Actor '${actor.context.actorId}' Core location does not match the committed target SPOT.`
1583
1523
  );
1584
1524
  }
1585
- const deadline = performance.now() + 5_000;
1525
+ const deadline = performance.now() + TRANSFER_RESOLUTION_TIMEOUT_MS;
1586
1526
  const ownerNodeGeneration = node.status().lifecycleGeneration;
1587
1527
  if (ownerNodeGeneration <= 0n) {
1588
1528
  throw new Error(
@@ -1620,7 +1560,7 @@ export class ZLinkActorTransferRuntime {
1620
1560
  if (claim.status !== 'conflict' || performance.now() >= deadline) {
1621
1561
  break;
1622
1562
  }
1623
- await new Promise<void>((resolve) => setTimeout(resolve, 10));
1563
+ await new Promise<void>((resolve) => setTimeout(resolve, TRANSFER_POLL_INTERVAL_MS));
1624
1564
  }
1625
1565
  if (claim.status === 'conflict') {
1626
1566
  throw new Error(`Actor '${actor.context.actorId}' target location takeover was rejected.`);
@@ -1654,44 +1594,24 @@ export class ZLinkActorTransferRuntime {
1654
1594
  state.setRemoteActorPacketTarget(target);
1655
1595
  }
1656
1596
 
1657
- async claimNativeActorLocation(
1597
+ /**
1598
+ * Publishes the committed route of the Session seal that the relocation
1599
+ * operation carried to this target (command 44, Session–Actor binding §8.2).
1600
+ */
1601
+ async publishRoutedActorOwnership(
1658
1602
  actor: ZLinkActor,
1659
- spotId: RoutingId,
1660
- spotMeshName: string
1661
- ): Promise<ZLinkNativeActorJoinSnapshot> {
1662
- const state = this.options.actorManager()?.getState(actor.context.actorId);
1663
- const previousLocation = this.options
1664
- .locationLifecycle()
1665
- ?.actorLocationSnapshot(actor.context.actorId);
1666
- const snapshot = {
1667
- spotId: state?.spotId,
1668
- spot: state?.spot,
1669
- locationSpotId: previousLocation?.spotId,
1670
- spotMeshName: previousLocation?.meshName,
1671
- actorRef: previousLocation?.actorRef,
1672
- spotGeneration: previousLocation?.spotGeneration,
1673
- membershipEpoch: previousLocation?.membershipEpoch,
1674
- ownerNodeGeneration: previousLocation?.ownerNodeGeneration
1675
- };
1676
- await this.claimRoutedActorLocation(actor, spotId, spotMeshName);
1677
- return snapshot;
1678
- }
1679
-
1680
- async publishRoutedActorOwnership(actor: ZLinkActor): Promise<void> {
1603
+ sealedSession: ZLinkRemoteBoundSessionTarget | undefined
1604
+ ): Promise<void> {
1681
1605
  const state = this.options.actorManager()?.getState(actor.context.actorId);
1682
1606
  const actorRef = state?.nativeActorRef;
1683
1607
  const generation = state?.locationGeneration;
1684
1608
  if (state === undefined || actorRef === undefined || generation === undefined) return;
1685
- const boundSessionTarget = preferredRemoteBoundSessionTarget(
1686
- state.remoteBoundSessionTarget,
1687
- state.boundSessionTransferTarget
1688
- );
1689
- if (boundSessionTarget?.serviceWireRelocation === undefined) return;
1609
+ if (sealedSession?.serviceWireRelocation === undefined) return;
1690
1610
  await this.publishBoundSessionOwnership(
1691
1611
  actor.context.actorId,
1692
1612
  actorRef,
1693
1613
  generation,
1694
- boundSessionTarget,
1614
+ sealedSession,
1695
1615
  state.ownerLeaseGeneration
1696
1616
  );
1697
1617
  }
@@ -1703,73 +1623,6 @@ export class ZLinkActorTransferRuntime {
1703
1623
  this.options.clearRemoteActorPacketTarget(actor.context.actorId);
1704
1624
  }
1705
1625
 
1706
- async rollbackNativeActorJoin(
1707
- actor: ZLinkActor,
1708
- snapshot: ZLinkNativeActorJoinSnapshot
1709
- ): Promise<void> {
1710
- const state = this.options.actorManager()?.getState(actor.context.actorId);
1711
- const actorType = state?.actorType;
1712
- const lifecycle = this.options.locationLifecycle();
1713
- if (snapshot.spotId === undefined) state?.clearJoinedSpot();
1714
- else state?.setJoinedSpot(snapshot.spotId, snapshot.spot);
1715
- if (state?.ownsLocation !== true || actorType === undefined || lifecycle === undefined) return;
1716
- if (snapshot.spotId === undefined) {
1717
- if (
1718
- snapshot.locationSpotId === undefined ||
1719
- snapshot.spotGeneration === undefined ||
1720
- snapshot.membershipEpoch === undefined ||
1721
- snapshot.ownerNodeGeneration === undefined
1722
- ) {
1723
- throw new Error(
1724
- `Actor '${actor.context.actorId}' cannot restore its Entry SPOT location without its exact generation fields.`
1725
- );
1726
- }
1727
- await lifecycle.notifyActorLeftSpot(
1728
- actorType,
1729
- actor.context.actorId,
1730
- snapshot.locationSpotId,
1731
- snapshot.spotGeneration,
1732
- snapshot.membershipEpoch,
1733
- snapshot.ownerNodeGeneration
1734
- );
1735
- return;
1736
- }
1737
- if (snapshot.actorRef === undefined) {
1738
- throw new Error(
1739
- `Actor '${actor.context.actorId}' cannot restore its previous SPOT location without a native ref.`
1740
- );
1741
- }
1742
- if (
1743
- snapshot.spotMeshName === undefined ||
1744
- snapshot.spotGeneration === undefined ||
1745
- snapshot.membershipEpoch === undefined ||
1746
- snapshot.ownerNodeGeneration === undefined
1747
- ) {
1748
- throw new Error(
1749
- `Actor '${actor.context.actorId}' cannot restore its previous SPOT location without its exact generation fields.`
1750
- );
1751
- }
1752
- const restored = await lifecycle.takeoverActorJoinedSpot(
1753
- actorType,
1754
- actor.context.actorId,
1755
- snapshot.actorRef,
1756
- snapshot.spotMeshName,
1757
- snapshot.spotId,
1758
- snapshot.spotGeneration,
1759
- snapshot.membershipEpoch,
1760
- snapshot.ownerNodeGeneration,
1761
- async () => state.clearAfterDestroy()
1762
- );
1763
- if (restored.status === 'conflict') {
1764
- throw new Error(
1765
- `Actor '${actor.context.actorId}' previous SPOT location could not be restored.`
1766
- );
1767
- }
1768
- if (restored.generation !== undefined) state.setLocationGeneration(restored.generation);
1769
- if (restored.claimed !== undefined)
1770
- state.setOwnerLeaseGeneration(restored.claimed.leaseGeneration);
1771
- }
1772
-
1773
1626
  async rollbackRoutedActor(actor: ZLinkActor, signal?: AbortSignal): Promise<void> {
1774
1627
  const manager = this.options.actorManager();
1775
1628
  const state = manager?.getState(actor.context.actorId);
@@ -1782,7 +1635,6 @@ export class ZLinkActorTransferRuntime {
1782
1635
  state.markLocationReleased();
1783
1636
  } catch (error) {
1784
1637
  locationError = error;
1785
- void lifecycle.releaseActorEventually(actorType, actor.context.actorId);
1786
1638
  }
1787
1639
  }
1788
1640
  try {
@@ -1870,7 +1722,8 @@ export class ZLinkActorTransferRuntime {
1870
1722
  previousAuthorityOwnerGeneration: target.previousAuthorityOwnerGeneration,
1871
1723
  targetAuthorityOwnerGeneration: ownershipGeneration,
1872
1724
  targetNodeRid: String(actorRef.nodeRid),
1873
- targetNodeGeneration: authority.allocation.descriptorLifecycleGeneration
1725
+ targetNodeGeneration: authority.allocation.descriptorLifecycleGeneration,
1726
+ targetOwnerLeaseGeneration: authority.ownerLeaseGeneration
1874
1727
  }
1875
1728
  },
1876
1729
  this.options.shutdownSignal?.()
@@ -1880,15 +1733,10 @@ export class ZLinkActorTransferRuntime {
1880
1733
  }
1881
1734
  }
1882
1735
 
1883
- function relocationDebug(marker: string, detail: Record<string, unknown>): void {
1884
- if (process.env.ZLINK_DEBUG_FRAMEWORK_RELOCATION !== '1') return;
1885
- console.error('[zlink.runtime.relocation]', marker, detail);
1886
- }
1887
-
1888
- function deferredJoinTerminalKey(root: ZLinkDeferredJoinAcceptedRoot): string {
1736
+ function deferredJoinTerminalKey(completion: ZLinkDeferredJoinCompletion): string {
1889
1737
  return (
1890
- `${root.actor.actorId}:${root.actor.objectGeneration.toString()}:` +
1891
- operationIdentityKey(root.operationId)
1738
+ `${completion.actor.actorId}:${completion.actor.objectGeneration.toString()}:` +
1739
+ operationIdentityKey(completion.operationId)
1892
1740
  );
1893
1741
  }
1894
1742
 
@@ -1942,7 +1790,7 @@ async function waitForActorAuthorityRetry(
1942
1790
  throw new Error('Actor target authority deadline expired.', { cause });
1943
1791
  }
1944
1792
  await new Promise<void>((resolve, reject) => {
1945
- const timer = setTimeout(resolve, Math.min(10, remaining));
1793
+ const timer = setTimeout(resolve, Math.min(TRANSFER_POLL_INTERVAL_MS, remaining));
1946
1794
  timer.unref();
1947
1795
  const abort = () => {
1948
1796
  clearTimeout(timer);