@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,8 +1,15 @@
1
+ import { RequestRuntime } from '../foundation/request-runtime';
2
+ import type { PendingOperation, OperationObserver } from '../foundation/operation-registry';
1
3
  import { isUtf8 } from 'node:buffer';
2
4
  import { channelErrorKindFromCode } from '../channels/channel-envelope';
3
5
  import { routingIdsEqual } from '../routing-id';
4
6
  import { ZlinkStreamContentType } from '@zlink-systems/stream-wire';
5
- import { createZLinkRequest } from '../messaging/request-result';
7
+ import {
8
+ createZLinkRequest,
9
+ mapZLinkRequestReply,
10
+ type ZLinkRequestResult,
11
+ identityRequestReply
12
+ } from '../messaging/request-result';
6
13
  import type { ZLinkRequest } from '../../contracts/Handlers/Attributes';
7
14
  import {
8
15
  type ActorRef,
@@ -45,7 +52,11 @@ import {
45
52
  internalFrameworkErrorKindFromWireFailureCode,
46
53
  ZLinkFrameworkInternalErrorKind
47
54
  } from '../framework-errors-internal';
48
- import type { ZLinkResolvedActorRoute, ZLinkStoreLocationResolvers } from '../locations';
55
+ import type {
56
+ ZLinkActorRouteInvalidationFence,
57
+ ZLinkResolvedActorRoute,
58
+ ZLinkStoreLocationResolvers
59
+ } from '../locations';
49
60
  import { resolveFrameworkPacketName } from '../messaging/packet-name';
50
61
  import { decodeFrameworkPayloadMessage, encodeFrameworkPayload } from '../messaging/payload-codec';
51
62
  import {
@@ -77,9 +88,9 @@ import {
77
88
  ZLINK_REMOTE_ACTOR_PACKET_RELAY_PACKET
78
89
  } from './actor-packet-relay-wire';
79
90
  import type { ZLinkActorRoutedJoinTransport } from './actor-routed-join-transport';
80
- import { requestRoutedJsonReply } from './actor-routed-json-request';
81
91
 
82
92
  export interface ZLinkActorClientOptions {
93
+ readonly requests?: RequestRuntime;
83
94
  readonly nodeProvider: (meshName: string) => ZLinkBackendMeshNode | undefined;
84
95
  readonly completionTableProvider: (meshName: string) => ZLinkMeshCompletionTable | undefined;
85
96
  readonly locationResolver: () => ZLinkStoreLocationResolvers | undefined;
@@ -94,7 +105,8 @@ export interface ZLinkActorClientOptions {
94
105
  returnResponse: boolean,
95
106
  actor: ActorRef,
96
107
  deadlineUnixMs?: number,
97
- onAdmitted?: () => void
108
+ onAdmitted?: () => void,
109
+ requestOperation?: PendingOperation<unknown>
98
110
  ) => Promise<unknown> | undefined;
99
111
  readonly sendErrorReporter?: (error: unknown) => void;
100
112
  readonly routeTransport?: ZLinkActorRoutedJoinTransport;
@@ -110,7 +122,10 @@ export interface ZLinkActorClientOptions {
110
122
  }
111
123
 
112
124
  export class DefaultZLinkActorClient implements ZLinkActorClient {
113
- constructor(private readonly options: ZLinkActorClientOptions) {}
125
+ private readonly requests: RequestRuntime;
126
+ constructor(private readonly options: ZLinkActorClientOptions) {
127
+ this.requests = options.requests ?? new RequestRuntime();
128
+ }
114
129
 
115
130
  sendToActor(actorId: string, message: unknown): ZLinkActorSendCall {
116
131
  requireActorId(actorId);
@@ -150,7 +165,7 @@ export class DefaultZLinkActorClient implements ZLinkActorClient {
150
165
  ): Promise<ZLinkSubmitResult> {
151
166
  const route = await this.resolveActorRoute(actorId);
152
167
  const { meshName, actorRef: actor } = route;
153
- this.throwIfKnownStale(meshName, actor);
168
+ this.throwIfKnownStale(route);
154
169
  const parts = this.createPacketParts(
155
170
  ZLinkStreamMessageKind.Send,
156
171
  undefined,
@@ -158,9 +173,11 @@ export class DefaultZLinkActorClient implements ZLinkActorClient {
158
173
  message,
159
174
  metadata
160
175
  );
161
- const messageFollow = createActorMessageFollowContext(route, parts, false);
162
- const routedActor = attachActorMessageFollowContext(actor, messageFollow);
176
+ let routeFence: ZLinkActorRouteInvalidationFence | undefined;
163
177
  try {
178
+ const messageFollow = createActorMessageFollowContext(route, parts, false);
179
+ routeFence = actorRouteInvalidationFence(route);
180
+ const routedActor = attachActorMessageFollowContext(actor, messageFollow);
164
181
  const submissionCopies =
165
182
  (await this.options.transportDeliveryGate?.()?.waitBeforeSubmit(actorId, 'oneWay')) ?? 1;
166
183
  const handoff = this.options.handoffCapture?.(
@@ -207,18 +224,13 @@ export class DefaultZLinkActorClient implements ZLinkActorClient {
207
224
  }
208
225
  return await this.submitActorSend(meshName, toBackendActorRef(actor), parts, route);
209
226
  } catch (error) {
210
- if (isStaleActorError(error)) {
211
- this.invalidateActorRoute(actorId);
212
- this.options.staleActorRefReporter?.(meshName, actor.actorId);
213
- throw actorLocationStale(actor.actorId, error);
214
- }
215
- throw error;
227
+ throw this.mapActorFailure(actorId, error, routeFence, meshName);
216
228
  } finally {
217
229
  closeMessages(parts);
218
230
  }
219
231
  }
220
232
 
221
- private async request<TReply>(
233
+ private request<TReply>(
222
234
  actorId: string,
223
235
  explicitPacketName: string | undefined,
224
236
  request: unknown,
@@ -227,112 +239,123 @@ export class DefaultZLinkActorClient implements ZLinkActorClient {
227
239
  signal?: AbortSignal,
228
240
  waitPolicy: 'async' | 'yield' = 'async',
229
241
  onAdmitted?: () => void
230
- ): Promise<TReply> {
242
+ ): ZLinkRequestResult<TReply> {
231
243
  throwIfAborted(signal);
232
244
  const sourceSpotId = currentZLinkActorExecution()?.spotId ?? currentZLinkSpotSerialSourceId();
233
245
  const effectiveTimeoutMs = timeoutMs ?? this.options.defaultRequestTimeoutMs;
234
- const deadlineMs =
235
- effectiveTimeoutMs === undefined ? undefined : performance.now() + effectiveTimeoutMs;
236
- const deadlineUnixMs =
237
- effectiveTimeoutMs === undefined ? undefined : Date.now() + effectiveTimeoutMs;
238
- const route = await this.resolveActorRoute(actorId, signal, deadlineMs);
239
- if (
240
- waitPolicy === 'async' &&
241
- sourceSpotId !== undefined &&
242
- sameSpotRoute(sourceSpotId, route)
243
- ) {
244
- throw createInternalFrameworkException(
245
- ZLinkFrameworkInternalErrorKind.InvalidOperation,
246
- `An Actor request cannot await Actor '${actorId}' on the current Spot while holding its execution claim.`
247
- );
248
- }
249
- const { meshName, actorRef: actor } = route;
250
- this.throwIfKnownStale(meshName, actor);
251
- const operationId = createMessageFollowId();
252
- const correlationId = createMessageFollowId();
253
- const requestSequence = BigInt(`0x${operationId.slice(16)}`);
254
- const parts = this.createPacketParts(
255
- ZLinkStreamMessageKind.Request,
256
- requestSequence === 0n ? 1n : requestSequence,
257
- explicitPacketName,
258
- request,
259
- mergeActorRequestMetadata(metadata, deadlineUnixMs),
260
- correlationId
261
- );
262
- const messageFollow = createActorMessageFollowContext(
263
- route,
264
- parts,
265
- true,
266
- deadlineUnixMs,
267
- correlationId,
268
- operationId
269
- );
270
- const routedActor = attachActorMessageFollowContext(actor, messageFollow);
271
- try {
272
- const delivery = this.options
273
- .transportDeliveryGate?.()
274
- ?.waitBeforeSubmit(actorId, 'request', signal);
275
- const submissionCopies =
276
- delivery === undefined
277
- ? 1
278
- : ((await waitActorReply(delivery, actorId, deadlineMs, signal)) ?? 1);
279
- const handoff = this.options.handoffCapture?.(
280
- meshName,
281
- actor.actorId,
282
- parts,
283
- true,
284
- routedActor,
285
- deadlineUnixMs,
286
- onAdmitted
287
- );
288
- if (handoff !== undefined) {
289
- const submissions = [handoff];
290
- for (let copy = 1; copy < submissionCopies; copy++) {
291
- const duplicate = this.options.handoffCapture?.(
292
- meshName,
293
- actor.actorId,
294
- parts,
295
- true,
296
- routedActor,
297
- deadlineUnixMs,
298
- onAdmitted
246
+ let meshName: string | undefined;
247
+ let routeFence: ZLinkActorRouteInvalidationFence | undefined;
248
+ return this.requests.prepare<TReply>(
249
+ effectiveTimeoutMs,
250
+ signal,
251
+ (requestOperation, receiver) => {
252
+ void (async () => {
253
+ const deadlineMs = requestOperation.deadlineMs;
254
+ const deadlineUnixMs =
255
+ effectiveTimeoutMs === undefined ? undefined : Date.now() + effectiveTimeoutMs;
256
+ const route = await this.resolveActorRoute(actorId, signal, deadlineMs, requestOperation);
257
+ if (!requestOperation.isPending()) return;
258
+ if (
259
+ waitPolicy === 'async' &&
260
+ sourceSpotId !== undefined &&
261
+ sameSpotRoute(sourceSpotId, route)
262
+ ) {
263
+ throw createInternalFrameworkException(
264
+ ZLinkFrameworkInternalErrorKind.InvalidOperation,
265
+ `An Actor request cannot await Actor '${actorId}' on the current Spot while holding its execution claim.`
266
+ );
267
+ }
268
+ const { actorRef: actor } = route;
269
+ meshName = route.meshName;
270
+ if (this.options.staleActorRefPredicate?.(meshName, actor) === true) {
271
+ routeFence = actorRouteInvalidationFence(route);
272
+ throw actorLocationStale(actor.actorId, undefined);
273
+ }
274
+ const operationId = createMessageFollowId();
275
+ const correlationId = createMessageFollowId();
276
+ const requestSequence = BigInt(`0x${operationId.slice(16)}`);
277
+ const parts = this.createPacketParts(
278
+ ZLinkStreamMessageKind.Request,
279
+ requestSequence === 0n ? 1n : requestSequence,
280
+ explicitPacketName,
281
+ request,
282
+ mergeActorRequestMetadata(metadata, deadlineUnixMs),
283
+ correlationId
299
284
  );
300
- if (duplicate !== undefined) submissions.push(duplicate);
301
- }
302
- const replies = await waitActorReply<unknown[]>(
303
- Promise.all(submissions),
304
- actorId,
305
- deadlineMs,
306
- signal
307
- );
308
- return replies[0] as TReply;
309
- }
310
- return await this.submitActorRequest<TReply>(
311
- meshName,
312
- toBackendActorRef(actor),
313
- parts,
314
- remainingActorRequestTimeout(actorId, deadlineMs),
315
- signal,
316
- route,
317
- messageFollow,
318
- onAdmitted
319
- );
320
- } catch (error) {
321
- if (isStaleActorError(error)) {
322
- this.invalidateActorRoute(actorId);
323
- this.options.staleActorRefReporter?.(meshName, actor.actorId);
324
- throw actorLocationStale(actor.actorId, error);
325
- }
326
- throw error;
327
- } finally {
328
- closeMessages(parts);
329
- }
285
+ try {
286
+ const messageFollow = createActorMessageFollowContext(
287
+ route,
288
+ parts,
289
+ true,
290
+ deadlineUnixMs,
291
+ correlationId,
292
+ operationId
293
+ );
294
+ routeFence = actorRouteInvalidationFence(route);
295
+ const routedActor = attachActorMessageFollowContext(actor, messageFollow);
296
+ const delivery = this.options
297
+ .transportDeliveryGate?.()
298
+ ?.waitBeforeSubmit(actorId, 'request', signal);
299
+ const submissionCopies =
300
+ delivery === undefined
301
+ ? 1
302
+ : ((await waitActorReply(delivery, actorId, requestOperation)) ?? 1);
303
+ const handoff = this.options.handoffCapture?.(
304
+ meshName,
305
+ actor.actorId,
306
+ parts,
307
+ true,
308
+ routedActor,
309
+ deadlineUnixMs,
310
+ onAdmitted,
311
+ requestOperation
312
+ );
313
+ if (handoff !== undefined) {
314
+ const submissions = [handoff];
315
+ for (let copy = 1; copy < submissionCopies; copy++) {
316
+ const duplicate = this.options.handoffCapture?.(
317
+ meshName,
318
+ actor.actorId,
319
+ parts,
320
+ true,
321
+ routedActor,
322
+ deadlineUnixMs,
323
+ onAdmitted,
324
+ requestOperation
325
+ );
326
+ if (duplicate !== undefined) submissions.push(duplicate);
327
+ }
328
+ const replies = await Promise.all(submissions);
329
+ receiver.operationCompleted(requestOperation.id, replies[0], undefined);
330
+ return;
331
+ }
332
+ this.submitActorRequest<TReply>(
333
+ meshName,
334
+ toBackendActorRef(actor),
335
+ parts,
336
+ remainingActorRequestTimeout(actorId, deadlineMs),
337
+ signal,
338
+ route,
339
+ messageFollow,
340
+ onAdmitted,
341
+ requestOperation,
342
+ receiver
343
+ );
344
+ } finally {
345
+ closeMessages(parts);
346
+ }
347
+ })().catch((error) => receiver.operationFailed(requestOperation.id, error, undefined));
348
+ },
349
+ (value) => value as TReply,
350
+ (error) => this.mapActorFailure(actorId, error, routeFence, meshName)
351
+ );
330
352
  }
331
353
 
332
354
  private async resolveActorRoute(
333
355
  actorId: string,
334
356
  signal?: AbortSignal,
335
- deadlineMs?: number
357
+ deadlineMs?: number,
358
+ requestOperation?: PendingOperation<unknown>
336
359
  ): Promise<ZLinkResolvedActorRoute> {
337
360
  const resolver = this.options.locationResolver();
338
361
  if (resolver === undefined) {
@@ -341,7 +364,12 @@ export class DefaultZLinkActorClient implements ZLinkActorClient {
341
364
  'Actor direct messaging requires a Location Store.'
342
365
  );
343
366
  }
344
- const resolution = await resolver.resolveDirectActorRoute(actorId, signal, deadlineMs);
367
+ const resolution = await resolver.resolveDirectActorRoute(
368
+ actorId,
369
+ signal,
370
+ deadlineMs,
371
+ requestOperation
372
+ );
345
373
  if (resolution.kind === 'missing') {
346
374
  throw createInternalFrameworkException(
347
375
  ZLinkFrameworkInternalErrorKind.ActorRouteNotFound,
@@ -357,15 +385,29 @@ export class DefaultZLinkActorClient implements ZLinkActorClient {
357
385
  return resolution.route;
358
386
  }
359
387
 
360
- private invalidateActorRoute(actorId: string): void {
361
- this.options.locationResolver()?.invalidateActorRoute(actorId);
388
+ private mapActorFailure(
389
+ actorId: string,
390
+ error: unknown,
391
+ routeFence: ZLinkActorRouteInvalidationFence | undefined,
392
+ meshName: string | undefined
393
+ ): unknown {
394
+ if (!isStaleActorError(error)) return error;
395
+ const resolver = this.options.locationResolver();
396
+ if (routeFence !== undefined && resolver !== undefined)
397
+ resolver.invalidateActorRouteIfMatches(routeFence);
398
+ if (meshName !== undefined) this.options.staleActorRefReporter?.(meshName, actorId);
399
+ return actorLocationStale(actorId, error);
362
400
  }
363
401
 
364
- private throwIfKnownStale(meshName: string, actor: ActorRef): void {
402
+ private throwIfKnownStale(route: ZLinkResolvedActorRoute): void {
403
+ const { meshName, actorRef: actor } = route;
365
404
  if (this.options.staleActorRefPredicate?.(meshName, actor) !== true) return;
366
- this.invalidateActorRoute(actor.actorId);
367
- this.options.staleActorRefReporter?.(meshName, actor.actorId);
368
- throw actorLocationStale(actor.actorId, undefined);
405
+ throw this.mapActorFailure(
406
+ actor.actorId,
407
+ actorLocationStale(actor.actorId, undefined),
408
+ actorRouteInvalidationFence(route),
409
+ meshName
410
+ );
369
411
  }
370
412
 
371
413
  private createPacketParts(
@@ -436,7 +478,7 @@ export class DefaultZLinkActorClient implements ZLinkActorClient {
436
478
  }
437
479
  }
438
480
 
439
- private async submitActorRequest<TReply>(
481
+ private submitActorRequest<TReply>(
440
482
  meshName: string,
441
483
  actor: ZLinkBackendActorRef,
442
484
  parts: readonly Message[],
@@ -444,8 +486,10 @@ export class DefaultZLinkActorClient implements ZLinkActorClient {
444
486
  signal: AbortSignal | undefined,
445
487
  route: ZLinkResolvedActorRoute,
446
488
  messageFollowContext: ZLinkActorMessageFollowContext,
447
- onAdmitted?: () => void
448
- ): Promise<TReply> {
489
+ onAdmitted: (() => void) | undefined,
490
+ requestOperation: PendingOperation<unknown>,
491
+ destination: OperationObserver<unknown, unknown>
492
+ ): void {
449
493
  const node = this.requireNode(meshName);
450
494
  if (
451
495
  this.options.routeTransport !== undefined &&
@@ -470,51 +514,88 @@ export class DefaultZLinkActorClient implements ZLinkActorClient {
470
514
  returnResponse: true,
471
515
  messageFollowContext
472
516
  });
473
- const reply = await requestRoutedJsonReply<{
474
- readonly ok?: boolean;
475
- readonly error?: unknown;
476
- readonly errorKind?: unknown;
477
- readonly response?: TReply;
478
- }>(
479
- this.options.routeTransport,
517
+ this.options.routeTransport.requestToSpot(
480
518
  remoteActorRouteTarget(route),
481
519
  relay,
482
- { timeoutMs, signal, onAdmitted },
483
- `Remote Actor request is not available for '${actor.actorId}'.`,
484
- (replyParts) => JSON.parse(replyParts[0]?.getString('utf8') ?? '{}')
520
+ {
521
+ packetName: ZLINK_REMOTE_ACTOR_PACKET_RELAY_PACKET,
522
+ timeoutMs,
523
+ signal,
524
+ onAdmitted,
525
+ requestOperation
526
+ },
527
+ {
528
+ operationCompleted: (id, value) => {
529
+ const reply = value as {
530
+ ok?: boolean;
531
+ error?: unknown;
532
+ errorKind?: unknown;
533
+ response?: TReply;
534
+ };
535
+ if (reply.ok !== true) {
536
+ destination.operationFailed(
537
+ id,
538
+ createInternalFrameworkException(
539
+ remoteRelayErrorKind(reply.errorKind),
540
+ typeof reply.error === 'string'
541
+ ? reply.error
542
+ : `Remote Actor request failed for '${actor.actorId}'.`
543
+ ),
544
+ undefined
545
+ );
546
+ return;
547
+ }
548
+ destination.operationCompleted(id, reply.response, undefined);
549
+ },
550
+ operationFailed: (id, error) => destination.operationFailed(id, error, undefined)
551
+ }
485
552
  );
486
- if (reply.ok !== true) {
487
- throw createInternalFrameworkException(
488
- remoteRelayErrorKind(reply.errorKind),
489
- typeof reply.error === 'string'
490
- ? reply.error
491
- : `Remote Actor request failed for '${actor.actorId}'.`
492
- );
493
- }
494
- return reply.response as TReply;
553
+ return;
495
554
  }
496
555
  const completions = this.options.completionTableProvider(meshName);
497
556
  if (completions === undefined) {
498
557
  throw routeNotConnected('Actor request requires a running MeshNode completion table.');
499
558
  }
500
- const completion = await completions.submit(
501
- () =>
502
- node.requestToActor(actor, toMessageLikeParts(parts), {
503
- flags: ZLINK_BACKEND_SEND_NONE,
504
- routeFence: nativeActorRouteFence(route, actor),
505
- timeoutMs,
506
- onAdmitted
507
- }),
508
- signal
509
- );
510
- if (completion.terminalResult !== RequestResult.Ok) {
511
- closeMeshCompletion(completion);
512
- throw mapRequestResult(completion.terminalResult, completion.failureErrno, 'Actor request');
513
- }
514
- return decodeActorReply<TReply>(
515
- completion.parts,
516
- this.options.messageSerializers,
517
- decodeStreamHeader(parts[0].data()).name
559
+ const packetName = decodeStreamHeader(parts[0].data()).name;
560
+ this.requests.run(
561
+ requestOperation,
562
+ (receiver) =>
563
+ completions.submit(
564
+ (completion) =>
565
+ node.requestToActor(
566
+ actor,
567
+ toMessageLikeParts(parts),
568
+ {
569
+ flags: ZLINK_BACKEND_SEND_NONE,
570
+ routeFence: nativeActorRouteFence(route, actor),
571
+ timeoutMs,
572
+ onAdmitted,
573
+ requestOperation
574
+ },
575
+ completion
576
+ ),
577
+ signal,
578
+ requestOperation,
579
+ receiver
580
+ ),
581
+ (raw) => {
582
+ const completion = raw as import('../backend').ZLinkMeshCompletion;
583
+ if (completion.terminalResult !== RequestResult.Ok) {
584
+ closeMeshCompletion(completion);
585
+ throw mapRequestResult(
586
+ completion.terminalResult,
587
+ completion.failureErrno,
588
+ 'Actor request'
589
+ );
590
+ }
591
+ return decodeActorReply<TReply>(
592
+ completion.parts,
593
+ this.options.messageSerializers,
594
+ packetName
595
+ );
596
+ },
597
+ identityRequestReply,
598
+ destination
518
599
  );
519
600
  }
520
601
 
@@ -540,6 +621,19 @@ function nativeActorRouteFence(route: ZLinkResolvedActorRoute, actor: ZLinkBacke
540
621
  };
541
622
  }
542
623
 
624
+ function actorRouteInvalidationFence(
625
+ route: ZLinkResolvedActorRoute
626
+ ): ZLinkActorRouteInvalidationFence {
627
+ return {
628
+ actorId: route.actorRef.actorId,
629
+ objectGeneration: route.actorRef.objectGeneration,
630
+ targetNodeRid: route.actorRef.nodeRid,
631
+ targetNodeGeneration: route.ownerNodeGeneration,
632
+ authorityOwnerGeneration: route.authorityOwnerGeneration,
633
+ ownerLeaseGeneration: route.ownerLeaseGeneration
634
+ };
635
+ }
636
+
543
637
  function remoteActorRouteTarget(route: ZLinkResolvedActorRoute) {
544
638
  if (route.enclosingSpotRoute !== undefined) {
545
639
  return route.enclosingSpotRoute;
@@ -694,13 +788,13 @@ class DefaultZLinkActorRequestCall implements ZLinkActorRequestCall {
694
788
  metadata: ReadonlyMap<string, string>,
695
789
  signal?: AbortSignal,
696
790
  onAdmitted?: () => void
697
- ) => Promise<TReply>,
791
+ ) => ZLinkRequestResult<TReply>,
698
792
  private readonly yieldSubmitter: <TReply>(
699
793
  packetName: string | undefined,
700
794
  timeoutMs: number | undefined,
701
795
  metadata: ReadonlyMap<string, string>,
702
796
  signal?: AbortSignal
703
- ) => Promise<TReply>,
797
+ ) => ZLinkRequestResult<TReply>,
704
798
  private readonly targetActorId: string,
705
799
  private readonly request: unknown,
706
800
  private readonly defaultRequestTimeoutMs?: number
@@ -729,7 +823,7 @@ class DefaultZLinkActorRequestCall implements ZLinkActorRequestCall {
729
823
  yield<TReply>(signal?: AbortSignal): Promise<TReply> {
730
824
  this.rejectSelfActorRequest();
731
825
  const turn = requireZLinkYieldTurn(this.turn);
732
- const pending = this.execute<TReply>('yield', signal);
826
+ const pending = mapZLinkRequestReply(this.execute<TReply>('yield', signal));
733
827
  return turn.yieldFrameworkPromise(pending);
734
828
  }
735
829
 
@@ -737,7 +831,7 @@ class DefaultZLinkActorRequestCall implements ZLinkActorRequestCall {
737
831
  waitPolicy: 'async' | 'yield',
738
832
  signal?: AbortSignal,
739
833
  onAdmitted?: () => void
740
- ): Promise<TReply> {
834
+ ): ZLinkRequestResult<TReply> {
741
835
  ensureSingleSubmit(this.executed);
742
836
  this.executed = true;
743
837
  throwIfAborted(signal);
@@ -147,16 +147,24 @@ export class DefaultZLinkActorContext implements ZLinkActorContext {
147
147
  ): Promise<boolean> {
148
148
  const requestMessage = encodeJoinRequest(request, this.messageSerializers);
149
149
  try {
150
- return (
151
- await this.requireJoinCoordinator().joinEntrySpot(
152
- this.requireActor(),
153
- this.state,
154
- nodeRid,
155
- requestMessage,
156
- undefined,
157
- signal
158
- )
159
- ).accepted;
150
+ const result = await this.requireJoinCoordinator().joinEntrySpot(
151
+ this.requireActor(),
152
+ this.state,
153
+ nodeRid,
154
+ requestMessage,
155
+ undefined,
156
+ signal
157
+ );
158
+ try {
159
+ if (result.sourceCleanup !== undefined) {
160
+ await result.sourceCleanup();
161
+ return result.accepted;
162
+ }
163
+ } finally {
164
+ result.reply?.close();
165
+ }
166
+ await result.finalizeDeferredJoin?.();
167
+ return result.accepted;
160
168
  } finally {
161
169
  requestMessage.close();
162
170
  }
@@ -248,7 +256,8 @@ class DefaultZLinkActorJoinSpotCall implements ZLinkActorJoinSpotCall {
248
256
  requestMessage,
249
257
  remainingJoinTimeout(deadline.atMs),
250
258
  deadline.signal,
251
- operationId
259
+ operationId,
260
+ deadline.atMs
252
261
  );
253
262
  if (this.turn === undefined) {
254
263
  await pendingJoin.catch(() => undefined);
@@ -271,7 +280,8 @@ class DefaultZLinkActorJoinSpotCall implements ZLinkActorJoinSpotCall {
271
280
  requestMessage,
272
281
  remainingJoinTimeout(deadline.atMs),
273
282
  deadline.signal,
274
- operationId
283
+ operationId,
284
+ deadline.atMs
275
285
  );
276
286
  result =
277
287
  this.turn === undefined
@@ -396,7 +406,8 @@ class DefaultZLinkActorJoinEntrySpotCall implements ZLinkActorJoinEntrySpotCall
396
406
  requestMessage,
397
407
  remainingJoinTimeout(deadline.atMs),
398
408
  deadline.signal,
399
- operationId
409
+ operationId,
410
+ deadline.atMs
400
411
  );
401
412
  if (this.turn === undefined) {
402
413
  await pendingJoin.catch(() => undefined);
@@ -419,7 +430,8 @@ class DefaultZLinkActorJoinEntrySpotCall implements ZLinkActorJoinEntrySpotCall
419
430
  requestMessage,
420
431
  remainingJoinTimeout(deadline.atMs),
421
432
  deadline.signal,
422
- operationId
433
+ operationId,
434
+ deadline.atMs
423
435
  );
424
436
  result =
425
437
  this.turn === undefined
@@ -9,13 +9,13 @@ interface ZLinkActorExecutionContext {
9
9
  const actorExecutionStorage = new AsyncLocalStorage<ZLinkActorExecutionContext>();
10
10
 
11
11
  /** Runs one Actor handler while retaining its Actor FIFO claim across Yield. */
12
- export async function runZLinkActorExecution<T>(
12
+ export function runZLinkActorExecution<T>(
13
13
  actorId: string,
14
14
  spotId: unknown,
15
15
  operation: () => Promise<T> | T
16
16
  ): Promise<T> {
17
17
  const context: ZLinkActorExecutionContext = { actorId, spotId, active: true };
18
- return await actorExecutionStorage.run(context, async () => {
18
+ return actorExecutionStorage.run(context, async () => {
19
19
  try {
20
20
  return await operation();
21
21
  } finally {