@zlink-systems/framework 0.30.0 → 0.30.2

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 (456) hide show
  1. package/LICENSE +150 -68
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/contracts/Actors/ZLinkActorClient.d.ts +2 -1
  4. package/dist/contracts/Channels/Calls.d.ts +2 -1
  5. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
  6. package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
  7. package/dist/contracts/Common/ZLinkMessageMetadata.js +11 -5
  8. package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
  9. package/dist/contracts/Common/encoded-payload-storage.js +5 -2
  10. package/dist/contracts/Configuration/Builders.d.ts +1 -1
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
  12. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
  13. package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
  14. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  15. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
  16. package/dist/contracts/Handlers/Attributes.d.ts +5 -13
  17. package/dist/contracts/Handlers/Attributes.js +7 -11
  18. package/dist/contracts/Handlers/JsonContract.d.ts +2 -46
  19. package/dist/contracts/Handlers/JsonContract.js +4 -153
  20. package/dist/contracts/Locations/Rows.d.ts +2 -0
  21. package/dist/contracts/Spots/Contracts.d.ts +6 -1
  22. package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
  23. package/dist/nest-integration.d.ts +1 -1
  24. package/dist/nest-integration.js +2 -1
  25. package/dist/runtime/abort.d.ts +5 -0
  26. package/dist/runtime/abort.js +10 -0
  27. package/dist/runtime/actors/actor-authority-publication.js +3 -2
  28. package/dist/runtime/actors/actor-client.d.ts +1 -2
  29. package/dist/runtime/actors/actor-client.js +52 -57
  30. package/dist/runtime/actors/actor-context.d.ts +2 -0
  31. package/dist/runtime/actors/actor-context.js +46 -9
  32. package/dist/runtime/actors/actor-handoff.d.ts +8 -4
  33. package/dist/runtime/actors/actor-handoff.js +219 -92
  34. package/dist/runtime/actors/actor-join-relocation.d.ts +3 -0
  35. package/dist/runtime/actors/actor-local-native-join.js +13 -12
  36. package/dist/runtime/actors/actor-mailbox.js +27 -1
  37. package/dist/runtime/actors/actor-remote-joiner.js +3 -1
  38. package/dist/runtime/actors/actor-remote-wire.js +15 -0
  39. package/dist/runtime/actors/actor-reply.d.ts +4 -0
  40. package/dist/runtime/actors/actor-reply.js +29 -0
  41. package/dist/runtime/actors/actor-routed-join-transport.d.ts +6 -2
  42. package/dist/runtime/actors/actor-routed-json-request.d.ts +2 -0
  43. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
  44. package/dist/runtime/actors/actor-runtime-state.js +2 -20
  45. package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
  46. package/dist/runtime/actors/index.d.ts +8 -3
  47. package/dist/runtime/actors/index.js +55 -27
  48. package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
  49. package/dist/runtime/actors/session-disconnected-wire.js +48 -0
  50. package/dist/runtime/actors/spot-actor-dispatch.js +2 -2
  51. package/dist/runtime/admission.d.ts +9 -1
  52. package/dist/runtime/admission.js +56 -23
  53. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +6 -8
  54. package/dist/runtime/application-jobs/application-ingress-record-owner.js +39 -22
  55. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +15 -1
  56. package/dist/runtime/application-jobs/application-job-queue-scope.js +61 -20
  57. package/dist/runtime/application-jobs/contracts.d.ts +12 -1
  58. package/dist/runtime/backend/contracts/index.d.ts +37 -12
  59. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
  60. package/dist/runtime/backend/mesh-completion-table.d.ts +9 -1
  61. package/dist/runtime/backend/mesh-completion-table.js +154 -49
  62. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +28 -1
  63. package/dist/runtime/backend/mesh-dispatch-pump.js +208 -101
  64. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +2 -2
  65. package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -9
  66. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +1 -1
  67. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +5 -2
  68. package/dist/runtime/backend/node/node-raw-binding-port.js +124 -72
  69. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +46 -13
  70. package/dist/runtime/backend/node/node-raw-mesh-backend.js +181 -164
  71. package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
  72. package/dist/runtime/backend/node/node-socket-backend-adapter.js +11 -11
  73. package/dist/runtime/backend/raw-binding-port.d.ts +2 -2
  74. package/dist/runtime/backend/runtime-message.d.ts +1 -0
  75. package/dist/runtime/backend/runtime-message.js +5 -0
  76. package/dist/runtime/backend/runtime-values.d.ts +1 -0
  77. package/dist/runtime/backend/runtime-values.js +2 -1
  78. package/dist/runtime/channels/channel-clients.d.ts +2 -0
  79. package/dist/runtime/channels/channel-clients.js +75 -23
  80. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +25 -5
  81. package/dist/runtime/channels/channel-dispatch-pipeline.js +111 -56
  82. package/dist/runtime/channels/channel-dispatch-services.d.ts +1 -0
  83. package/dist/runtime/channels/channel-dispatch-services.js +45 -0
  84. package/dist/runtime/channels/channel-dispatchers.d.ts +4 -3
  85. package/dist/runtime/channels/channel-dispatchers.js +62 -54
  86. package/dist/runtime/channels/channel-envelope-inspection.d.ts +1 -2
  87. package/dist/runtime/channels/channel-envelope-inspection.js +1 -16
  88. package/dist/runtime/channels/channel-envelope.d.ts +2 -0
  89. package/dist/runtime/channels/channel-envelope.js +146 -28
  90. package/dist/runtime/channels/channel-outbound-operations.d.ts +2 -2
  91. package/dist/runtime/channels/channel-outbound-operations.js +8 -8
  92. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
  93. package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
  94. package/dist/runtime/channels/channel-runtime-manager.d.ts +9 -8
  95. package/dist/runtime/channels/channel-runtime-manager.js +16 -16
  96. package/dist/runtime/channels/channel-transports.d.ts +18 -16
  97. package/dist/runtime/channels/channel-transports.js +77 -58
  98. package/dist/runtime/channels/client-server-location-runtime.js +5 -4
  99. package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
  100. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  101. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  102. package/dist/runtime/channels/fanout-location-runtime.js +3 -3
  103. package/dist/runtime/channels/local-spot-route-transport.d.ts +1 -1
  104. package/dist/runtime/channels/local-spot-route-transport.js +2 -1
  105. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +2 -2
  106. package/dist/runtime/channels/router-socket-spot-route-transport.js +4 -4
  107. package/dist/runtime/channels/source-spot-router.d.ts +2 -2
  108. package/dist/runtime/channels/source-spot-router.js +4 -4
  109. package/dist/runtime/channels/spot-node-route-transport.d.ts +2 -2
  110. package/dist/runtime/channels/spot-node-route-transport.js +4 -4
  111. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +2 -2
  112. package/dist/runtime/channels/spot-route-bridge-transport.js +4 -4
  113. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +5 -4
  114. package/dist/runtime/channels/spot-route-dispatch-strategy.js +18 -18
  115. package/dist/runtime/diagnostics/flow-context.js +19 -7
  116. package/dist/runtime/diagnostics/index.js +4 -9
  117. package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
  118. package/dist/runtime/diagnostics/message-flow.js +35 -5
  119. package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
  120. package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
  121. package/dist/runtime/execution/index.d.ts +4 -2
  122. package/dist/runtime/execution/index.js +33 -10
  123. package/dist/runtime/execution/serial-execution-queue.d.ts +5 -0
  124. package/dist/runtime/execution/serial-execution-queue.js +22 -2
  125. package/dist/runtime/execution/state-lane.d.ts +2 -0
  126. package/dist/runtime/execution/state-lane.js +5 -0
  127. package/dist/runtime/foundation/actor-join-recovery-codec.js +2 -2
  128. package/dist/runtime/foundation/durable-service-request.d.ts +14 -0
  129. package/dist/runtime/foundation/durable-service-request.js +98 -0
  130. package/dist/runtime/foundation/operation-identity.d.ts +1 -0
  131. package/dist/runtime/foundation/operation-identity.js +5 -1
  132. package/dist/runtime/foundation/operation-registry.d.ts +25 -1
  133. package/dist/runtime/foundation/operation-registry.js +86 -18
  134. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +61 -8
  135. package/dist/runtime/foundation/raw-service-mesh-runtime.js +486 -266
  136. package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
  137. package/dist/runtime/foundation/service-liveness-registry.js +38 -0
  138. package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
  139. package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
  140. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +3 -3
  141. package/dist/runtime/foundation/service-relocation-object-owner.js +48 -34
  142. package/dist/runtime/foundation/service-relocation-runtime.d.ts +2 -0
  143. package/dist/runtime/foundation/service-relocation-runtime.js +20 -4
  144. package/dist/runtime/foundation/service-runtime-contracts.d.ts +10 -1
  145. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
  146. package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
  147. package/dist/runtime/foundation/service-stateful-registry.js +24 -26
  148. package/dist/runtime/foundation/service-stateful-runtime.d.ts +75 -9
  149. package/dist/runtime/foundation/service-stateful-runtime.js +486 -218
  150. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -6
  151. package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
  152. package/dist/runtime/foundation/service-topology-registry.d.ts +12 -2
  153. package/dist/runtime/foundation/service-topology-registry.js +61 -27
  154. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
  155. package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
  156. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  157. package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
  158. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +13 -3
  159. package/dist/runtime/foundation/service-wire-m6a-codec.js +189 -78
  160. package/dist/runtime/handlers/handler-instance-scope.d.ts +8 -0
  161. package/dist/runtime/handlers/handler-instance-scope.js +54 -11
  162. package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
  163. package/dist/runtime/host/actor-packet-relay.js +59 -72
  164. package/dist/runtime/host/actor-placement-coordinator.js +25 -8
  165. package/dist/runtime/host/actor-runtime-options-factory.js +2 -2
  166. package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
  167. package/dist/runtime/host/actor-transfer-runtime.js +85 -331
  168. package/dist/runtime/host/application-job-queue.d.ts +40 -7
  169. package/dist/runtime/host/application-job-queue.js +137 -42
  170. package/dist/runtime/host/entry-actor-runtime.d.ts +1 -0
  171. package/dist/runtime/host/entry-actor-runtime.js +3 -0
  172. package/dist/runtime/host/index.d.ts +12 -2
  173. package/dist/runtime/host/index.js +300 -202
  174. package/dist/runtime/host/location-runtime-owner.js +2 -6
  175. package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
  176. package/dist/runtime/host/mesh-router-resolver.js +14 -6
  177. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
  178. package/dist/runtime/host/remote-bound-session-relay.js +73 -208
  179. package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
  180. package/dist/runtime/host/route-mesh-runtime.js +6 -4
  181. package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
  182. package/dist/runtime/host/runtime-shutdown.js +3 -2
  183. package/dist/runtime/host/service-relocation-control.d.ts +1 -0
  184. package/dist/runtime/host/service-relocation-control.js +10 -4
  185. package/dist/runtime/host/service-relocation-host-runtime.d.ts +22 -14
  186. package/dist/runtime/host/service-relocation-host-runtime.js +754 -599
  187. package/dist/runtime/host/spot-address-transport.js +3 -2
  188. package/dist/runtime/host/spot-runtime-options-factory.js +16 -7
  189. package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
  190. package/dist/runtime/locations/actor-location-claims.d.ts +2 -2
  191. package/dist/runtime/locations/actor-location-claims.js +34 -19
  192. package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
  193. package/dist/runtime/locations/auto-connect-loop.js +22 -14
  194. package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
  195. package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
  196. package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
  197. package/dist/runtime/locations/descriptor-publication.js +11 -0
  198. package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
  199. package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
  200. package/dist/runtime/locations/in-memory-authority-store.js +56 -19
  201. package/dist/runtime/locations/in-memory-location-store.js +1 -10
  202. package/dist/runtime/locations/index.d.ts +1 -0
  203. package/dist/runtime/locations/index.js +1 -0
  204. package/dist/runtime/locations/lease-tracker.js +1 -6
  205. package/dist/runtime/locations/lifecycle.d.ts +1 -2
  206. package/dist/runtime/locations/lifecycle.js +2 -5
  207. package/dist/runtime/locations/location-store-repository.d.ts +51 -1
  208. package/dist/runtime/locations/location-store-repository.js +363 -139
  209. package/dist/runtime/locations/relocation-blob.d.ts +18 -1
  210. package/dist/runtime/locations/relocation-blob.js +52 -1
  211. package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
  212. package/dist/runtime/locations/request-source-resolver.js +80 -0
  213. package/dist/runtime/locations/resolvers.js +1 -1
  214. package/dist/runtime/locations/runtime.d.ts +7 -3
  215. package/dist/runtime/locations/runtime.js +61 -53
  216. package/dist/runtime/messaging/framework-json-v1.d.ts +4 -6
  217. package/dist/runtime/messaging/framework-json-v1.js +38 -294
  218. package/dist/runtime/messaging/packet-name.d.ts +1 -1
  219. package/dist/runtime/messaging/packet-name.js +8 -24
  220. package/dist/runtime/messaging/payload-codec.d.ts +7 -1
  221. package/dist/runtime/messaging/payload-codec.js +7 -6
  222. package/dist/runtime/messaging/request-result.d.ts +2 -0
  223. package/dist/runtime/messaging/request-result.js +57 -0
  224. package/dist/runtime/messaging/submission-result.d.ts +1 -0
  225. package/dist/runtime/messaging/submission-result.js +5 -2
  226. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +34 -1
  227. package/dist/runtime/protocol/service_wire_codec.generated.js +229 -0
  228. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +16 -1
  229. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +37 -8
  230. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +7 -2
  231. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +36 -21
  232. package/dist/runtime/spots/index.d.ts +21 -11
  233. package/dist/runtime/spots/index.js +243 -178
  234. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
  235. package/dist/runtime/spots/spot-activation-registry.js +21 -11
  236. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  237. package/dist/runtime/spots/spot-activation-state.js +7 -7
  238. package/dist/runtime/spots/spot-activation.d.ts +7 -3
  239. package/dist/runtime/spots/spot-activation.js +140 -52
  240. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
  241. package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
  242. package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
  243. package/dist/runtime/spots/spot-actor-membership.js +0 -8
  244. package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
  245. package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
  246. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
  247. package/dist/runtime/spots/spot-entry-activation.js +20 -11
  248. package/dist/runtime/spots/spot-handler-registry.d.ts +7 -4
  249. package/dist/runtime/spots/spot-handler-registry.js +24 -10
  250. package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
  251. package/dist/runtime/spots/spot-manager-public.js +2 -2
  252. package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
  253. package/dist/runtime/spots/spot-node-autoconnect.js +22 -42
  254. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
  255. package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
  256. package/dist/runtime/spots/spot-outbound.d.ts +3 -0
  257. package/dist/runtime/spots/spot-outbound.js +27 -18
  258. package/dist/runtime/spots/spot-remote-codec.js +5 -1
  259. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +1 -0
  260. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +1 -1
  261. package/dist/runtime/spots/spot-runtime-ports.d.ts +1 -1
  262. package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
  263. package/dist/runtime/spots/spot-serial-executor.js +61 -8
  264. package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
  265. package/dist/runtime/spots/spot-subscription-dispatch.js +1 -4
  266. package/dist/runtime/spots/spot-timer.d.ts +57 -5
  267. package/dist/runtime/spots/spot-timer.js +288 -103
  268. package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
  269. package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
  270. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
  271. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
  272. package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
  273. package/dist/runtime/streams/bound-session-service.d.ts +1 -1
  274. package/dist/runtime/streams/bound-session-service.js +6 -11
  275. package/dist/runtime/streams/index.d.ts +3 -2
  276. package/dist/runtime/streams/index.js +6 -4
  277. package/dist/runtime/streams/managed-stream.js +3 -2
  278. package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
  279. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
  280. package/dist/runtime/streams/session-actor-coordinator.js +15 -32
  281. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
  282. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -1
  283. package/dist/runtime/streams/stream-session-runtime.js +14 -31
  284. package/dist/runtime/workers/index.js +1 -1
  285. package/package.json +3 -3
  286. package/src/contracts/Actors/ZLinkActorClient.ts +2 -1
  287. package/src/contracts/Channels/Calls.ts +2 -1
  288. package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
  289. package/src/contracts/Common/ZLinkMessageMetadata.ts +13 -8
  290. package/src/contracts/Common/encoded-payload-storage.ts +6 -3
  291. package/src/contracts/Configuration/Builders.ts +4 -1
  292. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
  293. package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
  294. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  295. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
  296. package/src/contracts/Handlers/Attributes.ts +14 -21
  297. package/src/contracts/Handlers/JsonContract.ts +8 -216
  298. package/src/contracts/Locations/Rows.ts +2 -0
  299. package/src/contracts/Spots/Contracts.ts +10 -1
  300. package/src/contracts/Spots/ZLinkSpot.ts +3 -3
  301. package/src/nest-integration.ts +1 -0
  302. package/src/runtime/abort.ts +12 -0
  303. package/src/runtime/actors/actor-authority-publication.ts +3 -2
  304. package/src/runtime/actors/actor-client.ts +100 -85
  305. package/src/runtime/actors/actor-context.ts +49 -9
  306. package/src/runtime/actors/actor-handoff.ts +291 -110
  307. package/src/runtime/actors/actor-join-relocation.ts +3 -0
  308. package/src/runtime/actors/actor-local-native-join.ts +21 -26
  309. package/src/runtime/actors/actor-mailbox.ts +40 -2
  310. package/src/runtime/actors/actor-remote-joiner.ts +6 -1
  311. package/src/runtime/actors/actor-remote-wire.ts +17 -0
  312. package/src/runtime/actors/actor-reply.ts +42 -0
  313. package/src/runtime/actors/actor-routed-join-transport.ts +14 -4
  314. package/src/runtime/actors/actor-routed-json-request.ts +10 -2
  315. package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
  316. package/src/runtime/actors/actor-runtime-state.ts +2 -20
  317. package/src/runtime/actors/actor-source-transfer.ts +1 -34
  318. package/src/runtime/actors/index.ts +60 -32
  319. package/src/runtime/actors/session-disconnected-wire.ts +66 -0
  320. package/src/runtime/actors/spot-actor-dispatch.ts +4 -2
  321. package/src/runtime/admission.ts +69 -21
  322. package/src/runtime/application-jobs/application-ingress-record-owner.ts +41 -25
  323. package/src/runtime/application-jobs/application-job-queue-scope.ts +83 -22
  324. package/src/runtime/application-jobs/contracts.ts +16 -1
  325. package/src/runtime/backend/contracts/index.ts +92 -18
  326. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
  327. package/src/runtime/backend/mesh-completion-table.ts +160 -57
  328. package/src/runtime/backend/mesh-dispatch-pump.ts +237 -108
  329. package/src/runtime/backend/node/node-backend-adapter-support.ts +17 -8
  330. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +12 -2
  331. package/src/runtime/backend/node/node-raw-binding-port.ts +148 -85
  332. package/src/runtime/backend/node/node-raw-mesh-backend.ts +315 -201
  333. package/src/runtime/backend/node/node-socket-backend-adapter.ts +26 -11
  334. package/src/runtime/backend/raw-binding-port.ts +7 -2
  335. package/src/runtime/backend/runtime-message.ts +6 -0
  336. package/src/runtime/backend/runtime-values.ts +1 -0
  337. package/src/runtime/channels/channel-clients.ts +132 -58
  338. package/src/runtime/channels/channel-dispatch-pipeline.ts +198 -114
  339. package/src/runtime/channels/channel-dispatch-services.ts +69 -1
  340. package/src/runtime/channels/channel-dispatchers.ts +136 -90
  341. package/src/runtime/channels/channel-envelope-inspection.ts +2 -16
  342. package/src/runtime/channels/channel-envelope.ts +225 -31
  343. package/src/runtime/channels/channel-outbound-operations.ts +22 -8
  344. package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
  345. package/src/runtime/channels/channel-runtime-manager.ts +41 -17
  346. package/src/runtime/channels/channel-transports.ts +171 -112
  347. package/src/runtime/channels/client-server-location-runtime.ts +11 -10
  348. package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
  349. package/src/runtime/channels/fanout-location-runtime.ts +17 -9
  350. package/src/runtime/channels/local-spot-route-transport.ts +3 -1
  351. package/src/runtime/channels/router-socket-spot-route-transport.ts +13 -4
  352. package/src/runtime/channels/source-spot-router.ts +8 -4
  353. package/src/runtime/channels/spot-node-route-transport.ts +8 -4
  354. package/src/runtime/channels/spot-route-bridge-transport.ts +6 -4
  355. package/src/runtime/channels/spot-route-dispatch-strategy.ts +47 -18
  356. package/src/runtime/diagnostics/flow-context.ts +20 -7
  357. package/src/runtime/diagnostics/index.ts +1 -7
  358. package/src/runtime/diagnostics/message-flow.ts +47 -9
  359. package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
  360. package/src/runtime/execution/index.ts +40 -14
  361. package/src/runtime/execution/serial-execution-queue.ts +33 -4
  362. package/src/runtime/execution/state-lane.ts +7 -0
  363. package/src/runtime/foundation/actor-join-recovery-codec.ts +2 -2
  364. package/src/runtime/foundation/durable-service-request.ts +137 -0
  365. package/src/runtime/foundation/operation-identity.ts +5 -1
  366. package/src/runtime/foundation/operation-registry.ts +98 -20
  367. package/src/runtime/foundation/raw-service-mesh-runtime.ts +704 -336
  368. package/src/runtime/foundation/service-liveness-registry.ts +39 -0
  369. package/src/runtime/foundation/service-mailbox.ts +8 -0
  370. package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
  371. package/src/runtime/foundation/service-relocation-object-owner.ts +55 -36
  372. package/src/runtime/foundation/service-relocation-runtime.ts +25 -4
  373. package/src/runtime/foundation/service-runtime-contracts.ts +19 -2
  374. package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
  375. package/src/runtime/foundation/service-stateful-registry.ts +38 -35
  376. package/src/runtime/foundation/service-stateful-runtime.ts +732 -275
  377. package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -16
  378. package/src/runtime/foundation/service-topology-registry.ts +91 -36
  379. package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
  380. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  381. package/src/runtime/foundation/service-wire-m6a-codec.ts +231 -76
  382. package/src/runtime/handlers/handler-instance-scope.ts +67 -16
  383. package/src/runtime/host/actor-packet-relay.ts +113 -94
  384. package/src/runtime/host/actor-placement-coordinator.ts +31 -8
  385. package/src/runtime/host/actor-runtime-options-factory.ts +13 -2
  386. package/src/runtime/host/actor-transfer-runtime.ts +104 -430
  387. package/src/runtime/host/application-job-queue.ts +160 -41
  388. package/src/runtime/host/entry-actor-runtime.ts +4 -0
  389. package/src/runtime/host/index.ts +473 -271
  390. package/src/runtime/host/location-runtime-owner.ts +2 -6
  391. package/src/runtime/host/mesh-router-resolver.ts +13 -5
  392. package/src/runtime/host/remote-bound-session-relay.ts +88 -271
  393. package/src/runtime/host/route-mesh-runtime.ts +12 -6
  394. package/src/runtime/host/runtime-shutdown.ts +15 -4
  395. package/src/runtime/host/service-relocation-control.ts +11 -5
  396. package/src/runtime/host/service-relocation-host-runtime.ts +1092 -759
  397. package/src/runtime/host/spot-address-transport.ts +4 -2
  398. package/src/runtime/host/spot-runtime-options-factory.ts +20 -7
  399. package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
  400. package/src/runtime/locations/actor-location-claims.ts +52 -30
  401. package/src/runtime/locations/auto-connect-loop.ts +22 -14
  402. package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
  403. package/src/runtime/locations/auto-connect-types.ts +0 -1
  404. package/src/runtime/locations/descriptor-publication.ts +7 -0
  405. package/src/runtime/locations/domain-store-contract.ts +5 -0
  406. package/src/runtime/locations/in-memory-authority-store.ts +85 -23
  407. package/src/runtime/locations/in-memory-location-store.ts +1 -12
  408. package/src/runtime/locations/index.ts +1 -0
  409. package/src/runtime/locations/lease-tracker.ts +2 -9
  410. package/src/runtime/locations/lifecycle.ts +8 -26
  411. package/src/runtime/locations/location-store-repository.ts +628 -152
  412. package/src/runtime/locations/relocation-blob.ts +75 -1
  413. package/src/runtime/locations/request-source-resolver.ts +138 -0
  414. package/src/runtime/locations/resolvers.ts +2 -2
  415. package/src/runtime/locations/runtime.ts +98 -64
  416. package/src/runtime/messaging/framework-json-v1.ts +5 -325
  417. package/src/runtime/messaging/packet-name.ts +5 -25
  418. package/src/runtime/messaging/payload-codec.ts +8 -11
  419. package/src/runtime/messaging/request-result.ts +62 -0
  420. package/src/runtime/messaging/submission-result.ts +5 -1
  421. package/src/runtime/protocol/service_wire_codec.generated.ts +218 -5
  422. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +16 -13
  423. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +46 -25
  424. package/src/runtime/spots/index.ts +389 -283
  425. package/src/runtime/spots/spot-activation-registry.ts +25 -13
  426. package/src/runtime/spots/spot-activation-state.ts +12 -19
  427. package/src/runtime/spots/spot-activation.ts +198 -96
  428. package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
  429. package/src/runtime/spots/spot-actor-membership.ts +0 -15
  430. package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
  431. package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
  432. package/src/runtime/spots/spot-entry-activation.ts +33 -21
  433. package/src/runtime/spots/spot-handler-registry.ts +56 -12
  434. package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
  435. package/src/runtime/spots/spot-manager-public.ts +2 -2
  436. package/src/runtime/spots/spot-node-autoconnect.ts +28 -47
  437. package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
  438. package/src/runtime/spots/spot-outbound.ts +39 -19
  439. package/src/runtime/spots/spot-remote-codec.ts +9 -2
  440. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +2 -1
  441. package/src/runtime/spots/spot-runtime-ports.ts +1 -1
  442. package/src/runtime/spots/spot-serial-executor.ts +97 -25
  443. package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
  444. package/src/runtime/spots/spot-subscription-dispatch.ts +1 -4
  445. package/src/runtime/spots/spot-timer.ts +418 -158
  446. package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
  447. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
  448. package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
  449. package/src/runtime/streams/bound-session-service.ts +7 -10
  450. package/src/runtime/streams/index.ts +12 -6
  451. package/src/runtime/streams/managed-stream.ts +4 -2
  452. package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
  453. package/src/runtime/streams/session-actor-coordinator.ts +39 -88
  454. package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
  455. package/src/runtime/streams/stream-session-runtime.ts +13 -34
  456. package/src/runtime/workers/index.ts +1 -1
@@ -4,7 +4,7 @@ export declare function wrapSocket<T extends {
4
4
  close(): void;
5
5
  }>(nativeInstance: T, pollCompletion?: boolean): T & ZLinkBackendObject;
6
6
  export declare function nodeEventLoopPollerOf(socket: object): ZLinkNodeEventLoopPoller;
7
- export declare function disconnectStreamPeer(socket: {
7
+ export declare function disconnectSocketPeer(socket: {
8
8
  disconnectRid(routingId: unknown): void;
9
9
  }, routingId: unknown): void;
10
10
  export declare function isEndpointCloseIgnorableError(error: unknown): boolean;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.wrapSocket = wrapSocket;
4
4
  exports.nodeEventLoopPollerOf = nodeEventLoopPollerOf;
5
- exports.disconnectStreamPeer = disconnectStreamPeer;
5
+ exports.disconnectSocketPeer = disconnectSocketPeer;
6
6
  exports.isEndpointCloseIgnorableError = isEndpointCloseIgnorableError;
7
7
  const RegistrationBuilderPolicy_1 = require("../../../contracts/Configuration/RegistrationBuilderPolicy");
8
8
  const node_backend_adapter_support_1 = require("./node-backend-adapter-support");
@@ -144,12 +144,12 @@ function wrapSocket(nativeInstance, pollCompletion) {
144
144
  },
145
145
  request(...args) {
146
146
  if (hasRoutedPeer) {
147
- const [routingId, payload, timeoutMs] = args;
148
- return (0, node_backend_adapter_support_1.submitBindingRequest)(nativeInstance.request((0, node_backend_adapter_support_1.toNativeRoutingId)(routingId)), payload, timeoutMs);
147
+ const [routingId, payload, timeoutMs, onAdmitted] = args;
148
+ return (0, node_backend_adapter_support_1.submitBindingRequest)(nativeInstance.request((0, node_backend_adapter_support_1.toNativeRoutingId)(routingId)), payload, timeoutMs, undefined, onAdmitted);
149
149
  }
150
150
  if (hasRequest) {
151
- const [payload, timeoutMs] = args;
152
- return (0, node_backend_adapter_support_1.submitBindingRequest)(nativeInstance.request(), payload, timeoutMs, adapter.receiveAdmission?.recordReceived);
151
+ const [payload, timeoutMs, onAdmitted] = args;
152
+ return (0, node_backend_adapter_support_1.submitBindingRequest)(nativeInstance.request(), payload, timeoutMs, adapter.receiveAdmission?.recordReceived, onAdmitted);
153
153
  }
154
154
  throw new TypeError('Backend request requires a DEALER or ROUTER socket.');
155
155
  },
@@ -201,11 +201,11 @@ function wrapSocket(nativeInstance, pollCompletion) {
201
201
  const operation = nativeInstance.sendToSpot((0, node_backend_adapter_support_1.toNativeRoutingId)(targetRid), (0, node_backend_adapter_support_1.toNativeRoutingId)(targetSpot));
202
202
  await (0, node_backend_adapter_support_1.submitBindingAsyncSend)(operation, payload);
203
203
  },
204
- requestToSpot(targetRid, targetSpot, payload, timeoutMs) {
205
- return (0, node_backend_adapter_support_1.submitBindingRequest)(nativeInstance.requestToSpot((0, node_backend_adapter_support_1.toNativeRoutingId)(targetRid), (0, node_backend_adapter_support_1.toNativeRoutingId)(targetSpot)), payload, timeoutMs);
204
+ requestToSpot(targetRid, targetSpot, payload, timeoutMs, onAdmitted) {
205
+ return (0, node_backend_adapter_support_1.submitBindingRequest)(nativeInstance.requestToSpot((0, node_backend_adapter_support_1.toNativeRoutingId)(targetRid), (0, node_backend_adapter_support_1.toNativeRoutingId)(targetSpot)), payload, timeoutMs, undefined, onAdmitted);
206
206
  },
207
207
  disconnectPeer(routingId) {
208
- disconnectStreamPeer(nativeInstance, routingId);
208
+ disconnectSocketPeer(nativeInstance, (0, node_backend_adapter_support_1.toNativeRoutingId)(routingId));
209
209
  },
210
210
  async bindActor(_sessionRid, _actor, _timeoutMs, _signal) {
211
211
  throw new Error('Session Actor dispatch requires enableActorDispatch() and a Framework MeshNode service route.');
@@ -228,13 +228,13 @@ function nodeEventLoopPollerOf(socket) {
228
228
  }
229
229
  return poller;
230
230
  }
231
- function disconnectStreamPeer(socket, routingId) {
231
+ function disconnectSocketPeer(socket, routingId) {
232
232
  try {
233
- socket.disconnectRid((0, node_backend_adapter_support_1.toNativeRoutingId)(routingId));
233
+ socket.disconnectRid(routingId);
234
234
  }
235
235
  catch (error) {
236
236
  // An absent RID has already completed the physical close. The existing
237
- // session lifecycle still owns local cleanup and unbind.
237
+ // logical lifecycle still owns local cleanup and unbind.
238
238
  if (!(0, node_backend_adapter_support_1.isBindingNotFound)(error))
239
239
  throw error;
240
240
  }
@@ -56,7 +56,7 @@ export interface ZLinkRawRouterPort extends ZLinkRawSocketPort {
56
56
  setRoutingId(routingId: string): void;
57
57
  connectToRoutingId(routingId: string, endpoint: string): void;
58
58
  send(targetRid: string, parts: readonly Uint8Array[]): Promise<void>;
59
- request(targetRid: string, parts: readonly Uint8Array[], timeoutMs: number, recordReceived?: () => void): Promise<readonly Buffer[]>;
59
+ request(targetRid: string, parts: readonly Uint8Array[], timeoutMs: number, recordReceived?: () => void, onAdmitted?: () => void): Promise<readonly Buffer[]>;
60
60
  receive(dontWait?: boolean): ZLinkRawReceivedRecord | undefined;
61
61
  /** The selected route of every RID. The socket's one route observer calls it. */
62
62
  routesSnapshot(): readonly ZLinkRawRouterRoute[];
@@ -64,7 +64,7 @@ export interface ZLinkRawRouterPort extends ZLinkRawSocketPort {
64
64
  export interface ZLinkRawDealerPort extends ZLinkRawSocketPort {
65
65
  setRoutingId(routingId: string): void;
66
66
  send(parts: readonly Uint8Array[]): Promise<void>;
67
- request(parts: readonly Uint8Array[], timeoutMs: number): Promise<readonly Buffer[]>;
67
+ request(parts: readonly Uint8Array[], timeoutMs: number, onAdmitted?: () => void): Promise<readonly Buffer[]>;
68
68
  receive(dontWait?: boolean): ZLinkRawReceivedRecord | undefined;
69
69
  }
70
70
  export interface ZLinkRawHostPort {
@@ -4,6 +4,7 @@ export declare class ZLinkBufferMessage implements Message {
4
4
  private constructor();
5
5
  static from(value: Message | Buffer | Uint8Array | string): ZLinkBufferMessage;
6
6
  static fromOwned(bytes: Buffer): ZLinkBufferMessage;
7
+ static retainPayload(message: Message): Buffer;
7
8
  data(): Buffer;
8
9
  toBytes(): Uint8Array;
9
10
  copy(): Message;
@@ -16,6 +16,11 @@ class ZLinkBufferMessage {
16
16
  static fromOwned(bytes) {
17
17
  return new ZLinkBufferMessage(bytes);
18
18
  }
19
+ static retainPayload(message) {
20
+ // Binding data() Buffers retain their storage after the message handle closes.
21
+ // Preserve that ownership at runtime boundaries without copying the payload.
22
+ return message.data();
23
+ }
19
24
  data() {
20
25
  return this.bytes;
21
26
  }
@@ -36,6 +36,7 @@ export type SubmitResult = (typeof SubmitResult)[keyof typeof SubmitResult];
36
36
  export type ZLinkBackendSendFlags = number;
37
37
  export type ZLinkBackendRecvFlags = number;
38
38
  export declare const ZLINK_BACKEND_SEND_NONE: ZLinkBackendSendFlags;
39
+ export declare const ZLINK_BACKEND_SEND_DONT_WAIT: ZLinkBackendSendFlags;
39
40
  export declare const ZLINK_BACKEND_RECV_DONT_WAIT: ZLinkBackendRecvFlags;
40
41
  export declare class ZLinkBackendResultError extends Error {
41
42
  readonly operation: 'request' | 'submit';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ZLinkBackendResultError = exports.ZLINK_BACKEND_RECV_DONT_WAIT = exports.ZLINK_BACKEND_SEND_NONE = exports.SubmitResult = exports.RequestResult = void 0;
3
+ exports.ZLinkBackendResultError = exports.ZLINK_BACKEND_RECV_DONT_WAIT = exports.ZLINK_BACKEND_SEND_DONT_WAIT = exports.ZLINK_BACKEND_SEND_NONE = exports.SubmitResult = exports.RequestResult = void 0;
4
4
  exports.isZLinkBackendResultError = isZLinkBackendResultError;
5
5
  exports.isBackendNotConnectedError = isBackendNotConnectedError;
6
6
  exports.isBackendRequestTimeoutError = isBackendRequestTimeoutError;
@@ -37,6 +37,7 @@ exports.SubmitResult = Object.freeze({
37
37
  NotAdmitted: 13
38
38
  });
39
39
  exports.ZLINK_BACKEND_SEND_NONE = 0;
40
+ exports.ZLINK_BACKEND_SEND_DONT_WAIT = 1;
40
41
  exports.ZLINK_BACKEND_RECV_DONT_WAIT = 1;
41
42
  class ZLinkBackendResultError extends Error {
42
43
  operation;
@@ -35,6 +35,8 @@ export declare class DefaultZLinkRouteClient implements ZLinkRouteClient {
35
35
  private readonly transport?;
36
36
  private readonly spotRouterChannelIdForMesh;
37
37
  private readonly channelTransport?;
38
+ private readonly nodeSends;
39
+ private readonly nodeRequests;
38
40
  constructor(registration: ZLinkFrameworkRegistration, transport?: ZLinkRouteClientTransport | undefined, spotRouterChannelIdForMesh?: (meshName: string) => string, channelTransport?: ZLinkChannelClientTransportSource | undefined);
39
41
  sendToNode(meshName: string, targetNodeRid: string, message: unknown): ZLinkSendCall;
40
42
  requestToNode(meshName: string, targetNodeRid: string, request: unknown): ZLinkRequestCall;
@@ -4,6 +4,7 @@ exports.DefaultZLinkSpotPublisherClient = exports.DefaultZLinkRouteClient = expo
4
4
  exports.resolveChannelRoute = resolveChannelRoute;
5
5
  exports.requireUniqueRouteMeshChannel = requireUniqueRouteMeshChannel;
6
6
  const Registration_1 = require("../../contracts/Configuration/Registration");
7
+ const request_result_1 = require("../messaging/request-result");
7
8
  const configuration_1 = require("../configuration");
8
9
  const framework_errors_internal_1 = require("../framework-errors-internal");
9
10
  const submission_result_1 = require("../messaging/submission-result");
@@ -79,6 +80,8 @@ class DefaultZLinkRouteClient {
79
80
  transport;
80
81
  spotRouterChannelIdForMesh;
81
82
  channelTransport;
83
+ nodeSends = new Map();
84
+ nodeRequests = new Map();
82
85
  constructor(registration, transport, spotRouterChannelIdForMesh = (meshName) => meshName, channelTransport) {
83
86
  this.registration = registration;
84
87
  this.transport = transport;
@@ -86,10 +89,34 @@ class DefaultZLinkRouteClient {
86
89
  this.channelTransport = channelTransport;
87
90
  }
88
91
  sendToNode(meshName, targetNodeRid, message) {
89
- return new DefaultZLinkSendCall(() => this.requireMesh(meshName), async (packetName, metadata) => normalizeSubmitResult(await this.requireTransport().submit(meshName, targetNodeRid, packetName, message, metadata)));
92
+ let targets = this.nodeSends.get(meshName);
93
+ if (targets === undefined)
94
+ this.nodeSends.set(meshName, (targets = new Map()));
95
+ let prepared = targets.get(targetNodeRid);
96
+ if (prepared === undefined) {
97
+ prepared = {
98
+ validate: () => {
99
+ this.requireMesh(meshName);
100
+ },
101
+ submit: (packetName, metadata, payload) => normalizeSubmitResult(this.requireTransport().submit(meshName, targetNodeRid, packetName, payload, metadata))
102
+ };
103
+ targets.set(targetNodeRid, prepared);
104
+ }
105
+ return new DefaultZLinkSendCall(prepared.validate, prepared.submit, message);
90
106
  }
91
107
  requestToNode(meshName, targetNodeRid, request) {
92
- return new DefaultZLinkRequestCall(() => this.requireMesh(meshName), (packetName, timeoutMs, metadata, signal) => this.requireTransport().request(meshName, targetNodeRid, packetName, request, timeoutMs, signal, metadata), this.defaultRequestTimeout(meshName));
108
+ let targets = this.nodeRequests.get(meshName);
109
+ if (targets === undefined)
110
+ this.nodeRequests.set(meshName, (targets = new Map()));
111
+ let prepared = targets.get(targetNodeRid);
112
+ if (prepared === undefined) {
113
+ prepared = {
114
+ validate: () => this.requireMesh(meshName),
115
+ submit: (packetName, timeoutMs, metadata, signal, onAdmitted, message) => this.requireTransport().request(meshName, targetNodeRid, packetName, message, timeoutMs, signal, metadata, onAdmitted)
116
+ };
117
+ targets.set(targetNodeRid, prepared);
118
+ }
119
+ return new DefaultZLinkRequestCall(prepared.validate, prepared.submit, this.defaultRequestTimeout(meshName), request);
93
120
  }
94
121
  sendToChannel(channelName, message) {
95
122
  return new DefaultZLinkSendCall(() => this.requireChannelRoute(channelName), async (packetName, metadata) => {
@@ -101,12 +128,12 @@ class DefaultZLinkRouteClient {
101
128
  });
102
129
  }
103
130
  requestToChannel(channelName, request) {
104
- return new DefaultZLinkRequestCall(() => this.requireChannelRoute(channelName), (packetName, timeoutMs, metadata, signal) => {
131
+ return new DefaultZLinkRequestCall(() => this.requireChannelRoute(channelName), (packetName, timeoutMs, metadata, signal, onAdmitted) => {
105
132
  const route = this.requireChannelRoute(channelName);
106
133
  if (route.kind === 'route-mesh') {
107
- return this.requireTransport().requestToChannel(route.meshName, channelName, packetName, request, timeoutMs, signal, metadata);
134
+ return this.requireTransport().requestToChannel(route.meshName, channelName, packetName, request, timeoutMs, signal, metadata, onAdmitted);
108
135
  }
109
- return this.requireChannelTransport().request(channelName, packetName, request, timeoutMs, signal, metadata);
136
+ return this.requireChannelTransport().request(channelName, packetName, request, timeoutMs, signal, metadata, onAdmitted);
110
137
  }, this.defaultRequestTimeoutForChannel(channelName));
111
138
  }
112
139
  sendToSpot(spot, message) {
@@ -123,10 +150,11 @@ class DefaultZLinkRouteClient {
123
150
  requestToSpot(spot, request) {
124
151
  return new DefaultZLinkRequestCall(() => {
125
152
  this.requireSpotTransport();
126
- }, (_packetName, timeoutMs, metadata, signal) => (0, spot_outbound_1.requestToSpotHandle)(this.requireSpotTransport(), spot, request, {
153
+ }, (_packetName, timeoutMs, metadata, signal, onAdmitted) => (0, spot_outbound_1.requestToSpotHandle)(this.requireSpotTransport(), spot, request, {
127
154
  timeoutMs,
128
155
  signal,
129
156
  metadata,
157
+ onAdmitted,
130
158
  spotRouterChannelIdForMesh: this.spotRouterChannelIdForMesh
131
159
  }), this.registration.requestTimeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS);
132
160
  }
@@ -217,14 +245,17 @@ exports.DefaultZLinkSpotPublisherClient = DefaultZLinkSpotPublisherClient;
217
245
  class DefaultZLinkSendCall {
218
246
  validate;
219
247
  submitter;
220
- selectedMetadata = new Map();
248
+ message;
249
+ selectedMetadata;
221
250
  executed = false;
222
- constructor(validate, submitter) {
251
+ constructor(validate, submitter, message) {
223
252
  this.validate = validate;
224
253
  this.submitter = submitter;
254
+ this.message = message;
225
255
  }
226
256
  metadata(keyOrMetadata, value) {
227
257
  ensureNotExecuted(this.executed);
258
+ this.selectedMetadata ??= new Map();
228
259
  if (typeof keyOrMetadata === 'string') {
229
260
  this.selectedMetadata.set(keyOrMetadata, value);
230
261
  }
@@ -235,12 +266,20 @@ class DefaultZLinkSendCall {
235
266
  }
236
267
  return this;
237
268
  }
238
- async submit() {
239
- ensureNotExecuted(this.executed);
240
- this.validate();
241
- this.executed = true;
242
- const result = await this.submitter(undefined, new Map(this.selectedMetadata));
243
- (0, submission_result_1.requireOneWayCompletion)(result, 'One-way send');
269
+ submit() {
270
+ try {
271
+ ensureNotExecuted(this.executed);
272
+ this.validate();
273
+ this.executed = true;
274
+ const result = this.submitter(undefined, this.selectedMetadata ?? EMPTY_CALL_METADATA, this.message);
275
+ if (result instanceof Promise)
276
+ return result.then(completeOneWaySend);
277
+ completeOneWaySend(result);
278
+ return completedOneWaySend;
279
+ }
280
+ catch (error) {
281
+ return Promise.reject(error);
282
+ }
244
283
  }
245
284
  }
246
285
  function ensureNotExecuted(executed) {
@@ -248,22 +287,33 @@ function ensureNotExecuted(executed) {
248
287
  (0, submission_result_1.throwAlreadySubmitted)('ZLink call');
249
288
  }
250
289
  }
290
+ const EMPTY_CALL_METADATA = new Map();
291
+ const completedOneWaySend = Promise.resolve();
292
+ function completeOneWaySend(result) {
293
+ (0, submission_result_1.requireOneWayCompletion)(result, 'One-way send');
294
+ }
251
295
  function normalizeSubmitResult(result) {
252
- return result ?? { status: submission_result_1.ZLinkSubmitStatus.Submitted };
296
+ return result instanceof Promise
297
+ ? result.then((value) => value ?? submission_result_1.submittedResult)
298
+ : (result ?? submission_result_1.submittedResult);
253
299
  }
254
300
  class DefaultZLinkRequestCall {
255
301
  validate;
256
302
  submitter;
257
303
  defaultRequestTimeoutMs;
304
+ message;
258
305
  timeoutMs;
259
- selectedMetadata = new Map();
306
+ selectedMetadata;
260
307
  turn = (0, execution_1.captureZLinkSpotSerialTurn)();
261
- constructor(validate, submitter, defaultRequestTimeoutMs) {
308
+ /** `message` is the request payload a prepared submitter receives per call. */
309
+ constructor(validate, submitter, defaultRequestTimeoutMs, message) {
262
310
  this.validate = validate;
263
311
  this.submitter = submitter;
264
312
  this.defaultRequestTimeoutMs = defaultRequestTimeoutMs;
313
+ this.message = message;
265
314
  }
266
315
  metadata(keyOrMetadata, value) {
316
+ this.selectedMetadata ??= new Map();
267
317
  if (typeof keyOrMetadata === 'string') {
268
318
  this.selectedMetadata.set(keyOrMetadata, value);
269
319
  }
@@ -278,17 +328,19 @@ class DefaultZLinkRequestCall {
278
328
  this.timeoutMs = timeoutMs;
279
329
  return this;
280
330
  }
281
- async submit(signal) {
282
- (0, abort_1.throwIfAborted)(signal);
283
- this.validate();
284
- return this.submitter(undefined, this.timeoutMs ?? this.defaultRequestTimeoutMs, new Map(this.selectedMetadata), signal);
331
+ submit(signal) {
332
+ return (0, request_result_1.createZLinkRequest)((onAdmitted) => {
333
+ (0, abort_1.throwIfAborted)(signal);
334
+ this.validate();
335
+ return this.submitter(undefined, this.timeoutMs ?? this.defaultRequestTimeoutMs, this.selectedMetadata === undefined ? EMPTY_CALL_METADATA : new Map(this.selectedMetadata), signal, onAdmitted, this.message);
336
+ });
285
337
  }
286
338
  async yield(signal) {
287
339
  const turn = (0, execution_1.requireZLinkYieldTurn)(this.turn);
288
340
  (0, abort_1.throwIfAborted)(signal);
289
341
  this.validate();
290
- const pending = this.submitter(undefined, this.timeoutMs ?? this.defaultRequestTimeoutMs, new Map(this.selectedMetadata), signal);
291
- return turn.yieldPromise(pending);
342
+ const pending = this.submitter(undefined, this.timeoutMs ?? this.defaultRequestTimeoutMs, this.selectedMetadata === undefined ? EMPTY_CALL_METADATA : new Map(this.selectedMetadata), signal, undefined, this.message);
343
+ return turn.yieldFrameworkPromise(pending);
292
344
  }
293
345
  }
294
346
  class DefaultZLinkPublishCall {
@@ -1,3 +1,4 @@
1
+ import type { ZLinkMeshDispatchAdmission } from '../admission';
1
2
  import type { ZLinkMessageContext, ZLinkHandlerFilter, ZLinkUnhandledDispatchOptions, ZLinkFlowOrigin } from '../../contracts';
2
3
  import { ZLinkFrameworkException } from '../../contracts';
3
4
  import { ZLinkDispatchMessageKind, ZLinkDispatchErrorSurface } from '../../contracts/Dispatch/ZLinkDispatchOptions';
@@ -31,7 +32,7 @@ interface ZLinkOneWayDispatch<TContext extends ZLinkMessageContext> {
31
32
  readonly context: TContext;
32
33
  readonly signal?: AbortSignal;
33
34
  }
34
- interface ZLinkRequestDispatch<TContext extends ZLinkMessageContext> {
35
+ export interface ZLinkRequestDispatch<TContext extends ZLinkMessageContext> {
35
36
  readonly fields: ZLinkChannelDispatchFields;
36
37
  readonly envelope: ZLinkChannelEnvelope;
37
38
  readonly codecs?: ZLinkChannelEnvelopeCodecRegistry;
@@ -39,16 +40,34 @@ interface ZLinkRequestDispatch<TContext extends ZLinkMessageContext> {
39
40
  readonly context: TContext;
40
41
  readonly signal?: AbortSignal;
41
42
  readonly missingHandlerMessage: string;
42
- readonly writeReply: (reply: unknown) => Promise<void>;
43
- readonly writeError: (error: unknown) => Promise<void>;
43
+ readonly writeReply: (reply: unknown) => void | Promise<void>;
44
+ readonly writeError: (error: unknown) => void | Promise<void>;
44
45
  }
45
46
  export declare class ZLinkChannelDispatchPipeline {
46
47
  private readonly options;
47
48
  private readonly filters;
48
49
  private readonly unhandled;
49
50
  constructor(options: ZLinkChannelDispatchPipelineOptions);
50
- dispatchOneWay<TContext extends ZLinkMessageContext>(dispatch: ZLinkOneWayDispatch<TContext>): Promise<void>;
51
- dispatchRequest<TContext extends ZLinkMessageContext>(dispatch: ZLinkRequestDispatch<TContext>): Promise<void>;
51
+ /**
52
+ * Runs the handler in the caller's execution turn. A synchronous handler
53
+ * completes here; an asynchronous handler adds exactly one continuation
54
+ * for its terminal trace or error record.
55
+ */
56
+ dispatchOneWay<TContext extends ZLinkMessageContext>(dispatch: ZLinkOneWayDispatch<TContext>, admit?: ZLinkMeshDispatchAdmission): void | Promise<void>;
57
+ private dispatchMissingOneWay;
58
+ private completeOneWay;
59
+ private failOneWay;
60
+ /**
61
+ * Runs the handler in the caller's execution turn and writes its reply in
62
+ * the same turn when the handler completes synchronously. An asynchronous
63
+ * handler adds exactly one continuation that writes the reply.
64
+ */
65
+ dispatchRequest<TContext extends ZLinkMessageContext>(dispatch: ZLinkRequestDispatch<TContext>, admit?: ZLinkMeshDispatchAdmission): void | Promise<void>;
66
+ private dispatchMissingRequest;
67
+ private invokeInFlow;
68
+ private completeRequest;
69
+ private replyPathMissing;
70
+ private failRequest;
52
71
  dropMissingReplyPath(fields: ZLinkChannelDispatchFields): void;
53
72
  /**
54
73
  * Terminal handling for an envelope that failed structural decoding.
@@ -66,6 +85,7 @@ export declare class ZLinkChannelDispatchPipeline {
66
85
  readonly writeProtocolError?: (error: ZLinkFrameworkException) => Promise<void>;
67
86
  }): Promise<void>;
68
87
  private invoke;
88
+ private invokeFiltered;
69
89
  private createFilterContext;
70
90
  private dispatchKind;
71
91
  private report;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ZLinkChannelDispatchPipeline = void 0;
4
4
  const framework_errors_internal_1 = require("../framework-errors-internal");
5
+ const abort_1 = require("../abort");
5
6
  const contracts_1 = require("../../contracts");
6
7
  const ZLinkDispatchOptions_1 = require("../../contracts/Dispatch/ZLinkDispatchOptions");
7
8
  const handlers_1 = require("../handlers");
@@ -17,75 +18,126 @@ class ZLinkChannelDispatchPipeline {
17
18
  this.filters = options.filters ?? [];
18
19
  this.unhandled = options.unhandled ?? DEFAULT_UNHANDLED_DISPATCH;
19
20
  }
20
- async dispatchOneWay(dispatch) {
21
+ /**
22
+ * Runs the handler in the caller's execution turn. A synchronous handler
23
+ * completes here; an asynchronous handler adds exactly one continuation
24
+ * for its terminal trace or error record.
25
+ */
26
+ dispatchOneWay(dispatch, admit) {
27
+ if (admit !== undefined) {
28
+ const pipeline = this;
29
+ const record = dispatch;
30
+ return admit(() => pipeline.dispatchOneWay(record), (error) => pipeline.failOneWay(record.fields, error));
31
+ }
21
32
  this.trace(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Received, dispatch.fields);
22
33
  this.trace(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Admitted, dispatch.fields);
23
- if (dispatch.handler === undefined) {
24
- const action = dispatch.fields.messageKind === ZLinkDispatchOptions_1.ZLinkDispatchMessageKind.Publish
25
- ? this.unhandled.publish
26
- : this.unhandled.send;
27
- this.report(dispatch.fields, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.HandlerMissing, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop);
28
- this.applyOneWayUnhandled(action, dispatch.fields);
29
- return;
30
- }
34
+ if (dispatch.handler === undefined)
35
+ return this.dispatchMissingOneWay(dispatch.fields);
36
+ let invocation;
31
37
  try {
32
- const flow = (0, flow_context_1.createInboundFlow)(dispatch.fields.flowId, dispatch.fields.flowOrigin, this.options.dispatchErrors.flow.flowCreationEnabled(), undefined);
33
- const invocation = await (0, flow_context_1.runWithFlow)(flow, () => this.invoke(dispatch.envelope, dispatch.codecs, dispatch.handler, dispatch.context, dispatch.fields, dispatch.signal));
34
- if (invocation.handlerInvoked) {
35
- this.trace(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Completed, dispatch.fields);
36
- }
38
+ invocation = this.invokeInFlow(dispatch, dispatch.handler);
37
39
  }
38
40
  catch (error) {
39
- this.report(dispatch.fields, this.failureReason(error), ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop, error);
41
+ this.failOneWay(dispatch.fields, error);
42
+ return;
43
+ }
44
+ if (!(0, abort_1.isPromiseLike)(invocation)) {
45
+ this.completeOneWay(dispatch.fields, invocation);
46
+ return;
40
47
  }
48
+ return Promise.resolve(invocation).then((value) => this.completeOneWay(dispatch.fields, value), (error) => this.failOneWay(dispatch.fields, error));
41
49
  }
42
- async dispatchRequest(dispatch) {
50
+ async dispatchMissingOneWay(fields) {
51
+ const action = fields.messageKind === ZLinkDispatchOptions_1.ZLinkDispatchMessageKind.Publish
52
+ ? this.unhandled.publish
53
+ : this.unhandled.send;
54
+ this.report(fields, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.HandlerMissing, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop);
55
+ this.applyOneWayUnhandled(action, fields);
56
+ }
57
+ completeOneWay(fields, invocation) {
58
+ if (invocation !== HANDLER_FILTER_REJECTED) {
59
+ this.trace(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Completed, fields);
60
+ }
61
+ }
62
+ failOneWay(fields, error) {
63
+ this.report(fields, this.failureReason(error), ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop, error);
64
+ }
65
+ /**
66
+ * Runs the handler in the caller's execution turn and writes its reply in
67
+ * the same turn when the handler completes synchronously. An asynchronous
68
+ * handler adds exactly one continuation that writes the reply.
69
+ */
70
+ dispatchRequest(dispatch, admit) {
71
+ if (admit !== undefined) {
72
+ const pipeline = this;
73
+ const record = dispatch;
74
+ return admit(() => pipeline.dispatchRequest(record), (error) => pipeline.failRequest(record, error));
75
+ }
43
76
  this.trace(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Received, dispatch.fields);
44
77
  this.trace(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Admitted, dispatch.fields);
45
- if (dispatch.handler === undefined) {
46
- const missing = (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.HandlerNotFound, dispatch.missingHandlerMessage);
47
- if (this.unhandled.request === contracts_1.ZLinkUnhandledDispatchAction.ReplyError) {
48
- await dispatch.writeError(missing);
49
- }
50
- this.report(dispatch.fields, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.HandlerMissing, this.unhandled.request === contracts_1.ZLinkUnhandledDispatchAction.ReplyError
51
- ? ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.ReplyError
52
- : ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop);
53
- if (this.unhandled.request === contracts_1.ZLinkUnhandledDispatchAction.Throw) {
54
- throw missing;
55
- }
56
- return;
78
+ if (dispatch.handler === undefined)
79
+ return this.dispatchMissingRequest(dispatch);
80
+ let invocation;
81
+ try {
82
+ invocation = this.invokeInFlow(dispatch, dispatch.handler);
57
83
  }
58
- let reply;
84
+ catch (error) {
85
+ return this.failRequest(dispatch, error);
86
+ }
87
+ if (!(0, abort_1.isPromiseLike)(invocation))
88
+ return this.completeRequest(dispatch, invocation);
89
+ return Promise.resolve(invocation).then((value) => this.completeRequest(dispatch, value), (error) => this.failRequest(dispatch, error));
90
+ }
91
+ async dispatchMissingRequest(dispatch) {
92
+ const missing = (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.HandlerNotFound, dispatch.missingHandlerMessage);
93
+ if (this.unhandled.request === contracts_1.ZLinkUnhandledDispatchAction.ReplyError) {
94
+ await dispatch.writeError(missing);
95
+ }
96
+ this.report(dispatch.fields, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.HandlerMissing, this.unhandled.request === contracts_1.ZLinkUnhandledDispatchAction.ReplyError
97
+ ? ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.ReplyError
98
+ : ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop);
99
+ if (this.unhandled.request === contracts_1.ZLinkUnhandledDispatchAction.Throw) {
100
+ throw missing;
101
+ }
102
+ }
103
+ invokeInFlow(dispatch, handler) {
104
+ const flow = (0, flow_context_1.createInboundFlow)(dispatch.fields.flowId, dispatch.fields.flowOrigin, this.options.dispatchErrors.flow.flowCreationEnabled(), undefined);
105
+ return flow === undefined
106
+ ? this.invoke(dispatch.envelope, dispatch.codecs, handler, dispatch.context, dispatch.fields, dispatch.signal)
107
+ : (0, flow_context_1.runWithFlow)(flow, () => this.invoke(dispatch.envelope, dispatch.codecs, handler, dispatch.context, dispatch.fields, dispatch.signal));
108
+ }
109
+ completeRequest(dispatch, invocation) {
110
+ if (invocation === HANDLER_FILTER_REJECTED) {
111
+ return this.failRequest(dispatch, (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestRejected, `A handler filter rejected '${this.options.channelName}:${dispatch.fields.packetName}'.`));
112
+ }
113
+ let written;
59
114
  try {
60
- const flow = (0, flow_context_1.createInboundFlow)(dispatch.fields.flowId, dispatch.fields.flowOrigin, this.options.dispatchErrors.flow.flowCreationEnabled(), undefined);
61
- const invocation = await (0, flow_context_1.runWithFlow)(flow, () => this.invoke(dispatch.envelope, dispatch.codecs, dispatch.handler, dispatch.context, dispatch.fields, dispatch.signal));
62
- if (!invocation.handlerInvoked) {
63
- throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestRejected, `A handler filter rejected '${this.options.channelName}:${dispatch.fields.packetName}'.`);
64
- }
65
- reply = invocation.value;
115
+ written = dispatch.writeReply(invocation);
66
116
  }
67
117
  catch (error) {
68
- try {
69
- await dispatch.writeError(error);
70
- }
71
- catch (replyError) {
72
- // Spec 26 §3.1: a failed reply write means the reply delivery path is
73
- // gone; `unexpected_reply` names a surplus/late reply instead.
74
- this.report(dispatch.fields, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.ReplyPathMissing, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop, replyError);
75
- return;
76
- }
77
- this.report(dispatch.fields, this.failureReason(error), ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.ReplyError, error);
118
+ this.replyPathMissing(dispatch.fields, error);
78
119
  return;
79
120
  }
80
- try {
81
- await dispatch.writeReply(reply);
121
+ if (written === undefined) {
82
122
  this.trace(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Replied, dispatch.fields);
123
+ return;
83
124
  }
84
- catch (error) {
85
- // Spec 26 §3.1: a failed reply write means the reply delivery path is
86
- // gone; `unexpected_reply` names a surplus/late reply instead.
87
- this.report(dispatch.fields, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.ReplyPathMissing, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop, error);
125
+ return written.then(() => this.trace(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Replied, dispatch.fields), (error) => this.replyPathMissing(dispatch.fields, error));
126
+ }
127
+ replyPathMissing(fields, error) {
128
+ // Spec 26 §3.1: a failed reply write means the reply delivery path is
129
+ // gone; `unexpected_reply` names a surplus/late reply instead.
130
+ this.report(fields, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.ReplyPathMissing, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop, error);
131
+ }
132
+ async failRequest(dispatch, error) {
133
+ try {
134
+ await dispatch.writeError(error);
88
135
  }
136
+ catch (replyError) {
137
+ this.replyPathMissing(dispatch.fields, replyError);
138
+ return;
139
+ }
140
+ this.report(dispatch.fields, this.failureReason(error), ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.ReplyError, error);
89
141
  }
90
142
  dropMissingReplyPath(fields) {
91
143
  this.report(fields, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.ReplyPathMissing, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop);
@@ -99,8 +151,7 @@ class ZLinkChannelDispatchPipeline {
99
151
  */
100
152
  async dispatchMalformed(input) {
101
153
  const { info } = input;
102
- const isRequest = info.kind === 1 /* ZLinkChannelMessageKind.Request */ ||
103
- (info.kind === undefined && input.transportRequest);
154
+ const isRequest = input.transportRequest;
104
155
  let replied = false;
105
156
  if (isRequest && input.writeProtocolError !== undefined && info.correlationId !== undefined) {
106
157
  const protocolError = new contracts_1.ZLinkFrameworkException(contracts_1.ZLinkFrameworkErrorKind.ProtocolError, `Channel '${this.options.channelName}' received a malformed envelope.`);
@@ -126,15 +177,18 @@ class ZLinkChannelDispatchPipeline {
126
177
  error: input.error
127
178
  });
128
179
  }
129
- async invoke(envelope, codecs, handler, context, fields, signal) {
180
+ invoke(envelope, codecs, handler, context, fields, signal) {
130
181
  (0, application_job_queue_scope_1.releaseApplicationJobPermitBeforeHandler)();
131
182
  if (this.filters.length === 0) {
132
183
  // Fast path for the dominant unfiltered dispatch: skip the filter
133
184
  // context object and chain machinery entirely.
134
185
  const payload = (0, channel_envelope_1.decodeChannelPayload)(envelope, codecs);
135
186
  this.trace(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Dispatched, fields);
136
- return { handlerInvoked: true, value: await handler.handle(payload, context) };
187
+ return handler.handle(payload, context);
137
188
  }
189
+ return this.invokeFiltered(envelope, codecs, handler, context, fields, signal);
190
+ }
191
+ async invokeFiltered(envelope, codecs, handler, context, fields, signal) {
138
192
  let value;
139
193
  const handlerInvoked = await (0, handlers_1.invokeZLinkHandlerFilters)(this.filters, this.createFilterContext(context, fields), async () => {
140
194
  // Filters are the channel admission gate. Decode only after they have
@@ -143,7 +197,7 @@ class ZLinkChannelDispatchPipeline {
143
197
  this.trace(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Dispatched, fields);
144
198
  value = await handler.handle(payload, context);
145
199
  }, signal);
146
- return { handlerInvoked, value };
200
+ return handlerInvoked ? value : HANDLER_FILTER_REJECTED;
147
201
  }
148
202
  createFilterContext(context, fields) {
149
203
  const dispatchKind = this.dispatchKind(context, fields);
@@ -222,6 +276,7 @@ class ZLinkChannelDispatchPipeline {
222
276
  }
223
277
  }
224
278
  exports.ZLinkChannelDispatchPipeline = ZLinkChannelDispatchPipeline;
279
+ const HANDLER_FILTER_REJECTED = Symbol('handler-filter-rejected');
225
280
  const DEFAULT_UNHANDLED_DISPATCH = {
226
281
  request: contracts_1.ZLinkUnhandledDispatchAction.ReplyError,
227
282
  send: contracts_1.ZLinkUnhandledDispatchAction.LogAndDrop,
@@ -43,6 +43,7 @@ export declare class ZLinkChannelDispatchServices {
43
43
  channelSendHandler(handlerType: Type): ZLinkChannelSendHandler;
44
44
  routeRequestHandler(handlerType: Type): ZLinkRouteRuntimeRequestHandler;
45
45
  routeSendHandler(handlerType: Type): ZLinkRouteRuntimeSendHandler;
46
+ private invokeScopeFreeHandler;
46
47
  private invokeHandlerFilters;
47
48
  private withHandlerScope;
48
49
  beginOutbound(outcome: ZLinkMessageFlowOutcome, result?: ZLinkRuntimeMessageFlowResult): ZLinkChannelOutboundTracePoint | undefined;