@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
@@ -5398,7 +5398,7 @@ function writeRelocationControlData(input: RelocationControlData, writer: Writer
5398
5398
  export function decodeRelocationControlData(bytes: Uint8Array, context: ServiceWireDecoderContext): RelocationControlData { const reader = new Reader(bytes); const value = readRelocationControlData(reader, context, {}, 0); reader.done("relocation-control-data"); return value; }
5399
5399
  export function encodeRelocationControlData(value: RelocationControlData, context: ServiceWireDecoderContext): Uint8Array { const writer = new Writer(); writeRelocationControlData(value, writer, context, {}, 0); return writer.result(); }
5400
5400
 
5401
- export type RequestSpecificTail = { readonly originalOperationKind: "actorLookup"; readonly terminalResult: "ok"; readonly actor: ActorRef; readonly spotId: Text8; readonly spotGeneration: NonzeroU64; readonly membershipEpoch: NonzeroU64; readonly authorityOwnerGeneration: NonzeroU64 } | { readonly originalOperationKind: "actorJoin"; readonly terminalResult: "ok"; readonly join: ActorJoinReplyTail } | { readonly originalOperationKind: "streamBind"; readonly terminalResult: "ok"; readonly bindingGeneration: NonzeroU64; readonly authorityOwnerGeneration: NonzeroU64 } | { readonly originalOperationKind: "userSpotCreate"; readonly terminalResult: "ok"; readonly createResult: UserSpotCreateResult; readonly spot: SpotRef } | { readonly originalOperationKind: "userSpotClose"; readonly terminalResult: "ok"; readonly closed: Bool8 } | { readonly originalOperationKind: "actorCreate"; readonly terminalResult: "ok"; readonly creation: ActorCreateTerminal } | { readonly originalOperationKind: MeshOperationKind; readonly terminalResult: RequestTerminalResult };
5401
+ export type RequestSpecificTail = { readonly originalOperationKind: "actorLookup"; readonly terminalResult: "ok"; readonly actor: ActorRef; readonly spotId: Text8; readonly spotGeneration: NonzeroU64; readonly membershipEpoch: NonzeroU64; readonly authorityOwnerGeneration: NonzeroU64 } | { readonly originalOperationKind: "actorJoin"; readonly terminalResult: "ok"; readonly join: ActorJoinReplyTail } | { readonly originalOperationKind: "streamBind"; readonly terminalResult: "ok"; readonly bindingGeneration: NonzeroU64; readonly authorityOwnerGeneration: NonzeroU64 } | { readonly originalOperationKind: "streamBind"; readonly terminalResult: "rejected"; readonly rejectionMessage: NonemptyText16 } | { readonly originalOperationKind: "userSpotCreate"; readonly terminalResult: "ok"; readonly createResult: UserSpotCreateResult; readonly spot: SpotRef } | { readonly originalOperationKind: "userSpotClose"; readonly terminalResult: "ok"; readonly closed: Bool8 } | { readonly originalOperationKind: "actorCreate"; readonly terminalResult: "ok"; readonly creation: ActorCreateTerminal } | { readonly originalOperationKind: MeshOperationKind; readonly terminalResult: RequestTerminalResult };
5402
5402
 
5403
5403
  function readRequestSpecificTail(reader: Reader, context: ServiceWireDecoderContext, enclosing: any, flags: number): RequestSpecificTail {
5404
5404
  void context; void enclosing; void flags;
@@ -5433,6 +5433,10 @@ function readRequestSpecificTail(reader: Reader, context: ServiceWireDecoderCont
5433
5433
  value["authorityOwnerGeneration"] = readNonzeroU64(body, context, value, flags);
5434
5434
 
5435
5435
 
5436
+ } else if (same(value["originalOperationKind"], "streamBind") && same(value["terminalResult"], "rejected")) {
5437
+ value["rejectionMessage"] = readNonemptyText16(body, context, value, flags);
5438
+
5439
+
5436
5440
  } else if (same(value["originalOperationKind"], "userSpotCreate") && same(value["terminalResult"], "ok")) {
5437
5441
  value["createResult"] = readUserSpotCreateResult(body, context, value, flags);
5438
5442
 
@@ -5462,7 +5466,7 @@ function writeRequestSpecificTail(input: RequestSpecificTail, writer: Writer, co
5462
5466
 
5463
5467
  const body = writer;
5464
5468
  if (same(value["originalOperationKind"], "actorLookup") && same(value["terminalResult"], "ok")) {
5465
- if (value["join"] !== undefined || value["bindingGeneration"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["closed"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
5469
+ if (value["join"] !== undefined || value["bindingGeneration"] !== undefined || value["rejectionMessage"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["closed"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
5466
5470
  if (value["actor"] === undefined) fail("actor required");
5467
5471
 
5468
5472
 
@@ -5484,13 +5488,13 @@ function writeRequestSpecificTail(input: RequestSpecificTail, writer: Writer, co
5484
5488
 
5485
5489
  writeNonzeroU64(numeric(value["authorityOwnerGeneration"]), body, context, value, flags);
5486
5490
  } else if (same(value["originalOperationKind"], "actorJoin") && same(value["terminalResult"], "ok")) {
5487
- if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["authorityOwnerGeneration"] !== undefined || value["bindingGeneration"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["closed"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
5491
+ if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["authorityOwnerGeneration"] !== undefined || value["bindingGeneration"] !== undefined || value["rejectionMessage"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["closed"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
5488
5492
  if (value["join"] === undefined) fail("join required");
5489
5493
 
5490
5494
 
5491
5495
  writeActorJoinReplyTail(value["join"], body, context, value, flags);
5492
5496
  } else if (same(value["originalOperationKind"], "streamBind") && same(value["terminalResult"], "ok")) {
5493
- if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["join"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["closed"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
5497
+ if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["join"] !== undefined || value["rejectionMessage"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["closed"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
5494
5498
  if (value["bindingGeneration"] === undefined) fail("bindingGeneration required");
5495
5499
 
5496
5500
 
@@ -5499,8 +5503,14 @@ function writeRequestSpecificTail(input: RequestSpecificTail, writer: Writer, co
5499
5503
 
5500
5504
 
5501
5505
  writeNonzeroU64(numeric(value["authorityOwnerGeneration"]), body, context, value, flags);
5506
+ } else if (same(value["originalOperationKind"], "streamBind") && same(value["terminalResult"], "rejected")) {
5507
+ if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["authorityOwnerGeneration"] !== undefined || value["join"] !== undefined || value["bindingGeneration"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["closed"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
5508
+ if (value["rejectionMessage"] === undefined) fail("rejectionMessage required");
5509
+
5510
+
5511
+ writeNonemptyText16(value["rejectionMessage"], body, context, value, flags);
5502
5512
  } else if (same(value["originalOperationKind"], "userSpotCreate") && same(value["terminalResult"], "ok")) {
5503
- if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["authorityOwnerGeneration"] !== undefined || value["join"] !== undefined || value["bindingGeneration"] !== undefined || value["closed"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
5513
+ if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["authorityOwnerGeneration"] !== undefined || value["join"] !== undefined || value["bindingGeneration"] !== undefined || value["rejectionMessage"] !== undefined || value["closed"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
5504
5514
  if (value["createResult"] === undefined) fail("createResult required");
5505
5515
 
5506
5516
 
@@ -5510,19 +5520,19 @@ function writeRequestSpecificTail(input: RequestSpecificTail, writer: Writer, co
5510
5520
 
5511
5521
  writeSpotRef(value["spot"], body, context, value, flags);
5512
5522
  } else if (same(value["originalOperationKind"], "userSpotClose") && same(value["terminalResult"], "ok")) {
5513
- if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["authorityOwnerGeneration"] !== undefined || value["join"] !== undefined || value["bindingGeneration"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
5523
+ if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["authorityOwnerGeneration"] !== undefined || value["join"] !== undefined || value["bindingGeneration"] !== undefined || value["rejectionMessage"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
5514
5524
  if (value["closed"] === undefined) fail("closed required");
5515
5525
 
5516
5526
 
5517
5527
  writeBool8(value["closed"], body, context, value, flags);
5518
5528
  } else if (same(value["originalOperationKind"], "actorCreate") && same(value["terminalResult"], "ok")) {
5519
- if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["authorityOwnerGeneration"] !== undefined || value["join"] !== undefined || value["bindingGeneration"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["closed"] !== undefined) fail("request-specific-tail discriminator agreement");
5529
+ if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["authorityOwnerGeneration"] !== undefined || value["join"] !== undefined || value["bindingGeneration"] !== undefined || value["rejectionMessage"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["closed"] !== undefined) fail("request-specific-tail discriminator agreement");
5520
5530
  if (value["creation"] === undefined) fail("creation required");
5521
5531
 
5522
5532
 
5523
5533
  writeActorCreateTerminal(value["creation"], body, context, value, flags);
5524
5534
  } else {
5525
- if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["authorityOwnerGeneration"] !== undefined || value["join"] !== undefined || value["bindingGeneration"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["closed"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
5535
+ if (value["actor"] !== undefined || value["spotId"] !== undefined || value["spotGeneration"] !== undefined || value["membershipEpoch"] !== undefined || value["authorityOwnerGeneration"] !== undefined || value["join"] !== undefined || value["bindingGeneration"] !== undefined || value["rejectionMessage"] !== undefined || value["createResult"] !== undefined || value["spot"] !== undefined || value["closed"] !== undefined || value["creation"] !== undefined) fail("request-specific-tail discriminator agreement");
5526
5536
 
5527
5537
  }
5528
5538
 
@@ -1,4 +1,4 @@
1
- // <auto-generated> DO NOT EDIT. schema-sha256: 9ccb179e5231ac7a42bfa09ab1b5b9ea942ee17567e0db19023a6cba30c2e044
1
+ // <auto-generated> DO NOT EDIT. schema-sha256: 1a066261b5770782bf4027d3d08723669d4092a085699963afb214872f27d710
2
2
  export interface ServiceWireRouteFence { readonly id: string; readonly generation: bigint; readonly targetNodeRid: Uint8Array; readonly targetNodeGeneration: bigint; readonly expectedAuthorityOwnerGeneration: bigint; readonly expectedOwnerLeaseGeneration: bigint; }
3
3
  export interface ApplicationPayloadEnvelopeV1 { readonly packetName: string; readonly contentType: string; readonly payload: Uint8Array; }
4
4
  export interface ActorJoin28 { readonly correlation: bigint; readonly actor: ServiceWireRouteFence; readonly entry: boolean; readonly targetSpot: ServiceWireRouteFence; readonly payload?: ApplicationPayloadEnvelopeV1; }
@@ -1,3 +1,5 @@
1
+ import { inspectRuntime } from '../internal-observation';
2
+ import { DEFAULT_REQUEST_TIMEOUT_MS } from '../../contracts/Configuration/Registration';
1
3
  import { encodeActorReply } from '../actors/actor-reply';
2
4
  import { boundSessionErrorPayload } from '../streams/bound-session-response-target';
3
5
  import { RELOCATED_REQUEST_OWNED_BY_REQUESTER } from '../actors/actor-handoff';
@@ -164,6 +166,7 @@ export {
164
166
  export { ZLinkPublicSpotManager, type ZLinkPublicSpotManagerOptions } from './spot-manager-public';
165
167
 
166
168
  export interface ZLinkSpotManagerOptions {
169
+ readonly defaultRequestTimeoutMs?: number;
167
170
  readonly spotFactories: readonly Type<ZLinkSpot>[];
168
171
  readonly instanceSpotFactories?: ReadonlyMap<
169
172
  string,
@@ -334,15 +337,23 @@ interface ZLinkTargetSpotCloseOperation {
334
337
  }
335
338
 
336
339
  export class DefaultZLinkSpotManager {
340
+ [inspectRuntime]() {
341
+ return Object.freeze({
342
+ activeActivationCount: this.activations.activeActivations().length,
343
+ hasCloseableActivation: (meshName: string, spotId: RoutingId) =>
344
+ this.activations.activationForClose(meshName, spotId) !== undefined
345
+ });
346
+ }
347
+
337
348
  private readonly factories: ReadonlySet<Type<ZLinkSpot>>;
338
- private readonly activations: ZLinkSpotActivationRegistry;
349
+ readonly activations: ZLinkSpotActivationRegistry;
339
350
  private readonly workerRuntime: ZLinkWorkerRuntime;
340
351
  private readonly locationClaim: ZLinkSpotLocationClaim;
341
352
  private readonly routedSpotPackets: ZLinkRoutedSpotPacketDispatch;
342
353
  private readonly actorMembership: ZLinkSpotActorMembership;
343
354
  private readonly activationLifecycle: ZLinkSpotActivationLifecycle;
344
355
  private readonly formalRemoteTransfers = new ZLinkFormalRemoteActorTransferRegistry();
345
- private readonly formalRemoteActorAdmissions = new ZLinkFormalRemoteActorAdmissionRegistry();
356
+ readonly formalRemoteActorAdmissions = new ZLinkFormalRemoteActorAdmissionRegistry();
346
357
  private readonly pendingInstanceMaterializations = new Map<
347
358
  string,
348
359
  Promise<ZLinkSpotActivation>
@@ -354,7 +365,7 @@ export class DefaultZLinkSpotManager {
354
365
  string,
355
366
  Map<string, Promise<ZLinkSpotActivation>>
356
367
  >();
357
- private readonly closeOperations = new Map<string, ZLinkTargetSpotCloseOperation>();
368
+ readonly closeOperations = new Map<string, ZLinkTargetSpotCloseOperation>();
358
369
  private readonly pendingInstanceTerminals = new Map<string, number>();
359
370
  private readonly pendingInstanceTerminalGenerations = new Map<string, Map<string, number>>();
360
371
  private readonly deferredInstanceAuthorityReleases = new Map<string, Set<bigint>>();
@@ -1159,14 +1170,15 @@ export class DefaultZLinkSpotManager {
1159
1170
  beginAuthority: (
1160
1171
  onCommitted: () => void
1161
1172
  ) => Promise<import('../locations/spot-location-claims').ZLinkInstanceClosingAuthority>,
1162
- signal?: AbortSignal
1173
+ signal?: AbortSignal,
1174
+ deadline?: Date
1163
1175
  ): Promise<boolean> {
1164
1176
  return await this.closeWithReason(
1165
1177
  meshName,
1166
1178
  spotId,
1167
1179
  signal,
1168
1180
  ZLinkSpotCloseReason.ExplicitClose,
1169
- undefined,
1181
+ deadline,
1170
1182
  beginAuthority
1171
1183
  );
1172
1184
  }
@@ -1222,6 +1234,11 @@ export class DefaultZLinkSpotManager {
1222
1234
  >,
1223
1235
  contextActivation?: ZLinkSpotActivation
1224
1236
  ): Promise<boolean> {
1237
+ if (reason === ZLinkSpotCloseReason.ExplicitClose) {
1238
+ deadline ??= new Date(
1239
+ Date.now() + (this.options.defaultRequestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS)
1240
+ );
1241
+ }
1225
1242
  requireMeshName(meshName);
1226
1243
  const key = `${meshName}\0${String(spotId)}`;
1227
1244
  let operation = this.closeOperations.get(key);
@@ -1590,7 +1607,9 @@ export class DefaultZLinkSpotManager {
1590
1607
  parts: readonly Message[],
1591
1608
  returnResponse = false,
1592
1609
  remoteBoundSessionTarget?: ZLinkRemoteBoundSessionTarget,
1593
- fallbackActorRef?: ActorRef
1610
+ fallbackActorRef?: ActorRef,
1611
+ requestTerminal?: (response: unknown) => Promise<void> | void,
1612
+ messageFollowOrigin?: ZLinkMessageFollowOrigin
1594
1613
  ): Promise<unknown> {
1595
1614
  const activation = this.activations.resolveUnique(spotId);
1596
1615
  if (activation === undefined) {
@@ -1603,7 +1622,9 @@ export class DefaultZLinkSpotManager {
1603
1622
  parts,
1604
1623
  returnResponse,
1605
1624
  remoteBoundSessionTarget,
1606
- fallbackActorRef
1625
+ fallbackActorRef,
1626
+ requestTerminal,
1627
+ messageFollowOrigin
1607
1628
  );
1608
1629
  }
1609
1630
 
@@ -1663,6 +1684,30 @@ export class DefaultZLinkSpotManager {
1663
1684
  return this.admitRoutedActorPacketPrefix(owner.spotId, actorId, records);
1664
1685
  }
1665
1686
 
1687
+ /** Runs an owner-side lifecycle decision in the Actor's existing execution gate. */
1688
+ executeActorTurn<T>(
1689
+ meshName: string,
1690
+ spotId: RoutingId | undefined,
1691
+ actorId: string,
1692
+ operation: () => Promise<T>
1693
+ ): Promise<T> {
1694
+ if (spotId === undefined) {
1695
+ if (this.options.executeEntryActor === undefined) {
1696
+ throw new ZLinkConfigurationException(
1697
+ `Entry Spot Actor '${actorId}' has no execution gate for MeshNode '${meshName}'.`
1698
+ );
1699
+ }
1700
+ return this.options.executeEntryActor(meshName, actorId, operation);
1701
+ }
1702
+ const activation = this.resolveApplicationActivation(spotId, meshName);
1703
+ if (activation === undefined) {
1704
+ throw new ZLinkConfigurationException(
1705
+ `Actor '${actorId}' has no active Spot execution gate for '${String(spotId)}'.`
1706
+ );
1707
+ }
1708
+ return activation.executeActor(actorId, operation);
1709
+ }
1710
+
1666
1711
  async dispatchRoutedSpotSend(
1667
1712
  spotId: RoutingId,
1668
1713
  packetName: string | undefined,
@@ -1735,7 +1780,8 @@ export class DefaultZLinkSpotManager {
1735
1780
  this.options.messageSerializers === undefined
1736
1781
  ? undefined
1737
1782
  : { serializers: this.options.messageSerializers };
1738
- const decodePayload = () => decodeChannelPayload(envelope, codecs);
1783
+ const decodePayload = (messageType?: Type) =>
1784
+ decodeChannelPayload(envelope, codecs, messageType);
1739
1785
  const context = {
1740
1786
  channelName: envelope.header.channelName,
1741
1787
  contentType: envelope.header.contentType,
@@ -1857,7 +1903,8 @@ export class DefaultZLinkSpotManager {
1857
1903
  this.options.messageSerializers === undefined
1858
1904
  ? undefined
1859
1905
  : { serializers: this.options.messageSerializers };
1860
- const decodePayload = () => decodeChannelPayload(envelope, codecs);
1906
+ const decodePayload = (messageType?: Type) =>
1907
+ decodeChannelPayload(envelope, codecs, messageType);
1861
1908
  const context = {
1862
1909
  channelName: envelope.header.channelName,
1863
1910
  contentType: envelope.header.contentType,
@@ -2231,7 +2278,7 @@ export class DefaultZLinkSpotManager {
2231
2278
  }
2232
2279
  }
2233
2280
 
2234
- private async dispatchMeshActorJoinCore(
2281
+ async dispatchMeshActorJoinCore(
2235
2282
  meshName: string,
2236
2283
  owner: ReadyRecord,
2237
2284
  record: ReceiveRecord,
@@ -13,7 +13,6 @@ import {
13
13
  createInternalFrameworkException
14
14
  } from '../framework-errors-internal';
15
15
  import type { ZLinkSpotActivation } from './spot-activation-state';
16
- import { ZLinkSpotLifecycleMetrics } from './spot-lifecycle-metrics';
17
16
  import type { ZLinkLocalSpotCreateResult } from './spot-manager-internal-contracts';
18
17
  const DEFAULT_ACTIVE_ACTIVATION_BATCH_SIZE = 64;
19
18
 
@@ -44,11 +43,12 @@ export class ZLinkSpotActivationRegistry {
44
43
  private readonly closing = new Map<string, ZLinkSpotCloseOperation>();
45
44
  private readonly failedClose = new Set<string>();
46
45
  private readonly emptyWaiters = new Set<() => void>();
47
- private readonly lifecycleMetrics: ZLinkSpotLifecycleMetrics;
48
46
  private activeScan: Iterator<ZLinkSpotActivation> | undefined;
49
47
 
50
- constructor(metrics?: import('../diagnostics').ZLinkRuntimeMetrics) {
51
- this.lifecycleMetrics = new ZLinkSpotLifecycleMetrics(metrics);
48
+ constructor(private readonly metrics?: import('../diagnostics').ZLinkRuntimeMetrics) {}
49
+
50
+ private recordPopulation(activation: ZLinkSpotActivation, delta: number): void {
51
+ this.metrics?.recordSpotCount(activation.meshName, activation.domain.kind, delta);
52
52
  }
53
53
 
54
54
  allocateSpotId(meshName: string): RoutingId {
@@ -99,7 +99,11 @@ export class ZLinkSpotActivationRegistry {
99
99
 
100
100
  finishClose(meshName: string, spotId: RoutingId): void {
101
101
  const key = spotActivationKey(meshName, spotId);
102
- if (this.activations.delete(key)) this.lifecycleMetrics.closed('user');
102
+ const activation = this.activations.get(key);
103
+ if (activation !== undefined) {
104
+ this.activations.delete(key);
105
+ this.recordPopulation(activation, -1);
106
+ }
103
107
  this.staged.delete(key);
104
108
  this.failedClose.delete(key);
105
109
  this.resolveEmptyWaiters();
@@ -172,7 +176,7 @@ export class ZLinkSpotActivationRegistry {
172
176
  }
173
177
  if (existing === undefined) {
174
178
  this.activations.set(key, activation);
175
- this.lifecycleMetrics.opened('user');
179
+ this.recordPopulation(activation, 1);
176
180
  }
177
181
  return this.staged.has(key) ? undefined : activation;
178
182
  }
@@ -197,7 +201,7 @@ export class ZLinkSpotActivationRegistry {
197
201
  this.activations.delete(key);
198
202
  this.staged.delete(key);
199
203
  this.failedClose.delete(key);
200
- this.lifecycleMetrics.closed('user');
204
+ this.recordPopulation(activation, -1);
201
205
  this.resolveEmptyWaiters();
202
206
  return activation;
203
207
  }
@@ -240,7 +244,7 @@ export class ZLinkSpotActivationRegistry {
240
244
  if (completed || resourcesReleased(activation)) {
241
245
  this.activations.delete(key);
242
246
  this.staged.delete(key);
243
- this.lifecycleMetrics.closed('user');
247
+ this.recordPopulation(activation, -1);
244
248
  this.failedClose.delete(key);
245
249
  } else {
246
250
  this.failedClose.add(key);
@@ -19,6 +19,7 @@ import { ZLinkSpotSerialTurnExecutor } from './spot-serial-turn-executor';
19
19
  import { ZLinkSpotSerialExecutor, type ZLinkActorPacketTurnDispatch } from './spot-serial-executor';
20
20
  import type { ZLinkSpotTimerRegistry } from './spot-timer';
21
21
  import type { ZLinkSpotActorJoinDispatch } from './spot-actor-join-dispatch';
22
+ import type { ZLinkSpotActorPacketDispatch } from './spot-actor-packet-dispatch';
22
23
  import { ZLinkExecutionBarrier, type ZLinkExecutionBarrierSeal } from '../execution';
23
24
  import type { ZLinkTimerRelocationState } from './spot-timer';
24
25
 
@@ -71,6 +72,7 @@ export class ZLinkSpotActivation {
71
72
  readonly nativeSpot?: ZLinkBackendSpot;
72
73
  readonly executionBarrier: ZLinkExecutionBarrier;
73
74
  actorDispatch?: ZLinkSpotActorJoinDispatch;
75
+ actorPacketDispatch?: ZLinkSpotActorPacketDispatch;
74
76
 
75
77
  private readonly joinedActors = new Map<string, ZLinkActor>();
76
78
  private readonly departedActorIds = new Set<string>();
@@ -16,6 +16,7 @@ import { routingIdsEqual } from '../routing-id';
16
16
  import type { ZLinkSpotActivationLifecycleOptions } from './spot-activation';
17
17
  import { ZLinkSpotActivation } from './spot-activation-state';
18
18
  import { ZLinkSpotActorJoinDispatch } from './spot-actor-join-dispatch';
19
+ import type { ZLinkActorPacketExecution } from './spot-actor-packet-dispatch';
19
20
  import { ZLinkSpotActorPacketDispatch } from './spot-actor-packet-dispatch';
20
21
  import type { ZLinkSpotSerialTurnExecutor } from './spot-serial-turn-executor';
21
22
 
@@ -51,26 +52,23 @@ export class ZLinkSpotActorAdmissionCoordinator {
51
52
  requestTerminal?: (response: unknown) => Promise<void> | void,
52
53
  messageFollowOrigin?: ZLinkMessageFollowOrigin
53
54
  ): Promise<unknown> {
54
- const handoff = this.options.actorHandoffRuntime?.capture(
55
- origin,
56
- actorId,
57
- parts,
58
- returnResponse,
59
- remoteBoundSessionTarget,
60
- fallbackActorRef,
61
- undefined,
62
- messageFollowOrigin
63
- );
64
- if (handoff !== undefined) return await handoff;
65
- return await this.dispatchActorPacketDirect(
66
- origin,
67
- activation,
68
- actorId,
69
- parts,
70
- returnResponse,
71
- remoteBoundSessionTarget,
72
- fallbackActorRef,
73
- requestTerminal
55
+ return dispatchActorPacketInMailbox<ZLinkSpotSerialTurnExecutor>(
56
+ (operation) => activation.executeActor(actorId, operation),
57
+ (serial) =>
58
+ this.actorPacketDispatch(activation).admitDelivery(
59
+ serial,
60
+ {
61
+ origin,
62
+ actorId,
63
+ parts,
64
+ returnResponse,
65
+ remoteBoundSessionTarget,
66
+ fallbackActorRef,
67
+ requestTerminal,
68
+ messageFollowOrigin
69
+ },
70
+ this.options.actorHandoffRuntime
71
+ )
74
72
  );
75
73
  }
76
74
 
@@ -87,7 +85,7 @@ export class ZLinkSpotActorAdmissionCoordinator {
87
85
  ),
88
86
  serial: activation.serial,
89
87
  actors: {
90
- resolveActor: (actorId) => this.resolveActor(activation, actorId),
88
+ resolveActor: (actorId) => this.resolveLifecycleActor(activation, actorId),
91
89
  getTarget: () => activation.spot,
92
90
  defaultAccept: false,
93
91
  transfer:
@@ -110,7 +108,9 @@ export class ZLinkSpotActorAdmissionCoordinator {
110
108
  delivery.parts,
111
109
  delivery.returnResponse,
112
110
  delivery.remoteBoundSessionTarget,
113
- delivery.fallbackActorRef
111
+ delivery.fallbackActorRef,
112
+ delivery.requestTerminal,
113
+ delivery.messageFollowOrigin
114
114
  ),
115
115
  bindRemoteSession: (actor, sourceNodeRid, sourceSessionRid) => {
116
116
  const node = this.options.nativeSpotNodeProvider?.(activation.meshName);
@@ -202,13 +202,30 @@ export class ZLinkSpotActorAdmissionCoordinator {
202
202
  fallbackActorRef?: ActorRef,
203
203
  requestTerminal?: (response: unknown) => Promise<void> | void
204
204
  ): Promise<unknown> {
205
- return new ZLinkSpotActorPacketDispatch({
205
+ return this.actorPacketDispatch(activation).dispatch(
206
+ actorSerial,
207
+ origin,
208
+ actorId,
209
+ parts,
210
+ returnResponse,
211
+ remoteBoundSessionTarget,
212
+ fallbackActorRef,
213
+ requestTerminal
214
+ );
215
+ }
216
+
217
+ private actorPacketDispatch(activation: ZLinkSpotActivation): ZLinkSpotActorPacketDispatch {
218
+ if (activation.actorPacketDispatch !== undefined) return activation.actorPacketDispatch;
219
+ activation.actorPacketDispatch = new ZLinkSpotActorPacketDispatch({
220
+ admission: this.options.admission,
206
221
  spot: activation.spot,
207
222
  spotId: () => String(activation.spotId),
208
223
  registry: activation.actorHandlers,
209
- serial: actorSerial,
210
- resolveActor: (targetActorId) => this.resolveActor(activation, targetActorId),
211
- actorLeft: (targetActorId) => activation.hasDepartedActor(targetActorId),
224
+ resolveActor: (targetActorId) =>
225
+ this.options.actorResolver === undefined
226
+ ? activation.resolveJoinedActor(targetActorId)
227
+ : this.options.actorResolver(targetActorId),
228
+ hasDepartedActor: (targetActorId) => activation.hasDepartedActor(targetActorId),
212
229
  onDisconnectActor: (actor) =>
213
230
  activation.serial.execute(() => activation.spot.onDisconnectActor?.(actor)),
214
231
  actorResponseSender: this.options.boundSessionRuntime?.sendActorResponse.bind(
@@ -221,18 +238,15 @@ export class ZLinkSpotActorAdmissionCoordinator {
221
238
  messageSerializers: this.options.messageSerializers,
222
239
  dispatchErrors: this.options.dispatchErrors,
223
240
  routeToActorJoinPrewarm: this.options.routeToActorJoinPrewarm
224
- }).dispatch(
225
- origin,
226
- actorId,
227
- parts,
228
- returnResponse,
229
- remoteBoundSessionTarget,
230
- fallbackActorRef,
231
- requestTerminal
232
- );
241
+ });
242
+ return activation.actorPacketDispatch;
233
243
  }
234
244
 
235
- private resolveActor(activation: ZLinkSpotActivation, actorId: string): ZLinkActor | undefined {
245
+ /** Resolves native lifecycle records; messages use resolveActorIngress. */
246
+ private resolveLifecycleActor(
247
+ activation: ZLinkSpotActivation,
248
+ actorId: string
249
+ ): ZLinkActor | undefined {
236
250
  if (activation.hasDepartedActor(actorId)) return undefined;
237
251
  // The manager owns relocation visibility. Membership alone cannot publish
238
252
  // a staged Actor; resolver absence supports standalone Spot runtimes.
@@ -241,7 +255,7 @@ export class ZLinkSpotActorAdmissionCoordinator {
241
255
  : this.options.actorResolver(actorId);
242
256
  }
243
257
 
244
- private async commitTransferredActorTransaction(
258
+ async commitTransferredActorTransaction(
245
259
  activation: ZLinkSpotActivation,
246
260
  actor: ZLinkActor,
247
261
  backlog: readonly ZLinkActorHandoffPacket[],
@@ -315,3 +329,14 @@ function requireBackendValueFactory<T>(factory: (() => T) | undefined, valueName
315
329
  return factory();
316
330
  };
317
331
  }
332
+
333
+ /** Releases the Actor FIFO before awaiting a transferred admission terminal. */
334
+ export async function dispatchActorPacketInMailbox<TSerial>(
335
+ enqueue: (
336
+ operation: (serial: TSerial) => Promise<ZLinkActorPacketExecution>
337
+ ) => Promise<ZLinkActorPacketExecution>,
338
+ dispatch: (serial: TSerial) => Promise<ZLinkActorPacketExecution>
339
+ ): Promise<unknown> {
340
+ const result = await enqueue(dispatch);
341
+ return 'terminal' in result ? await result.terminal : result.response;
342
+ }
@@ -0,0 +1,157 @@
1
+ import { actorMessageFollowContext } from '../actors/actor-message-follow-context';
2
+ import type { ActorRef, ZLinkActor } from '../../contracts';
3
+ import type { Message } from '../../contracts/Common/Message';
4
+ import type {
5
+ ZLinkActorPacketDelivery,
6
+ ZLinkActorRequestTerminal
7
+ } from './spot-actor-packet-dispatch';
8
+ import type { ZLinkRemoteBoundSessionTarget } from '../actors';
9
+ import type { ApplicationJobOrigin } from '../application-jobs/contracts';
10
+ import type { ZLinkSpotActorHandoffRuntime } from './spot-runtime-ports';
11
+ import {
12
+ ZLinkFrameworkInternalErrorKind,
13
+ createInternalFrameworkException
14
+ } from '../framework-errors-internal';
15
+
16
+ /** Parks an exact Actor incarnation while its accepted Join prepares the target. */
17
+ export type ZLinkRouteToActorJoinPrewarm = (
18
+ actorId: string,
19
+ objectGeneration: bigint,
20
+ arrival: {
21
+ readonly origin: ApplicationJobOrigin;
22
+ readonly header: Buffer;
23
+ readonly payload: Buffer;
24
+ readonly returnResponse: boolean;
25
+ readonly remoteBoundSessionTarget?: ZLinkRemoteBoundSessionTarget;
26
+ readonly fallbackActorRef?: ActorRef;
27
+ readonly requestTerminal?: ZLinkActorRequestTerminal;
28
+ readonly resolve: (value: unknown) => void;
29
+ readonly reject: (reason: unknown) => void;
30
+ }
31
+ ) => 'parked' | 'not-found';
32
+
33
+ export type ZLinkActorIngressRoute = (
34
+ delivery: ZLinkActorPacketDelivery
35
+ ) => { readonly handled: boolean; readonly response?: unknown } | undefined;
36
+
37
+ export type ZLinkActorIngressAdmission =
38
+ | { readonly kind: 'local'; readonly actor: ZLinkActor }
39
+ | { readonly kind: 'follow' | 'prewarm'; readonly terminal: Promise<unknown> }
40
+ | { readonly kind: 'stale'; readonly error: ReturnType<typeof createInternalFrameworkException> };
41
+
42
+ /** Fixes one packet owner synchronously at the Actor FIFO head. */
43
+ export function resolveActorIngress(
44
+ delivery: ZLinkActorPacketDelivery,
45
+ request: boolean,
46
+ options: {
47
+ readonly handoffRuntime?: ZLinkSpotActorHandoffRuntime;
48
+ readonly routeBeforeLocal?: ZLinkActorIngressRoute;
49
+ readonly resolveActor: (actorId: string) => ZLinkActor | undefined;
50
+ readonly hasDepartedActor?: (actorId: string) => boolean;
51
+ readonly routeToActorJoinPrewarm?: ZLinkRouteToActorJoinPrewarm;
52
+ }
53
+ ): ZLinkActorIngressAdmission {
54
+ const handoff = options.handoffRuntime?.capture(
55
+ delivery.origin,
56
+ delivery.actorId,
57
+ delivery.parts,
58
+ delivery.returnResponse,
59
+ delivery.remoteBoundSessionTarget,
60
+ delivery.fallbackActorRef,
61
+ undefined,
62
+ delivery.messageFollowOrigin
63
+ );
64
+ if (handoff !== undefined) return { kind: 'follow', terminal: handoff };
65
+ const route = options.routeBeforeLocal?.(delivery);
66
+ if (route?.handled === true) return { kind: 'follow', terminal: Promise.resolve(route.response) };
67
+ const actor =
68
+ options.hasDepartedActor?.(delivery.actorId) === true
69
+ ? undefined
70
+ : options.resolveActor(delivery.actorId);
71
+ if (actor !== undefined) return { kind: 'local', actor };
72
+ if (
73
+ options.routeToActorJoinPrewarm !== undefined &&
74
+ delivery.fallbackActorRef !== undefined &&
75
+ (!request || delivery.returnResponse || delivery.requestTerminal !== undefined)
76
+ ) {
77
+ const parked = parkForActorJoinPrewarm(
78
+ delivery.origin,
79
+ options.routeToActorJoinPrewarm,
80
+ delivery.actorId,
81
+ delivery.parts,
82
+ request,
83
+ delivery.returnResponse,
84
+ delivery.remoteBoundSessionTarget,
85
+ delivery.fallbackActorRef,
86
+ delivery.requestTerminal
87
+ );
88
+ if (parked !== undefined) return { kind: 'prewarm', terminal: parked };
89
+ }
90
+ return {
91
+ kind: 'stale',
92
+ error: createInternalFrameworkException(
93
+ actorMessageFollowContext(delivery.fallbackActorRef) === undefined
94
+ ? ZLinkFrameworkInternalErrorKind.ActorRouteNotFound
95
+ : ZLinkFrameworkInternalErrorKind.ActorLocationStale,
96
+ `SPOT actor is not registered locally: ${delivery.actorId}`
97
+ )
98
+ };
99
+ }
100
+
101
+ function parkForActorJoinPrewarm(
102
+ origin: ApplicationJobOrigin,
103
+ routeToActorJoinPrewarm: ZLinkRouteToActorJoinPrewarm,
104
+ actorId: string,
105
+ parts: readonly Message[],
106
+ isRequest: boolean,
107
+ returnResponse: boolean,
108
+ remoteBoundSessionTarget: ZLinkRemoteBoundSessionTarget | undefined,
109
+ fallbackActorRef: ActorRef,
110
+ requestTerminal: ZLinkActorRequestTerminal | undefined
111
+ ): Promise<unknown> | undefined {
112
+ let resolve: (value: unknown) => void = () => undefined;
113
+ let reject: (reason: unknown) => void = () => undefined;
114
+ const result = new Promise<unknown>((res, rej) => {
115
+ resolve = res;
116
+ reject = rej;
117
+ });
118
+ // A Request's real reply must still travel through the exact mailbox
119
+ // correlation the original caller captured in `requestTerminal` — not
120
+ // through this method's own return value, which the caller only uses
121
+ // to decide whether it still owes a reply itself. Wrapping keeps that
122
+ // reply route intact across the (possibly much later) redelivery at
123
+ // migration time while also releasing the original caller once the
124
+ // real reply has gone out, so it never sends a premature empty one.
125
+ const wrappedRequestTerminal: ZLinkActorRequestTerminal | undefined =
126
+ requestTerminal === undefined
127
+ ? undefined
128
+ : Object.assign(
129
+ async (response: unknown, preparedReply?: unknown) => {
130
+ try {
131
+ await requestTerminal(response, preparedReply);
132
+ resolve(undefined);
133
+ } catch (error) {
134
+ reject(error);
135
+ throw error;
136
+ }
137
+ },
138
+ { prepare: requestTerminal.prepare }
139
+ );
140
+ const route = routeToActorJoinPrewarm(actorId, fallbackActorRef.objectGeneration, {
141
+ origin,
142
+ header: Buffer.from(parts[0].data()),
143
+ payload: Buffer.from(parts[1].data()),
144
+ returnResponse,
145
+ remoteBoundSessionTarget,
146
+ fallbackActorRef,
147
+ requestTerminal: wrappedRequestTerminal,
148
+ resolve,
149
+ reject
150
+ });
151
+ if (route !== 'parked') return undefined;
152
+ // A Send has no reply to wait for: the migrated redelivery still runs
153
+ // in order later, but this caller's own await is done once parking is
154
+ // confirmed.
155
+ if (!isRequest) resolve(undefined);
156
+ return result;
157
+ }