@zlink-systems/framework 0.29.1 → 0.30.1

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 (322) 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/ZLinkMessageMetadata.js +11 -5
  6. package/dist/contracts/Configuration/Builders.d.ts +1 -2
  7. package/dist/contracts/Configuration/Configs.d.ts +0 -5
  8. package/dist/contracts/Configuration/RegistrationBuilders.js +6 -4
  9. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -6
  10. package/dist/contracts/Configuration/RegistrationValidators.js +4 -4
  11. package/dist/contracts/Configuration/index.d.ts +1 -1
  12. package/dist/contracts/Handlers/Attributes.d.ts +5 -13
  13. package/dist/contracts/Handlers/Attributes.js +7 -11
  14. package/dist/contracts/Handlers/JsonContract.d.ts +2 -46
  15. package/dist/contracts/Handlers/JsonContract.js +4 -153
  16. package/dist/contracts/Spots/Contracts.d.ts +2 -1
  17. package/dist/internal.d.ts +1 -0
  18. package/dist/internal.js +3 -1
  19. package/dist/nest-integration.d.ts +1 -1
  20. package/dist/nest-integration.js +2 -1
  21. package/dist/runtime/actors/actor-client.d.ts +1 -1
  22. package/dist/runtime/actors/actor-client.js +14 -12
  23. package/dist/runtime/actors/actor-handoff.d.ts +3 -2
  24. package/dist/runtime/actors/actor-handoff.js +15 -7
  25. package/dist/runtime/actors/actor-join-relocation.d.ts +1 -0
  26. package/dist/runtime/actors/actor-local-native-join.js +9 -12
  27. package/dist/runtime/actors/actor-remote-wire.js +15 -0
  28. package/dist/runtime/actors/actor-routed-join-transport.d.ts +6 -2
  29. package/dist/runtime/actors/actor-routed-json-request.d.ts +2 -0
  30. package/dist/runtime/actors/index.d.ts +2 -1
  31. package/dist/runtime/actors/index.js +18 -6
  32. package/dist/runtime/actors/spot-actor-dispatch.js +2 -2
  33. package/dist/runtime/admission.d.ts +1 -1
  34. package/dist/runtime/admission.js +15 -5
  35. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +9 -9
  36. package/dist/runtime/application-jobs/application-ingress-record-owner.js +45 -23
  37. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +5 -2
  38. package/dist/runtime/application-jobs/application-job-queue-scope.js +41 -21
  39. package/dist/runtime/application-jobs/contracts.d.ts +15 -2
  40. package/dist/runtime/backend/contracts/index.d.ts +27 -27
  41. package/dist/runtime/backend/mesh-completion-table.d.ts +15 -5
  42. package/dist/runtime/backend/mesh-completion-table.js +160 -50
  43. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +3 -0
  44. package/dist/runtime/backend/mesh-dispatch-pump.js +53 -36
  45. package/dist/runtime/backend/node/node-backend-adapter-factory.js +6 -1
  46. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +3 -3
  47. package/dist/runtime/backend/node/node-backend-adapter-support.js +33 -31
  48. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +1 -1
  49. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +5 -2
  50. package/dist/runtime/backend/node/node-mesh-backend-adapter.d.ts +1 -9
  51. package/dist/runtime/backend/node/node-mesh-backend-adapter.js +1 -1
  52. package/dist/runtime/backend/node/node-raw-binding-port.js +50 -25
  53. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +22 -16
  54. package/dist/runtime/backend/node/node-raw-mesh-backend.js +133 -149
  55. package/dist/runtime/backend/node/node-socket-backend-adapter.js +15 -10
  56. package/dist/runtime/backend/raw-binding-port.d.ts +10 -3
  57. package/dist/runtime/backend/runtime-message.d.ts +1 -0
  58. package/dist/runtime/backend/runtime-message.js +5 -0
  59. package/dist/runtime/backend/runtime-values.d.ts +1 -0
  60. package/dist/runtime/backend/runtime-values.js +2 -1
  61. package/dist/runtime/channels/channel-clients.d.ts +1 -0
  62. package/dist/runtime/channels/channel-clients.js +58 -21
  63. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +3 -2
  64. package/dist/runtime/channels/channel-dispatch-pipeline.js +20 -11
  65. package/dist/runtime/channels/channel-dispatch-services.d.ts +1 -0
  66. package/dist/runtime/channels/channel-dispatch-services.js +45 -0
  67. package/dist/runtime/channels/channel-dispatchers.d.ts +1 -1
  68. package/dist/runtime/channels/channel-dispatchers.js +27 -26
  69. package/dist/runtime/channels/channel-envelope-inspection.d.ts +1 -2
  70. package/dist/runtime/channels/channel-envelope-inspection.js +1 -16
  71. package/dist/runtime/channels/channel-envelope.d.ts +1 -0
  72. package/dist/runtime/channels/channel-envelope.js +83 -8
  73. package/dist/runtime/channels/channel-outbound-operations.d.ts +2 -2
  74. package/dist/runtime/channels/channel-outbound-operations.js +8 -8
  75. package/dist/runtime/channels/channel-receive-loops.js +3 -3
  76. package/dist/runtime/channels/channel-runtime-lifecycle.js +2 -1
  77. package/dist/runtime/channels/channel-runtime-manager.d.ts +6 -6
  78. package/dist/runtime/channels/channel-runtime-manager.js +12 -12
  79. package/dist/runtime/channels/channel-socket-registry.d.ts +10 -3
  80. package/dist/runtime/channels/channel-socket-registry.js +59 -82
  81. package/dist/runtime/channels/channel-transports.d.ts +18 -15
  82. package/dist/runtime/channels/channel-transports.js +48 -31
  83. package/dist/runtime/channels/local-spot-route-transport.d.ts +1 -1
  84. package/dist/runtime/channels/local-spot-route-transport.js +2 -1
  85. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +2 -2
  86. package/dist/runtime/channels/router-socket-spot-route-transport.js +4 -4
  87. package/dist/runtime/channels/source-spot-router.d.ts +2 -2
  88. package/dist/runtime/channels/source-spot-router.js +4 -4
  89. package/dist/runtime/channels/spot-node-route-transport.d.ts +2 -2
  90. package/dist/runtime/channels/spot-node-route-transport.js +4 -4
  91. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +2 -2
  92. package/dist/runtime/channels/spot-route-bridge-transport.js +4 -4
  93. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +5 -4
  94. package/dist/runtime/channels/spot-route-dispatch-strategy.js +18 -18
  95. package/dist/runtime/diagnostics/message-flow.d.ts +1 -0
  96. package/dist/runtime/diagnostics/message-flow.js +3 -3
  97. package/dist/runtime/execution/serial-execution-queue.d.ts +1 -0
  98. package/dist/runtime/execution/serial-execution-queue.js +1 -0
  99. package/dist/runtime/foundation/actor-join-recovery-codec.js +2 -2
  100. package/dist/runtime/foundation/durable-service-request.d.ts +14 -0
  101. package/dist/runtime/foundation/durable-service-request.js +98 -0
  102. package/dist/runtime/foundation/operation-identity.d.ts +1 -0
  103. package/dist/runtime/foundation/operation-identity.js +5 -1
  104. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +37 -6
  105. package/dist/runtime/foundation/raw-service-mesh-runtime.js +473 -220
  106. package/dist/runtime/foundation/service-liveness-registry.d.ts +20 -8
  107. package/dist/runtime/foundation/service-liveness-registry.js +57 -44
  108. package/dist/runtime/foundation/service-mailbox.d.ts +3 -0
  109. package/dist/runtime/foundation/service-mailbox.js +2 -1
  110. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +1 -0
  111. package/dist/runtime/foundation/service-relocation-object-owner.js +1 -0
  112. package/dist/runtime/foundation/service-relocation-runtime.d.ts +2 -0
  113. package/dist/runtime/foundation/service-relocation-runtime.js +13 -1
  114. package/dist/runtime/foundation/service-runtime-contracts.d.ts +2 -0
  115. package/dist/runtime/foundation/service-stateful-runtime.d.ts +10 -9
  116. package/dist/runtime/foundation/service-stateful-runtime.js +78 -126
  117. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +5 -7
  118. package/dist/runtime/foundation/service-stateful-wire-codec.js +43 -61
  119. package/dist/runtime/foundation/service-topology-registry.d.ts +16 -4
  120. package/dist/runtime/foundation/service-topology-registry.js +69 -30
  121. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +3 -3
  122. package/dist/runtime/foundation/service-wire-m6a-codec.js +36 -38
  123. package/dist/runtime/handlers/handler-instance-scope.d.ts +8 -0
  124. package/dist/runtime/handlers/handler-instance-scope.js +54 -11
  125. package/dist/runtime/host/actor-packet-relay.js +7 -7
  126. package/dist/runtime/host/actor-runtime-options-factory.js +2 -2
  127. package/dist/runtime/host/application-job-queue.d.ts +28 -9
  128. package/dist/runtime/host/application-job-queue.js +214 -50
  129. package/dist/runtime/host/entry-actor-runtime.d.ts +1 -0
  130. package/dist/runtime/host/entry-actor-runtime.js +4 -1
  131. package/dist/runtime/host/index.d.ts +7 -1
  132. package/dist/runtime/host/index.js +154 -126
  133. package/dist/runtime/host/instance-activation-authority.d.ts +2 -1
  134. package/dist/runtime/host/instance-activation-authority.js +89 -25
  135. package/dist/runtime/host/remote-bound-session-relay.js +2 -18
  136. package/dist/runtime/host/route-mesh-runtime.js +1 -1
  137. package/dist/runtime/host/service-relocation-control.d.ts +1 -0
  138. package/dist/runtime/host/service-relocation-control.js +10 -4
  139. package/dist/runtime/host/service-relocation-host-runtime.d.ts +6 -8
  140. package/dist/runtime/host/service-relocation-host-runtime.js +215 -243
  141. package/dist/runtime/host/spot-address-transport.d.ts +1 -0
  142. package/dist/runtime/host/spot-address-transport.js +28 -14
  143. package/dist/runtime/host/spot-runtime-options-factory.js +3 -2
  144. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +1 -0
  145. package/dist/runtime/host/user-spot-creation-coordinator.js +1 -0
  146. package/dist/runtime/locations/actor-location-claims.d.ts +2 -2
  147. package/dist/runtime/locations/actor-location-claims.js +34 -19
  148. package/dist/runtime/locations/domain-store-contract.d.ts +2 -2
  149. package/dist/runtime/locations/in-memory-authority-store.d.ts +4 -2
  150. package/dist/runtime/locations/in-memory-authority-store.js +80 -8
  151. package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
  152. package/dist/runtime/locations/in-memory-location-store.js +19 -3
  153. package/dist/runtime/locations/internal-location-contracts.d.ts +3 -0
  154. package/dist/runtime/locations/lifecycle.d.ts +1 -2
  155. package/dist/runtime/locations/lifecycle.js +2 -5
  156. package/dist/runtime/locations/location-store-repository.d.ts +3 -2
  157. package/dist/runtime/locations/location-store-repository.js +165 -22
  158. package/dist/runtime/locations/resolvers.d.ts +2 -1
  159. package/dist/runtime/locations/resolvers.js +10 -1
  160. package/dist/runtime/locations/runtime.d.ts +1 -1
  161. package/dist/runtime/locations/runtime.js +24 -23
  162. package/dist/runtime/messaging/framework-json-v1.d.ts +4 -6
  163. package/dist/runtime/messaging/framework-json-v1.js +38 -294
  164. package/dist/runtime/messaging/packet-name.d.ts +1 -1
  165. package/dist/runtime/messaging/packet-name.js +8 -24
  166. package/dist/runtime/messaging/request-result.d.ts +2 -0
  167. package/dist/runtime/messaging/request-result.js +54 -0
  168. package/dist/runtime/messaging/submission-result.d.ts +2 -1
  169. package/dist/runtime/messaging/submission-result.js +7 -4
  170. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +15 -0
  171. package/dist/runtime/protocol/service_wire_codec.generated.js +144 -0
  172. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +9 -0
  173. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +14 -1
  174. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +9 -2
  175. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +33 -19
  176. package/dist/runtime/spots/index.d.ts +7 -3
  177. package/dist/runtime/spots/index.js +23 -16
  178. package/dist/runtime/spots/spot-activation.d.ts +3 -1
  179. package/dist/runtime/spots/spot-activation.js +21 -12
  180. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +2 -1
  181. package/dist/runtime/spots/spot-actor-admission-coordinator.js +11 -10
  182. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +4 -1
  183. package/dist/runtime/spots/spot-actor-packet-dispatch.js +7 -5
  184. package/dist/runtime/spots/spot-actor-packet-drain.js +2 -0
  185. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -0
  186. package/dist/runtime/spots/spot-entry-activation.js +9 -3
  187. package/dist/runtime/spots/spot-handler-registry.d.ts +3 -1
  188. package/dist/runtime/spots/spot-handler-registry.js +18 -8
  189. package/dist/runtime/spots/spot-node-autoconnect.js +4 -3
  190. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +2 -1
  191. package/dist/runtime/spots/spot-node-runtime-manager.js +4 -11
  192. package/dist/runtime/spots/spot-outbound.d.ts +3 -0
  193. package/dist/runtime/spots/spot-outbound.js +24 -15
  194. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +1 -0
  195. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +1 -1
  196. package/dist/runtime/spots/spot-routing-internal.d.ts +6 -0
  197. package/dist/runtime/spots/spot-runtime-ports.d.ts +3 -1
  198. package/dist/runtime/spots/spot-subscription-dispatch.js +0 -3
  199. package/dist/runtime/spots/spot-timer.js +1 -0
  200. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -1
  201. package/dist/runtime/streams/stream-session-runtime.js +14 -28
  202. package/package.json +3 -3
  203. package/src/contracts/Actors/ZLinkActorClient.ts +2 -1
  204. package/src/contracts/Channels/Calls.ts +2 -1
  205. package/src/contracts/Common/ZLinkMessageMetadata.ts +13 -8
  206. package/src/contracts/Configuration/Builders.ts +1 -2
  207. package/src/contracts/Configuration/Configs.ts +0 -6
  208. package/src/contracts/Configuration/RegistrationBuilders.ts +8 -12
  209. package/src/contracts/Configuration/RegistrationTypes.ts +1 -6
  210. package/src/contracts/Configuration/RegistrationValidators.ts +9 -10
  211. package/src/contracts/Configuration/index.ts +1 -6
  212. package/src/contracts/Handlers/Attributes.ts +14 -21
  213. package/src/contracts/Handlers/JsonContract.ts +8 -216
  214. package/src/contracts/Spots/Contracts.ts +2 -1
  215. package/src/internal.ts +1 -0
  216. package/src/nest-integration.ts +1 -0
  217. package/src/runtime/actors/actor-client.ts +40 -16
  218. package/src/runtime/actors/actor-handoff.ts +22 -8
  219. package/src/runtime/actors/actor-join-relocation.ts +1 -0
  220. package/src/runtime/actors/actor-local-native-join.ts +17 -26
  221. package/src/runtime/actors/actor-remote-wire.ts +17 -0
  222. package/src/runtime/actors/actor-routed-join-transport.ts +14 -4
  223. package/src/runtime/actors/actor-routed-json-request.ts +10 -2
  224. package/src/runtime/actors/index.ts +19 -5
  225. package/src/runtime/actors/spot-actor-dispatch.ts +4 -2
  226. package/src/runtime/admission.ts +18 -5
  227. package/src/runtime/application-jobs/application-ingress-record-owner.ts +53 -27
  228. package/src/runtime/application-jobs/application-job-queue-scope.ts +56 -22
  229. package/src/runtime/application-jobs/contracts.ts +28 -2
  230. package/src/runtime/backend/contracts/index.ts +63 -32
  231. package/src/runtime/backend/mesh-completion-table.ts +175 -59
  232. package/src/runtime/backend/mesh-dispatch-pump.ts +59 -32
  233. package/src/runtime/backend/node/node-backend-adapter-factory.ts +12 -5
  234. package/src/runtime/backend/node/node-backend-adapter-support.ts +42 -31
  235. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +12 -2
  236. package/src/runtime/backend/node/node-mesh-backend-adapter.ts +3 -10
  237. package/src/runtime/backend/node/node-raw-binding-port.ts +73 -37
  238. package/src/runtime/backend/node/node-raw-mesh-backend.ts +209 -176
  239. package/src/runtime/backend/node/node-socket-backend-adapter.ts +32 -13
  240. package/src/runtime/backend/raw-binding-port.ts +18 -3
  241. package/src/runtime/backend/runtime-message.ts +6 -0
  242. package/src/runtime/backend/runtime-values.ts +1 -0
  243. package/src/runtime/channels/channel-clients.ts +90 -41
  244. package/src/runtime/channels/channel-dispatch-pipeline.ts +69 -34
  245. package/src/runtime/channels/channel-dispatch-services.ts +69 -1
  246. package/src/runtime/channels/channel-dispatchers.ts +29 -27
  247. package/src/runtime/channels/channel-envelope-inspection.ts +2 -16
  248. package/src/runtime/channels/channel-envelope.ts +133 -8
  249. package/src/runtime/channels/channel-outbound-operations.ts +22 -8
  250. package/src/runtime/channels/channel-receive-loops.ts +3 -3
  251. package/src/runtime/channels/channel-runtime-lifecycle.ts +7 -1
  252. package/src/runtime/channels/channel-runtime-manager.ts +29 -12
  253. package/src/runtime/channels/channel-socket-registry.ts +84 -130
  254. package/src/runtime/channels/channel-transports.ts +128 -60
  255. package/src/runtime/channels/local-spot-route-transport.ts +3 -1
  256. package/src/runtime/channels/router-socket-spot-route-transport.ts +13 -4
  257. package/src/runtime/channels/source-spot-router.ts +8 -4
  258. package/src/runtime/channels/spot-node-route-transport.ts +8 -4
  259. package/src/runtime/channels/spot-route-bridge-transport.ts +6 -4
  260. package/src/runtime/channels/spot-route-dispatch-strategy.ts +47 -18
  261. package/src/runtime/diagnostics/message-flow.ts +1 -1
  262. package/src/runtime/execution/serial-execution-queue.ts +2 -0
  263. package/src/runtime/foundation/actor-join-recovery-codec.ts +2 -2
  264. package/src/runtime/foundation/durable-service-request.ts +137 -0
  265. package/src/runtime/foundation/operation-identity.ts +5 -1
  266. package/src/runtime/foundation/raw-service-mesh-runtime.ts +642 -253
  267. package/src/runtime/foundation/service-liveness-registry.ts +68 -59
  268. package/src/runtime/foundation/service-mailbox.ts +7 -1
  269. package/src/runtime/foundation/service-relocation-object-owner.ts +2 -0
  270. package/src/runtime/foundation/service-relocation-runtime.ts +18 -1
  271. package/src/runtime/foundation/service-runtime-contracts.ts +7 -1
  272. package/src/runtime/foundation/service-stateful-runtime.ts +128 -160
  273. package/src/runtime/foundation/service-stateful-wire-codec.ts +55 -84
  274. package/src/runtime/foundation/service-topology-registry.ts +103 -42
  275. package/src/runtime/foundation/service-wire-m6a-codec.ts +57 -38
  276. package/src/runtime/handlers/handler-instance-scope.ts +67 -16
  277. package/src/runtime/host/actor-packet-relay.ts +7 -0
  278. package/src/runtime/host/actor-runtime-options-factory.ts +14 -2
  279. package/src/runtime/host/application-job-queue.ts +249 -48
  280. package/src/runtime/host/entry-actor-runtime.ts +5 -0
  281. package/src/runtime/host/index.ts +224 -160
  282. package/src/runtime/host/instance-activation-authority.ts +132 -27
  283. package/src/runtime/host/remote-bound-session-relay.ts +2 -23
  284. package/src/runtime/host/route-mesh-runtime.ts +1 -1
  285. package/src/runtime/host/service-relocation-control.ts +11 -5
  286. package/src/runtime/host/service-relocation-host-runtime.ts +317 -291
  287. package/src/runtime/host/spot-address-transport.ts +49 -24
  288. package/src/runtime/host/spot-runtime-options-factory.ts +4 -0
  289. package/src/runtime/host/user-spot-creation-coordinator.ts +8 -0
  290. package/src/runtime/locations/actor-location-claims.ts +52 -30
  291. package/src/runtime/locations/domain-store-contract.ts +6 -2
  292. package/src/runtime/locations/in-memory-authority-store.ts +113 -9
  293. package/src/runtime/locations/in-memory-location-store.ts +25 -3
  294. package/src/runtime/locations/internal-location-contracts.ts +4 -0
  295. package/src/runtime/locations/lifecycle.ts +8 -26
  296. package/src/runtime/locations/location-store-repository.ts +220 -15
  297. package/src/runtime/locations/resolvers.ts +25 -2
  298. package/src/runtime/locations/runtime.ts +28 -24
  299. package/src/runtime/messaging/framework-json-v1.ts +5 -325
  300. package/src/runtime/messaging/packet-name.ts +5 -25
  301. package/src/runtime/messaging/request-result.ts +58 -0
  302. package/src/runtime/messaging/submission-result.ts +7 -3
  303. package/src/runtime/protocol/service_wire_codec.generated.ts +131 -1
  304. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +4 -4
  305. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +45 -23
  306. package/src/runtime/spots/index.ts +30 -2
  307. package/src/runtime/spots/spot-activation.ts +33 -10
  308. package/src/runtime/spots/spot-actor-admission-coordinator.ts +13 -0
  309. package/src/runtime/spots/spot-actor-packet-dispatch.ts +10 -0
  310. package/src/runtime/spots/spot-actor-packet-drain.ts +2 -0
  311. package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +1 -0
  312. package/src/runtime/spots/spot-entry-activation.ts +12 -2
  313. package/src/runtime/spots/spot-handler-registry.ts +41 -8
  314. package/src/runtime/spots/spot-node-autoconnect.ts +6 -2
  315. package/src/runtime/spots/spot-node-runtime-manager.ts +7 -12
  316. package/src/runtime/spots/spot-outbound.ts +36 -16
  317. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +2 -1
  318. package/src/runtime/spots/spot-routing-internal.ts +14 -0
  319. package/src/runtime/spots/spot-runtime-ports.ts +3 -0
  320. package/src/runtime/spots/spot-subscription-dispatch.ts +0 -3
  321. package/src/runtime/spots/spot-timer.ts +5 -1
  322. package/src/runtime/streams/stream-session-runtime.ts +13 -30
@@ -5,5 +5,5 @@ export declare class ZLinkLocalSpotRouteTransport {
5
5
  private readonly defaultRequestTimeoutMs;
6
6
  constructor(dispatcher: ZLinkLocalSpotRouteDispatcher | undefined, defaultRequestTimeoutMs: number | undefined);
7
7
  send(routerChannelId: string, spotId: RoutingId, packetName: string | undefined, message: unknown, metadata?: ReadonlyMap<string, string>): Promise<void>;
8
- request<TReply>(routerChannelId: string, spotId: RoutingId, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal): Promise<TReply>;
8
+ request<TReply>(routerChannelId: string, spotId: RoutingId, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, onAdmitted?: () => void): Promise<TReply>;
9
9
  }
@@ -18,12 +18,13 @@ class ZLinkLocalSpotRouteTransport {
18
18
  metadata
19
19
  });
20
20
  }
21
- request(routerChannelId, spotId, packetName, request, timeoutMs, signal) {
21
+ request(routerChannelId, spotId, packetName, request, timeoutMs, signal, onAdmitted) {
22
22
  if (this.dispatcher === undefined) {
23
23
  throw new configuration_1.ZLinkConfigurationException(`Route channel '${routerChannelId}' could not dispatch local SPOT request.`);
24
24
  }
25
25
  const pending = this.dispatcher.request(spotId, packetName, request, {
26
26
  channelName: routerChannelId,
27
+ onAdmitted,
27
28
  signal
28
29
  });
29
30
  const effectiveTimeoutMs = timeoutMs ?? this.defaultRequestTimeoutMs;
@@ -7,6 +7,6 @@ export declare class ZLinkRouterSocketSpotRouteTransport {
7
7
  private readonly sockets;
8
8
  constructor(sockets: ZLinkChannelSocketRegistry);
9
9
  send(target: ZLinkSpotRouteTarget, parts: readonly Message[], flags: ZLinkBackendSendFlags): Promise<void>;
10
- request<TReply>(target: ZLinkSpotRouteTarget, parts: readonly Message[], codecs: ZLinkChannelEnvelopeCodecRegistry | undefined, flags: ZLinkBackendSendFlags, timeoutMs: number | undefined, signal?: AbortSignal): Promise<TReply>;
11
- requestRaw(target: ZLinkSpotRouteTarget, request: Message, timeoutMs: number | undefined, signal?: AbortSignal): Promise<readonly Message[]>;
10
+ request<TReply>(target: ZLinkSpotRouteTarget, parts: readonly Message[], codecs: ZLinkChannelEnvelopeCodecRegistry | undefined, flags: ZLinkBackendSendFlags, timeoutMs: number | undefined, signal?: AbortSignal, onAdmitted?: () => void): Promise<TReply>;
11
+ requestRaw(target: ZLinkSpotRouteTarget, request: Message, timeoutMs: number | undefined, signal?: AbortSignal, onAdmitted?: () => void): Promise<readonly Message[]>;
12
12
  }
@@ -17,10 +17,10 @@ class ZLinkRouterSocketSpotRouteTransport {
17
17
  (0, channel_envelope_1.closeMessages)(parts);
18
18
  }
19
19
  }
20
- async request(target, parts, codecs, flags, timeoutMs, signal) {
20
+ async request(target, parts, codecs, flags, timeoutMs, signal, onAdmitted) {
21
21
  const router = this.sockets.routeRouter(target.routerChannelId);
22
22
  void flags;
23
- const operation = router.requestToSpot(target.targetNodeRid, target.spotId, parts, timeoutMs);
23
+ const operation = router.requestToSpot(target.targetNodeRid, target.spotId, parts, timeoutMs, onAdmitted);
24
24
  const replyParts = await (0, abort_1.awaitWithAbort)(operation, signal, () => {
25
25
  void operation.then(channel_envelope_1.closeMessages, () => undefined);
26
26
  });
@@ -32,9 +32,9 @@ class ZLinkRouterSocketSpotRouteTransport {
32
32
  (0, channel_envelope_1.closeMessages)(parts);
33
33
  }
34
34
  }
35
- async requestRaw(target, request, timeoutMs, signal) {
35
+ async requestRaw(target, request, timeoutMs, signal, onAdmitted) {
36
36
  const router = this.sockets.routeRouter(target.routerChannelId);
37
- const operation = router.requestToSpot(target.targetNodeRid, target.spotId, [request], timeoutMs);
37
+ const operation = router.requestToSpot(target.targetNodeRid, target.spotId, [request], timeoutMs, onAdmitted);
38
38
  return await (0, abort_1.awaitWithAbort)(operation, signal, () => {
39
39
  void operation.then(channel_envelope_1.closeMessages, () => undefined);
40
40
  });
@@ -4,7 +4,7 @@ import type { ZLinkSpotRouteTarget } from '../spots/spot-routing-internal';
4
4
  export declare class ZLinkSourceSpotRouter {
5
5
  private readonly defaultRequestTimeoutMs;
6
6
  constructor(defaultRequestTimeoutMs: number | undefined);
7
- request<TReply>(sourceSpot: ZLinkBackendSpot, target: ZLinkSpotRouteTarget, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal): Promise<TReply>;
7
+ request<TReply>(sourceSpot: ZLinkBackendSpot, target: ZLinkSpotRouteTarget, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, onAdmitted?: () => void): Promise<TReply>;
8
8
  send(sourceSpot: ZLinkBackendSpot, target: ZLinkSpotRouteTarget, packetName: string | undefined, message: unknown, metadata?: ReadonlyMap<string, string>): Promise<void>;
9
- requestRaw(sourceSpot: ZLinkBackendSpot, target: ZLinkSpotRouteTarget, request: Message, timeoutMs: number | undefined, signal?: AbortSignal): Promise<readonly Message[]>;
9
+ requestRaw(sourceSpot: ZLinkBackendSpot, target: ZLinkSpotRouteTarget, request: Message, timeoutMs: number | undefined, signal?: AbortSignal, onAdmitted?: () => void): Promise<readonly Message[]>;
10
10
  }
@@ -9,12 +9,12 @@ class ZLinkSourceSpotRouter {
9
9
  constructor(defaultRequestTimeoutMs) {
10
10
  this.defaultRequestTimeoutMs = defaultRequestTimeoutMs;
11
11
  }
12
- async request(sourceSpot, target, packetName, request, timeoutMs, signal) {
12
+ async request(sourceSpot, target, packetName, request, timeoutMs, signal, onAdmitted) {
13
13
  (0, abort_1.throwIfAborted)(signal);
14
14
  const parts = [
15
15
  (0, spot_direct_envelope_1.encodeSpotDirectEnvelope)(1 /* ZLinkChannelMessageKind.Request */, target.routerChannelId, packetName, request)
16
16
  ];
17
- const operation = sourceSpot.requestToSpot(target.targetNodeRid, target.spotId, parts, timeoutMs ?? this.defaultRequestTimeoutMs);
17
+ const operation = sourceSpot.requestToSpot(target.targetNodeRid, target.spotId, parts, timeoutMs ?? this.defaultRequestTimeoutMs, onAdmitted);
18
18
  const replyParts = await (0, abort_1.awaitWithAbort)(operation, signal, () => {
19
19
  void operation.then(channel_envelope_1.closeMessages, () => undefined);
20
20
  });
@@ -37,9 +37,9 @@ class ZLinkSourceSpotRouter {
37
37
  (0, channel_envelope_1.closeMessages)(parts);
38
38
  }
39
39
  }
40
- async requestRaw(sourceSpot, target, request, timeoutMs, signal) {
40
+ async requestRaw(sourceSpot, target, request, timeoutMs, signal, onAdmitted) {
41
41
  (0, abort_1.throwIfAborted)(signal);
42
- const operation = sourceSpot.requestToSpot(target.targetNodeRid, target.spotId, request, timeoutMs ?? this.defaultRequestTimeoutMs);
42
+ const operation = sourceSpot.requestToSpot(target.targetNodeRid, target.spotId, request, timeoutMs ?? this.defaultRequestTimeoutMs, onAdmitted);
43
43
  return await (0, abort_1.awaitWithAbort)(operation, signal, () => {
44
44
  void operation.then(channel_envelope_1.closeMessages, () => undefined);
45
45
  });
@@ -8,6 +8,6 @@ export declare class ZLinkSpotNodeRouteTransport {
8
8
  private readonly targets;
9
9
  constructor(registration: ZLinkFrameworkRegistration, targets: ZLinkSpotRouteTargetResolver);
10
10
  send(target: ZLinkSpotRouteTarget, parts: readonly Message[]): Promise<boolean>;
11
- request<TReply>(target: ZLinkSpotRouteTarget, parts: readonly Message[], codecs: ZLinkChannelEnvelopeCodecRegistry | undefined, timeoutMs: number | undefined, signal?: AbortSignal): Promise<TReply> | undefined;
12
- requestRaw(target: ZLinkSpotRouteTarget, request: Message, timeoutMs: number | undefined, signal?: AbortSignal): Promise<readonly Message[]> | undefined;
11
+ request<TReply>(target: ZLinkSpotRouteTarget, parts: readonly Message[], codecs: ZLinkChannelEnvelopeCodecRegistry | undefined, timeoutMs: number | undefined, signal?: AbortSignal, onAdmitted?: () => void): Promise<TReply> | undefined;
12
+ requestRaw(target: ZLinkSpotRouteTarget, request: Message, timeoutMs: number | undefined, signal?: AbortSignal, onAdmitted?: () => void): Promise<readonly Message[]> | undefined;
13
13
  }
@@ -24,14 +24,14 @@ class ZLinkSpotNodeRouteTransport {
24
24
  (0, channel_envelope_1.closeMessages)(parts);
25
25
  }
26
26
  }
27
- request(target, parts, codecs, timeoutMs, signal) {
27
+ request(target, parts, codecs, timeoutMs, signal, onAdmitted) {
28
28
  const router = this.targets.spotNodeRouter(target.routerChannelId);
29
29
  if (router === undefined) {
30
30
  return undefined;
31
31
  }
32
32
  const effectiveTimeoutMs = timeoutMs ?? this.registration.requestTimeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS;
33
33
  (0, abort_1.throwIfAborted)(signal);
34
- const operation = router.requestToSpot(target.targetNodeRid, target.spotId, parts, effectiveTimeoutMs);
34
+ const operation = router.requestToSpot(target.targetNodeRid, target.spotId, parts, effectiveTimeoutMs, onAdmitted);
35
35
  return (0, abort_1.awaitWithAbort)(operation, signal, () => {
36
36
  void operation.then(channel_envelope_1.closeMessages, () => undefined);
37
37
  }).then((replyParts) => {
@@ -44,14 +44,14 @@ class ZLinkSpotNodeRouteTransport {
44
44
  }
45
45
  });
46
46
  }
47
- requestRaw(target, request, timeoutMs, signal) {
47
+ requestRaw(target, request, timeoutMs, signal, onAdmitted) {
48
48
  const router = this.targets.spotNodeRouter(target.routerChannelId);
49
49
  if (router === undefined) {
50
50
  return undefined;
51
51
  }
52
52
  const effectiveTimeoutMs = timeoutMs ?? this.registration.requestTimeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS;
53
53
  (0, abort_1.throwIfAborted)(signal);
54
- const operation = router.requestToSpot(target.targetNodeRid, target.spotId, request, effectiveTimeoutMs);
54
+ const operation = router.requestToSpot(target.targetNodeRid, target.spotId, request, effectiveTimeoutMs, onAdmitted);
55
55
  return (0, abort_1.awaitWithAbort)(operation, signal, () => {
56
56
  void operation.then(channel_envelope_1.closeMessages, () => undefined);
57
57
  });
@@ -8,7 +8,7 @@ export declare class ZLinkSpotRouteBridgeTransport {
8
8
  constructor(bridges: ReadonlyMap<string, ZLinkBackendSpotRouteBridge>, defaultRequestTimeoutMs: number | undefined);
9
9
  has(routerChannelId: string): boolean;
10
10
  send(target: ZLinkSpotRouteTarget, parts: readonly Message[]): Promise<void>;
11
- request<TReply>(target: ZLinkSpotRouteTarget, parts: readonly Message[], codecs: ZLinkChannelEnvelopeCodecRegistry | undefined, timeoutMs: number | undefined, signal?: AbortSignal): Promise<TReply>;
12
- requestRaw(target: ZLinkSpotRouteTarget, request: Message, timeoutMs: number | undefined, signal?: AbortSignal): Promise<readonly Message[]>;
11
+ request<TReply>(target: ZLinkSpotRouteTarget, parts: readonly Message[], codecs: ZLinkChannelEnvelopeCodecRegistry | undefined, timeoutMs: number | undefined, signal?: AbortSignal, onAdmitted?: () => void): Promise<TReply>;
12
+ requestRaw(target: ZLinkSpotRouteTarget, request: Message, timeoutMs: number | undefined, signal?: AbortSignal, onAdmitted?: () => void): Promise<readonly Message[]>;
13
13
  private requireBridge;
14
14
  }
@@ -24,11 +24,11 @@ class ZLinkSpotRouteBridgeTransport {
24
24
  (0, channel_envelope_1.closeMessages)(parts);
25
25
  }
26
26
  }
27
- async request(target, parts, codecs, timeoutMs, signal) {
27
+ async request(target, parts, codecs, timeoutMs, signal, onAdmitted) {
28
28
  const bridge = this.requireBridge(target.routerChannelId);
29
29
  const operation = (0, channel_multipart_1.appendParts)(bridge.request(target.routerChannelId, target.targetNodeRid, target.spotId), parts)
30
30
  .timeout(timeoutMs ?? 0)
31
- .submit();
31
+ .submit(onAdmitted);
32
32
  const replyParts = await (0, abort_1.awaitWithAbort)(operation, signal, () => {
33
33
  void operation.then(channel_envelope_1.closeMessages, () => undefined);
34
34
  });
@@ -40,13 +40,13 @@ class ZLinkSpotRouteBridgeTransport {
40
40
  (0, channel_envelope_1.closeMessages)(parts);
41
41
  }
42
42
  }
43
- requestRaw(target, request, timeoutMs, signal) {
43
+ requestRaw(target, request, timeoutMs, signal, onAdmitted) {
44
44
  const bridge = this.requireBridge(target.routerChannelId);
45
45
  const operation = bridge
46
46
  .request(target.routerChannelId, target.targetNodeRid, target.spotId)
47
47
  .message(request)
48
48
  .timeout(timeoutMs ?? this.defaultRequestTimeoutMs ?? 0)
49
- .submit();
49
+ .submit(onAdmitted);
50
50
  return (0, abort_1.awaitWithAbort)(operation, signal, () => {
51
51
  void operation.then(channel_envelope_1.closeMessages, () => undefined);
52
52
  });
@@ -13,6 +13,7 @@ export interface ZLinkLocalSpotRouteDispatcher {
13
13
  request<TReply>(spotId: RoutingId, packetName: string | undefined, request: unknown, context: {
14
14
  readonly channelName: string;
15
15
  readonly signal?: AbortSignal;
16
+ readonly onAdmitted?: () => void;
16
17
  readonly metadata?: ReadonlyMap<string, string>;
17
18
  }): Promise<TReply>;
18
19
  }
@@ -39,10 +40,10 @@ export declare class ZLinkSpotRouteDispatchStrategy {
39
40
  canRoutePacketChannel(routerChannelId: string): boolean;
40
41
  routeSendToSpot(spotRouteTarget: ZLinkSpotRouteTarget, packetName: string | undefined, message: unknown, metadata?: ReadonlyMap<string, string>): Promise<void>;
41
42
  private routeSendToSpotScoped;
42
- routeRequestToSpot<TReply>(spotRouteTarget: ZLinkSpotRouteTarget, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>): Promise<TReply>;
43
+ routeRequestToSpot<TReply>(spotRouteTarget: ZLinkSpotRouteTarget, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>, onAdmitted?: () => void): Promise<TReply>;
43
44
  private routeRequestToSpotScoped;
44
- routeRequestFromSpotToSpot<TReply>(sourceSpot: ZLinkBackendSpot, spotRouteTarget: ZLinkSpotRouteTarget, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal): Promise<TReply>;
45
+ routeRequestFromSpotToSpot<TReply>(sourceSpot: ZLinkBackendSpot, spotRouteTarget: ZLinkSpotRouteTarget, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, onAdmitted?: () => void): Promise<TReply>;
45
46
  routeSendFromSpotToSpot(sourceSpot: ZLinkBackendSpot, spotRouteTarget: ZLinkSpotRouteTarget, packetName: string | undefined, message: unknown, metadata?: ReadonlyMap<string, string>): Promise<void>;
46
- routeRequestRawFromSpotToSpot(sourceSpot: ZLinkBackendSpot, spotRouteTarget: ZLinkSpotRouteTarget, request: Message, timeoutMs: number | undefined, signal?: AbortSignal): Promise<readonly Message[]>;
47
- routeRequestRawToSpot(spotRouteTarget: ZLinkSpotRouteTarget, request: Message, timeoutMs: number | undefined, signal?: AbortSignal): Promise<readonly Message[]>;
47
+ routeRequestRawFromSpotToSpot(sourceSpot: ZLinkBackendSpot, spotRouteTarget: ZLinkSpotRouteTarget, request: Message, timeoutMs: number | undefined, signal?: AbortSignal, onAdmitted?: () => void): Promise<readonly Message[]>;
48
+ routeRequestRawToSpot(spotRouteTarget: ZLinkSpotRouteTarget, request: Message, timeoutMs: number | undefined, signal?: AbortSignal, onAdmitted?: () => void): Promise<readonly Message[]>;
48
49
  }
@@ -70,58 +70,58 @@ class ZLinkSpotRouteDispatchStrategy {
70
70
  }
71
71
  await this.routerSocketTransport.send(spotRouteTarget, parts, ZLINK_SEND_DONT_WAIT);
72
72
  }
73
- routeRequestToSpot(spotRouteTarget, packetName, request, timeoutMs, signal, metadata) {
74
- return (0, flow_context_1.runWithOutboundFlow)(this.options.flowCreationEnabled?.() ?? true, () => this.routeRequestToSpotScoped(spotRouteTarget, packetName, request, timeoutMs, signal, metadata));
73
+ routeRequestToSpot(spotRouteTarget, packetName, request, timeoutMs, signal, metadata, onAdmitted) {
74
+ return (0, flow_context_1.runWithOutboundFlow)(this.options.flowCreationEnabled?.() ?? true, () => this.routeRequestToSpotScoped(spotRouteTarget, packetName, request, timeoutMs, signal, metadata, onAdmitted));
75
75
  }
76
- async routeRequestToSpotScoped(spotRouteTarget, packetName, request, timeoutMs, signal, metadata) {
76
+ async routeRequestToSpotScoped(spotRouteTarget, packetName, request, timeoutMs, signal, metadata, onAdmitted) {
77
77
  (0, abort_1.throwIfAborted)(signal);
78
78
  const localSpotRouteNode = this.targets.localRouteNode(spotRouteTarget);
79
79
  if (localSpotRouteNode !== undefined) {
80
- return this.localTransport.request(spotRouteTarget.routerChannelId, spotRouteTarget.spotId, packetName, request, timeoutMs, signal);
80
+ return this.localTransport.request(spotRouteTarget.routerChannelId, spotRouteTarget.spotId, packetName, request, timeoutMs, signal, onAdmitted);
81
81
  }
82
82
  const codecs = (0, channel_framework_packets_1.codecsForFrameworkPacket)(packetName, this.options.codecs);
83
83
  const parts = (0, channel_envelope_1.encodeChannelEnvelopeParts)(1 /* ZLinkChannelMessageKind.Request */, spotRouteTarget.routerChannelId, packetName, request, timeoutMs, undefined, codecs, undefined, this.options.flowCreationEnabled?.() ?? true, metadata);
84
84
  if (this.targets.hasNamedSpotNode(spotRouteTarget.routerChannelId)) {
85
- const namedSpotNodeRequest = this.spotNodeTransport.request(spotRouteTarget, parts, codecs, timeoutMs, signal);
85
+ const namedSpotNodeRequest = this.spotNodeTransport.request(spotRouteTarget, parts, codecs, timeoutMs, signal, onAdmitted);
86
86
  if (namedSpotNodeRequest !== undefined)
87
87
  return namedSpotNodeRequest;
88
88
  }
89
89
  if (this.bridgeTransport.has(spotRouteTarget.routerChannelId)) {
90
- return this.bridgeTransport.request(spotRouteTarget, parts, codecs, timeoutMs, signal);
90
+ return this.bridgeTransport.request(spotRouteTarget, parts, codecs, timeoutMs, signal, onAdmitted);
91
91
  }
92
92
  if (this.targets.hasBoundRouteRouter(spotRouteTarget.routerChannelId)) {
93
- return this.routerSocketTransport.request(spotRouteTarget, parts, codecs, ZLINK_SEND_DONT_WAIT, timeoutMs, signal);
93
+ return this.routerSocketTransport.request(spotRouteTarget, parts, codecs, ZLINK_SEND_DONT_WAIT, timeoutMs, signal, onAdmitted);
94
94
  }
95
- const spotNodeRequest = this.spotNodeTransport.request(spotRouteTarget, parts, codecs, timeoutMs, signal);
95
+ const spotNodeRequest = this.spotNodeTransport.request(spotRouteTarget, parts, codecs, timeoutMs, signal, onAdmitted);
96
96
  if (spotNodeRequest !== undefined) {
97
97
  return spotNodeRequest;
98
98
  }
99
- return this.routerSocketTransport.request(spotRouteTarget, parts, codecs, 0, timeoutMs, signal);
99
+ return this.routerSocketTransport.request(spotRouteTarget, parts, codecs, 0, timeoutMs, signal, onAdmitted);
100
100
  }
101
- routeRequestFromSpotToSpot(sourceSpot, spotRouteTarget, packetName, request, timeoutMs, signal) {
102
- return this.sourceSpotRouter.request(sourceSpot, spotRouteTarget, packetName, request, timeoutMs, signal);
101
+ routeRequestFromSpotToSpot(sourceSpot, spotRouteTarget, packetName, request, timeoutMs, signal, onAdmitted) {
102
+ return this.sourceSpotRouter.request(sourceSpot, spotRouteTarget, packetName, request, timeoutMs, signal, onAdmitted);
103
103
  }
104
104
  async routeSendFromSpotToSpot(sourceSpot, spotRouteTarget, packetName, message, metadata) {
105
105
  await this.sourceSpotRouter.send(sourceSpot, spotRouteTarget, packetName, message, metadata);
106
106
  }
107
- routeRequestRawFromSpotToSpot(sourceSpot, spotRouteTarget, request, timeoutMs, signal) {
108
- return this.sourceSpotRouter.requestRaw(sourceSpot, spotRouteTarget, request, timeoutMs, signal);
107
+ routeRequestRawFromSpotToSpot(sourceSpot, spotRouteTarget, request, timeoutMs, signal, onAdmitted) {
108
+ return this.sourceSpotRouter.requestRaw(sourceSpot, spotRouteTarget, request, timeoutMs, signal, onAdmitted);
109
109
  }
110
- async routeRequestRawToSpot(spotRouteTarget, request, timeoutMs, signal) {
110
+ async routeRequestRawToSpot(spotRouteTarget, request, timeoutMs, signal, onAdmitted) {
111
111
  (0, abort_1.throwIfAborted)(signal);
112
112
  if (this.targets.hasNamedSpotNode(spotRouteTarget.routerChannelId)) {
113
- const namedSpotNodeRequest = this.spotNodeTransport.requestRaw(spotRouteTarget, request, timeoutMs, signal);
113
+ const namedSpotNodeRequest = this.spotNodeTransport.requestRaw(spotRouteTarget, request, timeoutMs, signal, onAdmitted);
114
114
  if (namedSpotNodeRequest !== undefined)
115
115
  return namedSpotNodeRequest;
116
116
  }
117
117
  if (this.bridgeTransport.has(spotRouteTarget.routerChannelId)) {
118
- return this.bridgeTransport.requestRaw(spotRouteTarget, request, timeoutMs, signal);
118
+ return this.bridgeTransport.requestRaw(spotRouteTarget, request, timeoutMs, signal, onAdmitted);
119
119
  }
120
- const spotNodeRequest = this.spotNodeTransport.requestRaw(spotRouteTarget, request, timeoutMs, signal);
120
+ const spotNodeRequest = this.spotNodeTransport.requestRaw(spotRouteTarget, request, timeoutMs, signal, onAdmitted);
121
121
  if (spotNodeRequest !== undefined) {
122
122
  return spotNodeRequest;
123
123
  }
124
- return this.routerSocketTransport.requestRaw(spotRouteTarget, request, timeoutMs, signal);
124
+ return this.routerSocketTransport.requestRaw(spotRouteTarget, request, timeoutMs, signal, onAdmitted);
125
125
  }
126
126
  }
127
127
  exports.ZLinkSpotRouteDispatchStrategy = ZLinkSpotRouteDispatchStrategy;
@@ -10,6 +10,7 @@ export interface ZLinkDiagnosticsContext {
10
10
  readonly sourceMeshGeneration: bigint;
11
11
  }
12
12
  export declare const DEFAULT_ZLINK_DIAGNOSTICS: ZLinkDiagnosticsOptions;
13
+ export declare const telemetryLogger: import("@opentelemetry/api-logs").Logger;
13
14
  export declare function effectiveMessageFlow(ctx: ZLinkDiagnosticsContext): ZLinkMessageFlowLogMode;
14
15
  export declare function createMessageFlowModeCell(dispatch: {
15
16
  diagnostics?: ZLinkDiagnosticsOptions;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ZLinkMessageFlowTracer = exports.DEFAULT_ZLINK_DIAGNOSTICS = void 0;
3
+ exports.ZLinkMessageFlowTracer = exports.telemetryLogger = exports.DEFAULT_ZLINK_DIAGNOSTICS = void 0;
4
4
  exports.effectiveMessageFlow = effectiveMessageFlow;
5
5
  exports.createMessageFlowModeCell = createMessageFlowModeCell;
6
6
  exports.createDiagnosticsContext = createDiagnosticsContext;
@@ -18,7 +18,7 @@ exports.DEFAULT_ZLINK_DIAGNOSTICS = {
18
18
  sampleRate: 1,
19
19
  includeMessageSizes: false
20
20
  };
21
- const telemetryLogger = api_logs_1.logs.getLogger('@zlink-systems/framework');
21
+ exports.telemetryLogger = api_logs_1.logs.getLogger('@zlink-systems/framework');
22
22
  const telemetryTracer = api_1.trace.getTracer('@zlink-systems/framework');
23
23
  let diagnosticsGeneration = 0n;
24
24
  function effectiveMessageFlow(ctx) {
@@ -165,7 +165,7 @@ class ZLinkMessageFlowTracer {
165
165
  publishToLogger(record) {
166
166
  try {
167
167
  const severityNumber = record.eventId === DISPATCH_ERROR_EVENT_ID ? api_logs_1.SeverityNumber.ERROR : api_logs_1.SeverityNumber.INFO;
168
- telemetryLogger.emit({
168
+ exports.telemetryLogger.emit({
169
169
  eventName: record.eventId,
170
170
  timestamp: record.timestamp,
171
171
  severityNumber,
@@ -1,5 +1,6 @@
1
1
  export type ZLinkSerialWorkLane = 'application' | 'lifecycle';
2
2
  export interface ZLinkSerialWorkOptions {
3
+ readonly onAdmitted?: () => void;
3
4
  readonly lane?: ZLinkSerialWorkLane;
4
5
  readonly payloadBytes?: number;
5
6
  readonly metadataBytes?: number;
@@ -181,6 +181,7 @@ class ZLinkSerialExecutionQueue {
181
181
  release();
182
182
  throw error;
183
183
  }
184
+ options.onAdmitted?.();
184
185
  this.scheduleDrain();
185
186
  return result;
186
187
  }
@@ -56,7 +56,7 @@ function encodeCanonicalActorJoinRecoverySavedWork(input) {
56
56
  const request = Buffer.from(input.request);
57
57
  const replyContentType = operationId === undefined
58
58
  ? null
59
- : requireText(input.replyContentType, 'Actor Join reply content type');
59
+ : (nullableText(input.replyContentType ?? null, 'Actor Join reply content type') ?? null);
60
60
  const metadata = encodeMetadataJson({
61
61
  Request: {
62
62
  ActorId: requireText(input.actorId, 'Actor id'),
@@ -167,7 +167,7 @@ function decodeCanonicalActorJoinRecoverySavedWork(encoded) {
167
167
  const operationLow = integer(metadata.OperationIdLow, 'OperationIdLow');
168
168
  const hasOperation = operationHigh !== 0n || operationLow !== 0n;
169
169
  const replyContentType = nullableText(metadata.ReplyContentType, 'ReplyContentType');
170
- if (hasOperation !== (replyContentType !== undefined)) {
170
+ if (!hasOperation && replyContentType !== undefined) {
171
171
  throw new TypeError('Canonical Actor Join recovery reply identity is invalid.');
172
172
  }
173
173
  const targetNodeRid = base64(metadata.TargetNodeRid, 'TargetNodeRid');
@@ -0,0 +1,14 @@
1
+ export interface PeerRouteObservation {
2
+ readonly generation?: bigint;
3
+ readonly ready: boolean;
4
+ }
5
+ export interface DurableServiceRequestPort {
6
+ readonly requestStopSignal?: AbortSignal;
7
+ observePeerRoute(target: string): PeerRouteObservation;
8
+ observePeerRouteChanged(listener: (target: string) => void): () => void;
9
+ observePeerConnectionIntentRemoved(listener: (target: string) => void): () => void;
10
+ requestService(target: string, parts: readonly Uint8Array[], timeoutMs: number, onAdmitted?: () => void): Promise<readonly Buffer[]>;
11
+ }
12
+ /** Actor model §8.1: a ready edge or a typed transport failure owns replay. */
13
+ export declare function requestDurableService(port: DurableServiceRequestPort, target: string, parts: readonly Uint8Array[], deadlineMs: number, operationKind: string, signal?: AbortSignal, onSubmitted?: (signal: AbortSignal) => Promise<void>): Promise<readonly Buffer[]>;
14
+ export declare function durableRequestCanReplay(error: unknown): boolean;
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.requestDurableService = requestDurableService;
4
+ exports.durableRequestCanReplay = durableRequestCanReplay;
5
+ const abort_1 = require("../abort");
6
+ const runtime_values_1 = require("../backend/runtime-values");
7
+ const framework_errors_internal_1 = require("../framework-errors-internal");
8
+ /** Actor model §8.1: a ready edge or a typed transport failure owns replay. */
9
+ async function requestDurableService(port, target, parts, deadlineMs, operationKind, signal, onSubmitted) {
10
+ let wasAdmitted = false;
11
+ const stop = new AbortController();
12
+ const exhausted = (cause) => (0, framework_errors_internal_1.createInternalFrameworkException)(wasAdmitted
13
+ ? framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.DeadlineExceeded
14
+ : framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RouteNotConnected, `${operationKind} exhausted its end-to-end deadline.`, true, cause);
15
+ const timer = setTimeout(() => stop.abort(exhausted()), Math.max(0, Math.ceil(deadlineMs - performance.now())));
16
+ const unobserveIntent = port.observePeerConnectionIntentRemoved((rid) => {
17
+ if (rid === target)
18
+ stop.abort((0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RouteNotConnected, `${operationKind} target node lifecycle ended.`, true));
19
+ });
20
+ const cancellation = AbortSignal.any([
21
+ stop.signal,
22
+ ...(signal === undefined ? [] : [signal]),
23
+ ...(port.requestStopSignal === undefined ? [] : [port.requestStopSignal])
24
+ ]);
25
+ try {
26
+ for (;;) {
27
+ cancellation.throwIfAborted();
28
+ const remainingMs = Math.ceil(deadlineMs - performance.now());
29
+ if (remainingMs <= 0)
30
+ throw exhausted();
31
+ let changed;
32
+ const transition = new Promise((resolve) => {
33
+ changed = resolve;
34
+ });
35
+ let submittedGeneration;
36
+ const attemptStop = new AbortController();
37
+ const attemptSignal = AbortSignal.any([cancellation, attemptStop.signal]);
38
+ const unobserveRoute = port.observePeerRouteChanged((rid) => {
39
+ if (rid !== target)
40
+ return;
41
+ const route = port.observePeerRoute(target);
42
+ if (submittedGeneration === undefined
43
+ ? route.ready
44
+ : route.generation !== undefined && route.generation !== submittedGeneration) {
45
+ changed();
46
+ attemptStop.abort();
47
+ }
48
+ });
49
+ try {
50
+ const route = port.observePeerRoute(target);
51
+ if (!route.ready) {
52
+ await (0, abort_1.awaitWithAbort)(transition, cancellation);
53
+ continue;
54
+ }
55
+ submittedGeneration = route.generation;
56
+ const reply = port.requestService(target, parts, remainingMs, () => {
57
+ wasAdmitted = true;
58
+ });
59
+ const request = onSubmitted === undefined
60
+ ? reply
61
+ : Promise.race([
62
+ reply,
63
+ Promise.resolve()
64
+ .then(() => onSubmitted(attemptSignal))
65
+ .then(() => reply)
66
+ ]);
67
+ const result = await (0, abort_1.awaitWithAbort)(Promise.race([request.then((parts) => ({ parts })), transition.then(() => undefined)]), cancellation);
68
+ if (result !== undefined)
69
+ return result.parts;
70
+ }
71
+ catch (error) {
72
+ cancellation.throwIfAborted();
73
+ if (!durableRequestCanReplay(error))
74
+ throw error;
75
+ if ((0, runtime_values_1.isZLinkBackendResultError)(error) && error.operation === 'request')
76
+ wasAdmitted = true;
77
+ }
78
+ finally {
79
+ attemptStop.abort();
80
+ unobserveRoute();
81
+ }
82
+ }
83
+ }
84
+ finally {
85
+ clearTimeout(timer);
86
+ unobserveIntent();
87
+ }
88
+ }
89
+ function durableRequestCanReplay(error) {
90
+ if (!(0, runtime_values_1.isZLinkBackendResultError)(error))
91
+ return false;
92
+ return error.operation === 'request'
93
+ ? error.result === runtime_values_1.RequestResult.NotConnected || error.result === runtime_values_1.RequestResult.TimedOut
94
+ : error.result === runtime_values_1.SubmitResult.NotConnected ||
95
+ error.result === runtime_values_1.SubmitResult.NotFound ||
96
+ error.result === runtime_values_1.SubmitResult.NotAdmitted ||
97
+ error.result === runtime_values_1.SubmitResult.Backpressured;
98
+ }
@@ -10,5 +10,6 @@ export type ZLinkOperationIdentityKey = string & {
10
10
  readonly [operationKeyBrand]: true;
11
11
  };
12
12
  export declare function operationIdentityKey(operationId: ZLinkOperationIdentity128): ZLinkOperationIdentityKey;
13
+ export declare function validateOperationIdentity(operationId: ZLinkOperationIdentity128): void;
13
14
  export declare function createRandomOperationIdentity(source?: (size: number) => Buffer): ZLinkOperationIdentity128;
14
15
  export {};
@@ -2,18 +2,22 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ZLINK_NATIVE_CORRELATION_OPERATION_NAMESPACE = exports.OPERATION_IDENTITY_BYTES = void 0;
4
4
  exports.operationIdentityKey = operationIdentityKey;
5
+ exports.validateOperationIdentity = validateOperationIdentity;
5
6
  exports.createRandomOperationIdentity = createRandomOperationIdentity;
6
7
  const stream_wire_1 = require("@zlink-systems/stream-wire");
7
8
  const node_crypto_1 = require("node:crypto");
8
9
  exports.OPERATION_IDENTITY_BYTES = 16;
9
10
  exports.ZLINK_NATIVE_CORRELATION_OPERATION_NAMESPACE = 2n;
10
11
  function operationIdentityKey(operationId) {
12
+ validateOperationIdentity(operationId);
13
+ return `${operationId.high.toString(16)}:${operationId.low.toString(16)}`;
14
+ }
15
+ function validateOperationIdentity(operationId) {
11
16
  requireUnsigned64(operationId.high, 'operationId.high');
12
17
  requireUnsigned64(operationId.low, 'operationId.low');
13
18
  if (operationId.high === 0n && operationId.low === 0n) {
14
19
  throw new RangeError('Operation identity must not be all zero.');
15
20
  }
16
- return `${operationId.high.toString(16)}:${operationId.low.toString(16)}`;
17
21
  }
18
22
  function createRandomOperationIdentity(source = node_crypto_1.randomBytes) {
19
23
  for (;;) {
@@ -17,6 +17,7 @@ export interface RawServiceRequestResult {
17
17
  /** An M6A application frame already owned by the Framework runtime. */
18
18
  type ServiceApplicationPayloadInput = ServiceApplicationPayload | Buffer;
19
19
  export interface RawServiceIngressRecord {
20
+ readonly onAdmitted?: () => void;
20
21
  readonly command: number;
21
22
  readonly flags: number;
22
23
  readonly sourceRoutingId: string;
@@ -29,6 +30,8 @@ export interface RawServiceIngressRecord {
29
30
  }
30
31
  export type RawServiceIngressHandler = (record: RawServiceIngressRecord) => RawServicePumpResult | undefined | Promise<RawServicePumpResult | undefined>;
31
32
  export interface RawServiceMeshRuntimeOptions {
33
+ readonly onReceiveReady?: () => void;
34
+ readonly infrastructureTaskRunner?: import('../spots/spot-actor-join-dispatch').ZLinkDetachedTaskRunner;
32
35
  readonly onPendingOperationsChanged?: () => void;
33
36
  readonly descriptor: ServiceNodeDescriptor;
34
37
  readonly resolveAdvertisedEndpoint?: (boundEndpoint: string) => string;
@@ -61,6 +64,7 @@ export declare class RawServiceMeshRuntime {
61
64
  private readonly expectedPeers;
62
65
  private readonly endpointOnlyPeers;
63
66
  private readonly peerConnectionIntentRemoved;
67
+ private readonly peerRouteChanged;
64
68
  /**
65
69
  * The last observed Core selected route of each RID (Core ROUTER §10.1):
66
70
  * RID -> route generation. Only `observeSelectedRoutes` replaces it.
@@ -68,8 +72,16 @@ export declare class RawServiceMeshRuntime {
68
72
  private selectedRoutes;
69
73
  private readonly bindingPort;
70
74
  private readonly applicationJobQueue;
75
+ private readonly nodeMailboxOwner;
71
76
  private readonly peerAdmissionSealed?;
72
77
  private readonly applicationJobStop;
78
+ private receiveAcquisition?;
79
+ private receivePermit?;
80
+ private receiveRotation?;
81
+ private readonly controlSends;
82
+ private infrastructureFailure?;
83
+ private readonly onReceiveReady?;
84
+ private readonly infrastructureTaskRunner?;
73
85
  private readonly onPeerNotRequired?;
74
86
  private readonly onPeerDisconnected?;
75
87
  private readonly onProtocolError?;
@@ -80,6 +92,7 @@ export declare class RawServiceMeshRuntime {
80
92
  private router?;
81
93
  private nextCorrelation;
82
94
  private serviceIngress?;
95
+ private serviceIngressAccepts?;
83
96
  private closed;
84
97
  constructor(options: RawServiceMeshRuntimeOptions);
85
98
  start(): void;
@@ -90,6 +103,11 @@ export declare class RawServiceMeshRuntime {
90
103
  disconnectPeer(endpoint: string, nodeRoutingId: string, lifecycleGeneration?: bigint): void;
91
104
  disconnectPeerEndpoint(endpoint: string): void;
92
105
  observePeerConnectionIntentRemoved(listener: (nodeRoutingId: string) => void): () => void;
106
+ observePeerRoute(nodeRoutingId: string): import('./durable-service-request').PeerRouteObservation;
107
+ get requestStopSignal(): AbortSignal;
108
+ observePeerRouteChanged(listener: (nodeRoutingId: string) => void): () => void;
109
+ hasSelectedPeerRoute(nodeRoutingId: string): boolean;
110
+ private notifyPeerRouteChanged;
93
111
  private notifyPeerConnectionIntentRemoved;
94
112
  announcePeer(nodeRoutingId: string): Promise<boolean>;
95
113
  isPeerRouteReady(nodeRoutingId: string, lifecycleGeneration?: bigint): boolean;
@@ -100,17 +118,18 @@ export declare class RawServiceMeshRuntime {
100
118
  readonly channelWeight?: number;
101
119
  readonly state?: 'draining';
102
120
  }): Promise<void>;
121
+ private publishLocalDescriptor;
103
122
  replaceDiscoveredNotRequired(descriptors: readonly ServiceNodeDescriptor[]): void;
104
123
  isObjectClientNodeDirectTarget(nodeRoutingId: string): boolean;
105
- sendToNode(targetNodeRoutingId: string, payload: ServiceApplicationPayloadInput): Promise<boolean>;
124
+ sendToNode(targetNodeRoutingId: string, payload: ServiceApplicationPayloadInput): boolean | Promise<boolean>;
106
125
  sendToChannel(channelName: string, payload: ServiceApplicationPayloadInput): Promise<SubmitResult>;
107
- requestToNode(targetNodeRoutingId: string, payload: ServiceApplicationPayloadInput, timeoutMs: number): PendingOperation<RawServiceRequestResult>;
108
- requestToChannel(channelName: string, payload: ServiceApplicationPayloadInput, timeoutMs: number): PendingOperation<RawServiceRequestResult>;
126
+ requestToNode(targetNodeRoutingId: string, payload: ServiceApplicationPayloadInput, timeoutMs: number, onAdmitted?: () => void): PendingOperation<RawServiceRequestResult>;
127
+ requestToChannel(channelName: string, payload: ServiceApplicationPayloadInput, timeoutMs: number, onAdmitted?: () => void): PendingOperation<RawServiceRequestResult>;
109
128
  private selectChannelTarget;
110
- setServiceIngress(handler: RawServiceIngressHandler): void;
129
+ setServiceIngress(handler: RawServiceIngressHandler, accepts?: (command: number) => boolean): void;
111
130
  reserveLocalIngress(signal?: AbortSignal): Promise<ApplicationIngressRecordOwner>;
112
131
  sendService(targetNodeRoutingId: string, parts: readonly Uint8Array[]): Promise<boolean>;
113
- requestService(targetNodeRoutingId: string, parts: readonly Uint8Array[], timeoutMs: number): Promise<readonly Buffer[]>;
132
+ requestService(targetNodeRoutingId: string, parts: readonly Uint8Array[], timeoutMs: number, onAdmitted?: () => void): Promise<readonly Buffer[]>;
114
133
  replyService(record: Pick<RawServiceIngressRecord, 'sourceRoutingId' | 'sourceRoute' | 'requestSequence' | 'reply'>, parts: readonly Uint8Array[]): void;
115
134
  reply(request: ServiceMailboxRecord, payload: ServiceApplicationPayloadInput, terminalResult?: number, failureCode?: number): void;
116
135
  pumpOne(nowMs?: number, observe?: RawServicePumpObserver): Promise<RawServicePumpResult>;
@@ -118,12 +137,18 @@ export declare class RawServiceMeshRuntime {
118
137
  /** Returns whether a receive budget ended before no-data; idle ticks only maintain peers. */
119
138
  pumpBatch(receiveReady?: boolean, routeReady?: boolean): Promise<boolean>;
120
139
  private receiveOne;
140
+ private finishReceive;
121
141
  private reportProtocolError;
122
142
  private replyGenericProtocolError;
123
143
  private processReceived;
144
+ private receiveProtocolFailure;
145
+ private processAdmission;
146
+ private processLiveness;
147
+ private processApplicationReceived;
148
+ private enqueueOrdinaryRecord;
124
149
  expireOperations(nowMs: number, turnDeadlineMs: number): number;
125
150
  get pendingOperationCount(): number;
126
- tickLiveness(nowMs?: number): Promise<ServiceLivenessTick>;
151
+ tickLiveness(nowMs?: number): ServiceLivenessTick;
127
152
  /**
128
153
  * The socket's one route observer (Core ROUTER §10.1). It replaces the
129
154
  * observation with Core's selected-route snapshot, ends the admission of
@@ -144,6 +169,12 @@ export declare class RawServiceMeshRuntime {
144
169
  private selectBilateralConnection;
145
170
  private removePeer;
146
171
  private requireStarted;
172
+ private sendControl;
173
+ private submitControl;
174
+ private startControlSend;
175
+ private reportInfrastructureFailure;
176
+ private observeInfrastructureFailure;
147
177
  private send;
178
+ private sendFailure;
148
179
  }
149
180
  export {};