@zlink-systems/framework 0.30.1 → 0.30.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
  3. package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
  4. package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
  5. package/dist/contracts/Common/encoded-payload-storage.js +5 -2
  6. package/dist/contracts/Configuration/Builders.d.ts +1 -1
  7. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
  8. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
  9. package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
  10. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  11. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
  12. package/dist/contracts/Locations/Rows.d.ts +2 -0
  13. package/dist/contracts/Spots/Contracts.d.ts +4 -0
  14. package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
  15. package/dist/runtime/abort.d.ts +5 -0
  16. package/dist/runtime/abort.js +10 -0
  17. package/dist/runtime/actors/actor-authority-publication.js +3 -2
  18. package/dist/runtime/actors/actor-client.d.ts +0 -1
  19. package/dist/runtime/actors/actor-client.js +38 -45
  20. package/dist/runtime/actors/actor-context.d.ts +2 -0
  21. package/dist/runtime/actors/actor-context.js +46 -9
  22. package/dist/runtime/actors/actor-handoff.d.ts +7 -3
  23. package/dist/runtime/actors/actor-handoff.js +212 -88
  24. package/dist/runtime/actors/actor-join-relocation.d.ts +2 -0
  25. package/dist/runtime/actors/actor-local-native-join.js +4 -0
  26. package/dist/runtime/actors/actor-mailbox.js +27 -1
  27. package/dist/runtime/actors/actor-remote-joiner.js +3 -1
  28. package/dist/runtime/actors/actor-reply.d.ts +4 -0
  29. package/dist/runtime/actors/actor-reply.js +29 -0
  30. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
  31. package/dist/runtime/actors/actor-runtime-state.js +2 -20
  32. package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
  33. package/dist/runtime/actors/index.d.ts +6 -2
  34. package/dist/runtime/actors/index.js +37 -21
  35. package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
  36. package/dist/runtime/actors/session-disconnected-wire.js +48 -0
  37. package/dist/runtime/admission.d.ts +9 -1
  38. package/dist/runtime/admission.js +55 -32
  39. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +13 -0
  40. package/dist/runtime/application-jobs/application-job-queue-scope.js +27 -1
  41. package/dist/runtime/application-jobs/contracts.d.ts +2 -0
  42. package/dist/runtime/backend/contracts/index.d.ts +19 -3
  43. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
  44. package/dist/runtime/backend/mesh-completion-table.js +5 -0
  45. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +26 -2
  46. package/dist/runtime/backend/mesh-dispatch-pump.js +193 -107
  47. package/dist/runtime/backend/node/node-raw-binding-port.js +90 -58
  48. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +33 -8
  49. package/dist/runtime/backend/node/node-raw-mesh-backend.js +142 -143
  50. package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
  51. package/dist/runtime/backend/node/node-socket-backend-adapter.js +5 -5
  52. package/dist/runtime/channels/channel-clients.d.ts +1 -0
  53. package/dist/runtime/channels/channel-clients.js +20 -5
  54. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +22 -3
  55. package/dist/runtime/channels/channel-dispatch-pipeline.js +103 -57
  56. package/dist/runtime/channels/channel-dispatchers.d.ts +3 -2
  57. package/dist/runtime/channels/channel-dispatchers.js +44 -37
  58. package/dist/runtime/channels/channel-envelope.d.ts +1 -0
  59. package/dist/runtime/channels/channel-envelope.js +74 -31
  60. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
  61. package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
  62. package/dist/runtime/channels/channel-runtime-manager.d.ts +3 -2
  63. package/dist/runtime/channels/channel-runtime-manager.js +4 -4
  64. package/dist/runtime/channels/channel-transports.d.ts +0 -1
  65. package/dist/runtime/channels/channel-transports.js +35 -33
  66. package/dist/runtime/channels/client-server-location-runtime.js +5 -4
  67. package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
  68. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  69. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  70. package/dist/runtime/channels/fanout-location-runtime.js +3 -3
  71. package/dist/runtime/diagnostics/flow-context.js +19 -7
  72. package/dist/runtime/diagnostics/index.js +4 -9
  73. package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
  74. package/dist/runtime/diagnostics/message-flow.js +35 -5
  75. package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
  76. package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
  77. package/dist/runtime/execution/index.d.ts +4 -2
  78. package/dist/runtime/execution/index.js +33 -10
  79. package/dist/runtime/execution/serial-execution-queue.d.ts +4 -0
  80. package/dist/runtime/execution/serial-execution-queue.js +21 -2
  81. package/dist/runtime/execution/state-lane.d.ts +2 -0
  82. package/dist/runtime/execution/state-lane.js +5 -0
  83. package/dist/runtime/foundation/operation-registry.d.ts +25 -1
  84. package/dist/runtime/foundation/operation-registry.js +86 -18
  85. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +39 -3
  86. package/dist/runtime/foundation/raw-service-mesh-runtime.js +151 -55
  87. package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
  88. package/dist/runtime/foundation/service-liveness-registry.js +38 -0
  89. package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
  90. package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
  91. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -3
  92. package/dist/runtime/foundation/service-relocation-object-owner.js +48 -35
  93. package/dist/runtime/foundation/service-relocation-runtime.js +7 -3
  94. package/dist/runtime/foundation/service-runtime-contracts.d.ts +8 -1
  95. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
  96. package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
  97. package/dist/runtime/foundation/service-stateful-registry.js +24 -26
  98. package/dist/runtime/foundation/service-stateful-runtime.d.ts +72 -6
  99. package/dist/runtime/foundation/service-stateful-runtime.js +444 -117
  100. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -1
  101. package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
  102. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
  103. package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
  104. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  105. package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
  106. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +10 -0
  107. package/dist/runtime/foundation/service-wire-m6a-codec.js +166 -53
  108. package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
  109. package/dist/runtime/host/actor-packet-relay.js +59 -72
  110. package/dist/runtime/host/actor-placement-coordinator.js +25 -8
  111. package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
  112. package/dist/runtime/host/actor-transfer-runtime.js +85 -331
  113. package/dist/runtime/host/application-job-queue.d.ts +24 -3
  114. package/dist/runtime/host/application-job-queue.js +28 -41
  115. package/dist/runtime/host/index.d.ts +5 -1
  116. package/dist/runtime/host/index.js +171 -97
  117. package/dist/runtime/host/location-runtime-owner.js +2 -6
  118. package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
  119. package/dist/runtime/host/mesh-router-resolver.js +14 -6
  120. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
  121. package/dist/runtime/host/remote-bound-session-relay.js +71 -190
  122. package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
  123. package/dist/runtime/host/route-mesh-runtime.js +5 -3
  124. package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
  125. package/dist/runtime/host/runtime-shutdown.js +3 -2
  126. package/dist/runtime/host/service-relocation-host-runtime.d.ts +17 -7
  127. package/dist/runtime/host/service-relocation-host-runtime.js +550 -367
  128. package/dist/runtime/host/spot-runtime-options-factory.js +15 -7
  129. package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
  130. package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
  131. package/dist/runtime/locations/auto-connect-loop.js +22 -14
  132. package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
  133. package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
  134. package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
  135. package/dist/runtime/locations/descriptor-publication.js +11 -0
  136. package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
  137. package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
  138. package/dist/runtime/locations/in-memory-authority-store.js +56 -19
  139. package/dist/runtime/locations/in-memory-location-store.js +1 -10
  140. package/dist/runtime/locations/index.d.ts +1 -0
  141. package/dist/runtime/locations/index.js +1 -0
  142. package/dist/runtime/locations/lease-tracker.js +1 -6
  143. package/dist/runtime/locations/location-store-repository.d.ts +51 -1
  144. package/dist/runtime/locations/location-store-repository.js +363 -139
  145. package/dist/runtime/locations/relocation-blob.d.ts +18 -1
  146. package/dist/runtime/locations/relocation-blob.js +52 -1
  147. package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
  148. package/dist/runtime/locations/request-source-resolver.js +80 -0
  149. package/dist/runtime/locations/resolvers.js +1 -1
  150. package/dist/runtime/locations/runtime.d.ts +6 -2
  151. package/dist/runtime/locations/runtime.js +37 -30
  152. package/dist/runtime/messaging/payload-codec.d.ts +7 -1
  153. package/dist/runtime/messaging/payload-codec.js +7 -6
  154. package/dist/runtime/messaging/request-result.js +29 -26
  155. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +19 -1
  156. package/dist/runtime/protocol/service_wire_codec.generated.js +85 -0
  157. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +7 -1
  158. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +23 -7
  159. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +3 -2
  160. package/dist/runtime/spots/index.d.ts +18 -11
  161. package/dist/runtime/spots/index.js +234 -176
  162. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
  163. package/dist/runtime/spots/spot-activation-registry.js +21 -11
  164. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  165. package/dist/runtime/spots/spot-activation-state.js +7 -7
  166. package/dist/runtime/spots/spot-activation.d.ts +6 -3
  167. package/dist/runtime/spots/spot-activation.js +123 -44
  168. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
  169. package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
  170. package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
  171. package/dist/runtime/spots/spot-actor-membership.js +0 -8
  172. package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
  173. package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
  174. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
  175. package/dist/runtime/spots/spot-entry-activation.js +14 -9
  176. package/dist/runtime/spots/spot-handler-registry.d.ts +4 -3
  177. package/dist/runtime/spots/spot-handler-registry.js +6 -2
  178. package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
  179. package/dist/runtime/spots/spot-manager-public.js +2 -2
  180. package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
  181. package/dist/runtime/spots/spot-node-autoconnect.js +18 -39
  182. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
  183. package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
  184. package/dist/runtime/spots/spot-outbound.js +3 -3
  185. package/dist/runtime/spots/spot-remote-codec.js +5 -1
  186. package/dist/runtime/spots/spot-runtime-ports.d.ts +0 -1
  187. package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
  188. package/dist/runtime/spots/spot-serial-executor.js +61 -8
  189. package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
  190. package/dist/runtime/spots/spot-subscription-dispatch.js +1 -1
  191. package/dist/runtime/spots/spot-timer.d.ts +57 -5
  192. package/dist/runtime/spots/spot-timer.js +287 -103
  193. package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
  194. package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
  195. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
  196. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
  197. package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
  198. package/dist/runtime/streams/bound-session-service.d.ts +1 -1
  199. package/dist/runtime/streams/bound-session-service.js +6 -11
  200. package/dist/runtime/streams/index.d.ts +3 -2
  201. package/dist/runtime/streams/index.js +6 -4
  202. package/dist/runtime/streams/managed-stream.js +3 -2
  203. package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
  204. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
  205. package/dist/runtime/streams/session-actor-coordinator.js +15 -32
  206. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
  207. package/dist/runtime/streams/stream-session-runtime.js +1 -4
  208. package/dist/runtime/workers/index.js +1 -1
  209. package/package.json +3 -3
  210. package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
  211. package/src/contracts/Common/encoded-payload-storage.ts +6 -3
  212. package/src/contracts/Configuration/Builders.ts +4 -1
  213. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
  214. package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
  215. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  216. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
  217. package/src/contracts/Locations/Rows.ts +2 -0
  218. package/src/contracts/Spots/Contracts.ts +8 -0
  219. package/src/contracts/Spots/ZLinkSpot.ts +3 -3
  220. package/src/runtime/abort.ts +12 -0
  221. package/src/runtime/actors/actor-authority-publication.ts +3 -2
  222. package/src/runtime/actors/actor-client.ts +61 -70
  223. package/src/runtime/actors/actor-context.ts +49 -9
  224. package/src/runtime/actors/actor-handoff.ts +282 -106
  225. package/src/runtime/actors/actor-join-relocation.ts +2 -0
  226. package/src/runtime/actors/actor-local-native-join.ts +4 -0
  227. package/src/runtime/actors/actor-mailbox.ts +40 -2
  228. package/src/runtime/actors/actor-remote-joiner.ts +6 -1
  229. package/src/runtime/actors/actor-reply.ts +42 -0
  230. package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
  231. package/src/runtime/actors/actor-runtime-state.ts +2 -20
  232. package/src/runtime/actors/actor-source-transfer.ts +1 -34
  233. package/src/runtime/actors/index.ts +41 -27
  234. package/src/runtime/actors/session-disconnected-wire.ts +66 -0
  235. package/src/runtime/admission.ts +69 -34
  236. package/src/runtime/application-jobs/application-job-queue-scope.ts +33 -1
  237. package/src/runtime/application-jobs/contracts.ts +2 -0
  238. package/src/runtime/backend/contracts/index.ts +39 -4
  239. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
  240. package/src/runtime/backend/mesh-completion-table.ts +4 -0
  241. package/src/runtime/backend/mesh-dispatch-pump.ts +223 -124
  242. package/src/runtime/backend/node/node-raw-binding-port.ts +106 -70
  243. package/src/runtime/backend/node/node-raw-mesh-backend.ts +221 -170
  244. package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -5
  245. package/src/runtime/channels/channel-clients.ts +49 -24
  246. package/src/runtime/channels/channel-dispatch-pipeline.ts +173 -124
  247. package/src/runtime/channels/channel-dispatchers.ts +116 -72
  248. package/src/runtime/channels/channel-envelope.ts +105 -36
  249. package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
  250. package/src/runtime/channels/channel-runtime-manager.ts +12 -5
  251. package/src/runtime/channels/channel-transports.ts +49 -58
  252. package/src/runtime/channels/client-server-location-runtime.ts +11 -10
  253. package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
  254. package/src/runtime/channels/fanout-location-runtime.ts +17 -9
  255. package/src/runtime/diagnostics/flow-context.ts +20 -7
  256. package/src/runtime/diagnostics/index.ts +1 -7
  257. package/src/runtime/diagnostics/message-flow.ts +47 -9
  258. package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
  259. package/src/runtime/execution/index.ts +40 -14
  260. package/src/runtime/execution/serial-execution-queue.ts +31 -4
  261. package/src/runtime/execution/state-lane.ts +7 -0
  262. package/src/runtime/foundation/operation-registry.ts +98 -20
  263. package/src/runtime/foundation/raw-service-mesh-runtime.ts +244 -67
  264. package/src/runtime/foundation/service-liveness-registry.ts +39 -0
  265. package/src/runtime/foundation/service-mailbox.ts +8 -0
  266. package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
  267. package/src/runtime/foundation/service-relocation-object-owner.ts +54 -37
  268. package/src/runtime/foundation/service-relocation-runtime.ts +7 -3
  269. package/src/runtime/foundation/service-runtime-contracts.ts +12 -1
  270. package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
  271. package/src/runtime/foundation/service-stateful-registry.ts +38 -35
  272. package/src/runtime/foundation/service-stateful-runtime.ts +667 -152
  273. package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -11
  274. package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
  275. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  276. package/src/runtime/foundation/service-wire-m6a-codec.ts +187 -51
  277. package/src/runtime/host/actor-packet-relay.ts +113 -94
  278. package/src/runtime/host/actor-placement-coordinator.ts +31 -8
  279. package/src/runtime/host/actor-transfer-runtime.ts +104 -430
  280. package/src/runtime/host/application-job-queue.ts +29 -44
  281. package/src/runtime/host/index.ts +286 -129
  282. package/src/runtime/host/location-runtime-owner.ts +2 -6
  283. package/src/runtime/host/mesh-router-resolver.ts +13 -5
  284. package/src/runtime/host/remote-bound-session-relay.ts +86 -248
  285. package/src/runtime/host/route-mesh-runtime.ts +11 -5
  286. package/src/runtime/host/runtime-shutdown.ts +15 -4
  287. package/src/runtime/host/service-relocation-host-runtime.ts +784 -475
  288. package/src/runtime/host/spot-runtime-options-factory.ts +18 -7
  289. package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
  290. package/src/runtime/locations/auto-connect-loop.ts +22 -14
  291. package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
  292. package/src/runtime/locations/auto-connect-types.ts +0 -1
  293. package/src/runtime/locations/descriptor-publication.ts +7 -0
  294. package/src/runtime/locations/domain-store-contract.ts +5 -0
  295. package/src/runtime/locations/in-memory-authority-store.ts +85 -23
  296. package/src/runtime/locations/in-memory-location-store.ts +1 -12
  297. package/src/runtime/locations/index.ts +1 -0
  298. package/src/runtime/locations/lease-tracker.ts +2 -9
  299. package/src/runtime/locations/location-store-repository.ts +628 -152
  300. package/src/runtime/locations/relocation-blob.ts +75 -1
  301. package/src/runtime/locations/request-source-resolver.ts +138 -0
  302. package/src/runtime/locations/resolvers.ts +2 -2
  303. package/src/runtime/locations/runtime.ts +70 -40
  304. package/src/runtime/messaging/payload-codec.ts +8 -11
  305. package/src/runtime/messaging/request-result.ts +33 -29
  306. package/src/runtime/protocol/service_wire_codec.generated.ts +87 -4
  307. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +13 -10
  308. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +3 -2
  309. package/src/runtime/spots/index.ts +375 -281
  310. package/src/runtime/spots/spot-activation-registry.ts +25 -13
  311. package/src/runtime/spots/spot-activation-state.ts +12 -19
  312. package/src/runtime/spots/spot-activation.ts +170 -86
  313. package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
  314. package/src/runtime/spots/spot-actor-membership.ts +0 -15
  315. package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
  316. package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
  317. package/src/runtime/spots/spot-entry-activation.ts +24 -19
  318. package/src/runtime/spots/spot-handler-registry.ts +15 -4
  319. package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
  320. package/src/runtime/spots/spot-manager-public.ts +2 -2
  321. package/src/runtime/spots/spot-node-autoconnect.ts +22 -45
  322. package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
  323. package/src/runtime/spots/spot-outbound.ts +3 -3
  324. package/src/runtime/spots/spot-remote-codec.ts +9 -2
  325. package/src/runtime/spots/spot-runtime-ports.ts +0 -1
  326. package/src/runtime/spots/spot-serial-executor.ts +97 -25
  327. package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
  328. package/src/runtime/spots/spot-subscription-dispatch.ts +1 -1
  329. package/src/runtime/spots/spot-timer.ts +413 -157
  330. package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
  331. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
  332. package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
  333. package/src/runtime/streams/bound-session-service.ts +7 -10
  334. package/src/runtime/streams/index.ts +12 -6
  335. package/src/runtime/streams/managed-stream.ts +4 -2
  336. package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
  337. package/src/runtime/streams/session-actor-coordinator.ts +39 -88
  338. package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
  339. package/src/runtime/streams/stream-session-runtime.ts +1 -5
  340. package/src/runtime/workers/index.ts +1 -1
@@ -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;
@@ -43,8 +44,20 @@ const CHANNEL_CORRELATION_TEXT_LENGTH = 32;
43
44
  const PREPARED_CHANNEL_CORRELATION = '0'.repeat(CHANNEL_CORRELATION_TEXT_LENGTH);
44
45
  const PREPARED_CHANNEL_DEADLINE = '2000-01-01T00:00:00.000Z';
45
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;
46
57
  function newChannelCorrelationId() {
47
- 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'));
48
61
  }
49
62
  function encodeChannelEnvelopeParts(kind, channelName, packetName, payload, timeoutMs, topic, codecs, correlationId, createFlow = true, metadata = EMPTY_OUTBOUND_METADATA) {
50
63
  return encodeChannelEnvelopePartsAtDeadline(kind, channelName, packetName, payload, timeoutMs === undefined ? undefined : Date.now() + timeoutMs, topic, codecs, correlationId, createFlow, metadata);
@@ -114,6 +127,9 @@ const ERROR_KIND_WIRE_NAMES = [
114
127
  'internal_failure' // 11
115
128
  ];
116
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
+ }
117
133
  function channelErrorCodeName(kind) {
118
134
  return ERROR_KIND_WIRE_NAMES[kind] ?? 'internal_failure';
119
135
  }
@@ -149,7 +165,7 @@ function decodeChannelReply(parts, codecs) {
149
165
  return runtime_message_1.ZLinkBufferMessage.retainPayload(parts[1]);
150
166
  }
151
167
  if (serializer !== undefined) {
152
- return serializer.deserialize(contracts_1.ZLinkEncodedPayload.from(parts[1].data()), Object);
168
+ return serializer.deserialize((0, payload_codec_1.encodedPayloadFromOwned)(parts[1].data()), Object);
153
169
  }
154
170
  return parseWireJson(parts[1].data().toString(), (0, Attributes_1.readZLinkPacketJsonContract)(header.messageName)?.reply);
155
171
  }
@@ -164,7 +180,7 @@ function decodeChannelError(header) {
164
180
  // Cross-language contract: errorCode carries the snake_case wire name.
165
181
  // An unknown name degrades to InternalFailure, matching the C++
166
182
  // request_failure_mapper fallback for unrecognized codes.
167
- const publicKind = ERROR_KIND_BY_WIRE_NAME.get(code) ?? contracts_1.ZLinkFrameworkErrorKind.InternalFailure;
183
+ const publicKind = channelErrorKindFromCode(code) ?? contracts_1.ZLinkFrameworkErrorKind.InternalFailure;
168
184
  failure = new contracts_1.ZLinkFrameworkException(publicKind, message);
169
185
  }
170
186
  // Cross-language contract (.NET ZLinkErrorOriginWire.RemoteReplyOrigin /
@@ -206,7 +222,7 @@ function decodeChannelPayload(envelope, codecs) {
206
222
  }
207
223
  const serializer = codecs?.serializers.get(envelope.header.contentType);
208
224
  if (serializer !== undefined) {
209
- return serializer.deserialize(contracts_1.ZLinkEncodedPayload.from(envelope.payload), Object);
225
+ return serializer.deserialize((0, payload_codec_1.encodedPayloadFromOwned)(envelope.payload), Object);
210
226
  }
211
227
  if (envelope.header.contentType === exports.BINARY_CONTENT_TYPE) {
212
228
  // The receive loop owns the Message for the duration of dispatch, so
@@ -282,8 +298,9 @@ function encodeJsonBytes(value, schema) {
282
298
  function encodeChannelHeader(kind, channelName, messageName, contentType, correlationId, deadline, topic, errorCode, errorMessage, source, metadata, flowId, flowOrigin, codecs) {
283
299
  if (codecs !== undefined &&
284
300
  metadata === EMPTY_APPLICATION_METADATA &&
285
- flowId === undefined &&
286
- flowOrigin === undefined &&
301
+ (flowId === undefined
302
+ ? flowOrigin === undefined
303
+ : flowOrigin !== undefined && CHANNEL_FLOW_TEXT.test(flowId)) &&
287
304
  topic === null &&
288
305
  source === undefined &&
289
306
  ((kind === 3 /* ZLinkChannelMessageKind.Command */ &&
@@ -304,7 +321,7 @@ function encodeChannelHeader(kind, channelName, messageName, contentType, correl
304
321
  deadline === null &&
305
322
  errorCode === undefined &&
306
323
  errorMessage === undefined))) {
307
- return preparedChannelHeader(codecs, kind, channelName, messageName, contentType, correlationId, deadline, errorCode, errorMessage);
324
+ return preparedChannelHeader(codecs, kind, channelName, messageName, contentType, correlationId, deadline, errorCode, errorMessage, flowId, flowOrigin);
308
325
  }
309
326
  // The wire has a fixed field order. Measure escaped UTF-8 first, then write
310
327
  // each field once into the only header Buffer: no header object, whole JSON
@@ -316,7 +333,7 @@ function encodeChannelHeader(kind, channelName, messageName, contentType, correl
316
333
  writeChannelHeader(writer, kind, channelName, messageName, contentType, correlationId, deadline, topic, errorCode, errorMessage, source, metadata, flowId, flowOrigin);
317
334
  return result;
318
335
  }
319
- function preparedChannelHeader(codecs, kind, channelName, messageName, contentType, correlationId, deadline, errorCode, errorMessage) {
336
+ function preparedChannelHeader(codecs, kind, channelName, messageName, contentType, correlationId, deadline, errorCode, errorMessage, flowId, flowOrigin) {
320
337
  let channels = preparedChannelHeaders.get(codecs.serializers);
321
338
  if (channels === undefined)
322
339
  preparedChannelHeaders.set(codecs.serializers, (channels = new Map()));
@@ -333,23 +350,30 @@ function preparedChannelHeader(codecs, kind, channelName, messageName, contentTy
333
350
  if (deadlines === undefined)
334
351
  kinds.set(kind, (deadlines = new Map()));
335
352
  const hasDeadline = deadline !== null;
336
- let prepared = deadlines.get(hasDeadline);
353
+ let flows = deadlines.get(hasDeadline);
354
+ if (flows === undefined)
355
+ deadlines.set(hasDeadline, (flows = new Map()));
356
+ let prepared = flows.get(flowOrigin);
337
357
  if (prepared === undefined) {
338
- 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, undefined, 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);
339
359
  prepared = {
340
360
  bytes,
341
361
  correlationOffset: bytes.indexOf(CHANNEL_CORRELATION_FIELD) + CHANNEL_CORRELATION_FIELD.length + 1,
342
- deadlineOffset: bytes.indexOf(CHANNEL_DEADLINE_FIELD) + CHANNEL_DEADLINE_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
343
364
  };
344
- deadlines.set(hasDeadline, prepared);
365
+ flows.set(flowOrigin, prepared);
345
366
  }
346
- if (correlationId === null)
367
+ if (correlationId === null && flowId === undefined)
347
368
  return prepared.bytes;
348
- const bytes = Buffer.alloc(prepared.bytes.byteLength);
369
+ const bytes = Buffer.allocUnsafe(prepared.bytes.byteLength);
349
370
  prepared.bytes.copy(bytes);
350
- bytes.write(correlationId, prepared.correlationOffset, CHANNEL_CORRELATION_TEXT_LENGTH, 'ascii');
371
+ if (correlationId !== null)
372
+ bytes.write(correlationId, prepared.correlationOffset, CHANNEL_CORRELATION_TEXT_LENGTH, 'ascii');
351
373
  if (deadline !== null)
352
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');
353
377
  return bytes;
354
378
  }
355
379
  function writeChannelHeader(writer, kind, channelName, messageName, contentType, correlationId, deadline, topic, errorCode, errorMessage, source, metadata, flowId, flowOrigin) {
@@ -509,10 +533,16 @@ function parseWireJson(payload, schema) {
509
533
  }, schema);
510
534
  }
511
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;
512
542
  if (!(0, node_buffer_1.isUtf8)(payload)) {
513
543
  throw new contracts_1.ZLinkFrameworkException(contracts_1.ZLinkFrameworkErrorKind.ProtocolError, 'Channel envelope header must contain valid UTF-8.');
514
544
  }
515
- return tryParseCanonicalChannelHeader(payload) ?? (0, framework_json_v1_1.parseFrameworkJsonV1)(payload.toString());
545
+ return canonical ?? (0, framework_json_v1_1.parseFrameworkJsonV1)(payload.toString());
516
546
  }
517
547
  /**
518
548
  * Accept the byte layout emitted by writeChannelHeader without materializing
@@ -520,8 +550,7 @@ function parseChannelHeaderBytes(payload) {
520
550
  * framework-json-v1 parser, which remains the sole authority for JSON
521
551
  * failures and unknown properties. Header metadata accepts every valid string key.
522
552
  */
523
- function tryParseCanonicalChannelHeader(payload) {
524
- const reader = new CanonicalChannelHeaderReader(payload);
553
+ function tryParseCanonicalChannelHeader(reader) {
525
554
  if (!reader.consume('{"formatMarker":242,"kind":'))
526
555
  return undefined;
527
556
  const kind = reader.readSingleDigit();
@@ -555,25 +584,32 @@ function tryParseCanonicalChannelHeader(payload) {
555
584
  deadline: deadline === NULL_JSON_STRING ? null : deadline,
556
585
  topic: topic === NULL_JSON_STRING ? null : topic
557
586
  };
558
- if (!reader.readOptionalNullableString('errorCode', header))
587
+ if (!reader.readOptionalNullableString(CANONICAL_ERROR_CODE, 'errorCode', header))
559
588
  return undefined;
560
- if (!reader.readOptionalNullableString('errorMessage', header))
589
+ if (!reader.readOptionalNullableString(CANONICAL_ERROR_MESSAGE, 'errorMessage', header))
561
590
  return undefined;
562
- if (!reader.readOptionalNullableString('source', header))
591
+ if (!reader.readOptionalNullableString(CANONICAL_SOURCE, 'source', header))
563
592
  return undefined;
593
+ // Empty metadata validates to the shared empty record.
564
594
  if (!reader.consume(',"metadata":{}'))
565
595
  return undefined;
566
- header.metadata = {};
567
- if (!reader.readOptionalString('flowId', header))
596
+ if (!reader.readOptionalString(CANONICAL_FLOW_ID, 'flowId', header))
568
597
  return undefined;
569
- if (!reader.readOptionalSingleDigit('flowOrigin', header))
598
+ if (!reader.readOptionalSingleDigit(CANONICAL_FLOW_ORIGIN, 'flowOrigin', header))
570
599
  return undefined;
571
600
  return reader.consume('}') && reader.atEnd() ? header : undefined;
572
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":';
573
607
  const NULL_JSON_STRING = Symbol('null JSON string');
574
608
  class CanonicalChannelHeaderReader {
575
609
  bytes;
576
610
  index = 0;
611
+ /** A string held a byte outside ASCII, so the caller must still check UTF-8. */
612
+ sawNonAscii = false;
577
613
  constructor(bytes) {
578
614
  this.bytes = bytes;
579
615
  }
@@ -604,15 +640,22 @@ class CanonicalChannelHeaderReader {
604
640
  return undefined;
605
641
  const start = this.index;
606
642
  this.index += 1;
643
+ let hasEscape = false;
607
644
  while (this.index < this.bytes.length) {
608
645
  const value = this.bytes[this.index++];
609
646
  if (value === 0x22) {
610
- 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);
611
651
  }
612
652
  if (value < 0x20)
613
653
  return undefined;
654
+ if (value >= 0x80)
655
+ this.sawNonAscii = true;
614
656
  if (value !== 0x5c)
615
657
  continue;
658
+ hasEscape = true;
616
659
  if (this.index === this.bytes.length)
617
660
  return undefined;
618
661
  const escaped = this.bytes[this.index++];
@@ -643,8 +686,8 @@ class CanonicalChannelHeaderReader {
643
686
  return NULL_JSON_STRING;
644
687
  return this.readString();
645
688
  }
646
- readOptionalNullableString(name, target) {
647
- if (!this.consume(`,\"${name}\":`))
689
+ readOptionalNullableString(token, name, target) {
690
+ if (!this.consume(token))
648
691
  return true;
649
692
  const value = this.readNullableString();
650
693
  if (value === undefined)
@@ -652,8 +695,8 @@ class CanonicalChannelHeaderReader {
652
695
  target[name] = value === NULL_JSON_STRING ? null : value;
653
696
  return true;
654
697
  }
655
- readOptionalString(name, target) {
656
- if (!this.consume(`,\"${name}\":`))
698
+ readOptionalString(token, name, target) {
699
+ if (!this.consume(token))
657
700
  return true;
658
701
  const value = this.readString();
659
702
  if (value === undefined)
@@ -661,8 +704,8 @@ class CanonicalChannelHeaderReader {
661
704
  target[name] = value;
662
705
  return true;
663
706
  }
664
- readOptionalSingleDigit(name, target) {
665
- if (!this.consume(`,\"${name}\":`))
707
+ readOptionalSingleDigit(token, name, target) {
708
+ if (!this.consume(token))
666
709
  return true;
667
710
  const value = this.readSingleDigit();
668
711
  if (value === undefined)
@@ -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,8 +41,8 @@ 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>;
@@ -126,11 +126,11 @@ class ZLinkChannelRuntimeManager {
126
126
  prepareMeshDispatch(taskRunner) {
127
127
  this.lifecycle.prepareMeshDispatch(taskRunner);
128
128
  }
129
- dispatchMeshChannel(meshName, record, signal) {
130
- return this.lifecycle.dispatchMeshChannel(meshName, record, signal);
129
+ dispatchMeshChannel(meshName, record, signal, admit) {
130
+ return this.lifecycle.dispatchMeshChannel(meshName, record, signal, admit);
131
131
  }
132
- dispatchMeshRoute(meshName, record, signal) {
133
- return this.lifecycle.dispatchMeshRoute(meshName, record, signal);
132
+ dispatchMeshRoute(meshName, record, signal, admit) {
133
+ return this.lifecycle.dispatchMeshRoute(meshName, record, signal, admit);
134
134
  }
135
135
  dispatchLocalMeshRoute(meshName, sourceNodeRid, parts, signal) {
136
136
  return this.lifecycle.dispatchLocalMeshRoute(meshName, sourceNodeRid, parts, signal);
@@ -79,7 +79,6 @@ export declare class ZLinkRuntimeRouteTransport implements ZLinkRouteClientTrans
79
79
  private submitToChannelScoped;
80
80
  requestToChannel<TReply>(meshName: string, channelName: string, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>, onAdmitted?: () => void): Promise<TReply>;
81
81
  private requestToChannelScoped;
82
- private submitRequestOperation;
83
82
  sendToSpot(spotRouteTarget: ZLinkSpotRouteTarget, message: unknown, options: ZLinkSpotRoutedSendOptions): Promise<ZLinkSubmitResult>;
84
83
  private sendToSpotScoped;
85
84
  sendFromSpotToSpot(sourceSpot: ZLinkBackendSpot, spotRouteTarget: ZLinkSpotRouteTarget, message: unknown, options: {
@@ -112,15 +112,18 @@ class ZLinkRuntimeRouteTransport {
112
112
  throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestTargetNotFound, `MeshNode '${meshName}' target '${targetNodeRid}' is an Object Client.`);
113
113
  }
114
114
  const parts = this.encodeMessage(1 /* ZLinkChannelMessageKind.Request */, meshName, packetName, request, timeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS, metadata, correlationId);
115
- const completion = await this.submitRequestOperation(meshName, timeoutMs, signal, `MeshNode '${meshName}' request to node '${targetNodeRid}'`, (remainingTimeoutMs) => {
116
- const operationId = node.requestToNode((0, routing_id_1.toBackendRoutingId)(targetNodeRid), parts, {
117
- flags: 1,
118
- onAdmitted,
119
- timeoutMs: remainingTimeoutMs
120
- });
121
- this.traceNodeRequest(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Sent, undefined, meshName, targetNodeRid, packetName, correlationId);
122
- return operationId;
123
- });
115
+ const requestOptions = { flags: 1, onAdmitted, timeoutMs: requestTimeoutBudget(timeoutMs) };
116
+ let completion;
117
+ try {
118
+ completion = await this.completionTable(meshName).submit(() => {
119
+ const operationId = node.requestToNode((0, routing_id_1.toBackendRoutingId)(targetNodeRid), parts, requestOptions);
120
+ this.traceNodeRequest(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Sent, undefined, meshName, targetNodeRid, packetName, correlationId);
121
+ return operationId;
122
+ }, signal);
123
+ }
124
+ catch (error) {
125
+ throw mapMeshSubmissionError(error, `MeshNode '${meshName}' request to node '${targetNodeRid}'`);
126
+ }
124
127
  const reply = this.decodeMeshReply(meshName, completion);
125
128
  this.traceNodeRequest(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.ReplyReceived, 'succeeded', meshName, targetNodeRid, packetName, correlationId);
126
129
  return reply;
@@ -176,37 +179,27 @@ class ZLinkRuntimeRouteTransport {
176
179
  const parts = this.encodeMessage(1 /* ZLinkChannelMessageKind.Request */, channelName, packetName, request, timeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS, metadata);
177
180
  const metric = this.metrics?.startRequest(meshName, 'channel');
178
181
  try {
179
- const completion = await this.submitRequestOperation(meshName, timeoutMs, signal, `MeshNode '${meshName}' request to channel '${channelName}'`, (remainingTimeoutMs) => node.requestToChannel(channelName, parts, {
180
- flags: 1,
181
- timeoutMs: remainingTimeoutMs,
182
- onAdmitted
183
- }));
182
+ const requestOptions = { flags: 1, timeoutMs: requestTimeoutBudget(timeoutMs), onAdmitted };
183
+ let completion;
184
+ try {
185
+ completion = await this.completionTable(meshName).submit(() => node.requestToChannel(channelName, parts, requestOptions), signal);
186
+ }
187
+ catch (error) {
188
+ throw mapMeshSubmissionError(error, `MeshNode '${meshName}' request to channel '${channelName}'`);
189
+ }
184
190
  const reply = this.decodeMeshReply(meshName, completion);
185
191
  metric?.complete('completed');
186
192
  return reply;
187
193
  }
188
194
  catch (error) {
189
- metric?.complete(requestMetricOutcome(error));
190
- if (requestMetricOutcome(error) === 'target_not_found') {
195
+ metric?.complete(requestMetricOutcome(error, signal));
196
+ if (error instanceof contracts_1.ZLinkFrameworkException &&
197
+ (0, framework_errors_internal_1.internalFrameworkErrorKind)(error) === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestTargetNotFound) {
191
198
  this.metrics?.recordChannelSelectionFailure(meshName, channelName, 'no_ready_target');
192
199
  }
193
200
  throw error;
194
201
  }
195
202
  }
196
- async submitRequestOperation(meshName, timeoutMs, signal, operation, attempt) {
197
- const effectiveTimeoutMs = Math.max(1, timeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS);
198
- const deadlineMs = performance.now() + effectiveTimeoutMs;
199
- const remainingTimeoutMs = deadlineMs - performance.now();
200
- if (remainingTimeoutMs <= 0) {
201
- throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.DeadlineExceeded, `${operation} timed out before submission.`);
202
- }
203
- try {
204
- return await this.completionTable(meshName).submit(() => attempt(Math.max(1, Math.ceil(remainingTimeoutMs))), signal);
205
- }
206
- catch (error) {
207
- throw mapMeshSubmissionError(error, operation);
208
- }
209
- }
210
203
  sendToSpot(spotRouteTarget, message, options) {
211
204
  return (0, flow_context_1.runWithOutboundFlow)(this.flowCreationEnabled(), () => this.sendToSpotScoped(spotRouteTarget, message, options));
212
205
  }
@@ -428,6 +421,13 @@ function instanceSpotRouteFence(target) {
428
421
  storeVersion: target.authorityStoreVersion
429
422
  };
430
423
  }
424
+ /**
425
+ * The binding request timeout for one submission. The binding owns the
426
+ * deadline after submit; the completion table slot only waits for it.
427
+ */
428
+ function requestTimeoutBudget(timeoutMs) {
429
+ return Math.max(1, Math.ceil(timeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS));
430
+ }
431
431
  function mapMeshSubmitResult(result) {
432
432
  return (0, submission_result_1.classifySubmitResult)(result, 'Mesh submission');
433
433
  }
@@ -486,14 +486,16 @@ function meshRequestFailure(meshName, result, nativeErrno) {
486
486
  });
487
487
  return error;
488
488
  }
489
- function requestMetricOutcome(error) {
489
+ function requestMetricOutcome(error, signal) {
490
490
  if (error instanceof contracts_1.ZLinkFrameworkException) {
491
- if ((0, framework_errors_internal_1.internalFrameworkErrorKind)(error) === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestTargetNotFound)
492
- return 'target_not_found';
493
491
  if ((0, framework_errors_internal_1.internalFrameworkErrorKind)(error) === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.DeadlineExceeded)
494
492
  return 'timed_out';
495
493
  if ((0, framework_errors_internal_1.internalFrameworkErrorKind)(error) === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RuntimeShutdown)
496
494
  return 'shutdown';
497
495
  }
496
+ if (signal?.aborted === true &&
497
+ (error === signal.reason ||
498
+ (error instanceof Error && (error.cause === signal.reason || error.name === 'AbortError'))))
499
+ return 'cancelled';
498
500
  return 'failed';
499
501
  }
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ZLinkClientServerLocationRuntime = void 0;
4
+ const routing_id_1 = require("../routing-id");
4
5
  const RegistrationBuilderPolicy_1 = require("../../contracts/Configuration/RegistrationBuilderPolicy");
5
6
  const Locations_1 = require("../../contracts/Locations");
6
7
  const Options_1 = require("../../contracts/Locations/Options");
@@ -91,7 +92,7 @@ class ZLinkClientServerLocationRuntime {
91
92
  ownerId: owner.ownerId,
92
93
  leaseGeneration: owner.leaseGeneration
93
94
  };
94
- const result = await this.store.updateClientServer(candidate, Locations_1.ZLinkLocationWriteIntent.Takeover, signal);
95
+ const result = await this.locationRuntime.writeDescriptor((writeSignal) => this.store.updateClientServer(candidate, Locations_1.ZLinkLocationWriteIntent.Takeover, writeSignal), signal);
95
96
  if (result.status !== Locations_1.ZLinkLocationWriteStatus.Stored) {
96
97
  throw new configuration_1.ZLinkConfigurationException(`ClientServer server '${channelName}' descriptor recovery was fenced.`);
97
98
  }
@@ -115,7 +116,7 @@ class ZLinkClientServerLocationRuntime {
115
116
  descriptorRevision: current.descriptorRevision + 1n,
116
117
  weight: runtimeWeight
117
118
  };
118
- const result = await this.store.updateClientServer(candidate, Locations_1.ZLinkLocationWriteIntent.Renew, signal);
119
+ const result = await this.locationRuntime.writeDescriptor((writeSignal) => this.store.updateClientServer(candidate, Locations_1.ZLinkLocationWriteIntent.Renew, writeSignal), signal);
119
120
  if (result.status !== Locations_1.ZLinkLocationWriteStatus.Stored) {
120
121
  throw new configuration_1.ZLinkConfigurationException(`ClientServer server '${channelName}' descriptor renewal was fenced.`);
121
122
  }
@@ -138,7 +139,7 @@ class ZLinkClientServerLocationRuntime {
138
139
  leaseGeneration: owner.leaseGeneration,
139
140
  updatedAt: new Date(0)
140
141
  };
141
- const result = await this.store.updateClientServer(descriptor, Locations_1.ZLinkLocationWriteIntent.NewClaim, signal);
142
+ const result = await this.locationRuntime.writeDescriptor((writeSignal) => this.store.updateClientServer(descriptor, Locations_1.ZLinkLocationWriteIntent.NewClaim, writeSignal), signal);
142
143
  if (result.status !== Locations_1.ZLinkLocationWriteStatus.Stored) {
143
144
  throw new configuration_1.ZLinkConfigurationException(`ClientServer server '${channelName}' descriptor claim failed with '${result.status}'.`);
144
145
  }
@@ -452,7 +453,7 @@ function requestAdmission(dealer, descriptor, timeoutMs) {
452
453
  }
453
454
  function requireMatchingAdmission(expected, actual) {
454
455
  if (actual.channelName !== expected.channelName ||
455
- actual.serverRid !== String(expected.serverRid) ||
456
+ !(0, routing_id_1.routingIdsEqual)(actual.serverRid, expected.serverRid) ||
456
457
  actual.lifecycleGeneration !== expected.lifecycleGeneration ||
457
458
  actual.descriptorRevision !== expected.descriptorRevision ||
458
459
  actual.weight !== expected.weight ||
@@ -4,9 +4,10 @@ import type { ZLinkDispatchErrorSink } from '../diagnostics/dispatch-error-port'
4
4
  export type { ZLinkDispatchErrorSink } from '../diagnostics/dispatch-error-port';
5
5
  type ZLinkRuntimeDispatchFailure = ZLinkDispatchFailure & {
6
6
  readonly error?: unknown;
7
+ readonly severity?: 'warning';
7
8
  };
8
9
  export declare class ZLinkDispatchErrorReporter {
9
- private readonly metrics?;
10
+ readonly metrics?: ZLinkRuntimeMetrics | undefined;
10
11
  private reportedEvents;
11
12
  /**
12
13
  * Success-path tracer companion: every surface already receives a reporter, so
@@ -63,7 +63,8 @@ class ZLinkDispatchErrorReporter {
63
63
  errorType: errorInfo.errorType,
64
64
  errorMessage: errorInfo.errorMessage,
65
65
  errorCauseType: errorInfo.errorCauseType,
66
- errorCauseMessage: errorInfo.errorCauseMessage
66
+ errorCauseMessage: errorInfo.errorCauseMessage,
67
+ severity: normalized.severity
67
68
  });
68
69
  }
69
70
  captureEnabled() {