@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,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DefaultZLinkActorClient = void 0;
4
+ const request_runtime_1 = require("../foundation/request-runtime");
4
5
  const node_buffer_1 = require("node:buffer");
5
6
  const channel_envelope_1 = require("../channels/channel-envelope");
6
7
  const routing_id_1 = require("../routing-id");
@@ -23,11 +24,12 @@ const protocol_1 = require("../streams/protocol");
23
24
  const actor_execution_context_1 = require("./actor-execution-context");
24
25
  const actor_message_follow_context_1 = require("./actor-message-follow-context");
25
26
  const actor_packet_relay_wire_1 = require("./actor-packet-relay-wire");
26
- const actor_routed_json_request_1 = require("./actor-routed-json-request");
27
27
  class DefaultZLinkActorClient {
28
28
  options;
29
+ requests;
29
30
  constructor(options) {
30
31
  this.options = options;
32
+ this.requests = options.requests ?? new request_runtime_1.RequestRuntime();
31
33
  }
32
34
  sendToActor(actorId, message) {
33
35
  requireActorId(actorId);
@@ -40,11 +42,13 @@ class DefaultZLinkActorClient {
40
42
  async send(actorId, explicitPacketName, message, metadata) {
41
43
  const route = await this.resolveActorRoute(actorId);
42
44
  const { meshName, actorRef: actor } = route;
43
- this.throwIfKnownStale(meshName, actor);
45
+ this.throwIfKnownStale(route);
44
46
  const parts = this.createPacketParts(protocol_1.ZLinkStreamMessageKind.Send, undefined, explicitPacketName, message, metadata);
45
- const messageFollow = createActorMessageFollowContext(route, parts, false);
46
- const routedActor = (0, actor_message_follow_context_1.attachActorMessageFollowContext)(actor, messageFollow);
47
+ let routeFence;
47
48
  try {
49
+ const messageFollow = createActorMessageFollowContext(route, parts, false);
50
+ routeFence = actorRouteInvalidationFence(route);
51
+ const routedActor = (0, actor_message_follow_context_1.attachActorMessageFollowContext)(actor, messageFollow);
48
52
  const submissionCopies = (await this.options.transportDeliveryGate?.()?.waitBeforeSubmit(actorId, 'oneWay')) ?? 1;
49
53
  const handoff = this.options.handoffCapture?.(meshName, actor.actorId, parts, false, routedActor);
50
54
  if (handoff !== undefined) {
@@ -74,75 +78,76 @@ class DefaultZLinkActorClient {
74
78
  return await this.submitActorSend(meshName, toBackendActorRef(actor), parts, route);
75
79
  }
76
80
  catch (error) {
77
- if (isStaleActorError(error)) {
78
- this.invalidateActorRoute(actorId);
79
- this.options.staleActorRefReporter?.(meshName, actor.actorId);
80
- throw actorLocationStale(actor.actorId, error);
81
- }
82
- throw error;
81
+ throw this.mapActorFailure(actorId, error, routeFence, meshName);
83
82
  }
84
83
  finally {
85
84
  closeMessages(parts);
86
85
  }
87
86
  }
88
- async request(actorId, explicitPacketName, request, timeoutMs, metadata, signal, waitPolicy = 'async', onAdmitted) {
87
+ request(actorId, explicitPacketName, request, timeoutMs, metadata, signal, waitPolicy = 'async', onAdmitted) {
89
88
  (0, abort_1.throwIfAborted)(signal);
90
89
  const sourceSpotId = (0, actor_execution_context_1.currentZLinkActorExecution)()?.spotId ?? (0, execution_1.currentZLinkSpotSerialSourceId)();
91
90
  const effectiveTimeoutMs = timeoutMs ?? this.options.defaultRequestTimeoutMs;
92
- const deadlineMs = effectiveTimeoutMs === undefined ? undefined : performance.now() + effectiveTimeoutMs;
93
- const deadlineUnixMs = effectiveTimeoutMs === undefined ? undefined : Date.now() + effectiveTimeoutMs;
94
- const route = await this.resolveActorRoute(actorId, signal, deadlineMs);
95
- if (waitPolicy === 'async' &&
96
- sourceSpotId !== undefined &&
97
- sameSpotRoute(sourceSpotId, route)) {
98
- throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.InvalidOperation, `An Actor request cannot await Actor '${actorId}' on the current Spot while holding its execution claim.`);
99
- }
100
- const { meshName, actorRef: actor } = route;
101
- this.throwIfKnownStale(meshName, actor);
102
- const operationId = (0, actor_message_follow_context_1.createMessageFollowId)();
103
- const correlationId = (0, actor_message_follow_context_1.createMessageFollowId)();
104
- const requestSequence = BigInt(`0x${operationId.slice(16)}`);
105
- const parts = this.createPacketParts(protocol_1.ZLinkStreamMessageKind.Request, requestSequence === 0n ? 1n : requestSequence, explicitPacketName, request, mergeActorRequestMetadata(metadata, deadlineUnixMs), correlationId);
106
- const messageFollow = createActorMessageFollowContext(route, parts, true, deadlineUnixMs, correlationId, operationId);
107
- const routedActor = (0, actor_message_follow_context_1.attachActorMessageFollowContext)(actor, messageFollow);
108
- try {
109
- const delivery = this.options
110
- .transportDeliveryGate?.()
111
- ?.waitBeforeSubmit(actorId, 'request', signal);
112
- const submissionCopies = delivery === undefined
113
- ? 1
114
- : ((await (0, actor_request_deadline_1.waitActorReply)(delivery, actorId, deadlineMs, signal)) ?? 1);
115
- const handoff = this.options.handoffCapture?.(meshName, actor.actorId, parts, true, routedActor, deadlineUnixMs, onAdmitted);
116
- if (handoff !== undefined) {
117
- const submissions = [handoff];
118
- for (let copy = 1; copy < submissionCopies; copy++) {
119
- const duplicate = this.options.handoffCapture?.(meshName, actor.actorId, parts, true, routedActor, deadlineUnixMs, onAdmitted);
120
- if (duplicate !== undefined)
121
- submissions.push(duplicate);
91
+ let meshName;
92
+ let routeFence;
93
+ return this.requests.prepare(effectiveTimeoutMs, signal, (requestOperation, receiver) => {
94
+ void (async () => {
95
+ const deadlineMs = requestOperation.deadlineMs;
96
+ const deadlineUnixMs = effectiveTimeoutMs === undefined ? undefined : Date.now() + effectiveTimeoutMs;
97
+ const route = await this.resolveActorRoute(actorId, signal, deadlineMs, requestOperation);
98
+ if (!requestOperation.isPending())
99
+ return;
100
+ if (waitPolicy === 'async' &&
101
+ sourceSpotId !== undefined &&
102
+ sameSpotRoute(sourceSpotId, route)) {
103
+ throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.InvalidOperation, `An Actor request cannot await Actor '${actorId}' on the current Spot while holding its execution claim.`);
122
104
  }
123
- const replies = await (0, actor_request_deadline_1.waitActorReply)(Promise.all(submissions), actorId, deadlineMs, signal);
124
- return replies[0];
125
- }
126
- return await this.submitActorRequest(meshName, toBackendActorRef(actor), parts, (0, actor_request_deadline_1.remainingActorRequestTimeout)(actorId, deadlineMs), signal, route, messageFollow, onAdmitted);
127
- }
128
- catch (error) {
129
- if (isStaleActorError(error)) {
130
- this.invalidateActorRoute(actorId);
131
- this.options.staleActorRefReporter?.(meshName, actor.actorId);
132
- throw actorLocationStale(actor.actorId, error);
133
- }
134
- throw error;
135
- }
136
- finally {
137
- closeMessages(parts);
138
- }
105
+ const { actorRef: actor } = route;
106
+ meshName = route.meshName;
107
+ if (this.options.staleActorRefPredicate?.(meshName, actor) === true) {
108
+ routeFence = actorRouteInvalidationFence(route);
109
+ throw actorLocationStale(actor.actorId, undefined);
110
+ }
111
+ const operationId = (0, actor_message_follow_context_1.createMessageFollowId)();
112
+ const correlationId = (0, actor_message_follow_context_1.createMessageFollowId)();
113
+ const requestSequence = BigInt(`0x${operationId.slice(16)}`);
114
+ const parts = this.createPacketParts(protocol_1.ZLinkStreamMessageKind.Request, requestSequence === 0n ? 1n : requestSequence, explicitPacketName, request, mergeActorRequestMetadata(metadata, deadlineUnixMs), correlationId);
115
+ try {
116
+ const messageFollow = createActorMessageFollowContext(route, parts, true, deadlineUnixMs, correlationId, operationId);
117
+ routeFence = actorRouteInvalidationFence(route);
118
+ const routedActor = (0, actor_message_follow_context_1.attachActorMessageFollowContext)(actor, messageFollow);
119
+ const delivery = this.options
120
+ .transportDeliveryGate?.()
121
+ ?.waitBeforeSubmit(actorId, 'request', signal);
122
+ const submissionCopies = delivery === undefined
123
+ ? 1
124
+ : ((await (0, actor_request_deadline_1.waitActorReply)(delivery, actorId, requestOperation)) ?? 1);
125
+ const handoff = this.options.handoffCapture?.(meshName, actor.actorId, parts, true, routedActor, deadlineUnixMs, onAdmitted, requestOperation);
126
+ if (handoff !== undefined) {
127
+ const submissions = [handoff];
128
+ for (let copy = 1; copy < submissionCopies; copy++) {
129
+ const duplicate = this.options.handoffCapture?.(meshName, actor.actorId, parts, true, routedActor, deadlineUnixMs, onAdmitted, requestOperation);
130
+ if (duplicate !== undefined)
131
+ submissions.push(duplicate);
132
+ }
133
+ const replies = await Promise.all(submissions);
134
+ receiver.operationCompleted(requestOperation.id, replies[0], undefined);
135
+ return;
136
+ }
137
+ this.submitActorRequest(meshName, toBackendActorRef(actor), parts, (0, actor_request_deadline_1.remainingActorRequestTimeout)(actorId, deadlineMs), signal, route, messageFollow, onAdmitted, requestOperation, receiver);
138
+ }
139
+ finally {
140
+ closeMessages(parts);
141
+ }
142
+ })().catch((error) => receiver.operationFailed(requestOperation.id, error, undefined));
143
+ }, (value) => value, (error) => this.mapActorFailure(actorId, error, routeFence, meshName));
139
144
  }
140
- async resolveActorRoute(actorId, signal, deadlineMs) {
145
+ async resolveActorRoute(actorId, signal, deadlineMs, requestOperation) {
141
146
  const resolver = this.options.locationResolver();
142
147
  if (resolver === undefined) {
143
148
  throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.InvalidConfiguration, 'Actor direct messaging requires a Location Store.');
144
149
  }
145
- const resolution = await resolver.resolveDirectActorRoute(actorId, signal, deadlineMs);
150
+ const resolution = await resolver.resolveDirectActorRoute(actorId, signal, deadlineMs, requestOperation);
146
151
  if (resolution.kind === 'missing') {
147
152
  throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorRouteNotFound, `Actor route '${actorId}' was not found.`);
148
153
  }
@@ -151,15 +156,21 @@ class DefaultZLinkActorClient {
151
156
  }
152
157
  return resolution.route;
153
158
  }
154
- invalidateActorRoute(actorId) {
155
- this.options.locationResolver()?.invalidateActorRoute(actorId);
159
+ mapActorFailure(actorId, error, routeFence, meshName) {
160
+ if (!isStaleActorError(error))
161
+ return error;
162
+ const resolver = this.options.locationResolver();
163
+ if (routeFence !== undefined && resolver !== undefined)
164
+ resolver.invalidateActorRouteIfMatches(routeFence);
165
+ if (meshName !== undefined)
166
+ this.options.staleActorRefReporter?.(meshName, actorId);
167
+ return actorLocationStale(actorId, error);
156
168
  }
157
- throwIfKnownStale(meshName, actor) {
169
+ throwIfKnownStale(route) {
170
+ const { meshName, actorRef: actor } = route;
158
171
  if (this.options.staleActorRefPredicate?.(meshName, actor) !== true)
159
172
  return;
160
- this.invalidateActorRoute(actor.actorId);
161
- this.options.staleActorRefReporter?.(meshName, actor.actorId);
162
- throw actorLocationStale(actor.actorId, undefined);
173
+ throw this.mapActorFailure(actor.actorId, actorLocationStale(actor.actorId, undefined), actorRouteInvalidationFence(route), meshName);
163
174
  }
164
175
  createPacketParts(kind, requestSeq, explicitPacketName, message, metadata, correlationId) {
165
176
  const packetName = (0, packet_name_1.resolveFrameworkPacketName)(message, explicitPacketName, 'Actor');
@@ -208,7 +219,7 @@ class DefaultZLinkActorClient {
208
219
  throw mapSubmitError(error, 'Actor send');
209
220
  }
210
221
  }
211
- async submitActorRequest(meshName, actor, parts, timeoutMs, signal, route, messageFollowContext, onAdmitted) {
222
+ submitActorRequest(meshName, actor, parts, timeoutMs, signal, route, messageFollowContext, onAdmitted, requestOperation, destination) {
212
223
  const node = this.requireNode(meshName);
213
224
  if (this.options.routeTransport !== undefined &&
214
225
  !(0, routing_id_1.routingIdsEqual)(node.status().routingId, actor.nodeRid)) {
@@ -231,29 +242,46 @@ class DefaultZLinkActorClient {
231
242
  returnResponse: true,
232
243
  messageFollowContext
233
244
  });
234
- const reply = await (0, actor_routed_json_request_1.requestRoutedJsonReply)(this.options.routeTransport, remoteActorRouteTarget(route), relay, { timeoutMs, signal, onAdmitted }, `Remote Actor request is not available for '${actor.actorId}'.`, (replyParts) => JSON.parse(replyParts[0]?.getString('utf8') ?? '{}'));
235
- if (reply.ok !== true) {
236
- throw (0, framework_errors_internal_1.createInternalFrameworkException)(remoteRelayErrorKind(reply.errorKind), typeof reply.error === 'string'
237
- ? reply.error
238
- : `Remote Actor request failed for '${actor.actorId}'.`);
239
- }
240
- return reply.response;
245
+ this.options.routeTransport.requestToSpot(remoteActorRouteTarget(route), relay, {
246
+ packetName: actor_packet_relay_wire_1.ZLINK_REMOTE_ACTOR_PACKET_RELAY_PACKET,
247
+ timeoutMs,
248
+ signal,
249
+ onAdmitted,
250
+ requestOperation
251
+ }, {
252
+ operationCompleted: (id, value) => {
253
+ const reply = value;
254
+ if (reply.ok !== true) {
255
+ destination.operationFailed(id, (0, framework_errors_internal_1.createInternalFrameworkException)(remoteRelayErrorKind(reply.errorKind), typeof reply.error === 'string'
256
+ ? reply.error
257
+ : `Remote Actor request failed for '${actor.actorId}'.`), undefined);
258
+ return;
259
+ }
260
+ destination.operationCompleted(id, reply.response, undefined);
261
+ },
262
+ operationFailed: (id, error) => destination.operationFailed(id, error, undefined)
263
+ });
264
+ return;
241
265
  }
242
266
  const completions = this.options.completionTableProvider(meshName);
243
267
  if (completions === undefined) {
244
268
  throw routeNotConnected('Actor request requires a running MeshNode completion table.');
245
269
  }
246
- const completion = await completions.submit(() => node.requestToActor(actor, toMessageLikeParts(parts), {
270
+ const packetName = (0, protocol_1.decodeStreamHeader)(parts[0].data()).name;
271
+ this.requests.run(requestOperation, (receiver) => completions.submit((completion) => node.requestToActor(actor, toMessageLikeParts(parts), {
247
272
  flags: runtime_values_1.ZLINK_BACKEND_SEND_NONE,
248
273
  routeFence: nativeActorRouteFence(route, actor),
249
274
  timeoutMs,
250
- onAdmitted
251
- }), signal);
252
- if (completion.terminalResult !== runtime_values_1.RequestResult.Ok) {
253
- (0, backend_1.closeMeshCompletion)(completion);
254
- throw mapRequestResult(completion.terminalResult, completion.failureErrno, 'Actor request');
255
- }
256
- return decodeActorReply(completion.parts, this.options.messageSerializers, (0, protocol_1.decodeStreamHeader)(parts[0].data()).name);
275
+ onAdmitted,
276
+ requestOperation
277
+ }, completion), signal, requestOperation, receiver), (raw) => {
278
+ const completion = raw;
279
+ if (completion.terminalResult !== runtime_values_1.RequestResult.Ok) {
280
+ (0, backend_1.closeMeshCompletion)(completion);
281
+ throw mapRequestResult(completion.terminalResult, completion.failureErrno, 'Actor request');
282
+ }
283
+ return decodeActorReply(completion.parts, this.options.messageSerializers, packetName);
284
+ }, request_result_1.identityRequestReply, destination);
257
285
  }
258
286
  requireNode(meshName) {
259
287
  const node = this.options.nodeProvider(meshName);
@@ -272,6 +300,16 @@ function nativeActorRouteFence(route, actor) {
272
300
  ownerLeaseGeneration: route.ownerLeaseGeneration
273
301
  };
274
302
  }
303
+ function actorRouteInvalidationFence(route) {
304
+ return {
305
+ actorId: route.actorRef.actorId,
306
+ objectGeneration: route.actorRef.objectGeneration,
307
+ targetNodeRid: route.actorRef.nodeRid,
308
+ targetNodeGeneration: route.ownerNodeGeneration,
309
+ authorityOwnerGeneration: route.authorityOwnerGeneration,
310
+ ownerLeaseGeneration: route.ownerLeaseGeneration
311
+ };
312
+ }
275
313
  function remoteActorRouteTarget(route) {
276
314
  if (route.enclosingSpotRoute !== undefined) {
277
315
  return route.enclosingSpotRoute;
@@ -403,7 +441,7 @@ class DefaultZLinkActorRequestCall {
403
441
  yield(signal) {
404
442
  this.rejectSelfActorRequest();
405
443
  const turn = (0, execution_1.requireZLinkYieldTurn)(this.turn);
406
- const pending = this.execute('yield', signal);
444
+ const pending = (0, request_result_1.mapZLinkRequestReply)(this.execute('yield', signal));
407
445
  return turn.yieldFrameworkPromise(pending);
408
446
  }
409
447
  execute(waitPolicy, signal, onAdmitted) {
@@ -85,7 +85,18 @@ class DefaultZLinkActorContext {
85
85
  async [exports.ZLINK_ACTOR_JOIN_ENTRY_SPOT_RUNTIME](nodeRid, request, signal) {
86
86
  const requestMessage = encodeJoinRequest(request, this.messageSerializers);
87
87
  try {
88
- return (await this.requireJoinCoordinator().joinEntrySpot(this.requireActor(), this.state, nodeRid, requestMessage, undefined, signal)).accepted;
88
+ const result = await this.requireJoinCoordinator().joinEntrySpot(this.requireActor(), this.state, nodeRid, requestMessage, undefined, signal);
89
+ try {
90
+ if (result.sourceCleanup !== undefined) {
91
+ await result.sourceCleanup();
92
+ return result.accepted;
93
+ }
94
+ }
95
+ finally {
96
+ result.reply?.close();
97
+ }
98
+ await result.finalizeDeferredJoin?.();
99
+ return result.accepted;
89
100
  }
90
101
  finally {
91
102
  requestMessage.close();
@@ -172,7 +183,7 @@ class DefaultZLinkActorJoinSpotCall {
172
183
  // handler terminal. Target admission starts before reply encoding,
173
184
  // while completion and finalization remain in execute().
174
185
  this.coordinator.beginDeferredJoin?.(this.actor, this.state);
175
- pendingJoin = this.coordinator.joinSpot(this.actor, this.state, this.spotId, requestMessage, remainingJoinTimeout(deadline.atMs), deadline.signal, operationId);
186
+ pendingJoin = this.coordinator.joinSpot(this.actor, this.state, this.spotId, requestMessage, remainingJoinTimeout(deadline.atMs), deadline.signal, operationId, deadline.atMs);
176
187
  if (this.turn === undefined) {
177
188
  await pendingJoin.catch(() => undefined);
178
189
  }
@@ -187,7 +198,7 @@ class DefaultZLinkActorJoinSpotCall {
187
198
  let result;
188
199
  try {
189
200
  const pending = pendingJoin ??
190
- this.coordinator.joinSpot(this.actor, this.state, this.spotId, requestMessage, remainingJoinTimeout(deadline.atMs), deadline.signal, operationId);
201
+ this.coordinator.joinSpot(this.actor, this.state, this.spotId, requestMessage, remainingJoinTimeout(deadline.atMs), deadline.signal, operationId, deadline.atMs);
191
202
  result =
192
203
  this.turn === undefined
193
204
  ? await pending
@@ -309,7 +320,7 @@ class DefaultZLinkActorJoinEntrySpotCall {
309
320
  this.state.endDeferredJoin();
310
321
  try {
311
322
  this.coordinator.beginDeferredJoin?.(this.actor, this.state);
312
- pendingJoin = this.coordinator.joinEntrySpot(this.actor, this.state, undefined, requestMessage, remainingJoinTimeout(deadline.atMs), deadline.signal, operationId);
323
+ pendingJoin = this.coordinator.joinEntrySpot(this.actor, this.state, undefined, requestMessage, remainingJoinTimeout(deadline.atMs), deadline.signal, operationId, deadline.atMs);
313
324
  if (this.turn === undefined) {
314
325
  await pendingJoin.catch(() => undefined);
315
326
  }
@@ -324,7 +335,7 @@ class DefaultZLinkActorJoinEntrySpotCall {
324
335
  let result;
325
336
  try {
326
337
  const pending = pendingJoin ??
327
- this.coordinator.joinEntrySpot(this.actor, this.state, undefined, requestMessage, remainingJoinTimeout(deadline.atMs), deadline.signal, operationId);
338
+ this.coordinator.joinEntrySpot(this.actor, this.state, undefined, requestMessage, remainingJoinTimeout(deadline.atMs), deadline.signal, operationId, deadline.atMs);
328
339
  result =
329
340
  this.turn === undefined
330
341
  ? await pending
@@ -5,9 +5,9 @@ exports.currentZLinkActorExecution = currentZLinkActorExecution;
5
5
  const node_async_hooks_1 = require("node:async_hooks");
6
6
  const actorExecutionStorage = new node_async_hooks_1.AsyncLocalStorage();
7
7
  /** Runs one Actor handler while retaining its Actor FIFO claim across Yield. */
8
- async function runZLinkActorExecution(actorId, spotId, operation) {
8
+ function runZLinkActorExecution(actorId, spotId, operation) {
9
9
  const context = { actorId, spotId, active: true };
10
- return await actorExecutionStorage.run(context, async () => {
10
+ return actorExecutionStorage.run(context, async () => {
11
11
  try {
12
12
  return await operation();
13
13
  }
@@ -1,3 +1,6 @@
1
+ import { RequestRuntime } from '../foundation/request-runtime';
2
+ import type { PendingOperation } from '../foundation/operation-registry';
3
+ import { inspectRuntime } from '../internal-observation';
1
4
  import { type ActorRef, type RoutingId } from '../../contracts';
2
5
  import type { Message } from '../../contracts/Common/Message';
3
6
  import type { ApplicationJobOrigin } from '../application-jobs/contracts';
@@ -10,6 +13,7 @@ import type { ZLinkRemoteBoundSessionTarget } from './actor-runtime-state';
10
13
  export declare const DEFAULT_MESSAGE_FOLLOW_DURATION_MS: number;
11
14
  export declare const RELOCATED_REQUEST_OWNED_BY_REQUESTER: unique symbol;
12
15
  export interface ZLinkActorHandoffPacket {
16
+ requestOperation?: PendingOperation<unknown>;
13
17
  readonly index: number;
14
18
  readonly header: string;
15
19
  readonly payload: string;
@@ -84,6 +88,7 @@ interface ReplySourceEvidence {
84
88
  readonly authorityOwnerGeneration: bigint;
85
89
  }
86
90
  export interface ZLinkActorHandoffCoordinatorOptions {
91
+ readonly requests?: RequestRuntime;
87
92
  readonly routedTransport: ZLinkActorRoutedJoinTransport;
88
93
  readonly messageFollowDurationMs?: number;
89
94
  readonly requestTimeoutMs?: number;
@@ -109,6 +114,12 @@ export interface ZLinkActorHandoffCoordinatorOptions {
109
114
  /** Owns packet ordering from relocation start through Message Follow removal. */
110
115
  export declare class ZLinkActorHandoffCoordinator {
111
116
  private readonly options;
117
+ private readonly requests;
118
+ [inspectRuntime](): Readonly<{
119
+ replyRouteCount: number;
120
+ hasMessageFollowRoute: (actorId: string, actorRef: ActorRef) => boolean;
121
+ tenureAuthorityOwnerGeneration: (actorId: string, actorRef: ActorRef) => bigint | undefined;
122
+ }>;
112
123
  private readonly active;
113
124
  private readonly messageFollowRoutes;
114
125
  private readonly messageFollowSuppression;
@@ -147,7 +158,7 @@ export declare class ZLinkActorHandoffCoordinator {
147
158
  */
148
159
  failPending(actorId: string, reason: unknown): void;
149
160
  cancel(actorId: string): void;
150
- capture(origin: ApplicationJobOrigin, actorId: string, parts: readonly Message[], returnResponse?: boolean, remoteBoundSessionTarget?: ZLinkRemoteBoundSessionTarget, fallbackActorRef?: ActorRef, deadlineUnixMs?: number, messageFollowOrigin?: ZLinkMessageFollowOrigin, provisionalReplay?: ZLinkActorHandoffDispatch, onAdmitted?: () => void): Promise<unknown> | undefined;
161
+ capture(origin: ApplicationJobOrigin, actorId: string, parts: readonly Message[], returnResponse?: boolean, remoteBoundSessionTarget?: ZLinkRemoteBoundSessionTarget, fallbackActorRef?: ActorRef, deadlineUnixMs?: number, messageFollowOrigin?: ZLinkMessageFollowOrigin, provisionalReplay?: ZLinkActorHandoffDispatch, onAdmitted?: () => void, requestOperation?: PendingOperation<unknown>): Promise<unknown> | undefined;
151
162
  snapshot(actorId: string): readonly ZLinkActorHandoffPacket[];
152
163
  /**
153
164
  * Freezes the post-capture ingress segment immediately before the caller
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ZLinkActorHandoffCoordinator = exports.RELOCATED_REQUEST_OWNED_BY_REQUESTER = exports.DEFAULT_MESSAGE_FOLLOW_DURATION_MS = void 0;
4
4
  exports.decodeHandoffPacket = decodeHandoffPacket;
5
5
  exports.replayActorHandoffBacklog = replayActorHandoffBacklog;
6
+ const request_runtime_1 = require("../foundation/request-runtime");
7
+ const internal_observation_1 = require("../internal-observation");
6
8
  const contracts_1 = require("../../contracts");
7
9
  const Registration_1 = require("../../contracts/Configuration/Registration");
8
10
  const Options_1 = require("../../contracts/Locations/Options");
@@ -13,12 +15,10 @@ const service_stateful_registry_1 = require("../foundation/service-stateful-regi
13
15
  const operation_identity_1 = require("../foundation/operation-identity");
14
16
  const stream_wire_1 = require("@zlink-systems/stream-wire");
15
17
  const framework_errors_internal_1 = require("../framework-errors-internal");
16
- const request_deadline_1 = require("../messaging/request-deadline");
17
18
  const routing_id_1 = require("../routing-id");
18
19
  const protocol_1 = require("../streams/protocol");
19
20
  const actor_message_follow_context_1 = require("./actor-message-follow-context");
20
21
  const actor_packet_relay_wire_1 = require("./actor-packet-relay-wire");
21
- const actor_routed_json_request_1 = require("./actor-routed-json-request");
22
22
  exports.DEFAULT_MESSAGE_FOLLOW_DURATION_MS = Options_1.zlinkDefaultLocationOptions.messageFollowDurationMs;
23
23
  exports.RELOCATED_REQUEST_OWNED_BY_REQUESTER = Symbol('relocated request owned by requester');
24
24
  function requireExactTargetOwnerFence(actorId, fence) {
@@ -35,6 +35,14 @@ function requireExactTargetOwnerFence(actorId, fence) {
35
35
  /** Owns packet ordering from relocation start through Message Follow removal. */
36
36
  class ZLinkActorHandoffCoordinator {
37
37
  options;
38
+ requests;
39
+ [internal_observation_1.inspectRuntime]() {
40
+ return Object.freeze({
41
+ replyRouteCount: this.replyRoutes.size,
42
+ hasMessageFollowRoute: (actorId, actorRef) => this.hasMessageFollowRouteForStaleRef(actorId, actorRef),
43
+ tenureAuthorityOwnerGeneration: (actorId, actorRef) => this.tenureAuthorityOwnerGeneration(actorId, actorRef)
44
+ });
45
+ }
38
46
  active = new Map();
39
47
  // Each route is stored once: Actor -> native fence -> location owner id.
40
48
  // Native ingress has the complete fence except the location owner's text id.
@@ -53,6 +61,7 @@ class ZLinkActorHandoffCoordinator {
53
61
  replyRoutes = new Map();
54
62
  constructor(options) {
55
63
  this.options = options;
64
+ this.requests = options.requests ?? new request_runtime_1.RequestRuntime();
56
65
  this.messageFollowDurationMs =
57
66
  options.messageFollowDurationMs ?? exports.DEFAULT_MESSAGE_FOLLOW_DURATION_MS;
58
67
  }
@@ -479,7 +488,7 @@ class ZLinkActorHandoffCoordinator {
479
488
  pending.reject?.(error);
480
489
  }
481
490
  }
482
- capture(origin, actorId, parts, returnResponse = false, remoteBoundSessionTarget, fallbackActorRef, deadlineUnixMs, messageFollowOrigin, provisionalReplay, onAdmitted) {
491
+ capture(origin, actorId, parts, returnResponse = false, remoteBoundSessionTarget, fallbackActorRef, deadlineUnixMs, messageFollowOrigin, provisionalReplay, onAdmitted, requestOperation) {
483
492
  let incomingContext = (0, actor_message_follow_context_1.actorMessageFollowContext)(fallbackActorRef);
484
493
  const originalDeadlineUnixMs = deadlineUnixMs ?? incomingContext?.deadlineUnixMs ?? packetDeadlineUnixMs(parts);
485
494
  const followRoute = this.findMessageFollowRoute(actorId, incomingContext, messageFollowOrigin?.target);
@@ -522,7 +531,7 @@ class ZLinkActorHandoffCoordinator {
522
531
  catch (error) {
523
532
  return Promise.reject(error);
524
533
  }
525
- const packet = encodePacket(handoff.nextIndex++, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef, context, messageFollowOrigin);
534
+ const packet = encodePacket(handoff.nextIndex++, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef, context, messageFollowOrigin, requestOperation);
526
535
  handoff.pendingBytes += packetBytes(packet);
527
536
  this.options.onMarker?.('handoff_backlog', actorId, packet.index);
528
537
  if (returnResponse) {
@@ -622,7 +631,7 @@ class ZLinkActorHandoffCoordinator {
622
631
  this.options.onMarker?.('message_follow_rejected', actorId);
623
632
  return Promise.reject(actorLocationStale(actorId));
624
633
  }
625
- const packet = encodePacket(0, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef, incomingContext, messageFollowOrigin);
634
+ const packet = encodePacket(0, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef, incomingContext, messageFollowOrigin, requestOperation);
626
635
  return this.enqueueMessageFollow(followRoute, actorId, packet, onAdmitted);
627
636
  }
628
637
  this.options.onMarker?.('message_follow_rejected', actorId);
@@ -668,7 +677,7 @@ class ZLinkActorHandoffCoordinator {
668
677
  catch (error) {
669
678
  return Promise.reject(error);
670
679
  }
671
- const packet = encodePacket(0, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef, context, messageFollowOrigin);
680
+ const packet = encodePacket(0, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef, context, messageFollowOrigin, requestOperation);
672
681
  return this.enqueueMessageFollow(followRoute, actorId, packet, onAdmitted);
673
682
  }
674
683
  snapshot(actorId) {
@@ -1113,23 +1122,32 @@ class ZLinkActorHandoffCoordinator {
1113
1122
  replyRouteId: context.replyRouteId,
1114
1123
  result
1115
1124
  });
1125
+ packet.requestOperation?.setFailureDispatcher(reject);
1116
1126
  onAdmitted?.();
1117
1127
  entry.tail = entry.tail.then(async () => {
1118
1128
  try {
1119
- resolve(await this.relayMessageFollow(actorId, entry, packet));
1129
+ if (packet.requestOperation !== undefined && !packet.requestOperation.isPending()) {
1130
+ resolve(await packet.requestOperation.promise);
1131
+ }
1132
+ else {
1133
+ await this.relayMessageFollow(actorId, entry, packet, resolve, reject);
1134
+ }
1135
+ await result;
1120
1136
  }
1121
1137
  catch (error) {
1122
1138
  this.options.onMarker?.('message_follow_rejected', actorId);
1123
1139
  reject(error);
1124
1140
  }
1125
1141
  finally {
1142
+ packet.requestOperation?.clearFailureDispatcher(reject);
1143
+ delete packet.requestOperation;
1126
1144
  entry.queuedMessages--;
1127
1145
  entry.queuedBytes -= bytes;
1128
1146
  }
1129
1147
  });
1130
1148
  return result;
1131
1149
  }
1132
- async relayMessageFollow(actorId, entry, packet) {
1150
+ async relayMessageFollow(actorId, entry, packet, resolve, reject) {
1133
1151
  const { target, targetActorRef } = entry;
1134
1152
  const context = packet.messageFollowContext;
1135
1153
  let advanced;
@@ -1157,33 +1175,54 @@ class ZLinkActorHandoffCoordinator {
1157
1175
  packetName: actor_packet_relay_wire_1.ZLINK_REMOTE_ACTOR_PACKET_RELAY_PACKET
1158
1176
  });
1159
1177
  await this.messageFollowRelayed(actorId, entry, packet, advanced);
1160
- return undefined;
1178
+ resolve(undefined);
1179
+ return;
1161
1180
  }
1162
1181
  const timeoutMs = this.options.requestTimeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS;
1163
- const relayDeadlineMs = performance.now() + timeoutMs;
1164
- if (this.options.routedTransport.requestRawToSpot === undefined) {
1165
- const reply = await (0, request_deadline_1.waitRequestReply)(this.options.routedTransport.requestToSpot(target, payload, {
1166
- packetName: actor_packet_relay_wire_1.ZLINK_REMOTE_ACTOR_PACKET_RELAY_PACKET,
1167
- timeoutMs
1168
- }), actorId, relayDeadlineMs);
1169
- if (reply.ok === false) {
1170
- throw actorRelayError(actorId, reply.errorKind, reply.error);
1171
- }
1172
- await this.messageFollowRelayed(actorId, entry, packet, advanced);
1173
- return reply.response;
1182
+ const requestOperation = packet.requestOperation ?? this.requests.begin(timeoutMs);
1183
+ if (packet.requestOperation === undefined) {
1184
+ // The existing business result delivers failures from this entry alias.
1185
+ void requestOperation.promise.catch(() => { });
1186
+ requestOperation.setFailureDispatcher(reject);
1187
+ }
1188
+ if (!requestOperation.isPending()) {
1189
+ resolve(await requestOperation.promise);
1190
+ return;
1191
+ }
1192
+ try {
1193
+ this.options.routedTransport.requestToSpot(target, payload, { packetName: actor_packet_relay_wire_1.ZLINK_REMOTE_ACTOR_PACKET_RELAY_PACKET, timeoutMs, requestOperation }, {
1194
+ operationCompleted: (_id, value) => {
1195
+ requestOperation.clearFailureDispatcher(reject);
1196
+ if (!requestOperation.isPending())
1197
+ return;
1198
+ void (async () => {
1199
+ const reply = value;
1200
+ if (reply.ok === false)
1201
+ throw actorRelayError(actorId, reply.errorKind, reply.error);
1202
+ await this.messageFollowRelayed(actorId, entry, packet, advanced);
1203
+ if (packet.requestOperation === undefined)
1204
+ requestOperation.complete(reply.response);
1205
+ resolve(reply.response);
1206
+ })().catch((error) => {
1207
+ if (packet.requestOperation === undefined)
1208
+ requestOperation.fail(error);
1209
+ reject(error);
1210
+ });
1211
+ },
1212
+ operationFailed: (_id, error) => {
1213
+ requestOperation.clearFailureDispatcher(reject);
1214
+ if (packet.requestOperation === undefined)
1215
+ requestOperation.fail(error);
1216
+ reject(error);
1217
+ }
1218
+ });
1219
+ }
1220
+ catch (error) {
1221
+ requestOperation.clearFailureDispatcher(reject);
1222
+ if (packet.requestOperation === undefined)
1223
+ requestOperation.fail(error);
1224
+ throw error;
1174
1225
  }
1175
- const response = await (0, request_deadline_1.waitRequestReply)((0, actor_routed_json_request_1.requestRoutedJsonReply)(this.options.routedTransport, target, payload, { timeoutMs }, `Actor Message Follow raw request is not available for '${actorId}'.`, (parts) => {
1176
- if (parts.length === 0) {
1177
- throw new Error(`Actor Message Follow reply was empty for '${actorId}'.`);
1178
- }
1179
- const reply = JSON.parse(parts[0].getString('utf8'));
1180
- if (reply.ok === false) {
1181
- throw actorRelayError(actorId, reply.errorKind, reply.error);
1182
- }
1183
- return reply.response;
1184
- }), actorId, relayDeadlineMs);
1185
- await this.messageFollowRelayed(actorId, entry, packet, advanced);
1186
- return response;
1187
1226
  }
1188
1227
  async messageFollowRelayed(actorId, entry, packet, context) {
1189
1228
  this.options.onMarker?.('message_follow_relay', actorId, undefined, context);
@@ -1281,11 +1320,11 @@ async function replayActorHandoffBacklog(backlog, dispatch, onEnqueued) {
1281
1320
  }
1282
1321
  return results;
1283
1322
  }
1284
- function encodePacket(index, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef, messageFollowContext, messageFollowOrigin) {
1323
+ function encodePacket(index, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef, messageFollowContext, messageFollowOrigin, requestOperation) {
1285
1324
  if (messageFollowContext === undefined) {
1286
1325
  throw new Error('Actor handoff packet requires a Message Follow context.');
1287
1326
  }
1288
- return {
1327
+ const packet = {
1289
1328
  index,
1290
1329
  header: Buffer.from(parts[0].data()).toString('base64'),
1291
1330
  payload: Buffer.from(parts[1].data()).toString('base64'),
@@ -1312,6 +1351,12 @@ function encodePacket(index, parts, returnResponse, remoteBoundSessionTarget, fa
1312
1351
  nodeRid: String(fallbackActorRef.nodeRid)
1313
1352
  }
1314
1353
  };
1354
+ if (requestOperation !== undefined)
1355
+ Object.defineProperty(packet, 'requestOperation', {
1356
+ value: requestOperation,
1357
+ configurable: true
1358
+ });
1359
+ return packet;
1315
1360
  }
1316
1361
  function optionalBigInt(value) {
1317
1362
  return value === undefined ? undefined : BigInt(value);