@zlink-systems/framework 0.30.3 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Actors/ZLinkActor.d.ts +2 -0
  3. package/dist/contracts/Actors/ZLinkSessionBindingIdentity.d.ts +6 -0
  4. package/dist/contracts/Actors/ZLinkSessionBindingIdentity.js +2 -0
  5. package/dist/contracts/Actors/index.d.ts +1 -0
  6. package/dist/contracts/Actors/index.js +1 -0
  7. package/dist/contracts/Common/CoreTypes.d.ts +1 -0
  8. package/dist/contracts/Common/HandlerMessageType.d.ts +8 -0
  9. package/dist/contracts/Common/HandlerMessageType.js +41 -0
  10. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +1 -1
  11. package/dist/contracts/Common/ZLinkEncodedPayload.js +12 -20
  12. package/dist/contracts/Common/ZLinkMessage.js +11 -7
  13. package/dist/contracts/Common/encoded-payload-storage.d.ts +0 -2
  14. package/dist/contracts/Common/encoded-payload-storage.js +4 -16
  15. package/dist/contracts/Common/index.d.ts +1 -1
  16. package/dist/contracts/Common/payload-slab.d.ts +4 -0
  17. package/dist/contracts/Common/payload-slab.js +30 -0
  18. package/dist/contracts/Configuration/RegistrationBuilders.js +15 -9
  19. package/dist/contracts/Configuration/RegistrationTypes.d.ts +19 -0
  20. package/dist/contracts/Handlers/Contexts.d.ts +1 -0
  21. package/dist/contracts/Locations/Authority.d.ts +2 -0
  22. package/dist/internal.d.ts +9 -0
  23. package/dist/internal.js +23 -1
  24. package/dist/nest-integration.d.ts +1 -0
  25. package/dist/nest-integration.js +3 -1
  26. package/dist/runtime/actors/actor-client.d.ts +6 -2
  27. package/dist/runtime/actors/actor-client.js +120 -82
  28. package/dist/runtime/actors/actor-context.js +16 -5
  29. package/dist/runtime/actors/actor-execution-context.js +2 -2
  30. package/dist/runtime/actors/actor-handoff.d.ts +12 -1
  31. package/dist/runtime/actors/actor-handoff.js +79 -34
  32. package/dist/runtime/actors/actor-join-deferred-scope.js +6 -6
  33. package/dist/runtime/actors/actor-local-native-join.d.ts +2 -2
  34. package/dist/runtime/actors/actor-local-native-join.js +19 -17
  35. package/dist/runtime/actors/actor-mailbox.d.ts +1 -1
  36. package/dist/runtime/actors/actor-remote-joiner.d.ts +2 -2
  37. package/dist/runtime/actors/actor-remote-joiner.js +4 -4
  38. package/dist/runtime/actors/actor-routed-join-transport.d.ts +9 -3
  39. package/dist/runtime/actors/actor-routed-json-request.d.ts +3 -0
  40. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -2
  41. package/dist/runtime/actors/actor-runtime-state.d.ts +1 -1
  42. package/dist/runtime/actors/spot-actor-dispatch.d.ts +9 -5
  43. package/dist/runtime/actors/spot-actor-dispatch.js +60 -38
  44. package/dist/runtime/admission.d.ts +6 -4
  45. package/dist/runtime/admission.js +21 -10
  46. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +1 -0
  47. package/dist/runtime/application-jobs/application-ingress-record-owner.js +3 -0
  48. package/dist/runtime/backend/contracts/index.d.ts +26 -10
  49. package/dist/runtime/backend/mesh-completion-table.d.ts +7 -1
  50. package/dist/runtime/backend/mesh-completion-table.js +84 -20
  51. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +19 -6
  52. package/dist/runtime/backend/mesh-dispatch-pump.js +246 -147
  53. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +3 -2
  54. package/dist/runtime/backend/node/node-backend-adapter-support.js +27 -19
  55. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +5 -2
  56. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +70 -13
  57. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
  58. package/dist/runtime/backend/node/node-event-loop-poller.js +4 -3
  59. package/dist/runtime/backend/node/node-mesh-backend-adapter.js +5 -1
  60. package/dist/runtime/backend/node/node-raw-binding-port.d.ts +7 -2
  61. package/dist/runtime/backend/node/node-raw-binding-port.js +99 -63
  62. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +34 -16
  63. package/dist/runtime/backend/node/node-raw-mesh-backend.js +210 -106
  64. package/dist/runtime/backend/node/node-socket-backend-adapter.js +20 -6
  65. package/dist/runtime/backend/raw-binding-port.d.ts +6 -3
  66. package/dist/runtime/channels/channel-clients.js +3 -3
  67. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +11 -7
  68. package/dist/runtime/channels/channel-dispatch-pipeline.js +40 -22
  69. package/dist/runtime/channels/channel-dispatch-services.d.ts +3 -1
  70. package/dist/runtime/channels/channel-dispatch-services.js +7 -6
  71. package/dist/runtime/channels/channel-dispatchers.d.ts +13 -6
  72. package/dist/runtime/channels/channel-dispatchers.js +57 -36
  73. package/dist/runtime/channels/channel-envelope.d.ts +2 -2
  74. package/dist/runtime/channels/channel-envelope.js +609 -83
  75. package/dist/runtime/channels/channel-multipart.d.ts +1 -0
  76. package/dist/runtime/channels/channel-multipart.js +10 -6
  77. package/dist/runtime/channels/channel-outbound-operations.d.ts +6 -9
  78. package/dist/runtime/channels/channel-outbound-operations.js +107 -105
  79. package/dist/runtime/channels/channel-receive-loops.d.ts +9 -7
  80. package/dist/runtime/channels/channel-receive-loops.js +126 -90
  81. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +23 -6
  82. package/dist/runtime/channels/channel-runtime-lifecycle.js +47 -38
  83. package/dist/runtime/channels/channel-runtime-manager.d.ts +13 -6
  84. package/dist/runtime/channels/channel-runtime-manager.js +32 -14
  85. package/dist/runtime/channels/channel-socket-registry.d.ts +28 -4
  86. package/dist/runtime/channels/channel-socket-registry.js +9 -1
  87. package/dist/runtime/channels/channel-transports.d.ts +23 -16
  88. package/dist/runtime/channels/channel-transports.js +139 -119
  89. package/dist/runtime/channels/dispatch-error-reporter.d.ts +4 -4
  90. package/dist/runtime/channels/dispatch-error-reporter.js +5 -5
  91. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  92. package/dist/runtime/channels/local-spot-route-transport.d.ts +5 -2
  93. package/dist/runtime/channels/local-spot-route-transport.js +15 -18
  94. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +6 -3
  95. package/dist/runtime/channels/router-socket-spot-route-transport.js +33 -19
  96. package/dist/runtime/channels/source-spot-router.d.ts +6 -3
  97. package/dist/runtime/channels/source-spot-router.js +34 -23
  98. package/dist/runtime/channels/spot-node-route-transport.d.ts +6 -3
  99. package/dist/runtime/channels/spot-node-route-transport.js +23 -17
  100. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +6 -3
  101. package/dist/runtime/channels/spot-route-bridge-transport.js +38 -24
  102. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +8 -4
  103. package/dist/runtime/channels/spot-route-dispatch-strategy.js +36 -23
  104. package/dist/runtime/diagnostics/dispatch-error-details.js +9 -3
  105. package/dist/runtime/diagnostics/message-flow-bootstrap.d.ts +1 -0
  106. package/dist/runtime/diagnostics/message-flow-bootstrap.js +8 -0
  107. package/dist/runtime/diagnostics/message-flow-delivery.d.ts +47 -0
  108. package/dist/runtime/diagnostics/message-flow-delivery.js +149 -0
  109. package/dist/runtime/diagnostics/message-flow-record.d.ts +50 -0
  110. package/dist/runtime/diagnostics/message-flow-record.js +228 -0
  111. package/dist/runtime/diagnostics/message-flow-worker.d.ts +1 -0
  112. package/dist/runtime/diagnostics/message-flow-worker.js +118 -0
  113. package/dist/runtime/diagnostics/message-flow.d.ts +7 -19
  114. package/dist/runtime/diagnostics/message-flow.js +42 -290
  115. package/dist/runtime/diagnostics/runtime-metrics.d.ts +4 -3
  116. package/dist/runtime/diagnostics/runtime-metrics.js +8 -4
  117. package/dist/runtime/execution/index.d.ts +1 -0
  118. package/dist/runtime/execution/index.js +6 -3
  119. package/dist/runtime/execution/serial-execution-queue.d.ts +26 -13
  120. package/dist/runtime/execution/serial-execution-queue.js +75 -71
  121. package/dist/runtime/foundation/durable-service-request.d.ts +12 -3
  122. package/dist/runtime/foundation/durable-service-request.js +158 -73
  123. package/dist/runtime/foundation/operation-registry.d.ts +33 -3
  124. package/dist/runtime/foundation/operation-registry.js +272 -33
  125. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +62 -23
  126. package/dist/runtime/foundation/raw-service-mesh-runtime.js +373 -194
  127. package/dist/runtime/foundation/request-runtime.d.ts +17 -0
  128. package/dist/runtime/foundation/request-runtime.js +163 -0
  129. package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
  130. package/dist/runtime/foundation/service-discovery-registry.js +6 -0
  131. package/dist/runtime/foundation/service-liveness-registry.d.ts +1 -1
  132. package/dist/runtime/foundation/service-mailbox.d.ts +4 -2
  133. package/dist/runtime/foundation/service-mailbox.js +4 -1
  134. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -2
  135. package/dist/runtime/foundation/service-relocation-object-owner.js +12 -5
  136. package/dist/runtime/foundation/service-runtime-contracts.d.ts +7 -2
  137. package/dist/runtime/foundation/service-stateful-registry.d.ts +6 -2
  138. package/dist/runtime/foundation/service-stateful-registry.js +38 -17
  139. package/dist/runtime/foundation/service-stateful-runtime.d.ts +91 -26
  140. package/dist/runtime/foundation/service-stateful-runtime.js +245 -120
  141. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -0
  142. package/dist/runtime/foundation/service-stateful-wire-codec.js +15 -0
  143. package/dist/runtime/foundation/service-topology-registry.d.ts +2 -0
  144. package/dist/runtime/foundation/service-topology-registry.js +13 -3
  145. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  146. package/dist/runtime/foundation/service-wire-constants.generated.js +12 -0
  147. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +5 -1
  148. package/dist/runtime/foundation/service-wire-m6a-codec.js +50 -15
  149. package/dist/runtime/host/actor-packet-relay.d.ts +5 -6
  150. package/dist/runtime/host/actor-packet-relay.js +58 -57
  151. package/dist/runtime/host/actor-placement-coordinator.d.ts +1 -1
  152. package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
  153. package/dist/runtime/host/actor-runtime-options-factory.js +3 -2
  154. package/dist/runtime/host/actor-transfer-runtime.d.ts +3 -3
  155. package/dist/runtime/host/application-job-queue.d.ts +7 -5
  156. package/dist/runtime/host/application-job-queue.js +33 -21
  157. package/dist/runtime/host/bound-session-relay.js +0 -1
  158. package/dist/runtime/host/channel-runtime-options-factory.d.ts +2 -0
  159. package/dist/runtime/host/channel-runtime-options-factory.js +1 -0
  160. package/dist/runtime/host/entry-actor-runtime.d.ts +5 -2
  161. package/dist/runtime/host/entry-actor-runtime.js +2 -2
  162. package/dist/runtime/host/index.d.ts +106 -37
  163. package/dist/runtime/host/index.js +303 -151
  164. package/dist/runtime/host/location-runtime-owner.d.ts +2 -2
  165. package/dist/runtime/host/location-runtime-owner.js +1 -1
  166. package/dist/runtime/host/service-relocation-host-runtime.d.ts +195 -45
  167. package/dist/runtime/host/service-relocation-host-runtime.js +257 -144
  168. package/dist/runtime/host/spot-address-transport.d.ts +3 -0
  169. package/dist/runtime/host/spot-address-transport.js +73 -76
  170. package/dist/runtime/host/spot-runtime-options-factory.js +2 -0
  171. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -1
  172. package/dist/runtime/host/user-spot-creation-coordinator.js +49 -21
  173. package/dist/runtime/internal-observation.d.ts +1 -0
  174. package/dist/runtime/internal-observation.js +5 -0
  175. package/dist/runtime/locations/actor-location-claims.d.ts +1 -1
  176. package/dist/runtime/locations/actor-location-claims.js +15 -6
  177. package/dist/runtime/locations/auto-connect-loop.d.ts +0 -1
  178. package/dist/runtime/locations/auto-connect-loop.js +25 -19
  179. package/dist/runtime/locations/auto-connect-planner.js +2 -5
  180. package/dist/runtime/locations/auto-connect-reconciler.d.ts +1 -0
  181. package/dist/runtime/locations/auto-connect-reconciler.js +35 -23
  182. package/dist/runtime/locations/in-memory-authority-store.d.ts +1 -0
  183. package/dist/runtime/locations/in-memory-authority-store.js +15 -5
  184. package/dist/runtime/locations/in-memory-location-store.d.ts +0 -2
  185. package/dist/runtime/locations/in-memory-location-store.js +1 -38
  186. package/dist/runtime/locations/lifecycle.d.ts +1 -1
  187. package/dist/runtime/locations/lifecycle.js +2 -2
  188. package/dist/runtime/locations/location-store-repository.d.ts +0 -1
  189. package/dist/runtime/locations/location-store-repository.js +163 -246
  190. package/dist/runtime/locations/resolvers.d.ts +8 -1
  191. package/dist/runtime/locations/resolvers.js +16 -2
  192. package/dist/runtime/locations/runtime.d.ts +3 -3
  193. package/dist/runtime/locations/runtime.js +12 -16
  194. package/dist/runtime/messaging/creation-payload-codec.js +8 -7
  195. package/dist/runtime/messaging/framework-json-v1.d.ts +1 -1
  196. package/dist/runtime/messaging/framework-json-v1.js +6 -2
  197. package/dist/runtime/messaging/payload-codec.js +21 -35
  198. package/dist/runtime/messaging/request-deadline.d.ts +4 -2
  199. package/dist/runtime/messaging/request-deadline.js +40 -25
  200. package/dist/runtime/messaging/request-result.d.ts +14 -1
  201. package/dist/runtime/messaging/request-result.js +74 -13
  202. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +4 -0
  203. package/dist/runtime/protocol/service_wire_codec.generated.js +17 -7
  204. package/dist/runtime/spots/index.d.ts +28 -7
  205. package/dist/runtime/spots/index.js +31 -6
  206. package/dist/runtime/spots/spot-activation-registry.d.ts +3 -2
  207. package/dist/runtime/spots/spot-activation-registry.js +13 -8
  208. package/dist/runtime/spots/spot-activation-state.d.ts +2 -0
  209. package/dist/runtime/spots/spot-activation-state.js +1 -0
  210. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +9 -4
  211. package/dist/runtime/spots/spot-actor-admission-coordinator.js +33 -12
  212. package/dist/runtime/spots/spot-actor-ingress-admission.d.ts +40 -0
  213. package/dist/runtime/spots/spot-actor-ingress-admission.js +78 -0
  214. package/dist/runtime/spots/spot-actor-membership.js +3 -3
  215. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +16 -43
  216. package/dist/runtime/spots/spot-actor-packet-dispatch.js +56 -113
  217. package/dist/runtime/spots/spot-actor-packet-drain.d.ts +1 -0
  218. package/dist/runtime/spots/spot-actor-packet-drain.js +12 -5
  219. package/dist/runtime/spots/spot-entry-activation.d.ts +4 -3
  220. package/dist/runtime/spots/spot-entry-activation.js +7 -12
  221. package/dist/runtime/spots/spot-handler-registry.d.ts +5 -1
  222. package/dist/runtime/spots/spot-handler-registry.js +31 -15
  223. package/dist/runtime/spots/spot-manager-public.js +3 -2
  224. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +11 -6
  225. package/dist/runtime/spots/spot-node-runtime-manager.js +6 -1
  226. package/dist/runtime/spots/spot-outbound.d.ts +8 -2
  227. package/dist/runtime/spots/spot-outbound.js +5 -5
  228. package/dist/runtime/spots/spot-route-packet-dispatch.js +13 -8
  229. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +3 -3
  230. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +9 -5
  231. package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -2
  232. package/dist/runtime/spots/spot-serial-executor.d.ts +2 -1
  233. package/dist/runtime/spots/spot-serial-turn-executor.js +20 -26
  234. package/dist/runtime/spots/spot-subscription-dispatch.js +5 -2
  235. package/dist/runtime/spots/spot-timer.d.ts +1 -1
  236. package/dist/runtime/streams/actor-session-binding-registry.d.ts +11 -3
  237. package/dist/runtime/streams/actor-session-binding-registry.js +28 -0
  238. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -2
  239. package/dist/runtime/streams/bound-actor-relay-sender.js +3 -4
  240. package/dist/runtime/streams/bound-session-service.js +6 -7
  241. package/dist/runtime/streams/index.d.ts +3 -3
  242. package/dist/runtime/streams/index.js +22 -2
  243. package/dist/runtime/streams/managed-stream.js +2 -1
  244. package/dist/runtime/streams/session-calls.d.ts +1 -1
  245. package/dist/runtime/streams/session-calls.js +3 -9
  246. package/dist/runtime/streams/session-context.d.ts +2 -2
  247. package/dist/runtime/streams/session-context.js +2 -2
  248. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -0
  249. package/dist/runtime/streams/stream-session-runtime.js +64 -33
  250. package/package.json +3 -3
  251. package/src/contracts/Actors/ZLinkActor.ts +6 -0
  252. package/src/contracts/Actors/ZLinkSessionBindingIdentity.ts +7 -0
  253. package/src/contracts/Actors/index.ts +1 -0
  254. package/src/contracts/Common/CoreTypes.ts +1 -0
  255. package/src/contracts/Common/HandlerMessageType.ts +50 -0
  256. package/src/contracts/Common/ZLinkEncodedPayload.ts +13 -25
  257. package/src/contracts/Common/ZLinkMessage.ts +11 -7
  258. package/src/contracts/Common/encoded-payload-storage.ts +4 -16
  259. package/src/contracts/Common/index.ts +1 -1
  260. package/src/contracts/Common/payload-slab.ts +29 -0
  261. package/src/contracts/Configuration/RegistrationBuilders.ts +29 -15
  262. package/src/contracts/Configuration/RegistrationTypes.ts +19 -0
  263. package/src/contracts/Handlers/Contexts.ts +1 -0
  264. package/src/contracts/Locations/Authority.ts +7 -1
  265. package/src/internal.ts +17 -0
  266. package/src/nest-integration.ts +1 -0
  267. package/src/runtime/actors/actor-client.ts +257 -163
  268. package/src/runtime/actors/actor-context.ts +26 -14
  269. package/src/runtime/actors/actor-execution-context.ts +2 -2
  270. package/src/runtime/actors/actor-handoff.ts +86 -51
  271. package/src/runtime/actors/actor-join-deferred-scope.ts +6 -6
  272. package/src/runtime/actors/actor-local-native-join.ts +38 -17
  273. package/src/runtime/actors/actor-mailbox.ts +1 -1
  274. package/src/runtime/actors/actor-remote-joiner.ts +8 -4
  275. package/src/runtime/actors/actor-routed-join-transport.ts +13 -5
  276. package/src/runtime/actors/actor-routed-json-request.ts +3 -0
  277. package/src/runtime/actors/actor-runtime-contracts.ts +4 -2
  278. package/src/runtime/actors/actor-runtime-state.ts +1 -1
  279. package/src/runtime/actors/spot-actor-dispatch.ts +70 -68
  280. package/src/runtime/admission.ts +42 -15
  281. package/src/runtime/application-jobs/application-ingress-record-owner.ts +4 -0
  282. package/src/runtime/backend/contracts/index.ts +77 -10
  283. package/src/runtime/backend/mesh-completion-table.ts +106 -15
  284. package/src/runtime/backend/mesh-dispatch-pump.ts +294 -146
  285. package/src/runtime/backend/node/node-backend-adapter-support.ts +42 -32
  286. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +91 -34
  287. package/src/runtime/backend/node/node-event-loop-poller.ts +14 -5
  288. package/src/runtime/backend/node/node-mesh-backend-adapter.ts +5 -1
  289. package/src/runtime/backend/node/node-raw-binding-port.ts +180 -69
  290. package/src/runtime/backend/node/node-raw-mesh-backend.ts +386 -157
  291. package/src/runtime/backend/node/node-socket-backend-adapter.ts +56 -11
  292. package/src/runtime/backend/raw-binding-port.ts +13 -5
  293. package/src/runtime/channels/channel-clients.ts +26 -11
  294. package/src/runtime/channels/channel-dispatch-pipeline.ts +77 -65
  295. package/src/runtime/channels/channel-dispatch-services.ts +7 -12
  296. package/src/runtime/channels/channel-dispatchers.ts +93 -39
  297. package/src/runtime/channels/channel-envelope.ts +680 -144
  298. package/src/runtime/channels/channel-multipart.ts +17 -13
  299. package/src/runtime/channels/channel-outbound-operations.ts +204 -178
  300. package/src/runtime/channels/channel-receive-loops.ts +160 -107
  301. package/src/runtime/channels/channel-runtime-lifecycle.ts +64 -59
  302. package/src/runtime/channels/channel-runtime-manager.ts +74 -27
  303. package/src/runtime/channels/channel-socket-registry.ts +20 -5
  304. package/src/runtime/channels/channel-transports.ts +414 -287
  305. package/src/runtime/channels/dispatch-error-reporter.ts +4 -9
  306. package/src/runtime/channels/local-spot-route-transport.ts +27 -29
  307. package/src/runtime/channels/router-socket-spot-route-transport.ts +63 -32
  308. package/src/runtime/channels/source-spot-router.ts +75 -38
  309. package/src/runtime/channels/spot-node-route-transport.ts +67 -37
  310. package/src/runtime/channels/spot-route-bridge-transport.ts +62 -30
  311. package/src/runtime/channels/spot-route-dispatch-strategy.ts +105 -34
  312. package/src/runtime/diagnostics/dispatch-error-details.ts +10 -2
  313. package/src/runtime/diagnostics/message-flow-bootstrap.ts +6 -0
  314. package/src/runtime/diagnostics/message-flow-delivery.ts +171 -0
  315. package/src/runtime/diagnostics/message-flow-record.ts +295 -0
  316. package/src/runtime/diagnostics/message-flow-worker.ts +146 -0
  317. package/src/runtime/diagnostics/message-flow.ts +49 -362
  318. package/src/runtime/diagnostics/runtime-metrics.ts +10 -4
  319. package/src/runtime/execution/index.ts +6 -0
  320. package/src/runtime/execution/serial-execution-queue.ts +94 -96
  321. package/src/runtime/foundation/durable-service-request.ts +212 -89
  322. package/src/runtime/foundation/operation-registry.ts +287 -38
  323. package/src/runtime/foundation/raw-service-mesh-runtime.ts +617 -292
  324. package/src/runtime/foundation/request-runtime.ts +227 -0
  325. package/src/runtime/foundation/service-discovery-registry.ts +7 -0
  326. package/src/runtime/foundation/service-liveness-registry.ts +1 -1
  327. package/src/runtime/foundation/service-mailbox.ts +7 -2
  328. package/src/runtime/foundation/service-relocation-object-owner.ts +21 -6
  329. package/src/runtime/foundation/service-runtime-contracts.ts +12 -2
  330. package/src/runtime/foundation/service-stateful-registry.ts +52 -19
  331. package/src/runtime/foundation/service-stateful-runtime.ts +365 -198
  332. package/src/runtime/foundation/service-stateful-wire-codec.ts +18 -0
  333. package/src/runtime/foundation/service-topology-registry.ts +21 -3
  334. package/src/runtime/foundation/service-wire-constants.generated.ts +10 -0
  335. package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -17
  336. package/src/runtime/host/actor-packet-relay.ts +160 -156
  337. package/src/runtime/host/actor-placement-coordinator.ts +1 -1
  338. package/src/runtime/host/actor-runtime-options-factory.ts +7 -2
  339. package/src/runtime/host/actor-transfer-runtime.ts +3 -3
  340. package/src/runtime/host/application-job-queue.ts +56 -27
  341. package/src/runtime/host/bound-session-relay.ts +0 -1
  342. package/src/runtime/host/channel-runtime-options-factory.ts +3 -0
  343. package/src/runtime/host/entry-actor-runtime.ts +14 -6
  344. package/src/runtime/host/index.ts +388 -113
  345. package/src/runtime/host/location-runtime-owner.ts +3 -3
  346. package/src/runtime/host/service-relocation-host-runtime.ts +380 -252
  347. package/src/runtime/host/spot-address-transport.ts +110 -95
  348. package/src/runtime/host/spot-runtime-options-factory.ts +3 -0
  349. package/src/runtime/host/user-spot-creation-coordinator.ts +69 -22
  350. package/src/runtime/internal-observation.ts +2 -0
  351. package/src/runtime/locations/actor-location-claims.ts +42 -16
  352. package/src/runtime/locations/auto-connect-loop.ts +24 -16
  353. package/src/runtime/locations/auto-connect-planner.ts +2 -5
  354. package/src/runtime/locations/auto-connect-reconciler.ts +37 -24
  355. package/src/runtime/locations/in-memory-authority-store.ts +27 -7
  356. package/src/runtime/locations/in-memory-location-store.ts +1 -74
  357. package/src/runtime/locations/lifecycle.ts +4 -2
  358. package/src/runtime/locations/location-store-repository.ts +228 -308
  359. package/src/runtime/locations/resolvers.ts +20 -8
  360. package/src/runtime/locations/runtime.ts +16 -28
  361. package/src/runtime/messaging/creation-payload-codec.ts +12 -10
  362. package/src/runtime/messaging/framework-json-v1.ts +10 -1
  363. package/src/runtime/messaging/payload-codec.ts +50 -75
  364. package/src/runtime/messaging/request-deadline.ts +47 -39
  365. package/src/runtime/messaging/request-result.ts +88 -17
  366. package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
  367. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
  368. package/src/runtime/spots/index.ts +57 -10
  369. package/src/runtime/spots/spot-activation-registry.ts +12 -8
  370. package/src/runtime/spots/spot-activation-state.ts +2 -0
  371. package/src/runtime/spots/spot-actor-admission-coordinator.ts +62 -37
  372. package/src/runtime/spots/spot-actor-ingress-admission.ts +157 -0
  373. package/src/runtime/spots/spot-actor-membership.ts +8 -5
  374. package/src/runtime/spots/spot-actor-packet-dispatch.ts +122 -206
  375. package/src/runtime/spots/spot-actor-packet-drain.ts +21 -6
  376. package/src/runtime/spots/spot-entry-activation.ts +25 -35
  377. package/src/runtime/spots/spot-handler-registry.ts +72 -15
  378. package/src/runtime/spots/spot-manager-public.ts +4 -2
  379. package/src/runtime/spots/spot-node-runtime-manager.ts +16 -7
  380. package/src/runtime/spots/spot-outbound.ts +26 -10
  381. package/src/runtime/spots/spot-route-packet-dispatch.ts +18 -8
  382. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +14 -8
  383. package/src/runtime/spots/spot-runtime-ports.ts +5 -2
  384. package/src/runtime/spots/spot-serial-executor.ts +1 -1
  385. package/src/runtime/spots/spot-serial-turn-executor.ts +25 -40
  386. package/src/runtime/spots/spot-subscription-dispatch.ts +9 -2
  387. package/src/runtime/spots/spot-timer.ts +1 -1
  388. package/src/runtime/streams/actor-session-binding-registry.ts +46 -3
  389. package/src/runtime/streams/bound-actor-relay-sender.ts +16 -5
  390. package/src/runtime/streams/bound-session-service.ts +10 -7
  391. package/src/runtime/streams/index.ts +30 -4
  392. package/src/runtime/streams/managed-stream.ts +2 -1
  393. package/src/runtime/streams/session-calls.ts +9 -14
  394. package/src/runtime/streams/session-context.ts +6 -11
  395. package/src/runtime/streams/stream-session-runtime.ts +79 -40
  396. package/dist/runtime/spots/spot-lifecycle-metrics.d.ts +0 -8
  397. package/dist/runtime/spots/spot-lifecycle-metrics.js +0 -17
  398. package/src/runtime/spots/spot-lifecycle-metrics.ts +0 -16
@@ -9,14 +9,50 @@ const application_job_queue_scope_1 = require("../application-jobs/application-j
9
9
  const serial_execution_queue_1 = require("../execution/serial-execution-queue");
10
10
  function createChannelApplicationDispatchQueue() {
11
11
  return new serial_execution_queue_1.ZLinkSerialExecutionQueue(async (record) => {
12
+ const permit = record.context;
13
+ const previousPermit = (0, application_job_queue_scope_1.enterApplicationJobPermitScope)(permit);
12
14
  try {
13
- record.resolve(await record.operation());
15
+ void Promise.resolve(record.operation()).then((value) => {
16
+ try {
17
+ record.resolve(value);
18
+ }
19
+ finally {
20
+ try {
21
+ record.release();
22
+ }
23
+ finally {
24
+ (0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit);
25
+ }
26
+ }
27
+ }, (error) => {
28
+ try {
29
+ record.reject(error);
30
+ }
31
+ finally {
32
+ try {
33
+ record.release();
34
+ }
35
+ finally {
36
+ (0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit);
37
+ }
38
+ }
39
+ });
14
40
  }
15
41
  catch (error) {
16
- record.reject(error);
42
+ try {
43
+ record.reject(error);
44
+ }
45
+ finally {
46
+ try {
47
+ record.release();
48
+ }
49
+ finally {
50
+ (0, application_job_queue_scope_1.releaseApplicationJobPermitTurn)(permit);
51
+ }
52
+ }
17
53
  }
18
54
  finally {
19
- record.release();
55
+ (0, application_job_queue_scope_1.leaveApplicationJobPermitScope)(previousPermit);
20
56
  }
21
57
  });
22
58
  }
@@ -118,6 +154,7 @@ class ZLinkChannelReceiveLoop {
118
154
  applicationJobQueue;
119
155
  roundRobin;
120
156
  applicationDispatchQueue;
157
+ receivedAtClock;
121
158
  // The loop awaits between the two reads and stop() can land in that gap.
122
159
  // Reading through a method keeps the second check honest; a field read stays
123
160
  // narrowed to false across the await and is treated as dead code.
@@ -130,7 +167,7 @@ class ZLinkChannelReceiveLoop {
130
167
  receiveOwner;
131
168
  rawReceiveReservations;
132
169
  capacityStop = new AbortController();
133
- constructor(channelName, router, dispatcher, spotRouteBridge, infrastructureHandler, poller, applicationJobQueue, reportError, roundRobin, applicationDispatchQueue = createChannelApplicationDispatchQueue()) {
170
+ constructor(channelName, router, dispatcher, spotRouteBridge, infrastructureHandler, poller, applicationJobQueue, reportError, roundRobin, applicationDispatchQueue = createChannelApplicationDispatchQueue(), receivedAtClock = () => new Date()) {
134
171
  this.channelName = channelName;
135
172
  this.router = router;
136
173
  this.dispatcher = dispatcher;
@@ -140,6 +177,7 @@ class ZLinkChannelReceiveLoop {
140
177
  this.applicationJobQueue = applicationJobQueue;
141
178
  this.roundRobin = roundRobin;
142
179
  this.applicationDispatchQueue = applicationDispatchQueue;
180
+ this.receivedAtClock = receivedAtClock;
143
181
  this.inFlight = new channel_receive_task_tracker_1.ZLinkReceiveTaskTracker(reportError);
144
182
  this.receiveOwner = roundRobin?.register() ?? Symbol('channel-receive-owner');
145
183
  this.rawReceiveReservations = new ZLinkRawReceiveReservationPool(exports.ZLINK_CHANNEL_RAW_RECEIVE_RESERVATION_LIMIT);
@@ -161,87 +199,89 @@ class ZLinkChannelReceiveLoop {
161
199
  }
162
200
  async runLoop(signal) {
163
201
  const batch = new ZLinkReceiveBatchBudget();
202
+ const rotation = this.applicationJobQueue.createReceiveRotation(RECEIVE_BATCH_MESSAGE_LIMIT, 'remote');
164
203
  const capacitySignal = signal === undefined
165
204
  ? this.capacityStop.signal
166
205
  : AbortSignal.any([signal, this.capacityStop.signal]);
167
- while (!this.isStopped() && signal?.aborted !== true) {
206
+ while (!this.isStopped() && !signalAborted(capacitySignal)) {
168
207
  if (!this.poller.wait(0)) {
169
208
  this.roundRobin?.setReady(this.receiveOwner, false);
170
- this.roundRobin?.release(this.receiveOwner);
171
- batch.reset();
172
- if (!(await this.poller.waitForReadable(capacitySignal)))
173
- break;
174
- continue;
175
- }
176
- const applicationJobPermit = await this.acquirePermit(capacitySignal);
177
- if (applicationJobPermit === undefined)
178
- break;
179
- // Readiness can become stale while admission waits. The nonblocking
180
- // recv below owns the empty-result check and returns the permit then.
181
- this.roundRobin?.setReady(this.receiveOwner, true);
182
- if (this.roundRobin?.tryAcquire(this.receiveOwner) === false) {
183
- applicationJobPermit.releaseAfterInternalProcessing();
184
- await waitReceiveLoopTurn();
185
- continue;
186
- }
187
- const releaseRawReceive = this.roundRobin === undefined
188
- ? this.rawReceiveReservations.tryAcquire()
189
- : this.roundRobin.tryAcquireRawReceiveReservation();
190
- if (releaseRawReceive === undefined) {
191
- applicationJobPermit.releaseAfterInternalProcessing();
192
- this.roundRobin?.release(this.receiveOwner);
193
- await waitReceiveLoopTurn();
194
- continue;
195
- }
196
- const received = this.router.recv(1);
197
- if (received == null) {
198
- this.poller.markDrained();
199
- applicationJobPermit.releaseAfterInternalProcessing();
200
- releaseRawReceive();
201
- this.roundRobin?.setReady(this.receiveOwner, false);
202
- this.roundRobin?.release(this.receiveOwner);
203
- batch.reset();
204
209
  if (!(await this.poller.waitForReadable(capacitySignal)))
205
210
  break;
206
211
  continue;
207
212
  }
208
- const receivedBytes = messageBytes(received.parts);
209
- let classification;
210
213
  try {
211
- classification = this.classify(received);
212
- }
213
- catch (error) {
214
- applicationJobPermit.releaseAfterInternalProcessing();
215
- releaseRawReceive();
216
- received.close();
217
- this.inFlight.track(Promise.reject(error));
218
- continue;
219
- }
220
- if (classification.kind === 'consumed') {
221
- applicationJobPermit.releaseAfterInternalProcessing();
222
- releaseRawReceive();
223
- if (classification.closeReceived)
224
- received.close();
225
- if (batch.record(receivedBytes)) {
226
- this.roundRobin?.release(this.receiveOwner);
227
- await batch.yieldAndReset();
214
+ await rotation.acquire(capacitySignal);
215
+ this.roundRobin?.setReady(this.receiveOwner, true);
216
+ if (this.roundRobin?.tryAcquire(this.receiveOwner) !== false) {
217
+ batch.reset();
218
+ while (!this.isStopped() && !signalAborted(capacitySignal)) {
219
+ const applicationJobPermit = rotation.take();
220
+ if (applicationJobPermit === undefined)
221
+ break;
222
+ const releaseRawReceive = this.roundRobin === undefined
223
+ ? this.rawReceiveReservations.tryAcquire()
224
+ : this.roundRobin.tryAcquireRawReceiveReservation();
225
+ if (releaseRawReceive === undefined) {
226
+ applicationJobPermit.releaseAfterInternalProcessing();
227
+ break;
228
+ }
229
+ try {
230
+ // Readiness can become stale during admission; recv owns no_data.
231
+ const received = this.router.recv(1);
232
+ if (received == null) {
233
+ this.poller.markDrained();
234
+ this.roundRobin?.setReady(this.receiveOwner, false);
235
+ break;
236
+ }
237
+ const receivedAt = this.receivedAtClock();
238
+ const receivedBytes = messageBytes(received.parts);
239
+ let classification;
240
+ try {
241
+ classification = this.classify(received);
242
+ }
243
+ catch (error) {
244
+ received.close();
245
+ this.inFlight.track(Promise.reject(error));
246
+ if (batch.record(receivedBytes))
247
+ break;
248
+ continue;
249
+ }
250
+ if (classification.kind === 'consumed') {
251
+ applicationJobPermit.releaseAfterInternalProcessing();
252
+ if (classification.closeReceived)
253
+ received.close();
254
+ }
255
+ else if (this.isStopped() || signalAborted(capacitySignal)) {
256
+ received.close();
257
+ break;
258
+ }
259
+ else {
260
+ applicationJobPermit.markApplicationQueued();
261
+ const task = this.applicationDispatchQueue.submitPreAdmitted(() => this.dispatchAndClose(received, signal, classification.decodedHeader, true, undefined, receivedAt), undefined, applicationJobPermit);
262
+ this.inFlight.track(task);
263
+ }
264
+ if (batch.record(receivedBytes))
265
+ break;
266
+ }
267
+ finally {
268
+ releaseRawReceive();
269
+ // A queued record owns its lease until its dispatch turn ends.
270
+ // Reserved leases (no_data, control, failure, stop) return here.
271
+ applicationJobPermit.releaseUnqueued();
272
+ }
273
+ }
228
274
  }
229
- continue;
230
275
  }
231
- if (this.isStopped() || signalAborted(signal)) {
232
- applicationJobPermit.releaseAfterInternalProcessing();
233
- releaseRawReceive();
234
- received.close();
235
- break;
276
+ catch (error) {
277
+ if (!this.isStopped() && !signalAborted(capacitySignal))
278
+ throw error;
236
279
  }
237
- applicationJobPermit.markApplicationQueued();
238
- const task = (0, application_job_queue_scope_1.runWithApplicationJobPermit)(applicationJobPermit, () => this.applicationDispatchQueue.submitPreAdmitted((0, application_job_queue_scope_1.bindApplicationJobPermit)(() => this.dispatchAndClose(received, signal, classification.decodedHeader, true))));
239
- releaseRawReceive();
240
- this.inFlight.track(task);
241
- if (batch.record(receivedBytes)) {
280
+ finally {
281
+ rotation.releaseUnused();
242
282
  this.roundRobin?.release(this.receiveOwner);
243
- await batch.yieldAndReset();
244
283
  }
284
+ await waitReceiveLoopTurn();
245
285
  }
246
286
  }
247
287
  async stop() {
@@ -256,17 +296,7 @@ class ZLinkChannelReceiveLoop {
256
296
  this.poller.dispose();
257
297
  }
258
298
  }
259
- async acquirePermit(signal) {
260
- try {
261
- return await this.applicationJobQueue.acquire(signal, 'remote');
262
- }
263
- catch (error) {
264
- if (this.isStopped() || signal.aborted)
265
- return undefined;
266
- throw error;
267
- }
268
- }
269
- async dispatchAndClose(received, signal, decodedHeader, infrastructureChecked = false, releaseRawReceive) {
299
+ async dispatchAndClose(received, signal, decodedHeader, infrastructureChecked = false, releaseRawReceive, receivedAt = this.receivedAtClock()) {
270
300
  let closeReceived = true;
271
301
  try {
272
302
  if (!infrastructureChecked) {
@@ -277,7 +307,7 @@ class ZLinkChannelReceiveLoop {
277
307
  }
278
308
  decodedHeader = classification.decodedHeader;
279
309
  }
280
- const consumed = await this.dispatcher.dispatch(received, this.router, signal, decodedHeader);
310
+ const consumed = await this.dispatcher.dispatch(received, this.router, signal, decodedHeader, receivedAt);
281
311
  if (consumed === true) {
282
312
  closeReceived = false;
283
313
  }
@@ -310,6 +340,7 @@ class ZLinkSubscriberReceiveLoop {
310
340
  infrastructureHandler;
311
341
  roundRobin;
312
342
  applicationDispatchQueue;
343
+ receivedAtClock;
313
344
  // The loop awaits between the two reads and stop() can land in that gap.
314
345
  // Reading through a method keeps the second check honest; a field read stays
315
346
  // narrowed to false across the await and is treated as dead code.
@@ -322,7 +353,7 @@ class ZLinkSubscriberReceiveLoop {
322
353
  receiveOwner;
323
354
  rawReceiveReservations;
324
355
  capacityStop = new AbortController();
325
- constructor(adapter, subscriber, dispatcher, applicationJobQueue, infrastructureHandler, roundRobin, reportError, applicationDispatchQueue = createChannelApplicationDispatchQueue()) {
356
+ constructor(adapter, subscriber, dispatcher, applicationJobQueue, infrastructureHandler, roundRobin, reportError, applicationDispatchQueue = createChannelApplicationDispatchQueue(), receivedAtClock = () => new Date()) {
326
357
  this.adapter = adapter;
327
358
  this.subscriber = subscriber;
328
359
  this.dispatcher = dispatcher;
@@ -330,6 +361,7 @@ class ZLinkSubscriberReceiveLoop {
330
361
  this.infrastructureHandler = infrastructureHandler;
331
362
  this.roundRobin = roundRobin;
332
363
  this.applicationDispatchQueue = applicationDispatchQueue;
364
+ this.receivedAtClock = receivedAtClock;
333
365
  this.inFlight = new channel_receive_task_tracker_1.ZLinkReceiveTaskTracker(reportError);
334
366
  this.poller = adapter.createReadablePoller(subscriber);
335
367
  this.receiveOwner = roundRobin?.register() ?? Symbol('subscriber-receive-owner');
@@ -396,6 +428,7 @@ class ZLinkSubscriberReceiveLoop {
396
428
  break;
397
429
  continue;
398
430
  }
431
+ const receivedAt = this.receivedAtClock();
399
432
  const receivedBytes = messageBytes(topicMessage.parts);
400
433
  let classification;
401
434
  try {
@@ -425,7 +458,7 @@ class ZLinkSubscriberReceiveLoop {
425
458
  break;
426
459
  }
427
460
  applicationJobPermit.markApplicationQueued();
428
- const task = (0, application_job_queue_scope_1.runWithApplicationJobPermit)(applicationJobPermit, () => this.applicationDispatchQueue.submitPreAdmitted((0, application_job_queue_scope_1.bindApplicationJobPermit)(() => this.dispatchAndClose(topicMessage, signal, classification.decodedHeader, true))));
461
+ const task = this.applicationDispatchQueue.submitPreAdmitted(() => this.dispatchAndClose(topicMessage, signal, classification.decodedHeader, true, undefined, receivedAt), undefined, applicationJobPermit);
429
462
  releaseRawReceive();
430
463
  this.inFlight.track(task);
431
464
  if (batch.record(receivedBytes)) {
@@ -456,7 +489,7 @@ class ZLinkSubscriberReceiveLoop {
456
489
  throw error;
457
490
  }
458
491
  }
459
- async dispatchAndClose(topicMessage, signal, decodedHeader, infrastructureChecked = false, releaseRawReceive) {
492
+ async dispatchAndClose(topicMessage, signal, decodedHeader, infrastructureChecked = false, releaseRawReceive, receivedAt = this.receivedAtClock()) {
460
493
  try {
461
494
  if (!infrastructureChecked) {
462
495
  const classification = this.classify(topicMessage);
@@ -464,7 +497,7 @@ class ZLinkSubscriberReceiveLoop {
464
497
  return;
465
498
  decodedHeader = classification.decodedHeader;
466
499
  }
467
- await this.dispatcher.dispatch(topicMessage, signal, decodedHeader);
500
+ await this.dispatcher.dispatch(topicMessage, signal, decodedHeader, receivedAt);
468
501
  }
469
502
  finally {
470
503
  releaseRawReceive?.();
@@ -489,6 +522,7 @@ class ZLinkRouteReceiveLoop {
489
522
  applicationJobQueue;
490
523
  roundRobin;
491
524
  applicationDispatchQueue;
525
+ receivedAtClock;
492
526
  // The loop awaits between the two reads and stop() can land in that gap.
493
527
  // Reading through a method keeps the second check honest; a field read stays
494
528
  // narrowed to false across the await and is treated as dead code.
@@ -501,13 +535,14 @@ class ZLinkRouteReceiveLoop {
501
535
  receiveOwner;
502
536
  rawReceiveReservations;
503
537
  capacityStop = new AbortController();
504
- constructor(router, dispatcher, poller, applicationJobQueue, roundRobin, reportError, applicationDispatchQueue = createChannelApplicationDispatchQueue()) {
538
+ constructor(router, dispatcher, poller, applicationJobQueue, roundRobin, reportError, applicationDispatchQueue = createChannelApplicationDispatchQueue(), receivedAtClock = () => new Date()) {
505
539
  this.router = router;
506
540
  this.dispatcher = dispatcher;
507
541
  this.poller = poller;
508
542
  this.applicationJobQueue = applicationJobQueue;
509
543
  this.roundRobin = roundRobin;
510
544
  this.applicationDispatchQueue = applicationDispatchQueue;
545
+ this.receivedAtClock = receivedAtClock;
511
546
  this.inFlight = new channel_receive_task_tracker_1.ZLinkReceiveTaskTracker(reportError);
512
547
  this.receiveOwner = roundRobin?.register() ?? Symbol('route-receive-owner');
513
548
  this.rawReceiveReservations = new ZLinkRawReceiveReservationPool(exports.ZLINK_CHANNEL_RAW_RECEIVE_RESERVATION_LIMIT);
@@ -565,6 +600,7 @@ class ZLinkRouteReceiveLoop {
565
600
  break;
566
601
  continue;
567
602
  }
603
+ const receivedAt = this.receivedAtClock();
568
604
  const receivedBytes = messageBytes(received.parts);
569
605
  let infrastructure;
570
606
  try {
@@ -617,7 +653,7 @@ class ZLinkRouteReceiveLoop {
617
653
  break;
618
654
  }
619
655
  applicationJobPermit.markApplicationQueued();
620
- const task = (0, application_job_queue_scope_1.runWithApplicationJobPermit)(applicationJobPermit, () => this.applicationDispatchQueue.submitPreAdmitted((0, application_job_queue_scope_1.bindApplicationJobPermit)(() => this.dispatchAndClose(received, signal, true))));
656
+ const task = this.applicationDispatchQueue.submitPreAdmitted(() => this.dispatchAndClose(received, signal, true, undefined, receivedAt), undefined, applicationJobPermit);
621
657
  releaseRawReceive();
622
658
  this.inFlight.track(task);
623
659
  if (batch.record(receivedBytes)) {
@@ -648,10 +684,10 @@ class ZLinkRouteReceiveLoop {
648
684
  throw error;
649
685
  }
650
686
  }
651
- async dispatchAndClose(received, signal, infrastructureChecked = false, releaseRawReceive) {
687
+ async dispatchAndClose(received, signal, infrastructureChecked = false, releaseRawReceive, receivedAt = this.receivedAtClock()) {
652
688
  let closeReceived = true;
653
689
  try {
654
- const consumed = await this.dispatcher.dispatch(received, this.router, signal, (0, channel_envelope_inspection_1.tryDecodeChannelHeader)(received.parts, this.dispatcher.flowEnabled?.() ?? true), infrastructureChecked);
690
+ const consumed = await this.dispatcher.dispatch(received, this.router, signal, (0, channel_envelope_inspection_1.tryDecodeChannelHeader)(received.parts, this.dispatcher.flowEnabled?.() ?? true), infrastructureChecked, receivedAt);
655
691
  if (consumed === true) {
656
692
  closeReceived = false;
657
693
  }
@@ -7,12 +7,30 @@ import { ZLinkLocationRuntime, type ZLinkLocationEventSink, type ZLinkLocationRu
7
7
  import type { Message } from '../../contracts/Common/Message';
8
8
  import type { ReceiveRecord } from '../foundation/service-runtime-contracts';
9
9
  import type { RoutingId } from '../../contracts';
10
- import { type ZLinkRouteRuntimeRequestHandler, type ZLinkRouteRuntimeSendHandler } from './channel-dispatchers';
10
+ import { ZLinkChannelPublishDispatcher, type ZLinkRouteRuntimeRequestHandler, type ZLinkRouteRuntimeSendHandler } from './channel-dispatchers';
11
+ import { ZLinkSubscriberReceiveLoop } from './channel-receive-loops';
11
12
  import { ZLinkChannelDispatchServices } from './channel-dispatch-services';
12
13
  import type { ZLinkChannelEnvelopeCodecRegistry } from './channel-envelope';
13
14
  import { ZLinkChannelSocketRegistry } from './channel-socket-registry';
14
15
  import { ZLinkSpotRouteDispatchStrategy } from './spot-route-dispatch-strategy';
15
16
  import type { ApplicationJobQueue } from '../host/application-job-queue';
17
+ interface ManualFanoutSubscriberState {
18
+ readonly channelName: string;
19
+ readonly endpoint: string;
20
+ readonly index: number;
21
+ readonly connectionId: string;
22
+ readonly taskRunner: ZLinkRuntimeTaskRunner;
23
+ readonly dispatcher: ZLinkChannelPublishDispatcher;
24
+ desired: boolean;
25
+ transition: Promise<void>;
26
+ openingToken?: symbol;
27
+ active?: ManualFanoutSubscriberActive;
28
+ stopping?: ManualFanoutSubscriberActive;
29
+ }
30
+ interface ManualFanoutSubscriberActive {
31
+ readonly token: symbol;
32
+ readonly loop: ZLinkSubscriberReceiveLoop;
33
+ }
16
34
  export interface ZLinkChannelRuntimeLifecycleOptions {
17
35
  readonly registration: ZLinkFrameworkRegistration;
18
36
  readonly adapter: ZLinkChannelBackendAdapter;
@@ -31,10 +49,9 @@ export declare class ZLinkChannelRuntimeLifecycle {
31
49
  private readonly receiveRoundRobin;
32
50
  private readonly channelReceiveLoops;
33
51
  private readonly subscriberReceiveLoops;
34
- private readonly manualFanoutSubscribers;
52
+ readonly manualFanoutSubscribers: Map<string, ManualFanoutSubscriberState>;
35
53
  private readonly manualFanoutSubscriberOwners;
36
54
  private readonly routeReceiveLoops;
37
- private readonly applicationDispatchQueues;
38
55
  private readonly meshChannelDispatchers;
39
56
  private readonly meshRouteDispatchers;
40
57
  private nextManualFanoutIndex;
@@ -50,7 +67,7 @@ export declare class ZLinkChannelRuntimeLifecycle {
50
67
  lifecycleGeneration: bigint;
51
68
  descriptorRevision: bigint;
52
69
  advertisedEndpoint: string;
53
- state: "error" | "preparing" | "serving" | "stopped" | "retiring";
70
+ state: "error" | "preparing" | "serving" | "retiring" | "stopped";
54
71
  }[] | undefined;
55
72
  configureLocationAutoConnect(runtime: ZLinkLocationRuntime, stores: ZLinkLocationRuntimeStores, options: ZLinkLocationOptionOverrides, events?: ZLinkLocationEventSink): void;
56
73
  private beginLocationAutoConnectCore;
@@ -68,12 +85,11 @@ export declare class ZLinkChannelRuntimeLifecycle {
68
85
  dispose(signal?: AbortSignal): Promise<void>;
69
86
  private disposeCore;
70
87
  private beginDisposeCore;
71
- private applicationDispatchQueue;
72
88
  private openOutboundSockets;
73
89
  private startChannelReceivers;
74
90
  private startSubscriberReceivers;
75
91
  private getOrCreateManualFanoutSubscriber;
76
- private requestManualFanoutConnect;
92
+ requestManualFanoutConnect(channelName: string, endpoint: string, taskRunner: ZLinkRuntimeTaskRunner, dispatcher: ZLinkChannelPublishDispatcher): void;
77
93
  private requestManualFanoutDisconnect;
78
94
  private enqueueManualFanoutTransition;
79
95
  private openManualFanoutSubscriber;
@@ -87,3 +103,4 @@ export declare class ZLinkChannelRuntimeLifecycle {
87
103
  private startRouteReceivers;
88
104
  private createSpotRouteBridgeForRouter;
89
105
  }
106
+ export {};
@@ -20,7 +20,6 @@ class ZLinkChannelRuntimeLifecycle {
20
20
  manualFanoutSubscribers = new Map();
21
21
  manualFanoutSubscriberOwners = new Set();
22
22
  routeReceiveLoops = [];
23
- applicationDispatchQueues = new Map();
24
23
  meshChannelDispatchers = new Map();
25
24
  meshRouteDispatchers = new Map();
26
25
  nextManualFanoutIndex = 0;
@@ -120,11 +119,13 @@ class ZLinkChannelRuntimeLifecycle {
120
119
  ...(mesh.routeSendHandlers ?? []).map((registration) => ({
121
120
  kind: 'send',
122
121
  packetName: registration.packetName,
122
+ messageType: registration.messageType,
123
123
  handler: this.options.dispatchServices.routeSendHandler(registration.handlerType)
124
124
  })),
125
125
  ...(mesh.routeRequestHandlers ?? []).map((registration) => ({
126
126
  kind: 'request',
127
127
  packetName: registration.packetName,
128
+ messageType: registration.messageType,
128
129
  handler: this.options.dispatchServices.routeRequestHandler(registration.handlerType)
129
130
  })),
130
131
  ...[...(this.options.internalRouteSendHandlers?.entries() ?? [])].map(([packetName, handler]) => ({
@@ -159,17 +160,28 @@ class ZLinkChannelRuntimeLifecycle {
159
160
  routeMesh: true,
160
161
  codecs: this.options.codecs,
161
162
  dispatchErrors: this.options.dispatchServices.dispatchErrorReporter(taskRunner.errorSink),
162
- handlers: new Map(channel.requestHandlers?.map((handler) => [
163
- handler.packetName,
164
- handler.handler ??
165
- adaptRouteRequestHandler(this.options.dispatchServices.routeRequestHandler(handler.handlerType))
166
- ])),
167
- sendHandlers: new Map(channel.sendHandlers?.map((handler) => [
168
- handler.packetName,
169
- handler
170
- .handler ??
171
- adaptRouteSendHandler(this.options.dispatchServices.routeSendHandler(handler.handlerType))
172
- ])),
163
+ handlers: new Map(channel.requestHandlers?.map((handler) => {
164
+ const configuredHandler = handler.handler;
165
+ return [
166
+ handler.packetName,
167
+ {
168
+ messageType: handler.messageType,
169
+ handler: configuredHandler ??
170
+ adaptRouteRequestHandler(this.options.dispatchServices.routeRequestHandler(handler.handlerType))
171
+ }
172
+ ];
173
+ })),
174
+ sendHandlers: new Map(channel.sendHandlers?.map((handler) => {
175
+ const configuredHandler = handler.handler;
176
+ return [
177
+ handler.packetName,
178
+ {
179
+ messageType: handler.messageType,
180
+ handler: configuredHandler ??
181
+ adaptRouteSendHandler(this.options.dispatchServices.routeSendHandler(handler.handlerType))
182
+ }
183
+ ];
184
+ })),
173
185
  filters: this.options.dispatchServices.handlerFilters(),
174
186
  unhandled: this.options.registration.dispatch?.unhandled
175
187
  }));
@@ -215,7 +227,6 @@ class ZLinkChannelRuntimeLifecycle {
215
227
  ...work.routeLoops.map((loop) => loop.stop()),
216
228
  ...work.manualTransitions
217
229
  ]));
218
- const applicationStopped = await (0, state_lane_1.startOutsideStateLane)(() => Promise.allSettled(work.applicationDispatchQueues.map((queue) => queue.close())));
219
230
  const descriptorStopped = work.clientServerLocation === undefined
220
231
  ? []
221
232
  : await (0, state_lane_1.startOutsideStateLane)(() => Promise.allSettled([work.clientServerLocation?.stop(signal)]));
@@ -228,7 +239,6 @@ class ZLinkChannelRuntimeLifecycle {
228
239
  ]));
229
240
  const errors = [
230
241
  ...transportStopped,
231
- ...applicationStopped,
232
242
  ...descriptorStopped,
233
243
  ...fanoutDescriptorStopped,
234
244
  ...cleanup
@@ -245,7 +255,6 @@ class ZLinkChannelRuntimeLifecycle {
245
255
  this.channelReceiveLoops.length = 0;
246
256
  this.subscriberReceiveLoops.length = 0;
247
257
  this.routeReceiveLoops.length = 0;
248
- this.applicationDispatchQueues.clear();
249
258
  this.clientServerLocation = undefined;
250
259
  this.fanoutLocation = undefined;
251
260
  this.taskRunner = undefined;
@@ -268,7 +277,6 @@ class ZLinkChannelRuntimeLifecycle {
268
277
  const subscriberLoops = [...this.subscriberReceiveLoops].filter((loop) => !manualLoops.has(loop));
269
278
  const manualTransitions = manualStates.map((state) => this.drainManualFanoutSubscriberCore(state));
270
279
  const routeLoops = [...this.routeReceiveLoops];
271
- const applicationDispatchQueues = [...this.applicationDispatchQueues.values()];
272
280
  const clientServerLocation = this.clientServerLocation;
273
281
  const fanoutLocation = this.fanoutLocation;
274
282
  const spotRouteBridges = [...this.options.spotRouteBridges.values()];
@@ -277,20 +285,11 @@ class ZLinkChannelRuntimeLifecycle {
277
285
  subscriberLoops,
278
286
  manualTransitions,
279
287
  routeLoops,
280
- applicationDispatchQueues,
281
288
  clientServerLocation,
282
289
  fanoutLocation,
283
290
  spotRouteBridges
284
291
  };
285
292
  }
286
- applicationDispatchQueue(channelName) {
287
- let queue = this.applicationDispatchQueues.get(channelName);
288
- if (queue === undefined) {
289
- queue = (0, channel_receive_loops_1.createChannelApplicationDispatchQueue)();
290
- this.applicationDispatchQueues.set(channelName, queue);
291
- }
292
- return queue;
293
- }
294
293
  openOutboundSockets() {
295
294
  // The process-local Server is an independent peer source. Location Store
296
295
  // discovery may later alias the same admitted identity, but startup and
@@ -318,20 +317,26 @@ class ZLinkChannelRuntimeLifecycle {
318
317
  dispatchErrors: this.options.dispatchServices.dispatchErrorReporter(taskRunner.errorSink),
319
318
  handlers: new Map(channel.requestHandlers?.map((handler) => [
320
319
  handler.packetName,
321
- handler.handler ??
322
- this.options.dispatchServices.channelRequestHandler(requireChannelHandlerType(handler.handlerType, channelName, handler.packetName))
320
+ {
321
+ messageType: handler.messageType,
322
+ handler: handler.handler ??
323
+ this.options.dispatchServices.channelRequestHandler(requireChannelHandlerType(handler.handlerType, channelName, handler.packetName))
324
+ }
323
325
  ])),
324
326
  sendHandlers: new Map(channel.sendHandlers?.map((handler) => [
325
327
  handler.packetName,
326
- handler.handler ??
327
- this.options.dispatchServices.channelSendHandler(requireChannelHandlerType(handler.handlerType, channelName, handler.packetName))
328
+ {
329
+ messageType: handler.messageType,
330
+ handler: handler.handler ??
331
+ this.options.dispatchServices.channelSendHandler(requireChannelHandlerType(handler.handlerType, channelName, handler.packetName))
332
+ }
328
333
  ])),
329
334
  filters: this.options.dispatchServices.handlerFilters(),
330
335
  unhandled: this.options.registration.dispatch?.unhandled
331
336
  });
332
337
  const spotRouteBridge = this.createSpotRouteBridgeForRouter(channelName, router);
333
338
  const serverPeers = this.options.sockets.clientServerServerPeersForChannel(channelName);
334
- const loop = new channel_receive_loops_1.ZLinkChannelReceiveLoop(channelName, router, dispatcher, spotRouteBridge, (received, socket) => this.options.sockets.tryHandleClientServerControl(channelName, received, socket, serverPeers), this.options.adapter.createReadablePoller(router), this.options.applicationJobQueue, (error) => taskRunner.errorSink.reportRuntimeTaskException(`channel:${channelName}:dispatch`, error), this.receiveRoundRobin, this.applicationDispatchQueue(channelName));
339
+ const loop = new channel_receive_loops_1.ZLinkChannelReceiveLoop(channelName, router, dispatcher, spotRouteBridge, (received, socket) => this.options.sockets.tryHandleClientServerControl(channelName, received, socket, serverPeers), this.options.adapter.createReadablePoller(router), this.options.applicationJobQueue, (error) => taskRunner.errorSink.reportRuntimeTaskException(`channel:${channelName}:dispatch`, error), this.receiveRoundRobin);
335
340
  this.channelReceiveLoops.push(loop);
336
341
  tasks.push(taskRunner.run(`channel:${channelName}`, (signal) => loop.run(signal)));
337
342
  }
@@ -350,7 +355,10 @@ class ZLinkChannelRuntimeLifecycle {
350
355
  channelName,
351
356
  codecs: this.options.codecs,
352
357
  dispatchErrors: this.options.dispatchServices.dispatchErrorReporter(taskRunner.errorSink),
353
- handlers: new Map(channel.publishHandlers?.map((handler) => [handler.packetName, handler.handler])),
358
+ handlers: new Map(channel.publishHandlers?.map((handler) => [
359
+ handler.packetName,
360
+ { handler: handler.handler, messageType: handler.messageType }
361
+ ])),
354
362
  filters: this.options.dispatchServices.handlerFilters(),
355
363
  unhandled: this.options.registration.dispatch?.unhandled,
356
364
  metrics: this.options.dispatchServices.metrics()
@@ -463,7 +471,7 @@ class ZLinkChannelRuntimeLifecycle {
463
471
  });
464
472
  }
465
473
  });
466
- loop = new channel_receive_loops_1.ZLinkSubscriberReceiveLoop(this.options.adapter, subscriber, dispatcher, this.options.applicationJobQueue, (message) => this.options.sockets.handleFanoutInboundResult(connectionId, message, subscriber), this.receiveRoundRobin, (error) => taskRunner.errorSink.reportRuntimeTaskException(`subscriber:${state.channelName}:manual:${state.index}:dispatch`, error), this.applicationDispatchQueue(channelName));
474
+ loop = new channel_receive_loops_1.ZLinkSubscriberReceiveLoop(this.options.adapter, subscriber, dispatcher, this.options.applicationJobQueue, (message) => this.options.sockets.handleFanoutInboundResult(connectionId, message, subscriber), this.receiveRoundRobin, (error) => taskRunner.errorSink.reportRuntimeTaskException(`subscriber:${state.channelName}:manual:${state.index}:dispatch`, error));
467
475
  state.openingToken = undefined;
468
476
  state.active = { token, loop };
469
477
  this.subscriberReceiveLoops.push(loop);
@@ -535,12 +543,15 @@ class ZLinkChannelRuntimeLifecycle {
535
543
  channelName,
536
544
  codecs: this.options.codecs,
537
545
  dispatchErrors: this.options.dispatchServices.dispatchErrorReporter(taskRunner.errorSink),
538
- handlers: new Map(channel.publishHandlers?.map((handler) => [handler.packetName, handler.handler])),
546
+ handlers: new Map(channel.publishHandlers?.map((handler) => [
547
+ handler.packetName,
548
+ { handler: handler.handler, messageType: handler.messageType }
549
+ ])),
539
550
  filters: this.options.dispatchServices.handlerFilters(),
540
551
  unhandled: this.options.registration.dispatch?.unhandled,
541
552
  metrics: this.options.dispatchServices.metrics()
542
553
  });
543
- const loop = new channel_receive_loops_1.ZLinkSubscriberReceiveLoop(this.options.adapter, subscriber, dispatcher, this.options.applicationJobQueue, (message) => this.options.sockets.handleFanoutInboundResult(connectionId, message, subscriber), undefined, (error) => taskRunner.errorSink.reportRuntimeTaskException(`subscriber:${channelName}:automatic:${connectionId}:dispatch`, error), this.applicationDispatchQueue(channelName));
554
+ const loop = new channel_receive_loops_1.ZLinkSubscriberReceiveLoop(this.options.adapter, subscriber, dispatcher, this.options.applicationJobQueue, (message) => this.options.sockets.handleFanoutInboundResult(connectionId, message, subscriber), undefined, (error) => taskRunner.errorSink.reportRuntimeTaskException(`subscriber:${channelName}:automatic:${connectionId}:dispatch`, error));
544
555
  this.subscriberReceiveLoops.push(loop);
545
556
  void taskRunner.run(`subscriber:${channelName}:automatic:${connectionId}`, (signal) => loop.run(signal));
546
557
  return async () => {
@@ -586,7 +597,7 @@ class ZLinkChannelRuntimeLifecycle {
586
597
  unhandled: this.options.registration.dispatch?.unhandled,
587
598
  spotRouteBridge
588
599
  });
589
- const loop = new channel_receive_loops_1.ZLinkRouteReceiveLoop(router, dispatcher, this.options.adapter.createReadablePoller(router), this.options.applicationJobQueue, this.receiveRoundRobin, (error) => taskRunner.errorSink.reportRuntimeTaskException(`route:${routeChannel.routerChannelId}:dispatch`, error), this.applicationDispatchQueue(routeChannel.routerChannelId));
600
+ const loop = new channel_receive_loops_1.ZLinkRouteReceiveLoop(router, dispatcher, this.options.adapter.createReadablePoller(router), this.options.applicationJobQueue, this.receiveRoundRobin, (error) => taskRunner.errorSink.reportRuntimeTaskException(`route:${routeChannel.routerChannelId}:dispatch`, error));
590
601
  this.routeReceiveLoops.push(loop);
591
602
  tasks.push(taskRunner.run(`route:${routeChannel.routerChannelId}`, (signal) => loop.run(signal)));
592
603
  }
@@ -607,9 +618,7 @@ class ZLinkChannelRuntimeLifecycle {
607
618
  }
608
619
  exports.ZLinkChannelRuntimeLifecycle = ZLinkChannelRuntimeLifecycle;
609
620
  function adaptRouteRequestHandler(handler) {
610
- return {
611
- handle: async (payload, context) => handler.handle(payload, context)
612
- };
621
+ return { handle: async (payload, context) => handler.handle(payload, context) };
613
622
  }
614
623
  function adaptRouteSendHandler(handler) {
615
624
  return {