@zlink-systems/framework 0.30.0 → 0.30.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/LICENSE +150 -68
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/contracts/Actors/ZLinkActorClient.d.ts +2 -1
  4. package/dist/contracts/Channels/Calls.d.ts +2 -1
  5. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
  6. package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
  7. package/dist/contracts/Common/ZLinkMessageMetadata.js +11 -5
  8. package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
  9. package/dist/contracts/Common/encoded-payload-storage.js +5 -2
  10. package/dist/contracts/Configuration/Builders.d.ts +1 -1
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
  12. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
  13. package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
  14. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  15. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
  16. package/dist/contracts/Handlers/Attributes.d.ts +5 -13
  17. package/dist/contracts/Handlers/Attributes.js +7 -11
  18. package/dist/contracts/Handlers/JsonContract.d.ts +2 -46
  19. package/dist/contracts/Handlers/JsonContract.js +4 -153
  20. package/dist/contracts/Locations/Rows.d.ts +2 -0
  21. package/dist/contracts/Spots/Contracts.d.ts +6 -1
  22. package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
  23. package/dist/nest-integration.d.ts +1 -1
  24. package/dist/nest-integration.js +2 -1
  25. package/dist/runtime/abort.d.ts +5 -0
  26. package/dist/runtime/abort.js +10 -0
  27. package/dist/runtime/actors/actor-authority-publication.js +3 -2
  28. package/dist/runtime/actors/actor-client.d.ts +1 -2
  29. package/dist/runtime/actors/actor-client.js +52 -57
  30. package/dist/runtime/actors/actor-context.d.ts +2 -0
  31. package/dist/runtime/actors/actor-context.js +46 -9
  32. package/dist/runtime/actors/actor-handoff.d.ts +8 -4
  33. package/dist/runtime/actors/actor-handoff.js +219 -92
  34. package/dist/runtime/actors/actor-join-relocation.d.ts +3 -0
  35. package/dist/runtime/actors/actor-local-native-join.js +13 -12
  36. package/dist/runtime/actors/actor-mailbox.js +27 -1
  37. package/dist/runtime/actors/actor-remote-joiner.js +3 -1
  38. package/dist/runtime/actors/actor-remote-wire.js +15 -0
  39. package/dist/runtime/actors/actor-reply.d.ts +4 -0
  40. package/dist/runtime/actors/actor-reply.js +29 -0
  41. package/dist/runtime/actors/actor-routed-join-transport.d.ts +6 -2
  42. package/dist/runtime/actors/actor-routed-json-request.d.ts +2 -0
  43. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
  44. package/dist/runtime/actors/actor-runtime-state.js +2 -20
  45. package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
  46. package/dist/runtime/actors/index.d.ts +8 -3
  47. package/dist/runtime/actors/index.js +55 -27
  48. package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
  49. package/dist/runtime/actors/session-disconnected-wire.js +48 -0
  50. package/dist/runtime/actors/spot-actor-dispatch.js +2 -2
  51. package/dist/runtime/admission.d.ts +9 -1
  52. package/dist/runtime/admission.js +56 -23
  53. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +6 -8
  54. package/dist/runtime/application-jobs/application-ingress-record-owner.js +39 -22
  55. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +15 -1
  56. package/dist/runtime/application-jobs/application-job-queue-scope.js +61 -20
  57. package/dist/runtime/application-jobs/contracts.d.ts +12 -1
  58. package/dist/runtime/backend/contracts/index.d.ts +37 -12
  59. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
  60. package/dist/runtime/backend/mesh-completion-table.d.ts +9 -1
  61. package/dist/runtime/backend/mesh-completion-table.js +154 -49
  62. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +28 -1
  63. package/dist/runtime/backend/mesh-dispatch-pump.js +208 -101
  64. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +2 -2
  65. package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -9
  66. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +1 -1
  67. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +5 -2
  68. package/dist/runtime/backend/node/node-raw-binding-port.js +124 -72
  69. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +46 -13
  70. package/dist/runtime/backend/node/node-raw-mesh-backend.js +181 -164
  71. package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
  72. package/dist/runtime/backend/node/node-socket-backend-adapter.js +11 -11
  73. package/dist/runtime/backend/raw-binding-port.d.ts +2 -2
  74. package/dist/runtime/backend/runtime-message.d.ts +1 -0
  75. package/dist/runtime/backend/runtime-message.js +5 -0
  76. package/dist/runtime/backend/runtime-values.d.ts +1 -0
  77. package/dist/runtime/backend/runtime-values.js +2 -1
  78. package/dist/runtime/channels/channel-clients.d.ts +2 -0
  79. package/dist/runtime/channels/channel-clients.js +75 -23
  80. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +25 -5
  81. package/dist/runtime/channels/channel-dispatch-pipeline.js +111 -56
  82. package/dist/runtime/channels/channel-dispatch-services.d.ts +1 -0
  83. package/dist/runtime/channels/channel-dispatch-services.js +45 -0
  84. package/dist/runtime/channels/channel-dispatchers.d.ts +4 -3
  85. package/dist/runtime/channels/channel-dispatchers.js +62 -54
  86. package/dist/runtime/channels/channel-envelope-inspection.d.ts +1 -2
  87. package/dist/runtime/channels/channel-envelope-inspection.js +1 -16
  88. package/dist/runtime/channels/channel-envelope.d.ts +2 -0
  89. package/dist/runtime/channels/channel-envelope.js +146 -28
  90. package/dist/runtime/channels/channel-outbound-operations.d.ts +2 -2
  91. package/dist/runtime/channels/channel-outbound-operations.js +8 -8
  92. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
  93. package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
  94. package/dist/runtime/channels/channel-runtime-manager.d.ts +9 -8
  95. package/dist/runtime/channels/channel-runtime-manager.js +16 -16
  96. package/dist/runtime/channels/channel-transports.d.ts +18 -16
  97. package/dist/runtime/channels/channel-transports.js +77 -58
  98. package/dist/runtime/channels/client-server-location-runtime.js +5 -4
  99. package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
  100. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  101. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  102. package/dist/runtime/channels/fanout-location-runtime.js +3 -3
  103. package/dist/runtime/channels/local-spot-route-transport.d.ts +1 -1
  104. package/dist/runtime/channels/local-spot-route-transport.js +2 -1
  105. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +2 -2
  106. package/dist/runtime/channels/router-socket-spot-route-transport.js +4 -4
  107. package/dist/runtime/channels/source-spot-router.d.ts +2 -2
  108. package/dist/runtime/channels/source-spot-router.js +4 -4
  109. package/dist/runtime/channels/spot-node-route-transport.d.ts +2 -2
  110. package/dist/runtime/channels/spot-node-route-transport.js +4 -4
  111. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +2 -2
  112. package/dist/runtime/channels/spot-route-bridge-transport.js +4 -4
  113. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +5 -4
  114. package/dist/runtime/channels/spot-route-dispatch-strategy.js +18 -18
  115. package/dist/runtime/diagnostics/flow-context.js +19 -7
  116. package/dist/runtime/diagnostics/index.js +4 -9
  117. package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
  118. package/dist/runtime/diagnostics/message-flow.js +35 -5
  119. package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
  120. package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
  121. package/dist/runtime/execution/index.d.ts +4 -2
  122. package/dist/runtime/execution/index.js +33 -10
  123. package/dist/runtime/execution/serial-execution-queue.d.ts +5 -0
  124. package/dist/runtime/execution/serial-execution-queue.js +22 -2
  125. package/dist/runtime/execution/state-lane.d.ts +2 -0
  126. package/dist/runtime/execution/state-lane.js +5 -0
  127. package/dist/runtime/foundation/actor-join-recovery-codec.js +2 -2
  128. package/dist/runtime/foundation/durable-service-request.d.ts +14 -0
  129. package/dist/runtime/foundation/durable-service-request.js +98 -0
  130. package/dist/runtime/foundation/operation-identity.d.ts +1 -0
  131. package/dist/runtime/foundation/operation-identity.js +5 -1
  132. package/dist/runtime/foundation/operation-registry.d.ts +25 -1
  133. package/dist/runtime/foundation/operation-registry.js +86 -18
  134. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +61 -8
  135. package/dist/runtime/foundation/raw-service-mesh-runtime.js +486 -266
  136. package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
  137. package/dist/runtime/foundation/service-liveness-registry.js +38 -0
  138. package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
  139. package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
  140. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +3 -3
  141. package/dist/runtime/foundation/service-relocation-object-owner.js +48 -34
  142. package/dist/runtime/foundation/service-relocation-runtime.d.ts +2 -0
  143. package/dist/runtime/foundation/service-relocation-runtime.js +20 -4
  144. package/dist/runtime/foundation/service-runtime-contracts.d.ts +10 -1
  145. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
  146. package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
  147. package/dist/runtime/foundation/service-stateful-registry.js +24 -26
  148. package/dist/runtime/foundation/service-stateful-runtime.d.ts +75 -9
  149. package/dist/runtime/foundation/service-stateful-runtime.js +486 -218
  150. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -6
  151. package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
  152. package/dist/runtime/foundation/service-topology-registry.d.ts +12 -2
  153. package/dist/runtime/foundation/service-topology-registry.js +61 -27
  154. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
  155. package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
  156. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  157. package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
  158. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +13 -3
  159. package/dist/runtime/foundation/service-wire-m6a-codec.js +189 -78
  160. package/dist/runtime/handlers/handler-instance-scope.d.ts +8 -0
  161. package/dist/runtime/handlers/handler-instance-scope.js +54 -11
  162. package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
  163. package/dist/runtime/host/actor-packet-relay.js +59 -72
  164. package/dist/runtime/host/actor-placement-coordinator.js +25 -8
  165. package/dist/runtime/host/actor-runtime-options-factory.js +2 -2
  166. package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
  167. package/dist/runtime/host/actor-transfer-runtime.js +85 -331
  168. package/dist/runtime/host/application-job-queue.d.ts +40 -7
  169. package/dist/runtime/host/application-job-queue.js +137 -42
  170. package/dist/runtime/host/entry-actor-runtime.d.ts +1 -0
  171. package/dist/runtime/host/entry-actor-runtime.js +3 -0
  172. package/dist/runtime/host/index.d.ts +12 -2
  173. package/dist/runtime/host/index.js +300 -202
  174. package/dist/runtime/host/location-runtime-owner.js +2 -6
  175. package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
  176. package/dist/runtime/host/mesh-router-resolver.js +14 -6
  177. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
  178. package/dist/runtime/host/remote-bound-session-relay.js +73 -208
  179. package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
  180. package/dist/runtime/host/route-mesh-runtime.js +6 -4
  181. package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
  182. package/dist/runtime/host/runtime-shutdown.js +3 -2
  183. package/dist/runtime/host/service-relocation-control.d.ts +1 -0
  184. package/dist/runtime/host/service-relocation-control.js +10 -4
  185. package/dist/runtime/host/service-relocation-host-runtime.d.ts +22 -14
  186. package/dist/runtime/host/service-relocation-host-runtime.js +754 -599
  187. package/dist/runtime/host/spot-address-transport.js +3 -2
  188. package/dist/runtime/host/spot-runtime-options-factory.js +16 -7
  189. package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
  190. package/dist/runtime/locations/actor-location-claims.d.ts +2 -2
  191. package/dist/runtime/locations/actor-location-claims.js +34 -19
  192. package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
  193. package/dist/runtime/locations/auto-connect-loop.js +22 -14
  194. package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
  195. package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
  196. package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
  197. package/dist/runtime/locations/descriptor-publication.js +11 -0
  198. package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
  199. package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
  200. package/dist/runtime/locations/in-memory-authority-store.js +56 -19
  201. package/dist/runtime/locations/in-memory-location-store.js +1 -10
  202. package/dist/runtime/locations/index.d.ts +1 -0
  203. package/dist/runtime/locations/index.js +1 -0
  204. package/dist/runtime/locations/lease-tracker.js +1 -6
  205. package/dist/runtime/locations/lifecycle.d.ts +1 -2
  206. package/dist/runtime/locations/lifecycle.js +2 -5
  207. package/dist/runtime/locations/location-store-repository.d.ts +51 -1
  208. package/dist/runtime/locations/location-store-repository.js +363 -139
  209. package/dist/runtime/locations/relocation-blob.d.ts +18 -1
  210. package/dist/runtime/locations/relocation-blob.js +52 -1
  211. package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
  212. package/dist/runtime/locations/request-source-resolver.js +80 -0
  213. package/dist/runtime/locations/resolvers.js +1 -1
  214. package/dist/runtime/locations/runtime.d.ts +7 -3
  215. package/dist/runtime/locations/runtime.js +61 -53
  216. package/dist/runtime/messaging/framework-json-v1.d.ts +4 -6
  217. package/dist/runtime/messaging/framework-json-v1.js +38 -294
  218. package/dist/runtime/messaging/packet-name.d.ts +1 -1
  219. package/dist/runtime/messaging/packet-name.js +8 -24
  220. package/dist/runtime/messaging/payload-codec.d.ts +7 -1
  221. package/dist/runtime/messaging/payload-codec.js +7 -6
  222. package/dist/runtime/messaging/request-result.d.ts +2 -0
  223. package/dist/runtime/messaging/request-result.js +57 -0
  224. package/dist/runtime/messaging/submission-result.d.ts +1 -0
  225. package/dist/runtime/messaging/submission-result.js +5 -2
  226. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +34 -1
  227. package/dist/runtime/protocol/service_wire_codec.generated.js +229 -0
  228. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +16 -1
  229. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +37 -8
  230. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +7 -2
  231. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +36 -21
  232. package/dist/runtime/spots/index.d.ts +21 -11
  233. package/dist/runtime/spots/index.js +243 -178
  234. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
  235. package/dist/runtime/spots/spot-activation-registry.js +21 -11
  236. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  237. package/dist/runtime/spots/spot-activation-state.js +7 -7
  238. package/dist/runtime/spots/spot-activation.d.ts +7 -3
  239. package/dist/runtime/spots/spot-activation.js +140 -52
  240. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
  241. package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
  242. package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
  243. package/dist/runtime/spots/spot-actor-membership.js +0 -8
  244. package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
  245. package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
  246. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
  247. package/dist/runtime/spots/spot-entry-activation.js +20 -11
  248. package/dist/runtime/spots/spot-handler-registry.d.ts +7 -4
  249. package/dist/runtime/spots/spot-handler-registry.js +24 -10
  250. package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
  251. package/dist/runtime/spots/spot-manager-public.js +2 -2
  252. package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
  253. package/dist/runtime/spots/spot-node-autoconnect.js +22 -42
  254. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
  255. package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
  256. package/dist/runtime/spots/spot-outbound.d.ts +3 -0
  257. package/dist/runtime/spots/spot-outbound.js +27 -18
  258. package/dist/runtime/spots/spot-remote-codec.js +5 -1
  259. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +1 -0
  260. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +1 -1
  261. package/dist/runtime/spots/spot-runtime-ports.d.ts +1 -1
  262. package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
  263. package/dist/runtime/spots/spot-serial-executor.js +61 -8
  264. package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
  265. package/dist/runtime/spots/spot-subscription-dispatch.js +1 -4
  266. package/dist/runtime/spots/spot-timer.d.ts +57 -5
  267. package/dist/runtime/spots/spot-timer.js +288 -103
  268. package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
  269. package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
  270. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
  271. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
  272. package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
  273. package/dist/runtime/streams/bound-session-service.d.ts +1 -1
  274. package/dist/runtime/streams/bound-session-service.js +6 -11
  275. package/dist/runtime/streams/index.d.ts +3 -2
  276. package/dist/runtime/streams/index.js +6 -4
  277. package/dist/runtime/streams/managed-stream.js +3 -2
  278. package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
  279. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
  280. package/dist/runtime/streams/session-actor-coordinator.js +15 -32
  281. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
  282. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -1
  283. package/dist/runtime/streams/stream-session-runtime.js +14 -31
  284. package/dist/runtime/workers/index.js +1 -1
  285. package/package.json +3 -3
  286. package/src/contracts/Actors/ZLinkActorClient.ts +2 -1
  287. package/src/contracts/Channels/Calls.ts +2 -1
  288. package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
  289. package/src/contracts/Common/ZLinkMessageMetadata.ts +13 -8
  290. package/src/contracts/Common/encoded-payload-storage.ts +6 -3
  291. package/src/contracts/Configuration/Builders.ts +4 -1
  292. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
  293. package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
  294. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  295. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
  296. package/src/contracts/Handlers/Attributes.ts +14 -21
  297. package/src/contracts/Handlers/JsonContract.ts +8 -216
  298. package/src/contracts/Locations/Rows.ts +2 -0
  299. package/src/contracts/Spots/Contracts.ts +10 -1
  300. package/src/contracts/Spots/ZLinkSpot.ts +3 -3
  301. package/src/nest-integration.ts +1 -0
  302. package/src/runtime/abort.ts +12 -0
  303. package/src/runtime/actors/actor-authority-publication.ts +3 -2
  304. package/src/runtime/actors/actor-client.ts +100 -85
  305. package/src/runtime/actors/actor-context.ts +49 -9
  306. package/src/runtime/actors/actor-handoff.ts +291 -110
  307. package/src/runtime/actors/actor-join-relocation.ts +3 -0
  308. package/src/runtime/actors/actor-local-native-join.ts +21 -26
  309. package/src/runtime/actors/actor-mailbox.ts +40 -2
  310. package/src/runtime/actors/actor-remote-joiner.ts +6 -1
  311. package/src/runtime/actors/actor-remote-wire.ts +17 -0
  312. package/src/runtime/actors/actor-reply.ts +42 -0
  313. package/src/runtime/actors/actor-routed-join-transport.ts +14 -4
  314. package/src/runtime/actors/actor-routed-json-request.ts +10 -2
  315. package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
  316. package/src/runtime/actors/actor-runtime-state.ts +2 -20
  317. package/src/runtime/actors/actor-source-transfer.ts +1 -34
  318. package/src/runtime/actors/index.ts +60 -32
  319. package/src/runtime/actors/session-disconnected-wire.ts +66 -0
  320. package/src/runtime/actors/spot-actor-dispatch.ts +4 -2
  321. package/src/runtime/admission.ts +69 -21
  322. package/src/runtime/application-jobs/application-ingress-record-owner.ts +41 -25
  323. package/src/runtime/application-jobs/application-job-queue-scope.ts +83 -22
  324. package/src/runtime/application-jobs/contracts.ts +16 -1
  325. package/src/runtime/backend/contracts/index.ts +92 -18
  326. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
  327. package/src/runtime/backend/mesh-completion-table.ts +160 -57
  328. package/src/runtime/backend/mesh-dispatch-pump.ts +237 -108
  329. package/src/runtime/backend/node/node-backend-adapter-support.ts +17 -8
  330. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +12 -2
  331. package/src/runtime/backend/node/node-raw-binding-port.ts +148 -85
  332. package/src/runtime/backend/node/node-raw-mesh-backend.ts +315 -201
  333. package/src/runtime/backend/node/node-socket-backend-adapter.ts +26 -11
  334. package/src/runtime/backend/raw-binding-port.ts +7 -2
  335. package/src/runtime/backend/runtime-message.ts +6 -0
  336. package/src/runtime/backend/runtime-values.ts +1 -0
  337. package/src/runtime/channels/channel-clients.ts +132 -58
  338. package/src/runtime/channels/channel-dispatch-pipeline.ts +198 -114
  339. package/src/runtime/channels/channel-dispatch-services.ts +69 -1
  340. package/src/runtime/channels/channel-dispatchers.ts +136 -90
  341. package/src/runtime/channels/channel-envelope-inspection.ts +2 -16
  342. package/src/runtime/channels/channel-envelope.ts +225 -31
  343. package/src/runtime/channels/channel-outbound-operations.ts +22 -8
  344. package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
  345. package/src/runtime/channels/channel-runtime-manager.ts +41 -17
  346. package/src/runtime/channels/channel-transports.ts +171 -112
  347. package/src/runtime/channels/client-server-location-runtime.ts +11 -10
  348. package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
  349. package/src/runtime/channels/fanout-location-runtime.ts +17 -9
  350. package/src/runtime/channels/local-spot-route-transport.ts +3 -1
  351. package/src/runtime/channels/router-socket-spot-route-transport.ts +13 -4
  352. package/src/runtime/channels/source-spot-router.ts +8 -4
  353. package/src/runtime/channels/spot-node-route-transport.ts +8 -4
  354. package/src/runtime/channels/spot-route-bridge-transport.ts +6 -4
  355. package/src/runtime/channels/spot-route-dispatch-strategy.ts +47 -18
  356. package/src/runtime/diagnostics/flow-context.ts +20 -7
  357. package/src/runtime/diagnostics/index.ts +1 -7
  358. package/src/runtime/diagnostics/message-flow.ts +47 -9
  359. package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
  360. package/src/runtime/execution/index.ts +40 -14
  361. package/src/runtime/execution/serial-execution-queue.ts +33 -4
  362. package/src/runtime/execution/state-lane.ts +7 -0
  363. package/src/runtime/foundation/actor-join-recovery-codec.ts +2 -2
  364. package/src/runtime/foundation/durable-service-request.ts +137 -0
  365. package/src/runtime/foundation/operation-identity.ts +5 -1
  366. package/src/runtime/foundation/operation-registry.ts +98 -20
  367. package/src/runtime/foundation/raw-service-mesh-runtime.ts +704 -336
  368. package/src/runtime/foundation/service-liveness-registry.ts +39 -0
  369. package/src/runtime/foundation/service-mailbox.ts +8 -0
  370. package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
  371. package/src/runtime/foundation/service-relocation-object-owner.ts +55 -36
  372. package/src/runtime/foundation/service-relocation-runtime.ts +25 -4
  373. package/src/runtime/foundation/service-runtime-contracts.ts +19 -2
  374. package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
  375. package/src/runtime/foundation/service-stateful-registry.ts +38 -35
  376. package/src/runtime/foundation/service-stateful-runtime.ts +732 -275
  377. package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -16
  378. package/src/runtime/foundation/service-topology-registry.ts +91 -36
  379. package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
  380. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  381. package/src/runtime/foundation/service-wire-m6a-codec.ts +231 -76
  382. package/src/runtime/handlers/handler-instance-scope.ts +67 -16
  383. package/src/runtime/host/actor-packet-relay.ts +113 -94
  384. package/src/runtime/host/actor-placement-coordinator.ts +31 -8
  385. package/src/runtime/host/actor-runtime-options-factory.ts +13 -2
  386. package/src/runtime/host/actor-transfer-runtime.ts +104 -430
  387. package/src/runtime/host/application-job-queue.ts +160 -41
  388. package/src/runtime/host/entry-actor-runtime.ts +4 -0
  389. package/src/runtime/host/index.ts +473 -271
  390. package/src/runtime/host/location-runtime-owner.ts +2 -6
  391. package/src/runtime/host/mesh-router-resolver.ts +13 -5
  392. package/src/runtime/host/remote-bound-session-relay.ts +88 -271
  393. package/src/runtime/host/route-mesh-runtime.ts +12 -6
  394. package/src/runtime/host/runtime-shutdown.ts +15 -4
  395. package/src/runtime/host/service-relocation-control.ts +11 -5
  396. package/src/runtime/host/service-relocation-host-runtime.ts +1092 -759
  397. package/src/runtime/host/spot-address-transport.ts +4 -2
  398. package/src/runtime/host/spot-runtime-options-factory.ts +20 -7
  399. package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
  400. package/src/runtime/locations/actor-location-claims.ts +52 -30
  401. package/src/runtime/locations/auto-connect-loop.ts +22 -14
  402. package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
  403. package/src/runtime/locations/auto-connect-types.ts +0 -1
  404. package/src/runtime/locations/descriptor-publication.ts +7 -0
  405. package/src/runtime/locations/domain-store-contract.ts +5 -0
  406. package/src/runtime/locations/in-memory-authority-store.ts +85 -23
  407. package/src/runtime/locations/in-memory-location-store.ts +1 -12
  408. package/src/runtime/locations/index.ts +1 -0
  409. package/src/runtime/locations/lease-tracker.ts +2 -9
  410. package/src/runtime/locations/lifecycle.ts +8 -26
  411. package/src/runtime/locations/location-store-repository.ts +628 -152
  412. package/src/runtime/locations/relocation-blob.ts +75 -1
  413. package/src/runtime/locations/request-source-resolver.ts +138 -0
  414. package/src/runtime/locations/resolvers.ts +2 -2
  415. package/src/runtime/locations/runtime.ts +98 -64
  416. package/src/runtime/messaging/framework-json-v1.ts +5 -325
  417. package/src/runtime/messaging/packet-name.ts +5 -25
  418. package/src/runtime/messaging/payload-codec.ts +8 -11
  419. package/src/runtime/messaging/request-result.ts +62 -0
  420. package/src/runtime/messaging/submission-result.ts +5 -1
  421. package/src/runtime/protocol/service_wire_codec.generated.ts +218 -5
  422. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +16 -13
  423. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +46 -25
  424. package/src/runtime/spots/index.ts +389 -283
  425. package/src/runtime/spots/spot-activation-registry.ts +25 -13
  426. package/src/runtime/spots/spot-activation-state.ts +12 -19
  427. package/src/runtime/spots/spot-activation.ts +198 -96
  428. package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
  429. package/src/runtime/spots/spot-actor-membership.ts +0 -15
  430. package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
  431. package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
  432. package/src/runtime/spots/spot-entry-activation.ts +33 -21
  433. package/src/runtime/spots/spot-handler-registry.ts +56 -12
  434. package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
  435. package/src/runtime/spots/spot-manager-public.ts +2 -2
  436. package/src/runtime/spots/spot-node-autoconnect.ts +28 -47
  437. package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
  438. package/src/runtime/spots/spot-outbound.ts +39 -19
  439. package/src/runtime/spots/spot-remote-codec.ts +9 -2
  440. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +2 -1
  441. package/src/runtime/spots/spot-runtime-ports.ts +1 -1
  442. package/src/runtime/spots/spot-serial-executor.ts +97 -25
  443. package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
  444. package/src/runtime/spots/spot-subscription-dispatch.ts +1 -4
  445. package/src/runtime/spots/spot-timer.ts +418 -158
  446. package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
  447. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
  448. package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
  449. package/src/runtime/streams/bound-session-service.ts +7 -10
  450. package/src/runtime/streams/index.ts +12 -6
  451. package/src/runtime/streams/managed-stream.ts +4 -2
  452. package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
  453. package/src/runtime/streams/session-actor-coordinator.ts +39 -88
  454. package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
  455. package/src/runtime/streams/stream-session-runtime.ts +13 -34
  456. package/src/runtime/workers/index.ts +1 -1
@@ -336,7 +336,8 @@ export class ZLinkHostSpotAddressTransport implements ZLinkSpotAddressTransport
336
336
  instanceSpot: call.instanceSpot,
337
337
  timeoutMs: deadline.requireRemaining(),
338
338
  signal: deadline.signal,
339
- metadata: call.metadata
339
+ metadata: call.metadata,
340
+ onAdmitted: call.onAdmitted
340
341
  }),
341
342
  deadline.signal
342
343
  );
@@ -416,7 +417,8 @@ export class ZLinkHostSpotAddressTransport implements ZLinkSpotAddressTransport
416
417
  encoded,
417
418
  deadlineUnixMs,
418
419
  call.sourceSpot === undefined ? undefined : String(call.sourceSpot.routingId),
419
- call.metadata
420
+ call.metadata,
421
+ call.onAdmitted
420
422
  ),
421
423
  deadline.signal
422
424
  );
@@ -1,3 +1,4 @@
1
+ import { routingIdsEqual } from '../routing-id';
1
2
  import type { ZLinkRuntimeEventPublisher } from '../diagnostics';
2
3
  import { ZLinkSpotRelocationCoordinationMode, ZLinkUserSpotExecutionMode } from '../../contracts';
3
4
  import {
@@ -137,6 +138,15 @@ export class ZLinkSpotRuntimeOptionsFactory {
137
138
  }
138
139
  await runtime.dispatchEntryActorJoin(meshName, actor, handoffBacklog);
139
140
  },
141
+ admitEntryActorPacketPrefix: (meshName, actorId, records) => {
142
+ const runtime = this.options.spotNodeRuntime();
143
+ if (runtime === undefined) {
144
+ throw new ZLinkConfigurationException(
145
+ 'Entry Actor replay requires the MeshNode runtime.'
146
+ );
147
+ }
148
+ return runtime.admitEntryActorPacketPrefix(meshName, actorId, records);
149
+ },
140
150
  executeEntryActor: (meshName, actorId, operation) => {
141
151
  const runtime = this.options.spotNodeRuntime();
142
152
  if (runtime === undefined) {
@@ -278,8 +288,9 @@ export class ZLinkSpotRuntimeOptionsFactory {
278
288
  this.options.spotNodeRuntime()?.meshNode(meshName) as never,
279
289
  spotRouteResolver: this.options.createLocationSpotRouteResolver(),
280
290
  actorResolver: (actorId) => {
281
- const state = this.options.actorManager()?.getState(actorId);
282
- return state?.isMoving === true ? undefined : state?.actor;
291
+ const manager = this.options.actorManager();
292
+ const state = manager?.getState(actorId);
293
+ return state?.isMoving === true ? undefined : manager?.resolveLocalActor(actorId);
283
294
  },
284
295
  canonicalActorJoinResolver: (fence) =>
285
296
  this.options.boundSessionRelay.actorJoins.prepareCanonicalActorJoin({
@@ -297,14 +308,14 @@ export class ZLinkSpotRuntimeOptionsFactory {
297
308
  state?.nativeActorRef === undefined
298
309
  ? undefined
299
310
  : toFrameworkActorRef(state.nativeActorRef, state.meshName ?? '');
300
- const localNodeRid = this.primaryNodeRoutingId();
311
+ const localNodeRid =
312
+ state?.meshName === undefined ? undefined : this.meshNodeRoutingId(state.meshName);
301
313
  if (
302
314
  state?.actor === undefined ||
303
- state.spot === undefined ||
304
315
  state.remoteActorPacketTarget !== undefined ||
305
316
  actorRef === undefined ||
306
317
  localNodeRid === undefined ||
307
- String(actorRef.nodeRid) !== localNodeRid
318
+ !routingIdsEqual(actorRef.nodeRid, localNodeRid)
308
319
  ) {
309
320
  return {};
310
321
  }
@@ -333,6 +344,8 @@ export class ZLinkSpotRuntimeOptionsFactory {
333
344
  );
334
345
  },
335
346
  actorTransferRuntime,
347
+ releaseActorMembers: (meshName, spotId) =>
348
+ this.options.actorManager()?.releaseSpotActorMembers(meshName, spotId) ?? Promise.resolve(),
336
349
  boundSessionRuntime: this.options.boundSessionRelay.boundSessions,
337
350
  actorHandoffRuntime: this.options.actorHandoff,
338
351
  metrics: this.options.metrics,
@@ -349,11 +362,11 @@ export class ZLinkSpotRuntimeOptionsFactory {
349
362
 
350
363
  private primaryNodeRoutingId(): string | undefined {
351
364
  const node = this.primaryNode();
352
- return node === undefined ? undefined : String(node.status().routingId);
365
+ return node === undefined ? undefined : node.status().routingId;
353
366
  }
354
367
 
355
368
  private meshNodeRoutingId(meshName: string): string | undefined {
356
369
  const node = this.options.spotNodeRuntime()?.meshNode(meshName);
357
- return node === undefined ? undefined : String(node.status().routingId);
370
+ return node === undefined ? undefined : node.status().routingId;
358
371
  }
359
372
  }
@@ -1,3 +1,4 @@
1
+ import { encodeRoutingIdStorageHex, routingIdsEqual } from '../routing-id';
1
2
  import { createHash } from 'node:crypto';
2
3
  import {
3
4
  type RoutingId,
@@ -131,7 +132,6 @@ export class ZLinkUserSpotCreationCoordinator {
131
132
  const contentReference = encodeLocationCreationContent(request.requestPayload);
132
133
  const excludedNodeRids = new Set<string>();
133
134
  let target: Awaited<ReturnType<ZLinkUserSpotCreationCoordinatorOptions['target']>>;
134
- let authorityTarget;
135
135
  let reserved: ZLinkObjectReserveResult;
136
136
  for (;;) {
137
137
  try {
@@ -154,7 +154,7 @@ export class ZLinkUserSpotCreationCoordinator {
154
154
  true
155
155
  );
156
156
  }
157
- if (excludedNodeRids.has(String(target.nodeRid))) {
157
+ if (excludedNodeRids.has(encodeRoutingIdStorageHex(target.nodeRid))) {
158
158
  deadline.close();
159
159
  throw createInternalFrameworkException(
160
160
  ZLinkFrameworkInternalErrorKind.PlacementCapacityExhausted,
@@ -163,7 +163,7 @@ export class ZLinkUserSpotCreationCoordinator {
163
163
  );
164
164
  }
165
165
  const owner = target.owner;
166
- authorityTarget = {
166
+ const authorityTarget = {
167
167
  meshName: target.meshName,
168
168
  nodeRid: target.nodeRid,
169
169
  nodeLifecycleGeneration: target.nodeGeneration,
@@ -217,92 +217,31 @@ export class ZLinkUserSpotCreationCoordinator {
217
217
  error
218
218
  );
219
219
  }
220
- if (reserved.kind !== 'placementCapacityExhausted') break;
221
- excludedNodeRids.add(String(target.nodeRid));
222
- }
223
- if (
224
- reserved.kind === 'alreadyExists' ||
225
- (reserved.kind === 'conflict' &&
226
- reserved.current.kind === 'snapshot' &&
227
- reserved.current.allocation.objectKind === 'user_spot' &&
228
- reserved.current.allocation.stableType === request.stableType)
229
- ) {
230
- const current = reserved.kind === 'alreadyExists' ? reserved.current : reserved.current;
231
- if (current.kind === 'snapshot' && current.allocation.state === 'active') {
220
+ if (
221
+ 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
+ ) {
232
227
  if (request.generatedIdentity === true) {
233
228
  deadline.close();
234
229
  throw spotIdConflict(request.spotId);
235
230
  }
236
- const spot = spotRef(current, request);
237
- deadline.close();
238
- return {
239
- result: { spot, state: ZLinkSpotCreateState.Existing },
240
- spot
241
- };
242
- }
243
- if (current.kind !== 'snapshot' || !sameCreationTarget(current, authorityTarget)) {
244
- deadline.close();
245
- if (request.generatedIdentity === true) {
246
- throw spotIdConflict(request.spotId);
247
- }
248
- throw createInternalFrameworkException(
249
- ZLinkFrameworkInternalErrorKind.RequestFailed,
250
- 'User Spot creation requires a remote generation-fenced create operation.'
251
- );
252
- }
253
- if (current.allocation.state === 'reserved' && !target.isLocal) {
254
231
  try {
255
- return await this.remoteCreate(
256
- request,
257
- current,
258
- target.nodeRid,
259
- target.nodeGeneration,
260
- deadlineUnixMs,
261
- deadlineMs
262
- );
263
- } finally {
264
- deadline.close();
265
- }
266
- }
267
- if (current.allocation.state === 'reserved' && target.isLocal) {
268
- const pending = current.pendingCreation;
269
- const admitted =
270
- pending === undefined ? undefined : this.localCreations.get(pending.reservationId);
271
- if (admitted === undefined) {
272
- try {
273
- const spot = await this.awaitReady(request, signal);
274
- return {
275
- result: { spot, state: ZLinkSpotCreateState.Existing },
276
- spot
277
- };
278
- } finally {
232
+ const spot = await this.awaitReady(request, signal);
233
+ if (spot !== undefined) {
279
234
  deadline.close();
235
+ return { result: { spot, state: ZLinkSpotCreateState.Existing }, spot };
280
236
  }
281
- }
282
- try {
283
- const result = await admitted;
284
- return result.result.state === ZLinkSpotCreateState.Created
285
- ? {
286
- result: {
287
- ...result.result,
288
- state: ZLinkSpotCreateState.Existing
289
- },
290
- spot: result.spot
291
- }
292
- : result;
293
- } finally {
237
+ } catch (error) {
294
238
  deadline.close();
239
+ throw error;
295
240
  }
241
+ continue;
296
242
  }
297
- try {
298
- const spot = await this.awaitReady(request, signal);
299
- return {
300
- result: { spot, state: ZLinkSpotCreateState.Existing },
301
- spot
302
- };
303
- } finally {
304
- deadline.close();
305
- }
243
+ if (reserved.kind !== 'placementCapacityExhausted') break;
244
+ excludedNodeRids.add(encodeRoutingIdStorageHex(target.nodeRid));
306
245
  }
307
246
  if (reserved.kind === 'typeMismatch') {
308
247
  deadline.close();
@@ -478,7 +417,7 @@ export class ZLinkUserSpotCreationCoordinator {
478
417
  current.allocation.stableType === record.stableType &&
479
418
  current.objectGeneration === record.reservation.objectGeneration &&
480
419
  current.authorityOwnerGeneration === record.reservation.authorityOwnerGeneration &&
481
- String(current.allocation.descriptor.rid) === record.reservation.targetNodeRid &&
420
+ routingIdsEqual(current.allocation.descriptor.rid, record.reservation.targetNodeRid) &&
482
421
  current.allocation.descriptorLifecycleGeneration ===
483
422
  record.reservation.targetNodeGeneration &&
484
423
  current.ownerId === record.reservation.targetOwnerId &&
@@ -532,7 +471,7 @@ export class ZLinkUserSpotCreationCoordinator {
532
471
  try {
533
472
  local = await materialize(requestPayload, current, signal ?? new AbortController().signal);
534
473
  if (local.state === ZLinkSpotCreateState.Rejected) {
535
- local.publication?.abort();
474
+ await local.publication?.abort();
536
475
  await this.options.store.abort(
537
476
  {
538
477
  key: { kind: 'user_spot', globalId: record.spotId },
@@ -609,13 +548,15 @@ export class ZLinkUserSpotCreationCoordinator {
609
548
  committed.ready.allocation.descriptor.meshName,
610
549
  readySpotRoute(record.spotId, committed.ready)
611
550
  );
612
- local.publication?.publish();
551
+ await local.publication?.publish();
613
552
  return {
614
553
  result: { spot: readySpot, state: local.state, reply: local.reply },
615
554
  spot: readySpot
616
555
  };
617
556
  } catch (error) {
618
- local?.publication?.abort();
557
+ const publicationCleanup = await Promise.allSettled([
558
+ Promise.resolve().then(() => local?.publication?.abort())
559
+ ]);
619
560
  const cleanupDeadline = createDeadline(
620
561
  this.options.cleanupTimeoutMs ?? DEFAULT_USER_SPOT_CLEANUP_TIMEOUT_MS
621
562
  );
@@ -644,7 +585,7 @@ export class ZLinkUserSpotCreationCoordinator {
644
585
  waitForAbort(discard?.(cleanupSignal) ?? Promise.resolve(), cleanupSignal)
645
586
  ]);
646
587
  cleanupDeadline.close();
647
- const cleanupErrors = cleanup
588
+ const cleanupErrors = [...publicationCleanup, ...cleanup]
648
589
  .filter((item): item is PromiseRejectedResult => item.status === 'rejected')
649
590
  .map((item) => item.reason);
650
591
  if (cleanupErrors.length > 0) {
@@ -774,12 +715,25 @@ export class ZLinkUserSpotCreationCoordinator {
774
715
  private async awaitReady(
775
716
  request: ZLinkUserSpotCreationRequest,
776
717
  signal: AbortSignal
777
- ): Promise<SpotRef> {
718
+ ): Promise<SpotRef | undefined> {
778
719
  const key = encodeAuthorityKey('user_spot', String(request.spotId));
779
720
  for (;;) {
780
721
  signal.throwIfAborted();
781
722
  const current = await this.options.store.readAuthority(key, signal);
782
- if (current.kind === 'snapshot' && current.allocation.state === 'active') {
723
+ if (current.kind === 'missing') return undefined;
724
+ if (
725
+ current.allocation.objectKind !== 'user_spot' ||
726
+ current.allocation.stableType !== request.stableType
727
+ ) {
728
+ throw createInternalFrameworkException(
729
+ ZLinkFrameworkInternalErrorKind.SpotTypeMismatch,
730
+ `User Spot '${String(request.spotId)}' has another stable type.`
731
+ );
732
+ }
733
+ if (
734
+ current.allocation.state === 'active' &&
735
+ decodeServiceClosingSpotAuthority(current.payload) === undefined
736
+ ) {
783
737
  return spotRef(current, request);
784
738
  }
785
739
  await wait(this.options.pollIntervalMs ?? DEFAULT_USER_SPOT_POLL_INTERVAL_MS, signal);
@@ -931,7 +885,7 @@ function requireCloseTarget(
931
885
  decoded.ownerLeaseGeneration !== current.ownerLeaseGeneration ||
932
886
  allocation.objectKind !== 'user_spot' ||
933
887
  allocation.state !== 'active' ||
934
- String(allocation.descriptor.rid) !== fence.nodeRid ||
888
+ !routingIdsEqual(allocation.descriptor.rid, fence.nodeRid) ||
935
889
  (fence.meshName !== undefined && allocation.descriptor.meshName !== fence.meshName) ||
936
890
  (fence.nodeGeneration !== undefined &&
937
891
  allocation.descriptorLifecycleGeneration !== fence.nodeGeneration) ||
@@ -1057,19 +1011,6 @@ export function decodeLocationCreationContent(
1057
1011
  return payload;
1058
1012
  }
1059
1013
 
1060
- function sameCreationTarget(
1061
- snapshot: ZLinkAuthoritySnapshot,
1062
- target: Parameters<ZLinkObjectCreationStore['reserve']>[0]['target']
1063
- ): boolean {
1064
- return (
1065
- snapshot.allocation.descriptor.meshName === target.meshName &&
1066
- String(snapshot.allocation.descriptor.rid) === String(target.nodeRid) &&
1067
- snapshot.allocation.descriptorLifecycleGeneration === target.nodeLifecycleGeneration &&
1068
- snapshot.ownerId === target.owner.ownerId &&
1069
- snapshot.ownerLeaseGeneration === target.owner.leaseGeneration
1070
- );
1071
- }
1072
-
1073
1014
  function remoteCreationFingerprint(record: ServiceUserSpotCreateRecord): string {
1074
1015
  return JSON.stringify(
1075
1016
  {
@@ -12,6 +12,10 @@ import { ZLinkSpotKind } from '../../contracts/Spots';
12
12
  import { ZLinkLocationKeyCodec } from './key-codec';
13
13
  import { encodeAuthorityKey } from './authority-key-codec';
14
14
  import { routingIdsEqual } from '../routing-id';
15
+ import {
16
+ decodeActorAuthorityIdentity,
17
+ rewriteActorAuthorityRoute
18
+ } from '../actors/actor-authority-publication';
15
19
  import type { IZLinkLocationLifecycleRuntime, ZLinkOwnershipLostEvent } from './lifecycle-runtime';
16
20
 
17
21
  export enum ZLinkActorClaimStatus {
@@ -203,41 +207,59 @@ export class ZLinkActorLocationClaims {
203
207
  return { status: ZLinkActorClaimStatus.Claimed, claimed, generation: result.generation };
204
208
  }
205
209
 
206
- async notifyJoinedSpot(
210
+ async commitMembership(
207
211
  actorType: string,
208
- actorId: string,
209
- _spotMeshName: string,
212
+ actorRef: ActorRef,
213
+ authorityOwnerGeneration: bigint,
210
214
  spotId: RoutingId,
211
215
  spotGeneration: bigint,
212
- membershipEpoch: bigint,
216
+ spotKind: ZLinkSpotKind.Entry | ZLinkSpotKind.User,
213
217
  ownerNodeGeneration: bigint
214
218
  ): Promise<void> {
215
- await this.renew(actorType, actorId, (row) => ({
216
- ...row,
217
- spotKind: ZLinkSpotKind.User,
218
- spotId,
219
- spotGeneration,
220
- membershipEpoch,
221
- ownerNodeGeneration
222
- }));
223
- }
224
-
225
- async notifyLeftSpot(
226
- actorType: string,
227
- actorId: string,
228
- entrySpotId: RoutingId,
229
- entrySpotGeneration: bigint,
230
- membershipEpoch: bigint,
231
- ownerNodeGeneration: bigint
232
- ): Promise<void> {
233
- await this.renew(actorType, actorId, (row) => ({
234
- ...row,
235
- spotKind: ZLinkSpotKind.Entry,
236
- spotId: entrySpotId,
237
- spotGeneration: entrySpotGeneration,
238
- membershipEpoch,
239
- ownerNodeGeneration
240
- }));
219
+ const actorId = actorRef.actorId;
220
+ const store = this.authorityStore;
221
+ const owner = this.runtime.currentOwnerToken;
222
+ if (store === undefined || owner === undefined) {
223
+ throw new Error('Actor membership commit requires Location Store authority and owner.');
224
+ }
225
+ const key = encodeAuthorityKey('actor', actorId);
226
+ const current = await store.readAuthority(key);
227
+ if (
228
+ !matchesActorAuthority(current, actorRef, owner) ||
229
+ current.allocation.stableType !== actorType ||
230
+ current.authorityOwnerGeneration !== authorityOwnerGeneration ||
231
+ current.allocation.descriptorLifecycleGeneration !== ownerNodeGeneration
232
+ ) {
233
+ throw new Error(`Actor '${actorId}' membership authority fence does not match.`);
234
+ }
235
+ const identity = decodeActorAuthorityIdentity(current.payload, current.objectGeneration);
236
+ if (
237
+ identity === undefined ||
238
+ identity.actorType !== actorType ||
239
+ identity.ownerNodeGeneration !== ownerNodeGeneration ||
240
+ identity.owner.ownerId !== owner.ownerId ||
241
+ identity.owner.leaseGeneration !== owner.leaseGeneration ||
242
+ !routingIdsEqual(identity.actor.nodeRid, actorRef.nodeRid) ||
243
+ identity.meshName !== actorRef.meshName
244
+ ) {
245
+ throw new Error(`Actor '${actorId}' membership authority identity does not match.`);
246
+ }
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
+ });
258
+ if (result.kind !== 'stored') {
259
+ throw new Error(
260
+ `Actor '${actorId}' membership commit was rejected with status ${result.kind}.`
261
+ );
262
+ }
241
263
  }
242
264
 
243
265
  async release(_actorType: string, actorId: string, actorRef?: ActorRef): Promise<void> {
@@ -55,6 +55,15 @@ export class ZLinkAutoConnectLoop {
55
55
  this.scheduleNext();
56
56
  }
57
57
 
58
+ async requestPeerReconcile(meshName: string, _peerRid: string): Promise<void> {
59
+ const controller = this.controller;
60
+ if (meshName !== this.meshName || controller === undefined) return;
61
+ // A fresh descriptor scan uses the same RID ordering and connection owner as a periodic tick.
62
+ await this.lane.run(async () => {
63
+ if (!controller.signal.aborted) await this.runReconcile(controller.signal);
64
+ });
65
+ }
66
+
58
67
  async stop(signal?: AbortSignal): Promise<void> {
59
68
  await this.prepareTransportShutdown();
60
69
  await this.finishTransportShutdown(signal);
@@ -78,7 +87,11 @@ export class ZLinkAutoConnectLoop {
78
87
  }
79
88
 
80
89
  async tick(signal?: AbortSignal): Promise<void> {
81
- const lastTickFailed = await this.lane.run(() => this.lastTickFailed);
90
+ await this.lane.run(() => this.tickCore(signal));
91
+ }
92
+
93
+ private async tickCore(signal?: AbortSignal): Promise<void> {
94
+ const lastTickFailed = this.lastTickFailed;
82
95
  if (this.changeStampStore?.getMeshNodeChangeStamp !== undefined && !lastTickFailed) {
83
96
  try {
84
97
  const stamp = await this.changeStampStore.getMeshNodeChangeStamp(this.meshName, signal);
@@ -94,11 +107,10 @@ export class ZLinkAutoConnectLoop {
94
107
  return;
95
108
  }
96
109
  const tickFailed = await this.runReconcile(signal);
97
- if (!tickFailed)
98
- await this.lane.run(() => {
99
- this.lastStamp = stamp;
100
- this.lastLiveOwnerSetVersion = liveOwners;
101
- });
110
+ if (!tickFailed) {
111
+ this.lastStamp = stamp;
112
+ this.lastLiveOwnerSetVersion = liveOwners;
113
+ }
102
114
  return;
103
115
  } catch {
104
116
  // A failed stamp read degrades to a full reconcile tick.
@@ -106,18 +118,14 @@ export class ZLinkAutoConnectLoop {
106
118
  }
107
119
 
108
120
  await this.runReconcile(signal);
109
- await this.lane.run(() => {
110
- this.lastStamp = undefined;
111
- this.lastLiveOwnerSetVersion = undefined;
112
- });
121
+ this.lastStamp = undefined;
122
+ this.lastLiveOwnerSetVersion = undefined;
113
123
  }
114
124
 
115
125
  private async runReconcile(signal?: AbortSignal): Promise<boolean> {
116
126
  await this.reconciler.tick(signal);
117
- return await this.lane.run(() => {
118
- this.lastTickFailed = this.reconciler.storeFailed;
119
- return this.lastTickFailed;
120
- });
127
+ this.lastTickFailed = this.reconciler.storeFailed;
128
+ return this.lastTickFailed;
121
129
  }
122
130
 
123
131
  private scheduleNext(): void {
@@ -195,15 +195,11 @@ export class ZLinkAutoConnectReconciler {
195
195
  }
196
196
  const deferringMissingTargets =
197
197
  this.monotonicNowMs() < (await this.lane.run(() => this.recoveryDeferUntilMs));
198
- let staleCandidates = candidates;
199
198
  if (deferringMissingTargets) {
200
- const retainedCandidates = new Map(candidates);
201
199
  const lastDesired = await this.lane.run(() => [...this.lastDesired]);
202
200
  for (const [key, target] of lastDesired) {
203
201
  if (!desired.has(key)) desired.set(key, target);
204
- if (!retainedCandidates.has(key)) retainedCandidates.set(key, target);
205
202
  }
206
- staleCandidates = retainedCandidates;
207
203
  }
208
204
  await this.lane.run(() => {
209
205
  this.lastDesired = new Map(desired);
@@ -270,8 +266,6 @@ export class ZLinkAutoConnectReconciler {
270
266
  }
271
267
  }
272
268
 
273
- this.executor.disconnectStalePeers?.([...staleCandidates.values()]);
274
-
275
269
  const activeTargets = await this.lane.run(() => [...this.active]);
276
270
  for (const [key, target] of activeTargets) {
277
271
  if (!desired.has(key)) {
@@ -32,7 +32,6 @@ export interface ZLinkAutoConnectTarget {
32
32
  export interface IZLinkAutoConnectExecutor {
33
33
  connect(target: ZLinkAutoConnectTarget): Promise<boolean>;
34
34
  disconnect(target: ZLinkAutoConnectTarget): void;
35
- disconnectStalePeers?(targets: readonly ZLinkAutoConnectTarget[]): void;
36
35
  isDisconnected?(target: ZLinkAutoConnectTarget): boolean;
37
36
  onDisconnected?(handler: (endpoint: string) => void): void;
38
37
  replaceNotRequired?(targets: readonly ZLinkAutoConnectTarget[]): void;
@@ -0,0 +1,7 @@
1
+ /** A descriptor Store write failed without a confirmed result (Location runtime section 5). */
2
+ export class ZLinkDescriptorPublicationUnconfirmedError extends Error {
3
+ constructor(cause: unknown) {
4
+ super(cause instanceof Error ? cause.message : String(cause), { cause });
5
+ this.name = 'ZLinkDescriptorPublicationUnconfirmedError';
6
+ }
7
+ }
@@ -49,6 +49,11 @@ import type {
49
49
  * implement this interface; the framework maps it to the opaque Store SPI.
50
50
  */
51
51
  export interface ZLinkDomainLocationStore {
52
+ confirmedCapacity?(
53
+ key: ZLinkMeshNodeDescriptorKey,
54
+ limits: ZLinkMeshNodeDescriptor['populationCapacity']
55
+ ): ZLinkMeshNodeDescriptor['populationCapacity'] | undefined;
56
+
52
57
  updateMeshNode(
53
58
  descriptor: ZLinkMeshNodeDescriptor,
54
59
  intent: ZLinkLocationWriteIntent,