@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
@@ -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';
@@ -101,6 +102,7 @@ export interface ZLinkSpotActivationLifecycleOptions {
101
102
  readonly nodeRid?: RoutingId;
102
103
  readonly nodeRidProvider?: (meshName: string) => RoutingId | undefined;
103
104
  readonly actorCountProvider?: (spotId: RoutingId) => number;
105
+ readonly releaseActorMembers?: (meshName: string, spotId: RoutingId) => Promise<void>;
104
106
  readonly userSpotExecutionMode?: (
105
107
  meshName: string,
106
108
  spotType: Type<ZLinkSpot>
@@ -148,7 +150,9 @@ export interface ZLinkSpotActivationLifecycleOptions {
148
150
  objectGeneration: bigint,
149
151
  signal?: AbortSignal
150
152
  ) => Promise<boolean>;
151
- 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;
152
156
  readonly routeToActorJoinPrewarm?: ZLinkRouteToActorJoinPrewarm;
153
157
  readonly releaseLocation: (
154
158
  activation: ZLinkSpotActivation,
@@ -200,6 +204,7 @@ export class ZLinkSpotActivationLifecycle {
200
204
  spotId: RoutingId,
201
205
  objectGeneration: bigint,
202
206
  authorityOwnerGeneration: bigint,
207
+ restoredTimers: readonly ZLinkTimerRelocationState[],
203
208
  signal?: AbortSignal
204
209
  ): Promise<ZLinkSpotActivation> {
205
210
  const executionMode =
@@ -215,7 +220,10 @@ export class ZLinkSpotActivationLifecycle {
215
220
  );
216
221
  const serialExecutor = new ZLinkSpotSerialExecutor(serial, executionMode, spotId);
217
222
  const actorHandlers = new ZLinkSpotActorHandlerRegistryRuntime();
218
- const handlers = new DefaultZLinkSpotHandlerRegistry(actorHandlers);
223
+ const handlers = new DefaultZLinkSpotHandlerRegistry(
224
+ actorHandlers,
225
+ this.options.providerResolver
226
+ );
219
227
  applySpotHandlerRegistrations(
220
228
  handlers,
221
229
  implementation as unknown as Type<ZLinkSpot>,
@@ -237,6 +245,9 @@ export class ZLinkSpotActivationLifecycle {
237
245
  (name) => serialExecutor.isTimerExecuting(name),
238
246
  this.options.timerClock
239
247
  );
248
+ // Spot timer §1: the source schedule exists before Configure so its
249
+ // registrations reattach to the restored keys.
250
+ timers.stageRelocation(restoredTimers);
240
251
  const outbound = new DefaultZLinkSpotOutbound({
241
252
  serial,
242
253
  channelClient: this.options.channelClient,
@@ -301,20 +312,6 @@ export class ZLinkSpotActivationLifecycle {
301
312
  enumerable: false,
302
313
  value: context
303
314
  });
304
- await instance.configure?.();
305
- await addSpotTimerRegistrations(
306
- timers,
307
- implementation as unknown as Type<ZLinkSpot>,
308
- spotId,
309
- instance as unknown as ZLinkSpot,
310
- serial,
311
- { timerHandlers: this.options.spotTimerHandlers },
312
- {
313
- providerResolver: this.options.providerResolver,
314
- runtimeEventPublisher: this.options.runtimeEventPublisher,
315
- signal
316
- }
317
- );
318
315
  activation = new ZLinkSpotActivation({
319
316
  meshName,
320
317
  spotId,
@@ -342,9 +339,42 @@ export class ZLinkSpotActivationLifecycle {
342
339
  nativeSpot,
343
340
  metrics: this.options.metrics
344
341
  });
345
- 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);
346
373
  return activation;
347
374
  } catch (error) {
375
+ const preparation = await Promise.allSettled(
376
+ activation === undefined ? [] : [this.discardPreparation(activation)]
377
+ );
348
378
  const cleanup = await Promise.allSettled([
349
379
  timers.dispose(),
350
380
  ...(instance === undefined
@@ -352,7 +382,7 @@ export class ZLinkSpotActivationLifecycle {
352
382
  : [disposeLifecycleHandlers(instance, this.options.detachedTaskRunner)]),
353
383
  ...(nativeSpot === undefined ? [] : [Promise.resolve().then(() => nativeSpot.dispose())])
354
384
  ]);
355
- const cleanupErrors = cleanup
385
+ const cleanupErrors = [...preparation, ...cleanup]
356
386
  .filter((result): result is PromiseRejectedResult => result.status === 'rejected')
357
387
  .map((result) => result.reason);
358
388
  if (cleanupErrors.length > 0) {
@@ -374,6 +404,7 @@ export class ZLinkSpotActivationLifecycle {
374
404
  signal?: AbortSignal,
375
405
  serialOwner?: ZLinkSpotActivation
376
406
  ): Promise<ZLinkSpotActivation> {
407
+ throwIfAborted(signal);
377
408
  const serial = serialOwner?.serial ?? new ZLinkSpotSerialTurnExecutor(true, spotId);
378
409
  const serialExecutor = new ZLinkSpotSerialExecutor(
379
410
  serial,
@@ -381,7 +412,10 @@ export class ZLinkSpotActivationLifecycle {
381
412
  spotId
382
413
  );
383
414
  const actorHandlers = new ZLinkSpotActorHandlerRegistryRuntime();
384
- const handlers = new DefaultZLinkSpotHandlerRegistry(actorHandlers);
415
+ const handlers = new DefaultZLinkSpotHandlerRegistry(
416
+ actorHandlers,
417
+ this.options.providerResolver
418
+ );
385
419
  const instanceHandlers = new DefaultZLinkInstanceSpotHandlerRegistry(handlers);
386
420
  applySpotHandlerRegistrations(handlers, implementation as unknown as Type<ZLinkSpot>, {
387
421
  packetHandlers: this.options.spotPacketHandlers
@@ -446,35 +480,52 @@ export class ZLinkSpotActivationLifecycle {
446
480
  externalActorCount: () => this.options.actorCountProvider?.(spotId) ?? 0
447
481
  });
448
482
  try {
449
- await instance.configure?.();
450
- await addSpotTimerRegistrations(
451
- timers,
452
- implementation as unknown as Type<ZLinkSpot>,
453
- spotId,
454
- instance as unknown as ZLinkSpot,
455
- serial,
456
- { timerHandlers: this.options.spotTimerHandlers },
457
- {
458
- providerResolver: this.options.providerResolver,
459
- runtimeEventPublisher: this.options.runtimeEventPublisher,
460
- signal
461
- }
462
- );
463
- await (serialOwner === undefined
464
- ? serial.execute(() => instance!.onInitialize?.())
465
- : serial.postBarrierTurn(() => instance!.onInitialize?.()));
466
- 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);
467
505
  return activation;
468
506
  } catch (error) {
469
- const cleanup = await Promise.allSettled([
470
- timers.dispose(),
471
- disposeLifecycleHandlers(instance, this.options.detachedTaskRunner)
472
- ]);
473
- const cleanupErrors = cleanup
474
- .filter((result): result is PromiseRejectedResult => result.status === 'rejected')
475
- .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;
476
527
  throw new AggregateError(
477
- [error, ...cleanupErrors],
528
+ [failure, ...cleanupErrors],
478
529
  `Instance Spot '${instanceType}' materialization failed for '${String(spotId)}'.`
479
530
  );
480
531
  }
@@ -482,6 +533,11 @@ export class ZLinkSpotActivationLifecycle {
482
533
 
483
534
  async discardInstance(activation: ZLinkSpotActivation): Promise<void> {
484
535
  const errors: unknown[] = [];
536
+ try {
537
+ await this.discardPreparation(activation);
538
+ } catch (error) {
539
+ errors.push(error);
540
+ }
485
541
  try {
486
542
  await activation.serial.execute(() =>
487
543
  invokeSpotClosing(
@@ -524,6 +580,7 @@ export class ZLinkSpotActivationLifecycle {
524
580
  signal?: AbortSignal,
525
581
  authority?: ZLinkNativeSpotAuthority
526
582
  ): Promise<ZLinkLocalSpotCreateResult> {
583
+ throwIfAborted(signal);
527
584
  const executionMode =
528
585
  this.options.userSpotExecutionMode?.(meshName, spotType) ??
529
586
  ZLinkUserSpotExecutionMode.SpotWide;
@@ -533,7 +590,10 @@ export class ZLinkSpotActivationLifecycle {
533
590
  );
534
591
  const serialExecutor = new ZLinkSpotSerialExecutor(serial, executionMode, spotId);
535
592
  const actorHandlers = new ZLinkSpotActorHandlerRegistryRuntime();
536
- const handlers = new DefaultZLinkSpotHandlerRegistry(actorHandlers);
593
+ const handlers = new DefaultZLinkSpotHandlerRegistry(
594
+ actorHandlers,
595
+ this.options.providerResolver
596
+ );
537
597
  applySpotHandlerRegistrations(handlers, spotType, {
538
598
  actorSendHandlers: this.options.spotActorSendHandlers,
539
599
  actorRequestHandlers: this.options.spotActorRequestHandlers,
@@ -678,12 +738,8 @@ export class ZLinkSpotActivationLifecycle {
678
738
  const cleanupErrors: unknown[] = [];
679
739
  try {
680
740
  if (activation !== undefined) {
681
- await this.cleanupActivation(
682
- activation,
683
- locationClaim.meshName,
684
- lifecycleStarted,
685
- signal
686
- );
741
+ if (!lifecycleStarted)
742
+ await this.cleanupActivation(activation, locationClaim.meshName, false);
687
743
  } else {
688
744
  const partialCleanup = await Promise.allSettled([
689
745
  timers.dispose(),
@@ -853,7 +909,7 @@ export class ZLinkSpotActivationLifecycle {
853
909
  undefined,
854
910
  ZLinkSpotCloseReason.ExplicitClose,
855
911
  undefined,
856
- true
912
+ !activation.serialExecutor.isPreparing
857
913
  );
858
914
  }
859
915
 
@@ -920,59 +976,69 @@ export class ZLinkSpotActivationLifecycle {
920
976
  signal?: AbortSignal
921
977
  ): Promise<ZLinkLocalSpotCreateResult> {
922
978
  try {
923
- await activation.spot.configure?.();
924
- nativeDispatch?.configureSubscriptions(activation.handlers.snapshot());
925
- await addSpotTimerRegistrations(
926
- activation.timers,
927
- spotType,
928
- activation.spotId,
929
- activation.spot,
930
- activation.serial,
931
- { timerHandlers: this.options.spotTimerHandlers },
932
- {
933
- providerResolver: this.options.providerResolver,
934
- runtimeEventPublisher: this.options.runtimeEventPublisher,
935
- signal
936
- }
937
- );
979
+ activation.serialExecutor.beginPreparation();
980
+ this.options.stageActivation?.(activation);
938
981
  let createResponse: ZLinkSpotCreateResponse | undefined;
939
- 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);
940
1000
  createResponse = await activation.spot.onCreate?.(
941
1001
  wrapFrameworkPayloadMessage(
942
1002
  request,
943
1003
  this.options.messageSerializers,
944
1004
  frameworkPayloadContentType(request)
945
- )
1005
+ ),
1006
+ signal
946
1007
  );
947
1008
  if (createResponse?.accepted === false) {
948
1009
  return;
949
1010
  }
950
- await activation.spot.onInitialize?.();
1011
+ throwIfAborted(signal);
1012
+ await activation.spot.onInitialize?.(signal);
951
1013
  });
1014
+ throwIfAborted(signal);
952
1015
  if (createResponse?.accepted === false) {
953
- await this.cleanupActivation(activation, locationClaim.meshName, false, signal);
1016
+ await this.cleanupActivation(activation, locationClaim.meshName, false);
954
1017
  return {
955
1018
  spotId: activation.spotId,
956
1019
  state: ZLinkSpotCreateState.Rejected,
957
1020
  reply: this.decodeCreateReply(createResponse.reply)
958
1021
  };
959
1022
  }
960
- this.options.registerActivation(activation);
1023
+ await this.options.registerActivation(activation);
961
1024
  return {
962
1025
  spotId: activation.spotId,
963
1026
  state: ZLinkSpotCreateState.Created,
964
1027
  reply: this.decodeCreateReply(createResponse?.reply)
965
1028
  };
966
1029
  } catch (error) {
1030
+ const failure = signal?.aborted === true ? createAbortError() : error;
1031
+ const cancelled = isAbortError(failure);
1032
+ if (cancelled) activation.serial.closeAdmission();
967
1033
  try {
968
- await this.cleanupActivation(activation, locationClaim.meshName, true, signal);
1034
+ await this.cleanupActivation(activation, locationClaim.meshName, !cancelled);
969
1035
  } catch (cleanupError) {
970
1036
  throw new AggregateError(
971
- [error, cleanupError],
1037
+ [failure, cleanupError],
972
1038
  `Spot '${activation.spotId}' creation cleanup failed.`
973
1039
  );
974
1040
  }
975
- throw error;
1041
+ throw failure;
976
1042
  }
977
1043
  }
978
1044
 
@@ -997,20 +1063,48 @@ export class ZLinkSpotActivationLifecycle {
997
1063
  };
998
1064
  this.cleanupStates.set(activation, state);
999
1065
  if (state.inFlight !== undefined) return await state.inFlight;
1000
- state.inFlight = this.runCleanup(
1001
- activation,
1002
- locationMeshName,
1003
- notifyClosing,
1004
- reason,
1005
- state,
1006
- deadline,
1007
- owningLifecycle
1008
- ).finally(() => {
1009
- state.inFlight = undefined;
1010
- });
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
+ });
1011
1098
  return await state.inFlight;
1012
1099
  }
1013
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
+
1014
1108
  private async runCleanup(
1015
1109
  activation: ZLinkSpotActivation,
1016
1110
  locationMeshName: string,
@@ -1049,10 +1143,12 @@ export class ZLinkSpotActivationLifecycle {
1049
1143
  } catch (error) {
1050
1144
  // An OnClosing failure is diagnostic and cleanup continues. It is
1051
1145
  // returned so host shutdown can classify its teardown outcome.
1052
- this.options.closeErrorSink?.reportRuntimeTaskException(
1053
- `spot ${String(activation.spotId)} onClosing`,
1054
- error
1055
- );
1146
+ if (reason !== ZLinkSpotCloseReason.HostShutdown) {
1147
+ this.options.closeErrorSink?.reportRuntimeTaskException(
1148
+ `spot ${String(activation.spotId)} onClosing`,
1149
+ error
1150
+ );
1151
+ }
1056
1152
  closingFailure = error;
1057
1153
  }
1058
1154
  }
@@ -1093,7 +1189,12 @@ export class ZLinkSpotActivationLifecycle {
1093
1189
  }
1094
1190
  if (!state.nativeDisposed) {
1095
1191
  await cleanup(
1096
- () => activation.nativeSpot?.dispose(),
1192
+ async () => {
1193
+ if (reason === ZLinkSpotCloseReason.HostShutdown) {
1194
+ await this.options.releaseActorMembers?.(locationMeshName, activation.spotId);
1195
+ }
1196
+ await activation.nativeSpot?.dispose();
1197
+ },
1097
1198
  () => {
1098
1199
  state.nativeDisposed = true;
1099
1200
  }
@@ -1121,8 +1222,9 @@ export class ZLinkSpotActivationLifecycle {
1121
1222
  }
1122
1223
  );
1123
1224
  }
1124
- if (errors.length === 1) throw errors[0];
1125
- if (errors.length > 1) {
1225
+ if (errors.length > 0) {
1226
+ if (closingFailure !== undefined) errors.unshift(closingFailure);
1227
+ if (errors.length === 1) throw errors[0];
1126
1228
  throw new AggregateError(errors, `Spot '${activation.spotId}' cleanup failed.`);
1127
1229
  }
1128
1230
  return closingFailure;