@zlink-systems/framework 0.26.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (521) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Common/CoreTypes.d.ts +6 -0
  3. package/dist/contracts/Common/CoreTypes.js +7 -0
  4. package/dist/contracts/Common/index.d.ts +1 -1
  5. package/dist/contracts/Common/index.js +0 -1
  6. package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
  7. package/dist/contracts/Configuration/InternalDefaults.js +9 -1
  8. package/dist/contracts/Configuration/Registration.d.ts +13 -2
  9. package/dist/contracts/Configuration/Registration.js +58 -36
  10. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
  12. package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
  13. package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
  14. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  15. package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
  16. package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
  17. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
  18. package/dist/contracts/Handlers/JsonContract.js +10 -4
  19. package/dist/contracts/Locations/Authority.d.ts +1 -1
  20. package/dist/contracts/Locations/Authority.js +3 -2
  21. package/dist/contracts/Locations/Options.js +1 -1
  22. package/dist/contracts/Locations/Stores.d.ts +12 -0
  23. package/dist/contracts/Locations/Stores.js +9 -0
  24. package/dist/contracts/Spots/Contracts.d.ts +1 -1
  25. package/dist/internal.d.ts +4 -0
  26. package/dist/internal.js +15 -1
  27. package/dist/nest-integration.d.ts +4 -2
  28. package/dist/nest-integration.js +14 -4
  29. package/dist/runtime/abort.d.ts +1 -0
  30. package/dist/runtime/abort.js +8 -5
  31. package/dist/runtime/activation-admission.d.ts +1 -2
  32. package/dist/runtime/activation-admission.js +2 -6
  33. package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
  34. package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
  35. package/dist/runtime/actors/actor-client.d.ts +2 -2
  36. package/dist/runtime/actors/actor-client.js +42 -143
  37. package/dist/runtime/actors/actor-context.d.ts +3 -5
  38. package/dist/runtime/actors/actor-context.js +13 -11
  39. package/dist/runtime/actors/actor-handoff.d.ts +4 -4
  40. package/dist/runtime/actors/actor-handoff.js +8 -8
  41. package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
  42. package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
  43. package/dist/runtime/actors/actor-local-native-join.js +83 -105
  44. package/dist/runtime/actors/actor-native-lookup.js +2 -8
  45. package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
  46. package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
  47. package/dist/runtime/actors/actor-remote-joiner.d.ts +1 -1
  48. package/dist/runtime/actors/actor-remote-joiner.js +5 -9
  49. package/dist/runtime/actors/actor-remote-wire.js +5 -3
  50. package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
  51. package/dist/runtime/actors/actor-request-deadline.js +31 -0
  52. package/dist/runtime/actors/actor-retry-delay.js +2 -1
  53. package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
  54. package/dist/runtime/actors/actor-runtime-state.js +70 -187
  55. package/dist/runtime/actors/bound-session-wire.js +2 -7
  56. package/dist/runtime/actors/deferred-join-completion.d.ts +11 -6
  57. package/dist/runtime/actors/deferred-join-completion.js +1 -0
  58. package/dist/runtime/actors/index.d.ts +9 -7
  59. package/dist/runtime/actors/index.js +87 -69
  60. package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
  61. package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
  62. package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
  63. package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
  64. package/dist/runtime/admission.d.ts +2 -0
  65. package/dist/runtime/admission.js +7 -1
  66. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
  67. package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
  68. package/dist/runtime/backend/contracts/index.d.ts +6 -23
  69. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +1 -17
  70. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
  71. package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
  72. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +1 -1
  73. package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -6
  74. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
  75. package/dist/runtime/backend/node/node-event-loop-poller.js +6 -7
  76. package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
  77. package/dist/runtime/backend/node/node-raw-binding-port.js +40 -16
  78. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +14 -15
  79. package/dist/runtime/backend/node/node-raw-mesh-backend.js +146 -118
  80. package/dist/runtime/backend/node/node-socket-backend-adapter.js +3 -2
  81. package/dist/runtime/backend/raw-binding-port.d.ts +1 -1
  82. package/dist/runtime/backend/runtime-values.d.ts +4 -1
  83. package/dist/runtime/backend/runtime-values.js +2 -0
  84. package/dist/runtime/channels/channel-clients.d.ts +20 -8
  85. package/dist/runtime/channels/channel-clients.js +68 -52
  86. package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
  87. package/dist/runtime/channels/channel-envelope.js +47 -29
  88. package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
  89. package/dist/runtime/channels/channel-outbound-operations.js +9 -10
  90. package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
  91. package/dist/runtime/channels/channel-receive-loops.js +27 -6
  92. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
  93. package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
  94. package/dist/runtime/channels/channel-runtime-manager.js +5 -2
  95. package/dist/runtime/channels/channel-socket-options.js +3 -2
  96. package/dist/runtime/channels/channel-socket-registry.d.ts +14 -29
  97. package/dist/runtime/channels/channel-socket-registry.js +248 -174
  98. package/dist/runtime/channels/channel-transports.d.ts +11 -17
  99. package/dist/runtime/channels/channel-transports.js +68 -47
  100. package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
  101. package/dist/runtime/channels/client-server-location-runtime.js +10 -11
  102. package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
  103. package/dist/runtime/channels/client-server-service-wire.js +32 -11
  104. package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
  105. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  106. package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
  107. package/dist/runtime/channels/fanout-location-runtime.js +130 -72
  108. package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
  109. package/dist/runtime/channels/spot-direct-envelope.js +4 -3
  110. package/dist/runtime/channels/spot-node-route-transport.js +3 -2
  111. package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
  112. package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
  113. package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
  114. package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
  115. package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
  116. package/dist/runtime/diagnostics/flow-context.js +16 -2
  117. package/dist/runtime/diagnostics/index.d.ts +4 -2
  118. package/dist/runtime/diagnostics/index.js +14 -4
  119. package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
  120. package/dist/runtime/diagnostics/message-flow.js +10 -19
  121. package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
  122. package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
  123. package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
  124. package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
  125. package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
  126. package/dist/runtime/disposal.d.ts +5 -0
  127. package/dist/runtime/disposal.js +22 -0
  128. package/dist/runtime/execution/index.d.ts +12 -9
  129. package/dist/runtime/execution/index.js +58 -14
  130. package/dist/runtime/execution/serial-execution-queue.d.ts +8 -2
  131. package/dist/runtime/execution/serial-execution-queue.js +54 -15
  132. package/dist/runtime/execution/state-lane.d.ts +8 -1
  133. package/dist/runtime/execution/state-lane.js +118 -3
  134. package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
  135. package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
  136. package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
  137. package/dist/runtime/foundation/event-loop-resources.js +6 -119
  138. package/dist/runtime/foundation/operation-identity.d.ts +2 -0
  139. package/dist/runtime/foundation/operation-identity.js +9 -5
  140. package/dist/runtime/foundation/operation-registry.d.ts +5 -7
  141. package/dist/runtime/foundation/operation-registry.js +34 -44
  142. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +8 -5
  143. package/dist/runtime/foundation/raw-service-mesh-runtime.js +62 -83
  144. package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
  145. package/dist/runtime/foundation/runtime-state-projections.js +8 -0
  146. package/dist/runtime/foundation/service-authority-payload-codec.js +22 -12
  147. package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
  148. package/dist/runtime/foundation/service-discovery-registry.js +22 -3
  149. package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
  150. package/dist/runtime/foundation/service-liveness-registry.js +2 -1
  151. package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
  152. package/dist/runtime/foundation/service-maintenance-runtime.js +0 -6
  153. package/dist/runtime/foundation/service-metadata-codec.js +3 -3
  154. package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
  155. package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
  156. package/dist/runtime/foundation/service-relocation-object-owner.js +3 -2
  157. package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
  158. package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
  159. package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
  160. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -12
  161. package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
  162. package/dist/runtime/foundation/service-stateful-registry.js +10 -2
  163. package/dist/runtime/foundation/service-stateful-runtime.d.ts +26 -25
  164. package/dist/runtime/foundation/service-stateful-runtime.js +217 -204
  165. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -3
  166. package/dist/runtime/foundation/service-stateful-wire-codec.js +89 -55
  167. package/dist/runtime/foundation/service-topology-registry.d.ts +0 -1
  168. package/dist/runtime/foundation/service-topology-registry.js +17 -32
  169. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
  170. package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
  171. package/dist/runtime/foundation/service-wire-codec.js +10 -8
  172. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  173. package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
  174. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
  175. package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
  176. package/dist/runtime/framework-errors-internal.d.ts +2 -1
  177. package/dist/runtime/framework-errors-internal.js +343 -122
  178. package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
  179. package/dist/runtime/handlers/handler-instance-scope.js +61 -74
  180. package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
  181. package/dist/runtime/host/actor-packet-relay.js +48 -91
  182. package/dist/runtime/host/actor-placement-coordinator.js +7 -5
  183. package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
  184. package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
  185. package/dist/runtime/host/actor-transfer-runtime.d.ts +16 -18
  186. package/dist/runtime/host/actor-transfer-runtime.js +143 -176
  187. package/dist/runtime/host/application-job-queue.js +16 -33
  188. package/dist/runtime/host/bound-session-relay.js +1 -1
  189. package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
  190. package/dist/runtime/host/index.d.ts +14 -13
  191. package/dist/runtime/host/index.js +190 -157
  192. package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
  193. package/dist/runtime/host/instance-activation-authority.js +17 -45
  194. package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
  195. package/dist/runtime/host/location-runtime-owner.js +2 -2
  196. package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
  197. package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
  198. package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
  199. package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
  200. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
  201. package/dist/runtime/host/remote-bound-session-relay.js +7 -20
  202. package/dist/runtime/host/route-mesh-runtime.d.ts +13 -11
  203. package/dist/runtime/host/route-mesh-runtime.js +171 -252
  204. package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
  205. package/dist/runtime/host/runtime-shutdown.js +18 -21
  206. package/dist/runtime/host/service-relocation-control.js +6 -1
  207. package/dist/runtime/host/service-relocation-host-runtime.d.ts +21 -30
  208. package/dist/runtime/host/service-relocation-host-runtime.js +508 -416
  209. package/dist/runtime/host/spot-address-transport.d.ts +2 -3
  210. package/dist/runtime/host/spot-address-transport.js +34 -136
  211. package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
  212. package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
  213. package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -10
  214. package/dist/runtime/host/spot-runtime-options-factory.js +50 -14
  215. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -3
  216. package/dist/runtime/host/user-spot-creation-coordinator.js +11 -8
  217. package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
  218. package/dist/runtime/locations/authority-key-codec.js +4 -3
  219. package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
  220. package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
  221. package/dist/runtime/locations/creation-operation-id.js +6 -4
  222. package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
  223. package/dist/runtime/locations/in-memory-authority-store.js +31 -15
  224. package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
  225. package/dist/runtime/locations/in-memory-location-store.js +17 -14
  226. package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
  227. package/dist/runtime/locations/in-memory-provider-location-store.js +72 -22
  228. package/dist/runtime/locations/key-codec.js +3 -2
  229. package/dist/runtime/locations/lease-tracker.d.ts +3 -5
  230. package/dist/runtime/locations/lease-tracker.js +7 -11
  231. package/dist/runtime/locations/lifecycle.d.ts +4 -9
  232. package/dist/runtime/locations/lifecycle.js +2 -31
  233. package/dist/runtime/locations/location-store-failure.d.ts +2 -0
  234. package/dist/runtime/locations/location-store-failure.js +7 -0
  235. package/dist/runtime/locations/location-store-pages.d.ts +3 -0
  236. package/dist/runtime/locations/location-store-pages.js +13 -0
  237. package/dist/runtime/locations/location-store-repository.d.ts +5 -7
  238. package/dist/runtime/locations/location-store-repository.js +303 -332
  239. package/dist/runtime/locations/relocation-blob.js +18 -5
  240. package/dist/runtime/locations/resolvers.d.ts +5 -5
  241. package/dist/runtime/locations/resolvers.js +37 -28
  242. package/dist/runtime/locations/runtime.d.ts +5 -4
  243. package/dist/runtime/locations/runtime.js +123 -92
  244. package/dist/runtime/locations/spot-location-claims.d.ts +6 -0
  245. package/dist/runtime/locations/spot-location-claims.js +42 -1
  246. package/dist/runtime/messaging/payload-codec.js +26 -20
  247. package/dist/runtime/messaging/submission-result.d.ts +3 -0
  248. package/dist/runtime/messaging/submission-result.js +48 -0
  249. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +1 -0
  250. package/dist/runtime/protocol/service_wire_codec.generated.js +12 -7
  251. package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +4 -1
  252. package/dist/runtime/spots/index.d.ts +14 -20
  253. package/dist/runtime/spots/index.js +302 -176
  254. package/dist/runtime/spots/spot-activation-registry.d.ts +3 -5
  255. package/dist/runtime/spots/spot-activation-registry.js +14 -50
  256. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  257. package/dist/runtime/spots/spot-activation-state.js +2 -2
  258. package/dist/runtime/spots/spot-activation.d.ts +3 -4
  259. package/dist/runtime/spots/spot-activation.js +49 -32
  260. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
  261. package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
  262. package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
  263. package/dist/runtime/spots/spot-actor-join-dispatch.js +4 -52
  264. package/dist/runtime/spots/spot-actor-membership.d.ts +4 -6
  265. package/dist/runtime/spots/spot-actor-membership.js +22 -45
  266. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
  267. package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
  268. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
  269. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
  270. package/dist/runtime/spots/spot-context.d.ts +2 -2
  271. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -2
  272. package/dist/runtime/spots/spot-entry-activation.js +9 -20
  273. package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
  274. package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
  275. package/dist/runtime/spots/spot-manager-public.js +5 -4
  276. package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
  277. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -18
  278. package/dist/runtime/spots/spot-node-runtime-manager.js +67 -72
  279. package/dist/runtime/spots/spot-outbound.d.ts +4 -3
  280. package/dist/runtime/spots/spot-outbound.js +9 -8
  281. package/dist/runtime/spots/spot-remote-codec.js +5 -3
  282. package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
  283. package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
  284. package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
  285. package/dist/runtime/spots/spot-route-replies.js +3 -1
  286. package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -3
  287. package/dist/runtime/spots/spot-routed-actor-admission.js +3 -12
  288. package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +1 -2
  289. package/dist/runtime/spots/spot-routed-frame-dispatch.js +0 -1
  290. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
  291. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
  292. package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -16
  293. package/dist/runtime/spots/spot-serial-executor.js +2 -2
  294. package/dist/runtime/spots/spot-serial-turn-executor.d.ts +27 -7
  295. package/dist/runtime/spots/spot-serial-turn-executor.js +83 -11
  296. package/dist/runtime/spots/spot-timer.d.ts +3 -2
  297. package/dist/runtime/streams/actor-session-binding-registry.d.ts +16 -29
  298. package/dist/runtime/streams/actor-session-binding-registry.js +142 -212
  299. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +1 -4
  300. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
  301. package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
  302. package/dist/runtime/streams/bound-session-service.d.ts +7 -0
  303. package/dist/runtime/streams/bound-session-service.js +11 -1
  304. package/dist/runtime/streams/index.d.ts +14 -15
  305. package/dist/runtime/streams/index.js +20 -21
  306. package/dist/runtime/streams/managed-stream.d.ts +3 -0
  307. package/dist/runtime/streams/managed-stream.js +17 -8
  308. package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
  309. package/dist/runtime/streams/protocol.d.ts +6 -33
  310. package/dist/runtime/streams/protocol.js +38 -110
  311. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
  312. package/dist/runtime/streams/session-actor-coordinator.js +12 -4
  313. package/dist/runtime/streams/session-calls.d.ts +1 -1
  314. package/dist/runtime/streams/session-calls.js +5 -4
  315. package/dist/runtime/streams/session-context.d.ts +6 -6
  316. package/dist/runtime/streams/session-context.js +22 -4
  317. package/dist/runtime/streams/session-requests.js +2 -1
  318. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
  319. package/dist/runtime/streams/stream-frame-factory.js +2 -2
  320. package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
  321. package/dist/runtime/streams/stream-session-runtime.js +25 -33
  322. package/dist/runtime/workers/index.d.ts +2 -2
  323. package/dist/runtime/workers/index.js +5 -4
  324. package/package.json +3 -3
  325. package/src/contracts/Common/CoreTypes.ts +7 -0
  326. package/src/contracts/Common/index.ts +1 -1
  327. package/src/contracts/Configuration/InternalDefaults.ts +12 -0
  328. package/src/contracts/Configuration/Registration.ts +92 -48
  329. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
  330. package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
  331. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  332. package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
  333. package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
  334. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
  335. package/src/contracts/Handlers/JsonContract.ts +14 -4
  336. package/src/contracts/Locations/Authority.ts +7 -3
  337. package/src/contracts/Locations/Options.ts +1 -1
  338. package/src/contracts/Locations/Stores.ts +14 -0
  339. package/src/contracts/Spots/Contracts.ts +1 -1
  340. package/src/internal.ts +14 -0
  341. package/src/nest-integration.ts +28 -10
  342. package/src/runtime/abort.ts +6 -5
  343. package/src/runtime/activation-admission.ts +2 -8
  344. package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
  345. package/src/runtime/actors/actor-client.ts +77 -204
  346. package/src/runtime/actors/actor-context.ts +39 -33
  347. package/src/runtime/actors/actor-handoff.ts +24 -22
  348. package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
  349. package/src/runtime/actors/actor-local-native-join.ts +172 -174
  350. package/src/runtime/actors/actor-native-lookup.ts +2 -9
  351. package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
  352. package/src/runtime/actors/actor-remote-joiner.ts +9 -11
  353. package/src/runtime/actors/actor-remote-wire.ts +5 -3
  354. package/src/runtime/actors/actor-request-deadline.ts +49 -0
  355. package/src/runtime/actors/actor-retry-delay.ts +2 -1
  356. package/src/runtime/actors/actor-runtime-state.ts +85 -247
  357. package/src/runtime/actors/bound-session-wire.ts +2 -8
  358. package/src/runtime/actors/deferred-join-completion.ts +10 -6
  359. package/src/runtime/actors/index.ts +100 -79
  360. package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
  361. package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
  362. package/src/runtime/admission.ts +8 -1
  363. package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
  364. package/src/runtime/backend/contracts/index.ts +13 -29
  365. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +2 -18
  366. package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
  367. package/src/runtime/backend/node/node-backend-adapter-support.ts +23 -6
  368. package/src/runtime/backend/node/node-event-loop-poller.ts +8 -12
  369. package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
  370. package/src/runtime/backend/node/node-raw-binding-port.ts +41 -20
  371. package/src/runtime/backend/node/node-raw-mesh-backend.ts +227 -170
  372. package/src/runtime/backend/node/node-socket-backend-adapter.ts +3 -2
  373. package/src/runtime/backend/raw-binding-port.ts +1 -1
  374. package/src/runtime/backend/runtime-values.ts +4 -1
  375. package/src/runtime/channels/channel-clients.ts +132 -85
  376. package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
  377. package/src/runtime/channels/channel-envelope.ts +58 -29
  378. package/src/runtime/channels/channel-outbound-operations.ts +10 -23
  379. package/src/runtime/channels/channel-receive-loops.ts +39 -7
  380. package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
  381. package/src/runtime/channels/channel-runtime-manager.ts +6 -2
  382. package/src/runtime/channels/channel-socket-options.ts +8 -2
  383. package/src/runtime/channels/channel-socket-registry.ts +301 -192
  384. package/src/runtime/channels/channel-transports.ts +161 -112
  385. package/src/runtime/channels/client-server-location-runtime.ts +17 -17
  386. package/src/runtime/channels/client-server-service-wire.ts +40 -12
  387. package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
  388. package/src/runtime/channels/fanout-location-runtime.ts +172 -91
  389. package/src/runtime/channels/spot-direct-envelope.ts +1 -1
  390. package/src/runtime/channels/spot-node-route-transport.ts +5 -2
  391. package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
  392. package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
  393. package/src/runtime/diagnostics/flow-context.ts +16 -2
  394. package/src/runtime/diagnostics/index.ts +27 -17
  395. package/src/runtime/diagnostics/message-flow.ts +15 -25
  396. package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
  397. package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
  398. package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
  399. package/src/runtime/disposal.ts +19 -0
  400. package/src/runtime/execution/index.ts +60 -20
  401. package/src/runtime/execution/serial-execution-queue.ts +131 -18
  402. package/src/runtime/execution/state-lane.ts +142 -4
  403. package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
  404. package/src/runtime/foundation/event-loop-resources.ts +5 -122
  405. package/src/runtime/foundation/operation-identity.ts +11 -5
  406. package/src/runtime/foundation/operation-registry.ts +33 -50
  407. package/src/runtime/foundation/raw-service-mesh-runtime.ts +110 -111
  408. package/src/runtime/foundation/runtime-state-projections.ts +9 -1
  409. package/src/runtime/foundation/service-authority-payload-codec.ts +31 -13
  410. package/src/runtime/foundation/service-discovery-registry.ts +32 -3
  411. package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
  412. package/src/runtime/foundation/service-liveness-registry.ts +2 -1
  413. package/src/runtime/foundation/service-maintenance-runtime.ts +0 -10
  414. package/src/runtime/foundation/service-metadata-codec.ts +2 -2
  415. package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
  416. package/src/runtime/foundation/service-relocation-object-owner.ts +5 -2
  417. package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
  418. package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
  419. package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -17
  420. package/src/runtime/foundation/service-stateful-registry.ts +14 -2
  421. package/src/runtime/foundation/service-stateful-runtime.ts +322 -276
  422. package/src/runtime/foundation/service-stateful-wire-codec.ts +128 -80
  423. package/src/runtime/foundation/service-topology-registry.ts +23 -32
  424. package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
  425. package/src/runtime/foundation/service-wire-codec.ts +15 -8
  426. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  427. package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
  428. package/src/runtime/framework-errors-internal.ts +380 -134
  429. package/src/runtime/handlers/handler-instance-scope.ts +68 -95
  430. package/src/runtime/host/actor-packet-relay.ts +57 -147
  431. package/src/runtime/host/actor-placement-coordinator.ts +8 -5
  432. package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
  433. package/src/runtime/host/actor-transfer-runtime.ts +180 -260
  434. package/src/runtime/host/application-job-queue.ts +28 -34
  435. package/src/runtime/host/bound-session-relay.ts +1 -2
  436. package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
  437. package/src/runtime/host/index.ts +327 -296
  438. package/src/runtime/host/instance-activation-authority.ts +89 -109
  439. package/src/runtime/host/location-runtime-owner.ts +4 -2
  440. package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
  441. package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
  442. package/src/runtime/host/remote-bound-session-relay.ts +8 -41
  443. package/src/runtime/host/route-mesh-runtime.ts +228 -271
  444. package/src/runtime/host/runtime-shutdown.ts +17 -21
  445. package/src/runtime/host/service-relocation-control.ts +14 -1
  446. package/src/runtime/host/service-relocation-host-runtime.ts +699 -561
  447. package/src/runtime/host/spot-address-transport.ts +73 -195
  448. package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
  449. package/src/runtime/host/spot-runtime-options-factory.ts +73 -22
  450. package/src/runtime/host/user-spot-creation-coordinator.ts +36 -22
  451. package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
  452. package/src/runtime/locations/authority-key-codec.ts +7 -3
  453. package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
  454. package/src/runtime/locations/creation-operation-id.ts +6 -3
  455. package/src/runtime/locations/domain-store-contract.ts +12 -3
  456. package/src/runtime/locations/in-memory-authority-store.ts +44 -15
  457. package/src/runtime/locations/in-memory-location-store.ts +50 -39
  458. package/src/runtime/locations/in-memory-provider-location-store.ts +100 -25
  459. package/src/runtime/locations/key-codec.ts +3 -2
  460. package/src/runtime/locations/lease-tracker.ts +8 -14
  461. package/src/runtime/locations/lifecycle.ts +13 -43
  462. package/src/runtime/locations/location-store-failure.ts +4 -0
  463. package/src/runtime/locations/location-store-pages.ts +18 -0
  464. package/src/runtime/locations/location-store-repository.ts +450 -478
  465. package/src/runtime/locations/relocation-blob.ts +17 -6
  466. package/src/runtime/locations/resolvers.ts +75 -49
  467. package/src/runtime/locations/runtime.ts +220 -110
  468. package/src/runtime/locations/spot-location-claims.ts +58 -1
  469. package/src/runtime/messaging/payload-codec.ts +35 -24
  470. package/src/runtime/messaging/submission-result.ts +57 -1
  471. package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
  472. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
  473. package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +4 -1
  474. package/src/runtime/spots/index.ts +433 -229
  475. package/src/runtime/spots/spot-activation-registry.ts +30 -69
  476. package/src/runtime/spots/spot-activation-state.ts +2 -2
  477. package/src/runtime/spots/spot-activation.ts +67 -37
  478. package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
  479. package/src/runtime/spots/spot-actor-join-dispatch.ts +24 -77
  480. package/src/runtime/spots/spot-actor-membership.ts +40 -72
  481. package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
  482. package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
  483. package/src/runtime/spots/spot-context.ts +3 -3
  484. package/src/runtime/spots/spot-entry-activation.ts +13 -30
  485. package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
  486. package/src/runtime/spots/spot-manager-public.ts +21 -17
  487. package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
  488. package/src/runtime/spots/spot-node-runtime-manager.ts +136 -125
  489. package/src/runtime/spots/spot-outbound.ts +45 -23
  490. package/src/runtime/spots/spot-remote-codec.ts +7 -3
  491. package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
  492. package/src/runtime/spots/spot-route-replies.ts +6 -4
  493. package/src/runtime/spots/spot-routed-actor-admission.ts +13 -26
  494. package/src/runtime/spots/spot-routed-frame-dispatch.ts +2 -3
  495. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
  496. package/src/runtime/spots/spot-runtime-ports.ts +5 -27
  497. package/src/runtime/spots/spot-serial-executor.ts +2 -2
  498. package/src/runtime/spots/spot-serial-turn-executor.ts +112 -11
  499. package/src/runtime/spots/spot-timer.ts +3 -2
  500. package/src/runtime/streams/actor-session-binding-registry.ts +179 -269
  501. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +0 -8
  502. package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
  503. package/src/runtime/streams/bound-session-service.ts +21 -1
  504. package/src/runtime/streams/index.ts +76 -64
  505. package/src/runtime/streams/managed-stream.ts +29 -10
  506. package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
  507. package/src/runtime/streams/protocol.ts +34 -88
  508. package/src/runtime/streams/session-actor-coordinator.ts +17 -5
  509. package/src/runtime/streams/session-calls.ts +6 -5
  510. package/src/runtime/streams/session-context.ts +54 -10
  511. package/src/runtime/streams/session-requests.ts +2 -1
  512. package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
  513. package/src/runtime/streams/stream-frame-factory.ts +2 -3
  514. package/src/runtime/streams/stream-session-runtime.ts +57 -59
  515. package/src/runtime/workers/index.ts +13 -12
  516. package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
  517. package/dist/runtime/actors/post-commit-actor-location.js +0 -72
  518. package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
  519. package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
  520. package/src/runtime/actors/post-commit-actor-location.ts +0 -121
  521. package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
@@ -1,7 +1,7 @@
1
1
  import { AsyncLocalStorage, AsyncResource } from 'node:async_hooks';
2
2
  import type { Type, ZLinkMessageContext } from '../../contracts';
3
3
  import type { ZLinkProviderResolver } from '../../contracts/Common/ZLinkProviderResolver';
4
- import { ZLinkStateLane } from '../execution/state-lane';
4
+ import type { ZLinkDetachedTaskRunner } from '../spots/spot-actor-join-dispatch';
5
5
 
6
6
  export interface ZLinkHandlerInstanceScope {
7
7
  resolve<T>(type: Type<T>): Promise<T>;
@@ -22,16 +22,6 @@ interface Deferred<T> {
22
22
  readonly reject: (error: unknown) => void;
23
23
  }
24
24
 
25
- interface HandlerResolution<T> {
26
- readonly promise: Promise<T>;
27
- readonly activation?: Deferred<unknown>;
28
- }
29
-
30
- interface HandlerScopeDisposal {
31
- readonly pending: readonly Promise<unknown>[];
32
- readonly owned: readonly unknown[];
33
- }
34
-
35
25
  interface LifecycleScopeDisposal {
36
26
  readonly completion: Promise<void>;
37
27
  readonly deferred?: Deferred<void>;
@@ -41,9 +31,9 @@ interface LifecycleScopeDisposal {
41
31
  const HANDLER_SCOPE_FACTORY = Symbol.for('@zlink-systems/framework.handler-instance-scope-factory');
42
32
  const activeHandlerScope = new AsyncLocalStorage<ActiveHandlerScope>();
43
33
  const activeLifecycleScope = new AsyncLocalStorage<LifecycleHandlerInstanceScope>();
44
- const detachedStateLaneResource = new AsyncResource('zlink:handler-instance-scope');
34
+ const detachedLifecycleResource = new AsyncResource('zlink:handler-instance-scope');
45
35
  const dispatchScopes = new WeakMap<object, ZLinkHandlerInstanceScope>();
46
- const lifecycleScopes = new WeakMap<object, Promise<LifecycleHandlerInstanceScope>>();
36
+ const lifecycleScopes = new WeakMap<object, LifecycleHandlerInstanceScope>();
47
37
 
48
38
  export async function runInHandlerInstanceScope<T>(
49
39
  providerResolver: ZLinkProviderResolver | undefined,
@@ -80,14 +70,7 @@ export async function resolveLifecycleHandler<T>(
80
70
  type: Type<T>,
81
71
  providerResolver?: ZLinkProviderResolver
82
72
  ): Promise<T> {
83
- let scope = lifecycleScopes.get(owner);
84
- if (scope === undefined) {
85
- scope = Promise.resolve(
86
- new LifecycleHandlerInstanceScope(createHandlerInstanceScope(providerResolver))
87
- );
88
- lifecycleScopes.set(owner, scope);
89
- }
90
- return (await scope).resolve(type);
73
+ return lifecycleHandlerScope(owner, providerResolver).resolve(type);
91
74
  }
92
75
 
93
76
  export async function runWithLifecycleHandler<THandler, TResult>(
@@ -96,25 +79,34 @@ export async function runWithLifecycleHandler<THandler, TResult>(
96
79
  providerResolver: ZLinkProviderResolver | undefined,
97
80
  callback: (handler: THandler) => Promise<TResult>
98
81
  ): Promise<TResult> {
82
+ return lifecycleHandlerScope(owner, providerResolver).run(type, callback);
83
+ }
84
+
85
+ function lifecycleHandlerScope(
86
+ owner: object,
87
+ providerResolver?: ZLinkProviderResolver
88
+ ): LifecycleHandlerInstanceScope {
99
89
  let scope = lifecycleScopes.get(owner);
100
90
  if (scope === undefined) {
101
- scope = Promise.resolve(
102
- new LifecycleHandlerInstanceScope(createHandlerInstanceScope(providerResolver))
103
- );
91
+ scope = new LifecycleHandlerInstanceScope(createHandlerInstanceScope(providerResolver));
104
92
  lifecycleScopes.set(owner, scope);
105
93
  }
106
- return (await scope).run(type, callback);
94
+ return scope;
107
95
  }
108
96
 
109
- export async function disposeLifecycleHandlers(owner: object): Promise<void> {
97
+ export async function disposeLifecycleHandlers(
98
+ owner: object,
99
+ detachedTaskRunner: ZLinkDetachedTaskRunner
100
+ ): Promise<void> {
101
+ if ((detachedTaskRunner as unknown) === undefined) {
102
+ throw new Error('Lifecycle handler disposal requires a detached task runner.');
103
+ }
110
104
  const scope = lifecycleScopes.get(owner);
111
105
  if (scope === undefined) return;
112
- const resolved = await scope;
113
- await resolved.dispose();
106
+ await scope.dispose(detachedTaskRunner);
114
107
  // Keep the closed scope as a tombstone for the lifetime of the owner object.
115
108
  // A late dispatch must fail instead of creating a second activation.
116
109
  }
117
-
118
110
  function createHandlerInstanceScope(
119
111
  providerResolver?: ZLinkProviderResolver,
120
112
  context?: ZLinkMessageContext
@@ -138,72 +130,47 @@ function isHandlerInstanceScopeFactory(value: unknown): value is ZLinkHandlerIns
138
130
  }
139
131
 
140
132
  class DefaultHandlerInstanceScope implements ZLinkHandlerInstanceScope {
141
- private readonly lane = new ZLinkStateLane();
142
133
  private readonly instances = new Map<Type, Promise<unknown>>();
143
134
  private readonly owned: unknown[] = [];
144
135
  private disposed = false;
145
136
 
146
137
  constructor(private readonly providerResolver?: ZLinkProviderResolver) {}
147
138
 
148
- async resolve<T>(type: Type<T>): Promise<T> {
149
- const resolution = await this.lane.run(() => this.resolveCore(type));
150
- if (resolution.activation !== undefined) {
151
- startOutsideStateLane(() => {
152
- void this.activate(type, resolution.activation!);
153
- });
154
- }
155
- return await resolution.promise;
156
- }
157
-
158
- async dispose(): Promise<void> {
159
- const disposal = await this.lane.run(() => this.beginDisposeCore());
160
- if (disposal === undefined) return;
161
-
162
- await Promise.allSettled(disposal.pending);
163
- for (const instance of disposal.owned) {
164
- await disposeOwnedInstance(instance);
165
- }
166
- await this.lane.run(() => this.completeDisposeCore());
167
- }
168
-
169
- private resolveCore<T>(type: Type<T>): HandlerResolution<T> {
139
+ resolve<T>(type: Type<T>): Promise<T> {
170
140
  if (this.disposed) {
171
- throw new Error('Handler instance scope is already disposed.');
141
+ return Promise.reject(new Error('Handler instance scope is already disposed.'));
172
142
  }
173
- let instance = this.instances.get(type) as Promise<T> | undefined;
174
- if (instance !== undefined) return { promise: instance };
175
-
143
+ const existing = this.instances.get(type) as Promise<T> | undefined;
144
+ if (existing !== undefined) return existing;
176
145
  const activation = createDeferred<unknown>();
177
- instance = activation.promise as Promise<T>;
178
146
  this.instances.set(type, activation.promise);
179
- return { promise: instance, activation };
147
+ void this.activate(type, activation);
148
+ return activation.promise as Promise<T>;
180
149
  }
181
150
 
182
- private beginDisposeCore(): HandlerScopeDisposal | undefined {
183
- if (this.disposed) return undefined;
151
+ async dispose(): Promise<void> {
152
+ if (this.disposed) return;
184
153
  this.disposed = true;
185
- return {
186
- pending: [...this.instances.values()],
187
- owned: [...this.owned].reverse()
188
- };
189
- }
190
-
191
- private completeDisposeCore(): void {
192
- this.owned.length = 0;
193
- this.instances.clear();
154
+ await Promise.allSettled(this.instances.values());
155
+ try {
156
+ await disposeOwnedInstances(this.owned);
157
+ } finally {
158
+ this.owned.length = 0;
159
+ this.instances.clear();
160
+ }
194
161
  }
195
-
196
162
  private async activate<T>(type: Type<T>, activation: Deferred<unknown>): Promise<void> {
197
163
  let instance: T;
198
164
  try {
199
- instance = (await this.providerResolver?.create?.(type)) ?? new type();
165
+ const created = this.providerResolver?.create?.(type);
166
+ instance = created === undefined ? new type() : await created;
200
167
  } catch (error) {
201
168
  activation.reject(error);
202
169
  return;
203
170
  }
204
171
 
205
- const accepted = await this.lane.run(() => this.acceptActivationCore(instance));
206
- if (accepted) {
172
+ if (!this.disposed) {
173
+ this.owned.push(instance);
207
174
  activation.resolve(instance);
208
175
  return;
209
176
  }
@@ -214,16 +181,9 @@ class DefaultHandlerInstanceScope implements ZLinkHandlerInstanceScope {
214
181
  activation.reject(error);
215
182
  }
216
183
  }
217
-
218
- private acceptActivationCore(instance: unknown): boolean {
219
- if (this.disposed) return false;
220
- this.owned.push(instance);
221
- return true;
222
- }
223
184
  }
224
185
 
225
186
  class LifecycleHandlerInstanceScope {
226
- private readonly lane = new ZLinkStateLane();
227
187
  private activeInvocations = 0;
228
188
  private closing = false;
229
189
  private idle?: Promise<void>;
@@ -232,12 +192,7 @@ class LifecycleHandlerInstanceScope {
232
192
 
233
193
  constructor(private readonly instances: ZLinkHandlerInstanceScope) {}
234
194
 
235
- async resolve<T>(type: Type<T>): Promise<T> {
236
- const resolution = await this.lane.run(() => ({ promise: this.resolveCore(type) }));
237
- return await resolution.promise;
238
- }
239
-
240
- private resolveCore<T>(type: Type<T>): Promise<T> {
195
+ resolve<T>(type: Type<T>): Promise<T> {
241
196
  this.throwIfClosingCore();
242
197
  return this.instances.resolve(type);
243
198
  }
@@ -246,29 +201,34 @@ class LifecycleHandlerInstanceScope {
246
201
  type: Type<THandler>,
247
202
  callback: (handler: THandler) => Promise<TResult>
248
203
  ): Promise<TResult> {
249
- await this.lane.run(() => this.beginInvocationCore());
204
+ this.beginInvocationCore();
250
205
  try {
251
206
  return await activeLifecycleScope.run(this, async () =>
252
207
  callback(await this.instances.resolve(type))
253
208
  );
254
209
  } finally {
255
- await this.lane.run(() => this.completeInvocationCore());
210
+ this.completeInvocationCore();
256
211
  }
257
212
  }
258
213
 
259
- async dispose(): Promise<void> {
214
+ async dispose(detachedTaskRunner: ZLinkDetachedTaskRunner): Promise<void> {
260
215
  const disposeFromActiveInvocation = activeLifecycleScope.getStore() === this;
261
- const disposal = await this.lane.run(() => this.beginDisposeCore());
216
+ const disposal = this.beginDisposeCore();
262
217
  if (disposal.deferred !== undefined) {
263
- startOutsideStateLane(() => {
218
+ startOutsideLifecycleInvocation(() => {
264
219
  void this.disposeWhenIdle(disposal);
220
+ if (disposeFromActiveInvocation) {
221
+ detachedTaskRunner.runDetached(
222
+ LifecycleHandlerInstanceScope.name,
223
+ () => disposal.completion
224
+ );
225
+ }
265
226
  });
266
227
  }
267
228
  if (disposeFromActiveInvocation) {
268
229
  // Waiting here would make the current handler wait for its own terminal
269
230
  // completion. The same disposal promise continues after run() releases
270
231
  // the final active invocation.
271
- void disposal.completion.catch(() => undefined);
272
232
  return;
273
233
  }
274
234
  await disposal.completion;
@@ -318,7 +278,7 @@ class LifecycleHandlerInstanceScope {
318
278
  await this.instances.dispose();
319
279
  deferred.resolve();
320
280
  } catch (error) {
321
- await this.lane.run(() => this.failDisposalCore(deferred.promise));
281
+ this.failDisposalCore(deferred.promise);
322
282
  deferred.reject(error);
323
283
  }
324
284
  }
@@ -340,8 +300,8 @@ function createDeferred<T>(): Deferred<T> {
340
300
  return { promise, resolve, reject };
341
301
  }
342
302
 
343
- function startOutsideStateLane<T>(work: () => T): T {
344
- return detachedStateLaneResource.runInAsyncScope(work);
303
+ function startOutsideLifecycleInvocation<T>(work: () => T): T {
304
+ return detachedLifecycleResource.runInAsyncScope(work);
345
305
  }
346
306
 
347
307
  export async function disposeOwnedInstance(instance: unknown): Promise<void> {
@@ -359,3 +319,16 @@ export async function disposeOwnedInstance(instance: unknown): Promise<void> {
359
319
  await value.onModuleDestroy();
360
320
  }
361
321
  }
322
+
323
+ export async function disposeOwnedInstances(instances: readonly unknown[]): Promise<void> {
324
+ const failures: unknown[] = [];
325
+ for (let index = instances.length - 1; index >= 0; index -= 1) {
326
+ try {
327
+ await disposeOwnedInstance(instances[index]);
328
+ } catch (error) {
329
+ failures.push(error);
330
+ }
331
+ }
332
+ if (failures.length === 1) throw failures[0];
333
+ if (failures.length > 1) throw new AggregateError(failures, 'Handler scope cleanup failed.');
334
+ }
@@ -20,10 +20,6 @@ import {
20
20
  type ZLinkRemoteActorPacketTarget,
21
21
  type ZLinkRemoteBoundSessionTarget
22
22
  } from '../actors';
23
- import {
24
- mergeRemoteBoundSessionTarget,
25
- preferredRemoteBoundSessionTarget
26
- } from '../actors/actor-runtime-state';
27
23
  import type { DefaultZLinkActorManager } from '../actors';
28
24
  import {
29
25
  decodeRemoteActorSessionBinding,
@@ -44,13 +40,14 @@ import { streamMetadataMap } from '../actors/bound-session-wire';
44
40
  import { decodeRoutingId, normalizeRoutingId, routingIdsEqual } from '../routing-id';
45
41
  import { ZLinkSubmitStatus } from '../messaging/submission-result';
46
42
  import type { DefaultZLinkSpotManager, ZLinkSpotNodeRuntimeManager } from '../spots';
47
- import type { ZLinkSpotRouteTarget } from '../spots/spot-routing-internal';
48
43
  import type { ZLinkDetachedTaskRunner } from '../spots/spot-actor-join-dispatch';
49
44
  import type { ZLinkBoundSessionResponseTarget } from '../streams';
50
45
  import type {
51
46
  ZLinkBoundSessionResponsePort,
47
+ ZLinkSessionBindingConfirmationOptions,
52
48
  ZLinkStreamActorLookupPort
53
49
  } from '../streams/stream-binding-runtime-ports';
50
+ import type { ServiceStreamSessionBinding } from '../foundation/service-runtime-contracts';
54
51
  import { actorSessionBindingRuntimeOwnerIfRegistered } from '../streams/actor-session-binding-runtime-owner';
55
52
  import {
56
53
  decodeStreamHeader,
@@ -65,10 +62,6 @@ import type { MeshRouterResolver } from './mesh-router-resolver';
65
62
  import { ZLinkRemoteActorPacketTargetStore } from './remote-actor-packet-target-store';
66
63
  import type { ZLinkStoreLocationResolvers } from '../locations';
67
64
 
68
- const REMOTE_SESSION_BIND_RETRY_DEADLINE_MS = 30_000;
69
- const REMOTE_SESSION_BIND_RETRY_INITIAL_DELAY_MS = 25;
70
- const REMOTE_SESSION_BIND_RETRY_MAX_DELAY_MS = 1_000;
71
-
72
65
  export interface ZLinkActorPacketRelayOptions {
73
66
  readonly requestTimeoutMs?: number;
74
67
  readonly routeTransport: ZLinkActorRoutedJoinTransport;
@@ -120,12 +113,7 @@ export class ZLinkActorPacketRelay {
120
113
  ): Promise<void> {
121
114
  const state = this.options.actorManager()?.getState(actor.actorId);
122
115
  const currentRemoteBoundSessionTarget =
123
- state?.spotId === undefined
124
- ? undefined
125
- : preferredRemoteBoundSessionTarget(
126
- state.remoteBoundSessionTarget,
127
- state.boundSessionTransferTarget
128
- );
116
+ state?.spotId === undefined ? undefined : state.remoteBoundSessionTarget;
129
117
  const currentRemoteActorPacketTarget =
130
118
  state?.spotId === undefined ? undefined : state.remoteActorPacketTarget;
131
119
  const remoteTarget =
@@ -162,11 +150,8 @@ export class ZLinkActorPacketRelay {
162
150
  await this.targets.updateFromWire(actorId, value);
163
151
  }
164
152
 
165
- actorPacketTargetForState(
166
- actorId: string,
167
- routerChannelIdHint?: string
168
- ): ZLinkRemoteActorPacketTarget | undefined {
169
- return this.targets.targetForState(actorId, routerChannelIdHint);
153
+ actorPacketTargetForState(actorId: string): ZLinkRemoteActorPacketTarget | undefined {
154
+ return this.targets.targetForState(actorId);
170
155
  }
171
156
 
172
157
  async notifyActorDisconnectedById(actorId: string, signal?: AbortSignal): Promise<void> {
@@ -174,10 +159,7 @@ export class ZLinkActorPacketRelay {
174
159
  const remoteTarget =
175
160
  state === undefined
176
161
  ? undefined
177
- : (preferredRemoteBoundSessionTarget(
178
- state.remoteBoundSessionTarget,
179
- state.boundSessionTransferTarget
180
- ) ?? state.remoteActorPacketTarget);
162
+ : (state.remoteBoundSessionTarget ?? state.remoteActorPacketTarget);
181
163
  if (remoteTarget !== undefined) {
182
164
  await this.notifyRemoteActorDisconnected(actorId, remoteTarget, signal);
183
165
  return;
@@ -288,66 +270,28 @@ export class ZLinkActorPacketRelay {
288
270
  if (frameHeader.kind !== ZLinkStreamMessageKind.Send) {
289
271
  throw new Error('Remote actor session binding requires a send frame.');
290
272
  }
291
- const { sessionNodeRid, sessionRid } = decodeRemoteActorSessionBinding(
292
- messageToBytes(body)
293
- );
273
+ const { sessionNodeRid } = decodeRemoteActorSessionBinding(messageToBytes(body));
294
274
  if (!routingIdsEqual(sessionNodeRid, _routeContext.sourceNodeRid)) {
295
275
  throw new Error(
296
276
  'Remote actor session binding source did not match the declared session node.'
297
277
  );
298
278
  }
279
+ // The Actor owner installs the binding from the Session owner's
280
+ // command 38 (Session–Actor binding §5); this relay confirmation only
281
+ // acknowledges that the Actor is still owned here.
299
282
  const state = this.options.actorManager()?.getState(relay.actorId);
300
- const actorRef = state?.nativeActorRef;
301
- if (state === undefined || actorRef === undefined) {
283
+ if (state?.nativeActorRef === undefined) {
302
284
  throw new Error(`Actor '${relay.actorId}' does not have a concrete actor ref.`);
303
285
  }
304
- if (this.requireSpotNodeRuntime().primaryMeshNode === undefined) {
305
- throw new Error('MeshNode actor runtime is not started.');
306
- }
307
- const target =
308
- relay.routerChannelId === undefined
309
- ? this.options.meshRouters.remoteBoundSessionTargetForSource(sessionNodeRid)
310
- : {
311
- routerChannelId: relay.routerChannelId,
312
- targetNodeRid: sessionNodeRid,
313
- spotId: sessionNodeRid
314
- };
315
- if (target === undefined) {
316
- throw new Error('Remote actor session binding did not declare a return router.');
317
- }
318
- const bindingGeneration = (
319
- fallbackActorRef as
320
- | (ActorRef & {
321
- readonly bindingGeneration?: bigint;
322
- })
323
- | undefined
324
- )?.bindingGeneration;
325
- const refreshedTarget = mergeRemoteBoundSessionTarget(
326
- {
327
- ...target,
328
- sessionNodeRid,
329
- sessionRid,
330
- ...(bindingGeneration === undefined ? {} : { bindingGeneration })
331
- },
332
- preferredRemoteBoundSessionTarget(
333
- state.remoteBoundSessionTarget,
334
- state.boundSessionTransferTarget
335
- )
336
- );
337
- state.setRemoteBoundSessionTarget(refreshedTarget);
338
286
  return { ok: true, response: { acknowledged: true } };
339
287
  }
340
288
  if (frameHeader.name === ZLINK_REMOTE_ACTOR_SESSION_DISCONNECTED_PACKET) {
341
289
  this.requireCurrentRemoteBinding(relay, _routeContext);
342
- this.options
343
- .actorManager()
344
- ?.getState(relay.actorId)
345
- ?.setRemoteBoundSessionTarget(undefined);
346
290
  await this.notifyLocalActorDisconnectedById(relay.actorId);
347
291
  return {
348
292
  ok: true,
349
293
  actorPacketTarget: encodeRemoteActorPacketTarget(
350
- this.actorPacketTargetForState(relay.actorId, relay.routerChannelId)
294
+ this.actorPacketTargetForState(relay.actorId)
351
295
  )
352
296
  };
353
297
  }
@@ -400,7 +344,7 @@ export class ZLinkActorPacketRelay {
400
344
  return {
401
345
  ok: true,
402
346
  actorPacketTarget: encodeRemoteActorPacketTarget(
403
- this.actorPacketTargetForState(relay.actorId, relay.routerChannelId)
347
+ this.actorPacketTargetForState(relay.actorId)
404
348
  )
405
349
  };
406
350
  }
@@ -472,7 +416,7 @@ export class ZLinkActorPacketRelay {
472
416
  ok: true,
473
417
  deferredResponse: true,
474
418
  actorPacketTarget: encodeRemoteActorPacketTarget(
475
- this.actorPacketTargetForState(relay.actorId, relay.routerChannelId)
419
+ this.actorPacketTargetForState(relay.actorId)
476
420
  )
477
421
  };
478
422
  }
@@ -497,7 +441,7 @@ export class ZLinkActorPacketRelay {
497
441
  ok: true,
498
442
  response,
499
443
  actorPacketTarget: encodeRemoteActorPacketTarget(
500
- this.actorPacketTargetForState(relay.actorId, relay.routerChannelId)
444
+ this.actorPacketTargetForState(relay.actorId)
501
445
  )
502
446
  };
503
447
  } catch (error) {
@@ -523,34 +467,10 @@ export class ZLinkActorPacketRelay {
523
467
  payload: Message,
524
468
  signal?: AbortSignal
525
469
  ): Promise<boolean> {
526
- // Spec 32:87 — a route/owner that is not currently usable is
527
- // Unavailable and retryable within the request deadline. Right after a
528
- // relocation the cached packet target can carry a transiently
529
- // incomplete Ready authority fence (route publication still
530
- // converging); failing the request on the fence check would surface a
531
- // NotFound for a Spot that exists and is Ready on its owner. Clear the
532
- // stale hint and re-resolve with a short bound instead.
533
- const fenceRetryDeadlineMs = performance.now() + 1_000;
534
- for (;;) {
535
- try {
536
- if (await this.relayRemoteActorPacket(actor, frameHeader, payload, signal)) {
537
- return true;
538
- }
539
- return await this.relayLocalActorPacket(actor, frameHeader, payload, signal);
540
- } catch (error) {
541
- if (
542
- !(
543
- error instanceof Error && error.message.includes('no complete Ready authority fence')
544
- ) ||
545
- performance.now() >= fenceRetryDeadlineMs
546
- ) {
547
- throw error;
548
- }
549
- this.targets.clear(actor.actorId);
550
- this.options.actorManager()?.getState(actor.actorId)?.setRemoteActorPacketTarget(undefined);
551
- await new Promise<void>((resolve) => setTimeout(resolve, 25));
552
- }
470
+ if (await this.relayRemoteActorPacket(actor, frameHeader, payload, signal)) {
471
+ return true;
553
472
  }
473
+ return this.relayLocalActorPacket(actor, frameHeader, payload, signal);
554
474
  }
555
475
 
556
476
  async confirmRemoteSessionBinding(
@@ -558,10 +478,13 @@ export class ZLinkActorPacketRelay {
558
478
  sessionNodeRid: RoutingId,
559
479
  sessionRid: RoutingId,
560
480
  signal?: AbortSignal,
561
- options?: { readonly waitForAcknowledgement?: boolean }
481
+ options?: ZLinkSessionBindingConfirmationOptions
562
482
  ): Promise<void> {
563
483
  const target = this.targets.targetForActorRef(actor);
564
- if (target === undefined) return;
484
+ if (target === undefined) {
485
+ this.installSameNodeSessionBinding(actor.actorId, options?.binding);
486
+ return;
487
+ }
565
488
  const header = encodeStreamHeader({
566
489
  kind: ZLinkStreamMessageKind.Send,
567
490
  codec: ZLinkStreamCodec.Json,
@@ -579,12 +502,9 @@ export class ZLinkActorPacketRelay {
579
502
  payload: encodeRemoteActorSessionBinding({ sessionNodeRid, sessionRid })
580
503
  });
581
504
  if (options?.waitForAcknowledgement === false) {
582
- await this.retryRemoteSessionBindingSend(
583
- withDefaultSpotKind(target),
584
- request,
585
- performance.now() + REMOTE_SESSION_BIND_RETRY_DEADLINE_MS,
586
- REMOTE_SESSION_BIND_RETRY_INITIAL_DELAY_MS
587
- );
505
+ await this.options.routeTransport.sendToSpot(withDefaultSpotKind(target), request, {
506
+ packetName: ZLINK_REMOTE_ACTOR_PACKET_RELAY_PACKET
507
+ });
588
508
  return;
589
509
  }
590
510
  const reply = await this.requestRemoteTarget<{
@@ -624,42 +544,38 @@ export class ZLinkActorPacketRelay {
624
544
  }
625
545
  }
626
546
 
627
- private async retryRemoteSessionBindingSend(
628
- target: ZLinkSpotRouteTarget,
629
- request: unknown,
630
- deadline: number,
631
- delayMs: number
632
- ): Promise<void> {
633
- try {
634
- await this.options.routeTransport.sendToSpot(target, request, {
635
- packetName: ZLINK_REMOTE_ACTOR_PACKET_RELAY_PACKET
636
- });
637
- } catch (error) {
638
- if (performance.now() >= deadline) {
639
- // Spec 32-framework-error-model: DeadlineExceeded(7). Retry
640
- // exhaustion on the one-way bind send remains diagnostics-only but
641
- // the caller waits for its bounded submission terminal so later
642
- // application relay cannot overtake it.
643
- this.options
644
- .errorSink()
645
- .reportRuntimeTaskException(
646
- 'remote session binding send',
647
- createInternalFrameworkException(
648
- ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
649
- 'Remote actor session binding send retries exceeded their deadline.',
650
- error
651
- )
652
- );
653
- return;
654
- }
655
- await new Promise<void>((resolve) => setTimeout(resolve, delayMs));
656
- await this.retryRemoteSessionBindingSend(
657
- target,
658
- request,
659
- deadline,
660
- Math.min(delayMs * 2, REMOTE_SESSION_BIND_RETRY_MAX_DELAY_MS)
547
+ /**
548
+ * Session–Actor binding §5·§6 (.NET ZLinkSessionActorCoordinator rule): a
549
+ * same-node bind installs the Session owner's registry identity through the
550
+ * same install a remote command 38 uses, so relocation seals and carries it.
551
+ */
552
+ private installSameNodeSessionBinding(
553
+ actorId: string,
554
+ binding: ServiceStreamSessionBinding | undefined
555
+ ): void {
556
+ // The Actor is gone (destroyed or relocated away): nothing to record.
557
+ const state = this.options.actorManager()?.getState(actorId);
558
+ // No registry binding exists only for a native-fallback bind, which has no
559
+ // Session owner registry (managed-stream.ts `bindActor` fallback).
560
+ if (state === undefined || binding === undefined) return;
561
+ const route = this.options.meshRouters.remoteBoundSessionTargetForSource(
562
+ binding.sessionOwnerNodeRid
563
+ );
564
+ if (route === undefined) {
565
+ throw createInternalFrameworkException(
566
+ ZLinkFrameworkInternalErrorKind.ActorLocationStale,
567
+ `Actor '${actorId}' Session route is unavailable.`
661
568
  );
662
569
  }
570
+ state.installBoundSessionBinding({
571
+ ...route,
572
+ sessionNodeRid: binding.sessionOwnerNodeRid,
573
+ sessionRid: binding.sessionRid,
574
+ sessionOwnerNodeGeneration: binding.sessionOwnerNodeGeneration,
575
+ sessionOwnerId: binding.sessionOwnerId,
576
+ sessionOwnerLeaseGeneration: binding.sessionOwnerLeaseGeneration,
577
+ bindingGeneration: binding.bindingGeneration
578
+ });
663
579
  }
664
580
 
665
581
  async relayRemoteActorPacket(
@@ -894,13 +810,7 @@ export class ZLinkActorPacketRelay {
894
810
  routeContext: ZLinkRouteMessageContext
895
811
  ): void {
896
812
  const state = this.options.actorManager()?.getState(relay.actorId);
897
- const current =
898
- state === undefined
899
- ? undefined
900
- : preferredRemoteBoundSessionTarget(
901
- state.remoteBoundSessionTarget,
902
- state.boundSessionTransferTarget
903
- );
813
+ const current = state?.boundSession;
904
814
  if (
905
815
  current === undefined ||
906
816
  current.sessionNodeRid === undefined ||
@@ -19,6 +19,7 @@ import type {
19
19
  } from '../locations/internal-store-contracts';
20
20
  import { encodeAuthorityKey } from '../locations/authority-key-codec';
21
21
  import { randomOperationId } from '../locations/creation-operation-id';
22
+ import { diagnosticTextOrAbsent } from '../diagnostics/diagnostic-text';
22
23
  import type {
23
24
  ServiceActorCreateRecord,
24
25
  ServiceUserSpotReservationFence
@@ -84,9 +85,10 @@ export class ZLinkActorPlacementCoordinator {
84
85
  timeoutMs: number,
85
86
  signal?: AbortSignal
86
87
  ): Promise<ZLinkActorCreateResult> {
87
- const deadline = createDeadline(timeoutMs, signal);
88
- const deadlineMs = performance.now() + timeoutMs;
89
88
  const deadlineUnixMs = Date.now() + timeoutMs;
89
+ const remainingMs = Math.max(0, deadlineUnixMs - Date.now());
90
+ const deadline = createDeadline(remainingMs, signal);
91
+ const deadlineMs = performance.now() + remainingMs;
90
92
  const contentReference = encodeLocationCreationContent(requestPayload);
91
93
  const requestSha256 = createHash('sha256').update(requestPayload).digest();
92
94
  const excluded = new Set<string>();
@@ -130,7 +132,8 @@ export class ZLinkActorPlacementCoordinator {
130
132
  creatingPayload,
131
133
  capacity: { actors: 1, spots: 0 }
132
134
  },
133
- deadline.signal
135
+ deadline.signal,
136
+ BigInt(deadlineUnixMs)
134
137
  );
135
138
  const existing = existingActor(reserved, actorId, stableType);
136
139
  if (existing !== undefined) {
@@ -204,7 +207,7 @@ export class ZLinkActorPlacementCoordinator {
204
207
  remote.terminalResult,
205
208
  remote.failureCode,
206
209
  `Remote Actor '${actorId}' creation failed with result ${remote.terminalResult}, ` +
207
- `failure code ${remote.failureCode}, and tail ${remote.tail?.kind ?? 'none'}.`
210
+ `failure code ${remote.failureCode}, and tail ${diagnosticTextOrAbsent(remote.tail?.kind)}.`
208
211
  );
209
212
  }
210
213
  if (remote.tail?.kind !== 'actorCreate') {
@@ -213,7 +216,7 @@ export class ZLinkActorPlacementCoordinator {
213
216
  throw createInternalFrameworkException(
214
217
  ZLinkFrameworkInternalErrorKind.RequestProtocolError,
215
218
  `Remote Actor '${actorId}' create reply carried tail ` +
216
- `${remote.tail?.kind ?? 'none'} on an OK terminal.`
219
+ `${diagnosticTextOrAbsent(remote.tail?.kind)} on an OK terminal.`
217
220
  );
218
221
  }
219
222
  if (remote.tail.createResult === 'rejected') {