@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
@@ -43,11 +43,21 @@ class ServiceLivenessConnection {
43
43
  }
44
44
  exports.ServiceLivenessConnection = ServiceLivenessConnection;
45
45
  /** Uses monotonic milliseconds and never treats application traffic as a probe ACK. */
46
+ const NO_LIVENESS_WORK = Object.freeze({
47
+ probes: Object.freeze([]),
48
+ timedOutNodes: Object.freeze([])
49
+ });
46
50
  class ServiceLivenessRegistry {
47
51
  probeIntervalMs;
48
52
  peerTimeoutMs;
49
53
  peers = new Map();
50
54
  nextProbeId = 1n;
55
+ /**
56
+ * The earliest probe or timeout among admitted peers. Received traffic only
57
+ * extends a peer's deadline, so this stays a lower bound between ticks.
58
+ */
59
+ nextDueMs = Number.POSITIVE_INFINITY;
60
+ admissionActivityMs;
51
61
  constructor(probeIntervalMs = exports.DEFAULT_SERVICE_PROBE_INTERVAL_MS, peerTimeoutMs = exports.DEFAULT_SERVICE_PEER_TIMEOUT_MS) {
52
62
  this.probeIntervalMs = probeIntervalMs;
53
63
  this.peerTimeoutMs = peerTimeoutMs;
@@ -69,8 +79,31 @@ class ServiceLivenessRegistry {
69
79
  return current;
70
80
  const admitted = new ServiceLivenessConnection(connectionId, nowMs, this.probeIntervalMs, this.peerTimeoutMs);
71
81
  this.peers.set(nodeRoutingId, admitted);
82
+ this.nextDueMs = Math.min(this.nextDueMs, admitted.nextProbeMs, admitted.deadlineMs);
72
83
  return admitted;
73
84
  }
85
+ /** When the next tick has probe or timeout work (spec 08 §4.2 management deadline). */
86
+ nextDeadlineMs() {
87
+ return Math.min(this.nextDueMs, this.nextAdmissionDeadlineMs());
88
+ }
89
+ /** Pending admission shares the existing liveness management cadence (MeshNode §7.1). */
90
+ setAdmissionPending(pending, nowMs) {
91
+ if (pending)
92
+ this.admissionActivityMs ??= nowMs;
93
+ else
94
+ this.admissionActivityMs = undefined;
95
+ }
96
+ nextAdmissionDeadlineMs() {
97
+ return this.admissionActivityMs === undefined
98
+ ? Number.POSITIVE_INFINITY
99
+ : this.admissionActivityMs + this.probeIntervalMs;
100
+ }
101
+ tickAdmission(nowMs) {
102
+ if (nowMs < this.nextAdmissionDeadlineMs())
103
+ return false;
104
+ this.admissionActivityMs = nowMs;
105
+ return true;
106
+ }
74
107
  recordReceived(connection, nowMs) {
75
108
  connection.recordReceived(nowMs);
76
109
  }
@@ -95,8 +128,11 @@ class ServiceLivenessRegistry {
95
128
  return { nodeRoutingId, connectionId, probeId };
96
129
  }
97
130
  tick(nowMs) {
131
+ if (nowMs < this.nextDeadlineMs())
132
+ return NO_LIVENESS_WORK;
98
133
  const probes = [];
99
134
  const timedOutNodes = [];
135
+ let nextDueMs = Number.POSITIVE_INFINITY;
100
136
  for (const [nodeRoutingId, peer] of this.peers) {
101
137
  if (peer.isExpired(nowMs)) {
102
138
  timedOutNodes.push(nodeRoutingId);
@@ -106,7 +142,9 @@ class ServiceLivenessRegistry {
106
142
  const probeId = peer.tryGetProbe(nowMs, this.allocateProbeId);
107
143
  if (probeId !== undefined)
108
144
  probes.push({ nodeRoutingId, connectionId: peer.connectionId, probeId });
145
+ nextDueMs = Math.min(nextDueMs, peer.nextProbeMs, peer.deadlineMs);
109
146
  }
147
+ this.nextDueMs = nextDueMs;
110
148
  timedOutNodes.sort();
111
149
  return { probes, timedOutNodes };
112
150
  }
@@ -1,11 +1,18 @@
1
1
  import type { ApplicationJobRecordLease } from '../application-jobs/application-ingress-record-owner';
2
2
  import type { ReceiveRecord } from './service-runtime-contracts';
3
+ import type { RawServiceIngressRecord } from './raw-service-mesh-runtime';
3
4
  export type ServiceMailboxDomain = 'application' | 'infrastructure';
5
+ export interface ServiceMailboxDispatchOwner {
6
+ prepareDispatch(record: ServiceMailboxRecord, signal: AbortSignal): boolean | Promise<boolean>;
7
+ }
4
8
  export interface ServiceMailboxRecord {
9
+ readonly sourcePreparationOwner?: ServiceMailboxDispatchOwner;
10
+ readonly ingress?: RawServiceIngressRecord;
5
11
  readonly owner: string;
6
12
  readonly domain: ServiceMailboxDomain;
7
13
  parts: readonly Uint8Array[];
8
14
  readonly sourceRoutingId?: string;
15
+ readonly requestSource?: import('../locations/request-source-resolver').ZLinkRequestSourceFence;
9
16
  readonly sourceRoute?: Uint8Array;
10
17
  readonly requestSequence?: bigint;
11
18
  readonly reply?: (parts: readonly Uint8Array[]) => void;
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ServiceMaintenanceRuntime = void 0;
4
- const node_async_hooks_1 = require("node:async_hooks");
5
4
  const state_lane_1 = require("../execution/state-lane");
6
- const detachedStateLaneResource = new node_async_hooks_1.AsyncResource('zlink:service-maintenance-runtime');
7
5
  /** Owns first-intent-wins maintenance admission and terminal observation. */
8
6
  class ServiceMaintenanceRuntime {
9
7
  options;
@@ -156,7 +154,7 @@ class ServiceMaintenanceRuntime {
156
154
  continue;
157
155
  admitted = true;
158
156
  let running;
159
- running = startOutsideStateLane(() => unit
157
+ running = (0, state_lane_1.startOutsideStateLane)(() => unit
160
158
  .relocate(signal)
161
159
  .catch((error) => {
162
160
  failures.push(error);
@@ -206,6 +204,3 @@ class ServiceMaintenanceRuntime {
206
204
  }
207
205
  }
208
206
  exports.ServiceMaintenanceRuntime = ServiceMaintenanceRuntime;
209
- function startOutsideStateLane(work) {
210
- return detachedStateLaneResource.runInAsyncScope(work);
211
- }
@@ -15,7 +15,7 @@ export interface ServiceRelocationCaptureUnit {
15
15
  readonly authorityOwnerGeneration: bigint;
16
16
  seal(signal?: AbortSignal): Promise<ServiceRelocationSealedWork>;
17
17
  captureApplicationState(signal?: AbortSignal): Promise<Uint8Array>;
18
- commitSeal(): Promise<void> | void;
18
+ commitSeal(followAuthorities: ReadonlyMap<string, ZLinkAuthoritySnapshot>): Promise<void> | void;
19
19
  abortSeal(): Promise<void> | void;
20
20
  /** Expired-owner terminal: pending requests fail once and dispatch stays closed. */
21
21
  discardSeal?(reason: unknown): Promise<void> | void;
@@ -25,7 +25,7 @@ export declare class ServiceCapturedObjectRelocation {
25
25
  private readonly units;
26
26
  private terminal;
27
27
  constructor(envelope: ServiceRelocationEnvelope, units: readonly ServiceRelocationCaptureUnit[]);
28
- commitSource(): Promise<void>;
28
+ commitSource(followAuthorities: ReadonlyMap<string, ZLinkAuthoritySnapshot>): Promise<void>;
29
29
  abortSource(): Promise<void>;
30
30
  /**
31
31
  * The source owner lease ended before the authority settled (spec 28 §4.4):
@@ -53,7 +53,6 @@ export interface ServiceRelocationTargetObjectPort<THidden extends ServiceReloca
53
53
  publish(hidden: THidden, authority: ZLinkAuthoritySnapshot, signal?: AbortSignal): Promise<void>;
54
54
  restoreBoundSession(hidden: THidden, payload: Uint8Array, signal?: AbortSignal): Promise<void>;
55
55
  replayQueuedMessage(hidden: THidden, message: ServiceRelocationQueuedMessage, signal?: AbortSignal): Promise<void>;
56
- restoreTimer(hidden: THidden, timer: ServiceRelocationTimer, signal?: AbortSignal): Promise<void>;
57
56
  normalize(hidden: THidden, authority: ZLinkAuthoritySnapshot, signal?: AbortSignal): Promise<void>;
58
57
  openAdmission(hidden: THidden, signal?: AbortSignal): Promise<void>;
59
58
  abort(hidden: THidden): Promise<void> | void;
@@ -10,14 +10,14 @@ class ServiceCapturedObjectRelocation {
10
10
  this.envelope = envelope;
11
11
  this.units = units;
12
12
  }
13
- async commitSource() {
13
+ async commitSource(followAuthorities) {
14
14
  if (this.terminal === 'committed')
15
15
  return;
16
16
  if (this.terminal !== 'open') {
17
17
  throw new Error(`Relocation source capture was already ${this.terminal}.`);
18
18
  }
19
19
  for (const unit of this.units)
20
- await unit.commitSeal();
20
+ await unit.commitSeal(followAuthorities);
21
21
  this.terminal = 'committed';
22
22
  }
23
23
  async abortSource() {
@@ -26,18 +26,11 @@ class ServiceCapturedObjectRelocation {
26
26
  if (this.terminal !== 'open') {
27
27
  throw new Error(`A ${this.terminal} relocation source capture cannot be aborted.`);
28
28
  }
29
- const failures = [];
30
- for (const unit of [...this.units].reverse()) {
31
- try {
32
- await unit.abortSeal();
33
- }
34
- catch (error) {
35
- failures.push(error);
36
- }
29
+ try {
30
+ await abortSourceSeals(this.units);
37
31
  }
38
- this.terminal = 'aborted';
39
- if (failures.length !== 0) {
40
- throw new AggregateError(failures, 'Relocation source rollback was incomplete.');
32
+ finally {
33
+ this.terminal = 'aborted';
41
34
  }
42
35
  }
43
36
  /**
@@ -91,24 +84,29 @@ class ServiceRelocationObjectCaptureOwner {
91
84
  try {
92
85
  for (const unit of units) {
93
86
  signal?.throwIfAborted();
94
- const work = await unit.seal(signal);
95
- captured.push({ unit, work });
87
+ const capture = { unit };
88
+ captured.push(capture);
89
+ capture.work = await unit.seal(signal);
96
90
  }
97
- const participants = await mapConcurrentOrdered(captured, this.maxConcurrentCallbacks, async ({ unit, work }) => ({
98
- key: unit.authorityKey,
99
- objectKind: unit.objectKind,
100
- stableType: unit.stableType,
101
- objectGeneration: unit.objectGeneration,
102
- authorityOwnerGeneration: unit.authorityOwnerGeneration,
103
- applicationState: Buffer.from(await unit.captureApplicationState(signal)),
104
- boundSessionState: Buffer.from(work.boundSessionState),
105
- ...(work.sessionBinding === undefined ? {} : { sessionBinding: work.sessionBinding }),
106
- queuedMessages: work.queuedMessages.map((message) => ({
107
- sequence: message.sequence,
108
- payload: Buffer.from(message.payload)
109
- })),
110
- timers: work.timers.map((timer) => ({ ...timer }))
111
- }), signal);
91
+ const participants = await mapConcurrentOrdered(captured, this.maxConcurrentCallbacks, async ({ unit, work: sealedWork }) => {
92
+ // Application capture starts only after every seal completed.
93
+ const work = sealedWork;
94
+ return {
95
+ key: unit.authorityKey,
96
+ objectKind: unit.objectKind,
97
+ stableType: unit.stableType,
98
+ objectGeneration: unit.objectGeneration,
99
+ authorityOwnerGeneration: unit.authorityOwnerGeneration,
100
+ applicationState: Buffer.from(await unit.captureApplicationState(signal)),
101
+ boundSessionState: Buffer.from(work.boundSessionState),
102
+ ...(work.sessionBinding === undefined ? {} : { sessionBinding: work.sessionBinding }),
103
+ queuedMessages: work.queuedMessages.map((message) => ({
104
+ sequence: message.sequence,
105
+ payload: Buffer.from(message.payload)
106
+ })),
107
+ timers: work.timers.map((timer) => ({ ...timer }))
108
+ };
109
+ }, signal);
112
110
  return new ServiceCapturedObjectRelocation({
113
111
  aggregateId,
114
112
  aggregateGeneration,
@@ -117,13 +115,31 @@ class ServiceRelocationObjectCaptureOwner {
117
115
  }, units);
118
116
  }
119
117
  catch (error) {
120
- for (const { unit } of captured.reverse())
121
- await unit.abortSeal();
118
+ try {
119
+ await abortSourceSeals(captured.map(({ unit }) => unit));
120
+ }
121
+ catch (rollbackError) {
122
+ throw new AggregateError([error, rollbackError], 'Relocation capture failed and source rollback was incomplete.');
123
+ }
122
124
  throw error;
123
125
  }
124
126
  }
125
127
  }
126
128
  exports.ServiceRelocationObjectCaptureOwner = ServiceRelocationObjectCaptureOwner;
129
+ async function abortSourceSeals(units) {
130
+ const failures = [];
131
+ for (const unit of [...units].reverse()) {
132
+ try {
133
+ await unit.abortSeal();
134
+ }
135
+ catch (error) {
136
+ failures.push(error);
137
+ }
138
+ }
139
+ if (failures.length !== 0) {
140
+ throw new AggregateError(failures, 'Relocation source rollback was incomplete.');
141
+ }
142
+ }
127
143
  /** Restores an exact User Spot aggregate or standalone Actor into hidden objects. */
128
144
  class ServiceRelocationObjectRestoreOwner {
129
145
  target;
@@ -183,9 +199,6 @@ class ServiceRelocationObjectRestoreOwner {
183
199
  for (const message of participant.queuedMessages) {
184
200
  await this.target.replayQueuedMessage(hidden, message, signal);
185
201
  }
186
- for (const timer of participant.timers) {
187
- await this.target.restoreTimer(hidden, timer, signal);
188
- }
189
202
  }
190
203
  }
191
204
  /** Appends one post-capture relay to the already restored temporary queue. */
@@ -536,12 +536,16 @@ function decodeServiceRelocationEnvelope(payload, aggregateGeneration) {
536
536
  });
537
537
  }
538
538
  for (const timer of generated.timerRegistrations) {
539
+ const dueAtUnixMs = unixMilliseconds(timer.nextScheduledAtUnixMilliseconds);
540
+ const intervalMs = unixMilliseconds(timer.periodMilliseconds);
539
541
  byId.get(timer.participantId).timers.push({
540
542
  timerId: timer.name,
541
543
  handlerType: timer.handlerType,
542
- startedAtUnixMs: 0,
543
- dueAtUnixMs: unixMilliseconds(timer.nextScheduledAtUnixMilliseconds),
544
- intervalMs: unixMilliseconds(timer.periodMilliseconds),
544
+ // The wire anchors the nominal schedule by its next due time: the next
545
+ // nominal tick after the completed ScheduledIndex (Spot timer §1).
546
+ startedAtUnixMs: dueAtUnixMs - Number(timer.lastCompletedScheduledIndex + 1n) * intervalMs,
547
+ dueAtUnixMs,
548
+ intervalMs,
545
549
  overrunPolicy: timerPolicyName(timer.overrunPolicy),
546
550
  maxCatchUpTicks: unixMilliseconds(timer.maxCatchUpTicks),
547
551
  stopOnUnhandledException: timer.stopOnUnhandledException,
@@ -205,11 +205,18 @@ export interface ReceiveRequirements {
205
205
  readonly byteCount: number;
206
206
  }
207
207
  export interface ZLinkMessageFollowOrigin {
208
+ readonly requestSource?: import('../locations/request-source-resolver').ZLinkRequestSourceFence;
208
209
  readonly sourceNodeRid: RoutingId;
209
210
  readonly originalOperation: MeshOperationId;
210
211
  readonly originalReplyRouteId: bigint;
212
+ /** The canonical target accepted with the original native Actor frame. */
213
+ readonly target?: import('./service-stateful-wire-codec').ServiceActorRouteFence;
211
214
  }
212
215
  export interface ReceiveRecord {
216
+ /** Resolve record prerequisites in owner order, outside an application handler turn. */
217
+ readonly prepareDispatch?: (this: ReceiveRecord, signal: AbortSignal) => boolean | Promise<boolean>;
218
+ readonly statefulMailboxRecord?: import('./service-mailbox').ServiceMailboxRecord;
219
+ readonly requestSource?: import('../locations/request-source-resolver').ZLinkRequestSourceFence;
213
220
  readonly kind: number;
214
221
  readonly domain: number;
215
222
  readonly sourceNodeRid: RoutingId | null;
@@ -314,7 +321,7 @@ export interface StreamSessionService {
314
321
  close(): void;
315
322
  status(): StreamSessionStatus;
316
323
  lookupActor(targetNodeRid: RoutingId, actorId: string, timeoutMs?: number): MeshOperationId;
317
- bindActor(sessionRid: RoutingId, actor: ServiceActorRef, timeoutMs?: number, onBindingReplaced?: (actorId: string, retiredSession: ServiceRetiredBoundSessionRouteFence, actor: ServiceActorRef) => void, actorAuthority?: StreamSessionActorAuthorityFence): MeshOperationId;
324
+ bindActor(sessionRid: RoutingId, actor: ServiceActorRef, timeoutMs?: number, onBindingReplaced?: (actorId: string, retiredSession: ServiceRetiredBoundSessionRouteFence, actor: ServiceActorRef) => void, actorAuthority?: StreamSessionActorAuthorityFence, close?: () => Promise<void>): MeshOperationId;
318
325
  unbindActor(sessionRid: RoutingId, actor: ServiceActorRef, expectedBindingGeneration: bigint, timeoutMs?: number): MeshOperationId;
319
326
  bindings(sessionRid: RoutingId): ReadonlyArray<ServiceStreamSessionBinding>;
320
327
  sendToActor(sessionRid: RoutingId, actor: ServiceActorRef, parts: MessageLike | readonly MessageLike[], options?: {
@@ -1,5 +1,6 @@
1
+ import type { RoutingId } from '../../contracts';
1
2
  export interface ServiceSessionBindingIngressPort {
2
- actorSlot(actorId: string, sessionRid: string): Promise<number | undefined>;
3
+ actorSlot(actorId: string, sessionRid: RoutingId): Promise<number | undefined>;
3
4
  }
4
5
  export declare function registerServiceSessionBindingIngressPort(service: object, port: ServiceSessionBindingIngressPort): void;
5
6
  export declare function serviceSessionBindingIngressPortIfRegistered(service: object): ServiceSessionBindingIngressPort | undefined;
@@ -95,7 +95,6 @@ export declare class ServiceStatefulRegistry {
95
95
  private readonly reservationAttempts;
96
96
  private readonly turns;
97
97
  private nextReservationId;
98
- private nextBindingGeneration;
99
98
  constructor(nodeRid: string, nodeGeneration: bigint);
100
99
  createEntrySpot(spotId?: string): ServiceSpotState;
101
100
  private createEntrySpotCore;
@@ -117,8 +116,7 @@ export declare class ServiceStatefulRegistry {
117
116
  private joinActorCore;
118
117
  leaveActor(actor: ServiceActorRef, expectedMembershipEpoch: bigint): ServiceMembershipTransition;
119
118
  destroyActor(actor: ServiceActorRef): ServiceActorState;
120
- bindSession(actor: ServiceActorRef, sessionRid: string, sessionOwnerNodeRid: string, sessionOwnerNodeGeneration?: bigint, sessionOwnerId?: string, sessionOwnerLeaseGeneration?: bigint): ServiceSessionBinding;
121
- installSessionBinding(binding: ServiceSessionBinding): void;
119
+ installSessionBinding(binding: ServiceSessionBinding): ServiceSessionBinding;
122
120
  binding(actor: ServiceActorRef): ServiceSessionBinding | undefined;
123
121
  private bindingCore;
124
122
  unbindSession(actor: ServiceActorRef, expectedBindingGeneration: bigint, expectedSessionRid?: string, expectedSessionOwnerNodeRid?: string): boolean;
@@ -129,17 +127,20 @@ export declare class ServiceStatefulRegistry {
129
127
  runTurn<T>(owner: string, work: () => T | Promise<T>): Promise<T>;
130
128
  private updateBindingMembership;
131
129
  }
130
+ export declare const RELOCATION_REPLY_RETENTION_MS: number;
132
131
  export declare class ServiceTerminalOperationRegistry<T, Context = unknown> {
133
132
  private readonly operations;
134
133
  constructor(operations?: OperationRegistry<T, Context>);
135
134
  register(timeoutMs: number, timeoutOwner?: 'registry' | 'sender', context?: Context): PendingOperation<T>;
136
- reply(id: bigint, value: T): boolean;
135
+ reply(id: bigint, value: T, terminalContextRetentionMs?: number): boolean;
137
136
  fail(id: bigint, error: unknown): boolean;
138
137
  cancel(id: bigint): boolean;
139
138
  isPending(id: bigint): boolean;
140
139
  context(id: bigint): Context | undefined;
141
140
  get size(): number;
141
+ nextDeadlineMs(): number;
142
142
  expire(nowMs: number, turnDeadlineMs: number): number;
143
143
  close(): void;
144
+ failAll(reason: unknown): void;
144
145
  }
145
146
  export {};
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ServiceTerminalOperationRegistry = exports.ServiceStatefulRegistry = exports.ServiceStaleGenerationError = void 0;
3
+ exports.ServiceTerminalOperationRegistry = exports.RELOCATION_REPLY_RETENTION_MS = exports.ServiceStatefulRegistry = exports.ServiceStaleGenerationError = void 0;
4
4
  const CoreTypes_1 = require("../../contracts/Common/CoreTypes");
5
+ const routing_id_1 = require("../routing-id");
6
+ const service_wire_binary_primitives_1 = require("./service-wire-binary-primitives");
5
7
  const operation_registry_1 = require("./operation-registry");
6
8
  class ServiceStaleGenerationError extends Error {
7
9
  objectKind;
@@ -33,7 +35,6 @@ class ServiceStatefulRegistry {
33
35
  reservationAttempts = new Map();
34
36
  turns = new Map();
35
37
  nextReservationId = 1n;
36
- nextBindingGeneration = 1n;
37
38
  constructor(nodeRid, nodeGeneration) {
38
39
  this.nodeRid = nodeRid;
39
40
  this.nodeGeneration = nodeGeneration;
@@ -238,37 +239,26 @@ class ServiceStatefulRegistry {
238
239
  this.bindings.delete(actorKey(actor));
239
240
  return current;
240
241
  }
241
- bindSession(actor, sessionRid, sessionOwnerNodeRid, sessionOwnerNodeGeneration, sessionOwnerId, sessionOwnerLeaseGeneration) {
242
- const current = this.requireActorCore(actor);
243
- requireText(sessionRid, 'sessionRid');
244
- requireText(sessionOwnerNodeRid, 'sessionOwnerNodeRid');
245
- const binding = Object.freeze({
246
- actor: Object.freeze({ ...current.ref }),
247
- sessionRid,
248
- sessionOwnerNodeRid,
249
- ...(sessionOwnerNodeGeneration === undefined ? {} : { sessionOwnerNodeGeneration }),
250
- ...(sessionOwnerId === undefined ? {} : { sessionOwnerId }),
251
- ...(sessionOwnerLeaseGeneration === undefined ? {} : { sessionOwnerLeaseGeneration }),
252
- bindingGeneration: this.nextBindingGeneration++,
253
- membershipEpoch: current.membershipEpoch
254
- });
255
- this.bindings.set(actorKey(actor), binding);
256
- return binding;
257
- }
258
242
  installSessionBinding(binding) {
259
243
  this.requireActorCore(binding.actor);
244
+ (0, service_wire_binary_primitives_1.encodeServiceWireRoutingId)(binding.sessionRid, 'sessionRid', CoreTypes_1.ZLINK_MAX_ROUTING_ID_BYTES, (message) => {
245
+ throw new RangeError(message);
246
+ });
247
+ requireText(binding.sessionOwnerNodeRid, 'sessionOwnerNodeRid');
260
248
  requirePositive(binding.bindingGeneration, 'bindingGeneration');
261
249
  const current = this.bindings.get(actorKey(binding.actor));
262
250
  if (current !== undefined &&
263
251
  current.sessionOwnerNodeRid === binding.sessionOwnerNodeRid &&
264
252
  current.sessionOwnerNodeGeneration === binding.sessionOwnerNodeGeneration &&
265
- current.sessionOwnerId === binding.sessionOwnerId &&
266
- current.sessionOwnerLeaseGeneration === binding.sessionOwnerLeaseGeneration &&
267
253
  current.bindingGeneration >= binding.bindingGeneration) {
254
+ if (current.bindingGeneration === binding.bindingGeneration &&
255
+ current.sessionRid === binding.sessionRid)
256
+ return current;
268
257
  throw new ServiceStaleGenerationError('binding', binding.actor.actorId);
269
258
  }
270
- this.nextBindingGeneration = max(this.nextBindingGeneration, binding.bindingGeneration + 1n);
271
- this.bindings.set(actorKey(binding.actor), Object.freeze({ ...binding }));
259
+ const accepted = Object.freeze({ ...binding });
260
+ this.bindings.set(actorKey(binding.actor), accepted);
261
+ return accepted;
272
262
  }
273
263
  binding(actor) {
274
264
  return this.bindingCore(actor);
@@ -283,7 +273,8 @@ class ServiceStatefulRegistry {
283
273
  if (binding === undefined)
284
274
  return false;
285
275
  if (binding.bindingGeneration !== expectedBindingGeneration ||
286
- (expectedSessionRid !== undefined && binding.sessionRid !== expectedSessionRid) ||
276
+ (expectedSessionRid !== undefined &&
277
+ !(0, routing_id_1.routingIdsEqual)(binding.sessionRid, expectedSessionRid)) ||
287
278
  (expectedSessionOwnerNodeRid !== undefined &&
288
279
  binding.sessionOwnerNodeRid !== expectedSessionOwnerNodeRid)) {
289
280
  throw new ServiceStaleGenerationError('binding', actor.actorId);
@@ -425,6 +416,7 @@ function createSpotState(ref, kind, stableType, authorityOwnerGeneration) {
425
416
  return Object.freeze({ ...base, kind, stableType });
426
417
  }
427
418
  }
419
+ exports.RELOCATION_REPLY_RETENTION_MS = 24 * 60 * 60 * 1_000;
428
420
  class ServiceTerminalOperationRegistry {
429
421
  operations;
430
422
  constructor(operations = new operation_registry_1.OperationRegistry()) {
@@ -433,8 +425,8 @@ class ServiceTerminalOperationRegistry {
433
425
  register(timeoutMs, timeoutOwner = 'registry', context) {
434
426
  return this.operations.register(timeoutMs, timeoutOwner, context);
435
427
  }
436
- reply(id, value) {
437
- return this.operations.complete(id, value);
428
+ reply(id, value, terminalContextRetentionMs = 0) {
429
+ return this.operations.complete(id, value, terminalContextRetentionMs);
438
430
  }
439
431
  fail(id, error) {
440
432
  return this.operations.fail(id, error);
@@ -451,12 +443,18 @@ class ServiceTerminalOperationRegistry {
451
443
  get size() {
452
444
  return this.operations.size;
453
445
  }
446
+ nextDeadlineMs() {
447
+ return this.operations.nextDeadlineMs();
448
+ }
454
449
  expire(nowMs, turnDeadlineMs) {
455
450
  return this.operations.expire(nowMs, turnDeadlineMs);
456
451
  }
457
452
  close() {
458
453
  this.operations.close('Stateful runtime closed.');
459
454
  }
455
+ failAll(reason) {
456
+ this.operations.failAll(reason);
457
+ }
460
458
  }
461
459
  exports.ServiceTerminalOperationRegistry = ServiceTerminalOperationRegistry;
462
460
  function actorKey(actor) {