@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
@@ -146,10 +146,6 @@ class ZLinkLocationRuntimeOwner {
146
146
  }
147
147
  spotNodeRuntime.configureLocationAutoConnect(runtime, stores, this.options.registration.locations.options, this.currentEvents);
148
148
  channelRuntime.configureLocationAutoConnect(runtime, stores, this.options.registration.locations.options, this.currentEvents);
149
- if (runtime.ownerLeaseUsable) {
150
- await spotNodeRuntime.startLocationAutoConnect();
151
- await channelRuntime.startLocationAutoConnect();
152
- }
153
149
  return runtime;
154
150
  }
155
151
  clearForStop() {
@@ -168,7 +164,7 @@ class ZLinkLocationRuntimeOwner {
168
164
  const locations = this.options.registration.locations;
169
165
  if (locations.useInMemoryStores) {
170
166
  const provider = new locations_1.ZLinkInMemoryProviderLocationStore();
171
- const store = new locations_1.ZLinkLocationStoreRepository(provider);
167
+ const store = new locations_1.ZLinkLocationStoreRepository(provider, undefined, this.options.metrics);
172
168
  return {
173
169
  locationStore: store,
174
170
  authorityStore: store,
@@ -183,7 +179,7 @@ class ZLinkLocationRuntimeOwner {
183
179
  }
184
180
  const provider = locations.storeInstance;
185
181
  if (provider !== undefined) {
186
- const store = new locations_1.ZLinkLocationStoreRepository(provider);
182
+ const store = new locations_1.ZLinkLocationStoreRepository(provider, undefined, this.options.metrics);
187
183
  return {
188
184
  locationStore: store,
189
185
  authorityStore: store,
@@ -5,6 +5,10 @@ export declare class MeshRouterResolver {
5
5
  private readonly registration;
6
6
  constructor(registration: ZLinkFrameworkRegistration);
7
7
  canUseRouterChannel(routerChannelId: string): boolean;
8
+ /**
9
+ * Runs on every node-direct send: a direct scan of the registered manual
10
+ * peers, without temporary arrays or a predicate closure per call.
11
+ */
8
12
  classifyManualNodeTarget(meshName: string, targetNodeRid: RoutingId): boolean | undefined;
9
13
  defaultRouterChannelId(): string | undefined;
10
14
  defaultSpotRouterChannelId(): string | undefined;
@@ -11,17 +11,25 @@ class MeshRouterResolver {
11
11
  return (this.registration.routeChannels.has(routerChannelId) ||
12
12
  this.registration.spotNodes.get(routerChannelId)?.router !== undefined);
13
13
  }
14
+ /**
15
+ * Runs on every node-direct send: a direct scan of the registered manual
16
+ * peers, without temporary arrays or a predicate closure per call.
17
+ */
14
18
  classifyManualNodeTarget(meshName, targetNodeRid) {
15
19
  const router = this.registration.spotNodes.get(meshName)?.router;
16
20
  if (router === undefined)
17
21
  return undefined;
18
- const manualConnections = router.manualConnections ?? [];
19
- const manualPeers = router.manualPeerConnections ?? [];
20
- if (manualConnections.length === 0 && manualPeers.length === 0)
22
+ const manualPeers = router.manualPeerConnections;
23
+ if (manualPeers !== undefined) {
24
+ for (const peer of manualPeers) {
25
+ if ((0, routing_id_1.routingIdsEqual)(peer.peerRid, targetNodeRid))
26
+ return true;
27
+ }
28
+ }
29
+ const manualConnectionCount = router.manualConnections?.length ?? 0;
30
+ if (manualConnectionCount === 0 && (manualPeers?.length ?? 0) === 0)
21
31
  return undefined;
22
- if (manualPeers.some((peer) => (0, routing_id_1.routingIdsEqual)(peer.peerRid, targetNodeRid)))
23
- return true;
24
- return manualConnections.length === 0 ? false : undefined;
32
+ return manualConnectionCount === 0 ? false : undefined;
25
33
  }
26
34
  defaultRouterChannelId() {
27
35
  const candidates = [
@@ -25,7 +25,6 @@ export declare class ZLinkRemoteBoundSessionRelay {
25
25
  private readonly options;
26
26
  private readonly actorOwnershipGenerations;
27
27
  private readonly activeServiceWireRelocations;
28
- private readonly terminalServiceWireRelocations;
29
28
  constructor(options: ZLinkRemoteBoundSessionRelayOptions);
30
29
  receiveRoutedBoundSession(actorId: string, message: unknown, packetName: string | undefined, metadata: ReadonlyMap<string, string>, actorRef?: ActorRef, actorPacketTarget?: unknown): Promise<void>;
31
30
  receiveRoutedBoundSessionResponse(actorId: string, packetName: string, requestSeq: bigint, message: unknown, replyOptions: ZLinkActorResponseOptions, actorPacketTarget?: unknown): Promise<void>;
@@ -40,12 +39,11 @@ export declare class ZLinkRemoteBoundSessionRelay {
40
39
  receiveRemoteBoundSessionError(payload: unknown): Promise<{
41
40
  readonly ok: boolean;
42
41
  }>;
43
- receiveServiceWireSessionRelocationSeal(value: ServiceSessionRelocationSeal, signal?: AbortSignal): Promise<ServiceSessionRelocationSealed>;
42
+ receiveServiceWireSessionRelocationSeal(value: ServiceSessionRelocationSeal, signal?: AbortSignal, onInstalled?: () => void): Promise<ServiceSessionRelocationSealed | undefined>;
44
43
  receiveServiceWireSessionRelocationRoute(value: ServiceSessionRelocationRoute): Promise<void>;
45
- clearServiceWireSessionRelocations(): void;
44
+ clearServiceWireSessionRelocations(): Promise<void>;
46
45
  private warnLateSessionRouteUpdate;
47
46
  private applyServiceWireSessionRelocationRoute;
48
- private validateServiceWireSessionRoute;
49
47
  resolveRemoteBoundSessionTarget(sourceNodeRid: RoutingId, sourceSessionRid: RoutingId): ZLinkRemoteBoundSessionTarget | undefined;
50
48
  actorPacketTargetForState(actorId: string): ZLinkRemoteActorPacketTarget | undefined;
51
49
  clearOwnership(actorId: string): void;
@@ -8,14 +8,11 @@ const actor_packet_relay_wire_1 = require("../actors/actor-packet-relay-wire");
8
8
  const routing_id_1 = require("../routing-id");
9
9
  const service_stateful_wire_codec_1 = require("../foundation/service-stateful-wire-codec");
10
10
  const service_wire_m6a_codec_1 = require("../foundation/service-wire-m6a-codec");
11
- const bounded_replay_map_1 = require("./bounded-replay-map");
12
11
  const framework_errors_internal_1 = require("../framework-errors-internal");
13
- const SERVICE_CONTROL_TERMINAL_CAPACITY = 4096;
14
12
  class ZLinkRemoteBoundSessionRelay {
15
13
  options;
16
14
  actorOwnershipGenerations = new Map();
17
15
  activeServiceWireRelocations = new Map();
18
- terminalServiceWireRelocations = new bounded_replay_map_1.BoundedReplayMap(SERVICE_CONTROL_TERMINAL_CAPACITY);
19
16
  constructor(options) {
20
17
  this.options = options;
21
18
  }
@@ -112,77 +109,40 @@ class ZLinkRemoteBoundSessionRelay {
112
109
  .sendLocalBoundSessionError(response.actorId, response.boundPacketName, response.requestSeq, response.error, new Map(Object.entries(response.metadata ?? {})));
113
110
  return { ok: sent };
114
111
  }
115
- async receiveServiceWireSessionRelocationSeal(value, signal) {
112
+ async receiveServiceWireSessionRelocationSeal(value, signal, onInstalled) {
113
+ const runtime = this.options.streamBindingRuntime();
114
+ const owner = (0, actor_session_binding_runtime_owner_1.actorSessionBindingRuntimeOwner)(runtime);
115
+ const sealController = new AbortController();
116
+ const sealSignal = signal === undefined
117
+ ? sealController.signal
118
+ : AbortSignal.any([signal, sealController.signal]);
119
+ const prepared = await owner.prepareSessionRelocationSeal(value, sealSignal);
120
+ if (prepared === undefined)
121
+ return undefined;
122
+ if (prepared.response.sealResult === 'bindingAbsent')
123
+ return prepared.response;
116
124
  const key = serviceWireBarrierKey(value);
117
- const fingerprint = (0, service_stateful_wire_codec_1.encodeSessionRelocationSeal)(value).toString('base64');
118
- const terminal = this.terminalServiceWireRelocations.get(key);
119
- if (terminal !== undefined) {
120
- if (terminal.sealFingerprint !== fingerprint) {
121
- throw new service_wire_m6a_codec_1.ServiceWireProtocolError(`Session relocation '${key}' repeated command 42 with different bytes.`);
122
- }
123
- this.terminalServiceWireRelocations.touch(key);
124
- return terminal.sealed;
125
- }
126
- const active = this.activeServiceWireRelocations.get(key);
127
- if (active !== undefined) {
128
- if (active.sealFingerprint !== fingerprint) {
129
- throw new service_wire_m6a_codec_1.ServiceWireProtocolError(`Session relocation '${key}' repeated command 42 with different bytes.`);
130
- }
131
- return await active.sealPromise;
132
- }
125
+ const existing = this.activeServiceWireRelocations.get(key);
126
+ if (existing !== undefined)
127
+ return await existing.sealPromise;
133
128
  const actorId = value.actor.actor.actorId;
134
- // Register the identity before the first asynchronous owner operation.
135
- // Concurrent identical commands join this promise; different bytes for
136
- // the same identity fail before they can install another seal.
137
- let state;
138
- const sealController = new AbortController();
139
- const sealPromise = Promise.resolve().then(async () => {
140
- await this.validateServiceWireSessionRoute(value);
141
- await (0, actor_session_binding_runtime_owner_1.actorSessionBindingRuntimeOwner)(this.options.streamBindingRuntime()).sealRelocation({
142
- actorId,
143
- actorGeneration: value.actor.actor.generation,
144
- bindingGeneration: value.session.bindingGeneration,
145
- sessionIdentity: value.session.sessionRid,
146
- actorNodeRid: value.actor.actor.nodeRid,
147
- actorNodeGeneration: value.actor.targetNodeGeneration,
148
- sealId: key
149
- }, {
150
- objectGeneration: value.actor.actor.generation,
151
- bindingGeneration: value.session.bindingGeneration
152
- }, sealController.signal);
153
- return {
154
- relocation: value.relocation,
155
- coordinator: value.coordinator,
156
- actor: value.actor,
157
- session: value.session
158
- };
159
- });
160
- state = {
129
+ const state = {
161
130
  actorId,
162
- sealFingerprint: fingerprint,
163
- sealPromise,
164
- sealController
131
+ sealPromise: prepared.ready.then(() => prepared.response)
165
132
  };
166
133
  this.activeServiceWireRelocations.set(key, state);
134
+ onInstalled?.();
167
135
  const expire = async (error) => {
168
- if (state.terminal === true || state.routePromise !== undefined)
136
+ if (state.terminal === true ||
137
+ (await owner.relocationSnapshot(actorId, key))?.phase !== 'sealed')
169
138
  return;
170
139
  state.terminal = true;
171
140
  sealController.abort(error);
172
141
  if (this.activeServiceWireRelocations.get(key) === state) {
173
142
  this.activeServiceWireRelocations.delete(key);
174
143
  }
175
- if (state.sealed !== undefined) {
176
- this.terminalServiceWireRelocations.remember(key, {
177
- actorId,
178
- sealFingerprint: state.sealFingerprint,
179
- sealed: state.sealed
180
- });
181
- }
182
- const owner = (0, actor_session_binding_runtime_owner_1.actorSessionBindingRuntimeOwner)(this.options.streamBindingRuntime());
183
- await owner.clearRelocation(actorId, error);
184
- void this.options
185
- .streamBindingRuntime()
144
+ await owner.clearRelocation(actorId, error, key);
145
+ void runtime
186
146
  .closeSessionBinding(actorId, value.session)
187
147
  .catch((disconnectError) => this.options.reportOwnershipRefreshError?.(actorId, disconnectError));
188
148
  state.sealAbortCleanup?.();
@@ -203,9 +163,7 @@ class ZLinkRemoteBoundSessionRelay {
203
163
  signal.addEventListener('abort', onAbort, { once: true });
204
164
  }
205
165
  try {
206
- const sealed = await sealPromise;
207
- state.sealed = sealed;
208
- return sealed;
166
+ return await state.sealPromise;
209
167
  }
210
168
  catch (error) {
211
169
  clearTimeout(state.sealTimer);
@@ -213,126 +171,69 @@ class ZLinkRemoteBoundSessionRelay {
213
171
  if (this.activeServiceWireRelocations.get(key) === state) {
214
172
  this.activeServiceWireRelocations.delete(key);
215
173
  }
216
- if (state.terminal !== true) {
217
- const owner = (0, actor_session_binding_runtime_owner_1.actorSessionBindingRuntimeOwner)(this.options.streamBindingRuntime());
218
- if ((await owner.relocationSnapshot(actorId, key)) !== undefined) {
219
- await owner.clearRelocation(actorId, error);
220
- void this.options
221
- .streamBindingRuntime()
222
- .closeSessionBinding(actorId, value.session)
223
- .catch((disconnectError) => this.options.reportOwnershipRefreshError?.(actorId, disconnectError));
224
- }
174
+ if (state.terminal !== true && (await owner.relocationSnapshot(actorId, key)) !== undefined) {
175
+ await owner.clearRelocation(actorId, error, key);
176
+ void runtime
177
+ .closeSessionBinding(actorId, value.session)
178
+ .catch((disconnectError) => this.options.reportOwnershipRefreshError?.(actorId, disconnectError));
225
179
  }
226
180
  throw sealController.signal.aborted ? sealController.signal.reason : error;
227
181
  }
228
182
  }
229
183
  async receiveServiceWireSessionRelocationRoute(value) {
230
184
  const key = serviceWireBarrierKey(value);
231
- const routeRequestFingerprint = (0, service_stateful_wire_codec_1.encodeSessionRelocationRoute)(value).toString('base64');
232
- const fingerprint = routeRequestFingerprint;
233
- const terminal = this.terminalServiceWireRelocations.get(key);
234
- if (terminal !== undefined) {
235
- if (terminal.routeFingerprint === undefined) {
236
- // The Session owner already closed this binding at the seal deadline.
237
- // A late command 44 is terminal and cannot reactivate the route.
238
- this.terminalServiceWireRelocations.touch(key);
239
- this.warnLateSessionRouteUpdate(value);
240
- return;
241
- }
242
- if (terminal.routeFingerprint !== fingerprint) {
243
- throw new service_wire_m6a_codec_1.ServiceWireProtocolError(`Session relocation '${key}' repeated command 44 with different bytes.`);
244
- }
245
- this.terminalServiceWireRelocations.touch(key);
246
- this.warnLateSessionRouteUpdate(value);
247
- return;
248
- }
185
+ const runtime = this.options.streamBindingRuntime();
186
+ const owner = (0, actor_session_binding_runtime_owner_1.actorSessionBindingRuntimeOwner)(runtime);
249
187
  const state = this.activeServiceWireRelocations.get(key);
250
- if (state === undefined) {
251
- this.warnLateSessionRouteUpdate(value);
252
- return;
253
- }
254
- if (state.routeRequestFingerprint !== undefined &&
255
- state.routeRequestFingerprint !== routeRequestFingerprint) {
256
- throw new service_wire_m6a_codec_1.ServiceWireProtocolError(`Session relocation '${key}' repeated command 44 with different bytes.`);
257
- }
258
- if (state.routeFingerprint !== undefined) {
259
- if (state.routeFingerprint !== fingerprint || state.routePromise === undefined) {
260
- throw new service_wire_m6a_codec_1.ServiceWireProtocolError(`Session relocation '${key}' repeated command 44 with different bytes.`);
188
+ const accepted = await owner.acceptSessionRelocationRoute(value, async () => {
189
+ if (state === undefined) {
190
+ throw new bound_session_wire_1.ZLinkRemoteBoundSessionFenceError(`Session relocation '${key}' has no active seal.`);
261
191
  }
262
- this.warnLateSessionRouteUpdate(value);
263
- await state.routePromise;
264
- return;
265
- }
266
- state.routeRequestFingerprint = routeRequestFingerprint;
267
- state.routeFingerprint = fingerprint;
268
- if (state.sealTimer !== undefined)
269
- clearTimeout(state.sealTimer);
270
- state.sealAbortCleanup?.();
271
- const routePromise = state.sealPromise.then(async (sealed) => {
272
- validateSessionRelocationRouteAgainstSeal(value, sealed);
273
- await this.applyServiceWireSessionRelocationRoute(key, value);
274
- });
275
- state.routePromise = routePromise;
276
- try {
277
- await routePromise;
278
- this.terminalServiceWireRelocations.remember(key, {
279
- actorId: state.actorId,
280
- sealFingerprint: state.sealFingerprint,
281
- sealed: state.sealed ?? (await state.sealPromise),
282
- routeRequestFingerprint,
283
- routeFingerprint: fingerprint
284
- });
285
- if (this.activeServiceWireRelocations.get(key) === state) {
286
- this.activeServiceWireRelocations.delete(key);
192
+ if (state.sealTimer !== undefined)
193
+ clearTimeout(state.sealTimer);
194
+ state.sealAbortCleanup?.();
195
+ try {
196
+ const sealed = await state.sealPromise;
197
+ validateSessionRelocationRouteAgainstSeal(value, sealed);
198
+ await this.applyServiceWireSessionRelocationRoute(key, value);
287
199
  }
288
- state.terminal = true;
289
- }
290
- catch (error) {
291
- // Command 44 is one-way. Once an exact update wins the timeout race,
292
- // an apply failure cannot be repaired by waiting for an ACK-driven
293
- // retry. Close the physical Session and terminalize this identity so a
294
- // late duplicate cannot reactivate the binding or its held messages.
295
- state.terminal = true;
296
- if (this.activeServiceWireRelocations.get(key) === state) {
297
- this.activeServiceWireRelocations.delete(key);
200
+ catch (error) {
201
+ // The binding owner chose this command. A failed one-way apply closes
202
+ // its physical Session; conflicting duplicates never enter this callback.
203
+ await owner.clearRelocation(state.actorId, error, key);
204
+ await runtime
205
+ .closeSessionBinding(state.actorId, value.session)
206
+ .catch((disconnectError) => this.options.reportOwnershipRefreshError?.(state.actorId, disconnectError));
207
+ throw error;
298
208
  }
299
- const sealed = state.sealed ?? (await state.sealPromise);
300
- this.terminalServiceWireRelocations.remember(key, {
301
- actorId: state.actorId,
302
- sealFingerprint: state.sealFingerprint,
303
- sealed,
304
- routeRequestFingerprint,
305
- routeFingerprint: fingerprint
306
- });
307
- (0, actor_session_binding_runtime_owner_1.actorSessionBindingRuntimeOwner)(this.options.streamBindingRuntime()).clearRelocation(state.actorId, error);
308
- await this.options
309
- .streamBindingRuntime()
310
- .closeSessionBinding(state.actorId, value.session)
311
- .catch((disconnectError) => this.options.reportOwnershipRefreshError?.(state.actorId, disconnectError));
312
- throw error;
313
- }
209
+ finally {
210
+ state.terminal = true;
211
+ if (this.activeServiceWireRelocations.get(key) === state) {
212
+ this.activeServiceWireRelocations.delete(key);
213
+ }
214
+ }
215
+ });
216
+ if (!accepted)
217
+ this.warnLateSessionRouteUpdate(value);
314
218
  }
315
- clearServiceWireSessionRelocations() {
219
+ async clearServiceWireSessionRelocations() {
316
220
  for (const state of this.activeServiceWireRelocations.values()) {
317
221
  if (state.sealTimer !== undefined)
318
222
  clearTimeout(state.sealTimer);
223
+ state.sealAbortCleanup?.();
319
224
  }
320
225
  this.activeServiceWireRelocations.clear();
321
- this.terminalServiceWireRelocations.clear();
226
+ await (0, actor_session_binding_runtime_owner_1.actorSessionBindingRuntimeOwnerIfRegistered)(this.options.streamBindingRuntime())?.clearSessionRelocationResults();
322
227
  }
323
228
  warnLateSessionRouteUpdate(value) {
324
229
  console.warn(`late_session_route_update session=${value.session.sessionRid}`);
325
230
  }
326
231
  async applyServiceWireSessionRelocationRoute(key, value) {
327
232
  const runtime = this.options.streamBindingRuntime();
328
- const owner = (0, actor_session_binding_runtime_owner_1.actorSessionBindingRuntimeOwner)(runtime);
329
- const fingerprint = (0, service_stateful_wire_codec_1.encodeSessionRelocationRoute)(value).toString('base64');
330
233
  if (value.route.action === 'abort') {
331
- await owner.applyRelocation(value.actor.actorId, key, fingerprint, async () => {
332
- if (!(await runtime.abortActorRouteSeal(value.actor.actorId, key))) {
333
- throw new bound_session_wire_1.ZLinkRemoteBoundSessionFenceError(`Actor '${value.actor.actorId}' command 44 abort lost its Session seal.`);
334
- }
335
- });
234
+ if (!(await runtime.abortActorRouteSeal(value.actor.actorId, key))) {
235
+ throw new bound_session_wire_1.ZLinkRemoteBoundSessionFenceError(`Actor '${value.actor.actorId}' command 44 abort lost its Session seal.`);
236
+ }
336
237
  }
337
238
  else {
338
239
  const committedRoute = value.route;
@@ -344,36 +245,20 @@ class ZLinkRemoteBoundSessionRelay {
344
245
  actorId: value.actor.actorId,
345
246
  objectGeneration: value.actor.generation,
346
247
  meshName: current.meshName,
347
- nodeRid: (0, routing_id_1.decodeRoutingId)(committedRoute.targetNodeRid, undefined),
248
+ nodeRid: committedRoute.targetNodeRid,
348
249
  bindingGeneration: value.session.bindingGeneration,
349
250
  ownershipGeneration: committedRoute.targetAuthorityOwnerGeneration,
350
251
  ownerNodeGeneration: committedRoute.targetNodeGeneration,
351
252
  ownerLeaseGeneration: committedRoute.targetOwnerLeaseGeneration
352
253
  };
353
- await owner.applyRelocation(value.actor.actorId, key, fingerprint, async () => {
354
- await runtime.commitActorRoute(targetActorRef, undefined, {
355
- confirmRemoteSessionBinding: 'send',
356
- releaseSeal: { sealId: key }
357
- });
358
- const currentGeneration = this.actorOwnershipGenerations.get(value.actor.actorId);
359
- if (currentGeneration === undefined ||
360
- currentGeneration < committedRoute.targetAuthorityOwnerGeneration) {
361
- this.actorOwnershipGenerations.set(value.actor.actorId, committedRoute.targetAuthorityOwnerGeneration);
362
- }
254
+ await runtime.commitActorRoute(targetActorRef, undefined, {
255
+ releaseSeal: { sealId: key }
363
256
  });
364
- }
365
- await owner.observeRelocationTerminal(value.actor.actorId, key, fingerprint);
366
- }
367
- async validateServiceWireSessionRoute(value) {
368
- const current = await this.options
369
- .streamBindingRuntime()
370
- .sessionRouteFence(value.actor.actor.actorId);
371
- if (current === undefined ||
372
- current.actor.objectGeneration !== value.actor.actor.generation ||
373
- !(0, routing_id_1.routingIdsEqual)(current.actor.nodeRid, value.actor.actor.nodeRid) ||
374
- current.sessionRid.toString() !== value.session.sessionRid ||
375
- current.bindingGeneration !== value.session.bindingGeneration) {
376
- throw new bound_session_wire_1.ZLinkRemoteBoundSessionFenceError(`Actor '${value.actor.actor.actorId}' command 42 was fenced by its exact Session route.`);
257
+ const currentGeneration = this.actorOwnershipGenerations.get(value.actor.actorId);
258
+ if (currentGeneration === undefined ||
259
+ currentGeneration < committedRoute.targetAuthorityOwnerGeneration) {
260
+ this.actorOwnershipGenerations.set(value.actor.actorId, committedRoute.targetAuthorityOwnerGeneration);
261
+ }
377
262
  }
378
263
  }
379
264
  resolveRemoteBoundSessionTarget(sourceNodeRid, sourceSessionRid) {
@@ -405,10 +290,6 @@ class ZLinkRemoteBoundSessionRelay {
405
290
  this.activeServiceWireRelocations.delete(key);
406
291
  }
407
292
  }
408
- for (const [key, value] of this.terminalServiceWireRelocations) {
409
- if (value.actorId === actorId)
410
- this.terminalServiceWireRelocations.delete(key);
411
- }
412
293
  }
413
294
  async sendActorResponse(actor, packetName, requestSeq, response, replyOptions, fallbackBoundSessionTarget, fallbackActorRef, signal) {
414
295
  const state = this.options.actorManager()?.getState(actor.context.actorId);
@@ -520,33 +401,17 @@ function serviceWireBarrierKey(value) {
520
401
  return (0, service_stateful_wire_codec_1.serviceSessionRelocationIdentityKey)(value);
521
402
  }
522
403
  function validateSessionRelocationRouteAgainstSeal(route, sealed) {
523
- const sameCoordinator = route.coordinator.ownerId === sealed.coordinator.ownerId &&
524
- route.coordinator.leaseGeneration === sealed.coordinator.leaseGeneration &&
525
- route.coordinator.nodeRid === sealed.coordinator.nodeRid &&
526
- route.coordinator.nodeGeneration === sealed.coordinator.nodeGeneration &&
527
- route.coordinator.expectedAuthorityStoreVersion ===
528
- sealed.coordinator.expectedAuthorityStoreVersion;
529
- const sameSession = route.session.sessionOwnerNodeRid === sealed.session.sessionOwnerNodeRid &&
404
+ const sameSession = (0, routing_id_1.routingIdsEqual)(route.session.sessionOwnerNodeRid, sealed.session.sessionOwnerNodeRid) &&
530
405
  route.session.sessionOwnerNodeGeneration === sealed.session.sessionOwnerNodeGeneration &&
531
406
  route.session.sessionOwnerId === sealed.session.sessionOwnerId &&
532
407
  route.session.sessionOwnerLeaseGeneration === sealed.session.sessionOwnerLeaseGeneration &&
533
- route.session.sessionRid === sealed.session.sessionRid &&
408
+ (0, routing_id_1.routingIdsEqual)(route.session.sessionRid, sealed.session.sessionRid) &&
534
409
  route.session.bindingGeneration === sealed.session.bindingGeneration;
535
410
  if (route.relocation.high !== sealed.relocation.high ||
536
411
  route.relocation.low !== sealed.relocation.low ||
537
- !sameCoordinator ||
538
412
  !sameSession ||
539
413
  route.actor.actorId !== sealed.actor.actor.actorId ||
540
414
  route.actor.generation !== sealed.actor.actor.generation) {
541
415
  throw new service_wire_m6a_codec_1.ServiceWireProtocolError(`Session relocation '${serviceWireBarrierKey(route)}' changed its command 42 fence.`);
542
416
  }
543
- if (route.route.action === 'commit') {
544
- if (route.route.previousAuthorityOwnerGeneration !== sealed.actor.authorityOwnerGeneration) {
545
- throw new service_wire_m6a_codec_1.ServiceWireProtocolError(`Session relocation '${serviceWireBarrierKey(route)}' changed its source authority fence.`);
546
- }
547
- return;
548
- }
549
- if (route.route.currentAuthorityOwnerGeneration !== sealed.actor.authorityOwnerGeneration) {
550
- throw new service_wire_m6a_codec_1.ServiceWireProtocolError(`Session relocation '${serviceWireBarrierKey(route)}' abort changed its authority fence.`);
551
- }
552
417
  }
@@ -3,7 +3,7 @@ import type { ZLinkActivationAdmission } from '../activation-admission';
3
3
  import type { ZLinkRuntimeAdmissionGate } from '../admission';
4
4
  import type { ZLinkBackendMeshNode } from '../backend';
5
5
  import type { ZLinkSpotNodeOptions } from '../configuration';
6
- type ZLinkDrainForceReason = 'deadline_exceeded' | 'drain_state_publish_failed' | 'owner_cleanup_failed' | 'teardown_failed';
6
+ export type ZLinkDrainForceReason = 'deadline_exceeded' | 'drain_state_publish_failed' | 'owner_cleanup_failed' | 'teardown_failed';
7
7
  type ZLinkMeshDrainResult = {
8
8
  readonly kind: 'drained';
9
9
  } | {
@@ -28,7 +28,7 @@ export interface ZLinkRouteMeshRuntimeCoordinatorOptions {
28
28
  readonly drainResources: (meshName: string, signal: AbortSignal, stopStartingSignal?: AbortSignal) => Promise<void>;
29
29
  readonly shutdownResources?: (meshName: string, signal: AbortSignal) => Promise<void>;
30
30
  readonly cleanupHostResources: (signal: AbortSignal) => Promise<void>;
31
- readonly forceStopResources: (meshName: string) => Promise<void>;
31
+ readonly forceStopResources: (meshName: string, reason: ZLinkDrainForceReason, signal: AbortSignal) => Promise<void>;
32
32
  }
33
33
  export interface ZLinkLocalPlacementCounts {
34
34
  readonly activeActorCount: number;
@@ -312,7 +312,9 @@ class ZLinkRouteMeshRuntimeCoordinator {
312
312
  : deadline.signal.aborted
313
313
  ? 'deadline_exceeded'
314
314
  : classified;
315
- await this.options.forceStopResources(meshName).catch(() => undefined);
315
+ await this.options
316
+ .forceStopResources(meshName, reason, deadline.signal)
317
+ .catch(() => undefined);
316
318
  result = { kind: 'forceStopped', reason };
317
319
  this.transition(meshName, state, contracts_1.ZLinkTopologyState.Failed);
318
320
  }
@@ -362,7 +364,7 @@ class ZLinkRouteMeshRuntimeCoordinator {
362
364
  : deadline.signal.aborted
363
365
  ? 'deadline_exceeded'
364
366
  : classified;
365
- await Promise.all(entries.map(([meshName]) => this.options.forceStopResources(meshName).catch(() => undefined)));
367
+ await Promise.all(entries.map(([meshName]) => this.options.forceStopResources(meshName, reason, deadline.signal).catch(() => undefined)));
366
368
  result = { kind: 'forceStopped', reason };
367
369
  for (const [meshName, state] of entries) {
368
370
  this.transition(meshName, state, contracts_1.ZLinkTopologyState.Failed);
@@ -408,8 +410,8 @@ class ZLinkRouteMeshRuntimeCoordinator {
408
410
  : signal.aborted
409
411
  ? 'deadline_exceeded'
410
412
  : classified;
411
- await Promise.all(entries.map(([meshName]) => this.options.forceStopResources(meshName).catch(() => undefined)));
412
- result = { kind: 'forceStopped', reason };
413
+ await Promise.all(entries.map(([meshName]) => this.options.forceStopResources(meshName, reason, signal).catch(() => undefined)));
414
+ result = { kind: 'forceStopped', reason, error };
413
415
  for (const [meshName, state] of entries) {
414
416
  this.transition(meshName, state, contracts_1.ZLinkTopologyState.Failed);
415
417
  }
@@ -26,6 +26,7 @@ export interface ZLinkRuntimeStopParts {
26
26
  readonly spotNodeRuntime?: ZLinkSpotNodeRuntimeManager;
27
27
  readonly channelRuntime?: ZLinkChannelRuntimeManager;
28
28
  readonly serviceRelocation?: {
29
+ drainActorJoinSources?(): Promise<void>;
29
30
  dispose(): Promise<void>;
30
31
  };
31
32
  readonly ownedStores?: readonly ZLinkRuntimeOwnedStore[];
@@ -20,10 +20,11 @@ async function rollbackRuntimeStart(parts) {
20
20
  async function stopRuntimeParts(parts) {
21
21
  const state = parts.state;
22
22
  const errors = [];
23
+ await runShutdownStep(errors, () => (0, abort_1.awaitWithAbort)(Promise.resolve(parts.serviceRelocation?.drainActorJoinSources?.()), parts.shutdownSignal));
23
24
  await runShutdownStep(errors, () => parts.streamRuntime?.dispose());
24
- await runShutdownStep(errors, () => parts.spotNodeRuntime?.dispose(undefined, parts.cleanupDeadline));
25
+ await runShutdownStep(errors, () => parts.spotNodeRuntime?.dispose(parts.shutdownSignal, parts.cleanupDeadline));
25
26
  await runShutdownStep(errors, () => parts.channelRuntime?.dispose());
26
- await runShutdownStep(errors, () => parts.serviceRelocation?.dispose());
27
+ await runShutdownStep(errors, () => (0, abort_1.awaitWithAbort)(Promise.resolve(parts.serviceRelocation?.dispose()), parts.shutdownSignal));
27
28
  await runShutdownStep(errors, () => parts.locationSnapshot.lifecycle?.dispose());
28
29
  await runShutdownStep(errors, () => parts.locationSnapshot.runtime?.stop(parts.shutdownSignal));
29
30
  await Promise.allSettled(state.listenerTasks);
@@ -3,5 +3,6 @@ export type ZLinkServiceRelocationControlRequest = ServiceMaintenanceRelocationC
3
3
  export type ZLinkServiceRelocationControlResponse = ServiceMaintenanceRelocationControl;
4
4
  export declare function encodeServiceRelocationControlRequest(request: ZLinkServiceRelocationControlRequest): Buffer;
5
5
  export declare function decodeServiceRelocationControlRequest(payload: Uint8Array): ZLinkServiceRelocationControlRequest | undefined;
6
+ export declare function serviceRelocationControlCommand(payload: Uint8Array): number | undefined;
6
7
  export declare function encodeServiceRelocationControlResponse(response: ZLinkServiceRelocationControlResponse): Buffer;
7
8
  export declare function decodeServiceRelocationControlResponse(payload: Uint8Array): ZLinkServiceRelocationControlResponse;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.encodeServiceRelocationControlRequest = encodeServiceRelocationControlRequest;
4
4
  exports.decodeServiceRelocationControlRequest = decodeServiceRelocationControlRequest;
5
+ exports.serviceRelocationControlCommand = serviceRelocationControlCommand;
5
6
  exports.encodeServiceRelocationControlResponse = encodeServiceRelocationControlResponse;
6
7
  exports.decodeServiceRelocationControlResponse = decodeServiceRelocationControlResponse;
7
8
  const service_wire_binary_primitives_1 = require("../foundation/service-wire-binary-primitives");
@@ -14,13 +15,18 @@ function decodeServiceRelocationControlRequest(payload) {
14
15
  const bytes = Buffer.isBuffer(payload)
15
16
  ? payload
16
17
  : Buffer.from(payload.buffer, payload.byteOffset, payload.byteLength);
17
- if (bytes.byteLength < service_wire_binary_primitives_1.SERVICE_WIRE_PREFIX_SIZE ||
18
- bytes[0] !== service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[0] ||
19
- bytes[1] !== service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[1] ||
20
- bytes[service_wire_binary_primitives_1.SERVICE_WIRE_MAJOR_OFFSET] !== service_wire_constants_generated_1.SERVICE_WIRE_MAJOR)
18
+ if (serviceRelocationControlCommand(bytes) === undefined)
21
19
  return undefined;
22
20
  return (0, service_stateful_wire_codec_1.decodeMaintenanceRelocationControl)(bytes);
23
21
  }
22
+ function serviceRelocationControlCommand(payload) {
23
+ if (payload.byteLength < service_wire_binary_primitives_1.SERVICE_WIRE_PREFIX_SIZE ||
24
+ payload[0] !== service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[0] ||
25
+ payload[1] !== service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[1] ||
26
+ payload[service_wire_binary_primitives_1.SERVICE_WIRE_MAJOR_OFFSET] !== service_wire_constants_generated_1.SERVICE_WIRE_MAJOR)
27
+ return undefined;
28
+ return payload[service_wire_binary_primitives_1.SERVICE_WIRE_COMMAND_OFFSET];
29
+ }
24
30
  function encodeServiceRelocationControlResponse(response) {
25
31
  return (0, service_stateful_wire_codec_1.encodeMaintenanceRelocationControl)(response);
26
32
  }