@zlink-systems/framework 0.30.1 → 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 (340) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
  3. package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
  4. package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
  5. package/dist/contracts/Common/encoded-payload-storage.js +5 -2
  6. package/dist/contracts/Configuration/Builders.d.ts +1 -1
  7. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
  8. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
  9. package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
  10. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  11. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
  12. package/dist/contracts/Locations/Rows.d.ts +2 -0
  13. package/dist/contracts/Spots/Contracts.d.ts +4 -0
  14. package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
  15. package/dist/runtime/abort.d.ts +5 -0
  16. package/dist/runtime/abort.js +10 -0
  17. package/dist/runtime/actors/actor-authority-publication.js +3 -2
  18. package/dist/runtime/actors/actor-client.d.ts +0 -1
  19. package/dist/runtime/actors/actor-client.js +38 -45
  20. package/dist/runtime/actors/actor-context.d.ts +2 -0
  21. package/dist/runtime/actors/actor-context.js +46 -9
  22. package/dist/runtime/actors/actor-handoff.d.ts +7 -3
  23. package/dist/runtime/actors/actor-handoff.js +212 -88
  24. package/dist/runtime/actors/actor-join-relocation.d.ts +2 -0
  25. package/dist/runtime/actors/actor-local-native-join.js +4 -0
  26. package/dist/runtime/actors/actor-mailbox.js +27 -1
  27. package/dist/runtime/actors/actor-remote-joiner.js +3 -1
  28. package/dist/runtime/actors/actor-reply.d.ts +4 -0
  29. package/dist/runtime/actors/actor-reply.js +29 -0
  30. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
  31. package/dist/runtime/actors/actor-runtime-state.js +2 -20
  32. package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
  33. package/dist/runtime/actors/index.d.ts +6 -2
  34. package/dist/runtime/actors/index.js +37 -21
  35. package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
  36. package/dist/runtime/actors/session-disconnected-wire.js +48 -0
  37. package/dist/runtime/admission.d.ts +9 -1
  38. package/dist/runtime/admission.js +55 -32
  39. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +13 -0
  40. package/dist/runtime/application-jobs/application-job-queue-scope.js +27 -1
  41. package/dist/runtime/application-jobs/contracts.d.ts +2 -0
  42. package/dist/runtime/backend/contracts/index.d.ts +19 -3
  43. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
  44. package/dist/runtime/backend/mesh-completion-table.js +5 -0
  45. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +26 -2
  46. package/dist/runtime/backend/mesh-dispatch-pump.js +193 -107
  47. package/dist/runtime/backend/node/node-raw-binding-port.js +90 -58
  48. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +33 -8
  49. package/dist/runtime/backend/node/node-raw-mesh-backend.js +142 -143
  50. package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
  51. package/dist/runtime/backend/node/node-socket-backend-adapter.js +5 -5
  52. package/dist/runtime/channels/channel-clients.d.ts +1 -0
  53. package/dist/runtime/channels/channel-clients.js +20 -5
  54. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +22 -3
  55. package/dist/runtime/channels/channel-dispatch-pipeline.js +103 -57
  56. package/dist/runtime/channels/channel-dispatchers.d.ts +3 -2
  57. package/dist/runtime/channels/channel-dispatchers.js +44 -37
  58. package/dist/runtime/channels/channel-envelope.d.ts +1 -0
  59. package/dist/runtime/channels/channel-envelope.js +74 -31
  60. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
  61. package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
  62. package/dist/runtime/channels/channel-runtime-manager.d.ts +3 -2
  63. package/dist/runtime/channels/channel-runtime-manager.js +4 -4
  64. package/dist/runtime/channels/channel-transports.d.ts +0 -1
  65. package/dist/runtime/channels/channel-transports.js +35 -33
  66. package/dist/runtime/channels/client-server-location-runtime.js +5 -4
  67. package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
  68. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  69. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  70. package/dist/runtime/channels/fanout-location-runtime.js +3 -3
  71. package/dist/runtime/diagnostics/flow-context.js +19 -7
  72. package/dist/runtime/diagnostics/index.js +4 -9
  73. package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
  74. package/dist/runtime/diagnostics/message-flow.js +35 -5
  75. package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
  76. package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
  77. package/dist/runtime/execution/index.d.ts +4 -2
  78. package/dist/runtime/execution/index.js +33 -10
  79. package/dist/runtime/execution/serial-execution-queue.d.ts +4 -0
  80. package/dist/runtime/execution/serial-execution-queue.js +21 -2
  81. package/dist/runtime/execution/state-lane.d.ts +2 -0
  82. package/dist/runtime/execution/state-lane.js +5 -0
  83. package/dist/runtime/foundation/operation-registry.d.ts +25 -1
  84. package/dist/runtime/foundation/operation-registry.js +86 -18
  85. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +39 -3
  86. package/dist/runtime/foundation/raw-service-mesh-runtime.js +151 -55
  87. package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
  88. package/dist/runtime/foundation/service-liveness-registry.js +38 -0
  89. package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
  90. package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
  91. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -3
  92. package/dist/runtime/foundation/service-relocation-object-owner.js +48 -35
  93. package/dist/runtime/foundation/service-relocation-runtime.js +7 -3
  94. package/dist/runtime/foundation/service-runtime-contracts.d.ts +8 -1
  95. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
  96. package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
  97. package/dist/runtime/foundation/service-stateful-registry.js +24 -26
  98. package/dist/runtime/foundation/service-stateful-runtime.d.ts +72 -6
  99. package/dist/runtime/foundation/service-stateful-runtime.js +444 -117
  100. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -1
  101. package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
  102. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
  103. package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
  104. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  105. package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
  106. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +10 -0
  107. package/dist/runtime/foundation/service-wire-m6a-codec.js +166 -53
  108. package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
  109. package/dist/runtime/host/actor-packet-relay.js +59 -72
  110. package/dist/runtime/host/actor-placement-coordinator.js +25 -8
  111. package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
  112. package/dist/runtime/host/actor-transfer-runtime.js +85 -331
  113. package/dist/runtime/host/application-job-queue.d.ts +24 -3
  114. package/dist/runtime/host/application-job-queue.js +28 -41
  115. package/dist/runtime/host/index.d.ts +5 -1
  116. package/dist/runtime/host/index.js +171 -97
  117. package/dist/runtime/host/location-runtime-owner.js +2 -6
  118. package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
  119. package/dist/runtime/host/mesh-router-resolver.js +14 -6
  120. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
  121. package/dist/runtime/host/remote-bound-session-relay.js +71 -190
  122. package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
  123. package/dist/runtime/host/route-mesh-runtime.js +5 -3
  124. package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
  125. package/dist/runtime/host/runtime-shutdown.js +3 -2
  126. package/dist/runtime/host/service-relocation-host-runtime.d.ts +17 -7
  127. package/dist/runtime/host/service-relocation-host-runtime.js +550 -367
  128. package/dist/runtime/host/spot-runtime-options-factory.js +15 -7
  129. package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
  130. package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
  131. package/dist/runtime/locations/auto-connect-loop.js +22 -14
  132. package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
  133. package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
  134. package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
  135. package/dist/runtime/locations/descriptor-publication.js +11 -0
  136. package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
  137. package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
  138. package/dist/runtime/locations/in-memory-authority-store.js +56 -19
  139. package/dist/runtime/locations/in-memory-location-store.js +1 -10
  140. package/dist/runtime/locations/index.d.ts +1 -0
  141. package/dist/runtime/locations/index.js +1 -0
  142. package/dist/runtime/locations/lease-tracker.js +1 -6
  143. package/dist/runtime/locations/location-store-repository.d.ts +51 -1
  144. package/dist/runtime/locations/location-store-repository.js +363 -139
  145. package/dist/runtime/locations/relocation-blob.d.ts +18 -1
  146. package/dist/runtime/locations/relocation-blob.js +52 -1
  147. package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
  148. package/dist/runtime/locations/request-source-resolver.js +80 -0
  149. package/dist/runtime/locations/resolvers.js +1 -1
  150. package/dist/runtime/locations/runtime.d.ts +6 -2
  151. package/dist/runtime/locations/runtime.js +37 -30
  152. package/dist/runtime/messaging/payload-codec.d.ts +7 -1
  153. package/dist/runtime/messaging/payload-codec.js +7 -6
  154. package/dist/runtime/messaging/request-result.js +29 -26
  155. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +19 -1
  156. package/dist/runtime/protocol/service_wire_codec.generated.js +85 -0
  157. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +7 -1
  158. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +23 -7
  159. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +3 -2
  160. package/dist/runtime/spots/index.d.ts +18 -11
  161. package/dist/runtime/spots/index.js +234 -176
  162. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
  163. package/dist/runtime/spots/spot-activation-registry.js +21 -11
  164. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  165. package/dist/runtime/spots/spot-activation-state.js +7 -7
  166. package/dist/runtime/spots/spot-activation.d.ts +6 -3
  167. package/dist/runtime/spots/spot-activation.js +123 -44
  168. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
  169. package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
  170. package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
  171. package/dist/runtime/spots/spot-actor-membership.js +0 -8
  172. package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
  173. package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
  174. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
  175. package/dist/runtime/spots/spot-entry-activation.js +14 -9
  176. package/dist/runtime/spots/spot-handler-registry.d.ts +4 -3
  177. package/dist/runtime/spots/spot-handler-registry.js +6 -2
  178. package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
  179. package/dist/runtime/spots/spot-manager-public.js +2 -2
  180. package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
  181. package/dist/runtime/spots/spot-node-autoconnect.js +18 -39
  182. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
  183. package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
  184. package/dist/runtime/spots/spot-outbound.js +3 -3
  185. package/dist/runtime/spots/spot-remote-codec.js +5 -1
  186. package/dist/runtime/spots/spot-runtime-ports.d.ts +0 -1
  187. package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
  188. package/dist/runtime/spots/spot-serial-executor.js +61 -8
  189. package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
  190. package/dist/runtime/spots/spot-subscription-dispatch.js +1 -1
  191. package/dist/runtime/spots/spot-timer.d.ts +57 -5
  192. package/dist/runtime/spots/spot-timer.js +287 -103
  193. package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
  194. package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
  195. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
  196. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
  197. package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
  198. package/dist/runtime/streams/bound-session-service.d.ts +1 -1
  199. package/dist/runtime/streams/bound-session-service.js +6 -11
  200. package/dist/runtime/streams/index.d.ts +3 -2
  201. package/dist/runtime/streams/index.js +6 -4
  202. package/dist/runtime/streams/managed-stream.js +3 -2
  203. package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
  204. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
  205. package/dist/runtime/streams/session-actor-coordinator.js +15 -32
  206. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
  207. package/dist/runtime/streams/stream-session-runtime.js +1 -4
  208. package/dist/runtime/workers/index.js +1 -1
  209. package/package.json +3 -3
  210. package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
  211. package/src/contracts/Common/encoded-payload-storage.ts +6 -3
  212. package/src/contracts/Configuration/Builders.ts +4 -1
  213. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
  214. package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
  215. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  216. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
  217. package/src/contracts/Locations/Rows.ts +2 -0
  218. package/src/contracts/Spots/Contracts.ts +8 -0
  219. package/src/contracts/Spots/ZLinkSpot.ts +3 -3
  220. package/src/runtime/abort.ts +12 -0
  221. package/src/runtime/actors/actor-authority-publication.ts +3 -2
  222. package/src/runtime/actors/actor-client.ts +61 -70
  223. package/src/runtime/actors/actor-context.ts +49 -9
  224. package/src/runtime/actors/actor-handoff.ts +282 -106
  225. package/src/runtime/actors/actor-join-relocation.ts +2 -0
  226. package/src/runtime/actors/actor-local-native-join.ts +4 -0
  227. package/src/runtime/actors/actor-mailbox.ts +40 -2
  228. package/src/runtime/actors/actor-remote-joiner.ts +6 -1
  229. package/src/runtime/actors/actor-reply.ts +42 -0
  230. package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
  231. package/src/runtime/actors/actor-runtime-state.ts +2 -20
  232. package/src/runtime/actors/actor-source-transfer.ts +1 -34
  233. package/src/runtime/actors/index.ts +41 -27
  234. package/src/runtime/actors/session-disconnected-wire.ts +66 -0
  235. package/src/runtime/admission.ts +69 -34
  236. package/src/runtime/application-jobs/application-job-queue-scope.ts +33 -1
  237. package/src/runtime/application-jobs/contracts.ts +2 -0
  238. package/src/runtime/backend/contracts/index.ts +39 -4
  239. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
  240. package/src/runtime/backend/mesh-completion-table.ts +4 -0
  241. package/src/runtime/backend/mesh-dispatch-pump.ts +223 -124
  242. package/src/runtime/backend/node/node-raw-binding-port.ts +106 -70
  243. package/src/runtime/backend/node/node-raw-mesh-backend.ts +221 -170
  244. package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -5
  245. package/src/runtime/channels/channel-clients.ts +49 -24
  246. package/src/runtime/channels/channel-dispatch-pipeline.ts +173 -124
  247. package/src/runtime/channels/channel-dispatchers.ts +116 -72
  248. package/src/runtime/channels/channel-envelope.ts +105 -36
  249. package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
  250. package/src/runtime/channels/channel-runtime-manager.ts +12 -5
  251. package/src/runtime/channels/channel-transports.ts +49 -58
  252. package/src/runtime/channels/client-server-location-runtime.ts +11 -10
  253. package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
  254. package/src/runtime/channels/fanout-location-runtime.ts +17 -9
  255. package/src/runtime/diagnostics/flow-context.ts +20 -7
  256. package/src/runtime/diagnostics/index.ts +1 -7
  257. package/src/runtime/diagnostics/message-flow.ts +47 -9
  258. package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
  259. package/src/runtime/execution/index.ts +40 -14
  260. package/src/runtime/execution/serial-execution-queue.ts +31 -4
  261. package/src/runtime/execution/state-lane.ts +7 -0
  262. package/src/runtime/foundation/operation-registry.ts +98 -20
  263. package/src/runtime/foundation/raw-service-mesh-runtime.ts +244 -67
  264. package/src/runtime/foundation/service-liveness-registry.ts +39 -0
  265. package/src/runtime/foundation/service-mailbox.ts +8 -0
  266. package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
  267. package/src/runtime/foundation/service-relocation-object-owner.ts +54 -37
  268. package/src/runtime/foundation/service-relocation-runtime.ts +7 -3
  269. package/src/runtime/foundation/service-runtime-contracts.ts +12 -1
  270. package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
  271. package/src/runtime/foundation/service-stateful-registry.ts +38 -35
  272. package/src/runtime/foundation/service-stateful-runtime.ts +667 -152
  273. package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -11
  274. package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
  275. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  276. package/src/runtime/foundation/service-wire-m6a-codec.ts +187 -51
  277. package/src/runtime/host/actor-packet-relay.ts +113 -94
  278. package/src/runtime/host/actor-placement-coordinator.ts +31 -8
  279. package/src/runtime/host/actor-transfer-runtime.ts +104 -430
  280. package/src/runtime/host/application-job-queue.ts +29 -44
  281. package/src/runtime/host/index.ts +286 -129
  282. package/src/runtime/host/location-runtime-owner.ts +2 -6
  283. package/src/runtime/host/mesh-router-resolver.ts +13 -5
  284. package/src/runtime/host/remote-bound-session-relay.ts +86 -248
  285. package/src/runtime/host/route-mesh-runtime.ts +11 -5
  286. package/src/runtime/host/runtime-shutdown.ts +15 -4
  287. package/src/runtime/host/service-relocation-host-runtime.ts +784 -475
  288. package/src/runtime/host/spot-runtime-options-factory.ts +18 -7
  289. package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
  290. package/src/runtime/locations/auto-connect-loop.ts +22 -14
  291. package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
  292. package/src/runtime/locations/auto-connect-types.ts +0 -1
  293. package/src/runtime/locations/descriptor-publication.ts +7 -0
  294. package/src/runtime/locations/domain-store-contract.ts +5 -0
  295. package/src/runtime/locations/in-memory-authority-store.ts +85 -23
  296. package/src/runtime/locations/in-memory-location-store.ts +1 -12
  297. package/src/runtime/locations/index.ts +1 -0
  298. package/src/runtime/locations/lease-tracker.ts +2 -9
  299. package/src/runtime/locations/location-store-repository.ts +628 -152
  300. package/src/runtime/locations/relocation-blob.ts +75 -1
  301. package/src/runtime/locations/request-source-resolver.ts +138 -0
  302. package/src/runtime/locations/resolvers.ts +2 -2
  303. package/src/runtime/locations/runtime.ts +70 -40
  304. package/src/runtime/messaging/payload-codec.ts +8 -11
  305. package/src/runtime/messaging/request-result.ts +33 -29
  306. package/src/runtime/protocol/service_wire_codec.generated.ts +87 -4
  307. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +13 -10
  308. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +3 -2
  309. package/src/runtime/spots/index.ts +375 -281
  310. package/src/runtime/spots/spot-activation-registry.ts +25 -13
  311. package/src/runtime/spots/spot-activation-state.ts +12 -19
  312. package/src/runtime/spots/spot-activation.ts +170 -86
  313. package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
  314. package/src/runtime/spots/spot-actor-membership.ts +0 -15
  315. package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
  316. package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
  317. package/src/runtime/spots/spot-entry-activation.ts +24 -19
  318. package/src/runtime/spots/spot-handler-registry.ts +15 -4
  319. package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
  320. package/src/runtime/spots/spot-manager-public.ts +2 -2
  321. package/src/runtime/spots/spot-node-autoconnect.ts +22 -45
  322. package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
  323. package/src/runtime/spots/spot-outbound.ts +3 -3
  324. package/src/runtime/spots/spot-remote-codec.ts +9 -2
  325. package/src/runtime/spots/spot-runtime-ports.ts +0 -1
  326. package/src/runtime/spots/spot-serial-executor.ts +97 -25
  327. package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
  328. package/src/runtime/spots/spot-subscription-dispatch.ts +1 -1
  329. package/src/runtime/spots/spot-timer.ts +413 -157
  330. package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
  331. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
  332. package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
  333. package/src/runtime/streams/bound-session-service.ts +7 -10
  334. package/src/runtime/streams/index.ts +12 -6
  335. package/src/runtime/streams/managed-stream.ts +4 -2
  336. package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
  337. package/src/runtime/streams/session-actor-coordinator.ts +39 -88
  338. package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
  339. package/src/runtime/streams/stream-session-runtime.ts +1 -5
  340. package/src/runtime/workers/index.ts +1 -1
@@ -20,7 +20,6 @@ export interface ZLinkMeshDispatchFailureContext {
20
20
  export declare class ZLinkMeshDispatchPump {
21
21
  private readonly node;
22
22
  private readonly options;
23
- private readonly dispatchOwnedRecord;
24
23
  private pendingDomains;
25
24
  private infrastructureScheduled;
26
25
  private disposed;
@@ -30,15 +29,28 @@ export declare class ZLinkMeshDispatchPump {
30
29
  private readonly capacityStop;
31
30
  private recordsSinceYield;
32
31
  private yieldStartedAtMs;
32
+ /** Drains in progress; the batch budget begins when work starts on an idle pump. */
33
+ private draining;
34
+ /** The macrotask boundary every drain waits for once the shared budget is spent. */
35
+ private pendingYield?;
33
36
  constructor(node: ZLinkBackendMeshNode, options: ZLinkMeshDispatchPumpOptions);
34
37
  start(): void;
35
- dispose(): Promise<void>;
38
+ dispose(signal?: AbortSignal): Promise<void>;
36
39
  private markReady;
37
40
  private wakeApplicationWorker;
38
41
  private startApplicationWorker;
39
42
  private runApplicationWorker;
40
43
  private waitForApplicationReady;
44
+ /**
45
+ * Starts one record in this worker's turn; a permit's scope covers the
46
+ * synchronous dispatch. Returns `false` when the dispatch threw (already
47
+ * reported), `true` when it returned synchronously, or the handler's pending
48
+ * completion, which the draining turn awaits itself before
49
+ * {@link finishRecord}.
50
+ */
41
51
  private dispatchRecord;
52
+ private failRecord;
53
+ /** Runs the record's terminal completion, then releases its permit turn. */
42
54
  private finishRecord;
43
55
  private reportDispatchError;
44
56
  /**
@@ -51,6 +63,18 @@ export declare class ZLinkMeshDispatchPump {
51
63
  private scheduleInfrastructure;
52
64
  private drainInfrastructure;
53
65
  private drainDomain;
66
+ /**
67
+ * Time the pump spent idle is not batch work: when work starts on an idle
68
+ * pump, its batch budget starts with it (spec 08 §6).
69
+ */
70
+ private beginDrain;
71
+ /** Drains one claimed owner in this worker's turn, in claim order. */
72
+ private drainClaim;
73
+ /**
74
+ * The batch budget is shared by every drain of this pump, so once it is
75
+ * spent every drain waits for the same macrotask boundary; one drain that
76
+ * keeps running would otherwise hold the event loop the yield was for.
77
+ */
54
78
  private yieldIfNeeded;
55
79
  private nowMs;
56
80
  private acquirePermit;
@@ -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");
@@ -24,7 +25,6 @@ const detachedMeshDispatchScope = node_async_hooks_1.AsyncLocalStorage.snapshot(
24
25
  class ZLinkMeshDispatchPump {
25
26
  node;
26
27
  options;
27
- dispatchOwnedRecord = this.dispatchRecord.bind(this);
28
28
  pendingDomains = service_runtime_contracts_1.ReadyDomain.None;
29
29
  infrastructureScheduled = false;
30
30
  disposed = false;
@@ -34,6 +34,10 @@ class ZLinkMeshDispatchPump {
34
34
  capacityStop = new AbortController();
35
35
  recordsSinceYield = 0;
36
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;
37
41
  constructor(node, options) {
38
42
  this.node = node;
39
43
  this.options = options;
@@ -49,7 +53,7 @@ class ZLinkMeshDispatchPump {
49
53
  return domains;
50
54
  });
51
55
  }
52
- async dispose() {
56
+ async dispose(signal) {
53
57
  if (this.disposed) {
54
58
  return;
55
59
  }
@@ -60,7 +64,7 @@ class ZLinkMeshDispatchPump {
60
64
  wake();
61
65
  this.idleApplicationWorkers.clear();
62
66
  while (this.activeDrains.size > 0) {
63
- await Promise.all([...this.activeDrains]);
67
+ await (0, abort_1.awaitWithAbort)(Promise.all([...this.activeDrains]), signal);
64
68
  }
65
69
  }
66
70
  markReady(domains) {
@@ -117,14 +121,37 @@ class ZLinkMeshDispatchPump {
117
121
  try {
118
122
  for (;;) {
119
123
  await this.waitForApplicationReady();
120
- if (this.disposed)
121
- return;
124
+ this.beginDrain();
122
125
  try {
123
- 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
+ }
124
145
  }
125
146
  catch (error) {
126
147
  this.reportDispatchError(error);
127
148
  }
149
+ finally {
150
+ readyBatch.reset();
151
+ this.draining -= 1;
152
+ }
153
+ if (this.disposed)
154
+ return;
128
155
  }
129
156
  }
130
157
  finally {
@@ -141,30 +168,50 @@ class ZLinkMeshDispatchPump {
141
168
  }
142
169
  return new Promise((resolve) => this.idleApplicationWorkers.add(resolve));
143
170
  }
144
- dispatchRecord(owner, record) {
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);
145
180
  let result;
146
181
  try {
147
182
  result = this.options.dispatch(owner, record);
148
183
  }
149
184
  catch (error) {
150
- this.reportDispatchError(error, meshDispatchFailureContext(record));
151
- return;
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);
152
191
  }
153
- return result === undefined
154
- ? this.finishRecord(record)
155
- : Promise.resolve(result).then(() => this.finishRecord(record), (error) => this.reportDispatchError(error, meshDispatchFailureContext(record)));
192
+ return result ?? true;
156
193
  }
157
- finishRecord(record) {
158
- let result;
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;
159
201
  try {
160
202
  result = record.onTerminalCompletion?.();
161
203
  }
162
204
  catch (error) {
163
205
  this.reportDispatchError(error, meshDispatchFailureContext(record));
206
+ }
207
+ if (result === undefined) {
208
+ (0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit);
164
209
  return;
165
210
  }
166
- if (result !== undefined)
167
- return Promise.resolve(result).catch((error) => this.reportDispatchError(error, meshDispatchFailureContext(record)));
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
+ });
168
215
  }
169
216
  reportDispatchError(error, context) {
170
217
  this.options.reportError?.(error, context);
@@ -204,7 +251,7 @@ class ZLinkMeshDispatchPump {
204
251
  if ((this.pendingDomains & service_runtime_contracts_1.ReadyDomain.Application) !== 0) {
205
252
  setImmediate(() => this.wakeApplicationWorker());
206
253
  }
207
- 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);
208
255
  if (lifecycleBudgetExhausted) {
209
256
  this.pendingDomains |= service_runtime_contracts_1.ReadyDomain.Infrastructure;
210
257
  await yieldToEventLoop();
@@ -215,111 +262,34 @@ class ZLinkMeshDispatchPump {
215
262
  readyBatch.close();
216
263
  }
217
264
  }
218
- async drainDomain(domain, readyBatch, receiveBatch, claimBudget) {
265
+ async drainDomain(readyBatch) {
219
266
  let claimsDrained = 0;
267
+ this.beginDrain();
220
268
  try {
221
269
  while (!this.disposed) {
222
- if (claimBudget !== undefined && claimsDrained >= claimBudget) {
270
+ if (claimsDrained >= MESH_DISPATCH_LIFECYCLE_CLAIM_BUDGET) {
223
271
  // Lifecycle work has priority, but a bounded turn lets application
224
272
  // work make progress when lifecycle records keep arriving.
225
273
  return true;
226
274
  }
227
275
  readyBatch.reset();
228
- 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);
229
277
  if (!drained.ok || drained.records.length === 0) {
230
278
  return false;
231
279
  }
232
- if (domain === service_runtime_contracts_1.ReadyDomain.Application && drained.hasResidue) {
233
- this.markReady(service_runtime_contracts_1.ReadyDomain.Application);
234
- }
235
280
  for (let index = 0; index < drained.records.length; index += 1) {
236
281
  const claim = readyBatch.takeClaim(index);
237
282
  claimsDrained += 1;
238
283
  const owner = drained.records[index];
239
- // Raw ingress already attached one host permit to each record.
240
- // A claim that reserves admission here may receive only that permit's record.
241
- const drainClaim = async () => {
242
- let ownerReceiveBatch = receiveBatch;
243
- try {
244
- ownerReceiveBatch ??= this.node.createReceiveBatch(MESH_DISPATCH_RECEIVE_CAPACITY, this.options.partCapacity ?? DEFAULT_MESH_PART_CAPACITY);
245
- const capacity = owner.ordinaryIngressPreAdmitted === true ? MESH_DISPATCH_RECEIVE_CAPACITY : 1;
246
- let claimPermit = owner.terminalCompletion === true ||
247
- owner.ordinaryIngressPreAdmitted === true ||
248
- domain === service_runtime_contracts_1.ReadyDomain.Infrastructure
249
- ? undefined
250
- : await this.acquirePermit();
251
- try {
252
- if (this.capacityStop.signal.aborted)
253
- return;
254
- ownerReceiveBatch.reset(capacity);
255
- const received = claim.recvBatch(ownerReceiveBatch, runtime_values_1.ZLINK_BACKEND_RECV_DONT_WAIT);
256
- if (received.ok) {
257
- // The bounded batch stays in claim order until its records finish.
258
- try {
259
- for (const record of received.records) {
260
- if (this.disposed)
261
- break;
262
- const permit = record.applicationJobPermit ?? claimPermit;
263
- if (owner.ordinaryIngressPreAdmitted === true && permit === undefined) {
264
- throw new Error('Pre-admitted raw ingress record lost its Application Job Queue permit.');
265
- }
266
- this.recordsSinceYield += 1;
267
- if (permit === undefined) {
268
- const dispatched = this.dispatchRecord(owner, record);
269
- if (dispatched !== undefined)
270
- await dispatched;
271
- }
272
- else {
273
- if (domain === service_runtime_contracts_1.ReadyDomain.Application &&
274
- record.applicationJobPermit === undefined)
275
- permit.markApplicationQueued();
276
- // The scope now owns this reservation, including failure
277
- // and detached handler handoff. Only unused permits remain
278
- // owned by the receive attempt's finally block.
279
- if (permit === claimPermit)
280
- claimPermit = undefined;
281
- const dispatched = (0, application_job_queue_scope_1.runWithApplicationJobPermit)(permit, this.dispatchOwnedRecord, owner, record);
282
- if (dispatched !== undefined)
283
- await dispatched;
284
- }
285
- }
286
- }
287
- finally {
288
- // Batch ownership includes records whose dispatch never began,
289
- // including on failure or shutdown in the middle of the batch.
290
- for (const record of received.records) {
291
- for (const part of record.parts)
292
- part.close();
293
- record.releaseRetainedIngress?.();
294
- }
295
- }
296
- }
297
- }
298
- finally {
299
- claimPermit?.releaseAfterInternalProcessing();
300
- }
301
- }
302
- finally {
303
- claim.release();
304
- if (receiveBatch === undefined)
305
- ownerReceiveBatch?.close();
306
- }
307
- const yieldTurn = this.yieldIfNeeded();
308
- if (yieldTurn !== undefined)
309
- await yieldTurn;
310
- };
311
- // An application worker drains the one owner it claimed. Infrastructure owners
312
- // drain independently, so a suspended owner does not hold the other claims.
313
- if (receiveBatch !== undefined) {
314
- await drainClaim();
315
- }
316
- else {
317
- const drain = drainClaim().catch((error) => this.reportDispatchError(error));
318
- this.activeDrains.add(drain);
319
- void drain.finally(() => this.activeDrains.delete(drain));
320
- }
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
+ });
321
291
  }
322
- if (claimBudget !== undefined && claimsDrained >= claimBudget) {
292
+ if (claimsDrained >= MESH_DISPATCH_LIFECYCLE_CLAIM_BUDGET) {
323
293
  this.wakeApplicationWorker();
324
294
  return true;
325
295
  }
@@ -334,17 +304,133 @@ class ZLinkMeshDispatchPump {
334
304
  }
335
305
  finally {
336
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();
318
+ }
319
+ this.draining += 1;
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
+ }
337
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;
338
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
+ */
339
420
  yieldIfNeeded() {
421
+ if (this.pendingYield !== undefined)
422
+ return this.pendingYield;
340
423
  const nowMs = this.nowMs();
341
424
  if (this.recordsSinceYield < MESH_DISPATCH_YIELD_RECORDS &&
342
425
  nowMs - this.yieldStartedAtMs < MESH_DISPATCH_YIELD_INTERVAL_MS)
343
426
  return undefined;
344
427
  this.recordsSinceYield = 0;
345
- return yieldToTimers().then(() => {
428
+ const pendingYield = yieldToTimers().then(() => {
429
+ this.pendingYield = undefined;
346
430
  this.yieldStartedAtMs = this.nowMs();
347
431
  });
432
+ this.pendingYield = pendingYield;
433
+ return pendingYield;
348
434
  }
349
435
  nowMs() {
350
436
  return this.options.monotonicNowMs?.() ?? performance.now();