@zlink-systems/framework 0.30.1 → 0.30.2

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 (340) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
  3. package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
  4. package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
  5. package/dist/contracts/Common/encoded-payload-storage.js +5 -2
  6. package/dist/contracts/Configuration/Builders.d.ts +1 -1
  7. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
  8. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
  9. package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
  10. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  11. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
  12. package/dist/contracts/Locations/Rows.d.ts +2 -0
  13. package/dist/contracts/Spots/Contracts.d.ts +4 -0
  14. package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
  15. package/dist/runtime/abort.d.ts +5 -0
  16. package/dist/runtime/abort.js +10 -0
  17. package/dist/runtime/actors/actor-authority-publication.js +3 -2
  18. package/dist/runtime/actors/actor-client.d.ts +0 -1
  19. package/dist/runtime/actors/actor-client.js +38 -45
  20. package/dist/runtime/actors/actor-context.d.ts +2 -0
  21. package/dist/runtime/actors/actor-context.js +46 -9
  22. package/dist/runtime/actors/actor-handoff.d.ts +7 -3
  23. package/dist/runtime/actors/actor-handoff.js +212 -88
  24. package/dist/runtime/actors/actor-join-relocation.d.ts +2 -0
  25. package/dist/runtime/actors/actor-local-native-join.js +4 -0
  26. package/dist/runtime/actors/actor-mailbox.js +27 -1
  27. package/dist/runtime/actors/actor-remote-joiner.js +3 -1
  28. package/dist/runtime/actors/actor-reply.d.ts +4 -0
  29. package/dist/runtime/actors/actor-reply.js +29 -0
  30. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
  31. package/dist/runtime/actors/actor-runtime-state.js +2 -20
  32. package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
  33. package/dist/runtime/actors/index.d.ts +6 -2
  34. package/dist/runtime/actors/index.js +37 -21
  35. package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
  36. package/dist/runtime/actors/session-disconnected-wire.js +48 -0
  37. package/dist/runtime/admission.d.ts +9 -1
  38. package/dist/runtime/admission.js +55 -32
  39. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +13 -0
  40. package/dist/runtime/application-jobs/application-job-queue-scope.js +27 -1
  41. package/dist/runtime/application-jobs/contracts.d.ts +2 -0
  42. package/dist/runtime/backend/contracts/index.d.ts +19 -3
  43. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
  44. package/dist/runtime/backend/mesh-completion-table.js +5 -0
  45. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +26 -2
  46. package/dist/runtime/backend/mesh-dispatch-pump.js +193 -107
  47. package/dist/runtime/backend/node/node-raw-binding-port.js +90 -58
  48. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +33 -8
  49. package/dist/runtime/backend/node/node-raw-mesh-backend.js +142 -143
  50. package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
  51. package/dist/runtime/backend/node/node-socket-backend-adapter.js +5 -5
  52. package/dist/runtime/channels/channel-clients.d.ts +1 -0
  53. package/dist/runtime/channels/channel-clients.js +20 -5
  54. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +22 -3
  55. package/dist/runtime/channels/channel-dispatch-pipeline.js +103 -57
  56. package/dist/runtime/channels/channel-dispatchers.d.ts +3 -2
  57. package/dist/runtime/channels/channel-dispatchers.js +44 -37
  58. package/dist/runtime/channels/channel-envelope.d.ts +1 -0
  59. package/dist/runtime/channels/channel-envelope.js +74 -31
  60. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
  61. package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
  62. package/dist/runtime/channels/channel-runtime-manager.d.ts +3 -2
  63. package/dist/runtime/channels/channel-runtime-manager.js +4 -4
  64. package/dist/runtime/channels/channel-transports.d.ts +0 -1
  65. package/dist/runtime/channels/channel-transports.js +35 -33
  66. package/dist/runtime/channels/client-server-location-runtime.js +5 -4
  67. package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
  68. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  69. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  70. package/dist/runtime/channels/fanout-location-runtime.js +3 -3
  71. package/dist/runtime/diagnostics/flow-context.js +19 -7
  72. package/dist/runtime/diagnostics/index.js +4 -9
  73. package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
  74. package/dist/runtime/diagnostics/message-flow.js +35 -5
  75. package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
  76. package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
  77. package/dist/runtime/execution/index.d.ts +4 -2
  78. package/dist/runtime/execution/index.js +33 -10
  79. package/dist/runtime/execution/serial-execution-queue.d.ts +4 -0
  80. package/dist/runtime/execution/serial-execution-queue.js +21 -2
  81. package/dist/runtime/execution/state-lane.d.ts +2 -0
  82. package/dist/runtime/execution/state-lane.js +5 -0
  83. package/dist/runtime/foundation/operation-registry.d.ts +25 -1
  84. package/dist/runtime/foundation/operation-registry.js +86 -18
  85. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +39 -3
  86. package/dist/runtime/foundation/raw-service-mesh-runtime.js +151 -55
  87. package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
  88. package/dist/runtime/foundation/service-liveness-registry.js +38 -0
  89. package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
  90. package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
  91. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -3
  92. package/dist/runtime/foundation/service-relocation-object-owner.js +48 -35
  93. package/dist/runtime/foundation/service-relocation-runtime.js +7 -3
  94. package/dist/runtime/foundation/service-runtime-contracts.d.ts +8 -1
  95. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
  96. package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
  97. package/dist/runtime/foundation/service-stateful-registry.js +24 -26
  98. package/dist/runtime/foundation/service-stateful-runtime.d.ts +72 -6
  99. package/dist/runtime/foundation/service-stateful-runtime.js +444 -117
  100. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -1
  101. package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
  102. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
  103. package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
  104. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  105. package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
  106. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +10 -0
  107. package/dist/runtime/foundation/service-wire-m6a-codec.js +166 -53
  108. package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
  109. package/dist/runtime/host/actor-packet-relay.js +59 -72
  110. package/dist/runtime/host/actor-placement-coordinator.js +25 -8
  111. package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
  112. package/dist/runtime/host/actor-transfer-runtime.js +85 -331
  113. package/dist/runtime/host/application-job-queue.d.ts +24 -3
  114. package/dist/runtime/host/application-job-queue.js +28 -41
  115. package/dist/runtime/host/index.d.ts +5 -1
  116. package/dist/runtime/host/index.js +171 -97
  117. package/dist/runtime/host/location-runtime-owner.js +2 -6
  118. package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
  119. package/dist/runtime/host/mesh-router-resolver.js +14 -6
  120. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
  121. package/dist/runtime/host/remote-bound-session-relay.js +71 -190
  122. package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
  123. package/dist/runtime/host/route-mesh-runtime.js +5 -3
  124. package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
  125. package/dist/runtime/host/runtime-shutdown.js +3 -2
  126. package/dist/runtime/host/service-relocation-host-runtime.d.ts +17 -7
  127. package/dist/runtime/host/service-relocation-host-runtime.js +550 -367
  128. package/dist/runtime/host/spot-runtime-options-factory.js +15 -7
  129. package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
  130. package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
  131. package/dist/runtime/locations/auto-connect-loop.js +22 -14
  132. package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
  133. package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
  134. package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
  135. package/dist/runtime/locations/descriptor-publication.js +11 -0
  136. package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
  137. package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
  138. package/dist/runtime/locations/in-memory-authority-store.js +56 -19
  139. package/dist/runtime/locations/in-memory-location-store.js +1 -10
  140. package/dist/runtime/locations/index.d.ts +1 -0
  141. package/dist/runtime/locations/index.js +1 -0
  142. package/dist/runtime/locations/lease-tracker.js +1 -6
  143. package/dist/runtime/locations/location-store-repository.d.ts +51 -1
  144. package/dist/runtime/locations/location-store-repository.js +363 -139
  145. package/dist/runtime/locations/relocation-blob.d.ts +18 -1
  146. package/dist/runtime/locations/relocation-blob.js +52 -1
  147. package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
  148. package/dist/runtime/locations/request-source-resolver.js +80 -0
  149. package/dist/runtime/locations/resolvers.js +1 -1
  150. package/dist/runtime/locations/runtime.d.ts +6 -2
  151. package/dist/runtime/locations/runtime.js +37 -30
  152. package/dist/runtime/messaging/payload-codec.d.ts +7 -1
  153. package/dist/runtime/messaging/payload-codec.js +7 -6
  154. package/dist/runtime/messaging/request-result.js +29 -26
  155. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +19 -1
  156. package/dist/runtime/protocol/service_wire_codec.generated.js +85 -0
  157. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +7 -1
  158. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +23 -7
  159. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +3 -2
  160. package/dist/runtime/spots/index.d.ts +18 -11
  161. package/dist/runtime/spots/index.js +234 -176
  162. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
  163. package/dist/runtime/spots/spot-activation-registry.js +21 -11
  164. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  165. package/dist/runtime/spots/spot-activation-state.js +7 -7
  166. package/dist/runtime/spots/spot-activation.d.ts +6 -3
  167. package/dist/runtime/spots/spot-activation.js +123 -44
  168. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
  169. package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
  170. package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
  171. package/dist/runtime/spots/spot-actor-membership.js +0 -8
  172. package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
  173. package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
  174. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
  175. package/dist/runtime/spots/spot-entry-activation.js +14 -9
  176. package/dist/runtime/spots/spot-handler-registry.d.ts +4 -3
  177. package/dist/runtime/spots/spot-handler-registry.js +6 -2
  178. package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
  179. package/dist/runtime/spots/spot-manager-public.js +2 -2
  180. package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
  181. package/dist/runtime/spots/spot-node-autoconnect.js +18 -39
  182. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
  183. package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
  184. package/dist/runtime/spots/spot-outbound.js +3 -3
  185. package/dist/runtime/spots/spot-remote-codec.js +5 -1
  186. package/dist/runtime/spots/spot-runtime-ports.d.ts +0 -1
  187. package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
  188. package/dist/runtime/spots/spot-serial-executor.js +61 -8
  189. package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
  190. package/dist/runtime/spots/spot-subscription-dispatch.js +1 -1
  191. package/dist/runtime/spots/spot-timer.d.ts +57 -5
  192. package/dist/runtime/spots/spot-timer.js +287 -103
  193. package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
  194. package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
  195. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
  196. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
  197. package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
  198. package/dist/runtime/streams/bound-session-service.d.ts +1 -1
  199. package/dist/runtime/streams/bound-session-service.js +6 -11
  200. package/dist/runtime/streams/index.d.ts +3 -2
  201. package/dist/runtime/streams/index.js +6 -4
  202. package/dist/runtime/streams/managed-stream.js +3 -2
  203. package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
  204. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
  205. package/dist/runtime/streams/session-actor-coordinator.js +15 -32
  206. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
  207. package/dist/runtime/streams/stream-session-runtime.js +1 -4
  208. package/dist/runtime/workers/index.js +1 -1
  209. package/package.json +3 -3
  210. package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
  211. package/src/contracts/Common/encoded-payload-storage.ts +6 -3
  212. package/src/contracts/Configuration/Builders.ts +4 -1
  213. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
  214. package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
  215. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  216. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
  217. package/src/contracts/Locations/Rows.ts +2 -0
  218. package/src/contracts/Spots/Contracts.ts +8 -0
  219. package/src/contracts/Spots/ZLinkSpot.ts +3 -3
  220. package/src/runtime/abort.ts +12 -0
  221. package/src/runtime/actors/actor-authority-publication.ts +3 -2
  222. package/src/runtime/actors/actor-client.ts +61 -70
  223. package/src/runtime/actors/actor-context.ts +49 -9
  224. package/src/runtime/actors/actor-handoff.ts +282 -106
  225. package/src/runtime/actors/actor-join-relocation.ts +2 -0
  226. package/src/runtime/actors/actor-local-native-join.ts +4 -0
  227. package/src/runtime/actors/actor-mailbox.ts +40 -2
  228. package/src/runtime/actors/actor-remote-joiner.ts +6 -1
  229. package/src/runtime/actors/actor-reply.ts +42 -0
  230. package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
  231. package/src/runtime/actors/actor-runtime-state.ts +2 -20
  232. package/src/runtime/actors/actor-source-transfer.ts +1 -34
  233. package/src/runtime/actors/index.ts +41 -27
  234. package/src/runtime/actors/session-disconnected-wire.ts +66 -0
  235. package/src/runtime/admission.ts +69 -34
  236. package/src/runtime/application-jobs/application-job-queue-scope.ts +33 -1
  237. package/src/runtime/application-jobs/contracts.ts +2 -0
  238. package/src/runtime/backend/contracts/index.ts +39 -4
  239. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
  240. package/src/runtime/backend/mesh-completion-table.ts +4 -0
  241. package/src/runtime/backend/mesh-dispatch-pump.ts +223 -124
  242. package/src/runtime/backend/node/node-raw-binding-port.ts +106 -70
  243. package/src/runtime/backend/node/node-raw-mesh-backend.ts +221 -170
  244. package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -5
  245. package/src/runtime/channels/channel-clients.ts +49 -24
  246. package/src/runtime/channels/channel-dispatch-pipeline.ts +173 -124
  247. package/src/runtime/channels/channel-dispatchers.ts +116 -72
  248. package/src/runtime/channels/channel-envelope.ts +105 -36
  249. package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
  250. package/src/runtime/channels/channel-runtime-manager.ts +12 -5
  251. package/src/runtime/channels/channel-transports.ts +49 -58
  252. package/src/runtime/channels/client-server-location-runtime.ts +11 -10
  253. package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
  254. package/src/runtime/channels/fanout-location-runtime.ts +17 -9
  255. package/src/runtime/diagnostics/flow-context.ts +20 -7
  256. package/src/runtime/diagnostics/index.ts +1 -7
  257. package/src/runtime/diagnostics/message-flow.ts +47 -9
  258. package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
  259. package/src/runtime/execution/index.ts +40 -14
  260. package/src/runtime/execution/serial-execution-queue.ts +31 -4
  261. package/src/runtime/execution/state-lane.ts +7 -0
  262. package/src/runtime/foundation/operation-registry.ts +98 -20
  263. package/src/runtime/foundation/raw-service-mesh-runtime.ts +244 -67
  264. package/src/runtime/foundation/service-liveness-registry.ts +39 -0
  265. package/src/runtime/foundation/service-mailbox.ts +8 -0
  266. package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
  267. package/src/runtime/foundation/service-relocation-object-owner.ts +54 -37
  268. package/src/runtime/foundation/service-relocation-runtime.ts +7 -3
  269. package/src/runtime/foundation/service-runtime-contracts.ts +12 -1
  270. package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
  271. package/src/runtime/foundation/service-stateful-registry.ts +38 -35
  272. package/src/runtime/foundation/service-stateful-runtime.ts +667 -152
  273. package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -11
  274. package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
  275. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  276. package/src/runtime/foundation/service-wire-m6a-codec.ts +187 -51
  277. package/src/runtime/host/actor-packet-relay.ts +113 -94
  278. package/src/runtime/host/actor-placement-coordinator.ts +31 -8
  279. package/src/runtime/host/actor-transfer-runtime.ts +104 -430
  280. package/src/runtime/host/application-job-queue.ts +29 -44
  281. package/src/runtime/host/index.ts +286 -129
  282. package/src/runtime/host/location-runtime-owner.ts +2 -6
  283. package/src/runtime/host/mesh-router-resolver.ts +13 -5
  284. package/src/runtime/host/remote-bound-session-relay.ts +86 -248
  285. package/src/runtime/host/route-mesh-runtime.ts +11 -5
  286. package/src/runtime/host/runtime-shutdown.ts +15 -4
  287. package/src/runtime/host/service-relocation-host-runtime.ts +784 -475
  288. package/src/runtime/host/spot-runtime-options-factory.ts +18 -7
  289. package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
  290. package/src/runtime/locations/auto-connect-loop.ts +22 -14
  291. package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
  292. package/src/runtime/locations/auto-connect-types.ts +0 -1
  293. package/src/runtime/locations/descriptor-publication.ts +7 -0
  294. package/src/runtime/locations/domain-store-contract.ts +5 -0
  295. package/src/runtime/locations/in-memory-authority-store.ts +85 -23
  296. package/src/runtime/locations/in-memory-location-store.ts +1 -12
  297. package/src/runtime/locations/index.ts +1 -0
  298. package/src/runtime/locations/lease-tracker.ts +2 -9
  299. package/src/runtime/locations/location-store-repository.ts +628 -152
  300. package/src/runtime/locations/relocation-blob.ts +75 -1
  301. package/src/runtime/locations/request-source-resolver.ts +138 -0
  302. package/src/runtime/locations/resolvers.ts +2 -2
  303. package/src/runtime/locations/runtime.ts +70 -40
  304. package/src/runtime/messaging/payload-codec.ts +8 -11
  305. package/src/runtime/messaging/request-result.ts +33 -29
  306. package/src/runtime/protocol/service_wire_codec.generated.ts +87 -4
  307. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +13 -10
  308. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +3 -2
  309. package/src/runtime/spots/index.ts +375 -281
  310. package/src/runtime/spots/spot-activation-registry.ts +25 -13
  311. package/src/runtime/spots/spot-activation-state.ts +12 -19
  312. package/src/runtime/spots/spot-activation.ts +170 -86
  313. package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
  314. package/src/runtime/spots/spot-actor-membership.ts +0 -15
  315. package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
  316. package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
  317. package/src/runtime/spots/spot-entry-activation.ts +24 -19
  318. package/src/runtime/spots/spot-handler-registry.ts +15 -4
  319. package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
  320. package/src/runtime/spots/spot-manager-public.ts +2 -2
  321. package/src/runtime/spots/spot-node-autoconnect.ts +22 -45
  322. package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
  323. package/src/runtime/spots/spot-outbound.ts +3 -3
  324. package/src/runtime/spots/spot-remote-codec.ts +9 -2
  325. package/src/runtime/spots/spot-runtime-ports.ts +0 -1
  326. package/src/runtime/spots/spot-serial-executor.ts +97 -25
  327. package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
  328. package/src/runtime/spots/spot-subscription-dispatch.ts +1 -1
  329. package/src/runtime/spots/spot-timer.ts +413 -157
  330. package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
  331. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
  332. package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
  333. package/src/runtime/streams/bound-session-service.ts +7 -10
  334. package/src/runtime/streams/index.ts +12 -6
  335. package/src/runtime/streams/managed-stream.ts +4 -2
  336. package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
  337. package/src/runtime/streams/session-actor-coordinator.ts +39 -88
  338. package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
  339. package/src/runtime/streams/stream-session-runtime.ts +1 -5
  340. package/src/runtime/workers/index.ts +1 -1
@@ -62,29 +62,27 @@ export class ZLinkSpotActivationRegistry {
62
62
 
63
63
  resolve(meshName: string, spotId: RoutingId): ZLinkSpotActivation | undefined {
64
64
  const key = spotActivationKey(meshName, spotId);
65
- return this.staged.has(key) ? undefined : this.activations.get(key);
65
+ return this.staged.has(key) || this.pending.has(key) ? undefined : this.activations.get(key);
66
66
  }
67
67
 
68
68
  resolveUnique(spotId: RoutingId): ZLinkSpotActivation | undefined {
69
69
  const matches = [...this.activations.values()].filter(
70
70
  (activation) =>
71
71
  String(activation.spotId) === String(spotId) &&
72
- !this.staged.has(spotActivationKey(activation.meshName, activation.spotId))
72
+ this.has(activation.meshName, activation.spotId)
73
73
  );
74
74
  return matches.length === 1 ? matches[0] : undefined;
75
75
  }
76
76
 
77
77
  has(meshName: string, spotId: RoutingId): boolean {
78
- const key = spotActivationKey(meshName, spotId);
79
- return !this.staged.has(key) && this.activations.has(key);
78
+ return this.resolve(meshName, spotId) !== undefined;
80
79
  }
81
80
 
82
81
  list(meshName: string): readonly ZLinkSpotInfo[] {
83
82
  return [...this.activations.values()]
84
83
  .filter((activation) => {
85
84
  if (activation.meshName !== meshName) return false;
86
- const key = spotActivationKey(activation.meshName, activation.spotId);
87
- return !this.staged.has(key);
85
+ return this.has(activation.meshName, activation.spotId);
88
86
  })
89
87
  .map((activation) => String(activation.spotId))
90
88
  .sort((left, right) => left.localeCompare(right))
@@ -155,24 +153,38 @@ export class ZLinkSpotActivationRegistry {
155
153
  });
156
154
  }
157
155
 
158
- register(activation: ZLinkSpotActivation): void {
156
+ registerPreparing(activation: ZLinkSpotActivation): void {
157
+ this.registerIncarnation(activation);
158
+ }
159
+
160
+ register(activation: ZLinkSpotActivation): ZLinkSpotActivation | undefined {
161
+ return this.registerIncarnation(activation);
162
+ }
163
+
164
+ private registerIncarnation(activation: ZLinkSpotActivation): ZLinkSpotActivation | undefined {
159
165
  const key = spotActivationKey(activation.meshName, activation.spotId);
160
- if (this.activations.has(key)) {
166
+ const existing = this.activations.get(key);
167
+ if (existing !== undefined && existing !== activation) {
161
168
  throw createInternalFrameworkException(
162
169
  ZLinkFrameworkInternalErrorKind.SpotTypeMismatch,
163
170
  `Spot '${activation.spotId}' was activated more than once.`
164
171
  );
165
172
  }
166
- this.activations.set(key, activation);
167
- this.lifecycleMetrics.opened('user');
173
+ if (existing === undefined) {
174
+ this.activations.set(key, activation);
175
+ this.lifecycleMetrics.opened('user');
176
+ }
177
+ return this.staged.has(key) ? undefined : activation;
168
178
  }
169
179
 
170
180
  stage(meshName: string, spotId: RoutingId): void {
171
181
  this.staged.add(spotActivationKey(meshName, spotId));
172
182
  }
173
183
 
174
- publish(meshName: string, spotId: RoutingId): void {
175
- this.staged.delete(spotActivationKey(meshName, spotId));
184
+ publish(meshName: string, spotId: RoutingId): ZLinkSpotActivation | undefined {
185
+ const key = spotActivationKey(meshName, spotId);
186
+ this.staged.delete(key);
187
+ return this.activations.get(key);
176
188
  }
177
189
 
178
190
  detachRelocated(meshName: string, spotId: RoutingId): ZLinkSpotActivation | undefined {
@@ -250,7 +262,7 @@ export class ZLinkSpotActivationRegistry {
250
262
  ): ZLinkSpotActivationOperation {
251
263
  const key = spotActivationKey(meshName, spotId);
252
264
  const existing = this.activations.get(key);
253
- if (existing !== undefined) {
265
+ if (existing !== undefined && !this.pending.has(key)) {
254
266
  return {
255
267
  owner: false,
256
268
  ready: existing.serial.execute(() => {
@@ -16,7 +16,7 @@ import type { ZLinkBackendSpot } from '../backend/contracts';
16
16
  import type { ZLinkSpotActorHandlerRegistryRuntime } from '../actors';
17
17
  import type { DefaultZLinkSpotHandlerRegistry } from './spot-handler-registry';
18
18
  import { ZLinkSpotSerialTurnExecutor } from './spot-serial-turn-executor';
19
- import { ZLinkSpotSerialExecutor } from './spot-serial-executor';
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
22
  import { ZLinkExecutionBarrier, type ZLinkExecutionBarrierSeal } from '../execution';
@@ -229,37 +229,30 @@ export class ZLinkSpotActivation {
229
229
  if (!this.relocationBoundaryConsumed) return;
230
230
  this.relocationBoundaryConsumed = false;
231
231
  this.relocationReadyDeferredTurnId = undefined;
232
- await this.serial.post(() => this.notifyRelocationReadyCompleted(outcome));
232
+ await this.serial.postBarrierTurn(() => this.notifyRelocationReadyCompleted(outcome));
233
233
  }
234
234
 
235
235
  async notifyRelocatedBoundary(): Promise<void> {
236
- await this.serial.post(() =>
236
+ await this.serial.postBarrierTurn(() =>
237
237
  this.notifyRelocationReadyCompleted(ZLinkSpotRelocationReadyOutcome.Relocated)
238
238
  );
239
239
  }
240
240
 
241
241
  executeActor<T>(
242
242
  actorId: string,
243
- operation: (serial: ZLinkSpotSerialTurnExecutor) => Promise<T> | T
243
+ operation: (serial: ZLinkSpotSerialTurnExecutor) => Promise<T> | T,
244
+ workOptions?: import('../execution/serial-execution-queue').ZLinkSerialWorkOptions
244
245
  ): Promise<T> {
245
- return this.serialExecutor.executeActor(actorId, operation);
246
+ return this.serialExecutor.executeActor(actorId, operation, workOptions);
246
247
  }
247
248
 
248
249
  /** @internal Restores a non-executing durable prefix into one Actor FIFO. */
249
- admitActorDurablePrefix(
250
+ admitActorPacketPrefix(
250
251
  actorId: string,
251
- records: readonly {
252
- readonly operation: (
253
- executeChild: <TChild>(
254
- child: (
255
- serial: import('./spot-serial-turn-executor').ZLinkSpotSerialTurnExecutor
256
- ) => Promise<TChild> | TChild
257
- ) => Promise<TChild>
258
- ) => Promise<void>;
259
- readonly workOptions?: import('../execution/serial-execution-queue').ZLinkSerialWorkOptions;
260
- }[]
261
- ): readonly Promise<void>[] {
262
- return this.serialExecutor.admitActorDurablePrefix(actorId, records);
252
+ records: readonly import('../actors/actor-handoff').ZLinkActorHandoffPrefixRecord[],
253
+ dispatch: ZLinkActorPacketTurnDispatch
254
+ ): import('../actors/actor-handoff').ZLinkActorHandoffPrefixAdmission {
255
+ return this.serialExecutor.admitActorPacketPrefix(actorId, records, dispatch);
263
256
  }
264
257
 
265
258
  sealExecution(kind: ZLinkExecutionBarrierSeal['kind'] = 'relocation'): ZLinkExecutionBarrierSeal {
@@ -294,7 +287,7 @@ export class ZLinkSpotActivation {
294
287
 
295
288
  abortRelocation(capture: ZLinkSpotRelocationCapture): boolean {
296
289
  if (!this.executionBarrier.isCurrent(capture.seal)) return false;
297
- this.timers.abortRelocation(capture.timers);
290
+ this.timers.abortRelocation();
298
291
  return this.abortExecutionSeal(capture.seal);
299
292
  }
300
293
 
@@ -30,7 +30,7 @@ import {
30
30
  } from '../../contracts';
31
31
  import type { Message } from '../../contracts/Common/Message';
32
32
  import type { ZLinkMessageFollowOrigin } from '../foundation/service-runtime-contracts';
33
- import { throwIfAborted } from '../abort';
33
+ import { createAbortError, isAbortError, throwIfAborted } from '../abort';
34
34
  import { ZLinkConfigurationException } from '../configuration';
35
35
  import {
36
36
  ZLinkFrameworkInternalErrorKind,
@@ -70,7 +70,8 @@ import {
70
70
  import {
71
71
  addSpotTimerRegistrations,
72
72
  ZLinkSpotTimerRegistry,
73
- type ZLinkTimerClock
73
+ type ZLinkTimerClock,
74
+ type ZLinkTimerRelocationState
74
75
  } from './spot-timer';
75
76
  import { ZLinkSpotSerialTurnExecutor } from './spot-serial-turn-executor';
76
77
  import { ZLinkSpotSerialExecutor } from './spot-serial-executor';
@@ -149,7 +150,9 @@ export interface ZLinkSpotActivationLifecycleOptions {
149
150
  objectGeneration: bigint,
150
151
  signal?: AbortSignal
151
152
  ) => Promise<boolean>;
152
- readonly registerActivation: (activation: ZLinkSpotActivation) => void;
153
+ readonly registerActivation: (activation: ZLinkSpotActivation) => void | Promise<void>;
154
+ readonly stageActivation?: (activation: ZLinkSpotActivation) => void;
155
+ readonly discardActivation?: (activation: ZLinkSpotActivation) => void;
153
156
  readonly routeToActorJoinPrewarm?: ZLinkRouteToActorJoinPrewarm;
154
157
  readonly releaseLocation: (
155
158
  activation: ZLinkSpotActivation,
@@ -201,6 +204,7 @@ export class ZLinkSpotActivationLifecycle {
201
204
  spotId: RoutingId,
202
205
  objectGeneration: bigint,
203
206
  authorityOwnerGeneration: bigint,
207
+ restoredTimers: readonly ZLinkTimerRelocationState[],
204
208
  signal?: AbortSignal
205
209
  ): Promise<ZLinkSpotActivation> {
206
210
  const executionMode =
@@ -241,6 +245,9 @@ export class ZLinkSpotActivationLifecycle {
241
245
  (name) => serialExecutor.isTimerExecuting(name),
242
246
  this.options.timerClock
243
247
  );
248
+ // Spot timer §1: the source schedule exists before Configure so its
249
+ // registrations reattach to the restored keys.
250
+ timers.stageRelocation(restoredTimers);
244
251
  const outbound = new DefaultZLinkSpotOutbound({
245
252
  serial,
246
253
  channelClient: this.options.channelClient,
@@ -305,20 +312,6 @@ export class ZLinkSpotActivationLifecycle {
305
312
  enumerable: false,
306
313
  value: context
307
314
  });
308
- await instance.configure?.();
309
- await addSpotTimerRegistrations(
310
- timers,
311
- implementation as unknown as Type<ZLinkSpot>,
312
- spotId,
313
- instance as unknown as ZLinkSpot,
314
- serial,
315
- { timerHandlers: this.options.spotTimerHandlers },
316
- {
317
- providerResolver: this.options.providerResolver,
318
- runtimeEventPublisher: this.options.runtimeEventPublisher,
319
- signal
320
- }
321
- );
322
315
  activation = new ZLinkSpotActivation({
323
316
  meshName,
324
317
  spotId,
@@ -346,9 +339,42 @@ export class ZLinkSpotActivationLifecycle {
346
339
  nativeSpot,
347
340
  metrics: this.options.metrics
348
341
  });
349
- this.options.registerActivation(activation);
342
+ serialExecutor.beginPreparation('relocation');
343
+ const configured = instance;
344
+ await serial.postBarrierTurn(() =>
345
+ timers.runRelocationInitialization(async () => {
346
+ await configured.configure?.();
347
+ await addSpotTimerRegistrations(
348
+ timers,
349
+ implementation as unknown as Type<ZLinkSpot>,
350
+ spotId,
351
+ configured as unknown as ZLinkSpot,
352
+ serial,
353
+ { timerHandlers: this.options.spotTimerHandlers },
354
+ {
355
+ providerResolver: this.options.providerResolver,
356
+ runtimeEventPublisher: this.options.runtimeEventPublisher,
357
+ signal
358
+ }
359
+ );
360
+ // Node timer relocation: restored handlers resolve by name among the
361
+ // constructors announced in Configure (addTimer or addTimerHandler).
362
+ await timers.resolveRelocationHandlers(
363
+ handlers
364
+ .snapshot()
365
+ .filter((entry) => entry.kind === 'timer')
366
+ .map((entry) => entry.handlerType),
367
+ (name, periodMs, handlerType) =>
368
+ context.addTimer(name, periodMs, handlerType as never, undefined, signal)
369
+ );
370
+ })
371
+ );
372
+ await this.options.registerActivation(activation);
350
373
  return activation;
351
374
  } catch (error) {
375
+ const preparation = await Promise.allSettled(
376
+ activation === undefined ? [] : [this.discardPreparation(activation)]
377
+ );
352
378
  const cleanup = await Promise.allSettled([
353
379
  timers.dispose(),
354
380
  ...(instance === undefined
@@ -356,7 +382,7 @@ export class ZLinkSpotActivationLifecycle {
356
382
  : [disposeLifecycleHandlers(instance, this.options.detachedTaskRunner)]),
357
383
  ...(nativeSpot === undefined ? [] : [Promise.resolve().then(() => nativeSpot.dispose())])
358
384
  ]);
359
- const cleanupErrors = cleanup
385
+ const cleanupErrors = [...preparation, ...cleanup]
360
386
  .filter((result): result is PromiseRejectedResult => result.status === 'rejected')
361
387
  .map((result) => result.reason);
362
388
  if (cleanupErrors.length > 0) {
@@ -378,6 +404,7 @@ export class ZLinkSpotActivationLifecycle {
378
404
  signal?: AbortSignal,
379
405
  serialOwner?: ZLinkSpotActivation
380
406
  ): Promise<ZLinkSpotActivation> {
407
+ throwIfAborted(signal);
381
408
  const serial = serialOwner?.serial ?? new ZLinkSpotSerialTurnExecutor(true, spotId);
382
409
  const serialExecutor = new ZLinkSpotSerialExecutor(
383
410
  serial,
@@ -453,35 +480,52 @@ export class ZLinkSpotActivationLifecycle {
453
480
  externalActorCount: () => this.options.actorCountProvider?.(spotId) ?? 0
454
481
  });
455
482
  try {
456
- await instance.configure?.();
457
- await addSpotTimerRegistrations(
458
- timers,
459
- implementation as unknown as Type<ZLinkSpot>,
460
- spotId,
461
- instance as unknown as ZLinkSpot,
462
- serial,
463
- { timerHandlers: this.options.spotTimerHandlers },
464
- {
465
- providerResolver: this.options.providerResolver,
466
- runtimeEventPublisher: this.options.runtimeEventPublisher,
467
- signal
468
- }
469
- );
470
- await (serialOwner === undefined
471
- ? serial.execute(() => instance!.onInitialize?.())
472
- : serial.postBarrierTurn(() => instance!.onInitialize?.()));
473
- this.options.registerActivation(activation);
483
+ if (serialOwner === undefined) serialExecutor.beginPreparation();
484
+ await serial.postBarrierTurn(async () => {
485
+ throwIfAborted(signal);
486
+ await instance.configure?.();
487
+ await addSpotTimerRegistrations(
488
+ timers,
489
+ implementation as unknown as Type<ZLinkSpot>,
490
+ spotId,
491
+ instance as unknown as ZLinkSpot,
492
+ serial,
493
+ { timerHandlers: this.options.spotTimerHandlers },
494
+ {
495
+ providerResolver: this.options.providerResolver,
496
+ runtimeEventPublisher: this.options.runtimeEventPublisher,
497
+ signal
498
+ }
499
+ );
500
+ throwIfAborted(signal);
501
+ await instance!.onInitialize?.(signal);
502
+ });
503
+ throwIfAborted(signal);
504
+ await this.options.registerActivation(activation);
474
505
  return activation;
475
506
  } catch (error) {
476
- const cleanup = await Promise.allSettled([
477
- timers.dispose(),
478
- disposeLifecycleHandlers(instance, this.options.detachedTaskRunner)
479
- ]);
480
- const cleanupErrors = cleanup
481
- .filter((result): result is PromiseRejectedResult => result.status === 'rejected')
482
- .map((result) => result.reason);
507
+ const failure = signal?.aborted === true ? createAbortError() : error;
508
+ const cancelled = isAbortError(failure);
509
+ if (cancelled && serialOwner === undefined) serial.closeAdmission();
510
+ const cleanupErrors: unknown[] = [];
511
+ try {
512
+ await serialExecutor.finishPreparation(async () => {
513
+ const cleanup = await Promise.allSettled([
514
+ timers.dispose(),
515
+ disposeLifecycleHandlers(instance, this.options.detachedTaskRunner)
516
+ ]);
517
+ cleanupErrors.push(
518
+ ...cleanup
519
+ .filter((result): result is PromiseRejectedResult => result.status === 'rejected')
520
+ .map((result) => result.reason)
521
+ );
522
+ });
523
+ } catch (cleanupError) {
524
+ cleanupErrors.push(cleanupError);
525
+ }
526
+ if (cancelled && cleanupErrors.length === 0) throw failure;
483
527
  throw new AggregateError(
484
- [error, ...cleanupErrors],
528
+ [failure, ...cleanupErrors],
485
529
  `Instance Spot '${instanceType}' materialization failed for '${String(spotId)}'.`
486
530
  );
487
531
  }
@@ -489,6 +533,11 @@ export class ZLinkSpotActivationLifecycle {
489
533
 
490
534
  async discardInstance(activation: ZLinkSpotActivation): Promise<void> {
491
535
  const errors: unknown[] = [];
536
+ try {
537
+ await this.discardPreparation(activation);
538
+ } catch (error) {
539
+ errors.push(error);
540
+ }
492
541
  try {
493
542
  await activation.serial.execute(() =>
494
543
  invokeSpotClosing(
@@ -531,6 +580,7 @@ export class ZLinkSpotActivationLifecycle {
531
580
  signal?: AbortSignal,
532
581
  authority?: ZLinkNativeSpotAuthority
533
582
  ): Promise<ZLinkLocalSpotCreateResult> {
583
+ throwIfAborted(signal);
534
584
  const executionMode =
535
585
  this.options.userSpotExecutionMode?.(meshName, spotType) ??
536
586
  ZLinkUserSpotExecutionMode.SpotWide;
@@ -688,12 +738,8 @@ export class ZLinkSpotActivationLifecycle {
688
738
  const cleanupErrors: unknown[] = [];
689
739
  try {
690
740
  if (activation !== undefined) {
691
- await this.cleanupActivation(
692
- activation,
693
- locationClaim.meshName,
694
- lifecycleStarted,
695
- signal
696
- );
741
+ if (!lifecycleStarted)
742
+ await this.cleanupActivation(activation, locationClaim.meshName, false);
697
743
  } else {
698
744
  const partialCleanup = await Promise.allSettled([
699
745
  timers.dispose(),
@@ -863,7 +909,7 @@ export class ZLinkSpotActivationLifecycle {
863
909
  undefined,
864
910
  ZLinkSpotCloseReason.ExplicitClose,
865
911
  undefined,
866
- true
912
+ !activation.serialExecutor.isPreparing
867
913
  );
868
914
  }
869
915
 
@@ -930,59 +976,69 @@ export class ZLinkSpotActivationLifecycle {
930
976
  signal?: AbortSignal
931
977
  ): Promise<ZLinkLocalSpotCreateResult> {
932
978
  try {
933
- await activation.spot.configure?.();
934
- nativeDispatch?.configureSubscriptions(activation.handlers.snapshot());
935
- await addSpotTimerRegistrations(
936
- activation.timers,
937
- spotType,
938
- activation.spotId,
939
- activation.spot,
940
- activation.serial,
941
- { timerHandlers: this.options.spotTimerHandlers },
942
- {
943
- providerResolver: this.options.providerResolver,
944
- runtimeEventPublisher: this.options.runtimeEventPublisher,
945
- signal
946
- }
947
- );
979
+ activation.serialExecutor.beginPreparation();
980
+ this.options.stageActivation?.(activation);
948
981
  let createResponse: ZLinkSpotCreateResponse | undefined;
949
- await activation.serial.execute(async () => {
982
+ await activation.serial.postBarrierTurn(async () => {
983
+ throwIfAborted(signal);
984
+ await activation.spot.configure?.();
985
+ nativeDispatch?.configureSubscriptions(activation.handlers.snapshot());
986
+ await addSpotTimerRegistrations(
987
+ activation.timers,
988
+ spotType,
989
+ activation.spotId,
990
+ activation.spot,
991
+ activation.serial,
992
+ { timerHandlers: this.options.spotTimerHandlers },
993
+ {
994
+ providerResolver: this.options.providerResolver,
995
+ runtimeEventPublisher: this.options.runtimeEventPublisher,
996
+ signal
997
+ }
998
+ );
999
+ throwIfAborted(signal);
950
1000
  createResponse = await activation.spot.onCreate?.(
951
1001
  wrapFrameworkPayloadMessage(
952
1002
  request,
953
1003
  this.options.messageSerializers,
954
1004
  frameworkPayloadContentType(request)
955
- )
1005
+ ),
1006
+ signal
956
1007
  );
957
1008
  if (createResponse?.accepted === false) {
958
1009
  return;
959
1010
  }
960
- await activation.spot.onInitialize?.();
1011
+ throwIfAborted(signal);
1012
+ await activation.spot.onInitialize?.(signal);
961
1013
  });
1014
+ throwIfAborted(signal);
962
1015
  if (createResponse?.accepted === false) {
963
- await this.cleanupActivation(activation, locationClaim.meshName, false, signal);
1016
+ await this.cleanupActivation(activation, locationClaim.meshName, false);
964
1017
  return {
965
1018
  spotId: activation.spotId,
966
1019
  state: ZLinkSpotCreateState.Rejected,
967
1020
  reply: this.decodeCreateReply(createResponse.reply)
968
1021
  };
969
1022
  }
970
- this.options.registerActivation(activation);
1023
+ await this.options.registerActivation(activation);
971
1024
  return {
972
1025
  spotId: activation.spotId,
973
1026
  state: ZLinkSpotCreateState.Created,
974
1027
  reply: this.decodeCreateReply(createResponse?.reply)
975
1028
  };
976
1029
  } catch (error) {
1030
+ const failure = signal?.aborted === true ? createAbortError() : error;
1031
+ const cancelled = isAbortError(failure);
1032
+ if (cancelled) activation.serial.closeAdmission();
977
1033
  try {
978
- await this.cleanupActivation(activation, locationClaim.meshName, true, signal);
1034
+ await this.cleanupActivation(activation, locationClaim.meshName, !cancelled);
979
1035
  } catch (cleanupError) {
980
1036
  throw new AggregateError(
981
- [error, cleanupError],
1037
+ [failure, cleanupError],
982
1038
  `Spot '${activation.spotId}' creation cleanup failed.`
983
1039
  );
984
1040
  }
985
- throw error;
1041
+ throw failure;
986
1042
  }
987
1043
  }
988
1044
 
@@ -1007,20 +1063,48 @@ export class ZLinkSpotActivationLifecycle {
1007
1063
  };
1008
1064
  this.cleanupStates.set(activation, state);
1009
1065
  if (state.inFlight !== undefined) return await state.inFlight;
1010
- state.inFlight = this.runCleanup(
1011
- activation,
1012
- locationMeshName,
1013
- notifyClosing,
1014
- reason,
1015
- state,
1016
- deadline,
1017
- owningLifecycle
1018
- ).finally(() => {
1019
- state.inFlight = undefined;
1020
- });
1066
+ let result: unknown;
1067
+ const cleanup = async (ownsLifecycle: boolean) => {
1068
+ try {
1069
+ result = await this.runCleanup(
1070
+ activation,
1071
+ locationMeshName,
1072
+ notifyClosing,
1073
+ reason,
1074
+ state,
1075
+ deadline,
1076
+ ownsLifecycle
1077
+ );
1078
+ } finally {
1079
+ if (activation.serialExecutor.isPreparing) {
1080
+ activation.serial.closeAdmission();
1081
+ // The receive pump releases retained payloads when these records finish.
1082
+ activation.serial.visitPendingApplication((record) => {
1083
+ record.operation = () => undefined;
1084
+ });
1085
+ this.options.discardActivation?.(activation);
1086
+ }
1087
+ }
1088
+ };
1089
+ state.inFlight = (
1090
+ !owningLifecycle && activation.serialExecutor.isPreparing
1091
+ ? activation.serialExecutor.finishPreparation(() => cleanup(true))
1092
+ : cleanup(owningLifecycle)
1093
+ )
1094
+ .then(() => result)
1095
+ .finally(() => {
1096
+ state.inFlight = undefined;
1097
+ });
1021
1098
  return await state.inFlight;
1022
1099
  }
1023
1100
 
1101
+ async discardPreparation(activation: ZLinkSpotActivation): Promise<void> {
1102
+ if (!activation.serialExecutor.isPreparing) return;
1103
+ // Clear timer generations before opening admission, so an already due
1104
+ // dispatch can finish without invoking application code.
1105
+ await activation.serialExecutor.finishPreparation(() => activation.timers.dispose());
1106
+ }
1107
+
1024
1108
  private async runCleanup(
1025
1109
  activation: ZLinkSpotActivation,
1026
1110
  locationMeshName: string,
@@ -59,22 +59,7 @@ export class ZLinkSpotActorAdmissionCoordinator {
59
59
  remoteBoundSessionTarget,
60
60
  fallbackActorRef,
61
61
  undefined,
62
- messageFollowOrigin,
63
- (
64
- replayedParts,
65
- replayReturnResponse,
66
- replayRemoteBoundSessionTarget,
67
- replayFallbackActorRef
68
- ) =>
69
- this.dispatchActorPacketDirect(
70
- origin,
71
- activation,
72
- actorId,
73
- replayedParts,
74
- replayReturnResponse,
75
- replayRemoteBoundSessionTarget,
76
- replayFallbackActorRef
77
- )
62
+ messageFollowOrigin
78
63
  );
79
64
  if (handoff !== undefined) return await handoff;
80
65
  return await this.dispatchActorPacketDirect(
@@ -102,10 +87,7 @@ export class ZLinkSpotActorAdmissionCoordinator {
102
87
  ),
103
88
  serial: activation.serial,
104
89
  actors: {
105
- resolveActor: (actorId) =>
106
- activation.hasDepartedActor(actorId)
107
- ? undefined
108
- : (activation.resolveJoinedActor(actorId) ?? this.options.actorResolver?.(actorId)),
90
+ resolveActor: (actorId) => this.resolveActor(activation, actorId),
109
91
  getTarget: () => activation.spot,
110
92
  defaultAccept: false,
111
93
  transfer:
@@ -192,38 +174,21 @@ export class ZLinkSpotActorAdmissionCoordinator {
192
174
  actorId: string,
193
175
  records: readonly ZLinkActorHandoffPrefixRecord[]
194
176
  ): ZLinkActorHandoffPrefixAdmission {
195
- const terminals = activation.admitActorDurablePrefix(
177
+ return activation.admitActorPacketPrefix(
196
178
  actorId,
197
- records.map((record) => ({
198
- operation: (executeChild) =>
199
- record.drain((parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef) =>
200
- executeChild((actorSerial) =>
201
- this.dispatchActorPacketInActorTurn(
202
- currentApplicationJobOrigin(),
203
- activation,
204
- actorSerial,
205
- actorId,
206
- parts,
207
- returnResponse,
208
- remoteBoundSessionTarget,
209
- fallbackActorRef
210
- )
211
- )
212
- ),
213
- preparation: record.preparation,
214
- workOptions: { payloadBytes: record.payloadBytes }
215
- }))
179
+ records,
180
+ (actorSerial, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef) =>
181
+ this.dispatchActorPacketInActorTurn(
182
+ currentApplicationJobOrigin(),
183
+ activation,
184
+ actorSerial,
185
+ actorId,
186
+ parts,
187
+ returnResponse,
188
+ remoteBoundSessionTarget,
189
+ fallbackActorRef
190
+ )
216
191
  );
217
- const terminal = Promise.allSettled(terminals).then((outcomes) => {
218
- const errors = outcomes.flatMap((outcome) =>
219
- outcome.status === 'rejected' ? [outcome.reason] : []
220
- );
221
- if (errors.length === 1) throw errors[0];
222
- if (errors.length > 1) {
223
- throw new AggregateError(errors, `Actor '${actorId}' durable prefix replay failed.`);
224
- }
225
- });
226
- return { terminal };
227
192
  }
228
193
 
229
194
  private dispatchActorPacketInActorTurn(
@@ -242,11 +207,7 @@ export class ZLinkSpotActorAdmissionCoordinator {
242
207
  spotId: () => String(activation.spotId),
243
208
  registry: activation.actorHandlers,
244
209
  serial: actorSerial,
245
- resolveActor: (targetActorId) =>
246
- activation.hasDepartedActor(targetActorId)
247
- ? undefined
248
- : (activation.resolveJoinedActor(targetActorId) ??
249
- this.options.actorResolver?.(targetActorId)),
210
+ resolveActor: (targetActorId) => this.resolveActor(activation, targetActorId),
250
211
  actorLeft: (targetActorId) => activation.hasDepartedActor(targetActorId),
251
212
  onDisconnectActor: (actor) =>
252
213
  activation.serial.execute(() => activation.spot.onDisconnectActor?.(actor)),
@@ -271,6 +232,15 @@ export class ZLinkSpotActorAdmissionCoordinator {
271
232
  );
272
233
  }
273
234
 
235
+ private resolveActor(activation: ZLinkSpotActivation, actorId: string): ZLinkActor | undefined {
236
+ if (activation.hasDepartedActor(actorId)) return undefined;
237
+ // The manager owns relocation visibility. Membership alone cannot publish
238
+ // a staged Actor; resolver absence supports standalone Spot runtimes.
239
+ return this.options.actorResolver === undefined
240
+ ? activation.resolveJoinedActor(actorId)
241
+ : this.options.actorResolver(actorId);
242
+ }
243
+
274
244
  private async commitTransferredActorTransaction(
275
245
  activation: ZLinkSpotActivation,
276
246
  actor: ZLinkActor,