@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
@@ -1,8 +1,11 @@
1
- import { ZLinkFrameworkException } from '../../contracts';
1
+ import { RequestRuntime } from '../foundation/request-runtime';
2
+ import type { PendingOperation, OperationObserver } from '../foundation/operation-registry';
3
+ import { identityRequestReply, type ZLinkRequestResult } from '../messaging/request-result';
4
+ import { ZLinkFrameworkErrorKind, ZLinkFrameworkException } from '../../contracts';
2
5
  import type { Message } from '../../contracts/Common/Message';
3
6
  import { DEFAULT_REQUEST_TIMEOUT_MS } from '../../contracts/Configuration/Registration';
4
7
  import { ZLinkSpotKind } from '../../contracts/Spots';
5
- import { throwIfAborted } from '../abort';
8
+ import { isAbortError, throwIfAborted } from '../abort';
6
9
  import type { ZLinkBackendMeshNode, ZLinkBackendSpot } from '../backend/contracts';
7
10
  import {
8
11
  closeMeshCompletion,
@@ -57,6 +60,7 @@ import type {
57
60
  import {
58
61
  ZLinkChannelMessageKind,
59
62
  decodeChannelReply,
63
+ closeMessages,
60
64
  encodeChannelEnvelopeParts,
61
65
  newChannelCorrelationId,
62
66
  type ZLinkChannelEnvelopeCodecRegistry
@@ -78,8 +82,9 @@ export interface ZLinkChannelClientTransport {
78
82
  timeoutMs: number | undefined,
79
83
  signal?: AbortSignal,
80
84
  metadata?: ReadonlyMap<string, string>,
81
- onAdmitted?: () => void
82
- ): Promise<TReply>;
85
+ onAdmitted?: () => void,
86
+ requestOperation?: PendingOperation<unknown>
87
+ ): ZLinkRequestResult<TReply>;
83
88
  tryPublish?(
84
89
  channelName: string,
85
90
  topic: string,
@@ -136,8 +141,9 @@ export interface ZLinkRouteClientTransport {
136
141
  timeoutMs: number | undefined,
137
142
  signal?: AbortSignal,
138
143
  metadata?: ReadonlyMap<string, string>,
139
- onAdmitted?: () => void
140
- ): Promise<TReply>;
144
+ onAdmitted?: () => void,
145
+ requestOperation?: PendingOperation<unknown>
146
+ ): ZLinkRequestResult<TReply>;
141
147
  submitToChannel(
142
148
  meshName: string,
143
149
  channelName: string,
@@ -153,8 +159,9 @@ export interface ZLinkRouteClientTransport {
153
159
  timeoutMs: number | undefined,
154
160
  signal?: AbortSignal,
155
161
  metadata?: ReadonlyMap<string, string>,
156
- onAdmitted?: () => void
157
- ): Promise<TReply>;
162
+ onAdmitted?: () => void,
163
+ requestOperation?: PendingOperation<unknown>
164
+ ): ZLinkRequestResult<TReply>;
158
165
  sendToSpot?(
159
166
  spotRouteTarget: ZLinkSpotRouteTarget,
160
167
  message: unknown,
@@ -169,11 +176,12 @@ export interface ZLinkRouteClientTransport {
169
176
  options: {
170
177
  readonly packetName?: string;
171
178
  readonly timeoutMs?: number;
179
+ readonly requestOperation?: PendingOperation<unknown>;
172
180
  readonly signal?: AbortSignal;
173
181
  readonly onAdmitted?: () => void;
174
182
  readonly metadata?: ReadonlyMap<string, string>;
175
183
  }
176
- ): Promise<TReply>;
184
+ ): ZLinkRequestResult<TReply>;
177
185
  }
178
186
 
179
187
  interface ZLinkChannelTransportRuntime {
@@ -190,8 +198,9 @@ interface ZLinkChannelTransportRuntime {
190
198
  timeoutMs: number | undefined,
191
199
  signal?: AbortSignal,
192
200
  metadata?: ReadonlyMap<string, string>,
193
- onAdmitted?: () => void
194
- ): Promise<TReply>;
201
+ onAdmitted?: () => void,
202
+ requestOperation?: PendingOperation<unknown>
203
+ ): ZLinkRequestResult<TReply>;
195
204
  tryPublish(
196
205
  channelName: string,
197
206
  topic: string,
@@ -224,7 +233,8 @@ interface ZLinkChannelTransportRuntime {
224
233
  timeoutMs: number | undefined,
225
234
  signal?: AbortSignal,
226
235
  metadata?: ReadonlyMap<string, string>,
227
- onAdmitted?: () => void
236
+ onAdmitted?: () => void,
237
+ requestOperation?: PendingOperation<unknown>
228
238
  ): Promise<TReply>;
229
239
  routeSendToSpot(
230
240
  spotRouteTarget: ZLinkSpotRouteTarget,
@@ -246,7 +256,9 @@ interface ZLinkChannelTransportRuntime {
246
256
  timeoutMs: number | undefined,
247
257
  signal?: AbortSignal,
248
258
  metadata?: ReadonlyMap<string, string>,
249
- onAdmitted?: () => void
259
+ onAdmitted?: () => void,
260
+ requestOperation?: PendingOperation<unknown>,
261
+ destination?: OperationObserver<unknown, unknown>
250
262
  ): Promise<TReply>;
251
263
  routeRequestFromSpotToSpot<TReply>(
252
264
  sourceSpot: ZLinkBackendSpot,
@@ -255,7 +267,9 @@ interface ZLinkChannelTransportRuntime {
255
267
  request: unknown,
256
268
  timeoutMs: number | undefined,
257
269
  signal?: AbortSignal,
258
- onAdmitted?: () => void
270
+ onAdmitted?: () => void,
271
+ requestOperation?: PendingOperation<unknown>,
272
+ destination?: OperationObserver<unknown, unknown>
259
273
  ): Promise<TReply>;
260
274
  routeRequestRawFromSpotToSpot(
261
275
  sourceSpot: ZLinkBackendSpot,
@@ -263,14 +277,16 @@ interface ZLinkChannelTransportRuntime {
263
277
  request: Message,
264
278
  timeoutMs: number | undefined,
265
279
  signal?: AbortSignal,
266
- onAdmitted?: () => void
280
+ onAdmitted?: () => void,
281
+ requestOperation?: PendingOperation<unknown>
267
282
  ): Promise<readonly Message[]>;
268
283
  routeRequestRawToSpot(
269
284
  spotRouteTarget: ZLinkSpotRouteTarget,
270
285
  request: Message,
271
286
  timeoutMs: number | undefined,
272
287
  signal?: AbortSignal,
273
- onAdmitted?: () => void
288
+ onAdmitted?: () => void,
289
+ requestOperation?: PendingOperation<unknown>
274
290
  ): Promise<readonly Message[]>;
275
291
  }
276
292
 
@@ -301,7 +317,8 @@ export class ZLinkRuntimeRouteTransport implements ZLinkRouteClientTransport {
301
317
  ) => ZLinkSubmitResult,
302
318
  private readonly metrics?: ZLinkRuntimeMetrics,
303
319
  private readonly flowCreationEnabled: () => boolean = () => true,
304
- private readonly outboundFlow: () => ZLinkMessageFlowTracer | undefined = () => undefined
320
+ private readonly outboundFlow: () => ZLinkMessageFlowTracer | undefined = () => undefined,
321
+ private readonly requests = new RequestRuntime()
305
322
  ) {}
306
323
 
307
324
  canRouteChannel(routerChannelId: string): boolean {
@@ -420,8 +437,9 @@ export class ZLinkRuntimeRouteTransport implements ZLinkRouteClientTransport {
420
437
  timeoutMs: number | undefined,
421
438
  signal?: AbortSignal,
422
439
  metadata?: ReadonlyMap<string, string>,
423
- onAdmitted?: () => void
424
- ): Promise<TReply> {
440
+ onAdmitted?: () => void,
441
+ requestOperation?: PendingOperation<unknown>
442
+ ): ZLinkRequestResult<TReply> {
425
443
  if (!this.flowCreationEnabled())
426
444
  return this.requestScoped<TReply>(
427
445
  meshName,
@@ -431,7 +449,8 @@ export class ZLinkRuntimeRouteTransport implements ZLinkRouteClientTransport {
431
449
  timeoutMs,
432
450
  signal,
433
451
  metadata,
434
- onAdmitted
452
+ onAdmitted,
453
+ requestOperation
435
454
  );
436
455
  return runWithOutboundFlow(true, () =>
437
456
  this.requestScoped<TReply>(
@@ -442,103 +461,138 @@ export class ZLinkRuntimeRouteTransport implements ZLinkRouteClientTransport {
442
461
  timeoutMs,
443
462
  signal,
444
463
  metadata,
445
- onAdmitted
464
+ onAdmitted,
465
+ requestOperation
446
466
  )
447
467
  );
448
468
  }
449
469
 
450
- private async requestScoped<TReply>(
470
+ private requestScoped<TReply>(
451
471
  meshName: string,
452
472
  targetNodeRid: string,
453
473
  packetName: string | undefined,
454
474
  request: unknown,
455
475
  timeoutMs: number | undefined,
456
- signal?: AbortSignal,
457
- metadata?: ReadonlyMap<string, string>,
458
- onAdmitted?: () => void
459
- ): Promise<TReply> {
476
+ signal: AbortSignal | undefined,
477
+ metadata: ReadonlyMap<string, string> | undefined,
478
+ onAdmitted: (() => void) | undefined,
479
+ existing?: PendingOperation<unknown>
480
+ ): ZLinkRequestResult<TReply> {
460
481
  const node = this.meshNode(meshName);
461
482
  if (node === undefined) {
462
- return this.requireManager().routeRequest(
463
- meshName,
464
- targetNodeRid,
465
- packetName,
466
- request,
467
- timeoutMs,
483
+ return this.requests.prepare<TReply>(
484
+ timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,
468
485
  signal,
469
- metadata,
470
- onAdmitted
486
+ (operation) => {
487
+ this.requireManager().routeRequest<TReply>(
488
+ meshName,
489
+ targetNodeRid,
490
+ packetName,
491
+ request,
492
+ timeoutMs,
493
+ signal,
494
+ metadata,
495
+ onAdmitted,
496
+ operation
497
+ );
498
+ },
499
+ (value) => value as TReply,
500
+ identityRequestReply,
501
+ existing
471
502
  );
472
503
  }
473
504
  const correlationId = newChannelCorrelationId();
474
- try {
475
- throwIfAborted(signal);
476
- if (node.isObjectClientNodeDirectTarget?.(toBackendRoutingId(targetNodeRid)) === true) {
477
- throw createInternalFrameworkException(
478
- ZLinkFrameworkInternalErrorKind.RequestTargetNotFound,
479
- `MeshNode '${meshName}' target '${targetNodeRid}' is an Object Client.`
505
+ const result = this.requests.prepare<TReply>(
506
+ timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,
507
+ signal,
508
+ (requestOperation, receiver) => {
509
+ requestOperation.mapCaller(
510
+ (value) => {
511
+ this.traceNodeRequest(
512
+ ZLinkMessageFlowOutcome.ReplyReceived,
513
+ 'succeeded',
514
+ meshName,
515
+ targetNodeRid,
516
+ packetName,
517
+ correlationId
518
+ );
519
+ return value;
520
+ },
521
+ (error) => {
522
+ if (!isRemoteChannelErrorReply(error))
523
+ this.traceNodeRequest(
524
+ ZLinkMessageFlowOutcome.ReplyReceived,
525
+ requestTerminalResult(error, signal),
526
+ meshName,
527
+ targetNodeRid,
528
+ packetName,
529
+ correlationId,
530
+ error
531
+ );
532
+ throw error;
533
+ }
480
534
  );
481
- }
482
- const parts = this.encodeMessage(
483
- ZLinkChannelMessageKind.Request,
484
- meshName,
485
- packetName,
486
- request,
487
- timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,
488
- metadata,
489
- correlationId
490
- );
491
- const requestOptions = { flags: 1, onAdmitted, timeoutMs: requestTimeoutBudget(timeoutMs) };
492
- let completion: ZLinkMeshCompletion;
493
- try {
494
- completion = await this.completionTable(meshName).submit(() => {
495
- const operationId = node.requestToNode(
496
- toBackendRoutingId(targetNodeRid),
497
- parts,
498
- requestOptions
535
+ throwIfAborted(signal);
536
+ if (node.isObjectClientNodeDirectTarget?.(toBackendRoutingId(targetNodeRid)) === true) {
537
+ throw createInternalFrameworkException(
538
+ ZLinkFrameworkInternalErrorKind.RequestTargetNotFound,
539
+ `MeshNode '${meshName}' target '${targetNodeRid}' is an Object Client.`
499
540
  );
500
- this.traceNodeRequest(
501
- ZLinkMessageFlowOutcome.Sent,
502
- undefined,
541
+ }
542
+ let parts: readonly MessageLike[] | undefined;
543
+ try {
544
+ parts = this.encodeMessage(
545
+ ZLinkChannelMessageKind.Request,
503
546
  meshName,
504
- targetNodeRid,
505
547
  packetName,
548
+ request,
549
+ timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,
550
+ metadata,
506
551
  correlationId
507
552
  );
508
- return operationId;
509
- }, signal);
510
- } catch (error) {
511
- throw mapMeshSubmissionError(
512
- error,
513
- `MeshNode '${meshName}' request to node '${targetNodeRid}'`
514
- );
515
- }
516
- const reply = this.decodeMeshReply<TReply>(meshName, completion);
517
- this.traceNodeRequest(
518
- ZLinkMessageFlowOutcome.ReplyReceived,
519
- 'succeeded',
520
- meshName,
521
- targetNodeRid,
522
- packetName,
523
- correlationId
524
- );
525
- return reply;
526
- } catch (error) {
527
- if (!isRemoteChannelErrorReply(error)) {
528
- this.traceNodeRequest(
529
- ZLinkMessageFlowOutcome.ReplyReceived,
530
- requestTerminalResult(error, signal),
531
- meshName,
532
- targetNodeRid,
533
- packetName,
534
- correlationId,
535
- error
536
- );
537
- }
538
- throw error;
539
- }
553
+ } catch (error) {
554
+ requestOperation.fail(error);
555
+ return;
556
+ }
557
+ try {
558
+ this.completionTable(meshName).submit(
559
+ (completion) => {
560
+ const operationId = node.requestToNode(
561
+ toBackendRoutingId(targetNodeRid),
562
+ parts!,
563
+ {
564
+ requestOperation,
565
+ flags: 1,
566
+ onAdmitted,
567
+ timeoutMs: requestTimeoutBudget(timeoutMs)
568
+ },
569
+ completion
570
+ );
571
+ this.traceNodeRequest(
572
+ ZLinkMessageFlowOutcome.Sent,
573
+ undefined,
574
+ meshName,
575
+ targetNodeRid,
576
+ packetName,
577
+ correlationId
578
+ );
579
+ return operationId;
580
+ },
581
+ signal,
582
+ requestOperation,
583
+ receiver
584
+ );
585
+ } finally {
586
+ parts = undefined;
587
+ }
588
+ },
589
+ (raw) => this.decodeMeshReply<TReply>(meshName, raw as ZLinkMeshCompletion),
590
+ (error) =>
591
+ mapMeshSubmissionError(error, `MeshNode '${meshName}' request to '${targetNodeRid}'`),
592
+ existing
593
+ );
594
+ return result;
540
595
  }
541
-
542
596
  private traceNodeRequest(
543
597
  outcome: ZLinkMessageFlowOutcome,
544
598
  result: ZLinkRuntimeMessageFlowResult | undefined,
@@ -612,8 +666,9 @@ export class ZLinkRuntimeRouteTransport implements ZLinkRouteClientTransport {
612
666
  timeoutMs: number | undefined,
613
667
  signal?: AbortSignal,
614
668
  metadata?: ReadonlyMap<string, string>,
615
- onAdmitted?: () => void
616
- ): Promise<TReply> {
669
+ onAdmitted?: () => void,
670
+ requestOperation?: PendingOperation<unknown>
671
+ ): ZLinkRequestResult<TReply> {
617
672
  if (!this.flowCreationEnabled())
618
673
  return this.requestToChannelScoped<TReply>(
619
674
  meshName,
@@ -623,7 +678,8 @@ export class ZLinkRuntimeRouteTransport implements ZLinkRouteClientTransport {
623
678
  timeoutMs,
624
679
  signal,
625
680
  metadata,
626
- onAdmitted
681
+ onAdmitted,
682
+ requestOperation
627
683
  );
628
684
  return runWithOutboundFlow(true, () =>
629
685
  this.requestToChannelScoped<TReply>(
@@ -634,61 +690,90 @@ export class ZLinkRuntimeRouteTransport implements ZLinkRouteClientTransport {
634
690
  timeoutMs,
635
691
  signal,
636
692
  metadata,
637
- onAdmitted
693
+ onAdmitted,
694
+ requestOperation
638
695
  )
639
696
  );
640
697
  }
641
698
 
642
- private async requestToChannelScoped<TReply>(
699
+ private requestToChannelScoped<TReply>(
643
700
  meshName: string,
644
701
  channelName: string,
645
702
  packetName: string | undefined,
646
703
  request: unknown,
647
704
  timeoutMs: number | undefined,
648
- signal?: AbortSignal,
649
- metadata?: ReadonlyMap<string, string>,
650
- onAdmitted?: () => void
651
- ): Promise<TReply> {
652
- throwIfAborted(signal);
653
- const node = this.requireMeshNode(meshName);
654
- const parts = this.encodeMessage(
655
- ZLinkChannelMessageKind.Request,
656
- channelName,
657
- packetName,
658
- request,
705
+ signal: AbortSignal | undefined,
706
+ metadata: ReadonlyMap<string, string> | undefined,
707
+ onAdmitted: (() => void) | undefined,
708
+ existing?: PendingOperation<unknown>
709
+ ): ZLinkRequestResult<TReply> {
710
+ let metric: ReturnType<ZLinkRuntimeMetrics['startRequest']> | undefined;
711
+ const result = this.requests.prepare<TReply>(
659
712
  timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,
660
- metadata
661
- );
662
- const metric = this.metrics?.startRequest(meshName, 'channel');
663
- try {
664
- const requestOptions = { flags: 1, timeoutMs: requestTimeoutBudget(timeoutMs), onAdmitted };
665
- let completion: ZLinkMeshCompletion;
666
- try {
667
- completion = await this.completionTable(meshName).submit(
668
- () => node.requestToChannel(channelName, parts, requestOptions),
669
- signal
713
+ signal,
714
+ (requestOperation, receiver) => {
715
+ requestOperation.mapCaller(
716
+ (value) => {
717
+ metric?.complete('completed');
718
+ return value;
719
+ },
720
+ (error) => {
721
+ metric?.complete(requestMetricOutcome(error, signal));
722
+ if (
723
+ error instanceof ZLinkFrameworkException &&
724
+ internalFrameworkErrorKind(error) ===
725
+ ZLinkFrameworkInternalErrorKind.RequestTargetNotFound
726
+ )
727
+ this.metrics?.recordChannelSelectionFailure(meshName, channelName, 'no_ready_target');
728
+ throw error;
729
+ }
670
730
  );
671
- } catch (error) {
672
- throw mapMeshSubmissionError(
673
- error,
674
- `MeshNode '${meshName}' request to channel '${channelName}'`
675
- );
676
- }
677
- const reply = this.decodeMeshReply<TReply>(meshName, completion);
678
- metric?.complete('completed');
679
- return reply;
680
- } catch (error) {
681
- metric?.complete(requestMetricOutcome(error, signal));
682
- if (
683
- error instanceof ZLinkFrameworkException &&
684
- internalFrameworkErrorKind(error) === ZLinkFrameworkInternalErrorKind.RequestTargetNotFound
685
- ) {
686
- this.metrics?.recordChannelSelectionFailure(meshName, channelName, 'no_ready_target');
687
- }
688
- throw error;
689
- }
731
+ throwIfAborted(signal);
732
+ const node = this.requireMeshNode(meshName);
733
+ let parts: readonly MessageLike[] | undefined;
734
+ try {
735
+ parts = this.encodeMessage(
736
+ ZLinkChannelMessageKind.Request,
737
+ channelName,
738
+ packetName,
739
+ request,
740
+ timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,
741
+ metadata
742
+ );
743
+ } catch (error) {
744
+ requestOperation.fail(error);
745
+ return;
746
+ }
747
+ metric = this.metrics?.startRequest(meshName, 'channel');
748
+ try {
749
+ this.completionTable(meshName).submit(
750
+ (completion) =>
751
+ node.requestToChannel(
752
+ channelName,
753
+ parts!,
754
+ {
755
+ requestOperation,
756
+ flags: 1,
757
+ timeoutMs: requestTimeoutBudget(timeoutMs),
758
+ onAdmitted
759
+ },
760
+ completion
761
+ ),
762
+ signal,
763
+ requestOperation,
764
+ receiver
765
+ );
766
+ } finally {
767
+ parts = undefined;
768
+ }
769
+ },
770
+ (raw) => this.decodeMeshReply<TReply>(meshName, raw as ZLinkMeshCompletion),
771
+ (error) =>
772
+ mapMeshSubmissionError(error, `MeshNode '${meshName}' channel '${channelName}' request`),
773
+ existing
774
+ );
775
+ return result;
690
776
  }
691
-
692
777
  sendToSpot(
693
778
  spotRouteTarget: ZLinkSpotRouteTarget,
694
779
  message: unknown,
@@ -782,104 +867,143 @@ export class ZLinkRuntimeRouteTransport implements ZLinkRouteClientTransport {
782
867
  requestToSpot<TReply = unknown>(
783
868
  spotRouteTarget: ZLinkSpotRouteTarget,
784
869
  request: unknown,
785
- options: ZLinkSpotRoutedRequestOptions
786
- ): Promise<TReply> {
870
+ options: ZLinkSpotRoutedRequestOptions,
871
+ destination?: OperationObserver<unknown, unknown>
872
+ ): ZLinkRequestResult<TReply> {
787
873
  return runWithOutboundFlow(this.flowCreationEnabled(), () =>
788
- this.requestToSpotScoped<TReply>(spotRouteTarget, request, options)
874
+ this.requestToSpotScoped<TReply>(spotRouteTarget, request, options, destination)
789
875
  );
790
876
  }
791
877
 
792
- private async requestToSpotScoped<TReply = unknown>(
878
+ private requestToSpotScoped<TReply = unknown>(
793
879
  spotRouteTarget: ZLinkSpotRouteTarget,
794
880
  request: unknown,
795
- options: ZLinkSpotRoutedRequestOptions
796
- ): Promise<TReply> {
881
+ options: ZLinkSpotRoutedRequestOptions,
882
+ destination?: OperationObserver<unknown, unknown>
883
+ ): ZLinkRequestResult<TReply> {
797
884
  const meshName = spotRouteTarget.routerChannelId;
798
885
  const node = this.meshNode(meshName);
799
886
  if (node === undefined) {
800
- if (spotRouteTarget.spotKind === ZLinkSpotKind.Instance) {
887
+ if (spotRouteTarget.spotKind === ZLinkSpotKind.Instance)
801
888
  throw new ZLinkConfigurationException(
802
889
  'Instance Spot routes require the MeshNode command 39 transport.'
803
890
  );
804
- }
805
- return this.requireManager().routeRequestToSpot<TReply>(
806
- spotRouteTarget,
807
- options.packetName,
808
- request,
809
- options.timeoutMs,
891
+ return this.requests.prepare<TReply>(
892
+ options.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,
810
893
  options.signal,
811
- options.metadata,
812
- options.onAdmitted
813
- );
814
- }
815
- throwIfAborted(options.signal);
816
- let completionPromise: Promise<ZLinkMeshCompletion>;
817
- try {
818
- const encoded = this.encodeMessage(
819
- ZLinkChannelMessageKind.Request,
820
- meshName,
821
- options.packetName,
822
- request,
823
- options.timeoutMs,
824
- options.metadata
825
- );
826
- completionPromise = this.completionTable(meshName).submit(
827
- () =>
828
- spotRouteTarget.spotKind === ZLinkSpotKind.Instance
829
- ? node.requestInstanceSpot(
830
- instanceSpotRouteFence(spotRouteTarget),
831
- encoded,
832
- options.timeoutMs,
833
- undefined,
834
- options.metadata,
835
- options.instanceSpot,
836
- options.onAdmitted
837
- )
838
- : node
839
- .entrySpot()
840
- .requestToSpot(
841
- toBackendRoutingId(spotRouteTarget.targetNodeRid),
842
- toBackendRoutingId(spotRouteTarget.spotId),
843
- spotRouteTarget.targetSpotGeneration ?? 0n,
844
- encoded,
845
- {
846
- flags: 1,
847
- onAdmitted: options.onAdmitted,
848
- timeoutMs: options.timeoutMs,
849
- routeFence: directSpotRouteFence(spotRouteTarget),
850
- entrySpot: spotRouteTarget.spotKind === ZLinkSpotKind.Entry
851
- }
852
- ),
853
- options.signal
854
- );
855
- } catch (error) {
856
- throw mapMeshSubmissionError(
857
- error,
858
- `MeshNode '${meshName}' request to Spot '${spotRouteTarget.spotId}'`
894
+ (operation, receiver) => {
895
+ this.requireManager().routeRequestToSpot<TReply>(
896
+ spotRouteTarget,
897
+ options.packetName,
898
+ request,
899
+ options.timeoutMs,
900
+ options.signal,
901
+ options.metadata,
902
+ options.onAdmitted,
903
+ operation,
904
+ receiver
905
+ );
906
+ },
907
+ (value) => value as TReply,
908
+ identityRequestReply,
909
+ options.requestOperation,
910
+ destination
859
911
  );
860
912
  }
861
- return this.waitForMeshReply<TReply>(meshName, completionPromise);
913
+ return this.requests.prepare<TReply>(
914
+ options.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,
915
+ options.signal,
916
+ (requestOperation, receiver) => {
917
+ try {
918
+ throwIfAborted(options.signal);
919
+ const encoded = this.encodeMessage(
920
+ ZLinkChannelMessageKind.Request,
921
+ meshName,
922
+ options.packetName,
923
+ request,
924
+ options.timeoutMs,
925
+ options.metadata
926
+ );
927
+ this.completionTable(meshName).submit(
928
+ (completion) =>
929
+ spotRouteTarget.spotKind === ZLinkSpotKind.Instance
930
+ ? node.requestInstanceSpot(
931
+ instanceSpotRouteFence(spotRouteTarget),
932
+ encoded,
933
+ options.timeoutMs,
934
+ undefined,
935
+ options.metadata,
936
+ options.instanceSpot,
937
+ options.onAdmitted,
938
+ requestOperation,
939
+ completion
940
+ )
941
+ : node.entrySpot().requestToSpot(
942
+ toBackendRoutingId(spotRouteTarget.targetNodeRid),
943
+ toBackendRoutingId(spotRouteTarget.spotId),
944
+ spotRouteTarget.targetSpotGeneration ?? 0n,
945
+ encoded,
946
+ {
947
+ flags: 1,
948
+ onAdmitted: options.onAdmitted,
949
+ timeoutMs: options.timeoutMs,
950
+ requestOperation,
951
+ routeFence: directSpotRouteFence(spotRouteTarget),
952
+ entrySpot: spotRouteTarget.spotKind === ZLinkSpotKind.Entry
953
+ },
954
+ completion
955
+ ),
956
+ options.signal,
957
+ requestOperation,
958
+ receiver
959
+ );
960
+ } catch (error) {
961
+ receiver.operationFailed(requestOperation.id, error, undefined);
962
+ }
963
+ },
964
+ (raw) => this.decodeMeshReply<TReply>(meshName, raw as ZLinkMeshCompletion),
965
+ (error) =>
966
+ mapMeshSubmissionError(
967
+ error,
968
+ `MeshNode '${meshName}' request to Spot '${spotRouteTarget.spotId}'`
969
+ ),
970
+ options.requestOperation,
971
+ destination
972
+ );
862
973
  }
863
-
864
- async requestFromSpotToSpot<TReply = unknown>(
974
+ requestFromSpotToSpot<TReply = unknown>(
865
975
  sourceSpot: ZLinkBackendSpot,
866
976
  spotRouteTarget: ZLinkSpotRouteTarget,
867
977
  request: unknown,
868
978
  options: {
869
979
  readonly packetName?: string;
870
980
  readonly timeoutMs?: number;
981
+ readonly requestOperation?: PendingOperation<unknown>;
871
982
  readonly signal?: AbortSignal;
872
983
  readonly onAdmitted?: () => void;
873
- }
874
- ): Promise<TReply> {
875
- return this.requireManager().routeRequestFromSpotToSpot<TReply>(
876
- sourceSpot,
877
- spotRouteTarget,
878
- options.packetName,
879
- request,
880
- options.timeoutMs,
984
+ },
985
+ destination?: OperationObserver<unknown, unknown>
986
+ ): ZLinkRequestResult<TReply> {
987
+ return this.requests.prepare<TReply>(
988
+ options.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,
881
989
  options.signal,
882
- options.onAdmitted
990
+ (operation, receiver) => {
991
+ this.requireManager().routeRequestFromSpotToSpot<TReply>(
992
+ sourceSpot,
993
+ spotRouteTarget,
994
+ options.packetName,
995
+ request,
996
+ options.timeoutMs,
997
+ options.signal,
998
+ options.onAdmitted,
999
+ operation,
1000
+ receiver
1001
+ );
1002
+ },
1003
+ (value) => value as TReply,
1004
+ identityRequestReply,
1005
+ options.requestOperation,
1006
+ destination
883
1007
  );
884
1008
  }
885
1009
 
@@ -889,6 +1013,7 @@ export class ZLinkRuntimeRouteTransport implements ZLinkRouteClientTransport {
889
1013
  request: Message,
890
1014
  options: {
891
1015
  readonly timeoutMs?: number;
1016
+ readonly requestOperation?: PendingOperation<unknown>;
892
1017
  readonly signal?: AbortSignal;
893
1018
  readonly onAdmitted?: () => void;
894
1019
  }
@@ -899,7 +1024,8 @@ export class ZLinkRuntimeRouteTransport implements ZLinkRouteClientTransport {
899
1024
  request,
900
1025
  options.timeoutMs,
901
1026
  options.signal,
902
- options.onAdmitted
1027
+ options.onAdmitted,
1028
+ options.requestOperation
903
1029
  );
904
1030
  }
905
1031
 
@@ -908,6 +1034,7 @@ export class ZLinkRuntimeRouteTransport implements ZLinkRouteClientTransport {
908
1034
  request: Message,
909
1035
  options: {
910
1036
  readonly timeoutMs?: number;
1037
+ readonly requestOperation?: PendingOperation<unknown>;
911
1038
  readonly signal?: AbortSignal;
912
1039
  readonly onAdmitted?: () => void;
913
1040
  }
@@ -922,74 +1049,75 @@ export class ZLinkRuntimeRouteTransport implements ZLinkRouteClientTransport {
922
1049
  request: Message,
923
1050
  options: {
924
1051
  readonly timeoutMs?: number;
1052
+ readonly requestOperation?: PendingOperation<unknown>;
925
1053
  readonly signal?: AbortSignal;
926
1054
  readonly onAdmitted?: () => void;
927
1055
  }
928
1056
  ): Promise<readonly Message[]> {
929
1057
  const meshName = spotRouteTarget.routerChannelId;
930
1058
  const node = this.meshNode(meshName);
931
- if (node !== undefined) {
932
- throwIfAborted(options.signal);
933
- const payload = JSON.parse(request.getString('utf8')) as Record<string, unknown>;
934
- const packetName = typeof payload.packetName === 'string' ? payload.packetName : undefined;
935
- const parts = this.encodeMessage(
936
- ZLinkChannelMessageKind.Request,
937
- meshName,
938
- packetName,
939
- payload,
940
- options.timeoutMs
1059
+ if (node === undefined)
1060
+ return this.requireManager().routeRequestRawToSpot(
1061
+ spotRouteTarget,
1062
+ request,
1063
+ options.timeoutMs,
1064
+ options.signal,
1065
+ options.onAdmitted,
1066
+ options.requestOperation
941
1067
  );
942
- let completionPromise: Promise<ZLinkMeshCompletion>;
943
- try {
944
- completionPromise = this.completionTable(meshName).submit(
945
- () =>
946
- node
947
- .entrySpot()
948
- .requestToSpot(
949
- toBackendRoutingId(spotRouteTarget.targetNodeRid),
950
- toBackendRoutingId(spotRouteTarget.spotId),
951
- spotRouteTarget.targetSpotGeneration ?? 0n,
952
- parts,
953
- {
954
- flags: 1,
955
- onAdmitted: options.onAdmitted,
956
- timeoutMs: options.timeoutMs,
957
- routeFence: directSpotRouteFence(spotRouteTarget),
958
- entrySpot: spotRouteTarget.spotKind === ZLinkSpotKind.Entry
959
- }
960
- ),
961
- options.signal
1068
+ const operation = this.requests.begin(
1069
+ options.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,
1070
+ options.signal,
1071
+ options.requestOperation
1072
+ );
1073
+ return this.requests.run<readonly Message[]>(
1074
+ operation,
1075
+ (receiver) => {
1076
+ throwIfAborted(options.signal);
1077
+ const payload = JSON.parse(request.getString('utf8')) as Record<string, unknown>;
1078
+ const packetName = typeof payload.packetName === 'string' ? payload.packetName : undefined;
1079
+ const parts = this.encodeMessage(
1080
+ ZLinkChannelMessageKind.Request,
1081
+ meshName,
1082
+ packetName,
1083
+ payload,
1084
+ options.timeoutMs
962
1085
  );
963
- } catch (error) {
964
- throw mapMeshSubmissionError(
1086
+ this.completionTable(meshName).submit(
1087
+ (completion) =>
1088
+ node.entrySpot().requestToSpot(
1089
+ toBackendRoutingId(spotRouteTarget.targetNodeRid),
1090
+ toBackendRoutingId(spotRouteTarget.spotId),
1091
+ spotRouteTarget.targetSpotGeneration ?? 0n,
1092
+ parts,
1093
+ {
1094
+ flags: 1,
1095
+ onAdmitted: options.onAdmitted,
1096
+ timeoutMs: options.timeoutMs,
1097
+ requestOperation: operation,
1098
+ routeFence: directSpotRouteFence(spotRouteTarget),
1099
+ entrySpot: spotRouteTarget.spotKind === ZLinkSpotKind.Entry
1100
+ },
1101
+ completion
1102
+ ),
1103
+ options.signal,
1104
+ operation,
1105
+ receiver
1106
+ );
1107
+ },
1108
+ (raw) => {
1109
+ const reply = this.decodeMeshReply<unknown>(meshName, raw as ZLinkMeshCompletion);
1110
+ const parts = [ZLinkBufferMessage.fromOwned(Buffer.from(JSON.stringify(reply)))];
1111
+ if (!operation.isPending()) closeMessages(parts);
1112
+ return parts;
1113
+ },
1114
+ (error) =>
1115
+ mapMeshSubmissionError(
965
1116
  error,
966
1117
  `MeshNode '${meshName}' raw request to Spot '${spotRouteTarget.spotId}'`
967
- );
968
- }
969
- const completion = await completionPromise;
970
- if (completion.terminalResult !== 0 || completion.failureErrno !== 0) {
971
- try {
972
- throw meshRequestFailure(meshName, completion.terminalResult, completion.failureErrno);
973
- } finally {
974
- closeMeshCompletion(completion);
975
- }
976
- }
977
- try {
978
- const reply = decodeChannelReply<unknown>(completion.parts, this.codecs);
979
- return [ZLinkBufferMessage.fromOwned(Buffer.from(JSON.stringify(reply)))];
980
- } finally {
981
- closeMeshCompletion(completion);
982
- }
983
- }
984
- return this.requireManager().routeRequestRawToSpot(
985
- spotRouteTarget,
986
- request,
987
- options.timeoutMs,
988
- options.signal,
989
- options.onAdmitted
1118
+ )
990
1119
  );
991
1120
  }
992
-
993
1121
  private requireManager(): ZLinkChannelTransportRuntime {
994
1122
  const manager = this.manager();
995
1123
  if (manager === undefined) {
@@ -999,7 +1127,9 @@ export class ZLinkRuntimeRouteTransport implements ZLinkRouteClientTransport {
999
1127
  }
1000
1128
 
1001
1129
  private meshNode(meshName: string): ZLinkBackendMeshNode | undefined {
1002
- return this.meshRuntime?.()?.meshNode?.(meshName);
1130
+ const runtime = this.meshRuntime?.();
1131
+ if (runtime === undefined) this.requireManager();
1132
+ return runtime?.meshNode?.(meshName);
1003
1133
  }
1004
1134
 
1005
1135
  private isKnownBackendPeer(node: ZLinkBackendMeshNode, targetNodeRid: string): boolean {
@@ -1067,14 +1197,6 @@ export class ZLinkRuntimeRouteTransport implements ZLinkRouteClientTransport {
1067
1197
  );
1068
1198
  }
1069
1199
 
1070
- private async waitForMeshReply<TReply>(
1071
- meshName: string,
1072
- completionPromise: Promise<ZLinkMeshCompletion>
1073
- ): Promise<TReply> {
1074
- const completion = await completionPromise;
1075
- return this.decodeMeshReply<TReply>(meshName, completion);
1076
- }
1077
-
1078
1200
  private decodeMeshReply<TReply>(meshName: string, completion: ZLinkMeshCompletion): TReply {
1079
1201
  try {
1080
1202
  if (completion.terminalResult !== 0 || completion.failureErrno !== 0) {
@@ -1160,7 +1282,7 @@ function mapMeshSubmitResult(result: number): ZLinkSubmitResult {
1160
1282
  return classifySubmitResult(result, 'Mesh submission');
1161
1283
  }
1162
1284
 
1163
- function mapMeshSubmissionError(error: unknown, operation: string): Error {
1285
+ function mapMeshSubmissionError(error: unknown, operation: string): unknown {
1164
1286
  if (error instanceof ZLinkFrameworkException) {
1165
1287
  return error;
1166
1288
  }
@@ -1196,12 +1318,17 @@ function mapMeshSubmissionError(error: unknown, operation: string): Error {
1196
1318
  error
1197
1319
  );
1198
1320
  }
1199
- return createInternalFrameworkException(
1200
- ZLinkFrameworkInternalErrorKind.RouteNotConnected,
1201
- `${operation} failed before native submission completed: ${
1202
- error instanceof Error ? error.message : String(error)
1203
- }`,
1204
- true,
1321
+ if (
1322
+ isAbortError(error) ||
1323
+ error instanceof ZLinkConfigurationException ||
1324
+ error instanceof TypeError ||
1325
+ error instanceof RangeError
1326
+ ) {
1327
+ return error;
1328
+ }
1329
+ return new ZLinkFrameworkException(
1330
+ ZLinkFrameworkErrorKind.InternalFailure,
1331
+ `${operation} failed.`,
1205
1332
  error
1206
1333
  );
1207
1334
  }