@zlink-systems/framework 0.30.3 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Actors/ZLinkActor.d.ts +2 -0
  3. package/dist/contracts/Actors/ZLinkSessionBindingIdentity.d.ts +6 -0
  4. package/dist/contracts/Actors/ZLinkSessionBindingIdentity.js +2 -0
  5. package/dist/contracts/Actors/index.d.ts +1 -0
  6. package/dist/contracts/Actors/index.js +1 -0
  7. package/dist/contracts/Common/CoreTypes.d.ts +1 -0
  8. package/dist/contracts/Common/HandlerMessageType.d.ts +8 -0
  9. package/dist/contracts/Common/HandlerMessageType.js +41 -0
  10. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +1 -1
  11. package/dist/contracts/Common/ZLinkEncodedPayload.js +12 -20
  12. package/dist/contracts/Common/ZLinkMessage.js +11 -7
  13. package/dist/contracts/Common/encoded-payload-storage.d.ts +0 -2
  14. package/dist/contracts/Common/encoded-payload-storage.js +4 -16
  15. package/dist/contracts/Common/index.d.ts +1 -1
  16. package/dist/contracts/Common/payload-slab.d.ts +4 -0
  17. package/dist/contracts/Common/payload-slab.js +30 -0
  18. package/dist/contracts/Configuration/RegistrationBuilders.js +15 -9
  19. package/dist/contracts/Configuration/RegistrationTypes.d.ts +19 -0
  20. package/dist/contracts/Handlers/Contexts.d.ts +1 -0
  21. package/dist/contracts/Locations/Authority.d.ts +2 -0
  22. package/dist/internal.d.ts +9 -0
  23. package/dist/internal.js +23 -1
  24. package/dist/nest-integration.d.ts +1 -0
  25. package/dist/nest-integration.js +3 -1
  26. package/dist/runtime/actors/actor-client.d.ts +6 -2
  27. package/dist/runtime/actors/actor-client.js +120 -82
  28. package/dist/runtime/actors/actor-context.js +16 -5
  29. package/dist/runtime/actors/actor-execution-context.js +2 -2
  30. package/dist/runtime/actors/actor-handoff.d.ts +12 -1
  31. package/dist/runtime/actors/actor-handoff.js +79 -34
  32. package/dist/runtime/actors/actor-join-deferred-scope.js +6 -6
  33. package/dist/runtime/actors/actor-local-native-join.d.ts +2 -2
  34. package/dist/runtime/actors/actor-local-native-join.js +19 -17
  35. package/dist/runtime/actors/actor-mailbox.d.ts +1 -1
  36. package/dist/runtime/actors/actor-remote-joiner.d.ts +2 -2
  37. package/dist/runtime/actors/actor-remote-joiner.js +4 -4
  38. package/dist/runtime/actors/actor-routed-join-transport.d.ts +9 -3
  39. package/dist/runtime/actors/actor-routed-json-request.d.ts +3 -0
  40. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -2
  41. package/dist/runtime/actors/actor-runtime-state.d.ts +1 -1
  42. package/dist/runtime/actors/spot-actor-dispatch.d.ts +9 -5
  43. package/dist/runtime/actors/spot-actor-dispatch.js +60 -38
  44. package/dist/runtime/admission.d.ts +6 -4
  45. package/dist/runtime/admission.js +21 -10
  46. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +1 -0
  47. package/dist/runtime/application-jobs/application-ingress-record-owner.js +3 -0
  48. package/dist/runtime/backend/contracts/index.d.ts +26 -10
  49. package/dist/runtime/backend/mesh-completion-table.d.ts +7 -1
  50. package/dist/runtime/backend/mesh-completion-table.js +84 -20
  51. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +19 -6
  52. package/dist/runtime/backend/mesh-dispatch-pump.js +246 -147
  53. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +3 -2
  54. package/dist/runtime/backend/node/node-backend-adapter-support.js +27 -19
  55. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +5 -2
  56. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +70 -13
  57. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
  58. package/dist/runtime/backend/node/node-event-loop-poller.js +4 -3
  59. package/dist/runtime/backend/node/node-mesh-backend-adapter.js +5 -1
  60. package/dist/runtime/backend/node/node-raw-binding-port.d.ts +7 -2
  61. package/dist/runtime/backend/node/node-raw-binding-port.js +99 -63
  62. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +34 -16
  63. package/dist/runtime/backend/node/node-raw-mesh-backend.js +210 -106
  64. package/dist/runtime/backend/node/node-socket-backend-adapter.js +20 -6
  65. package/dist/runtime/backend/raw-binding-port.d.ts +6 -3
  66. package/dist/runtime/channels/channel-clients.js +3 -3
  67. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +11 -7
  68. package/dist/runtime/channels/channel-dispatch-pipeline.js +40 -22
  69. package/dist/runtime/channels/channel-dispatch-services.d.ts +3 -1
  70. package/dist/runtime/channels/channel-dispatch-services.js +7 -6
  71. package/dist/runtime/channels/channel-dispatchers.d.ts +13 -6
  72. package/dist/runtime/channels/channel-dispatchers.js +57 -36
  73. package/dist/runtime/channels/channel-envelope.d.ts +2 -2
  74. package/dist/runtime/channels/channel-envelope.js +609 -83
  75. package/dist/runtime/channels/channel-multipart.d.ts +1 -0
  76. package/dist/runtime/channels/channel-multipart.js +10 -6
  77. package/dist/runtime/channels/channel-outbound-operations.d.ts +6 -9
  78. package/dist/runtime/channels/channel-outbound-operations.js +107 -105
  79. package/dist/runtime/channels/channel-receive-loops.d.ts +9 -7
  80. package/dist/runtime/channels/channel-receive-loops.js +126 -90
  81. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +23 -6
  82. package/dist/runtime/channels/channel-runtime-lifecycle.js +47 -38
  83. package/dist/runtime/channels/channel-runtime-manager.d.ts +13 -6
  84. package/dist/runtime/channels/channel-runtime-manager.js +32 -14
  85. package/dist/runtime/channels/channel-socket-registry.d.ts +28 -4
  86. package/dist/runtime/channels/channel-socket-registry.js +9 -1
  87. package/dist/runtime/channels/channel-transports.d.ts +23 -16
  88. package/dist/runtime/channels/channel-transports.js +139 -119
  89. package/dist/runtime/channels/dispatch-error-reporter.d.ts +4 -4
  90. package/dist/runtime/channels/dispatch-error-reporter.js +5 -5
  91. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  92. package/dist/runtime/channels/local-spot-route-transport.d.ts +5 -2
  93. package/dist/runtime/channels/local-spot-route-transport.js +15 -18
  94. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +6 -3
  95. package/dist/runtime/channels/router-socket-spot-route-transport.js +33 -19
  96. package/dist/runtime/channels/source-spot-router.d.ts +6 -3
  97. package/dist/runtime/channels/source-spot-router.js +34 -23
  98. package/dist/runtime/channels/spot-node-route-transport.d.ts +6 -3
  99. package/dist/runtime/channels/spot-node-route-transport.js +23 -17
  100. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +6 -3
  101. package/dist/runtime/channels/spot-route-bridge-transport.js +38 -24
  102. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +8 -4
  103. package/dist/runtime/channels/spot-route-dispatch-strategy.js +36 -23
  104. package/dist/runtime/diagnostics/dispatch-error-details.js +9 -3
  105. package/dist/runtime/diagnostics/message-flow-bootstrap.d.ts +1 -0
  106. package/dist/runtime/diagnostics/message-flow-bootstrap.js +8 -0
  107. package/dist/runtime/diagnostics/message-flow-delivery.d.ts +47 -0
  108. package/dist/runtime/diagnostics/message-flow-delivery.js +149 -0
  109. package/dist/runtime/diagnostics/message-flow-record.d.ts +50 -0
  110. package/dist/runtime/diagnostics/message-flow-record.js +228 -0
  111. package/dist/runtime/diagnostics/message-flow-worker.d.ts +1 -0
  112. package/dist/runtime/diagnostics/message-flow-worker.js +118 -0
  113. package/dist/runtime/diagnostics/message-flow.d.ts +7 -19
  114. package/dist/runtime/diagnostics/message-flow.js +42 -290
  115. package/dist/runtime/diagnostics/runtime-metrics.d.ts +4 -3
  116. package/dist/runtime/diagnostics/runtime-metrics.js +8 -4
  117. package/dist/runtime/execution/index.d.ts +1 -0
  118. package/dist/runtime/execution/index.js +6 -3
  119. package/dist/runtime/execution/serial-execution-queue.d.ts +26 -13
  120. package/dist/runtime/execution/serial-execution-queue.js +75 -71
  121. package/dist/runtime/foundation/durable-service-request.d.ts +12 -3
  122. package/dist/runtime/foundation/durable-service-request.js +158 -73
  123. package/dist/runtime/foundation/operation-registry.d.ts +33 -3
  124. package/dist/runtime/foundation/operation-registry.js +272 -33
  125. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +62 -23
  126. package/dist/runtime/foundation/raw-service-mesh-runtime.js +373 -194
  127. package/dist/runtime/foundation/request-runtime.d.ts +17 -0
  128. package/dist/runtime/foundation/request-runtime.js +163 -0
  129. package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
  130. package/dist/runtime/foundation/service-discovery-registry.js +6 -0
  131. package/dist/runtime/foundation/service-liveness-registry.d.ts +1 -1
  132. package/dist/runtime/foundation/service-mailbox.d.ts +4 -2
  133. package/dist/runtime/foundation/service-mailbox.js +4 -1
  134. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -2
  135. package/dist/runtime/foundation/service-relocation-object-owner.js +12 -5
  136. package/dist/runtime/foundation/service-runtime-contracts.d.ts +7 -2
  137. package/dist/runtime/foundation/service-stateful-registry.d.ts +6 -2
  138. package/dist/runtime/foundation/service-stateful-registry.js +38 -17
  139. package/dist/runtime/foundation/service-stateful-runtime.d.ts +91 -26
  140. package/dist/runtime/foundation/service-stateful-runtime.js +245 -120
  141. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -0
  142. package/dist/runtime/foundation/service-stateful-wire-codec.js +15 -0
  143. package/dist/runtime/foundation/service-topology-registry.d.ts +2 -0
  144. package/dist/runtime/foundation/service-topology-registry.js +13 -3
  145. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  146. package/dist/runtime/foundation/service-wire-constants.generated.js +12 -0
  147. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +5 -1
  148. package/dist/runtime/foundation/service-wire-m6a-codec.js +50 -15
  149. package/dist/runtime/host/actor-packet-relay.d.ts +5 -6
  150. package/dist/runtime/host/actor-packet-relay.js +58 -57
  151. package/dist/runtime/host/actor-placement-coordinator.d.ts +1 -1
  152. package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
  153. package/dist/runtime/host/actor-runtime-options-factory.js +3 -2
  154. package/dist/runtime/host/actor-transfer-runtime.d.ts +3 -3
  155. package/dist/runtime/host/application-job-queue.d.ts +7 -5
  156. package/dist/runtime/host/application-job-queue.js +33 -21
  157. package/dist/runtime/host/bound-session-relay.js +0 -1
  158. package/dist/runtime/host/channel-runtime-options-factory.d.ts +2 -0
  159. package/dist/runtime/host/channel-runtime-options-factory.js +1 -0
  160. package/dist/runtime/host/entry-actor-runtime.d.ts +5 -2
  161. package/dist/runtime/host/entry-actor-runtime.js +2 -2
  162. package/dist/runtime/host/index.d.ts +106 -37
  163. package/dist/runtime/host/index.js +303 -151
  164. package/dist/runtime/host/location-runtime-owner.d.ts +2 -2
  165. package/dist/runtime/host/location-runtime-owner.js +1 -1
  166. package/dist/runtime/host/service-relocation-host-runtime.d.ts +195 -45
  167. package/dist/runtime/host/service-relocation-host-runtime.js +257 -144
  168. package/dist/runtime/host/spot-address-transport.d.ts +3 -0
  169. package/dist/runtime/host/spot-address-transport.js +73 -76
  170. package/dist/runtime/host/spot-runtime-options-factory.js +2 -0
  171. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -1
  172. package/dist/runtime/host/user-spot-creation-coordinator.js +49 -21
  173. package/dist/runtime/internal-observation.d.ts +1 -0
  174. package/dist/runtime/internal-observation.js +5 -0
  175. package/dist/runtime/locations/actor-location-claims.d.ts +1 -1
  176. package/dist/runtime/locations/actor-location-claims.js +15 -6
  177. package/dist/runtime/locations/auto-connect-loop.d.ts +0 -1
  178. package/dist/runtime/locations/auto-connect-loop.js +25 -19
  179. package/dist/runtime/locations/auto-connect-planner.js +2 -5
  180. package/dist/runtime/locations/auto-connect-reconciler.d.ts +1 -0
  181. package/dist/runtime/locations/auto-connect-reconciler.js +35 -23
  182. package/dist/runtime/locations/in-memory-authority-store.d.ts +1 -0
  183. package/dist/runtime/locations/in-memory-authority-store.js +15 -5
  184. package/dist/runtime/locations/in-memory-location-store.d.ts +0 -2
  185. package/dist/runtime/locations/in-memory-location-store.js +1 -38
  186. package/dist/runtime/locations/lifecycle.d.ts +1 -1
  187. package/dist/runtime/locations/lifecycle.js +2 -2
  188. package/dist/runtime/locations/location-store-repository.d.ts +0 -1
  189. package/dist/runtime/locations/location-store-repository.js +163 -246
  190. package/dist/runtime/locations/resolvers.d.ts +8 -1
  191. package/dist/runtime/locations/resolvers.js +16 -2
  192. package/dist/runtime/locations/runtime.d.ts +3 -3
  193. package/dist/runtime/locations/runtime.js +12 -16
  194. package/dist/runtime/messaging/creation-payload-codec.js +8 -7
  195. package/dist/runtime/messaging/framework-json-v1.d.ts +1 -1
  196. package/dist/runtime/messaging/framework-json-v1.js +6 -2
  197. package/dist/runtime/messaging/payload-codec.js +21 -35
  198. package/dist/runtime/messaging/request-deadline.d.ts +4 -2
  199. package/dist/runtime/messaging/request-deadline.js +40 -25
  200. package/dist/runtime/messaging/request-result.d.ts +14 -1
  201. package/dist/runtime/messaging/request-result.js +74 -13
  202. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +4 -0
  203. package/dist/runtime/protocol/service_wire_codec.generated.js +17 -7
  204. package/dist/runtime/spots/index.d.ts +28 -7
  205. package/dist/runtime/spots/index.js +31 -6
  206. package/dist/runtime/spots/spot-activation-registry.d.ts +3 -2
  207. package/dist/runtime/spots/spot-activation-registry.js +13 -8
  208. package/dist/runtime/spots/spot-activation-state.d.ts +2 -0
  209. package/dist/runtime/spots/spot-activation-state.js +1 -0
  210. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +9 -4
  211. package/dist/runtime/spots/spot-actor-admission-coordinator.js +33 -12
  212. package/dist/runtime/spots/spot-actor-ingress-admission.d.ts +40 -0
  213. package/dist/runtime/spots/spot-actor-ingress-admission.js +78 -0
  214. package/dist/runtime/spots/spot-actor-membership.js +3 -3
  215. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +16 -43
  216. package/dist/runtime/spots/spot-actor-packet-dispatch.js +56 -113
  217. package/dist/runtime/spots/spot-actor-packet-drain.d.ts +1 -0
  218. package/dist/runtime/spots/spot-actor-packet-drain.js +12 -5
  219. package/dist/runtime/spots/spot-entry-activation.d.ts +4 -3
  220. package/dist/runtime/spots/spot-entry-activation.js +7 -12
  221. package/dist/runtime/spots/spot-handler-registry.d.ts +5 -1
  222. package/dist/runtime/spots/spot-handler-registry.js +31 -15
  223. package/dist/runtime/spots/spot-manager-public.js +3 -2
  224. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +11 -6
  225. package/dist/runtime/spots/spot-node-runtime-manager.js +6 -1
  226. package/dist/runtime/spots/spot-outbound.d.ts +8 -2
  227. package/dist/runtime/spots/spot-outbound.js +5 -5
  228. package/dist/runtime/spots/spot-route-packet-dispatch.js +13 -8
  229. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +3 -3
  230. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +9 -5
  231. package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -2
  232. package/dist/runtime/spots/spot-serial-executor.d.ts +2 -1
  233. package/dist/runtime/spots/spot-serial-turn-executor.js +20 -26
  234. package/dist/runtime/spots/spot-subscription-dispatch.js +5 -2
  235. package/dist/runtime/spots/spot-timer.d.ts +1 -1
  236. package/dist/runtime/streams/actor-session-binding-registry.d.ts +11 -3
  237. package/dist/runtime/streams/actor-session-binding-registry.js +28 -0
  238. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -2
  239. package/dist/runtime/streams/bound-actor-relay-sender.js +3 -4
  240. package/dist/runtime/streams/bound-session-service.js +6 -7
  241. package/dist/runtime/streams/index.d.ts +3 -3
  242. package/dist/runtime/streams/index.js +22 -2
  243. package/dist/runtime/streams/managed-stream.js +2 -1
  244. package/dist/runtime/streams/session-calls.d.ts +1 -1
  245. package/dist/runtime/streams/session-calls.js +3 -9
  246. package/dist/runtime/streams/session-context.d.ts +2 -2
  247. package/dist/runtime/streams/session-context.js +2 -2
  248. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -0
  249. package/dist/runtime/streams/stream-session-runtime.js +64 -33
  250. package/package.json +3 -3
  251. package/src/contracts/Actors/ZLinkActor.ts +6 -0
  252. package/src/contracts/Actors/ZLinkSessionBindingIdentity.ts +7 -0
  253. package/src/contracts/Actors/index.ts +1 -0
  254. package/src/contracts/Common/CoreTypes.ts +1 -0
  255. package/src/contracts/Common/HandlerMessageType.ts +50 -0
  256. package/src/contracts/Common/ZLinkEncodedPayload.ts +13 -25
  257. package/src/contracts/Common/ZLinkMessage.ts +11 -7
  258. package/src/contracts/Common/encoded-payload-storage.ts +4 -16
  259. package/src/contracts/Common/index.ts +1 -1
  260. package/src/contracts/Common/payload-slab.ts +29 -0
  261. package/src/contracts/Configuration/RegistrationBuilders.ts +29 -15
  262. package/src/contracts/Configuration/RegistrationTypes.ts +19 -0
  263. package/src/contracts/Handlers/Contexts.ts +1 -0
  264. package/src/contracts/Locations/Authority.ts +7 -1
  265. package/src/internal.ts +17 -0
  266. package/src/nest-integration.ts +1 -0
  267. package/src/runtime/actors/actor-client.ts +257 -163
  268. package/src/runtime/actors/actor-context.ts +26 -14
  269. package/src/runtime/actors/actor-execution-context.ts +2 -2
  270. package/src/runtime/actors/actor-handoff.ts +86 -51
  271. package/src/runtime/actors/actor-join-deferred-scope.ts +6 -6
  272. package/src/runtime/actors/actor-local-native-join.ts +38 -17
  273. package/src/runtime/actors/actor-mailbox.ts +1 -1
  274. package/src/runtime/actors/actor-remote-joiner.ts +8 -4
  275. package/src/runtime/actors/actor-routed-join-transport.ts +13 -5
  276. package/src/runtime/actors/actor-routed-json-request.ts +3 -0
  277. package/src/runtime/actors/actor-runtime-contracts.ts +4 -2
  278. package/src/runtime/actors/actor-runtime-state.ts +1 -1
  279. package/src/runtime/actors/spot-actor-dispatch.ts +70 -68
  280. package/src/runtime/admission.ts +42 -15
  281. package/src/runtime/application-jobs/application-ingress-record-owner.ts +4 -0
  282. package/src/runtime/backend/contracts/index.ts +77 -10
  283. package/src/runtime/backend/mesh-completion-table.ts +106 -15
  284. package/src/runtime/backend/mesh-dispatch-pump.ts +294 -146
  285. package/src/runtime/backend/node/node-backend-adapter-support.ts +42 -32
  286. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +91 -34
  287. package/src/runtime/backend/node/node-event-loop-poller.ts +14 -5
  288. package/src/runtime/backend/node/node-mesh-backend-adapter.ts +5 -1
  289. package/src/runtime/backend/node/node-raw-binding-port.ts +180 -69
  290. package/src/runtime/backend/node/node-raw-mesh-backend.ts +386 -157
  291. package/src/runtime/backend/node/node-socket-backend-adapter.ts +56 -11
  292. package/src/runtime/backend/raw-binding-port.ts +13 -5
  293. package/src/runtime/channels/channel-clients.ts +26 -11
  294. package/src/runtime/channels/channel-dispatch-pipeline.ts +77 -65
  295. package/src/runtime/channels/channel-dispatch-services.ts +7 -12
  296. package/src/runtime/channels/channel-dispatchers.ts +93 -39
  297. package/src/runtime/channels/channel-envelope.ts +680 -144
  298. package/src/runtime/channels/channel-multipart.ts +17 -13
  299. package/src/runtime/channels/channel-outbound-operations.ts +204 -178
  300. package/src/runtime/channels/channel-receive-loops.ts +160 -107
  301. package/src/runtime/channels/channel-runtime-lifecycle.ts +64 -59
  302. package/src/runtime/channels/channel-runtime-manager.ts +74 -27
  303. package/src/runtime/channels/channel-socket-registry.ts +20 -5
  304. package/src/runtime/channels/channel-transports.ts +414 -287
  305. package/src/runtime/channels/dispatch-error-reporter.ts +4 -9
  306. package/src/runtime/channels/local-spot-route-transport.ts +27 -29
  307. package/src/runtime/channels/router-socket-spot-route-transport.ts +63 -32
  308. package/src/runtime/channels/source-spot-router.ts +75 -38
  309. package/src/runtime/channels/spot-node-route-transport.ts +67 -37
  310. package/src/runtime/channels/spot-route-bridge-transport.ts +62 -30
  311. package/src/runtime/channels/spot-route-dispatch-strategy.ts +105 -34
  312. package/src/runtime/diagnostics/dispatch-error-details.ts +10 -2
  313. package/src/runtime/diagnostics/message-flow-bootstrap.ts +6 -0
  314. package/src/runtime/diagnostics/message-flow-delivery.ts +171 -0
  315. package/src/runtime/diagnostics/message-flow-record.ts +295 -0
  316. package/src/runtime/diagnostics/message-flow-worker.ts +146 -0
  317. package/src/runtime/diagnostics/message-flow.ts +49 -362
  318. package/src/runtime/diagnostics/runtime-metrics.ts +10 -4
  319. package/src/runtime/execution/index.ts +6 -0
  320. package/src/runtime/execution/serial-execution-queue.ts +94 -96
  321. package/src/runtime/foundation/durable-service-request.ts +212 -89
  322. package/src/runtime/foundation/operation-registry.ts +287 -38
  323. package/src/runtime/foundation/raw-service-mesh-runtime.ts +617 -292
  324. package/src/runtime/foundation/request-runtime.ts +227 -0
  325. package/src/runtime/foundation/service-discovery-registry.ts +7 -0
  326. package/src/runtime/foundation/service-liveness-registry.ts +1 -1
  327. package/src/runtime/foundation/service-mailbox.ts +7 -2
  328. package/src/runtime/foundation/service-relocation-object-owner.ts +21 -6
  329. package/src/runtime/foundation/service-runtime-contracts.ts +12 -2
  330. package/src/runtime/foundation/service-stateful-registry.ts +52 -19
  331. package/src/runtime/foundation/service-stateful-runtime.ts +365 -198
  332. package/src/runtime/foundation/service-stateful-wire-codec.ts +18 -0
  333. package/src/runtime/foundation/service-topology-registry.ts +21 -3
  334. package/src/runtime/foundation/service-wire-constants.generated.ts +10 -0
  335. package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -17
  336. package/src/runtime/host/actor-packet-relay.ts +160 -156
  337. package/src/runtime/host/actor-placement-coordinator.ts +1 -1
  338. package/src/runtime/host/actor-runtime-options-factory.ts +7 -2
  339. package/src/runtime/host/actor-transfer-runtime.ts +3 -3
  340. package/src/runtime/host/application-job-queue.ts +56 -27
  341. package/src/runtime/host/bound-session-relay.ts +0 -1
  342. package/src/runtime/host/channel-runtime-options-factory.ts +3 -0
  343. package/src/runtime/host/entry-actor-runtime.ts +14 -6
  344. package/src/runtime/host/index.ts +388 -113
  345. package/src/runtime/host/location-runtime-owner.ts +3 -3
  346. package/src/runtime/host/service-relocation-host-runtime.ts +380 -252
  347. package/src/runtime/host/spot-address-transport.ts +110 -95
  348. package/src/runtime/host/spot-runtime-options-factory.ts +3 -0
  349. package/src/runtime/host/user-spot-creation-coordinator.ts +69 -22
  350. package/src/runtime/internal-observation.ts +2 -0
  351. package/src/runtime/locations/actor-location-claims.ts +42 -16
  352. package/src/runtime/locations/auto-connect-loop.ts +24 -16
  353. package/src/runtime/locations/auto-connect-planner.ts +2 -5
  354. package/src/runtime/locations/auto-connect-reconciler.ts +37 -24
  355. package/src/runtime/locations/in-memory-authority-store.ts +27 -7
  356. package/src/runtime/locations/in-memory-location-store.ts +1 -74
  357. package/src/runtime/locations/lifecycle.ts +4 -2
  358. package/src/runtime/locations/location-store-repository.ts +228 -308
  359. package/src/runtime/locations/resolvers.ts +20 -8
  360. package/src/runtime/locations/runtime.ts +16 -28
  361. package/src/runtime/messaging/creation-payload-codec.ts +12 -10
  362. package/src/runtime/messaging/framework-json-v1.ts +10 -1
  363. package/src/runtime/messaging/payload-codec.ts +50 -75
  364. package/src/runtime/messaging/request-deadline.ts +47 -39
  365. package/src/runtime/messaging/request-result.ts +88 -17
  366. package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
  367. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
  368. package/src/runtime/spots/index.ts +57 -10
  369. package/src/runtime/spots/spot-activation-registry.ts +12 -8
  370. package/src/runtime/spots/spot-activation-state.ts +2 -0
  371. package/src/runtime/spots/spot-actor-admission-coordinator.ts +62 -37
  372. package/src/runtime/spots/spot-actor-ingress-admission.ts +157 -0
  373. package/src/runtime/spots/spot-actor-membership.ts +8 -5
  374. package/src/runtime/spots/spot-actor-packet-dispatch.ts +122 -206
  375. package/src/runtime/spots/spot-actor-packet-drain.ts +21 -6
  376. package/src/runtime/spots/spot-entry-activation.ts +25 -35
  377. package/src/runtime/spots/spot-handler-registry.ts +72 -15
  378. package/src/runtime/spots/spot-manager-public.ts +4 -2
  379. package/src/runtime/spots/spot-node-runtime-manager.ts +16 -7
  380. package/src/runtime/spots/spot-outbound.ts +26 -10
  381. package/src/runtime/spots/spot-route-packet-dispatch.ts +18 -8
  382. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +14 -8
  383. package/src/runtime/spots/spot-runtime-ports.ts +5 -2
  384. package/src/runtime/spots/spot-serial-executor.ts +1 -1
  385. package/src/runtime/spots/spot-serial-turn-executor.ts +25 -40
  386. package/src/runtime/spots/spot-subscription-dispatch.ts +9 -2
  387. package/src/runtime/spots/spot-timer.ts +1 -1
  388. package/src/runtime/streams/actor-session-binding-registry.ts +46 -3
  389. package/src/runtime/streams/bound-actor-relay-sender.ts +16 -5
  390. package/src/runtime/streams/bound-session-service.ts +10 -7
  391. package/src/runtime/streams/index.ts +30 -4
  392. package/src/runtime/streams/managed-stream.ts +2 -1
  393. package/src/runtime/streams/session-calls.ts +9 -14
  394. package/src/runtime/streams/session-context.ts +6 -11
  395. package/src/runtime/streams/stream-session-runtime.ts +79 -40
  396. package/dist/runtime/spots/spot-lifecycle-metrics.d.ts +0 -8
  397. package/dist/runtime/spots/spot-lifecycle-metrics.js +0 -17
  398. package/src/runtime/spots/spot-lifecycle-metrics.ts +0 -16
@@ -1,3 +1,10 @@
1
+ import { RequestRuntime } from '../../foundation/request-runtime';
2
+ import {
3
+ prepareZLinkRequestReply,
4
+ identityRequestReply,
5
+ rejectZLinkRequestReply,
6
+ type ZLinkRequestResult
7
+ } from '../../messaging/request-result';
1
8
  import { bindingRequestReply } from './node-backend-adapter-support';
2
9
  import type { DealerSocket, Message, PubSocket } from '@zlink-systems/zlink';
3
10
  import { ZLinkConfigurationException } from '../../configuration';
@@ -8,7 +15,7 @@ import {
8
15
  ZLinkChannelMessageKind
9
16
  } from '../../channels/channel-envelope';
10
17
  import { throwIfAborted } from '../../abort';
11
- import { appendParts, submitRequestOperation } from '../../channels/channel-multipart';
18
+ import { appendParts, mapRequestFailure } from '../../channels/channel-multipart';
12
19
  import type { ZLinkChannelClientTransport } from '../../channels/channel-transports';
13
20
  import { runWithOutboundFlow } from '../../diagnostics/flow-context';
14
21
 
@@ -18,7 +25,8 @@ const EMPTY_METADATA: ReadonlyMap<string, string> = new Map();
18
25
  export class ZLinkDealerChannelClientTransport implements ZLinkChannelClientTransport {
19
26
  constructor(
20
27
  private readonly dealer: DealerSocket,
21
- private readonly publisher?: PubSocket
28
+ private readonly publisher?: PubSocket,
29
+ private readonly requests = new RequestRuntime()
22
30
  ) {}
23
31
 
24
32
  async send(
@@ -51,7 +59,7 @@ export class ZLinkDealerChannelClientTransport implements ZLinkChannelClientTran
51
59
  return { status: ZLinkSubmitStatus.Submitted };
52
60
  }
53
61
 
54
- async request<TReply>(
62
+ request<TReply>(
55
63
  channelName: string,
56
64
  packetName: string | undefined,
57
65
  request: Message,
@@ -59,42 +67,87 @@ export class ZLinkDealerChannelClientTransport implements ZLinkChannelClientTran
59
67
  signal?: AbortSignal,
60
68
  metadata: ReadonlyMap<string, string> = EMPTY_METADATA,
61
69
  onAdmitted?: () => void
62
- ): Promise<TReply> {
63
- throwIfAborted(signal);
64
- const operation = runWithOutboundFlow(true, () =>
65
- appendParts(
66
- this.dealer.request(),
67
- encodeChannelEnvelopeParts(
68
- ZLinkChannelMessageKind.Request,
69
- channelName,
70
- packetName,
71
- request,
72
- timeoutMs,
73
- undefined,
74
- undefined,
75
- undefined,
76
- true,
77
- metadata
70
+ ): ZLinkRequestResult<TReply> {
71
+ try {
72
+ throwIfAborted(signal);
73
+ } catch (error) {
74
+ return rejectZLinkRequestReply(error);
75
+ }
76
+ const requestOperation = this.requests.begin(timeoutMs, signal);
77
+ try {
78
+ throwIfAborted(signal);
79
+ const operation = runWithOutboundFlow(true, () =>
80
+ appendParts(
81
+ this.dealer.request(),
82
+ encodeChannelEnvelopeParts(
83
+ ZLinkChannelMessageKind.Request,
84
+ channelName,
85
+ packetName,
86
+ request,
87
+ timeoutMs,
88
+ undefined,
89
+ undefined,
90
+ undefined,
91
+ true,
92
+ metadata
93
+ )
78
94
  )
79
- )
80
- );
81
- if (timeoutMs !== undefined) operation.timeout(timeoutMs);
82
- const reply = await submitRequestOperation(
83
- {
84
- submit: () =>
95
+ );
96
+ if (timeoutMs !== undefined) operation.timeout(timeoutMs);
97
+ const decode = (raw: unknown): TReply => {
98
+ const reply = raw as readonly Message[];
99
+ try {
100
+ return decodeChannelReply<TReply>(reply);
101
+ } finally {
102
+ closeReply(reply);
103
+ }
104
+ };
105
+ requestOperation.mapCaller(decode, identityRequestReply);
106
+ if (requestOperation.isPending()) {
107
+ const receiver = {
108
+ operationCompleted: (_id: bigint, raw: unknown) => {
109
+ if (requestOperation.complete(raw)) return;
110
+ try {
111
+ requestOperation.resolveCaller(decode(raw));
112
+ } catch (error) {
113
+ requestOperation.rejectCaller(error);
114
+ }
115
+ },
116
+ operationFailed: (_id: bigint, error: unknown) => {
117
+ let failure = error;
118
+ try {
119
+ failure = mapRequestFailure(error, 'channel request');
120
+ } catch (mapped) {
121
+ failure = mapped;
122
+ }
123
+ requestOperation.fail(failure);
124
+ }
125
+ };
126
+ try {
85
127
  bindingRequestReply(
86
128
  operation.submit(),
87
- timeoutMs === undefined ? undefined : performance.now() + timeoutMs,
129
+ receiver,
130
+ requestOperation,
88
131
  undefined,
89
132
  onAdmitted
90
- )
91
- },
92
- 'channel request'
93
- );
94
- try {
95
- return decodeChannelReply<TReply>(reply);
96
- } finally {
97
- for (const part of reply) part.close();
133
+ );
134
+ } catch (error) {
135
+ receiver.operationFailed(requestOperation.id, error);
136
+ }
137
+ }
138
+ return {
139
+ pending: requestOperation.promise,
140
+ decode: identityRequestReply<TReply>,
141
+ mapFailure: identityRequestReply,
142
+ operation:
143
+ requestOperation as import('../../foundation/operation-registry').PendingOperation<TReply>
144
+ };
145
+ } catch (error) {
146
+ requestOperation.fail(error);
147
+ return prepareZLinkRequestReply(
148
+ requestOperation.promise as Promise<TReply>,
149
+ identityRequestReply
150
+ );
98
151
  }
99
152
  }
100
153
 
@@ -140,3 +193,7 @@ export class ZLinkDealerChannelClientTransport implements ZLinkChannelClientTran
140
193
  return this.tryPublish(channelName, topic, packetName, event, metadata);
141
194
  }
142
195
  }
196
+
197
+ function closeReply(parts: readonly { close(): void }[]): void {
198
+ for (const part of parts) part.close();
199
+ }
@@ -9,13 +9,17 @@ import { zlink } from './node-backend-adapter-support';
9
9
  export class ZLinkNodeEventLoopPoller {
10
10
  private readonly poller = zlink.createPoller();
11
11
  private readonly events = zlink.createPollEvents(1);
12
- private readableHandler: (receiveReady: boolean, routeReady: boolean) => void;
12
+ private readableHandler: (
13
+ receiveReady: boolean,
14
+ routeReady: boolean,
15
+ connectReady: boolean
16
+ ) => void;
13
17
  private disposed = false;
14
18
 
15
19
  constructor(
16
20
  socket: Socket,
17
21
  pollCompletion: boolean,
18
- readableHandler: (receiveReady: boolean, routeReady: boolean) => void,
22
+ readableHandler: (receiveReady: boolean, routeReady: boolean, connectReady: boolean) => void,
19
23
  pollRoute = false
20
24
  ) {
21
25
  this.readableHandler = readableHandler;
@@ -24,7 +28,8 @@ export class ZLinkNodeEventLoopPoller {
24
28
  if (pollCompletion) pollEvents.push(zlink.PollEventFlag.PollCompletion);
25
29
  // A ROUTER selected-route change (Core ROUTER §10.1) wakes the same
26
30
  // handler, whose owner is the socket's one route observer.
27
- if (pollRoute) pollEvents.push(zlink.PollEventFlag.PollRoute);
31
+ if (pollRoute)
32
+ pollEvents.push(zlink.PollEventFlag.PollRoute, zlink.PollEventFlag.PollConnect);
28
33
  this.poller.add(socket as BaseSocket, pollEvents, 0);
29
34
  socket.setReadableHandler(this.onReady);
30
35
  } catch (error) {
@@ -34,7 +39,9 @@ export class ZLinkNodeEventLoopPoller {
34
39
  }
35
40
  }
36
41
 
37
- setReadableHandler(handler: (receiveReady: boolean, routeReady: boolean) => void): void {
42
+ setReadableHandler(
43
+ handler: (receiveReady: boolean, routeReady: boolean, connectReady: boolean) => void
44
+ ): void {
38
45
  this.readableHandler = handler;
39
46
  }
40
47
 
@@ -50,6 +57,8 @@ export class ZLinkNodeEventLoopPoller {
50
57
  const ready = this.poller.wait(this.events, 0);
51
58
  const receiveReady = ready === 0 || this.events.hasEvent(0, zlink.PollEventFlag.PollIn);
52
59
  const routeReady = ready > 0 && this.events.hasEvent(0, zlink.PollEventFlag.PollRoute);
53
- if (receiveReady || routeReady) this.readableHandler(receiveReady, routeReady);
60
+ const connectReady = ready > 0 && this.events.hasEvent(0, zlink.PollEventFlag.PollConnect);
61
+ if (receiveReady || routeReady || connectReady)
62
+ this.readableHandler(receiveReady, routeReady, connectReady);
54
63
  };
55
64
  }
@@ -26,7 +26,11 @@ export class ZLinkNodeMeshBackendAdapter implements ZLinkMeshBackendAdapter {
26
26
  return new ZLinkNodeRawMeshBackend(
27
27
  options.meshName,
28
28
  options.routingId,
29
- new ZLinkNodeRawBindingPort(bindingContext, options.receiveTimeoutMs),
29
+ new ZLinkNodeRawBindingPort(bindingContext, {
30
+ sendHighWaterMark: options.sendHighWaterMark,
31
+ receiveHighWaterMark: options.receiveHighWaterMark,
32
+ receiveTimeoutMs: options.receiveTimeoutMs
33
+ }),
30
34
  options.applicationJobQueue,
31
35
  options.applicationJobReceiveFlowFailureSink,
32
36
  options.peerAdmissionSealed,
@@ -1,3 +1,6 @@
1
+ import { RequestRuntime } from '../../foundation/request-runtime';
2
+ import type { OperationHandle } from '../../foundation/operation-registry';
3
+ import { remainingRequestTimeout } from '../../messaging/request-deadline';
1
4
  import {
2
5
  Message,
3
6
  Received,
@@ -21,7 +24,6 @@ import {
21
24
  } from '@zlink-systems/zlink';
22
25
  import {
23
26
  translateBindingResultError,
24
- bindingRequestReply,
25
27
  submitBindingAsyncSend,
26
28
  submitBindingSend
27
29
  } from './node-backend-adapter-support';
@@ -40,6 +42,13 @@ import type {
40
42
  ZLinkRawRouterRoute,
41
43
  ZLinkRawSocketPort
42
44
  } from '../raw-binding-port';
45
+
46
+ interface ZLinkNodeRawRouterSocketOptions {
47
+ readonly sendHighWaterMark?: number;
48
+ readonly receiveHighWaterMark?: number;
49
+ readonly receiveTimeoutMs?: number;
50
+ }
51
+
43
52
  export type {
44
53
  ZLinkRawBindingPort,
45
54
  ZLinkRawDealerPort,
@@ -55,14 +64,14 @@ export type {
55
64
  export class ZLinkNodeRawBindingPort implements ZLinkRawBindingPort {
56
65
  constructor(
57
66
  private readonly sharedContext?: Context,
58
- private readonly routerReceiveTimeoutMs?: number
67
+ private readonly routerSocketOptions?: ZLinkNodeRawRouterSocketOptions
59
68
  ) {}
60
69
 
61
70
  createHost(): ZLinkRawHostPort {
62
71
  return new NodeRawHostPort(
63
72
  this.sharedContext ?? createContext(),
64
73
  this.sharedContext === undefined,
65
- this.routerReceiveTimeoutMs
74
+ this.routerSocketOptions
66
75
  );
67
76
  }
68
77
  }
@@ -74,13 +83,13 @@ class NodeRawHostPort implements ZLinkRawHostPort {
74
83
  constructor(
75
84
  private readonly context: Context,
76
85
  private readonly ownsContext: boolean,
77
- private readonly routerReceiveTimeoutMs?: number
86
+ private readonly routerSocketOptions?: ZLinkNodeRawRouterSocketOptions
78
87
  ) {}
79
88
 
80
89
  createRouter(): ZLinkRawRouterPort {
81
90
  this.requireOpen();
82
91
  return this.own(
83
- new NodeRawRouterPort(createRouterSocket(this.context), this.routerReceiveTimeoutMs)
92
+ new NodeRawRouterPort(createRouterSocket(this.context), this.routerSocketOptions)
84
93
  );
85
94
  }
86
95
 
@@ -133,6 +142,8 @@ class NodeRawHostPort implements ZLinkRawHostPort {
133
142
  }
134
143
 
135
144
  abstract class NodeRawSocketPort<TSocket extends Socket> implements ZLinkRawSocketPort {
145
+ protected readonly requests = new RequestRuntime();
146
+ protected readonly received = new Received();
136
147
  private readonly endpoints = new Set<string>();
137
148
  private readonly monitors = new Set<NodeRawMonitorPort>();
138
149
  private readonly eventLoopPoller: ZLinkNodeEventLoopPoller;
@@ -145,7 +156,9 @@ abstract class NodeRawSocketPort<TSocket extends Socket> implements ZLinkRawSock
145
156
  this.eventLoopPoller = new ZLinkNodeEventLoopPoller(socket, true, () => {}, pollRoute);
146
157
  }
147
158
 
148
- setReadableHandler(handler: (receiveReady: boolean, routeReady: boolean) => void): void {
159
+ setReadableHandler(
160
+ handler: (receiveReady: boolean, routeReady: boolean, connectReady: boolean) => void
161
+ ): void {
149
162
  this.requireOpen();
150
163
  this.eventLoopPoller.setReadableHandler(handler);
151
164
  }
@@ -183,6 +196,7 @@ abstract class NodeRawSocketPort<TSocket extends Socket> implements ZLinkRawSock
183
196
  }
184
197
 
185
198
  close(): void {
199
+ this.requests.close();
186
200
  if (this.closed) return;
187
201
  const failures: unknown[] = [];
188
202
  try {
@@ -214,6 +228,7 @@ abstract class NodeRawSocketPort<TSocket extends Socket> implements ZLinkRawSock
214
228
  }
215
229
  this.endpoints.clear();
216
230
  try {
231
+ this.received.close();
217
232
  this.socket.close();
218
233
  } catch (error) {
219
234
  throw new AggregateError([error], 'Raw socket cleanup failed.');
@@ -238,7 +253,7 @@ class NodeRawRouterPort extends NodeRawSocketPort<RouterSocket> implements ZLink
238
253
  private readonly replyParts = (
239
254
  targetRid: BindingRoutingId,
240
255
  replyToken: ReplyToken,
241
- parts: readonly Uint8Array[]
256
+ parts: readonly (Uint8Array | string)[]
242
257
  ) => {
243
258
  // The receive record keeps the binding RoutingId it was delivered with,
244
259
  // so the reply addresses that route without rebuilding the identity.
@@ -273,13 +288,19 @@ class NodeRawRouterPort extends NodeRawSocketPort<RouterSocket> implements ZLink
273
288
  disconnectSocketPeer(this.socket, this.preparedRoutingId(routingId));
274
289
  }
275
290
 
276
- constructor(socket: RouterSocket, receiveTimeoutMs?: number) {
291
+ constructor(socket: RouterSocket, options?: ZLinkNodeRawRouterSocketOptions) {
277
292
  super(socket, true);
278
293
  socket.options.handover = true;
279
294
  socket.options.mandatory = true;
280
295
  socket.options.probe = true;
281
- if (receiveTimeoutMs !== undefined) {
282
- socket.options.recvTimeout = receiveTimeoutMs;
296
+ if (options?.sendHighWaterMark !== undefined) {
297
+ socket.options.sendHwm = BigInt(options.sendHighWaterMark);
298
+ }
299
+ if (options?.receiveHighWaterMark !== undefined) {
300
+ socket.options.recvHwm = BigInt(options.receiveHighWaterMark);
301
+ }
302
+ if (options?.receiveTimeoutMs !== undefined) {
303
+ socket.options.recvTimeout = options.receiveTimeoutMs;
283
304
  }
284
305
  }
285
306
 
@@ -311,24 +332,55 @@ class NodeRawRouterPort extends NodeRawSocketPort<RouterSocket> implements ZLink
311
332
  return submitBindingSend(this.socket.send(this.preparedRoutingId(targetRid)), parts);
312
333
  }
313
334
 
314
- request(
335
+ request<T>(
315
336
  targetRid: string,
316
337
  parts: readonly Uint8Array[],
317
338
  timeoutMs: number,
339
+ onReply: (parts: readonly Buffer[]) => T,
340
+ onFailed: (error: unknown) => T,
318
341
  recordReceived?: () => void,
319
- onAdmitted?: () => void
320
- ): Promise<readonly Buffer[]> {
321
- let submission: ReturnType<RequestSubmitOperation['submit']>;
322
- const deadlineMs = performance.now() + timeoutMs;
323
- try {
342
+ onAdmitted?: () => void,
343
+ existing?: Pick<OperationHandle<unknown>, 'id' | 'deadlineMs'>
344
+ ): Promise<T> {
345
+ if (existing !== undefined) {
324
346
  this.requireOpen();
325
- submission = appendRequestParts(this.socket.request(this.preparedRoutingId(targetRid)), parts)
326
- .timeout(timeoutMs)
327
- .submit();
328
- } catch (error) {
329
- return Promise.reject(translateBindingResultError(error, 'submit'));
347
+ const submission = submitRawRequest(
348
+ appendRequestParts(this.socket.request(this.preparedRoutingId(targetRid)), parts).timeout(
349
+ remainingRequestTimeout('Request', existing.deadlineMs) ?? timeoutMs
350
+ )
351
+ );
352
+ return requestReply(submission, 0, onReply, onFailed, recordReceived, onAdmitted);
330
353
  }
331
- return requestReply(submission, deadlineMs, recordReceived, onAdmitted);
354
+ return this.requests.observe<readonly Buffer[], T>(
355
+ timeoutMs,
356
+ (entry, receiver) => {
357
+ this.requireOpen();
358
+ const submission = submitRawRequest(
359
+ appendRequestParts(this.socket.request(this.preparedRoutingId(targetRid)), parts).timeout(
360
+ remainingRequestTimeout('Request', entry.deadlineMs) ?? timeoutMs
361
+ )
362
+ );
363
+ void requestReply(
364
+ submission,
365
+ 0,
366
+ (value) => {
367
+ receiver.operationCompleted(entry.id, value, undefined);
368
+ },
369
+ (error) => {
370
+ receiver.operationFailed(entry.id, error, undefined);
371
+ },
372
+ recordReceived,
373
+ onAdmitted
374
+ );
375
+ },
376
+ onReply,
377
+ onFailed
378
+ );
379
+ }
380
+
381
+ connectionAttemptsSnapshot() {
382
+ this.requireOpen();
383
+ return this.socket.connectionAttemptsSnapshot();
332
384
  }
333
385
 
334
386
  routesSnapshot(): readonly ZLinkRawRouterRoute[] {
@@ -341,7 +393,13 @@ class NodeRawRouterPort extends NodeRawSocketPort<RouterSocket> implements ZLink
341
393
 
342
394
  receive(dontWait = false): ZLinkRawReceivedRecord | undefined {
343
395
  this.requireOpen();
344
- return receiveRecord(this.socket, dontWait, this.nextRequestSequence, this.replyParts);
396
+ return receiveRecord(
397
+ this.socket,
398
+ this.received,
399
+ dontWait,
400
+ this.nextRequestSequence,
401
+ this.replyParts
402
+ );
345
403
  }
346
404
  }
347
405
 
@@ -366,20 +424,36 @@ class NodeRawDealerPort extends NodeRawSocketPort<DealerSocket> implements ZLink
366
424
  timeoutMs: number,
367
425
  onAdmitted?: () => void
368
426
  ): Promise<readonly Buffer[]> {
369
- let submission: ReturnType<RequestSubmitOperation['submit']>;
370
- const deadlineMs = performance.now() + timeoutMs;
371
- try {
372
- this.requireOpen();
373
- submission = appendRequestParts(this.socket.request(), parts).timeout(timeoutMs).submit();
374
- } catch (error) {
375
- return Promise.reject(translateBindingResultError(error, 'submit'));
376
- }
377
- return requestReply(submission, deadlineMs, undefined, onAdmitted);
427
+ return this.requests.observe<readonly Buffer[]>(
428
+ timeoutMs,
429
+ (entry, receiver) => {
430
+ this.requireOpen();
431
+ const submission = submitRawRequest(
432
+ appendRequestParts(this.socket.request(), parts).timeout(
433
+ remainingRequestTimeout('Request', entry.deadlineMs) ?? timeoutMs
434
+ )
435
+ );
436
+ void requestReply(
437
+ submission,
438
+ 0,
439
+ (value) => {
440
+ receiver.operationCompleted(entry.id, value, undefined);
441
+ },
442
+ (error) => {
443
+ receiver.operationFailed(entry.id, error, undefined);
444
+ },
445
+ undefined,
446
+ onAdmitted
447
+ );
448
+ },
449
+ (value) => value,
450
+ rethrowCompletion
451
+ );
378
452
  }
379
453
 
380
454
  receive(dontWait = false): ZLinkRawReceivedRecord | undefined {
381
455
  this.requireOpen();
382
- return receiveRecord(this.socket, dontWait);
456
+ return receiveRecord(this.socket, this.received, dontWait);
383
457
  }
384
458
  }
385
459
 
@@ -429,7 +503,7 @@ function appendRequestParts(
429
503
 
430
504
  function appendReplyParts(
431
505
  operation: ReplyOperation,
432
- parts: readonly Uint8Array[]
506
+ parts: readonly (Uint8Array | string)[]
433
507
  ): ReplySubmitOperation {
434
508
  requireParts(parts);
435
509
  let next = operation.message(parts[0]);
@@ -439,36 +513,35 @@ function appendReplyParts(
439
513
  return next;
440
514
  }
441
515
 
442
- function requireParts(parts: readonly Uint8Array[]): [Uint8Array, ...Uint8Array[]] {
516
+ function requireParts<T extends Uint8Array | string>(parts: readonly T[]): [T, ...T[]] {
443
517
  if (parts.length === 0)
444
518
  throw new TypeError('Raw multipart operation requires at least one part.');
445
- return parts as [Uint8Array, ...Uint8Array[]];
519
+ return parts as [T, ...T[]];
446
520
  }
447
521
 
448
522
  type RawReceivedReply = (
449
523
  targetRid: BindingRoutingId,
450
524
  replyToken: ReplyToken,
451
- parts: readonly Uint8Array[]
525
+ parts: readonly (Uint8Array | string)[]
452
526
  ) => void;
453
527
 
454
528
  const EMPTY_SOURCE_ROUTE = Buffer.alloc(0);
455
529
 
456
530
  /**
457
531
  * One received binding record. The payload Buffers are the binding's own
458
- * `data()` storage, retained under the runtime payload policy instead of a
459
- * second Framework copy; closing the record releases the binding handles.
532
+ * `data()` storage, retained under the runtime payload policy. The socket owns
533
+ * the reusable binding envelope; snapshots survive its next receive or close.
460
534
  */
461
535
  class NodeRawReceivedRecord implements ZLinkRawReceivedRecord {
462
536
  readonly sourceRid: string;
463
537
  readonly sourceRoute: Uint8Array;
464
538
  readonly routeGeneration: bigint;
465
539
  readonly requestSeq?: bigint;
466
- readonly reply?: (parts: readonly Uint8Array[]) => void;
540
+ readonly reply?: (parts: readonly (Uint8Array | string)[]) => void;
467
541
  readonly parts: readonly Buffer[];
468
- private closed = false;
469
542
 
470
543
  constructor(
471
- private readonly received: Received,
544
+ received: Received,
472
545
  nextRequestSequence: (() => bigint) | undefined,
473
546
  reply: RawReceivedReply | undefined
474
547
  ) {
@@ -495,21 +568,20 @@ class NodeRawReceivedRecord implements ZLinkRawReceivedRecord {
495
568
  }
496
569
 
497
570
  close(): void {
498
- if (this.closed) return;
499
- this.closed = true;
500
- this.received.close();
571
+ // Reading each binding payload above retained JS-owned storage and released
572
+ // its native frame. The socket clears its reusable envelope; these record
573
+ // snapshots need no native cleanup.
501
574
  }
502
575
  }
503
576
 
504
577
  function receiveRecord(
505
578
  socket: Pick<RouterSocket | DealerSocket, 'recv'>,
579
+ received: Received,
506
580
  dontWait: boolean,
507
581
  nextRequestSequence?: () => bigint,
508
582
  reply?: RawReceivedReply
509
583
  ): ZLinkRawReceivedRecord | undefined {
510
- const received = new Received();
511
584
  if (!socket.recv(received, dontWait ? RecvFlags.DontWait : RecvFlags.None)) {
512
- received.close();
513
585
  return undefined;
514
586
  }
515
587
  try {
@@ -525,42 +597,71 @@ function receiveRecord(
525
597
  * confirmed in this turn; a backpressured submission keeps the admission
526
598
  * wait that bounds it by the request deadline.
527
599
  */
528
- function requestReply(
600
+ function requestReply<T>(
529
601
  submission: ReturnType<RequestSubmitOperation['submit']>,
530
- deadlineMs: number,
602
+ _deadlineMs: number,
603
+ onReply: (parts: readonly Buffer[]) => T,
604
+ onFailed: (error: unknown) => T,
531
605
  recordReceived: (() => void) | undefined,
532
606
  onAdmitted: (() => void) | undefined
533
- ): Promise<readonly Buffer[]> {
607
+ ): Promise<T> {
608
+ const result = observeRequestReply(submission.reply, onReply, onFailed, recordReceived);
534
609
  if (submission.result === SubmitResult.Backpressured) {
535
- return bindingRequestReply(submission, deadlineMs, recordReceived, onAdmitted).then(
536
- retainAndClose,
537
- rejectCompletion
610
+ void submission.admitted.then(
611
+ () => {
612
+ try {
613
+ onAdmitted?.();
614
+ } catch (error) {
615
+ onFailed(translateBindingResultError(error, 'completion'));
616
+ }
617
+ },
618
+ (error) => onFailed(translateBindingResultError(error, 'completion'))
538
619
  );
539
- }
540
- try {
541
- onAdmitted?.();
542
- } catch (error) {
543
- return Promise.reject(translateBindingResultError(error, 'completion'));
544
- }
545
- return submission.reply.then((replies) => {
620
+ } else {
546
621
  try {
547
- recordReceived?.();
548
- return retainAndClose(replies);
622
+ onAdmitted?.();
549
623
  } catch (error) {
550
- throw translateBindingResultError(error, 'completion');
624
+ onFailed(translateBindingResultError(error, 'completion'));
551
625
  }
552
- }, rejectCompletion);
626
+ }
627
+ return result;
553
628
  }
554
629
 
555
- function rejectCompletion(error: unknown): never {
556
- throw translateBindingResultError(error, 'completion');
630
+ /** Consumes the binding reply and notifies its terminal in this continuation. */
631
+ function observeRequestReply<T>(
632
+ reply: Promise<readonly Message[]>,
633
+ onReply: (parts: readonly Buffer[]) => T,
634
+ onFailed: (error: unknown) => T,
635
+ recordReceived?: () => void
636
+ ): Promise<T> {
637
+ return reply.then(
638
+ (replies) => {
639
+ try {
640
+ return onReply(retainAndClose(replies, recordReceived));
641
+ } catch (error) {
642
+ return onFailed(translateBindingResultError(error, 'completion'));
643
+ }
644
+ },
645
+ (error) => onFailed(translateBindingResultError(error, 'completion'))
646
+ );
647
+ }
648
+
649
+ function rethrowCompletion(error: unknown): never {
650
+ throw error;
557
651
  }
558
652
 
559
- function retainAndClose(messages: readonly Message[]): readonly Buffer[] {
653
+ function retainAndClose(
654
+ messages: readonly Message[],
655
+ recordReceived?: () => void
656
+ ): readonly Buffer[] {
560
657
  try {
561
- return messages.map((message) => ZLinkBufferMessage.retainPayload(message));
658
+ recordReceived?.();
659
+ const retained = new Array<Buffer>(messages.length);
660
+ for (let index = 0; index < messages.length; index++)
661
+ retained[index] = ZLinkBufferMessage.retainPayload(messages[index]!);
662
+ return retained;
562
663
  } finally {
563
- for (const message of messages) message.close();
664
+ for (let index = 0; index < messages.length; index++) messages[index]!.close();
564
665
  }
565
666
  }
566
667
 
@@ -593,3 +694,13 @@ function copyMonitorEvent(event: MonitorEvent): ZLinkRawMonitorRecord {
593
694
  flags: event.flags
594
695
  };
595
696
  }
697
+
698
+ function submitRawRequest(
699
+ operation: RequestSubmitOperation
700
+ ): ReturnType<RequestSubmitOperation['submit']> {
701
+ try {
702
+ return operation.submit();
703
+ } catch (error) {
704
+ throw translateBindingResultError(error, 'submit');
705
+ }
706
+ }