@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,6 +1,11 @@
1
1
  import { AsyncLocalStorage } from 'node:async_hooks';
2
+ import { awaitWithAbort } from '../abort';
2
3
  import { availableParallelism } from 'node:os';
3
- import { runWithApplicationJobPermit } from '../application-jobs/application-job-queue-scope';
4
+ import {
5
+ enterApplicationJobPermitScope,
6
+ leaveApplicationJobPermitScope,
7
+ releaseApplicationJobPermitTurn
8
+ } from '../application-jobs/application-job-queue-scope';
4
9
  import type {
5
10
  ApplicationJobPermitPort,
6
11
  ApplicationJobQueuePort
@@ -8,6 +13,7 @@ import type {
8
13
  import { runZLinkExecutionArea } from '../execution';
9
14
  import {
10
15
  ReadyDomain,
16
+ type Claim,
11
17
  type ReadyBatch,
12
18
  type ReadyRecord,
13
19
  type ReceiveBatch,
@@ -67,6 +73,10 @@ export class ZLinkMeshDispatchPump {
67
73
  private readonly capacityStop = new AbortController();
68
74
  private recordsSinceYield = 0;
69
75
  private yieldStartedAtMs = 0;
76
+ /** Drains in progress; the batch budget begins when work starts on an idle pump. */
77
+ private draining = 0;
78
+ /** The macrotask boundary every drain waits for once the shared budget is spent. */
79
+ private pendingYield?: Promise<void>;
70
80
 
71
81
  constructor(
72
82
  private readonly node: ZLinkBackendMeshNode,
@@ -84,7 +94,7 @@ export class ZLinkMeshDispatchPump {
84
94
  });
85
95
  }
86
96
 
87
- async dispose(): Promise<void> {
97
+ async dispose(signal?: AbortSignal): Promise<void> {
88
98
  if (this.disposed) {
89
99
  return;
90
100
  }
@@ -94,7 +104,7 @@ export class ZLinkMeshDispatchPump {
94
104
  for (const wake of this.idleApplicationWorkers) wake();
95
105
  this.idleApplicationWorkers.clear();
96
106
  while (this.activeDrains.size > 0) {
97
- await Promise.all([...this.activeDrains]);
107
+ await awaitWithAbort(Promise.all([...this.activeDrains]), signal);
98
108
  }
99
109
  }
100
110
 
@@ -158,12 +168,40 @@ export class ZLinkMeshDispatchPump {
158
168
  try {
159
169
  for (;;) {
160
170
  await this.waitForApplicationReady();
161
- if (this.disposed) return;
171
+ this.beginDrain();
162
172
  try {
163
- await this.drainDomain(ReadyDomain.Application, readyBatch, receiveBatch);
173
+ while (!this.disposed) {
174
+ readyBatch.reset();
175
+ const drained = this.node.drainReady(
176
+ ReadyDomain.Application,
177
+ readyBatch,
178
+ ZLINK_BACKEND_RECV_DONT_WAIT
179
+ );
180
+ if (!drained.ok || drained.records.length === 0) break;
181
+ if (drained.hasResidue) this.markReady(ReadyDomain.Application);
182
+ for (let index = 0; index < drained.records.length; index += 1) {
183
+ const claim = readyBatch.takeClaim(index);
184
+ // Raw ingress already attached one host permit to each record.
185
+ // A claim reserving admission may receive only that permit's record.
186
+ await this.drainClaim(
187
+ ReadyDomain.Application,
188
+ drained.records[index]!,
189
+ claim,
190
+ receiveBatch
191
+ );
192
+ }
193
+ // Empty ready claims count toward the shared pump budget too.
194
+ this.recordsSinceYield += 1;
195
+ const yieldTurn = this.yieldIfNeeded();
196
+ if (yieldTurn !== undefined) await yieldTurn;
197
+ }
164
198
  } catch (error) {
165
199
  this.reportDispatchError(error);
200
+ } finally {
201
+ readyBatch.reset();
202
+ this.draining -= 1;
166
203
  }
204
+ if (this.disposed) return;
167
205
  }
168
206
  } finally {
169
207
  receiveBatch.close();
@@ -180,6 +218,64 @@ export class ZLinkMeshDispatchPump {
180
218
  return new Promise((resolve) => this.idleApplicationWorkers.add(resolve));
181
219
  }
182
220
 
221
+ /**
222
+ * Starts one record in this worker's turn; a permit's scope covers the
223
+ * synchronous dispatch. Returns `false` when the dispatch threw (already
224
+ * reported), `true` when it returned synchronously, or the handler's pending
225
+ * completion, which the draining turn awaits itself before
226
+ * {@link finishRecord}.
227
+ */
228
+ private dispatchRecord(
229
+ owner: ReadyRecord,
230
+ record: ReceiveRecord,
231
+ permit: ApplicationJobPermitPort | undefined
232
+ ): boolean | PromiseLike<void> {
233
+ const previous = permit === undefined ? undefined : enterApplicationJobPermitScope(permit);
234
+ let result: void | PromiseLike<void>;
235
+ try {
236
+ result = this.options.dispatch(owner, record);
237
+ } catch (error) {
238
+ this.failRecord(error, record, permit);
239
+ return false;
240
+ } finally {
241
+ if (permit !== undefined) leaveApplicationJobPermitScope(previous);
242
+ }
243
+ return result ?? true;
244
+ }
245
+
246
+ private failRecord(
247
+ error: unknown,
248
+ record: ReceiveRecord,
249
+ permit: ApplicationJobPermitPort | undefined
250
+ ): void {
251
+ releaseApplicationJobPermitTurn(permit);
252
+ this.reportDispatchError(error, meshDispatchFailureContext(record));
253
+ }
254
+
255
+ /** Runs the record's terminal completion, then releases its permit turn. */
256
+ private finishRecord(
257
+ record: ReceiveRecord,
258
+ permit: ApplicationJobPermitPort | undefined
259
+ ): void | Promise<void> {
260
+ let result: void | Promise<void> = undefined;
261
+ try {
262
+ result = record.onTerminalCompletion?.();
263
+ } catch (error) {
264
+ this.reportDispatchError(error, meshDispatchFailureContext(record));
265
+ }
266
+ if (result === undefined) {
267
+ releaseApplicationJobPermitTurn(permit);
268
+ return;
269
+ }
270
+ return Promise.resolve(result).then(
271
+ () => releaseApplicationJobPermitTurn(permit),
272
+ (error) => {
273
+ this.reportDispatchError(error, meshDispatchFailureContext(record));
274
+ releaseApplicationJobPermitTurn(permit);
275
+ }
276
+ );
277
+ }
278
+
183
279
  private reportDispatchError(error: unknown, context?: ZLinkMeshDispatchFailureContext): void {
184
280
  this.options.reportError?.(error, context);
185
281
  }
@@ -229,12 +325,7 @@ export class ZLinkMeshDispatchPump {
229
325
  if ((this.pendingDomains & ReadyDomain.Application) !== 0) {
230
326
  setImmediate(() => this.wakeApplicationWorker());
231
327
  }
232
- const lifecycleBudgetExhausted = await this.drainDomain(
233
- ReadyDomain.Infrastructure,
234
- readyBatch,
235
- undefined,
236
- MESH_DISPATCH_LIFECYCLE_CLAIM_BUDGET
237
- );
328
+ const lifecycleBudgetExhausted = await this.drainDomain(readyBatch);
238
329
  if (lifecycleBudgetExhausted) {
239
330
  this.pendingDomains |= ReadyDomain.Infrastructure;
240
331
  await yieldToEventLoop();
@@ -245,118 +336,40 @@ export class ZLinkMeshDispatchPump {
245
336
  }
246
337
  }
247
338
 
248
- private async drainDomain(
249
- domain: number,
250
- readyBatch: ReadyBatch,
251
- receiveBatch: ReceiveBatch | undefined,
252
- claimBudget?: number
253
- ): Promise<boolean> {
339
+ private async drainDomain(readyBatch: ReadyBatch): Promise<boolean> {
254
340
  let claimsDrained = 0;
341
+ this.beginDrain();
255
342
  try {
256
343
  while (!this.disposed) {
257
- if (claimBudget !== undefined && claimsDrained >= claimBudget) {
344
+ if (claimsDrained >= MESH_DISPATCH_LIFECYCLE_CLAIM_BUDGET) {
258
345
  // Lifecycle work has priority, but a bounded turn lets application
259
346
  // work make progress when lifecycle records keep arriving.
260
347
  return true;
261
348
  }
262
349
  readyBatch.reset();
263
- const drained = this.node.drainReady(domain, readyBatch, ZLINK_BACKEND_RECV_DONT_WAIT);
350
+ const drained = this.node.drainReady(
351
+ ReadyDomain.Infrastructure,
352
+ readyBatch,
353
+ ZLINK_BACKEND_RECV_DONT_WAIT
354
+ );
264
355
  if (!drained.ok || drained.records.length === 0) {
265
356
  return false;
266
357
  }
267
- if (domain === ReadyDomain.Application && drained.hasResidue) {
268
- this.markReady(ReadyDomain.Application);
269
- }
270
358
  for (let index = 0; index < drained.records.length; index += 1) {
271
359
  const claim = readyBatch.takeClaim(index);
272
360
  claimsDrained += 1;
273
361
  const owner = drained.records[index]!;
274
- // Raw ingress already attached one host permit to each record.
275
- // A claim that reserves admission here may receive only that permit's record.
276
- const drainClaim = async () => {
277
- let ownerReceiveBatch = receiveBatch;
278
- try {
279
- ownerReceiveBatch ??= this.node.createReceiveBatch(
280
- MESH_DISPATCH_RECEIVE_CAPACITY,
281
- this.options.partCapacity ?? DEFAULT_MESH_PART_CAPACITY
282
- );
283
- const capacity =
284
- owner.ordinaryIngressPreAdmitted === true ? MESH_DISPATCH_RECEIVE_CAPACITY : 1;
285
- let claimPermit =
286
- owner.terminalCompletion === true ||
287
- owner.ordinaryIngressPreAdmitted === true ||
288
- domain === ReadyDomain.Infrastructure
289
- ? undefined
290
- : await this.acquirePermit();
291
- try {
292
- if (this.capacityStop.signal.aborted) return;
293
- ownerReceiveBatch.reset(capacity);
294
- const received = claim.recvBatch(ownerReceiveBatch, ZLINK_BACKEND_RECV_DONT_WAIT);
295
- if (received.ok) {
296
- // The bounded batch stays in claim order until its records finish.
297
- try {
298
- for (const record of received.records) {
299
- if (this.disposed) break;
300
- const permit = record.applicationJobPermit ?? claimPermit;
301
- if (owner.ordinaryIngressPreAdmitted === true && permit === undefined) {
302
- throw new Error(
303
- 'Pre-admitted raw ingress record lost its Application Job Queue permit.'
304
- );
305
- }
306
- this.recordsSinceYield += 1;
307
- const dispatch = async () => {
308
- try {
309
- await this.options.dispatch(owner, record);
310
- await record.onTerminalCompletion?.();
311
- } catch (error) {
312
- this.reportDispatchError(error, meshDispatchFailureContext(record));
313
- }
314
- };
315
- if (permit === undefined) {
316
- await dispatch();
317
- } else {
318
- if (
319
- domain === ReadyDomain.Application &&
320
- record.applicationJobPermit === undefined
321
- )
322
- permit.markApplicationQueued();
323
- // The scope now owns this reservation, including failure
324
- // and detached handler handoff. Only unused permits remain
325
- // owned by the receive attempt's finally block.
326
- if (permit === claimPermit) claimPermit = undefined;
327
- await runWithApplicationJobPermit(permit, dispatch);
328
- }
329
- }
330
- } finally {
331
- // Batch ownership includes records whose dispatch never began,
332
- // including on failure or shutdown in the middle of the batch.
333
- for (const record of received.records) {
334
- for (const part of record.parts) part.close();
335
- record.releaseRetainedIngress?.();
336
- }
337
- }
338
- }
339
- } finally {
340
- claimPermit?.releaseAfterInternalProcessing();
341
- }
342
- } finally {
343
- claim.release();
344
- if (receiveBatch === undefined) ownerReceiveBatch?.close();
345
- }
346
- const yieldTurn = this.yieldIfNeeded();
347
- if (yieldTurn !== undefined) await yieldTurn;
348
- };
349
- // An application worker drains the one owner it claimed. Infrastructure owners
350
- // drain independently, so a suspended owner does not hold the other claims.
351
- if (receiveBatch !== undefined) {
352
- await drainClaim();
353
- } else {
354
- const drain = drainClaim().catch((error) => this.reportDispatchError(error));
355
- this.activeDrains.add(drain);
356
- void drain.finally(() => this.activeDrains.delete(drain));
357
- }
362
+ this.beginDrain();
363
+ const drain = this.drainClaim(ReadyDomain.Infrastructure, owner, claim, undefined).catch(
364
+ (error) => this.reportDispatchError(error)
365
+ );
366
+ this.activeDrains.add(drain);
367
+ void drain.finally(() => {
368
+ this.draining -= 1;
369
+ this.activeDrains.delete(drain);
370
+ });
358
371
  }
359
- if (claimBudget !== undefined && claimsDrained >= claimBudget) {
372
+ if (claimsDrained >= MESH_DISPATCH_LIFECYCLE_CLAIM_BUDGET) {
360
373
  this.wakeApplicationWorker();
361
374
  return true;
362
375
  }
@@ -369,10 +382,123 @@ export class ZLinkMeshDispatchPump {
369
382
  return false;
370
383
  } finally {
371
384
  readyBatch.reset();
385
+ this.draining -= 1;
372
386
  }
373
387
  }
374
388
 
389
+ /**
390
+ * Time the pump spent idle is not batch work: when work starts on an idle
391
+ * pump, its batch budget starts with it (spec 08 §6).
392
+ */
393
+ private beginDrain(): void {
394
+ if (this.draining === 0) {
395
+ this.recordsSinceYield = 0;
396
+ this.yieldStartedAtMs = this.nowMs();
397
+ }
398
+ this.draining += 1;
399
+ }
400
+
401
+ /** Drains one claimed owner in this worker's turn, in claim order. */
402
+ private async drainClaim(
403
+ domain: number,
404
+ owner: ReadyRecord,
405
+ claim: Claim,
406
+ receiveBatch: ReceiveBatch | undefined
407
+ ): Promise<void> {
408
+ let ownerReceiveBatch = receiveBatch;
409
+ try {
410
+ ownerReceiveBatch ??= this.node.createReceiveBatch(
411
+ MESH_DISPATCH_RECEIVE_CAPACITY,
412
+ this.options.partCapacity ?? DEFAULT_MESH_PART_CAPACITY
413
+ );
414
+ const capacity =
415
+ owner.ordinaryIngressPreAdmitted === true ? MESH_DISPATCH_RECEIVE_CAPACITY : 1;
416
+ let claimPermit =
417
+ owner.terminalCompletion === true ||
418
+ owner.ordinaryIngressPreAdmitted === true ||
419
+ domain === ReadyDomain.Infrastructure
420
+ ? undefined
421
+ : await this.acquirePermit();
422
+ try {
423
+ if (this.capacityStop.signal.aborted) return;
424
+ ownerReceiveBatch.reset(capacity);
425
+ const received = claim.recvBatch(ownerReceiveBatch, ZLINK_BACKEND_RECV_DONT_WAIT);
426
+ if (received.ok) {
427
+ // The bounded batch stays in claim order until its records finish.
428
+ try {
429
+ for (const record of received.records) {
430
+ if (this.disposed) break;
431
+ const permit = record.applicationJobPermit ?? claimPermit;
432
+ if (owner.ordinaryIngressPreAdmitted === true && permit === undefined) {
433
+ throw new Error(
434
+ 'Pre-admitted raw ingress record lost its Application Job Queue permit.'
435
+ );
436
+ }
437
+ this.recordsSinceYield += 1;
438
+ if (permit !== undefined) {
439
+ if (domain === ReadyDomain.Application && record.applicationJobPermit === undefined)
440
+ permit.markApplicationQueued();
441
+ // The scope now owns this reservation, including failure
442
+ // and detached handler handoff. Only unused permits remain
443
+ // owned by the receive attempt's finally block.
444
+ if (permit === claimPermit) claimPermit = undefined;
445
+ }
446
+ // The record's terminal and the permit turn release follow the
447
+ // handler in this turn's own continuation.
448
+ if (record.prepareDispatch !== undefined) {
449
+ try {
450
+ const stopSignal = this.capacityStop.signal;
451
+ const preparation = record.prepareDispatch(stopSignal);
452
+ const accepted = preparation instanceof Promise ? await preparation : preparation;
453
+ if (!accepted || stopSignal.aborted) {
454
+ releaseApplicationJobPermitTurn(permit);
455
+ continue;
456
+ }
457
+ } catch (error) {
458
+ this.failRecord(error, record, permit);
459
+ continue;
460
+ }
461
+ }
462
+ const dispatched = this.dispatchRecord(owner, record, permit);
463
+ if (dispatched === false) continue;
464
+ if (dispatched !== true) {
465
+ try {
466
+ await dispatched;
467
+ } catch (error) {
468
+ this.failRecord(error, record, permit);
469
+ continue;
470
+ }
471
+ }
472
+ const finished = this.finishRecord(record, permit);
473
+ if (finished !== undefined) await finished;
474
+ }
475
+ } finally {
476
+ // Batch ownership includes records whose dispatch never began,
477
+ // including on failure or shutdown in the middle of the batch.
478
+ for (const record of received.records) {
479
+ for (const part of record.parts) part.close();
480
+ record.releaseRetainedIngress?.();
481
+ }
482
+ }
483
+ }
484
+ } finally {
485
+ claimPermit?.releaseAfterInternalProcessing();
486
+ }
487
+ } finally {
488
+ claim.release();
489
+ if (receiveBatch === undefined) ownerReceiveBatch?.close();
490
+ }
491
+ const yieldTurn = this.yieldIfNeeded();
492
+ if (yieldTurn !== undefined) await yieldTurn;
493
+ }
494
+
495
+ /**
496
+ * The batch budget is shared by every drain of this pump, so once it is
497
+ * spent every drain waits for the same macrotask boundary; one drain that
498
+ * keeps running would otherwise hold the event loop the yield was for.
499
+ */
375
500
  private yieldIfNeeded(): Promise<void> | undefined {
501
+ if (this.pendingYield !== undefined) return this.pendingYield;
376
502
  const nowMs = this.nowMs();
377
503
  if (
378
504
  this.recordsSinceYield < MESH_DISPATCH_YIELD_RECORDS &&
@@ -380,9 +506,12 @@ export class ZLinkMeshDispatchPump {
380
506
  )
381
507
  return undefined;
382
508
  this.recordsSinceYield = 0;
383
- return yieldToTimers().then(() => {
509
+ const pendingYield = yieldToTimers().then(() => {
510
+ this.pendingYield = undefined;
384
511
  this.yieldStartedAtMs = this.nowMs();
385
512
  });
513
+ this.pendingYield = pendingYield;
514
+ return pendingYield;
386
515
  }
387
516
 
388
517
  private nowMs(): number {
@@ -7,6 +7,7 @@ import {
7
7
  import { loadBinding } from '../node-backend-adapter';
8
8
  import { SubmitResult, ZLinkBackendResultError } from '../runtime-values';
9
9
  const nativeErrnoValues = osConstants.errno;
10
+ const completedSend: Promise<void> = Promise.resolve();
10
11
 
11
12
  export type ZLinkBindingModule = typeof import('@zlink-systems/zlink');
12
13
  export const zlink = loadBinding() as ZLinkBindingModule;
@@ -119,12 +120,16 @@ export function submitBindingReply(operation: ZLinkBindingReplyOperation, payloa
119
120
  }
120
121
  }
121
122
 
122
- export async function submitBindingAsyncSend(
123
+ export function submitBindingAsyncSend(
123
124
  operation: ZLinkBindingAsyncSendOperation,
124
125
  payload: unknown
125
126
  ): Promise<void> {
126
- const submission = submitBindingSend(operation, payload);
127
- if (submission.result === SubmitResult.Backpressured) await submission.admitted;
127
+ try {
128
+ const submission = submitBindingSend(operation, payload);
129
+ return submission.result === SubmitResult.Backpressured ? submission.admitted : completedSend;
130
+ } catch (error) {
131
+ return Promise.reject(error);
132
+ }
128
133
  }
129
134
 
130
135
  export function submitBindingSend(
@@ -152,7 +157,8 @@ export function submitBindingSend(
152
157
  })
153
158
  };
154
159
  }
155
- return { result: SubmitResult.Ok, admitted: submission.admitted };
160
+ // Binding SendSubmission is the closed OK | BACKPRESSURED snapshot.
161
+ return submission as import('../raw-binding-port').ZLinkRawSendSubmission;
156
162
  }
157
163
 
158
164
  export function submitBindingSyncSend(
@@ -177,7 +183,8 @@ export async function submitBindingRequest(
177
183
  operation: ZLinkBindingRequestOperation,
178
184
  payload: unknown,
179
185
  timeoutMs: number | undefined,
180
- recordReceived?: () => void
186
+ recordReceived?: () => void,
187
+ onAdmitted?: () => void
181
188
  ): Promise<readonly unknown[]> {
182
189
  const deadlineMs = timeoutMs === undefined ? undefined : performance.now() + timeoutMs;
183
190
  try {
@@ -195,7 +202,7 @@ export async function submitBindingRequest(
195
202
  if (timeoutMs !== undefined) {
196
203
  current = current.timeout(timeoutMs);
197
204
  }
198
- return await bindingRequestReply(current.submit(), deadlineMs, recordReceived);
205
+ return await bindingRequestReply(current.submit(), deadlineMs, recordReceived, onAdmitted);
199
206
  } catch (error) {
200
207
  throw translateBindingResultError(error);
201
208
  }
@@ -204,13 +211,14 @@ export async function submitBindingRequest(
204
211
  export async function bindingRequestReply(
205
212
  submission: import('@zlink-systems/zlink').RequestSubmission,
206
213
  deadlineMs: number | undefined,
207
- recordReceived?: () => void
214
+ recordReceived?: () => void,
215
+ onAdmitted?: () => void
208
216
  ): Promise<import('@zlink-systems/zlink').Message[]> {
209
217
  const reply = submission.reply;
210
218
  if (submission.result === SubmitResult.Backpressured) {
211
219
  try {
212
220
  const [, replies] = await waitRequestReply(
213
- Promise.all([submission.admitted, reply]),
221
+ Promise.all([submission.admitted.then(() => onAdmitted?.()), reply]),
214
222
  'Request',
215
223
  deadlineMs
216
224
  );
@@ -227,6 +235,7 @@ export async function bindingRequestReply(
227
235
  throw error;
228
236
  }
229
237
  }
238
+ onAdmitted?.();
230
239
  const replies = await reply;
231
240
  recordReceived?.();
232
241
  return replies;
@@ -1,3 +1,4 @@
1
+ import { bindingRequestReply } from './node-backend-adapter-support';
1
2
  import type { DealerSocket, Message, PubSocket } from '@zlink-systems/zlink';
2
3
  import { ZLinkConfigurationException } from '../../configuration';
3
4
  import { ZLinkSubmitStatus, type ZLinkSubmitResult } from '../../messaging/submission-result';
@@ -56,7 +57,8 @@ export class ZLinkDealerChannelClientTransport implements ZLinkChannelClientTran
56
57
  request: Message,
57
58
  timeoutMs: number | undefined,
58
59
  signal?: AbortSignal,
59
- metadata: ReadonlyMap<string, string> = EMPTY_METADATA
60
+ metadata: ReadonlyMap<string, string> = EMPTY_METADATA,
61
+ onAdmitted?: () => void
60
62
  ): Promise<TReply> {
61
63
  throwIfAborted(signal);
62
64
  const operation = runWithOutboundFlow(true, () =>
@@ -78,7 +80,15 @@ export class ZLinkDealerChannelClientTransport implements ZLinkChannelClientTran
78
80
  );
79
81
  if (timeoutMs !== undefined) operation.timeout(timeoutMs);
80
82
  const reply = await submitRequestOperation(
81
- { submit: () => operation.submit().reply },
83
+ {
84
+ submit: () =>
85
+ bindingRequestReply(
86
+ operation.submit(),
87
+ timeoutMs === undefined ? undefined : performance.now() + timeoutMs,
88
+ undefined,
89
+ onAdmitted
90
+ )
91
+ },
82
92
  'channel request'
83
93
  );
84
94
  try {