@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
@@ -17,7 +17,7 @@ import {
17
17
  ZLinkRuntimeDispatchErrorAction,
18
18
  ZLinkRuntimeDispatchErrorReason
19
19
  } from '../../contracts/Dispatch/ZLinkDispatchOptions';
20
- import { throwIfAborted } from '../abort';
20
+ import { awaitWithAbort, throwIfAborted } from '../abort';
21
21
  import { ZLINK_ACTOR_JOIN_ENTRY_SPOT_RUNTIME, ZLinkSpotActorDispatcher } from '../actors';
22
22
  import { ZLinkBufferMessage as RuntimeMessage } from '../backend/runtime-message';
23
23
  import { ZLinkDispatchErrorReporter } from '../channels';
@@ -124,8 +124,10 @@ export class ZLinkSpotActorMembership {
124
124
  ): Promise<void> {
125
125
  throwIfAborted(signal);
126
126
  const activation = this.requireActivation(spotId, meshName);
127
- await this.runLifecycleOperation(activation, () =>
128
- this.leaveActorCore(activation, actor, signal, meshName)
127
+ await this.runLifecycleOperation(
128
+ activation,
129
+ () => this.leaveActorCore(activation, actor, undefined, meshName),
130
+ signal
129
131
  );
130
132
  }
131
133
 
@@ -261,9 +263,10 @@ export class ZLinkSpotActorMembership {
261
263
 
262
264
  private async runLifecycleOperation<T>(
263
265
  activation: ZLinkSpotActivation,
264
- operation: () => Promise<T> | T
266
+ operation: () => Promise<T> | T,
267
+ signal?: AbortSignal
265
268
  ): Promise<T> {
266
- const pending = activation.serial.executeLifecycleOperation(operation);
269
+ const pending = awaitWithAbort(activation.serial.executeLifecycleOperation(operation), signal);
267
270
  return activation.serial.isCurrentTurn
268
271
  ? await activation.serial.currentTurn!.yieldFrameworkPromise(pending)
269
272
  : await pending;
@@ -1,16 +1,21 @@
1
- import { actorMessageFollowContext } from '../actors/actor-message-follow-context';
1
+ import {
2
+ resolveActorIngress,
3
+ type ZLinkRouteToActorJoinPrewarm,
4
+ type ZLinkActorIngressRoute
5
+ } from './spot-actor-ingress-admission';
6
+ import type { ZLinkSpotActorHandoffRuntime } from './spot-runtime-ports';
2
7
  import { DefaultZLinkActorContext } from '../actors/actor-context';
3
8
  import { decodeSessionDisconnected } from '../actors/session-disconnected-wire';
4
9
  import { routingIdsEqual } from '../routing-id';
5
10
  import type { ApplicationJobOrigin } from '../application-jobs/contracts';
6
11
  import {
7
12
  ZLinkFrameworkInternalErrorKind,
8
- createInternalFrameworkException,
9
- internalFrameworkErrorKind
13
+ createInternalFrameworkException
10
14
  } from '../framework-errors-internal';
11
15
  import type {
12
16
  ActorRef,
13
17
  RoutingId,
18
+ Type,
14
19
  ZLinkActor,
15
20
  ZLinkMessageSerializer,
16
21
  ZLinkSpot
@@ -31,6 +36,7 @@ import {
31
36
  ZLinkDispatchMessageKind
32
37
  } from '../../contracts/Dispatch/ZLinkDispatchOptions';
33
38
  import { flowIfEnabled } from '../diagnostics';
39
+ import { dispatchReasonFromError } from '../diagnostics/dispatch-error-details';
34
40
  import { createInboundFlow, currentFlowContext, runWithFlow } from '../diagnostics/flow-context';
35
41
  import { streamSessionIdFromRoutingId } from '../streams/managed-stream';
36
42
  import type { ZLinkRemoteBoundSessionTarget } from '../actors';
@@ -73,6 +79,7 @@ export interface ZLinkActorRequestTerminal {
73
79
  /** One admitted Actor packet and the routing context that must move with it. */
74
80
  export interface ZLinkActorPacketDelivery {
75
81
  readonly origin: ApplicationJobOrigin;
82
+ readonly receivedAt?: Date;
76
83
  readonly actorId: string;
77
84
  readonly parts: readonly Message[];
78
85
  readonly returnResponse: boolean;
@@ -83,43 +90,15 @@ export interface ZLinkActorPacketDelivery {
83
90
  readonly sourceSessionRid?: RoutingId;
84
91
  }
85
92
 
86
- /**
87
- * Spec 15 §4.2 relocation temporary queue: consulted when {@code
88
- * resolveActor} finds nothing for an arrival that carries an exact object
89
- * identity. Parks the arrival if an Actor Join admission attempt is in
90
- * flight for {@code (actorId, objectGeneration)}, or reports not-found so
91
- * the caller falls through to its existing missing-actor handling
92
- * unchanged.
93
- */
94
- export type ZLinkRouteToActorJoinPrewarm = (
95
- actorId: string,
96
- objectGeneration: bigint,
97
- arrival: {
98
- readonly origin: ApplicationJobOrigin;
99
- readonly header: Buffer;
100
- readonly payload: Buffer;
101
- readonly returnResponse: boolean;
102
- readonly remoteBoundSessionTarget?: ZLinkRemoteBoundSessionTarget;
103
- readonly fallbackActorRef?: ActorRef;
104
- readonly requestTerminal?: ZLinkActorRequestTerminal;
105
- readonly resolve: (value: unknown) => void;
106
- readonly reject: (reason: unknown) => void;
107
- }
108
- ) => 'parked' | 'not-found';
109
-
93
+ export type { ZLinkRouteToActorJoinPrewarm } from './spot-actor-ingress-admission';
110
94
  interface ZLinkSpotActorPacketDispatchOptions {
95
+ readonly admission?: import('../admission').ZLinkRuntimeAdmissionGate;
111
96
  readonly spot: ZLinkSpot | (() => ZLinkSpot);
112
97
  readonly spotId: () => string;
113
98
  readonly registry: ZLinkSpotActorHandlerRegistryRuntime;
114
- readonly serial?: ZLinkSpotSerialTurnExecutor;
115
99
  readonly resolveActor: (actorId: string) => ZLinkActor | undefined;
116
- readonly actorLeft?: (actorId: string) => boolean;
117
- readonly routeBeforeLocal?: (
118
- delivery: ZLinkActorPacketDelivery
119
- ) =>
120
- | Promise<{ readonly handled: boolean; readonly response?: unknown } | undefined>
121
- | { readonly handled: boolean; readonly response?: unknown }
122
- | undefined;
100
+ readonly hasDepartedActor?: (actorId: string) => boolean;
101
+ readonly routeBeforeLocal?: ZLinkActorIngressRoute;
123
102
  readonly onDisconnectActor: (actor: ZLinkActor) => Promise<void>;
124
103
  readonly actorResponseSender?: (
125
104
  actor: ZLinkActor,
@@ -146,10 +125,14 @@ interface ZLinkSpotActorPacketDispatchOptions {
146
125
  readonly routeToActorJoinPrewarm?: ZLinkRouteToActorJoinPrewarm;
147
126
  }
148
127
 
128
+ export type ZLinkActorPacketExecution =
129
+ { readonly terminal: Promise<unknown> } | { readonly response: unknown };
130
+
149
131
  export class ZLinkSpotActorPacketDispatch {
150
132
  constructor(private readonly options: ZLinkSpotActorPacketDispatchOptions) {}
151
133
 
152
134
  dispatch(
135
+ serial: ZLinkSpotSerialTurnExecutor | undefined,
153
136
  origin: ApplicationJobOrigin,
154
137
  actorId: string,
155
138
  parts: readonly Message[],
@@ -158,8 +141,9 @@ export class ZLinkSpotActorPacketDispatch {
158
141
  fallbackActorRef?: ActorRef,
159
142
  requestTerminal?: ZLinkActorRequestTerminal
160
143
  ): Promise<unknown> {
161
- return this.dispatchDelivery({
144
+ return this.dispatchDelivery(serial, {
162
145
  origin,
146
+ receivedAt: new Date(),
163
147
  actorId,
164
148
  parts,
165
149
  returnResponse,
@@ -169,18 +153,32 @@ export class ZLinkSpotActorPacketDispatch {
169
153
  });
170
154
  }
171
155
 
172
- async dispatchDelivery(delivery: ZLinkActorPacketDelivery): Promise<unknown> {
156
+ async dispatchDelivery(
157
+ serial: ZLinkSpotSerialTurnExecutor | undefined,
158
+ delivery: ZLinkActorPacketDelivery
159
+ ): Promise<unknown> {
160
+ const result = await this.admitDelivery(serial, delivery);
161
+ return 'terminal' in result ? await result.terminal : result.response;
162
+ }
163
+
164
+ async admitDelivery(
165
+ serial: ZLinkSpotSerialTurnExecutor | undefined,
166
+ delivery: ZLinkActorPacketDelivery,
167
+ handoffRuntime?: ZLinkSpotActorHandoffRuntime
168
+ ): Promise<ZLinkActorPacketExecution> {
173
169
  const {
174
170
  actorId,
175
171
  parts,
176
172
  returnResponse,
173
+ receivedAt: deliveryReceivedAt,
177
174
  remoteBoundSessionTarget,
178
175
  fallbackActorRef,
179
176
  requestTerminal
180
177
  } = delivery;
178
+ const receivedAt = deliveryReceivedAt ?? new Date();
181
179
  if (parts.length < 2) {
182
180
  this.reportInvalidFrame(actorId, ZLinkDispatchMessageKind.ActorSend);
183
- return undefined;
181
+ return { response: undefined };
184
182
  }
185
183
  // Spec 26 §4.1: one level read per processing point — the same gate value
186
184
  // drives both the decode and the flow-context install.
@@ -223,28 +221,32 @@ export class ZLinkSpotActorPacketDispatch {
223
221
  disconnected && header.kind === ZLinkStreamMessageKind.Request
224
222
  ? emptyDisconnectedReply
225
223
  : undefined;
226
- if (this.options.actorLeft?.(actorId) === true && disconnected) {
227
- return disconnectedReply;
228
- }
229
- const routed = await this.options.routeBeforeLocal?.(delivery);
230
- if (routed?.handled === true) {
231
- return routed.response;
232
- }
233
- const actor = this.options.resolveActor(actorId);
234
- if (actor === undefined) {
235
- return this.handleMissingActor(
236
- delivery.origin,
237
- actorId,
238
- parts,
239
- header,
240
- messageKind,
241
- action,
242
- returnResponse,
243
- remoteBoundSessionTarget,
244
- fallbackActorRef,
245
- requestTerminal
246
- );
247
- }
224
+ const admitted = resolveActorIngress(
225
+ delivery,
226
+ messageKind === ZLinkDispatchMessageKind.ActorRequest,
227
+ {
228
+ handoffRuntime,
229
+ routeBeforeLocal: this.options.routeBeforeLocal,
230
+ resolveActor: this.options.resolveActor,
231
+ hasDepartedActor: this.options.hasDepartedActor,
232
+ routeToActorJoinPrewarm: this.options.routeToActorJoinPrewarm
233
+ }
234
+ );
235
+ if ('terminal' in admitted) return { terminal: admitted.terminal };
236
+ if (admitted.kind === 'stale')
237
+ return {
238
+ response: await this.dispatchUnavailableActor(
239
+ admitted.error,
240
+ actorId,
241
+ header,
242
+ messageKind,
243
+ action,
244
+ returnResponse,
245
+ remoteBoundSessionTarget,
246
+ fallbackActorRef
247
+ )
248
+ };
249
+ const actor = admitted.actor;
248
250
  if (disconnected) {
249
251
  const identity = decodeSessionDisconnected(messageToBytes(parts[1]));
250
252
  if (identity === undefined) {
@@ -258,7 +260,7 @@ export class ZLinkSpotActorPacketDispatch {
258
260
  ),
259
261
  'warning'
260
262
  );
261
- return disconnectedReply;
263
+ return { response: disconnectedReply };
262
264
  }
263
265
  const current =
264
266
  actor.context instanceof DefaultZLinkActorContext
@@ -270,85 +272,68 @@ export class ZLinkSpotActorPacketDispatch {
270
272
  current.sessionOwnerNodeGeneration !== identity.sessionOwnerNodeGeneration ||
271
273
  current.bindingGeneration !== identity.bindingGeneration)
272
274
  )
273
- return disconnectedReply;
275
+ return { response: disconnectedReply };
274
276
  await this.options.onDisconnectActor(actor);
275
- return disconnectedReply;
277
+ this.trace(
278
+ messageKind === ZLinkDispatchMessageKind.ActorRequest
279
+ ? ZLinkMessageFlowOutcome.Replied
280
+ : ZLinkMessageFlowOutcome.Completed,
281
+ actorId,
282
+ header,
283
+ messageKind
284
+ );
285
+ return { response: disconnectedReply };
276
286
  }
277
287
  const decodePayload = this.createPayloadDecoder(parts[1], header);
278
- return this.dispatchActorPacket(
279
- actor,
280
- actorId,
281
- decodePayload,
282
- header,
283
- messageKind,
284
- action,
285
- returnResponse,
286
- remoteBoundSessionTarget,
287
- fallbackActorRef,
288
- requestTerminal,
289
- requestDeadlineUnixMs,
290
- zlinkSerialWorkOptions(
291
- parts[1].data().byteLength,
292
- zlinkMetadataByteLength(header.metadata)
288
+ return {
289
+ response: await this.dispatchActorPacket(
290
+ actor,
291
+ actorId,
292
+ decodePayload,
293
+ header,
294
+ messageKind,
295
+ action,
296
+ returnResponse,
297
+ remoteBoundSessionTarget,
298
+ fallbackActorRef,
299
+ requestTerminal,
300
+ requestDeadlineUnixMs,
301
+ serial,
302
+ zlinkSerialWorkOptions(
303
+ parts[1].data().byteLength,
304
+ zlinkMetadataByteLength(header.metadata)
305
+ ),
306
+ receivedAt
293
307
  )
294
- );
308
+ };
295
309
  }
296
310
  );
297
311
  }
298
312
 
299
- private async handleMissingActor(
300
- origin: ApplicationJobOrigin,
313
+ private async dispatchUnavailableActor(
314
+ missingActorError: unknown,
301
315
  actorId: string,
302
- parts: readonly Message[],
303
316
  header: ReturnType<typeof decodeStreamHeader>,
304
317
  messageKind: ZLinkDispatchMessageKind,
305
318
  action: ZLinkDispatchErrorAction,
306
319
  returnResponse: boolean,
307
320
  fallbackBoundSessionTarget: ZLinkRemoteBoundSessionTarget | undefined,
308
- fallbackActorRef: ActorRef | undefined,
309
- requestTerminal: ZLinkActorRequestTerminal | undefined
321
+ fallbackActorRef: ActorRef | undefined
310
322
  ): Promise<unknown> {
311
- if (
312
- this.options.routeToActorJoinPrewarm !== undefined &&
313
- fallbackActorRef !== undefined &&
314
- parts.length >= 2 &&
315
- // A Request without a terminal has no way to complete once
316
- // migrated later — parking it would leave the caller hanging
317
- // forever with no reply route. Fall through to the existing
318
- // missing-actor handling for that shape instead.
319
- (messageKind !== ZLinkDispatchMessageKind.ActorRequest || requestTerminal !== undefined)
320
- ) {
321
- const parked = this.parkForActorJoinPrewarm(
322
- origin,
323
- actorId,
324
- parts,
325
- messageKind,
326
- returnResponse,
327
- fallbackBoundSessionTarget,
328
- fallbackActorRef,
329
- requestTerminal
330
- );
331
- if (parked !== undefined) return parked;
332
- }
333
323
  this.options.dispatchErrors?.report({
334
324
  surface: ZLinkDispatchErrorSurface.SpotActor,
335
325
  messageKind,
336
- reason: ZLinkDispatchErrorReason.HandlerMissing,
326
+ reason: dispatchReasonFromError(missingActorError),
337
327
  action,
338
328
  packetName: header.name,
339
329
  spotId: this.options.spotId(),
340
330
  actorId,
341
- correlationId: header.correlationId ?? header.requestSeq?.toString()
331
+ correlationId: header.correlationId ?? header.requestSeq?.toString(),
332
+ error: missingActorError
342
333
  });
343
334
  if (messageKind !== ZLinkDispatchMessageKind.ActorRequest) {
344
335
  return undefined;
345
336
  }
346
- const missingActorError = createInternalFrameworkException(
347
- actorMessageFollowContext(fallbackActorRef) === undefined
348
- ? ZLinkFrameworkInternalErrorKind.ActorDispatchHandlerNotFound
349
- : ZLinkFrameworkInternalErrorKind.ActorLocationStale,
350
- `SPOT actor is not registered locally: ${actorId}`
351
- );
352
337
  if (
353
338
  header.requestSeq !== undefined &&
354
339
  !returnResponse &&
@@ -368,87 +353,15 @@ export class ZLinkSpotActorPacketDispatch {
368
353
  throw missingActorError;
369
354
  }
370
355
 
371
- /**
372
- * Spec 15 §4.2 relocation temporary queue: parks one arrival for a
373
- * missing Actor that carries an exact object identity, instead of
374
- * dropping it (Send) or replying HandlerNotFound (Request). Returns
375
- * {@code undefined} when no admission attempt owns this object — the
376
- * caller falls through to its existing missing-actor handling unchanged.
377
- * Header/payload are copied to owned buffers before parking so the
378
- * arrival survives independently of the original {@link Message}
379
- * lifetime.
380
- */
381
- private parkForActorJoinPrewarm(
382
- origin: ApplicationJobOrigin,
383
- actorId: string,
384
- parts: readonly Message[],
385
- messageKind: ZLinkDispatchMessageKind,
386
- returnResponse: boolean,
387
- remoteBoundSessionTarget: ZLinkRemoteBoundSessionTarget | undefined,
388
- fallbackActorRef: ActorRef,
389
- requestTerminal: ZLinkActorRequestTerminal | undefined
390
- ): Promise<unknown> | undefined {
391
- const isRequest = messageKind === ZLinkDispatchMessageKind.ActorRequest;
392
- let resolve: (value: unknown) => void = () => undefined;
393
- let reject: (reason: unknown) => void = () => undefined;
394
- const result = new Promise<unknown>((res, rej) => {
395
- resolve = res;
396
- reject = rej;
397
- });
398
- // A Request's real reply must still travel through the exact mailbox
399
- // correlation the original caller captured in `requestTerminal` — not
400
- // through this method's own return value, which the caller only uses
401
- // to decide whether it still owes a reply itself. Wrapping keeps that
402
- // reply route intact across the (possibly much later) redelivery at
403
- // migration time while also releasing the original caller once the
404
- // real reply has gone out, so it never sends a premature empty one.
405
- const wrappedRequestTerminal: ZLinkActorRequestTerminal | undefined =
406
- requestTerminal === undefined
407
- ? undefined
408
- : Object.assign(
409
- async (response: unknown, preparedReply?: unknown) => {
410
- try {
411
- await requestTerminal(response, preparedReply);
412
- resolve(undefined);
413
- } catch (error) {
414
- reject(error);
415
- throw error;
416
- }
417
- },
418
- { prepare: requestTerminal.prepare }
419
- );
420
- const route = this.options.routeToActorJoinPrewarm!(
421
- actorId,
422
- fallbackActorRef.objectGeneration,
423
- {
424
- origin,
425
- header: Buffer.from(parts[0].data()),
426
- payload: Buffer.from(parts[1].data()),
427
- returnResponse,
428
- remoteBoundSessionTarget,
429
- fallbackActorRef,
430
- requestTerminal: wrappedRequestTerminal,
431
- resolve,
432
- reject
433
- }
434
- );
435
- if (route !== 'parked') return undefined;
436
- // A Send has no reply to wait for: the migrated redelivery still runs
437
- // in order later, but this caller's own await is done once parking is
438
- // confirmed.
439
- if (!isRequest) resolve(undefined);
440
- return result;
441
- }
442
-
443
356
  private createPayloadDecoder(
444
357
  message: Message,
445
358
  header: ReturnType<typeof decodeStreamHeader>
446
- ): () => unknown {
447
- return () =>
359
+ ): (messageType?: Type) => unknown {
360
+ return (messageType) =>
448
361
  decodeFrameworkTypedPayloadMessage(
449
362
  message,
450
363
  this.options.messageSerializers,
451
- undefined,
364
+ messageType,
452
365
  streamCodecContentType(header.codec),
453
366
  header.name
454
367
  );
@@ -466,18 +379,26 @@ export class ZLinkSpotActorPacketDispatch {
466
379
  fallbackActorRef: ActorRef | undefined,
467
380
  requestTerminal: ZLinkActorRequestTerminal | undefined,
468
381
  requestDeadlineUnixMs: number | undefined,
469
- workOptions: ZLinkSerialWorkOptions
382
+ serial: ZLinkSpotSerialTurnExecutor | undefined,
383
+ workOptions: ZLinkSerialWorkOptions,
384
+ receivedAt: Date
470
385
  ): Promise<unknown> {
471
386
  const spot = typeof this.options.spot === 'function' ? this.options.spot() : this.options.spot;
472
387
  const dispatcher = new ZLinkSpotActorDispatcher({
473
388
  registry: this.options.registry,
474
389
  spot,
475
390
  providerResolver: this.options.providerResolver,
476
- serial: this.options.serial,
391
+ serial,
477
392
  serialWorkOptions: workOptions,
478
393
  messageSerializers: this.options.messageSerializers,
479
394
  onAdmitted: () => this.trace(ZLinkMessageFlowOutcome.Admitted, actorId, header, messageKind),
480
395
  onHandlerStart: () => {
396
+ if (this.options.admission?.ownerAdmissionOpen() === false) {
397
+ throw createInternalFrameworkException(
398
+ ZLinkFrameworkInternalErrorKind.RequestRejected,
399
+ 'Actor handler was rejected because Location owner admission is closed.'
400
+ );
401
+ }
481
402
  // A transferred backlog is returned to the Actor queue as one FIFO
482
403
  // prefix. Check the request deadline when its owner turn actually
483
404
  // starts, not when that prefix is admitted.
@@ -491,8 +412,8 @@ export class ZLinkSpotActorPacketDispatch {
491
412
  `Actor request '${actorId}' expired before handler admission.`
492
413
  );
493
414
  }
494
- releaseApplicationJobPermitBeforeHandler();
495
415
  this.trace(ZLinkMessageFlowOutcome.Dispatched, actorId, header, messageKind);
416
+ releaseApplicationJobPermitBeforeHandler();
496
417
  }
497
418
  });
498
419
  try {
@@ -500,7 +421,8 @@ export class ZLinkSpotActorPacketDispatch {
500
421
  await dispatcher.dispatchSendDecoded(actor, header.name, decodePayload, {
501
422
  meshName: spot.context.meshName,
502
423
  metadata: zlinkMessageMetadata(header.metadata),
503
- correlationId: header.correlationId ?? undefined
424
+ correlationId: header.correlationId ?? undefined,
425
+ receivedAt
504
426
  });
505
427
  this.trace(
506
428
  ZLinkMessageFlowOutcome.Completed,
@@ -533,7 +455,8 @@ export class ZLinkSpotActorPacketDispatch {
533
455
  {
534
456
  meshName: spot.context.meshName,
535
457
  metadata: zlinkMessageMetadata(header.metadata),
536
- correlationId: header.correlationId ?? header.requestSeq.toString()
458
+ correlationId: header.correlationId ?? header.requestSeq.toString(),
459
+ receivedAt
537
460
  },
538
461
  async (response) => {
539
462
  this.trace(
@@ -561,7 +484,8 @@ export class ZLinkSpotActorPacketDispatch {
561
484
  {
562
485
  meshName: spot.context.meshName,
563
486
  metadata: zlinkMessageMetadata(header.metadata),
564
- correlationId: header.correlationId ?? header.requestSeq.toString()
487
+ correlationId: header.correlationId ?? header.requestSeq.toString(),
488
+ receivedAt
565
489
  }
566
490
  );
567
491
  this.trace(
@@ -579,7 +503,8 @@ export class ZLinkSpotActorPacketDispatch {
579
503
  {
580
504
  meshName: spot.context.meshName,
581
505
  metadata: zlinkMessageMetadata(header.metadata),
582
- correlationId: header.correlationId ?? header.requestSeq.toString()
506
+ correlationId: header.correlationId ?? header.requestSeq.toString(),
507
+ receivedAt
583
508
  },
584
509
  async (response, replyOptions) => {
585
510
  this.trace(
@@ -605,16 +530,7 @@ export class ZLinkSpotActorPacketDispatch {
605
530
  this.options.dispatchErrors?.report({
606
531
  surface: ZLinkDispatchErrorSurface.SpotActor,
607
532
  messageKind,
608
- reason:
609
- error instanceof ZLinkFrameworkException &&
610
- internalFrameworkErrorKind(error) ===
611
- ZLinkFrameworkInternalErrorKind.ActorDispatchHandlerNotFound
612
- ? ZLinkDispatchErrorReason.HandlerMissing
613
- : error instanceof ZLinkFrameworkException &&
614
- internalFrameworkErrorKind(error) ===
615
- ZLinkFrameworkInternalErrorKind.PayloadDecodeFailed
616
- ? ZLinkDispatchErrorReason.PayloadDecodeFailed
617
- : ZLinkDispatchErrorReason.HandlerException,
533
+ reason: dispatchReasonFromError(error),
618
534
  action,
619
535
  packetName: header.name,
620
536
  spotId: this.options.spotId(),
@@ -37,14 +37,16 @@ interface ZLinkSpotActorPacketDrainOptions {
37
37
  ) => void;
38
38
  readonly waitIdle: () => Promise<void>;
39
39
  readonly flowEnabled?: () => boolean;
40
+ readonly receivedAtClock?: () => Date;
40
41
  }
41
42
 
42
43
  const ZLINK_SPOT_ACTOR_RECV_INFO_NO_BIND = 1;
44
+ const systemReceivedAtClock = (): Date => new Date();
43
45
 
44
46
  export class ZLinkSpotActorPacketDrain {
45
47
  private readonly continuations = new Map<
46
48
  string,
47
- { readonly owner: string; readonly parts: Message[] }
49
+ { readonly owner: string; readonly parts: Message[]; readonly receivedAt: Date }
48
50
  >();
49
51
 
50
52
  constructor(private readonly options: ZLinkSpotActorPacketDrainOptions) {}
@@ -60,6 +62,7 @@ export class ZLinkSpotActorPacketDrain {
60
62
  let requestId: bigint | undefined;
61
63
  let flags: number | undefined;
62
64
  let packetKey: string | undefined;
65
+ let receivedAt: Date | undefined;
63
66
  try {
64
67
  for (;;) {
65
68
  const part = info.recvActorPart(ZLINK_RECV_DONT_WAIT);
@@ -67,7 +70,8 @@ export class ZLinkSpotActorPacketDrain {
67
70
  if (parts.length > 0 && packetKey !== undefined) {
68
71
  this.continuations.set(packetKey, {
69
72
  owner: continuationOwner(parts[0], this.flowEnabled()),
70
- parts: parts.splice(0)
73
+ parts: parts.splice(0),
74
+ receivedAt: receivedAt ?? (this.options.receivedAtClock ?? systemReceivedAtClock)()
71
75
  });
72
76
  return;
73
77
  }
@@ -78,6 +82,8 @@ export class ZLinkSpotActorPacketDrain {
78
82
  if (packetKey === undefined) {
79
83
  packetKey = currentPacketKey;
80
84
  const pending = this.continuations.get(currentPacketKey);
85
+ receivedAt =
86
+ pending?.receivedAt ?? (this.options.receivedAtClock ?? systemReceivedAtClock)();
81
87
  if (pending !== undefined) {
82
88
  if (isStreamHeaderMessage(part.message, this.flowEnabled())) {
83
89
  closeMessages(pending.parts);
@@ -125,7 +131,13 @@ export class ZLinkSpotActorPacketDrain {
125
131
  return;
126
132
  }
127
133
  if (noBindInfo !== undefined) {
128
- await this.dispatchNoBindActorRequest(noBindInfo, actorId, parts, actorRef);
134
+ await this.dispatchNoBindActorRequest(
135
+ noBindInfo,
136
+ actorId,
137
+ parts,
138
+ actorRef,
139
+ receivedAt ?? (this.options.receivedAtClock ?? systemReceivedAtClock)()
140
+ );
129
141
  } else {
130
142
  await this.options.actorPacketHandler({
131
143
  origin: 'remote',
@@ -133,7 +145,8 @@ export class ZLinkSpotActorPacketDrain {
133
145
  parts,
134
146
  returnResponse: false,
135
147
  sourceSessionRid,
136
- fallbackActorRef: actorRef as unknown as ActorRef | undefined
148
+ fallbackActorRef: actorRef as unknown as ActorRef | undefined,
149
+ receivedAt
137
150
  });
138
151
  }
139
152
  } finally {
@@ -188,7 +201,8 @@ export class ZLinkSpotActorPacketDrain {
188
201
  info: ZLinkBackendActorRecvInfo,
189
202
  actorId: string,
190
203
  parts: readonly Message[],
191
- actorRef: ZLinkBackendActorRef | undefined
204
+ actorRef: ZLinkBackendActorRef | undefined,
205
+ receivedAt: Date
192
206
  ): Promise<void> {
193
207
  try {
194
208
  const response = await this.options.actorPacketHandler?.({
@@ -197,7 +211,8 @@ export class ZLinkSpotActorPacketDrain {
197
211
  parts,
198
212
  returnResponse: true,
199
213
  sourceSessionRid: info.sourceSessionRid,
200
- fallbackActorRef: actorRef as unknown as ActorRef | undefined
214
+ fallbackActorRef: actorRef as unknown as ActorRef | undefined,
215
+ receivedAt
201
216
  });
202
217
  this.options.replyActorNoBind?.(
203
218
  info,