@zlink-systems/framework 0.30.3 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Actors/ZLinkActor.d.ts +2 -0
  3. package/dist/contracts/Actors/ZLinkSessionBindingIdentity.d.ts +6 -0
  4. package/dist/contracts/Actors/ZLinkSessionBindingIdentity.js +2 -0
  5. package/dist/contracts/Actors/index.d.ts +1 -0
  6. package/dist/contracts/Actors/index.js +1 -0
  7. package/dist/contracts/Common/CoreTypes.d.ts +1 -0
  8. package/dist/contracts/Common/HandlerMessageType.d.ts +8 -0
  9. package/dist/contracts/Common/HandlerMessageType.js +41 -0
  10. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +1 -1
  11. package/dist/contracts/Common/ZLinkEncodedPayload.js +12 -20
  12. package/dist/contracts/Common/ZLinkMessage.js +11 -7
  13. package/dist/contracts/Common/encoded-payload-storage.d.ts +0 -2
  14. package/dist/contracts/Common/encoded-payload-storage.js +4 -16
  15. package/dist/contracts/Common/index.d.ts +1 -1
  16. package/dist/contracts/Common/payload-slab.d.ts +4 -0
  17. package/dist/contracts/Common/payload-slab.js +30 -0
  18. package/dist/contracts/Configuration/RegistrationBuilders.js +15 -9
  19. package/dist/contracts/Configuration/RegistrationTypes.d.ts +19 -0
  20. package/dist/contracts/Handlers/Contexts.d.ts +1 -0
  21. package/dist/contracts/Locations/Authority.d.ts +2 -0
  22. package/dist/internal.d.ts +9 -0
  23. package/dist/internal.js +23 -1
  24. package/dist/nest-integration.d.ts +1 -0
  25. package/dist/nest-integration.js +3 -1
  26. package/dist/runtime/actors/actor-client.d.ts +6 -2
  27. package/dist/runtime/actors/actor-client.js +120 -82
  28. package/dist/runtime/actors/actor-context.js +16 -5
  29. package/dist/runtime/actors/actor-execution-context.js +2 -2
  30. package/dist/runtime/actors/actor-handoff.d.ts +12 -1
  31. package/dist/runtime/actors/actor-handoff.js +79 -34
  32. package/dist/runtime/actors/actor-join-deferred-scope.js +6 -6
  33. package/dist/runtime/actors/actor-local-native-join.d.ts +2 -2
  34. package/dist/runtime/actors/actor-local-native-join.js +19 -17
  35. package/dist/runtime/actors/actor-mailbox.d.ts +1 -1
  36. package/dist/runtime/actors/actor-remote-joiner.d.ts +2 -2
  37. package/dist/runtime/actors/actor-remote-joiner.js +4 -4
  38. package/dist/runtime/actors/actor-routed-join-transport.d.ts +9 -3
  39. package/dist/runtime/actors/actor-routed-json-request.d.ts +3 -0
  40. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -2
  41. package/dist/runtime/actors/actor-runtime-state.d.ts +1 -1
  42. package/dist/runtime/actors/spot-actor-dispatch.d.ts +9 -5
  43. package/dist/runtime/actors/spot-actor-dispatch.js +60 -38
  44. package/dist/runtime/admission.d.ts +6 -4
  45. package/dist/runtime/admission.js +21 -10
  46. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +1 -0
  47. package/dist/runtime/application-jobs/application-ingress-record-owner.js +3 -0
  48. package/dist/runtime/backend/contracts/index.d.ts +26 -10
  49. package/dist/runtime/backend/mesh-completion-table.d.ts +7 -1
  50. package/dist/runtime/backend/mesh-completion-table.js +84 -20
  51. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +19 -6
  52. package/dist/runtime/backend/mesh-dispatch-pump.js +246 -147
  53. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +3 -2
  54. package/dist/runtime/backend/node/node-backend-adapter-support.js +27 -19
  55. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +5 -2
  56. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +70 -13
  57. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
  58. package/dist/runtime/backend/node/node-event-loop-poller.js +4 -3
  59. package/dist/runtime/backend/node/node-mesh-backend-adapter.js +5 -1
  60. package/dist/runtime/backend/node/node-raw-binding-port.d.ts +7 -2
  61. package/dist/runtime/backend/node/node-raw-binding-port.js +99 -63
  62. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +34 -16
  63. package/dist/runtime/backend/node/node-raw-mesh-backend.js +210 -106
  64. package/dist/runtime/backend/node/node-socket-backend-adapter.js +20 -6
  65. package/dist/runtime/backend/raw-binding-port.d.ts +6 -3
  66. package/dist/runtime/channels/channel-clients.js +3 -3
  67. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +11 -7
  68. package/dist/runtime/channels/channel-dispatch-pipeline.js +40 -22
  69. package/dist/runtime/channels/channel-dispatch-services.d.ts +3 -1
  70. package/dist/runtime/channels/channel-dispatch-services.js +7 -6
  71. package/dist/runtime/channels/channel-dispatchers.d.ts +13 -6
  72. package/dist/runtime/channels/channel-dispatchers.js +57 -36
  73. package/dist/runtime/channels/channel-envelope.d.ts +2 -2
  74. package/dist/runtime/channels/channel-envelope.js +609 -83
  75. package/dist/runtime/channels/channel-multipart.d.ts +1 -0
  76. package/dist/runtime/channels/channel-multipart.js +10 -6
  77. package/dist/runtime/channels/channel-outbound-operations.d.ts +6 -9
  78. package/dist/runtime/channels/channel-outbound-operations.js +107 -105
  79. package/dist/runtime/channels/channel-receive-loops.d.ts +9 -7
  80. package/dist/runtime/channels/channel-receive-loops.js +126 -90
  81. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +23 -6
  82. package/dist/runtime/channels/channel-runtime-lifecycle.js +47 -38
  83. package/dist/runtime/channels/channel-runtime-manager.d.ts +13 -6
  84. package/dist/runtime/channels/channel-runtime-manager.js +32 -14
  85. package/dist/runtime/channels/channel-socket-registry.d.ts +28 -4
  86. package/dist/runtime/channels/channel-socket-registry.js +9 -1
  87. package/dist/runtime/channels/channel-transports.d.ts +23 -16
  88. package/dist/runtime/channels/channel-transports.js +139 -119
  89. package/dist/runtime/channels/dispatch-error-reporter.d.ts +4 -4
  90. package/dist/runtime/channels/dispatch-error-reporter.js +5 -5
  91. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  92. package/dist/runtime/channels/local-spot-route-transport.d.ts +5 -2
  93. package/dist/runtime/channels/local-spot-route-transport.js +15 -18
  94. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +6 -3
  95. package/dist/runtime/channels/router-socket-spot-route-transport.js +33 -19
  96. package/dist/runtime/channels/source-spot-router.d.ts +6 -3
  97. package/dist/runtime/channels/source-spot-router.js +34 -23
  98. package/dist/runtime/channels/spot-node-route-transport.d.ts +6 -3
  99. package/dist/runtime/channels/spot-node-route-transport.js +23 -17
  100. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +6 -3
  101. package/dist/runtime/channels/spot-route-bridge-transport.js +38 -24
  102. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +8 -4
  103. package/dist/runtime/channels/spot-route-dispatch-strategy.js +36 -23
  104. package/dist/runtime/diagnostics/dispatch-error-details.js +9 -3
  105. package/dist/runtime/diagnostics/message-flow-bootstrap.d.ts +1 -0
  106. package/dist/runtime/diagnostics/message-flow-bootstrap.js +8 -0
  107. package/dist/runtime/diagnostics/message-flow-delivery.d.ts +47 -0
  108. package/dist/runtime/diagnostics/message-flow-delivery.js +149 -0
  109. package/dist/runtime/diagnostics/message-flow-record.d.ts +50 -0
  110. package/dist/runtime/diagnostics/message-flow-record.js +228 -0
  111. package/dist/runtime/diagnostics/message-flow-worker.d.ts +1 -0
  112. package/dist/runtime/diagnostics/message-flow-worker.js +118 -0
  113. package/dist/runtime/diagnostics/message-flow.d.ts +7 -19
  114. package/dist/runtime/diagnostics/message-flow.js +42 -290
  115. package/dist/runtime/diagnostics/runtime-metrics.d.ts +4 -3
  116. package/dist/runtime/diagnostics/runtime-metrics.js +8 -4
  117. package/dist/runtime/execution/index.d.ts +1 -0
  118. package/dist/runtime/execution/index.js +6 -3
  119. package/dist/runtime/execution/serial-execution-queue.d.ts +26 -13
  120. package/dist/runtime/execution/serial-execution-queue.js +75 -71
  121. package/dist/runtime/foundation/durable-service-request.d.ts +12 -3
  122. package/dist/runtime/foundation/durable-service-request.js +158 -73
  123. package/dist/runtime/foundation/operation-registry.d.ts +33 -3
  124. package/dist/runtime/foundation/operation-registry.js +272 -33
  125. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +62 -23
  126. package/dist/runtime/foundation/raw-service-mesh-runtime.js +373 -194
  127. package/dist/runtime/foundation/request-runtime.d.ts +17 -0
  128. package/dist/runtime/foundation/request-runtime.js +163 -0
  129. package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
  130. package/dist/runtime/foundation/service-discovery-registry.js +6 -0
  131. package/dist/runtime/foundation/service-liveness-registry.d.ts +1 -1
  132. package/dist/runtime/foundation/service-mailbox.d.ts +4 -2
  133. package/dist/runtime/foundation/service-mailbox.js +4 -1
  134. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -2
  135. package/dist/runtime/foundation/service-relocation-object-owner.js +12 -5
  136. package/dist/runtime/foundation/service-runtime-contracts.d.ts +7 -2
  137. package/dist/runtime/foundation/service-stateful-registry.d.ts +6 -2
  138. package/dist/runtime/foundation/service-stateful-registry.js +38 -17
  139. package/dist/runtime/foundation/service-stateful-runtime.d.ts +91 -26
  140. package/dist/runtime/foundation/service-stateful-runtime.js +245 -120
  141. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -0
  142. package/dist/runtime/foundation/service-stateful-wire-codec.js +15 -0
  143. package/dist/runtime/foundation/service-topology-registry.d.ts +2 -0
  144. package/dist/runtime/foundation/service-topology-registry.js +13 -3
  145. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  146. package/dist/runtime/foundation/service-wire-constants.generated.js +12 -0
  147. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +5 -1
  148. package/dist/runtime/foundation/service-wire-m6a-codec.js +50 -15
  149. package/dist/runtime/host/actor-packet-relay.d.ts +5 -6
  150. package/dist/runtime/host/actor-packet-relay.js +58 -57
  151. package/dist/runtime/host/actor-placement-coordinator.d.ts +1 -1
  152. package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
  153. package/dist/runtime/host/actor-runtime-options-factory.js +3 -2
  154. package/dist/runtime/host/actor-transfer-runtime.d.ts +3 -3
  155. package/dist/runtime/host/application-job-queue.d.ts +7 -5
  156. package/dist/runtime/host/application-job-queue.js +33 -21
  157. package/dist/runtime/host/bound-session-relay.js +0 -1
  158. package/dist/runtime/host/channel-runtime-options-factory.d.ts +2 -0
  159. package/dist/runtime/host/channel-runtime-options-factory.js +1 -0
  160. package/dist/runtime/host/entry-actor-runtime.d.ts +5 -2
  161. package/dist/runtime/host/entry-actor-runtime.js +2 -2
  162. package/dist/runtime/host/index.d.ts +106 -37
  163. package/dist/runtime/host/index.js +303 -151
  164. package/dist/runtime/host/location-runtime-owner.d.ts +2 -2
  165. package/dist/runtime/host/location-runtime-owner.js +1 -1
  166. package/dist/runtime/host/service-relocation-host-runtime.d.ts +195 -45
  167. package/dist/runtime/host/service-relocation-host-runtime.js +257 -144
  168. package/dist/runtime/host/spot-address-transport.d.ts +3 -0
  169. package/dist/runtime/host/spot-address-transport.js +73 -76
  170. package/dist/runtime/host/spot-runtime-options-factory.js +2 -0
  171. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -1
  172. package/dist/runtime/host/user-spot-creation-coordinator.js +49 -21
  173. package/dist/runtime/internal-observation.d.ts +1 -0
  174. package/dist/runtime/internal-observation.js +5 -0
  175. package/dist/runtime/locations/actor-location-claims.d.ts +1 -1
  176. package/dist/runtime/locations/actor-location-claims.js +15 -6
  177. package/dist/runtime/locations/auto-connect-loop.d.ts +0 -1
  178. package/dist/runtime/locations/auto-connect-loop.js +25 -19
  179. package/dist/runtime/locations/auto-connect-planner.js +2 -5
  180. package/dist/runtime/locations/auto-connect-reconciler.d.ts +1 -0
  181. package/dist/runtime/locations/auto-connect-reconciler.js +35 -23
  182. package/dist/runtime/locations/in-memory-authority-store.d.ts +1 -0
  183. package/dist/runtime/locations/in-memory-authority-store.js +15 -5
  184. package/dist/runtime/locations/in-memory-location-store.d.ts +0 -2
  185. package/dist/runtime/locations/in-memory-location-store.js +1 -38
  186. package/dist/runtime/locations/lifecycle.d.ts +1 -1
  187. package/dist/runtime/locations/lifecycle.js +2 -2
  188. package/dist/runtime/locations/location-store-repository.d.ts +0 -1
  189. package/dist/runtime/locations/location-store-repository.js +163 -246
  190. package/dist/runtime/locations/resolvers.d.ts +8 -1
  191. package/dist/runtime/locations/resolvers.js +16 -2
  192. package/dist/runtime/locations/runtime.d.ts +3 -3
  193. package/dist/runtime/locations/runtime.js +12 -16
  194. package/dist/runtime/messaging/creation-payload-codec.js +8 -7
  195. package/dist/runtime/messaging/framework-json-v1.d.ts +1 -1
  196. package/dist/runtime/messaging/framework-json-v1.js +6 -2
  197. package/dist/runtime/messaging/payload-codec.js +21 -35
  198. package/dist/runtime/messaging/request-deadline.d.ts +4 -2
  199. package/dist/runtime/messaging/request-deadline.js +40 -25
  200. package/dist/runtime/messaging/request-result.d.ts +14 -1
  201. package/dist/runtime/messaging/request-result.js +74 -13
  202. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +4 -0
  203. package/dist/runtime/protocol/service_wire_codec.generated.js +17 -7
  204. package/dist/runtime/spots/index.d.ts +28 -7
  205. package/dist/runtime/spots/index.js +31 -6
  206. package/dist/runtime/spots/spot-activation-registry.d.ts +3 -2
  207. package/dist/runtime/spots/spot-activation-registry.js +13 -8
  208. package/dist/runtime/spots/spot-activation-state.d.ts +2 -0
  209. package/dist/runtime/spots/spot-activation-state.js +1 -0
  210. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +9 -4
  211. package/dist/runtime/spots/spot-actor-admission-coordinator.js +33 -12
  212. package/dist/runtime/spots/spot-actor-ingress-admission.d.ts +40 -0
  213. package/dist/runtime/spots/spot-actor-ingress-admission.js +78 -0
  214. package/dist/runtime/spots/spot-actor-membership.js +3 -3
  215. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +16 -43
  216. package/dist/runtime/spots/spot-actor-packet-dispatch.js +56 -113
  217. package/dist/runtime/spots/spot-actor-packet-drain.d.ts +1 -0
  218. package/dist/runtime/spots/spot-actor-packet-drain.js +12 -5
  219. package/dist/runtime/spots/spot-entry-activation.d.ts +4 -3
  220. package/dist/runtime/spots/spot-entry-activation.js +7 -12
  221. package/dist/runtime/spots/spot-handler-registry.d.ts +5 -1
  222. package/dist/runtime/spots/spot-handler-registry.js +31 -15
  223. package/dist/runtime/spots/spot-manager-public.js +3 -2
  224. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +11 -6
  225. package/dist/runtime/spots/spot-node-runtime-manager.js +6 -1
  226. package/dist/runtime/spots/spot-outbound.d.ts +8 -2
  227. package/dist/runtime/spots/spot-outbound.js +5 -5
  228. package/dist/runtime/spots/spot-route-packet-dispatch.js +13 -8
  229. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +3 -3
  230. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +9 -5
  231. package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -2
  232. package/dist/runtime/spots/spot-serial-executor.d.ts +2 -1
  233. package/dist/runtime/spots/spot-serial-turn-executor.js +20 -26
  234. package/dist/runtime/spots/spot-subscription-dispatch.js +5 -2
  235. package/dist/runtime/spots/spot-timer.d.ts +1 -1
  236. package/dist/runtime/streams/actor-session-binding-registry.d.ts +11 -3
  237. package/dist/runtime/streams/actor-session-binding-registry.js +28 -0
  238. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -2
  239. package/dist/runtime/streams/bound-actor-relay-sender.js +3 -4
  240. package/dist/runtime/streams/bound-session-service.js +6 -7
  241. package/dist/runtime/streams/index.d.ts +3 -3
  242. package/dist/runtime/streams/index.js +22 -2
  243. package/dist/runtime/streams/managed-stream.js +2 -1
  244. package/dist/runtime/streams/session-calls.d.ts +1 -1
  245. package/dist/runtime/streams/session-calls.js +3 -9
  246. package/dist/runtime/streams/session-context.d.ts +2 -2
  247. package/dist/runtime/streams/session-context.js +2 -2
  248. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -0
  249. package/dist/runtime/streams/stream-session-runtime.js +64 -33
  250. package/package.json +3 -3
  251. package/src/contracts/Actors/ZLinkActor.ts +6 -0
  252. package/src/contracts/Actors/ZLinkSessionBindingIdentity.ts +7 -0
  253. package/src/contracts/Actors/index.ts +1 -0
  254. package/src/contracts/Common/CoreTypes.ts +1 -0
  255. package/src/contracts/Common/HandlerMessageType.ts +50 -0
  256. package/src/contracts/Common/ZLinkEncodedPayload.ts +13 -25
  257. package/src/contracts/Common/ZLinkMessage.ts +11 -7
  258. package/src/contracts/Common/encoded-payload-storage.ts +4 -16
  259. package/src/contracts/Common/index.ts +1 -1
  260. package/src/contracts/Common/payload-slab.ts +29 -0
  261. package/src/contracts/Configuration/RegistrationBuilders.ts +29 -15
  262. package/src/contracts/Configuration/RegistrationTypes.ts +19 -0
  263. package/src/contracts/Handlers/Contexts.ts +1 -0
  264. package/src/contracts/Locations/Authority.ts +7 -1
  265. package/src/internal.ts +17 -0
  266. package/src/nest-integration.ts +1 -0
  267. package/src/runtime/actors/actor-client.ts +257 -163
  268. package/src/runtime/actors/actor-context.ts +26 -14
  269. package/src/runtime/actors/actor-execution-context.ts +2 -2
  270. package/src/runtime/actors/actor-handoff.ts +86 -51
  271. package/src/runtime/actors/actor-join-deferred-scope.ts +6 -6
  272. package/src/runtime/actors/actor-local-native-join.ts +38 -17
  273. package/src/runtime/actors/actor-mailbox.ts +1 -1
  274. package/src/runtime/actors/actor-remote-joiner.ts +8 -4
  275. package/src/runtime/actors/actor-routed-join-transport.ts +13 -5
  276. package/src/runtime/actors/actor-routed-json-request.ts +3 -0
  277. package/src/runtime/actors/actor-runtime-contracts.ts +4 -2
  278. package/src/runtime/actors/actor-runtime-state.ts +1 -1
  279. package/src/runtime/actors/spot-actor-dispatch.ts +70 -68
  280. package/src/runtime/admission.ts +42 -15
  281. package/src/runtime/application-jobs/application-ingress-record-owner.ts +4 -0
  282. package/src/runtime/backend/contracts/index.ts +77 -10
  283. package/src/runtime/backend/mesh-completion-table.ts +106 -15
  284. package/src/runtime/backend/mesh-dispatch-pump.ts +294 -146
  285. package/src/runtime/backend/node/node-backend-adapter-support.ts +42 -32
  286. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +91 -34
  287. package/src/runtime/backend/node/node-event-loop-poller.ts +14 -5
  288. package/src/runtime/backend/node/node-mesh-backend-adapter.ts +5 -1
  289. package/src/runtime/backend/node/node-raw-binding-port.ts +180 -69
  290. package/src/runtime/backend/node/node-raw-mesh-backend.ts +386 -157
  291. package/src/runtime/backend/node/node-socket-backend-adapter.ts +56 -11
  292. package/src/runtime/backend/raw-binding-port.ts +13 -5
  293. package/src/runtime/channels/channel-clients.ts +26 -11
  294. package/src/runtime/channels/channel-dispatch-pipeline.ts +77 -65
  295. package/src/runtime/channels/channel-dispatch-services.ts +7 -12
  296. package/src/runtime/channels/channel-dispatchers.ts +93 -39
  297. package/src/runtime/channels/channel-envelope.ts +680 -144
  298. package/src/runtime/channels/channel-multipart.ts +17 -13
  299. package/src/runtime/channels/channel-outbound-operations.ts +204 -178
  300. package/src/runtime/channels/channel-receive-loops.ts +160 -107
  301. package/src/runtime/channels/channel-runtime-lifecycle.ts +64 -59
  302. package/src/runtime/channels/channel-runtime-manager.ts +74 -27
  303. package/src/runtime/channels/channel-socket-registry.ts +20 -5
  304. package/src/runtime/channels/channel-transports.ts +414 -287
  305. package/src/runtime/channels/dispatch-error-reporter.ts +4 -9
  306. package/src/runtime/channels/local-spot-route-transport.ts +27 -29
  307. package/src/runtime/channels/router-socket-spot-route-transport.ts +63 -32
  308. package/src/runtime/channels/source-spot-router.ts +75 -38
  309. package/src/runtime/channels/spot-node-route-transport.ts +67 -37
  310. package/src/runtime/channels/spot-route-bridge-transport.ts +62 -30
  311. package/src/runtime/channels/spot-route-dispatch-strategy.ts +105 -34
  312. package/src/runtime/diagnostics/dispatch-error-details.ts +10 -2
  313. package/src/runtime/diagnostics/message-flow-bootstrap.ts +6 -0
  314. package/src/runtime/diagnostics/message-flow-delivery.ts +171 -0
  315. package/src/runtime/diagnostics/message-flow-record.ts +295 -0
  316. package/src/runtime/diagnostics/message-flow-worker.ts +146 -0
  317. package/src/runtime/diagnostics/message-flow.ts +49 -362
  318. package/src/runtime/diagnostics/runtime-metrics.ts +10 -4
  319. package/src/runtime/execution/index.ts +6 -0
  320. package/src/runtime/execution/serial-execution-queue.ts +94 -96
  321. package/src/runtime/foundation/durable-service-request.ts +212 -89
  322. package/src/runtime/foundation/operation-registry.ts +287 -38
  323. package/src/runtime/foundation/raw-service-mesh-runtime.ts +617 -292
  324. package/src/runtime/foundation/request-runtime.ts +227 -0
  325. package/src/runtime/foundation/service-discovery-registry.ts +7 -0
  326. package/src/runtime/foundation/service-liveness-registry.ts +1 -1
  327. package/src/runtime/foundation/service-mailbox.ts +7 -2
  328. package/src/runtime/foundation/service-relocation-object-owner.ts +21 -6
  329. package/src/runtime/foundation/service-runtime-contracts.ts +12 -2
  330. package/src/runtime/foundation/service-stateful-registry.ts +52 -19
  331. package/src/runtime/foundation/service-stateful-runtime.ts +365 -198
  332. package/src/runtime/foundation/service-stateful-wire-codec.ts +18 -0
  333. package/src/runtime/foundation/service-topology-registry.ts +21 -3
  334. package/src/runtime/foundation/service-wire-constants.generated.ts +10 -0
  335. package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -17
  336. package/src/runtime/host/actor-packet-relay.ts +160 -156
  337. package/src/runtime/host/actor-placement-coordinator.ts +1 -1
  338. package/src/runtime/host/actor-runtime-options-factory.ts +7 -2
  339. package/src/runtime/host/actor-transfer-runtime.ts +3 -3
  340. package/src/runtime/host/application-job-queue.ts +56 -27
  341. package/src/runtime/host/bound-session-relay.ts +0 -1
  342. package/src/runtime/host/channel-runtime-options-factory.ts +3 -0
  343. package/src/runtime/host/entry-actor-runtime.ts +14 -6
  344. package/src/runtime/host/index.ts +388 -113
  345. package/src/runtime/host/location-runtime-owner.ts +3 -3
  346. package/src/runtime/host/service-relocation-host-runtime.ts +380 -252
  347. package/src/runtime/host/spot-address-transport.ts +110 -95
  348. package/src/runtime/host/spot-runtime-options-factory.ts +3 -0
  349. package/src/runtime/host/user-spot-creation-coordinator.ts +69 -22
  350. package/src/runtime/internal-observation.ts +2 -0
  351. package/src/runtime/locations/actor-location-claims.ts +42 -16
  352. package/src/runtime/locations/auto-connect-loop.ts +24 -16
  353. package/src/runtime/locations/auto-connect-planner.ts +2 -5
  354. package/src/runtime/locations/auto-connect-reconciler.ts +37 -24
  355. package/src/runtime/locations/in-memory-authority-store.ts +27 -7
  356. package/src/runtime/locations/in-memory-location-store.ts +1 -74
  357. package/src/runtime/locations/lifecycle.ts +4 -2
  358. package/src/runtime/locations/location-store-repository.ts +228 -308
  359. package/src/runtime/locations/resolvers.ts +20 -8
  360. package/src/runtime/locations/runtime.ts +16 -28
  361. package/src/runtime/messaging/creation-payload-codec.ts +12 -10
  362. package/src/runtime/messaging/framework-json-v1.ts +10 -1
  363. package/src/runtime/messaging/payload-codec.ts +50 -75
  364. package/src/runtime/messaging/request-deadline.ts +47 -39
  365. package/src/runtime/messaging/request-result.ts +88 -17
  366. package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
  367. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
  368. package/src/runtime/spots/index.ts +57 -10
  369. package/src/runtime/spots/spot-activation-registry.ts +12 -8
  370. package/src/runtime/spots/spot-activation-state.ts +2 -0
  371. package/src/runtime/spots/spot-actor-admission-coordinator.ts +62 -37
  372. package/src/runtime/spots/spot-actor-ingress-admission.ts +157 -0
  373. package/src/runtime/spots/spot-actor-membership.ts +8 -5
  374. package/src/runtime/spots/spot-actor-packet-dispatch.ts +122 -206
  375. package/src/runtime/spots/spot-actor-packet-drain.ts +21 -6
  376. package/src/runtime/spots/spot-entry-activation.ts +25 -35
  377. package/src/runtime/spots/spot-handler-registry.ts +72 -15
  378. package/src/runtime/spots/spot-manager-public.ts +4 -2
  379. package/src/runtime/spots/spot-node-runtime-manager.ts +16 -7
  380. package/src/runtime/spots/spot-outbound.ts +26 -10
  381. package/src/runtime/spots/spot-route-packet-dispatch.ts +18 -8
  382. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +14 -8
  383. package/src/runtime/spots/spot-runtime-ports.ts +5 -2
  384. package/src/runtime/spots/spot-serial-executor.ts +1 -1
  385. package/src/runtime/spots/spot-serial-turn-executor.ts +25 -40
  386. package/src/runtime/spots/spot-subscription-dispatch.ts +9 -2
  387. package/src/runtime/spots/spot-timer.ts +1 -1
  388. package/src/runtime/streams/actor-session-binding-registry.ts +46 -3
  389. package/src/runtime/streams/bound-actor-relay-sender.ts +16 -5
  390. package/src/runtime/streams/bound-session-service.ts +10 -7
  391. package/src/runtime/streams/index.ts +30 -4
  392. package/src/runtime/streams/managed-stream.ts +2 -1
  393. package/src/runtime/streams/session-calls.ts +9 -14
  394. package/src/runtime/streams/session-context.ts +6 -11
  395. package/src/runtime/streams/stream-session-runtime.ts +79 -40
  396. package/dist/runtime/spots/spot-lifecycle-metrics.d.ts +0 -8
  397. package/dist/runtime/spots/spot-lifecycle-metrics.js +0 -17
  398. package/src/runtime/spots/spot-lifecycle-metrics.ts +0 -16
@@ -0,0 +1,227 @@
1
+ import { requestTerminalError } from '../messaging/request-deadline';
2
+ import { ZLinkFrameworkException, ZLinkFrameworkErrorKind } from '../../contracts';
3
+ import {
4
+ OperationRegistry,
5
+ OperationCancelledError,
6
+ type OperationHandle,
7
+ type OperationObserver,
8
+ type PendingOperation
9
+ } from './operation-registry';
10
+ import { createAbortError } from '../abort';
11
+ import {
12
+ identityRequestReply,
13
+ rejectZLinkRequestReply,
14
+ type ZLinkRequestResult
15
+ } from '../messaging/request-result';
16
+
17
+ /** Owns the request entries and deadline visits of one runtime instance. */
18
+ export class RequestRuntime {
19
+ readonly registry = new OperationRegistry<unknown, unknown>(
20
+ undefined,
21
+ () => this.schedule(),
22
+ (reason) => requestTerminalError('Request', reason)
23
+ );
24
+ private timer?: NodeJS.Timeout;
25
+ private dueMs = Number.POSITIVE_INFINITY;
26
+
27
+ begin<T>(
28
+ timeoutMs: number | undefined,
29
+ signal?: AbortSignal,
30
+ existing?: PendingOperation<unknown>,
31
+ absoluteDeadlineMs?: number
32
+ ): PendingOperation<T> {
33
+ if (existing !== undefined) return existing as PendingOperation<T>;
34
+ const operation = this.registry.register(
35
+ timeoutMs ?? 0,
36
+ timeoutMs === undefined ? 'sender' : 'registry',
37
+ undefined,
38
+ absoluteDeadlineMs
39
+ );
40
+ operation.setSignal(signal);
41
+ return operation as PendingOperation<T>;
42
+ }
43
+
44
+ run<T>(
45
+ pending: PendingOperation<unknown>,
46
+ start: (receiver: OperationObserver<unknown, unknown>) => void,
47
+ decode: (raw: unknown) => T,
48
+ mapFailure: (error: unknown) => unknown,
49
+ destination?: OperationObserver<unknown, unknown>
50
+ ): Promise<T> {
51
+ if (!pending.isPending()) return pending.promise as Promise<T>;
52
+ pending.deferCompletion();
53
+ const receiver: OperationObserver<unknown, unknown> = {
54
+ operationCompleted: (_id, raw) => {
55
+ try {
56
+ const value = decode(raw);
57
+ if (destination !== undefined)
58
+ destination.operationCompleted(pending.id, value, undefined);
59
+ else pending.complete(value);
60
+ } catch (error) {
61
+ if (destination !== undefined) destination.operationFailed(pending.id, error, undefined);
62
+ else pending.fail(error);
63
+ }
64
+ },
65
+ operationFailed: (_id, error) => {
66
+ let failure = error;
67
+ try {
68
+ failure = mapFailure(error);
69
+ } catch (mapped) {
70
+ failure = mapped;
71
+ }
72
+ if (destination !== undefined) destination.operationFailed(pending.id, failure, undefined);
73
+ else pending.fail(failure);
74
+ }
75
+ };
76
+ try {
77
+ start(receiver);
78
+ } catch (error) {
79
+ receiver.operationFailed(pending.id, error, undefined);
80
+ }
81
+ return pending.promise as Promise<T>;
82
+ }
83
+
84
+ request<T>(
85
+ timeoutMs: number | undefined,
86
+ signal: AbortSignal | undefined,
87
+ work: (pending: PendingOperation<unknown>) => Promise<T>,
88
+ existing?: PendingOperation<unknown>,
89
+ discardLateResult?: (value: T) => void
90
+ ): Promise<T> {
91
+ if (existing !== undefined) {
92
+ if (!existing.isPending())
93
+ return existing.promise.then<T>(() => {
94
+ throw new OperationCancelledError(existing.id, 'Request is already terminal.');
95
+ });
96
+ return work(existing);
97
+ }
98
+ const pending = this.begin(timeoutMs, signal, existing);
99
+ return this.run(
100
+ pending,
101
+ (receiver) => {
102
+ void work(pending).then(
103
+ (value) => receiver.operationCompleted(pending.id, value, undefined),
104
+ (error) => receiver.operationFailed(pending.id, error, undefined)
105
+ );
106
+ },
107
+ (value) => {
108
+ if (!pending.isPending()) discardLateResult?.(value as T);
109
+ return value as T;
110
+ },
111
+ identityRequestReply
112
+ );
113
+ }
114
+
115
+ prepare<T>(
116
+ timeoutMs: number | undefined,
117
+ signal: AbortSignal | undefined,
118
+ start: (
119
+ pending: PendingOperation<unknown>,
120
+ receiver: OperationObserver<unknown, unknown>
121
+ ) => void,
122
+ decode: (raw: unknown) => T,
123
+ mapFailure: (error: unknown) => unknown,
124
+ existing?: PendingOperation<unknown>,
125
+ destination?: OperationObserver<unknown, unknown>
126
+ ): ZLinkRequestResult<T> {
127
+ if (signal?.aborted === true && destination === undefined)
128
+ return rejectZLinkRequestReply(signal.reason ?? createAbortError());
129
+ const operation = this.begin(timeoutMs, signal, existing);
130
+ if (signal?.aborted === true && destination !== undefined)
131
+ destination.operationFailed(operation.id, signal.reason ?? createAbortError(), undefined);
132
+ const pending =
133
+ signal?.aborted === true
134
+ ? operation.promise
135
+ : this.run(
136
+ operation,
137
+ (receiver) => start(operation, receiver),
138
+ decode,
139
+ mapFailure,
140
+ destination
141
+ );
142
+ return {
143
+ pending,
144
+ decode: identityRequestReply<T>,
145
+ mapFailure: identityRequestReply,
146
+ operation: operation as PendingOperation<T>
147
+ };
148
+ }
149
+
150
+ observe<T, R = T>(
151
+ timeoutMs: number,
152
+ submit: (entry: OperationHandle<T>, receiver: OperationObserver<T, unknown>) => void,
153
+ onReply: (value: T) => R,
154
+ onFailed: (error: unknown) => R
155
+ ): Promise<R> {
156
+ return new Promise<R>((resolve, reject) => {
157
+ const observer: OperationObserver<T, unknown> = {
158
+ operationCompleted: (_id, value) => {
159
+ try {
160
+ resolve(onReply(value));
161
+ } catch (error) {
162
+ reject(error);
163
+ }
164
+ },
165
+ operationFailed: (_id, reason) => {
166
+ try {
167
+ resolve(onFailed(requestTerminalError('Request', reason)));
168
+ } catch (error) {
169
+ reject(error);
170
+ }
171
+ }
172
+ };
173
+ const id = this.registry.registerObserved(timeoutMs, observer);
174
+ const entry = this.registry.handle(id) as OperationHandle<T>;
175
+ try {
176
+ submit(entry, {
177
+ operationCompleted: (_id, value) => {
178
+ if (!entry.complete(value)) observer.operationCompleted(id, value, undefined);
179
+ },
180
+ operationFailed: (_id, error) => entry.fail(error)
181
+ });
182
+ } catch (error) {
183
+ entry.fail(error);
184
+ }
185
+ });
186
+ }
187
+
188
+ operations<T, Context = unknown>(): OperationRegistry<T, Context> {
189
+ return this.registry as unknown as OperationRegistry<T, Context>;
190
+ }
191
+
192
+ close(
193
+ reason: unknown = new ZLinkFrameworkException(
194
+ ZLinkFrameworkErrorKind.ShuttingDown,
195
+ 'Request runtime closed.'
196
+ )
197
+ ): void {
198
+ this.registry.clear(reason);
199
+ this.schedule();
200
+ }
201
+
202
+ private schedule(): void {
203
+ const next = this.registry.nextDeadlineMs();
204
+ if (next < this.dueMs) {
205
+ clearTimeout(this.timer);
206
+ this.timer = undefined;
207
+ this.dueMs = next;
208
+ if (Number.isFinite(next))
209
+ this.timer = setTimeout(
210
+ this.visit,
211
+ Math.min(0x7fff_ffff, Math.ceil(next - performance.now()))
212
+ );
213
+ }
214
+ if (this.timer !== undefined) {
215
+ if (this.registry.size === 0) this.timer.unref();
216
+ else this.timer.ref();
217
+ }
218
+ }
219
+
220
+ private readonly visit = (): void => {
221
+ this.timer = undefined;
222
+ this.dueMs = Number.POSITIVE_INFINITY;
223
+ const now = performance.now();
224
+ this.registry.expire(now, now + 1);
225
+ this.schedule();
226
+ };
227
+ }
@@ -1,3 +1,4 @@
1
+ import { inspectRuntime } from '../internal-observation';
1
2
  import {
2
3
  isValidPublicWeight,
3
4
  ZLINK_MAX_PUBLIC_WEIGHT
@@ -36,6 +37,12 @@ export interface SelectedClientServer {
36
37
 
37
38
  /** Dedicated discovery state; fanout publishers never reuse RouteMesh peer rows. */
38
39
  export class ServiceDiscoveryRegistry {
40
+ [inspectRuntime]() {
41
+ return Object.freeze({
42
+ clientServerObservers: this.clientServerChanged.size
43
+ });
44
+ }
45
+
39
46
  private readonly clientServerChanged = new Set<(error?: Error) => void>();
40
47
 
41
48
  onClientServerChanged(listener: (error?: Error) => void): () => void {
@@ -60,7 +60,7 @@ const NO_LIVENESS_WORK: ServiceLivenessTick = Object.freeze({
60
60
  });
61
61
 
62
62
  export class ServiceLivenessRegistry {
63
- private readonly peers = new Map<string, ServiceLivenessConnection>();
63
+ readonly peers = new Map<string, ServiceLivenessConnection>();
64
64
  private nextProbeId = 1n;
65
65
  /**
66
66
  * The earliest probe or timeout among admitted peers. Received traffic only
@@ -9,6 +9,7 @@ export interface ServiceMailboxDispatchOwner {
9
9
  }
10
10
 
11
11
  export interface ServiceMailboxRecord {
12
+ receivedAt?: Date;
12
13
  readonly sourcePreparationOwner?: ServiceMailboxDispatchOwner;
13
14
  readonly ingress?: RawServiceIngressRecord;
14
15
  readonly owner: string;
@@ -18,7 +19,7 @@ export interface ServiceMailboxRecord {
18
19
  readonly requestSource?: import('../locations/request-source-resolver').ZLinkRequestSourceFence;
19
20
  readonly sourceRoute?: Uint8Array;
20
21
  readonly requestSequence?: bigint;
21
- readonly reply?: (parts: readonly Uint8Array[]) => void;
22
+ readonly reply?: (parts: readonly (Uint8Array | string)[]) => void;
22
23
  readonly correlation?: bigint;
23
24
  readonly localReply?: (
24
25
  terminalResult: number,
@@ -82,7 +83,10 @@ export class ServiceMailbox {
82
83
  private nextRelocationSerial = 1n;
83
84
  private closed = false;
84
85
 
85
- constructor(private readonly onReady?: (domain: ServiceMailboxDomain) => void) {
86
+ constructor(
87
+ private readonly onReady?: (domain: ServiceMailboxDomain) => void,
88
+ private readonly receivedAtClock: () => Date = () => new Date()
89
+ ) {
86
90
  // Host ApplicationJobQueue permits own ordinary-record admission. The
87
91
  // Framework-owned payload lifetime does not retain Core HWM credit. A
88
92
  // second mailbox cap would reject already-admitted work before the shared
@@ -105,6 +109,7 @@ export class ServiceMailbox {
105
109
  const target = this.domain(record.domain);
106
110
  const bytes = retainedBytes(record);
107
111
  if (this.closed) return false;
112
+ record.receivedAt ??= this.receivedAtClock();
108
113
  if (record.domain === 'application') {
109
114
  if (this.relocatedOwners.has(record.owner)) return false;
110
115
  const relocation = this.relocationSeals.get(record.owner);
@@ -31,7 +31,7 @@ export interface ServiceRelocationCaptureUnit {
31
31
  seal(signal?: AbortSignal): Promise<ServiceRelocationSealedWork>;
32
32
  captureApplicationState(signal?: AbortSignal): Promise<Uint8Array>;
33
33
  commitSeal(followAuthorities: ReadonlyMap<string, ZLinkAuthoritySnapshot>): Promise<void> | void;
34
- abortSeal(): Promise<void> | void;
34
+ abortSeal(onCleanupError?: (error: unknown) => void): Promise<void> | void;
35
35
  /** Expired-owner terminal: pending requests fail once and dispatch stays closed. */
36
36
  discardSeal?(reason: unknown): Promise<void> | void;
37
37
  }
@@ -55,13 +55,13 @@ export class ServiceCapturedObjectRelocation {
55
55
  this.terminal = 'committed';
56
56
  }
57
57
 
58
- async abortSource(): Promise<void> {
58
+ async abortSource(onCleanupError?: (error: unknown) => void): Promise<void> {
59
59
  if (this.terminal === 'aborted') return;
60
60
  if (this.terminal !== 'open') {
61
61
  throw new Error(`A ${this.terminal} relocation source capture cannot be aborted.`);
62
62
  }
63
63
  try {
64
- await abortSourceSeals(this.units);
64
+ await abortSourceSeals(this.units, onCleanupError);
65
65
  } finally {
66
66
  this.terminal = 'aborted';
67
67
  }
@@ -218,17 +218,32 @@ export class ServiceRelocationObjectCaptureOwner {
218
218
  }
219
219
  }
220
220
 
221
- async function abortSourceSeals(units: readonly ServiceRelocationCaptureUnit[]): Promise<void> {
221
+ async function abortSourceSeals(
222
+ units: readonly ServiceRelocationCaptureUnit[],
223
+ onCleanupError?: (error: unknown) => void
224
+ ): Promise<void> {
222
225
  const failures: unknown[] = [];
226
+ const cleanupFailures: unknown[] = [];
223
227
  for (const unit of [...units].reverse()) {
224
228
  try {
225
- await unit.abortSeal();
229
+ await unit.abortSeal((error) => cleanupFailures.push(error));
226
230
  } catch (error) {
227
231
  failures.push(error);
228
232
  }
229
233
  }
230
234
  if (failures.length !== 0) {
231
- throw new AggregateError(failures, 'Relocation source rollback was incomplete.');
235
+ throw new AggregateError(
236
+ [...failures, ...cleanupFailures],
237
+ 'Relocation source rollback was incomplete.'
238
+ );
239
+ }
240
+ if (cleanupFailures.length !== 0) {
241
+ const cleanup = new AggregateError(
242
+ cleanupFailures,
243
+ 'Relocation source rollback was incomplete.'
244
+ );
245
+ if (onCleanupError === undefined) throw cleanup;
246
+ onCleanupError(cleanup);
232
247
  }
233
248
  }
234
249
 
@@ -1,3 +1,4 @@
1
+ import type { PendingOperation } from './operation-registry';
1
2
  import type { RoutingId } from '../../contracts';
2
3
  import type { Message } from '../../contracts/Common/Message';
3
4
  import type { ApplicationJobPermitPort } from '../application-jobs/contracts';
@@ -252,6 +253,7 @@ export interface ZLinkMessageFollowOrigin {
252
253
  }
253
254
 
254
255
  export interface ReceiveRecord {
256
+ readonly receivedAt?: Date;
255
257
  /** Resolve record prerequisites in owner order, outside an application handler turn. */
256
258
  readonly prepareDispatch?: (
257
259
  this: ReceiveRecord,
@@ -275,6 +277,7 @@ export interface ReceiveRecord {
275
277
  readonly kindData: ReceiveKindData | null;
276
278
  readonly terminalResult: number;
277
279
  readonly failureErrno: number;
280
+ readonly failureMessage?: string;
278
281
  readonly parts: Message[];
279
282
  /** Returns whether the local operation can still accept a lifecycle reply. */
280
283
  readonly isPending?: () => boolean;
@@ -298,7 +301,11 @@ export interface ReceiveRecord {
298
301
  replyContentType?: string
299
302
  ): SubmitResult;
300
303
  /** Emits a typed command-20 terminal for a lifecycle request before admission. */
301
- replyFailure?(terminalResult: number, failureCode: number): SubmitResult;
304
+ replyFailure?(
305
+ terminalResult: number,
306
+ failureCode: number,
307
+ tail?: import('./service-stateful-wire-codec').ServiceStatefulReplyTail
308
+ ): SubmitResult;
302
309
  }
303
310
 
304
311
  export interface ClaimReceiveResult {
@@ -436,6 +443,7 @@ export interface ServiceSpot {
436
443
  options?: {
437
444
  flags?: number;
438
445
  timeoutMs?: number;
446
+ readonly requestOperation?: PendingOperation<unknown>;
439
447
  applicationMetadata?: Buffer;
440
448
  onAdmitted?: () => void;
441
449
  }
@@ -459,11 +467,13 @@ export interface ServiceSpot {
459
467
  options?: {
460
468
  flags?: number;
461
469
  timeoutMs?: number;
470
+ readonly requestOperation?: PendingOperation<unknown>;
462
471
  applicationMetadata?: Buffer;
463
472
  routeFence?: ServiceDirectSpotRouteFence;
464
473
  onAdmitted?: () => void;
465
474
  entrySpot?: boolean;
466
- }
475
+ },
476
+ completion?: import('../backend/mesh-completion-table').ZLinkMeshCompletionHandler
467
477
  ): MeshOperationId;
468
478
  publish(
469
479
  channelName: string,
@@ -62,6 +62,11 @@ export interface ServiceSessionBinding {
62
62
  readonly membershipEpoch: bigint;
63
63
  }
64
64
 
65
+ interface ServiceSessionBindingEntry {
66
+ readonly binding: ServiceSessionBinding;
67
+ lastAcceptedSequence: bigint;
68
+ }
69
+
65
70
  export interface ServiceObjectReservation {
66
71
  readonly id: bigint;
67
72
  readonly objectKind: 'actor' | 'userSpot' | 'instanceSpot';
@@ -112,7 +117,7 @@ export class ServiceStatefulRegistry {
112
117
  >();
113
118
  private readonly actors = new Map<string, ServiceActorState>();
114
119
  private readonly actorTypes = new Map<string, string>();
115
- private readonly bindings = new Map<string, ServiceSessionBinding>();
120
+ private readonly bindings = new Map<string, ServiceSessionBindingEntry>();
116
121
  private readonly reservations = new Map<string, ServiceObjectReservation>();
117
122
  private readonly spotGenerations = new Map<string, bigint>();
118
123
  private readonly actorGenerations = new Map<string, bigint>();
@@ -408,7 +413,7 @@ export class ServiceStatefulRegistry {
408
413
  );
409
414
  requireText(binding.sessionOwnerNodeRid, 'sessionOwnerNodeRid');
410
415
  requirePositive(binding.bindingGeneration, 'bindingGeneration');
411
- const current = this.bindings.get(actorKey(binding.actor));
416
+ const current = this.bindings.get(actorKey(binding.actor))?.binding;
412
417
  if (
413
418
  current !== undefined &&
414
419
  current.sessionOwnerNodeRid === binding.sessionOwnerNodeRid &&
@@ -423,7 +428,7 @@ export class ServiceStatefulRegistry {
423
428
  throw new ServiceStaleGenerationError('binding', binding.actor.actorId);
424
429
  }
425
430
  const accepted = Object.freeze({ ...binding });
426
- this.bindings.set(actorKey(binding.actor), accepted);
431
+ this.bindings.set(actorKey(binding.actor), { binding: accepted, lastAcceptedSequence: 0n });
427
432
  return accepted;
428
433
  }
429
434
 
@@ -432,10 +437,29 @@ export class ServiceStatefulRegistry {
432
437
  }
433
438
 
434
439
  private bindingCore(actor: ServiceActorRef): ServiceSessionBinding | undefined {
435
- const binding = this.bindings.get(actorKey(actor));
440
+ const binding = this.bindings.get(actorKey(actor))?.binding;
436
441
  return binding?.actor.generation === actor.generation ? binding : undefined;
437
442
  }
438
443
 
444
+ /** The Actor owner admits each relayed Session sequence once per binding. */
445
+ acceptBoundSessionSequence(
446
+ actor: ServiceActorRef,
447
+ expectedBindingGeneration: bigint,
448
+ sequence: bigint
449
+ ): boolean {
450
+ const entry = this.bindings.get(actorKey(actor));
451
+ if (
452
+ entry === undefined ||
453
+ entry.binding.actor.generation !== actor.generation ||
454
+ entry.binding.bindingGeneration !== expectedBindingGeneration ||
455
+ sequence <= entry.lastAcceptedSequence
456
+ ) {
457
+ return false;
458
+ }
459
+ entry.lastAcceptedSequence = sequence;
460
+ return true;
461
+ }
462
+
439
463
  unbindSession(
440
464
  actor: ServiceActorRef,
441
465
  expectedBindingGeneration: bigint,
@@ -443,8 +467,9 @@ export class ServiceStatefulRegistry {
443
467
  expectedSessionOwnerNodeRid?: string
444
468
  ): boolean {
445
469
  const key = actorKey(actor);
446
- const binding = this.bindings.get(key);
447
- if (binding === undefined) return false;
470
+ const entry = this.bindings.get(key);
471
+ if (entry === undefined) return false;
472
+ const binding = entry.binding;
448
473
  if (
449
474
  binding.bindingGeneration !== expectedBindingGeneration ||
450
475
  (expectedSessionRid !== undefined &&
@@ -577,16 +602,16 @@ export class ServiceStatefulRegistry {
577
602
 
578
603
  private updateBindingMembership(actor: ServiceActorState): void {
579
604
  const key = actorKey(actor.ref);
580
- const binding = this.bindings.get(key);
581
- if (binding === undefined) return;
582
- this.bindings.set(
583
- key,
584
- Object.freeze({
585
- ...binding,
605
+ const entry = this.bindings.get(key);
606
+ if (entry === undefined) return;
607
+ this.bindings.set(key, {
608
+ binding: Object.freeze({
609
+ ...entry.binding,
586
610
  actor: actor.ref,
587
611
  membershipEpoch: actor.membershipEpoch
588
- })
589
- );
612
+ }),
613
+ lastAcceptedSequence: entry.lastAcceptedSequence
614
+ });
590
615
  }
591
616
  }
592
617
 
@@ -619,20 +644,28 @@ export const RELOCATION_REPLY_RETENTION_MS = 24 * 60 * 60 * 1_000;
619
644
  export class ServiceTerminalOperationRegistry<T, Context = unknown> {
620
645
  private readonly operations: OperationRegistry<T, Context>;
621
646
 
622
- constructor(operations = new OperationRegistry<T, Context>()) {
647
+ constructor(
648
+ operations = new OperationRegistry<T, Context>(),
649
+ private readonly release = () => operations.close('Stateful runtime closed.')
650
+ ) {
623
651
  this.operations = operations;
624
652
  }
625
653
 
626
654
  register(
627
655
  timeoutMs: number,
628
656
  timeoutOwner: 'registry' | 'sender' = 'registry',
629
- context?: Context
657
+ context?: Context,
658
+ absoluteDeadlineMs?: number
630
659
  ): PendingOperation<T> {
631
- return this.operations.register(timeoutMs, timeoutOwner, context);
660
+ return this.operations.register(timeoutMs, timeoutOwner, context, absoluteDeadlineMs);
661
+ }
662
+
663
+ setContext(id: bigint, context: Context): void {
664
+ this.operations.setContext(id, context);
632
665
  }
633
666
 
634
667
  reply(id: bigint, value: T, terminalContextRetentionMs = 0): boolean {
635
- return this.operations.complete(id, value, terminalContextRetentionMs);
668
+ return this.operations.reply(id, value, terminalContextRetentionMs);
636
669
  }
637
670
 
638
671
  fail(id: bigint, error: unknown): boolean {
@@ -664,7 +697,7 @@ export class ServiceTerminalOperationRegistry<T, Context = unknown> {
664
697
  }
665
698
 
666
699
  close(): void {
667
- this.operations.close('Stateful runtime closed.');
700
+ this.release();
668
701
  }
669
702
 
670
703
  failAll(reason: unknown): void {