@zlink-systems/framework 0.30.0 → 0.30.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/LICENSE +150 -68
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/contracts/Actors/ZLinkActorClient.d.ts +2 -1
  4. package/dist/contracts/Channels/Calls.d.ts +2 -1
  5. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
  6. package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
  7. package/dist/contracts/Common/ZLinkMessageMetadata.js +11 -5
  8. package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
  9. package/dist/contracts/Common/encoded-payload-storage.js +5 -2
  10. package/dist/contracts/Configuration/Builders.d.ts +1 -1
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
  12. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
  13. package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
  14. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  15. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
  16. package/dist/contracts/Handlers/Attributes.d.ts +5 -13
  17. package/dist/contracts/Handlers/Attributes.js +7 -11
  18. package/dist/contracts/Handlers/JsonContract.d.ts +2 -46
  19. package/dist/contracts/Handlers/JsonContract.js +4 -153
  20. package/dist/contracts/Locations/Rows.d.ts +2 -0
  21. package/dist/contracts/Spots/Contracts.d.ts +6 -1
  22. package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
  23. package/dist/nest-integration.d.ts +1 -1
  24. package/dist/nest-integration.js +2 -1
  25. package/dist/runtime/abort.d.ts +5 -0
  26. package/dist/runtime/abort.js +10 -0
  27. package/dist/runtime/actors/actor-authority-publication.js +3 -2
  28. package/dist/runtime/actors/actor-client.d.ts +1 -2
  29. package/dist/runtime/actors/actor-client.js +52 -57
  30. package/dist/runtime/actors/actor-context.d.ts +2 -0
  31. package/dist/runtime/actors/actor-context.js +46 -9
  32. package/dist/runtime/actors/actor-handoff.d.ts +8 -4
  33. package/dist/runtime/actors/actor-handoff.js +219 -92
  34. package/dist/runtime/actors/actor-join-relocation.d.ts +3 -0
  35. package/dist/runtime/actors/actor-local-native-join.js +13 -12
  36. package/dist/runtime/actors/actor-mailbox.js +27 -1
  37. package/dist/runtime/actors/actor-remote-joiner.js +3 -1
  38. package/dist/runtime/actors/actor-remote-wire.js +15 -0
  39. package/dist/runtime/actors/actor-reply.d.ts +4 -0
  40. package/dist/runtime/actors/actor-reply.js +29 -0
  41. package/dist/runtime/actors/actor-routed-join-transport.d.ts +6 -2
  42. package/dist/runtime/actors/actor-routed-json-request.d.ts +2 -0
  43. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
  44. package/dist/runtime/actors/actor-runtime-state.js +2 -20
  45. package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
  46. package/dist/runtime/actors/index.d.ts +8 -3
  47. package/dist/runtime/actors/index.js +55 -27
  48. package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
  49. package/dist/runtime/actors/session-disconnected-wire.js +48 -0
  50. package/dist/runtime/actors/spot-actor-dispatch.js +2 -2
  51. package/dist/runtime/admission.d.ts +9 -1
  52. package/dist/runtime/admission.js +56 -23
  53. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +6 -8
  54. package/dist/runtime/application-jobs/application-ingress-record-owner.js +39 -22
  55. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +15 -1
  56. package/dist/runtime/application-jobs/application-job-queue-scope.js +61 -20
  57. package/dist/runtime/application-jobs/contracts.d.ts +12 -1
  58. package/dist/runtime/backend/contracts/index.d.ts +37 -12
  59. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
  60. package/dist/runtime/backend/mesh-completion-table.d.ts +9 -1
  61. package/dist/runtime/backend/mesh-completion-table.js +154 -49
  62. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +28 -1
  63. package/dist/runtime/backend/mesh-dispatch-pump.js +208 -101
  64. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +2 -2
  65. package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -9
  66. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +1 -1
  67. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +5 -2
  68. package/dist/runtime/backend/node/node-raw-binding-port.js +124 -72
  69. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +46 -13
  70. package/dist/runtime/backend/node/node-raw-mesh-backend.js +181 -164
  71. package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
  72. package/dist/runtime/backend/node/node-socket-backend-adapter.js +11 -11
  73. package/dist/runtime/backend/raw-binding-port.d.ts +2 -2
  74. package/dist/runtime/backend/runtime-message.d.ts +1 -0
  75. package/dist/runtime/backend/runtime-message.js +5 -0
  76. package/dist/runtime/backend/runtime-values.d.ts +1 -0
  77. package/dist/runtime/backend/runtime-values.js +2 -1
  78. package/dist/runtime/channels/channel-clients.d.ts +2 -0
  79. package/dist/runtime/channels/channel-clients.js +75 -23
  80. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +25 -5
  81. package/dist/runtime/channels/channel-dispatch-pipeline.js +111 -56
  82. package/dist/runtime/channels/channel-dispatch-services.d.ts +1 -0
  83. package/dist/runtime/channels/channel-dispatch-services.js +45 -0
  84. package/dist/runtime/channels/channel-dispatchers.d.ts +4 -3
  85. package/dist/runtime/channels/channel-dispatchers.js +62 -54
  86. package/dist/runtime/channels/channel-envelope-inspection.d.ts +1 -2
  87. package/dist/runtime/channels/channel-envelope-inspection.js +1 -16
  88. package/dist/runtime/channels/channel-envelope.d.ts +2 -0
  89. package/dist/runtime/channels/channel-envelope.js +146 -28
  90. package/dist/runtime/channels/channel-outbound-operations.d.ts +2 -2
  91. package/dist/runtime/channels/channel-outbound-operations.js +8 -8
  92. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
  93. package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
  94. package/dist/runtime/channels/channel-runtime-manager.d.ts +9 -8
  95. package/dist/runtime/channels/channel-runtime-manager.js +16 -16
  96. package/dist/runtime/channels/channel-transports.d.ts +18 -16
  97. package/dist/runtime/channels/channel-transports.js +77 -58
  98. package/dist/runtime/channels/client-server-location-runtime.js +5 -4
  99. package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
  100. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  101. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  102. package/dist/runtime/channels/fanout-location-runtime.js +3 -3
  103. package/dist/runtime/channels/local-spot-route-transport.d.ts +1 -1
  104. package/dist/runtime/channels/local-spot-route-transport.js +2 -1
  105. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +2 -2
  106. package/dist/runtime/channels/router-socket-spot-route-transport.js +4 -4
  107. package/dist/runtime/channels/source-spot-router.d.ts +2 -2
  108. package/dist/runtime/channels/source-spot-router.js +4 -4
  109. package/dist/runtime/channels/spot-node-route-transport.d.ts +2 -2
  110. package/dist/runtime/channels/spot-node-route-transport.js +4 -4
  111. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +2 -2
  112. package/dist/runtime/channels/spot-route-bridge-transport.js +4 -4
  113. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +5 -4
  114. package/dist/runtime/channels/spot-route-dispatch-strategy.js +18 -18
  115. package/dist/runtime/diagnostics/flow-context.js +19 -7
  116. package/dist/runtime/diagnostics/index.js +4 -9
  117. package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
  118. package/dist/runtime/diagnostics/message-flow.js +35 -5
  119. package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
  120. package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
  121. package/dist/runtime/execution/index.d.ts +4 -2
  122. package/dist/runtime/execution/index.js +33 -10
  123. package/dist/runtime/execution/serial-execution-queue.d.ts +5 -0
  124. package/dist/runtime/execution/serial-execution-queue.js +22 -2
  125. package/dist/runtime/execution/state-lane.d.ts +2 -0
  126. package/dist/runtime/execution/state-lane.js +5 -0
  127. package/dist/runtime/foundation/actor-join-recovery-codec.js +2 -2
  128. package/dist/runtime/foundation/durable-service-request.d.ts +14 -0
  129. package/dist/runtime/foundation/durable-service-request.js +98 -0
  130. package/dist/runtime/foundation/operation-identity.d.ts +1 -0
  131. package/dist/runtime/foundation/operation-identity.js +5 -1
  132. package/dist/runtime/foundation/operation-registry.d.ts +25 -1
  133. package/dist/runtime/foundation/operation-registry.js +86 -18
  134. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +61 -8
  135. package/dist/runtime/foundation/raw-service-mesh-runtime.js +486 -266
  136. package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
  137. package/dist/runtime/foundation/service-liveness-registry.js +38 -0
  138. package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
  139. package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
  140. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +3 -3
  141. package/dist/runtime/foundation/service-relocation-object-owner.js +48 -34
  142. package/dist/runtime/foundation/service-relocation-runtime.d.ts +2 -0
  143. package/dist/runtime/foundation/service-relocation-runtime.js +20 -4
  144. package/dist/runtime/foundation/service-runtime-contracts.d.ts +10 -1
  145. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
  146. package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
  147. package/dist/runtime/foundation/service-stateful-registry.js +24 -26
  148. package/dist/runtime/foundation/service-stateful-runtime.d.ts +75 -9
  149. package/dist/runtime/foundation/service-stateful-runtime.js +486 -218
  150. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -6
  151. package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
  152. package/dist/runtime/foundation/service-topology-registry.d.ts +12 -2
  153. package/dist/runtime/foundation/service-topology-registry.js +61 -27
  154. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
  155. package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
  156. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  157. package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
  158. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +13 -3
  159. package/dist/runtime/foundation/service-wire-m6a-codec.js +189 -78
  160. package/dist/runtime/handlers/handler-instance-scope.d.ts +8 -0
  161. package/dist/runtime/handlers/handler-instance-scope.js +54 -11
  162. package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
  163. package/dist/runtime/host/actor-packet-relay.js +59 -72
  164. package/dist/runtime/host/actor-placement-coordinator.js +25 -8
  165. package/dist/runtime/host/actor-runtime-options-factory.js +2 -2
  166. package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
  167. package/dist/runtime/host/actor-transfer-runtime.js +85 -331
  168. package/dist/runtime/host/application-job-queue.d.ts +40 -7
  169. package/dist/runtime/host/application-job-queue.js +137 -42
  170. package/dist/runtime/host/entry-actor-runtime.d.ts +1 -0
  171. package/dist/runtime/host/entry-actor-runtime.js +3 -0
  172. package/dist/runtime/host/index.d.ts +12 -2
  173. package/dist/runtime/host/index.js +300 -202
  174. package/dist/runtime/host/location-runtime-owner.js +2 -6
  175. package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
  176. package/dist/runtime/host/mesh-router-resolver.js +14 -6
  177. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
  178. package/dist/runtime/host/remote-bound-session-relay.js +73 -208
  179. package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
  180. package/dist/runtime/host/route-mesh-runtime.js +6 -4
  181. package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
  182. package/dist/runtime/host/runtime-shutdown.js +3 -2
  183. package/dist/runtime/host/service-relocation-control.d.ts +1 -0
  184. package/dist/runtime/host/service-relocation-control.js +10 -4
  185. package/dist/runtime/host/service-relocation-host-runtime.d.ts +22 -14
  186. package/dist/runtime/host/service-relocation-host-runtime.js +754 -599
  187. package/dist/runtime/host/spot-address-transport.js +3 -2
  188. package/dist/runtime/host/spot-runtime-options-factory.js +16 -7
  189. package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
  190. package/dist/runtime/locations/actor-location-claims.d.ts +2 -2
  191. package/dist/runtime/locations/actor-location-claims.js +34 -19
  192. package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
  193. package/dist/runtime/locations/auto-connect-loop.js +22 -14
  194. package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
  195. package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
  196. package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
  197. package/dist/runtime/locations/descriptor-publication.js +11 -0
  198. package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
  199. package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
  200. package/dist/runtime/locations/in-memory-authority-store.js +56 -19
  201. package/dist/runtime/locations/in-memory-location-store.js +1 -10
  202. package/dist/runtime/locations/index.d.ts +1 -0
  203. package/dist/runtime/locations/index.js +1 -0
  204. package/dist/runtime/locations/lease-tracker.js +1 -6
  205. package/dist/runtime/locations/lifecycle.d.ts +1 -2
  206. package/dist/runtime/locations/lifecycle.js +2 -5
  207. package/dist/runtime/locations/location-store-repository.d.ts +51 -1
  208. package/dist/runtime/locations/location-store-repository.js +363 -139
  209. package/dist/runtime/locations/relocation-blob.d.ts +18 -1
  210. package/dist/runtime/locations/relocation-blob.js +52 -1
  211. package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
  212. package/dist/runtime/locations/request-source-resolver.js +80 -0
  213. package/dist/runtime/locations/resolvers.js +1 -1
  214. package/dist/runtime/locations/runtime.d.ts +7 -3
  215. package/dist/runtime/locations/runtime.js +61 -53
  216. package/dist/runtime/messaging/framework-json-v1.d.ts +4 -6
  217. package/dist/runtime/messaging/framework-json-v1.js +38 -294
  218. package/dist/runtime/messaging/packet-name.d.ts +1 -1
  219. package/dist/runtime/messaging/packet-name.js +8 -24
  220. package/dist/runtime/messaging/payload-codec.d.ts +7 -1
  221. package/dist/runtime/messaging/payload-codec.js +7 -6
  222. package/dist/runtime/messaging/request-result.d.ts +2 -0
  223. package/dist/runtime/messaging/request-result.js +57 -0
  224. package/dist/runtime/messaging/submission-result.d.ts +1 -0
  225. package/dist/runtime/messaging/submission-result.js +5 -2
  226. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +34 -1
  227. package/dist/runtime/protocol/service_wire_codec.generated.js +229 -0
  228. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +16 -1
  229. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +37 -8
  230. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +7 -2
  231. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +36 -21
  232. package/dist/runtime/spots/index.d.ts +21 -11
  233. package/dist/runtime/spots/index.js +243 -178
  234. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
  235. package/dist/runtime/spots/spot-activation-registry.js +21 -11
  236. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  237. package/dist/runtime/spots/spot-activation-state.js +7 -7
  238. package/dist/runtime/spots/spot-activation.d.ts +7 -3
  239. package/dist/runtime/spots/spot-activation.js +140 -52
  240. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
  241. package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
  242. package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
  243. package/dist/runtime/spots/spot-actor-membership.js +0 -8
  244. package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
  245. package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
  246. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
  247. package/dist/runtime/spots/spot-entry-activation.js +20 -11
  248. package/dist/runtime/spots/spot-handler-registry.d.ts +7 -4
  249. package/dist/runtime/spots/spot-handler-registry.js +24 -10
  250. package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
  251. package/dist/runtime/spots/spot-manager-public.js +2 -2
  252. package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
  253. package/dist/runtime/spots/spot-node-autoconnect.js +22 -42
  254. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
  255. package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
  256. package/dist/runtime/spots/spot-outbound.d.ts +3 -0
  257. package/dist/runtime/spots/spot-outbound.js +27 -18
  258. package/dist/runtime/spots/spot-remote-codec.js +5 -1
  259. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +1 -0
  260. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +1 -1
  261. package/dist/runtime/spots/spot-runtime-ports.d.ts +1 -1
  262. package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
  263. package/dist/runtime/spots/spot-serial-executor.js +61 -8
  264. package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
  265. package/dist/runtime/spots/spot-subscription-dispatch.js +1 -4
  266. package/dist/runtime/spots/spot-timer.d.ts +57 -5
  267. package/dist/runtime/spots/spot-timer.js +288 -103
  268. package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
  269. package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
  270. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
  271. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
  272. package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
  273. package/dist/runtime/streams/bound-session-service.d.ts +1 -1
  274. package/dist/runtime/streams/bound-session-service.js +6 -11
  275. package/dist/runtime/streams/index.d.ts +3 -2
  276. package/dist/runtime/streams/index.js +6 -4
  277. package/dist/runtime/streams/managed-stream.js +3 -2
  278. package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
  279. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
  280. package/dist/runtime/streams/session-actor-coordinator.js +15 -32
  281. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
  282. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -1
  283. package/dist/runtime/streams/stream-session-runtime.js +14 -31
  284. package/dist/runtime/workers/index.js +1 -1
  285. package/package.json +3 -3
  286. package/src/contracts/Actors/ZLinkActorClient.ts +2 -1
  287. package/src/contracts/Channels/Calls.ts +2 -1
  288. package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
  289. package/src/contracts/Common/ZLinkMessageMetadata.ts +13 -8
  290. package/src/contracts/Common/encoded-payload-storage.ts +6 -3
  291. package/src/contracts/Configuration/Builders.ts +4 -1
  292. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
  293. package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
  294. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  295. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
  296. package/src/contracts/Handlers/Attributes.ts +14 -21
  297. package/src/contracts/Handlers/JsonContract.ts +8 -216
  298. package/src/contracts/Locations/Rows.ts +2 -0
  299. package/src/contracts/Spots/Contracts.ts +10 -1
  300. package/src/contracts/Spots/ZLinkSpot.ts +3 -3
  301. package/src/nest-integration.ts +1 -0
  302. package/src/runtime/abort.ts +12 -0
  303. package/src/runtime/actors/actor-authority-publication.ts +3 -2
  304. package/src/runtime/actors/actor-client.ts +100 -85
  305. package/src/runtime/actors/actor-context.ts +49 -9
  306. package/src/runtime/actors/actor-handoff.ts +291 -110
  307. package/src/runtime/actors/actor-join-relocation.ts +3 -0
  308. package/src/runtime/actors/actor-local-native-join.ts +21 -26
  309. package/src/runtime/actors/actor-mailbox.ts +40 -2
  310. package/src/runtime/actors/actor-remote-joiner.ts +6 -1
  311. package/src/runtime/actors/actor-remote-wire.ts +17 -0
  312. package/src/runtime/actors/actor-reply.ts +42 -0
  313. package/src/runtime/actors/actor-routed-join-transport.ts +14 -4
  314. package/src/runtime/actors/actor-routed-json-request.ts +10 -2
  315. package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
  316. package/src/runtime/actors/actor-runtime-state.ts +2 -20
  317. package/src/runtime/actors/actor-source-transfer.ts +1 -34
  318. package/src/runtime/actors/index.ts +60 -32
  319. package/src/runtime/actors/session-disconnected-wire.ts +66 -0
  320. package/src/runtime/actors/spot-actor-dispatch.ts +4 -2
  321. package/src/runtime/admission.ts +69 -21
  322. package/src/runtime/application-jobs/application-ingress-record-owner.ts +41 -25
  323. package/src/runtime/application-jobs/application-job-queue-scope.ts +83 -22
  324. package/src/runtime/application-jobs/contracts.ts +16 -1
  325. package/src/runtime/backend/contracts/index.ts +92 -18
  326. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
  327. package/src/runtime/backend/mesh-completion-table.ts +160 -57
  328. package/src/runtime/backend/mesh-dispatch-pump.ts +237 -108
  329. package/src/runtime/backend/node/node-backend-adapter-support.ts +17 -8
  330. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +12 -2
  331. package/src/runtime/backend/node/node-raw-binding-port.ts +148 -85
  332. package/src/runtime/backend/node/node-raw-mesh-backend.ts +315 -201
  333. package/src/runtime/backend/node/node-socket-backend-adapter.ts +26 -11
  334. package/src/runtime/backend/raw-binding-port.ts +7 -2
  335. package/src/runtime/backend/runtime-message.ts +6 -0
  336. package/src/runtime/backend/runtime-values.ts +1 -0
  337. package/src/runtime/channels/channel-clients.ts +132 -58
  338. package/src/runtime/channels/channel-dispatch-pipeline.ts +198 -114
  339. package/src/runtime/channels/channel-dispatch-services.ts +69 -1
  340. package/src/runtime/channels/channel-dispatchers.ts +136 -90
  341. package/src/runtime/channels/channel-envelope-inspection.ts +2 -16
  342. package/src/runtime/channels/channel-envelope.ts +225 -31
  343. package/src/runtime/channels/channel-outbound-operations.ts +22 -8
  344. package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
  345. package/src/runtime/channels/channel-runtime-manager.ts +41 -17
  346. package/src/runtime/channels/channel-transports.ts +171 -112
  347. package/src/runtime/channels/client-server-location-runtime.ts +11 -10
  348. package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
  349. package/src/runtime/channels/fanout-location-runtime.ts +17 -9
  350. package/src/runtime/channels/local-spot-route-transport.ts +3 -1
  351. package/src/runtime/channels/router-socket-spot-route-transport.ts +13 -4
  352. package/src/runtime/channels/source-spot-router.ts +8 -4
  353. package/src/runtime/channels/spot-node-route-transport.ts +8 -4
  354. package/src/runtime/channels/spot-route-bridge-transport.ts +6 -4
  355. package/src/runtime/channels/spot-route-dispatch-strategy.ts +47 -18
  356. package/src/runtime/diagnostics/flow-context.ts +20 -7
  357. package/src/runtime/diagnostics/index.ts +1 -7
  358. package/src/runtime/diagnostics/message-flow.ts +47 -9
  359. package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
  360. package/src/runtime/execution/index.ts +40 -14
  361. package/src/runtime/execution/serial-execution-queue.ts +33 -4
  362. package/src/runtime/execution/state-lane.ts +7 -0
  363. package/src/runtime/foundation/actor-join-recovery-codec.ts +2 -2
  364. package/src/runtime/foundation/durable-service-request.ts +137 -0
  365. package/src/runtime/foundation/operation-identity.ts +5 -1
  366. package/src/runtime/foundation/operation-registry.ts +98 -20
  367. package/src/runtime/foundation/raw-service-mesh-runtime.ts +704 -336
  368. package/src/runtime/foundation/service-liveness-registry.ts +39 -0
  369. package/src/runtime/foundation/service-mailbox.ts +8 -0
  370. package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
  371. package/src/runtime/foundation/service-relocation-object-owner.ts +55 -36
  372. package/src/runtime/foundation/service-relocation-runtime.ts +25 -4
  373. package/src/runtime/foundation/service-runtime-contracts.ts +19 -2
  374. package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
  375. package/src/runtime/foundation/service-stateful-registry.ts +38 -35
  376. package/src/runtime/foundation/service-stateful-runtime.ts +732 -275
  377. package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -16
  378. package/src/runtime/foundation/service-topology-registry.ts +91 -36
  379. package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
  380. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  381. package/src/runtime/foundation/service-wire-m6a-codec.ts +231 -76
  382. package/src/runtime/handlers/handler-instance-scope.ts +67 -16
  383. package/src/runtime/host/actor-packet-relay.ts +113 -94
  384. package/src/runtime/host/actor-placement-coordinator.ts +31 -8
  385. package/src/runtime/host/actor-runtime-options-factory.ts +13 -2
  386. package/src/runtime/host/actor-transfer-runtime.ts +104 -430
  387. package/src/runtime/host/application-job-queue.ts +160 -41
  388. package/src/runtime/host/entry-actor-runtime.ts +4 -0
  389. package/src/runtime/host/index.ts +473 -271
  390. package/src/runtime/host/location-runtime-owner.ts +2 -6
  391. package/src/runtime/host/mesh-router-resolver.ts +13 -5
  392. package/src/runtime/host/remote-bound-session-relay.ts +88 -271
  393. package/src/runtime/host/route-mesh-runtime.ts +12 -6
  394. package/src/runtime/host/runtime-shutdown.ts +15 -4
  395. package/src/runtime/host/service-relocation-control.ts +11 -5
  396. package/src/runtime/host/service-relocation-host-runtime.ts +1092 -759
  397. package/src/runtime/host/spot-address-transport.ts +4 -2
  398. package/src/runtime/host/spot-runtime-options-factory.ts +20 -7
  399. package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
  400. package/src/runtime/locations/actor-location-claims.ts +52 -30
  401. package/src/runtime/locations/auto-connect-loop.ts +22 -14
  402. package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
  403. package/src/runtime/locations/auto-connect-types.ts +0 -1
  404. package/src/runtime/locations/descriptor-publication.ts +7 -0
  405. package/src/runtime/locations/domain-store-contract.ts +5 -0
  406. package/src/runtime/locations/in-memory-authority-store.ts +85 -23
  407. package/src/runtime/locations/in-memory-location-store.ts +1 -12
  408. package/src/runtime/locations/index.ts +1 -0
  409. package/src/runtime/locations/lease-tracker.ts +2 -9
  410. package/src/runtime/locations/lifecycle.ts +8 -26
  411. package/src/runtime/locations/location-store-repository.ts +628 -152
  412. package/src/runtime/locations/relocation-blob.ts +75 -1
  413. package/src/runtime/locations/request-source-resolver.ts +138 -0
  414. package/src/runtime/locations/resolvers.ts +2 -2
  415. package/src/runtime/locations/runtime.ts +98 -64
  416. package/src/runtime/messaging/framework-json-v1.ts +5 -325
  417. package/src/runtime/messaging/packet-name.ts +5 -25
  418. package/src/runtime/messaging/payload-codec.ts +8 -11
  419. package/src/runtime/messaging/request-result.ts +62 -0
  420. package/src/runtime/messaging/submission-result.ts +5 -1
  421. package/src/runtime/protocol/service_wire_codec.generated.ts +218 -5
  422. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +16 -13
  423. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +46 -25
  424. package/src/runtime/spots/index.ts +389 -283
  425. package/src/runtime/spots/spot-activation-registry.ts +25 -13
  426. package/src/runtime/spots/spot-activation-state.ts +12 -19
  427. package/src/runtime/spots/spot-activation.ts +198 -96
  428. package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
  429. package/src/runtime/spots/spot-actor-membership.ts +0 -15
  430. package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
  431. package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
  432. package/src/runtime/spots/spot-entry-activation.ts +33 -21
  433. package/src/runtime/spots/spot-handler-registry.ts +56 -12
  434. package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
  435. package/src/runtime/spots/spot-manager-public.ts +2 -2
  436. package/src/runtime/spots/spot-node-autoconnect.ts +28 -47
  437. package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
  438. package/src/runtime/spots/spot-outbound.ts +39 -19
  439. package/src/runtime/spots/spot-remote-codec.ts +9 -2
  440. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +2 -1
  441. package/src/runtime/spots/spot-runtime-ports.ts +1 -1
  442. package/src/runtime/spots/spot-serial-executor.ts +97 -25
  443. package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
  444. package/src/runtime/spots/spot-subscription-dispatch.ts +1 -4
  445. package/src/runtime/spots/spot-timer.ts +418 -158
  446. package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
  447. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
  448. package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
  449. package/src/runtime/streams/bound-session-service.ts +7 -10
  450. package/src/runtime/streams/index.ts +12 -6
  451. package/src/runtime/streams/managed-stream.ts +4 -2
  452. package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
  453. package/src/runtime/streams/session-actor-coordinator.ts +39 -88
  454. package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
  455. package/src/runtime/streams/stream-session-runtime.ts +13 -34
  456. package/src/runtime/workers/index.ts +1 -1
@@ -54,9 +54,20 @@ export class ServiceLivenessConnection {
54
54
  }
55
55
 
56
56
  /** Uses monotonic milliseconds and never treats application traffic as a probe ACK. */
57
+ const NO_LIVENESS_WORK: ServiceLivenessTick = Object.freeze({
58
+ probes: Object.freeze([]) as readonly ServiceProbe[],
59
+ timedOutNodes: Object.freeze([]) as readonly string[]
60
+ });
61
+
57
62
  export class ServiceLivenessRegistry {
58
63
  private readonly peers = new Map<string, ServiceLivenessConnection>();
59
64
  private nextProbeId = 1n;
65
+ /**
66
+ * The earliest probe or timeout among admitted peers. Received traffic only
67
+ * extends a peer's deadline, so this stays a lower bound between ticks.
68
+ */
69
+ private nextDueMs = Number.POSITIVE_INFINITY;
70
+ private admissionActivityMs?: number;
60
71
 
61
72
  constructor(
62
73
  private readonly probeIntervalMs = DEFAULT_SERVICE_PROBE_INTERVAL_MS,
@@ -89,9 +100,33 @@ export class ServiceLivenessRegistry {
89
100
  this.peerTimeoutMs
90
101
  );
91
102
  this.peers.set(nodeRoutingId, admitted);
103
+ this.nextDueMs = Math.min(this.nextDueMs, admitted.nextProbeMs, admitted.deadlineMs);
92
104
  return admitted;
93
105
  }
94
106
 
107
+ /** When the next tick has probe or timeout work (spec 08 §4.2 management deadline). */
108
+ nextDeadlineMs(): number {
109
+ return Math.min(this.nextDueMs, this.nextAdmissionDeadlineMs());
110
+ }
111
+
112
+ /** Pending admission shares the existing liveness management cadence (MeshNode §7.1). */
113
+ setAdmissionPending(pending: boolean, nowMs: number): void {
114
+ if (pending) this.admissionActivityMs ??= nowMs;
115
+ else this.admissionActivityMs = undefined;
116
+ }
117
+
118
+ private nextAdmissionDeadlineMs(): number {
119
+ return this.admissionActivityMs === undefined
120
+ ? Number.POSITIVE_INFINITY
121
+ : this.admissionActivityMs + this.probeIntervalMs;
122
+ }
123
+
124
+ tickAdmission(nowMs: number): boolean {
125
+ if (nowMs < this.nextAdmissionDeadlineMs()) return false;
126
+ this.admissionActivityMs = nowMs;
127
+ return true;
128
+ }
129
+
95
130
  recordReceived(connection: ServiceLivenessConnection, nowMs: number): void {
96
131
  connection.recordReceived(nowMs);
97
132
  }
@@ -127,8 +162,10 @@ export class ServiceLivenessRegistry {
127
162
  }
128
163
 
129
164
  tick(nowMs: number): ServiceLivenessTick {
165
+ if (nowMs < this.nextDeadlineMs()) return NO_LIVENESS_WORK;
130
166
  const probes: ServiceProbe[] = [];
131
167
  const timedOutNodes: string[] = [];
168
+ let nextDueMs = Number.POSITIVE_INFINITY;
132
169
  for (const [nodeRoutingId, peer] of this.peers) {
133
170
  if (peer.isExpired(nowMs)) {
134
171
  timedOutNodes.push(nodeRoutingId);
@@ -138,7 +175,9 @@ export class ServiceLivenessRegistry {
138
175
  const probeId = peer.tryGetProbe(nowMs, this.allocateProbeId);
139
176
  if (probeId !== undefined)
140
177
  probes.push({ nodeRoutingId, connectionId: peer.connectionId, probeId });
178
+ nextDueMs = Math.min(nextDueMs, peer.nextProbeMs, peer.deadlineMs);
141
179
  }
180
+ this.nextDueMs = nextDueMs;
142
181
  timedOutNodes.sort();
143
182
  return { probes, timedOutNodes };
144
183
  }
@@ -1,13 +1,21 @@
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
 
4
5
  export type ServiceMailboxDomain = 'application' | 'infrastructure';
5
6
 
7
+ export interface ServiceMailboxDispatchOwner {
8
+ prepareDispatch(record: ServiceMailboxRecord, signal: AbortSignal): boolean | Promise<boolean>;
9
+ }
10
+
6
11
  export interface ServiceMailboxRecord {
12
+ readonly sourcePreparationOwner?: ServiceMailboxDispatchOwner;
13
+ readonly ingress?: RawServiceIngressRecord;
7
14
  readonly owner: string;
8
15
  readonly domain: ServiceMailboxDomain;
9
16
  parts: readonly Uint8Array[];
10
17
  readonly sourceRoutingId?: string;
18
+ readonly requestSource?: import('../locations/request-source-resolver').ZLinkRequestSourceFence;
11
19
  readonly sourceRoute?: Uint8Array;
12
20
  readonly requestSequence?: bigint;
13
21
  readonly reply?: (parts: readonly Uint8Array[]) => void;
@@ -1,7 +1,4 @@
1
- import { AsyncResource } from 'node:async_hooks';
2
- import { ZLinkStateLane } from '../execution/state-lane';
3
-
4
- const detachedStateLaneResource = new AsyncResource('zlink:service-maintenance-runtime');
1
+ import { startOutsideStateLane, ZLinkStateLane } from '../execution/state-lane';
5
2
 
6
3
  export type ServiceMaintenanceKind = 'retire' | 'shutdown';
7
4
  export type ServiceMaintenanceState =
@@ -248,7 +245,3 @@ export class ServiceMaintenanceRuntime {
248
245
  for (const observer of publication.observers) observer(publication.snapshot);
249
246
  }
250
247
  }
251
-
252
- function startOutsideStateLane<T>(work: () => T): T {
253
- return detachedStateLaneResource.runInAsyncScope(work);
254
- }
@@ -17,6 +17,7 @@ const DEFAULT_RELOCATION_CALLBACK_CONCURRENCY = 8;
17
17
 
18
18
  export interface ServiceRelocationSealedWork {
19
19
  readonly boundSessionState: Uint8Array;
20
+ readonly sessionBinding?: ServiceRelocationParticipant['sessionBinding'];
20
21
  readonly queuedMessages: readonly ServiceRelocationQueuedMessage[];
21
22
  readonly timers: readonly ServiceRelocationTimer[];
22
23
  }
@@ -29,7 +30,7 @@ export interface ServiceRelocationCaptureUnit {
29
30
  readonly authorityOwnerGeneration: bigint;
30
31
  seal(signal?: AbortSignal): Promise<ServiceRelocationSealedWork>;
31
32
  captureApplicationState(signal?: AbortSignal): Promise<Uint8Array>;
32
- commitSeal(): Promise<void> | void;
33
+ commitSeal(followAuthorities: ReadonlyMap<string, ZLinkAuthoritySnapshot>): Promise<void> | void;
33
34
  abortSeal(): Promise<void> | void;
34
35
  /** Expired-owner terminal: pending requests fail once and dispatch stays closed. */
35
36
  discardSeal?(reason: unknown): Promise<void> | void;
@@ -43,12 +44,14 @@ export class ServiceCapturedObjectRelocation {
43
44
  private readonly units: readonly ServiceRelocationCaptureUnit[]
44
45
  ) {}
45
46
 
46
- async commitSource(): Promise<void> {
47
+ async commitSource(
48
+ followAuthorities: ReadonlyMap<string, ZLinkAuthoritySnapshot>
49
+ ): Promise<void> {
47
50
  if (this.terminal === 'committed') return;
48
51
  if (this.terminal !== 'open') {
49
52
  throw new Error(`Relocation source capture was already ${this.terminal}.`);
50
53
  }
51
- for (const unit of this.units) await unit.commitSeal();
54
+ for (const unit of this.units) await unit.commitSeal(followAuthorities);
52
55
  this.terminal = 'committed';
53
56
  }
54
57
 
@@ -57,17 +60,10 @@ export class ServiceCapturedObjectRelocation {
57
60
  if (this.terminal !== 'open') {
58
61
  throw new Error(`A ${this.terminal} relocation source capture cannot be aborted.`);
59
62
  }
60
- const failures: unknown[] = [];
61
- for (const unit of [...this.units].reverse()) {
62
- try {
63
- await unit.abortSeal();
64
- } catch (error) {
65
- failures.push(error);
66
- }
67
- }
68
- this.terminal = 'aborted';
69
- if (failures.length !== 0) {
70
- throw new AggregateError(failures, 'Relocation source rollback was incomplete.');
63
+ try {
64
+ await abortSourceSeals(this.units);
65
+ } finally {
66
+ this.terminal = 'aborted';
71
67
  }
72
68
  }
73
69
 
@@ -166,31 +162,37 @@ export class ServiceRelocationObjectCaptureOwner {
166
162
  ): Promise<ServiceCapturedObjectRelocation> {
167
163
  const captured: Array<{
168
164
  readonly unit: ServiceRelocationCaptureUnit;
169
- readonly work: ServiceRelocationSealedWork;
165
+ work?: ServiceRelocationSealedWork;
170
166
  }> = [];
171
167
  try {
172
168
  for (const unit of units) {
173
169
  signal?.throwIfAborted();
174
- const work = await unit.seal(signal);
175
- captured.push({ unit, work });
170
+ const capture: (typeof captured)[number] = { unit };
171
+ captured.push(capture);
172
+ capture.work = await unit.seal(signal);
176
173
  }
177
174
  const participants = await mapConcurrentOrdered(
178
175
  captured,
179
176
  this.maxConcurrentCallbacks,
180
- async ({ unit, work }) => ({
181
- key: unit.authorityKey,
182
- objectKind: unit.objectKind,
183
- stableType: unit.stableType,
184
- objectGeneration: unit.objectGeneration,
185
- authorityOwnerGeneration: unit.authorityOwnerGeneration,
186
- applicationState: Buffer.from(await unit.captureApplicationState(signal)),
187
- boundSessionState: Buffer.from(work.boundSessionState),
188
- queuedMessages: work.queuedMessages.map((message) => ({
189
- sequence: message.sequence,
190
- payload: Buffer.from(message.payload)
191
- })),
192
- timers: work.timers.map((timer) => ({ ...timer }))
193
- }),
177
+ async ({ unit, work: sealedWork }) => {
178
+ // Application capture starts only after every seal completed.
179
+ const work = sealedWork!;
180
+ return {
181
+ key: unit.authorityKey,
182
+ objectKind: unit.objectKind,
183
+ stableType: unit.stableType,
184
+ objectGeneration: unit.objectGeneration,
185
+ authorityOwnerGeneration: unit.authorityOwnerGeneration,
186
+ applicationState: Buffer.from(await unit.captureApplicationState(signal)),
187
+ boundSessionState: Buffer.from(work.boundSessionState),
188
+ ...(work.sessionBinding === undefined ? {} : { sessionBinding: work.sessionBinding }),
189
+ queuedMessages: work.queuedMessages.map((message) => ({
190
+ sequence: message.sequence,
191
+ payload: Buffer.from(message.payload)
192
+ })),
193
+ timers: work.timers.map((timer) => ({ ...timer }))
194
+ };
195
+ },
194
196
  signal
195
197
  );
196
198
  return new ServiceCapturedObjectRelocation(
@@ -203,12 +205,33 @@ export class ServiceRelocationObjectCaptureOwner {
203
205
  units
204
206
  );
205
207
  } catch (error) {
206
- for (const { unit } of captured.reverse()) await unit.abortSeal();
208
+ try {
209
+ await abortSourceSeals(captured.map(({ unit }) => unit));
210
+ } catch (rollbackError) {
211
+ throw new AggregateError(
212
+ [error, rollbackError],
213
+ 'Relocation capture failed and source rollback was incomplete.'
214
+ );
215
+ }
207
216
  throw error;
208
217
  }
209
218
  }
210
219
  }
211
220
 
221
+ async function abortSourceSeals(units: readonly ServiceRelocationCaptureUnit[]): Promise<void> {
222
+ const failures: unknown[] = [];
223
+ for (const unit of [...units].reverse()) {
224
+ try {
225
+ await unit.abortSeal();
226
+ } catch (error) {
227
+ failures.push(error);
228
+ }
229
+ }
230
+ if (failures.length !== 0) {
231
+ throw new AggregateError(failures, 'Relocation source rollback was incomplete.');
232
+ }
233
+ }
234
+
212
235
  export interface ServiceRelocationHiddenObject {
213
236
  readonly authorityKey: string;
214
237
  }
@@ -232,7 +255,6 @@ export interface ServiceRelocationTargetObjectPort<THidden extends ServiceReloca
232
255
  message: ServiceRelocationQueuedMessage,
233
256
  signal?: AbortSignal
234
257
  ): Promise<void>;
235
- restoreTimer(hidden: THidden, timer: ServiceRelocationTimer, signal?: AbortSignal): Promise<void>;
236
258
  normalize(
237
259
  hidden: THidden,
238
260
  authority: ZLinkAuthoritySnapshot,
@@ -331,9 +353,6 @@ export class ServiceRelocationObjectRestoreOwner<
331
353
  for (const message of participant.queuedMessages) {
332
354
  await this.target.replayQueuedMessage(hidden, message, signal);
333
355
  }
334
- for (const timer of participant.timers) {
335
- await this.target.restoreTimer(hidden, timer, signal);
336
- }
337
356
  }
338
357
  }
339
358
 
@@ -39,6 +39,7 @@ export interface ServiceRelocationParticipant {
39
39
  readonly applicationStatePresent?: boolean;
40
40
  readonly applicationState: Uint8Array;
41
41
  readonly boundSessionState: Uint8Array;
42
+ readonly sessionBinding?: GeneratedRelocationEnvelopeV1['sessionBindings'][number];
42
43
  readonly queuedMessages: readonly ServiceRelocationQueuedMessage[];
43
44
  readonly timers: readonly ServiceRelocationTimer[];
44
45
  }
@@ -726,6 +727,11 @@ export function encodeServiceRelocationEnvelope(
726
727
  'timer due time'
727
728
  )
728
729
  })),
730
+ sessionBindings: participants.flatMap((participant, index) =>
731
+ participant.sessionBinding === undefined
732
+ ? []
733
+ : [{ ...participant.sessionBinding, participantId: BigInt(index + 1) }]
734
+ ),
729
735
  pendingTimerTicks: pending.map((value) => ({
730
736
  participantId: value.participantId,
731
737
  order: value.order,
@@ -765,11 +771,22 @@ export function decodeServiceRelocationEnvelope(
765
771
  const aggregateId = uuid(generated.relocationHigh, generated.relocationLow);
766
772
  if (aggregateId === undefined) throw new TypeError('Invalid relocation identity.');
767
773
  positiveBigInt(aggregateGeneration, 'aggregate generation');
774
+ const bindings = new Map(
775
+ generated.sessionBindings.map((binding) => [binding.participantId, binding])
776
+ );
777
+ for (const id of bindings.keys()) {
778
+ if (id > BigInt(generated.applicationStates.length))
779
+ throw new TypeError('Session binding participant is outside its inventory.');
780
+ }
768
781
  const participants = generated.applicationStates.map((state, index) => {
769
782
  if (state.participantId !== BigInt(index + 1)) {
770
783
  throw new TypeError('Application state participant order is invalid.');
771
784
  }
772
- return wireParticipant(state.participantId, state.hasState, Buffer.from(state.payload));
785
+ const binding = bindings.get(state.participantId);
786
+ return {
787
+ ...wireParticipant(state.participantId, state.hasState, Buffer.from(state.payload)),
788
+ ...(binding === undefined ? {} : { sessionBinding: binding })
789
+ };
773
790
  });
774
791
  const byId = new Map(participants.map((value) => [value.participantId!, value]));
775
792
  for (const work of generated.savedWork) {
@@ -779,12 +796,16 @@ export function decodeServiceRelocationEnvelope(
779
796
  });
780
797
  }
781
798
  for (const timer of generated.timerRegistrations) {
799
+ const dueAtUnixMs = unixMilliseconds(timer.nextScheduledAtUnixMilliseconds);
800
+ const intervalMs = unixMilliseconds(timer.periodMilliseconds);
782
801
  byId.get(timer.participantId)!.timers.push({
783
802
  timerId: timer.name,
784
803
  handlerType: timer.handlerType,
785
- startedAtUnixMs: 0,
786
- dueAtUnixMs: unixMilliseconds(timer.nextScheduledAtUnixMilliseconds),
787
- intervalMs: unixMilliseconds(timer.periodMilliseconds),
804
+ // The wire anchors the nominal schedule by its next due time: the next
805
+ // nominal tick after the completed ScheduledIndex (Spot timer §1).
806
+ startedAtUnixMs: dueAtUnixMs - Number(timer.lastCompletedScheduledIndex + 1n) * intervalMs,
807
+ dueAtUnixMs,
808
+ intervalMs,
788
809
  overrunPolicy: timerPolicyName(timer.overrunPolicy),
789
810
  maxCatchUpTicks: unixMilliseconds(timer.maxCatchUpTicks),
790
811
  stopOnUnhandledException: timer.stopOnUnhandledException,
@@ -243,12 +243,22 @@ export interface ReceiveRequirements {
243
243
  }
244
244
 
245
245
  export interface ZLinkMessageFollowOrigin {
246
+ readonly requestSource?: import('../locations/request-source-resolver').ZLinkRequestSourceFence;
246
247
  readonly sourceNodeRid: RoutingId;
247
248
  readonly originalOperation: MeshOperationId;
248
249
  readonly originalReplyRouteId: bigint;
250
+ /** The canonical target accepted with the original native Actor frame. */
251
+ readonly target?: import('./service-stateful-wire-codec').ServiceActorRouteFence;
249
252
  }
250
253
 
251
254
  export interface ReceiveRecord {
255
+ /** Resolve record prerequisites in owner order, outside an application handler turn. */
256
+ readonly prepareDispatch?: (
257
+ this: ReceiveRecord,
258
+ signal: AbortSignal
259
+ ) => boolean | Promise<boolean>;
260
+ readonly statefulMailboxRecord?: import('./service-mailbox').ServiceMailboxRecord;
261
+ readonly requestSource?: import('../locations/request-source-resolver').ZLinkRequestSourceFence;
252
262
  readonly kind: number;
253
263
  readonly domain: number;
254
264
  readonly sourceNodeRid: RoutingId | null;
@@ -377,7 +387,8 @@ export interface StreamSessionService {
377
387
  retiredSession: ServiceRetiredBoundSessionRouteFence,
378
388
  actor: ServiceActorRef
379
389
  ) => void,
380
- actorAuthority?: StreamSessionActorAuthorityFence
390
+ actorAuthority?: StreamSessionActorAuthorityFence,
391
+ close?: () => Promise<void>
381
392
  ): MeshOperationId;
382
393
  unbindActor(
383
394
  sessionRid: RoutingId,
@@ -422,7 +433,12 @@ export interface ServiceSpot {
422
433
  requestToChannel(
423
434
  channelName: string,
424
435
  parts: MessageLike | readonly MessageLike[],
425
- options?: { flags?: number; timeoutMs?: number; applicationMetadata?: Buffer }
436
+ options?: {
437
+ flags?: number;
438
+ timeoutMs?: number;
439
+ applicationMetadata?: Buffer;
440
+ onAdmitted?: () => void;
441
+ }
426
442
  ): MeshOperationId;
427
443
  sendToSpot(
428
444
  targetNodeRid: unknown,
@@ -445,6 +461,7 @@ export interface ServiceSpot {
445
461
  timeoutMs?: number;
446
462
  applicationMetadata?: Buffer;
447
463
  routeFence?: ServiceDirectSpotRouteFence;
464
+ onAdmitted?: () => void;
448
465
  entrySpot?: boolean;
449
466
  }
450
467
  ): MeshOperationId;
@@ -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
 
5
6
  const ports = new WeakMap<object, ServiceSessionBindingIngressPort>();
@@ -1,4 +1,9 @@
1
- import { ZLINK_MAX_IDENTITY_TEXT_BYTES } from '../../contracts/Common/CoreTypes';
1
+ import {
2
+ ZLINK_MAX_IDENTITY_TEXT_BYTES,
3
+ ZLINK_MAX_ROUTING_ID_BYTES
4
+ } from '../../contracts/Common/CoreTypes';
5
+ import { routingIdsEqual } from '../routing-id';
6
+ import { encodeServiceWireRoutingId } from './service-wire-binary-primitives';
2
7
  import { OperationRegistry, type PendingOperation } from './operation-registry';
3
8
 
4
9
  export type ServiceSpotKind = 'entry' | 'user' | 'instance';
@@ -114,7 +119,6 @@ export class ServiceStatefulRegistry {
114
119
  private readonly reservationAttempts = new Map<string, bigint>();
115
120
  private readonly turns = new Map<string, Promise<void>>();
116
121
  private nextReservationId = 1n;
117
- private nextBindingGeneration = 1n;
118
122
 
119
123
  constructor(
120
124
  readonly nodeRid: string,
@@ -392,47 +396,35 @@ export class ServiceStatefulRegistry {
392
396
  return current;
393
397
  }
394
398
 
395
- bindSession(
396
- actor: ServiceActorRef,
397
- sessionRid: string,
398
- sessionOwnerNodeRid: string,
399
- sessionOwnerNodeGeneration?: bigint,
400
- sessionOwnerId?: string,
401
- sessionOwnerLeaseGeneration?: bigint
402
- ): ServiceSessionBinding {
403
- const current = this.requireActorCore(actor);
404
- requireText(sessionRid, 'sessionRid');
405
- requireText(sessionOwnerNodeRid, 'sessionOwnerNodeRid');
406
- const binding: ServiceSessionBinding = Object.freeze({
407
- actor: Object.freeze({ ...current.ref }),
408
- sessionRid,
409
- sessionOwnerNodeRid,
410
- ...(sessionOwnerNodeGeneration === undefined ? {} : { sessionOwnerNodeGeneration }),
411
- ...(sessionOwnerId === undefined ? {} : { sessionOwnerId }),
412
- ...(sessionOwnerLeaseGeneration === undefined ? {} : { sessionOwnerLeaseGeneration }),
413
- bindingGeneration: this.nextBindingGeneration++,
414
- membershipEpoch: current.membershipEpoch
415
- });
416
- this.bindings.set(actorKey(actor), binding);
417
- return binding;
418
- }
419
-
420
- installSessionBinding(binding: ServiceSessionBinding): void {
399
+ installSessionBinding(binding: ServiceSessionBinding): ServiceSessionBinding {
421
400
  this.requireActorCore(binding.actor);
401
+ encodeServiceWireRoutingId(
402
+ binding.sessionRid,
403
+ 'sessionRid',
404
+ ZLINK_MAX_ROUTING_ID_BYTES,
405
+ (message) => {
406
+ throw new RangeError(message);
407
+ }
408
+ );
409
+ requireText(binding.sessionOwnerNodeRid, 'sessionOwnerNodeRid');
422
410
  requirePositive(binding.bindingGeneration, 'bindingGeneration');
423
411
  const current = this.bindings.get(actorKey(binding.actor));
424
412
  if (
425
413
  current !== undefined &&
426
414
  current.sessionOwnerNodeRid === binding.sessionOwnerNodeRid &&
427
415
  current.sessionOwnerNodeGeneration === binding.sessionOwnerNodeGeneration &&
428
- current.sessionOwnerId === binding.sessionOwnerId &&
429
- current.sessionOwnerLeaseGeneration === binding.sessionOwnerLeaseGeneration &&
430
416
  current.bindingGeneration >= binding.bindingGeneration
431
417
  ) {
418
+ if (
419
+ current.bindingGeneration === binding.bindingGeneration &&
420
+ current.sessionRid === binding.sessionRid
421
+ )
422
+ return current;
432
423
  throw new ServiceStaleGenerationError('binding', binding.actor.actorId);
433
424
  }
434
- this.nextBindingGeneration = max(this.nextBindingGeneration, binding.bindingGeneration + 1n);
435
- this.bindings.set(actorKey(binding.actor), Object.freeze({ ...binding }));
425
+ const accepted = Object.freeze({ ...binding });
426
+ this.bindings.set(actorKey(binding.actor), accepted);
427
+ return accepted;
436
428
  }
437
429
 
438
430
  binding(actor: ServiceActorRef): ServiceSessionBinding | undefined {
@@ -455,7 +447,8 @@ export class ServiceStatefulRegistry {
455
447
  if (binding === undefined) return false;
456
448
  if (
457
449
  binding.bindingGeneration !== expectedBindingGeneration ||
458
- (expectedSessionRid !== undefined && binding.sessionRid !== expectedSessionRid) ||
450
+ (expectedSessionRid !== undefined &&
451
+ !routingIdsEqual(binding.sessionRid, expectedSessionRid)) ||
459
452
  (expectedSessionOwnerNodeRid !== undefined &&
460
453
  binding.sessionOwnerNodeRid !== expectedSessionOwnerNodeRid)
461
454
  ) {
@@ -621,6 +614,8 @@ function createSpotState(
621
614
  }
622
615
  }
623
616
 
617
+ export const RELOCATION_REPLY_RETENTION_MS = 24 * 60 * 60 * 1_000;
618
+
624
619
  export class ServiceTerminalOperationRegistry<T, Context = unknown> {
625
620
  private readonly operations: OperationRegistry<T, Context>;
626
621
 
@@ -636,8 +631,8 @@ export class ServiceTerminalOperationRegistry<T, Context = unknown> {
636
631
  return this.operations.register(timeoutMs, timeoutOwner, context);
637
632
  }
638
633
 
639
- reply(id: bigint, value: T): boolean {
640
- return this.operations.complete(id, value);
634
+ reply(id: bigint, value: T, terminalContextRetentionMs = 0): boolean {
635
+ return this.operations.complete(id, value, terminalContextRetentionMs);
641
636
  }
642
637
 
643
638
  fail(id: bigint, error: unknown): boolean {
@@ -660,6 +655,10 @@ export class ServiceTerminalOperationRegistry<T, Context = unknown> {
660
655
  return this.operations.size;
661
656
  }
662
657
 
658
+ nextDeadlineMs(): number {
659
+ return this.operations.nextDeadlineMs();
660
+ }
661
+
663
662
  expire(nowMs: number, turnDeadlineMs: number): number {
664
663
  return this.operations.expire(nowMs, turnDeadlineMs);
665
664
  }
@@ -667,6 +666,10 @@ export class ServiceTerminalOperationRegistry<T, Context = unknown> {
667
666
  close(): void {
668
667
  this.operations.close('Stateful runtime closed.');
669
668
  }
669
+
670
+ failAll(reason: unknown): void {
671
+ this.operations.failAll(reason);
672
+ }
670
673
  }
671
674
 
672
675
  function actorKey(actor: ServiceActorRef): string {