@zlink-systems/framework 0.30.1 → 0.30.2

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 (340) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
  3. package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
  4. package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
  5. package/dist/contracts/Common/encoded-payload-storage.js +5 -2
  6. package/dist/contracts/Configuration/Builders.d.ts +1 -1
  7. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
  8. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
  9. package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
  10. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  11. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
  12. package/dist/contracts/Locations/Rows.d.ts +2 -0
  13. package/dist/contracts/Spots/Contracts.d.ts +4 -0
  14. package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
  15. package/dist/runtime/abort.d.ts +5 -0
  16. package/dist/runtime/abort.js +10 -0
  17. package/dist/runtime/actors/actor-authority-publication.js +3 -2
  18. package/dist/runtime/actors/actor-client.d.ts +0 -1
  19. package/dist/runtime/actors/actor-client.js +38 -45
  20. package/dist/runtime/actors/actor-context.d.ts +2 -0
  21. package/dist/runtime/actors/actor-context.js +46 -9
  22. package/dist/runtime/actors/actor-handoff.d.ts +7 -3
  23. package/dist/runtime/actors/actor-handoff.js +212 -88
  24. package/dist/runtime/actors/actor-join-relocation.d.ts +2 -0
  25. package/dist/runtime/actors/actor-local-native-join.js +4 -0
  26. package/dist/runtime/actors/actor-mailbox.js +27 -1
  27. package/dist/runtime/actors/actor-remote-joiner.js +3 -1
  28. package/dist/runtime/actors/actor-reply.d.ts +4 -0
  29. package/dist/runtime/actors/actor-reply.js +29 -0
  30. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
  31. package/dist/runtime/actors/actor-runtime-state.js +2 -20
  32. package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
  33. package/dist/runtime/actors/index.d.ts +6 -2
  34. package/dist/runtime/actors/index.js +37 -21
  35. package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
  36. package/dist/runtime/actors/session-disconnected-wire.js +48 -0
  37. package/dist/runtime/admission.d.ts +9 -1
  38. package/dist/runtime/admission.js +55 -32
  39. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +13 -0
  40. package/dist/runtime/application-jobs/application-job-queue-scope.js +27 -1
  41. package/dist/runtime/application-jobs/contracts.d.ts +2 -0
  42. package/dist/runtime/backend/contracts/index.d.ts +19 -3
  43. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
  44. package/dist/runtime/backend/mesh-completion-table.js +5 -0
  45. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +26 -2
  46. package/dist/runtime/backend/mesh-dispatch-pump.js +193 -107
  47. package/dist/runtime/backend/node/node-raw-binding-port.js +90 -58
  48. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +33 -8
  49. package/dist/runtime/backend/node/node-raw-mesh-backend.js +142 -143
  50. package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
  51. package/dist/runtime/backend/node/node-socket-backend-adapter.js +5 -5
  52. package/dist/runtime/channels/channel-clients.d.ts +1 -0
  53. package/dist/runtime/channels/channel-clients.js +20 -5
  54. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +22 -3
  55. package/dist/runtime/channels/channel-dispatch-pipeline.js +103 -57
  56. package/dist/runtime/channels/channel-dispatchers.d.ts +3 -2
  57. package/dist/runtime/channels/channel-dispatchers.js +44 -37
  58. package/dist/runtime/channels/channel-envelope.d.ts +1 -0
  59. package/dist/runtime/channels/channel-envelope.js +74 -31
  60. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
  61. package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
  62. package/dist/runtime/channels/channel-runtime-manager.d.ts +3 -2
  63. package/dist/runtime/channels/channel-runtime-manager.js +4 -4
  64. package/dist/runtime/channels/channel-transports.d.ts +0 -1
  65. package/dist/runtime/channels/channel-transports.js +35 -33
  66. package/dist/runtime/channels/client-server-location-runtime.js +5 -4
  67. package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
  68. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  69. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  70. package/dist/runtime/channels/fanout-location-runtime.js +3 -3
  71. package/dist/runtime/diagnostics/flow-context.js +19 -7
  72. package/dist/runtime/diagnostics/index.js +4 -9
  73. package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
  74. package/dist/runtime/diagnostics/message-flow.js +35 -5
  75. package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
  76. package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
  77. package/dist/runtime/execution/index.d.ts +4 -2
  78. package/dist/runtime/execution/index.js +33 -10
  79. package/dist/runtime/execution/serial-execution-queue.d.ts +4 -0
  80. package/dist/runtime/execution/serial-execution-queue.js +21 -2
  81. package/dist/runtime/execution/state-lane.d.ts +2 -0
  82. package/dist/runtime/execution/state-lane.js +5 -0
  83. package/dist/runtime/foundation/operation-registry.d.ts +25 -1
  84. package/dist/runtime/foundation/operation-registry.js +86 -18
  85. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +39 -3
  86. package/dist/runtime/foundation/raw-service-mesh-runtime.js +151 -55
  87. package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
  88. package/dist/runtime/foundation/service-liveness-registry.js +38 -0
  89. package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
  90. package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
  91. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -3
  92. package/dist/runtime/foundation/service-relocation-object-owner.js +48 -35
  93. package/dist/runtime/foundation/service-relocation-runtime.js +7 -3
  94. package/dist/runtime/foundation/service-runtime-contracts.d.ts +8 -1
  95. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
  96. package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
  97. package/dist/runtime/foundation/service-stateful-registry.js +24 -26
  98. package/dist/runtime/foundation/service-stateful-runtime.d.ts +72 -6
  99. package/dist/runtime/foundation/service-stateful-runtime.js +444 -117
  100. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -1
  101. package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
  102. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
  103. package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
  104. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  105. package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
  106. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +10 -0
  107. package/dist/runtime/foundation/service-wire-m6a-codec.js +166 -53
  108. package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
  109. package/dist/runtime/host/actor-packet-relay.js +59 -72
  110. package/dist/runtime/host/actor-placement-coordinator.js +25 -8
  111. package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
  112. package/dist/runtime/host/actor-transfer-runtime.js +85 -331
  113. package/dist/runtime/host/application-job-queue.d.ts +24 -3
  114. package/dist/runtime/host/application-job-queue.js +28 -41
  115. package/dist/runtime/host/index.d.ts +5 -1
  116. package/dist/runtime/host/index.js +171 -97
  117. package/dist/runtime/host/location-runtime-owner.js +2 -6
  118. package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
  119. package/dist/runtime/host/mesh-router-resolver.js +14 -6
  120. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
  121. package/dist/runtime/host/remote-bound-session-relay.js +71 -190
  122. package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
  123. package/dist/runtime/host/route-mesh-runtime.js +5 -3
  124. package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
  125. package/dist/runtime/host/runtime-shutdown.js +3 -2
  126. package/dist/runtime/host/service-relocation-host-runtime.d.ts +17 -7
  127. package/dist/runtime/host/service-relocation-host-runtime.js +550 -367
  128. package/dist/runtime/host/spot-runtime-options-factory.js +15 -7
  129. package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
  130. package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
  131. package/dist/runtime/locations/auto-connect-loop.js +22 -14
  132. package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
  133. package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
  134. package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
  135. package/dist/runtime/locations/descriptor-publication.js +11 -0
  136. package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
  137. package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
  138. package/dist/runtime/locations/in-memory-authority-store.js +56 -19
  139. package/dist/runtime/locations/in-memory-location-store.js +1 -10
  140. package/dist/runtime/locations/index.d.ts +1 -0
  141. package/dist/runtime/locations/index.js +1 -0
  142. package/dist/runtime/locations/lease-tracker.js +1 -6
  143. package/dist/runtime/locations/location-store-repository.d.ts +51 -1
  144. package/dist/runtime/locations/location-store-repository.js +363 -139
  145. package/dist/runtime/locations/relocation-blob.d.ts +18 -1
  146. package/dist/runtime/locations/relocation-blob.js +52 -1
  147. package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
  148. package/dist/runtime/locations/request-source-resolver.js +80 -0
  149. package/dist/runtime/locations/resolvers.js +1 -1
  150. package/dist/runtime/locations/runtime.d.ts +6 -2
  151. package/dist/runtime/locations/runtime.js +37 -30
  152. package/dist/runtime/messaging/payload-codec.d.ts +7 -1
  153. package/dist/runtime/messaging/payload-codec.js +7 -6
  154. package/dist/runtime/messaging/request-result.js +29 -26
  155. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +19 -1
  156. package/dist/runtime/protocol/service_wire_codec.generated.js +85 -0
  157. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +7 -1
  158. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +23 -7
  159. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +3 -2
  160. package/dist/runtime/spots/index.d.ts +18 -11
  161. package/dist/runtime/spots/index.js +234 -176
  162. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
  163. package/dist/runtime/spots/spot-activation-registry.js +21 -11
  164. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  165. package/dist/runtime/spots/spot-activation-state.js +7 -7
  166. package/dist/runtime/spots/spot-activation.d.ts +6 -3
  167. package/dist/runtime/spots/spot-activation.js +123 -44
  168. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
  169. package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
  170. package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
  171. package/dist/runtime/spots/spot-actor-membership.js +0 -8
  172. package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
  173. package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
  174. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
  175. package/dist/runtime/spots/spot-entry-activation.js +14 -9
  176. package/dist/runtime/spots/spot-handler-registry.d.ts +4 -3
  177. package/dist/runtime/spots/spot-handler-registry.js +6 -2
  178. package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
  179. package/dist/runtime/spots/spot-manager-public.js +2 -2
  180. package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
  181. package/dist/runtime/spots/spot-node-autoconnect.js +18 -39
  182. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
  183. package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
  184. package/dist/runtime/spots/spot-outbound.js +3 -3
  185. package/dist/runtime/spots/spot-remote-codec.js +5 -1
  186. package/dist/runtime/spots/spot-runtime-ports.d.ts +0 -1
  187. package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
  188. package/dist/runtime/spots/spot-serial-executor.js +61 -8
  189. package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
  190. package/dist/runtime/spots/spot-subscription-dispatch.js +1 -1
  191. package/dist/runtime/spots/spot-timer.d.ts +57 -5
  192. package/dist/runtime/spots/spot-timer.js +287 -103
  193. package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
  194. package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
  195. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
  196. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
  197. package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
  198. package/dist/runtime/streams/bound-session-service.d.ts +1 -1
  199. package/dist/runtime/streams/bound-session-service.js +6 -11
  200. package/dist/runtime/streams/index.d.ts +3 -2
  201. package/dist/runtime/streams/index.js +6 -4
  202. package/dist/runtime/streams/managed-stream.js +3 -2
  203. package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
  204. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
  205. package/dist/runtime/streams/session-actor-coordinator.js +15 -32
  206. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
  207. package/dist/runtime/streams/stream-session-runtime.js +1 -4
  208. package/dist/runtime/workers/index.js +1 -1
  209. package/package.json +3 -3
  210. package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
  211. package/src/contracts/Common/encoded-payload-storage.ts +6 -3
  212. package/src/contracts/Configuration/Builders.ts +4 -1
  213. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
  214. package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
  215. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  216. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
  217. package/src/contracts/Locations/Rows.ts +2 -0
  218. package/src/contracts/Spots/Contracts.ts +8 -0
  219. package/src/contracts/Spots/ZLinkSpot.ts +3 -3
  220. package/src/runtime/abort.ts +12 -0
  221. package/src/runtime/actors/actor-authority-publication.ts +3 -2
  222. package/src/runtime/actors/actor-client.ts +61 -70
  223. package/src/runtime/actors/actor-context.ts +49 -9
  224. package/src/runtime/actors/actor-handoff.ts +282 -106
  225. package/src/runtime/actors/actor-join-relocation.ts +2 -0
  226. package/src/runtime/actors/actor-local-native-join.ts +4 -0
  227. package/src/runtime/actors/actor-mailbox.ts +40 -2
  228. package/src/runtime/actors/actor-remote-joiner.ts +6 -1
  229. package/src/runtime/actors/actor-reply.ts +42 -0
  230. package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
  231. package/src/runtime/actors/actor-runtime-state.ts +2 -20
  232. package/src/runtime/actors/actor-source-transfer.ts +1 -34
  233. package/src/runtime/actors/index.ts +41 -27
  234. package/src/runtime/actors/session-disconnected-wire.ts +66 -0
  235. package/src/runtime/admission.ts +69 -34
  236. package/src/runtime/application-jobs/application-job-queue-scope.ts +33 -1
  237. package/src/runtime/application-jobs/contracts.ts +2 -0
  238. package/src/runtime/backend/contracts/index.ts +39 -4
  239. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
  240. package/src/runtime/backend/mesh-completion-table.ts +4 -0
  241. package/src/runtime/backend/mesh-dispatch-pump.ts +223 -124
  242. package/src/runtime/backend/node/node-raw-binding-port.ts +106 -70
  243. package/src/runtime/backend/node/node-raw-mesh-backend.ts +221 -170
  244. package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -5
  245. package/src/runtime/channels/channel-clients.ts +49 -24
  246. package/src/runtime/channels/channel-dispatch-pipeline.ts +173 -124
  247. package/src/runtime/channels/channel-dispatchers.ts +116 -72
  248. package/src/runtime/channels/channel-envelope.ts +105 -36
  249. package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
  250. package/src/runtime/channels/channel-runtime-manager.ts +12 -5
  251. package/src/runtime/channels/channel-transports.ts +49 -58
  252. package/src/runtime/channels/client-server-location-runtime.ts +11 -10
  253. package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
  254. package/src/runtime/channels/fanout-location-runtime.ts +17 -9
  255. package/src/runtime/diagnostics/flow-context.ts +20 -7
  256. package/src/runtime/diagnostics/index.ts +1 -7
  257. package/src/runtime/diagnostics/message-flow.ts +47 -9
  258. package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
  259. package/src/runtime/execution/index.ts +40 -14
  260. package/src/runtime/execution/serial-execution-queue.ts +31 -4
  261. package/src/runtime/execution/state-lane.ts +7 -0
  262. package/src/runtime/foundation/operation-registry.ts +98 -20
  263. package/src/runtime/foundation/raw-service-mesh-runtime.ts +244 -67
  264. package/src/runtime/foundation/service-liveness-registry.ts +39 -0
  265. package/src/runtime/foundation/service-mailbox.ts +8 -0
  266. package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
  267. package/src/runtime/foundation/service-relocation-object-owner.ts +54 -37
  268. package/src/runtime/foundation/service-relocation-runtime.ts +7 -3
  269. package/src/runtime/foundation/service-runtime-contracts.ts +12 -1
  270. package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
  271. package/src/runtime/foundation/service-stateful-registry.ts +38 -35
  272. package/src/runtime/foundation/service-stateful-runtime.ts +667 -152
  273. package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -11
  274. package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
  275. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  276. package/src/runtime/foundation/service-wire-m6a-codec.ts +187 -51
  277. package/src/runtime/host/actor-packet-relay.ts +113 -94
  278. package/src/runtime/host/actor-placement-coordinator.ts +31 -8
  279. package/src/runtime/host/actor-transfer-runtime.ts +104 -430
  280. package/src/runtime/host/application-job-queue.ts +29 -44
  281. package/src/runtime/host/index.ts +286 -129
  282. package/src/runtime/host/location-runtime-owner.ts +2 -6
  283. package/src/runtime/host/mesh-router-resolver.ts +13 -5
  284. package/src/runtime/host/remote-bound-session-relay.ts +86 -248
  285. package/src/runtime/host/route-mesh-runtime.ts +11 -5
  286. package/src/runtime/host/runtime-shutdown.ts +15 -4
  287. package/src/runtime/host/service-relocation-host-runtime.ts +784 -475
  288. package/src/runtime/host/spot-runtime-options-factory.ts +18 -7
  289. package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
  290. package/src/runtime/locations/auto-connect-loop.ts +22 -14
  291. package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
  292. package/src/runtime/locations/auto-connect-types.ts +0 -1
  293. package/src/runtime/locations/descriptor-publication.ts +7 -0
  294. package/src/runtime/locations/domain-store-contract.ts +5 -0
  295. package/src/runtime/locations/in-memory-authority-store.ts +85 -23
  296. package/src/runtime/locations/in-memory-location-store.ts +1 -12
  297. package/src/runtime/locations/index.ts +1 -0
  298. package/src/runtime/locations/lease-tracker.ts +2 -9
  299. package/src/runtime/locations/location-store-repository.ts +628 -152
  300. package/src/runtime/locations/relocation-blob.ts +75 -1
  301. package/src/runtime/locations/request-source-resolver.ts +138 -0
  302. package/src/runtime/locations/resolvers.ts +2 -2
  303. package/src/runtime/locations/runtime.ts +70 -40
  304. package/src/runtime/messaging/payload-codec.ts +8 -11
  305. package/src/runtime/messaging/request-result.ts +33 -29
  306. package/src/runtime/protocol/service_wire_codec.generated.ts +87 -4
  307. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +13 -10
  308. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +3 -2
  309. package/src/runtime/spots/index.ts +375 -281
  310. package/src/runtime/spots/spot-activation-registry.ts +25 -13
  311. package/src/runtime/spots/spot-activation-state.ts +12 -19
  312. package/src/runtime/spots/spot-activation.ts +170 -86
  313. package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
  314. package/src/runtime/spots/spot-actor-membership.ts +0 -15
  315. package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
  316. package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
  317. package/src/runtime/spots/spot-entry-activation.ts +24 -19
  318. package/src/runtime/spots/spot-handler-registry.ts +15 -4
  319. package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
  320. package/src/runtime/spots/spot-manager-public.ts +2 -2
  321. package/src/runtime/spots/spot-node-autoconnect.ts +22 -45
  322. package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
  323. package/src/runtime/spots/spot-outbound.ts +3 -3
  324. package/src/runtime/spots/spot-remote-codec.ts +9 -2
  325. package/src/runtime/spots/spot-runtime-ports.ts +0 -1
  326. package/src/runtime/spots/spot-serial-executor.ts +97 -25
  327. package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
  328. package/src/runtime/spots/spot-subscription-dispatch.ts +1 -1
  329. package/src/runtime/spots/spot-timer.ts +413 -157
  330. package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
  331. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
  332. package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
  333. package/src/runtime/streams/bound-session-service.ts +7 -10
  334. package/src/runtime/streams/index.ts +12 -6
  335. package/src/runtime/streams/managed-stream.ts +4 -2
  336. package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
  337. package/src/runtime/streams/session-actor-coordinator.ts +39 -88
  338. package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
  339. package/src/runtime/streams/stream-session-runtime.ts +1 -5
  340. package/src/runtime/workers/index.ts +1 -1
@@ -146,10 +146,6 @@ class ZLinkLocationRuntimeOwner {
146
146
  }
147
147
  spotNodeRuntime.configureLocationAutoConnect(runtime, stores, this.options.registration.locations.options, this.currentEvents);
148
148
  channelRuntime.configureLocationAutoConnect(runtime, stores, this.options.registration.locations.options, this.currentEvents);
149
- if (runtime.ownerLeaseUsable) {
150
- await spotNodeRuntime.startLocationAutoConnect();
151
- await channelRuntime.startLocationAutoConnect();
152
- }
153
149
  return runtime;
154
150
  }
155
151
  clearForStop() {
@@ -168,7 +164,7 @@ class ZLinkLocationRuntimeOwner {
168
164
  const locations = this.options.registration.locations;
169
165
  if (locations.useInMemoryStores) {
170
166
  const provider = new locations_1.ZLinkInMemoryProviderLocationStore();
171
- const store = new locations_1.ZLinkLocationStoreRepository(provider);
167
+ const store = new locations_1.ZLinkLocationStoreRepository(provider, undefined, this.options.metrics);
172
168
  return {
173
169
  locationStore: store,
174
170
  authorityStore: store,
@@ -183,7 +179,7 @@ class ZLinkLocationRuntimeOwner {
183
179
  }
184
180
  const provider = locations.storeInstance;
185
181
  if (provider !== undefined) {
186
- const store = new locations_1.ZLinkLocationStoreRepository(provider);
182
+ const store = new locations_1.ZLinkLocationStoreRepository(provider, undefined, this.options.metrics);
187
183
  return {
188
184
  locationStore: store,
189
185
  authorityStore: store,
@@ -5,6 +5,10 @@ export declare class MeshRouterResolver {
5
5
  private readonly registration;
6
6
  constructor(registration: ZLinkFrameworkRegistration);
7
7
  canUseRouterChannel(routerChannelId: string): boolean;
8
+ /**
9
+ * Runs on every node-direct send: a direct scan of the registered manual
10
+ * peers, without temporary arrays or a predicate closure per call.
11
+ */
8
12
  classifyManualNodeTarget(meshName: string, targetNodeRid: RoutingId): boolean | undefined;
9
13
  defaultRouterChannelId(): string | undefined;
10
14
  defaultSpotRouterChannelId(): string | undefined;
@@ -11,17 +11,25 @@ class MeshRouterResolver {
11
11
  return (this.registration.routeChannels.has(routerChannelId) ||
12
12
  this.registration.spotNodes.get(routerChannelId)?.router !== undefined);
13
13
  }
14
+ /**
15
+ * Runs on every node-direct send: a direct scan of the registered manual
16
+ * peers, without temporary arrays or a predicate closure per call.
17
+ */
14
18
  classifyManualNodeTarget(meshName, targetNodeRid) {
15
19
  const router = this.registration.spotNodes.get(meshName)?.router;
16
20
  if (router === undefined)
17
21
  return undefined;
18
- const manualConnections = router.manualConnections ?? [];
19
- const manualPeers = router.manualPeerConnections ?? [];
20
- if (manualConnections.length === 0 && manualPeers.length === 0)
22
+ const manualPeers = router.manualPeerConnections;
23
+ if (manualPeers !== undefined) {
24
+ for (const peer of manualPeers) {
25
+ if ((0, routing_id_1.routingIdsEqual)(peer.peerRid, targetNodeRid))
26
+ return true;
27
+ }
28
+ }
29
+ const manualConnectionCount = router.manualConnections?.length ?? 0;
30
+ if (manualConnectionCount === 0 && (manualPeers?.length ?? 0) === 0)
21
31
  return undefined;
22
- if (manualPeers.some((peer) => (0, routing_id_1.routingIdsEqual)(peer.peerRid, targetNodeRid)))
23
- return true;
24
- return manualConnections.length === 0 ? false : undefined;
32
+ return manualConnectionCount === 0 ? false : undefined;
25
33
  }
26
34
  defaultRouterChannelId() {
27
35
  const candidates = [
@@ -25,7 +25,6 @@ export declare class ZLinkRemoteBoundSessionRelay {
25
25
  private readonly options;
26
26
  private readonly actorOwnershipGenerations;
27
27
  private readonly activeServiceWireRelocations;
28
- private readonly terminalServiceWireRelocations;
29
28
  constructor(options: ZLinkRemoteBoundSessionRelayOptions);
30
29
  receiveRoutedBoundSession(actorId: string, message: unknown, packetName: string | undefined, metadata: ReadonlyMap<string, string>, actorRef?: ActorRef, actorPacketTarget?: unknown): Promise<void>;
31
30
  receiveRoutedBoundSessionResponse(actorId: string, packetName: string, requestSeq: bigint, message: unknown, replyOptions: ZLinkActorResponseOptions, actorPacketTarget?: unknown): Promise<void>;
@@ -40,12 +39,11 @@ export declare class ZLinkRemoteBoundSessionRelay {
40
39
  receiveRemoteBoundSessionError(payload: unknown): Promise<{
41
40
  readonly ok: boolean;
42
41
  }>;
43
- receiveServiceWireSessionRelocationSeal(value: ServiceSessionRelocationSeal, signal?: AbortSignal): Promise<ServiceSessionRelocationSealed>;
42
+ receiveServiceWireSessionRelocationSeal(value: ServiceSessionRelocationSeal, signal?: AbortSignal, onInstalled?: () => void): Promise<ServiceSessionRelocationSealed | undefined>;
44
43
  receiveServiceWireSessionRelocationRoute(value: ServiceSessionRelocationRoute): Promise<void>;
45
- clearServiceWireSessionRelocations(): void;
44
+ clearServiceWireSessionRelocations(): Promise<void>;
46
45
  private warnLateSessionRouteUpdate;
47
46
  private applyServiceWireSessionRelocationRoute;
48
- private validateServiceWireSessionRoute;
49
47
  resolveRemoteBoundSessionTarget(sourceNodeRid: RoutingId, sourceSessionRid: RoutingId): ZLinkRemoteBoundSessionTarget | undefined;
50
48
  actorPacketTargetForState(actorId: string): ZLinkRemoteActorPacketTarget | undefined;
51
49
  clearOwnership(actorId: string): void;
@@ -8,14 +8,11 @@ const actor_packet_relay_wire_1 = require("../actors/actor-packet-relay-wire");
8
8
  const routing_id_1 = require("../routing-id");
9
9
  const service_stateful_wire_codec_1 = require("../foundation/service-stateful-wire-codec");
10
10
  const service_wire_m6a_codec_1 = require("../foundation/service-wire-m6a-codec");
11
- const bounded_replay_map_1 = require("./bounded-replay-map");
12
11
  const framework_errors_internal_1 = require("../framework-errors-internal");
13
- const SERVICE_CONTROL_TERMINAL_CAPACITY = 4096;
14
12
  class ZLinkRemoteBoundSessionRelay {
15
13
  options;
16
14
  actorOwnershipGenerations = new Map();
17
15
  activeServiceWireRelocations = new Map();
18
- terminalServiceWireRelocations = new bounded_replay_map_1.BoundedReplayMap(SERVICE_CONTROL_TERMINAL_CAPACITY);
19
16
  constructor(options) {
20
17
  this.options = options;
21
18
  }
@@ -112,77 +109,40 @@ class ZLinkRemoteBoundSessionRelay {
112
109
  .sendLocalBoundSessionError(response.actorId, response.boundPacketName, response.requestSeq, response.error, new Map(Object.entries(response.metadata ?? {})));
113
110
  return { ok: sent };
114
111
  }
115
- async receiveServiceWireSessionRelocationSeal(value, signal) {
112
+ async receiveServiceWireSessionRelocationSeal(value, signal, onInstalled) {
113
+ const runtime = this.options.streamBindingRuntime();
114
+ const owner = (0, actor_session_binding_runtime_owner_1.actorSessionBindingRuntimeOwner)(runtime);
115
+ const sealController = new AbortController();
116
+ const sealSignal = signal === undefined
117
+ ? sealController.signal
118
+ : AbortSignal.any([signal, sealController.signal]);
119
+ const prepared = await owner.prepareSessionRelocationSeal(value, sealSignal);
120
+ if (prepared === undefined)
121
+ return undefined;
122
+ if (prepared.response.sealResult === 'bindingAbsent')
123
+ return prepared.response;
116
124
  const key = serviceWireBarrierKey(value);
117
- const fingerprint = (0, service_stateful_wire_codec_1.encodeSessionRelocationSeal)(value).toString('base64');
118
- const terminal = this.terminalServiceWireRelocations.get(key);
119
- if (terminal !== undefined) {
120
- if (terminal.sealFingerprint !== fingerprint) {
121
- throw new service_wire_m6a_codec_1.ServiceWireProtocolError(`Session relocation '${key}' repeated command 42 with different bytes.`);
122
- }
123
- this.terminalServiceWireRelocations.touch(key);
124
- return terminal.sealed;
125
- }
126
- const active = this.activeServiceWireRelocations.get(key);
127
- if (active !== undefined) {
128
- if (active.sealFingerprint !== fingerprint) {
129
- throw new service_wire_m6a_codec_1.ServiceWireProtocolError(`Session relocation '${key}' repeated command 42 with different bytes.`);
130
- }
131
- return await active.sealPromise;
132
- }
125
+ const existing = this.activeServiceWireRelocations.get(key);
126
+ if (existing !== undefined)
127
+ return await existing.sealPromise;
133
128
  const actorId = value.actor.actor.actorId;
134
- // Register the identity before the first asynchronous owner operation.
135
- // Concurrent identical commands join this promise; different bytes for
136
- // the same identity fail before they can install another seal.
137
- let state;
138
- const sealController = new AbortController();
139
- const sealPromise = Promise.resolve().then(async () => {
140
- await this.validateServiceWireSessionRoute(value);
141
- await (0, actor_session_binding_runtime_owner_1.actorSessionBindingRuntimeOwner)(this.options.streamBindingRuntime()).sealRelocation({
142
- actorId,
143
- actorGeneration: value.actor.actor.generation,
144
- bindingGeneration: value.session.bindingGeneration,
145
- sessionIdentity: value.session.sessionRid,
146
- actorNodeRid: value.actor.actor.nodeRid,
147
- actorNodeGeneration: value.actor.targetNodeGeneration,
148
- sealId: key
149
- }, {
150
- objectGeneration: value.actor.actor.generation,
151
- bindingGeneration: value.session.bindingGeneration
152
- }, sealController.signal);
153
- return {
154
- relocation: value.relocation,
155
- coordinator: value.coordinator,
156
- actor: value.actor,
157
- session: value.session
158
- };
159
- });
160
- state = {
129
+ const state = {
161
130
  actorId,
162
- sealFingerprint: fingerprint,
163
- sealPromise,
164
- sealController
131
+ sealPromise: prepared.ready.then(() => prepared.response)
165
132
  };
166
133
  this.activeServiceWireRelocations.set(key, state);
134
+ onInstalled?.();
167
135
  const expire = async (error) => {
168
- if (state.terminal === true || state.routePromise !== undefined)
136
+ if (state.terminal === true ||
137
+ (await owner.relocationSnapshot(actorId, key))?.phase !== 'sealed')
169
138
  return;
170
139
  state.terminal = true;
171
140
  sealController.abort(error);
172
141
  if (this.activeServiceWireRelocations.get(key) === state) {
173
142
  this.activeServiceWireRelocations.delete(key);
174
143
  }
175
- if (state.sealed !== undefined) {
176
- this.terminalServiceWireRelocations.remember(key, {
177
- actorId,
178
- sealFingerprint: state.sealFingerprint,
179
- sealed: state.sealed
180
- });
181
- }
182
- const owner = (0, actor_session_binding_runtime_owner_1.actorSessionBindingRuntimeOwner)(this.options.streamBindingRuntime());
183
- await owner.clearRelocation(actorId, error);
184
- void this.options
185
- .streamBindingRuntime()
144
+ await owner.clearRelocation(actorId, error, key);
145
+ void runtime
186
146
  .closeSessionBinding(actorId, value.session)
187
147
  .catch((disconnectError) => this.options.reportOwnershipRefreshError?.(actorId, disconnectError));
188
148
  state.sealAbortCleanup?.();
@@ -203,9 +163,7 @@ class ZLinkRemoteBoundSessionRelay {
203
163
  signal.addEventListener('abort', onAbort, { once: true });
204
164
  }
205
165
  try {
206
- const sealed = await sealPromise;
207
- state.sealed = sealed;
208
- return sealed;
166
+ return await state.sealPromise;
209
167
  }
210
168
  catch (error) {
211
169
  clearTimeout(state.sealTimer);
@@ -213,126 +171,69 @@ class ZLinkRemoteBoundSessionRelay {
213
171
  if (this.activeServiceWireRelocations.get(key) === state) {
214
172
  this.activeServiceWireRelocations.delete(key);
215
173
  }
216
- if (state.terminal !== true) {
217
- const owner = (0, actor_session_binding_runtime_owner_1.actorSessionBindingRuntimeOwner)(this.options.streamBindingRuntime());
218
- if ((await owner.relocationSnapshot(actorId, key)) !== undefined) {
219
- await owner.clearRelocation(actorId, error);
220
- void this.options
221
- .streamBindingRuntime()
222
- .closeSessionBinding(actorId, value.session)
223
- .catch((disconnectError) => this.options.reportOwnershipRefreshError?.(actorId, disconnectError));
224
- }
174
+ if (state.terminal !== true && (await owner.relocationSnapshot(actorId, key)) !== undefined) {
175
+ await owner.clearRelocation(actorId, error, key);
176
+ void runtime
177
+ .closeSessionBinding(actorId, value.session)
178
+ .catch((disconnectError) => this.options.reportOwnershipRefreshError?.(actorId, disconnectError));
225
179
  }
226
180
  throw sealController.signal.aborted ? sealController.signal.reason : error;
227
181
  }
228
182
  }
229
183
  async receiveServiceWireSessionRelocationRoute(value) {
230
184
  const key = serviceWireBarrierKey(value);
231
- const routeRequestFingerprint = (0, service_stateful_wire_codec_1.encodeSessionRelocationRoute)(value).toString('base64');
232
- const fingerprint = routeRequestFingerprint;
233
- const terminal = this.terminalServiceWireRelocations.get(key);
234
- if (terminal !== undefined) {
235
- if (terminal.routeFingerprint === undefined) {
236
- // The Session owner already closed this binding at the seal deadline.
237
- // A late command 44 is terminal and cannot reactivate the route.
238
- this.terminalServiceWireRelocations.touch(key);
239
- this.warnLateSessionRouteUpdate(value);
240
- return;
241
- }
242
- if (terminal.routeFingerprint !== fingerprint) {
243
- throw new service_wire_m6a_codec_1.ServiceWireProtocolError(`Session relocation '${key}' repeated command 44 with different bytes.`);
244
- }
245
- this.terminalServiceWireRelocations.touch(key);
246
- this.warnLateSessionRouteUpdate(value);
247
- return;
248
- }
185
+ const runtime = this.options.streamBindingRuntime();
186
+ const owner = (0, actor_session_binding_runtime_owner_1.actorSessionBindingRuntimeOwner)(runtime);
249
187
  const state = this.activeServiceWireRelocations.get(key);
250
- if (state === undefined) {
251
- this.warnLateSessionRouteUpdate(value);
252
- return;
253
- }
254
- if (state.routeRequestFingerprint !== undefined &&
255
- state.routeRequestFingerprint !== routeRequestFingerprint) {
256
- throw new service_wire_m6a_codec_1.ServiceWireProtocolError(`Session relocation '${key}' repeated command 44 with different bytes.`);
257
- }
258
- if (state.routeFingerprint !== undefined) {
259
- if (state.routeFingerprint !== fingerprint || state.routePromise === undefined) {
260
- throw new service_wire_m6a_codec_1.ServiceWireProtocolError(`Session relocation '${key}' repeated command 44 with different bytes.`);
188
+ const accepted = await owner.acceptSessionRelocationRoute(value, async () => {
189
+ if (state === undefined) {
190
+ throw new bound_session_wire_1.ZLinkRemoteBoundSessionFenceError(`Session relocation '${key}' has no active seal.`);
261
191
  }
262
- this.warnLateSessionRouteUpdate(value);
263
- await state.routePromise;
264
- return;
265
- }
266
- state.routeRequestFingerprint = routeRequestFingerprint;
267
- state.routeFingerprint = fingerprint;
268
- if (state.sealTimer !== undefined)
269
- clearTimeout(state.sealTimer);
270
- state.sealAbortCleanup?.();
271
- const routePromise = state.sealPromise.then(async (sealed) => {
272
- validateSessionRelocationRouteAgainstSeal(value, sealed);
273
- await this.applyServiceWireSessionRelocationRoute(key, value);
274
- });
275
- state.routePromise = routePromise;
276
- try {
277
- await routePromise;
278
- this.terminalServiceWireRelocations.remember(key, {
279
- actorId: state.actorId,
280
- sealFingerprint: state.sealFingerprint,
281
- sealed: state.sealed ?? (await state.sealPromise),
282
- routeRequestFingerprint,
283
- routeFingerprint: fingerprint
284
- });
285
- if (this.activeServiceWireRelocations.get(key) === state) {
286
- this.activeServiceWireRelocations.delete(key);
192
+ if (state.sealTimer !== undefined)
193
+ clearTimeout(state.sealTimer);
194
+ state.sealAbortCleanup?.();
195
+ try {
196
+ const sealed = await state.sealPromise;
197
+ validateSessionRelocationRouteAgainstSeal(value, sealed);
198
+ await this.applyServiceWireSessionRelocationRoute(key, value);
287
199
  }
288
- state.terminal = true;
289
- }
290
- catch (error) {
291
- // Command 44 is one-way. Once an exact update wins the timeout race,
292
- // an apply failure cannot be repaired by waiting for an ACK-driven
293
- // retry. Close the physical Session and terminalize this identity so a
294
- // late duplicate cannot reactivate the binding or its held messages.
295
- state.terminal = true;
296
- if (this.activeServiceWireRelocations.get(key) === state) {
297
- this.activeServiceWireRelocations.delete(key);
200
+ catch (error) {
201
+ // The binding owner chose this command. A failed one-way apply closes
202
+ // its physical Session; conflicting duplicates never enter this callback.
203
+ await owner.clearRelocation(state.actorId, error, key);
204
+ await runtime
205
+ .closeSessionBinding(state.actorId, value.session)
206
+ .catch((disconnectError) => this.options.reportOwnershipRefreshError?.(state.actorId, disconnectError));
207
+ throw error;
298
208
  }
299
- const sealed = state.sealed ?? (await state.sealPromise);
300
- this.terminalServiceWireRelocations.remember(key, {
301
- actorId: state.actorId,
302
- sealFingerprint: state.sealFingerprint,
303
- sealed,
304
- routeRequestFingerprint,
305
- routeFingerprint: fingerprint
306
- });
307
- (0, actor_session_binding_runtime_owner_1.actorSessionBindingRuntimeOwner)(this.options.streamBindingRuntime()).clearRelocation(state.actorId, error);
308
- await this.options
309
- .streamBindingRuntime()
310
- .closeSessionBinding(state.actorId, value.session)
311
- .catch((disconnectError) => this.options.reportOwnershipRefreshError?.(state.actorId, disconnectError));
312
- throw error;
313
- }
209
+ finally {
210
+ state.terminal = true;
211
+ if (this.activeServiceWireRelocations.get(key) === state) {
212
+ this.activeServiceWireRelocations.delete(key);
213
+ }
214
+ }
215
+ });
216
+ if (!accepted)
217
+ this.warnLateSessionRouteUpdate(value);
314
218
  }
315
- clearServiceWireSessionRelocations() {
219
+ async clearServiceWireSessionRelocations() {
316
220
  for (const state of this.activeServiceWireRelocations.values()) {
317
221
  if (state.sealTimer !== undefined)
318
222
  clearTimeout(state.sealTimer);
223
+ state.sealAbortCleanup?.();
319
224
  }
320
225
  this.activeServiceWireRelocations.clear();
321
- this.terminalServiceWireRelocations.clear();
226
+ await (0, actor_session_binding_runtime_owner_1.actorSessionBindingRuntimeOwnerIfRegistered)(this.options.streamBindingRuntime())?.clearSessionRelocationResults();
322
227
  }
323
228
  warnLateSessionRouteUpdate(value) {
324
229
  console.warn(`late_session_route_update session=${value.session.sessionRid}`);
325
230
  }
326
231
  async applyServiceWireSessionRelocationRoute(key, value) {
327
232
  const runtime = this.options.streamBindingRuntime();
328
- const owner = (0, actor_session_binding_runtime_owner_1.actorSessionBindingRuntimeOwner)(runtime);
329
- const fingerprint = (0, service_stateful_wire_codec_1.encodeSessionRelocationRoute)(value).toString('base64');
330
233
  if (value.route.action === 'abort') {
331
- await owner.applyRelocation(value.actor.actorId, key, fingerprint, async () => {
332
- if (!(await runtime.abortActorRouteSeal(value.actor.actorId, key))) {
333
- throw new bound_session_wire_1.ZLinkRemoteBoundSessionFenceError(`Actor '${value.actor.actorId}' command 44 abort lost its Session seal.`);
334
- }
335
- });
234
+ if (!(await runtime.abortActorRouteSeal(value.actor.actorId, key))) {
235
+ throw new bound_session_wire_1.ZLinkRemoteBoundSessionFenceError(`Actor '${value.actor.actorId}' command 44 abort lost its Session seal.`);
236
+ }
336
237
  }
337
238
  else {
338
239
  const committedRoute = value.route;
@@ -344,36 +245,20 @@ class ZLinkRemoteBoundSessionRelay {
344
245
  actorId: value.actor.actorId,
345
246
  objectGeneration: value.actor.generation,
346
247
  meshName: current.meshName,
347
- nodeRid: (0, routing_id_1.decodeRoutingId)(committedRoute.targetNodeRid, undefined),
248
+ nodeRid: committedRoute.targetNodeRid,
348
249
  bindingGeneration: value.session.bindingGeneration,
349
250
  ownershipGeneration: committedRoute.targetAuthorityOwnerGeneration,
350
251
  ownerNodeGeneration: committedRoute.targetNodeGeneration,
351
252
  ownerLeaseGeneration: committedRoute.targetOwnerLeaseGeneration
352
253
  };
353
- await owner.applyRelocation(value.actor.actorId, key, fingerprint, async () => {
354
- await runtime.commitActorRoute(targetActorRef, undefined, {
355
- confirmRemoteSessionBinding: 'send',
356
- releaseSeal: { sealId: key }
357
- });
358
- const currentGeneration = this.actorOwnershipGenerations.get(value.actor.actorId);
359
- if (currentGeneration === undefined ||
360
- currentGeneration < committedRoute.targetAuthorityOwnerGeneration) {
361
- this.actorOwnershipGenerations.set(value.actor.actorId, committedRoute.targetAuthorityOwnerGeneration);
362
- }
254
+ await runtime.commitActorRoute(targetActorRef, undefined, {
255
+ releaseSeal: { sealId: key }
363
256
  });
364
- }
365
- await owner.observeRelocationTerminal(value.actor.actorId, key, fingerprint);
366
- }
367
- async validateServiceWireSessionRoute(value) {
368
- const current = await this.options
369
- .streamBindingRuntime()
370
- .sessionRouteFence(value.actor.actor.actorId);
371
- if (current === undefined ||
372
- current.actor.objectGeneration !== value.actor.actor.generation ||
373
- !(0, routing_id_1.routingIdsEqual)(current.actor.nodeRid, value.actor.actor.nodeRid) ||
374
- current.sessionRid.toString() !== value.session.sessionRid ||
375
- current.bindingGeneration !== value.session.bindingGeneration) {
376
- throw new bound_session_wire_1.ZLinkRemoteBoundSessionFenceError(`Actor '${value.actor.actor.actorId}' command 42 was fenced by its exact Session route.`);
257
+ const currentGeneration = this.actorOwnershipGenerations.get(value.actor.actorId);
258
+ if (currentGeneration === undefined ||
259
+ currentGeneration < committedRoute.targetAuthorityOwnerGeneration) {
260
+ this.actorOwnershipGenerations.set(value.actor.actorId, committedRoute.targetAuthorityOwnerGeneration);
261
+ }
377
262
  }
378
263
  }
379
264
  resolveRemoteBoundSessionTarget(sourceNodeRid, sourceSessionRid) {
@@ -405,10 +290,6 @@ class ZLinkRemoteBoundSessionRelay {
405
290
  this.activeServiceWireRelocations.delete(key);
406
291
  }
407
292
  }
408
- for (const [key, value] of this.terminalServiceWireRelocations) {
409
- if (value.actorId === actorId)
410
- this.terminalServiceWireRelocations.delete(key);
411
- }
412
293
  }
413
294
  async sendActorResponse(actor, packetName, requestSeq, response, replyOptions, fallbackBoundSessionTarget, fallbackActorRef, signal) {
414
295
  const state = this.options.actorManager()?.getState(actor.context.actorId);
@@ -3,7 +3,7 @@ import type { ZLinkActivationAdmission } from '../activation-admission';
3
3
  import type { ZLinkRuntimeAdmissionGate } from '../admission';
4
4
  import type { ZLinkBackendMeshNode } from '../backend';
5
5
  import type { ZLinkSpotNodeOptions } from '../configuration';
6
- type ZLinkDrainForceReason = 'deadline_exceeded' | 'drain_state_publish_failed' | 'owner_cleanup_failed' | 'teardown_failed';
6
+ export type ZLinkDrainForceReason = 'deadline_exceeded' | 'drain_state_publish_failed' | 'owner_cleanup_failed' | 'teardown_failed';
7
7
  type ZLinkMeshDrainResult = {
8
8
  readonly kind: 'drained';
9
9
  } | {
@@ -28,7 +28,7 @@ export interface ZLinkRouteMeshRuntimeCoordinatorOptions {
28
28
  readonly drainResources: (meshName: string, signal: AbortSignal, stopStartingSignal?: AbortSignal) => Promise<void>;
29
29
  readonly shutdownResources?: (meshName: string, signal: AbortSignal) => Promise<void>;
30
30
  readonly cleanupHostResources: (signal: AbortSignal) => Promise<void>;
31
- readonly forceStopResources: (meshName: string) => Promise<void>;
31
+ readonly forceStopResources: (meshName: string, reason: ZLinkDrainForceReason, signal: AbortSignal) => Promise<void>;
32
32
  }
33
33
  export interface ZLinkLocalPlacementCounts {
34
34
  readonly activeActorCount: number;
@@ -312,7 +312,9 @@ class ZLinkRouteMeshRuntimeCoordinator {
312
312
  : deadline.signal.aborted
313
313
  ? 'deadline_exceeded'
314
314
  : classified;
315
- await this.options.forceStopResources(meshName).catch(() => undefined);
315
+ await this.options
316
+ .forceStopResources(meshName, reason, deadline.signal)
317
+ .catch(() => undefined);
316
318
  result = { kind: 'forceStopped', reason };
317
319
  this.transition(meshName, state, contracts_1.ZLinkTopologyState.Failed);
318
320
  }
@@ -362,7 +364,7 @@ class ZLinkRouteMeshRuntimeCoordinator {
362
364
  : deadline.signal.aborted
363
365
  ? 'deadline_exceeded'
364
366
  : classified;
365
- await Promise.all(entries.map(([meshName]) => this.options.forceStopResources(meshName).catch(() => undefined)));
367
+ await Promise.all(entries.map(([meshName]) => this.options.forceStopResources(meshName, reason, deadline.signal).catch(() => undefined)));
366
368
  result = { kind: 'forceStopped', reason };
367
369
  for (const [meshName, state] of entries) {
368
370
  this.transition(meshName, state, contracts_1.ZLinkTopologyState.Failed);
@@ -408,7 +410,7 @@ class ZLinkRouteMeshRuntimeCoordinator {
408
410
  : signal.aborted
409
411
  ? 'deadline_exceeded'
410
412
  : classified;
411
- await Promise.all(entries.map(([meshName]) => this.options.forceStopResources(meshName).catch(() => undefined)));
413
+ await Promise.all(entries.map(([meshName]) => this.options.forceStopResources(meshName, reason, signal).catch(() => undefined)));
412
414
  result = { kind: 'forceStopped', reason, error };
413
415
  for (const [meshName, state] of entries) {
414
416
  this.transition(meshName, state, contracts_1.ZLinkTopologyState.Failed);
@@ -26,6 +26,7 @@ export interface ZLinkRuntimeStopParts {
26
26
  readonly spotNodeRuntime?: ZLinkSpotNodeRuntimeManager;
27
27
  readonly channelRuntime?: ZLinkChannelRuntimeManager;
28
28
  readonly serviceRelocation?: {
29
+ drainActorJoinSources?(): Promise<void>;
29
30
  dispose(): Promise<void>;
30
31
  };
31
32
  readonly ownedStores?: readonly ZLinkRuntimeOwnedStore[];
@@ -20,10 +20,11 @@ async function rollbackRuntimeStart(parts) {
20
20
  async function stopRuntimeParts(parts) {
21
21
  const state = parts.state;
22
22
  const errors = [];
23
+ await runShutdownStep(errors, () => (0, abort_1.awaitWithAbort)(Promise.resolve(parts.serviceRelocation?.drainActorJoinSources?.()), parts.shutdownSignal));
23
24
  await runShutdownStep(errors, () => parts.streamRuntime?.dispose());
24
- await runShutdownStep(errors, () => parts.spotNodeRuntime?.dispose(undefined, parts.cleanupDeadline));
25
+ await runShutdownStep(errors, () => parts.spotNodeRuntime?.dispose(parts.shutdownSignal, parts.cleanupDeadline));
25
26
  await runShutdownStep(errors, () => parts.channelRuntime?.dispose());
26
- await runShutdownStep(errors, () => parts.serviceRelocation?.dispose());
27
+ await runShutdownStep(errors, () => (0, abort_1.awaitWithAbort)(Promise.resolve(parts.serviceRelocation?.dispose()), parts.shutdownSignal));
27
28
  await runShutdownStep(errors, () => parts.locationSnapshot.lifecycle?.dispose());
28
29
  await runShutdownStep(errors, () => parts.locationSnapshot.runtime?.stop(parts.shutdownSignal));
29
30
  await Promise.allSettled(state.listenerTasks);
@@ -7,36 +7,39 @@ import type { ZLinkActorJoinRelocation } from '../actors/actor-join-relocation';
7
7
  import type { ZLinkBackendMeshNode, ZLinkMeshCompletionTable } from '../backend';
8
8
  import type { ZLinkFrameworkRegistration } from '../configuration';
9
9
  import { type ZLinkRuntimeEventPublisher, type ZLinkRuntimeMetrics } from '../diagnostics';
10
+ import { type ZLinkMessageFlowTracer } from '../diagnostics/message-flow';
10
11
  import { type ServiceRelocationQueuedMessage } from '../foundation/service-relocation-runtime';
11
12
  import { type ReceiveRecord } from '../foundation/service-runtime-contracts';
12
13
  import { type ServiceSessionRelocationRoute, type ServiceSessionRelocationSeal, type ServiceSessionRelocationSealed } from '../foundation/service-stateful-wire-codec';
13
14
  import type { ZLinkDomainLocationStore as ZLinkLocationStore } from '../locations/domain-store-contract';
14
15
  import type { ZLinkLocationOwnerToken } from '../locations/internal-location-contracts';
15
16
  import type { ZLinkTrackedInstanceAuthority } from '../locations/spot-location-claims';
16
- import type { DefaultZLinkSpotManager, ZLinkSpotNodeRuntimeManager } from '../spots';
17
+ import type { DefaultZLinkSpotManager } from '../spots';
17
18
  import { type ZLinkActorTransferRuntime } from './actor-transfer-runtime';
18
19
  export declare class ZLinkRelocationStateIncompatibleError extends Error {
19
20
  constructor(message: string);
20
21
  }
21
22
  interface ZLinkHostRelocationOptions {
23
+ readonly flowCreationEnabled?: () => boolean;
24
+ readonly messageFlow?: () => ZLinkMessageFlowTracer | undefined;
22
25
  readonly registration: ZLinkFrameworkRegistration;
23
26
  readonly providerResolver?: ZLinkProviderResolver;
24
27
  readonly locationStore: () => ZLinkLocationStore | undefined;
25
28
  readonly currentOwner: () => ZLinkLocationOwnerToken | undefined;
26
29
  readonly targetAdmissionSealed?: () => boolean;
30
+ readonly requestPeerReconcile?: (meshName: string, peerRid: string) => Promise<void>;
27
31
  readonly sourceQuiescenceChanged?: () => void;
28
32
  readonly liveDescriptors: (meshName: string, signal?: AbortSignal) => Promise<readonly ZLinkMeshNodeDescriptor[]>;
29
33
  readonly localDescriptor?: (meshName: string) => ZLinkMeshNodeDescriptor | undefined;
30
34
  readonly meshNode: (meshName: string) => ZLinkBackendMeshNode | undefined;
31
35
  readonly completions: (meshName: string) => ZLinkMeshCompletionTable | undefined;
32
36
  readonly spotManager: () => DefaultZLinkSpotManager | undefined;
33
- readonly spotNodeRuntime: () => ZLinkSpotNodeRuntimeManager | undefined;
34
37
  readonly actorManager: () => DefaultZLinkActorManager | undefined;
35
38
  readonly actorTransfer: ZLinkActorTransferRuntime;
36
39
  readonly boundSessionRelocation?: {
37
- receiveSeal(value: ServiceSessionRelocationSeal, signal?: AbortSignal): Promise<ServiceSessionRelocationSealed>;
40
+ receiveSeal(value: ServiceSessionRelocationSeal, signal?: AbortSignal, onInstalled?: () => void): Promise<ServiceSessionRelocationSealed | undefined>;
38
41
  receiveRoute(value: ServiceSessionRelocationRoute): Promise<void>;
39
- clear?(): void;
42
+ clear?(): void | Promise<void>;
40
43
  };
41
44
  readonly trackInstanceSpot?: (input: ZLinkTrackedInstanceAuthority) => void;
42
45
  readonly invalidateActorRoute?: (actorId: string) => void;
@@ -50,7 +53,6 @@ export declare class ZLinkHostServiceRelocationRuntime implements ZLinkActorJoin
50
53
  private readonly options;
51
54
  private readonly targetStages;
52
55
  private readonly terminalTargets;
53
- private readonly relocationAuthorityKeys;
54
56
  private readonly targetPrepareOperations;
55
57
  private readonly pendingReplyRelays;
56
58
  private readonly pendingSessionRelocations;
@@ -88,6 +90,7 @@ export declare class ZLinkHostServiceRelocationRuntime implements ZLinkActorJoin
88
90
  * checksum integrity failure — it must not be reported as DataLost(35).
89
91
  */
90
92
  private disposed;
93
+ private readonly targetPreparationStop;
91
94
  constructor(options: ZLinkHostRelocationOptions);
92
95
  relocateActorJoin(input: Parameters<ZLinkActorJoinRelocation['relocateActorJoin']>[0]): ReturnType<ZLinkActorJoinRelocation['relocateActorJoin']>;
93
96
  dispose(): Promise<void>;
@@ -95,7 +98,12 @@ export declare class ZLinkHostServiceRelocationRuntime implements ZLinkActorJoin
95
98
  drainTargetAttempts(): Promise<void>;
96
99
  /** Spec 28 §4.4: the target owner alone orders shutdown seal and verified cutover. */
97
100
  private targetStageSealed;
101
+ /** The Shutdown admission seal: closed once the target owner starts shutdown. */
102
+ private targetAdmissionSealed;
98
103
  completeActorJoinSourceCleanup(actorId: string): void;
104
+ /** Drains the exact source scopes before their Spot lifecycle owners stop. */
105
+ drainActorJoinSources(meshName?: string): Promise<void>;
106
+ private retireActorJoinSource;
99
107
  private finalizeActorJoinSource;
100
108
  relocateMesh(meshName: string, targetApplicationVersion?: bigint, signal?: AbortSignal, stopStartingSignal?: AbortSignal): Promise<void>;
101
109
  tryHandleControl(meshName: string, record: ReceiveRecord, signal?: AbortSignal): boolean | Promise<boolean>;
@@ -133,6 +141,7 @@ export declare class ZLinkHostServiceRelocationRuntime implements ZLinkActorJoin
133
141
  private reserveRelocationId;
134
142
  private reserveExactRelocationId;
135
143
  private runCoordinator;
144
+ private completeSourceRelocationMetric;
136
145
  /** Streams the payload chunks of one stage under the effective in-flight budgets. */
137
146
  private sendRelocationStateChunks;
138
147
  /**
@@ -165,7 +174,8 @@ export declare class ZLinkHostServiceRelocationRuntime implements ZLinkActorJoin
165
174
  * excludes a late target commit. `target`: the
166
175
  * target committed. `source`: Preserve fenced the target out while the
167
176
  * source owner lease was valid. `lost`: the source owner lease ended first
168
- * or authority is Missing or another authority owns the object. An uncertain
177
+ * or authority is Missing or fails the same-object, advanced-generation fence.
178
+ * A committed later owner has no Follow snapshot (Location runtime §10). An uncertain
169
179
  * Store or lease result keeps the work retained and repeats the same decision.
170
180
  */
171
181
  private settleSourceAuthority;
@@ -212,7 +222,7 @@ export declare class ZLinkHostServiceRelocationRuntime implements ZLinkActorJoin
212
222
  private acceptReplyRelayAck;
213
223
  private requireAdmittedPeer;
214
224
  private targetReplyRelayCoordinator;
215
- private relayTerminalReplies;
225
+ private relayTerminalReply;
216
226
  private exactSourceLeaseExpired;
217
227
  private publishSessionRoutes;
218
228
  private sendControl;