@zlink-systems/framework 0.30.3 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Actors/ZLinkActor.d.ts +2 -0
  3. package/dist/contracts/Actors/ZLinkSessionBindingIdentity.d.ts +6 -0
  4. package/dist/contracts/Actors/ZLinkSessionBindingIdentity.js +2 -0
  5. package/dist/contracts/Actors/index.d.ts +1 -0
  6. package/dist/contracts/Actors/index.js +1 -0
  7. package/dist/contracts/Common/CoreTypes.d.ts +1 -0
  8. package/dist/contracts/Common/HandlerMessageType.d.ts +8 -0
  9. package/dist/contracts/Common/HandlerMessageType.js +41 -0
  10. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +1 -1
  11. package/dist/contracts/Common/ZLinkEncodedPayload.js +12 -20
  12. package/dist/contracts/Common/ZLinkMessage.js +11 -7
  13. package/dist/contracts/Common/encoded-payload-storage.d.ts +0 -2
  14. package/dist/contracts/Common/encoded-payload-storage.js +4 -16
  15. package/dist/contracts/Common/index.d.ts +1 -1
  16. package/dist/contracts/Common/payload-slab.d.ts +4 -0
  17. package/dist/contracts/Common/payload-slab.js +30 -0
  18. package/dist/contracts/Configuration/RegistrationBuilders.js +15 -9
  19. package/dist/contracts/Configuration/RegistrationTypes.d.ts +19 -0
  20. package/dist/contracts/Handlers/Contexts.d.ts +1 -0
  21. package/dist/contracts/Locations/Authority.d.ts +2 -0
  22. package/dist/internal.d.ts +9 -0
  23. package/dist/internal.js +23 -1
  24. package/dist/nest-integration.d.ts +1 -0
  25. package/dist/nest-integration.js +3 -1
  26. package/dist/runtime/actors/actor-client.d.ts +6 -2
  27. package/dist/runtime/actors/actor-client.js +120 -82
  28. package/dist/runtime/actors/actor-context.js +16 -5
  29. package/dist/runtime/actors/actor-execution-context.js +2 -2
  30. package/dist/runtime/actors/actor-handoff.d.ts +12 -1
  31. package/dist/runtime/actors/actor-handoff.js +79 -34
  32. package/dist/runtime/actors/actor-join-deferred-scope.js +6 -6
  33. package/dist/runtime/actors/actor-local-native-join.d.ts +2 -2
  34. package/dist/runtime/actors/actor-local-native-join.js +19 -17
  35. package/dist/runtime/actors/actor-mailbox.d.ts +1 -1
  36. package/dist/runtime/actors/actor-remote-joiner.d.ts +2 -2
  37. package/dist/runtime/actors/actor-remote-joiner.js +4 -4
  38. package/dist/runtime/actors/actor-routed-join-transport.d.ts +9 -3
  39. package/dist/runtime/actors/actor-routed-json-request.d.ts +3 -0
  40. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -2
  41. package/dist/runtime/actors/actor-runtime-state.d.ts +1 -1
  42. package/dist/runtime/actors/spot-actor-dispatch.d.ts +9 -5
  43. package/dist/runtime/actors/spot-actor-dispatch.js +60 -38
  44. package/dist/runtime/admission.d.ts +6 -4
  45. package/dist/runtime/admission.js +21 -10
  46. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +1 -0
  47. package/dist/runtime/application-jobs/application-ingress-record-owner.js +3 -0
  48. package/dist/runtime/backend/contracts/index.d.ts +26 -10
  49. package/dist/runtime/backend/mesh-completion-table.d.ts +7 -1
  50. package/dist/runtime/backend/mesh-completion-table.js +84 -20
  51. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +19 -6
  52. package/dist/runtime/backend/mesh-dispatch-pump.js +246 -147
  53. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +3 -2
  54. package/dist/runtime/backend/node/node-backend-adapter-support.js +27 -19
  55. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +5 -2
  56. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +70 -13
  57. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
  58. package/dist/runtime/backend/node/node-event-loop-poller.js +4 -3
  59. package/dist/runtime/backend/node/node-mesh-backend-adapter.js +5 -1
  60. package/dist/runtime/backend/node/node-raw-binding-port.d.ts +7 -2
  61. package/dist/runtime/backend/node/node-raw-binding-port.js +99 -63
  62. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +34 -16
  63. package/dist/runtime/backend/node/node-raw-mesh-backend.js +210 -106
  64. package/dist/runtime/backend/node/node-socket-backend-adapter.js +20 -6
  65. package/dist/runtime/backend/raw-binding-port.d.ts +6 -3
  66. package/dist/runtime/channels/channel-clients.js +3 -3
  67. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +11 -7
  68. package/dist/runtime/channels/channel-dispatch-pipeline.js +40 -22
  69. package/dist/runtime/channels/channel-dispatch-services.d.ts +3 -1
  70. package/dist/runtime/channels/channel-dispatch-services.js +7 -6
  71. package/dist/runtime/channels/channel-dispatchers.d.ts +13 -6
  72. package/dist/runtime/channels/channel-dispatchers.js +57 -36
  73. package/dist/runtime/channels/channel-envelope.d.ts +2 -2
  74. package/dist/runtime/channels/channel-envelope.js +609 -83
  75. package/dist/runtime/channels/channel-multipart.d.ts +1 -0
  76. package/dist/runtime/channels/channel-multipart.js +10 -6
  77. package/dist/runtime/channels/channel-outbound-operations.d.ts +6 -9
  78. package/dist/runtime/channels/channel-outbound-operations.js +107 -105
  79. package/dist/runtime/channels/channel-receive-loops.d.ts +9 -7
  80. package/dist/runtime/channels/channel-receive-loops.js +126 -90
  81. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +23 -6
  82. package/dist/runtime/channels/channel-runtime-lifecycle.js +47 -38
  83. package/dist/runtime/channels/channel-runtime-manager.d.ts +13 -6
  84. package/dist/runtime/channels/channel-runtime-manager.js +32 -14
  85. package/dist/runtime/channels/channel-socket-registry.d.ts +28 -4
  86. package/dist/runtime/channels/channel-socket-registry.js +9 -1
  87. package/dist/runtime/channels/channel-transports.d.ts +23 -16
  88. package/dist/runtime/channels/channel-transports.js +139 -119
  89. package/dist/runtime/channels/dispatch-error-reporter.d.ts +4 -4
  90. package/dist/runtime/channels/dispatch-error-reporter.js +5 -5
  91. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  92. package/dist/runtime/channels/local-spot-route-transport.d.ts +5 -2
  93. package/dist/runtime/channels/local-spot-route-transport.js +15 -18
  94. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +6 -3
  95. package/dist/runtime/channels/router-socket-spot-route-transport.js +33 -19
  96. package/dist/runtime/channels/source-spot-router.d.ts +6 -3
  97. package/dist/runtime/channels/source-spot-router.js +34 -23
  98. package/dist/runtime/channels/spot-node-route-transport.d.ts +6 -3
  99. package/dist/runtime/channels/spot-node-route-transport.js +23 -17
  100. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +6 -3
  101. package/dist/runtime/channels/spot-route-bridge-transport.js +38 -24
  102. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +8 -4
  103. package/dist/runtime/channels/spot-route-dispatch-strategy.js +36 -23
  104. package/dist/runtime/diagnostics/dispatch-error-details.js +9 -3
  105. package/dist/runtime/diagnostics/message-flow-bootstrap.d.ts +1 -0
  106. package/dist/runtime/diagnostics/message-flow-bootstrap.js +8 -0
  107. package/dist/runtime/diagnostics/message-flow-delivery.d.ts +47 -0
  108. package/dist/runtime/diagnostics/message-flow-delivery.js +149 -0
  109. package/dist/runtime/diagnostics/message-flow-record.d.ts +50 -0
  110. package/dist/runtime/diagnostics/message-flow-record.js +228 -0
  111. package/dist/runtime/diagnostics/message-flow-worker.d.ts +1 -0
  112. package/dist/runtime/diagnostics/message-flow-worker.js +118 -0
  113. package/dist/runtime/diagnostics/message-flow.d.ts +7 -19
  114. package/dist/runtime/diagnostics/message-flow.js +42 -290
  115. package/dist/runtime/diagnostics/runtime-metrics.d.ts +4 -3
  116. package/dist/runtime/diagnostics/runtime-metrics.js +8 -4
  117. package/dist/runtime/execution/index.d.ts +1 -0
  118. package/dist/runtime/execution/index.js +6 -3
  119. package/dist/runtime/execution/serial-execution-queue.d.ts +26 -13
  120. package/dist/runtime/execution/serial-execution-queue.js +75 -71
  121. package/dist/runtime/foundation/durable-service-request.d.ts +12 -3
  122. package/dist/runtime/foundation/durable-service-request.js +158 -73
  123. package/dist/runtime/foundation/operation-registry.d.ts +33 -3
  124. package/dist/runtime/foundation/operation-registry.js +272 -33
  125. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +62 -23
  126. package/dist/runtime/foundation/raw-service-mesh-runtime.js +373 -194
  127. package/dist/runtime/foundation/request-runtime.d.ts +17 -0
  128. package/dist/runtime/foundation/request-runtime.js +163 -0
  129. package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
  130. package/dist/runtime/foundation/service-discovery-registry.js +6 -0
  131. package/dist/runtime/foundation/service-liveness-registry.d.ts +1 -1
  132. package/dist/runtime/foundation/service-mailbox.d.ts +4 -2
  133. package/dist/runtime/foundation/service-mailbox.js +4 -1
  134. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -2
  135. package/dist/runtime/foundation/service-relocation-object-owner.js +12 -5
  136. package/dist/runtime/foundation/service-runtime-contracts.d.ts +7 -2
  137. package/dist/runtime/foundation/service-stateful-registry.d.ts +6 -2
  138. package/dist/runtime/foundation/service-stateful-registry.js +38 -17
  139. package/dist/runtime/foundation/service-stateful-runtime.d.ts +91 -26
  140. package/dist/runtime/foundation/service-stateful-runtime.js +245 -120
  141. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -0
  142. package/dist/runtime/foundation/service-stateful-wire-codec.js +15 -0
  143. package/dist/runtime/foundation/service-topology-registry.d.ts +2 -0
  144. package/dist/runtime/foundation/service-topology-registry.js +13 -3
  145. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  146. package/dist/runtime/foundation/service-wire-constants.generated.js +12 -0
  147. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +5 -1
  148. package/dist/runtime/foundation/service-wire-m6a-codec.js +50 -15
  149. package/dist/runtime/host/actor-packet-relay.d.ts +5 -6
  150. package/dist/runtime/host/actor-packet-relay.js +58 -57
  151. package/dist/runtime/host/actor-placement-coordinator.d.ts +1 -1
  152. package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
  153. package/dist/runtime/host/actor-runtime-options-factory.js +3 -2
  154. package/dist/runtime/host/actor-transfer-runtime.d.ts +3 -3
  155. package/dist/runtime/host/application-job-queue.d.ts +7 -5
  156. package/dist/runtime/host/application-job-queue.js +33 -21
  157. package/dist/runtime/host/bound-session-relay.js +0 -1
  158. package/dist/runtime/host/channel-runtime-options-factory.d.ts +2 -0
  159. package/dist/runtime/host/channel-runtime-options-factory.js +1 -0
  160. package/dist/runtime/host/entry-actor-runtime.d.ts +5 -2
  161. package/dist/runtime/host/entry-actor-runtime.js +2 -2
  162. package/dist/runtime/host/index.d.ts +106 -37
  163. package/dist/runtime/host/index.js +303 -151
  164. package/dist/runtime/host/location-runtime-owner.d.ts +2 -2
  165. package/dist/runtime/host/location-runtime-owner.js +1 -1
  166. package/dist/runtime/host/service-relocation-host-runtime.d.ts +195 -45
  167. package/dist/runtime/host/service-relocation-host-runtime.js +257 -144
  168. package/dist/runtime/host/spot-address-transport.d.ts +3 -0
  169. package/dist/runtime/host/spot-address-transport.js +73 -76
  170. package/dist/runtime/host/spot-runtime-options-factory.js +2 -0
  171. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -1
  172. package/dist/runtime/host/user-spot-creation-coordinator.js +49 -21
  173. package/dist/runtime/internal-observation.d.ts +1 -0
  174. package/dist/runtime/internal-observation.js +5 -0
  175. package/dist/runtime/locations/actor-location-claims.d.ts +1 -1
  176. package/dist/runtime/locations/actor-location-claims.js +15 -6
  177. package/dist/runtime/locations/auto-connect-loop.d.ts +0 -1
  178. package/dist/runtime/locations/auto-connect-loop.js +25 -19
  179. package/dist/runtime/locations/auto-connect-planner.js +2 -5
  180. package/dist/runtime/locations/auto-connect-reconciler.d.ts +1 -0
  181. package/dist/runtime/locations/auto-connect-reconciler.js +35 -23
  182. package/dist/runtime/locations/in-memory-authority-store.d.ts +1 -0
  183. package/dist/runtime/locations/in-memory-authority-store.js +15 -5
  184. package/dist/runtime/locations/in-memory-location-store.d.ts +0 -2
  185. package/dist/runtime/locations/in-memory-location-store.js +1 -38
  186. package/dist/runtime/locations/lifecycle.d.ts +1 -1
  187. package/dist/runtime/locations/lifecycle.js +2 -2
  188. package/dist/runtime/locations/location-store-repository.d.ts +0 -1
  189. package/dist/runtime/locations/location-store-repository.js +163 -246
  190. package/dist/runtime/locations/resolvers.d.ts +8 -1
  191. package/dist/runtime/locations/resolvers.js +16 -2
  192. package/dist/runtime/locations/runtime.d.ts +3 -3
  193. package/dist/runtime/locations/runtime.js +12 -16
  194. package/dist/runtime/messaging/creation-payload-codec.js +8 -7
  195. package/dist/runtime/messaging/framework-json-v1.d.ts +1 -1
  196. package/dist/runtime/messaging/framework-json-v1.js +6 -2
  197. package/dist/runtime/messaging/payload-codec.js +21 -35
  198. package/dist/runtime/messaging/request-deadline.d.ts +4 -2
  199. package/dist/runtime/messaging/request-deadline.js +40 -25
  200. package/dist/runtime/messaging/request-result.d.ts +14 -1
  201. package/dist/runtime/messaging/request-result.js +74 -13
  202. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +4 -0
  203. package/dist/runtime/protocol/service_wire_codec.generated.js +17 -7
  204. package/dist/runtime/spots/index.d.ts +28 -7
  205. package/dist/runtime/spots/index.js +31 -6
  206. package/dist/runtime/spots/spot-activation-registry.d.ts +3 -2
  207. package/dist/runtime/spots/spot-activation-registry.js +13 -8
  208. package/dist/runtime/spots/spot-activation-state.d.ts +2 -0
  209. package/dist/runtime/spots/spot-activation-state.js +1 -0
  210. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +9 -4
  211. package/dist/runtime/spots/spot-actor-admission-coordinator.js +33 -12
  212. package/dist/runtime/spots/spot-actor-ingress-admission.d.ts +40 -0
  213. package/dist/runtime/spots/spot-actor-ingress-admission.js +78 -0
  214. package/dist/runtime/spots/spot-actor-membership.js +3 -3
  215. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +16 -43
  216. package/dist/runtime/spots/spot-actor-packet-dispatch.js +56 -113
  217. package/dist/runtime/spots/spot-actor-packet-drain.d.ts +1 -0
  218. package/dist/runtime/spots/spot-actor-packet-drain.js +12 -5
  219. package/dist/runtime/spots/spot-entry-activation.d.ts +4 -3
  220. package/dist/runtime/spots/spot-entry-activation.js +7 -12
  221. package/dist/runtime/spots/spot-handler-registry.d.ts +5 -1
  222. package/dist/runtime/spots/spot-handler-registry.js +31 -15
  223. package/dist/runtime/spots/spot-manager-public.js +3 -2
  224. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +11 -6
  225. package/dist/runtime/spots/spot-node-runtime-manager.js +6 -1
  226. package/dist/runtime/spots/spot-outbound.d.ts +8 -2
  227. package/dist/runtime/spots/spot-outbound.js +5 -5
  228. package/dist/runtime/spots/spot-route-packet-dispatch.js +13 -8
  229. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +3 -3
  230. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +9 -5
  231. package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -2
  232. package/dist/runtime/spots/spot-serial-executor.d.ts +2 -1
  233. package/dist/runtime/spots/spot-serial-turn-executor.js +20 -26
  234. package/dist/runtime/spots/spot-subscription-dispatch.js +5 -2
  235. package/dist/runtime/spots/spot-timer.d.ts +1 -1
  236. package/dist/runtime/streams/actor-session-binding-registry.d.ts +11 -3
  237. package/dist/runtime/streams/actor-session-binding-registry.js +28 -0
  238. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -2
  239. package/dist/runtime/streams/bound-actor-relay-sender.js +3 -4
  240. package/dist/runtime/streams/bound-session-service.js +6 -7
  241. package/dist/runtime/streams/index.d.ts +3 -3
  242. package/dist/runtime/streams/index.js +22 -2
  243. package/dist/runtime/streams/managed-stream.js +2 -1
  244. package/dist/runtime/streams/session-calls.d.ts +1 -1
  245. package/dist/runtime/streams/session-calls.js +3 -9
  246. package/dist/runtime/streams/session-context.d.ts +2 -2
  247. package/dist/runtime/streams/session-context.js +2 -2
  248. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -0
  249. package/dist/runtime/streams/stream-session-runtime.js +64 -33
  250. package/package.json +3 -3
  251. package/src/contracts/Actors/ZLinkActor.ts +6 -0
  252. package/src/contracts/Actors/ZLinkSessionBindingIdentity.ts +7 -0
  253. package/src/contracts/Actors/index.ts +1 -0
  254. package/src/contracts/Common/CoreTypes.ts +1 -0
  255. package/src/contracts/Common/HandlerMessageType.ts +50 -0
  256. package/src/contracts/Common/ZLinkEncodedPayload.ts +13 -25
  257. package/src/contracts/Common/ZLinkMessage.ts +11 -7
  258. package/src/contracts/Common/encoded-payload-storage.ts +4 -16
  259. package/src/contracts/Common/index.ts +1 -1
  260. package/src/contracts/Common/payload-slab.ts +29 -0
  261. package/src/contracts/Configuration/RegistrationBuilders.ts +29 -15
  262. package/src/contracts/Configuration/RegistrationTypes.ts +19 -0
  263. package/src/contracts/Handlers/Contexts.ts +1 -0
  264. package/src/contracts/Locations/Authority.ts +7 -1
  265. package/src/internal.ts +17 -0
  266. package/src/nest-integration.ts +1 -0
  267. package/src/runtime/actors/actor-client.ts +257 -163
  268. package/src/runtime/actors/actor-context.ts +26 -14
  269. package/src/runtime/actors/actor-execution-context.ts +2 -2
  270. package/src/runtime/actors/actor-handoff.ts +86 -51
  271. package/src/runtime/actors/actor-join-deferred-scope.ts +6 -6
  272. package/src/runtime/actors/actor-local-native-join.ts +38 -17
  273. package/src/runtime/actors/actor-mailbox.ts +1 -1
  274. package/src/runtime/actors/actor-remote-joiner.ts +8 -4
  275. package/src/runtime/actors/actor-routed-join-transport.ts +13 -5
  276. package/src/runtime/actors/actor-routed-json-request.ts +3 -0
  277. package/src/runtime/actors/actor-runtime-contracts.ts +4 -2
  278. package/src/runtime/actors/actor-runtime-state.ts +1 -1
  279. package/src/runtime/actors/spot-actor-dispatch.ts +70 -68
  280. package/src/runtime/admission.ts +42 -15
  281. package/src/runtime/application-jobs/application-ingress-record-owner.ts +4 -0
  282. package/src/runtime/backend/contracts/index.ts +77 -10
  283. package/src/runtime/backend/mesh-completion-table.ts +106 -15
  284. package/src/runtime/backend/mesh-dispatch-pump.ts +294 -146
  285. package/src/runtime/backend/node/node-backend-adapter-support.ts +42 -32
  286. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +91 -34
  287. package/src/runtime/backend/node/node-event-loop-poller.ts +14 -5
  288. package/src/runtime/backend/node/node-mesh-backend-adapter.ts +5 -1
  289. package/src/runtime/backend/node/node-raw-binding-port.ts +180 -69
  290. package/src/runtime/backend/node/node-raw-mesh-backend.ts +386 -157
  291. package/src/runtime/backend/node/node-socket-backend-adapter.ts +56 -11
  292. package/src/runtime/backend/raw-binding-port.ts +13 -5
  293. package/src/runtime/channels/channel-clients.ts +26 -11
  294. package/src/runtime/channels/channel-dispatch-pipeline.ts +77 -65
  295. package/src/runtime/channels/channel-dispatch-services.ts +7 -12
  296. package/src/runtime/channels/channel-dispatchers.ts +93 -39
  297. package/src/runtime/channels/channel-envelope.ts +680 -144
  298. package/src/runtime/channels/channel-multipart.ts +17 -13
  299. package/src/runtime/channels/channel-outbound-operations.ts +204 -178
  300. package/src/runtime/channels/channel-receive-loops.ts +160 -107
  301. package/src/runtime/channels/channel-runtime-lifecycle.ts +64 -59
  302. package/src/runtime/channels/channel-runtime-manager.ts +74 -27
  303. package/src/runtime/channels/channel-socket-registry.ts +20 -5
  304. package/src/runtime/channels/channel-transports.ts +414 -287
  305. package/src/runtime/channels/dispatch-error-reporter.ts +4 -9
  306. package/src/runtime/channels/local-spot-route-transport.ts +27 -29
  307. package/src/runtime/channels/router-socket-spot-route-transport.ts +63 -32
  308. package/src/runtime/channels/source-spot-router.ts +75 -38
  309. package/src/runtime/channels/spot-node-route-transport.ts +67 -37
  310. package/src/runtime/channels/spot-route-bridge-transport.ts +62 -30
  311. package/src/runtime/channels/spot-route-dispatch-strategy.ts +105 -34
  312. package/src/runtime/diagnostics/dispatch-error-details.ts +10 -2
  313. package/src/runtime/diagnostics/message-flow-bootstrap.ts +6 -0
  314. package/src/runtime/diagnostics/message-flow-delivery.ts +171 -0
  315. package/src/runtime/diagnostics/message-flow-record.ts +295 -0
  316. package/src/runtime/diagnostics/message-flow-worker.ts +146 -0
  317. package/src/runtime/diagnostics/message-flow.ts +49 -362
  318. package/src/runtime/diagnostics/runtime-metrics.ts +10 -4
  319. package/src/runtime/execution/index.ts +6 -0
  320. package/src/runtime/execution/serial-execution-queue.ts +94 -96
  321. package/src/runtime/foundation/durable-service-request.ts +212 -89
  322. package/src/runtime/foundation/operation-registry.ts +287 -38
  323. package/src/runtime/foundation/raw-service-mesh-runtime.ts +617 -292
  324. package/src/runtime/foundation/request-runtime.ts +227 -0
  325. package/src/runtime/foundation/service-discovery-registry.ts +7 -0
  326. package/src/runtime/foundation/service-liveness-registry.ts +1 -1
  327. package/src/runtime/foundation/service-mailbox.ts +7 -2
  328. package/src/runtime/foundation/service-relocation-object-owner.ts +21 -6
  329. package/src/runtime/foundation/service-runtime-contracts.ts +12 -2
  330. package/src/runtime/foundation/service-stateful-registry.ts +52 -19
  331. package/src/runtime/foundation/service-stateful-runtime.ts +365 -198
  332. package/src/runtime/foundation/service-stateful-wire-codec.ts +18 -0
  333. package/src/runtime/foundation/service-topology-registry.ts +21 -3
  334. package/src/runtime/foundation/service-wire-constants.generated.ts +10 -0
  335. package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -17
  336. package/src/runtime/host/actor-packet-relay.ts +160 -156
  337. package/src/runtime/host/actor-placement-coordinator.ts +1 -1
  338. package/src/runtime/host/actor-runtime-options-factory.ts +7 -2
  339. package/src/runtime/host/actor-transfer-runtime.ts +3 -3
  340. package/src/runtime/host/application-job-queue.ts +56 -27
  341. package/src/runtime/host/bound-session-relay.ts +0 -1
  342. package/src/runtime/host/channel-runtime-options-factory.ts +3 -0
  343. package/src/runtime/host/entry-actor-runtime.ts +14 -6
  344. package/src/runtime/host/index.ts +388 -113
  345. package/src/runtime/host/location-runtime-owner.ts +3 -3
  346. package/src/runtime/host/service-relocation-host-runtime.ts +380 -252
  347. package/src/runtime/host/spot-address-transport.ts +110 -95
  348. package/src/runtime/host/spot-runtime-options-factory.ts +3 -0
  349. package/src/runtime/host/user-spot-creation-coordinator.ts +69 -22
  350. package/src/runtime/internal-observation.ts +2 -0
  351. package/src/runtime/locations/actor-location-claims.ts +42 -16
  352. package/src/runtime/locations/auto-connect-loop.ts +24 -16
  353. package/src/runtime/locations/auto-connect-planner.ts +2 -5
  354. package/src/runtime/locations/auto-connect-reconciler.ts +37 -24
  355. package/src/runtime/locations/in-memory-authority-store.ts +27 -7
  356. package/src/runtime/locations/in-memory-location-store.ts +1 -74
  357. package/src/runtime/locations/lifecycle.ts +4 -2
  358. package/src/runtime/locations/location-store-repository.ts +228 -308
  359. package/src/runtime/locations/resolvers.ts +20 -8
  360. package/src/runtime/locations/runtime.ts +16 -28
  361. package/src/runtime/messaging/creation-payload-codec.ts +12 -10
  362. package/src/runtime/messaging/framework-json-v1.ts +10 -1
  363. package/src/runtime/messaging/payload-codec.ts +50 -75
  364. package/src/runtime/messaging/request-deadline.ts +47 -39
  365. package/src/runtime/messaging/request-result.ts +88 -17
  366. package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
  367. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
  368. package/src/runtime/spots/index.ts +57 -10
  369. package/src/runtime/spots/spot-activation-registry.ts +12 -8
  370. package/src/runtime/spots/spot-activation-state.ts +2 -0
  371. package/src/runtime/spots/spot-actor-admission-coordinator.ts +62 -37
  372. package/src/runtime/spots/spot-actor-ingress-admission.ts +157 -0
  373. package/src/runtime/spots/spot-actor-membership.ts +8 -5
  374. package/src/runtime/spots/spot-actor-packet-dispatch.ts +122 -206
  375. package/src/runtime/spots/spot-actor-packet-drain.ts +21 -6
  376. package/src/runtime/spots/spot-entry-activation.ts +25 -35
  377. package/src/runtime/spots/spot-handler-registry.ts +72 -15
  378. package/src/runtime/spots/spot-manager-public.ts +4 -2
  379. package/src/runtime/spots/spot-node-runtime-manager.ts +16 -7
  380. package/src/runtime/spots/spot-outbound.ts +26 -10
  381. package/src/runtime/spots/spot-route-packet-dispatch.ts +18 -8
  382. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +14 -8
  383. package/src/runtime/spots/spot-runtime-ports.ts +5 -2
  384. package/src/runtime/spots/spot-serial-executor.ts +1 -1
  385. package/src/runtime/spots/spot-serial-turn-executor.ts +25 -40
  386. package/src/runtime/spots/spot-subscription-dispatch.ts +9 -2
  387. package/src/runtime/spots/spot-timer.ts +1 -1
  388. package/src/runtime/streams/actor-session-binding-registry.ts +46 -3
  389. package/src/runtime/streams/bound-actor-relay-sender.ts +16 -5
  390. package/src/runtime/streams/bound-session-service.ts +10 -7
  391. package/src/runtime/streams/index.ts +30 -4
  392. package/src/runtime/streams/managed-stream.ts +2 -1
  393. package/src/runtime/streams/session-calls.ts +9 -14
  394. package/src/runtime/streams/session-context.ts +6 -11
  395. package/src/runtime/streams/stream-session-runtime.ts +79 -40
  396. package/dist/runtime/spots/spot-lifecycle-metrics.d.ts +0 -8
  397. package/dist/runtime/spots/spot-lifecycle-metrics.js +0 -17
  398. package/src/runtime/spots/spot-lifecycle-metrics.ts +0 -16
@@ -9,6 +9,7 @@ import type {
9
9
  import type { ZLinkProviderResolver } from '../../contracts/Common/ZLinkProviderResolver';
10
10
  import type { ZLinkApplicationWorkClaim } from '../admission';
11
11
  import { zlinkMessageMetadata } from '../../contracts';
12
+ import { resolveMessageTypeForDecode } from '../../contracts/Common/HandlerMessageType';
12
13
  import {
13
14
  ZLinkRuntimeDispatchErrorAction as ZLinkDispatchErrorAction,
14
15
  ZLinkRuntimeDispatchErrorReason as ZLinkDispatchErrorReason,
@@ -77,7 +78,7 @@ export class ZLinkRoutedSpotPacketDispatch {
77
78
  async sendEncoded(
78
79
  spotId: RoutingId,
79
80
  packetName: string | undefined,
80
- decodePayload: () => unknown,
81
+ decodePayload: (messageType?: Type) => unknown,
81
82
  context: ZLinkRoutedSpotPacketContext
82
83
  ): Promise<void> {
83
84
  await this.dispatch(spotId, packetName, decodePayload, context, false);
@@ -95,7 +96,7 @@ export class ZLinkRoutedSpotPacketDispatch {
95
96
  async requestEncoded<TReply>(
96
97
  spotId: RoutingId,
97
98
  packetName: string | undefined,
98
- decodePayload: () => unknown,
99
+ decodePayload: (messageType?: Type) => unknown,
99
100
  context: ZLinkRoutedSpotPacketContext
100
101
  ): Promise<TReply> {
101
102
  return (await this.dispatch(spotId, packetName, decodePayload, context, true)) as TReply;
@@ -104,10 +105,11 @@ export class ZLinkRoutedSpotPacketDispatch {
104
105
  private async dispatch(
105
106
  spotId: RoutingId,
106
107
  packetName: string | undefined,
107
- decodePayload: () => unknown,
108
+ decodePayload: (messageType?: Type) => unknown,
108
109
  context: ZLinkRoutedSpotPacketContext,
109
110
  returnResponse: boolean
110
111
  ): Promise<unknown> {
112
+ const receivedAt = new Date();
111
113
  const activation = this.options.resolveActivation(spotId);
112
114
  if (activation === undefined) {
113
115
  this.reportMissing(spotId, packetName, context, returnResponse);
@@ -190,7 +192,9 @@ export class ZLinkRoutedSpotPacketDispatch {
190
192
  );
191
193
  // Decode only after the Spot has acquired both application admission
192
194
  // and its execution authority.
193
- const payload = decodePayload();
195
+ const payload = decodePayload(
196
+ resolveMessageTypeForDecode(currentRegistrations[0]?.messageType)
197
+ );
194
198
  for (const registration of currentRegistrations) {
195
199
  const handler = await resolveLifecycleHandler(
196
200
  current.spot,
@@ -203,13 +207,15 @@ export class ZLinkRoutedSpotPacketDispatch {
203
207
  resolveFirstHandlerTurn?.();
204
208
  resolveFirstHandlerTurn = undefined;
205
209
  context.activationRecord?.onHandlerTurnStarted?.();
206
- releaseApplicationJobPermitBeforeHandler();
207
- response = await handler.handle(current.spot, payload, {
210
+ const handlerContext = {
208
211
  channelName: context.channelName,
209
212
  contentType: context.contentType,
210
213
  packetName: packetName!,
211
- metadata: zlinkMessageMetadata({})
212
- });
214
+ metadata: zlinkMessageMetadata({}),
215
+ receivedAt
216
+ };
217
+ releaseApplicationJobPermitBeforeHandler();
218
+ response = await handler.handle(current.spot, payload, handlerContext);
213
219
  }
214
220
  } catch (error) {
215
221
  rejectFirstHandlerTurn?.(error);
@@ -36,8 +36,11 @@ export interface ZLinkEntryActorRuntime {
36
36
  parts: readonly Message[],
37
37
  returnResponse?: boolean,
38
38
  remoteBoundSessionTarget?: ZLinkRemoteBoundSessionTarget,
39
- fallbackActorRef?: ActorRef
40
- ): Promise<{ readonly handled: boolean; readonly response?: unknown }>;
39
+ fallbackActorRef?: ActorRef,
40
+ origin?: ApplicationJobOrigin,
41
+ requestTerminal?: import('./spot-actor-packet-dispatch').ZLinkActorRequestTerminal,
42
+ messageFollowOrigin?: ZLinkMessageFollowOrigin
43
+ ): { readonly handled: boolean; readonly response?: unknown };
41
44
  }
42
45
 
43
46
  export interface ZLinkSpotActorTransferRuntime {
@@ -28,7 +28,7 @@ export type ZLinkActorPacketTurnDispatch = (
28
28
  export class ZLinkSpotSerialExecutor {
29
29
  private readonly actorSerials = new Map<string, ZLinkSpotSerialTurnExecutor>();
30
30
  private readonly timerSerials = new Map<string, ZLinkSpotSerialTurnExecutor>();
31
- private readonly actorExecutors = new Map<string, ZLinkActorSerialExecutor>();
31
+ readonly actorExecutors = new Map<string, ZLinkActorSerialExecutor>();
32
32
  private executionBarrier: ZLinkExecutionBarrier | undefined;
33
33
  private closing = false;
34
34
  private closePromise: Promise<void> | undefined;
@@ -163,10 +163,10 @@ export class ZLinkSpotSerialTurnExecutor {
163
163
  async postOneWay(
164
164
  operation: () => Promise<unknown> | unknown,
165
165
  onError: (error: unknown) => void,
166
- workOptions: ZLinkSerialWorkOptions = {},
167
- admission: {
166
+ workOptions?: ZLinkSerialWorkOptions,
167
+ admission?: {
168
168
  readonly signal?: AbortSignal;
169
- } = {},
169
+ },
170
170
  replay?: (failure?: unknown) => Promise<unknown>
171
171
  ): Promise<void> {
172
172
  this.lastActivityAtMs = performance.now();
@@ -179,17 +179,13 @@ export class ZLinkSpotSerialTurnExecutor {
179
179
  if (barrierClaim !== undefined && replay !== undefined) {
180
180
  Object.assign(barrierClaim, { replay: bindApplicationJobPermit(replay) });
181
181
  }
182
- if (admission.signal?.aborted === true) {
182
+ if (admission?.signal?.aborted === true) {
183
183
  throw new DOMException('The operation was aborted.', 'AbortError');
184
184
  }
185
- const options = {
186
- ...workOptions,
187
- lane: workOptions.lane ?? 'application'
188
- };
189
185
  const boundOperation = bindApplicationJobPermit(operation);
190
186
  const submitted = hasApplicationJobPermit()
191
- ? this.scheduler.submitPreAdmitted(boundOperation, options, barrierClaim)
192
- : this.scheduler.submit(boundOperation, options, barrierClaim);
187
+ ? this.scheduler.submitPreAdmitted(boundOperation, workOptions, barrierClaim)
188
+ : this.scheduler.submit(boundOperation, workOptions, barrierClaim);
193
189
  void submitted.catch((error) => {
194
190
  barrierClaim?.release();
195
191
  onError(error);
@@ -265,7 +261,7 @@ export class ZLinkSpotSerialTurnExecutor {
265
261
 
266
262
  private async enqueueApplicationTurn<T>(
267
263
  operation: () => Promise<T> | T,
268
- workOptions: ZLinkSerialWorkOptions = {},
264
+ workOptions?: ZLinkSerialWorkOptions,
269
265
  replay?: (failure?: unknown) => Promise<T>,
270
266
  retainWhilePreparing = false
271
267
  ): Promise<T> {
@@ -300,7 +296,7 @@ export class ZLinkSpotSerialTurnExecutor {
300
296
 
301
297
  private async enqueueFrameworkTurn<T>(
302
298
  operation: () => Promise<T> | T,
303
- workOptions: ZLinkSerialWorkOptions = {}
299
+ workOptions?: ZLinkSerialWorkOptions
304
300
  ): Promise<T> {
305
301
  this.lastActivityAtMs = performance.now();
306
302
  // Application admission crosses the async barrier boundary before it
@@ -318,43 +314,39 @@ export class ZLinkSpotSerialTurnExecutor {
318
314
 
319
315
  private submitQueuedTurn<T>(
320
316
  operation: () => Promise<T> | T,
321
- workOptions: ZLinkSerialWorkOptions,
317
+ workOptions: ZLinkSerialWorkOptions | undefined,
322
318
  barrierClaim?: ZLinkExecutionBarrierClaim | Promise<ZLinkExecutionBarrierClaim>
323
319
  ): Promise<T> {
324
- const options = {
325
- ...workOptions,
326
- lane: workOptions.lane ?? 'application'
327
- };
328
320
  const boundOperation = bindApplicationJobPermit(operation);
329
321
  return hasApplicationJobPermit()
330
- ? this.scheduler.submitPreAdmitted(boundOperation, options, barrierClaim)
331
- : this.scheduler.submit(boundOperation, options, barrierClaim);
322
+ ? this.scheduler.submitPreAdmitted(boundOperation, workOptions, barrierClaim)
323
+ : this.scheduler.submit(boundOperation, workOptions, barrierClaim);
332
324
  }
333
325
 
334
326
  private runQueuedRecord(record: ZLinkSerialWorkRecord<unknown>): Promise<void> {
335
327
  if (record.context instanceof Promise) {
336
- return record.context.then((claim: ZLinkExecutionBarrierClaim) => {
337
- Object.assign(record, { context: claim });
338
- return this.runQueuedRecord(record);
328
+ // Branch-local captures keep the synchronous path free of a V8 function context.
329
+ const executor = this;
330
+ const work = record;
331
+ const pending = record.context;
332
+ return pending.then((claim: ZLinkExecutionBarrierClaim) => {
333
+ Object.assign(work, { context: claim });
334
+ return executor.runQueuedRecord(work);
339
335
  });
340
336
  }
341
337
  const context = record.context as ZLinkSpotApplicationTurnContext | undefined;
342
338
  if (context?.replay !== undefined && record.operation === context.replay) {
343
339
  context.release();
344
- return Promise.resolve(this.executionBarrier?.enter()).then((claim) =>
345
- this.runTurn(
346
- record.operation,
347
- (value) => record.resolve(value),
348
- (error) => record.reject(error),
349
- claim,
350
- record.release
351
- )
340
+ const executor = this;
341
+ const work = record;
342
+ return Promise.resolve(executor.executionBarrier?.enter()).then((claim) =>
343
+ executor.runTurn(work.operation, work.resolve, work.reject, claim, work.release)
352
344
  );
353
345
  }
354
346
  return this.runTurn(
355
347
  record.operation,
356
- (value) => record.resolve(value),
357
- (error) => record.reject(error),
348
+ record.resolve,
349
+ record.reject,
358
350
  record.context as ZLinkExecutionBarrierClaim | undefined,
359
351
  record.release
360
352
  );
@@ -405,14 +397,7 @@ export class ZLinkSpotSerialTurnExecutor {
405
397
  release?.();
406
398
  }
407
399
  );
408
- owner.then(resolve, reject);
409
- return Promise.race([
410
- owner.then(
411
- () => undefined,
412
- () => undefined
413
- ),
414
- turn.suspended
415
- ]);
400
+ return Promise.race([owner.then(resolve, reject), turn.suspended]);
416
401
  }
417
402
 
418
403
  private postResume(
@@ -25,6 +25,7 @@ import {
25
25
  import { createInboundFlow, runWithFlow } from '../diagnostics/flow-context';
26
26
  import { resolveLifecycleHandler } from '../handlers/handler-instance-scope';
27
27
  import type { ZLinkSpotHandlerRegistration } from './spot-handler-registry';
28
+ import { resolveMessageTypeForDecode } from '../../contracts/Common/HandlerMessageType';
28
29
  import { ZLINK_RECV_DONT_WAIT } from './spot-native-flags';
29
30
  import type { ZLinkSpotSerialTurnExecutor } from './spot-serial-turn-executor';
30
31
  import { zlinkMetadataByteLength, zlinkSerialWorkOptions } from '../execution/serial-work-size';
@@ -132,6 +133,7 @@ export class ZLinkSpotSubscriptionDispatch {
132
133
  readonly parts: readonly Message[];
133
134
  readonly routingId: RoutingId | unknown | null;
134
135
  }): Promise<void> {
136
+ const receivedAt = new Date();
135
137
  if (message.parts.length === 0) {
136
138
  this.options.dispatchErrors?.report({
137
139
  surface: ZLinkDispatchErrorSurface.SpotSubscription,
@@ -193,8 +195,12 @@ export class ZLinkSpotSubscriptionDispatch {
193
195
  runWithFlow(inboundFlow, async () => {
194
196
  // Payload deserialization belongs to the Spot serial turn. Queue
195
197
  // admission and execution authority therefore precede this work.
196
- const event = decodeChannelPayload(envelope, this.channelCodecs());
197
198
  for (const registration of registrations) {
199
+ const event = decodeChannelPayload(
200
+ envelope,
201
+ this.channelCodecs(),
202
+ resolveMessageTypeForDecode(registration.messageType)
203
+ );
198
204
  const handler = await resolveLifecycleHandler(
199
205
  spot,
200
206
  registration.handlerType as Type<ZLinkSpotSubscriptionHandler<ZLinkSpot, unknown>>,
@@ -208,7 +214,8 @@ export class ZLinkSpotSubscriptionDispatch {
208
214
  topic: message.topic,
209
215
  source: subSource,
210
216
  metadata: zlinkMessageMetadata(envelope.header.metadata),
211
- correlationId: envelope.header.correlationId ?? undefined
217
+ correlationId: envelope.header.correlationId ?? undefined,
218
+ receivedAt
212
219
  });
213
220
  } catch (error) {
214
221
  this.options.dispatchErrors?.report({
@@ -522,7 +522,7 @@ export class ZLinkManagedTimer implements ZLinkTimer {
522
522
  private pendingScheduledIndex: bigint | undefined;
523
523
  private timeout: unknown;
524
524
  /** The dispatch in flight, from its timer callback until `completeFireCore`. */
525
- private running: Promise<void> | undefined;
525
+ running: Promise<void> | undefined;
526
526
  private dispatchFailure: { readonly cause: unknown } | undefined;
527
527
  private finalization: ZLinkTimerFinalization | undefined;
528
528
 
@@ -1,3 +1,4 @@
1
+ import { ZLinkStreamHeaderFlags, type ZLinkStreamFrameHeader } from './protocol';
1
2
  import {
2
3
  ZLinkFrameworkErrorKind,
3
4
  ZLinkFrameworkException
@@ -153,9 +154,9 @@ export class ZLinkActorSessionBindingRegistry<
153
154
  TContext extends ZLinkActorSessionBindingContext<TActor>,
154
155
  TActor extends ZLinkActorSessionBindingActor
155
156
  > {
156
- private readonly lane = new ZLinkStateLane();
157
+ readonly lane = new ZLinkStateLane();
157
158
  private readonly routes = new Map<string, ZLinkActorSessionRoute<TContext, TActor>>();
158
- private readonly nextActorSlots = new WeakMap<TContext, number>();
159
+ readonly nextActorSlots = new WeakMap<TContext, number>();
159
160
  private readonly sealWaiters = new Map<
160
161
  string,
161
162
  Set<{
@@ -166,7 +167,7 @@ export class ZLinkActorSessionBindingRegistry<
166
167
  >();
167
168
  private readonly activeFrameWaiters = new Map<string, Set<ZLinkActorSessionActiveFrameWaiter>>();
168
169
  private readonly relocations = new Map<string, ZLinkActorSessionRelocationQueue>();
169
- private readonly absentSessionRelocationResults = new Map<
170
+ readonly absentSessionRelocationResults = new Map<
170
171
  string,
171
172
  {
172
173
  readonly result: SessionRelocationResult;
@@ -409,6 +410,48 @@ export class ZLinkActorSessionBindingRegistry<
409
410
  return await this.lane.run(() => this.routeCore(actorId));
410
411
  }
411
412
 
413
+ async submitReply<T>(
414
+ context: TContext,
415
+ header: ZLinkStreamFrameHeader,
416
+ submit: (header: ZLinkStreamFrameHeader) => Promise<T>
417
+ ): Promise<T> {
418
+ const { submission } = await this.lane.run(() => {
419
+ const current =
420
+ header.actorSlot === undefined ||
421
+ [...this.routes.values()].some(
422
+ (route) => route.context === context && route.actorSlot === header.actorSlot
423
+ );
424
+ return {
425
+ submission: submit(
426
+ current
427
+ ? header
428
+ : {
429
+ ...header,
430
+ actorSlot: undefined,
431
+ flags: header.flags & ~ZLinkStreamHeaderFlags.HasActorSlot
432
+ }
433
+ )
434
+ };
435
+ });
436
+ return await submission;
437
+ }
438
+
439
+ /** Registers a current binding's frame in the same turn that can retire its slot. */
440
+ async submitCurrent<T>(
441
+ actorId: string,
442
+ bindingToken: string,
443
+ submit: (route: ZLinkActorSessionRoute<TContext, TActor>) => Promise<T>
444
+ ): Promise<T | undefined> {
445
+ const { submission } = await this.lane.run(() => {
446
+ const route = this.routeCore(actorId);
447
+ return {
448
+ submission: route?.bindingToken === bindingToken ? submit(route) : undefined
449
+ };
450
+ });
451
+ // Transport completion must not hold the registry lane.
452
+ return await submission;
453
+ }
454
+
412
455
  /** Selects the route only when it is the exact Session binding (§8.1 validation values). */
413
456
  async routeForSessionBinding(
414
457
  actorId: string,
@@ -10,6 +10,7 @@ import { flowIfEnabled } from '../diagnostics';
10
10
  import { encodeFrameworkPayloadMessage } from '../messaging/payload-codec';
11
11
  import { ZLinkSubmitStatus, type ZLinkSubmitResult } from '../messaging/submission-result';
12
12
  import {
13
+ type ZLinkActorSessionAuthorityFence,
13
14
  ZLinkActorSessionBindingRegistry,
14
15
  ZLinkActorSessionBindingTermination
15
16
  } from './actor-session-binding-registry';
@@ -38,7 +39,8 @@ export interface ZLinkBoundActorRelaySenderOptions {
38
39
  readonly notifyDisconnected?: (
39
40
  actor: ZLinkSessionActor,
40
41
  signal?: AbortSignal,
41
- binding?: ServiceStreamSessionBinding
42
+ binding?: ServiceStreamSessionBinding,
43
+ authorityFence?: ZLinkActorSessionAuthorityFence
42
44
  ) => Promise<void>;
43
45
  }
44
46
 
@@ -269,7 +271,12 @@ export class ZLinkBoundActorRelaySender {
269
271
  signal
270
272
  );
271
273
  }
272
- await this.options.notifyDisconnected?.(actor, signal, detached.binding);
274
+ await this.options.notifyDisconnected?.(
275
+ actor,
276
+ signal,
277
+ detached.binding,
278
+ detached.route.authorityFence
279
+ );
273
280
  }
274
281
 
275
282
  async notifyPhysicalDisconnect(context: DefaultZLinkSessionContext): Promise<void> {
@@ -300,15 +307,19 @@ export class ZLinkBoundActorRelaySender {
300
307
  actor.bindingToken,
301
308
  ZLinkActorSessionBindingTermination.PhysicalDisconnect
302
309
  );
303
- return { binding };
310
+ return { binding, authorityFence: route.authorityFence };
304
311
  });
305
312
  if (detached === false) return;
306
313
  const controller = new AbortController();
307
314
  const timer = setTimeout(() => controller.abort(), timeoutMs);
308
315
  try {
309
316
  await Promise.race([
310
- this.options.notifyDisconnected?.(actor, controller.signal, detached.binding) ??
311
- Promise.resolve(),
317
+ this.options.notifyDisconnected?.(
318
+ actor,
319
+ controller.signal,
320
+ detached.binding,
321
+ detached.authorityFence
322
+ ) ?? Promise.resolve(),
312
323
  new Promise<never>((_, reject) => {
313
324
  controller.signal.addEventListener(
314
325
  'abort',
@@ -125,11 +125,12 @@ export class ZLinkBoundSessionService {
125
125
  this.actorSlot(route)
126
126
  );
127
127
  try {
128
- throwIfAborted(signal);
129
- if ((await this.routes.route(actorId))?.bindingToken !== route.bindingToken) {
130
- return { status: ZLinkSubmitStatus.TargetNotFound };
131
- }
132
- return await route.context.stream.submitRaw(frame);
128
+ return (
129
+ (await this.routes.submitCurrent(actorId, route.bindingToken, (current) => {
130
+ throwIfAborted(signal);
131
+ return current.context.stream.submitRaw(frame);
132
+ })) ?? { status: ZLinkSubmitStatus.TargetNotFound }
133
+ );
133
134
  } finally {
134
135
  frame.close();
135
136
  }
@@ -370,10 +371,12 @@ export class ZLinkBoundSessionService {
370
371
  this.actorSlot(route)
371
372
  );
372
373
  try {
373
- if ((await this.routes.route(actorId))?.bindingToken !== route.bindingToken) {
374
+ const result = await this.routes.submitCurrent(actorId, route.bindingToken, (current) =>
375
+ current.context.stream.submitRaw(frame)
376
+ );
377
+ if (result === undefined) {
374
378
  return false;
375
379
  }
376
- const result = await route.context.stream.submitRaw(frame);
377
380
  if (result.status !== ZLinkSubmitStatus.Submitted) {
378
381
  throw new Error(`Actor '${actorId}' local bound session ${operationName} failed.`);
379
382
  }
@@ -60,6 +60,9 @@ import { ZLinkBoundSessionService, type ZLinkBoundSessionTransport } from './bou
60
60
  import { ZLinkManagedStream } from './managed-stream';
61
61
  import {
62
62
  messageToBytes,
63
+ decodeStreamFrame,
64
+ decodeStreamHeader,
65
+ encodeStreamFrame,
63
66
  ZLinkStreamCodec,
64
67
  ZLinkStreamMessageKind,
65
68
  type ZLinkStreamFrameHeader,
@@ -417,7 +420,7 @@ export class ZLinkStreamSessionNodeRuntime extends ZLinkStreamSessionNodeRuntime
417
420
  }
418
421
 
419
422
  export class ZLinkStreamBindingRuntime {
420
- private readonly routes: ZLinkActorSessionBindingRegistry<
423
+ readonly routes: ZLinkActorSessionBindingRegistry<
421
424
  DefaultZLinkSessionContext,
422
425
  DefaultZLinkSessionActor
423
426
  >;
@@ -808,19 +811,42 @@ export class ZLinkStreamBindingRuntime {
808
811
  );
809
812
  }
810
813
 
811
- createJsonReplyFrameMessage(
814
+ async submitReply(
815
+ context: DefaultZLinkSessionContext,
812
816
  requestHeader: ZLinkStreamFrameHeader,
813
817
  kind: ZLinkStreamReplyMessageKind,
814
818
  metadata: ReadonlyMap<string, string>,
815
819
  compressed: boolean,
816
820
  payload: unknown
817
- ): Message {
818
- return this.frameMessages.createJsonReplyFrameMessage(
821
+ ): Promise<ZLinkSubmitResult> {
822
+ const frame = this.frameMessages.createJsonReplyFrameMessage(
819
823
  requestHeader,
820
824
  kind,
821
825
  metadata,
822
826
  compressed,
823
827
  payload
824
828
  );
829
+ try {
830
+ return await this.routes.submitReply(context, requestHeader, async (header) => {
831
+ if (header === requestHeader) return await context.stream.submitRaw(frame);
832
+ const encoded = decodeStreamFrame(messageToBytes(frame));
833
+ const normalized = this.createBinaryMessage(
834
+ encodeStreamFrame(
835
+ {
836
+ ...decodeStreamHeader(encoded.header),
837
+ actorSlot: header.actorSlot
838
+ },
839
+ encoded.payload
840
+ )
841
+ );
842
+ try {
843
+ return await context.stream.submitRaw(normalized);
844
+ } finally {
845
+ normalized.close();
846
+ }
847
+ });
848
+ } finally {
849
+ frame.close();
850
+ }
825
851
  }
826
852
  }
@@ -478,7 +478,8 @@ export class ZLinkManagedStream implements ZLinkStream {
478
478
  throw wireReplyFailureException(
479
479
  completion.terminalResult,
480
480
  completion.failureErrno,
481
- `${operationName} failed with result ${completion.terminalResult} (errno ${completion.failureErrno}).`
481
+ completion.failureMessage ??
482
+ `${operationName} failed with result ${completion.terminalResult} (errno ${completion.failureErrno}).`
482
483
  );
483
484
  }
484
485
  } finally {
@@ -39,13 +39,13 @@ export interface ZLinkSessionCallContext {
39
39
  payload: unknown,
40
40
  correlationId?: string
41
41
  ): Message;
42
- createJsonReplyFrameMessage(
42
+ submitReply(
43
43
  requestHeader: ZLinkStreamFrameHeader,
44
44
  kind: ZLinkStreamReplyMessageKind,
45
45
  metadata: ReadonlyMap<string, string>,
46
46
  compressed: boolean,
47
47
  payload: unknown
48
- ): Message;
48
+ ): Promise<ZLinkSubmitResult>;
49
49
  claimReply(requestHeader: ZLinkStreamFrameHeader): void;
50
50
  /**
51
51
  * Spec 26 §2.2: the STREAM surface records session-connected sends and the
@@ -168,23 +168,18 @@ export class DefaultZLinkSessionReplyCall implements ZLinkSessionReplyCall {
168
168
  throw new Error('Reply is only available while handling a request packet.');
169
169
  }
170
170
  this.context.claimReply(requestHeader);
171
- const message = this.context.createJsonReplyFrameMessage(
171
+ const result = await this.context.submitReply(
172
172
  requestHeader,
173
173
  ZLinkStreamMessageKind.Response,
174
174
  new Map<string, string>(),
175
175
  this.compressionEnabled,
176
176
  this.message
177
177
  );
178
- try {
179
- const result = await this.context.stream.submitRaw(message);
180
- requireOneWayCompletion(result, 'STREAM session reply');
181
- this.context.traceFrameWritten?.(
182
- ZLinkStreamMessageKind.Response,
183
- requestHeader.name,
184
- requestHeader.correlationId
185
- );
186
- } finally {
187
- message.close();
188
- }
178
+ requireOneWayCompletion(result, 'STREAM session reply');
179
+ this.context.traceFrameWritten?.(
180
+ ZLinkStreamMessageKind.Response,
181
+ requestHeader.name,
182
+ requestHeader.correlationId
183
+ );
189
184
  }
190
185
  }
@@ -65,13 +65,14 @@ interface ZLinkSessionContextRuntime {
65
65
  payload: unknown,
66
66
  correlationId?: string
67
67
  ): Message;
68
- createJsonReplyFrameMessage(
68
+ submitReply(
69
+ context: DefaultZLinkSessionContext,
69
70
  requestHeader: ZLinkStreamFrameHeader,
70
71
  kind: ZLinkStreamReplyMessageKind,
71
72
  metadata: ReadonlyMap<string, string>,
72
73
  compressed: boolean,
73
74
  payload: unknown
74
- ): Message;
75
+ ): Promise<ZLinkSubmitResult>;
75
76
  decompressPayload(payload: Message): Message;
76
77
  bind(
77
78
  context: DefaultZLinkSessionContext,
@@ -267,20 +268,14 @@ export class DefaultZLinkSessionContext implements ZLinkSessionContext {
267
268
  );
268
269
  }
269
270
 
270
- createJsonReplyFrameMessage(
271
+ submitReply(
271
272
  requestHeader: ZLinkStreamFrameHeader,
272
273
  kind: ZLinkStreamReplyMessageKind,
273
274
  metadata: ReadonlyMap<string, string>,
274
275
  compressed: boolean,
275
276
  payload: unknown
276
- ): Message {
277
- return this.runtime.createJsonReplyFrameMessage(
278
- requestHeader,
279
- kind,
280
- metadata,
281
- compressed,
282
- payload
283
- );
277
+ ): Promise<ZLinkSubmitResult> {
278
+ return this.runtime.submitReply(this, requestHeader, kind, metadata, compressed, payload);
284
279
  }
285
280
 
286
281
  enterDispatch(header: ZLinkStreamFrameHeader): void {