@zlink-systems/framework 0.30.0 → 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 (456) hide show
  1. package/LICENSE +150 -68
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/contracts/Actors/ZLinkActorClient.d.ts +2 -1
  4. package/dist/contracts/Channels/Calls.d.ts +2 -1
  5. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
  6. package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
  7. package/dist/contracts/Common/ZLinkMessageMetadata.js +11 -5
  8. package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
  9. package/dist/contracts/Common/encoded-payload-storage.js +5 -2
  10. package/dist/contracts/Configuration/Builders.d.ts +1 -1
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
  12. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
  13. package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
  14. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  15. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
  16. package/dist/contracts/Handlers/Attributes.d.ts +5 -13
  17. package/dist/contracts/Handlers/Attributes.js +7 -11
  18. package/dist/contracts/Handlers/JsonContract.d.ts +2 -46
  19. package/dist/contracts/Handlers/JsonContract.js +4 -153
  20. package/dist/contracts/Locations/Rows.d.ts +2 -0
  21. package/dist/contracts/Spots/Contracts.d.ts +6 -1
  22. package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
  23. package/dist/nest-integration.d.ts +1 -1
  24. package/dist/nest-integration.js +2 -1
  25. package/dist/runtime/abort.d.ts +5 -0
  26. package/dist/runtime/abort.js +10 -0
  27. package/dist/runtime/actors/actor-authority-publication.js +3 -2
  28. package/dist/runtime/actors/actor-client.d.ts +1 -2
  29. package/dist/runtime/actors/actor-client.js +52 -57
  30. package/dist/runtime/actors/actor-context.d.ts +2 -0
  31. package/dist/runtime/actors/actor-context.js +46 -9
  32. package/dist/runtime/actors/actor-handoff.d.ts +8 -4
  33. package/dist/runtime/actors/actor-handoff.js +219 -92
  34. package/dist/runtime/actors/actor-join-relocation.d.ts +3 -0
  35. package/dist/runtime/actors/actor-local-native-join.js +13 -12
  36. package/dist/runtime/actors/actor-mailbox.js +27 -1
  37. package/dist/runtime/actors/actor-remote-joiner.js +3 -1
  38. package/dist/runtime/actors/actor-remote-wire.js +15 -0
  39. package/dist/runtime/actors/actor-reply.d.ts +4 -0
  40. package/dist/runtime/actors/actor-reply.js +29 -0
  41. package/dist/runtime/actors/actor-routed-join-transport.d.ts +6 -2
  42. package/dist/runtime/actors/actor-routed-json-request.d.ts +2 -0
  43. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
  44. package/dist/runtime/actors/actor-runtime-state.js +2 -20
  45. package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
  46. package/dist/runtime/actors/index.d.ts +8 -3
  47. package/dist/runtime/actors/index.js +55 -27
  48. package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
  49. package/dist/runtime/actors/session-disconnected-wire.js +48 -0
  50. package/dist/runtime/actors/spot-actor-dispatch.js +2 -2
  51. package/dist/runtime/admission.d.ts +9 -1
  52. package/dist/runtime/admission.js +56 -23
  53. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +6 -8
  54. package/dist/runtime/application-jobs/application-ingress-record-owner.js +39 -22
  55. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +15 -1
  56. package/dist/runtime/application-jobs/application-job-queue-scope.js +61 -20
  57. package/dist/runtime/application-jobs/contracts.d.ts +12 -1
  58. package/dist/runtime/backend/contracts/index.d.ts +37 -12
  59. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
  60. package/dist/runtime/backend/mesh-completion-table.d.ts +9 -1
  61. package/dist/runtime/backend/mesh-completion-table.js +154 -49
  62. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +28 -1
  63. package/dist/runtime/backend/mesh-dispatch-pump.js +208 -101
  64. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +2 -2
  65. package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -9
  66. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +1 -1
  67. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +5 -2
  68. package/dist/runtime/backend/node/node-raw-binding-port.js +124 -72
  69. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +46 -13
  70. package/dist/runtime/backend/node/node-raw-mesh-backend.js +181 -164
  71. package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
  72. package/dist/runtime/backend/node/node-socket-backend-adapter.js +11 -11
  73. package/dist/runtime/backend/raw-binding-port.d.ts +2 -2
  74. package/dist/runtime/backend/runtime-message.d.ts +1 -0
  75. package/dist/runtime/backend/runtime-message.js +5 -0
  76. package/dist/runtime/backend/runtime-values.d.ts +1 -0
  77. package/dist/runtime/backend/runtime-values.js +2 -1
  78. package/dist/runtime/channels/channel-clients.d.ts +2 -0
  79. package/dist/runtime/channels/channel-clients.js +75 -23
  80. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +25 -5
  81. package/dist/runtime/channels/channel-dispatch-pipeline.js +111 -56
  82. package/dist/runtime/channels/channel-dispatch-services.d.ts +1 -0
  83. package/dist/runtime/channels/channel-dispatch-services.js +45 -0
  84. package/dist/runtime/channels/channel-dispatchers.d.ts +4 -3
  85. package/dist/runtime/channels/channel-dispatchers.js +62 -54
  86. package/dist/runtime/channels/channel-envelope-inspection.d.ts +1 -2
  87. package/dist/runtime/channels/channel-envelope-inspection.js +1 -16
  88. package/dist/runtime/channels/channel-envelope.d.ts +2 -0
  89. package/dist/runtime/channels/channel-envelope.js +146 -28
  90. package/dist/runtime/channels/channel-outbound-operations.d.ts +2 -2
  91. package/dist/runtime/channels/channel-outbound-operations.js +8 -8
  92. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
  93. package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
  94. package/dist/runtime/channels/channel-runtime-manager.d.ts +9 -8
  95. package/dist/runtime/channels/channel-runtime-manager.js +16 -16
  96. package/dist/runtime/channels/channel-transports.d.ts +18 -16
  97. package/dist/runtime/channels/channel-transports.js +77 -58
  98. package/dist/runtime/channels/client-server-location-runtime.js +5 -4
  99. package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
  100. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  101. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  102. package/dist/runtime/channels/fanout-location-runtime.js +3 -3
  103. package/dist/runtime/channels/local-spot-route-transport.d.ts +1 -1
  104. package/dist/runtime/channels/local-spot-route-transport.js +2 -1
  105. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +2 -2
  106. package/dist/runtime/channels/router-socket-spot-route-transport.js +4 -4
  107. package/dist/runtime/channels/source-spot-router.d.ts +2 -2
  108. package/dist/runtime/channels/source-spot-router.js +4 -4
  109. package/dist/runtime/channels/spot-node-route-transport.d.ts +2 -2
  110. package/dist/runtime/channels/spot-node-route-transport.js +4 -4
  111. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +2 -2
  112. package/dist/runtime/channels/spot-route-bridge-transport.js +4 -4
  113. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +5 -4
  114. package/dist/runtime/channels/spot-route-dispatch-strategy.js +18 -18
  115. package/dist/runtime/diagnostics/flow-context.js +19 -7
  116. package/dist/runtime/diagnostics/index.js +4 -9
  117. package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
  118. package/dist/runtime/diagnostics/message-flow.js +35 -5
  119. package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
  120. package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
  121. package/dist/runtime/execution/index.d.ts +4 -2
  122. package/dist/runtime/execution/index.js +33 -10
  123. package/dist/runtime/execution/serial-execution-queue.d.ts +5 -0
  124. package/dist/runtime/execution/serial-execution-queue.js +22 -2
  125. package/dist/runtime/execution/state-lane.d.ts +2 -0
  126. package/dist/runtime/execution/state-lane.js +5 -0
  127. package/dist/runtime/foundation/actor-join-recovery-codec.js +2 -2
  128. package/dist/runtime/foundation/durable-service-request.d.ts +14 -0
  129. package/dist/runtime/foundation/durable-service-request.js +98 -0
  130. package/dist/runtime/foundation/operation-identity.d.ts +1 -0
  131. package/dist/runtime/foundation/operation-identity.js +5 -1
  132. package/dist/runtime/foundation/operation-registry.d.ts +25 -1
  133. package/dist/runtime/foundation/operation-registry.js +86 -18
  134. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +61 -8
  135. package/dist/runtime/foundation/raw-service-mesh-runtime.js +486 -266
  136. package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
  137. package/dist/runtime/foundation/service-liveness-registry.js +38 -0
  138. package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
  139. package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
  140. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +3 -3
  141. package/dist/runtime/foundation/service-relocation-object-owner.js +48 -34
  142. package/dist/runtime/foundation/service-relocation-runtime.d.ts +2 -0
  143. package/dist/runtime/foundation/service-relocation-runtime.js +20 -4
  144. package/dist/runtime/foundation/service-runtime-contracts.d.ts +10 -1
  145. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
  146. package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
  147. package/dist/runtime/foundation/service-stateful-registry.js +24 -26
  148. package/dist/runtime/foundation/service-stateful-runtime.d.ts +75 -9
  149. package/dist/runtime/foundation/service-stateful-runtime.js +486 -218
  150. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -6
  151. package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
  152. package/dist/runtime/foundation/service-topology-registry.d.ts +12 -2
  153. package/dist/runtime/foundation/service-topology-registry.js +61 -27
  154. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
  155. package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
  156. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  157. package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
  158. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +13 -3
  159. package/dist/runtime/foundation/service-wire-m6a-codec.js +189 -78
  160. package/dist/runtime/handlers/handler-instance-scope.d.ts +8 -0
  161. package/dist/runtime/handlers/handler-instance-scope.js +54 -11
  162. package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
  163. package/dist/runtime/host/actor-packet-relay.js +59 -72
  164. package/dist/runtime/host/actor-placement-coordinator.js +25 -8
  165. package/dist/runtime/host/actor-runtime-options-factory.js +2 -2
  166. package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
  167. package/dist/runtime/host/actor-transfer-runtime.js +85 -331
  168. package/dist/runtime/host/application-job-queue.d.ts +40 -7
  169. package/dist/runtime/host/application-job-queue.js +137 -42
  170. package/dist/runtime/host/entry-actor-runtime.d.ts +1 -0
  171. package/dist/runtime/host/entry-actor-runtime.js +3 -0
  172. package/dist/runtime/host/index.d.ts +12 -2
  173. package/dist/runtime/host/index.js +300 -202
  174. package/dist/runtime/host/location-runtime-owner.js +2 -6
  175. package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
  176. package/dist/runtime/host/mesh-router-resolver.js +14 -6
  177. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
  178. package/dist/runtime/host/remote-bound-session-relay.js +73 -208
  179. package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
  180. package/dist/runtime/host/route-mesh-runtime.js +6 -4
  181. package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
  182. package/dist/runtime/host/runtime-shutdown.js +3 -2
  183. package/dist/runtime/host/service-relocation-control.d.ts +1 -0
  184. package/dist/runtime/host/service-relocation-control.js +10 -4
  185. package/dist/runtime/host/service-relocation-host-runtime.d.ts +22 -14
  186. package/dist/runtime/host/service-relocation-host-runtime.js +754 -599
  187. package/dist/runtime/host/spot-address-transport.js +3 -2
  188. package/dist/runtime/host/spot-runtime-options-factory.js +16 -7
  189. package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
  190. package/dist/runtime/locations/actor-location-claims.d.ts +2 -2
  191. package/dist/runtime/locations/actor-location-claims.js +34 -19
  192. package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
  193. package/dist/runtime/locations/auto-connect-loop.js +22 -14
  194. package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
  195. package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
  196. package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
  197. package/dist/runtime/locations/descriptor-publication.js +11 -0
  198. package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
  199. package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
  200. package/dist/runtime/locations/in-memory-authority-store.js +56 -19
  201. package/dist/runtime/locations/in-memory-location-store.js +1 -10
  202. package/dist/runtime/locations/index.d.ts +1 -0
  203. package/dist/runtime/locations/index.js +1 -0
  204. package/dist/runtime/locations/lease-tracker.js +1 -6
  205. package/dist/runtime/locations/lifecycle.d.ts +1 -2
  206. package/dist/runtime/locations/lifecycle.js +2 -5
  207. package/dist/runtime/locations/location-store-repository.d.ts +51 -1
  208. package/dist/runtime/locations/location-store-repository.js +363 -139
  209. package/dist/runtime/locations/relocation-blob.d.ts +18 -1
  210. package/dist/runtime/locations/relocation-blob.js +52 -1
  211. package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
  212. package/dist/runtime/locations/request-source-resolver.js +80 -0
  213. package/dist/runtime/locations/resolvers.js +1 -1
  214. package/dist/runtime/locations/runtime.d.ts +7 -3
  215. package/dist/runtime/locations/runtime.js +61 -53
  216. package/dist/runtime/messaging/framework-json-v1.d.ts +4 -6
  217. package/dist/runtime/messaging/framework-json-v1.js +38 -294
  218. package/dist/runtime/messaging/packet-name.d.ts +1 -1
  219. package/dist/runtime/messaging/packet-name.js +8 -24
  220. package/dist/runtime/messaging/payload-codec.d.ts +7 -1
  221. package/dist/runtime/messaging/payload-codec.js +7 -6
  222. package/dist/runtime/messaging/request-result.d.ts +2 -0
  223. package/dist/runtime/messaging/request-result.js +57 -0
  224. package/dist/runtime/messaging/submission-result.d.ts +1 -0
  225. package/dist/runtime/messaging/submission-result.js +5 -2
  226. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +34 -1
  227. package/dist/runtime/protocol/service_wire_codec.generated.js +229 -0
  228. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +16 -1
  229. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +37 -8
  230. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +7 -2
  231. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +36 -21
  232. package/dist/runtime/spots/index.d.ts +21 -11
  233. package/dist/runtime/spots/index.js +243 -178
  234. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
  235. package/dist/runtime/spots/spot-activation-registry.js +21 -11
  236. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  237. package/dist/runtime/spots/spot-activation-state.js +7 -7
  238. package/dist/runtime/spots/spot-activation.d.ts +7 -3
  239. package/dist/runtime/spots/spot-activation.js +140 -52
  240. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
  241. package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
  242. package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
  243. package/dist/runtime/spots/spot-actor-membership.js +0 -8
  244. package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
  245. package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
  246. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
  247. package/dist/runtime/spots/spot-entry-activation.js +20 -11
  248. package/dist/runtime/spots/spot-handler-registry.d.ts +7 -4
  249. package/dist/runtime/spots/spot-handler-registry.js +24 -10
  250. package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
  251. package/dist/runtime/spots/spot-manager-public.js +2 -2
  252. package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
  253. package/dist/runtime/spots/spot-node-autoconnect.js +22 -42
  254. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
  255. package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
  256. package/dist/runtime/spots/spot-outbound.d.ts +3 -0
  257. package/dist/runtime/spots/spot-outbound.js +27 -18
  258. package/dist/runtime/spots/spot-remote-codec.js +5 -1
  259. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +1 -0
  260. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +1 -1
  261. package/dist/runtime/spots/spot-runtime-ports.d.ts +1 -1
  262. package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
  263. package/dist/runtime/spots/spot-serial-executor.js +61 -8
  264. package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
  265. package/dist/runtime/spots/spot-subscription-dispatch.js +1 -4
  266. package/dist/runtime/spots/spot-timer.d.ts +57 -5
  267. package/dist/runtime/spots/spot-timer.js +288 -103
  268. package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
  269. package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
  270. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
  271. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
  272. package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
  273. package/dist/runtime/streams/bound-session-service.d.ts +1 -1
  274. package/dist/runtime/streams/bound-session-service.js +6 -11
  275. package/dist/runtime/streams/index.d.ts +3 -2
  276. package/dist/runtime/streams/index.js +6 -4
  277. package/dist/runtime/streams/managed-stream.js +3 -2
  278. package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
  279. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
  280. package/dist/runtime/streams/session-actor-coordinator.js +15 -32
  281. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
  282. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -1
  283. package/dist/runtime/streams/stream-session-runtime.js +14 -31
  284. package/dist/runtime/workers/index.js +1 -1
  285. package/package.json +3 -3
  286. package/src/contracts/Actors/ZLinkActorClient.ts +2 -1
  287. package/src/contracts/Channels/Calls.ts +2 -1
  288. package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
  289. package/src/contracts/Common/ZLinkMessageMetadata.ts +13 -8
  290. package/src/contracts/Common/encoded-payload-storage.ts +6 -3
  291. package/src/contracts/Configuration/Builders.ts +4 -1
  292. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
  293. package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
  294. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  295. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
  296. package/src/contracts/Handlers/Attributes.ts +14 -21
  297. package/src/contracts/Handlers/JsonContract.ts +8 -216
  298. package/src/contracts/Locations/Rows.ts +2 -0
  299. package/src/contracts/Spots/Contracts.ts +10 -1
  300. package/src/contracts/Spots/ZLinkSpot.ts +3 -3
  301. package/src/nest-integration.ts +1 -0
  302. package/src/runtime/abort.ts +12 -0
  303. package/src/runtime/actors/actor-authority-publication.ts +3 -2
  304. package/src/runtime/actors/actor-client.ts +100 -85
  305. package/src/runtime/actors/actor-context.ts +49 -9
  306. package/src/runtime/actors/actor-handoff.ts +291 -110
  307. package/src/runtime/actors/actor-join-relocation.ts +3 -0
  308. package/src/runtime/actors/actor-local-native-join.ts +21 -26
  309. package/src/runtime/actors/actor-mailbox.ts +40 -2
  310. package/src/runtime/actors/actor-remote-joiner.ts +6 -1
  311. package/src/runtime/actors/actor-remote-wire.ts +17 -0
  312. package/src/runtime/actors/actor-reply.ts +42 -0
  313. package/src/runtime/actors/actor-routed-join-transport.ts +14 -4
  314. package/src/runtime/actors/actor-routed-json-request.ts +10 -2
  315. package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
  316. package/src/runtime/actors/actor-runtime-state.ts +2 -20
  317. package/src/runtime/actors/actor-source-transfer.ts +1 -34
  318. package/src/runtime/actors/index.ts +60 -32
  319. package/src/runtime/actors/session-disconnected-wire.ts +66 -0
  320. package/src/runtime/actors/spot-actor-dispatch.ts +4 -2
  321. package/src/runtime/admission.ts +69 -21
  322. package/src/runtime/application-jobs/application-ingress-record-owner.ts +41 -25
  323. package/src/runtime/application-jobs/application-job-queue-scope.ts +83 -22
  324. package/src/runtime/application-jobs/contracts.ts +16 -1
  325. package/src/runtime/backend/contracts/index.ts +92 -18
  326. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
  327. package/src/runtime/backend/mesh-completion-table.ts +160 -57
  328. package/src/runtime/backend/mesh-dispatch-pump.ts +237 -108
  329. package/src/runtime/backend/node/node-backend-adapter-support.ts +17 -8
  330. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +12 -2
  331. package/src/runtime/backend/node/node-raw-binding-port.ts +148 -85
  332. package/src/runtime/backend/node/node-raw-mesh-backend.ts +315 -201
  333. package/src/runtime/backend/node/node-socket-backend-adapter.ts +26 -11
  334. package/src/runtime/backend/raw-binding-port.ts +7 -2
  335. package/src/runtime/backend/runtime-message.ts +6 -0
  336. package/src/runtime/backend/runtime-values.ts +1 -0
  337. package/src/runtime/channels/channel-clients.ts +132 -58
  338. package/src/runtime/channels/channel-dispatch-pipeline.ts +198 -114
  339. package/src/runtime/channels/channel-dispatch-services.ts +69 -1
  340. package/src/runtime/channels/channel-dispatchers.ts +136 -90
  341. package/src/runtime/channels/channel-envelope-inspection.ts +2 -16
  342. package/src/runtime/channels/channel-envelope.ts +225 -31
  343. package/src/runtime/channels/channel-outbound-operations.ts +22 -8
  344. package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
  345. package/src/runtime/channels/channel-runtime-manager.ts +41 -17
  346. package/src/runtime/channels/channel-transports.ts +171 -112
  347. package/src/runtime/channels/client-server-location-runtime.ts +11 -10
  348. package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
  349. package/src/runtime/channels/fanout-location-runtime.ts +17 -9
  350. package/src/runtime/channels/local-spot-route-transport.ts +3 -1
  351. package/src/runtime/channels/router-socket-spot-route-transport.ts +13 -4
  352. package/src/runtime/channels/source-spot-router.ts +8 -4
  353. package/src/runtime/channels/spot-node-route-transport.ts +8 -4
  354. package/src/runtime/channels/spot-route-bridge-transport.ts +6 -4
  355. package/src/runtime/channels/spot-route-dispatch-strategy.ts +47 -18
  356. package/src/runtime/diagnostics/flow-context.ts +20 -7
  357. package/src/runtime/diagnostics/index.ts +1 -7
  358. package/src/runtime/diagnostics/message-flow.ts +47 -9
  359. package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
  360. package/src/runtime/execution/index.ts +40 -14
  361. package/src/runtime/execution/serial-execution-queue.ts +33 -4
  362. package/src/runtime/execution/state-lane.ts +7 -0
  363. package/src/runtime/foundation/actor-join-recovery-codec.ts +2 -2
  364. package/src/runtime/foundation/durable-service-request.ts +137 -0
  365. package/src/runtime/foundation/operation-identity.ts +5 -1
  366. package/src/runtime/foundation/operation-registry.ts +98 -20
  367. package/src/runtime/foundation/raw-service-mesh-runtime.ts +704 -336
  368. package/src/runtime/foundation/service-liveness-registry.ts +39 -0
  369. package/src/runtime/foundation/service-mailbox.ts +8 -0
  370. package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
  371. package/src/runtime/foundation/service-relocation-object-owner.ts +55 -36
  372. package/src/runtime/foundation/service-relocation-runtime.ts +25 -4
  373. package/src/runtime/foundation/service-runtime-contracts.ts +19 -2
  374. package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
  375. package/src/runtime/foundation/service-stateful-registry.ts +38 -35
  376. package/src/runtime/foundation/service-stateful-runtime.ts +732 -275
  377. package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -16
  378. package/src/runtime/foundation/service-topology-registry.ts +91 -36
  379. package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
  380. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  381. package/src/runtime/foundation/service-wire-m6a-codec.ts +231 -76
  382. package/src/runtime/handlers/handler-instance-scope.ts +67 -16
  383. package/src/runtime/host/actor-packet-relay.ts +113 -94
  384. package/src/runtime/host/actor-placement-coordinator.ts +31 -8
  385. package/src/runtime/host/actor-runtime-options-factory.ts +13 -2
  386. package/src/runtime/host/actor-transfer-runtime.ts +104 -430
  387. package/src/runtime/host/application-job-queue.ts +160 -41
  388. package/src/runtime/host/entry-actor-runtime.ts +4 -0
  389. package/src/runtime/host/index.ts +473 -271
  390. package/src/runtime/host/location-runtime-owner.ts +2 -6
  391. package/src/runtime/host/mesh-router-resolver.ts +13 -5
  392. package/src/runtime/host/remote-bound-session-relay.ts +88 -271
  393. package/src/runtime/host/route-mesh-runtime.ts +12 -6
  394. package/src/runtime/host/runtime-shutdown.ts +15 -4
  395. package/src/runtime/host/service-relocation-control.ts +11 -5
  396. package/src/runtime/host/service-relocation-host-runtime.ts +1092 -759
  397. package/src/runtime/host/spot-address-transport.ts +4 -2
  398. package/src/runtime/host/spot-runtime-options-factory.ts +20 -7
  399. package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
  400. package/src/runtime/locations/actor-location-claims.ts +52 -30
  401. package/src/runtime/locations/auto-connect-loop.ts +22 -14
  402. package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
  403. package/src/runtime/locations/auto-connect-types.ts +0 -1
  404. package/src/runtime/locations/descriptor-publication.ts +7 -0
  405. package/src/runtime/locations/domain-store-contract.ts +5 -0
  406. package/src/runtime/locations/in-memory-authority-store.ts +85 -23
  407. package/src/runtime/locations/in-memory-location-store.ts +1 -12
  408. package/src/runtime/locations/index.ts +1 -0
  409. package/src/runtime/locations/lease-tracker.ts +2 -9
  410. package/src/runtime/locations/lifecycle.ts +8 -26
  411. package/src/runtime/locations/location-store-repository.ts +628 -152
  412. package/src/runtime/locations/relocation-blob.ts +75 -1
  413. package/src/runtime/locations/request-source-resolver.ts +138 -0
  414. package/src/runtime/locations/resolvers.ts +2 -2
  415. package/src/runtime/locations/runtime.ts +98 -64
  416. package/src/runtime/messaging/framework-json-v1.ts +5 -325
  417. package/src/runtime/messaging/packet-name.ts +5 -25
  418. package/src/runtime/messaging/payload-codec.ts +8 -11
  419. package/src/runtime/messaging/request-result.ts +62 -0
  420. package/src/runtime/messaging/submission-result.ts +5 -1
  421. package/src/runtime/protocol/service_wire_codec.generated.ts +218 -5
  422. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +16 -13
  423. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +46 -25
  424. package/src/runtime/spots/index.ts +389 -283
  425. package/src/runtime/spots/spot-activation-registry.ts +25 -13
  426. package/src/runtime/spots/spot-activation-state.ts +12 -19
  427. package/src/runtime/spots/spot-activation.ts +198 -96
  428. package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
  429. package/src/runtime/spots/spot-actor-membership.ts +0 -15
  430. package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
  431. package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
  432. package/src/runtime/spots/spot-entry-activation.ts +33 -21
  433. package/src/runtime/spots/spot-handler-registry.ts +56 -12
  434. package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
  435. package/src/runtime/spots/spot-manager-public.ts +2 -2
  436. package/src/runtime/spots/spot-node-autoconnect.ts +28 -47
  437. package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
  438. package/src/runtime/spots/spot-outbound.ts +39 -19
  439. package/src/runtime/spots/spot-remote-codec.ts +9 -2
  440. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +2 -1
  441. package/src/runtime/spots/spot-runtime-ports.ts +1 -1
  442. package/src/runtime/spots/spot-serial-executor.ts +97 -25
  443. package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
  444. package/src/runtime/spots/spot-subscription-dispatch.ts +1 -4
  445. package/src/runtime/spots/spot-timer.ts +418 -158
  446. package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
  447. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
  448. package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
  449. package/src/runtime/streams/bound-session-service.ts +7 -10
  450. package/src/runtime/streams/index.ts +12 -6
  451. package/src/runtime/streams/managed-stream.ts +4 -2
  452. package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
  453. package/src/runtime/streams/session-actor-coordinator.ts +39 -88
  454. package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
  455. package/src/runtime/streams/stream-session-runtime.ts +13 -34
  456. package/src/runtime/workers/index.ts +1 -1
@@ -1,21 +1,26 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ZLinkActorHandoffCoordinator = exports.DEFAULT_MESSAGE_FOLLOW_DURATION_MS = void 0;
3
+ exports.ZLinkActorHandoffCoordinator = exports.RELOCATED_REQUEST_OWNED_BY_REQUESTER = exports.DEFAULT_MESSAGE_FOLLOW_DURATION_MS = void 0;
4
4
  exports.decodeHandoffPacket = decodeHandoffPacket;
5
5
  exports.replayActorHandoffBacklog = replayActorHandoffBacklog;
6
6
  const contracts_1 = require("../../contracts");
7
+ const Registration_1 = require("../../contracts/Configuration/Registration");
7
8
  const Options_1 = require("../../contracts/Locations/Options");
8
9
  const application_job_queue_scope_1 = require("../application-jobs/application-job-queue-scope");
9
10
  const runtime_message_1 = require("../backend/runtime-message");
10
11
  const message_follow_suppression_registry_1 = require("../foundation/message-follow-suppression-registry");
12
+ const service_stateful_registry_1 = require("../foundation/service-stateful-registry");
13
+ const operation_identity_1 = require("../foundation/operation-identity");
14
+ const stream_wire_1 = require("@zlink-systems/stream-wire");
11
15
  const framework_errors_internal_1 = require("../framework-errors-internal");
16
+ const request_deadline_1 = require("../messaging/request-deadline");
12
17
  const routing_id_1 = require("../routing-id");
13
18
  const protocol_1 = require("../streams/protocol");
14
19
  const actor_message_follow_context_1 = require("./actor-message-follow-context");
15
20
  const actor_packet_relay_wire_1 = require("./actor-packet-relay-wire");
16
21
  const actor_routed_json_request_1 = require("./actor-routed-json-request");
17
22
  exports.DEFAULT_MESSAGE_FOLLOW_DURATION_MS = Options_1.zlinkDefaultLocationOptions.messageFollowDurationMs;
18
- const RELOCATION_REPLY_RETENTION_MS = 24 * 60 * 60 * 1_000;
23
+ exports.RELOCATED_REQUEST_OWNED_BY_REQUESTER = Symbol('relocated request owned by requester');
19
24
  function requireExactTargetOwnerFence(actorId, fence) {
20
25
  if (fence === undefined) {
21
26
  throw new Error(`Actor '${actorId}' handoff requires a committed target owner fence.`);
@@ -31,6 +36,8 @@ function requireExactTargetOwnerFence(actorId, fence) {
31
36
  class ZLinkActorHandoffCoordinator {
32
37
  options;
33
38
  active = new Map();
39
+ // Each route is stored once: Actor -> native fence -> location owner id.
40
+ // Native ingress has the complete fence except the location owner's text id.
34
41
  messageFollowRoutes = new Map();
35
42
  messageFollowSuppression = new message_follow_suppression_registry_1.MessageFollowSuppressionRegistry();
36
43
  // Relocation preserves ObjectGeneration, so (nodeRid, objectGeneration) alone
@@ -56,7 +63,10 @@ class ZLinkActorHandoffCoordinator {
56
63
  this.startHandoff(actorId, oldGeneration, 'provisional');
57
64
  }
58
65
  startHandoff(actorId, oldGeneration, phase) {
59
- if (this.active.has(actorId)) {
66
+ // A releasing handoff has returned its hold to the Actor FIFO; only its
67
+ // durable prefix drain remains, and the next hold takes over its ingress.
68
+ const previous = this.active.get(actorId);
69
+ if (this.isActive(actorId)) {
60
70
  throw new Error(`Actor '${actorId}' already has an active packet handoff.`);
61
71
  }
62
72
  if (oldGeneration <= 0n) {
@@ -92,6 +102,25 @@ class ZLinkActorHandoffCoordinator {
92
102
  nodeGeneration: source.nodeGeneration,
93
103
  authorityOwnerGeneration: source.authorityOwnerGeneration
94
104
  });
105
+ const pending = [];
106
+ if (previous?.prefixRelease !== undefined) {
107
+ // Only records still in the FIFO belong to the new barrier. Running
108
+ // records keep their existing terminal; withdrawn records surrender
109
+ // readiness and move their payload before later ingress can arrive.
110
+ for (let index = 0; index < previous.pending.length;) {
111
+ const record = previous.pending[index];
112
+ if (record.withdraw?.() === true) {
113
+ record.withdraw = undefined;
114
+ pending.push(record);
115
+ previous.pending.splice(index, 1);
116
+ previous.prefixRelease.cursor -= 1;
117
+ previous.pendingBytes -= packetBytes(record.packet);
118
+ }
119
+ else {
120
+ index += 1;
121
+ }
122
+ }
123
+ }
95
124
  this.active.set(actorId, {
96
125
  oldGeneration,
97
126
  oldNodeRid: sourceOwner.nodeRid,
@@ -101,25 +130,20 @@ class ZLinkActorHandoffCoordinator {
101
130
  phase,
102
131
  deferredJoin: phase === 'provisional',
103
132
  connectionBoundSealed: false,
104
- pending: [],
105
- nextIndex: 0,
133
+ pending,
134
+ nextIndex: pending.reduce((next, record) => Math.max(next, record.packet.index + 1), 0),
106
135
  snapshotIndex: -1,
107
- pendingBytes: 0
136
+ pendingBytes: pending.reduce((bytes, record) => bytes + packetBytes(record.packet), 0)
108
137
  });
109
138
  }
139
+ /** True while a hold owns this Actor's ingress, before its release to the Actor FIFO. */
110
140
  isActive(actorId) {
111
- return this.active.has(actorId);
141
+ const handoff = this.active.get(actorId);
142
+ return handoff !== undefined && handoff.phase !== 'releasing';
112
143
  }
113
144
  isProvisional(actorId) {
114
145
  return this.active.get(actorId)?.phase === 'provisional';
115
146
  }
116
- promoteProvisional(actorId) {
117
- const handoff = this.active.get(actorId);
118
- if (handoff?.phase !== 'provisional') {
119
- throw new Error(`Actor '${actorId}' does not have a provisional packet handoff.`);
120
- }
121
- handoff.phase = 'relocating';
122
- }
123
147
  sealConnectionBoundIngress(actorId) {
124
148
  const handoff = this.active.get(actorId);
125
149
  if (handoff !== undefined)
@@ -166,6 +190,33 @@ class ZLinkActorHandoffCoordinator {
166
190
  return { terminal: Promise.resolve() };
167
191
  return this.admitHandoffPrefix(actorId, handoff, queue, preparation, start);
168
192
  }
193
+ /** Installs a restored target's payload in the same owner used by local handoffs. */
194
+ admitTransferredPrefix(actorId, objectGeneration, packets, queue, preparation, start, onResult) {
195
+ this.beginProvisional(actorId, objectGeneration);
196
+ const handoff = this.requireActive(actorId);
197
+ for (const packet of packets) {
198
+ handoff.pending.push({
199
+ packet,
200
+ origin: 'remote',
201
+ resolve: (response) => {
202
+ if (response !== exports.RELOCATED_REQUEST_OWNED_BY_REQUESTER) {
203
+ onResult(packet, { index: packet.index, ok: true, response });
204
+ }
205
+ },
206
+ reject: (error) => onResult(packet, {
207
+ index: packet.index,
208
+ ok: false,
209
+ error: error instanceof Error ? error.message : String(error),
210
+ errorKind: error instanceof contracts_1.ZLinkFrameworkException
211
+ ? (0, framework_errors_internal_1.internalFrameworkErrorKind)(error)
212
+ : undefined
213
+ })
214
+ });
215
+ handoff.nextIndex = Math.max(handoff.nextIndex, packet.index + 1);
216
+ handoff.pendingBytes += packetBytes(packet);
217
+ }
218
+ return this.admitHandoffPrefix(actorId, handoff, queue, preparation, start);
219
+ }
169
220
  admitHandoffPrefix(actorId, handoff, queue, preparation, start) {
170
221
  if (handoff.releaseTask !== undefined) {
171
222
  return { terminal: handoff.releaseTask };
@@ -241,6 +292,9 @@ class ZLinkActorHandoffCoordinator {
241
292
  prepared = undefined;
242
293
  };
243
294
  return {
295
+ onWithdrawable: (withdraw) => {
296
+ pending.withdraw = withdraw;
297
+ },
244
298
  payloadBytes: packetBytes(pending.packet),
245
299
  preparation: {
246
300
  prepare: async (signal) => {
@@ -264,6 +318,9 @@ class ZLinkActorHandoffCoordinator {
264
318
  cancel
265
319
  },
266
320
  drain: async (replay) => {
321
+ // The FIFO claim, rather than this prefix's eventual terminal,
322
+ // ends the record's durable ownership and transfer capability.
323
+ pending.withdraw = undefined;
267
324
  const admission = prepared === undefined
268
325
  ? undefined
269
326
  : (operation) => prepared.run(operation);
@@ -422,11 +479,23 @@ class ZLinkActorHandoffCoordinator {
422
479
  pending.reject?.(error);
423
480
  }
424
481
  }
425
- capture(origin, actorId, parts, returnResponse = false, remoteBoundSessionTarget, fallbackActorRef, deadlineUnixMs, messageFollowOrigin, provisionalReplay) {
426
- const incomingContext = (0, actor_message_follow_context_1.actorMessageFollowContext)(fallbackActorRef);
482
+ capture(origin, actorId, parts, returnResponse = false, remoteBoundSessionTarget, fallbackActorRef, deadlineUnixMs, messageFollowOrigin, provisionalReplay, onAdmitted) {
483
+ let incomingContext = (0, actor_message_follow_context_1.actorMessageFollowContext)(fallbackActorRef);
427
484
  const originalDeadlineUnixMs = deadlineUnixMs ?? incomingContext?.deadlineUnixMs ?? packetDeadlineUnixMs(parts);
428
- const handoff = this.active.get(actorId);
485
+ const followRoute = this.findMessageFollowRoute(actorId, incomingContext, messageFollowOrigin?.target);
486
+ // An exact departed tenure belongs to its committed route, even while the
487
+ // same Actor incarnation is performing a later Join on this node.
488
+ const handoff = followRoute === undefined ? this.active.get(actorId) : undefined;
489
+ if (incomingContext === undefined &&
490
+ followRoute !== undefined &&
491
+ messageFollowOrigin?.target !== undefined) {
492
+ incomingContext = this.createInitialIngressContext(followRoute.sourceOwner, messageFollowOrigin.target.actor.generation, parts, returnResponse, originalDeadlineUnixMs, messageFollowOrigin);
493
+ }
429
494
  if (handoff !== undefined) {
495
+ if (handoff.phase === 'releasing' &&
496
+ handoff.prefixRelease !== undefined &&
497
+ handoff.pending.at(-1)?.withdraw === undefined)
498
+ return undefined;
430
499
  if (parts.length < 2)
431
500
  return Promise.resolve(undefined);
432
501
  if (handoff.connectionBoundSealed &&
@@ -442,9 +511,13 @@ class ZLinkActorHandoffCoordinator {
442
511
  handoff.replay = provisionalReplay;
443
512
  }
444
513
  const context = incomingContext ??
445
- this.createInitialIngressContext(handoff.sourceOwner, handoff.oldGeneration, parts, returnResponse, originalDeadlineUnixMs);
514
+ this.createInitialIngressContext(handoff.sourceOwner, handoff.oldGeneration, parts, returnResponse, originalDeadlineUnixMs, messageFollowOrigin);
446
515
  try {
447
516
  this.validateContext(actorId, context, parts, returnResponse, fallbackActorRef);
517
+ // Accepted handoff retains its original deadline; Message Follow uses a local relay window.
518
+ if (context.deadlineUnixMs !== undefined && Date.now() >= context.deadlineUnixMs) {
519
+ throw actorDeadlineExceeded(actorId);
520
+ }
448
521
  }
449
522
  catch (error) {
450
523
  return Promise.reject(error);
@@ -473,8 +546,23 @@ class ZLinkActorHandoffCoordinator {
473
546
  return Promise.resolve(undefined);
474
547
  }
475
548
  const result = new Promise((resolve, reject) => {
476
- const source = this.captureRequestSource(handoff.sourceEvidence, context.replyRouteId);
549
+ const original = messageFollowOrigin?.requestSource;
550
+ const originalRidHex = original === undefined ? undefined : (0, routing_id_1.routingIdWireHex)(original.nodeRid);
551
+ const source = original === undefined
552
+ ? this.captureRequestSource(handoff.sourceEvidence, context.replyRouteId)
553
+ : {
554
+ ownerId: original.ownerId,
555
+ ownerLeaseGeneration: original.leaseGeneration.toString(),
556
+ nodeRid: String(original.nodeRid),
557
+ ...(originalRidHex === undefined ? {} : { nodeRidHex: originalRidHex }),
558
+ nodeGeneration: original.nodeGeneration.toString(),
559
+ replyRouteId: messageFollowOrigin.originalReplyRouteId.toString()
560
+ };
477
561
  const requestPacket = { ...packet, source };
562
+ if (original !== undefined) {
563
+ handoff.pending.push({ packet: requestPacket, origin, resolve, reject });
564
+ return;
565
+ }
478
566
  const route = {
479
567
  actorId,
480
568
  operationId: requestPacket.messageFollowContext.operationId,
@@ -491,7 +579,7 @@ class ZLinkActorHandoffCoordinator {
491
579
  this.replyRoutes.delete(source.replyRouteId);
492
580
  if (!route.delivered)
493
581
  route.reject(new Error('Relocation reply route retention expired.'));
494
- }, RELOCATION_REPLY_RETENTION_MS);
582
+ }, service_stateful_registry_1.RELOCATION_REPLY_RETENTION_MS);
495
583
  route.deadline.unref();
496
584
  this.replyRoutes.set(source.replyRouteId, route);
497
585
  handoff.pending.push({
@@ -502,6 +590,7 @@ class ZLinkActorHandoffCoordinator {
502
590
  });
503
591
  });
504
592
  (0, application_job_queue_scope_1.releaseApplicationJobPermitForDurableHandoff)();
593
+ onAdmitted?.();
505
594
  if (handoff.prefixRelease !== undefined) {
506
595
  try {
507
596
  this.admitPendingPrefix(actorId, handoff, handoff.prefixRelease);
@@ -514,7 +603,6 @@ class ZLinkActorHandoffCoordinator {
514
603
  }
515
604
  return result;
516
605
  }
517
- const followRoute = this.findMessageFollowRoute(actorId, incomingContext);
518
606
  const staleGeneration = fallbackActorRef?.objectGeneration;
519
607
  if (fallbackActorRef !== undefined &&
520
608
  this.options.isCurrentActorRef?.(actorId, fallbackActorRef) === true) {
@@ -535,7 +623,7 @@ class ZLinkActorHandoffCoordinator {
535
623
  return Promise.reject(actorLocationStale(actorId));
536
624
  }
537
625
  const packet = encodePacket(0, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef, incomingContext, messageFollowOrigin);
538
- return this.enqueueMessageFollow(followRoute, actorId, packet);
626
+ return this.enqueueMessageFollow(followRoute, actorId, packet, onAdmitted);
539
627
  }
540
628
  this.options.onMarker?.('message_follow_rejected', actorId);
541
629
  return Promise.reject(actorLocationStale(actorId));
@@ -581,23 +669,13 @@ class ZLinkActorHandoffCoordinator {
581
669
  return Promise.reject(error);
582
670
  }
583
671
  const packet = encodePacket(0, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef, context, messageFollowOrigin);
584
- return this.enqueueMessageFollow(followRoute, actorId, packet);
672
+ return this.enqueueMessageFollow(followRoute, actorId, packet, onAdmitted);
585
673
  }
586
674
  snapshot(actorId) {
587
675
  const handoff = this.requireActive(actorId);
588
676
  handoff.snapshotIndex = handoff.pending.length - 1;
589
677
  return handoff.pending.map((entry) => entry.packet);
590
678
  }
591
- snapshotCoreBacklog(actorId) {
592
- const handoff = this.requireActive(actorId);
593
- let snapshotIndex = -1;
594
- while (snapshotIndex + 1 < handoff.pending.length &&
595
- handoff.pending[snapshotIndex + 1].packet.returnResponse === false) {
596
- snapshotIndex++;
597
- }
598
- handoff.snapshotIndex = snapshotIndex;
599
- return handoff.pending.slice(0, snapshotIndex + 1).map((entry) => entry.packet);
600
- }
601
679
  /**
602
680
  * Freezes the post-capture ingress segment immediately before the caller
603
681
  * appends the one-way cutover on the same relocation lane. Records returned
@@ -612,11 +690,22 @@ class ZLinkActorHandoffCoordinator {
612
690
  }
613
691
  complete(actorId, target, targetActorRef, results, targetOwnerFence) {
614
692
  const handoff = this.requireActive(actorId);
615
- const committedTargetOwner = requireExactTargetOwnerFence(actorId, targetOwnerFence);
693
+ const committedTargetOwner = targetOwnerFence === null ? null : requireExactTargetOwnerFence(actorId, targetOwnerFence);
616
694
  this.active.delete(actorId);
695
+ // Location runtime §10: a later owner has no source-local Follow route.
696
+ if (committedTargetOwner === null) {
697
+ const unavailable = actorLocationStale(actorId);
698
+ for (const pending of handoff.pending)
699
+ this.failReleasedPending(pending, unavailable);
700
+ return;
701
+ }
617
702
  const byIndex = new Map(results.map((result) => [result.index, result]));
618
703
  for (let i = 0; i <= handoff.snapshotIndex; i++) {
619
704
  const pending = handoff.pending[i];
705
+ if (pending.packet.messageFollowOrigin?.requestSource !== undefined) {
706
+ pending.resolve?.(exports.RELOCATED_REQUEST_OWNED_BY_REQUESTER);
707
+ continue;
708
+ }
620
709
  if (pending.packet.source !== undefined)
621
710
  continue;
622
711
  const result = byIndex.get(pending.packet.index);
@@ -654,15 +743,25 @@ class ZLinkActorHandoffCoordinator {
654
743
  }
655
744
  }
656
745
  messageFollowCount(actorId) {
657
- return actorId === undefined
658
- ? this.messageFollowRoutes.size
659
- : [...this.messageFollowRoutes.values()].filter((route) => route.targetActorRef.actorId === actorId).length;
746
+ let count = 0;
747
+ if (actorId === undefined) {
748
+ for (const id of this.messageFollowRoutes.keys())
749
+ count += this.messageFollowCount(id);
750
+ }
751
+ else {
752
+ const routes = this.messageFollowRoutes.get(actorId);
753
+ if (routes !== undefined) {
754
+ for (const owners of routes.values())
755
+ count += owners.size;
756
+ }
757
+ }
758
+ return count;
660
759
  }
661
760
  pendingCount(actorId) {
662
761
  return this.active.get(actorId)?.pending.length ?? 0;
663
762
  }
664
763
  isKnownStale(actor) {
665
- return (this.messageFollowCount(actor.actorId) === 0 &&
764
+ return (!this.messageFollowRoutes.has(actor.actorId) &&
666
765
  this.options.isCurrentActorRef?.(actor.actorId, actor) !== true &&
667
766
  this.isKnownStaleRef(actor.actorId, actor));
668
767
  }
@@ -781,8 +880,18 @@ class ZLinkActorHandoffCoordinator {
781
880
  refs.set(exactRefKey, departedAuthorityOwnerGeneration);
782
881
  }
783
882
  }
784
- const key = messageFollowRouteKey(actorId, oldGeneration, sourceOwner);
785
- const previous = this.messageFollowRoutes.get(key);
883
+ const key = messageFollowRouteKey(oldGeneration, sourceOwner.nodeRidHex ?? (0, routing_id_1.encodeRoutingIdStorageHex)(sourceOwner.nodeRid), sourceOwner.nodeGeneration, sourceOwner.authorityOwnerGeneration, sourceOwner.ownerLeaseGeneration);
884
+ let routes = this.messageFollowRoutes.get(actorId);
885
+ if (routes === undefined) {
886
+ routes = new Map();
887
+ this.messageFollowRoutes.set(actorId, routes);
888
+ }
889
+ let owners = routes.get(key);
890
+ if (owners === undefined) {
891
+ owners = new Map();
892
+ routes.set(key, owners);
893
+ }
894
+ const previous = owners.get(sourceOwner.ownerId);
786
895
  if (previous !== undefined)
787
896
  clearTimeout(previous.deadline);
788
897
  const suppressionFence = actorMessageFollowSuppressionFence(actorId, oldGeneration, sourceOwner, targetOwner);
@@ -812,15 +921,24 @@ class ZLinkActorHandoffCoordinator {
812
921
  else {
813
922
  this.messageFollowSuppression.replaceRoute(previous.suppressionFence, suppressionFence);
814
923
  }
815
- this.messageFollowRoutes.set(key, entry);
924
+ owners.set(sourceOwner.ownerId, entry);
816
925
  this.options.onMarker?.('message_follow_registered', actorId, this.messageFollowDurationMs);
817
926
  return entry;
818
927
  }
819
928
  removeMessageFollowRoute(entry) {
820
- if (this.messageFollowRoutes.get(entry.key) !== entry)
929
+ const actorId = entry.targetActorRef.actorId;
930
+ const routes = this.messageFollowRoutes.get(actorId);
931
+ if (routes === undefined)
932
+ return;
933
+ const owners = routes.get(entry.key);
934
+ if (owners?.get(entry.sourceOwner.ownerId) !== entry)
821
935
  return;
822
936
  clearTimeout(entry.deadline);
823
- this.messageFollowRoutes.delete(entry.key);
937
+ owners.delete(entry.sourceOwner.ownerId);
938
+ if (owners.size === 0)
939
+ routes.delete(entry.key);
940
+ if (routes.size === 0)
941
+ this.messageFollowRoutes.delete(actorId);
824
942
  this.messageFollowSuppression.expireRoute(entry.suppressionFence);
825
943
  this.pruneStaleTenureRecords(entry);
826
944
  this.options.onMarker?.('message_follow_route_removed', entry.targetActorRef.actorId);
@@ -857,19 +975,48 @@ class ZLinkActorHandoffCoordinator {
857
975
  if (refs.size === 0)
858
976
  this.staleActorRefs.delete(actorId);
859
977
  }
860
- findMessageFollowRoute(actorId, context) {
861
- if (context === undefined)
978
+ findMessageFollowRoute(actorId, context, nativeTarget) {
979
+ const routes = this.messageFollowRoutes.get(actorId);
980
+ if (routes === undefined)
862
981
  return undefined;
863
- return this.messageFollowRoutes.get(messageFollowRouteKey(actorId, BigInt(context.objectGeneration), context.targetOwner));
982
+ if (context === undefined) {
983
+ if (nativeTarget === undefined || nativeTarget.actor.actorId !== actorId)
984
+ return undefined;
985
+ return routes
986
+ .get(messageFollowRouteKey(nativeTarget.actor.generation, (0, routing_id_1.encodeRoutingIdStorageHex)(nativeTarget.actor.nodeRid), nativeTarget.targetNodeGeneration, nativeTarget.authorityOwnerGeneration, nativeTarget.ownerLeaseGeneration))
987
+ ?.values()
988
+ .next().value;
989
+ }
990
+ const owner = context.targetOwner;
991
+ return routes
992
+ .get(messageFollowRouteKey(BigInt(context.objectGeneration), owner.nodeRidHex ?? (0, routing_id_1.encodeRoutingIdStorageHex)(owner.nodeRid), owner.nodeGeneration, owner.authorityOwnerGeneration, owner.ownerLeaseGeneration))
993
+ ?.get(owner.ownerId);
864
994
  }
865
995
  hasMessageFollowRouteForStaleRef(actorId, actorRef) {
866
- return [...this.messageFollowRoutes.values()].some((route) => route.targetActorRef.actorId === actorId &&
867
- actorRef.objectGeneration === route.oldGeneration &&
868
- (route.oldNodeRid === undefined ||
869
- (0, routing_id_1.routingIdsEqual)(actorRef.nodeRid, (0, actor_message_follow_context_1.messageFollowOwnerNodeRid)(route.sourceOwner))));
996
+ const routes = this.messageFollowRoutes.get(actorId);
997
+ if (routes === undefined)
998
+ return false;
999
+ for (const owners of routes.values()) {
1000
+ for (const route of owners.values()) {
1001
+ if (actorRef.objectGeneration === route.oldGeneration &&
1002
+ (route.oldNodeRid === undefined ||
1003
+ (0, routing_id_1.routingIdsEqual)(actorRef.nodeRid, (0, actor_message_follow_context_1.messageFollowOwnerNodeRid)(route.sourceOwner))))
1004
+ return true;
1005
+ }
1006
+ }
1007
+ return false;
870
1008
  }
871
- createInitialIngressContext(sourceOwner, generation, parts, request, deadlineUnixMs) {
872
- const operationId = (0, actor_message_follow_context_1.createMessageFollowId)();
1009
+ createInitialIngressContext(sourceOwner, generation, parts, request, deadlineUnixMs, origin) {
1010
+ let operationId;
1011
+ if (origin === undefined) {
1012
+ operationId = (0, actor_message_follow_context_1.createMessageFollowId)();
1013
+ }
1014
+ else {
1015
+ const bytes = Buffer.allocUnsafe(operation_identity_1.OPERATION_IDENTITY_BYTES);
1016
+ bytes.writeBigUInt64BE(BigInt.asUintN(stream_wire_1.UINT64_BYTES * 8, origin.originalOperation.high));
1017
+ bytes.writeBigUInt64BE(BigInt.asUintN(stream_wire_1.UINT64_BYTES * 8, origin.originalOperation.low), stream_wire_1.UINT64_BYTES);
1018
+ operationId = bytes.toString('hex');
1019
+ }
873
1020
  return Object.freeze({
874
1021
  operationId,
875
1022
  objectGeneration: generation.toString(),
@@ -877,7 +1024,11 @@ class ZLinkActorHandoffCoordinator {
877
1024
  targetOwner: sourceOwner,
878
1025
  deadlineUnixMs,
879
1026
  correlationId: request ? (0, actor_message_follow_context_1.createMessageFollowId)() : undefined,
880
- replyRouteId: request ? (0, actor_message_follow_context_1.createMessageFollowId)() : undefined,
1027
+ replyRouteId: request
1028
+ ? origin === undefined
1029
+ ? (0, actor_message_follow_context_1.createMessageFollowId)()
1030
+ : operationId
1031
+ : undefined,
881
1032
  request,
882
1033
  hopCount: 0,
883
1034
  visitedOwners: Object.freeze([(0, actor_message_follow_context_1.messageFollowOwnerFenceKey)(sourceOwner)]),
@@ -892,9 +1043,6 @@ class ZLinkActorHandoffCoordinator {
892
1043
  if (context.objectGeneration === '0' || context.request !== request) {
893
1044
  throw actorLocationStale(actorId);
894
1045
  }
895
- if (context.deadlineUnixMs !== undefined && Date.now() >= context.deadlineUnixMs) {
896
- throw actorDeadlineExceeded(actorId);
897
- }
898
1046
  (0, actor_message_follow_context_1.verifyActorMessageFollowPayload)(context, parts);
899
1047
  }
900
1048
  isKnownStaleRef(actorId, actor) {
@@ -927,12 +1075,13 @@ class ZLinkActorHandoffCoordinator {
927
1075
  return BigInt(context.targetOwner.authorityOwnerGeneration);
928
1076
  }
929
1077
  const current = this.options.currentOwnerFence?.(actorId);
930
- if (current !== undefined && current.nodeRid === String(actor.nodeRid)) {
1078
+ if (current !== undefined &&
1079
+ (0, routing_id_1.routingIdsEqual)((0, actor_message_follow_context_1.messageFollowOwnerNodeRid)(current), actor.nodeRid)) {
931
1080
  return BigInt(current.authorityOwnerGeneration);
932
1081
  }
933
1082
  return undefined;
934
1083
  }
935
- enqueueMessageFollow(entry, actorId, packet) {
1084
+ enqueueMessageFollow(entry, actorId, packet, onAdmitted) {
936
1085
  const context = packet.messageFollowContext;
937
1086
  const duplicate = entry.operations.get(context.operationId);
938
1087
  if (duplicate !== undefined) {
@@ -942,6 +1091,7 @@ class ZLinkActorHandoffCoordinator {
942
1091
  this.options.onMarker?.('message_follow_rejected', actorId);
943
1092
  return Promise.reject(actorLocationStale(actorId));
944
1093
  }
1094
+ onAdmitted?.();
945
1095
  return duplicate.result;
946
1096
  }
947
1097
  const bytes = packetBytes(packet);
@@ -963,6 +1113,7 @@ class ZLinkActorHandoffCoordinator {
963
1113
  replyRouteId: context.replyRouteId,
964
1114
  result
965
1115
  });
1116
+ onAdmitted?.();
966
1117
  entry.tail = entry.tail.then(async () => {
967
1118
  try {
968
1119
  resolve(await this.relayMessageFollow(actorId, entry, packet));
@@ -1008,19 +1159,20 @@ class ZLinkActorHandoffCoordinator {
1008
1159
  await this.messageFollowRelayed(actorId, entry, packet, advanced);
1009
1160
  return undefined;
1010
1161
  }
1011
- const remainingMs = remainingRequestTime(actorId, packet.messageFollowContext.deadlineUnixMs);
1162
+ const timeoutMs = this.options.requestTimeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS;
1163
+ const relayDeadlineMs = performance.now() + timeoutMs;
1012
1164
  if (this.options.routedTransport.requestRawToSpot === undefined) {
1013
- const reply = await awaitBeforeDeadline(this.options.routedTransport.requestToSpot(target, payload, {
1165
+ const reply = await (0, request_deadline_1.waitRequestReply)(this.options.routedTransport.requestToSpot(target, payload, {
1014
1166
  packetName: actor_packet_relay_wire_1.ZLINK_REMOTE_ACTOR_PACKET_RELAY_PACKET,
1015
- timeoutMs: remainingMs ?? this.options.requestTimeoutMs
1016
- }), actorId, remainingMs);
1167
+ timeoutMs
1168
+ }), actorId, relayDeadlineMs);
1017
1169
  if (reply.ok === false) {
1018
1170
  throw actorRelayError(actorId, reply.errorKind, reply.error);
1019
1171
  }
1020
1172
  await this.messageFollowRelayed(actorId, entry, packet, advanced);
1021
1173
  return reply.response;
1022
1174
  }
1023
- const response = await awaitBeforeDeadline((0, actor_routed_json_request_1.requestRoutedJsonReply)(this.options.routedTransport, target, payload, { timeoutMs: remainingMs ?? this.options.requestTimeoutMs }, `Actor Message Follow raw request is not available for '${actorId}'.`, (parts) => {
1175
+ const response = await (0, request_deadline_1.waitRequestReply)((0, actor_routed_json_request_1.requestRoutedJsonReply)(this.options.routedTransport, target, payload, { timeoutMs }, `Actor Message Follow raw request is not available for '${actorId}'.`, (parts) => {
1024
1176
  if (parts.length === 0) {
1025
1177
  throw new Error(`Actor Message Follow reply was empty for '${actorId}'.`);
1026
1178
  }
@@ -1029,7 +1181,7 @@ class ZLinkActorHandoffCoordinator {
1029
1181
  throw actorRelayError(actorId, reply.errorKind, reply.error);
1030
1182
  }
1031
1183
  return reply.response;
1032
- }), actorId, remainingMs);
1184
+ }), actorId, relayDeadlineMs);
1033
1185
  await this.messageFollowRelayed(actorId, entry, packet, advanced);
1034
1186
  return response;
1035
1187
  }
@@ -1177,31 +1329,6 @@ function packetDeadlineUnixMs(parts) {
1177
1329
  return undefined;
1178
1330
  }
1179
1331
  }
1180
- function remainingRequestTime(actorId, deadlineUnixMs) {
1181
- if (deadlineUnixMs === undefined)
1182
- return undefined;
1183
- const remaining = deadlineUnixMs - Date.now();
1184
- if (remaining <= 0)
1185
- throw actorDeadlineExceeded(actorId);
1186
- return Math.max(1, Math.ceil(remaining));
1187
- }
1188
- async function awaitBeforeDeadline(operation, actorId, remainingMs) {
1189
- if (remainingMs === undefined)
1190
- return await operation;
1191
- let timer;
1192
- try {
1193
- return await Promise.race([
1194
- operation,
1195
- new Promise((_resolve, reject) => {
1196
- timer = setTimeout(() => reject(actorDeadlineExceeded(actorId)), remainingMs);
1197
- })
1198
- ]);
1199
- }
1200
- finally {
1201
- if (timer !== undefined)
1202
- clearTimeout(timer);
1203
- }
1204
- }
1205
1332
  async function waitForHandoffReplayStart(start, signal) {
1206
1333
  if (signal.aborted)
1207
1334
  throw signal.reason;
@@ -1217,8 +1344,8 @@ async function waitForHandoffReplayStart(start, signal) {
1217
1344
  signal.removeEventListener('abort', abort);
1218
1345
  }
1219
1346
  }
1220
- function messageFollowRouteKey(actorId, objectGeneration, sourceOwner) {
1221
- return `${actorId}\u0000${objectGeneration}\u0000${(0, actor_message_follow_context_1.messageFollowOwnerFenceKey)(sourceOwner)}`;
1347
+ function messageFollowRouteKey(objectGeneration, nodeRidHex, nodeGeneration, authorityOwnerGeneration, ownerLeaseGeneration) {
1348
+ return `${objectGeneration}\u0000${nodeRidHex}\u0000${nodeGeneration}\u0000${authorityOwnerGeneration}\u0000${ownerLeaseGeneration}`;
1222
1349
  }
1223
1350
  function actorRefKey(nodeRid, generation) {
1224
1351
  return `${(0, routing_id_1.encodeRoutingIdStorageHex)(nodeRid)}\u0000${generation}`;
@@ -1230,7 +1357,7 @@ function requestSourcesEqual(expected, actual) {
1230
1357
  return (expected.replyRouteId === actual.replyRouteId &&
1231
1358
  expected.ownerId === actual.ownerId &&
1232
1359
  expected.ownerLeaseGeneration === actual.ownerLeaseGeneration &&
1233
- expected.nodeRid === actual.nodeRid &&
1360
+ (0, routing_id_1.routingIdsEqual)((0, routing_id_1.decodeRoutingId)(expected.nodeRid, expected.nodeRidHex), (0, routing_id_1.decodeRoutingId)(actual.nodeRid, actual.nodeRidHex)) &&
1234
1361
  expected.nodeGeneration === actual.nodeGeneration &&
1235
1362
  /^[1-9][0-9]*$/.test(actual.ownerLeaseGeneration) &&
1236
1363
  /^[1-9][0-9]*$/.test(actual.nodeGeneration));
@@ -29,8 +29,11 @@ export interface ZLinkActorJoinRelocation {
29
29
  };
30
30
  /** Target's advertised relocation state chunk cap from the accepted admission reply. */
31
31
  readonly advertisedReceiveChunkLimitBytes?: number;
32
+ readonly deadlineAtMs?: number;
32
33
  readonly signal?: AbortSignal;
33
34
  }): Promise<{
35
+ /** Source-only terminal after relay readiness transferred public completion. */
36
+ readonly sourceCleanup?: () => Promise<void>;
34
37
  readonly actorRef: ZLinkBackendActorRef;
35
38
  readonly membershipEpoch: bigint;
36
39
  readonly spotGeneration: bigint;