@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,3 +1,6 @@
1
+ import type { OperationObserver } from '../../foundation/operation-registry';
2
+ import { RequestRuntime } from '../../foundation/request-runtime';
3
+ import type { PendingOperation } from '../../foundation/operation-registry';
1
4
  import { ZLINK_DEFAULT_PUBLIC_WEIGHT } from '../../../contracts/Configuration/RegistrationBuilderPolicy';
2
5
  import type { Socket } from '@zlink-systems/zlink';
3
6
  import type { ZLinkBackendObject } from '../contracts';
@@ -7,6 +10,7 @@ import {
7
10
  isContextTerminatedError,
8
11
  isRouteRecvRetryable,
9
12
  submitBindingRequest,
13
+ closeBindingReply,
10
14
  submitBindingPublish,
11
15
  submitBindingReply,
12
16
  submitBindingAsyncSend,
@@ -49,11 +53,40 @@ export function wrapSocket<T extends { close(): void }>(
49
53
  pollCompletion === undefined
50
54
  ? undefined
51
55
  : new ZLinkNodeEventLoopPoller(nativeInstance as unknown as Socket, pollCompletion, () => {});
56
+ const requests = new RequestRuntime();
57
+ const submitSocketRequest = (
58
+ operation: ZLinkBindingRequestOperation,
59
+ payload: unknown,
60
+ timeoutMs: number | undefined,
61
+ recordReceived: (() => void) | undefined,
62
+ onAdmitted: (() => void) | undefined,
63
+ requestOperation: PendingOperation<unknown> | undefined,
64
+ receiver: OperationObserver<unknown, unknown> | undefined
65
+ ): Promise<readonly unknown[]> => {
66
+ const pending = requests.begin(timeoutMs, undefined, requestOperation);
67
+ submitBindingRequest(
68
+ operation,
69
+ payload,
70
+ timeoutMs,
71
+ recordReceived,
72
+ onAdmitted,
73
+ pending,
74
+ receiver ?? {
75
+ operationCompleted: (_id, parts) => {
76
+ if (!pending.reply(parts))
77
+ closeBindingReply(parts as readonly import('@zlink-systems/zlink').Message[]);
78
+ },
79
+ operationFailed: (_id, error) => pending.replyFailure(error)
80
+ }
81
+ );
82
+ return pending.promise as Promise<readonly unknown[]>;
83
+ };
52
84
  const adapter = {
53
85
  nativeInstance,
54
86
  receiveAdmission: undefined as
55
87
  import('../../foundation/service-liveness-registry').ServiceLivenessConnection | undefined,
56
88
  async dispose(): Promise<void> {
89
+ requests.close();
57
90
  eventLoopPoller?.dispose();
58
91
  closeBindingHandle(nativeInstance);
59
92
  },
@@ -208,34 +241,42 @@ export function wrapSocket<T extends { close(): void }>(
208
241
  },
209
242
  request(...args: unknown[]): unknown {
210
243
  if (hasRoutedPeer) {
211
- const [routingId, payload, timeoutMs, onAdmitted] = args as [
244
+ const [routingId, payload, timeoutMs, onAdmitted, requestOperation, receiver] = args as [
212
245
  unknown,
213
246
  unknown,
214
247
  number | undefined,
215
- (() => void) | undefined
248
+ (() => void) | undefined,
249
+ PendingOperation<unknown> | undefined,
250
+ OperationObserver<unknown, unknown> | undefined
216
251
  ];
217
- return submitBindingRequest(
252
+ return submitSocketRequest(
218
253
  (
219
254
  nativeInstance as T & { request(routingId: unknown): ZLinkBindingRequestOperation }
220
255
  ).request(toNativeRoutingId(routingId)),
221
256
  payload,
222
257
  timeoutMs,
223
258
  undefined,
224
- onAdmitted
259
+ onAdmitted,
260
+ requestOperation,
261
+ receiver
225
262
  );
226
263
  }
227
264
  if (hasRequest) {
228
- const [payload, timeoutMs, onAdmitted] = args as [
265
+ const [payload, timeoutMs, onAdmitted, requestOperation, receiver] = args as [
229
266
  unknown,
230
267
  number | undefined,
231
- (() => void) | undefined
268
+ (() => void) | undefined,
269
+ PendingOperation<unknown> | undefined,
270
+ OperationObserver<unknown, unknown> | undefined
232
271
  ];
233
- return submitBindingRequest(
272
+ return submitSocketRequest(
234
273
  (nativeInstance as T & { request(): ZLinkBindingRequestOperation }).request(),
235
274
  payload,
236
275
  timeoutMs,
237
276
  adapter.receiveAdmission?.recordReceived,
238
- onAdmitted
277
+ onAdmitted,
278
+ requestOperation,
279
+ receiver
239
280
  );
240
281
  }
241
282
  throw new TypeError('Backend request requires a DEALER or ROUTER socket.');
@@ -315,9 +356,11 @@ export function wrapSocket<T extends { close(): void }>(
315
356
  targetSpot: unknown,
316
357
  payload: unknown,
317
358
  timeoutMs?: number,
318
- onAdmitted?: () => void
359
+ onAdmitted?: () => void,
360
+ requestOperation?: PendingOperation<unknown>,
361
+ receiver?: OperationObserver<unknown, unknown>
319
362
  ): Promise<readonly unknown[]> {
320
- return submitBindingRequest(
363
+ return submitSocketRequest(
321
364
  (
322
365
  nativeInstance as T & {
323
366
  requestToSpot(targetRid: unknown, targetSpot: unknown): ZLinkBindingRequestOperation;
@@ -326,7 +369,9 @@ export function wrapSocket<T extends { close(): void }>(
326
369
  payload,
327
370
  timeoutMs,
328
371
  undefined,
329
- onAdmitted
372
+ onAdmitted,
373
+ requestOperation,
374
+ receiver
330
375
  );
331
376
  },
332
377
  disconnectPeer(routingId: unknown): void {
@@ -1,3 +1,5 @@
1
+ import type { ConnectionAttempt } from '@zlink-systems/zlink';
2
+ import type { OperationHandle } from '../foundation/operation-registry';
1
3
  import type { SubmitResult } from './runtime-values';
2
4
 
3
5
  export interface ZLinkRawSendSubmission {
@@ -14,7 +16,7 @@ export interface ZLinkRawReceivedRecord {
14
16
  * record (Core ROUTER §10.1); 0n for a non-ROUTER receive. Equality only.
15
17
  */
16
18
  readonly routeGeneration: bigint;
17
- readonly reply?: (parts: readonly Uint8Array[]) => void;
19
+ readonly reply?: (parts: readonly (Uint8Array | string)[]) => void;
18
20
  readonly parts: readonly Buffer[];
19
21
  /** Releases the ordinary Framework-owned receive record exactly once. */
20
22
  close(): void;
@@ -33,7 +35,9 @@ export interface ZLinkRawMonitorRecord {
33
35
  }
34
36
 
35
37
  export interface ZLinkRawSocketPort {
36
- setReadableHandler(handler: (receiveReady: boolean, routeReady: boolean) => void): void;
38
+ setReadableHandler(
39
+ handler: (receiveReady: boolean, routeReady: boolean, connectReady: boolean) => void
40
+ ): void;
37
41
  bind(endpoint: string): void;
38
42
  unbind(endpoint: string): void;
39
43
  connect(endpoint: string): void;
@@ -63,16 +67,20 @@ export interface ZLinkRawRouterPort extends ZLinkRawSocketPort {
63
67
  setRoutingId(routingId: string): void;
64
68
  connectToRoutingId(routingId: string, endpoint: string): void;
65
69
  send(targetRid: string, parts: readonly Uint8Array[]): Promise<void>;
66
- request(
70
+ request<T>(
67
71
  targetRid: string,
68
72
  parts: readonly Uint8Array[],
69
73
  timeoutMs: number,
74
+ onReply: (parts: readonly Buffer[]) => T,
75
+ onFailed: (error: unknown) => T,
70
76
  recordReceived?: () => void,
71
- onAdmitted?: () => void
72
- ): Promise<readonly Buffer[]>;
77
+ onAdmitted?: () => void,
78
+ existing?: Pick<OperationHandle<unknown>, 'id' | 'deadlineMs'>
79
+ ): Promise<T>;
73
80
  receive(dontWait?: boolean): ZLinkRawReceivedRecord | undefined;
74
81
  /** The selected route of every RID. The socket's one route observer calls it. */
75
82
  routesSnapshot(): readonly ZLinkRawRouterRoute[];
83
+ connectionAttemptsSnapshot(): readonly ConnectionAttempt[];
76
84
  }
77
85
 
78
86
  export interface ZLinkRawDealerPort extends ZLinkRawSocketPort {
@@ -1,5 +1,11 @@
1
1
  import { DEFAULT_REQUEST_TIMEOUT_MS } from '../../contracts/Configuration/Registration';
2
- import { createZLinkRequest } from '../messaging/request-result';
2
+ import {
3
+ createZLinkRequest,
4
+ mapZLinkRequestReply,
5
+ prepareZLinkRequestReply,
6
+ identityRequestReply,
7
+ type ZLinkRequestResult
8
+ } from '../messaging/request-result';
3
9
  import type { ZLinkRequest } from '../../contracts/Handlers/Attributes';
4
10
  import type {
5
11
  ZLinkChannelClient,
@@ -315,14 +321,23 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
315
321
  () => {
316
322
  this.requireSpotTransport();
317
323
  },
318
- (_packetName, timeoutMs, metadata, signal, onAdmitted) =>
319
- requestToSpotHandle(this.requireSpotTransport(), spot, request, {
320
- timeoutMs,
321
- signal,
322
- metadata,
323
- onAdmitted,
324
- spotRouterChannelIdForMesh: this.spotRouterChannelIdForMesh
325
- }),
324
+ <TReply>(
325
+ _packetName: string | undefined,
326
+ timeoutMs: number | undefined,
327
+ metadata: ReadonlyMap<string, string>,
328
+ signal?: AbortSignal,
329
+ onAdmitted?: () => void
330
+ ) =>
331
+ prepareZLinkRequestReply(
332
+ requestToSpotHandle<TReply>(this.requireSpotTransport(), spot, request, {
333
+ timeoutMs,
334
+ signal,
335
+ metadata,
336
+ onAdmitted,
337
+ spotRouterChannelIdForMesh: this.spotRouterChannelIdForMesh
338
+ }),
339
+ identityRequestReply
340
+ ),
326
341
  this.registration.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS
327
342
  );
328
343
  }
@@ -528,7 +543,7 @@ type ZLinkRequestSubmitter = <TReply>(
528
543
  signal?: AbortSignal,
529
544
  onAdmitted?: () => void,
530
545
  message?: unknown
531
- ) => Promise<TReply>;
546
+ ) => ZLinkRequestResult<TReply>;
532
547
 
533
548
  class DefaultZLinkRequestCall implements ZLinkChannelRequestCall {
534
549
  private timeoutMs?: number;
@@ -589,7 +604,7 @@ class DefaultZLinkRequestCall implements ZLinkChannelRequestCall {
589
604
  undefined,
590
605
  this.message
591
606
  );
592
- return turn.yieldFrameworkPromise(pending);
607
+ return turn.yieldFrameworkPromise(mapZLinkRequestReply(pending));
593
608
  }
594
609
  }
595
610
 
@@ -1,3 +1,4 @@
1
+ import type { ZLinkHandlerMessageType } from '../../contracts/Common/HandlerMessageType';
1
2
  import type { ZLinkMeshDispatchAdmission } from '../admission';
2
3
  import {
3
4
  ZLinkFrameworkInternalErrorKind,
@@ -35,6 +36,7 @@ import type { ZLinkMalformedChannelHeaderInfo } from './channel-envelope-inspect
35
36
  import type { ZLinkDispatchErrorReporter } from './dispatch-error-reporter';
36
37
  import { createInboundFlow, runWithFlow } from '../diagnostics/flow-context';
37
38
  import { releaseApplicationJobPermitBeforeHandler } from '../application-jobs/application-job-queue-scope';
39
+ import { resolveMessageTypeForDecode } from '../../contracts/Common/HandlerMessageType';
38
40
 
39
41
  export interface ZLinkChannelDispatchPipelineOptions {
40
42
  readonly dispatchErrors: ZLinkDispatchErrorReporter;
@@ -58,11 +60,12 @@ interface ZLinkChannelDispatchHandler<TContext extends ZLinkMessageContext, TRes
58
60
  handle(payload: unknown, context: TContext): Promise<TResult> | TResult;
59
61
  }
60
62
 
61
- interface ZLinkOneWayDispatch<TContext extends ZLinkMessageContext> {
63
+ export interface ZLinkOneWayDispatch<TContext extends ZLinkMessageContext> {
62
64
  readonly fields: ZLinkChannelDispatchFields;
63
65
  readonly envelope: ZLinkChannelEnvelope;
64
66
  readonly codecs?: ZLinkChannelEnvelopeCodecRegistry;
65
67
  readonly handler?: ZLinkChannelDispatchHandler<TContext, void>;
68
+ readonly messageType?: ZLinkHandlerMessageType;
66
69
  readonly context: TContext;
67
70
  readonly signal?: AbortSignal;
68
71
  }
@@ -72,6 +75,7 @@ export interface ZLinkRequestDispatch<TContext extends ZLinkMessageContext> {
72
75
  readonly envelope: ZLinkChannelEnvelope;
73
76
  readonly codecs?: ZLinkChannelEnvelopeCodecRegistry;
74
77
  readonly handler?: ZLinkChannelDispatchHandler<TContext, unknown>;
78
+ readonly messageType?: ZLinkHandlerMessageType;
75
79
  readonly context: TContext;
76
80
  readonly signal?: AbortSignal;
77
81
  readonly missingHandlerMessage: string;
@@ -80,10 +84,10 @@ export interface ZLinkRequestDispatch<TContext extends ZLinkMessageContext> {
80
84
  }
81
85
 
82
86
  export class ZLinkChannelDispatchPipeline {
83
- private readonly filters: readonly ZLinkHandlerFilter[];
87
+ readonly filters: readonly ZLinkHandlerFilter[];
84
88
  private readonly unhandled: ZLinkUnhandledDispatchOptions;
85
89
 
86
- constructor(private readonly options: ZLinkChannelDispatchPipelineOptions) {
90
+ constructor(readonly options: ZLinkChannelDispatchPipelineOptions) {
87
91
  this.filters = options.filters ?? [];
88
92
  this.unhandled = options.unhandled ?? DEFAULT_UNHANDLED_DISPATCH;
89
93
  }
@@ -98,12 +102,7 @@ export class ZLinkChannelDispatchPipeline {
98
102
  admit?: ZLinkMeshDispatchAdmission
99
103
  ): void | Promise<void> {
100
104
  if (admit !== undefined) {
101
- const pipeline = this;
102
- const record = dispatch;
103
- return admit(
104
- () => pipeline.dispatchOneWay(record),
105
- (error) => pipeline.failOneWay(record.fields, error)
106
- );
105
+ return admit(this.dispatchOneWay, this.failOneWay, this, dispatch);
107
106
  }
108
107
  this.trace(ZLinkMessageFlowOutcome.Received, dispatch.fields);
109
108
  this.trace(ZLinkMessageFlowOutcome.Admitted, dispatch.fields);
@@ -112,17 +111,22 @@ export class ZLinkChannelDispatchPipeline {
112
111
  try {
113
112
  invocation = this.invokeInFlow(dispatch, dispatch.handler);
114
113
  } catch (error) {
115
- this.failOneWay(dispatch.fields, error);
114
+ this.failOneWay(error, dispatch);
116
115
  return;
117
116
  }
118
117
  if (!isPromiseLike(invocation)) {
119
118
  this.completeOneWay(dispatch.fields, invocation);
120
119
  return;
121
120
  }
122
- return Promise.resolve(invocation).then(
123
- (value) => this.completeOneWay(dispatch.fields, value),
124
- (error: unknown) => this.failOneWay(dispatch.fields, error)
125
- );
121
+ {
122
+ // Keep captures block-scoped so synchronous dispatch allocates no V8 context.
123
+ const pipeline = this;
124
+ const record = dispatch;
125
+ return Promise.resolve(invocation).then(
126
+ (value) => pipeline.completeOneWay(record.fields, value),
127
+ (error: unknown) => pipeline.failOneWay(error, record)
128
+ );
129
+ }
126
130
  }
127
131
 
128
132
  private async dispatchMissingOneWay(fields: ZLinkChannelDispatchFields): Promise<void> {
@@ -140,7 +144,8 @@ export class ZLinkChannelDispatchPipeline {
140
144
  }
141
145
  }
142
146
 
143
- private failOneWay(fields: ZLinkChannelDispatchFields, error: unknown): void {
147
+ private failOneWay(error: unknown, dispatch: ZLinkOneWayDispatch<ZLinkMessageContext>): void {
148
+ const fields = dispatch.fields;
144
149
  this.report(fields, this.failureReason(error), ZLinkDispatchErrorAction.Drop, error);
145
150
  }
146
151
 
@@ -154,12 +159,7 @@ export class ZLinkChannelDispatchPipeline {
154
159
  admit?: ZLinkMeshDispatchAdmission
155
160
  ): void | Promise<void> {
156
161
  if (admit !== undefined) {
157
- const pipeline = this;
158
- const record = dispatch;
159
- return admit(
160
- () => pipeline.dispatchRequest(record),
161
- (error) => pipeline.failRequest(record, error)
162
- );
162
+ return admit(this.dispatchRequest, this.failRequest, this, dispatch);
163
163
  }
164
164
  this.trace(ZLinkMessageFlowOutcome.Received, dispatch.fields);
165
165
  this.trace(ZLinkMessageFlowOutcome.Admitted, dispatch.fields);
@@ -168,13 +168,17 @@ export class ZLinkChannelDispatchPipeline {
168
168
  try {
169
169
  invocation = this.invokeInFlow(dispatch, dispatch.handler);
170
170
  } catch (error) {
171
- return this.failRequest(dispatch, error);
171
+ return this.failRequest(error, dispatch);
172
172
  }
173
173
  if (!isPromiseLike(invocation)) return this.completeRequest(dispatch, invocation);
174
- return Promise.resolve(invocation).then(
175
- (value) => this.completeRequest(dispatch, value),
176
- (error: unknown) => this.failRequest(dispatch, error)
177
- );
174
+ {
175
+ const pipeline = this;
176
+ const record = dispatch;
177
+ return Promise.resolve(invocation).then(
178
+ (value) => pipeline.completeRequest(record, value),
179
+ (error: unknown) => pipeline.failRequest(error, record)
180
+ );
181
+ }
178
182
  }
179
183
 
180
184
  private async dispatchMissingRequest<TContext extends ZLinkMessageContext>(
@@ -199,7 +203,7 @@ export class ZLinkChannelDispatchPipeline {
199
203
  }
200
204
  }
201
205
 
202
- private invokeInFlow<TContext extends ZLinkMessageContext, TResult>(
206
+ invokeInFlow<TContext extends ZLinkMessageContext, TResult>(
203
207
  dispatch: ZLinkOneWayDispatch<TContext> | ZLinkRequestDispatch<TContext>,
204
208
  handler: ZLinkChannelDispatchHandler<TContext, TResult>
205
209
  ): unknown {
@@ -210,24 +214,8 @@ export class ZLinkChannelDispatchPipeline {
210
214
  undefined
211
215
  );
212
216
  return flow === undefined
213
- ? this.invoke(
214
- dispatch.envelope,
215
- dispatch.codecs,
216
- handler,
217
- dispatch.context,
218
- dispatch.fields,
219
- dispatch.signal
220
- )
221
- : runWithFlow(flow, () =>
222
- this.invoke(
223
- dispatch.envelope,
224
- dispatch.codecs,
225
- handler,
226
- dispatch.context,
227
- dispatch.fields,
228
- dispatch.signal
229
- )
230
- );
217
+ ? this.invoke(dispatch, handler)
218
+ : runWithFlow(flow, this.invoke.bind(this, dispatch, handler));
231
219
  }
232
220
 
233
221
  private completeRequest<TContext extends ZLinkMessageContext>(
@@ -236,11 +224,11 @@ export class ZLinkChannelDispatchPipeline {
236
224
  ): void | Promise<void> {
237
225
  if (invocation === HANDLER_FILTER_REJECTED) {
238
226
  return this.failRequest(
239
- dispatch,
240
227
  createInternalFrameworkException(
241
228
  ZLinkFrameworkInternalErrorKind.RequestRejected,
242
229
  `A handler filter rejected '${this.options.channelName}:${dispatch.fields.packetName}'.`
243
- )
230
+ ),
231
+ dispatch
244
232
  );
245
233
  }
246
234
  let written: void | Promise<void>;
@@ -254,10 +242,14 @@ export class ZLinkChannelDispatchPipeline {
254
242
  this.trace(ZLinkMessageFlowOutcome.Replied, dispatch.fields);
255
243
  return;
256
244
  }
257
- return written.then(
258
- () => this.trace(ZLinkMessageFlowOutcome.Replied, dispatch.fields),
259
- (error: unknown) => this.replyPathMissing(dispatch.fields, error)
260
- );
245
+ {
246
+ const pipeline = this;
247
+ const record = dispatch;
248
+ return written.then(
249
+ () => pipeline.trace(ZLinkMessageFlowOutcome.Replied, record.fields),
250
+ (error: unknown) => pipeline.replyPathMissing(record.fields, error)
251
+ );
252
+ }
261
253
  }
262
254
 
263
255
  private replyPathMissing(fields: ZLinkChannelDispatchFields, error: unknown): void {
@@ -272,8 +264,8 @@ export class ZLinkChannelDispatchPipeline {
272
264
  }
273
265
 
274
266
  private async failRequest<TContext extends ZLinkMessageContext>(
275
- dispatch: ZLinkRequestDispatch<TContext>,
276
- error: unknown
267
+ error: unknown,
268
+ dispatch: ZLinkRequestDispatch<TContext>
277
269
  ): Promise<void> {
278
270
  try {
279
271
  await dispatch.writeError(error);
@@ -338,27 +330,40 @@ export class ZLinkChannelDispatchPipeline {
338
330
  });
339
331
  }
340
332
 
341
- private invoke<TContext extends ZLinkMessageContext, TResult>(
342
- envelope: ZLinkChannelEnvelope,
343
- codecs: ZLinkChannelEnvelopeCodecRegistry | undefined,
344
- handler: ZLinkChannelDispatchHandler<TContext, TResult>,
345
- context: TContext,
346
- fields: ZLinkChannelDispatchFields,
347
- signal?: AbortSignal
333
+ invoke<TContext extends ZLinkMessageContext, TResult>(
334
+ dispatch: ZLinkOneWayDispatch<TContext> | ZLinkRequestDispatch<TContext>,
335
+ handler: ZLinkChannelDispatchHandler<TContext, TResult>
348
336
  ):
349
337
  | TResult
350
338
  | undefined
351
339
  | typeof HANDLER_FILTER_REJECTED
352
340
  | Promise<TResult | undefined | typeof HANDLER_FILTER_REJECTED> {
353
- releaseApplicationJobPermitBeforeHandler();
341
+ const envelope = dispatch.envelope;
342
+ const codecs = dispatch.codecs;
343
+ const context = dispatch.context;
344
+ const fields = dispatch.fields;
345
+ const signal = dispatch.signal;
354
346
  if (this.filters.length === 0) {
355
347
  // Fast path for the dominant unfiltered dispatch: skip the filter
356
348
  // context object and chain machinery entirely.
357
- const payload = decodeChannelPayload(envelope, codecs);
349
+ const payload = decodeChannelPayload(
350
+ envelope,
351
+ codecs,
352
+ resolveMessageTypeForDecode(dispatch.messageType)
353
+ );
358
354
  this.trace(ZLinkMessageFlowOutcome.Dispatched, fields);
355
+ releaseApplicationJobPermitBeforeHandler();
359
356
  return handler.handle(payload, context);
360
357
  }
361
- return this.invokeFiltered(envelope, codecs, handler, context, fields, signal);
358
+ return this.invokeFiltered(
359
+ envelope,
360
+ codecs,
361
+ handler,
362
+ context,
363
+ fields,
364
+ dispatch.messageType,
365
+ signal
366
+ );
362
367
  }
363
368
 
364
369
  private async invokeFiltered<TContext extends ZLinkMessageContext, TResult>(
@@ -367,6 +372,7 @@ export class ZLinkChannelDispatchPipeline {
367
372
  handler: ZLinkChannelDispatchHandler<TContext, TResult>,
368
373
  context: TContext,
369
374
  fields: ZLinkChannelDispatchFields,
375
+ messageType?: ZLinkHandlerMessageType,
370
376
  signal?: AbortSignal
371
377
  ): Promise<TResult | undefined | typeof HANDLER_FILTER_REJECTED> {
372
378
  let value: TResult | undefined;
@@ -376,8 +382,13 @@ export class ZLinkChannelDispatchPipeline {
376
382
  async () => {
377
383
  // Filters are the channel admission gate. Decode only after they have
378
384
  // allowed the handler turn to proceed.
379
- const payload = decodeChannelPayload(envelope, codecs);
385
+ const payload = decodeChannelPayload(
386
+ envelope,
387
+ codecs,
388
+ resolveMessageTypeForDecode(messageType)
389
+ );
380
390
  this.trace(ZLinkMessageFlowOutcome.Dispatched, fields);
391
+ releaseApplicationJobPermitBeforeHandler();
381
392
  value = await handler.handle(payload, context);
382
393
  },
383
394
  signal
@@ -398,6 +409,7 @@ export class ZLinkChannelDispatchPipeline {
398
409
  contentType: context.contentType,
399
410
  metadata: context.metadata,
400
411
  correlationId: context.correlationId,
412
+ receivedAt: context.receivedAt,
401
413
  dispatchKind
402
414
  };
403
415
  }
@@ -445,7 +457,7 @@ export class ZLinkChannelDispatchPipeline {
445
457
  });
446
458
  }
447
459
 
448
- private trace(outcome: ZLinkMessageFlowOutcome, fields: ZLinkChannelDispatchFields): void {
460
+ trace(outcome: ZLinkMessageFlowOutcome, fields: ZLinkChannelDispatchFields): void {
449
461
  if (fields.messageKind === ZLinkDispatchMessageKind.Publish) return;
450
462
  const flow = this.options.dispatchErrors.flow;
451
463
  const tracePoint = flow.begin(outcome, undefined, fields.flowId);
@@ -24,6 +24,7 @@ import {
24
24
  type ZLinkMessageFlowModeCell
25
25
  } from '../diagnostics';
26
26
  import type { ZLinkRuntimeTaskErrorSink } from '../execution';
27
+ import { openTelemetryLease, type ZLinkTelemetryLease } from '../diagnostics/message-flow-delivery';
27
28
  import { ZLinkDispatchErrorReporter } from './dispatch-error-reporter';
28
29
  import { invokeZLinkHandlerFilters } from '../handlers';
29
30
  import {
@@ -72,7 +73,8 @@ export class ZLinkChannelDispatchServices {
72
73
  constructor(
73
74
  private readonly registration: ZLinkFrameworkRegistration,
74
75
  private readonly providerResolver?: ZLinkProviderResolver,
75
- private readonly configuredMessageFlowModeCell?: ZLinkMessageFlowModeCell
76
+ private readonly configuredMessageFlowModeCell?: ZLinkMessageFlowModeCell,
77
+ private readonly telemetryLease: ZLinkTelemetryLease = openTelemetryLease()
76
78
  ) {
77
79
  this.metricsValue = new ZLinkRuntimeMetrics(registration.metrics?.meterProvider);
78
80
  }
@@ -90,13 +92,7 @@ export class ZLinkChannelDispatchServices {
90
92
  if (existing !== undefined) {
91
93
  return existing;
92
94
  }
93
- const reporter = new ZLinkDispatchErrorReporter(
94
- undefined,
95
- undefined,
96
- errorSink,
97
- this.diagnosticsContext(),
98
- this.metricsValue
99
- );
95
+ const reporter = new ZLinkDispatchErrorReporter(this.diagnosticsContext(), this.metricsValue);
100
96
  this.dispatchErrorReporters.set(errorSink, reporter);
101
97
  return reporter;
102
98
  }
@@ -290,15 +286,14 @@ export class ZLinkChannelDispatchServices {
290
286
  this.diagnosticsContextValue ??= createDiagnosticsContext(
291
287
  this.registration.dispatch,
292
288
  this.providerResolver,
293
- this.messageFlowModeCell()
289
+ this.messageFlowModeCell(),
290
+ this.telemetryLease
294
291
  );
295
292
  return this.diagnosticsContextValue;
296
293
  }
297
294
 
298
295
  private outboundFlow(): ZLinkMessageFlowTracer {
299
- this.outboundFlowValue ??= new ZLinkMessageFlowTracer(this.diagnosticsContext(), {
300
- reportRuntimeTaskException() {}
301
- });
296
+ this.outboundFlowValue ??= new ZLinkMessageFlowTracer(this.diagnosticsContext());
302
297
  return this.outboundFlowValue;
303
298
  }
304
299
  }