@zlink-systems/framework 0.30.0 → 0.30.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/LICENSE +150 -68
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/contracts/Actors/ZLinkActorClient.d.ts +2 -1
  4. package/dist/contracts/Channels/Calls.d.ts +2 -1
  5. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
  6. package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
  7. package/dist/contracts/Common/ZLinkMessageMetadata.js +11 -5
  8. package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
  9. package/dist/contracts/Common/encoded-payload-storage.js +5 -2
  10. package/dist/contracts/Configuration/Builders.d.ts +1 -1
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
  12. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
  13. package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
  14. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  15. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
  16. package/dist/contracts/Handlers/Attributes.d.ts +5 -13
  17. package/dist/contracts/Handlers/Attributes.js +7 -11
  18. package/dist/contracts/Handlers/JsonContract.d.ts +2 -46
  19. package/dist/contracts/Handlers/JsonContract.js +4 -153
  20. package/dist/contracts/Locations/Rows.d.ts +2 -0
  21. package/dist/contracts/Spots/Contracts.d.ts +6 -1
  22. package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
  23. package/dist/nest-integration.d.ts +1 -1
  24. package/dist/nest-integration.js +2 -1
  25. package/dist/runtime/abort.d.ts +5 -0
  26. package/dist/runtime/abort.js +10 -0
  27. package/dist/runtime/actors/actor-authority-publication.js +3 -2
  28. package/dist/runtime/actors/actor-client.d.ts +1 -2
  29. package/dist/runtime/actors/actor-client.js +52 -57
  30. package/dist/runtime/actors/actor-context.d.ts +2 -0
  31. package/dist/runtime/actors/actor-context.js +46 -9
  32. package/dist/runtime/actors/actor-handoff.d.ts +8 -4
  33. package/dist/runtime/actors/actor-handoff.js +219 -92
  34. package/dist/runtime/actors/actor-join-relocation.d.ts +3 -0
  35. package/dist/runtime/actors/actor-local-native-join.js +13 -12
  36. package/dist/runtime/actors/actor-mailbox.js +27 -1
  37. package/dist/runtime/actors/actor-remote-joiner.js +3 -1
  38. package/dist/runtime/actors/actor-remote-wire.js +15 -0
  39. package/dist/runtime/actors/actor-reply.d.ts +4 -0
  40. package/dist/runtime/actors/actor-reply.js +29 -0
  41. package/dist/runtime/actors/actor-routed-join-transport.d.ts +6 -2
  42. package/dist/runtime/actors/actor-routed-json-request.d.ts +2 -0
  43. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
  44. package/dist/runtime/actors/actor-runtime-state.js +2 -20
  45. package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
  46. package/dist/runtime/actors/index.d.ts +8 -3
  47. package/dist/runtime/actors/index.js +55 -27
  48. package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
  49. package/dist/runtime/actors/session-disconnected-wire.js +48 -0
  50. package/dist/runtime/actors/spot-actor-dispatch.js +2 -2
  51. package/dist/runtime/admission.d.ts +9 -1
  52. package/dist/runtime/admission.js +56 -23
  53. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +6 -8
  54. package/dist/runtime/application-jobs/application-ingress-record-owner.js +39 -22
  55. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +15 -1
  56. package/dist/runtime/application-jobs/application-job-queue-scope.js +61 -20
  57. package/dist/runtime/application-jobs/contracts.d.ts +12 -1
  58. package/dist/runtime/backend/contracts/index.d.ts +37 -12
  59. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
  60. package/dist/runtime/backend/mesh-completion-table.d.ts +9 -1
  61. package/dist/runtime/backend/mesh-completion-table.js +154 -49
  62. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +28 -1
  63. package/dist/runtime/backend/mesh-dispatch-pump.js +208 -101
  64. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +2 -2
  65. package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -9
  66. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +1 -1
  67. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +5 -2
  68. package/dist/runtime/backend/node/node-raw-binding-port.js +124 -72
  69. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +46 -13
  70. package/dist/runtime/backend/node/node-raw-mesh-backend.js +181 -164
  71. package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
  72. package/dist/runtime/backend/node/node-socket-backend-adapter.js +11 -11
  73. package/dist/runtime/backend/raw-binding-port.d.ts +2 -2
  74. package/dist/runtime/backend/runtime-message.d.ts +1 -0
  75. package/dist/runtime/backend/runtime-message.js +5 -0
  76. package/dist/runtime/backend/runtime-values.d.ts +1 -0
  77. package/dist/runtime/backend/runtime-values.js +2 -1
  78. package/dist/runtime/channels/channel-clients.d.ts +2 -0
  79. package/dist/runtime/channels/channel-clients.js +75 -23
  80. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +25 -5
  81. package/dist/runtime/channels/channel-dispatch-pipeline.js +111 -56
  82. package/dist/runtime/channels/channel-dispatch-services.d.ts +1 -0
  83. package/dist/runtime/channels/channel-dispatch-services.js +45 -0
  84. package/dist/runtime/channels/channel-dispatchers.d.ts +4 -3
  85. package/dist/runtime/channels/channel-dispatchers.js +62 -54
  86. package/dist/runtime/channels/channel-envelope-inspection.d.ts +1 -2
  87. package/dist/runtime/channels/channel-envelope-inspection.js +1 -16
  88. package/dist/runtime/channels/channel-envelope.d.ts +2 -0
  89. package/dist/runtime/channels/channel-envelope.js +146 -28
  90. package/dist/runtime/channels/channel-outbound-operations.d.ts +2 -2
  91. package/dist/runtime/channels/channel-outbound-operations.js +8 -8
  92. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
  93. package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
  94. package/dist/runtime/channels/channel-runtime-manager.d.ts +9 -8
  95. package/dist/runtime/channels/channel-runtime-manager.js +16 -16
  96. package/dist/runtime/channels/channel-transports.d.ts +18 -16
  97. package/dist/runtime/channels/channel-transports.js +77 -58
  98. package/dist/runtime/channels/client-server-location-runtime.js +5 -4
  99. package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
  100. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  101. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  102. package/dist/runtime/channels/fanout-location-runtime.js +3 -3
  103. package/dist/runtime/channels/local-spot-route-transport.d.ts +1 -1
  104. package/dist/runtime/channels/local-spot-route-transport.js +2 -1
  105. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +2 -2
  106. package/dist/runtime/channels/router-socket-spot-route-transport.js +4 -4
  107. package/dist/runtime/channels/source-spot-router.d.ts +2 -2
  108. package/dist/runtime/channels/source-spot-router.js +4 -4
  109. package/dist/runtime/channels/spot-node-route-transport.d.ts +2 -2
  110. package/dist/runtime/channels/spot-node-route-transport.js +4 -4
  111. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +2 -2
  112. package/dist/runtime/channels/spot-route-bridge-transport.js +4 -4
  113. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +5 -4
  114. package/dist/runtime/channels/spot-route-dispatch-strategy.js +18 -18
  115. package/dist/runtime/diagnostics/flow-context.js +19 -7
  116. package/dist/runtime/diagnostics/index.js +4 -9
  117. package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
  118. package/dist/runtime/diagnostics/message-flow.js +35 -5
  119. package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
  120. package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
  121. package/dist/runtime/execution/index.d.ts +4 -2
  122. package/dist/runtime/execution/index.js +33 -10
  123. package/dist/runtime/execution/serial-execution-queue.d.ts +5 -0
  124. package/dist/runtime/execution/serial-execution-queue.js +22 -2
  125. package/dist/runtime/execution/state-lane.d.ts +2 -0
  126. package/dist/runtime/execution/state-lane.js +5 -0
  127. package/dist/runtime/foundation/actor-join-recovery-codec.js +2 -2
  128. package/dist/runtime/foundation/durable-service-request.d.ts +14 -0
  129. package/dist/runtime/foundation/durable-service-request.js +98 -0
  130. package/dist/runtime/foundation/operation-identity.d.ts +1 -0
  131. package/dist/runtime/foundation/operation-identity.js +5 -1
  132. package/dist/runtime/foundation/operation-registry.d.ts +25 -1
  133. package/dist/runtime/foundation/operation-registry.js +86 -18
  134. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +61 -8
  135. package/dist/runtime/foundation/raw-service-mesh-runtime.js +486 -266
  136. package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
  137. package/dist/runtime/foundation/service-liveness-registry.js +38 -0
  138. package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
  139. package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
  140. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +3 -3
  141. package/dist/runtime/foundation/service-relocation-object-owner.js +48 -34
  142. package/dist/runtime/foundation/service-relocation-runtime.d.ts +2 -0
  143. package/dist/runtime/foundation/service-relocation-runtime.js +20 -4
  144. package/dist/runtime/foundation/service-runtime-contracts.d.ts +10 -1
  145. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
  146. package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
  147. package/dist/runtime/foundation/service-stateful-registry.js +24 -26
  148. package/dist/runtime/foundation/service-stateful-runtime.d.ts +75 -9
  149. package/dist/runtime/foundation/service-stateful-runtime.js +486 -218
  150. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -6
  151. package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
  152. package/dist/runtime/foundation/service-topology-registry.d.ts +12 -2
  153. package/dist/runtime/foundation/service-topology-registry.js +61 -27
  154. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
  155. package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
  156. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  157. package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
  158. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +13 -3
  159. package/dist/runtime/foundation/service-wire-m6a-codec.js +189 -78
  160. package/dist/runtime/handlers/handler-instance-scope.d.ts +8 -0
  161. package/dist/runtime/handlers/handler-instance-scope.js +54 -11
  162. package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
  163. package/dist/runtime/host/actor-packet-relay.js +59 -72
  164. package/dist/runtime/host/actor-placement-coordinator.js +25 -8
  165. package/dist/runtime/host/actor-runtime-options-factory.js +2 -2
  166. package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
  167. package/dist/runtime/host/actor-transfer-runtime.js +85 -331
  168. package/dist/runtime/host/application-job-queue.d.ts +40 -7
  169. package/dist/runtime/host/application-job-queue.js +137 -42
  170. package/dist/runtime/host/entry-actor-runtime.d.ts +1 -0
  171. package/dist/runtime/host/entry-actor-runtime.js +3 -0
  172. package/dist/runtime/host/index.d.ts +12 -2
  173. package/dist/runtime/host/index.js +300 -202
  174. package/dist/runtime/host/location-runtime-owner.js +2 -6
  175. package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
  176. package/dist/runtime/host/mesh-router-resolver.js +14 -6
  177. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
  178. package/dist/runtime/host/remote-bound-session-relay.js +73 -208
  179. package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
  180. package/dist/runtime/host/route-mesh-runtime.js +6 -4
  181. package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
  182. package/dist/runtime/host/runtime-shutdown.js +3 -2
  183. package/dist/runtime/host/service-relocation-control.d.ts +1 -0
  184. package/dist/runtime/host/service-relocation-control.js +10 -4
  185. package/dist/runtime/host/service-relocation-host-runtime.d.ts +22 -14
  186. package/dist/runtime/host/service-relocation-host-runtime.js +754 -599
  187. package/dist/runtime/host/spot-address-transport.js +3 -2
  188. package/dist/runtime/host/spot-runtime-options-factory.js +16 -7
  189. package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
  190. package/dist/runtime/locations/actor-location-claims.d.ts +2 -2
  191. package/dist/runtime/locations/actor-location-claims.js +34 -19
  192. package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
  193. package/dist/runtime/locations/auto-connect-loop.js +22 -14
  194. package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
  195. package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
  196. package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
  197. package/dist/runtime/locations/descriptor-publication.js +11 -0
  198. package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
  199. package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
  200. package/dist/runtime/locations/in-memory-authority-store.js +56 -19
  201. package/dist/runtime/locations/in-memory-location-store.js +1 -10
  202. package/dist/runtime/locations/index.d.ts +1 -0
  203. package/dist/runtime/locations/index.js +1 -0
  204. package/dist/runtime/locations/lease-tracker.js +1 -6
  205. package/dist/runtime/locations/lifecycle.d.ts +1 -2
  206. package/dist/runtime/locations/lifecycle.js +2 -5
  207. package/dist/runtime/locations/location-store-repository.d.ts +51 -1
  208. package/dist/runtime/locations/location-store-repository.js +363 -139
  209. package/dist/runtime/locations/relocation-blob.d.ts +18 -1
  210. package/dist/runtime/locations/relocation-blob.js +52 -1
  211. package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
  212. package/dist/runtime/locations/request-source-resolver.js +80 -0
  213. package/dist/runtime/locations/resolvers.js +1 -1
  214. package/dist/runtime/locations/runtime.d.ts +7 -3
  215. package/dist/runtime/locations/runtime.js +61 -53
  216. package/dist/runtime/messaging/framework-json-v1.d.ts +4 -6
  217. package/dist/runtime/messaging/framework-json-v1.js +38 -294
  218. package/dist/runtime/messaging/packet-name.d.ts +1 -1
  219. package/dist/runtime/messaging/packet-name.js +8 -24
  220. package/dist/runtime/messaging/payload-codec.d.ts +7 -1
  221. package/dist/runtime/messaging/payload-codec.js +7 -6
  222. package/dist/runtime/messaging/request-result.d.ts +2 -0
  223. package/dist/runtime/messaging/request-result.js +57 -0
  224. package/dist/runtime/messaging/submission-result.d.ts +1 -0
  225. package/dist/runtime/messaging/submission-result.js +5 -2
  226. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +34 -1
  227. package/dist/runtime/protocol/service_wire_codec.generated.js +229 -0
  228. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +16 -1
  229. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +37 -8
  230. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +7 -2
  231. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +36 -21
  232. package/dist/runtime/spots/index.d.ts +21 -11
  233. package/dist/runtime/spots/index.js +243 -178
  234. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
  235. package/dist/runtime/spots/spot-activation-registry.js +21 -11
  236. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  237. package/dist/runtime/spots/spot-activation-state.js +7 -7
  238. package/dist/runtime/spots/spot-activation.d.ts +7 -3
  239. package/dist/runtime/spots/spot-activation.js +140 -52
  240. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
  241. package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
  242. package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
  243. package/dist/runtime/spots/spot-actor-membership.js +0 -8
  244. package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
  245. package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
  246. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
  247. package/dist/runtime/spots/spot-entry-activation.js +20 -11
  248. package/dist/runtime/spots/spot-handler-registry.d.ts +7 -4
  249. package/dist/runtime/spots/spot-handler-registry.js +24 -10
  250. package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
  251. package/dist/runtime/spots/spot-manager-public.js +2 -2
  252. package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
  253. package/dist/runtime/spots/spot-node-autoconnect.js +22 -42
  254. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
  255. package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
  256. package/dist/runtime/spots/spot-outbound.d.ts +3 -0
  257. package/dist/runtime/spots/spot-outbound.js +27 -18
  258. package/dist/runtime/spots/spot-remote-codec.js +5 -1
  259. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +1 -0
  260. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +1 -1
  261. package/dist/runtime/spots/spot-runtime-ports.d.ts +1 -1
  262. package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
  263. package/dist/runtime/spots/spot-serial-executor.js +61 -8
  264. package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
  265. package/dist/runtime/spots/spot-subscription-dispatch.js +1 -4
  266. package/dist/runtime/spots/spot-timer.d.ts +57 -5
  267. package/dist/runtime/spots/spot-timer.js +288 -103
  268. package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
  269. package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
  270. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
  271. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
  272. package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
  273. package/dist/runtime/streams/bound-session-service.d.ts +1 -1
  274. package/dist/runtime/streams/bound-session-service.js +6 -11
  275. package/dist/runtime/streams/index.d.ts +3 -2
  276. package/dist/runtime/streams/index.js +6 -4
  277. package/dist/runtime/streams/managed-stream.js +3 -2
  278. package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
  279. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
  280. package/dist/runtime/streams/session-actor-coordinator.js +15 -32
  281. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
  282. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -1
  283. package/dist/runtime/streams/stream-session-runtime.js +14 -31
  284. package/dist/runtime/workers/index.js +1 -1
  285. package/package.json +3 -3
  286. package/src/contracts/Actors/ZLinkActorClient.ts +2 -1
  287. package/src/contracts/Channels/Calls.ts +2 -1
  288. package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
  289. package/src/contracts/Common/ZLinkMessageMetadata.ts +13 -8
  290. package/src/contracts/Common/encoded-payload-storage.ts +6 -3
  291. package/src/contracts/Configuration/Builders.ts +4 -1
  292. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
  293. package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
  294. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  295. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
  296. package/src/contracts/Handlers/Attributes.ts +14 -21
  297. package/src/contracts/Handlers/JsonContract.ts +8 -216
  298. package/src/contracts/Locations/Rows.ts +2 -0
  299. package/src/contracts/Spots/Contracts.ts +10 -1
  300. package/src/contracts/Spots/ZLinkSpot.ts +3 -3
  301. package/src/nest-integration.ts +1 -0
  302. package/src/runtime/abort.ts +12 -0
  303. package/src/runtime/actors/actor-authority-publication.ts +3 -2
  304. package/src/runtime/actors/actor-client.ts +100 -85
  305. package/src/runtime/actors/actor-context.ts +49 -9
  306. package/src/runtime/actors/actor-handoff.ts +291 -110
  307. package/src/runtime/actors/actor-join-relocation.ts +3 -0
  308. package/src/runtime/actors/actor-local-native-join.ts +21 -26
  309. package/src/runtime/actors/actor-mailbox.ts +40 -2
  310. package/src/runtime/actors/actor-remote-joiner.ts +6 -1
  311. package/src/runtime/actors/actor-remote-wire.ts +17 -0
  312. package/src/runtime/actors/actor-reply.ts +42 -0
  313. package/src/runtime/actors/actor-routed-join-transport.ts +14 -4
  314. package/src/runtime/actors/actor-routed-json-request.ts +10 -2
  315. package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
  316. package/src/runtime/actors/actor-runtime-state.ts +2 -20
  317. package/src/runtime/actors/actor-source-transfer.ts +1 -34
  318. package/src/runtime/actors/index.ts +60 -32
  319. package/src/runtime/actors/session-disconnected-wire.ts +66 -0
  320. package/src/runtime/actors/spot-actor-dispatch.ts +4 -2
  321. package/src/runtime/admission.ts +69 -21
  322. package/src/runtime/application-jobs/application-ingress-record-owner.ts +41 -25
  323. package/src/runtime/application-jobs/application-job-queue-scope.ts +83 -22
  324. package/src/runtime/application-jobs/contracts.ts +16 -1
  325. package/src/runtime/backend/contracts/index.ts +92 -18
  326. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
  327. package/src/runtime/backend/mesh-completion-table.ts +160 -57
  328. package/src/runtime/backend/mesh-dispatch-pump.ts +237 -108
  329. package/src/runtime/backend/node/node-backend-adapter-support.ts +17 -8
  330. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +12 -2
  331. package/src/runtime/backend/node/node-raw-binding-port.ts +148 -85
  332. package/src/runtime/backend/node/node-raw-mesh-backend.ts +315 -201
  333. package/src/runtime/backend/node/node-socket-backend-adapter.ts +26 -11
  334. package/src/runtime/backend/raw-binding-port.ts +7 -2
  335. package/src/runtime/backend/runtime-message.ts +6 -0
  336. package/src/runtime/backend/runtime-values.ts +1 -0
  337. package/src/runtime/channels/channel-clients.ts +132 -58
  338. package/src/runtime/channels/channel-dispatch-pipeline.ts +198 -114
  339. package/src/runtime/channels/channel-dispatch-services.ts +69 -1
  340. package/src/runtime/channels/channel-dispatchers.ts +136 -90
  341. package/src/runtime/channels/channel-envelope-inspection.ts +2 -16
  342. package/src/runtime/channels/channel-envelope.ts +225 -31
  343. package/src/runtime/channels/channel-outbound-operations.ts +22 -8
  344. package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
  345. package/src/runtime/channels/channel-runtime-manager.ts +41 -17
  346. package/src/runtime/channels/channel-transports.ts +171 -112
  347. package/src/runtime/channels/client-server-location-runtime.ts +11 -10
  348. package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
  349. package/src/runtime/channels/fanout-location-runtime.ts +17 -9
  350. package/src/runtime/channels/local-spot-route-transport.ts +3 -1
  351. package/src/runtime/channels/router-socket-spot-route-transport.ts +13 -4
  352. package/src/runtime/channels/source-spot-router.ts +8 -4
  353. package/src/runtime/channels/spot-node-route-transport.ts +8 -4
  354. package/src/runtime/channels/spot-route-bridge-transport.ts +6 -4
  355. package/src/runtime/channels/spot-route-dispatch-strategy.ts +47 -18
  356. package/src/runtime/diagnostics/flow-context.ts +20 -7
  357. package/src/runtime/diagnostics/index.ts +1 -7
  358. package/src/runtime/diagnostics/message-flow.ts +47 -9
  359. package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
  360. package/src/runtime/execution/index.ts +40 -14
  361. package/src/runtime/execution/serial-execution-queue.ts +33 -4
  362. package/src/runtime/execution/state-lane.ts +7 -0
  363. package/src/runtime/foundation/actor-join-recovery-codec.ts +2 -2
  364. package/src/runtime/foundation/durable-service-request.ts +137 -0
  365. package/src/runtime/foundation/operation-identity.ts +5 -1
  366. package/src/runtime/foundation/operation-registry.ts +98 -20
  367. package/src/runtime/foundation/raw-service-mesh-runtime.ts +704 -336
  368. package/src/runtime/foundation/service-liveness-registry.ts +39 -0
  369. package/src/runtime/foundation/service-mailbox.ts +8 -0
  370. package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
  371. package/src/runtime/foundation/service-relocation-object-owner.ts +55 -36
  372. package/src/runtime/foundation/service-relocation-runtime.ts +25 -4
  373. package/src/runtime/foundation/service-runtime-contracts.ts +19 -2
  374. package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
  375. package/src/runtime/foundation/service-stateful-registry.ts +38 -35
  376. package/src/runtime/foundation/service-stateful-runtime.ts +732 -275
  377. package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -16
  378. package/src/runtime/foundation/service-topology-registry.ts +91 -36
  379. package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
  380. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  381. package/src/runtime/foundation/service-wire-m6a-codec.ts +231 -76
  382. package/src/runtime/handlers/handler-instance-scope.ts +67 -16
  383. package/src/runtime/host/actor-packet-relay.ts +113 -94
  384. package/src/runtime/host/actor-placement-coordinator.ts +31 -8
  385. package/src/runtime/host/actor-runtime-options-factory.ts +13 -2
  386. package/src/runtime/host/actor-transfer-runtime.ts +104 -430
  387. package/src/runtime/host/application-job-queue.ts +160 -41
  388. package/src/runtime/host/entry-actor-runtime.ts +4 -0
  389. package/src/runtime/host/index.ts +473 -271
  390. package/src/runtime/host/location-runtime-owner.ts +2 -6
  391. package/src/runtime/host/mesh-router-resolver.ts +13 -5
  392. package/src/runtime/host/remote-bound-session-relay.ts +88 -271
  393. package/src/runtime/host/route-mesh-runtime.ts +12 -6
  394. package/src/runtime/host/runtime-shutdown.ts +15 -4
  395. package/src/runtime/host/service-relocation-control.ts +11 -5
  396. package/src/runtime/host/service-relocation-host-runtime.ts +1092 -759
  397. package/src/runtime/host/spot-address-transport.ts +4 -2
  398. package/src/runtime/host/spot-runtime-options-factory.ts +20 -7
  399. package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
  400. package/src/runtime/locations/actor-location-claims.ts +52 -30
  401. package/src/runtime/locations/auto-connect-loop.ts +22 -14
  402. package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
  403. package/src/runtime/locations/auto-connect-types.ts +0 -1
  404. package/src/runtime/locations/descriptor-publication.ts +7 -0
  405. package/src/runtime/locations/domain-store-contract.ts +5 -0
  406. package/src/runtime/locations/in-memory-authority-store.ts +85 -23
  407. package/src/runtime/locations/in-memory-location-store.ts +1 -12
  408. package/src/runtime/locations/index.ts +1 -0
  409. package/src/runtime/locations/lease-tracker.ts +2 -9
  410. package/src/runtime/locations/lifecycle.ts +8 -26
  411. package/src/runtime/locations/location-store-repository.ts +628 -152
  412. package/src/runtime/locations/relocation-blob.ts +75 -1
  413. package/src/runtime/locations/request-source-resolver.ts +138 -0
  414. package/src/runtime/locations/resolvers.ts +2 -2
  415. package/src/runtime/locations/runtime.ts +98 -64
  416. package/src/runtime/messaging/framework-json-v1.ts +5 -325
  417. package/src/runtime/messaging/packet-name.ts +5 -25
  418. package/src/runtime/messaging/payload-codec.ts +8 -11
  419. package/src/runtime/messaging/request-result.ts +62 -0
  420. package/src/runtime/messaging/submission-result.ts +5 -1
  421. package/src/runtime/protocol/service_wire_codec.generated.ts +218 -5
  422. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +16 -13
  423. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +46 -25
  424. package/src/runtime/spots/index.ts +389 -283
  425. package/src/runtime/spots/spot-activation-registry.ts +25 -13
  426. package/src/runtime/spots/spot-activation-state.ts +12 -19
  427. package/src/runtime/spots/spot-activation.ts +198 -96
  428. package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
  429. package/src/runtime/spots/spot-actor-membership.ts +0 -15
  430. package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
  431. package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
  432. package/src/runtime/spots/spot-entry-activation.ts +33 -21
  433. package/src/runtime/spots/spot-handler-registry.ts +56 -12
  434. package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
  435. package/src/runtime/spots/spot-manager-public.ts +2 -2
  436. package/src/runtime/spots/spot-node-autoconnect.ts +28 -47
  437. package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
  438. package/src/runtime/spots/spot-outbound.ts +39 -19
  439. package/src/runtime/spots/spot-remote-codec.ts +9 -2
  440. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +2 -1
  441. package/src/runtime/spots/spot-runtime-ports.ts +1 -1
  442. package/src/runtime/spots/spot-serial-executor.ts +97 -25
  443. package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
  444. package/src/runtime/spots/spot-subscription-dispatch.ts +1 -4
  445. package/src/runtime/spots/spot-timer.ts +418 -158
  446. package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
  447. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
  448. package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
  449. package/src/runtime/streams/bound-session-service.ts +7 -10
  450. package/src/runtime/streams/index.ts +12 -6
  451. package/src/runtime/streams/managed-stream.ts +4 -2
  452. package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
  453. package/src/runtime/streams/session-actor-coordinator.ts +39 -88
  454. package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
  455. package/src/runtime/streams/stream-session-runtime.ts +13 -34
  456. package/src/runtime/workers/index.ts +1 -1
@@ -6,6 +6,7 @@ exports.encodeChannelEnvelopeParts = encodeChannelEnvelopeParts;
6
6
  exports.encodeChannelEnvelopePartsAtDeadline = encodeChannelEnvelopePartsAtDeadline;
7
7
  exports.encodeChannelPublishEnvelopeParts = encodeChannelPublishEnvelopeParts;
8
8
  exports.encodeChannelReplyParts = encodeChannelReplyParts;
9
+ exports.channelErrorKindFromCode = channelErrorKindFromCode;
9
10
  exports.channelErrorCodeName = channelErrorCodeName;
10
11
  exports.encodeChannelErrorReplyParts = encodeChannelErrorReplyParts;
11
12
  exports.decodeChannelReply = decodeChannelReply;
@@ -13,6 +14,8 @@ exports.decodeChannelEnvelope = decodeChannelEnvelope;
13
14
  exports.decodeChannelPayload = decodeChannelPayload;
14
15
  exports.closeMessages = closeMessages;
15
16
  exports.decodeChannelHeader = decodeChannelHeader;
17
+ exports.isValidChannelCorrelationId = isValidChannelCorrelationId;
18
+ const runtime_message_1 = require("../backend/runtime-message");
16
19
  const node_crypto_1 = require("node:crypto");
17
20
  const node_buffer_1 = require("node:buffer");
18
21
  const contracts_1 = require("../../contracts");
@@ -34,8 +37,27 @@ exports.ZLINK_CHANNEL_FORMAT_MARKER = 0xf2;
34
37
  const EMPTY_OUTBOUND_METADATA = new Map();
35
38
  exports.JSON_CONTENT_TYPE = 'application/json';
36
39
  exports.BINARY_CONTENT_TYPE = 'application/octet-stream';
40
+ const preparedChannelHeaders = new WeakMap();
41
+ const CHANNEL_CORRELATION_FIELD = ',"correlationId":';
42
+ const CHANNEL_DEADLINE_FIELD = ',"deadline":';
43
+ const CHANNEL_CORRELATION_TEXT_LENGTH = 32;
44
+ const PREPARED_CHANNEL_CORRELATION = '0'.repeat(CHANNEL_CORRELATION_TEXT_LENGTH);
45
+ const PREPARED_CHANNEL_DEADLINE = '2000-01-01T00:00:00.000Z';
46
+ const CHANNEL_CORRELATION_TEXT = /^[0-9a-f]{32}$/;
47
+ const CHANNEL_FLOW_FIELD = ',"flowId":';
48
+ // A flow id is a lowercase UUIDv7 (spec 27 §3): fixed 36 JSON-safe ASCII bytes.
49
+ const PREPARED_CHANNEL_FLOW = '00000000-0000-7000-8000-000000000000';
50
+ const CHANNEL_FLOW_TEXT = /^[0-9a-f-]{36}$/;
51
+ // A per-process random 64-bit prefix followed by a per-process counter, both
52
+ // as lowercase hex: unique among the runtime's pending requests (spec 06-obs/04
53
+ // §3) without drawing random bytes for every request — the shape Java
54
+ // ZLinkServiceOperationIds uses.
55
+ const CHANNEL_CORRELATION_PREFIX = (0, node_crypto_1.randomBytes)(CHANNEL_CORRELATION_TEXT_LENGTH / 4).toString('hex');
56
+ let channelCorrelationCounter = 0;
37
57
  function newChannelCorrelationId() {
38
- return (0, node_crypto_1.randomUUID)().replaceAll('-', '');
58
+ channelCorrelationCounter += 1;
59
+ return (CHANNEL_CORRELATION_PREFIX +
60
+ channelCorrelationCounter.toString(16).padStart(CHANNEL_CORRELATION_TEXT_LENGTH / 2, '0'));
39
61
  }
40
62
  function encodeChannelEnvelopeParts(kind, channelName, packetName, payload, timeoutMs, topic, codecs, correlationId, createFlow = true, metadata = EMPTY_OUTBOUND_METADATA) {
41
63
  return encodeChannelEnvelopePartsAtDeadline(kind, channelName, packetName, payload, timeoutMs === undefined ? undefined : Date.now() + timeoutMs, topic, codecs, correlationId, createFlow, metadata);
@@ -56,7 +78,7 @@ function encodeChannelEnvelopePartsAtDeadline(kind, channelName, packetName, pay
56
78
  const flow = createFlow ? (0, flow_context_1.currentOrCreateFlow)('Application') : undefined;
57
79
  const envelopeCorrelationId = correlationIdForOutboundKind(kind, correlationId);
58
80
  return [
59
- encodeChannelHeader(kind, channelName, messageName, encoded.contentType, envelopeCorrelationId, deadlineUnixMs === undefined ? null : new Date(deadlineUnixMs).toISOString(), topic ?? null, null, null, undefined, applicationMetadataRecord(metadata), flow?.flowId, flow?.flowOrigin),
81
+ encodeChannelHeader(kind, channelName, messageName, encoded.contentType, envelopeCorrelationId, deadlineUnixMs === undefined ? null : new Date(deadlineUnixMs).toISOString(), topic ?? null, null, null, undefined, applicationMetadataRecord(metadata), flow?.flowId, flow?.flowOrigin, codecs),
60
82
  encoded.message
61
83
  ];
62
84
  }
@@ -72,7 +94,7 @@ function encodeChannelPublishEnvelopeParts(channelName, topic, packetName, paylo
72
94
  function encodeChannelReplyParts(request, payload, codecs) {
73
95
  const encoded = encodePayload(payload ?? Buffer.alloc(0), (0, channel_framework_packets_1.codecsForFrameworkPacket)(request.messageName, codecs), request.messageName, 'reply');
74
96
  return [
75
- encodeChannelHeader(2 /* ZLinkChannelMessageKind.Response */, request.channelName, request.messageName, encoded.contentType, request.correlationId, null, null, undefined, undefined, undefined, EMPTY_APPLICATION_METADATA, request.flowId, request.flowOrigin),
97
+ encodeChannelHeader(2 /* ZLinkChannelMessageKind.Response */, request.channelName, request.messageName, encoded.contentType, request.correlationId, null, null, undefined, undefined, undefined, EMPTY_APPLICATION_METADATA, request.flowId, request.flowOrigin, codecs),
76
98
  encoded.message
77
99
  ];
78
100
  }
@@ -105,6 +127,9 @@ const ERROR_KIND_WIRE_NAMES = [
105
127
  'internal_failure' // 11
106
128
  ];
107
129
  const ERROR_KIND_BY_WIRE_NAME = new Map(ERROR_KIND_WIRE_NAMES.map((name, kind) => [name, kind]));
130
+ function channelErrorKindFromCode(code) {
131
+ return ERROR_KIND_BY_WIRE_NAME.get(code);
132
+ }
108
133
  function channelErrorCodeName(kind) {
109
134
  return ERROR_KIND_WIRE_NAMES[kind] ?? 'internal_failure';
110
135
  }
@@ -137,10 +162,10 @@ function decodeChannelReply(parts, codecs) {
137
162
  return undefined;
138
163
  }
139
164
  if (header.contentType === exports.BINARY_CONTENT_TYPE) {
140
- return Buffer.from(parts[1].data());
165
+ return runtime_message_1.ZLinkBufferMessage.retainPayload(parts[1]);
141
166
  }
142
167
  if (serializer !== undefined) {
143
- return serializer.deserialize(contracts_1.ZLinkEncodedPayload.from(parts[1].data()), Object);
168
+ return serializer.deserialize((0, payload_codec_1.encodedPayloadFromOwned)(parts[1].data()), Object);
144
169
  }
145
170
  return parseWireJson(parts[1].data().toString(), (0, Attributes_1.readZLinkPacketJsonContract)(header.messageName)?.reply);
146
171
  }
@@ -155,7 +180,7 @@ function decodeChannelError(header) {
155
180
  // Cross-language contract: errorCode carries the snake_case wire name.
156
181
  // An unknown name degrades to InternalFailure, matching the C++
157
182
  // request_failure_mapper fallback for unrecognized codes.
158
- const publicKind = ERROR_KIND_BY_WIRE_NAME.get(code) ?? contracts_1.ZLinkFrameworkErrorKind.InternalFailure;
183
+ const publicKind = channelErrorKindFromCode(code) ?? contracts_1.ZLinkFrameworkErrorKind.InternalFailure;
159
184
  failure = new contracts_1.ZLinkFrameworkException(publicKind, message);
160
185
  }
161
186
  // Cross-language contract (.NET ZLinkErrorOriginWire.RemoteReplyOrigin /
@@ -197,7 +222,7 @@ function decodeChannelPayload(envelope, codecs) {
197
222
  }
198
223
  const serializer = codecs?.serializers.get(envelope.header.contentType);
199
224
  if (serializer !== undefined) {
200
- return serializer.deserialize(contracts_1.ZLinkEncodedPayload.from(envelope.payload), Object);
225
+ return serializer.deserialize((0, payload_codec_1.encodedPayloadFromOwned)(envelope.payload), Object);
201
226
  }
202
227
  if (envelope.header.contentType === exports.BINARY_CONTENT_TYPE) {
203
228
  // The receive loop owns the Message for the duration of dispatch, so
@@ -270,7 +295,34 @@ function isMessage(value) {
270
295
  function encodeJsonBytes(value, schema) {
271
296
  return Buffer.from((0, framework_json_v1_1.stringifyFrameworkJsonV1)(value, schema));
272
297
  }
273
- function encodeChannelHeader(kind, channelName, messageName, contentType, correlationId, deadline, topic, errorCode, errorMessage, source, metadata, flowId, flowOrigin) {
298
+ function encodeChannelHeader(kind, channelName, messageName, contentType, correlationId, deadline, topic, errorCode, errorMessage, source, metadata, flowId, flowOrigin, codecs) {
299
+ if (codecs !== undefined &&
300
+ metadata === EMPTY_APPLICATION_METADATA &&
301
+ (flowId === undefined
302
+ ? flowOrigin === undefined
303
+ : flowOrigin !== undefined && CHANNEL_FLOW_TEXT.test(flowId)) &&
304
+ topic === null &&
305
+ source === undefined &&
306
+ ((kind === 3 /* ZLinkChannelMessageKind.Command */ &&
307
+ correlationId === null &&
308
+ deadline === null &&
309
+ errorCode === null &&
310
+ errorMessage === null) ||
311
+ (kind === 1 /* ZLinkChannelMessageKind.Request */ &&
312
+ correlationId !== null &&
313
+ CHANNEL_CORRELATION_TEXT.test(correlationId) &&
314
+ deadline !== null &&
315
+ deadline.length === PREPARED_CHANNEL_DEADLINE.length &&
316
+ errorCode === null &&
317
+ errorMessage === null) ||
318
+ (kind === 2 /* ZLinkChannelMessageKind.Response */ &&
319
+ correlationId !== null &&
320
+ CHANNEL_CORRELATION_TEXT.test(correlationId) &&
321
+ deadline === null &&
322
+ errorCode === undefined &&
323
+ errorMessage === undefined))) {
324
+ return preparedChannelHeader(codecs, kind, channelName, messageName, contentType, correlationId, deadline, errorCode, errorMessage, flowId, flowOrigin);
325
+ }
274
326
  // The wire has a fixed field order. Measure escaped UTF-8 first, then write
275
327
  // each field once into the only header Buffer: no header object, whole JSON
276
328
  // string, or post-encode byte copy exists on the outbound path.
@@ -281,6 +333,49 @@ function encodeChannelHeader(kind, channelName, messageName, contentType, correl
281
333
  writeChannelHeader(writer, kind, channelName, messageName, contentType, correlationId, deadline, topic, errorCode, errorMessage, source, metadata, flowId, flowOrigin);
282
334
  return result;
283
335
  }
336
+ function preparedChannelHeader(codecs, kind, channelName, messageName, contentType, correlationId, deadline, errorCode, errorMessage, flowId, flowOrigin) {
337
+ let channels = preparedChannelHeaders.get(codecs.serializers);
338
+ if (channels === undefined)
339
+ preparedChannelHeaders.set(codecs.serializers, (channels = new Map()));
340
+ let packets = channels.get(channelName);
341
+ if (packets === undefined)
342
+ channels.set(channelName, (packets = new Map()));
343
+ let contentTypes = packets.get(messageName);
344
+ if (contentTypes === undefined)
345
+ packets.set(messageName, (contentTypes = new Map()));
346
+ let kinds = contentTypes.get(contentType);
347
+ if (kinds === undefined)
348
+ contentTypes.set(contentType, (kinds = new Map()));
349
+ let deadlines = kinds.get(kind);
350
+ if (deadlines === undefined)
351
+ kinds.set(kind, (deadlines = new Map()));
352
+ const hasDeadline = deadline !== null;
353
+ let flows = deadlines.get(hasDeadline);
354
+ if (flows === undefined)
355
+ deadlines.set(hasDeadline, (flows = new Map()));
356
+ let prepared = flows.get(flowOrigin);
357
+ if (prepared === undefined) {
358
+ const bytes = encodeChannelHeader(kind, channelName, messageName, contentType, correlationId === null ? null : PREPARED_CHANNEL_CORRELATION, hasDeadline ? PREPARED_CHANNEL_DEADLINE : null, null, errorCode, errorMessage, undefined, EMPTY_APPLICATION_METADATA, flowOrigin === undefined ? undefined : PREPARED_CHANNEL_FLOW, flowOrigin);
359
+ prepared = {
360
+ bytes,
361
+ correlationOffset: bytes.indexOf(CHANNEL_CORRELATION_FIELD) + CHANNEL_CORRELATION_FIELD.length + 1,
362
+ deadlineOffset: bytes.indexOf(CHANNEL_DEADLINE_FIELD) + CHANNEL_DEADLINE_FIELD.length + 1,
363
+ flowOffset: bytes.indexOf(CHANNEL_FLOW_FIELD) + CHANNEL_FLOW_FIELD.length + 1
364
+ };
365
+ flows.set(flowOrigin, prepared);
366
+ }
367
+ if (correlationId === null && flowId === undefined)
368
+ return prepared.bytes;
369
+ const bytes = Buffer.allocUnsafe(prepared.bytes.byteLength);
370
+ prepared.bytes.copy(bytes);
371
+ if (correlationId !== null)
372
+ bytes.write(correlationId, prepared.correlationOffset, CHANNEL_CORRELATION_TEXT_LENGTH, 'ascii');
373
+ if (deadline !== null)
374
+ bytes.write(deadline, prepared.deadlineOffset, PREPARED_CHANNEL_DEADLINE.length, 'ascii');
375
+ if (flowId !== undefined)
376
+ bytes.write(flowId, prepared.flowOffset, PREPARED_CHANNEL_FLOW.length, 'ascii');
377
+ return bytes;
378
+ }
284
379
  function writeChannelHeader(writer, kind, channelName, messageName, contentType, correlationId, deadline, topic, errorCode, errorMessage, source, metadata, flowId, flowOrigin) {
285
380
  writer.append('{"formatMarker":');
286
381
  writer.append(String(exports.ZLINK_CHANNEL_FORMAT_MARKER));
@@ -292,9 +387,9 @@ function writeChannelHeader(writer, kind, channelName, messageName, contentType,
292
387
  writer.string(messageName);
293
388
  writer.append(',"contentType":');
294
389
  writer.string(contentType);
295
- writer.append(',"correlationId":');
390
+ writer.append(CHANNEL_CORRELATION_FIELD);
296
391
  writer.nullableString(correlationId);
297
- writer.append(',"deadline":');
392
+ writer.append(CHANNEL_DEADLINE_FIELD);
298
393
  writer.nullableString(deadline);
299
394
  writer.append(',"topic":');
300
395
  writer.nullableString(topic);
@@ -438,10 +533,16 @@ function parseWireJson(payload, schema) {
438
533
  }, schema);
439
534
  }
440
535
  function parseChannelHeaderBytes(payload) {
536
+ const reader = new CanonicalChannelHeaderReader(payload);
537
+ const canonical = tryParseCanonicalChannelHeader(reader);
538
+ // An all-ASCII canonical header is valid UTF-8 by construction; any other
539
+ // header is checked before it is decoded.
540
+ if (canonical !== undefined && !reader.sawNonAscii)
541
+ return canonical;
441
542
  if (!(0, node_buffer_1.isUtf8)(payload)) {
442
543
  throw new contracts_1.ZLinkFrameworkException(contracts_1.ZLinkFrameworkErrorKind.ProtocolError, 'Channel envelope header must contain valid UTF-8.');
443
544
  }
444
- return tryParseCanonicalChannelHeader(payload) ?? (0, framework_json_v1_1.parseFrameworkJsonV1)(payload.toString());
545
+ return canonical ?? (0, framework_json_v1_1.parseFrameworkJsonV1)(payload.toString());
445
546
  }
446
547
  /**
447
548
  * Accept the byte layout emitted by writeChannelHeader without materializing
@@ -449,8 +550,7 @@ function parseChannelHeaderBytes(payload) {
449
550
  * framework-json-v1 parser, which remains the sole authority for JSON
450
551
  * failures and unknown properties. Header metadata accepts every valid string key.
451
552
  */
452
- function tryParseCanonicalChannelHeader(payload) {
453
- const reader = new CanonicalChannelHeaderReader(payload);
553
+ function tryParseCanonicalChannelHeader(reader) {
454
554
  if (!reader.consume('{"formatMarker":242,"kind":'))
455
555
  return undefined;
456
556
  const kind = reader.readSingleDigit();
@@ -484,25 +584,32 @@ function tryParseCanonicalChannelHeader(payload) {
484
584
  deadline: deadline === NULL_JSON_STRING ? null : deadline,
485
585
  topic: topic === NULL_JSON_STRING ? null : topic
486
586
  };
487
- if (!reader.readOptionalNullableString('errorCode', header))
587
+ if (!reader.readOptionalNullableString(CANONICAL_ERROR_CODE, 'errorCode', header))
488
588
  return undefined;
489
- if (!reader.readOptionalNullableString('errorMessage', header))
589
+ if (!reader.readOptionalNullableString(CANONICAL_ERROR_MESSAGE, 'errorMessage', header))
490
590
  return undefined;
491
- if (!reader.readOptionalNullableString('source', header))
591
+ if (!reader.readOptionalNullableString(CANONICAL_SOURCE, 'source', header))
492
592
  return undefined;
593
+ // Empty metadata validates to the shared empty record.
493
594
  if (!reader.consume(',"metadata":{}'))
494
595
  return undefined;
495
- header.metadata = {};
496
- if (!reader.readOptionalString('flowId', header))
596
+ if (!reader.readOptionalString(CANONICAL_FLOW_ID, 'flowId', header))
497
597
  return undefined;
498
- if (!reader.readOptionalSingleDigit('flowOrigin', header))
598
+ if (!reader.readOptionalSingleDigit(CANONICAL_FLOW_ORIGIN, 'flowOrigin', header))
499
599
  return undefined;
500
600
  return reader.consume('}') && reader.atEnd() ? header : undefined;
501
601
  }
602
+ const CANONICAL_ERROR_CODE = ',"errorCode":';
603
+ const CANONICAL_ERROR_MESSAGE = ',"errorMessage":';
604
+ const CANONICAL_SOURCE = ',"source":';
605
+ const CANONICAL_FLOW_ID = ',"flowId":';
606
+ const CANONICAL_FLOW_ORIGIN = ',"flowOrigin":';
502
607
  const NULL_JSON_STRING = Symbol('null JSON string');
503
608
  class CanonicalChannelHeaderReader {
504
609
  bytes;
505
610
  index = 0;
611
+ /** A string held a byte outside ASCII, so the caller must still check UTF-8. */
612
+ sawNonAscii = false;
506
613
  constructor(bytes) {
507
614
  this.bytes = bytes;
508
615
  }
@@ -533,15 +640,22 @@ class CanonicalChannelHeaderReader {
533
640
  return undefined;
534
641
  const start = this.index;
535
642
  this.index += 1;
643
+ let hasEscape = false;
536
644
  while (this.index < this.bytes.length) {
537
645
  const value = this.bytes[this.index++];
538
646
  if (value === 0x22) {
539
- return JSON.parse(this.bytes.toString('utf8', start, this.index));
647
+ // Without escapes the JSON string is its own bytes; decode them once.
648
+ return hasEscape
649
+ ? JSON.parse(this.bytes.toString('utf8', start, this.index))
650
+ : this.bytes.toString(this.sawNonAscii ? 'utf8' : 'latin1', start + 1, this.index - 1);
540
651
  }
541
652
  if (value < 0x20)
542
653
  return undefined;
654
+ if (value >= 0x80)
655
+ this.sawNonAscii = true;
543
656
  if (value !== 0x5c)
544
657
  continue;
658
+ hasEscape = true;
545
659
  if (this.index === this.bytes.length)
546
660
  return undefined;
547
661
  const escaped = this.bytes[this.index++];
@@ -572,8 +686,8 @@ class CanonicalChannelHeaderReader {
572
686
  return NULL_JSON_STRING;
573
687
  return this.readString();
574
688
  }
575
- readOptionalNullableString(name, target) {
576
- if (!this.consume(`,\"${name}\":`))
689
+ readOptionalNullableString(token, name, target) {
690
+ if (!this.consume(token))
577
691
  return true;
578
692
  const value = this.readNullableString();
579
693
  if (value === undefined)
@@ -581,8 +695,8 @@ class CanonicalChannelHeaderReader {
581
695
  target[name] = value === NULL_JSON_STRING ? null : value;
582
696
  return true;
583
697
  }
584
- readOptionalString(name, target) {
585
- if (!this.consume(`,\"${name}\":`))
698
+ readOptionalString(token, name, target) {
699
+ if (!this.consume(token))
586
700
  return true;
587
701
  const value = this.readString();
588
702
  if (value === undefined)
@@ -590,8 +704,8 @@ class CanonicalChannelHeaderReader {
590
704
  target[name] = value;
591
705
  return true;
592
706
  }
593
- readOptionalSingleDigit(name, target) {
594
- if (!this.consume(`,\"${name}\":`))
707
+ readOptionalSingleDigit(token, name, target) {
708
+ if (!this.consume(token))
595
709
  return true;
596
710
  const value = this.readSingleDigit();
597
711
  if (value === undefined)
@@ -681,9 +795,13 @@ function validateCorrelationForKind(kind, correlationId) {
681
795
  throw new configuration_1.ZLinkConfigurationException(`Channel ${channelKindName(kind)} must not contain correlationId.`);
682
796
  }
683
797
  }
798
+ const MAXIMUM_CORRELATION_ID_BYTES = 64;
799
+ function isValidChannelCorrelationId(value) {
800
+ const byteLength = Buffer.byteLength(value, 'utf8');
801
+ return (byteLength >= 1 && byteLength <= MAXIMUM_CORRELATION_ID_BYTES && /^[\x00-\x7f]*$/.test(value));
802
+ }
684
803
  function validateCorrelationValue(correlationId) {
685
- const byteLength = Buffer.byteLength(correlationId, 'utf8');
686
- if (byteLength < 1 || byteLength > 64 || !/^[\x00-\x7f]*$/.test(correlationId)) {
804
+ if (!isValidChannelCorrelationId(correlationId)) {
687
805
  throw new configuration_1.ZLinkConfigurationException('Channel envelope correlationId must be a non-empty ASCII value of at most 64 bytes.');
688
806
  }
689
807
  }
@@ -13,7 +13,7 @@ export declare class ZLinkChannelOutboundOperations {
13
13
  send(channelName: string, packetName: string | undefined, message: unknown, metadata?: ReadonlyMap<string, string>): Promise<ZLinkSubmitResult>;
14
14
  private sendScoped;
15
15
  private traceSend;
16
- request<TReply>(channelName: string, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>): Promise<TReply>;
16
+ request<TReply>(channelName: string, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>, onAdmitted?: () => void): Promise<TReply>;
17
17
  private requestScoped;
18
18
  tryPublish(channelName: string, topic: string, packetName: string | undefined, event: unknown, metadata?: ReadonlyMap<string, string>): ZLinkSubmitResult;
19
19
  private tryPublishScoped;
@@ -22,7 +22,7 @@ export declare class ZLinkChannelOutboundOperations {
22
22
  routeSubmit(routerChannelId: string, targetNodeRid: string, packetName: string | undefined, message: unknown, metadata?: ReadonlyMap<string, string>): Promise<ZLinkSubmitResult>;
23
23
  private routeSubmitScoped;
24
24
  private traceRouteSend;
25
- routeRequest<TReply>(routerChannelId: string, targetNodeRid: string, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>): Promise<TReply>;
25
+ routeRequest<TReply>(routerChannelId: string, targetNodeRid: string, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>, onAdmitted?: () => void): Promise<TReply>;
26
26
  private routeRequestScoped;
27
27
  private measureRequest;
28
28
  }
@@ -68,10 +68,10 @@ class ZLinkChannelOutboundOperations {
68
68
  correlationId: undefined
69
69
  });
70
70
  }
71
- request(channelName, packetName, request, timeoutMs, signal, metadata) {
72
- return keepChannelRequestAlive((0, flow_context_1.runWithOutboundFlow)(this.dispatchServices.flowCreationEnabled(), () => this.requestScoped(channelName, packetName, request, timeoutMs, signal, metadata)));
71
+ request(channelName, packetName, request, timeoutMs, signal, metadata, onAdmitted) {
72
+ return keepChannelRequestAlive((0, flow_context_1.runWithOutboundFlow)(this.dispatchServices.flowCreationEnabled(), () => this.requestScoped(channelName, packetName, request, timeoutMs, signal, metadata, onAdmitted)));
73
73
  }
74
- async requestScoped(channelName, packetName, request, timeoutMs, signal, metadata) {
74
+ async requestScoped(channelName, packetName, request, timeoutMs, signal, metadata, onAdmitted) {
75
75
  const deadlineMs = timeoutMs === undefined ? undefined : performance.now() + timeoutMs;
76
76
  const deadlineUnixMs = timeoutMs === undefined ? undefined : Date.now() + timeoutMs;
77
77
  let correlationId;
@@ -117,7 +117,7 @@ class ZLinkChannelOutboundOperations {
117
117
  let replyParts = [];
118
118
  try {
119
119
  try {
120
- replyParts = await (0, abort_1.awaitWithAbort)(dealer.request(parts, (0, request_deadline_1.remainingRequestTimeout)(`Channel request '${channelName}'`, deadlineMs)), signal);
120
+ replyParts = await (0, abort_1.awaitWithAbort)(dealer.request(parts, (0, request_deadline_1.remainingRequestTimeout)(`Channel request '${channelName}'`, deadlineMs), onAdmitted), signal);
121
121
  }
122
122
  catch (error) {
123
123
  if (signal?.aborted === true)
@@ -205,10 +205,10 @@ class ZLinkChannelOutboundOperations {
205
205
  targetRid: targetNodeRid
206
206
  });
207
207
  }
208
- routeRequest(routerChannelId, targetNodeRid, packetName, request, timeoutMs, signal, metadata) {
209
- return (0, flow_context_1.runWithOutboundFlow)(this.dispatchServices.flowCreationEnabled(), () => this.routeRequestScoped(routerChannelId, targetNodeRid, packetName, request, timeoutMs, signal, metadata));
208
+ routeRequest(routerChannelId, targetNodeRid, packetName, request, timeoutMs, signal, metadata, onAdmitted) {
209
+ return (0, flow_context_1.runWithOutboundFlow)(this.dispatchServices.flowCreationEnabled(), () => this.routeRequestScoped(routerChannelId, targetNodeRid, packetName, request, timeoutMs, signal, metadata, onAdmitted));
210
210
  }
211
- async routeRequestScoped(routerChannelId, targetNodeRid, packetName, request, timeoutMs, signal, metadata) {
211
+ async routeRequestScoped(routerChannelId, targetNodeRid, packetName, request, timeoutMs, signal, metadata, onAdmitted) {
212
212
  let correlationId;
213
213
  let router;
214
214
  let terminalRecorded = false;
@@ -245,7 +245,7 @@ class ZLinkChannelOutboundOperations {
245
245
  targetRid: targetNodeRid
246
246
  });
247
247
  const reply = await this.measureRequest(routerChannelId, async () => {
248
- const replyParts = await (0, abort_1.awaitWithAbort)(router.request(targetNodeRid, parts, timeoutMs), signal);
248
+ const replyParts = await (0, abort_1.awaitWithAbort)(router.request(targetNodeRid, parts, timeoutMs, onAdmitted), signal);
249
249
  try {
250
250
  return (0, channel_envelope_1.decodeChannelReply)(replyParts, this.codecs);
251
251
  }
@@ -1,3 +1,4 @@
1
+ import type { ZLinkMeshDispatchAdmission } from '../admission';
1
2
  import type { ZLinkLocationOptionOverrides } from '../../contracts/Locations/Options';
2
3
  import type { ZLinkFrameworkRegistration } from '../configuration';
3
4
  import type { ZLinkBackendSpotRouteBridge, ZLinkChannelBackendAdapter } from '../backend/contracts';
@@ -49,7 +50,7 @@ export declare class ZLinkChannelRuntimeLifecycle {
49
50
  lifecycleGeneration: bigint;
50
51
  descriptorRevision: bigint;
51
52
  advertisedEndpoint: string;
52
- state: "error" | "preparing" | "serving" | "retiring" | "stopped";
53
+ state: "error" | "preparing" | "serving" | "stopped" | "retiring";
53
54
  }[] | undefined;
54
55
  configureLocationAutoConnect(runtime: ZLinkLocationRuntime, stores: ZLinkLocationRuntimeStores, options: ZLinkLocationOptionOverrides, events?: ZLinkLocationEventSink): void;
55
56
  private beginLocationAutoConnectCore;
@@ -60,8 +61,8 @@ export declare class ZLinkChannelRuntimeLifecycle {
60
61
  bindRouteMeshRouters(): void;
61
62
  start(taskRunner?: ZLinkRuntimeTaskRunner): Promise<void>[];
62
63
  prepareMeshDispatch(taskRunner?: ZLinkRuntimeTaskRunner): void;
63
- dispatchMeshChannel(meshName: string, record: ReceiveRecord, signal?: AbortSignal): Promise<void>;
64
- dispatchMeshRoute(meshName: string, record: ReceiveRecord, signal?: AbortSignal): Promise<void>;
64
+ dispatchMeshChannel(meshName: string, record: ReceiveRecord, signal?: AbortSignal, admit?: ZLinkMeshDispatchAdmission): void | Promise<void>;
65
+ dispatchMeshRoute(meshName: string, record: ReceiveRecord, signal?: AbortSignal, admit?: ZLinkMeshDispatchAdmission): void | Promise<void>;
65
66
  dispatchLocalMeshRoute(meshName: string, sourceNodeRid: RoutingId, parts: readonly Message[], signal?: AbortSignal): Promise<void>;
66
67
  canDispatchLocalMeshRoute(meshName: string): boolean;
67
68
  dispose(signal?: AbortSignal): Promise<void>;
@@ -10,9 +10,7 @@ const channel_receive_loops_1 = require("./channel-receive-loops");
10
10
  const client_server_location_runtime_1 = require("./client-server-location-runtime");
11
11
  const fanout_location_runtime_1 = require("./fanout-location-runtime");
12
12
  const RuntimeEndpointConnections_1 = require("../../contracts/Configuration/RuntimeEndpointConnections");
13
- const node_async_hooks_1 = require("node:async_hooks");
14
13
  const state_lane_1 = require("../execution/state-lane");
15
- const detachedStateLaneResource = new node_async_hooks_1.AsyncResource('zlink:channel-runtime-lifecycle');
16
14
  class ZLinkChannelRuntimeLifecycle {
17
15
  options;
18
16
  lane = new state_lane_1.ZLinkStateLane();
@@ -74,12 +72,12 @@ class ZLinkChannelRuntimeLifecycle {
74
72
  return;
75
73
  let fanoutLocation;
76
74
  try {
77
- await startOutsideStateLane(() => start.clientServerLocation?.start(signal) ?? Promise.resolve());
75
+ await (0, state_lane_1.startOutsideStateLane)(() => start.clientServerLocation?.start(signal) ?? Promise.resolve());
78
76
  fanoutLocation = await this.lane.run(() => this.beginFanoutLocationAutoConnectCore(start));
79
- await startOutsideStateLane(() => fanoutLocation?.start(signal) ?? Promise.resolve());
77
+ await (0, state_lane_1.startOutsideStateLane)(() => fanoutLocation?.start(signal) ?? Promise.resolve());
80
78
  }
81
79
  catch (error) {
82
- await startOutsideStateLane(() => Promise.all([
80
+ await (0, state_lane_1.startOutsideStateLane)(() => Promise.all([
83
81
  start.clientServerLocation?.stop(signal).catch(() => undefined),
84
82
  fanoutLocation?.stop(signal).catch(() => undefined)
85
83
  ]));
@@ -89,9 +87,9 @@ class ZLinkChannelRuntimeLifecycle {
89
87
  }
90
88
  async reclaimLocationOwnerRows(signal) {
91
89
  const clientServerLocation = await this.lane.run(() => this.clientServerLocation);
92
- await startOutsideStateLane(() => clientServerLocation?.reclaimOwnerRows(signal) ?? Promise.resolve());
90
+ await (0, state_lane_1.startOutsideStateLane)(() => clientServerLocation?.reclaimOwnerRows(signal) ?? Promise.resolve());
93
91
  const fanoutLocation = await this.lane.run(() => this.fanoutLocation);
94
- await startOutsideStateLane(() => fanoutLocation?.reclaimOwnerRows(signal) ?? Promise.resolve());
92
+ await (0, state_lane_1.startOutsideStateLane)(() => fanoutLocation?.reclaimOwnerRows(signal) ?? Promise.resolve());
95
93
  }
96
94
  bindRouteMeshRouters() {
97
95
  for (const routeChannel of this.options.registration.routeChannelOptions.values()) {
@@ -178,7 +176,7 @@ class ZLinkChannelRuntimeLifecycle {
178
176
  }
179
177
  }
180
178
  }
181
- dispatchMeshChannel(meshName, record, signal) {
179
+ dispatchMeshChannel(meshName, record, signal, admit) {
182
180
  const channelName = record.channelName;
183
181
  if (channelName === null) {
184
182
  throw new configuration_1.ZLinkConfigurationException('MeshNode channel record is missing channelName.');
@@ -187,14 +185,14 @@ class ZLinkChannelRuntimeLifecycle {
187
185
  if (dispatcher === undefined) {
188
186
  throw new configuration_1.ZLinkConfigurationException(`RouteMesh '${meshName}' channel '${channelName}' has no registered handlers.`);
189
187
  }
190
- return dispatcher.dispatchMesh(record, signal);
188
+ return dispatcher.dispatchMesh(record, signal, admit);
191
189
  }
192
- dispatchMeshRoute(meshName, record, signal) {
190
+ dispatchMeshRoute(meshName, record, signal, admit) {
193
191
  const dispatcher = this.meshRouteDispatchers.get(meshName);
194
192
  if (dispatcher === undefined) {
195
193
  throw new configuration_1.ZLinkConfigurationException(`RouteMesh '${meshName}' has no registered node-direct handlers.`);
196
194
  }
197
- return dispatcher.dispatchMesh(record, signal);
195
+ return dispatcher.dispatchMesh(record, signal, admit);
198
196
  }
199
197
  dispatchLocalMeshRoute(meshName, sourceNodeRid, parts, signal) {
200
198
  const dispatcher = this.meshRouteDispatchers.get(meshName);
@@ -211,20 +209,20 @@ class ZLinkChannelRuntimeLifecycle {
211
209
  }
212
210
  async disposeCore(signal) {
213
211
  const work = await this.lane.run(() => this.beginDisposeCore());
214
- const transportStopped = await startOutsideStateLane(() => Promise.allSettled([
212
+ const transportStopped = await (0, state_lane_1.startOutsideStateLane)(() => Promise.allSettled([
215
213
  ...work.channelLoops.map((loop) => loop.stop()),
216
214
  ...work.subscriberLoops.map((loop) => loop.stop()),
217
215
  ...work.routeLoops.map((loop) => loop.stop()),
218
216
  ...work.manualTransitions
219
217
  ]));
220
- const applicationStopped = await startOutsideStateLane(() => Promise.allSettled(work.applicationDispatchQueues.map((queue) => queue.close())));
218
+ const applicationStopped = await (0, state_lane_1.startOutsideStateLane)(() => Promise.allSettled(work.applicationDispatchQueues.map((queue) => queue.close())));
221
219
  const descriptorStopped = work.clientServerLocation === undefined
222
220
  ? []
223
- : await startOutsideStateLane(() => Promise.allSettled([work.clientServerLocation?.stop(signal)]));
221
+ : await (0, state_lane_1.startOutsideStateLane)(() => Promise.allSettled([work.clientServerLocation?.stop(signal)]));
224
222
  const fanoutDescriptorStopped = work.fanoutLocation === undefined
225
223
  ? []
226
- : await startOutsideStateLane(() => Promise.allSettled([work.fanoutLocation?.stop(signal)]));
227
- const cleanup = await startOutsideStateLane(() => Promise.allSettled([
224
+ : await (0, state_lane_1.startOutsideStateLane)(() => Promise.allSettled([work.fanoutLocation?.stop(signal)]));
225
+ const cleanup = await (0, state_lane_1.startOutsideStateLane)(() => Promise.allSettled([
228
226
  ...work.spotRouteBridges.map((bridge) => bridge.dispose()),
229
227
  this.options.sockets.dispose()
230
228
  ]));
@@ -421,7 +419,7 @@ class ZLinkChannelRuntimeLifecycle {
421
419
  }
422
420
  enqueueManualFanoutTransition(state, transition) {
423
421
  state.transition = state.transition
424
- .then(() => startOutsideStateLane(transition), () => startOutsideStateLane(transition))
422
+ .then(() => (0, state_lane_1.startOutsideStateLane)(transition), () => (0, state_lane_1.startOutsideStateLane)(transition))
425
423
  .catch((error) => state.taskRunner.errorSink.reportRuntimeTaskException(`subscriber:${state.channelName}:manual:${state.index}:lifecycle`, error));
426
424
  }
427
425
  openManualFanoutSubscriber(state) {
@@ -489,13 +487,13 @@ class ZLinkChannelRuntimeLifecycle {
489
487
  return;
490
488
  const errors = [];
491
489
  try {
492
- await startOutsideStateLane(() => active.loop.stop());
490
+ await (0, state_lane_1.startOutsideStateLane)(() => active.loop.stop());
493
491
  }
494
492
  catch (error) {
495
493
  errors.push(error);
496
494
  }
497
495
  try {
498
- await startOutsideStateLane(() => this.options.sockets.closeFanoutSubscriberConnection(state.connectionId));
496
+ await (0, state_lane_1.startOutsideStateLane)(() => this.options.sockets.closeFanoutSubscriberConnection(state.connectionId));
499
497
  }
500
498
  catch (error) {
501
499
  errors.push(error);
@@ -524,7 +522,7 @@ class ZLinkChannelRuntimeLifecycle {
524
522
  state.stopping = undefined;
525
523
  }
526
524
  drainManualFanoutSubscriberCore(state) {
527
- state.transition = state.transition.then(() => startOutsideStateLane(() => this.closeManualFanoutSubscriber(state)), () => startOutsideStateLane(() => this.closeManualFanoutSubscriber(state)));
525
+ state.transition = state.transition.then(() => (0, state_lane_1.startOutsideStateLane)(() => this.closeManualFanoutSubscriber(state)), () => (0, state_lane_1.startOutsideStateLane)(() => this.closeManualFanoutSubscriber(state)));
528
526
  return state.transition;
529
527
  }
530
528
  startFanoutSubscriberLoop(channelName, connectionId, subscriber) {
@@ -546,7 +544,7 @@ class ZLinkChannelRuntimeLifecycle {
546
544
  this.subscriberReceiveLoops.push(loop);
547
545
  void taskRunner.run(`subscriber:${channelName}:automatic:${connectionId}`, (signal) => loop.run(signal));
548
546
  return async () => {
549
- await startOutsideStateLane(() => loop.stop());
547
+ await (0, state_lane_1.startOutsideStateLane)(() => loop.stop());
550
548
  await this.lane.run(() => this.removeSubscriberReceiveLoopCore(loop));
551
549
  };
552
550
  }
@@ -651,6 +649,3 @@ function hasFanoutLocationTopology(registration) {
651
649
  }
652
650
  return false;
653
651
  }
654
- function startOutsideStateLane(work) {
655
- return detachedStateLaneResource.runInAsyncScope(work);
656
- }
@@ -1,3 +1,4 @@
1
+ import type { ZLinkMeshDispatchAdmission } from '../admission';
1
2
  import type { ZLinkListenerRecords } from '../foundation/listener-records';
2
3
  import type { ZLinkLocationOptionOverrides } from '../../contracts/Locations/Options';
3
4
  import type { RoutingId } from '../../contracts';
@@ -40,22 +41,22 @@ export declare class ZLinkChannelRuntimeManager {
40
41
  openMonitoringSource(sourceName: string, adapter: ZLinkMonitoringBackendAdapter): ZLinkBackendSocketMonitor;
41
42
  start(taskRunner?: ZLinkRuntimeTaskRunner): Promise<void>[];
42
43
  prepareMeshDispatch(taskRunner?: ZLinkRuntimeTaskRunner): void;
43
- dispatchMeshChannel(meshName: string, record: ReceiveRecord, signal?: AbortSignal): Promise<void>;
44
- dispatchMeshRoute(meshName: string, record: ReceiveRecord, signal?: AbortSignal): Promise<void>;
44
+ dispatchMeshChannel(meshName: string, record: ReceiveRecord, signal?: AbortSignal, admit?: ZLinkMeshDispatchAdmission): void | Promise<void>;
45
+ dispatchMeshRoute(meshName: string, record: ReceiveRecord, signal?: AbortSignal, admit?: ZLinkMeshDispatchAdmission): void | Promise<void>;
45
46
  dispatchLocalMeshRoute(meshName: string, sourceNodeRid: RoutingId, parts: readonly Message[], signal?: AbortSignal): Promise<void>;
46
47
  canDispatchLocalMeshRoute(meshName: string): boolean;
47
48
  send(channelName: string, packetName: string | undefined, message: unknown, metadata?: ReadonlyMap<string, string>): Promise<ZLinkSubmitResult>;
48
- request<TReply>(channelName: string, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>): Promise<TReply>;
49
+ request<TReply>(channelName: string, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>, onAdmitted?: () => void): Promise<TReply>;
49
50
  tryPublish(channelName: string, topic: string, packetName: string | undefined, event: unknown, metadata?: ReadonlyMap<string, string>): ZLinkSubmitResult;
50
51
  publish(channelName: string, topic: string, packetName: string | undefined, event: unknown, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>): Promise<ZLinkSubmitResult>;
51
52
  routeSubmit(routerChannelId: string, targetNodeRid: string, packetName: string | undefined, message: unknown, metadata?: ReadonlyMap<string, string>): Promise<ZLinkSubmitResult>;
52
- routeRequest<TReply>(routerChannelId: string, targetNodeRid: string, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>): Promise<TReply>;
53
+ routeRequest<TReply>(routerChannelId: string, targetNodeRid: string, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>, onAdmitted?: () => void): Promise<TReply>;
53
54
  routeSendToSpot(spotRouteTarget: ZLinkSpotRouteTarget, packetName: string | undefined, message: unknown, metadata?: ReadonlyMap<string, string>): Promise<void>;
54
- routeRequestToSpot<TReply>(spotRouteTarget: ZLinkSpotRouteTarget, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>): Promise<TReply>;
55
- routeRequestFromSpotToSpot<TReply>(sourceSpot: ZLinkBackendSpot, spotRouteTarget: ZLinkSpotRouteTarget, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal): Promise<TReply>;
55
+ routeRequestToSpot<TReply>(spotRouteTarget: ZLinkSpotRouteTarget, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>, onAdmitted?: () => void): Promise<TReply>;
56
+ routeRequestFromSpotToSpot<TReply>(sourceSpot: ZLinkBackendSpot, spotRouteTarget: ZLinkSpotRouteTarget, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, onAdmitted?: () => void): Promise<TReply>;
56
57
  routeSendFromSpotToSpot(sourceSpot: ZLinkBackendSpot, spotRouteTarget: ZLinkSpotRouteTarget, packetName: string | undefined, message: unknown, metadata?: ReadonlyMap<string, string>): Promise<void>;
57
- routeRequestRawFromSpotToSpot(sourceSpot: ZLinkBackendSpot, spotRouteTarget: ZLinkSpotRouteTarget, request: Message, timeoutMs: number | undefined, signal?: AbortSignal): Promise<readonly Message[]>;
58
- routeRequestRawToSpot(spotRouteTarget: ZLinkSpotRouteTarget, request: Message, timeoutMs: number | undefined, signal?: AbortSignal): Promise<readonly Message[]>;
58
+ routeRequestRawFromSpotToSpot(sourceSpot: ZLinkBackendSpot, spotRouteTarget: ZLinkSpotRouteTarget, request: Message, timeoutMs: number | undefined, signal?: AbortSignal, onAdmitted?: () => void): Promise<readonly Message[]>;
59
+ routeRequestRawToSpot(spotRouteTarget: ZLinkSpotRouteTarget, request: Message, timeoutMs: number | undefined, signal?: AbortSignal, onAdmitted?: () => void): Promise<readonly Message[]>;
59
60
  canRouteChannel(routerChannelId: string): boolean;
60
61
  canRoutePacketChannel(routerChannelId: string): boolean;
61
62
  dispose(signal?: AbortSignal): Promise<void>;