@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
@@ -58,20 +58,24 @@ export async function submitRequestOperation(
58
58
  try {
59
59
  return await operation.submit();
60
60
  } catch (error) {
61
- // Spec 32-framework-error-model:81-92 — classify the backend request
62
- // terminal rather than collapsing every failure to Unavailable.
63
- if (isZLinkBackendResultError(error) && error.operation === 'request') {
64
- throw new ZLinkFrameworkException(
65
- requestResultToPublicErrorKind(error.result),
66
- `${label} failed with result ${error.result}.`,
67
- error
68
- );
69
- }
70
- throw createInternalFrameworkException(
71
- ZLinkFrameworkInternalErrorKind.RouteNotConnected,
72
- `${label} failed before a reply was received.`,
73
- true,
61
+ throw mapRequestFailure(error, label);
62
+ }
63
+ }
64
+
65
+ export function mapRequestFailure(error: unknown, label: string): unknown {
66
+ // Spec 32-framework-error-model:81-92 — classify the backend request
67
+ // terminal rather than collapsing every failure to Unavailable.
68
+ if (isZLinkBackendResultError(error) && error.operation === 'request') {
69
+ return new ZLinkFrameworkException(
70
+ requestResultToPublicErrorKind(error.result),
71
+ `${label} failed with result ${error.result}.`,
74
72
  error
75
73
  );
76
74
  }
75
+ return createInternalFrameworkException(
76
+ ZLinkFrameworkInternalErrorKind.RouteNotConnected,
77
+ `${label} failed before a reply was received.`,
78
+ true,
79
+ error
80
+ );
77
81
  }
@@ -1,3 +1,5 @@
1
+ import { RequestRuntime } from '../foundation/request-runtime';
2
+ import type { PendingOperation } from '../foundation/operation-registry';
1
3
  import {
2
4
  ZLinkFrameworkInternalErrorKind,
3
5
  createInternalFrameworkException,
@@ -18,7 +20,7 @@ import {
18
20
  ZLinkDispatchErrorSurface,
19
21
  ZLinkDispatchMessageKind
20
22
  } from '../../contracts/Dispatch/ZLinkDispatchOptions';
21
- import { awaitWithAbort, throwIfAborted } from '../abort';
23
+ import { throwIfAborted } from '../abort';
22
24
  import {
23
25
  closeMessages,
24
26
  decodeChannelReply,
@@ -36,10 +38,6 @@ import { ZLinkFrameworkErrorKind, ZLinkFrameworkException } from '../../contract
36
38
  import { ZLinkRouteDisconnectedError } from './route-disconnected-error';
37
39
  import { runWithOutboundFlow } from '../diagnostics/flow-context';
38
40
 
39
- const CHANNEL_REQUEST_LOOP_KEEPALIVE_MS = 0x7fff_ffff;
40
-
41
- // Shared default for the dominant no-metadata call; avoids a Map allocation
42
- // per outbound operation.
43
41
  const EMPTY_OUTBOUND_METADATA: ReadonlyMap<string, string> = new Map();
44
42
 
45
43
  export class ZLinkChannelOutboundOperations {
@@ -47,7 +45,8 @@ export class ZLinkChannelOutboundOperations {
47
45
  constructor(
48
46
  private readonly sockets: ZLinkChannelSocketRegistry,
49
47
  private readonly codecs: ZLinkChannelEnvelopeCodecRegistry,
50
- private readonly dispatchServices: ZLinkChannelDispatchServices
48
+ private readonly dispatchServices: ZLinkChannelDispatchServices,
49
+ private readonly requests = new RequestRuntime()
51
50
  ) {}
52
51
 
53
52
  pendingRequestCount(channelName: string): number {
@@ -129,40 +128,36 @@ export class ZLinkChannelOutboundOperations {
129
128
  timeoutMs: number | undefined,
130
129
  signal?: AbortSignal,
131
130
  metadata?: ReadonlyMap<string, string>,
132
- onAdmitted?: () => void
131
+ onAdmitted?: () => void,
132
+ requestOperation?: PendingOperation<unknown>
133
133
  ): Promise<TReply> {
134
- return keepChannelRequestAlive(
135
- runWithOutboundFlow(this.dispatchServices.flowCreationEnabled(), () =>
136
- this.requestScoped<TReply>(
137
- channelName,
138
- packetName,
139
- request,
140
- timeoutMs,
141
- signal,
142
- metadata,
143
- onAdmitted
144
- )
134
+ return runWithOutboundFlow(this.dispatchServices.flowCreationEnabled(), () =>
135
+ this.requestScoped<TReply>(
136
+ channelName,
137
+ packetName,
138
+ request,
139
+ timeoutMs,
140
+ signal,
141
+ metadata,
142
+ onAdmitted,
143
+ requestOperation
145
144
  )
146
145
  );
147
146
  }
148
147
 
149
- private async requestScoped<TReply>(
148
+ private requestScoped<TReply>(
150
149
  channelName: string,
151
150
  packetName: string | undefined,
152
151
  request: unknown,
153
152
  timeoutMs: number | undefined,
154
153
  signal?: AbortSignal,
155
154
  metadata?: ReadonlyMap<string, string>,
156
- onAdmitted?: () => void
155
+ onAdmitted?: () => void,
156
+ existing?: PendingOperation<unknown>
157
157
  ): Promise<TReply> {
158
- const deadlineMs = timeoutMs === undefined ? undefined : performance.now() + timeoutMs;
159
- const deadlineUnixMs = timeoutMs === undefined ? undefined : Date.now() + timeoutMs;
160
158
  let correlationId: string | undefined;
161
159
  let selectedServerRid: string | undefined;
162
- let terminalRecorded = false;
163
160
  const traceTerminal = (result: ZLinkRuntimeMessageFlowResult): void => {
164
- if (terminalRecorded) return;
165
- terminalRecorded = true;
166
161
  this.dispatchServices.beginOutbound(ZLinkMessageFlowOutcome.ReplyReceived, result)?.trace({
167
162
  surface: ZLinkDispatchErrorSurface.Channel,
168
163
  messageKind: ZLinkDispatchMessageKind.Request,
@@ -175,88 +170,106 @@ export class ZLinkChannelOutboundOperations {
175
170
  });
176
171
  };
177
172
  try {
178
- throwIfAborted(signal);
179
- const readyWait = new AbortController();
180
- const readySignal =
181
- signal === undefined ? readyWait.signal : AbortSignal.any([signal, readyWait.signal]);
182
- const dealer = await waitRequestReply(
183
- this.sockets.awaitClientDealerForOutbound(channelName, readySignal),
184
- `Channel request '${channelName}'`,
185
- deadlineMs,
186
- signal,
187
- () => readyWait.abort()
188
- );
189
- if (dealer === undefined) {
190
- throw createInternalFrameworkException(
191
- ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
192
- `Channel '${channelName}' has no ready ClientServer server before its admission deadline.`
193
- );
194
- }
195
- const serverRid = this.sockets.selectedClientServerRid(channelName, dealer);
196
- selectedServerRid = serverRid;
197
- correlationId = newChannelCorrelationId();
198
- const parts = encodeChannelEnvelopePartsAtDeadline(
199
- ZLinkChannelMessageKind.Request,
200
- channelName,
201
- packetName,
202
- request,
203
- deadlineUnixMs,
204
- undefined,
205
- this.codecs,
206
- correlationId,
207
- this.dispatchServices.flowCreationEnabled(),
208
- metadata
209
- ) as readonly Message[];
210
- this.dispatchServices.beginOutbound(ZLinkMessageFlowOutcome.Sent)?.trace({
211
- surface: ZLinkDispatchErrorSurface.Channel,
212
- messageKind: ZLinkDispatchMessageKind.Request,
213
- channelName,
214
- channelRouteKind: 'client_server',
215
- serverRid,
216
- packetName,
217
- correlationId
218
- });
219
- const reply = await this.measureRequest(channelName, async () => {
220
- let replyParts: readonly Message[] = [];
221
- try {
222
- try {
223
- replyParts = await awaitWithAbort(
224
- dealer.request(
225
- parts,
226
- remainingRequestTimeout(`Channel request '${channelName}'`, deadlineMs),
227
- onAdmitted
228
- ),
229
- signal
173
+ signal?.throwIfAborted();
174
+ const operation = this.requests.begin(timeoutMs, signal, existing);
175
+ const reply = this.requests.run<TReply>(
176
+ operation,
177
+ (receiver) => {
178
+ this.measureRequest(channelName, operation);
179
+ operation.mapCaller(
180
+ (value) => {
181
+ traceTerminal('succeeded');
182
+ return value;
183
+ },
184
+ (error) => {
185
+ if (!isRemoteChannelErrorReply(error))
186
+ traceTerminal(requestTerminalResult(error, signal));
187
+ throw error;
188
+ }
189
+ );
190
+
191
+ void (async () => {
192
+ const requestOperation = operation;
193
+ const deadlineMs = requestOperation.deadlineMs;
194
+ const deadlineUnixMs = timeoutMs === undefined ? undefined : Date.now() + timeoutMs;
195
+ const readyWait = new AbortController();
196
+ const readySignal =
197
+ signal === undefined ? readyWait.signal : AbortSignal.any([signal, readyWait.signal]);
198
+ const dealer = await waitRequestReply(
199
+ this.sockets.awaitClientDealerForOutbound(channelName, readySignal),
200
+ `Channel request '${channelName}'`,
201
+ requestOperation,
202
+ () => readyWait.abort()
230
203
  );
231
- } catch (error) {
232
- if (signal?.aborted === true) throw error;
233
- // Spec 32-framework-error-model:81-92 — classify the backend request
234
- // terminal (deadline -> DeadlineExceeded, lost route -> Unavailable,
235
- // etc.) instead of collapsing every failure to Unavailable.
236
- if (isZLinkBackendResultError(error) && error.operation === 'request') {
237
- throw new ZLinkFrameworkException(
238
- requestResultToPublicErrorKind(error.result),
239
- `Channel '${channelName}' request failed with result ${error.result}.`,
240
- error
204
+ if (dealer === undefined) {
205
+ throw createInternalFrameworkException(
206
+ ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
207
+ `Channel '${channelName}' has no ready ClientServer server before its admission deadline.`
241
208
  );
242
209
  }
243
- throw error;
210
+ const serverRid = this.sockets.selectedClientServerRid(channelName, dealer);
211
+ selectedServerRid = serverRid;
212
+ correlationId = newChannelCorrelationId();
213
+ const parts = encodeChannelEnvelopePartsAtDeadline(
214
+ ZLinkChannelMessageKind.Request,
215
+ channelName,
216
+ packetName,
217
+ request,
218
+ deadlineUnixMs,
219
+ undefined,
220
+ this.codecs,
221
+ correlationId,
222
+ this.dispatchServices.flowCreationEnabled(),
223
+ metadata
224
+ ) as readonly Message[];
225
+ this.dispatchServices.beginOutbound(ZLinkMessageFlowOutcome.Sent)?.trace({
226
+ surface: ZLinkDispatchErrorSurface.Channel,
227
+ messageKind: ZLinkDispatchMessageKind.Request,
228
+ channelName,
229
+ channelRouteKind: 'client_server',
230
+ serverRid,
231
+ packetName,
232
+ correlationId
233
+ });
234
+ dealer.request(
235
+ parts,
236
+ remainingRequestTimeout(`Channel request '${channelName}'`, deadlineMs),
237
+ onAdmitted,
238
+ requestOperation,
239
+ receiver
240
+ );
241
+ })().catch((error) => receiver.operationFailed(operation.id, error, undefined));
242
+ },
243
+ (raw) => {
244
+ const replyParts = raw as readonly Message[];
245
+ try {
246
+ return decodeChannelReply<TReply>(replyParts, this.codecs);
247
+ } finally {
248
+ closeMessages(replyParts);
249
+ }
250
+ },
251
+ (error) => {
252
+ if (
253
+ signal?.aborted !== true &&
254
+ isZLinkBackendResultError(error) &&
255
+ error.operation === 'request'
256
+ ) {
257
+ return new ZLinkFrameworkException(
258
+ requestResultToPublicErrorKind(error.result),
259
+ `Channel '${channelName}' request failed with result ${error.result}.`,
260
+ error
261
+ );
244
262
  }
245
- return decodeChannelReply<TReply>(replyParts, this.codecs);
246
- } finally {
247
- closeMessages(replyParts);
263
+ return error;
248
264
  }
249
- });
250
- traceTerminal('succeeded');
265
+ );
251
266
  return reply;
252
267
  } catch (error) {
253
268
  // A framework peer has already made the terminal dispatch error record
254
269
  // before it sends an Error reply. Do not turn that same remote dispatch
255
270
  // failure into a second local `reply_received` terminal at Errors level.
256
- if (!isRemoteChannelErrorReply(error)) {
257
- traceTerminal(requestTerminalResult(error, signal));
258
- }
259
- throw error;
271
+ if (!isRemoteChannelErrorReply(error)) traceTerminal(requestTerminalResult(error, signal));
272
+ return Promise.reject(error);
260
273
  }
261
274
  }
262
275
 
@@ -409,7 +422,8 @@ export class ZLinkChannelOutboundOperations {
409
422
  timeoutMs: number | undefined,
410
423
  signal?: AbortSignal,
411
424
  metadata?: ReadonlyMap<string, string>,
412
- onAdmitted?: () => void
425
+ onAdmitted?: () => void,
426
+ requestOperation?: PendingOperation<unknown>
413
427
  ): Promise<TReply> {
414
428
  return runWithOutboundFlow(this.dispatchServices.flowCreationEnabled(), () =>
415
429
  this.routeRequestScoped<TReply>(
@@ -420,12 +434,13 @@ export class ZLinkChannelOutboundOperations {
420
434
  timeoutMs,
421
435
  signal,
422
436
  metadata,
423
- onAdmitted
437
+ onAdmitted,
438
+ requestOperation
424
439
  )
425
440
  );
426
441
  }
427
442
 
428
- private async routeRequestScoped<TReply>(
443
+ private routeRequestScoped<TReply>(
429
444
  routerChannelId: string,
430
445
  targetNodeRid: string,
431
446
  packetName: string | undefined,
@@ -433,14 +448,11 @@ export class ZLinkChannelOutboundOperations {
433
448
  timeoutMs: number | undefined,
434
449
  signal?: AbortSignal,
435
450
  metadata?: ReadonlyMap<string, string>,
436
- onAdmitted?: () => void
451
+ onAdmitted?: () => void,
452
+ existing?: PendingOperation<unknown>
437
453
  ): Promise<TReply> {
438
454
  let correlationId: string | undefined;
439
- let router: ReturnType<ZLinkChannelSocketRegistry['routeRouter']> | undefined;
440
- let terminalRecorded = false;
441
455
  const traceTerminal = (result: ZLinkRuntimeMessageFlowResult): void => {
442
- if (terminalRecorded) return;
443
- terminalRecorded = true;
444
456
  this.dispatchServices.beginOutbound(ZLinkMessageFlowOutcome.ReplyReceived, result)?.trace({
445
457
  surface: ZLinkDispatchErrorSurface.RouteMeshChannel,
446
458
  messageKind: ZLinkDispatchMessageKind.Request,
@@ -453,92 +465,106 @@ export class ZLinkChannelOutboundOperations {
453
465
  });
454
466
  };
455
467
  try {
456
- throwIfAborted(signal);
457
- router = this.sockets.routeRouter(routerChannelId);
458
- if (this.sockets.routeMemberStatus(routerChannelId, targetNodeRid) === 'missing') {
459
- throw createInternalFrameworkException(
460
- ZLinkFrameworkInternalErrorKind.RequestTargetNotFound,
461
- `Route channel '${routerChannelId}' has no member '${targetNodeRid}'.`
462
- );
463
- }
464
- correlationId = newChannelCorrelationId();
465
- const parts = encodeChannelEnvelopeParts(
466
- ZLinkChannelMessageKind.Request,
467
- routerChannelId,
468
- packetName,
469
- request,
470
- timeoutMs,
471
- undefined,
472
- codecsForFrameworkPacket(packetName, this.codecs),
473
- correlationId,
474
- this.dispatchServices.flowCreationEnabled(),
475
- metadata
476
- ) as readonly Message[];
477
- this.dispatchServices.beginOutbound(ZLinkMessageFlowOutcome.Sent)?.trace({
478
- surface: ZLinkDispatchErrorSurface.RouteMeshChannel,
479
- messageKind: ZLinkDispatchMessageKind.Request,
480
- channelName: routerChannelId,
481
- channelRouteKind: 'route_mesh',
482
- packetName,
483
- correlationId,
484
- targetRid: targetNodeRid
485
- });
486
- const reply = await this.measureRequest(routerChannelId, async () => {
487
- const replyParts = await awaitWithAbort(
488
- router!.request(targetNodeRid, parts, timeoutMs, onAdmitted),
489
- signal
490
- );
491
- try {
492
- return decodeChannelReply<TReply>(replyParts, this.codecs);
493
- } finally {
494
- closeMessages(replyParts);
468
+ signal?.throwIfAborted();
469
+ const operation = this.requests.begin(timeoutMs, signal, existing);
470
+ const reply = this.requests.run<TReply>(
471
+ operation,
472
+ (receiver) => {
473
+ this.measureRequest(routerChannelId, operation);
474
+ operation.mapCaller(
475
+ (value) => {
476
+ traceTerminal('succeeded');
477
+ return value;
478
+ },
479
+ (error) => {
480
+ if (!isRemoteChannelErrorReply(error))
481
+ traceTerminal(requestTerminalResult(error, signal));
482
+ throw error;
483
+ }
484
+ );
485
+
486
+ const requestOperation = operation;
487
+ const router = this.sockets.routeRouter(routerChannelId);
488
+ if (this.sockets.routeMemberStatus(routerChannelId, targetNodeRid) === 'missing') {
489
+ throw createInternalFrameworkException(
490
+ ZLinkFrameworkInternalErrorKind.RequestTargetNotFound,
491
+ `Route channel '${routerChannelId}' has no member '${targetNodeRid}'.`
492
+ );
493
+ }
494
+ correlationId = newChannelCorrelationId();
495
+ const parts = encodeChannelEnvelopeParts(
496
+ ZLinkChannelMessageKind.Request,
497
+ routerChannelId,
498
+ packetName,
499
+ request,
500
+ timeoutMs,
501
+ undefined,
502
+ codecsForFrameworkPacket(packetName, this.codecs),
503
+ correlationId,
504
+ this.dispatchServices.flowCreationEnabled(),
505
+ metadata
506
+ ) as readonly Message[];
507
+ this.dispatchServices.beginOutbound(ZLinkMessageFlowOutcome.Sent)?.trace({
508
+ surface: ZLinkDispatchErrorSurface.RouteMeshChannel,
509
+ messageKind: ZLinkDispatchMessageKind.Request,
510
+ channelName: routerChannelId,
511
+ channelRouteKind: 'route_mesh',
512
+ packetName,
513
+ correlationId,
514
+ targetRid: targetNodeRid
515
+ });
516
+ router.request(targetNodeRid, parts, timeoutMs, onAdmitted, requestOperation, receiver);
517
+ },
518
+ (raw) => {
519
+ const replyParts = raw as readonly Message[];
520
+ try {
521
+ return decodeChannelReply<TReply>(replyParts, this.codecs);
522
+ } finally {
523
+ closeMessages(replyParts);
524
+ }
525
+ },
526
+ (error) => {
527
+ if (
528
+ this.sockets.routeMemberStatus(routerChannelId, targetNodeRid) === 'disconnected' &&
529
+ (isSubmitDeadline(error) || error instanceof ZLinkRouteDisconnectedError)
530
+ ) {
531
+ return createInternalFrameworkException(
532
+ ZLinkFrameworkInternalErrorKind.RouteNotConnected,
533
+ `Route channel '${routerChannelId}' member '${targetNodeRid}' is not connected.`,
534
+ true,
535
+ error
536
+ );
537
+ }
538
+ return error;
495
539
  }
496
- });
497
- traceTerminal('succeeded');
540
+ );
498
541
  return reply;
499
542
  } catch (error) {
500
- // See the ClientServer request path: the remote dispatch error owns this
501
- // terminal record when the reply itself is an Error envelope.
502
- if (!isRemoteChannelErrorReply(error)) {
503
- traceTerminal(requestTerminalResult(error, signal));
504
- }
505
- if (
506
- this.sockets.routeMemberStatus(routerChannelId, targetNodeRid) === 'disconnected' &&
507
- (isSubmitDeadline(error) || error instanceof ZLinkRouteDisconnectedError)
508
- ) {
509
- throw createInternalFrameworkException(
510
- ZLinkFrameworkInternalErrorKind.RouteNotConnected,
511
- `Route channel '${routerChannelId}' member '${targetNodeRid}' is not connected.`,
512
- true,
513
- error
514
- );
515
- }
516
- throw error;
543
+ if (!isRemoteChannelErrorReply(error)) traceTerminal(requestTerminalResult(error, signal));
544
+ return Promise.reject(error);
517
545
  }
518
546
  }
519
547
 
520
- private async measureRequest<T>(channel: string, operation: () => Promise<T>): Promise<T> {
548
+ private measureRequest(channel: string, operation: PendingOperation<unknown>): void {
521
549
  this.pendingRequests.set(channel, this.pendingRequestCount(channel) + 1);
522
- try {
523
- return await operation();
524
- } finally {
550
+ const complete = (): void => {
525
551
  const remaining = this.pendingRequestCount(channel) - 1;
526
552
  if (remaining === 0) this.pendingRequests.delete(channel);
527
553
  else this.pendingRequests.set(channel, remaining);
528
- }
554
+ };
555
+ operation.mapCaller(
556
+ (value) => {
557
+ complete();
558
+ return value;
559
+ },
560
+ (error) => {
561
+ complete();
562
+ throw error;
563
+ }
564
+ );
529
565
  }
530
566
  }
531
567
 
532
- /**
533
- * A ClientServer DEALER's request progress poller is intentionally unref'ed.
534
- * The public request promise is live work, however, so it needs its own
535
- * ref'ed handle until reply, cancellation, timeout, or failure settles it.
536
- */
537
- export function keepChannelRequestAlive<T>(request: Promise<T>): Promise<T> {
538
- const keepalive = setTimeout(() => {}, CHANNEL_REQUEST_LOOP_KEEPALIVE_MS);
539
- return request.finally(() => clearTimeout(keepalive));
540
- }
541
-
542
568
  function isSubmitDeadline(error: unknown): boolean {
543
569
  return (
544
570
  error instanceof ZLinkFrameworkException &&