@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
@@ -7,15 +7,13 @@ import {
7
7
  type ZLinkDispatchFailure
8
8
  } from '../../contracts/Dispatch/ZLinkDispatchOptions';
9
9
  import {
10
- type ZLinkRuntimeMetrics,
11
10
  DEFAULT_ZLINK_DIAGNOSTICS,
12
11
  ZLinkMessageFlowTracer,
13
12
  type ZLinkDiagnosticsContext
14
- } from '../diagnostics';
13
+ } from '../diagnostics/message-flow';
15
14
 
16
15
  import { dispatchErrorDetails } from '../diagnostics/dispatch-error-details';
17
- import type { ZLinkDispatchErrorSink } from '../diagnostics/dispatch-error-port';
18
- import { METRIC_NAMES } from '../diagnostics/runtime-metrics';
16
+ import { METRIC_NAMES, type ZLinkRuntimeMetrics } from '../diagnostics/runtime-metrics';
19
17
 
20
18
  export type { ZLinkDispatchErrorSink } from '../diagnostics/dispatch-error-port';
21
19
 
@@ -29,14 +27,11 @@ export class ZLinkDispatchErrorReporter {
29
27
  /**
30
28
  * Success-path tracer companion: every surface already receives a reporter, so
31
29
  * exposing the flow tracer here wires all dispatch sites without threading a new
32
- * parameter. Shares the same diagnostics context (live mode) and error sink.
30
+ * parameter. Shares the diagnostics context and host submission lease.
33
31
  */
34
32
  readonly flow: ZLinkMessageFlowTracer;
35
33
 
36
34
  constructor(
37
- _observerType: undefined,
38
- _providerResolver: unknown,
39
- errorSink: ZLinkDispatchErrorSink,
40
35
  ctx?: ZLinkDiagnosticsContext,
41
36
  readonly metrics?: ZLinkRuntimeMetrics
42
37
  ) {
@@ -45,7 +40,7 @@ export class ZLinkDispatchErrorReporter {
45
40
  liveMode: { mode: 'errors' },
46
41
  sourceMeshGeneration: 0n
47
42
  };
48
- this.flow = new ZLinkMessageFlowTracer(flowCtx, errorSink);
43
+ this.flow = new ZLinkMessageFlowTracer(flowCtx);
49
44
  }
50
45
 
51
46
  report(event: ZLinkRuntimeDispatchFailure): void {
@@ -1,3 +1,5 @@
1
+ import { RequestRuntime } from '../foundation/request-runtime';
2
+ import type { PendingOperation, OperationObserver } from '../foundation/operation-registry';
1
3
  import type { RoutingId } from '../../contracts';
2
4
  import { ZLinkConfigurationException } from '../configuration';
3
5
  import type { ZLinkLocalSpotRouteDispatcher } from './spot-route-dispatch-strategy';
@@ -5,7 +7,8 @@ import type { ZLinkLocalSpotRouteDispatcher } from './spot-route-dispatch-strate
5
7
  export class ZLinkLocalSpotRouteTransport {
6
8
  constructor(
7
9
  private readonly dispatcher: ZLinkLocalSpotRouteDispatcher | undefined,
8
- private readonly defaultRequestTimeoutMs: number | undefined
10
+ private readonly defaultRequestTimeoutMs: number | undefined,
11
+ private readonly requests = new RequestRuntime()
9
12
  ) {}
10
13
 
11
14
  async send(
@@ -33,40 +36,35 @@ export class ZLinkLocalSpotRouteTransport {
33
36
  request: unknown,
34
37
  timeoutMs: number | undefined,
35
38
  signal?: AbortSignal,
36
- onAdmitted?: () => void
39
+ onAdmitted?: () => void,
40
+ existing?: PendingOperation<unknown>,
41
+ destination?: OperationObserver<unknown, unknown>
37
42
  ): Promise<TReply> {
38
43
  if (this.dispatcher === undefined) {
39
44
  throw new ZLinkConfigurationException(
40
45
  `Route channel '${routerChannelId}' could not dispatch local SPOT request.`
41
46
  );
42
47
  }
43
- const pending = this.dispatcher.request<TReply>(spotId, packetName, request, {
44
- channelName: routerChannelId,
45
- onAdmitted,
46
- signal
47
- });
48
48
  const effectiveTimeoutMs = timeoutMs ?? this.defaultRequestTimeoutMs;
49
- if (effectiveTimeoutMs === undefined) return pending;
50
- return new Promise<TReply>((resolve, reject) => {
51
- const timeout = setTimeout(
52
- () =>
53
- reject(
54
- new ZLinkConfigurationException(
55
- `Route channel '${routerChannelId}' local SPOT request timed out.`
56
- )
57
- ),
58
- effectiveTimeoutMs
59
- );
60
- pending.then(
61
- (value) => {
62
- clearTimeout(timeout);
63
- resolve(value);
64
- },
65
- (error) => {
66
- clearTimeout(timeout);
67
- reject(error);
68
- }
69
- );
70
- });
49
+ const dispatcher = this.dispatcher;
50
+ const operation = this.requests.begin(effectiveTimeoutMs, signal, existing);
51
+ return this.requests.run<TReply>(
52
+ operation,
53
+ (receiver) => {
54
+ const work = dispatcher.request<TReply>(spotId, packetName, request, {
55
+ channelName: routerChannelId,
56
+ onAdmitted,
57
+ signal,
58
+ requestOperation: operation
59
+ });
60
+ void work.then(
61
+ (value) => receiver.operationCompleted(operation.id, value, undefined),
62
+ (error) => receiver.operationFailed(operation.id, error, undefined)
63
+ );
64
+ },
65
+ (value) => value as TReply,
66
+ (error) => error,
67
+ destination
68
+ );
71
69
  }
72
70
  }
@@ -1,7 +1,8 @@
1
+ import { RequestRuntime } from '../foundation/request-runtime';
2
+ import type { PendingOperation, OperationObserver } from '../foundation/operation-registry';
1
3
  import type { Message } from '../../contracts/Common/Message';
2
4
  import type { ZLinkBackendSendFlags } from '../backend/contracts';
3
5
  import type { ZLinkSpotRouteTarget } from '../spots/spot-routing-internal';
4
- import { awaitWithAbort } from '../abort';
5
6
  import {
6
7
  closeMessages,
7
8
  decodeChannelReply,
@@ -10,7 +11,10 @@ import {
10
11
  import type { ZLinkChannelSocketRegistry } from './channel-socket-registry';
11
12
 
12
13
  export class ZLinkRouterSocketSpotRouteTransport {
13
- constructor(private readonly sockets: ZLinkChannelSocketRegistry) {}
14
+ constructor(
15
+ private readonly sockets: ZLinkChannelSocketRegistry,
16
+ private readonly requests = new RequestRuntime()
17
+ ) {}
14
18
 
15
19
  async send(
16
20
  target: ZLinkSpotRouteTarget,
@@ -25,52 +29,79 @@ export class ZLinkRouterSocketSpotRouteTransport {
25
29
  }
26
30
  }
27
31
 
28
- async request<TReply>(
32
+ request<TReply>(
29
33
  target: ZLinkSpotRouteTarget,
30
34
  parts: readonly Message[],
31
35
  codecs: ZLinkChannelEnvelopeCodecRegistry | undefined,
32
36
  flags: ZLinkBackendSendFlags,
33
37
  timeoutMs: number | undefined,
34
38
  signal?: AbortSignal,
35
- onAdmitted?: () => void
39
+ onAdmitted?: () => void,
40
+ existing?: PendingOperation<unknown>,
41
+ destination?: OperationObserver<unknown, unknown>
36
42
  ): Promise<TReply> {
37
- const router = this.sockets.routeRouter(target.routerChannelId);
38
- void flags;
39
- const operation = router.requestToSpot(
40
- target.targetNodeRid,
41
- target.spotId,
42
- parts,
43
- timeoutMs,
44
- onAdmitted
45
- );
46
- const replyParts = await awaitWithAbort(operation, signal, () => {
47
- void operation.then(closeMessages, () => undefined);
48
- });
49
43
  try {
50
- return decodeChannelReply<TReply>(replyParts, codecs);
51
- } finally {
52
- closeMessages(replyParts);
53
- closeMessages(parts);
44
+ const operation = this.requests.begin(timeoutMs, signal, existing);
45
+ return this.requests.run<TReply>(
46
+ operation,
47
+ (receiver) => {
48
+ const router = this.sockets.routeRouter(target.routerChannelId);
49
+ void flags;
50
+ router.requestToSpot(
51
+ target.targetNodeRid,
52
+ target.spotId,
53
+ parts,
54
+ timeoutMs,
55
+ onAdmitted,
56
+ operation,
57
+ receiver
58
+ );
59
+ },
60
+ (value) => {
61
+ const replyParts = value as readonly Message[];
62
+ try {
63
+ return decodeChannelReply<TReply>(replyParts, codecs);
64
+ } finally {
65
+ closeMessages(replyParts);
66
+ closeMessages(parts);
67
+ }
68
+ },
69
+ (error) => error,
70
+ destination
71
+ );
72
+ } catch (error) {
73
+ return Promise.reject(error);
54
74
  }
55
75
  }
56
-
57
76
  async requestRaw(
58
77
  target: ZLinkSpotRouteTarget,
59
78
  request: Message,
60
79
  timeoutMs: number | undefined,
61
80
  signal?: AbortSignal,
62
- onAdmitted?: () => void
81
+ onAdmitted?: () => void,
82
+ existing?: PendingOperation<unknown>
63
83
  ): Promise<readonly Message[]> {
64
- const router = this.sockets.routeRouter(target.routerChannelId);
65
- const operation = router.requestToSpot(
66
- target.targetNodeRid,
67
- target.spotId,
68
- [request],
69
- timeoutMs,
70
- onAdmitted
84
+ const operation = this.requests.begin(timeoutMs, signal, existing);
85
+ return this.requests.run<readonly Message[]>(
86
+ operation,
87
+ (receiver) => {
88
+ const router = this.sockets.routeRouter(target.routerChannelId);
89
+ router.requestToSpot(
90
+ target.targetNodeRid,
91
+ target.spotId,
92
+ [request],
93
+ timeoutMs,
94
+ onAdmitted,
95
+ operation,
96
+ receiver
97
+ );
98
+ },
99
+ (value) => {
100
+ const replyParts = value as readonly Message[];
101
+ if (!operation.isPending()) closeMessages(replyParts);
102
+ return replyParts;
103
+ },
104
+ (error) => error
71
105
  );
72
- return await awaitWithAbort(operation, signal, () => {
73
- void operation.then(closeMessages, () => undefined);
74
- });
75
106
  }
76
107
  }
@@ -1,49 +1,70 @@
1
+ import { RequestRuntime } from '../foundation/request-runtime';
2
+ import type { PendingOperation, OperationObserver } from '../foundation/operation-registry';
1
3
  import type { Message } from '../../contracts/Common/Message';
2
4
  import type { ZLinkBackendSpot } from '../backend/contracts';
3
5
  import type { ZLinkSpotRouteTarget } from '../spots/spot-routing-internal';
4
- import { awaitWithAbort, throwIfAborted } from '../abort';
6
+ import { throwIfAborted } from '../abort';
5
7
  import { closeMessages, ZLinkChannelMessageKind } from './channel-envelope';
6
8
  import { decodeSpotDirectReply, encodeSpotDirectEnvelope } from './spot-direct-envelope';
7
9
 
8
10
  export class ZLinkSourceSpotRouter {
9
- constructor(private readonly defaultRequestTimeoutMs: number | undefined) {}
11
+ constructor(
12
+ private readonly defaultRequestTimeoutMs: number | undefined,
13
+ private readonly requests = new RequestRuntime()
14
+ ) {}
10
15
 
11
- async request<TReply>(
16
+ request<TReply>(
12
17
  sourceSpot: ZLinkBackendSpot,
13
18
  target: ZLinkSpotRouteTarget,
14
19
  packetName: string | undefined,
15
20
  request: unknown,
16
21
  timeoutMs: number | undefined,
17
22
  signal?: AbortSignal,
18
- onAdmitted?: () => void
23
+ onAdmitted?: () => void,
24
+ existing?: PendingOperation<unknown>,
25
+ destination?: OperationObserver<unknown, unknown>
19
26
  ): Promise<TReply> {
20
- throwIfAborted(signal);
21
- const parts = [
22
- encodeSpotDirectEnvelope(
23
- ZLinkChannelMessageKind.Request,
24
- target.routerChannelId,
25
- packetName,
26
- request
27
- )
28
- ] as readonly Message[];
29
- const operation = sourceSpot.requestToSpot(
30
- target.targetNodeRid,
31
- target.spotId,
32
- parts,
27
+ let parts: readonly Message[];
28
+ const operation = this.requests.begin(
33
29
  timeoutMs ?? this.defaultRequestTimeoutMs,
34
- onAdmitted
30
+ signal,
31
+ existing
32
+ );
33
+ return this.requests.run<TReply>(
34
+ operation,
35
+ (receiver) => {
36
+ throwIfAborted(signal);
37
+ parts = [
38
+ encodeSpotDirectEnvelope(
39
+ ZLinkChannelMessageKind.Request,
40
+ target.routerChannelId,
41
+ packetName,
42
+ request
43
+ )
44
+ ] as readonly Message[];
45
+ sourceSpot.requestToSpot(
46
+ target.targetNodeRid,
47
+ target.spotId,
48
+ parts,
49
+ timeoutMs ?? this.defaultRequestTimeoutMs,
50
+ onAdmitted,
51
+ operation,
52
+ receiver
53
+ );
54
+ },
55
+ (value) => {
56
+ const replyParts = value as readonly Message[];
57
+ try {
58
+ return decodeSpotDirectReply<TReply>(replyParts);
59
+ } finally {
60
+ closeMessages(replyParts);
61
+ closeMessages(parts);
62
+ }
63
+ },
64
+ (error) => error,
65
+ destination
35
66
  );
36
- const replyParts = await awaitWithAbort(operation, signal, () => {
37
- void operation.then(closeMessages, () => undefined);
38
- });
39
- try {
40
- return decodeSpotDirectReply<TReply>(replyParts);
41
- } finally {
42
- closeMessages(replyParts);
43
- closeMessages(parts);
44
- }
45
67
  }
46
-
47
68
  async send(
48
69
  sourceSpot: ZLinkBackendSpot,
49
70
  target: ZLinkSpotRouteTarget,
@@ -73,18 +94,34 @@ export class ZLinkSourceSpotRouter {
73
94
  request: Message,
74
95
  timeoutMs: number | undefined,
75
96
  signal?: AbortSignal,
76
- onAdmitted?: () => void
97
+ onAdmitted?: () => void,
98
+ existing?: PendingOperation<unknown>
77
99
  ): Promise<readonly Message[]> {
78
- throwIfAborted(signal);
79
- const operation = sourceSpot.requestToSpot(
80
- target.targetNodeRid,
81
- target.spotId,
82
- request,
100
+ const operation = this.requests.begin(
83
101
  timeoutMs ?? this.defaultRequestTimeoutMs,
84
- onAdmitted
102
+ signal,
103
+ existing
104
+ );
105
+ return this.requests.run<readonly Message[]>(
106
+ operation,
107
+ (receiver) => {
108
+ throwIfAborted(signal);
109
+ sourceSpot.requestToSpot(
110
+ target.targetNodeRid,
111
+ target.spotId,
112
+ request,
113
+ timeoutMs ?? this.defaultRequestTimeoutMs,
114
+ onAdmitted,
115
+ operation,
116
+ receiver
117
+ );
118
+ },
119
+ (value) => {
120
+ const replyParts = value as readonly Message[];
121
+ if (!operation.isPending()) closeMessages(replyParts);
122
+ return replyParts;
123
+ },
124
+ (error) => error
85
125
  );
86
- return await awaitWithAbort(operation, signal, () => {
87
- void operation.then(closeMessages, () => undefined);
88
- });
89
126
  }
90
127
  }
@@ -1,7 +1,8 @@
1
- import { DEFAULT_REQUEST_TIMEOUT_MS } from '../../contracts/Configuration/Registration';
1
+ import { RequestRuntime } from '../foundation/request-runtime';
2
+ import type { PendingOperation, OperationObserver } from '../foundation/operation-registry';
2
3
  import type { Message } from '../../contracts/Common/Message';
3
4
  import type { ZLinkFrameworkRegistration } from '../configuration';
4
- import { awaitWithAbort, throwIfAborted } from '../abort';
5
+ import { throwIfAborted } from '../abort';
5
6
  import type { ZLinkSpotRouteTarget } from '../spots/spot-routing-internal';
6
7
  import {
7
8
  closeMessages,
@@ -13,7 +14,8 @@ import { ZLinkSpotRouteTargetResolver } from './spot-route-target-resolver';
13
14
  export class ZLinkSpotNodeRouteTransport {
14
15
  constructor(
15
16
  private readonly registration: ZLinkFrameworkRegistration,
16
- private readonly targets: ZLinkSpotRouteTargetResolver
17
+ private readonly targets: ZLinkSpotRouteTargetResolver,
18
+ private readonly requests = new RequestRuntime()
17
19
  ) {}
18
20
 
19
21
  async send(target: ZLinkSpotRouteTarget, parts: readonly Message[]): Promise<boolean> {
@@ -35,57 +37,85 @@ export class ZLinkSpotNodeRouteTransport {
35
37
  codecs: ZLinkChannelEnvelopeCodecRegistry | undefined,
36
38
  timeoutMs: number | undefined,
37
39
  signal?: AbortSignal,
38
- onAdmitted?: () => void
40
+ onAdmitted?: () => void,
41
+ existing?: PendingOperation<unknown>,
42
+ destination?: OperationObserver<unknown, unknown>
39
43
  ): Promise<TReply> | undefined {
40
44
  const router = this.targets.spotNodeRouter(target.routerChannelId);
41
45
  if (router === undefined) {
42
46
  return undefined;
43
47
  }
44
- const effectiveTimeoutMs =
45
- timeoutMs ?? this.registration.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
46
- throwIfAborted(signal);
47
- const operation = router.requestToSpot(
48
- target.targetNodeRid,
49
- target.spotId,
50
- parts,
51
- effectiveTimeoutMs,
52
- onAdmitted
48
+
49
+ const operation = this.requests.begin(
50
+ timeoutMs ?? this.registration.requestTimeoutMs,
51
+ signal,
52
+ existing
53
+ );
54
+ return this.requests.run<TReply>(
55
+ operation,
56
+ (receiver) => {
57
+ throwIfAborted(signal);
58
+ router.requestToSpot(
59
+ target.targetNodeRid,
60
+ target.spotId,
61
+ parts,
62
+ timeoutMs ?? this.registration.requestTimeoutMs,
63
+ onAdmitted,
64
+ operation,
65
+ receiver
66
+ );
67
+ },
68
+ (value) => {
69
+ const replyParts = value as readonly Message[];
70
+ try {
71
+ return decodeChannelReply<TReply>(replyParts, codecs);
72
+ } finally {
73
+ closeMessages(replyParts);
74
+ closeMessages(parts);
75
+ }
76
+ },
77
+ (error) => error,
78
+ destination
53
79
  );
54
- return awaitWithAbort(operation, signal, () => {
55
- void operation.then(closeMessages, () => undefined);
56
- }).then((replyParts) => {
57
- try {
58
- return decodeChannelReply<TReply>(replyParts, codecs);
59
- } finally {
60
- closeMessages(replyParts);
61
- closeMessages(parts);
62
- }
63
- });
64
80
  }
65
-
66
81
  requestRaw(
67
82
  target: ZLinkSpotRouteTarget,
68
83
  request: Message,
69
84
  timeoutMs: number | undefined,
70
85
  signal?: AbortSignal,
71
- onAdmitted?: () => void
86
+ onAdmitted?: () => void,
87
+ existing?: PendingOperation<unknown>
72
88
  ): Promise<readonly Message[]> | undefined {
73
89
  const router = this.targets.spotNodeRouter(target.routerChannelId);
74
90
  if (router === undefined) {
75
91
  return undefined;
76
92
  }
77
- const effectiveTimeoutMs =
78
- timeoutMs ?? this.registration.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
79
- throwIfAborted(signal);
80
- const operation = router.requestToSpot(
81
- target.targetNodeRid,
82
- target.spotId,
83
- request,
84
- effectiveTimeoutMs,
85
- onAdmitted
93
+
94
+ const operation = this.requests.begin(
95
+ timeoutMs ?? this.registration.requestTimeoutMs,
96
+ signal,
97
+ existing
98
+ );
99
+ return this.requests.run<readonly Message[]>(
100
+ operation,
101
+ (receiver) => {
102
+ throwIfAborted(signal);
103
+ router.requestToSpot(
104
+ target.targetNodeRid,
105
+ target.spotId,
106
+ request,
107
+ timeoutMs ?? this.registration.requestTimeoutMs,
108
+ onAdmitted,
109
+ operation,
110
+ receiver
111
+ );
112
+ },
113
+ (value) => {
114
+ const replyParts = value as readonly Message[];
115
+ if (!operation.isPending()) closeMessages(replyParts);
116
+ return replyParts;
117
+ },
118
+ (error) => error
86
119
  );
87
- return awaitWithAbort(operation, signal, () => {
88
- void operation.then(closeMessages, () => undefined);
89
- });
90
120
  }
91
121
  }
@@ -1,3 +1,5 @@
1
+ import { RequestRuntime } from '../foundation/request-runtime';
2
+ import type { PendingOperation, OperationObserver } from '../foundation/operation-registry';
1
3
  import type { Message } from '../../contracts/Common/Message';
2
4
  import type { ZLinkBackendSpotRouteBridge } from '../backend/contracts';
3
5
  import { ZLinkConfigurationException } from '../configuration';
@@ -8,12 +10,12 @@ import {
8
10
  type ZLinkChannelEnvelopeCodecRegistry
9
11
  } from './channel-envelope';
10
12
  import { appendParts } from './channel-multipart';
11
- import { awaitWithAbort } from '../abort';
12
13
 
13
14
  export class ZLinkSpotRouteBridgeTransport {
14
15
  constructor(
15
16
  private readonly bridges: ReadonlyMap<string, ZLinkBackendSpotRouteBridge>,
16
- private readonly defaultRequestTimeoutMs: number | undefined
17
+ private readonly defaultRequestTimeoutMs: number | undefined,
18
+ private readonly requests = new RequestRuntime()
17
19
  ) {}
18
20
 
19
21
  has(routerChannelId: string): boolean {
@@ -32,50 +34,80 @@ export class ZLinkSpotRouteBridgeTransport {
32
34
  }
33
35
  }
34
36
 
35
- async request<TReply>(
37
+ request<TReply>(
36
38
  target: ZLinkSpotRouteTarget,
37
39
  parts: readonly Message[],
38
40
  codecs: ZLinkChannelEnvelopeCodecRegistry | undefined,
39
41
  timeoutMs: number | undefined,
40
42
  signal?: AbortSignal,
41
- onAdmitted?: () => void
43
+ onAdmitted?: () => void,
44
+ existing?: PendingOperation<unknown>,
45
+ destination?: OperationObserver<unknown, unknown>
42
46
  ): Promise<TReply> {
43
- const bridge = this.requireBridge(target.routerChannelId);
44
- const operation = appendParts(
45
- bridge.request(target.routerChannelId, target.targetNodeRid, target.spotId),
46
- parts
47
- )
48
- .timeout(timeoutMs ?? 0)
49
- .submit(onAdmitted);
50
- const replyParts = await awaitWithAbort(operation, signal, () => {
51
- void operation.then(closeMessages, () => undefined);
52
- });
53
47
  try {
54
- return decodeChannelReply<TReply>(replyParts, codecs);
55
- } finally {
56
- closeMessages(replyParts);
57
- closeMessages(parts);
48
+ const operation = this.requests.begin(
49
+ timeoutMs ?? this.defaultRequestTimeoutMs,
50
+ signal,
51
+ existing
52
+ );
53
+ return this.requests.run<TReply>(
54
+ operation,
55
+ (receiver) => {
56
+ const bridge = this.requireBridge(target.routerChannelId);
57
+ appendParts(
58
+ bridge.request(target.routerChannelId, target.targetNodeRid, target.spotId),
59
+ parts
60
+ )
61
+ .timeout(timeoutMs ?? this.defaultRequestTimeoutMs ?? 0)
62
+ .submit(onAdmitted, operation, receiver);
63
+ },
64
+ (value) => {
65
+ const replyParts = value as readonly Message[];
66
+ try {
67
+ return decodeChannelReply<TReply>(replyParts, codecs);
68
+ } finally {
69
+ closeMessages(replyParts);
70
+ closeMessages(parts);
71
+ }
72
+ },
73
+ (error) => error,
74
+ destination
75
+ );
76
+ } catch (error) {
77
+ return Promise.reject(error);
58
78
  }
59
79
  }
60
-
61
80
  requestRaw(
62
81
  target: ZLinkSpotRouteTarget,
63
82
  request: Message,
64
83
  timeoutMs: number | undefined,
65
84
  signal?: AbortSignal,
66
- onAdmitted?: () => void
85
+ onAdmitted?: () => void,
86
+ existing?: PendingOperation<unknown>
67
87
  ): Promise<readonly Message[]> {
68
- const bridge = this.requireBridge(target.routerChannelId);
69
- const operation = bridge
70
- .request(target.routerChannelId, target.targetNodeRid, target.spotId)
71
- .message(request)
72
- .timeout(timeoutMs ?? this.defaultRequestTimeoutMs ?? 0)
73
- .submit(onAdmitted);
74
- return awaitWithAbort(operation, signal, () => {
75
- void operation.then(closeMessages, () => undefined);
76
- });
88
+ const operation = this.requests.begin(
89
+ timeoutMs ?? this.defaultRequestTimeoutMs,
90
+ signal,
91
+ existing
92
+ );
93
+ return this.requests.run<readonly Message[]>(
94
+ operation,
95
+ (receiver) => {
96
+ const bridge = this.requireBridge(target.routerChannelId);
97
+ appendParts(bridge.request(target.routerChannelId, target.targetNodeRid, target.spotId), [
98
+ request
99
+ ])
100
+ .timeout(timeoutMs ?? this.defaultRequestTimeoutMs ?? 0)
101
+ .submit(onAdmitted, operation, receiver);
102
+ },
103
+ (value) => {
104
+ const replyParts = value as readonly Message[];
105
+ if (!operation.isPending()) closeMessages(replyParts);
106
+ return replyParts;
107
+ },
108
+ (error) => error
109
+ );
77
110
  }
78
-
79
111
  private requireBridge(routerChannelId: string): ZLinkBackendSpotRouteBridge {
80
112
  const bridge = this.bridges.get(routerChannelId);
81
113
  if (bridge === undefined)