@zlink-systems/framework 0.30.3 → 0.32.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 (398) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Actors/ZLinkActor.d.ts +2 -0
  3. package/dist/contracts/Actors/ZLinkSessionBindingIdentity.d.ts +6 -0
  4. package/dist/contracts/Actors/ZLinkSessionBindingIdentity.js +2 -0
  5. package/dist/contracts/Actors/index.d.ts +1 -0
  6. package/dist/contracts/Actors/index.js +1 -0
  7. package/dist/contracts/Common/CoreTypes.d.ts +1 -0
  8. package/dist/contracts/Common/HandlerMessageType.d.ts +8 -0
  9. package/dist/contracts/Common/HandlerMessageType.js +41 -0
  10. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +1 -1
  11. package/dist/contracts/Common/ZLinkEncodedPayload.js +12 -20
  12. package/dist/contracts/Common/ZLinkMessage.js +11 -7
  13. package/dist/contracts/Common/encoded-payload-storage.d.ts +0 -2
  14. package/dist/contracts/Common/encoded-payload-storage.js +4 -16
  15. package/dist/contracts/Common/index.d.ts +1 -1
  16. package/dist/contracts/Common/payload-slab.d.ts +4 -0
  17. package/dist/contracts/Common/payload-slab.js +30 -0
  18. package/dist/contracts/Configuration/RegistrationBuilders.js +15 -9
  19. package/dist/contracts/Configuration/RegistrationTypes.d.ts +19 -0
  20. package/dist/contracts/Handlers/Contexts.d.ts +1 -0
  21. package/dist/contracts/Locations/Authority.d.ts +2 -0
  22. package/dist/internal.d.ts +9 -0
  23. package/dist/internal.js +23 -1
  24. package/dist/nest-integration.d.ts +1 -0
  25. package/dist/nest-integration.js +3 -1
  26. package/dist/runtime/actors/actor-client.d.ts +6 -2
  27. package/dist/runtime/actors/actor-client.js +120 -82
  28. package/dist/runtime/actors/actor-context.js +16 -5
  29. package/dist/runtime/actors/actor-execution-context.js +2 -2
  30. package/dist/runtime/actors/actor-handoff.d.ts +12 -1
  31. package/dist/runtime/actors/actor-handoff.js +79 -34
  32. package/dist/runtime/actors/actor-join-deferred-scope.js +6 -6
  33. package/dist/runtime/actors/actor-local-native-join.d.ts +2 -2
  34. package/dist/runtime/actors/actor-local-native-join.js +19 -17
  35. package/dist/runtime/actors/actor-mailbox.d.ts +1 -1
  36. package/dist/runtime/actors/actor-remote-joiner.d.ts +2 -2
  37. package/dist/runtime/actors/actor-remote-joiner.js +4 -4
  38. package/dist/runtime/actors/actor-routed-join-transport.d.ts +9 -3
  39. package/dist/runtime/actors/actor-routed-json-request.d.ts +3 -0
  40. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -2
  41. package/dist/runtime/actors/actor-runtime-state.d.ts +1 -1
  42. package/dist/runtime/actors/spot-actor-dispatch.d.ts +9 -5
  43. package/dist/runtime/actors/spot-actor-dispatch.js +60 -38
  44. package/dist/runtime/admission.d.ts +6 -4
  45. package/dist/runtime/admission.js +21 -10
  46. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +1 -0
  47. package/dist/runtime/application-jobs/application-ingress-record-owner.js +3 -0
  48. package/dist/runtime/backend/contracts/index.d.ts +26 -10
  49. package/dist/runtime/backend/mesh-completion-table.d.ts +7 -1
  50. package/dist/runtime/backend/mesh-completion-table.js +84 -20
  51. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +19 -6
  52. package/dist/runtime/backend/mesh-dispatch-pump.js +246 -147
  53. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +3 -2
  54. package/dist/runtime/backend/node/node-backend-adapter-support.js +27 -19
  55. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +5 -2
  56. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +70 -13
  57. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
  58. package/dist/runtime/backend/node/node-event-loop-poller.js +4 -3
  59. package/dist/runtime/backend/node/node-mesh-backend-adapter.js +5 -1
  60. package/dist/runtime/backend/node/node-raw-binding-port.d.ts +7 -2
  61. package/dist/runtime/backend/node/node-raw-binding-port.js +99 -63
  62. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +34 -16
  63. package/dist/runtime/backend/node/node-raw-mesh-backend.js +210 -106
  64. package/dist/runtime/backend/node/node-socket-backend-adapter.js +20 -6
  65. package/dist/runtime/backend/raw-binding-port.d.ts +6 -3
  66. package/dist/runtime/channels/channel-clients.js +3 -3
  67. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +11 -7
  68. package/dist/runtime/channels/channel-dispatch-pipeline.js +40 -22
  69. package/dist/runtime/channels/channel-dispatch-services.d.ts +3 -1
  70. package/dist/runtime/channels/channel-dispatch-services.js +7 -6
  71. package/dist/runtime/channels/channel-dispatchers.d.ts +13 -6
  72. package/dist/runtime/channels/channel-dispatchers.js +57 -36
  73. package/dist/runtime/channels/channel-envelope.d.ts +2 -2
  74. package/dist/runtime/channels/channel-envelope.js +609 -83
  75. package/dist/runtime/channels/channel-multipart.d.ts +1 -0
  76. package/dist/runtime/channels/channel-multipart.js +10 -6
  77. package/dist/runtime/channels/channel-outbound-operations.d.ts +6 -9
  78. package/dist/runtime/channels/channel-outbound-operations.js +107 -105
  79. package/dist/runtime/channels/channel-receive-loops.d.ts +9 -7
  80. package/dist/runtime/channels/channel-receive-loops.js +126 -90
  81. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +23 -6
  82. package/dist/runtime/channels/channel-runtime-lifecycle.js +47 -38
  83. package/dist/runtime/channels/channel-runtime-manager.d.ts +13 -6
  84. package/dist/runtime/channels/channel-runtime-manager.js +32 -14
  85. package/dist/runtime/channels/channel-socket-registry.d.ts +28 -4
  86. package/dist/runtime/channels/channel-socket-registry.js +9 -1
  87. package/dist/runtime/channels/channel-transports.d.ts +23 -16
  88. package/dist/runtime/channels/channel-transports.js +139 -119
  89. package/dist/runtime/channels/dispatch-error-reporter.d.ts +4 -4
  90. package/dist/runtime/channels/dispatch-error-reporter.js +5 -5
  91. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  92. package/dist/runtime/channels/local-spot-route-transport.d.ts +5 -2
  93. package/dist/runtime/channels/local-spot-route-transport.js +15 -18
  94. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +6 -3
  95. package/dist/runtime/channels/router-socket-spot-route-transport.js +33 -19
  96. package/dist/runtime/channels/source-spot-router.d.ts +6 -3
  97. package/dist/runtime/channels/source-spot-router.js +34 -23
  98. package/dist/runtime/channels/spot-node-route-transport.d.ts +6 -3
  99. package/dist/runtime/channels/spot-node-route-transport.js +23 -17
  100. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +6 -3
  101. package/dist/runtime/channels/spot-route-bridge-transport.js +38 -24
  102. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +8 -4
  103. package/dist/runtime/channels/spot-route-dispatch-strategy.js +36 -23
  104. package/dist/runtime/diagnostics/dispatch-error-details.js +9 -3
  105. package/dist/runtime/diagnostics/message-flow-bootstrap.d.ts +1 -0
  106. package/dist/runtime/diagnostics/message-flow-bootstrap.js +8 -0
  107. package/dist/runtime/diagnostics/message-flow-delivery.d.ts +47 -0
  108. package/dist/runtime/diagnostics/message-flow-delivery.js +149 -0
  109. package/dist/runtime/diagnostics/message-flow-record.d.ts +50 -0
  110. package/dist/runtime/diagnostics/message-flow-record.js +228 -0
  111. package/dist/runtime/diagnostics/message-flow-worker.d.ts +1 -0
  112. package/dist/runtime/diagnostics/message-flow-worker.js +118 -0
  113. package/dist/runtime/diagnostics/message-flow.d.ts +7 -19
  114. package/dist/runtime/diagnostics/message-flow.js +42 -290
  115. package/dist/runtime/diagnostics/runtime-metrics.d.ts +4 -3
  116. package/dist/runtime/diagnostics/runtime-metrics.js +8 -4
  117. package/dist/runtime/execution/index.d.ts +1 -0
  118. package/dist/runtime/execution/index.js +6 -3
  119. package/dist/runtime/execution/serial-execution-queue.d.ts +26 -13
  120. package/dist/runtime/execution/serial-execution-queue.js +75 -71
  121. package/dist/runtime/foundation/durable-service-request.d.ts +12 -3
  122. package/dist/runtime/foundation/durable-service-request.js +158 -73
  123. package/dist/runtime/foundation/operation-registry.d.ts +33 -3
  124. package/dist/runtime/foundation/operation-registry.js +272 -33
  125. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +62 -23
  126. package/dist/runtime/foundation/raw-service-mesh-runtime.js +373 -194
  127. package/dist/runtime/foundation/request-runtime.d.ts +17 -0
  128. package/dist/runtime/foundation/request-runtime.js +163 -0
  129. package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
  130. package/dist/runtime/foundation/service-discovery-registry.js +6 -0
  131. package/dist/runtime/foundation/service-liveness-registry.d.ts +1 -1
  132. package/dist/runtime/foundation/service-mailbox.d.ts +4 -2
  133. package/dist/runtime/foundation/service-mailbox.js +4 -1
  134. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -2
  135. package/dist/runtime/foundation/service-relocation-object-owner.js +12 -5
  136. package/dist/runtime/foundation/service-runtime-contracts.d.ts +7 -2
  137. package/dist/runtime/foundation/service-stateful-registry.d.ts +6 -2
  138. package/dist/runtime/foundation/service-stateful-registry.js +38 -17
  139. package/dist/runtime/foundation/service-stateful-runtime.d.ts +91 -26
  140. package/dist/runtime/foundation/service-stateful-runtime.js +245 -120
  141. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -0
  142. package/dist/runtime/foundation/service-stateful-wire-codec.js +15 -0
  143. package/dist/runtime/foundation/service-topology-registry.d.ts +2 -0
  144. package/dist/runtime/foundation/service-topology-registry.js +13 -3
  145. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  146. package/dist/runtime/foundation/service-wire-constants.generated.js +12 -0
  147. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +5 -1
  148. package/dist/runtime/foundation/service-wire-m6a-codec.js +50 -15
  149. package/dist/runtime/host/actor-packet-relay.d.ts +5 -6
  150. package/dist/runtime/host/actor-packet-relay.js +58 -57
  151. package/dist/runtime/host/actor-placement-coordinator.d.ts +1 -1
  152. package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
  153. package/dist/runtime/host/actor-runtime-options-factory.js +3 -2
  154. package/dist/runtime/host/actor-transfer-runtime.d.ts +3 -3
  155. package/dist/runtime/host/application-job-queue.d.ts +7 -5
  156. package/dist/runtime/host/application-job-queue.js +33 -21
  157. package/dist/runtime/host/bound-session-relay.js +0 -1
  158. package/dist/runtime/host/channel-runtime-options-factory.d.ts +2 -0
  159. package/dist/runtime/host/channel-runtime-options-factory.js +1 -0
  160. package/dist/runtime/host/entry-actor-runtime.d.ts +5 -2
  161. package/dist/runtime/host/entry-actor-runtime.js +2 -2
  162. package/dist/runtime/host/index.d.ts +106 -37
  163. package/dist/runtime/host/index.js +303 -151
  164. package/dist/runtime/host/location-runtime-owner.d.ts +2 -2
  165. package/dist/runtime/host/location-runtime-owner.js +1 -1
  166. package/dist/runtime/host/service-relocation-host-runtime.d.ts +195 -45
  167. package/dist/runtime/host/service-relocation-host-runtime.js +257 -144
  168. package/dist/runtime/host/spot-address-transport.d.ts +3 -0
  169. package/dist/runtime/host/spot-address-transport.js +73 -76
  170. package/dist/runtime/host/spot-runtime-options-factory.js +2 -0
  171. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -1
  172. package/dist/runtime/host/user-spot-creation-coordinator.js +49 -21
  173. package/dist/runtime/internal-observation.d.ts +1 -0
  174. package/dist/runtime/internal-observation.js +5 -0
  175. package/dist/runtime/locations/actor-location-claims.d.ts +1 -1
  176. package/dist/runtime/locations/actor-location-claims.js +15 -6
  177. package/dist/runtime/locations/auto-connect-loop.d.ts +0 -1
  178. package/dist/runtime/locations/auto-connect-loop.js +25 -19
  179. package/dist/runtime/locations/auto-connect-planner.js +2 -5
  180. package/dist/runtime/locations/auto-connect-reconciler.d.ts +1 -0
  181. package/dist/runtime/locations/auto-connect-reconciler.js +35 -23
  182. package/dist/runtime/locations/in-memory-authority-store.d.ts +1 -0
  183. package/dist/runtime/locations/in-memory-authority-store.js +15 -5
  184. package/dist/runtime/locations/in-memory-location-store.d.ts +0 -2
  185. package/dist/runtime/locations/in-memory-location-store.js +1 -38
  186. package/dist/runtime/locations/lifecycle.d.ts +1 -1
  187. package/dist/runtime/locations/lifecycle.js +2 -2
  188. package/dist/runtime/locations/location-store-repository.d.ts +0 -1
  189. package/dist/runtime/locations/location-store-repository.js +163 -246
  190. package/dist/runtime/locations/resolvers.d.ts +8 -1
  191. package/dist/runtime/locations/resolvers.js +16 -2
  192. package/dist/runtime/locations/runtime.d.ts +3 -3
  193. package/dist/runtime/locations/runtime.js +12 -16
  194. package/dist/runtime/messaging/creation-payload-codec.js +8 -7
  195. package/dist/runtime/messaging/framework-json-v1.d.ts +1 -1
  196. package/dist/runtime/messaging/framework-json-v1.js +6 -2
  197. package/dist/runtime/messaging/payload-codec.js +21 -35
  198. package/dist/runtime/messaging/request-deadline.d.ts +4 -2
  199. package/dist/runtime/messaging/request-deadline.js +40 -25
  200. package/dist/runtime/messaging/request-result.d.ts +14 -1
  201. package/dist/runtime/messaging/request-result.js +74 -13
  202. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +4 -0
  203. package/dist/runtime/protocol/service_wire_codec.generated.js +17 -7
  204. package/dist/runtime/spots/index.d.ts +28 -7
  205. package/dist/runtime/spots/index.js +31 -6
  206. package/dist/runtime/spots/spot-activation-registry.d.ts +3 -2
  207. package/dist/runtime/spots/spot-activation-registry.js +13 -8
  208. package/dist/runtime/spots/spot-activation-state.d.ts +2 -0
  209. package/dist/runtime/spots/spot-activation-state.js +1 -0
  210. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +9 -4
  211. package/dist/runtime/spots/spot-actor-admission-coordinator.js +33 -12
  212. package/dist/runtime/spots/spot-actor-ingress-admission.d.ts +40 -0
  213. package/dist/runtime/spots/spot-actor-ingress-admission.js +78 -0
  214. package/dist/runtime/spots/spot-actor-membership.js +3 -3
  215. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +16 -43
  216. package/dist/runtime/spots/spot-actor-packet-dispatch.js +56 -113
  217. package/dist/runtime/spots/spot-actor-packet-drain.d.ts +1 -0
  218. package/dist/runtime/spots/spot-actor-packet-drain.js +12 -5
  219. package/dist/runtime/spots/spot-entry-activation.d.ts +4 -3
  220. package/dist/runtime/spots/spot-entry-activation.js +7 -12
  221. package/dist/runtime/spots/spot-handler-registry.d.ts +5 -1
  222. package/dist/runtime/spots/spot-handler-registry.js +31 -15
  223. package/dist/runtime/spots/spot-manager-public.js +3 -2
  224. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +11 -6
  225. package/dist/runtime/spots/spot-node-runtime-manager.js +6 -1
  226. package/dist/runtime/spots/spot-outbound.d.ts +8 -2
  227. package/dist/runtime/spots/spot-outbound.js +5 -5
  228. package/dist/runtime/spots/spot-route-packet-dispatch.js +13 -8
  229. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +3 -3
  230. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +9 -5
  231. package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -2
  232. package/dist/runtime/spots/spot-serial-executor.d.ts +2 -1
  233. package/dist/runtime/spots/spot-serial-turn-executor.js +20 -26
  234. package/dist/runtime/spots/spot-subscription-dispatch.js +5 -2
  235. package/dist/runtime/spots/spot-timer.d.ts +1 -1
  236. package/dist/runtime/streams/actor-session-binding-registry.d.ts +11 -3
  237. package/dist/runtime/streams/actor-session-binding-registry.js +28 -0
  238. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -2
  239. package/dist/runtime/streams/bound-actor-relay-sender.js +3 -4
  240. package/dist/runtime/streams/bound-session-service.js +6 -7
  241. package/dist/runtime/streams/index.d.ts +3 -3
  242. package/dist/runtime/streams/index.js +22 -2
  243. package/dist/runtime/streams/managed-stream.js +2 -1
  244. package/dist/runtime/streams/session-calls.d.ts +1 -1
  245. package/dist/runtime/streams/session-calls.js +3 -9
  246. package/dist/runtime/streams/session-context.d.ts +2 -2
  247. package/dist/runtime/streams/session-context.js +2 -2
  248. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -0
  249. package/dist/runtime/streams/stream-session-runtime.js +64 -33
  250. package/package.json +3 -3
  251. package/src/contracts/Actors/ZLinkActor.ts +6 -0
  252. package/src/contracts/Actors/ZLinkSessionBindingIdentity.ts +7 -0
  253. package/src/contracts/Actors/index.ts +1 -0
  254. package/src/contracts/Common/CoreTypes.ts +1 -0
  255. package/src/contracts/Common/HandlerMessageType.ts +50 -0
  256. package/src/contracts/Common/ZLinkEncodedPayload.ts +13 -25
  257. package/src/contracts/Common/ZLinkMessage.ts +11 -7
  258. package/src/contracts/Common/encoded-payload-storage.ts +4 -16
  259. package/src/contracts/Common/index.ts +1 -1
  260. package/src/contracts/Common/payload-slab.ts +29 -0
  261. package/src/contracts/Configuration/RegistrationBuilders.ts +29 -15
  262. package/src/contracts/Configuration/RegistrationTypes.ts +19 -0
  263. package/src/contracts/Handlers/Contexts.ts +1 -0
  264. package/src/contracts/Locations/Authority.ts +7 -1
  265. package/src/internal.ts +17 -0
  266. package/src/nest-integration.ts +1 -0
  267. package/src/runtime/actors/actor-client.ts +257 -163
  268. package/src/runtime/actors/actor-context.ts +26 -14
  269. package/src/runtime/actors/actor-execution-context.ts +2 -2
  270. package/src/runtime/actors/actor-handoff.ts +86 -51
  271. package/src/runtime/actors/actor-join-deferred-scope.ts +6 -6
  272. package/src/runtime/actors/actor-local-native-join.ts +38 -17
  273. package/src/runtime/actors/actor-mailbox.ts +1 -1
  274. package/src/runtime/actors/actor-remote-joiner.ts +8 -4
  275. package/src/runtime/actors/actor-routed-join-transport.ts +13 -5
  276. package/src/runtime/actors/actor-routed-json-request.ts +3 -0
  277. package/src/runtime/actors/actor-runtime-contracts.ts +4 -2
  278. package/src/runtime/actors/actor-runtime-state.ts +1 -1
  279. package/src/runtime/actors/spot-actor-dispatch.ts +70 -68
  280. package/src/runtime/admission.ts +42 -15
  281. package/src/runtime/application-jobs/application-ingress-record-owner.ts +4 -0
  282. package/src/runtime/backend/contracts/index.ts +77 -10
  283. package/src/runtime/backend/mesh-completion-table.ts +106 -15
  284. package/src/runtime/backend/mesh-dispatch-pump.ts +294 -146
  285. package/src/runtime/backend/node/node-backend-adapter-support.ts +42 -32
  286. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +91 -34
  287. package/src/runtime/backend/node/node-event-loop-poller.ts +14 -5
  288. package/src/runtime/backend/node/node-mesh-backend-adapter.ts +5 -1
  289. package/src/runtime/backend/node/node-raw-binding-port.ts +180 -69
  290. package/src/runtime/backend/node/node-raw-mesh-backend.ts +386 -157
  291. package/src/runtime/backend/node/node-socket-backend-adapter.ts +56 -11
  292. package/src/runtime/backend/raw-binding-port.ts +13 -5
  293. package/src/runtime/channels/channel-clients.ts +26 -11
  294. package/src/runtime/channels/channel-dispatch-pipeline.ts +77 -65
  295. package/src/runtime/channels/channel-dispatch-services.ts +7 -12
  296. package/src/runtime/channels/channel-dispatchers.ts +93 -39
  297. package/src/runtime/channels/channel-envelope.ts +680 -144
  298. package/src/runtime/channels/channel-multipart.ts +17 -13
  299. package/src/runtime/channels/channel-outbound-operations.ts +204 -178
  300. package/src/runtime/channels/channel-receive-loops.ts +160 -107
  301. package/src/runtime/channels/channel-runtime-lifecycle.ts +64 -59
  302. package/src/runtime/channels/channel-runtime-manager.ts +74 -27
  303. package/src/runtime/channels/channel-socket-registry.ts +20 -5
  304. package/src/runtime/channels/channel-transports.ts +414 -287
  305. package/src/runtime/channels/dispatch-error-reporter.ts +4 -9
  306. package/src/runtime/channels/local-spot-route-transport.ts +27 -29
  307. package/src/runtime/channels/router-socket-spot-route-transport.ts +63 -32
  308. package/src/runtime/channels/source-spot-router.ts +75 -38
  309. package/src/runtime/channels/spot-node-route-transport.ts +67 -37
  310. package/src/runtime/channels/spot-route-bridge-transport.ts +62 -30
  311. package/src/runtime/channels/spot-route-dispatch-strategy.ts +105 -34
  312. package/src/runtime/diagnostics/dispatch-error-details.ts +10 -2
  313. package/src/runtime/diagnostics/message-flow-bootstrap.ts +6 -0
  314. package/src/runtime/diagnostics/message-flow-delivery.ts +171 -0
  315. package/src/runtime/diagnostics/message-flow-record.ts +295 -0
  316. package/src/runtime/diagnostics/message-flow-worker.ts +146 -0
  317. package/src/runtime/diagnostics/message-flow.ts +49 -362
  318. package/src/runtime/diagnostics/runtime-metrics.ts +10 -4
  319. package/src/runtime/execution/index.ts +6 -0
  320. package/src/runtime/execution/serial-execution-queue.ts +94 -96
  321. package/src/runtime/foundation/durable-service-request.ts +212 -89
  322. package/src/runtime/foundation/operation-registry.ts +287 -38
  323. package/src/runtime/foundation/raw-service-mesh-runtime.ts +617 -292
  324. package/src/runtime/foundation/request-runtime.ts +227 -0
  325. package/src/runtime/foundation/service-discovery-registry.ts +7 -0
  326. package/src/runtime/foundation/service-liveness-registry.ts +1 -1
  327. package/src/runtime/foundation/service-mailbox.ts +7 -2
  328. package/src/runtime/foundation/service-relocation-object-owner.ts +21 -6
  329. package/src/runtime/foundation/service-runtime-contracts.ts +12 -2
  330. package/src/runtime/foundation/service-stateful-registry.ts +52 -19
  331. package/src/runtime/foundation/service-stateful-runtime.ts +365 -198
  332. package/src/runtime/foundation/service-stateful-wire-codec.ts +18 -0
  333. package/src/runtime/foundation/service-topology-registry.ts +21 -3
  334. package/src/runtime/foundation/service-wire-constants.generated.ts +10 -0
  335. package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -17
  336. package/src/runtime/host/actor-packet-relay.ts +160 -156
  337. package/src/runtime/host/actor-placement-coordinator.ts +1 -1
  338. package/src/runtime/host/actor-runtime-options-factory.ts +7 -2
  339. package/src/runtime/host/actor-transfer-runtime.ts +3 -3
  340. package/src/runtime/host/application-job-queue.ts +56 -27
  341. package/src/runtime/host/bound-session-relay.ts +0 -1
  342. package/src/runtime/host/channel-runtime-options-factory.ts +3 -0
  343. package/src/runtime/host/entry-actor-runtime.ts +14 -6
  344. package/src/runtime/host/index.ts +388 -113
  345. package/src/runtime/host/location-runtime-owner.ts +3 -3
  346. package/src/runtime/host/service-relocation-host-runtime.ts +380 -252
  347. package/src/runtime/host/spot-address-transport.ts +110 -95
  348. package/src/runtime/host/spot-runtime-options-factory.ts +3 -0
  349. package/src/runtime/host/user-spot-creation-coordinator.ts +69 -22
  350. package/src/runtime/internal-observation.ts +2 -0
  351. package/src/runtime/locations/actor-location-claims.ts +42 -16
  352. package/src/runtime/locations/auto-connect-loop.ts +24 -16
  353. package/src/runtime/locations/auto-connect-planner.ts +2 -5
  354. package/src/runtime/locations/auto-connect-reconciler.ts +37 -24
  355. package/src/runtime/locations/in-memory-authority-store.ts +27 -7
  356. package/src/runtime/locations/in-memory-location-store.ts +1 -74
  357. package/src/runtime/locations/lifecycle.ts +4 -2
  358. package/src/runtime/locations/location-store-repository.ts +228 -308
  359. package/src/runtime/locations/resolvers.ts +20 -8
  360. package/src/runtime/locations/runtime.ts +16 -28
  361. package/src/runtime/messaging/creation-payload-codec.ts +12 -10
  362. package/src/runtime/messaging/framework-json-v1.ts +10 -1
  363. package/src/runtime/messaging/payload-codec.ts +50 -75
  364. package/src/runtime/messaging/request-deadline.ts +47 -39
  365. package/src/runtime/messaging/request-result.ts +88 -17
  366. package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
  367. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
  368. package/src/runtime/spots/index.ts +57 -10
  369. package/src/runtime/spots/spot-activation-registry.ts +12 -8
  370. package/src/runtime/spots/spot-activation-state.ts +2 -0
  371. package/src/runtime/spots/spot-actor-admission-coordinator.ts +62 -37
  372. package/src/runtime/spots/spot-actor-ingress-admission.ts +157 -0
  373. package/src/runtime/spots/spot-actor-membership.ts +8 -5
  374. package/src/runtime/spots/spot-actor-packet-dispatch.ts +122 -206
  375. package/src/runtime/spots/spot-actor-packet-drain.ts +21 -6
  376. package/src/runtime/spots/spot-entry-activation.ts +25 -35
  377. package/src/runtime/spots/spot-handler-registry.ts +72 -15
  378. package/src/runtime/spots/spot-manager-public.ts +4 -2
  379. package/src/runtime/spots/spot-node-runtime-manager.ts +16 -7
  380. package/src/runtime/spots/spot-outbound.ts +26 -10
  381. package/src/runtime/spots/spot-route-packet-dispatch.ts +18 -8
  382. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +14 -8
  383. package/src/runtime/spots/spot-runtime-ports.ts +5 -2
  384. package/src/runtime/spots/spot-serial-executor.ts +1 -1
  385. package/src/runtime/spots/spot-serial-turn-executor.ts +25 -40
  386. package/src/runtime/spots/spot-subscription-dispatch.ts +9 -2
  387. package/src/runtime/spots/spot-timer.ts +1 -1
  388. package/src/runtime/streams/actor-session-binding-registry.ts +46 -3
  389. package/src/runtime/streams/bound-actor-relay-sender.ts +16 -5
  390. package/src/runtime/streams/bound-session-service.ts +10 -7
  391. package/src/runtime/streams/index.ts +30 -4
  392. package/src/runtime/streams/managed-stream.ts +2 -1
  393. package/src/runtime/streams/session-calls.ts +9 -14
  394. package/src/runtime/streams/session-context.ts +6 -11
  395. package/src/runtime/streams/stream-session-runtime.ts +79 -40
  396. package/dist/runtime/spots/spot-lifecycle-metrics.d.ts +0 -8
  397. package/dist/runtime/spots/spot-lifecycle-metrics.js +0 -17
  398. package/src/runtime/spots/spot-lifecycle-metrics.ts +0 -16
@@ -1,3 +1,7 @@
1
+ import { RequestRuntime } from '../foundation/request-runtime';
2
+ import type { PendingOperation } from '../foundation/operation-registry';
3
+ import { waitRequestReply } from '../messaging/request-deadline';
4
+ import { mapZLinkRequestReply } from '../messaging/request-result';
1
5
  import type { ServiceInstanceColdActivationTarget } from '../foundation/service-stateful-wire-codec';
2
6
  import { ZLinkFrameworkException, ZLinkSpotKind, type RoutingId } from '../../contracts';
3
7
  import {
@@ -52,6 +56,7 @@ import type {
52
56
  } from '../spots/spot-routing-internal';
53
57
 
54
58
  export interface ZLinkHostSpotAddressTransportOptions {
59
+ readonly requests?: RequestRuntime;
55
60
  readonly resolver: () => ZLinkSpotRouteResolver | undefined;
56
61
  readonly routed: ZLinkSpotRoutedTransport;
57
62
  readonly meshNames: () => readonly string[];
@@ -81,7 +86,10 @@ type MissingTargetSelection =
81
86
 
82
87
  /** Owns global Spot authority lookup and Missing Instance placement. */
83
88
  export class ZLinkHostSpotAddressTransport implements ZLinkSpotAddressTransport {
84
- constructor(private readonly options: ZLinkHostSpotAddressTransportOptions) {}
89
+ private readonly requests: RequestRuntime;
90
+ constructor(private readonly options: ZLinkHostSpotAddressTransportOptions) {
91
+ this.requests = options.requests ?? new RequestRuntime();
92
+ }
85
93
 
86
94
  sendToSpotAddress(
87
95
  spotId: RoutingId,
@@ -252,67 +260,74 @@ export class ZLinkHostSpotAddressTransport implements ZLinkSpotAddressTransport
252
260
  call: ZLinkSpotAddressCallOptions
253
261
  ): Promise<TReply> {
254
262
  const timeoutMs = call.timeoutMs ?? this.options.defaultRequestTimeoutMs;
255
- const deadline = createSpotAddressDeadline(timeoutMs, call.signal);
256
- try {
257
- const resolution = await this.resolveExisting(spotId, deadline.signal, call);
258
- const existing = resolution !== undefined && !('kind' in resolution) ? resolution : undefined;
259
- if (resolution !== undefined && 'kind' in resolution)
260
- call = this.reactivationCall(resolution, call);
261
- deadline.requireRemaining();
262
- if (existing === undefined) {
263
- return await this.requestToMissingInstance(spotId, request, call, deadline, resolution);
264
- }
265
- this.validateExisting(existing, call);
263
+ return this.requests.request(timeoutMs, call.signal, async (requestOperation) => {
264
+ const deadline = createSpotAddressDeadline(requestOperation, call.signal);
266
265
  try {
267
- return await this.requestToExistingSpot(spotId, request, call, existing, deadline);
268
- } catch (error) {
269
- if (isSpotRouteRefreshError(error)) {
270
- this.options.resolver()?.invalidate?.(spotId);
266
+ for (;;) {
267
+ deadline.requireRemaining();
268
+ const resolution = await waitRequestReply(
269
+ this.resolveExisting(spotId, deadline.signal, call),
270
+ 'Spot address resolve',
271
+ requestOperation,
272
+ () => deadline.close()
273
+ );
274
+ const existing =
275
+ resolution !== undefined && !('kind' in resolution) ? resolution : undefined;
276
+ if (resolution !== undefined && 'kind' in resolution)
277
+ call = this.reactivationCall(resolution, call);
278
+ deadline.requireRemaining();
279
+ try {
280
+ if (existing === undefined) {
281
+ return await this.requestToMissingInstance(
282
+ spotId,
283
+ request,
284
+ call,
285
+ deadline,
286
+ resolution
287
+ );
288
+ }
289
+ this.validateExisting(existing, call);
290
+ return await this.requestToExistingSpot(spotId, request, call, existing, deadline);
291
+ } catch (error) {
292
+ if (
293
+ (existing !== undefined || isPreAdmissionStaleRoute(error)) &&
294
+ isSpotRouteRefreshError(error)
295
+ ) {
296
+ this.options.resolver()?.invalidate?.(spotId);
297
+ }
298
+ // §9 keeps admission-before-stale-route handling in this logical request.
299
+ if (call.instanceSpot && isPreAdmissionStaleRoute(error)) continue;
300
+ if (existing !== undefined) {
301
+ this.reportInstanceRequestError(
302
+ spotId,
303
+ request,
304
+ error,
305
+ existing.routerChannelId,
306
+ existing.targetNodeRid,
307
+ existing.stableType,
308
+ addressedInstanceErrorReason(error)
309
+ );
310
+ }
311
+ throw error;
312
+ }
271
313
  }
272
- // Failover policy §4.4: SpotMoving is the owner's Ready owner-fence
273
- // refusal, made before admission. With Instance intent, one authority
274
- // read under the same deadline decides: Missing means Close released
275
- // the incarnation, so the request activates a new one. Any other
276
- // answer, and any message the owner admitted, keeps this terminal.
314
+ } catch (error) {
277
315
  if (
278
- call.instanceSpot &&
279
- isOwnerFenceRefusal(error) &&
280
- (await this.resolveExisting(spotId, deadline.signal)) === undefined
316
+ error instanceof ZLinkFrameworkException &&
317
+ internalFrameworkErrorKind(error) === ZLinkFrameworkInternalErrorKind.DeadlineExceeded
281
318
  ) {
282
- deadline.requireRemaining();
283
- return await this.requestToMissingInstance(spotId, request, call, deadline);
319
+ throw createInternalFrameworkException(
320
+ ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
321
+ `Spot request for '${String(spotId)}' exceeded its end-to-end deadline.`,
322
+ true,
323
+ error
324
+ );
284
325
  }
285
- this.reportInstanceRequestError(
286
- spotId,
287
- request,
288
- error,
289
- existing.routerChannelId,
290
- existing.targetNodeRid,
291
- existing.stableType,
292
- addressedInstanceErrorReason(error)
293
- );
294
326
  throw error;
327
+ } finally {
328
+ deadline.close();
295
329
  }
296
- } catch (error) {
297
- if (
298
- deadline.expired() &&
299
- !(
300
- error instanceof ZLinkFrameworkException &&
301
- internalFrameworkErrorKind(error) ===
302
- ZLinkFrameworkInternalErrorKind.RequestTargetNotFound
303
- )
304
- ) {
305
- throw createInternalFrameworkException(
306
- ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
307
- `Spot request for '${String(spotId)}' exceeded its end-to-end deadline.`,
308
- true,
309
- error
310
- );
311
- }
312
- throw error;
313
- } finally {
314
- deadline.close();
315
- }
330
+ });
316
331
  }
317
332
 
318
333
  private async requestToExistingSpot<TReply>(
@@ -331,16 +346,29 @@ export class ZLinkHostSpotAddressTransport implements ZLinkSpotAddressTransport
331
346
  existing.stableType,
332
347
  existing.targetNodeRid
333
348
  );
334
- const reply = await awaitWithAbort(
335
- this.options.routed.requestToSpot<TReply>(existing, request, {
336
- instanceSpot: call.instanceSpot,
337
- timeoutMs: deadline.requireRemaining(),
338
- signal: deadline.signal,
339
- metadata: call.metadata,
340
- onAdmitted: call.onAdmitted
341
- }),
342
- deadline.signal
343
- );
349
+ // The address request owns the terminal entry. Observe the wire stage so
350
+ // a pre-admission refusal can reach the authority decision in §9.
351
+ const stage = new Promise<TReply>((resolve, reject) => {
352
+ const result = this.options.routed.requestToSpot<TReply>(
353
+ existing,
354
+ request,
355
+ {
356
+ instanceSpot: call.instanceSpot,
357
+ timeoutMs: deadline.requireRemaining(),
358
+ deadlineMs: deadline.deadlineMs,
359
+ signal: deadline.signal,
360
+ metadata: call.metadata,
361
+ onAdmitted: call.onAdmitted,
362
+ requestOperation: deadline.operation
363
+ },
364
+ {
365
+ operationCompleted: (_id, value) => resolve(value as TReply),
366
+ operationFailed: (_id, error) => reject(error)
367
+ }
368
+ );
369
+ if (result.operation === undefined) void mapZLinkRequestReply(result).then(resolve, reject);
370
+ });
371
+ const reply = await waitRequestReply(stage, 'Spot request', deadline.operation);
344
372
  this.traceInstanceAddress(
345
373
  ZLinkMessageFlowOutcome.ReplyReceived,
346
374
  ZLinkDispatchMessageKind.Request,
@@ -418,9 +446,11 @@ export class ZLinkHostSpotAddressTransport implements ZLinkSpotAddressTransport
418
446
  deadlineUnixMs,
419
447
  call.sourceSpot === undefined ? undefined : String(call.sourceSpot.routingId),
420
448
  call.metadata,
421
- call.onAdmitted
449
+ call.onAdmitted,
450
+ deadline.operation
422
451
  ),
423
- deadline.signal
452
+ deadline.signal,
453
+ deadline.operation
424
454
  );
425
455
  this.traceInstanceAddress(
426
456
  ZLinkMessageFlowOutcome.Sent,
@@ -431,7 +461,7 @@ export class ZLinkHostSpotAddressTransport implements ZLinkSpotAddressTransport
431
461
  selected.target.stableType,
432
462
  selected.target.targetNodeRid
433
463
  );
434
- const completion = await awaitWithAbort(completionPromise, deadline.signal);
464
+ const completion = await completionPromise;
435
465
  try {
436
466
  if (completion.terminalResult !== 0 || completion.failureErrno !== 0) {
437
467
  const error = missingInstanceRequestFailure(
@@ -754,19 +784,19 @@ function isSpotRouteRefreshError(error: unknown): error is ZLinkFrameworkExcepti
754
784
  if (!(error instanceof ZLinkFrameworkException)) return false;
755
785
  const kind = internalFrameworkErrorKind(error);
756
786
  return (
787
+ isPreAdmissionStaleRoute(error) ||
757
788
  kind === ZLinkFrameworkInternalErrorKind.SpotRouteNotFound ||
758
- kind === ZLinkFrameworkInternalErrorKind.SpotGenerationStale ||
759
- kind === ZLinkFrameworkInternalErrorKind.SpotMoving ||
760
789
  kind === ZLinkFrameworkInternalErrorKind.RequestTargetNotFound ||
761
- kind === ZLinkFrameworkInternalErrorKind.ActorLocationStale ||
762
790
  kind === ZLinkFrameworkInternalErrorKind.RouteNotConnected
763
791
  );
764
792
  }
765
793
 
766
- function isOwnerFenceRefusal(error: unknown): boolean {
794
+ function isPreAdmissionStaleRoute(error: unknown): boolean {
767
795
  return (
768
796
  error instanceof ZLinkFrameworkException &&
769
- internalFrameworkErrorKind(error) === ZLinkFrameworkInternalErrorKind.SpotMoving
797
+ (internalFrameworkErrorKind(error) === ZLinkFrameworkInternalErrorKind.SpotMoving ||
798
+ internalFrameworkErrorKind(error) === ZLinkFrameworkInternalErrorKind.ActorLocationStale ||
799
+ internalFrameworkErrorKind(error) === ZLinkFrameworkInternalErrorKind.SpotGenerationStale)
770
800
  );
771
801
  }
772
802
 
@@ -828,41 +858,28 @@ function addressedInstanceErrorReason(error: unknown): ZLinkDispatchErrorReason
828
858
  }
829
859
 
830
860
  interface ZLinkSpotAddressDeadline {
861
+ readonly operation: PendingOperation<unknown>;
831
862
  readonly deadlineUnixMs: number;
863
+ readonly deadlineMs: number;
832
864
  readonly signal: AbortSignal;
833
865
  requireRemaining(): number;
834
- expired(): boolean;
835
866
  close(): void;
836
867
  }
837
868
 
838
869
  function createSpotAddressDeadline(
839
- timeoutMs: number,
870
+ operation: PendingOperation<unknown>,
840
871
  parent?: AbortSignal
841
872
  ): ZLinkSpotAddressDeadline {
842
873
  const startedAtMs = performance.now();
843
874
  const startedAtUnixMs = Date.now();
844
- const deadlineMs = startedAtMs + Math.max(0, timeoutMs);
875
+ const deadlineMs = operation.deadlineMs ?? Number.POSITIVE_INFINITY;
845
876
  const controller = new AbortController();
846
- let expired = false;
847
- let timeout: ReturnType<typeof setTimeout> | undefined;
848
- const expire = () => {
849
- expired = true;
850
- controller.abort();
851
- };
852
- const arm = () => {
853
- if (timeout !== undefined) clearTimeout(timeout);
854
- const remainingMs = deadlineMs - performance.now();
855
- if (remainingMs <= 0) {
856
- expire();
857
- return;
858
- }
859
- timeout = setTimeout(expire, remainingMs);
860
- };
861
- arm();
862
877
  const abort = () => controller.abort(parent?.reason);
863
878
  if (parent?.aborted === true) abort();
864
879
  else parent?.addEventListener('abort', abort, { once: true });
865
880
  return {
881
+ operation,
882
+ deadlineMs,
866
883
  get deadlineUnixMs() {
867
884
  return Math.round(startedAtUnixMs + (deadlineMs - startedAtMs));
868
885
  },
@@ -870,7 +887,6 @@ function createSpotAddressDeadline(
870
887
  requireRemaining() {
871
888
  const remainingMs = deadlineMs - performance.now();
872
889
  if (remainingMs <= 0) {
873
- expired = true;
874
890
  throw createInternalFrameworkException(
875
891
  ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
876
892
  'Spot address operation exceeded its end-to-end deadline.',
@@ -879,9 +895,8 @@ function createSpotAddressDeadline(
879
895
  }
880
896
  return Math.max(1, Math.ceil(remainingMs));
881
897
  },
882
- expired: () => expired,
883
898
  close() {
884
- if (timeout !== undefined) clearTimeout(timeout);
899
+ controller.abort();
885
900
  parent?.removeEventListener('abort', abort);
886
901
  }
887
902
  };
@@ -1,3 +1,4 @@
1
+ import { DEFAULT_REQUEST_TIMEOUT_MS } from '../../contracts/Configuration/Registration';
1
2
  import { routingIdsEqual } from '../routing-id';
2
3
  import type { ZLinkRuntimeEventPublisher } from '../diagnostics';
3
4
  import { ZLinkSpotRelocationCoordinationMode, ZLinkUserSpotExecutionMode } from '../../contracts';
@@ -87,6 +88,8 @@ export class ZLinkSpotRuntimeOptionsFactory {
87
88
  create(actorTransferRuntime: ZLinkActorTransferRuntime): Partial<ZLinkSpotManagerOptions> {
88
89
  const spotRouterChannelIdForMesh = this.options.meshRouters.spotRouterChannelIdByMesh();
89
90
  return {
91
+ defaultRequestTimeoutMs:
92
+ this.options.registration.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,
90
93
  nodeRid: undefined,
91
94
  nodeRidProvider: (meshName) => this.meshNodeRoutingId(meshName),
92
95
  nodeGenerationProvider: (meshName) =>
@@ -5,6 +5,7 @@ import {
5
5
  type SpotRef,
6
6
  type ZLinkSpotCreateResult,
7
7
  ZLinkFrameworkException,
8
+ ZLinkFrameworkErrorKind,
8
9
  ZLinkSpotCreateState
9
10
  } from '../../contracts';
10
11
 
@@ -25,6 +26,7 @@ import {
25
26
  wireReplyFailureException
26
27
  } from '../framework-errors-internal';
27
28
  import { encodeAuthorityKey } from '../locations/authority-key-codec';
29
+ import type { ZLinkOwnerLeaseTracker } from '../locations/lease-tracker';
28
30
  import type {
29
31
  ZLinkAuthoritySnapshot,
30
32
  ZLinkLocationOwnerToken,
@@ -40,10 +42,11 @@ const DEFAULT_USER_SPOT_POLL_INTERVAL_MS = 10;
40
42
 
41
43
  export interface ZLinkUserSpotCreationCoordinatorOptions {
42
44
  readonly relocationPolicy?: (
43
- meshName: string,
45
+ meshName: string | undefined,
44
46
  stableType: string
45
47
  ) => import('../locations/internal-location-contracts').ZLinkObjectReserveRequest['actorRelocationPolicy'];
46
48
  readonly store: ZLinkObjectCreationStore & ZLinkAuthorityStore;
49
+ readonly leaseTracker: Pick<ZLinkOwnerLeaseTracker, 'isOwnerTokenLive'>;
47
50
  readonly target: (
48
51
  request: Pick<ZLinkUserSpotCreationRequest, 'meshName' | 'stableType'>,
49
52
  signal?: AbortSignal,
@@ -134,6 +137,16 @@ export class ZLinkUserSpotCreationCoordinator {
134
137
  let target: Awaited<ReturnType<ZLinkUserSpotCreationCoordinatorOptions['target']>>;
135
138
  let reserved: ZLinkObjectReserveResult;
136
139
  for (;;) {
140
+ try {
141
+ const spot = await this.awaitReady(request, signal);
142
+ if (spot !== undefined) {
143
+ deadline.close();
144
+ return { result: { spot, state: ZLinkSpotCreateState.Existing }, spot };
145
+ }
146
+ } catch (error) {
147
+ deadline.close();
148
+ throw error;
149
+ }
137
150
  try {
138
151
  target = await this.options.target(request, signal, excludedNodeRids);
139
152
  } catch (error) {
@@ -147,6 +160,16 @@ export class ZLinkUserSpotCreationCoordinator {
147
160
  );
148
161
  }
149
162
  if (target === undefined) {
163
+ try {
164
+ const current = await this.options.store.readAuthority(
165
+ encodeAuthorityKey('user_spot', String(request.spotId)),
166
+ signal
167
+ );
168
+ if (current.kind !== 'missing') continue;
169
+ } catch (error) {
170
+ deadline.close();
171
+ throw error;
172
+ }
150
173
  deadline.close();
151
174
  throw createInternalFrameworkException(
152
175
  ZLinkFrameworkInternalErrorKind.PlacementCapacityExhausted,
@@ -219,30 +242,14 @@ export class ZLinkUserSpotCreationCoordinator {
219
242
  }
220
243
  if (
221
244
  reserved.kind === 'alreadyExists' ||
222
- (reserved.kind === 'conflict' &&
223
- reserved.current.kind === 'snapshot' &&
224
- reserved.current.allocation.objectKind === 'user_spot' &&
225
- reserved.current.allocation.stableType === request.stableType)
226
- ) {
227
- if (request.generatedIdentity === true) {
228
- deadline.close();
229
- throw spotIdConflict(request.spotId);
230
- }
231
- try {
232
- const spot = await this.awaitReady(request, signal);
233
- if (spot !== undefined) {
234
- deadline.close();
235
- return { result: { spot, state: ZLinkSpotCreateState.Existing }, spot };
236
- }
237
- } catch (error) {
238
- deadline.close();
239
- throw error;
240
- }
245
+ (reserved.kind === 'conflict' && reserved.current.kind === 'snapshot')
246
+ )
241
247
  continue;
242
- }
243
- if (reserved.kind !== 'placementCapacityExhausted') break;
248
+ if (reserved.kind === 'placementCapacityExhausted') continue;
249
+ if (!(reserved.kind === 'conflict' && reserved.current.kind === 'missing')) break;
244
250
  excludedNodeRids.add(encodeRoutingIdStorageHex(target.nodeRid));
245
251
  }
252
+
246
253
  if (reserved.kind === 'typeMismatch') {
247
254
  deadline.close();
248
255
  if (request.generatedIdentity === true) {
@@ -721,6 +728,7 @@ export class ZLinkUserSpotCreationCoordinator {
721
728
  signal.throwIfAborted();
722
729
  const current = await this.options.store.readAuthority(key, signal);
723
730
  if (current.kind === 'missing') return undefined;
731
+ if (request.generatedIdentity === true) throw spotIdConflict(request.spotId);
724
732
  if (
725
733
  current.allocation.objectKind !== 'user_spot' ||
726
734
  current.allocation.stableType !== request.stableType
@@ -730,6 +738,45 @@ export class ZLinkUserSpotCreationCoordinator {
730
738
  `User Spot '${String(request.spotId)}' has another stable type.`
731
739
  );
732
740
  }
741
+ const ownerLive = await this.options.leaseTracker.isOwnerTokenLive(
742
+ {
743
+ ownerId: current.ownerId,
744
+ leaseGeneration: current.ownerLeaseGeneration
745
+ },
746
+ signal
747
+ );
748
+ if (!ownerLive || current.allocation.state !== 'active') {
749
+ const release = this.options.store.releaseEndedReservation;
750
+ if (release === undefined) {
751
+ throw new ZLinkFrameworkException(
752
+ ZLinkFrameworkErrorKind.NotConfigured,
753
+ 'User Spot creation requires repository ended-owner release support.'
754
+ );
755
+ }
756
+ if (
757
+ await release.call(this.options.store, key, current.storeVersion.value, signal, {
758
+ key: { kind: 'user_spot', globalId: String(request.spotId) },
759
+ intent: { stableType: request.stableType },
760
+ actorRelocationPolicy: this.options.relocationPolicy?.(
761
+ request.meshName,
762
+ request.stableType
763
+ )
764
+ })
765
+ )
766
+ continue;
767
+ const confirmed = await this.options.store.readAuthority(key, signal);
768
+ if (
769
+ confirmed.kind === 'missing' ||
770
+ confirmed.storeVersion.value !== current.storeVersion.value
771
+ )
772
+ continue;
773
+ if (!ownerLive) {
774
+ throw new ZLinkFrameworkException(
775
+ ZLinkFrameworkErrorKind.Unavailable,
776
+ 'User Spot authority owner lease is unavailable.'
777
+ );
778
+ }
779
+ }
733
780
  if (
734
781
  current.allocation.state === 'active' &&
735
782
  decodeServiceClosingSpotAuthority(current.payload) === undefined
@@ -0,0 +1,2 @@
1
+ // Internal snapshots are available only through this module, not a package entry.
2
+ export const inspectRuntime = Symbol('zlink.internal.runtime-observation');
@@ -1,3 +1,4 @@
1
+ import { ZLinkFrameworkException, ZLinkFrameworkErrorKind } from '../../contracts/Errors';
1
2
  import type { ActorRef, RoutingId } from '../../contracts/Common';
2
3
  import {
3
4
  ZLinkLocationKind,
@@ -214,7 +215,8 @@ export class ZLinkActorLocationClaims {
214
215
  spotId: RoutingId,
215
216
  spotGeneration: bigint,
216
217
  spotKind: ZLinkSpotKind.Entry | ZLinkSpotKind.User,
217
- ownerNodeGeneration: bigint
218
+ ownerNodeGeneration: bigint,
219
+ signal?: AbortSignal
218
220
  ): Promise<void> {
219
221
  const actorId = actorRef.actorId;
220
222
  const store = this.authorityStore;
@@ -223,14 +225,17 @@ export class ZLinkActorLocationClaims {
223
225
  throw new Error('Actor membership commit requires Location Store authority and owner.');
224
226
  }
225
227
  const key = encodeAuthorityKey('actor', actorId);
226
- const current = await store.readAuthority(key);
228
+ const current = await store.readAuthority(key, signal);
227
229
  if (
228
230
  !matchesActorAuthority(current, actorRef, owner) ||
229
231
  current.allocation.stableType !== actorType ||
230
232
  current.authorityOwnerGeneration !== authorityOwnerGeneration ||
231
233
  current.allocation.descriptorLifecycleGeneration !== ownerNodeGeneration
232
234
  ) {
233
- throw new Error(`Actor '${actorId}' membership authority fence does not match.`);
235
+ throw new ZLinkFrameworkException(
236
+ classifyMembershipAuthorityFailure(current, actorRef),
237
+ `Actor '${actorId}' membership authority fence does not match.`
238
+ );
234
239
  }
235
240
  const identity = decodeActorAuthorityIdentity(current.payload, current.objectGeneration);
236
241
  if (
@@ -242,21 +247,33 @@ export class ZLinkActorLocationClaims {
242
247
  !routingIdsEqual(identity.actor.nodeRid, actorRef.nodeRid) ||
243
248
  identity.meshName !== actorRef.meshName
244
249
  ) {
245
- throw new Error(`Actor '${actorId}' membership authority identity does not match.`);
250
+ throw new ZLinkFrameworkException(
251
+ ZLinkFrameworkErrorKind.Unavailable,
252
+ `Actor '${actorId}' membership authority identity does not match.`
253
+ );
246
254
  }
247
- const result = await store.compareExchangeAuthority(key, current.storeVersion, {
248
- kind: 'put',
249
- generationTransition: 'preserve',
250
- payload: rewriteActorAuthorityRoute(
251
- current.payload,
252
- actorRef,
253
- String(spotId),
254
- spotGeneration,
255
- spotKind
256
- )
257
- });
255
+ const result = await store.compareExchangeAuthority(
256
+ key,
257
+ current.storeVersion,
258
+ {
259
+ kind: 'put',
260
+ generationTransition: 'preserve',
261
+ payload: rewriteActorAuthorityRoute(
262
+ current.payload,
263
+ actorRef,
264
+ String(spotId),
265
+ spotGeneration,
266
+ spotKind
267
+ )
268
+ },
269
+ signal
270
+ );
258
271
  if (result.kind !== 'stored') {
259
- throw new Error(
272
+ throw new ZLinkFrameworkException(
273
+ result.kind === 'conflict'
274
+ ? (result.membershipFailure ??
275
+ classifyMembershipAuthorityFailure(result.current, actorRef))
276
+ : ZLinkFrameworkErrorKind.InternalFailure,
260
277
  `Actor '${actorId}' membership commit was rejected with status ${result.kind}.`
261
278
  );
262
279
  }
@@ -442,6 +459,15 @@ interface TrackedActor {
442
459
  readonly deactivate?: () => Promise<void>;
443
460
  }
444
461
 
462
+ function classifyMembershipAuthorityFailure(
463
+ current: { readonly kind: 'missing' } | ZLinkAuthoritySnapshot,
464
+ actorRef: ActorRef
465
+ ): ZLinkFrameworkErrorKind {
466
+ return current.kind === 'snapshot' && current.objectGeneration !== actorRef.objectGeneration
467
+ ? ZLinkFrameworkErrorKind.InvalidOperation
468
+ : ZLinkFrameworkErrorKind.Unavailable;
469
+ }
470
+
445
471
  function matchesActorAuthority(
446
472
  current: { readonly kind: 'missing' } | ZLinkAuthoritySnapshot,
447
473
  actorRef: ActorRef,
@@ -6,7 +6,6 @@ import type { ZLinkDomainLocationStore as ZLinkLocationStore } from './domain-st
6
6
  import type { ZLinkOwnerLeaseTracker } from './lease-tracker';
7
7
  import type { ZLinkAutoConnectLocal } from './auto-connect-types';
8
8
  import type { ZLinkAutoConnectReconciler } from './auto-connect-reconciler';
9
- import { ZLinkStateLane } from '../execution/state-lane';
10
9
 
11
10
  export interface ZLinkAutoConnectLoopOptions {
12
11
  readonly reconciler: ZLinkAutoConnectReconciler;
@@ -19,7 +18,6 @@ export interface ZLinkAutoConnectLoopOptions {
19
18
  }
20
19
 
21
20
  export class ZLinkAutoConnectLoop {
22
- private readonly lane = new ZLinkStateLane();
23
21
  private readonly reconciler: ZLinkAutoConnectReconciler;
24
22
  private readonly options: Required<ZLinkLocationOptionOverrides>;
25
23
  private readonly meshName: string;
@@ -46,15 +44,19 @@ export class ZLinkAutoConnectLoop {
46
44
  }
47
45
 
48
46
  async start(signal?: AbortSignal): Promise<void> {
49
- if (await this.lane.run(() => this.controller !== undefined)) return;
50
- await this.tick(signal);
51
- const started = await this.lane.run(() => {
52
- if (this.controller !== undefined) return false;
53
- this.controller = new AbortController();
54
- return true;
55
- });
56
- if (!started) return;
57
- this.scheduleNext();
47
+ if (this.controller !== undefined) return;
48
+ // Reserve the lifecycle before yielding so stop also owns the first publication.
49
+ const controller = new AbortController();
50
+ this.controller = controller;
51
+ try {
52
+ await this.tick(signal);
53
+ } catch (error) {
54
+ if (this.controller === controller) {
55
+ await this.prepareTransportShutdown();
56
+ }
57
+ throw error;
58
+ }
59
+ this.scheduleNext(controller);
58
60
  }
59
61
 
60
62
  async requestPeerReconcile(meshName: string, _peerRid: string): Promise<void> {
@@ -91,8 +93,14 @@ export class ZLinkAutoConnectLoop {
91
93
 
92
94
  async tick(signal?: AbortSignal): Promise<void> {
93
95
  const controller = this.controller;
96
+ const tickSignal =
97
+ controller === undefined
98
+ ? signal
99
+ : signal === undefined
100
+ ? controller.signal
101
+ : AbortSignal.any([signal, controller.signal]);
94
102
  await this.enqueueTick(async () => {
95
- if (controller?.signal.aborted !== true) await this.tickCore(signal ?? controller?.signal);
103
+ if (tickSignal?.aborted !== true) await this.tickCore(tickSignal);
96
104
  });
97
105
  }
98
106
 
@@ -144,15 +152,15 @@ export class ZLinkAutoConnectLoop {
144
152
  return this.lastTickFailed;
145
153
  }
146
154
 
147
- private scheduleNext(): void {
148
- if (this.controller === undefined || this.controller.signal.aborted) {
155
+ private scheduleNext(controller: AbortController): void {
156
+ if (this.controller !== controller || controller.signal.aborted) {
149
157
  return;
150
158
  }
151
159
  this.timer = this.setTimer(() => {
152
160
  this.timer = undefined;
153
- void this.tick(this.controller?.signal)
161
+ void this.tick(controller.signal)
154
162
  .catch(() => undefined)
155
- .finally(() => this.scheduleNext());
163
+ .finally(() => this.scheduleNext(controller));
156
164
  }, this.options.pollingIntervalMs);
157
165
  }
158
166
  }
@@ -130,14 +130,11 @@ function targetOf(peer: ZLinkPeerLocation): ZLinkAutoConnectTarget {
130
130
  }
131
131
 
132
132
  function isAutoConnectSelf(local: ZLinkAutoConnectLocal, peer: ZLinkPeerLocation): boolean {
133
- if (
133
+ return (
134
134
  local.nodeRid !== undefined &&
135
135
  peer.nodeRid !== undefined &&
136
136
  routingIdsEqual(local.nodeRid, peer.nodeRid)
137
- ) {
138
- return true;
139
- }
140
- return peer.endpoint === local.endpoint;
137
+ );
141
138
  }
142
139
 
143
140
  function shouldDialAutoConnectPeer(local: ZLinkAutoConnectLocal, peer: ZLinkPeerLocation): boolean {