@zlink-systems/framework 0.30.0 → 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 (456) hide show
  1. package/LICENSE +150 -68
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/contracts/Actors/ZLinkActorClient.d.ts +2 -1
  4. package/dist/contracts/Channels/Calls.d.ts +2 -1
  5. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
  6. package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
  7. package/dist/contracts/Common/ZLinkMessageMetadata.js +11 -5
  8. package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
  9. package/dist/contracts/Common/encoded-payload-storage.js +5 -2
  10. package/dist/contracts/Configuration/Builders.d.ts +1 -1
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
  12. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
  13. package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
  14. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  15. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
  16. package/dist/contracts/Handlers/Attributes.d.ts +5 -13
  17. package/dist/contracts/Handlers/Attributes.js +7 -11
  18. package/dist/contracts/Handlers/JsonContract.d.ts +2 -46
  19. package/dist/contracts/Handlers/JsonContract.js +4 -153
  20. package/dist/contracts/Locations/Rows.d.ts +2 -0
  21. package/dist/contracts/Spots/Contracts.d.ts +6 -1
  22. package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
  23. package/dist/nest-integration.d.ts +1 -1
  24. package/dist/nest-integration.js +2 -1
  25. package/dist/runtime/abort.d.ts +5 -0
  26. package/dist/runtime/abort.js +10 -0
  27. package/dist/runtime/actors/actor-authority-publication.js +3 -2
  28. package/dist/runtime/actors/actor-client.d.ts +1 -2
  29. package/dist/runtime/actors/actor-client.js +52 -57
  30. package/dist/runtime/actors/actor-context.d.ts +2 -0
  31. package/dist/runtime/actors/actor-context.js +46 -9
  32. package/dist/runtime/actors/actor-handoff.d.ts +8 -4
  33. package/dist/runtime/actors/actor-handoff.js +219 -92
  34. package/dist/runtime/actors/actor-join-relocation.d.ts +3 -0
  35. package/dist/runtime/actors/actor-local-native-join.js +13 -12
  36. package/dist/runtime/actors/actor-mailbox.js +27 -1
  37. package/dist/runtime/actors/actor-remote-joiner.js +3 -1
  38. package/dist/runtime/actors/actor-remote-wire.js +15 -0
  39. package/dist/runtime/actors/actor-reply.d.ts +4 -0
  40. package/dist/runtime/actors/actor-reply.js +29 -0
  41. package/dist/runtime/actors/actor-routed-join-transport.d.ts +6 -2
  42. package/dist/runtime/actors/actor-routed-json-request.d.ts +2 -0
  43. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
  44. package/dist/runtime/actors/actor-runtime-state.js +2 -20
  45. package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
  46. package/dist/runtime/actors/index.d.ts +8 -3
  47. package/dist/runtime/actors/index.js +55 -27
  48. package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
  49. package/dist/runtime/actors/session-disconnected-wire.js +48 -0
  50. package/dist/runtime/actors/spot-actor-dispatch.js +2 -2
  51. package/dist/runtime/admission.d.ts +9 -1
  52. package/dist/runtime/admission.js +56 -23
  53. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +6 -8
  54. package/dist/runtime/application-jobs/application-ingress-record-owner.js +39 -22
  55. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +15 -1
  56. package/dist/runtime/application-jobs/application-job-queue-scope.js +61 -20
  57. package/dist/runtime/application-jobs/contracts.d.ts +12 -1
  58. package/dist/runtime/backend/contracts/index.d.ts +37 -12
  59. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
  60. package/dist/runtime/backend/mesh-completion-table.d.ts +9 -1
  61. package/dist/runtime/backend/mesh-completion-table.js +154 -49
  62. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +28 -1
  63. package/dist/runtime/backend/mesh-dispatch-pump.js +208 -101
  64. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +2 -2
  65. package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -9
  66. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +1 -1
  67. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +5 -2
  68. package/dist/runtime/backend/node/node-raw-binding-port.js +124 -72
  69. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +46 -13
  70. package/dist/runtime/backend/node/node-raw-mesh-backend.js +181 -164
  71. package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
  72. package/dist/runtime/backend/node/node-socket-backend-adapter.js +11 -11
  73. package/dist/runtime/backend/raw-binding-port.d.ts +2 -2
  74. package/dist/runtime/backend/runtime-message.d.ts +1 -0
  75. package/dist/runtime/backend/runtime-message.js +5 -0
  76. package/dist/runtime/backend/runtime-values.d.ts +1 -0
  77. package/dist/runtime/backend/runtime-values.js +2 -1
  78. package/dist/runtime/channels/channel-clients.d.ts +2 -0
  79. package/dist/runtime/channels/channel-clients.js +75 -23
  80. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +25 -5
  81. package/dist/runtime/channels/channel-dispatch-pipeline.js +111 -56
  82. package/dist/runtime/channels/channel-dispatch-services.d.ts +1 -0
  83. package/dist/runtime/channels/channel-dispatch-services.js +45 -0
  84. package/dist/runtime/channels/channel-dispatchers.d.ts +4 -3
  85. package/dist/runtime/channels/channel-dispatchers.js +62 -54
  86. package/dist/runtime/channels/channel-envelope-inspection.d.ts +1 -2
  87. package/dist/runtime/channels/channel-envelope-inspection.js +1 -16
  88. package/dist/runtime/channels/channel-envelope.d.ts +2 -0
  89. package/dist/runtime/channels/channel-envelope.js +146 -28
  90. package/dist/runtime/channels/channel-outbound-operations.d.ts +2 -2
  91. package/dist/runtime/channels/channel-outbound-operations.js +8 -8
  92. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
  93. package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
  94. package/dist/runtime/channels/channel-runtime-manager.d.ts +9 -8
  95. package/dist/runtime/channels/channel-runtime-manager.js +16 -16
  96. package/dist/runtime/channels/channel-transports.d.ts +18 -16
  97. package/dist/runtime/channels/channel-transports.js +77 -58
  98. package/dist/runtime/channels/client-server-location-runtime.js +5 -4
  99. package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
  100. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  101. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  102. package/dist/runtime/channels/fanout-location-runtime.js +3 -3
  103. package/dist/runtime/channels/local-spot-route-transport.d.ts +1 -1
  104. package/dist/runtime/channels/local-spot-route-transport.js +2 -1
  105. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +2 -2
  106. package/dist/runtime/channels/router-socket-spot-route-transport.js +4 -4
  107. package/dist/runtime/channels/source-spot-router.d.ts +2 -2
  108. package/dist/runtime/channels/source-spot-router.js +4 -4
  109. package/dist/runtime/channels/spot-node-route-transport.d.ts +2 -2
  110. package/dist/runtime/channels/spot-node-route-transport.js +4 -4
  111. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +2 -2
  112. package/dist/runtime/channels/spot-route-bridge-transport.js +4 -4
  113. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +5 -4
  114. package/dist/runtime/channels/spot-route-dispatch-strategy.js +18 -18
  115. package/dist/runtime/diagnostics/flow-context.js +19 -7
  116. package/dist/runtime/diagnostics/index.js +4 -9
  117. package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
  118. package/dist/runtime/diagnostics/message-flow.js +35 -5
  119. package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
  120. package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
  121. package/dist/runtime/execution/index.d.ts +4 -2
  122. package/dist/runtime/execution/index.js +33 -10
  123. package/dist/runtime/execution/serial-execution-queue.d.ts +5 -0
  124. package/dist/runtime/execution/serial-execution-queue.js +22 -2
  125. package/dist/runtime/execution/state-lane.d.ts +2 -0
  126. package/dist/runtime/execution/state-lane.js +5 -0
  127. package/dist/runtime/foundation/actor-join-recovery-codec.js +2 -2
  128. package/dist/runtime/foundation/durable-service-request.d.ts +14 -0
  129. package/dist/runtime/foundation/durable-service-request.js +98 -0
  130. package/dist/runtime/foundation/operation-identity.d.ts +1 -0
  131. package/dist/runtime/foundation/operation-identity.js +5 -1
  132. package/dist/runtime/foundation/operation-registry.d.ts +25 -1
  133. package/dist/runtime/foundation/operation-registry.js +86 -18
  134. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +61 -8
  135. package/dist/runtime/foundation/raw-service-mesh-runtime.js +486 -266
  136. package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
  137. package/dist/runtime/foundation/service-liveness-registry.js +38 -0
  138. package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
  139. package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
  140. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +3 -3
  141. package/dist/runtime/foundation/service-relocation-object-owner.js +48 -34
  142. package/dist/runtime/foundation/service-relocation-runtime.d.ts +2 -0
  143. package/dist/runtime/foundation/service-relocation-runtime.js +20 -4
  144. package/dist/runtime/foundation/service-runtime-contracts.d.ts +10 -1
  145. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
  146. package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
  147. package/dist/runtime/foundation/service-stateful-registry.js +24 -26
  148. package/dist/runtime/foundation/service-stateful-runtime.d.ts +75 -9
  149. package/dist/runtime/foundation/service-stateful-runtime.js +486 -218
  150. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -6
  151. package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
  152. package/dist/runtime/foundation/service-topology-registry.d.ts +12 -2
  153. package/dist/runtime/foundation/service-topology-registry.js +61 -27
  154. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
  155. package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
  156. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  157. package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
  158. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +13 -3
  159. package/dist/runtime/foundation/service-wire-m6a-codec.js +189 -78
  160. package/dist/runtime/handlers/handler-instance-scope.d.ts +8 -0
  161. package/dist/runtime/handlers/handler-instance-scope.js +54 -11
  162. package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
  163. package/dist/runtime/host/actor-packet-relay.js +59 -72
  164. package/dist/runtime/host/actor-placement-coordinator.js +25 -8
  165. package/dist/runtime/host/actor-runtime-options-factory.js +2 -2
  166. package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
  167. package/dist/runtime/host/actor-transfer-runtime.js +85 -331
  168. package/dist/runtime/host/application-job-queue.d.ts +40 -7
  169. package/dist/runtime/host/application-job-queue.js +137 -42
  170. package/dist/runtime/host/entry-actor-runtime.d.ts +1 -0
  171. package/dist/runtime/host/entry-actor-runtime.js +3 -0
  172. package/dist/runtime/host/index.d.ts +12 -2
  173. package/dist/runtime/host/index.js +300 -202
  174. package/dist/runtime/host/location-runtime-owner.js +2 -6
  175. package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
  176. package/dist/runtime/host/mesh-router-resolver.js +14 -6
  177. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
  178. package/dist/runtime/host/remote-bound-session-relay.js +73 -208
  179. package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
  180. package/dist/runtime/host/route-mesh-runtime.js +6 -4
  181. package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
  182. package/dist/runtime/host/runtime-shutdown.js +3 -2
  183. package/dist/runtime/host/service-relocation-control.d.ts +1 -0
  184. package/dist/runtime/host/service-relocation-control.js +10 -4
  185. package/dist/runtime/host/service-relocation-host-runtime.d.ts +22 -14
  186. package/dist/runtime/host/service-relocation-host-runtime.js +754 -599
  187. package/dist/runtime/host/spot-address-transport.js +3 -2
  188. package/dist/runtime/host/spot-runtime-options-factory.js +16 -7
  189. package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
  190. package/dist/runtime/locations/actor-location-claims.d.ts +2 -2
  191. package/dist/runtime/locations/actor-location-claims.js +34 -19
  192. package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
  193. package/dist/runtime/locations/auto-connect-loop.js +22 -14
  194. package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
  195. package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
  196. package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
  197. package/dist/runtime/locations/descriptor-publication.js +11 -0
  198. package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
  199. package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
  200. package/dist/runtime/locations/in-memory-authority-store.js +56 -19
  201. package/dist/runtime/locations/in-memory-location-store.js +1 -10
  202. package/dist/runtime/locations/index.d.ts +1 -0
  203. package/dist/runtime/locations/index.js +1 -0
  204. package/dist/runtime/locations/lease-tracker.js +1 -6
  205. package/dist/runtime/locations/lifecycle.d.ts +1 -2
  206. package/dist/runtime/locations/lifecycle.js +2 -5
  207. package/dist/runtime/locations/location-store-repository.d.ts +51 -1
  208. package/dist/runtime/locations/location-store-repository.js +363 -139
  209. package/dist/runtime/locations/relocation-blob.d.ts +18 -1
  210. package/dist/runtime/locations/relocation-blob.js +52 -1
  211. package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
  212. package/dist/runtime/locations/request-source-resolver.js +80 -0
  213. package/dist/runtime/locations/resolvers.js +1 -1
  214. package/dist/runtime/locations/runtime.d.ts +7 -3
  215. package/dist/runtime/locations/runtime.js +61 -53
  216. package/dist/runtime/messaging/framework-json-v1.d.ts +4 -6
  217. package/dist/runtime/messaging/framework-json-v1.js +38 -294
  218. package/dist/runtime/messaging/packet-name.d.ts +1 -1
  219. package/dist/runtime/messaging/packet-name.js +8 -24
  220. package/dist/runtime/messaging/payload-codec.d.ts +7 -1
  221. package/dist/runtime/messaging/payload-codec.js +7 -6
  222. package/dist/runtime/messaging/request-result.d.ts +2 -0
  223. package/dist/runtime/messaging/request-result.js +57 -0
  224. package/dist/runtime/messaging/submission-result.d.ts +1 -0
  225. package/dist/runtime/messaging/submission-result.js +5 -2
  226. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +34 -1
  227. package/dist/runtime/protocol/service_wire_codec.generated.js +229 -0
  228. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +16 -1
  229. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +37 -8
  230. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +7 -2
  231. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +36 -21
  232. package/dist/runtime/spots/index.d.ts +21 -11
  233. package/dist/runtime/spots/index.js +243 -178
  234. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
  235. package/dist/runtime/spots/spot-activation-registry.js +21 -11
  236. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  237. package/dist/runtime/spots/spot-activation-state.js +7 -7
  238. package/dist/runtime/spots/spot-activation.d.ts +7 -3
  239. package/dist/runtime/spots/spot-activation.js +140 -52
  240. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
  241. package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
  242. package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
  243. package/dist/runtime/spots/spot-actor-membership.js +0 -8
  244. package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
  245. package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
  246. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
  247. package/dist/runtime/spots/spot-entry-activation.js +20 -11
  248. package/dist/runtime/spots/spot-handler-registry.d.ts +7 -4
  249. package/dist/runtime/spots/spot-handler-registry.js +24 -10
  250. package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
  251. package/dist/runtime/spots/spot-manager-public.js +2 -2
  252. package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
  253. package/dist/runtime/spots/spot-node-autoconnect.js +22 -42
  254. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
  255. package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
  256. package/dist/runtime/spots/spot-outbound.d.ts +3 -0
  257. package/dist/runtime/spots/spot-outbound.js +27 -18
  258. package/dist/runtime/spots/spot-remote-codec.js +5 -1
  259. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +1 -0
  260. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +1 -1
  261. package/dist/runtime/spots/spot-runtime-ports.d.ts +1 -1
  262. package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
  263. package/dist/runtime/spots/spot-serial-executor.js +61 -8
  264. package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
  265. package/dist/runtime/spots/spot-subscription-dispatch.js +1 -4
  266. package/dist/runtime/spots/spot-timer.d.ts +57 -5
  267. package/dist/runtime/spots/spot-timer.js +288 -103
  268. package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
  269. package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
  270. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
  271. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
  272. package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
  273. package/dist/runtime/streams/bound-session-service.d.ts +1 -1
  274. package/dist/runtime/streams/bound-session-service.js +6 -11
  275. package/dist/runtime/streams/index.d.ts +3 -2
  276. package/dist/runtime/streams/index.js +6 -4
  277. package/dist/runtime/streams/managed-stream.js +3 -2
  278. package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
  279. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
  280. package/dist/runtime/streams/session-actor-coordinator.js +15 -32
  281. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
  282. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -1
  283. package/dist/runtime/streams/stream-session-runtime.js +14 -31
  284. package/dist/runtime/workers/index.js +1 -1
  285. package/package.json +3 -3
  286. package/src/contracts/Actors/ZLinkActorClient.ts +2 -1
  287. package/src/contracts/Channels/Calls.ts +2 -1
  288. package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
  289. package/src/contracts/Common/ZLinkMessageMetadata.ts +13 -8
  290. package/src/contracts/Common/encoded-payload-storage.ts +6 -3
  291. package/src/contracts/Configuration/Builders.ts +4 -1
  292. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
  293. package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
  294. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  295. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
  296. package/src/contracts/Handlers/Attributes.ts +14 -21
  297. package/src/contracts/Handlers/JsonContract.ts +8 -216
  298. package/src/contracts/Locations/Rows.ts +2 -0
  299. package/src/contracts/Spots/Contracts.ts +10 -1
  300. package/src/contracts/Spots/ZLinkSpot.ts +3 -3
  301. package/src/nest-integration.ts +1 -0
  302. package/src/runtime/abort.ts +12 -0
  303. package/src/runtime/actors/actor-authority-publication.ts +3 -2
  304. package/src/runtime/actors/actor-client.ts +100 -85
  305. package/src/runtime/actors/actor-context.ts +49 -9
  306. package/src/runtime/actors/actor-handoff.ts +291 -110
  307. package/src/runtime/actors/actor-join-relocation.ts +3 -0
  308. package/src/runtime/actors/actor-local-native-join.ts +21 -26
  309. package/src/runtime/actors/actor-mailbox.ts +40 -2
  310. package/src/runtime/actors/actor-remote-joiner.ts +6 -1
  311. package/src/runtime/actors/actor-remote-wire.ts +17 -0
  312. package/src/runtime/actors/actor-reply.ts +42 -0
  313. package/src/runtime/actors/actor-routed-join-transport.ts +14 -4
  314. package/src/runtime/actors/actor-routed-json-request.ts +10 -2
  315. package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
  316. package/src/runtime/actors/actor-runtime-state.ts +2 -20
  317. package/src/runtime/actors/actor-source-transfer.ts +1 -34
  318. package/src/runtime/actors/index.ts +60 -32
  319. package/src/runtime/actors/session-disconnected-wire.ts +66 -0
  320. package/src/runtime/actors/spot-actor-dispatch.ts +4 -2
  321. package/src/runtime/admission.ts +69 -21
  322. package/src/runtime/application-jobs/application-ingress-record-owner.ts +41 -25
  323. package/src/runtime/application-jobs/application-job-queue-scope.ts +83 -22
  324. package/src/runtime/application-jobs/contracts.ts +16 -1
  325. package/src/runtime/backend/contracts/index.ts +92 -18
  326. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
  327. package/src/runtime/backend/mesh-completion-table.ts +160 -57
  328. package/src/runtime/backend/mesh-dispatch-pump.ts +237 -108
  329. package/src/runtime/backend/node/node-backend-adapter-support.ts +17 -8
  330. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +12 -2
  331. package/src/runtime/backend/node/node-raw-binding-port.ts +148 -85
  332. package/src/runtime/backend/node/node-raw-mesh-backend.ts +315 -201
  333. package/src/runtime/backend/node/node-socket-backend-adapter.ts +26 -11
  334. package/src/runtime/backend/raw-binding-port.ts +7 -2
  335. package/src/runtime/backend/runtime-message.ts +6 -0
  336. package/src/runtime/backend/runtime-values.ts +1 -0
  337. package/src/runtime/channels/channel-clients.ts +132 -58
  338. package/src/runtime/channels/channel-dispatch-pipeline.ts +198 -114
  339. package/src/runtime/channels/channel-dispatch-services.ts +69 -1
  340. package/src/runtime/channels/channel-dispatchers.ts +136 -90
  341. package/src/runtime/channels/channel-envelope-inspection.ts +2 -16
  342. package/src/runtime/channels/channel-envelope.ts +225 -31
  343. package/src/runtime/channels/channel-outbound-operations.ts +22 -8
  344. package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
  345. package/src/runtime/channels/channel-runtime-manager.ts +41 -17
  346. package/src/runtime/channels/channel-transports.ts +171 -112
  347. package/src/runtime/channels/client-server-location-runtime.ts +11 -10
  348. package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
  349. package/src/runtime/channels/fanout-location-runtime.ts +17 -9
  350. package/src/runtime/channels/local-spot-route-transport.ts +3 -1
  351. package/src/runtime/channels/router-socket-spot-route-transport.ts +13 -4
  352. package/src/runtime/channels/source-spot-router.ts +8 -4
  353. package/src/runtime/channels/spot-node-route-transport.ts +8 -4
  354. package/src/runtime/channels/spot-route-bridge-transport.ts +6 -4
  355. package/src/runtime/channels/spot-route-dispatch-strategy.ts +47 -18
  356. package/src/runtime/diagnostics/flow-context.ts +20 -7
  357. package/src/runtime/diagnostics/index.ts +1 -7
  358. package/src/runtime/diagnostics/message-flow.ts +47 -9
  359. package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
  360. package/src/runtime/execution/index.ts +40 -14
  361. package/src/runtime/execution/serial-execution-queue.ts +33 -4
  362. package/src/runtime/execution/state-lane.ts +7 -0
  363. package/src/runtime/foundation/actor-join-recovery-codec.ts +2 -2
  364. package/src/runtime/foundation/durable-service-request.ts +137 -0
  365. package/src/runtime/foundation/operation-identity.ts +5 -1
  366. package/src/runtime/foundation/operation-registry.ts +98 -20
  367. package/src/runtime/foundation/raw-service-mesh-runtime.ts +704 -336
  368. package/src/runtime/foundation/service-liveness-registry.ts +39 -0
  369. package/src/runtime/foundation/service-mailbox.ts +8 -0
  370. package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
  371. package/src/runtime/foundation/service-relocation-object-owner.ts +55 -36
  372. package/src/runtime/foundation/service-relocation-runtime.ts +25 -4
  373. package/src/runtime/foundation/service-runtime-contracts.ts +19 -2
  374. package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
  375. package/src/runtime/foundation/service-stateful-registry.ts +38 -35
  376. package/src/runtime/foundation/service-stateful-runtime.ts +732 -275
  377. package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -16
  378. package/src/runtime/foundation/service-topology-registry.ts +91 -36
  379. package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
  380. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  381. package/src/runtime/foundation/service-wire-m6a-codec.ts +231 -76
  382. package/src/runtime/handlers/handler-instance-scope.ts +67 -16
  383. package/src/runtime/host/actor-packet-relay.ts +113 -94
  384. package/src/runtime/host/actor-placement-coordinator.ts +31 -8
  385. package/src/runtime/host/actor-runtime-options-factory.ts +13 -2
  386. package/src/runtime/host/actor-transfer-runtime.ts +104 -430
  387. package/src/runtime/host/application-job-queue.ts +160 -41
  388. package/src/runtime/host/entry-actor-runtime.ts +4 -0
  389. package/src/runtime/host/index.ts +473 -271
  390. package/src/runtime/host/location-runtime-owner.ts +2 -6
  391. package/src/runtime/host/mesh-router-resolver.ts +13 -5
  392. package/src/runtime/host/remote-bound-session-relay.ts +88 -271
  393. package/src/runtime/host/route-mesh-runtime.ts +12 -6
  394. package/src/runtime/host/runtime-shutdown.ts +15 -4
  395. package/src/runtime/host/service-relocation-control.ts +11 -5
  396. package/src/runtime/host/service-relocation-host-runtime.ts +1092 -759
  397. package/src/runtime/host/spot-address-transport.ts +4 -2
  398. package/src/runtime/host/spot-runtime-options-factory.ts +20 -7
  399. package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
  400. package/src/runtime/locations/actor-location-claims.ts +52 -30
  401. package/src/runtime/locations/auto-connect-loop.ts +22 -14
  402. package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
  403. package/src/runtime/locations/auto-connect-types.ts +0 -1
  404. package/src/runtime/locations/descriptor-publication.ts +7 -0
  405. package/src/runtime/locations/domain-store-contract.ts +5 -0
  406. package/src/runtime/locations/in-memory-authority-store.ts +85 -23
  407. package/src/runtime/locations/in-memory-location-store.ts +1 -12
  408. package/src/runtime/locations/index.ts +1 -0
  409. package/src/runtime/locations/lease-tracker.ts +2 -9
  410. package/src/runtime/locations/lifecycle.ts +8 -26
  411. package/src/runtime/locations/location-store-repository.ts +628 -152
  412. package/src/runtime/locations/relocation-blob.ts +75 -1
  413. package/src/runtime/locations/request-source-resolver.ts +138 -0
  414. package/src/runtime/locations/resolvers.ts +2 -2
  415. package/src/runtime/locations/runtime.ts +98 -64
  416. package/src/runtime/messaging/framework-json-v1.ts +5 -325
  417. package/src/runtime/messaging/packet-name.ts +5 -25
  418. package/src/runtime/messaging/payload-codec.ts +8 -11
  419. package/src/runtime/messaging/request-result.ts +62 -0
  420. package/src/runtime/messaging/submission-result.ts +5 -1
  421. package/src/runtime/protocol/service_wire_codec.generated.ts +218 -5
  422. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +16 -13
  423. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +46 -25
  424. package/src/runtime/spots/index.ts +389 -283
  425. package/src/runtime/spots/spot-activation-registry.ts +25 -13
  426. package/src/runtime/spots/spot-activation-state.ts +12 -19
  427. package/src/runtime/spots/spot-activation.ts +198 -96
  428. package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
  429. package/src/runtime/spots/spot-actor-membership.ts +0 -15
  430. package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
  431. package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
  432. package/src/runtime/spots/spot-entry-activation.ts +33 -21
  433. package/src/runtime/spots/spot-handler-registry.ts +56 -12
  434. package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
  435. package/src/runtime/spots/spot-manager-public.ts +2 -2
  436. package/src/runtime/spots/spot-node-autoconnect.ts +28 -47
  437. package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
  438. package/src/runtime/spots/spot-outbound.ts +39 -19
  439. package/src/runtime/spots/spot-remote-codec.ts +9 -2
  440. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +2 -1
  441. package/src/runtime/spots/spot-runtime-ports.ts +1 -1
  442. package/src/runtime/spots/spot-serial-executor.ts +97 -25
  443. package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
  444. package/src/runtime/spots/spot-subscription-dispatch.ts +1 -4
  445. package/src/runtime/spots/spot-timer.ts +418 -158
  446. package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
  447. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
  448. package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
  449. package/src/runtime/streams/bound-session-service.ts +7 -10
  450. package/src/runtime/streams/index.ts +12 -6
  451. package/src/runtime/streams/managed-stream.ts +4 -2
  452. package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
  453. package/src/runtime/streams/session-actor-coordinator.ts +39 -88
  454. package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
  455. package/src/runtime/streams/stream-session-runtime.ts +13 -34
  456. package/src/runtime/workers/index.ts +1 -1
@@ -1,3 +1,4 @@
1
+ import { createZLinkRequest } from '../messaging/request-result';
1
2
  import {
2
3
  type RoutingId,
3
4
  type ZLinkChannelClient,
@@ -174,6 +175,7 @@ export class DefaultZLinkSpotOutbound implements ZLinkSpotOutbound {
174
175
  }
175
176
 
176
177
  export interface ZLinkSpotAddressCallOptions {
178
+ readonly onAdmitted?: () => void;
177
179
  readonly metadata?: ReadonlyMap<string, string>;
178
180
  readonly instanceSpot: boolean;
179
181
  readonly instanceSpotType?: string;
@@ -232,6 +234,7 @@ export interface ZLinkSpotRoutedSendOptions {
232
234
  }
233
235
 
234
236
  export interface ZLinkSpotRoutedRequestOptions extends ZLinkSpotRoutedSendOptions {
237
+ readonly onAdmitted?: () => void;
235
238
  readonly timeoutMs?: number;
236
239
  readonly signal?: AbortSignal;
237
240
  }
@@ -308,14 +311,13 @@ function createAddressedSpotRequestCall(
308
311
  sourceSpotProvider?: () => ZLinkBackendSpot | undefined
309
312
  ): ZLinkSpotRequestCall {
310
313
  const options = newAddressCallOptions();
311
- const begin = <TReply>(waitPolicy: 'async' | 'yield', signal?: AbortSignal) => {
312
- markSubmitted(options);
313
- rejectSameSpotAsyncRequest(serial, spotId, waitPolicy);
314
+ const begin = <TReply>(signal?: AbortSignal, onAdmitted?: () => void) => {
314
315
  return startRequestOnSerial<TReply>(serial, () => ({
315
316
  pending: transport.requestToSpotAddress<TReply>(spotId, request, {
316
317
  ...freezeAddressCallOptions(options, sourceSpotProvider?.()),
317
318
  timeoutMs: options.timeoutMs,
318
- signal
319
+ signal,
320
+ onAdmitted
319
321
  })
320
322
  }));
321
323
  };
@@ -356,13 +358,19 @@ function createAddressedSpotRequestCall(
356
358
  return this;
357
359
  },
358
360
  submit<TReply>(signal?: AbortSignal) {
359
- const pending = begin<TReply>('async', signal);
360
- return serial.isCurrentTurn ? pending : deliverOnSerial(serial, pending);
361
+ markSubmitted(options);
362
+ rejectSameSpotAsyncRequest(serial, spotId, 'async');
363
+ return createZLinkRequest(
364
+ (onAdmitted) => begin<TReply>(signal, onAdmitted),
365
+ (pending) => (serial.isCurrentTurn ? pending : deliverOnSerial(serial, pending))
366
+ );
361
367
  },
362
368
  yield<TReply>(signal?: AbortSignal) {
363
369
  const turn = requireZLinkYieldTurn();
364
- const pending = begin<TReply>('yield', signal);
365
- return turn.yieldPromise(pending);
370
+ markSubmitted(options);
371
+ rejectSameSpotAsyncRequest(serial, spotId, 'yield');
372
+ const pending = begin<TReply>(signal);
373
+ return turn.yieldFrameworkPromise(pending);
366
374
  }
367
375
  };
368
376
  }
@@ -475,8 +483,12 @@ function wrapRequestCall(
475
483
  serial: ZLinkSpotSerialTurnExecutor,
476
484
  inner: ZLinkChannelRequestCall
477
485
  ): ZLinkChannelRequestCall {
478
- const begin = <TReply>(signal?: AbortSignal) =>
479
- startRequestOnSerial(serial, () => ({ pending: inner.submit<TReply>(signal) }));
486
+ const begin = <TReply>(signal?: AbortSignal, onAdmitted?: () => void) =>
487
+ startRequestOnSerial(serial, () => {
488
+ const pending = inner.submit<TReply>(signal);
489
+ if (onAdmitted !== undefined) void pending.admitted.then(onAdmitted, () => undefined);
490
+ return { pending };
491
+ });
480
492
  return {
481
493
  metadata(key: string | ZLinkMessageMetadata, value?: string) {
482
494
  if (typeof key === 'string') inner.metadata(key, value!);
@@ -488,13 +500,15 @@ function wrapRequestCall(
488
500
  return this;
489
501
  },
490
502
  submit<TReply>(signal?: AbortSignal) {
491
- const pending = begin<TReply>(signal);
492
- return serial.isCurrentTurn ? pending : deliverOnSerial(serial, pending);
503
+ return createZLinkRequest(
504
+ (onAdmitted) => begin<TReply>(signal, onAdmitted),
505
+ (pending) => (serial.isCurrentTurn ? pending : deliverOnSerial(serial, pending))
506
+ );
493
507
  },
494
508
  yield<TReply>(signal?: AbortSignal) {
495
509
  const turn = requireZLinkYieldTurn();
496
510
  const pending = begin<TReply>(signal);
497
- return turn.yieldPromise(pending);
511
+ return turn.yieldFrameworkPromise(pending);
498
512
  }
499
513
  };
500
514
  }
@@ -571,15 +585,15 @@ function wrapRoutedSpotRequestCall(
571
585
  ): ZLinkRequestCall & Pick<ZLinkChannelRequestCall, 'yield'> {
572
586
  let selectedTimeoutMs: number | undefined;
573
587
  const metadata = new Map<string, string>();
574
- const begin = <TReply>(waitPolicy: 'async' | 'yield', signal?: AbortSignal) => {
588
+ const begin = <TReply>(signal?: AbortSignal, onAdmitted?: () => void) => {
575
589
  // A request to the current Spot would wait behind the handler that owns
576
590
  // the same Spot claim. Reject it before resolving a route or submitting
577
591
  // transport work; one-way self-send remains a valid FIFO admission.
578
- rejectSameSpotAsyncRequest(serial, spot.spotId, waitPolicy);
579
592
  return startRequestOnSerial<TReply>(serial, () => ({
580
593
  pending: requestToSpotHandle<TReply>(transport, spot, request, {
581
594
  timeoutMs: selectedTimeoutMs,
582
595
  signal,
596
+ onAdmitted,
583
597
  metadata,
584
598
  spotRouterChannelIdForMesh,
585
599
  sourceSpot: sourceSpotProvider?.()
@@ -602,13 +616,17 @@ function wrapRoutedSpotRequestCall(
602
616
  return this;
603
617
  },
604
618
  submit<TReply>(signal?: AbortSignal) {
605
- const pending = begin<TReply>('async', signal);
606
- return serial.isCurrentTurn ? pending : deliverOnSerial(serial, pending);
619
+ rejectSameSpotAsyncRequest(serial, spot.spotId, 'async');
620
+ return createZLinkRequest(
621
+ (onAdmitted) => begin<TReply>(signal, onAdmitted),
622
+ (pending) => (serial.isCurrentTurn ? pending : deliverOnSerial(serial, pending))
623
+ );
607
624
  },
608
625
  yield<TReply>(signal?: AbortSignal) {
609
626
  const turn = requireZLinkYieldTurn();
610
- const pending = begin<TReply>('yield', signal);
611
- return turn.yieldPromise(pending);
627
+ rejectSameSpotAsyncRequest(serial, spot.spotId, 'yield');
628
+ const pending = begin<TReply>(signal);
629
+ return turn.yieldFrameworkPromise(pending);
612
630
  }
613
631
  };
614
632
  }
@@ -628,6 +646,7 @@ function rejectSameSpotAsyncRequest(
628
646
  }
629
647
 
630
648
  export interface ZLinkSpotHandleCallOptions {
649
+ readonly onAdmitted?: () => void;
631
650
  readonly metadata?: ReadonlyMap<string, string>;
632
651
  readonly timeoutMs?: number;
633
652
  readonly signal?: AbortSignal;
@@ -672,6 +691,7 @@ export async function requestToSpotHandle<TReply = unknown>(
672
691
  packetName,
673
692
  timeoutMs: options.timeoutMs,
674
693
  signal: options.signal,
694
+ onAdmitted: options.onAdmitted,
675
695
  metadata: options.metadata
676
696
  };
677
697
  if (options.sourceSpot !== undefined && transport.requestFromSpotToSpot !== undefined) {
@@ -8,7 +8,7 @@ import type { Message } from '../../contracts/Common/Message';
8
8
  import { ZLinkBufferMessage as RuntimeMessage } from '../backend/runtime-message';
9
9
  import type { ZLinkBackendReceived as BackendReceived } from '../backend/runtime-values';
10
10
  import { decodeChannelEnvelope } from '../channels/channel-envelope';
11
- import { decodeRoutingId as decodeWireRoutingId } from '../routing-id';
11
+ import { decodeRoutingId as decodeWireRoutingId, routingIdsEqual } from '../routing-id';
12
12
  import {
13
13
  REMOTE_ACTOR_JOIN_PACKET,
14
14
  type ZLinkRemoteActorJoinWirePayload
@@ -176,7 +176,14 @@ export function decodeHandoffBacklog(value: unknown): readonly ZLinkActorHandoff
176
176
  BigInt(source.ownerLeaseGeneration) <= 0n ||
177
177
  source.nodeRid.length === 0 ||
178
178
  BigInt(source.nodeGeneration) <= 0n ||
179
- source.replyRouteId !== messageFollowContext.replyRouteId)) ||
179
+ source.replyRouteId !==
180
+ (packet.messageFollowOrigin !== undefined &&
181
+ routingIdsEqual(
182
+ decodeWireRoutingId(source.nodeRid, source.nodeRidHex),
183
+ packet.messageFollowOrigin.sourceNodeRid
184
+ )
185
+ ? packet.messageFollowOrigin.originalReplyRouteId.toString()
186
+ : messageFollowContext.replyRouteId))) ||
180
187
  (!packet.returnResponse && source !== undefined)
181
188
  ) {
182
189
  throw new Error('Remote actor handoff request source fence is invalid.');
@@ -50,6 +50,7 @@ interface ZLinkRoutedSpotPacketDispatchOptions {
50
50
 
51
51
  interface ZLinkRoutedSpotPacketContext {
52
52
  readonly channelName: string;
53
+ readonly onAdmitted?: () => void;
53
54
  readonly contentType?: string;
54
55
  readonly workOptions?: ZLinkSerialWorkOptions;
55
56
  readonly admissionTimeoutMs?: number;
@@ -265,7 +266,7 @@ export class ZLinkRoutedSpotPacketDispatch {
265
266
  }
266
267
  await activation.serial.execute(
267
268
  runHandler,
268
- context.workOptions,
269
+ { ...context.workOptions, onAdmitted: context.onAdmitted },
269
270
  instanceIntent ? runHandler : undefined
270
271
  );
271
272
  }
@@ -22,6 +22,7 @@ import type {
22
22
  import type { ZLinkBackendSpotNode } from '../backend/contracts';
23
23
 
24
24
  export interface ZLinkEntryActorRuntime {
25
+ releaseMembers?(meshName: string): Promise<void>;
25
26
  resolveActor(actorId: string): ZLinkActor | undefined;
26
27
  commitActorTransaction(actor: ZLinkActor, onJoined: () => Promise<void>): Promise<void>;
27
28
  destroyActor(
@@ -91,7 +92,6 @@ export interface ZLinkSpotActorTransferRuntime {
91
92
  commitRoutedActor(actor: ZLinkActor, spotId: RoutingId, spot: ZLinkSpot): void;
92
93
  clearRoutedActor(actor: ZLinkActor): void;
93
94
  rollbackRoutedActor(actor: ZLinkActor, signal?: AbortSignal): Promise<void>;
94
- notifyCoreSourceLeave(actor: ZLinkActor, callback: () => Promise<void>): Promise<void>;
95
95
  actorEntryNodeRid(actor: ZLinkActor): RoutingId | undefined;
96
96
  }
97
97
 
@@ -1,13 +1,24 @@
1
1
  import { ZLinkUserSpotExecutionMode } from '../../contracts';
2
2
  import { ZLinkActorSerialExecutor } from '../actors';
3
- import type { ZLinkExecutionBarrier } from '../execution';
3
+ import type {
4
+ ZLinkActorHandoffDispatch,
5
+ ZLinkActorHandoffPrefixAdmission,
6
+ ZLinkActorHandoffPrefixRecord
7
+ } from '../actors/actor-handoff';
8
+ import type { ZLinkExecutionBarrier, ZLinkExecutionBarrierSeal } from '../execution';
4
9
  import type {
5
10
  ZLinkSerialSchedulerOptions,
6
- ZLinkSerialWorkPreparation,
7
11
  ZLinkSerialWorkOptions
8
12
  } from '../execution/serial-execution-queue';
9
13
  import { ZLinkSpotSerialTurnExecutor } from './spot-serial-turn-executor';
10
14
 
15
+ export type ZLinkSpotPreparationCompletion = 'publication' | 'first-terminal';
16
+
17
+ export type ZLinkActorPacketTurnDispatch = (
18
+ serial: ZLinkSpotSerialTurnExecutor,
19
+ ...args: Parameters<ZLinkActorHandoffDispatch>
20
+ ) => ReturnType<ZLinkActorHandoffDispatch>;
21
+
11
22
  /**
12
23
  * Owns every application serial unit that belongs to one Spot activation.
13
24
  *
@@ -21,6 +32,11 @@ export class ZLinkSpotSerialExecutor {
21
32
  private executionBarrier: ZLinkExecutionBarrier | undefined;
22
33
  private closing = false;
23
34
  private closePromise: Promise<void> | undefined;
35
+ private preparation?: {
36
+ readonly seal: ZLinkExecutionBarrierSeal;
37
+ readonly complete: (terminal?: () => Promise<void>) => void;
38
+ readonly execution: Promise<void>;
39
+ };
24
40
 
25
41
  constructor(
26
42
  private readonly spotSerial: ZLinkSpotSerialTurnExecutor,
@@ -39,6 +55,54 @@ export class ZLinkSpotSerialExecutor {
39
55
  for (const serial of this.timerSerials.values()) serial.setExecutionBarrier(barrier);
40
56
  }
41
57
 
58
+ get isPreparing(): boolean {
59
+ return this.preparation !== undefined;
60
+ }
61
+
62
+ beginPreparation(kind: 'activation' | 'relocation' = 'activation'): void {
63
+ if (this.preparation !== undefined || this.executionBarrier === undefined)
64
+ throw new Error('Activation preparation requires one unowned execution barrier.');
65
+ const barrier = this.executionBarrier;
66
+ const seal = barrier.seal(kind);
67
+ let complete!: (terminal?: () => Promise<void>) => void;
68
+ const terminal = new Promise<(() => Promise<void>) | undefined>((resolve) => {
69
+ complete = resolve;
70
+ });
71
+ // The staging seal itself owns target preparation. No normal preparation
72
+ // item is admitted in addition to this lifecycle owner.
73
+ const execution = this.spotSerial.executeControlLifecycleOperation(
74
+ async () => {
75
+ const finish = await terminal;
76
+ await finish?.();
77
+ },
78
+ {
79
+ canExecuteApplication: (record) => record.context === undefined || !barrier.isCurrent(seal)
80
+ }
81
+ );
82
+ this.preparation = { seal, complete, execution };
83
+ }
84
+
85
+ openPreparationAdmission(): void {
86
+ if (this.preparation !== undefined) this.executionBarrier!.abort(this.preparation.seal);
87
+ }
88
+
89
+ async finishPreparation(terminal?: () => Promise<void>): Promise<void> {
90
+ const preparation = this.preparation;
91
+ if (preparation === undefined) {
92
+ await terminal?.();
93
+ return;
94
+ }
95
+ preparation.complete(terminal);
96
+ try {
97
+ await preparation.execution;
98
+ } finally {
99
+ if (this.preparation === preparation) {
100
+ this.executionBarrier!.abort(preparation.seal);
101
+ this.preparation = undefined;
102
+ }
103
+ }
104
+ }
105
+
42
106
  executeSpot<T>(
43
107
  operation: () => Promise<T> | T,
44
108
  workOptions?: ZLinkSerialWorkOptions
@@ -55,35 +119,43 @@ export class ZLinkSpotSerialExecutor {
55
119
  return this.actorExecutor(actorId).execute(() => operation(serial), workOptions);
56
120
  }
57
121
 
58
- /** @internal Restores a durable Actor FIFO prefix without starting it. */
59
- admitActorDurablePrefix(
122
+ executeTimer<T>(
123
+ timerName: string,
124
+ operation: () => Promise<T> | T,
125
+ workOptions?: ZLinkSerialWorkOptions
126
+ ): Promise<T> {
127
+ return this.timerSerial(timerName).post(operation, workOptions);
128
+ }
129
+
130
+ /** Admits held packets through the same Actor FIFO as ordinary ingress. */
131
+ admitActorPacketPrefix(
60
132
  actorId: string,
61
- records: readonly {
62
- readonly operation: (
63
- executeChild: <TChild>(
64
- child: (serial: ZLinkSpotSerialTurnExecutor) => Promise<TChild> | TChild
65
- ) => Promise<TChild>
66
- ) => Promise<void>;
67
- readonly preparation?: ZLinkSerialWorkPreparation;
68
- readonly workOptions?: ZLinkSerialWorkOptions;
69
- }[]
70
- ): readonly Promise<void>[] {
133
+ records: readonly ZLinkActorHandoffPrefixRecord[],
134
+ dispatch: ZLinkActorPacketTurnDispatch
135
+ ): ZLinkActorHandoffPrefixAdmission {
71
136
  const serial = this.actorSerial(actorId);
72
- return this.actorExecutor(actorId).admitDurablePrefix(
137
+ const terminals = this.actorExecutor(actorId).admitDurablePrefix(
73
138
  records.map((record) => ({
74
- operation: (executeChild) => record.operation((child) => executeChild(() => child(serial))),
139
+ operation: (executeChild) =>
140
+ record.drain((parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef) =>
141
+ executeChild(() =>
142
+ dispatch(serial, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef)
143
+ )
144
+ ),
75
145
  preparation: record.preparation,
76
- workOptions: record.workOptions
146
+ workOptions: { payloadBytes: record.payloadBytes, onWithdrawable: record.onWithdrawable }
77
147
  }))
78
148
  );
79
- }
80
-
81
- executeTimer<T>(
82
- timerName: string,
83
- operation: () => Promise<T> | T,
84
- workOptions?: ZLinkSerialWorkOptions
85
- ): Promise<T> {
86
- return this.timerSerial(timerName).execute(operation, workOptions);
149
+ const terminal = Promise.allSettled(terminals).then((outcomes) => {
150
+ const errors = outcomes.flatMap((outcome) =>
151
+ outcome.status === 'rejected' ? [outcome.reason] : []
152
+ );
153
+ if (errors.length === 1) throw errors[0];
154
+ if (errors.length > 1) {
155
+ throw new AggregateError(errors, `Actor '${actorId}' durable prefix replay failed.`);
156
+ }
157
+ });
158
+ return { terminal };
87
159
  }
88
160
 
89
161
  isTimerExecuting(timerName: string): boolean {
@@ -153,7 +153,7 @@ export class ZLinkSpotSerialTurnExecutor {
153
153
  * this so they never run inline inside another callback's turn.
154
154
  */
155
155
  post<T>(operation: () => Promise<T> | T, workOptions?: ZLinkSerialWorkOptions): Promise<T> {
156
- return this.enqueueApplicationTurn(operation, workOptions);
156
+ return this.enqueueApplicationTurn(operation, workOptions, undefined, true);
157
157
  }
158
158
 
159
159
  /**
@@ -260,12 +260,25 @@ export class ZLinkSpotSerialTurnExecutor {
260
260
  private async enqueueApplicationTurn<T>(
261
261
  operation: () => Promise<T> | T,
262
262
  workOptions: ZLinkSerialWorkOptions = {},
263
- replay?: (failure?: unknown) => Promise<T>
263
+ replay?: (failure?: unknown) => Promise<T>,
264
+ retainWhilePreparing = false
264
265
  ): Promise<T> {
265
266
  this.lastActivityAtMs = performance.now();
266
267
  let barrierClaim: ZLinkExecutionBarrierClaim | undefined;
267
268
  try {
268
269
  const entry = this.executionBarrier?.enter();
270
+ if (
271
+ entry instanceof Promise &&
272
+ retainWhilePreparing &&
273
+ this.scheduler.retainsApplicationForLifecycle
274
+ ) {
275
+ try {
276
+ return await this.submitQueuedTurn(operation, workOptions, entry);
277
+ } catch (error) {
278
+ (await entry).release();
279
+ throw error;
280
+ }
281
+ }
269
282
  barrierClaim = entry instanceof Promise ? await entry : entry;
270
283
  const refusal = this.applicationAdmissionRefusal(replay !== undefined);
271
284
  if (refusal !== undefined) throw refusal;
@@ -300,7 +313,7 @@ export class ZLinkSpotSerialTurnExecutor {
300
313
  private submitQueuedTurn<T>(
301
314
  operation: () => Promise<T> | T,
302
315
  workOptions: ZLinkSerialWorkOptions,
303
- barrierClaim?: ZLinkExecutionBarrierClaim
316
+ barrierClaim?: ZLinkExecutionBarrierClaim | Promise<ZLinkExecutionBarrierClaim>
304
317
  ): Promise<T> {
305
318
  const options = {
306
319
  ...workOptions,
@@ -313,6 +326,12 @@ export class ZLinkSpotSerialTurnExecutor {
313
326
  }
314
327
 
315
328
  private runQueuedRecord(record: ZLinkSerialWorkRecord<unknown>): Promise<void> {
329
+ if (record.context instanceof Promise) {
330
+ return record.context.then((claim: ZLinkExecutionBarrierClaim) => {
331
+ Object.assign(record, { context: claim });
332
+ return this.runQueuedRecord(record);
333
+ });
334
+ }
316
335
  const context = record.context as ZLinkSpotApplicationTurnContext | undefined;
317
336
  if (context?.replay !== undefined && record.operation === context.replay) {
318
337
  context.release();
@@ -68,9 +68,6 @@ export class ZLinkSpotSubscriptionDispatch {
68
68
  }
69
69
  const key = subscriptionKey(registration.channelName, registration.topic);
70
70
  const existing = this.handlers.get(key) ?? [];
71
- if (existing.some((entry) => entry.handlerType === registration.handlerType)) {
72
- continue;
73
- }
74
71
  existing.push(registration);
75
72
  this.handlers.set(key, existing);
76
73
  this.options.nativeSpot.setSubscription(registration.channelName, registration.topic);
@@ -191,7 +188,7 @@ export class ZLinkSpotSubscriptionDispatch {
191
188
  undefined
192
189
  );
193
190
  try {
194
- await this.options.serial.execute(
191
+ await this.options.serial.post(
195
192
  () =>
196
193
  runWithFlow(inboundFlow, async () => {
197
194
  // Payload deserialization belongs to the Spot serial turn. Queue