@zlink-systems/framework 0.30.3 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Actors/ZLinkActor.d.ts +2 -0
  3. package/dist/contracts/Actors/ZLinkSessionBindingIdentity.d.ts +6 -0
  4. package/dist/contracts/Actors/ZLinkSessionBindingIdentity.js +2 -0
  5. package/dist/contracts/Actors/index.d.ts +1 -0
  6. package/dist/contracts/Actors/index.js +1 -0
  7. package/dist/contracts/Common/CoreTypes.d.ts +1 -0
  8. package/dist/contracts/Common/HandlerMessageType.d.ts +8 -0
  9. package/dist/contracts/Common/HandlerMessageType.js +41 -0
  10. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +1 -1
  11. package/dist/contracts/Common/ZLinkEncodedPayload.js +12 -20
  12. package/dist/contracts/Common/ZLinkMessage.js +11 -7
  13. package/dist/contracts/Common/encoded-payload-storage.d.ts +0 -2
  14. package/dist/contracts/Common/encoded-payload-storage.js +4 -16
  15. package/dist/contracts/Common/index.d.ts +1 -1
  16. package/dist/contracts/Common/payload-slab.d.ts +4 -0
  17. package/dist/contracts/Common/payload-slab.js +30 -0
  18. package/dist/contracts/Configuration/RegistrationBuilders.js +15 -9
  19. package/dist/contracts/Configuration/RegistrationTypes.d.ts +19 -0
  20. package/dist/contracts/Handlers/Contexts.d.ts +1 -0
  21. package/dist/contracts/Locations/Authority.d.ts +2 -0
  22. package/dist/internal.d.ts +9 -0
  23. package/dist/internal.js +23 -1
  24. package/dist/nest-integration.d.ts +1 -0
  25. package/dist/nest-integration.js +3 -1
  26. package/dist/runtime/actors/actor-client.d.ts +6 -2
  27. package/dist/runtime/actors/actor-client.js +120 -82
  28. package/dist/runtime/actors/actor-context.js +16 -5
  29. package/dist/runtime/actors/actor-execution-context.js +2 -2
  30. package/dist/runtime/actors/actor-handoff.d.ts +12 -1
  31. package/dist/runtime/actors/actor-handoff.js +79 -34
  32. package/dist/runtime/actors/actor-join-deferred-scope.js +6 -6
  33. package/dist/runtime/actors/actor-local-native-join.d.ts +2 -2
  34. package/dist/runtime/actors/actor-local-native-join.js +19 -17
  35. package/dist/runtime/actors/actor-mailbox.d.ts +1 -1
  36. package/dist/runtime/actors/actor-remote-joiner.d.ts +2 -2
  37. package/dist/runtime/actors/actor-remote-joiner.js +4 -4
  38. package/dist/runtime/actors/actor-routed-join-transport.d.ts +9 -3
  39. package/dist/runtime/actors/actor-routed-json-request.d.ts +3 -0
  40. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -2
  41. package/dist/runtime/actors/actor-runtime-state.d.ts +1 -1
  42. package/dist/runtime/actors/spot-actor-dispatch.d.ts +9 -5
  43. package/dist/runtime/actors/spot-actor-dispatch.js +60 -38
  44. package/dist/runtime/admission.d.ts +6 -4
  45. package/dist/runtime/admission.js +21 -10
  46. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +1 -0
  47. package/dist/runtime/application-jobs/application-ingress-record-owner.js +3 -0
  48. package/dist/runtime/backend/contracts/index.d.ts +26 -10
  49. package/dist/runtime/backend/mesh-completion-table.d.ts +7 -1
  50. package/dist/runtime/backend/mesh-completion-table.js +84 -20
  51. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +19 -6
  52. package/dist/runtime/backend/mesh-dispatch-pump.js +246 -147
  53. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +3 -2
  54. package/dist/runtime/backend/node/node-backend-adapter-support.js +27 -19
  55. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +5 -2
  56. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +70 -13
  57. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
  58. package/dist/runtime/backend/node/node-event-loop-poller.js +4 -3
  59. package/dist/runtime/backend/node/node-mesh-backend-adapter.js +5 -1
  60. package/dist/runtime/backend/node/node-raw-binding-port.d.ts +7 -2
  61. package/dist/runtime/backend/node/node-raw-binding-port.js +99 -63
  62. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +34 -16
  63. package/dist/runtime/backend/node/node-raw-mesh-backend.js +210 -106
  64. package/dist/runtime/backend/node/node-socket-backend-adapter.js +20 -6
  65. package/dist/runtime/backend/raw-binding-port.d.ts +6 -3
  66. package/dist/runtime/channels/channel-clients.js +3 -3
  67. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +11 -7
  68. package/dist/runtime/channels/channel-dispatch-pipeline.js +40 -22
  69. package/dist/runtime/channels/channel-dispatch-services.d.ts +3 -1
  70. package/dist/runtime/channels/channel-dispatch-services.js +7 -6
  71. package/dist/runtime/channels/channel-dispatchers.d.ts +13 -6
  72. package/dist/runtime/channels/channel-dispatchers.js +57 -36
  73. package/dist/runtime/channels/channel-envelope.d.ts +2 -2
  74. package/dist/runtime/channels/channel-envelope.js +609 -83
  75. package/dist/runtime/channels/channel-multipart.d.ts +1 -0
  76. package/dist/runtime/channels/channel-multipart.js +10 -6
  77. package/dist/runtime/channels/channel-outbound-operations.d.ts +6 -9
  78. package/dist/runtime/channels/channel-outbound-operations.js +107 -105
  79. package/dist/runtime/channels/channel-receive-loops.d.ts +9 -7
  80. package/dist/runtime/channels/channel-receive-loops.js +126 -90
  81. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +23 -6
  82. package/dist/runtime/channels/channel-runtime-lifecycle.js +47 -38
  83. package/dist/runtime/channels/channel-runtime-manager.d.ts +13 -6
  84. package/dist/runtime/channels/channel-runtime-manager.js +32 -14
  85. package/dist/runtime/channels/channel-socket-registry.d.ts +28 -4
  86. package/dist/runtime/channels/channel-socket-registry.js +9 -1
  87. package/dist/runtime/channels/channel-transports.d.ts +23 -16
  88. package/dist/runtime/channels/channel-transports.js +139 -119
  89. package/dist/runtime/channels/dispatch-error-reporter.d.ts +4 -4
  90. package/dist/runtime/channels/dispatch-error-reporter.js +5 -5
  91. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  92. package/dist/runtime/channels/local-spot-route-transport.d.ts +5 -2
  93. package/dist/runtime/channels/local-spot-route-transport.js +15 -18
  94. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +6 -3
  95. package/dist/runtime/channels/router-socket-spot-route-transport.js +33 -19
  96. package/dist/runtime/channels/source-spot-router.d.ts +6 -3
  97. package/dist/runtime/channels/source-spot-router.js +34 -23
  98. package/dist/runtime/channels/spot-node-route-transport.d.ts +6 -3
  99. package/dist/runtime/channels/spot-node-route-transport.js +23 -17
  100. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +6 -3
  101. package/dist/runtime/channels/spot-route-bridge-transport.js +38 -24
  102. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +8 -4
  103. package/dist/runtime/channels/spot-route-dispatch-strategy.js +36 -23
  104. package/dist/runtime/diagnostics/dispatch-error-details.js +9 -3
  105. package/dist/runtime/diagnostics/message-flow-bootstrap.d.ts +1 -0
  106. package/dist/runtime/diagnostics/message-flow-bootstrap.js +8 -0
  107. package/dist/runtime/diagnostics/message-flow-delivery.d.ts +47 -0
  108. package/dist/runtime/diagnostics/message-flow-delivery.js +149 -0
  109. package/dist/runtime/diagnostics/message-flow-record.d.ts +50 -0
  110. package/dist/runtime/diagnostics/message-flow-record.js +228 -0
  111. package/dist/runtime/diagnostics/message-flow-worker.d.ts +1 -0
  112. package/dist/runtime/diagnostics/message-flow-worker.js +118 -0
  113. package/dist/runtime/diagnostics/message-flow.d.ts +7 -19
  114. package/dist/runtime/diagnostics/message-flow.js +42 -290
  115. package/dist/runtime/diagnostics/runtime-metrics.d.ts +4 -3
  116. package/dist/runtime/diagnostics/runtime-metrics.js +8 -4
  117. package/dist/runtime/execution/index.d.ts +1 -0
  118. package/dist/runtime/execution/index.js +6 -3
  119. package/dist/runtime/execution/serial-execution-queue.d.ts +26 -13
  120. package/dist/runtime/execution/serial-execution-queue.js +75 -71
  121. package/dist/runtime/foundation/durable-service-request.d.ts +12 -3
  122. package/dist/runtime/foundation/durable-service-request.js +158 -73
  123. package/dist/runtime/foundation/operation-registry.d.ts +33 -3
  124. package/dist/runtime/foundation/operation-registry.js +272 -33
  125. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +62 -23
  126. package/dist/runtime/foundation/raw-service-mesh-runtime.js +373 -194
  127. package/dist/runtime/foundation/request-runtime.d.ts +17 -0
  128. package/dist/runtime/foundation/request-runtime.js +163 -0
  129. package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
  130. package/dist/runtime/foundation/service-discovery-registry.js +6 -0
  131. package/dist/runtime/foundation/service-liveness-registry.d.ts +1 -1
  132. package/dist/runtime/foundation/service-mailbox.d.ts +4 -2
  133. package/dist/runtime/foundation/service-mailbox.js +4 -1
  134. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -2
  135. package/dist/runtime/foundation/service-relocation-object-owner.js +12 -5
  136. package/dist/runtime/foundation/service-runtime-contracts.d.ts +7 -2
  137. package/dist/runtime/foundation/service-stateful-registry.d.ts +6 -2
  138. package/dist/runtime/foundation/service-stateful-registry.js +38 -17
  139. package/dist/runtime/foundation/service-stateful-runtime.d.ts +91 -26
  140. package/dist/runtime/foundation/service-stateful-runtime.js +245 -120
  141. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -0
  142. package/dist/runtime/foundation/service-stateful-wire-codec.js +15 -0
  143. package/dist/runtime/foundation/service-topology-registry.d.ts +2 -0
  144. package/dist/runtime/foundation/service-topology-registry.js +13 -3
  145. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  146. package/dist/runtime/foundation/service-wire-constants.generated.js +12 -0
  147. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +5 -1
  148. package/dist/runtime/foundation/service-wire-m6a-codec.js +50 -15
  149. package/dist/runtime/host/actor-packet-relay.d.ts +5 -6
  150. package/dist/runtime/host/actor-packet-relay.js +58 -57
  151. package/dist/runtime/host/actor-placement-coordinator.d.ts +1 -1
  152. package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
  153. package/dist/runtime/host/actor-runtime-options-factory.js +3 -2
  154. package/dist/runtime/host/actor-transfer-runtime.d.ts +3 -3
  155. package/dist/runtime/host/application-job-queue.d.ts +7 -5
  156. package/dist/runtime/host/application-job-queue.js +33 -21
  157. package/dist/runtime/host/bound-session-relay.js +0 -1
  158. package/dist/runtime/host/channel-runtime-options-factory.d.ts +2 -0
  159. package/dist/runtime/host/channel-runtime-options-factory.js +1 -0
  160. package/dist/runtime/host/entry-actor-runtime.d.ts +5 -2
  161. package/dist/runtime/host/entry-actor-runtime.js +2 -2
  162. package/dist/runtime/host/index.d.ts +106 -37
  163. package/dist/runtime/host/index.js +303 -151
  164. package/dist/runtime/host/location-runtime-owner.d.ts +2 -2
  165. package/dist/runtime/host/location-runtime-owner.js +1 -1
  166. package/dist/runtime/host/service-relocation-host-runtime.d.ts +195 -45
  167. package/dist/runtime/host/service-relocation-host-runtime.js +257 -144
  168. package/dist/runtime/host/spot-address-transport.d.ts +3 -0
  169. package/dist/runtime/host/spot-address-transport.js +73 -76
  170. package/dist/runtime/host/spot-runtime-options-factory.js +2 -0
  171. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -1
  172. package/dist/runtime/host/user-spot-creation-coordinator.js +49 -21
  173. package/dist/runtime/internal-observation.d.ts +1 -0
  174. package/dist/runtime/internal-observation.js +5 -0
  175. package/dist/runtime/locations/actor-location-claims.d.ts +1 -1
  176. package/dist/runtime/locations/actor-location-claims.js +15 -6
  177. package/dist/runtime/locations/auto-connect-loop.d.ts +0 -1
  178. package/dist/runtime/locations/auto-connect-loop.js +25 -19
  179. package/dist/runtime/locations/auto-connect-planner.js +2 -5
  180. package/dist/runtime/locations/auto-connect-reconciler.d.ts +1 -0
  181. package/dist/runtime/locations/auto-connect-reconciler.js +35 -23
  182. package/dist/runtime/locations/in-memory-authority-store.d.ts +1 -0
  183. package/dist/runtime/locations/in-memory-authority-store.js +15 -5
  184. package/dist/runtime/locations/in-memory-location-store.d.ts +0 -2
  185. package/dist/runtime/locations/in-memory-location-store.js +1 -38
  186. package/dist/runtime/locations/lifecycle.d.ts +1 -1
  187. package/dist/runtime/locations/lifecycle.js +2 -2
  188. package/dist/runtime/locations/location-store-repository.d.ts +0 -1
  189. package/dist/runtime/locations/location-store-repository.js +163 -246
  190. package/dist/runtime/locations/resolvers.d.ts +8 -1
  191. package/dist/runtime/locations/resolvers.js +16 -2
  192. package/dist/runtime/locations/runtime.d.ts +3 -3
  193. package/dist/runtime/locations/runtime.js +12 -16
  194. package/dist/runtime/messaging/creation-payload-codec.js +8 -7
  195. package/dist/runtime/messaging/framework-json-v1.d.ts +1 -1
  196. package/dist/runtime/messaging/framework-json-v1.js +6 -2
  197. package/dist/runtime/messaging/payload-codec.js +21 -35
  198. package/dist/runtime/messaging/request-deadline.d.ts +4 -2
  199. package/dist/runtime/messaging/request-deadline.js +40 -25
  200. package/dist/runtime/messaging/request-result.d.ts +14 -1
  201. package/dist/runtime/messaging/request-result.js +74 -13
  202. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +4 -0
  203. package/dist/runtime/protocol/service_wire_codec.generated.js +17 -7
  204. package/dist/runtime/spots/index.d.ts +28 -7
  205. package/dist/runtime/spots/index.js +31 -6
  206. package/dist/runtime/spots/spot-activation-registry.d.ts +3 -2
  207. package/dist/runtime/spots/spot-activation-registry.js +13 -8
  208. package/dist/runtime/spots/spot-activation-state.d.ts +2 -0
  209. package/dist/runtime/spots/spot-activation-state.js +1 -0
  210. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +9 -4
  211. package/dist/runtime/spots/spot-actor-admission-coordinator.js +33 -12
  212. package/dist/runtime/spots/spot-actor-ingress-admission.d.ts +40 -0
  213. package/dist/runtime/spots/spot-actor-ingress-admission.js +78 -0
  214. package/dist/runtime/spots/spot-actor-membership.js +3 -3
  215. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +16 -43
  216. package/dist/runtime/spots/spot-actor-packet-dispatch.js +56 -113
  217. package/dist/runtime/spots/spot-actor-packet-drain.d.ts +1 -0
  218. package/dist/runtime/spots/spot-actor-packet-drain.js +12 -5
  219. package/dist/runtime/spots/spot-entry-activation.d.ts +4 -3
  220. package/dist/runtime/spots/spot-entry-activation.js +7 -12
  221. package/dist/runtime/spots/spot-handler-registry.d.ts +5 -1
  222. package/dist/runtime/spots/spot-handler-registry.js +31 -15
  223. package/dist/runtime/spots/spot-manager-public.js +3 -2
  224. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +11 -6
  225. package/dist/runtime/spots/spot-node-runtime-manager.js +6 -1
  226. package/dist/runtime/spots/spot-outbound.d.ts +8 -2
  227. package/dist/runtime/spots/spot-outbound.js +5 -5
  228. package/dist/runtime/spots/spot-route-packet-dispatch.js +13 -8
  229. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +3 -3
  230. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +9 -5
  231. package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -2
  232. package/dist/runtime/spots/spot-serial-executor.d.ts +2 -1
  233. package/dist/runtime/spots/spot-serial-turn-executor.js +20 -26
  234. package/dist/runtime/spots/spot-subscription-dispatch.js +5 -2
  235. package/dist/runtime/spots/spot-timer.d.ts +1 -1
  236. package/dist/runtime/streams/actor-session-binding-registry.d.ts +11 -3
  237. package/dist/runtime/streams/actor-session-binding-registry.js +28 -0
  238. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -2
  239. package/dist/runtime/streams/bound-actor-relay-sender.js +3 -4
  240. package/dist/runtime/streams/bound-session-service.js +6 -7
  241. package/dist/runtime/streams/index.d.ts +3 -3
  242. package/dist/runtime/streams/index.js +22 -2
  243. package/dist/runtime/streams/managed-stream.js +2 -1
  244. package/dist/runtime/streams/session-calls.d.ts +1 -1
  245. package/dist/runtime/streams/session-calls.js +3 -9
  246. package/dist/runtime/streams/session-context.d.ts +2 -2
  247. package/dist/runtime/streams/session-context.js +2 -2
  248. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -0
  249. package/dist/runtime/streams/stream-session-runtime.js +64 -33
  250. package/package.json +3 -3
  251. package/src/contracts/Actors/ZLinkActor.ts +6 -0
  252. package/src/contracts/Actors/ZLinkSessionBindingIdentity.ts +7 -0
  253. package/src/contracts/Actors/index.ts +1 -0
  254. package/src/contracts/Common/CoreTypes.ts +1 -0
  255. package/src/contracts/Common/HandlerMessageType.ts +50 -0
  256. package/src/contracts/Common/ZLinkEncodedPayload.ts +13 -25
  257. package/src/contracts/Common/ZLinkMessage.ts +11 -7
  258. package/src/contracts/Common/encoded-payload-storage.ts +4 -16
  259. package/src/contracts/Common/index.ts +1 -1
  260. package/src/contracts/Common/payload-slab.ts +29 -0
  261. package/src/contracts/Configuration/RegistrationBuilders.ts +29 -15
  262. package/src/contracts/Configuration/RegistrationTypes.ts +19 -0
  263. package/src/contracts/Handlers/Contexts.ts +1 -0
  264. package/src/contracts/Locations/Authority.ts +7 -1
  265. package/src/internal.ts +17 -0
  266. package/src/nest-integration.ts +1 -0
  267. package/src/runtime/actors/actor-client.ts +257 -163
  268. package/src/runtime/actors/actor-context.ts +26 -14
  269. package/src/runtime/actors/actor-execution-context.ts +2 -2
  270. package/src/runtime/actors/actor-handoff.ts +86 -51
  271. package/src/runtime/actors/actor-join-deferred-scope.ts +6 -6
  272. package/src/runtime/actors/actor-local-native-join.ts +38 -17
  273. package/src/runtime/actors/actor-mailbox.ts +1 -1
  274. package/src/runtime/actors/actor-remote-joiner.ts +8 -4
  275. package/src/runtime/actors/actor-routed-join-transport.ts +13 -5
  276. package/src/runtime/actors/actor-routed-json-request.ts +3 -0
  277. package/src/runtime/actors/actor-runtime-contracts.ts +4 -2
  278. package/src/runtime/actors/actor-runtime-state.ts +1 -1
  279. package/src/runtime/actors/spot-actor-dispatch.ts +70 -68
  280. package/src/runtime/admission.ts +42 -15
  281. package/src/runtime/application-jobs/application-ingress-record-owner.ts +4 -0
  282. package/src/runtime/backend/contracts/index.ts +77 -10
  283. package/src/runtime/backend/mesh-completion-table.ts +106 -15
  284. package/src/runtime/backend/mesh-dispatch-pump.ts +294 -146
  285. package/src/runtime/backend/node/node-backend-adapter-support.ts +42 -32
  286. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +91 -34
  287. package/src/runtime/backend/node/node-event-loop-poller.ts +14 -5
  288. package/src/runtime/backend/node/node-mesh-backend-adapter.ts +5 -1
  289. package/src/runtime/backend/node/node-raw-binding-port.ts +180 -69
  290. package/src/runtime/backend/node/node-raw-mesh-backend.ts +386 -157
  291. package/src/runtime/backend/node/node-socket-backend-adapter.ts +56 -11
  292. package/src/runtime/backend/raw-binding-port.ts +13 -5
  293. package/src/runtime/channels/channel-clients.ts +26 -11
  294. package/src/runtime/channels/channel-dispatch-pipeline.ts +77 -65
  295. package/src/runtime/channels/channel-dispatch-services.ts +7 -12
  296. package/src/runtime/channels/channel-dispatchers.ts +93 -39
  297. package/src/runtime/channels/channel-envelope.ts +680 -144
  298. package/src/runtime/channels/channel-multipart.ts +17 -13
  299. package/src/runtime/channels/channel-outbound-operations.ts +204 -178
  300. package/src/runtime/channels/channel-receive-loops.ts +160 -107
  301. package/src/runtime/channels/channel-runtime-lifecycle.ts +64 -59
  302. package/src/runtime/channels/channel-runtime-manager.ts +74 -27
  303. package/src/runtime/channels/channel-socket-registry.ts +20 -5
  304. package/src/runtime/channels/channel-transports.ts +414 -287
  305. package/src/runtime/channels/dispatch-error-reporter.ts +4 -9
  306. package/src/runtime/channels/local-spot-route-transport.ts +27 -29
  307. package/src/runtime/channels/router-socket-spot-route-transport.ts +63 -32
  308. package/src/runtime/channels/source-spot-router.ts +75 -38
  309. package/src/runtime/channels/spot-node-route-transport.ts +67 -37
  310. package/src/runtime/channels/spot-route-bridge-transport.ts +62 -30
  311. package/src/runtime/channels/spot-route-dispatch-strategy.ts +105 -34
  312. package/src/runtime/diagnostics/dispatch-error-details.ts +10 -2
  313. package/src/runtime/diagnostics/message-flow-bootstrap.ts +6 -0
  314. package/src/runtime/diagnostics/message-flow-delivery.ts +171 -0
  315. package/src/runtime/diagnostics/message-flow-record.ts +295 -0
  316. package/src/runtime/diagnostics/message-flow-worker.ts +146 -0
  317. package/src/runtime/diagnostics/message-flow.ts +49 -362
  318. package/src/runtime/diagnostics/runtime-metrics.ts +10 -4
  319. package/src/runtime/execution/index.ts +6 -0
  320. package/src/runtime/execution/serial-execution-queue.ts +94 -96
  321. package/src/runtime/foundation/durable-service-request.ts +212 -89
  322. package/src/runtime/foundation/operation-registry.ts +287 -38
  323. package/src/runtime/foundation/raw-service-mesh-runtime.ts +617 -292
  324. package/src/runtime/foundation/request-runtime.ts +227 -0
  325. package/src/runtime/foundation/service-discovery-registry.ts +7 -0
  326. package/src/runtime/foundation/service-liveness-registry.ts +1 -1
  327. package/src/runtime/foundation/service-mailbox.ts +7 -2
  328. package/src/runtime/foundation/service-relocation-object-owner.ts +21 -6
  329. package/src/runtime/foundation/service-runtime-contracts.ts +12 -2
  330. package/src/runtime/foundation/service-stateful-registry.ts +52 -19
  331. package/src/runtime/foundation/service-stateful-runtime.ts +365 -198
  332. package/src/runtime/foundation/service-stateful-wire-codec.ts +18 -0
  333. package/src/runtime/foundation/service-topology-registry.ts +21 -3
  334. package/src/runtime/foundation/service-wire-constants.generated.ts +10 -0
  335. package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -17
  336. package/src/runtime/host/actor-packet-relay.ts +160 -156
  337. package/src/runtime/host/actor-placement-coordinator.ts +1 -1
  338. package/src/runtime/host/actor-runtime-options-factory.ts +7 -2
  339. package/src/runtime/host/actor-transfer-runtime.ts +3 -3
  340. package/src/runtime/host/application-job-queue.ts +56 -27
  341. package/src/runtime/host/bound-session-relay.ts +0 -1
  342. package/src/runtime/host/channel-runtime-options-factory.ts +3 -0
  343. package/src/runtime/host/entry-actor-runtime.ts +14 -6
  344. package/src/runtime/host/index.ts +388 -113
  345. package/src/runtime/host/location-runtime-owner.ts +3 -3
  346. package/src/runtime/host/service-relocation-host-runtime.ts +380 -252
  347. package/src/runtime/host/spot-address-transport.ts +110 -95
  348. package/src/runtime/host/spot-runtime-options-factory.ts +3 -0
  349. package/src/runtime/host/user-spot-creation-coordinator.ts +69 -22
  350. package/src/runtime/internal-observation.ts +2 -0
  351. package/src/runtime/locations/actor-location-claims.ts +42 -16
  352. package/src/runtime/locations/auto-connect-loop.ts +24 -16
  353. package/src/runtime/locations/auto-connect-planner.ts +2 -5
  354. package/src/runtime/locations/auto-connect-reconciler.ts +37 -24
  355. package/src/runtime/locations/in-memory-authority-store.ts +27 -7
  356. package/src/runtime/locations/in-memory-location-store.ts +1 -74
  357. package/src/runtime/locations/lifecycle.ts +4 -2
  358. package/src/runtime/locations/location-store-repository.ts +228 -308
  359. package/src/runtime/locations/resolvers.ts +20 -8
  360. package/src/runtime/locations/runtime.ts +16 -28
  361. package/src/runtime/messaging/creation-payload-codec.ts +12 -10
  362. package/src/runtime/messaging/framework-json-v1.ts +10 -1
  363. package/src/runtime/messaging/payload-codec.ts +50 -75
  364. package/src/runtime/messaging/request-deadline.ts +47 -39
  365. package/src/runtime/messaging/request-result.ts +88 -17
  366. package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
  367. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
  368. package/src/runtime/spots/index.ts +57 -10
  369. package/src/runtime/spots/spot-activation-registry.ts +12 -8
  370. package/src/runtime/spots/spot-activation-state.ts +2 -0
  371. package/src/runtime/spots/spot-actor-admission-coordinator.ts +62 -37
  372. package/src/runtime/spots/spot-actor-ingress-admission.ts +157 -0
  373. package/src/runtime/spots/spot-actor-membership.ts +8 -5
  374. package/src/runtime/spots/spot-actor-packet-dispatch.ts +122 -206
  375. package/src/runtime/spots/spot-actor-packet-drain.ts +21 -6
  376. package/src/runtime/spots/spot-entry-activation.ts +25 -35
  377. package/src/runtime/spots/spot-handler-registry.ts +72 -15
  378. package/src/runtime/spots/spot-manager-public.ts +4 -2
  379. package/src/runtime/spots/spot-node-runtime-manager.ts +16 -7
  380. package/src/runtime/spots/spot-outbound.ts +26 -10
  381. package/src/runtime/spots/spot-route-packet-dispatch.ts +18 -8
  382. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +14 -8
  383. package/src/runtime/spots/spot-runtime-ports.ts +5 -2
  384. package/src/runtime/spots/spot-serial-executor.ts +1 -1
  385. package/src/runtime/spots/spot-serial-turn-executor.ts +25 -40
  386. package/src/runtime/spots/spot-subscription-dispatch.ts +9 -2
  387. package/src/runtime/spots/spot-timer.ts +1 -1
  388. package/src/runtime/streams/actor-session-binding-registry.ts +46 -3
  389. package/src/runtime/streams/bound-actor-relay-sender.ts +16 -5
  390. package/src/runtime/streams/bound-session-service.ts +10 -7
  391. package/src/runtime/streams/index.ts +30 -4
  392. package/src/runtime/streams/managed-stream.ts +2 -1
  393. package/src/runtime/streams/session-calls.ts +9 -14
  394. package/src/runtime/streams/session-context.ts +6 -11
  395. package/src/runtime/streams/stream-session-runtime.ts +79 -40
  396. package/dist/runtime/spots/spot-lifecycle-metrics.d.ts +0 -8
  397. package/dist/runtime/spots/spot-lifecycle-metrics.js +0 -17
  398. package/src/runtime/spots/spot-lifecycle-metrics.ts +0 -16
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ZLinkMeshDispatchPump = void 0;
4
- const node_async_hooks_1 = require("node:async_hooks");
5
4
  const abort_1 = require("../abort");
6
5
  const node_os_1 = require("node:os");
7
6
  const application_job_queue_scope_1 = require("../application-jobs/application-job-queue-scope");
@@ -17,11 +16,6 @@ const MESH_DISPATCH_YIELD_INTERVAL_MS = 2;
17
16
  const MESH_DISPATCH_LIFECYCLE_CLAIM_BUDGET = 4;
18
17
  const MESH_DISPATCH_RECEIVE_CAPACITY = 64;
19
18
  const MESH_DISPATCH_MAX_APPLICATION_WORKERS = Math.max(2, (0, node_os_1.availableParallelism)());
20
- // Captured while the runtime module is loaded, before any application owner
21
- // exists. A ready callback may run inside a Spot turn; the shared Mesh pump
22
- // must enter like an independent receive-loop task, without inheriting that
23
- // owner's AsyncLocalStorage identity.
24
- const detachedMeshDispatchScope = node_async_hooks_1.AsyncLocalStorage.snapshot();
25
19
  class ZLinkMeshDispatchPump {
26
20
  node;
27
21
  options;
@@ -29,7 +23,7 @@ class ZLinkMeshDispatchPump {
29
23
  infrastructureScheduled = false;
30
24
  disposed = false;
31
25
  activeDrains = new Set();
32
- idleApplicationWorkers = new Set();
26
+ idleApplicationWorkers = [];
33
27
  applicationWorkerCount = 0;
34
28
  capacityStop = new AbortController();
35
29
  recordsSinceYield = 0;
@@ -62,7 +56,7 @@ class ZLinkMeshDispatchPump {
62
56
  this.pendingDomains = service_runtime_contracts_1.ReadyDomain.None;
63
57
  for (const wake of this.idleApplicationWorkers)
64
58
  wake();
65
- this.idleApplicationWorkers.clear();
59
+ this.idleApplicationWorkers.length = 0;
66
60
  while (this.activeDrains.size > 0) {
67
61
  await (0, abort_1.awaitWithAbort)(Promise.all([...this.activeDrains]), signal);
68
62
  }
@@ -83,19 +77,21 @@ class ZLinkMeshDispatchPump {
83
77
  this.scheduleInfrastructure();
84
78
  if (startApplication) {
85
79
  if ((domains & service_runtime_contracts_1.ReadyDomain.Infrastructure) !== 0) {
86
- setImmediate(() => this.wakeApplicationWorker());
80
+ this.scheduleApplicationWorker();
87
81
  }
88
82
  else {
89
83
  this.wakeApplicationWorker();
90
84
  }
91
85
  }
92
86
  }
87
+ scheduleApplicationWorker() {
88
+ setImmediate(() => this.wakeApplicationWorker());
89
+ }
93
90
  wakeApplicationWorker() {
94
91
  if (this.disposed || (this.pendingDomains & service_runtime_contracts_1.ReadyDomain.Application) === 0)
95
92
  return;
96
- const idle = this.idleApplicationWorkers.values().next().value;
93
+ const idle = this.idleApplicationWorkers.shift();
97
94
  if (idle !== undefined) {
98
- this.idleApplicationWorkers.delete(idle);
99
95
  this.pendingDomains &= ~service_runtime_contracts_1.ReadyDomain.Application;
100
96
  idle();
101
97
  return;
@@ -107,58 +103,12 @@ class ZLinkMeshDispatchPump {
107
103
  startApplicationWorker() {
108
104
  this.applicationWorkerCount += 1;
109
105
  let worker;
110
- worker = detachedMeshDispatchScope(() => (0, execution_1.runZLinkExecutionArea)('application', () => this.runApplicationWorker())).finally(() => {
106
+ worker = (0, execution_1.detachedMeshDispatchScope)(() => (0, execution_1.runZLinkExecutionArea)('application', () => this.runApplicationWorker())).finally(() => {
111
107
  this.applicationWorkerCount -= 1;
112
108
  this.activeDrains.delete(worker);
113
109
  });
114
110
  this.activeDrains.add(worker);
115
111
  }
116
- async runApplicationWorker() {
117
- // A worker claims one owner at a time so a suspended handler cannot hold
118
- // unrelated owners. Each owner may supply up to 64 pre-admitted records.
119
- const readyBatch = this.node.createReadyBatch(1);
120
- const receiveBatch = this.node.createReceiveBatch(MESH_DISPATCH_RECEIVE_CAPACITY, this.options.partCapacity ?? DEFAULT_MESH_PART_CAPACITY);
121
- try {
122
- for (;;) {
123
- await this.waitForApplicationReady();
124
- this.beginDrain();
125
- try {
126
- while (!this.disposed) {
127
- readyBatch.reset();
128
- const drained = this.node.drainReady(service_runtime_contracts_1.ReadyDomain.Application, readyBatch, runtime_values_1.ZLINK_BACKEND_RECV_DONT_WAIT);
129
- if (!drained.ok || drained.records.length === 0)
130
- break;
131
- if (drained.hasResidue)
132
- this.markReady(service_runtime_contracts_1.ReadyDomain.Application);
133
- for (let index = 0; index < drained.records.length; index += 1) {
134
- const claim = readyBatch.takeClaim(index);
135
- // Raw ingress already attached one host permit to each record.
136
- // A claim reserving admission may receive only that permit's record.
137
- await this.drainClaim(service_runtime_contracts_1.ReadyDomain.Application, drained.records[index], claim, receiveBatch);
138
- }
139
- // Empty ready claims count toward the shared pump budget too.
140
- this.recordsSinceYield += 1;
141
- const yieldTurn = this.yieldIfNeeded();
142
- if (yieldTurn !== undefined)
143
- await yieldTurn;
144
- }
145
- }
146
- catch (error) {
147
- this.reportDispatchError(error);
148
- }
149
- finally {
150
- readyBatch.reset();
151
- this.draining -= 1;
152
- }
153
- if (this.disposed)
154
- return;
155
- }
156
- }
157
- finally {
158
- receiveBatch.close();
159
- readyBatch.close();
160
- }
161
- }
162
112
  waitForApplicationReady() {
163
113
  if (this.disposed)
164
114
  return Promise.resolve();
@@ -166,16 +116,38 @@ class ZLinkMeshDispatchPump {
166
116
  this.pendingDomains &= ~service_runtime_contracts_1.ReadyDomain.Application;
167
117
  return Promise.resolve();
168
118
  }
169
- return new Promise((resolve) => this.idleApplicationWorkers.add(resolve));
119
+ return new Promise((resolve) => this.idleApplicationWorkers.push(resolve));
170
120
  }
171
121
  /**
172
122
  * Starts one record in this worker's turn; a permit's scope covers the
173
- * synchronous dispatch. Returns `false` when the dispatch threw (already
174
- * reported), `true` when it returned synchronously, or the handler's pending
175
- * completion, which the draining turn awaits itself before
123
+ * synchronous dispatch. Returns `false` when preparation rejects the record,
124
+ * shutdown starts, or dispatch throws (already reported), `true` when dispatch
125
+ * returns synchronously, or the pending preparation/handler completion,
126
+ * which the draining turn awaits itself before
176
127
  * {@link finishRecord}.
177
128
  */
178
129
  dispatchRecord(owner, record, permit) {
130
+ if (record.prepareDispatch === undefined)
131
+ return this.invokeRecord(owner, record, permit);
132
+ try {
133
+ const preparation = record.prepareDispatch(this.capacityStop.signal);
134
+ return preparation instanceof Promise
135
+ ? this.continuePreparingRecord(owner, record, permit, preparation)
136
+ : this.invokeRecord(owner, record, permit, preparation);
137
+ }
138
+ catch (error) {
139
+ this.failRecord(error, record, permit);
140
+ return false;
141
+ }
142
+ }
143
+ continuePreparingRecord(owner, record, permit, preparation) {
144
+ return preparation.then((accepted) => this.invokeRecord(owner, record, permit, accepted));
145
+ }
146
+ invokeRecord(owner, record, permit, accepted = true) {
147
+ if (!accepted || this.capacityStop.signal.aborted) {
148
+ (0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit);
149
+ return false;
150
+ }
179
151
  const previous = permit === undefined ? undefined : (0, application_job_queue_scope_1.enterApplicationJobPermitScope)(permit);
180
152
  let result;
181
153
  try {
@@ -208,6 +180,9 @@ class ZLinkMeshDispatchPump {
208
180
  (0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit);
209
181
  return;
210
182
  }
183
+ return this.finishPendingRecord(result, record, permit);
184
+ }
185
+ finishPendingRecord(result, record, permit) {
211
186
  return Promise.resolve(result).then(() => (0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit), (error) => {
212
187
  this.reportDispatchError(error, meshDispatchFailureContext(record));
213
188
  (0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit);
@@ -229,7 +204,7 @@ class ZLinkMeshDispatchPump {
229
204
  }
230
205
  this.infrastructureScheduled = true;
231
206
  const drain = (startTurn ?? this.yieldIfNeeded() ?? Promise.resolve())
232
- .then(() => detachedMeshDispatchScope(() => (0, execution_1.runZLinkExecutionArea)('infrastructure', () => this.drainInfrastructure())))
207
+ .then(() => (0, execution_1.detachedMeshDispatchScope)(() => (0, execution_1.runZLinkExecutionArea)('infrastructure', () => this.drainInfrastructure())))
233
208
  .catch((error) => this.reportDispatchError(error));
234
209
  this.activeDrains.add(drain);
235
210
  void drain.finally(() => {
@@ -249,7 +224,7 @@ class ZLinkMeshDispatchPump {
249
224
  }
250
225
  this.pendingDomains &= ~service_runtime_contracts_1.ReadyDomain.Infrastructure;
251
226
  if ((this.pendingDomains & service_runtime_contracts_1.ReadyDomain.Application) !== 0) {
252
- setImmediate(() => this.wakeApplicationWorker());
227
+ this.scheduleApplicationWorker();
253
228
  }
254
229
  const lifecycleBudgetExhausted = await this.drainDomain(readyBatch);
255
230
  if (lifecycleBudgetExhausted) {
@@ -282,7 +257,7 @@ class ZLinkMeshDispatchPump {
282
257
  claimsDrained += 1;
283
258
  const owner = drained.records[index];
284
259
  this.beginDrain();
285
- const drain = this.drainClaim(service_runtime_contracts_1.ReadyDomain.Infrastructure, owner, claim, undefined).catch((error) => this.reportDispatchError(error));
260
+ const drain = this.drainClaim(service_runtime_contracts_1.ReadyDomain.Infrastructure, owner, claim);
286
261
  this.activeDrains.add(drain);
287
262
  void drain.finally(() => {
288
263
  this.draining -= 1;
@@ -318,99 +293,217 @@ class ZLinkMeshDispatchPump {
318
293
  }
319
294
  this.draining += 1;
320
295
  }
321
- /** Drains one claimed owner in this worker's turn, in claim order. */
296
+ /** Each worker owns claim continuations for its entire lifetime. */
297
+ async runApplicationWorker() {
298
+ const readyBatch = this.node.createReadyBatch(1);
299
+ const receiveBatch = this.node.createReceiveBatch(MESH_DISPATCH_RECEIVE_CAPACITY, this.options.partCapacity ?? DEFAULT_MESH_PART_CAPACITY);
300
+ const claimDrain = this.createClaimDrain(receiveBatch);
301
+ try {
302
+ for (;;) {
303
+ // This boundary also keeps the first handler off the receive stack.
304
+ await this.waitForApplicationReady();
305
+ this.beginDrain();
306
+ try {
307
+ while (!this.disposed) {
308
+ readyBatch.reset();
309
+ const drained = this.node.drainReady(service_runtime_contracts_1.ReadyDomain.Application, readyBatch, runtime_values_1.ZLINK_BACKEND_RECV_DONT_WAIT);
310
+ if (!drained.ok || drained.records.length === 0)
311
+ break;
312
+ if (drained.hasResidue)
313
+ this.markReady(service_runtime_contracts_1.ReadyDomain.Application);
314
+ const pending = this.dispatchClaim(service_runtime_contracts_1.ReadyDomain.Application, drained.records[0], readyBatch.takeClaim(0), claimDrain);
315
+ if (pending !== undefined)
316
+ await pending;
317
+ // Returning a claim remains an asynchronous worker boundary without
318
+ // allocating a separate async drain task for a synchronous claim.
319
+ await this.yieldIfNeeded();
320
+ // Empty ready claims count toward the shared pump budget too.
321
+ this.recordsSinceYield += 1;
322
+ const nextTurn = this.yieldIfNeeded();
323
+ if (nextTurn !== undefined)
324
+ await nextTurn;
325
+ }
326
+ }
327
+ catch (error) {
328
+ this.reportDispatchError(error);
329
+ }
330
+ finally {
331
+ readyBatch.reset();
332
+ this.draining -= 1;
333
+ }
334
+ if (this.disposed)
335
+ return;
336
+ }
337
+ }
338
+ finally {
339
+ receiveBatch.close();
340
+ readyBatch.close();
341
+ }
342
+ }
322
343
  async drainClaim(domain, owner, claim, receiveBatch) {
323
- let ownerReceiveBatch = receiveBatch;
324
344
  try {
325
- ownerReceiveBatch ??= this.node.createReceiveBatch(MESH_DISPATCH_RECEIVE_CAPACITY, this.options.partCapacity ?? DEFAULT_MESH_PART_CAPACITY);
326
- const capacity = owner.ordinaryIngressPreAdmitted === true ? MESH_DISPATCH_RECEIVE_CAPACITY : 1;
327
- let claimPermit = owner.terminalCompletion === true ||
328
- owner.ordinaryIngressPreAdmitted === true ||
329
- domain === service_runtime_contracts_1.ReadyDomain.Infrastructure
330
- ? undefined
331
- : await this.acquirePermit();
345
+ const pending = this.dispatchClaim(domain, owner, claim, this.createClaimDrain(receiveBatch));
346
+ if (pending !== undefined)
347
+ await pending;
348
+ await this.yieldIfNeeded();
349
+ }
350
+ catch (error) {
351
+ this.reportDispatchError(error);
352
+ }
353
+ }
354
+ createClaimDrain(suppliedReceiveBatch) {
355
+ const state = {
356
+ suppliedReceiveBatch,
357
+ receiveBatch: suppliedReceiveBatch,
358
+ domain: service_runtime_contracts_1.ReadyDomain.None,
359
+ owner: undefined,
360
+ claim: undefined,
361
+ claimPermit: undefined,
362
+ records: undefined,
363
+ index: 0,
364
+ receive: (permit) => this.receiveClaim(state, permit),
365
+ dispatchRecords: () => this.dispatchClaimRecords(state),
366
+ finish: () => this.finishClaim(state)
367
+ };
368
+ return state;
369
+ }
370
+ /** A synchronous claim finishes without an async wrapper or a Promise. */
371
+ dispatchClaim(domain, owner, claim, state = this.createClaimDrain()) {
372
+ state.domain = domain;
373
+ state.owner = owner;
374
+ state.claim = claim;
375
+ state.index = 0;
376
+ let pending;
377
+ try {
378
+ state.receiveBatch ??= this.node.createReceiveBatch(MESH_DISPATCH_RECEIVE_CAPACITY, this.options.partCapacity ?? DEFAULT_MESH_PART_CAPACITY);
379
+ pending =
380
+ owner.terminalCompletion === true ||
381
+ owner.ordinaryIngressPreAdmitted === true ||
382
+ domain === service_runtime_contracts_1.ReadyDomain.Infrastructure
383
+ ? state.receive()
384
+ : this.acquirePermit().then(state.receive);
385
+ if (pending !== undefined)
386
+ return pending.finally(state.finish);
387
+ return undefined;
388
+ }
389
+ finally {
390
+ if (pending === undefined)
391
+ state.finish();
392
+ }
393
+ }
394
+ receiveClaim(state, permit) {
395
+ state.claimPermit = permit;
396
+ if (this.capacityStop.signal.aborted)
397
+ return undefined;
398
+ const capacity = state.owner.ordinaryIngressPreAdmitted === true ? MESH_DISPATCH_RECEIVE_CAPACITY : 1;
399
+ state.receiveBatch.reset(capacity);
400
+ const received = state.claim.recvBatch(state.receiveBatch, runtime_values_1.ZLINK_BACKEND_RECV_DONT_WAIT);
401
+ if (!received.ok)
402
+ return undefined;
403
+ state.records = received.records;
404
+ return this.dispatchClaimRecords(state);
405
+ }
406
+ dispatchClaimRecords(state) {
407
+ const records = state.records;
408
+ const owner = state.owner;
409
+ while (state.index < records.length && !this.disposed) {
410
+ const record = records[state.index++];
411
+ const permit = record.applicationJobPermit ?? state.claimPermit;
412
+ if (owner.ordinaryIngressPreAdmitted === true && permit === undefined) {
413
+ throw new Error('Pre-admitted raw ingress record lost its Application Job Queue permit.');
414
+ }
415
+ this.recordsSinceYield += 1;
416
+ if (permit !== undefined) {
417
+ if (state.domain === service_runtime_contracts_1.ReadyDomain.Application && record.applicationJobPermit === undefined)
418
+ permit.markApplicationQueued();
419
+ // Only reservations not transferred to a record remain claim-owned.
420
+ if (permit === state.claimPermit)
421
+ state.claimPermit = undefined;
422
+ }
423
+ const dispatched = this.dispatchRecord(owner, record, permit);
424
+ if (dispatched === false) {
425
+ if (isNodeOrChannelRecord(record))
426
+ this.releaseRecord(record);
427
+ continue;
428
+ }
429
+ let terminal;
430
+ if (dispatched === true) {
431
+ const finished = this.finishRecord(record, permit);
432
+ if (finished === undefined) {
433
+ if (isNodeOrChannelRecord(record))
434
+ this.releaseRecord(record);
435
+ continue;
436
+ }
437
+ terminal = finished;
438
+ }
439
+ else {
440
+ terminal = this.continuePendingClaim(dispatched, record, permit);
441
+ }
442
+ if (isNodeOrChannelRecord(record)) {
443
+ // Return the receive claim for the next batch; the existing terminal observer owns record lifetime.
444
+ this.observeRecordTerminal(terminal, record);
445
+ continue;
446
+ }
447
+ return terminal.then(state.dispatchRecords);
448
+ }
449
+ return undefined;
450
+ }
451
+ observeRecordTerminal(terminal, record) {
452
+ const tracked = terminal.finally(() => this.releaseRecord(record));
453
+ this.activeDrains.add(tracked);
454
+ void tracked.then(() => this.activeDrains.delete(tracked), (error) => {
455
+ this.activeDrains.delete(tracked);
456
+ this.reportDispatchError(error, meshDispatchFailureContext(record));
457
+ });
458
+ }
459
+ continuePendingClaim(dispatched, record, permit) {
460
+ return Promise.resolve(dispatched).then((accepted) => {
461
+ if (accepted !== false)
462
+ return this.finishRecord(record, permit);
463
+ }, (error) => this.failRecord(error, record, permit));
464
+ }
465
+ releaseRecord(record) {
466
+ for (let index = 0; index < record.parts.length; index++)
467
+ record.parts[index].close();
468
+ record.releaseRetainedIngress?.();
469
+ }
470
+ finishClaim(state) {
471
+ try {
332
472
  try {
333
- if (this.capacityStop.signal.aborted)
334
- return;
335
- ownerReceiveBatch.reset(capacity);
336
- const received = claim.recvBatch(ownerReceiveBatch, runtime_values_1.ZLINK_BACKEND_RECV_DONT_WAIT);
337
- if (received.ok) {
338
- // The bounded batch stays in claim order until its records finish.
339
- try {
340
- for (const record of received.records) {
341
- if (this.disposed)
342
- break;
343
- const permit = record.applicationJobPermit ?? claimPermit;
344
- if (owner.ordinaryIngressPreAdmitted === true && permit === undefined) {
345
- throw new Error('Pre-admitted raw ingress record lost its Application Job Queue permit.');
346
- }
347
- this.recordsSinceYield += 1;
348
- if (permit !== undefined) {
349
- if (domain === service_runtime_contracts_1.ReadyDomain.Application && record.applicationJobPermit === undefined)
350
- permit.markApplicationQueued();
351
- // The scope now owns this reservation, including failure
352
- // and detached handler handoff. Only unused permits remain
353
- // owned by the receive attempt's finally block.
354
- if (permit === claimPermit)
355
- claimPermit = undefined;
356
- }
357
- // The record's terminal and the permit turn release follow the
358
- // handler in this turn's own continuation.
359
- if (record.prepareDispatch !== undefined) {
360
- try {
361
- const stopSignal = this.capacityStop.signal;
362
- const preparation = record.prepareDispatch(stopSignal);
363
- const accepted = preparation instanceof Promise ? await preparation : preparation;
364
- if (!accepted || stopSignal.aborted) {
365
- (0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit);
366
- continue;
367
- }
368
- }
369
- catch (error) {
370
- this.failRecord(error, record, permit);
371
- continue;
372
- }
373
- }
374
- const dispatched = this.dispatchRecord(owner, record, permit);
375
- if (dispatched === false)
376
- continue;
377
- if (dispatched !== true) {
378
- try {
379
- await dispatched;
380
- }
381
- catch (error) {
382
- this.failRecord(error, record, permit);
383
- continue;
384
- }
385
- }
386
- const finished = this.finishRecord(record, permit);
387
- if (finished !== undefined)
388
- await finished;
389
- }
390
- }
391
- finally {
392
- // Batch ownership includes records whose dispatch never began,
393
- // including on failure or shutdown in the middle of the batch.
394
- for (const record of received.records) {
395
- for (const part of record.parts)
396
- part.close();
397
- record.releaseRetainedIngress?.();
398
- }
473
+ // Ownership includes records whose dispatch never began on failure or shutdown.
474
+ const records = state.records;
475
+ if (records !== undefined) {
476
+ for (let recordIndex = 0; recordIndex < records.length; recordIndex += 1) {
477
+ const record = records[recordIndex];
478
+ // Started Node and Channel records are cleaned up at their own terminals.
479
+ if (recordIndex < state.index && isNodeOrChannelRecord(record))
480
+ continue;
481
+ this.releaseRecord(record);
399
482
  }
400
483
  }
401
484
  }
402
485
  finally {
403
- claimPermit?.releaseAfterInternalProcessing();
486
+ state.claimPermit?.releaseAfterInternalProcessing();
404
487
  }
405
488
  }
406
489
  finally {
407
- claim.release();
408
- if (receiveBatch === undefined)
409
- ownerReceiveBatch?.close();
490
+ try {
491
+ state.claim.release();
492
+ }
493
+ finally {
494
+ try {
495
+ if (state.suppliedReceiveBatch === undefined)
496
+ state.receiveBatch?.close();
497
+ }
498
+ finally {
499
+ // An idle worker must not retain the previous claim's payload or owner.
500
+ state.records = undefined;
501
+ state.owner = undefined;
502
+ state.claim = undefined;
503
+ state.claimPermit = undefined;
504
+ }
505
+ }
410
506
  }
411
- const yieldTurn = this.yieldIfNeeded();
412
- if (yieldTurn !== undefined)
413
- await yieldTurn;
414
507
  }
415
508
  /**
416
509
  * The batch budget is shared by every drain of this pump, so once it is
@@ -474,3 +567,9 @@ function yieldToEventLoop() {
474
567
  function yieldToTimers() {
475
568
  return new Promise((resolve) => setTimeout(resolve, 0));
476
569
  }
570
+ function isNodeOrChannelRecord(record) {
571
+ return (record.kind === service_runtime_contracts_1.ReceiveKind.NodeSend ||
572
+ record.kind === service_runtime_contracts_1.ReceiveKind.NodeRequest ||
573
+ record.kind === service_runtime_contracts_1.ReceiveKind.ChannelSend ||
574
+ record.kind === service_runtime_contracts_1.ReceiveKind.ChannelRequest);
575
+ }
@@ -1,3 +1,4 @@
1
+ import type { PendingOperation } from '../../foundation/operation-registry';
1
2
  export type ZLinkBindingModule = typeof import('@zlink-systems/zlink');
2
3
  export declare const zlink: ZLinkBindingModule;
3
4
  export type ZLinkBindingOperation = {
@@ -40,8 +41,8 @@ export declare function submitBindingReply(operation: ZLinkBindingReplyOperation
40
41
  export declare function submitBindingAsyncSend(operation: ZLinkBindingAsyncSendOperation, payload: unknown): Promise<void>;
41
42
  export declare function submitBindingSend(operation: ZLinkBindingAsyncSendOperation, payload: unknown): import('../raw-binding-port').ZLinkRawSendSubmission;
42
43
  export declare function submitBindingSyncSend(operation: ZLinkBindingAsyncSendOperation, payload: unknown): void;
43
- export declare function submitBindingRequest(operation: ZLinkBindingRequestOperation, payload: unknown, timeoutMs: number | undefined, recordReceived?: () => void, onAdmitted?: () => void): Promise<readonly unknown[]>;
44
- export declare function bindingRequestReply(submission: import('@zlink-systems/zlink').RequestSubmission, deadlineMs: number | undefined, recordReceived?: () => void, onAdmitted?: () => void): Promise<import('@zlink-systems/zlink').Message[]>;
44
+ export declare function submitBindingRequest(operation: ZLinkBindingRequestOperation, payload: unknown, timeoutMs: number | undefined, recordReceived: (() => void) | undefined, onAdmitted: (() => void) | undefined, pending: PendingOperation<unknown>, receiver: import('../../foundation/operation-registry').OperationObserver<unknown, unknown>): void;
45
+ export declare function bindingRequestReply(submission: import('@zlink-systems/zlink').RequestSubmission, receiver: import('../../foundation/operation-registry').OperationObserver<unknown, unknown>, pending: PendingOperation<unknown>, recordReceived?: () => void, onAdmitted?: () => void): void;
45
46
  export declare function closeBindingReply(replies: readonly import('@zlink-systems/zlink').Message[]): void;
46
47
  /**
47
48
  * Closes a binding handle once. An already closed or terminated handle counts as
@@ -126,8 +126,7 @@ function submitBindingSyncSend(operation, payload) {
126
126
  throw translateBindingResultError(error);
127
127
  }
128
128
  }
129
- async function submitBindingRequest(operation, payload, timeoutMs, recordReceived, onAdmitted) {
130
- const deadlineMs = timeoutMs === undefined ? undefined : performance.now() + timeoutMs;
129
+ function submitBindingRequest(operation, payload, timeoutMs, recordReceived, onAdmitted, pending, receiver) {
131
130
  try {
132
131
  let current;
133
132
  if (Array.isArray(payload)) {
@@ -142,34 +141,43 @@ async function submitBindingRequest(operation, payload, timeoutMs, recordReceive
142
141
  }
143
142
  current ??= operation.message(Buffer.alloc(0));
144
143
  if (timeoutMs !== undefined) {
145
- current = current.timeout(timeoutMs);
144
+ current = current.timeout(Math.min(timeoutMs, (0, request_deadline_1.remainingRequestTimeout)('Request', pending.deadlineMs) ?? timeoutMs));
146
145
  }
147
- return await bindingRequestReply(current.submit(), deadlineMs, recordReceived, onAdmitted);
146
+ bindingRequestReply(current.submit(), receiver, pending, recordReceived, onAdmitted);
148
147
  }
149
148
  catch (error) {
150
- throw translateBindingResultError(error);
149
+ receiver.operationFailed(pending.id, translateBindingResultError(error), undefined);
151
150
  }
152
151
  }
153
- async function bindingRequestReply(submission, deadlineMs, recordReceived, onAdmitted) {
154
- const reply = submission.reply;
155
- if (submission.result === runtime_values_1.SubmitResult.Backpressured) {
152
+ function bindingRequestReply(submission, receiver, pending, recordReceived, onAdmitted) {
153
+ // The physical receiver remains reachable independently of admission failure.
154
+ void submission.reply.then((replies) => {
156
155
  try {
157
- const [, replies] = await (0, request_deadline_1.waitRequestReply)(Promise.all([submission.admitted.then(() => onAdmitted?.()), reply]), 'Request', deadlineMs);
158
156
  recordReceived?.();
159
- return replies;
160
157
  }
161
158
  catch (error) {
162
- void reply.then((parts) => {
163
- recordReceived?.();
164
- closeBindingReply(parts);
165
- }, () => undefined);
166
- throw error;
159
+ receiver.operationFailed(pending.id, error, undefined);
160
+ }
161
+ receiver.operationCompleted(pending.id, replies, undefined);
162
+ }, (error) => receiver.operationFailed(pending.id, translateBindingResultError(error), undefined));
163
+ if (submission.result === runtime_values_1.SubmitResult.Backpressured) {
164
+ void submission.admitted.then(() => {
165
+ try {
166
+ onAdmitted?.();
167
+ }
168
+ catch (error) {
169
+ receiver.operationFailed(pending.id, error, undefined);
170
+ }
171
+ }, (error) => receiver.operationFailed(pending.id, error, undefined));
172
+ }
173
+ else {
174
+ try {
175
+ onAdmitted?.();
176
+ }
177
+ catch (error) {
178
+ receiver.operationFailed(pending.id, error, undefined);
167
179
  }
168
180
  }
169
- onAdmitted?.();
170
- const replies = await reply;
171
- recordReceived?.();
172
- return replies;
173
181
  }
174
182
  function closeBindingReply(replies) {
175
183
  for (const reply of replies)
@@ -1,3 +1,5 @@
1
+ import { RequestRuntime } from '../../foundation/request-runtime';
2
+ import { type ZLinkRequestResult } from '../../messaging/request-result';
1
3
  import type { DealerSocket, Message, PubSocket } from '@zlink-systems/zlink';
2
4
  import { type ZLinkSubmitResult } from '../../messaging/submission-result';
3
5
  import type { ZLinkChannelClientTransport } from '../../channels/channel-transports';
@@ -5,9 +7,10 @@ import type { ZLinkChannelClientTransport } from '../../channels/channel-transpo
5
7
  export declare class ZLinkDealerChannelClientTransport implements ZLinkChannelClientTransport {
6
8
  private readonly dealer;
7
9
  private readonly publisher?;
8
- constructor(dealer: DealerSocket, publisher?: PubSocket | undefined);
10
+ private readonly requests;
11
+ constructor(dealer: DealerSocket, publisher?: PubSocket | undefined, requests?: RequestRuntime);
9
12
  send(channelName: string, packetName: string | undefined, message: Message, metadata?: ReadonlyMap<string, string>): Promise<ZLinkSubmitResult>;
10
- request<TReply>(channelName: string, packetName: string | undefined, request: Message, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>, onAdmitted?: () => void): Promise<TReply>;
13
+ request<TReply>(channelName: string, packetName: string | undefined, request: Message, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>, onAdmitted?: () => void): ZLinkRequestResult<TReply>;
11
14
  tryPublish(channelName: string, topic: string, packetName: string | undefined, event: Message, metadata?: ReadonlyMap<string, string>): ZLinkSubmitResult;
12
15
  publish(channelName: string, topic: string, packetName: string | undefined, event: Message, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>): Promise<ZLinkSubmitResult>;
13
16
  }