@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,6 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DefaultZLinkSpotManager = exports.ZLinkPublicSpotManager = exports.ZLinkSpotNodeRuntimeManager = exports.createFrameworkEntrySpotId = exports.ZLinkEntrySpotActivation = exports.ZLinkRuntimeSpotPublisherTransport = exports.DefaultZLinkSpotHandlerRegistry = exports.DefaultZLinkSpotOutbound = exports.ZLinkSpotTimerRegistry = exports.ZLinkManagedTimer = exports.ZLinkSpotSerialExecutor = exports.ZLinkSpotSerialTurnExecutor = exports.ZLinkSpotActorAdmissionCoordinator = exports.ZLinkSpotRoutedBoundSessionDispatch = exports.sendToSpotHandle = exports.requestToSpotHandle = exports.resolveSpotHandle = exports.createSpotHandle = void 0;
3
+ exports.DefaultZLinkSpotManager = exports.ZLinkPublicSpotManager = exports.ZLinkSpotNodeRuntimeManager = exports.registrationAcceptsNewActor = exports.createFrameworkEntrySpotId = exports.ZLinkEntrySpotActivation = exports.ZLinkRuntimeSpotPublisherTransport = exports.DefaultZLinkSpotHandlerRegistry = exports.DefaultZLinkSpotOutbound = exports.ZLinkSpotTimerRegistry = exports.ZLinkManagedTimer = exports.ZLinkSpotSerialExecutor = exports.ZLinkSpotSerialTurnExecutor = exports.ZLinkSpotActorAdmissionCoordinator = exports.ZLinkSpotRoutedBoundSessionDispatch = exports.sendToSpotHandle = exports.requestToSpotHandle = exports.resolveSpotHandle = exports.createSpotHandle = void 0;
4
+ const actor_reply_1 = require("../actors/actor-reply");
5
+ const bound_session_response_target_1 = require("../streams/bound-session-response-target");
6
+ const actor_handoff_1 = require("../actors/actor-handoff");
7
+ const routing_id_1 = require("../routing-id");
4
8
  const dispatch_error_details_1 = require("../diagnostics/dispatch-error-details");
5
9
  var spot_handle_1 = require("./spot-handle");
6
10
  Object.defineProperty(exports, "createSpotHandle", { enumerable: true, get: function () { return spot_handle_1.createSpotHandle; } });
@@ -29,9 +33,9 @@ const payload_codec_1 = require("../messaging/payload-codec");
29
33
  const channel_envelope_1 = require("../channels/channel-envelope");
30
34
  const protocol_1 = require("../streams/protocol");
31
35
  const actor_remote_wire_1 = require("../actors/actor-remote-wire");
32
- const actor_handoff_1 = require("../actors/actor-handoff");
36
+ const actor_handoff_2 = require("../actors/actor-handoff");
33
37
  const spot_remote_codec_1 = require("./spot-remote-codec");
34
- const routing_id_1 = require("../routing-id");
38
+ const routing_id_2 = require("../routing-id");
35
39
  const service_wire_constants_generated_1 = require("../foundation/service-wire-constants.generated");
36
40
  var spot_serial_turn_executor_1 = require("./spot-serial-turn-executor");
37
41
  Object.defineProperty(exports, "ZLinkSpotSerialTurnExecutor", { enumerable: true, get: function () { return spot_serial_turn_executor_1.ZLinkSpotSerialTurnExecutor; } });
@@ -57,6 +61,7 @@ var spot_entry_activation_1 = require("./spot-entry-activation");
57
61
  Object.defineProperty(exports, "ZLinkEntrySpotActivation", { enumerable: true, get: function () { return spot_entry_activation_1.ZLinkEntrySpotActivation; } });
58
62
  var spot_node_runtime_manager_1 = require("./spot-node-runtime-manager");
59
63
  Object.defineProperty(exports, "createFrameworkEntrySpotId", { enumerable: true, get: function () { return spot_node_runtime_manager_1.createFrameworkEntrySpotId; } });
64
+ Object.defineProperty(exports, "registrationAcceptsNewActor", { enumerable: true, get: function () { return spot_node_runtime_manager_1.registrationAcceptsNewActor; } });
60
65
  Object.defineProperty(exports, "ZLinkSpotNodeRuntimeManager", { enumerable: true, get: function () { return spot_node_runtime_manager_1.ZLinkSpotNodeRuntimeManager; } });
61
66
  var spot_manager_public_1 = require("./spot-manager-public");
62
67
  Object.defineProperty(exports, "ZLinkPublicSpotManager", { enumerable: true, get: function () { return spot_manager_public_1.ZLinkPublicSpotManager; } });
@@ -130,6 +135,7 @@ class DefaultZLinkSpotManager {
130
135
  nodeRid: options.nodeRid,
131
136
  nodeRidProvider: options.nodeRidProvider,
132
137
  actorCountProvider: options.actorCountProvider,
138
+ releaseActorMembers: options.releaseActorMembers,
133
139
  userSpotExecutionMode: options.userSpotExecutionMode,
134
140
  userSpotRelocationCoordinationMode: options.userSpotRelocationCoordinationMode,
135
141
  channelClient: options.channelClient,
@@ -157,9 +163,17 @@ class DefaultZLinkSpotManager {
157
163
  statefulExecutionAllowed: options.statefulExecution?.admissionOpen,
158
164
  leaveActor: (spotId, actor, signal, meshName) => this.actorMembership.leaveActor(spotId, actor, signal, meshName),
159
165
  requestContextClose: (activation, objectGeneration, signal) => this.closeFromContext(activation, objectGeneration, signal),
160
- registerActivation: (activation) => {
161
- this.activations.register(activation);
166
+ stageActivation: (activation) => {
167
+ this.activations.registerPreparing(activation);
168
+ },
169
+ discardActivation: (activation) => {
170
+ this.activations.finishClose(activation.meshName, activation.spotId);
171
+ },
172
+ registerActivation: async (activation) => {
173
+ const published = this.activations.register(activation);
162
174
  this.scheduleIdleSweep();
175
+ if (published?.domain.kind === 'user')
176
+ await published.serialExecutor.finishPreparation();
163
177
  },
164
178
  // Spec 15 §4.2 relocation temporary queue: production ingress
165
179
  // consults the same admission attempts registered on Accepted
@@ -206,10 +220,10 @@ class DefaultZLinkSpotManager {
206
220
  resolveRelocationActivation(meshName, spotId) {
207
221
  return this.activations.resolve(meshName, spotId);
208
222
  }
209
- async prepareRelocationSpot(meshName, objectKind, stableType, implementation, spotId, objectGeneration, authorityOwnerGeneration, signal) {
223
+ async prepareRelocationSpot(meshName, objectKind, stableType, implementation, spotId, objectGeneration, authorityOwnerGeneration, restoredTimers, signal) {
210
224
  this.activations.stage(meshName, spotId);
211
225
  try {
212
- return await this.activationLifecycle.materializeRelocation(meshName, objectKind, stableType, implementation, spotId, objectGeneration, authorityOwnerGeneration, signal);
226
+ return await this.activationLifecycle.materializeRelocation(meshName, objectKind, stableType, implementation, spotId, objectGeneration, authorityOwnerGeneration, restoredTimers, signal);
213
227
  }
214
228
  catch (error) {
215
229
  this.activations.abandonStage(meshName, spotId);
@@ -217,11 +231,16 @@ class DefaultZLinkSpotManager {
217
231
  }
218
232
  }
219
233
  async publishRelocationSpot(activation, beforeAdmission) {
220
- await activation.serial.execute(() => activation.spot.onInitialize?.());
234
+ // Spot timer §1: OnInitialize before Ready reattaches restored keys; the
235
+ // relocation-ready completion and later callbacks use the ordinary rule.
236
+ await activation.serial.postBarrierTurn(() => activation.timers.runRelocationInitialization(() => activation.spot.onInitialize?.()));
221
237
  await beforeAdmission?.();
222
238
  this.activations.publish(activation.meshName, activation.spotId);
239
+ await activation.serialExecutor.finishPreparation();
240
+ await activation.timers.publishRelocation();
223
241
  }
224
242
  async abortRelocationSpot(activation) {
243
+ await this.activationLifecycle.discardPreparation(activation);
225
244
  this.activations.detachRelocated(activation.meshName, activation.spotId);
226
245
  await activation.timers.dispose();
227
246
  await activation.nativeSpot?.dispose();
@@ -230,7 +249,7 @@ class DefaultZLinkSpotManager {
230
249
  this.activations.detachRelocated(activation.meshName, activation.spotId);
231
250
  await activation.nativeSpot?.dispose();
232
251
  }
233
- async materializeInstance(meshName, instanceType, spotId, objectGeneration, signal) {
252
+ async materializeInstance(meshName, instanceType, spotId, objectGeneration, signal, completion = 'publication') {
234
253
  const readyTarget = this.options.instanceSpotApplicationTargetProvider?.(meshName, spotId);
235
254
  const existing = this.pendingInstanceMaterializations.get(instanceMaterializationKey(meshName, spotId, objectGeneration));
236
255
  if (existing !== undefined) {
@@ -239,13 +258,13 @@ class DefaultZLinkSpotManager {
239
258
  }
240
259
  const release = await this.options.activationAdmission?.acquire(meshName, signal);
241
260
  try {
242
- await this.materializeInstanceCore(meshName, instanceType, spotId, objectGeneration, readyTarget?.objectGeneration === objectGeneration, signal);
261
+ await this.materializeInstanceCore(meshName, instanceType, spotId, objectGeneration, readyTarget?.objectGeneration === objectGeneration, signal, completion);
243
262
  }
244
263
  finally {
245
264
  release?.();
246
265
  }
247
266
  }
248
- async materializeInstanceCore(meshName, instanceType, spotId, objectGeneration, requiresReadyTarget, signal) {
267
+ async materializeInstanceCore(meshName, instanceType, spotId, objectGeneration, requiresReadyTarget, signal, completion) {
249
268
  const factory = this.requireInstanceFactory(meshName, instanceType);
250
269
  const key = `${meshName}\0${String(spotId)}`;
251
270
  const materializationKey = instanceMaterializationKey(meshName, spotId, objectGeneration);
@@ -271,7 +290,7 @@ class DefaultZLinkSpotManager {
271
290
  await (0, abort_1.awaitWithAbort)(closing.ready, signal);
272
291
  continue;
273
292
  }
274
- const current = this.activations.resolve(meshName, spotId);
293
+ const current = this.activations.activationForClose(meshName, spotId);
275
294
  if (current !== undefined) {
276
295
  if (current.spotType !== factory) {
277
296
  throw new configuration_1.ZLinkConfigurationException(`Instance Spot '${String(spotId)}' is assigned to another type.`);
@@ -305,14 +324,16 @@ class DefaultZLinkSpotManager {
305
324
  }
306
325
  }
307
326
  if (pending === undefined) {
308
- const metric = this.options.metrics?.startInstanceSpotActivation(meshName, instanceType);
327
+ if (completion === 'first-terminal')
328
+ this.activations.stage(meshName, spotId);
309
329
  pending = this.activationLifecycle
310
330
  .materializeInstance(meshName, instanceType, factory, spotId, objectGeneration, signal)
311
- .then((activation) => {
312
- metric?.complete('ready');
331
+ .then(async (activation) => {
332
+ if (completion === 'publication')
333
+ await activation.serialExecutor.finishPreparation();
313
334
  return activation;
314
335
  }, (error) => {
315
- metric?.complete(instanceActivationOutcome(error));
336
+ this.activations.abandonStage(meshName, spotId);
316
337
  throw error;
317
338
  });
318
339
  this.pendingInstanceMaterializations.set(materializationKey, pending);
@@ -352,10 +373,13 @@ class DefaultZLinkSpotManager {
352
373
  : this.activations.resolve(meshName, spotId);
353
374
  if (current !== undefined)
354
375
  return current;
355
- if (meshName !== undefined)
356
- return this.closeOperations.get(`${meshName}\0${String(spotId)}`)?.activation;
376
+ if (meshName !== undefined) {
377
+ const closing = this.closeOperations.get(`${meshName}\0${String(spotId)}`);
378
+ return closing?.authority === undefined ? undefined : closing.activation;
379
+ }
357
380
  for (const operation of this.closeOperations.values()) {
358
- if (String(operation.activation.spotId) === String(spotId))
381
+ if (operation.authority !== undefined &&
382
+ String(operation.activation.spotId) === String(spotId))
359
383
  return operation.activation;
360
384
  }
361
385
  return undefined;
@@ -363,6 +387,7 @@ class DefaultZLinkSpotManager {
363
387
  isInstanceMaterializing(meshName, spotId) {
364
388
  const prefix = instanceMaterializationPrefix(meshName, spotId);
365
389
  return ((this.pendingInstanceMaterializationsByPrefix.get(prefix)?.size ?? 0) > 0 ||
390
+ this.activations.activationForClose(meshName, spotId)?.serialExecutor.isPreparing === true ||
366
391
  this.closeOperations.get(`${meshName}\0${String(spotId)}`)?.authority !== undefined);
367
392
  }
368
393
  isSpotClosing(meshName, spotId) {
@@ -373,7 +398,7 @@ class DefaultZLinkSpotManager {
373
398
  return this.closeOperations.get(`${meshName}\0${String(spotId)}`)?.authorityDecision;
374
399
  }
375
400
  async discardInstance(meshName, spotId) {
376
- const activation = this.activations.resolve(meshName, spotId);
401
+ const activation = this.activations.activationForClose(meshName, spotId);
377
402
  if (activation === undefined)
378
403
  return;
379
404
  activation.requestClose();
@@ -399,6 +424,9 @@ class DefaultZLinkSpotManager {
399
424
  }
400
425
  async completeInstanceTerminal(meshName, spotId, objectGeneration) {
401
426
  const key = `${meshName}\0${String(spotId)}`;
427
+ const activation = this.activations.activationForClose(meshName, spotId);
428
+ if (activation?.objectGeneration === objectGeneration)
429
+ await activation.serialExecutor.finishPreparation();
402
430
  const pending = this.pendingInstanceTerminals.get(key);
403
431
  if (pending === undefined)
404
432
  return false;
@@ -437,6 +465,13 @@ class DefaultZLinkSpotManager {
437
465
  generations.set(generationKey, (generations.get(generationKey) ?? 0) + 1);
438
466
  this.pendingInstanceTerminalGenerations.set(key, generations);
439
467
  }
468
+ publishInstance(target, meshName) {
469
+ const activation = this.activations.activationForClose(meshName, target.targetSpotId);
470
+ if (activation?.objectGeneration === target.objectGeneration) {
471
+ const published = this.activations.publish(meshName, target.targetSpotId);
472
+ published?.serialExecutor.openPreparationAdmission();
473
+ }
474
+ }
440
475
  deferInstanceAuthorityRelease(key, objectGeneration) {
441
476
  const generations = this.deferredInstanceAuthorityReleases.get(key) ?? new Set();
442
477
  generations.add(objectGeneration);
@@ -577,10 +612,12 @@ class DefaultZLinkSpotManager {
577
612
  .filter(({ spotId }) => !this.isSpotClosing(meshName, spotId));
578
613
  }
579
614
  async drainForShutdown(meshName, signal, deadline) {
580
- const results = await Promise.allSettled(this.activations
615
+ // The host bounds observation of the whole Close, including lifecycle admission.
616
+ // The owned operation keeps the gate and scopes until its running turns settle.
617
+ const results = await (0, abort_1.awaitWithAbort)(Promise.allSettled(this.activations
581
618
  .activeActivations()
582
619
  .filter((activation) => activation.meshName === meshName)
583
- .map((activation) => this.closeWithReason(meshName, activation.spotId, signal, contracts_1.ZLinkSpotCloseReason.HostShutdown, deadline)));
620
+ .map((activation) => this.closeWithReason(meshName, activation.spotId, undefined, contracts_1.ZLinkSpotCloseReason.HostShutdown, deadline))), signal);
584
621
  const errors = results
585
622
  .filter((result) => result.status === 'rejected')
586
623
  .map((result) => result.reason);
@@ -598,7 +635,9 @@ class DefaultZLinkSpotManager {
598
635
  closeFromContext(activation, objectGeneration, signal) {
599
636
  const { meshName, spotId } = activation;
600
637
  const operation = this.closeOperations.get(`${meshName}\0${String(spotId)}`);
601
- const current = operation?.activation ?? this.activations.resolve(meshName, spotId);
638
+ const current = operation?.activation ??
639
+ this.activations.resolve(meshName, spotId) ??
640
+ (activation.serialExecutor.isPreparing ? activation : undefined);
602
641
  if (current === undefined) {
603
642
  return Promise.resolve(false);
604
643
  }
@@ -608,14 +647,14 @@ class DefaultZLinkSpotManager {
608
647
  const beginUserAuthority = activation.domain.kind === 'user' && this.options.beginUserClosingAuthority !== undefined
609
648
  ? (onCommitted) => this.options.beginUserClosingAuthority(meshName, spotId, objectGeneration, onCommitted)
610
649
  : undefined;
611
- return this.closeWithReason(meshName, spotId, signal, contracts_1.ZLinkSpotCloseReason.ExplicitClose, undefined, beginUserAuthority);
650
+ return this.closeWithReason(meshName, spotId, signal, contracts_1.ZLinkSpotCloseReason.ExplicitClose, undefined, beginUserAuthority, activation);
612
651
  }
613
- async closeWithReason(meshName, spotId, signal, reason = contracts_1.ZLinkSpotCloseReason.ExplicitClose, deadline, beginUserAuthority) {
652
+ async closeWithReason(meshName, spotId, signal, reason = contracts_1.ZLinkSpotCloseReason.ExplicitClose, deadline, beginUserAuthority, contextActivation) {
614
653
  requireMeshName(meshName);
615
654
  const key = `${meshName}\0${String(spotId)}`;
616
655
  let operation = this.closeOperations.get(key);
617
656
  if (operation === undefined) {
618
- const activation = this.activations.resolve(meshName, spotId);
657
+ const activation = this.activations.resolve(meshName, spotId) ?? contextActivation;
619
658
  if (activation === undefined)
620
659
  return false;
621
660
  if (activation.domain.kind === 'user' &&
@@ -665,11 +704,13 @@ class DefaultZLinkSpotManager {
665
704
  return await operation.ready;
666
705
  }
667
706
  async runCloseOperation(meshName, spotId, operation, signal, deadline) {
707
+ if (this.activations.resolve(meshName, spotId) !== operation.activation)
708
+ return false;
668
709
  const seal = await this.beginCloseAuthority(meshName, spotId, operation, signal);
669
710
  if (seal === undefined)
670
711
  return false;
671
712
  if (seal !== true) {
672
- await this.activationLifecycle.sealForClose(operation.activation, seal);
713
+ await this.activationLifecycle.sealForClose(operation.activation, seal, signal);
673
714
  }
674
715
  else {
675
716
  await operation.activation.executionBarrier.waitForStartedTurns(signal);
@@ -799,11 +840,18 @@ class DefaultZLinkSpotManager {
799
840
  beginUserSpotPublication(meshName, spotId) {
800
841
  this.activations.stage(meshName, spotId);
801
842
  }
802
- publishUserSpot(meshName, spotId) {
803
- this.activations.publish(meshName, spotId);
843
+ async publishUserSpot(meshName, spotId) {
844
+ const published = this.activations.publish(meshName, spotId);
845
+ await published?.serialExecutor.finishPreparation();
804
846
  }
805
- abortUserSpotPublication(meshName, spotId) {
847
+ async abortUserSpotPublication(meshName, spotId) {
806
848
  this.activations.abandonStage(meshName, spotId);
849
+ const activation = this.activations.activationForClose(meshName, spotId);
850
+ if (activation?.serialExecutor.isPreparing === true) {
851
+ await this.activationLifecycle.cleanupFailedIncarnation(activation);
852
+ this.activations.finishClose(meshName, spotId);
853
+ await activation.serialExecutor.close();
854
+ }
807
855
  }
808
856
  resolveLocalSpotRoute(spotId) {
809
857
  const activation = this.activations.resolveUnique(spotId);
@@ -848,9 +896,6 @@ class DefaultZLinkSpotManager {
848
896
  async commitActorLeaveAfterTransfer(spotId, actorId) {
849
897
  await this.actorMembership.commitActorLeaveAfterTransfer(spotId, actorId);
850
898
  }
851
- async restoreActorAfterFailedTransfer(spotId, actor, signal) {
852
- await this.actorMembership.restoreActorAfterFailedTransfer(spotId, actor, signal);
853
- }
854
899
  async beginActorTransfer(spotId, actorId) {
855
900
  await this.actorMembership.beginActorTransfer(spotId, actorId);
856
901
  }
@@ -883,26 +928,41 @@ class DefaultZLinkSpotManager {
883
928
  }
884
929
  return this.activationLifecycle.admitActorPacketPrefix(activation, actorId, records);
885
930
  }
931
+ /** Resolves the current Actor FIFO owner for both Entry and User membership. */
932
+ admitSourceActorPacketPrefix(actorId, records) {
933
+ const owner = this.options.actorDispatchOwnerResolver?.(actorId);
934
+ if (owner?.actorRef === undefined) {
935
+ throw new configuration_1.ZLinkConfigurationException(`Actor '${actorId}' has no local FIFO owner.`);
936
+ }
937
+ if (owner.spotId === undefined) {
938
+ if (this.options.admitEntryActorPacketPrefix === undefined) {
939
+ throw new configuration_1.ZLinkConfigurationException(`Actor '${actorId}' has no Entry FIFO port.`);
940
+ }
941
+ return this.options.admitEntryActorPacketPrefix(owner.actorRef.meshName, actorId, records);
942
+ }
943
+ return this.admitRoutedActorPacketPrefix(owner.spotId, actorId, records);
944
+ }
886
945
  async dispatchRoutedSpotSend(spotId, packetName, message, context) {
887
946
  await this.routedSpotPackets.send(spotId, packetName, message, context);
888
947
  }
889
948
  async dispatchRoutedSpotRequest(spotId, packetName, request, context) {
890
949
  return await this.routedSpotPackets.request(spotId, packetName, request, context);
891
950
  }
892
- async dispatchMeshSpot(meshName, owner, record) {
951
+ async dispatchMeshSpot(meshName, owner, record, admit) {
893
952
  const spotId = owner.spotId;
894
953
  if (spotId === null) {
895
954
  throw new configuration_1.ZLinkConfigurationException('MeshNode Spot record is missing the owner Spot RID.');
896
955
  }
897
956
  if (record.kind === service_runtime_contracts_1.ReceiveKind.SpotMulticast) {
898
- const activation = this.activations.resolve(meshName, spotId);
957
+ const activation = this.activations.activationForClose(meshName, spotId);
899
958
  if (activation?.actorDispatch === undefined) {
900
959
  throw new configuration_1.ZLinkConfigurationException(`MeshNode Spot multicast target '${String(spotId)}' is not active.`);
901
960
  }
902
961
  if (record.topic === null || record.topic.length === 0) {
903
962
  throw new configuration_1.ZLinkConfigurationException('MeshNode Spot multicast record is missing its topic.');
904
963
  }
905
- await activation.actorDispatch.dispatchSubscriptionRecord(record.topic, record.parts, record.sourceNodeRid);
964
+ const dispatch = () => activation.actorDispatch.dispatchSubscriptionRecord(record.topic, record.parts, record.sourceNodeRid);
965
+ await (admit === undefined ? dispatch() : admit(dispatch));
906
966
  return;
907
967
  }
908
968
  const envelope = (0, channel_envelope_1.decodeChannelEnvelope)(record.parts, undefined, this.options.dispatchErrors?.flow.flowCreationEnabled() ?? true);
@@ -916,20 +976,25 @@ class DefaultZLinkSpotManager {
916
976
  contentType: envelope.header.contentType,
917
977
  workOptions: (0, serial_work_size_1.zlinkSerialWorkOptions)(envelope.payload.byteLength, record.applicationMetadata?.byteLength ?? (0, serial_work_size_1.zlinkMetadataByteLength)(envelope.header.metadata))
918
978
  };
919
- if (record.kind === service_runtime_contracts_1.ReceiveKind.SpotSend) {
920
- await this.ensureInstanceApplicationActivation(meshName, spotId);
921
- await this.routedSpotPackets.sendEncoded(spotId, packetName, decodePayload, context);
922
- return;
923
- }
924
- if (record.kind !== service_runtime_contracts_1.ReceiveKind.SpotRequest) {
925
- throw new configuration_1.ZLinkConfigurationException(`Unsupported MeshNode Spot record kind '${record.kind}'.`);
926
- }
927
979
  try {
928
- await this.ensureInstanceApplicationActivation(meshName, spotId);
929
- const response = await this.routedSpotPackets.requestEncoded(spotId, packetName, decodePayload, context);
930
- requireMeshSpotReply(record.reply((0, channel_envelope_1.encodeChannelReplyParts)(envelope.header, response, codecs)));
980
+ const dispatch = async () => {
981
+ if (record.kind === service_runtime_contracts_1.ReceiveKind.SpotSend) {
982
+ await this.ensureInstanceApplicationActivation(meshName, spotId);
983
+ await this.routedSpotPackets.sendEncoded(spotId, packetName, decodePayload, context);
984
+ return;
985
+ }
986
+ if (record.kind !== service_runtime_contracts_1.ReceiveKind.SpotRequest) {
987
+ throw new configuration_1.ZLinkConfigurationException(`Unsupported MeshNode Spot record kind '${record.kind}'.`);
988
+ }
989
+ await this.ensureInstanceApplicationActivation(meshName, spotId);
990
+ const response = await this.routedSpotPackets.requestEncoded(spotId, packetName, decodePayload, context);
991
+ requireMeshSpotReply(record.reply((0, channel_envelope_1.encodeChannelReplyParts)(envelope.header, response, codecs)));
992
+ };
993
+ await (admit === undefined ? dispatch() : admit(dispatch));
931
994
  }
932
995
  catch (error) {
996
+ if (record.kind !== service_runtime_contracts_1.ReceiveKind.SpotRequest)
997
+ throw error;
933
998
  requireMeshSpotReply(record.reply((0, channel_envelope_1.encodeChannelErrorReplyParts)(envelope.header, error)));
934
999
  }
935
1000
  }
@@ -953,7 +1018,7 @@ class DefaultZLinkSpotManager {
953
1018
  target = latest;
954
1019
  }
955
1020
  }
956
- async dispatchMeshInstance(meshName, owner, record) {
1021
+ async dispatchMeshInstance(meshName, owner, record, admit) {
957
1022
  const spotId = owner.spotId;
958
1023
  if (spotId === null) {
959
1024
  throw new configuration_1.ZLinkConfigurationException('MeshNode Instance Spot record is missing the owner Spot RID.');
@@ -964,55 +1029,58 @@ class DefaultZLinkSpotManager {
964
1029
  const request = record.operationKind === service_runtime_contracts_1.OperationKind.InstanceSpotRequest;
965
1030
  this.traceInstanceMessage(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Received, meshName, spotId, record, envelope, 'activating');
966
1031
  try {
967
- await this.ensureInstanceApplicationActivation(meshName, spotId);
968
- const activation = this.resolveApplicationActivation(spotId, meshName);
969
- if (activation === undefined || activation.domain.kind !== 'instance') {
970
- throw new configuration_1.ZLinkConfigurationException(`MeshNode Instance Spot target '${String(spotId)}' is not active.`);
971
- }
972
- const target = this.options.instanceSpotApplicationTargetProvider?.(meshName, spotId);
973
- if (target !== undefined &&
974
- activation.domain.objectGeneration !== target.objectGeneration) {
975
- throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotGenerationStale, `Instance Spot target '${String(spotId)}' application generation is stale.`);
976
- }
977
- const codecs = this.options.messageSerializers === undefined
978
- ? undefined
979
- : { serializers: this.options.messageSerializers };
980
- const decodePayload = () => (0, channel_envelope_1.decodeChannelPayload)(envelope, codecs);
981
- const context = {
982
- channelName: envelope.header.channelName,
983
- contentType: envelope.header.contentType,
984
- awaitFirstHandlerTurn: record.kind === service_runtime_contracts_1.ReceiveKind.InstanceSpotActivation,
985
- activationRecord: record,
986
- onOneWayError: this.options.dispatchErrors?.captureEnabled() === true
987
- ? (error) => this.reportInstanceDispatchFailure(meshName, spotId, record, envelope, false, error)
988
- : undefined,
989
- workOptions: (0, serial_work_size_1.zlinkSerialWorkOptions)(envelope.payload.byteLength, record.applicationMetadata?.byteLength ??
990
- (0, serial_work_size_1.zlinkMetadataByteLength)(envelope.header.metadata))
991
- };
992
- // Spot messaging §7 step 3: an Instance intent request that reaches an
993
- // incarnation whose Close ended admission is refused before admission
994
- // with the owner fence terminal, so its caller re-reads authority.
995
- const instanceIntent = record.activationRecord?.activation === 'missing' ||
996
- (record.activationRecord?.activation === 'ready' &&
997
- record.activationRecord.instanceIntent);
998
- const refusal = activation.serial.applicationAdmissionRefusal(instanceIntent === true);
999
- if (request && refusal !== undefined && record.replyFailure !== undefined) {
1000
- this.reportInstanceDispatchFailure(meshName, spotId, record, envelope, request, refusal);
1001
- const terminal = (0, framework_errors_internal_1.internalFrameworkWireReply)(refusal);
1002
- requireMeshSpotReply(record.replyFailure(terminal.terminalResult, terminal.failureCode));
1003
- return;
1004
- }
1005
- this.traceInstanceMessage(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Admitted, meshName, spotId, record, envelope, 'ready', target?.stableType);
1006
- if (!request) {
1032
+ const dispatch = async () => {
1033
+ await this.ensureInstanceApplicationActivation(meshName, spotId);
1034
+ const activation = this.resolveApplicationActivation(spotId, meshName);
1035
+ if (activation === undefined || activation.domain.kind !== 'instance') {
1036
+ throw new configuration_1.ZLinkConfigurationException(`MeshNode Instance Spot target '${String(spotId)}' is not active.`);
1037
+ }
1038
+ const target = this.options.instanceSpotApplicationTargetProvider?.(meshName, spotId);
1039
+ if (target !== undefined &&
1040
+ activation.domain.objectGeneration !== target.objectGeneration) {
1041
+ throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotGenerationStale, `Instance Spot target '${String(spotId)}' application generation is stale.`);
1042
+ }
1043
+ const codecs = this.options.messageSerializers === undefined
1044
+ ? undefined
1045
+ : { serializers: this.options.messageSerializers };
1046
+ const decodePayload = () => (0, channel_envelope_1.decodeChannelPayload)(envelope, codecs);
1047
+ const context = {
1048
+ channelName: envelope.header.channelName,
1049
+ contentType: envelope.header.contentType,
1050
+ awaitFirstHandlerTurn: record.kind === service_runtime_contracts_1.ReceiveKind.InstanceSpotActivation,
1051
+ activationRecord: record,
1052
+ onOneWayError: this.options.dispatchErrors?.captureEnabled() === true
1053
+ ? (error) => this.reportInstanceDispatchFailure(meshName, spotId, record, envelope, false, error)
1054
+ : undefined,
1055
+ workOptions: (0, serial_work_size_1.zlinkSerialWorkOptions)(envelope.payload.byteLength, record.applicationMetadata?.byteLength ??
1056
+ (0, serial_work_size_1.zlinkMetadataByteLength)(envelope.header.metadata))
1057
+ };
1058
+ // Spot messaging §7 step 3: an Instance intent request that reaches an
1059
+ // incarnation whose Close ended admission is refused before admission
1060
+ // with the owner fence terminal, so its caller re-reads authority.
1061
+ const instanceIntent = record.activationRecord?.activation === 'missing' ||
1062
+ (record.activationRecord?.activation === 'ready' &&
1063
+ record.activationRecord.instanceIntent);
1064
+ const refusal = activation.serial.applicationAdmissionRefusal(instanceIntent === true);
1065
+ if (request && refusal !== undefined && record.replyFailure !== undefined) {
1066
+ this.reportInstanceDispatchFailure(meshName, spotId, record, envelope, request, refusal);
1067
+ const terminal = (0, framework_errors_internal_1.internalFrameworkWireReply)(refusal);
1068
+ requireMeshSpotReply(record.replyFailure(terminal.terminalResult, terminal.failureCode));
1069
+ return;
1070
+ }
1071
+ this.traceInstanceMessage(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Admitted, meshName, spotId, record, envelope, 'ready', target?.stableType);
1072
+ if (!request) {
1073
+ this.traceInstanceMessage(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Dispatched, meshName, spotId, record, envelope, 'ready', target?.stableType);
1074
+ await this.routedSpotPackets.sendEncoded(spotId, envelope.packetName, decodePayload, context);
1075
+ this.traceInstanceMessage(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Completed, meshName, spotId, record, envelope, 'ready', target?.stableType);
1076
+ return;
1077
+ }
1007
1078
  this.traceInstanceMessage(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Dispatched, meshName, spotId, record, envelope, 'ready', target?.stableType);
1008
- await this.routedSpotPackets.sendEncoded(spotId, envelope.packetName, decodePayload, context);
1009
- this.traceInstanceMessage(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Completed, meshName, spotId, record, envelope, 'ready', target?.stableType);
1010
- return;
1011
- }
1012
- this.traceInstanceMessage(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Dispatched, meshName, spotId, record, envelope, 'ready', target?.stableType);
1013
- const response = await this.routedSpotPackets.requestEncoded(spotId, envelope.packetName, decodePayload, context);
1014
- requireMeshSpotReply(record.reply((0, channel_envelope_1.encodeChannelReplyParts)(envelope.header, response, codecs)));
1015
- this.traceInstanceMessage(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Replied, meshName, spotId, record, envelope, 'ready', target?.stableType);
1079
+ const response = await this.routedSpotPackets.requestEncoded(spotId, envelope.packetName, decodePayload, context);
1080
+ requireMeshSpotReply(record.reply((0, channel_envelope_1.encodeChannelReplyParts)(envelope.header, response, codecs)));
1081
+ this.traceInstanceMessage(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Replied, meshName, spotId, record, envelope, 'ready', target?.stableType);
1082
+ };
1083
+ await (admit === undefined ? dispatch() : admit(dispatch));
1016
1084
  }
1017
1085
  catch (error) {
1018
1086
  this.reportInstanceDispatchFailure(meshName, spotId, record, envelope, request, error);
@@ -1071,7 +1139,7 @@ class DefaultZLinkSpotManager {
1071
1139
  errorReason
1072
1140
  });
1073
1141
  }
1074
- async dispatchMeshActor(origin, meshName, owner, record) {
1142
+ async dispatchMeshActor(origin, meshName, owner, record, admit) {
1075
1143
  const spotId = owner.spotId;
1076
1144
  const entrySpotId = this.options.entryNodeRidProvider?.() ?? this.options.entryNodeRid;
1077
1145
  const targetsEntrySpot = spotId === null || (entrySpotId !== undefined && spotId === entrySpotId);
@@ -1080,12 +1148,15 @@ class DefaultZLinkSpotManager {
1080
1148
  throw new configuration_1.ZLinkConfigurationException('MeshNode Actor record is missing its Actor owner.');
1081
1149
  }
1082
1150
  const request = record.kind === service_runtime_contracts_1.ReceiveKind.ActorRequest;
1083
- const resolvedOwner = this.options.actorDispatchOwnerResolver?.(actor.actorId);
1084
- const resolvedActorRef = resolvedOwner?.actorRef ?? {
1085
- actorId: actor.actorId,
1086
- objectGeneration: actor.generation,
1151
+ const nativeTarget = record.messageFollowOrigin?.target;
1152
+ const ingressActor = nativeTarget?.actor ?? actor;
1153
+ const resolvedActorRef = (nativeTarget === undefined
1154
+ ? this.options.actorDispatchOwnerResolver?.(actor.actorId).actorRef
1155
+ : undefined) ?? {
1156
+ actorId: ingressActor.actorId,
1157
+ objectGeneration: ingressActor.generation,
1087
1158
  meshName,
1088
- nodeRid: String(actor.nodeRid)
1159
+ nodeRid: ingressActor.nodeRid
1089
1160
  };
1090
1161
  const responseActorRef = record.sourceBindingGeneration > 0n
1091
1162
  ? {
@@ -1111,18 +1182,23 @@ class DefaultZLinkSpotManager {
1111
1182
  })
1112
1183
  : undefined;
1113
1184
  try {
1114
- if (this.formalRemoteTransfers.has(actor.actorId)) {
1115
- throw new Error(`Actor '${actor.actorId}' target transfer reconciliation is not complete.`);
1116
- }
1117
- const response = targetsEntrySpot
1118
- ? await this.options.dispatchEntryActorPacket?.(origin, actor.actorId, record.parts, request, undefined, ownerActorRef, requestTerminal, record.messageFollowOrigin)
1119
- : await this.dispatchMeshActorPacket(origin, meshName, spotId, actor.actorId, record.parts, request, ownerActorRef, requestTerminal, record.messageFollowOrigin);
1120
- if (targetsEntrySpot && this.options.dispatchEntryActorPacket === undefined) {
1121
- throw new configuration_1.ZLinkConfigurationException('MeshNode Entry Spot Actor dispatch is not configured.');
1122
- }
1123
- if (request && !requestTerminalState.submitted) {
1124
- requireMeshSpotReply(record.reply(this.encodeMeshActorReply(record.parts[0], protocol_1.ZLinkStreamMessageKind.Response, response)));
1125
- }
1185
+ const dispatch = async () => {
1186
+ if (this.formalRemoteTransfers.has(actor.actorId)) {
1187
+ throw new Error(`Actor '${actor.actorId}' target transfer reconciliation is not complete.`);
1188
+ }
1189
+ const response = targetsEntrySpot
1190
+ ? await this.options.dispatchEntryActorPacket?.(origin, actor.actorId, record.parts, request, undefined, ownerActorRef, requestTerminal, record.messageFollowOrigin)
1191
+ : await this.dispatchMeshActorPacket(origin, meshName, spotId, actor.actorId, record.parts, request, ownerActorRef, requestTerminal, record.messageFollowOrigin);
1192
+ if (targetsEntrySpot && this.options.dispatchEntryActorPacket === undefined) {
1193
+ throw new configuration_1.ZLinkConfigurationException('MeshNode Entry Spot Actor dispatch is not configured.');
1194
+ }
1195
+ if (response === actor_handoff_1.RELOCATED_REQUEST_OWNED_BY_REQUESTER)
1196
+ return;
1197
+ if (request && !requestTerminalState.submitted) {
1198
+ requireMeshSpotReply(record.reply(this.encodeMeshActorReply(record.parts[0], protocol_1.ZLinkStreamMessageKind.Response, response)));
1199
+ }
1200
+ };
1201
+ await (admit === undefined ? dispatch() : admit(dispatch));
1126
1202
  }
1127
1203
  catch (error) {
1128
1204
  if (!request) {
@@ -1131,10 +1207,7 @@ class DefaultZLinkSpotManager {
1131
1207
  if (requestTerminalState.prepared || requestTerminalState.submitted) {
1132
1208
  throw error;
1133
1209
  }
1134
- requireMeshSpotReply(record.reply(this.encodeMeshActorReply(record.parts[0], protocol_1.ZLinkStreamMessageKind.Error, {
1135
- message: error instanceof Error ? error.message : String(error),
1136
- kind: spotActorFailureKind(error)
1137
- })));
1210
+ requireMeshSpotReply(record.reply(this.encodeMeshActorReply(record.parts[0], protocol_1.ZLinkStreamMessageKind.Error, (0, bound_session_response_target_1.boundSessionErrorPayload)(error))));
1138
1211
  }
1139
1212
  }
1140
1213
  async dispatchMeshActorJoin(meshName, owner, record) {
@@ -1627,7 +1700,7 @@ class DefaultZLinkSpotManager {
1627
1700
  if (!sourceLeaveSubmitted) {
1628
1701
  throw new Error(`Actor '${entryActor.context.actorId}' source authority commit failed before leave submission.`);
1629
1702
  }
1630
- const handoffResults = await (0, actor_handoff_1.replayActorHandoffBacklog)(pendingTransfer.handoffBacklog, async (parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef) => {
1703
+ const handoffResults = await (0, actor_handoff_2.replayActorHandoffBacklog)(pendingTransfer.handoffBacklog, async (parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef) => {
1631
1704
  if (this.options.dispatchEntryActorPacket === undefined) {
1632
1705
  throw new Error('Entry Spot saved handoff replay requires its Actor packet runtime.');
1633
1706
  }
@@ -1744,12 +1817,7 @@ class DefaultZLinkSpotManager {
1744
1817
  const callback = async () => {
1745
1818
  await this.options.entrySpotCallbacks?.onLeaveActor(actor, undefined, actorRef, control.previousMembershipEpoch);
1746
1819
  };
1747
- if (this.options.actorTransferRuntime === undefined) {
1748
- await callback();
1749
- }
1750
- else {
1751
- await this.options.actorTransferRuntime.notifyCoreSourceLeave(actor, callback);
1752
- }
1820
+ await callback();
1753
1821
  return;
1754
1822
  }
1755
1823
  if (spotId === null) {
@@ -1790,7 +1858,7 @@ class DefaultZLinkSpotManager {
1790
1858
  };
1791
1859
  const completeTargetReady = async () => {
1792
1860
  if (pendingTransfer !== undefined) {
1793
- const handoffResults = await (0, actor_handoff_1.replayActorHandoffBacklog)(pendingTransfer.handoffBacklog, (parts, returnResponse, remoteBoundSessionTarget, _fallbackActorRef) => this.dispatchActorPacket('remote', activation, actor.context.actorId, parts, returnResponse, remoteBoundSessionTarget, undefined), (index) => this.options.runtimeEventPublisher?.publish({
1861
+ const handoffResults = await (0, actor_handoff_2.replayActorHandoffBacklog)(pendingTransfer.handoffBacklog, (parts, returnResponse, remoteBoundSessionTarget, _fallbackActorRef) => this.dispatchActorPacket('remote', activation, actor.context.actorId, parts, returnResponse, remoteBoundSessionTarget, undefined), (index) => this.options.runtimeEventPublisher?.publish({
1794
1862
  sourceName: 'zlink.framework.actor-handoff',
1795
1863
  timestamp: new Date(),
1796
1864
  marker: 'backlog_enqueued',
@@ -1807,7 +1875,7 @@ class DefaultZLinkSpotManager {
1807
1875
  // ingress hold) migrate into the real Actor queue next, in the
1808
1876
  // order they parked — after the relayed backlog above, before
1809
1877
  // regular ingress opens.
1810
- await this.migrateActorJoinPrewarm(activation, actor, pendingTransfer.transferId);
1878
+ this.migrateActorJoinPrewarm(activation, actor, pendingTransfer.transferId);
1811
1879
  // This registry owns target lifecycle and saved backlog
1812
1880
  // reconciliation only. Session route readiness is enforced by
1813
1881
  // the Session binding aggregate after this boundary.
@@ -1870,7 +1938,7 @@ class DefaultZLinkSpotManager {
1870
1938
  if (sourceJoinedActor === undefined && pendingTransfer === undefined) {
1871
1939
  return;
1872
1940
  }
1873
- await this.options.actorTransferRuntime.notifyCoreSourceLeave(actor, () => activation.spot.onLeaveActor(actor));
1941
+ await activation.spot.onLeaveActor(actor);
1874
1942
  }
1875
1943
  activation.commitActorDeparture(actor.context.actorId);
1876
1944
  return;
@@ -1894,7 +1962,7 @@ class DefaultZLinkSpotManager {
1894
1962
  const outcome = admission.result ?? (await admission.resultTask);
1895
1963
  if ('error' in outcome)
1896
1964
  throw outcome.error;
1897
- if (!outcome.accepted || admission.state !== 'admitted') {
1965
+ if (!outcome.accepted || (admission.state !== 'admitted' && admission.state !== 'restoring')) {
1898
1966
  throw new Error(`Actor Join relocation '${relocationId}' has no accepted admission.`);
1899
1967
  }
1900
1968
  const entrySpotId = this.options.entryNodeRidProvider?.() ?? this.options.entryNodeRid;
@@ -1916,6 +1984,19 @@ class DefaultZLinkSpotManager {
1916
1984
  }
1917
1985
  catch (error) {
1918
1986
  lifecycleFailure = { error };
1987
+ const reporter = this.options.dispatchErrors;
1988
+ if (reporter?.captureEnabled() === true) {
1989
+ reporter.report({
1990
+ surface: ZLinkDispatchOptions_1.ZLinkDispatchErrorSurface.ActorRelocation,
1991
+ messageKind: ZLinkDispatchOptions_1.ZLinkDispatchMessageKind.Control,
1992
+ reason: (0, dispatch_error_details_1.dispatchReasonFromError)(error),
1993
+ action: ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.FailCaller,
1994
+ packetName: 'OnJoinedActor',
1995
+ meshName,
1996
+ actorId: actor.context.actorId,
1997
+ error
1998
+ });
1999
+ }
1919
2000
  }
1920
2001
  if (lifecycleFailure === undefined) {
1921
2002
  const sourceLeave = submitSourceLeave(admission.admission.actorRef.nodeRid);
@@ -1929,7 +2010,7 @@ class DefaultZLinkSpotManager {
1929
2010
  if (activation === undefined) {
1930
2011
  throw new Error(`Actor Join relocation '${relocationId}' target mailbox is missing.`);
1931
2012
  }
1932
- return activation.executeActor(actor.context.actorId, operation);
2013
+ return activation.executeActor(actor.context.actorId, operation, { lane: 'lifecycle' });
1933
2014
  };
1934
2015
  await this.options.actorTransferRuntime.deliverDeferredJoinCompletion(lifecycleFailure === undefined
1935
2016
  ? outcome.deferredJoinCompletion
@@ -1944,6 +2025,20 @@ class DefaultZLinkSpotManager {
1944
2025
  this.formalRemoteActorAdmissions.markCommitted(relocationId, actor);
1945
2026
  return true;
1946
2027
  }
2028
+ beginActorJoinRelocation(relocationId) {
2029
+ this.formalRemoteActorAdmissions.beginRestore(relocationId);
2030
+ return () => this.formalRemoteActorAdmissions.finishRestore(relocationId);
2031
+ }
2032
+ /** @internal Transfers accepted ingress after the target Actor becomes visible. */
2033
+ openActorJoinRelocation(meshName, relocationId, actor) {
2034
+ const admission = this.formalRemoteActorAdmissions.get(relocationId);
2035
+ if (admission === undefined)
2036
+ return;
2037
+ const activation = this.activations.resolve(meshName, admission.admission.spotId);
2038
+ if (activation !== undefined) {
2039
+ this.migrateActorJoinPrewarm(activation, actor, relocationId);
2040
+ }
2041
+ }
1947
2042
  async restoreCanonicalActorJoinRecovery(recovery, signal) {
1948
2043
  (0, abort_1.throwIfAborted)(signal);
1949
2044
  const admission = this.formalRemoteActorAdmissions.get(recovery.request.handoffId);
@@ -1951,14 +2046,16 @@ class DefaultZLinkSpotManager {
1951
2046
  throw new Error(`Actor Join recovery '${recovery.request.handoffId}' has no canonical command-28 admission.`);
1952
2047
  }
1953
2048
  const outcome = admission.result ?? (await admission.resultTask);
1954
- if ('error' in outcome || !outcome.accepted || admission.state !== 'admitted') {
2049
+ if ('error' in outcome ||
2050
+ !outcome.accepted ||
2051
+ (admission.state !== 'admitted' && admission.state !== 'restoring')) {
1955
2052
  throw new Error(`Actor Join recovery '${recovery.request.handoffId}' has no accepted admission.`);
1956
2053
  }
1957
2054
  const admitted = admission.admission;
1958
2055
  if (admitted.sourceActorNodeRid === undefined) {
1959
2056
  throw new Error(`Actor Join recovery '${recovery.request.handoffId}' lost its command-28 source route.`);
1960
2057
  }
1961
- const admittedNodeBytes = Buffer.from((0, routing_id_1.encodeRoutingIdStorageHex)(admitted.sourceActorNodeRid), 'hex');
2058
+ const admittedNodeBytes = Buffer.from((0, routing_id_2.encodeRoutingIdStorageHex)(admitted.sourceActorNodeRid), 'hex');
1962
2059
  if (admitted.actorId !== recovery.request.actorId ||
1963
2060
  admitted.actorType !== recovery.request.actorType ||
1964
2061
  admitted.requestFingerprint !== recovery.request.request.toString('base64') ||
@@ -1996,33 +2093,7 @@ class DefaultZLinkSpotManager {
1996
2093
  this.formalRemoteActorAdmissions.attachDeferredJoinCompletion(recovery.request.handoffId, deferred);
1997
2094
  }
1998
2095
  encodeMeshActorReply(requestHeaderPart, kind, payload) {
1999
- // Spec 27 §4/§7: the decode gate strips the observation-only flow pair at
2000
- // Off (and skips its validation); when tracing is on the reply preserves
2001
- // the request's flow pair alongside its correlation.
2002
- const requestHeader = (0, protocol_1.decodeStreamHeader)(requestHeaderPart.data(), this.options.dispatchErrors?.flow.flowCreationEnabled() ?? true);
2003
- const encoded = (0, payload_codec_1.encodeFrameworkPayload)(payload, this.options.messageSerializers);
2004
- try {
2005
- // encodeStreamHeader returns a fresh, unaliased array; view it without
2006
- // re-copying. The payload copy stays: encoded.message closes below.
2007
- const replyHeader = (0, protocol_1.encodeStreamHeader)({
2008
- kind,
2009
- codec: (0, protocol_1.streamCodecForContentType)(encoded.contentType),
2010
- flags: protocol_1.ZLinkStreamHeaderFlags.None,
2011
- requestSeq: requestHeader.requestSeq,
2012
- name: '',
2013
- metadata: new Map(),
2014
- correlationId: requestHeader.correlationId,
2015
- flowId: requestHeader.flowId,
2016
- flowOrigin: requestHeader.flowOrigin
2017
- });
2018
- return [
2019
- Buffer.from(replyHeader.buffer, replyHeader.byteOffset, replyHeader.byteLength),
2020
- Buffer.from(encoded.message.data())
2021
- ];
2022
- }
2023
- finally {
2024
- encoded.message.close();
2025
- }
2096
+ return (0, actor_reply_1.encodeActorReply)(requestHeaderPart.data(), kind, payload, this.options.messageSerializers, this.options.dispatchErrors?.flow.flowCreationEnabled() ?? true);
2026
2097
  }
2027
2098
  async createActivation(meshName, spotType, spotId, request, signal, authority) {
2028
2099
  this.requireRegisteredFactory(spotType);
@@ -2046,9 +2117,11 @@ class DefaultZLinkSpotManager {
2046
2117
  * either lands in the snapshot or resolves the Actor directly through
2047
2118
  * ordinary ingress — never both, never neither.
2048
2119
  */
2049
- async migrateActorJoinPrewarm(activation, actor, transferId) {
2120
+ migrateActorJoinPrewarm(activation, actor, transferId) {
2050
2121
  const drained = this.formalRemoteActorAdmissions.completeMigration(transferId);
2051
- for (const arrival of drained) {
2122
+ if (drained.length === 0)
2123
+ return;
2124
+ const terminals = drained.map(async (arrival) => {
2052
2125
  try {
2053
2126
  const response = await this.dispatchActorPacket(arrival.origin, activation, actor.context.actorId, [runtime_message_1.ZLinkBufferMessage.from(arrival.header), runtime_message_1.ZLinkBufferMessage.from(arrival.payload)], arrival.returnResponse, arrival.remoteBoundSessionTarget, arrival.fallbackActorRef, arrival.requestTerminal);
2054
2127
  arrival.resolve(response);
@@ -2056,7 +2129,13 @@ class DefaultZLinkSpotManager {
2056
2129
  catch (error) {
2057
2130
  arrival.reject(error);
2058
2131
  }
2059
- }
2132
+ });
2133
+ // Reserve every retained arrival's FIFO position before ordinary ingress
2134
+ // can resume. Handler terminals must not hold the relocation finalize that
2135
+ // releases an earlier saved-work prefix.
2136
+ this.options.detachedTaskRunner.runDetached(`actor Join ingress migration ${actor.context.actorId}`, async () => {
2137
+ await Promise.all(terminals);
2138
+ });
2060
2139
  }
2061
2140
  async dispatchMeshActorPacket(origin, meshName, spotId, actorId, parts, returnResponse, fallbackActorRef, requestTerminal, messageFollowOrigin) {
2062
2141
  const activation = this.activations.resolve(meshName, spotId);
@@ -2112,7 +2191,7 @@ function decodeFormalRemoteTransferRequestBytes(bytes) {
2112
2191
  ? payload.requestContentType
2113
2192
  : 'application/json',
2114
2193
  actorEntryNodeRid: typeof payload.actorEntryNodeRid === 'string'
2115
- ? (0, routing_id_1.decodeRoutingId)(payload.actorEntryNodeRid, payload.actorEntryNodeRidHex)
2194
+ ? (0, routing_id_2.decodeRoutingId)(payload.actorEntryNodeRid, payload.actorEntryNodeRidHex)
2116
2195
  : undefined,
2117
2196
  sourceSpotId: typeof payload.sourceSpotId === 'string' ? payload.sourceSpotId : undefined,
2118
2197
  actorRef: decodeFormalRemoteActorRef(payload),
@@ -2169,7 +2248,7 @@ function validateRemoteAdmissionCommit(admission, request, actorId, control) {
2169
2248
  expected.targetSpotGeneration !== (control.currentSpotGeneration ?? 0n) ||
2170
2249
  actorRef === undefined ||
2171
2250
  actorRef.actorId !== expected.actorRef.actorId ||
2172
- String(actorRef.nodeRid) !== String(expected.actorRef.nodeRid) ||
2251
+ !(0, routing_id_1.routingIdsEqual)(actorRef.nodeRid, expected.actorRef.nodeRid) ||
2173
2252
  actorRef.objectGeneration !== expected.actorRef.objectGeneration) {
2174
2253
  throw new configuration_1.ZLinkConfigurationException(`Remote Actor '${actorId}' commit does not match its target admission.`);
2175
2254
  }
@@ -2197,17 +2276,3 @@ function isAbortSignal(value) {
2197
2276
  typeof value.aborted === 'boolean' &&
2198
2277
  typeof value.addEventListener === 'function');
2199
2278
  }
2200
- function instanceActivationOutcome(error) {
2201
- if ((0, abort_1.isAbortError)(error))
2202
- return 'shutdown';
2203
- if (error instanceof contracts_1.ZLinkFrameworkException) {
2204
- if (error.kind === contracts_1.ZLinkFrameworkErrorKind.DeadlineExceeded)
2205
- return 'timed_out';
2206
- if (error.kind === contracts_1.ZLinkFrameworkErrorKind.AlreadyExists)
2207
- return 'conflict';
2208
- if (error.kind === contracts_1.ZLinkFrameworkErrorKind.InvalidOperation ||
2209
- error.kind === contracts_1.ZLinkFrameworkErrorKind.Unavailable)
2210
- return 'fenced';
2211
- }
2212
- return 'failed';
2213
- }