@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
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ZLinkMeshDispatchPump = void 0;
4
4
  const node_async_hooks_1 = require("node:async_hooks");
5
+ const abort_1 = require("../abort");
5
6
  const node_os_1 = require("node:os");
6
7
  const application_job_queue_scope_1 = require("../application-jobs/application-job-queue-scope");
7
8
  const execution_1 = require("../execution");
@@ -33,6 +34,10 @@ class ZLinkMeshDispatchPump {
33
34
  capacityStop = new AbortController();
34
35
  recordsSinceYield = 0;
35
36
  yieldStartedAtMs = 0;
37
+ /** Drains in progress; the batch budget begins when work starts on an idle pump. */
38
+ draining = 0;
39
+ /** The macrotask boundary every drain waits for once the shared budget is spent. */
40
+ pendingYield;
36
41
  constructor(node, options) {
37
42
  this.node = node;
38
43
  this.options = options;
@@ -48,7 +53,7 @@ class ZLinkMeshDispatchPump {
48
53
  return domains;
49
54
  });
50
55
  }
51
- async dispose() {
56
+ async dispose(signal) {
52
57
  if (this.disposed) {
53
58
  return;
54
59
  }
@@ -59,7 +64,7 @@ class ZLinkMeshDispatchPump {
59
64
  wake();
60
65
  this.idleApplicationWorkers.clear();
61
66
  while (this.activeDrains.size > 0) {
62
- await Promise.all([...this.activeDrains]);
67
+ await (0, abort_1.awaitWithAbort)(Promise.all([...this.activeDrains]), signal);
63
68
  }
64
69
  }
65
70
  markReady(domains) {
@@ -116,14 +121,37 @@ class ZLinkMeshDispatchPump {
116
121
  try {
117
122
  for (;;) {
118
123
  await this.waitForApplicationReady();
119
- if (this.disposed)
120
- return;
124
+ this.beginDrain();
121
125
  try {
122
- await this.drainDomain(service_runtime_contracts_1.ReadyDomain.Application, readyBatch, receiveBatch);
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
+ }
123
145
  }
124
146
  catch (error) {
125
147
  this.reportDispatchError(error);
126
148
  }
149
+ finally {
150
+ readyBatch.reset();
151
+ this.draining -= 1;
152
+ }
153
+ if (this.disposed)
154
+ return;
127
155
  }
128
156
  }
129
157
  finally {
@@ -140,6 +168,51 @@ class ZLinkMeshDispatchPump {
140
168
  }
141
169
  return new Promise((resolve) => this.idleApplicationWorkers.add(resolve));
142
170
  }
171
+ /**
172
+ * 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
176
+ * {@link finishRecord}.
177
+ */
178
+ dispatchRecord(owner, record, permit) {
179
+ const previous = permit === undefined ? undefined : (0, application_job_queue_scope_1.enterApplicationJobPermitScope)(permit);
180
+ let result;
181
+ try {
182
+ result = this.options.dispatch(owner, record);
183
+ }
184
+ catch (error) {
185
+ this.failRecord(error, record, permit);
186
+ return false;
187
+ }
188
+ finally {
189
+ if (permit !== undefined)
190
+ (0, application_job_queue_scope_1.leaveApplicationJobPermitScope)(previous);
191
+ }
192
+ return result ?? true;
193
+ }
194
+ failRecord(error, record, permit) {
195
+ (0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit);
196
+ this.reportDispatchError(error, meshDispatchFailureContext(record));
197
+ }
198
+ /** Runs the record's terminal completion, then releases its permit turn. */
199
+ finishRecord(record, permit) {
200
+ let result = undefined;
201
+ try {
202
+ result = record.onTerminalCompletion?.();
203
+ }
204
+ catch (error) {
205
+ this.reportDispatchError(error, meshDispatchFailureContext(record));
206
+ }
207
+ if (result === undefined) {
208
+ (0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit);
209
+ return;
210
+ }
211
+ return Promise.resolve(result).then(() => (0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit), (error) => {
212
+ this.reportDispatchError(error, meshDispatchFailureContext(record));
213
+ (0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit);
214
+ });
215
+ }
143
216
  reportDispatchError(error, context) {
144
217
  this.options.reportError?.(error, context);
145
218
  }
@@ -178,7 +251,7 @@ class ZLinkMeshDispatchPump {
178
251
  if ((this.pendingDomains & service_runtime_contracts_1.ReadyDomain.Application) !== 0) {
179
252
  setImmediate(() => this.wakeApplicationWorker());
180
253
  }
181
- const lifecycleBudgetExhausted = await this.drainDomain(service_runtime_contracts_1.ReadyDomain.Infrastructure, readyBatch, undefined, MESH_DISPATCH_LIFECYCLE_CLAIM_BUDGET);
254
+ const lifecycleBudgetExhausted = await this.drainDomain(readyBatch);
182
255
  if (lifecycleBudgetExhausted) {
183
256
  this.pendingDomains |= service_runtime_contracts_1.ReadyDomain.Infrastructure;
184
257
  await yieldToEventLoop();
@@ -189,116 +262,34 @@ class ZLinkMeshDispatchPump {
189
262
  readyBatch.close();
190
263
  }
191
264
  }
192
- async drainDomain(domain, readyBatch, receiveBatch, claimBudget) {
265
+ async drainDomain(readyBatch) {
193
266
  let claimsDrained = 0;
267
+ this.beginDrain();
194
268
  try {
195
269
  while (!this.disposed) {
196
- if (claimBudget !== undefined && claimsDrained >= claimBudget) {
270
+ if (claimsDrained >= MESH_DISPATCH_LIFECYCLE_CLAIM_BUDGET) {
197
271
  // Lifecycle work has priority, but a bounded turn lets application
198
272
  // work make progress when lifecycle records keep arriving.
199
273
  return true;
200
274
  }
201
275
  readyBatch.reset();
202
- const drained = this.node.drainReady(domain, readyBatch, runtime_values_1.ZLINK_BACKEND_RECV_DONT_WAIT);
276
+ const drained = this.node.drainReady(service_runtime_contracts_1.ReadyDomain.Infrastructure, readyBatch, runtime_values_1.ZLINK_BACKEND_RECV_DONT_WAIT);
203
277
  if (!drained.ok || drained.records.length === 0) {
204
278
  return false;
205
279
  }
206
- if (domain === service_runtime_contracts_1.ReadyDomain.Application && drained.hasResidue) {
207
- this.markReady(service_runtime_contracts_1.ReadyDomain.Application);
208
- }
209
280
  for (let index = 0; index < drained.records.length; index += 1) {
210
281
  const claim = readyBatch.takeClaim(index);
211
282
  claimsDrained += 1;
212
283
  const owner = drained.records[index];
213
- // Raw ingress already attached one host permit to each record.
214
- // A claim that reserves admission here may receive only that permit's record.
215
- const drainClaim = async () => {
216
- let ownerReceiveBatch = receiveBatch;
217
- try {
218
- ownerReceiveBatch ??= this.node.createReceiveBatch(MESH_DISPATCH_RECEIVE_CAPACITY, this.options.partCapacity ?? DEFAULT_MESH_PART_CAPACITY);
219
- const capacity = owner.ordinaryIngressPreAdmitted === true ? MESH_DISPATCH_RECEIVE_CAPACITY : 1;
220
- let claimPermit = owner.terminalCompletion === true ||
221
- owner.ordinaryIngressPreAdmitted === true ||
222
- domain === service_runtime_contracts_1.ReadyDomain.Infrastructure
223
- ? undefined
224
- : await this.acquirePermit();
225
- try {
226
- if (this.capacityStop.signal.aborted)
227
- return;
228
- ownerReceiveBatch.reset(capacity);
229
- const received = claim.recvBatch(ownerReceiveBatch, runtime_values_1.ZLINK_BACKEND_RECV_DONT_WAIT);
230
- if (received.ok) {
231
- // The bounded batch stays in claim order until its records finish.
232
- try {
233
- for (const record of received.records) {
234
- if (this.disposed)
235
- break;
236
- const permit = record.applicationJobPermit ?? claimPermit;
237
- if (owner.ordinaryIngressPreAdmitted === true && permit === undefined) {
238
- throw new Error('Pre-admitted raw ingress record lost its Application Job Queue permit.');
239
- }
240
- this.recordsSinceYield += 1;
241
- const dispatch = async () => {
242
- try {
243
- await this.options.dispatch(owner, record);
244
- await record.onTerminalCompletion?.();
245
- }
246
- catch (error) {
247
- this.reportDispatchError(error, meshDispatchFailureContext(record));
248
- }
249
- };
250
- if (permit === undefined) {
251
- await dispatch();
252
- }
253
- else {
254
- if (domain === service_runtime_contracts_1.ReadyDomain.Application &&
255
- record.applicationJobPermit === undefined)
256
- permit.markApplicationQueued();
257
- // The scope now owns this reservation, including failure
258
- // and detached handler handoff. Only unused permits remain
259
- // owned by the receive attempt's finally block.
260
- if (permit === claimPermit)
261
- claimPermit = undefined;
262
- await (0, application_job_queue_scope_1.runWithApplicationJobPermit)(permit, dispatch);
263
- }
264
- }
265
- }
266
- finally {
267
- // Batch ownership includes records whose dispatch never began,
268
- // including on failure or shutdown in the middle of the batch.
269
- for (const record of received.records) {
270
- for (const part of record.parts)
271
- part.close();
272
- record.releaseRetainedIngress?.();
273
- }
274
- }
275
- }
276
- }
277
- finally {
278
- claimPermit?.releaseAfterInternalProcessing();
279
- }
280
- }
281
- finally {
282
- claim.release();
283
- if (receiveBatch === undefined)
284
- ownerReceiveBatch?.close();
285
- }
286
- const yieldTurn = this.yieldIfNeeded();
287
- if (yieldTurn !== undefined)
288
- await yieldTurn;
289
- };
290
- // An application worker drains the one owner it claimed. Infrastructure owners
291
- // drain independently, so a suspended owner does not hold the other claims.
292
- if (receiveBatch !== undefined) {
293
- await drainClaim();
294
- }
295
- else {
296
- const drain = drainClaim().catch((error) => this.reportDispatchError(error));
297
- this.activeDrains.add(drain);
298
- void drain.finally(() => this.activeDrains.delete(drain));
299
- }
284
+ this.beginDrain();
285
+ const drain = this.drainClaim(service_runtime_contracts_1.ReadyDomain.Infrastructure, owner, claim, undefined).catch((error) => this.reportDispatchError(error));
286
+ this.activeDrains.add(drain);
287
+ void drain.finally(() => {
288
+ this.draining -= 1;
289
+ this.activeDrains.delete(drain);
290
+ });
300
291
  }
301
- if (claimBudget !== undefined && claimsDrained >= claimBudget) {
292
+ if (claimsDrained >= MESH_DISPATCH_LIFECYCLE_CLAIM_BUDGET) {
302
293
  this.wakeApplicationWorker();
303
294
  return true;
304
295
  }
@@ -313,17 +304,133 @@ class ZLinkMeshDispatchPump {
313
304
  }
314
305
  finally {
315
306
  readyBatch.reset();
307
+ this.draining -= 1;
308
+ }
309
+ }
310
+ /**
311
+ * Time the pump spent idle is not batch work: when work starts on an idle
312
+ * pump, its batch budget starts with it (spec 08 §6).
313
+ */
314
+ beginDrain() {
315
+ if (this.draining === 0) {
316
+ this.recordsSinceYield = 0;
317
+ this.yieldStartedAtMs = this.nowMs();
316
318
  }
319
+ this.draining += 1;
317
320
  }
321
+ /** Drains one claimed owner in this worker's turn, in claim order. */
322
+ async drainClaim(domain, owner, claim, receiveBatch) {
323
+ let ownerReceiveBatch = receiveBatch;
324
+ 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();
332
+ 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
+ }
399
+ }
400
+ }
401
+ }
402
+ finally {
403
+ claimPermit?.releaseAfterInternalProcessing();
404
+ }
405
+ }
406
+ finally {
407
+ claim.release();
408
+ if (receiveBatch === undefined)
409
+ ownerReceiveBatch?.close();
410
+ }
411
+ const yieldTurn = this.yieldIfNeeded();
412
+ if (yieldTurn !== undefined)
413
+ await yieldTurn;
414
+ }
415
+ /**
416
+ * The batch budget is shared by every drain of this pump, so once it is
417
+ * spent every drain waits for the same macrotask boundary; one drain that
418
+ * keeps running would otherwise hold the event loop the yield was for.
419
+ */
318
420
  yieldIfNeeded() {
421
+ if (this.pendingYield !== undefined)
422
+ return this.pendingYield;
319
423
  const nowMs = this.nowMs();
320
424
  if (this.recordsSinceYield < MESH_DISPATCH_YIELD_RECORDS &&
321
425
  nowMs - this.yieldStartedAtMs < MESH_DISPATCH_YIELD_INTERVAL_MS)
322
426
  return undefined;
323
427
  this.recordsSinceYield = 0;
324
- return yieldToTimers().then(() => {
428
+ const pendingYield = yieldToTimers().then(() => {
429
+ this.pendingYield = undefined;
325
430
  this.yieldStartedAtMs = this.nowMs();
326
431
  });
432
+ this.pendingYield = pendingYield;
433
+ return pendingYield;
327
434
  }
328
435
  nowMs() {
329
436
  return this.options.monotonicNowMs?.() ?? performance.now();
@@ -40,8 +40,8 @@ export declare function submitBindingReply(operation: ZLinkBindingReplyOperation
40
40
  export declare function submitBindingAsyncSend(operation: ZLinkBindingAsyncSendOperation, payload: unknown): Promise<void>;
41
41
  export declare function submitBindingSend(operation: ZLinkBindingAsyncSendOperation, payload: unknown): import('../raw-binding-port').ZLinkRawSendSubmission;
42
42
  export declare function submitBindingSyncSend(operation: ZLinkBindingAsyncSendOperation, payload: unknown): void;
43
- export declare function submitBindingRequest(operation: ZLinkBindingRequestOperation, payload: unknown, timeoutMs: number | undefined, recordReceived?: () => void): Promise<readonly unknown[]>;
44
- export declare function bindingRequestReply(submission: import('@zlink-systems/zlink').RequestSubmission, deadlineMs: number | undefined, recordReceived?: () => void): Promise<import('@zlink-systems/zlink').Message[]>;
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[]>;
45
45
  export declare function closeBindingReply(replies: readonly import('@zlink-systems/zlink').Message[]): void;
46
46
  /**
47
47
  * Closes a binding handle once. An already closed or terminated handle counts as
@@ -22,6 +22,7 @@ const submission_result_1 = require("../../messaging/submission-result");
22
22
  const node_backend_adapter_1 = require("../node-backend-adapter");
23
23
  const runtime_values_1 = require("../runtime-values");
24
24
  const nativeErrnoValues = node_os_1.constants.errno;
25
+ const completedSend = Promise.resolve();
25
26
  exports.zlink = (0, node_backend_adapter_1.loadBinding)();
26
27
  function isBindingNotFound(error) {
27
28
  return error instanceof exports.zlink.ConnectError && error.result === exports.zlink.ConnectResult.NotFound;
@@ -75,10 +76,14 @@ function submitBindingReply(operation, payload) {
75
76
  throw translateBindingResultError(error);
76
77
  }
77
78
  }
78
- async function submitBindingAsyncSend(operation, payload) {
79
- const submission = submitBindingSend(operation, payload);
80
- if (submission.result === runtime_values_1.SubmitResult.Backpressured)
81
- await submission.admitted;
79
+ function submitBindingAsyncSend(operation, payload) {
80
+ try {
81
+ const submission = submitBindingSend(operation, payload);
82
+ return submission.result === runtime_values_1.SubmitResult.Backpressured ? submission.admitted : completedSend;
83
+ }
84
+ catch (error) {
85
+ return Promise.reject(error);
86
+ }
82
87
  }
83
88
  function submitBindingSend(operation, payload) {
84
89
  let submission;
@@ -103,7 +108,8 @@ function submitBindingSend(operation, payload) {
103
108
  })
104
109
  };
105
110
  }
106
- return { result: runtime_values_1.SubmitResult.Ok, admitted: submission.admitted };
111
+ // Binding SendSubmission is the closed OK | BACKPRESSURED snapshot.
112
+ return submission;
107
113
  }
108
114
  function submitBindingSyncSend(operation, payload) {
109
115
  try {
@@ -120,7 +126,7 @@ function submitBindingSyncSend(operation, payload) {
120
126
  throw translateBindingResultError(error);
121
127
  }
122
128
  }
123
- async function submitBindingRequest(operation, payload, timeoutMs, recordReceived) {
129
+ async function submitBindingRequest(operation, payload, timeoutMs, recordReceived, onAdmitted) {
124
130
  const deadlineMs = timeoutMs === undefined ? undefined : performance.now() + timeoutMs;
125
131
  try {
126
132
  let current;
@@ -138,17 +144,17 @@ async function submitBindingRequest(operation, payload, timeoutMs, recordReceive
138
144
  if (timeoutMs !== undefined) {
139
145
  current = current.timeout(timeoutMs);
140
146
  }
141
- return await bindingRequestReply(current.submit(), deadlineMs, recordReceived);
147
+ return await bindingRequestReply(current.submit(), deadlineMs, recordReceived, onAdmitted);
142
148
  }
143
149
  catch (error) {
144
150
  throw translateBindingResultError(error);
145
151
  }
146
152
  }
147
- async function bindingRequestReply(submission, deadlineMs, recordReceived) {
153
+ async function bindingRequestReply(submission, deadlineMs, recordReceived, onAdmitted) {
148
154
  const reply = submission.reply;
149
155
  if (submission.result === runtime_values_1.SubmitResult.Backpressured) {
150
156
  try {
151
- const [, replies] = await (0, request_deadline_1.waitRequestReply)(Promise.all([submission.admitted, reply]), 'Request', deadlineMs);
157
+ const [, replies] = await (0, request_deadline_1.waitRequestReply)(Promise.all([submission.admitted.then(() => onAdmitted?.()), reply]), 'Request', deadlineMs);
152
158
  recordReceived?.();
153
159
  return replies;
154
160
  }
@@ -160,6 +166,7 @@ async function bindingRequestReply(submission, deadlineMs, recordReceived) {
160
166
  throw error;
161
167
  }
162
168
  }
169
+ onAdmitted?.();
163
170
  const replies = await reply;
164
171
  recordReceived?.();
165
172
  return replies;
@@ -7,7 +7,7 @@ export declare class ZLinkDealerChannelClientTransport implements ZLinkChannelCl
7
7
  private readonly publisher?;
8
8
  constructor(dealer: DealerSocket, publisher?: PubSocket | undefined);
9
9
  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>): Promise<TReply>;
10
+ request<TReply>(channelName: string, packetName: string | undefined, request: Message, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>, onAdmitted?: () => void): Promise<TReply>;
11
11
  tryPublish(channelName: string, topic: string, packetName: string | undefined, event: Message, metadata?: ReadonlyMap<string, string>): ZLinkSubmitResult;
12
12
  publish(channelName: string, topic: string, packetName: string | undefined, event: Message, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>): Promise<ZLinkSubmitResult>;
13
13
  }
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ZLinkDealerChannelClientTransport = void 0;
4
+ const node_backend_adapter_support_1 = require("./node-backend-adapter-support");
4
5
  const configuration_1 = require("../../configuration");
5
6
  const submission_result_1 = require("../../messaging/submission-result");
6
7
  const channel_envelope_1 = require("../../channels/channel-envelope");
@@ -22,12 +23,14 @@ class ZLinkDealerChannelClientTransport {
22
23
  await (0, flow_context_1.runWithOutboundFlow)(true, () => (0, channel_multipart_1.appendParts)(this.dealer.send(), (0, channel_envelope_1.encodeChannelEnvelopeParts)(3 /* ZLinkChannelMessageKind.Command */, channelName, packetName, message, undefined, undefined, undefined, undefined, true, metadata)).submit().admitted);
23
24
  return { status: submission_result_1.ZLinkSubmitStatus.Submitted };
24
25
  }
25
- async request(channelName, packetName, request, timeoutMs, signal, metadata = EMPTY_METADATA) {
26
+ async request(channelName, packetName, request, timeoutMs, signal, metadata = EMPTY_METADATA, onAdmitted) {
26
27
  (0, abort_1.throwIfAborted)(signal);
27
28
  const operation = (0, flow_context_1.runWithOutboundFlow)(true, () => (0, channel_multipart_1.appendParts)(this.dealer.request(), (0, channel_envelope_1.encodeChannelEnvelopeParts)(1 /* ZLinkChannelMessageKind.Request */, channelName, packetName, request, timeoutMs, undefined, undefined, undefined, true, metadata)));
28
29
  if (timeoutMs !== undefined)
29
30
  operation.timeout(timeoutMs);
30
- const reply = await (0, channel_multipart_1.submitRequestOperation)({ submit: () => operation.submit().reply }, 'channel request');
31
+ const reply = await (0, channel_multipart_1.submitRequestOperation)({
32
+ submit: () => (0, node_backend_adapter_support_1.bindingRequestReply)(operation.submit(), timeoutMs === undefined ? undefined : performance.now() + timeoutMs, undefined, onAdmitted)
33
+ }, 'channel request');
31
34
  try {
32
35
  return (0, channel_envelope_1.decodeChannelReply)(reply);
33
36
  }