@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
@@ -1,8 +1,10 @@
1
+ import type { ZLinkMeshDispatchAdmission } from '../admission';
1
2
  import {
2
3
  ZLinkFrameworkInternalErrorKind,
3
4
  createInternalFrameworkException,
4
5
  internalFrameworkErrorKind
5
6
  } from '../framework-errors-internal';
7
+ import { isPromiseLike } from '../abort';
6
8
  import type {
7
9
  ZLinkMessageContext,
8
10
  ZLinkHandlerFilter,
@@ -26,7 +28,6 @@ import {
26
28
  import { invokeZLinkHandlerFilters } from '../handlers';
27
29
  import {
28
30
  decodeChannelPayload,
29
- ZLinkChannelMessageKind,
30
31
  type ZLinkChannelEnvelope,
31
32
  type ZLinkChannelEnvelopeCodecRegistry
32
33
  } from './channel-envelope';
@@ -66,7 +67,7 @@ interface ZLinkOneWayDispatch<TContext extends ZLinkMessageContext> {
66
67
  readonly signal?: AbortSignal;
67
68
  }
68
69
 
69
- interface ZLinkRequestDispatch<TContext extends ZLinkMessageContext> {
70
+ export interface ZLinkRequestDispatch<TContext extends ZLinkMessageContext> {
70
71
  readonly fields: ZLinkChannelDispatchFields;
71
72
  readonly envelope: ZLinkChannelEnvelope;
72
73
  readonly codecs?: ZLinkChannelEnvelopeCodecRegistry;
@@ -74,8 +75,8 @@ interface ZLinkRequestDispatch<TContext extends ZLinkMessageContext> {
74
75
  readonly context: TContext;
75
76
  readonly signal?: AbortSignal;
76
77
  readonly missingHandlerMessage: string;
77
- readonly writeReply: (reply: unknown) => Promise<void>;
78
- readonly writeError: (error: unknown) => Promise<void>;
78
+ readonly writeReply: (reply: unknown) => void | Promise<void>;
79
+ readonly writeError: (error: unknown) => void | Promise<void>;
79
80
  }
80
81
 
81
82
  export class ZLinkChannelDispatchPipeline {
@@ -87,137 +88,205 @@ export class ZLinkChannelDispatchPipeline {
87
88
  this.unhandled = options.unhandled ?? DEFAULT_UNHANDLED_DISPATCH;
88
89
  }
89
90
 
90
- async dispatchOneWay<TContext extends ZLinkMessageContext>(
91
- dispatch: ZLinkOneWayDispatch<TContext>
92
- ): Promise<void> {
91
+ /**
92
+ * Runs the handler in the caller's execution turn. A synchronous handler
93
+ * completes here; an asynchronous handler adds exactly one continuation
94
+ * for its terminal trace or error record.
95
+ */
96
+ dispatchOneWay<TContext extends ZLinkMessageContext>(
97
+ dispatch: ZLinkOneWayDispatch<TContext>,
98
+ admit?: ZLinkMeshDispatchAdmission
99
+ ): void | Promise<void> {
100
+ 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
+ );
107
+ }
93
108
  this.trace(ZLinkMessageFlowOutcome.Received, dispatch.fields);
94
109
  this.trace(ZLinkMessageFlowOutcome.Admitted, dispatch.fields);
95
- if (dispatch.handler === undefined) {
96
- const action =
97
- dispatch.fields.messageKind === ZLinkDispatchMessageKind.Publish
98
- ? this.unhandled.publish
99
- : this.unhandled.send;
100
- this.report(
101
- dispatch.fields,
102
- ZLinkDispatchErrorReason.HandlerMissing,
103
- ZLinkDispatchErrorAction.Drop
104
- );
105
- this.applyOneWayUnhandled(action, dispatch.fields);
110
+ if (dispatch.handler === undefined) return this.dispatchMissingOneWay(dispatch.fields);
111
+ let invocation: unknown;
112
+ try {
113
+ invocation = this.invokeInFlow(dispatch, dispatch.handler);
114
+ } catch (error) {
115
+ this.failOneWay(dispatch.fields, error);
116
+ return;
117
+ }
118
+ if (!isPromiseLike(invocation)) {
119
+ this.completeOneWay(dispatch.fields, invocation);
106
120
  return;
107
121
  }
122
+ return Promise.resolve(invocation).then(
123
+ (value) => this.completeOneWay(dispatch.fields, value),
124
+ (error: unknown) => this.failOneWay(dispatch.fields, error)
125
+ );
126
+ }
108
127
 
109
- try {
110
- const flow = createInboundFlow(
111
- dispatch.fields.flowId,
112
- dispatch.fields.flowOrigin,
113
- this.options.dispatchErrors.flow.flowCreationEnabled(),
114
- undefined
115
- );
116
- const invocation = await runWithFlow(flow, () =>
117
- this.invoke(
118
- dispatch.envelope,
119
- dispatch.codecs,
120
- dispatch.handler!,
121
- dispatch.context,
122
- dispatch.fields,
123
- dispatch.signal
124
- )
128
+ private async dispatchMissingOneWay(fields: ZLinkChannelDispatchFields): Promise<void> {
129
+ const action =
130
+ fields.messageKind === ZLinkDispatchMessageKind.Publish
131
+ ? this.unhandled.publish
132
+ : this.unhandled.send;
133
+ this.report(fields, ZLinkDispatchErrorReason.HandlerMissing, ZLinkDispatchErrorAction.Drop);
134
+ this.applyOneWayUnhandled(action, fields);
135
+ }
136
+
137
+ private completeOneWay(fields: ZLinkChannelDispatchFields, invocation: unknown): void {
138
+ if (invocation !== HANDLER_FILTER_REJECTED) {
139
+ this.trace(ZLinkMessageFlowOutcome.Completed, fields);
140
+ }
141
+ }
142
+
143
+ private failOneWay(fields: ZLinkChannelDispatchFields, error: unknown): void {
144
+ this.report(fields, this.failureReason(error), ZLinkDispatchErrorAction.Drop, error);
145
+ }
146
+
147
+ /**
148
+ * Runs the handler in the caller's execution turn and writes its reply in
149
+ * the same turn when the handler completes synchronously. An asynchronous
150
+ * handler adds exactly one continuation that writes the reply.
151
+ */
152
+ dispatchRequest<TContext extends ZLinkMessageContext>(
153
+ dispatch: ZLinkRequestDispatch<TContext>,
154
+ admit?: ZLinkMeshDispatchAdmission
155
+ ): void | Promise<void> {
156
+ if (admit !== undefined) {
157
+ const pipeline = this;
158
+ const record = dispatch;
159
+ return admit(
160
+ () => pipeline.dispatchRequest(record),
161
+ (error) => pipeline.failRequest(record, error)
125
162
  );
126
- if (invocation.handlerInvoked) {
127
- this.trace(ZLinkMessageFlowOutcome.Completed, dispatch.fields);
128
- }
163
+ }
164
+ this.trace(ZLinkMessageFlowOutcome.Received, dispatch.fields);
165
+ this.trace(ZLinkMessageFlowOutcome.Admitted, dispatch.fields);
166
+ if (dispatch.handler === undefined) return this.dispatchMissingRequest(dispatch);
167
+ let invocation: unknown;
168
+ try {
169
+ invocation = this.invokeInFlow(dispatch, dispatch.handler);
129
170
  } catch (error) {
130
- this.report(dispatch.fields, this.failureReason(error), ZLinkDispatchErrorAction.Drop, error);
171
+ return this.failRequest(dispatch, error);
131
172
  }
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
+ );
132
178
  }
133
179
 
134
- async dispatchRequest<TContext extends ZLinkMessageContext>(
180
+ private async dispatchMissingRequest<TContext extends ZLinkMessageContext>(
135
181
  dispatch: ZLinkRequestDispatch<TContext>
136
182
  ): Promise<void> {
137
- this.trace(ZLinkMessageFlowOutcome.Received, dispatch.fields);
138
- this.trace(ZLinkMessageFlowOutcome.Admitted, dispatch.fields);
139
- if (dispatch.handler === undefined) {
140
- const missing = createInternalFrameworkException(
141
- ZLinkFrameworkInternalErrorKind.HandlerNotFound,
142
- dispatch.missingHandlerMessage
143
- );
144
- if (this.unhandled.request === ZLinkUnhandledDispatchAction.ReplyError) {
145
- await dispatch.writeError(missing);
146
- }
147
- this.report(
148
- dispatch.fields,
149
- ZLinkDispatchErrorReason.HandlerMissing,
150
- this.unhandled.request === ZLinkUnhandledDispatchAction.ReplyError
151
- ? ZLinkDispatchErrorAction.ReplyError
152
- : ZLinkDispatchErrorAction.Drop
153
- );
154
- if (this.unhandled.request === ZLinkUnhandledDispatchAction.Throw) {
155
- throw missing;
156
- }
157
- return;
183
+ const missing = createInternalFrameworkException(
184
+ ZLinkFrameworkInternalErrorKind.HandlerNotFound,
185
+ dispatch.missingHandlerMessage
186
+ );
187
+ if (this.unhandled.request === ZLinkUnhandledDispatchAction.ReplyError) {
188
+ await dispatch.writeError(missing);
189
+ }
190
+ this.report(
191
+ dispatch.fields,
192
+ ZLinkDispatchErrorReason.HandlerMissing,
193
+ this.unhandled.request === ZLinkUnhandledDispatchAction.ReplyError
194
+ ? ZLinkDispatchErrorAction.ReplyError
195
+ : ZLinkDispatchErrorAction.Drop
196
+ );
197
+ if (this.unhandled.request === ZLinkUnhandledDispatchAction.Throw) {
198
+ throw missing;
158
199
  }
200
+ }
159
201
 
160
- let reply: unknown;
161
- try {
162
- const flow = createInboundFlow(
163
- dispatch.fields.flowId,
164
- dispatch.fields.flowOrigin,
165
- this.options.dispatchErrors.flow.flowCreationEnabled(),
166
- undefined
167
- );
168
- const invocation = await runWithFlow(flow, () =>
169
- this.invoke(
202
+ private invokeInFlow<TContext extends ZLinkMessageContext, TResult>(
203
+ dispatch: ZLinkOneWayDispatch<TContext> | ZLinkRequestDispatch<TContext>,
204
+ handler: ZLinkChannelDispatchHandler<TContext, TResult>
205
+ ): unknown {
206
+ const flow = createInboundFlow(
207
+ dispatch.fields.flowId,
208
+ dispatch.fields.flowOrigin,
209
+ this.options.dispatchErrors.flow.flowCreationEnabled(),
210
+ undefined
211
+ );
212
+ return flow === undefined
213
+ ? this.invoke(
170
214
  dispatch.envelope,
171
215
  dispatch.codecs,
172
- dispatch.handler!,
216
+ handler,
173
217
  dispatch.context,
174
218
  dispatch.fields,
175
219
  dispatch.signal
176
220
  )
177
- );
178
- if (!invocation.handlerInvoked) {
179
- throw createInternalFrameworkException(
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
+ );
231
+ }
232
+
233
+ private completeRequest<TContext extends ZLinkMessageContext>(
234
+ dispatch: ZLinkRequestDispatch<TContext>,
235
+ invocation: unknown
236
+ ): void | Promise<void> {
237
+ if (invocation === HANDLER_FILTER_REJECTED) {
238
+ return this.failRequest(
239
+ dispatch,
240
+ createInternalFrameworkException(
180
241
  ZLinkFrameworkInternalErrorKind.RequestRejected,
181
242
  `A handler filter rejected '${this.options.channelName}:${dispatch.fields.packetName}'.`
182
- );
183
- }
184
- reply = invocation.value;
185
- } catch (error) {
186
- try {
187
- await dispatch.writeError(error);
188
- } catch (replyError) {
189
- // Spec 26 §3.1: a failed reply write means the reply delivery path is
190
- // gone; `unexpected_reply` names a surplus/late reply instead.
191
- this.report(
192
- dispatch.fields,
193
- ZLinkDispatchErrorReason.ReplyPathMissing,
194
- ZLinkDispatchErrorAction.Drop,
195
- replyError
196
- );
197
- return;
198
- }
199
- this.report(
200
- dispatch.fields,
201
- this.failureReason(error),
202
- ZLinkDispatchErrorAction.ReplyError,
203
- error
243
+ )
204
244
  );
245
+ }
246
+ let written: void | Promise<void>;
247
+ try {
248
+ written = dispatch.writeReply(invocation);
249
+ } catch (error) {
250
+ this.replyPathMissing(dispatch.fields, error);
251
+ return;
252
+ }
253
+ if (written === undefined) {
254
+ this.trace(ZLinkMessageFlowOutcome.Replied, dispatch.fields);
205
255
  return;
206
256
  }
257
+ return written.then(
258
+ () => this.trace(ZLinkMessageFlowOutcome.Replied, dispatch.fields),
259
+ (error: unknown) => this.replyPathMissing(dispatch.fields, error)
260
+ );
261
+ }
262
+
263
+ private replyPathMissing(fields: ZLinkChannelDispatchFields, error: unknown): void {
264
+ // Spec 26 §3.1: a failed reply write means the reply delivery path is
265
+ // gone; `unexpected_reply` names a surplus/late reply instead.
266
+ this.report(
267
+ fields,
268
+ ZLinkDispatchErrorReason.ReplyPathMissing,
269
+ ZLinkDispatchErrorAction.Drop,
270
+ error
271
+ );
272
+ }
207
273
 
274
+ private async failRequest<TContext extends ZLinkMessageContext>(
275
+ dispatch: ZLinkRequestDispatch<TContext>,
276
+ error: unknown
277
+ ): Promise<void> {
208
278
  try {
209
- await dispatch.writeReply(reply);
210
- this.trace(ZLinkMessageFlowOutcome.Replied, dispatch.fields);
211
- } catch (error) {
212
- // Spec 26 §3.1: a failed reply write means the reply delivery path is
213
- // gone; `unexpected_reply` names a surplus/late reply instead.
214
- this.report(
215
- dispatch.fields,
216
- ZLinkDispatchErrorReason.ReplyPathMissing,
217
- ZLinkDispatchErrorAction.Drop,
218
- error
219
- );
279
+ await dispatch.writeError(error);
280
+ } catch (replyError) {
281
+ this.replyPathMissing(dispatch.fields, replyError);
282
+ return;
220
283
  }
284
+ this.report(
285
+ dispatch.fields,
286
+ this.failureReason(error),
287
+ ZLinkDispatchErrorAction.ReplyError,
288
+ error
289
+ );
221
290
  }
222
291
 
223
292
  dropMissingReplyPath(fields: ZLinkChannelDispatchFields): void {
@@ -240,9 +309,7 @@ export class ZLinkChannelDispatchPipeline {
240
309
  readonly writeProtocolError?: (error: ZLinkFrameworkException) => Promise<void>;
241
310
  }): Promise<void> {
242
311
  const { info } = input;
243
- const isRequest =
244
- info.kind === ZLinkChannelMessageKind.Request ||
245
- (info.kind === undefined && input.transportRequest);
312
+ const isRequest = input.transportRequest;
246
313
  let replied = false;
247
314
  if (isRequest && input.writeProtocolError !== undefined && info.correlationId !== undefined) {
248
315
  const protocolError = new ZLinkFrameworkException(
@@ -271,22 +338,37 @@ export class ZLinkChannelDispatchPipeline {
271
338
  });
272
339
  }
273
340
 
274
- private async invoke<TContext extends ZLinkMessageContext, TResult>(
341
+ private invoke<TContext extends ZLinkMessageContext, TResult>(
275
342
  envelope: ZLinkChannelEnvelope,
276
343
  codecs: ZLinkChannelEnvelopeCodecRegistry | undefined,
277
344
  handler: ZLinkChannelDispatchHandler<TContext, TResult>,
278
345
  context: TContext,
279
346
  fields: ZLinkChannelDispatchFields,
280
347
  signal?: AbortSignal
281
- ): Promise<{ readonly handlerInvoked: boolean; readonly value?: TResult }> {
348
+ ):
349
+ | TResult
350
+ | undefined
351
+ | typeof HANDLER_FILTER_REJECTED
352
+ | Promise<TResult | undefined | typeof HANDLER_FILTER_REJECTED> {
282
353
  releaseApplicationJobPermitBeforeHandler();
283
354
  if (this.filters.length === 0) {
284
355
  // Fast path for the dominant unfiltered dispatch: skip the filter
285
356
  // context object and chain machinery entirely.
286
357
  const payload = decodeChannelPayload(envelope, codecs);
287
358
  this.trace(ZLinkMessageFlowOutcome.Dispatched, fields);
288
- return { handlerInvoked: true, value: await handler.handle(payload, context) };
359
+ return handler.handle(payload, context);
289
360
  }
361
+ return this.invokeFiltered(envelope, codecs, handler, context, fields, signal);
362
+ }
363
+
364
+ private async invokeFiltered<TContext extends ZLinkMessageContext, TResult>(
365
+ envelope: ZLinkChannelEnvelope,
366
+ codecs: ZLinkChannelEnvelopeCodecRegistry | undefined,
367
+ handler: ZLinkChannelDispatchHandler<TContext, TResult>,
368
+ context: TContext,
369
+ fields: ZLinkChannelDispatchFields,
370
+ signal?: AbortSignal
371
+ ): Promise<TResult | undefined | typeof HANDLER_FILTER_REJECTED> {
290
372
  let value: TResult | undefined;
291
373
  const handlerInvoked = await invokeZLinkHandlerFilters(
292
374
  this.filters,
@@ -300,7 +382,7 @@ export class ZLinkChannelDispatchPipeline {
300
382
  },
301
383
  signal
302
384
  );
303
- return { handlerInvoked, value };
385
+ return handlerInvoked ? value : HANDLER_FILTER_REJECTED;
304
386
  }
305
387
 
306
388
  private createFilterContext(
@@ -401,6 +483,8 @@ export class ZLinkChannelDispatchPipeline {
401
483
  }
402
484
  }
403
485
 
486
+ const HANDLER_FILTER_REJECTED = Symbol('handler-filter-rejected');
487
+
404
488
  const DEFAULT_UNHANDLED_DISPATCH: ZLinkUnhandledDispatchOptions = {
405
489
  request: ZLinkUnhandledDispatchAction.ReplyError,
406
490
  send: ZLinkUnhandledDispatchAction.LogAndDrop,
@@ -26,7 +26,11 @@ import {
26
26
  import type { ZLinkRuntimeTaskErrorSink } from '../execution';
27
27
  import { ZLinkDispatchErrorReporter } from './dispatch-error-reporter';
28
28
  import { invokeZLinkHandlerFilters } from '../handlers';
29
- import { runInHandlerInstanceScope } from '../handlers/handler-instance-scope';
29
+ import {
30
+ runInHandlerInstanceScope,
31
+ prepareHandlerInstance,
32
+ handlerInstanceCleanup
33
+ } from '../handlers/handler-instance-scope';
30
34
  import { handlerFilterScope } from './handler-filter-scope';
31
35
  import type {
32
36
  ZLinkChannelRequestHandler,
@@ -109,6 +113,17 @@ export class ZLinkChannelDispatchServices {
109
113
  }
110
114
 
111
115
  channelRequestHandler(handlerType: Type): ZLinkChannelRequestHandler {
116
+ const activate =
117
+ this.registration.filterTypes.length === 0
118
+ ? prepareHandlerInstance(
119
+ this.providerResolver,
120
+ handlerType as Type<ZLinkChannelRequestHandler>
121
+ )
122
+ : undefined;
123
+ if (activate !== undefined)
124
+ return {
125
+ handle: (payload, context) => this.invokeScopeFreeHandler(activate, payload, context)
126
+ };
112
127
  return {
113
128
  handle: (payload, context) =>
114
129
  this.withHandlerScope(context, async (scope) => {
@@ -119,6 +134,17 @@ export class ZLinkChannelDispatchServices {
119
134
  }
120
135
 
121
136
  channelSendHandler(handlerType: Type): ZLinkChannelSendHandler {
137
+ const activate =
138
+ this.registration.filterTypes.length === 0
139
+ ? prepareHandlerInstance(
140
+ this.providerResolver,
141
+ handlerType as Type<ZLinkChannelSendHandler>
142
+ )
143
+ : undefined;
144
+ if (activate !== undefined)
145
+ return {
146
+ handle: (payload, context) => this.invokeScopeFreeHandler(activate, payload, context)
147
+ };
122
148
  return {
123
149
  handle: (payload, context) =>
124
150
  this.withHandlerScope(context, async (scope) => {
@@ -129,6 +155,17 @@ export class ZLinkChannelDispatchServices {
129
155
  }
130
156
 
131
157
  routeRequestHandler(handlerType: Type): ZLinkRouteRuntimeRequestHandler {
158
+ const activate =
159
+ this.registration.filterTypes.length === 0
160
+ ? prepareHandlerInstance(
161
+ this.providerResolver,
162
+ handlerType as Type<ZLinkRouteRuntimeRequestHandler>
163
+ )
164
+ : undefined;
165
+ if (activate !== undefined)
166
+ return {
167
+ handle: (payload, context) => this.invokeScopeFreeHandler(activate, payload, context)
168
+ };
132
169
  return {
133
170
  handle: (payload, context) =>
134
171
  this.withHandlerScope(context, async (scope) => {
@@ -139,6 +176,17 @@ export class ZLinkChannelDispatchServices {
139
176
  }
140
177
 
141
178
  routeSendHandler(handlerType: Type): ZLinkRouteRuntimeSendHandler {
179
+ const activate =
180
+ this.registration.filterTypes.length === 0
181
+ ? prepareHandlerInstance(
182
+ this.providerResolver,
183
+ handlerType as Type<ZLinkRouteRuntimeSendHandler>
184
+ )
185
+ : undefined;
186
+ if (activate !== undefined)
187
+ return {
188
+ handle: (payload, context) => this.invokeScopeFreeHandler(activate, payload, context)
189
+ };
142
190
  return {
143
191
  handle: (payload, context) =>
144
192
  this.withHandlerScope(context, async (scope) => {
@@ -148,6 +196,26 @@ export class ZLinkChannelDispatchServices {
148
196
  };
149
197
  }
150
198
 
199
+ private invokeScopeFreeHandler<TContext extends ZLinkMessageContext, TResult>(
200
+ activate: () => { handle(payload: unknown, context: TContext): TResult | Promise<TResult> },
201
+ payload: unknown,
202
+ context: TContext
203
+ ): TResult | Promise<TResult> {
204
+ const handler = activate();
205
+ const cleanup = handlerInstanceCleanup(handler);
206
+ if (cleanup === undefined) return handler.handle(payload, context);
207
+ let result: TResult | Promise<TResult>;
208
+ try {
209
+ result = handler.handle(payload, context);
210
+ } catch (error) {
211
+ const disposed = cleanup.call(handler);
212
+ return Promise.resolve(disposed).then(() => {
213
+ throw error;
214
+ });
215
+ }
216
+ return Promise.resolve(result).finally(() => cleanup.call(handler));
217
+ }
218
+
151
219
  private async invokeHandlerFilters(
152
220
  context: ZLinkHandlerFilterContext,
153
221
  next: () => Promise<void>,