@zlink-systems/framework 0.30.0 → 0.30.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/LICENSE +150 -68
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/contracts/Actors/ZLinkActorClient.d.ts +2 -1
  4. package/dist/contracts/Channels/Calls.d.ts +2 -1
  5. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
  6. package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
  7. package/dist/contracts/Common/ZLinkMessageMetadata.js +11 -5
  8. package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
  9. package/dist/contracts/Common/encoded-payload-storage.js +5 -2
  10. package/dist/contracts/Configuration/Builders.d.ts +1 -1
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
  12. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
  13. package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
  14. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  15. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
  16. package/dist/contracts/Handlers/Attributes.d.ts +5 -13
  17. package/dist/contracts/Handlers/Attributes.js +7 -11
  18. package/dist/contracts/Handlers/JsonContract.d.ts +2 -46
  19. package/dist/contracts/Handlers/JsonContract.js +4 -153
  20. package/dist/contracts/Locations/Rows.d.ts +2 -0
  21. package/dist/contracts/Spots/Contracts.d.ts +6 -1
  22. package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
  23. package/dist/nest-integration.d.ts +1 -1
  24. package/dist/nest-integration.js +2 -1
  25. package/dist/runtime/abort.d.ts +5 -0
  26. package/dist/runtime/abort.js +10 -0
  27. package/dist/runtime/actors/actor-authority-publication.js +3 -2
  28. package/dist/runtime/actors/actor-client.d.ts +1 -2
  29. package/dist/runtime/actors/actor-client.js +52 -57
  30. package/dist/runtime/actors/actor-context.d.ts +2 -0
  31. package/dist/runtime/actors/actor-context.js +46 -9
  32. package/dist/runtime/actors/actor-handoff.d.ts +8 -4
  33. package/dist/runtime/actors/actor-handoff.js +219 -92
  34. package/dist/runtime/actors/actor-join-relocation.d.ts +3 -0
  35. package/dist/runtime/actors/actor-local-native-join.js +13 -12
  36. package/dist/runtime/actors/actor-mailbox.js +27 -1
  37. package/dist/runtime/actors/actor-remote-joiner.js +3 -1
  38. package/dist/runtime/actors/actor-remote-wire.js +15 -0
  39. package/dist/runtime/actors/actor-reply.d.ts +4 -0
  40. package/dist/runtime/actors/actor-reply.js +29 -0
  41. package/dist/runtime/actors/actor-routed-join-transport.d.ts +6 -2
  42. package/dist/runtime/actors/actor-routed-json-request.d.ts +2 -0
  43. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
  44. package/dist/runtime/actors/actor-runtime-state.js +2 -20
  45. package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
  46. package/dist/runtime/actors/index.d.ts +8 -3
  47. package/dist/runtime/actors/index.js +55 -27
  48. package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
  49. package/dist/runtime/actors/session-disconnected-wire.js +48 -0
  50. package/dist/runtime/actors/spot-actor-dispatch.js +2 -2
  51. package/dist/runtime/admission.d.ts +9 -1
  52. package/dist/runtime/admission.js +56 -23
  53. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +6 -8
  54. package/dist/runtime/application-jobs/application-ingress-record-owner.js +39 -22
  55. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +15 -1
  56. package/dist/runtime/application-jobs/application-job-queue-scope.js +61 -20
  57. package/dist/runtime/application-jobs/contracts.d.ts +12 -1
  58. package/dist/runtime/backend/contracts/index.d.ts +37 -12
  59. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
  60. package/dist/runtime/backend/mesh-completion-table.d.ts +9 -1
  61. package/dist/runtime/backend/mesh-completion-table.js +154 -49
  62. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +28 -1
  63. package/dist/runtime/backend/mesh-dispatch-pump.js +208 -101
  64. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +2 -2
  65. package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -9
  66. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +1 -1
  67. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +5 -2
  68. package/dist/runtime/backend/node/node-raw-binding-port.js +124 -72
  69. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +46 -13
  70. package/dist/runtime/backend/node/node-raw-mesh-backend.js +181 -164
  71. package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
  72. package/dist/runtime/backend/node/node-socket-backend-adapter.js +11 -11
  73. package/dist/runtime/backend/raw-binding-port.d.ts +2 -2
  74. package/dist/runtime/backend/runtime-message.d.ts +1 -0
  75. package/dist/runtime/backend/runtime-message.js +5 -0
  76. package/dist/runtime/backend/runtime-values.d.ts +1 -0
  77. package/dist/runtime/backend/runtime-values.js +2 -1
  78. package/dist/runtime/channels/channel-clients.d.ts +2 -0
  79. package/dist/runtime/channels/channel-clients.js +75 -23
  80. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +25 -5
  81. package/dist/runtime/channels/channel-dispatch-pipeline.js +111 -56
  82. package/dist/runtime/channels/channel-dispatch-services.d.ts +1 -0
  83. package/dist/runtime/channels/channel-dispatch-services.js +45 -0
  84. package/dist/runtime/channels/channel-dispatchers.d.ts +4 -3
  85. package/dist/runtime/channels/channel-dispatchers.js +62 -54
  86. package/dist/runtime/channels/channel-envelope-inspection.d.ts +1 -2
  87. package/dist/runtime/channels/channel-envelope-inspection.js +1 -16
  88. package/dist/runtime/channels/channel-envelope.d.ts +2 -0
  89. package/dist/runtime/channels/channel-envelope.js +146 -28
  90. package/dist/runtime/channels/channel-outbound-operations.d.ts +2 -2
  91. package/dist/runtime/channels/channel-outbound-operations.js +8 -8
  92. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
  93. package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
  94. package/dist/runtime/channels/channel-runtime-manager.d.ts +9 -8
  95. package/dist/runtime/channels/channel-runtime-manager.js +16 -16
  96. package/dist/runtime/channels/channel-transports.d.ts +18 -16
  97. package/dist/runtime/channels/channel-transports.js +77 -58
  98. package/dist/runtime/channels/client-server-location-runtime.js +5 -4
  99. package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
  100. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  101. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  102. package/dist/runtime/channels/fanout-location-runtime.js +3 -3
  103. package/dist/runtime/channels/local-spot-route-transport.d.ts +1 -1
  104. package/dist/runtime/channels/local-spot-route-transport.js +2 -1
  105. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +2 -2
  106. package/dist/runtime/channels/router-socket-spot-route-transport.js +4 -4
  107. package/dist/runtime/channels/source-spot-router.d.ts +2 -2
  108. package/dist/runtime/channels/source-spot-router.js +4 -4
  109. package/dist/runtime/channels/spot-node-route-transport.d.ts +2 -2
  110. package/dist/runtime/channels/spot-node-route-transport.js +4 -4
  111. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +2 -2
  112. package/dist/runtime/channels/spot-route-bridge-transport.js +4 -4
  113. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +5 -4
  114. package/dist/runtime/channels/spot-route-dispatch-strategy.js +18 -18
  115. package/dist/runtime/diagnostics/flow-context.js +19 -7
  116. package/dist/runtime/diagnostics/index.js +4 -9
  117. package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
  118. package/dist/runtime/diagnostics/message-flow.js +35 -5
  119. package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
  120. package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
  121. package/dist/runtime/execution/index.d.ts +4 -2
  122. package/dist/runtime/execution/index.js +33 -10
  123. package/dist/runtime/execution/serial-execution-queue.d.ts +5 -0
  124. package/dist/runtime/execution/serial-execution-queue.js +22 -2
  125. package/dist/runtime/execution/state-lane.d.ts +2 -0
  126. package/dist/runtime/execution/state-lane.js +5 -0
  127. package/dist/runtime/foundation/actor-join-recovery-codec.js +2 -2
  128. package/dist/runtime/foundation/durable-service-request.d.ts +14 -0
  129. package/dist/runtime/foundation/durable-service-request.js +98 -0
  130. package/dist/runtime/foundation/operation-identity.d.ts +1 -0
  131. package/dist/runtime/foundation/operation-identity.js +5 -1
  132. package/dist/runtime/foundation/operation-registry.d.ts +25 -1
  133. package/dist/runtime/foundation/operation-registry.js +86 -18
  134. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +61 -8
  135. package/dist/runtime/foundation/raw-service-mesh-runtime.js +486 -266
  136. package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
  137. package/dist/runtime/foundation/service-liveness-registry.js +38 -0
  138. package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
  139. package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
  140. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +3 -3
  141. package/dist/runtime/foundation/service-relocation-object-owner.js +48 -34
  142. package/dist/runtime/foundation/service-relocation-runtime.d.ts +2 -0
  143. package/dist/runtime/foundation/service-relocation-runtime.js +20 -4
  144. package/dist/runtime/foundation/service-runtime-contracts.d.ts +10 -1
  145. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
  146. package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
  147. package/dist/runtime/foundation/service-stateful-registry.js +24 -26
  148. package/dist/runtime/foundation/service-stateful-runtime.d.ts +75 -9
  149. package/dist/runtime/foundation/service-stateful-runtime.js +486 -218
  150. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -6
  151. package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
  152. package/dist/runtime/foundation/service-topology-registry.d.ts +12 -2
  153. package/dist/runtime/foundation/service-topology-registry.js +61 -27
  154. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
  155. package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
  156. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  157. package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
  158. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +13 -3
  159. package/dist/runtime/foundation/service-wire-m6a-codec.js +189 -78
  160. package/dist/runtime/handlers/handler-instance-scope.d.ts +8 -0
  161. package/dist/runtime/handlers/handler-instance-scope.js +54 -11
  162. package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
  163. package/dist/runtime/host/actor-packet-relay.js +59 -72
  164. package/dist/runtime/host/actor-placement-coordinator.js +25 -8
  165. package/dist/runtime/host/actor-runtime-options-factory.js +2 -2
  166. package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
  167. package/dist/runtime/host/actor-transfer-runtime.js +85 -331
  168. package/dist/runtime/host/application-job-queue.d.ts +40 -7
  169. package/dist/runtime/host/application-job-queue.js +137 -42
  170. package/dist/runtime/host/entry-actor-runtime.d.ts +1 -0
  171. package/dist/runtime/host/entry-actor-runtime.js +3 -0
  172. package/dist/runtime/host/index.d.ts +12 -2
  173. package/dist/runtime/host/index.js +300 -202
  174. package/dist/runtime/host/location-runtime-owner.js +2 -6
  175. package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
  176. package/dist/runtime/host/mesh-router-resolver.js +14 -6
  177. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
  178. package/dist/runtime/host/remote-bound-session-relay.js +73 -208
  179. package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
  180. package/dist/runtime/host/route-mesh-runtime.js +6 -4
  181. package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
  182. package/dist/runtime/host/runtime-shutdown.js +3 -2
  183. package/dist/runtime/host/service-relocation-control.d.ts +1 -0
  184. package/dist/runtime/host/service-relocation-control.js +10 -4
  185. package/dist/runtime/host/service-relocation-host-runtime.d.ts +22 -14
  186. package/dist/runtime/host/service-relocation-host-runtime.js +754 -599
  187. package/dist/runtime/host/spot-address-transport.js +3 -2
  188. package/dist/runtime/host/spot-runtime-options-factory.js +16 -7
  189. package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
  190. package/dist/runtime/locations/actor-location-claims.d.ts +2 -2
  191. package/dist/runtime/locations/actor-location-claims.js +34 -19
  192. package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
  193. package/dist/runtime/locations/auto-connect-loop.js +22 -14
  194. package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
  195. package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
  196. package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
  197. package/dist/runtime/locations/descriptor-publication.js +11 -0
  198. package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
  199. package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
  200. package/dist/runtime/locations/in-memory-authority-store.js +56 -19
  201. package/dist/runtime/locations/in-memory-location-store.js +1 -10
  202. package/dist/runtime/locations/index.d.ts +1 -0
  203. package/dist/runtime/locations/index.js +1 -0
  204. package/dist/runtime/locations/lease-tracker.js +1 -6
  205. package/dist/runtime/locations/lifecycle.d.ts +1 -2
  206. package/dist/runtime/locations/lifecycle.js +2 -5
  207. package/dist/runtime/locations/location-store-repository.d.ts +51 -1
  208. package/dist/runtime/locations/location-store-repository.js +363 -139
  209. package/dist/runtime/locations/relocation-blob.d.ts +18 -1
  210. package/dist/runtime/locations/relocation-blob.js +52 -1
  211. package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
  212. package/dist/runtime/locations/request-source-resolver.js +80 -0
  213. package/dist/runtime/locations/resolvers.js +1 -1
  214. package/dist/runtime/locations/runtime.d.ts +7 -3
  215. package/dist/runtime/locations/runtime.js +61 -53
  216. package/dist/runtime/messaging/framework-json-v1.d.ts +4 -6
  217. package/dist/runtime/messaging/framework-json-v1.js +38 -294
  218. package/dist/runtime/messaging/packet-name.d.ts +1 -1
  219. package/dist/runtime/messaging/packet-name.js +8 -24
  220. package/dist/runtime/messaging/payload-codec.d.ts +7 -1
  221. package/dist/runtime/messaging/payload-codec.js +7 -6
  222. package/dist/runtime/messaging/request-result.d.ts +2 -0
  223. package/dist/runtime/messaging/request-result.js +57 -0
  224. package/dist/runtime/messaging/submission-result.d.ts +1 -0
  225. package/dist/runtime/messaging/submission-result.js +5 -2
  226. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +34 -1
  227. package/dist/runtime/protocol/service_wire_codec.generated.js +229 -0
  228. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +16 -1
  229. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +37 -8
  230. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +7 -2
  231. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +36 -21
  232. package/dist/runtime/spots/index.d.ts +21 -11
  233. package/dist/runtime/spots/index.js +243 -178
  234. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
  235. package/dist/runtime/spots/spot-activation-registry.js +21 -11
  236. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  237. package/dist/runtime/spots/spot-activation-state.js +7 -7
  238. package/dist/runtime/spots/spot-activation.d.ts +7 -3
  239. package/dist/runtime/spots/spot-activation.js +140 -52
  240. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
  241. package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
  242. package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
  243. package/dist/runtime/spots/spot-actor-membership.js +0 -8
  244. package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
  245. package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
  246. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
  247. package/dist/runtime/spots/spot-entry-activation.js +20 -11
  248. package/dist/runtime/spots/spot-handler-registry.d.ts +7 -4
  249. package/dist/runtime/spots/spot-handler-registry.js +24 -10
  250. package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
  251. package/dist/runtime/spots/spot-manager-public.js +2 -2
  252. package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
  253. package/dist/runtime/spots/spot-node-autoconnect.js +22 -42
  254. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
  255. package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
  256. package/dist/runtime/spots/spot-outbound.d.ts +3 -0
  257. package/dist/runtime/spots/spot-outbound.js +27 -18
  258. package/dist/runtime/spots/spot-remote-codec.js +5 -1
  259. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +1 -0
  260. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +1 -1
  261. package/dist/runtime/spots/spot-runtime-ports.d.ts +1 -1
  262. package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
  263. package/dist/runtime/spots/spot-serial-executor.js +61 -8
  264. package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
  265. package/dist/runtime/spots/spot-subscription-dispatch.js +1 -4
  266. package/dist/runtime/spots/spot-timer.d.ts +57 -5
  267. package/dist/runtime/spots/spot-timer.js +288 -103
  268. package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
  269. package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
  270. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
  271. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
  272. package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
  273. package/dist/runtime/streams/bound-session-service.d.ts +1 -1
  274. package/dist/runtime/streams/bound-session-service.js +6 -11
  275. package/dist/runtime/streams/index.d.ts +3 -2
  276. package/dist/runtime/streams/index.js +6 -4
  277. package/dist/runtime/streams/managed-stream.js +3 -2
  278. package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
  279. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
  280. package/dist/runtime/streams/session-actor-coordinator.js +15 -32
  281. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
  282. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -1
  283. package/dist/runtime/streams/stream-session-runtime.js +14 -31
  284. package/dist/runtime/workers/index.js +1 -1
  285. package/package.json +3 -3
  286. package/src/contracts/Actors/ZLinkActorClient.ts +2 -1
  287. package/src/contracts/Channels/Calls.ts +2 -1
  288. package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
  289. package/src/contracts/Common/ZLinkMessageMetadata.ts +13 -8
  290. package/src/contracts/Common/encoded-payload-storage.ts +6 -3
  291. package/src/contracts/Configuration/Builders.ts +4 -1
  292. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
  293. package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
  294. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  295. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
  296. package/src/contracts/Handlers/Attributes.ts +14 -21
  297. package/src/contracts/Handlers/JsonContract.ts +8 -216
  298. package/src/contracts/Locations/Rows.ts +2 -0
  299. package/src/contracts/Spots/Contracts.ts +10 -1
  300. package/src/contracts/Spots/ZLinkSpot.ts +3 -3
  301. package/src/nest-integration.ts +1 -0
  302. package/src/runtime/abort.ts +12 -0
  303. package/src/runtime/actors/actor-authority-publication.ts +3 -2
  304. package/src/runtime/actors/actor-client.ts +100 -85
  305. package/src/runtime/actors/actor-context.ts +49 -9
  306. package/src/runtime/actors/actor-handoff.ts +291 -110
  307. package/src/runtime/actors/actor-join-relocation.ts +3 -0
  308. package/src/runtime/actors/actor-local-native-join.ts +21 -26
  309. package/src/runtime/actors/actor-mailbox.ts +40 -2
  310. package/src/runtime/actors/actor-remote-joiner.ts +6 -1
  311. package/src/runtime/actors/actor-remote-wire.ts +17 -0
  312. package/src/runtime/actors/actor-reply.ts +42 -0
  313. package/src/runtime/actors/actor-routed-join-transport.ts +14 -4
  314. package/src/runtime/actors/actor-routed-json-request.ts +10 -2
  315. package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
  316. package/src/runtime/actors/actor-runtime-state.ts +2 -20
  317. package/src/runtime/actors/actor-source-transfer.ts +1 -34
  318. package/src/runtime/actors/index.ts +60 -32
  319. package/src/runtime/actors/session-disconnected-wire.ts +66 -0
  320. package/src/runtime/actors/spot-actor-dispatch.ts +4 -2
  321. package/src/runtime/admission.ts +69 -21
  322. package/src/runtime/application-jobs/application-ingress-record-owner.ts +41 -25
  323. package/src/runtime/application-jobs/application-job-queue-scope.ts +83 -22
  324. package/src/runtime/application-jobs/contracts.ts +16 -1
  325. package/src/runtime/backend/contracts/index.ts +92 -18
  326. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
  327. package/src/runtime/backend/mesh-completion-table.ts +160 -57
  328. package/src/runtime/backend/mesh-dispatch-pump.ts +237 -108
  329. package/src/runtime/backend/node/node-backend-adapter-support.ts +17 -8
  330. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +12 -2
  331. package/src/runtime/backend/node/node-raw-binding-port.ts +148 -85
  332. package/src/runtime/backend/node/node-raw-mesh-backend.ts +315 -201
  333. package/src/runtime/backend/node/node-socket-backend-adapter.ts +26 -11
  334. package/src/runtime/backend/raw-binding-port.ts +7 -2
  335. package/src/runtime/backend/runtime-message.ts +6 -0
  336. package/src/runtime/backend/runtime-values.ts +1 -0
  337. package/src/runtime/channels/channel-clients.ts +132 -58
  338. package/src/runtime/channels/channel-dispatch-pipeline.ts +198 -114
  339. package/src/runtime/channels/channel-dispatch-services.ts +69 -1
  340. package/src/runtime/channels/channel-dispatchers.ts +136 -90
  341. package/src/runtime/channels/channel-envelope-inspection.ts +2 -16
  342. package/src/runtime/channels/channel-envelope.ts +225 -31
  343. package/src/runtime/channels/channel-outbound-operations.ts +22 -8
  344. package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
  345. package/src/runtime/channels/channel-runtime-manager.ts +41 -17
  346. package/src/runtime/channels/channel-transports.ts +171 -112
  347. package/src/runtime/channels/client-server-location-runtime.ts +11 -10
  348. package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
  349. package/src/runtime/channels/fanout-location-runtime.ts +17 -9
  350. package/src/runtime/channels/local-spot-route-transport.ts +3 -1
  351. package/src/runtime/channels/router-socket-spot-route-transport.ts +13 -4
  352. package/src/runtime/channels/source-spot-router.ts +8 -4
  353. package/src/runtime/channels/spot-node-route-transport.ts +8 -4
  354. package/src/runtime/channels/spot-route-bridge-transport.ts +6 -4
  355. package/src/runtime/channels/spot-route-dispatch-strategy.ts +47 -18
  356. package/src/runtime/diagnostics/flow-context.ts +20 -7
  357. package/src/runtime/diagnostics/index.ts +1 -7
  358. package/src/runtime/diagnostics/message-flow.ts +47 -9
  359. package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
  360. package/src/runtime/execution/index.ts +40 -14
  361. package/src/runtime/execution/serial-execution-queue.ts +33 -4
  362. package/src/runtime/execution/state-lane.ts +7 -0
  363. package/src/runtime/foundation/actor-join-recovery-codec.ts +2 -2
  364. package/src/runtime/foundation/durable-service-request.ts +137 -0
  365. package/src/runtime/foundation/operation-identity.ts +5 -1
  366. package/src/runtime/foundation/operation-registry.ts +98 -20
  367. package/src/runtime/foundation/raw-service-mesh-runtime.ts +704 -336
  368. package/src/runtime/foundation/service-liveness-registry.ts +39 -0
  369. package/src/runtime/foundation/service-mailbox.ts +8 -0
  370. package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
  371. package/src/runtime/foundation/service-relocation-object-owner.ts +55 -36
  372. package/src/runtime/foundation/service-relocation-runtime.ts +25 -4
  373. package/src/runtime/foundation/service-runtime-contracts.ts +19 -2
  374. package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
  375. package/src/runtime/foundation/service-stateful-registry.ts +38 -35
  376. package/src/runtime/foundation/service-stateful-runtime.ts +732 -275
  377. package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -16
  378. package/src/runtime/foundation/service-topology-registry.ts +91 -36
  379. package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
  380. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  381. package/src/runtime/foundation/service-wire-m6a-codec.ts +231 -76
  382. package/src/runtime/handlers/handler-instance-scope.ts +67 -16
  383. package/src/runtime/host/actor-packet-relay.ts +113 -94
  384. package/src/runtime/host/actor-placement-coordinator.ts +31 -8
  385. package/src/runtime/host/actor-runtime-options-factory.ts +13 -2
  386. package/src/runtime/host/actor-transfer-runtime.ts +104 -430
  387. package/src/runtime/host/application-job-queue.ts +160 -41
  388. package/src/runtime/host/entry-actor-runtime.ts +4 -0
  389. package/src/runtime/host/index.ts +473 -271
  390. package/src/runtime/host/location-runtime-owner.ts +2 -6
  391. package/src/runtime/host/mesh-router-resolver.ts +13 -5
  392. package/src/runtime/host/remote-bound-session-relay.ts +88 -271
  393. package/src/runtime/host/route-mesh-runtime.ts +12 -6
  394. package/src/runtime/host/runtime-shutdown.ts +15 -4
  395. package/src/runtime/host/service-relocation-control.ts +11 -5
  396. package/src/runtime/host/service-relocation-host-runtime.ts +1092 -759
  397. package/src/runtime/host/spot-address-transport.ts +4 -2
  398. package/src/runtime/host/spot-runtime-options-factory.ts +20 -7
  399. package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
  400. package/src/runtime/locations/actor-location-claims.ts +52 -30
  401. package/src/runtime/locations/auto-connect-loop.ts +22 -14
  402. package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
  403. package/src/runtime/locations/auto-connect-types.ts +0 -1
  404. package/src/runtime/locations/descriptor-publication.ts +7 -0
  405. package/src/runtime/locations/domain-store-contract.ts +5 -0
  406. package/src/runtime/locations/in-memory-authority-store.ts +85 -23
  407. package/src/runtime/locations/in-memory-location-store.ts +1 -12
  408. package/src/runtime/locations/index.ts +1 -0
  409. package/src/runtime/locations/lease-tracker.ts +2 -9
  410. package/src/runtime/locations/lifecycle.ts +8 -26
  411. package/src/runtime/locations/location-store-repository.ts +628 -152
  412. package/src/runtime/locations/relocation-blob.ts +75 -1
  413. package/src/runtime/locations/request-source-resolver.ts +138 -0
  414. package/src/runtime/locations/resolvers.ts +2 -2
  415. package/src/runtime/locations/runtime.ts +98 -64
  416. package/src/runtime/messaging/framework-json-v1.ts +5 -325
  417. package/src/runtime/messaging/packet-name.ts +5 -25
  418. package/src/runtime/messaging/payload-codec.ts +8 -11
  419. package/src/runtime/messaging/request-result.ts +62 -0
  420. package/src/runtime/messaging/submission-result.ts +5 -1
  421. package/src/runtime/protocol/service_wire_codec.generated.ts +218 -5
  422. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +16 -13
  423. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +46 -25
  424. package/src/runtime/spots/index.ts +389 -283
  425. package/src/runtime/spots/spot-activation-registry.ts +25 -13
  426. package/src/runtime/spots/spot-activation-state.ts +12 -19
  427. package/src/runtime/spots/spot-activation.ts +198 -96
  428. package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
  429. package/src/runtime/spots/spot-actor-membership.ts +0 -15
  430. package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
  431. package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
  432. package/src/runtime/spots/spot-entry-activation.ts +33 -21
  433. package/src/runtime/spots/spot-handler-registry.ts +56 -12
  434. package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
  435. package/src/runtime/spots/spot-manager-public.ts +2 -2
  436. package/src/runtime/spots/spot-node-autoconnect.ts +28 -47
  437. package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
  438. package/src/runtime/spots/spot-outbound.ts +39 -19
  439. package/src/runtime/spots/spot-remote-codec.ts +9 -2
  440. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +2 -1
  441. package/src/runtime/spots/spot-runtime-ports.ts +1 -1
  442. package/src/runtime/spots/spot-serial-executor.ts +97 -25
  443. package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
  444. package/src/runtime/spots/spot-subscription-dispatch.ts +1 -4
  445. package/src/runtime/spots/spot-timer.ts +418 -158
  446. package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
  447. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
  448. package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
  449. package/src/runtime/streams/bound-session-service.ts +7 -10
  450. package/src/runtime/streams/index.ts +12 -6
  451. package/src/runtime/streams/managed-stream.ts +4 -2
  452. package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
  453. package/src/runtime/streams/session-actor-coordinator.ts +39 -88
  454. package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
  455. package/src/runtime/streams/stream-session-runtime.ts +13 -34
  456. package/src/runtime/workers/index.ts +1 -1
@@ -1,11 +1,11 @@
1
1
  import type { Message } from '../../contracts/Common/Message';
2
+ import { ZLinkBufferMessage } from '../backend/runtime-message';
2
3
  import type { ZLinkBackendMessageLike as MessageLike } from '../backend/runtime-values';
3
- import { randomUUID } from 'node:crypto';
4
+ import { randomBytes } from 'node:crypto';
4
5
  import { isUtf8 } from 'node:buffer';
5
6
  import {
6
7
  ZLinkFrameworkErrorKind,
7
8
  ZLinkFrameworkException,
8
- ZLinkEncodedPayload,
9
9
  type ZLinkMessageSerializer,
10
10
  type ZLinkFlowOrigin
11
11
  } from '../../contracts';
@@ -17,7 +17,10 @@ import {
17
17
  createInternalFrameworkException
18
18
  } from '../framework-errors-internal';
19
19
  import { resolveFrameworkPacketName } from '../messaging/packet-name';
20
- import { selectSerializerWithContentType } from '../messaging/payload-codec';
20
+ import {
21
+ encodedPayloadFromOwned,
22
+ selectSerializerWithContentType
23
+ } from '../messaging/payload-codec';
21
24
  import { isCanonicalCodecContentType } from '../../contracts/Configuration/CodecContentType';
22
25
  import { parseFrameworkJsonV1, stringifyFrameworkJsonV1 } from '../messaging/framework-json-v1';
23
26
  import { currentOrCreateFlow } from '../diagnostics/flow-context';
@@ -70,8 +73,46 @@ export interface ZLinkChannelEnvelopeCodecRegistry {
70
73
  readonly serializers: ReadonlyMap<string, ZLinkMessageSerializer>;
71
74
  }
72
75
 
76
+ interface PreparedChannelHeader {
77
+ readonly bytes: Buffer;
78
+ readonly correlationOffset: number;
79
+ readonly deadlineOffset: number;
80
+ readonly flowOffset: number;
81
+ }
82
+
83
+ /** Per kind, deadline presence and flow origin (`undefined` when the header carries no flow). */
84
+ type PreparedHeaderVariants = Map<
85
+ ZLinkChannelMessageKind,
86
+ Map<boolean, Map<ZLinkFlowOrigin | undefined, PreparedChannelHeader>>
87
+ >;
88
+ const preparedChannelHeaders = new WeakMap<
89
+ ReadonlyMap<string, ZLinkMessageSerializer>,
90
+ Map<string, Map<string, Map<string, PreparedHeaderVariants>>>
91
+ >();
92
+ const CHANNEL_CORRELATION_FIELD = ',"correlationId":';
93
+ const CHANNEL_DEADLINE_FIELD = ',"deadline":';
94
+ const CHANNEL_CORRELATION_TEXT_LENGTH = 32;
95
+ const PREPARED_CHANNEL_CORRELATION = '0'.repeat(CHANNEL_CORRELATION_TEXT_LENGTH);
96
+ const PREPARED_CHANNEL_DEADLINE = '2000-01-01T00:00:00.000Z';
97
+ const CHANNEL_CORRELATION_TEXT = /^[0-9a-f]{32}$/;
98
+ const CHANNEL_FLOW_FIELD = ',"flowId":';
99
+ // A flow id is a lowercase UUIDv7 (spec 27 §3): fixed 36 JSON-safe ASCII bytes.
100
+ const PREPARED_CHANNEL_FLOW = '00000000-0000-7000-8000-000000000000';
101
+ const CHANNEL_FLOW_TEXT = /^[0-9a-f-]{36}$/;
102
+
103
+ // A per-process random 64-bit prefix followed by a per-process counter, both
104
+ // as lowercase hex: unique among the runtime's pending requests (spec 06-obs/04
105
+ // §3) without drawing random bytes for every request — the shape Java
106
+ // ZLinkServiceOperationIds uses.
107
+ const CHANNEL_CORRELATION_PREFIX = randomBytes(CHANNEL_CORRELATION_TEXT_LENGTH / 4).toString('hex');
108
+ let channelCorrelationCounter = 0;
109
+
73
110
  export function newChannelCorrelationId(): string {
74
- return randomUUID().replaceAll('-', '');
111
+ channelCorrelationCounter += 1;
112
+ return (
113
+ CHANNEL_CORRELATION_PREFIX +
114
+ channelCorrelationCounter.toString(16).padStart(CHANNEL_CORRELATION_TEXT_LENGTH / 2, '0')
115
+ );
75
116
  }
76
117
 
77
118
  export function encodeChannelEnvelopeParts(
@@ -147,7 +188,8 @@ export function encodeChannelEnvelopePartsAtDeadline(
147
188
  undefined,
148
189
  applicationMetadataRecord(metadata),
149
190
  flow?.flowId,
150
- flow?.flowOrigin
191
+ flow?.flowOrigin,
192
+ codecs
151
193
  ),
152
194
  encoded.message
153
195
  ];
@@ -215,7 +257,8 @@ export function encodeChannelReplyParts(
215
257
  undefined,
216
258
  EMPTY_APPLICATION_METADATA,
217
259
  request.flowId,
218
- request.flowOrigin
260
+ request.flowOrigin,
261
+ codecs
219
262
  ),
220
263
  encoded.message
221
264
  ];
@@ -255,6 +298,10 @@ const ERROR_KIND_BY_WIRE_NAME: ReadonlyMap<string, ZLinkFrameworkErrorKind> = ne
255
298
  ERROR_KIND_WIRE_NAMES.map((name, kind) => [name, kind as ZLinkFrameworkErrorKind])
256
299
  );
257
300
 
301
+ export function channelErrorKindFromCode(code: string): ZLinkFrameworkErrorKind | undefined {
302
+ return ERROR_KIND_BY_WIRE_NAME.get(code);
303
+ }
304
+
258
305
  export function channelErrorCodeName(kind: ZLinkFrameworkErrorKind): string {
259
306
  return ERROR_KIND_WIRE_NAMES[kind] ?? 'internal_failure';
260
307
  }
@@ -325,11 +372,11 @@ export function decodeChannelReply<TReply>(
325
372
  return undefined as TReply;
326
373
  }
327
374
  if (header.contentType === BINARY_CONTENT_TYPE) {
328
- return Buffer.from(parts[1].data()) as TReply;
375
+ return ZLinkBufferMessage.retainPayload(parts[1]) as TReply;
329
376
  }
330
377
  if (serializer !== undefined) {
331
378
  return serializer.deserialize<TReply>(
332
- ZLinkEncodedPayload.from(parts[1].data()),
379
+ encodedPayloadFromOwned(parts[1].data()),
333
380
  Object as never
334
381
  );
335
382
  }
@@ -352,7 +399,7 @@ function decodeChannelError(header: ZLinkChannelEnvelopeHeader): ZLinkChannelDec
352
399
  // Cross-language contract: errorCode carries the snake_case wire name.
353
400
  // An unknown name degrades to InternalFailure, matching the C++
354
401
  // request_failure_mapper fallback for unrecognized codes.
355
- const publicKind = ERROR_KIND_BY_WIRE_NAME.get(code) ?? ZLinkFrameworkErrorKind.InternalFailure;
402
+ const publicKind = channelErrorKindFromCode(code) ?? ZLinkFrameworkErrorKind.InternalFailure;
356
403
  failure = new ZLinkFrameworkException(publicKind, message);
357
404
  }
358
405
  // Cross-language contract (.NET ZLinkErrorOriginWire.RemoteReplyOrigin /
@@ -403,7 +450,7 @@ export function decodeChannelPayload(
403
450
  }
404
451
  const serializer = codecs?.serializers.get(envelope.header.contentType);
405
452
  if (serializer !== undefined) {
406
- return serializer.deserialize(ZLinkEncodedPayload.from(envelope.payload), Object as never);
453
+ return serializer.deserialize(encodedPayloadFromOwned(envelope.payload), Object as never);
407
454
  }
408
455
  if (envelope.header.contentType === BINARY_CONTENT_TYPE) {
409
456
  // The receive loop owns the Message for the duration of dispatch, so
@@ -517,8 +564,50 @@ function encodeChannelHeader(
517
564
  source: string | null | undefined,
518
565
  metadata: Readonly<Record<string, string>>,
519
566
  flowId: string | undefined,
520
- flowOrigin: ZLinkFlowOrigin | undefined
567
+ flowOrigin: ZLinkFlowOrigin | undefined,
568
+ codecs?: ZLinkChannelEnvelopeCodecRegistry
521
569
  ): Buffer {
570
+ if (
571
+ codecs !== undefined &&
572
+ metadata === EMPTY_APPLICATION_METADATA &&
573
+ (flowId === undefined
574
+ ? flowOrigin === undefined
575
+ : flowOrigin !== undefined && CHANNEL_FLOW_TEXT.test(flowId)) &&
576
+ topic === null &&
577
+ source === undefined &&
578
+ ((kind === ZLinkChannelMessageKind.Command &&
579
+ correlationId === null &&
580
+ deadline === null &&
581
+ errorCode === null &&
582
+ errorMessage === null) ||
583
+ (kind === ZLinkChannelMessageKind.Request &&
584
+ correlationId !== null &&
585
+ CHANNEL_CORRELATION_TEXT.test(correlationId) &&
586
+ deadline !== null &&
587
+ deadline.length === PREPARED_CHANNEL_DEADLINE.length &&
588
+ errorCode === null &&
589
+ errorMessage === null) ||
590
+ (kind === ZLinkChannelMessageKind.Response &&
591
+ correlationId !== null &&
592
+ CHANNEL_CORRELATION_TEXT.test(correlationId) &&
593
+ deadline === null &&
594
+ errorCode === undefined &&
595
+ errorMessage === undefined))
596
+ ) {
597
+ return preparedChannelHeader(
598
+ codecs,
599
+ kind,
600
+ channelName,
601
+ messageName,
602
+ contentType,
603
+ correlationId,
604
+ deadline,
605
+ errorCode,
606
+ errorMessage,
607
+ flowId,
608
+ flowOrigin
609
+ );
610
+ }
522
611
  // The wire has a fixed field order. Measure escaped UTF-8 first, then write
523
612
  // each field once into the only header Buffer: no header object, whole JSON
524
613
  // string, or post-encode byte copy exists on the outbound path.
@@ -560,6 +649,76 @@ function encodeChannelHeader(
560
649
  return result;
561
650
  }
562
651
 
652
+ function preparedChannelHeader(
653
+ codecs: ZLinkChannelEnvelopeCodecRegistry,
654
+ kind: ZLinkChannelMessageKind,
655
+ channelName: string,
656
+ messageName: string,
657
+ contentType: string,
658
+ correlationId: string | null,
659
+ deadline: string | null,
660
+ errorCode: string | null | undefined,
661
+ errorMessage: string | null | undefined,
662
+ flowId: string | undefined,
663
+ flowOrigin: ZLinkFlowOrigin | undefined
664
+ ): Buffer {
665
+ let channels = preparedChannelHeaders.get(codecs.serializers);
666
+ if (channels === undefined)
667
+ preparedChannelHeaders.set(codecs.serializers, (channels = new Map()));
668
+ let packets = channels.get(channelName);
669
+ if (packets === undefined) channels.set(channelName, (packets = new Map()));
670
+ let contentTypes = packets.get(messageName);
671
+ if (contentTypes === undefined) packets.set(messageName, (contentTypes = new Map()));
672
+ let kinds = contentTypes.get(contentType);
673
+ if (kinds === undefined) contentTypes.set(contentType, (kinds = new Map()));
674
+ let deadlines = kinds.get(kind);
675
+ if (deadlines === undefined) kinds.set(kind, (deadlines = new Map()));
676
+ const hasDeadline = deadline !== null;
677
+ let flows = deadlines.get(hasDeadline);
678
+ if (flows === undefined) deadlines.set(hasDeadline, (flows = new Map()));
679
+ let prepared = flows.get(flowOrigin);
680
+ if (prepared === undefined) {
681
+ const bytes = encodeChannelHeader(
682
+ kind,
683
+ channelName,
684
+ messageName,
685
+ contentType,
686
+ correlationId === null ? null : PREPARED_CHANNEL_CORRELATION,
687
+ hasDeadline ? PREPARED_CHANNEL_DEADLINE : null,
688
+ null,
689
+ errorCode,
690
+ errorMessage,
691
+ undefined,
692
+ EMPTY_APPLICATION_METADATA,
693
+ flowOrigin === undefined ? undefined : PREPARED_CHANNEL_FLOW,
694
+ flowOrigin
695
+ );
696
+ prepared = {
697
+ bytes,
698
+ correlationOffset:
699
+ bytes.indexOf(CHANNEL_CORRELATION_FIELD) + CHANNEL_CORRELATION_FIELD.length + 1,
700
+ deadlineOffset: bytes.indexOf(CHANNEL_DEADLINE_FIELD) + CHANNEL_DEADLINE_FIELD.length + 1,
701
+ flowOffset: bytes.indexOf(CHANNEL_FLOW_FIELD) + CHANNEL_FLOW_FIELD.length + 1
702
+ };
703
+ flows.set(flowOrigin, prepared);
704
+ }
705
+ if (correlationId === null && flowId === undefined) return prepared.bytes;
706
+ const bytes = Buffer.allocUnsafe(prepared.bytes.byteLength);
707
+ prepared.bytes.copy(bytes);
708
+ if (correlationId !== null)
709
+ bytes.write(
710
+ correlationId,
711
+ prepared.correlationOffset,
712
+ CHANNEL_CORRELATION_TEXT_LENGTH,
713
+ 'ascii'
714
+ );
715
+ if (deadline !== null)
716
+ bytes.write(deadline, prepared.deadlineOffset, PREPARED_CHANNEL_DEADLINE.length, 'ascii');
717
+ if (flowId !== undefined)
718
+ bytes.write(flowId, prepared.flowOffset, PREPARED_CHANNEL_FLOW.length, 'ascii');
719
+ return bytes;
720
+ }
721
+
563
722
  function writeChannelHeader(
564
723
  writer: ChannelHeaderWriter,
565
724
  kind: ZLinkChannelMessageKind,
@@ -586,9 +745,9 @@ function writeChannelHeader(
586
745
  writer.string(messageName);
587
746
  writer.append(',"contentType":');
588
747
  writer.string(contentType);
589
- writer.append(',"correlationId":');
748
+ writer.append(CHANNEL_CORRELATION_FIELD);
590
749
  writer.nullableString(correlationId);
591
- writer.append(',"deadline":');
750
+ writer.append(CHANNEL_DEADLINE_FIELD);
592
751
  writer.nullableString(deadline);
593
752
  writer.append(',"topic":');
594
753
  writer.nullableString(topic);
@@ -742,13 +901,18 @@ function parseWireJson(payload: string, schema?: ZLinkJsonSchema): unknown {
742
901
  }
743
902
 
744
903
  function parseChannelHeaderBytes(payload: Buffer): unknown {
904
+ const reader = new CanonicalChannelHeaderReader(payload);
905
+ const canonical = tryParseCanonicalChannelHeader(reader);
906
+ // An all-ASCII canonical header is valid UTF-8 by construction; any other
907
+ // header is checked before it is decoded.
908
+ if (canonical !== undefined && !reader.sawNonAscii) return canonical;
745
909
  if (!isUtf8(payload)) {
746
910
  throw new ZLinkFrameworkException(
747
911
  ZLinkFrameworkErrorKind.ProtocolError,
748
912
  'Channel envelope header must contain valid UTF-8.'
749
913
  );
750
914
  }
751
- return tryParseCanonicalChannelHeader(payload) ?? parseFrameworkJsonV1(payload.toString());
915
+ return canonical ?? parseFrameworkJsonV1(payload.toString());
752
916
  }
753
917
 
754
918
  /**
@@ -757,8 +921,9 @@ function parseChannelHeaderBytes(payload: Buffer): unknown {
757
921
  * framework-json-v1 parser, which remains the sole authority for JSON
758
922
  * failures and unknown properties. Header metadata accepts every valid string key.
759
923
  */
760
- function tryParseCanonicalChannelHeader(payload: Buffer): Record<string, unknown> | undefined {
761
- const reader = new CanonicalChannelHeaderReader(payload);
924
+ function tryParseCanonicalChannelHeader(
925
+ reader: CanonicalChannelHeaderReader
926
+ ): Record<string, unknown> | undefined {
762
927
  if (!reader.consume('{"formatMarker":242,"kind":')) return undefined;
763
928
  const kind = reader.readSingleDigit();
764
929
  if (kind === undefined || !reader.consume(',"channelName":')) return undefined;
@@ -785,20 +950,31 @@ function tryParseCanonicalChannelHeader(payload: Buffer): Record<string, unknown
785
950
  deadline: deadline === NULL_JSON_STRING ? null : deadline,
786
951
  topic: topic === NULL_JSON_STRING ? null : topic
787
952
  };
788
- if (!reader.readOptionalNullableString('errorCode', header)) return undefined;
789
- if (!reader.readOptionalNullableString('errorMessage', header)) return undefined;
790
- if (!reader.readOptionalNullableString('source', header)) return undefined;
953
+ if (!reader.readOptionalNullableString(CANONICAL_ERROR_CODE, 'errorCode', header))
954
+ return undefined;
955
+ if (!reader.readOptionalNullableString(CANONICAL_ERROR_MESSAGE, 'errorMessage', header))
956
+ return undefined;
957
+ if (!reader.readOptionalNullableString(CANONICAL_SOURCE, 'source', header)) return undefined;
958
+ // Empty metadata validates to the shared empty record.
791
959
  if (!reader.consume(',"metadata":{}')) return undefined;
792
- header.metadata = {};
793
- if (!reader.readOptionalString('flowId', header)) return undefined;
794
- if (!reader.readOptionalSingleDigit('flowOrigin', header)) return undefined;
960
+ if (!reader.readOptionalString(CANONICAL_FLOW_ID, 'flowId', header)) return undefined;
961
+ if (!reader.readOptionalSingleDigit(CANONICAL_FLOW_ORIGIN, 'flowOrigin', header))
962
+ return undefined;
795
963
  return reader.consume('}') && reader.atEnd() ? header : undefined;
796
964
  }
797
965
 
966
+ const CANONICAL_ERROR_CODE = ',"errorCode":';
967
+ const CANONICAL_ERROR_MESSAGE = ',"errorMessage":';
968
+ const CANONICAL_SOURCE = ',"source":';
969
+ const CANONICAL_FLOW_ID = ',"flowId":';
970
+ const CANONICAL_FLOW_ORIGIN = ',"flowOrigin":';
971
+
798
972
  const NULL_JSON_STRING = Symbol('null JSON string');
799
973
 
800
974
  class CanonicalChannelHeaderReader {
801
975
  private index = 0;
976
+ /** A string held a byte outside ASCII, so the caller must still check UTF-8. */
977
+ sawNonAscii = false;
802
978
 
803
979
  constructor(private readonly bytes: Buffer) {}
804
980
 
@@ -827,13 +1003,19 @@ class CanonicalChannelHeaderReader {
827
1003
  if (this.bytes[this.index] !== 0x22) return undefined;
828
1004
  const start = this.index;
829
1005
  this.index += 1;
1006
+ let hasEscape = false;
830
1007
  while (this.index < this.bytes.length) {
831
1008
  const value = this.bytes[this.index++]!;
832
1009
  if (value === 0x22) {
833
- return JSON.parse(this.bytes.toString('utf8', start, this.index)) as string;
1010
+ // Without escapes the JSON string is its own bytes; decode them once.
1011
+ return hasEscape
1012
+ ? (JSON.parse(this.bytes.toString('utf8', start, this.index)) as string)
1013
+ : this.bytes.toString(this.sawNonAscii ? 'utf8' : 'latin1', start + 1, this.index - 1);
834
1014
  }
835
1015
  if (value < 0x20) return undefined;
1016
+ if (value >= 0x80) this.sawNonAscii = true;
836
1017
  if (value !== 0x5c) continue;
1018
+ hasEscape = true;
837
1019
  if (this.index === this.bytes.length) return undefined;
838
1020
  const escaped = this.bytes[this.index++]!;
839
1021
  if (escaped === 0x75) {
@@ -863,24 +1045,28 @@ class CanonicalChannelHeaderReader {
863
1045
  return this.readString();
864
1046
  }
865
1047
 
866
- readOptionalNullableString(name: string, target: Record<string, unknown>): boolean {
867
- if (!this.consume(`,\"${name}\":`)) return true;
1048
+ readOptionalNullableString(
1049
+ token: string,
1050
+ name: string,
1051
+ target: Record<string, unknown>
1052
+ ): boolean {
1053
+ if (!this.consume(token)) return true;
868
1054
  const value = this.readNullableString();
869
1055
  if (value === undefined) return false;
870
1056
  target[name] = value === NULL_JSON_STRING ? null : value;
871
1057
  return true;
872
1058
  }
873
1059
 
874
- readOptionalString(name: string, target: Record<string, unknown>): boolean {
875
- if (!this.consume(`,\"${name}\":`)) return true;
1060
+ readOptionalString(token: string, name: string, target: Record<string, unknown>): boolean {
1061
+ if (!this.consume(token)) return true;
876
1062
  const value = this.readString();
877
1063
  if (value === undefined) return false;
878
1064
  target[name] = value;
879
1065
  return true;
880
1066
  }
881
1067
 
882
- readOptionalSingleDigit(name: string, target: Record<string, unknown>): boolean {
883
- if (!this.consume(`,\"${name}\":`)) return true;
1068
+ readOptionalSingleDigit(token: string, name: string, target: Record<string, unknown>): boolean {
1069
+ if (!this.consume(token)) return true;
884
1070
  const value = this.readSingleDigit();
885
1071
  if (value === undefined) return false;
886
1072
  target[name] = value;
@@ -994,9 +1180,17 @@ function validateCorrelationForKind(
994
1180
  }
995
1181
  }
996
1182
 
1183
+ const MAXIMUM_CORRELATION_ID_BYTES = 64;
1184
+
1185
+ export function isValidChannelCorrelationId(value: string): boolean {
1186
+ const byteLength = Buffer.byteLength(value, 'utf8');
1187
+ return (
1188
+ byteLength >= 1 && byteLength <= MAXIMUM_CORRELATION_ID_BYTES && /^[\x00-\x7f]*$/.test(value)
1189
+ );
1190
+ }
1191
+
997
1192
  function validateCorrelationValue(correlationId: string): void {
998
- const byteLength = Buffer.byteLength(correlationId, 'utf8');
999
- if (byteLength < 1 || byteLength > 64 || !/^[\x00-\x7f]*$/.test(correlationId)) {
1193
+ if (!isValidChannelCorrelationId(correlationId)) {
1000
1194
  throw new ZLinkConfigurationException(
1001
1195
  'Channel envelope correlationId must be a non-empty ASCII value of at most 64 bytes.'
1002
1196
  );
@@ -128,11 +128,20 @@ export class ZLinkChannelOutboundOperations {
128
128
  request: unknown,
129
129
  timeoutMs: number | undefined,
130
130
  signal?: AbortSignal,
131
- metadata?: ReadonlyMap<string, string>
131
+ metadata?: ReadonlyMap<string, string>,
132
+ onAdmitted?: () => void
132
133
  ): Promise<TReply> {
133
134
  return keepChannelRequestAlive(
134
135
  runWithOutboundFlow(this.dispatchServices.flowCreationEnabled(), () =>
135
- this.requestScoped<TReply>(channelName, packetName, request, timeoutMs, signal, metadata)
136
+ this.requestScoped<TReply>(
137
+ channelName,
138
+ packetName,
139
+ request,
140
+ timeoutMs,
141
+ signal,
142
+ metadata,
143
+ onAdmitted
144
+ )
136
145
  )
137
146
  );
138
147
  }
@@ -143,7 +152,8 @@ export class ZLinkChannelOutboundOperations {
143
152
  request: unknown,
144
153
  timeoutMs: number | undefined,
145
154
  signal?: AbortSignal,
146
- metadata?: ReadonlyMap<string, string>
155
+ metadata?: ReadonlyMap<string, string>,
156
+ onAdmitted?: () => void
147
157
  ): Promise<TReply> {
148
158
  const deadlineMs = timeoutMs === undefined ? undefined : performance.now() + timeoutMs;
149
159
  const deadlineUnixMs = timeoutMs === undefined ? undefined : Date.now() + timeoutMs;
@@ -213,7 +223,8 @@ export class ZLinkChannelOutboundOperations {
213
223
  replyParts = await awaitWithAbort(
214
224
  dealer.request(
215
225
  parts,
216
- remainingRequestTimeout(`Channel request '${channelName}'`, deadlineMs)
226
+ remainingRequestTimeout(`Channel request '${channelName}'`, deadlineMs),
227
+ onAdmitted
217
228
  ),
218
229
  signal
219
230
  );
@@ -397,7 +408,8 @@ export class ZLinkChannelOutboundOperations {
397
408
  request: unknown,
398
409
  timeoutMs: number | undefined,
399
410
  signal?: AbortSignal,
400
- metadata?: ReadonlyMap<string, string>
411
+ metadata?: ReadonlyMap<string, string>,
412
+ onAdmitted?: () => void
401
413
  ): Promise<TReply> {
402
414
  return runWithOutboundFlow(this.dispatchServices.flowCreationEnabled(), () =>
403
415
  this.routeRequestScoped<TReply>(
@@ -407,7 +419,8 @@ export class ZLinkChannelOutboundOperations {
407
419
  request,
408
420
  timeoutMs,
409
421
  signal,
410
- metadata
422
+ metadata,
423
+ onAdmitted
411
424
  )
412
425
  );
413
426
  }
@@ -419,7 +432,8 @@ export class ZLinkChannelOutboundOperations {
419
432
  request: unknown,
420
433
  timeoutMs: number | undefined,
421
434
  signal?: AbortSignal,
422
- metadata?: ReadonlyMap<string, string>
435
+ metadata?: ReadonlyMap<string, string>,
436
+ onAdmitted?: () => void
423
437
  ): Promise<TReply> {
424
438
  let correlationId: string | undefined;
425
439
  let router: ReturnType<ZLinkChannelSocketRegistry['routeRouter']> | undefined;
@@ -471,7 +485,7 @@ export class ZLinkChannelOutboundOperations {
471
485
  });
472
486
  const reply = await this.measureRequest(routerChannelId, async () => {
473
487
  const replyParts = await awaitWithAbort(
474
- router!.request(targetNodeRid, parts, timeoutMs),
488
+ router!.request(targetNodeRid, parts, timeoutMs, onAdmitted),
475
489
  signal
476
490
  );
477
491
  try {
@@ -1,3 +1,4 @@
1
+ import type { ZLinkMeshDispatchAdmission } from '../admission';
1
2
  import { RuntimeDisposal } from '../disposal';
2
3
  import type { ZLinkLocationOptionOverrides } from '../../contracts/Locations/Options';
3
4
  import type { ZLinkRequestHandler, ZLinkSendHandler } from '../../contracts/Handlers';
@@ -50,12 +51,9 @@ import {
50
51
  endpointConnections
51
52
  } from '../../contracts/Configuration/RuntimeEndpointConnections';
52
53
  import type { ApplicationJobQueue } from '../host/application-job-queue';
53
- import { AsyncResource } from 'node:async_hooks';
54
- import { ZLinkStateLane } from '../execution/state-lane';
54
+ import { startOutsideStateLane, ZLinkStateLane } from '../execution/state-lane';
55
55
  import { ZLinkSerialExecutionQueue } from '../execution/serial-execution-queue';
56
56
 
57
- const detachedStateLaneResource = new AsyncResource('zlink:channel-runtime-lifecycle');
58
-
59
57
  interface ManualFanoutSubscriberState {
60
58
  readonly channelName: string;
61
59
  readonly endpoint: string;
@@ -349,8 +347,9 @@ export class ZLinkChannelRuntimeLifecycle {
349
347
  dispatchMeshChannel(
350
348
  meshName: string,
351
349
  record: ReceiveRecord,
352
- signal?: AbortSignal
353
- ): Promise<void> {
350
+ signal?: AbortSignal,
351
+ admit?: ZLinkMeshDispatchAdmission
352
+ ): void | Promise<void> {
354
353
  const channelName = record.channelName;
355
354
  if (channelName === null) {
356
355
  throw new ZLinkConfigurationException('MeshNode channel record is missing channelName.');
@@ -361,17 +360,22 @@ export class ZLinkChannelRuntimeLifecycle {
361
360
  `RouteMesh '${meshName}' channel '${channelName}' has no registered handlers.`
362
361
  );
363
362
  }
364
- return dispatcher.dispatchMesh(record, signal);
363
+ return dispatcher.dispatchMesh(record, signal, admit);
365
364
  }
366
365
 
367
- dispatchMeshRoute(meshName: string, record: ReceiveRecord, signal?: AbortSignal): Promise<void> {
366
+ dispatchMeshRoute(
367
+ meshName: string,
368
+ record: ReceiveRecord,
369
+ signal?: AbortSignal,
370
+ admit?: ZLinkMeshDispatchAdmission
371
+ ): void | Promise<void> {
368
372
  const dispatcher = this.meshRouteDispatchers.get(meshName);
369
373
  if (dispatcher === undefined) {
370
374
  throw new ZLinkConfigurationException(
371
375
  `RouteMesh '${meshName}' has no registered node-direct handlers.`
372
376
  );
373
377
  }
374
- return dispatcher.dispatchMesh(record, signal);
378
+ return dispatcher.dispatchMesh(record, signal, admit);
375
379
  }
376
380
 
377
381
  dispatchLocalMeshRoute(
@@ -1060,7 +1064,3 @@ function hasFanoutLocationTopology(registration: ZLinkFrameworkRegistration): bo
1060
1064
  }
1061
1065
  return false;
1062
1066
  }
1063
-
1064
- function startOutsideStateLane<T>(work: () => T): T {
1065
- return detachedStateLaneResource.runInAsyncScope(work);
1066
- }