@zlink-systems/framework 0.30.0 → 0.30.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/LICENSE +150 -68
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/contracts/Actors/ZLinkActorClient.d.ts +2 -1
  4. package/dist/contracts/Channels/Calls.d.ts +2 -1
  5. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
  6. package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
  7. package/dist/contracts/Common/ZLinkMessageMetadata.js +11 -5
  8. package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
  9. package/dist/contracts/Common/encoded-payload-storage.js +5 -2
  10. package/dist/contracts/Configuration/Builders.d.ts +1 -1
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
  12. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
  13. package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
  14. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  15. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
  16. package/dist/contracts/Handlers/Attributes.d.ts +5 -13
  17. package/dist/contracts/Handlers/Attributes.js +7 -11
  18. package/dist/contracts/Handlers/JsonContract.d.ts +2 -46
  19. package/dist/contracts/Handlers/JsonContract.js +4 -153
  20. package/dist/contracts/Locations/Rows.d.ts +2 -0
  21. package/dist/contracts/Spots/Contracts.d.ts +6 -1
  22. package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
  23. package/dist/nest-integration.d.ts +1 -1
  24. package/dist/nest-integration.js +2 -1
  25. package/dist/runtime/abort.d.ts +5 -0
  26. package/dist/runtime/abort.js +10 -0
  27. package/dist/runtime/actors/actor-authority-publication.js +3 -2
  28. package/dist/runtime/actors/actor-client.d.ts +1 -2
  29. package/dist/runtime/actors/actor-client.js +52 -57
  30. package/dist/runtime/actors/actor-context.d.ts +2 -0
  31. package/dist/runtime/actors/actor-context.js +46 -9
  32. package/dist/runtime/actors/actor-handoff.d.ts +8 -4
  33. package/dist/runtime/actors/actor-handoff.js +219 -92
  34. package/dist/runtime/actors/actor-join-relocation.d.ts +3 -0
  35. package/dist/runtime/actors/actor-local-native-join.js +13 -12
  36. package/dist/runtime/actors/actor-mailbox.js +27 -1
  37. package/dist/runtime/actors/actor-remote-joiner.js +3 -1
  38. package/dist/runtime/actors/actor-remote-wire.js +15 -0
  39. package/dist/runtime/actors/actor-reply.d.ts +4 -0
  40. package/dist/runtime/actors/actor-reply.js +29 -0
  41. package/dist/runtime/actors/actor-routed-join-transport.d.ts +6 -2
  42. package/dist/runtime/actors/actor-routed-json-request.d.ts +2 -0
  43. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
  44. package/dist/runtime/actors/actor-runtime-state.js +2 -20
  45. package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
  46. package/dist/runtime/actors/index.d.ts +8 -3
  47. package/dist/runtime/actors/index.js +55 -27
  48. package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
  49. package/dist/runtime/actors/session-disconnected-wire.js +48 -0
  50. package/dist/runtime/actors/spot-actor-dispatch.js +2 -2
  51. package/dist/runtime/admission.d.ts +9 -1
  52. package/dist/runtime/admission.js +56 -23
  53. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +6 -8
  54. package/dist/runtime/application-jobs/application-ingress-record-owner.js +39 -22
  55. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +15 -1
  56. package/dist/runtime/application-jobs/application-job-queue-scope.js +61 -20
  57. package/dist/runtime/application-jobs/contracts.d.ts +12 -1
  58. package/dist/runtime/backend/contracts/index.d.ts +37 -12
  59. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
  60. package/dist/runtime/backend/mesh-completion-table.d.ts +9 -1
  61. package/dist/runtime/backend/mesh-completion-table.js +154 -49
  62. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +28 -1
  63. package/dist/runtime/backend/mesh-dispatch-pump.js +208 -101
  64. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +2 -2
  65. package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -9
  66. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +1 -1
  67. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +5 -2
  68. package/dist/runtime/backend/node/node-raw-binding-port.js +124 -72
  69. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +46 -13
  70. package/dist/runtime/backend/node/node-raw-mesh-backend.js +181 -164
  71. package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
  72. package/dist/runtime/backend/node/node-socket-backend-adapter.js +11 -11
  73. package/dist/runtime/backend/raw-binding-port.d.ts +2 -2
  74. package/dist/runtime/backend/runtime-message.d.ts +1 -0
  75. package/dist/runtime/backend/runtime-message.js +5 -0
  76. package/dist/runtime/backend/runtime-values.d.ts +1 -0
  77. package/dist/runtime/backend/runtime-values.js +2 -1
  78. package/dist/runtime/channels/channel-clients.d.ts +2 -0
  79. package/dist/runtime/channels/channel-clients.js +75 -23
  80. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +25 -5
  81. package/dist/runtime/channels/channel-dispatch-pipeline.js +111 -56
  82. package/dist/runtime/channels/channel-dispatch-services.d.ts +1 -0
  83. package/dist/runtime/channels/channel-dispatch-services.js +45 -0
  84. package/dist/runtime/channels/channel-dispatchers.d.ts +4 -3
  85. package/dist/runtime/channels/channel-dispatchers.js +62 -54
  86. package/dist/runtime/channels/channel-envelope-inspection.d.ts +1 -2
  87. package/dist/runtime/channels/channel-envelope-inspection.js +1 -16
  88. package/dist/runtime/channels/channel-envelope.d.ts +2 -0
  89. package/dist/runtime/channels/channel-envelope.js +146 -28
  90. package/dist/runtime/channels/channel-outbound-operations.d.ts +2 -2
  91. package/dist/runtime/channels/channel-outbound-operations.js +8 -8
  92. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
  93. package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
  94. package/dist/runtime/channels/channel-runtime-manager.d.ts +9 -8
  95. package/dist/runtime/channels/channel-runtime-manager.js +16 -16
  96. package/dist/runtime/channels/channel-transports.d.ts +18 -16
  97. package/dist/runtime/channels/channel-transports.js +77 -58
  98. package/dist/runtime/channels/client-server-location-runtime.js +5 -4
  99. package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
  100. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  101. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  102. package/dist/runtime/channels/fanout-location-runtime.js +3 -3
  103. package/dist/runtime/channels/local-spot-route-transport.d.ts +1 -1
  104. package/dist/runtime/channels/local-spot-route-transport.js +2 -1
  105. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +2 -2
  106. package/dist/runtime/channels/router-socket-spot-route-transport.js +4 -4
  107. package/dist/runtime/channels/source-spot-router.d.ts +2 -2
  108. package/dist/runtime/channels/source-spot-router.js +4 -4
  109. package/dist/runtime/channels/spot-node-route-transport.d.ts +2 -2
  110. package/dist/runtime/channels/spot-node-route-transport.js +4 -4
  111. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +2 -2
  112. package/dist/runtime/channels/spot-route-bridge-transport.js +4 -4
  113. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +5 -4
  114. package/dist/runtime/channels/spot-route-dispatch-strategy.js +18 -18
  115. package/dist/runtime/diagnostics/flow-context.js +19 -7
  116. package/dist/runtime/diagnostics/index.js +4 -9
  117. package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
  118. package/dist/runtime/diagnostics/message-flow.js +35 -5
  119. package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
  120. package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
  121. package/dist/runtime/execution/index.d.ts +4 -2
  122. package/dist/runtime/execution/index.js +33 -10
  123. package/dist/runtime/execution/serial-execution-queue.d.ts +5 -0
  124. package/dist/runtime/execution/serial-execution-queue.js +22 -2
  125. package/dist/runtime/execution/state-lane.d.ts +2 -0
  126. package/dist/runtime/execution/state-lane.js +5 -0
  127. package/dist/runtime/foundation/actor-join-recovery-codec.js +2 -2
  128. package/dist/runtime/foundation/durable-service-request.d.ts +14 -0
  129. package/dist/runtime/foundation/durable-service-request.js +98 -0
  130. package/dist/runtime/foundation/operation-identity.d.ts +1 -0
  131. package/dist/runtime/foundation/operation-identity.js +5 -1
  132. package/dist/runtime/foundation/operation-registry.d.ts +25 -1
  133. package/dist/runtime/foundation/operation-registry.js +86 -18
  134. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +61 -8
  135. package/dist/runtime/foundation/raw-service-mesh-runtime.js +486 -266
  136. package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
  137. package/dist/runtime/foundation/service-liveness-registry.js +38 -0
  138. package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
  139. package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
  140. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +3 -3
  141. package/dist/runtime/foundation/service-relocation-object-owner.js +48 -34
  142. package/dist/runtime/foundation/service-relocation-runtime.d.ts +2 -0
  143. package/dist/runtime/foundation/service-relocation-runtime.js +20 -4
  144. package/dist/runtime/foundation/service-runtime-contracts.d.ts +10 -1
  145. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
  146. package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
  147. package/dist/runtime/foundation/service-stateful-registry.js +24 -26
  148. package/dist/runtime/foundation/service-stateful-runtime.d.ts +75 -9
  149. package/dist/runtime/foundation/service-stateful-runtime.js +486 -218
  150. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -6
  151. package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
  152. package/dist/runtime/foundation/service-topology-registry.d.ts +12 -2
  153. package/dist/runtime/foundation/service-topology-registry.js +61 -27
  154. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
  155. package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
  156. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  157. package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
  158. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +13 -3
  159. package/dist/runtime/foundation/service-wire-m6a-codec.js +189 -78
  160. package/dist/runtime/handlers/handler-instance-scope.d.ts +8 -0
  161. package/dist/runtime/handlers/handler-instance-scope.js +54 -11
  162. package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
  163. package/dist/runtime/host/actor-packet-relay.js +59 -72
  164. package/dist/runtime/host/actor-placement-coordinator.js +25 -8
  165. package/dist/runtime/host/actor-runtime-options-factory.js +2 -2
  166. package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
  167. package/dist/runtime/host/actor-transfer-runtime.js +85 -331
  168. package/dist/runtime/host/application-job-queue.d.ts +40 -7
  169. package/dist/runtime/host/application-job-queue.js +137 -42
  170. package/dist/runtime/host/entry-actor-runtime.d.ts +1 -0
  171. package/dist/runtime/host/entry-actor-runtime.js +3 -0
  172. package/dist/runtime/host/index.d.ts +12 -2
  173. package/dist/runtime/host/index.js +300 -202
  174. package/dist/runtime/host/location-runtime-owner.js +2 -6
  175. package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
  176. package/dist/runtime/host/mesh-router-resolver.js +14 -6
  177. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
  178. package/dist/runtime/host/remote-bound-session-relay.js +73 -208
  179. package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
  180. package/dist/runtime/host/route-mesh-runtime.js +6 -4
  181. package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
  182. package/dist/runtime/host/runtime-shutdown.js +3 -2
  183. package/dist/runtime/host/service-relocation-control.d.ts +1 -0
  184. package/dist/runtime/host/service-relocation-control.js +10 -4
  185. package/dist/runtime/host/service-relocation-host-runtime.d.ts +22 -14
  186. package/dist/runtime/host/service-relocation-host-runtime.js +754 -599
  187. package/dist/runtime/host/spot-address-transport.js +3 -2
  188. package/dist/runtime/host/spot-runtime-options-factory.js +16 -7
  189. package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
  190. package/dist/runtime/locations/actor-location-claims.d.ts +2 -2
  191. package/dist/runtime/locations/actor-location-claims.js +34 -19
  192. package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
  193. package/dist/runtime/locations/auto-connect-loop.js +22 -14
  194. package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
  195. package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
  196. package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
  197. package/dist/runtime/locations/descriptor-publication.js +11 -0
  198. package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
  199. package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
  200. package/dist/runtime/locations/in-memory-authority-store.js +56 -19
  201. package/dist/runtime/locations/in-memory-location-store.js +1 -10
  202. package/dist/runtime/locations/index.d.ts +1 -0
  203. package/dist/runtime/locations/index.js +1 -0
  204. package/dist/runtime/locations/lease-tracker.js +1 -6
  205. package/dist/runtime/locations/lifecycle.d.ts +1 -2
  206. package/dist/runtime/locations/lifecycle.js +2 -5
  207. package/dist/runtime/locations/location-store-repository.d.ts +51 -1
  208. package/dist/runtime/locations/location-store-repository.js +363 -139
  209. package/dist/runtime/locations/relocation-blob.d.ts +18 -1
  210. package/dist/runtime/locations/relocation-blob.js +52 -1
  211. package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
  212. package/dist/runtime/locations/request-source-resolver.js +80 -0
  213. package/dist/runtime/locations/resolvers.js +1 -1
  214. package/dist/runtime/locations/runtime.d.ts +7 -3
  215. package/dist/runtime/locations/runtime.js +61 -53
  216. package/dist/runtime/messaging/framework-json-v1.d.ts +4 -6
  217. package/dist/runtime/messaging/framework-json-v1.js +38 -294
  218. package/dist/runtime/messaging/packet-name.d.ts +1 -1
  219. package/dist/runtime/messaging/packet-name.js +8 -24
  220. package/dist/runtime/messaging/payload-codec.d.ts +7 -1
  221. package/dist/runtime/messaging/payload-codec.js +7 -6
  222. package/dist/runtime/messaging/request-result.d.ts +2 -0
  223. package/dist/runtime/messaging/request-result.js +57 -0
  224. package/dist/runtime/messaging/submission-result.d.ts +1 -0
  225. package/dist/runtime/messaging/submission-result.js +5 -2
  226. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +34 -1
  227. package/dist/runtime/protocol/service_wire_codec.generated.js +229 -0
  228. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +16 -1
  229. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +37 -8
  230. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +7 -2
  231. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +36 -21
  232. package/dist/runtime/spots/index.d.ts +21 -11
  233. package/dist/runtime/spots/index.js +243 -178
  234. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
  235. package/dist/runtime/spots/spot-activation-registry.js +21 -11
  236. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  237. package/dist/runtime/spots/spot-activation-state.js +7 -7
  238. package/dist/runtime/spots/spot-activation.d.ts +7 -3
  239. package/dist/runtime/spots/spot-activation.js +140 -52
  240. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
  241. package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
  242. package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
  243. package/dist/runtime/spots/spot-actor-membership.js +0 -8
  244. package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
  245. package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
  246. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
  247. package/dist/runtime/spots/spot-entry-activation.js +20 -11
  248. package/dist/runtime/spots/spot-handler-registry.d.ts +7 -4
  249. package/dist/runtime/spots/spot-handler-registry.js +24 -10
  250. package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
  251. package/dist/runtime/spots/spot-manager-public.js +2 -2
  252. package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
  253. package/dist/runtime/spots/spot-node-autoconnect.js +22 -42
  254. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
  255. package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
  256. package/dist/runtime/spots/spot-outbound.d.ts +3 -0
  257. package/dist/runtime/spots/spot-outbound.js +27 -18
  258. package/dist/runtime/spots/spot-remote-codec.js +5 -1
  259. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +1 -0
  260. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +1 -1
  261. package/dist/runtime/spots/spot-runtime-ports.d.ts +1 -1
  262. package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
  263. package/dist/runtime/spots/spot-serial-executor.js +61 -8
  264. package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
  265. package/dist/runtime/spots/spot-subscription-dispatch.js +1 -4
  266. package/dist/runtime/spots/spot-timer.d.ts +57 -5
  267. package/dist/runtime/spots/spot-timer.js +288 -103
  268. package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
  269. package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
  270. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
  271. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
  272. package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
  273. package/dist/runtime/streams/bound-session-service.d.ts +1 -1
  274. package/dist/runtime/streams/bound-session-service.js +6 -11
  275. package/dist/runtime/streams/index.d.ts +3 -2
  276. package/dist/runtime/streams/index.js +6 -4
  277. package/dist/runtime/streams/managed-stream.js +3 -2
  278. package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
  279. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
  280. package/dist/runtime/streams/session-actor-coordinator.js +15 -32
  281. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
  282. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -1
  283. package/dist/runtime/streams/stream-session-runtime.js +14 -31
  284. package/dist/runtime/workers/index.js +1 -1
  285. package/package.json +3 -3
  286. package/src/contracts/Actors/ZLinkActorClient.ts +2 -1
  287. package/src/contracts/Channels/Calls.ts +2 -1
  288. package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
  289. package/src/contracts/Common/ZLinkMessageMetadata.ts +13 -8
  290. package/src/contracts/Common/encoded-payload-storage.ts +6 -3
  291. package/src/contracts/Configuration/Builders.ts +4 -1
  292. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
  293. package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
  294. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  295. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
  296. package/src/contracts/Handlers/Attributes.ts +14 -21
  297. package/src/contracts/Handlers/JsonContract.ts +8 -216
  298. package/src/contracts/Locations/Rows.ts +2 -0
  299. package/src/contracts/Spots/Contracts.ts +10 -1
  300. package/src/contracts/Spots/ZLinkSpot.ts +3 -3
  301. package/src/nest-integration.ts +1 -0
  302. package/src/runtime/abort.ts +12 -0
  303. package/src/runtime/actors/actor-authority-publication.ts +3 -2
  304. package/src/runtime/actors/actor-client.ts +100 -85
  305. package/src/runtime/actors/actor-context.ts +49 -9
  306. package/src/runtime/actors/actor-handoff.ts +291 -110
  307. package/src/runtime/actors/actor-join-relocation.ts +3 -0
  308. package/src/runtime/actors/actor-local-native-join.ts +21 -26
  309. package/src/runtime/actors/actor-mailbox.ts +40 -2
  310. package/src/runtime/actors/actor-remote-joiner.ts +6 -1
  311. package/src/runtime/actors/actor-remote-wire.ts +17 -0
  312. package/src/runtime/actors/actor-reply.ts +42 -0
  313. package/src/runtime/actors/actor-routed-join-transport.ts +14 -4
  314. package/src/runtime/actors/actor-routed-json-request.ts +10 -2
  315. package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
  316. package/src/runtime/actors/actor-runtime-state.ts +2 -20
  317. package/src/runtime/actors/actor-source-transfer.ts +1 -34
  318. package/src/runtime/actors/index.ts +60 -32
  319. package/src/runtime/actors/session-disconnected-wire.ts +66 -0
  320. package/src/runtime/actors/spot-actor-dispatch.ts +4 -2
  321. package/src/runtime/admission.ts +69 -21
  322. package/src/runtime/application-jobs/application-ingress-record-owner.ts +41 -25
  323. package/src/runtime/application-jobs/application-job-queue-scope.ts +83 -22
  324. package/src/runtime/application-jobs/contracts.ts +16 -1
  325. package/src/runtime/backend/contracts/index.ts +92 -18
  326. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
  327. package/src/runtime/backend/mesh-completion-table.ts +160 -57
  328. package/src/runtime/backend/mesh-dispatch-pump.ts +237 -108
  329. package/src/runtime/backend/node/node-backend-adapter-support.ts +17 -8
  330. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +12 -2
  331. package/src/runtime/backend/node/node-raw-binding-port.ts +148 -85
  332. package/src/runtime/backend/node/node-raw-mesh-backend.ts +315 -201
  333. package/src/runtime/backend/node/node-socket-backend-adapter.ts +26 -11
  334. package/src/runtime/backend/raw-binding-port.ts +7 -2
  335. package/src/runtime/backend/runtime-message.ts +6 -0
  336. package/src/runtime/backend/runtime-values.ts +1 -0
  337. package/src/runtime/channels/channel-clients.ts +132 -58
  338. package/src/runtime/channels/channel-dispatch-pipeline.ts +198 -114
  339. package/src/runtime/channels/channel-dispatch-services.ts +69 -1
  340. package/src/runtime/channels/channel-dispatchers.ts +136 -90
  341. package/src/runtime/channels/channel-envelope-inspection.ts +2 -16
  342. package/src/runtime/channels/channel-envelope.ts +225 -31
  343. package/src/runtime/channels/channel-outbound-operations.ts +22 -8
  344. package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
  345. package/src/runtime/channels/channel-runtime-manager.ts +41 -17
  346. package/src/runtime/channels/channel-transports.ts +171 -112
  347. package/src/runtime/channels/client-server-location-runtime.ts +11 -10
  348. package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
  349. package/src/runtime/channels/fanout-location-runtime.ts +17 -9
  350. package/src/runtime/channels/local-spot-route-transport.ts +3 -1
  351. package/src/runtime/channels/router-socket-spot-route-transport.ts +13 -4
  352. package/src/runtime/channels/source-spot-router.ts +8 -4
  353. package/src/runtime/channels/spot-node-route-transport.ts +8 -4
  354. package/src/runtime/channels/spot-route-bridge-transport.ts +6 -4
  355. package/src/runtime/channels/spot-route-dispatch-strategy.ts +47 -18
  356. package/src/runtime/diagnostics/flow-context.ts +20 -7
  357. package/src/runtime/diagnostics/index.ts +1 -7
  358. package/src/runtime/diagnostics/message-flow.ts +47 -9
  359. package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
  360. package/src/runtime/execution/index.ts +40 -14
  361. package/src/runtime/execution/serial-execution-queue.ts +33 -4
  362. package/src/runtime/execution/state-lane.ts +7 -0
  363. package/src/runtime/foundation/actor-join-recovery-codec.ts +2 -2
  364. package/src/runtime/foundation/durable-service-request.ts +137 -0
  365. package/src/runtime/foundation/operation-identity.ts +5 -1
  366. package/src/runtime/foundation/operation-registry.ts +98 -20
  367. package/src/runtime/foundation/raw-service-mesh-runtime.ts +704 -336
  368. package/src/runtime/foundation/service-liveness-registry.ts +39 -0
  369. package/src/runtime/foundation/service-mailbox.ts +8 -0
  370. package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
  371. package/src/runtime/foundation/service-relocation-object-owner.ts +55 -36
  372. package/src/runtime/foundation/service-relocation-runtime.ts +25 -4
  373. package/src/runtime/foundation/service-runtime-contracts.ts +19 -2
  374. package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
  375. package/src/runtime/foundation/service-stateful-registry.ts +38 -35
  376. package/src/runtime/foundation/service-stateful-runtime.ts +732 -275
  377. package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -16
  378. package/src/runtime/foundation/service-topology-registry.ts +91 -36
  379. package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
  380. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  381. package/src/runtime/foundation/service-wire-m6a-codec.ts +231 -76
  382. package/src/runtime/handlers/handler-instance-scope.ts +67 -16
  383. package/src/runtime/host/actor-packet-relay.ts +113 -94
  384. package/src/runtime/host/actor-placement-coordinator.ts +31 -8
  385. package/src/runtime/host/actor-runtime-options-factory.ts +13 -2
  386. package/src/runtime/host/actor-transfer-runtime.ts +104 -430
  387. package/src/runtime/host/application-job-queue.ts +160 -41
  388. package/src/runtime/host/entry-actor-runtime.ts +4 -0
  389. package/src/runtime/host/index.ts +473 -271
  390. package/src/runtime/host/location-runtime-owner.ts +2 -6
  391. package/src/runtime/host/mesh-router-resolver.ts +13 -5
  392. package/src/runtime/host/remote-bound-session-relay.ts +88 -271
  393. package/src/runtime/host/route-mesh-runtime.ts +12 -6
  394. package/src/runtime/host/runtime-shutdown.ts +15 -4
  395. package/src/runtime/host/service-relocation-control.ts +11 -5
  396. package/src/runtime/host/service-relocation-host-runtime.ts +1092 -759
  397. package/src/runtime/host/spot-address-transport.ts +4 -2
  398. package/src/runtime/host/spot-runtime-options-factory.ts +20 -7
  399. package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
  400. package/src/runtime/locations/actor-location-claims.ts +52 -30
  401. package/src/runtime/locations/auto-connect-loop.ts +22 -14
  402. package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
  403. package/src/runtime/locations/auto-connect-types.ts +0 -1
  404. package/src/runtime/locations/descriptor-publication.ts +7 -0
  405. package/src/runtime/locations/domain-store-contract.ts +5 -0
  406. package/src/runtime/locations/in-memory-authority-store.ts +85 -23
  407. package/src/runtime/locations/in-memory-location-store.ts +1 -12
  408. package/src/runtime/locations/index.ts +1 -0
  409. package/src/runtime/locations/lease-tracker.ts +2 -9
  410. package/src/runtime/locations/lifecycle.ts +8 -26
  411. package/src/runtime/locations/location-store-repository.ts +628 -152
  412. package/src/runtime/locations/relocation-blob.ts +75 -1
  413. package/src/runtime/locations/request-source-resolver.ts +138 -0
  414. package/src/runtime/locations/resolvers.ts +2 -2
  415. package/src/runtime/locations/runtime.ts +98 -64
  416. package/src/runtime/messaging/framework-json-v1.ts +5 -325
  417. package/src/runtime/messaging/packet-name.ts +5 -25
  418. package/src/runtime/messaging/payload-codec.ts +8 -11
  419. package/src/runtime/messaging/request-result.ts +62 -0
  420. package/src/runtime/messaging/submission-result.ts +5 -1
  421. package/src/runtime/protocol/service_wire_codec.generated.ts +218 -5
  422. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +16 -13
  423. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +46 -25
  424. package/src/runtime/spots/index.ts +389 -283
  425. package/src/runtime/spots/spot-activation-registry.ts +25 -13
  426. package/src/runtime/spots/spot-activation-state.ts +12 -19
  427. package/src/runtime/spots/spot-activation.ts +198 -96
  428. package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
  429. package/src/runtime/spots/spot-actor-membership.ts +0 -15
  430. package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
  431. package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
  432. package/src/runtime/spots/spot-entry-activation.ts +33 -21
  433. package/src/runtime/spots/spot-handler-registry.ts +56 -12
  434. package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
  435. package/src/runtime/spots/spot-manager-public.ts +2 -2
  436. package/src/runtime/spots/spot-node-autoconnect.ts +28 -47
  437. package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
  438. package/src/runtime/spots/spot-outbound.ts +39 -19
  439. package/src/runtime/spots/spot-remote-codec.ts +9 -2
  440. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +2 -1
  441. package/src/runtime/spots/spot-runtime-ports.ts +1 -1
  442. package/src/runtime/spots/spot-serial-executor.ts +97 -25
  443. package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
  444. package/src/runtime/spots/spot-subscription-dispatch.ts +1 -4
  445. package/src/runtime/spots/spot-timer.ts +418 -158
  446. package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
  447. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
  448. package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
  449. package/src/runtime/streams/bound-session-service.ts +7 -10
  450. package/src/runtime/streams/index.ts +12 -6
  451. package/src/runtime/streams/managed-stream.ts +4 -2
  452. package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
  453. package/src/runtime/streams/session-actor-coordinator.ts +39 -88
  454. package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
  455. package/src/runtime/streams/stream-session-runtime.ts +13 -34
  456. package/src/runtime/workers/index.ts +1 -1
@@ -1,3 +1,4 @@
1
+ import { routingIdsEqual } from '../routing-id';
1
2
  import { ZLINK_DEFAULT_PUBLIC_WEIGHT } from '../../contracts/Configuration/RegistrationBuilderPolicy';
2
3
  import type { ZLinkLocationOptionOverrides } from '../../contracts/Locations/Options';
3
4
  import type { ZLinkPeerLocationFilter } from '../../contracts/Locations/Keys';
@@ -8,13 +9,13 @@ import { ZLinkLocationAutoConnectType } from '../../contracts/Locations/Values';
8
9
  import { ZLinkFrameworkRuntimeState, ZLinkLocationRole } from '../../contracts';
9
10
  import type { ZLinkSpotNodeOptions } from '../configuration';
10
11
  import type { ZLinkBackendMeshNode } from '../backend/contracts';
11
- import { AsyncResource } from 'node:async_hooks';
12
- import { ZLinkStateLane } from '../execution/state-lane';
12
+ import { startOutsideStateLane, ZLinkStateLane } from '../execution/state-lane';
13
13
  import { toBackendRoutingId as toBackendRoutingId } from '../routing-id';
14
14
  import { MeshPeerRuntimeState } from '../foundation/service-runtime-contracts';
15
15
  import {
16
16
  ZLinkLocationRuntime,
17
17
  ZLinkOwnerLeaseTracker,
18
+ ZLinkRequestSourceResolver,
18
19
  type IZLinkAutoConnectExecutor,
19
20
  type ZLinkAutoConnectLocal,
20
21
  type ZLinkAutoConnectTarget,
@@ -28,6 +29,7 @@ export interface ZLinkSpotNodeLocationAutoConnectContext {
28
29
  readonly options: ZLinkLocationOptionOverrides;
29
30
  readonly leaseTracker: ZLinkOwnerLeaseTracker;
30
31
  readonly resolver: ZLinkPeerLocationResolver;
32
+ readonly requestSources: ZLinkRequestSourceResolver;
31
33
  readonly events?: ZLinkLocationEventSink;
32
34
  readonly changeStampStore?: Pick<ZLinkLocationStore, 'getMeshNodeChangeStamp'>;
33
35
  }
@@ -48,12 +50,17 @@ export function createSpotNodeLocationAutoConnectContext(
48
50
  store: stores.ownerLeaseStore,
49
51
  options
50
52
  });
53
+ const requestSources = new ZLinkRequestSourceResolver({
54
+ listLiveMeshNodes: (meshName, signal) => runtime.listLiveMeshNodes(meshName, signal),
55
+ remainingOwnerTokenLeaseMs: (owner, signal) => runtime.remainingOwnerTokenLeaseMs(owner, signal)
56
+ });
51
57
  return {
52
58
  runtime,
53
59
  stores,
54
60
  options,
55
61
  leaseTracker,
56
- resolver: meshDescriptorPeerResolver(runtime),
62
+ resolver: meshDescriptorPeerResolver(runtime, requestSources),
63
+ requestSources,
57
64
  events,
58
65
  // The opaque provider has no cross-process change notification primitive.
59
66
  // A process-local inherited stamp would hide descriptors written by peers,
@@ -86,14 +93,16 @@ export function spotNodeAutoConnectCapability(
86
93
  (channel) => channel.server === true
87
94
  )
88
95
  };
89
- const manualConnections = hasManualRouterConnections(spotNode);
90
96
  return {
91
97
  local,
92
- executor: new ZLinkSpotNodeAutoConnectExecutor(node, manualConnections)
98
+ executor: new ZLinkSpotNodeAutoConnectExecutor(node)
93
99
  };
94
100
  }
95
101
 
96
- function meshDescriptorPeerResolver(runtime: ZLinkLocationRuntime): ZLinkPeerLocationResolver {
102
+ function meshDescriptorPeerResolver(
103
+ runtime: ZLinkLocationRuntime,
104
+ requestSources: ZLinkRequestSourceResolver
105
+ ): ZLinkPeerLocationResolver {
97
106
  return {
98
107
  async listLivePeers(
99
108
  filter: ZLinkPeerLocationFilter,
@@ -108,6 +117,8 @@ function meshDescriptorPeerResolver(runtime: ZLinkLocationRuntime): ZLinkPeerLoc
108
117
  return [];
109
118
  }
110
119
  const descriptors = await runtime.listLiveMeshNodes(filter.meshName, signal);
120
+ // The auto-connect poll owns the live descriptors; request acceptance reads them.
121
+ await requestSources.observeLiveDescriptors(filter.meshName, descriptors, signal);
111
122
  return descriptors
112
123
  .map((descriptor): ZLinkPeerLocation => ({
113
124
  autoConnectType: ZLinkLocationAutoConnectType.RouteMesh,
@@ -130,22 +141,13 @@ function meshDescriptorPeerResolver(runtime: ZLinkLocationRuntime): ZLinkPeerLoc
130
141
  }))
131
142
  .filter(
132
143
  (peer) =>
133
- (filter.nodeRid === undefined || String(peer.nodeRid) === String(filter.nodeRid)) &&
144
+ (filter.nodeRid === undefined || routingIdsEqual(peer.nodeRid, filter.nodeRid)) &&
134
145
  (filter.endpoint === undefined || peer.endpoint === filter.endpoint)
135
146
  );
136
147
  }
137
148
  };
138
149
  }
139
150
 
140
- function hasManualRouterConnections(spotNode: ZLinkSpotNodeOptions): boolean {
141
- return (
142
- (spotNode.router?.manualConnections?.length ?? 0) > 0 ||
143
- (spotNode.router?.manualPeerConnections?.length ?? 0) > 0
144
- );
145
- }
146
-
147
- const detachedSpotNodeAutoConnectResource = new AsyncResource('zlink:spot-node-autoconnect');
148
-
149
151
  interface ZLinkSpotNodeConnectionIntent {
150
152
  connectionIntentId?: bigint;
151
153
  }
@@ -154,46 +156,29 @@ class ZLinkSpotNodeAutoConnectExecutor implements IZLinkAutoConnectExecutor {
154
156
  private readonly lane = new ZLinkStateLane();
155
157
  private readonly connectionIntents = new Map<string, ZLinkSpotNodeConnectionIntent>();
156
158
 
157
- constructor(
158
- private readonly node: ZLinkBackendMeshNode,
159
- private readonly manualConnections: boolean
160
- ) {}
159
+ constructor(private readonly node: ZLinkBackendMeshNode) {}
161
160
 
162
161
  onDisconnected(handler: (endpoint: string) => void): void {
163
162
  this.node.onPeerDisconnected?.(handler);
164
163
  }
165
164
 
166
165
  async connect(target: ZLinkAutoConnectTarget): Promise<boolean> {
167
- if (this.manualConnections) return false;
168
166
  const key = connectionKey(target);
167
+ if (
168
+ !this.connectionIntents.has(key) &&
169
+ this.node.hasPeerRouteOrConnectionIntent?.(target.nodeRid, target.endpoint) === true
170
+ )
171
+ return false;
169
172
  const intent = await this.lane.run(() => this.prepareConnectCore(key));
170
173
  if (intent === undefined) return true;
171
- return await runDetachedSpotNodeAutoConnect(() => this.connectPeer(target, key, intent));
174
+ return await startOutsideStateLane(() => this.connectPeer(target, key, intent));
172
175
  }
173
176
 
174
177
  disconnect(target: ZLinkAutoConnectTarget): void {
175
- if (this.manualConnections) return;
178
+ if (!this.connectionIntents.has(connectionKey(target))) return;
176
179
  this.disconnectPeer(target);
177
180
  }
178
181
 
179
- disconnectStalePeers(targets: readonly ZLinkAutoConnectTarget[]): void {
180
- if (this.manualConnections) return;
181
- const current = new Map(
182
- targets
183
- .filter((target) => target.nodeRid !== undefined)
184
- .map((target) => [String(target.nodeRid), target])
185
- );
186
- const peers = this.node.peers();
187
- for (const peer of peers) {
188
- if (peer.routingId === null) continue;
189
- const target = current.get(String(peer.routingId));
190
- if (target !== undefined && peer.endpoint === target.endpoint) {
191
- continue;
192
- }
193
- this.node.disconnectPeer(peer.routingId, peer.lifecycleGeneration);
194
- }
195
- }
196
-
197
182
  isDisconnected(target: ZLinkAutoConnectTarget): boolean {
198
183
  // A connect intent still owns transport state even when its peer has not
199
184
  // reached the admitted table yet. Shutdown must remove that intent before
@@ -205,7 +190,7 @@ class ZLinkSpotNodeAutoConnectExecutor implements IZLinkAutoConnectExecutor {
205
190
  (peer) =>
206
191
  peer.routingId !== null &&
207
192
  peer.endpoint === target.endpoint &&
208
- (target.nodeRid === undefined || String(peer.routingId) === String(target.nodeRid)) &&
193
+ (target.nodeRid === undefined || routingIdsEqual(peer.routingId, target.nodeRid)) &&
209
194
  peer.lifecycleGeneration === target.lifecycleGeneration &&
210
195
  peer.state === MeshPeerRuntimeState.Serving
211
196
  );
@@ -287,7 +272,7 @@ class ZLinkSpotNodeAutoConnectExecutor implements IZLinkAutoConnectExecutor {
287
272
  if (peer.endpoint !== target.endpoint) {
288
273
  continue;
289
274
  }
290
- if (target.nodeRid !== undefined && String(peer.routingId) !== String(target.nodeRid)) {
275
+ if (target.nodeRid !== undefined && !routingIdsEqual(peer.routingId, target.nodeRid)) {
291
276
  continue;
292
277
  }
293
278
  this.node.disconnectPeer(peer.routingId, peer.lifecycleGeneration);
@@ -295,10 +280,6 @@ class ZLinkSpotNodeAutoConnectExecutor implements IZLinkAutoConnectExecutor {
295
280
  }
296
281
  }
297
282
 
298
- function runDetachedSpotNodeAutoConnect<T>(work: () => Promise<T>): Promise<T> {
299
- return detachedSpotNodeAutoConnectResource.runInAsyncScope(work);
300
- }
301
-
302
283
  function connectionKey(target: ZLinkAutoConnectTarget): string {
303
284
  return `${target.nodeRid ?? ''}\0${target.lifecycleGeneration}\0${target.endpoint}`;
304
285
  }
@@ -1,3 +1,4 @@
1
+ import type { ZLinkMeshDispatchAdmission } from '../admission';
1
2
  import type { ApplicationJobOrigin } from '../application-jobs/contracts';
2
3
  import { RuntimeDisposal } from '../disposal';
3
4
  import { randomUUID } from 'node:crypto';
@@ -34,7 +35,7 @@ import {
34
35
  import { ZLinkLocationWriteIntent, ZLinkLocationWriteStatus } from '../../contracts/Locations';
35
36
  import type { ZLinkLocationOptionOverrides } from '../../contracts/Locations/Options';
36
37
  import type { ZLinkLocationOwnerToken } from '../../contracts/Locations/Writes';
37
- import { createAbortError } from '../abort';
38
+ import { awaitWithAbort, createAbortError } from '../abort';
38
39
  import type { ZLinkActivationConcurrency } from '../activation-admission';
39
40
  import type { ZLinkRemoteBoundSessionTarget } from '../actors';
40
41
  import type { ZLinkActorHandoffPacket } from '../actors/actor-handoff';
@@ -205,6 +206,12 @@ export class ZLinkSpotNodeRuntimeManager {
205
206
  );
206
207
  }
207
208
 
209
+ async requestPeerReconcile(meshName: string, peerRid: string): Promise<void> {
210
+ await Promise.all(
211
+ this.autoConnectLoops.map((loop) => loop.requestPeerReconcile(meshName, peerRid))
212
+ );
213
+ }
214
+
208
215
  async startLocationAutoConnect(signal?: AbortSignal): Promise<void> {
209
216
  const location = this.locationAutoConnect;
210
217
  if (location === undefined || this.autoConnectLoops.length > 0) {
@@ -218,6 +225,16 @@ export class ZLinkSpotNodeRuntimeManager {
218
225
  }
219
226
  const capability = spotNodeAutoConnectCapability(spotNodeName, spotNode, node);
220
227
  if (capability === undefined) continue;
228
+ node.setRequestSourceAcceptance?.(
229
+ (nodeRid, nodeGeneration, nodeRidStorageHex, sourceSignal) =>
230
+ location.requestSources.accept(
231
+ capability.local.meshName,
232
+ nodeRid,
233
+ nodeGeneration,
234
+ nodeRidStorageHex,
235
+ sourceSignal
236
+ )
237
+ );
221
238
  const reconciler = new ZLinkAutoConnectReconciler({
222
239
  local: capability.local,
223
240
  localRow: capability.localRow,
@@ -292,6 +309,24 @@ export class ZLinkSpotNodeRuntimeManager {
292
309
  if (this.options.dispatchErrors !== undefined) {
293
310
  node.setDispatchErrorReporter?.(this.options.dispatchErrors, spotNodeName);
294
311
  }
312
+ // Session-Actor binding §4: the Session owner identity comes from the
313
+ // host's own descriptor or from a peer descriptor that passed the
314
+ // Location runtime §4.1 owner lease check.
315
+ node.setSessionOwnerDescriptors?.({
316
+ local: () => this.locationAutoConnect?.runtime.currentOwnerToken,
317
+ peer: async (peerRid, peerGeneration) => {
318
+ const location = this.locationAutoConnect;
319
+ if (location === undefined) return undefined;
320
+ const descriptor = (await location.runtime.listLiveMeshNodes(spotNodeName)).find(
321
+ (candidate) =>
322
+ routingIdsEqual(candidate.rid, peerRid) &&
323
+ candidate.lifecycleGeneration === peerGeneration
324
+ );
325
+ return descriptor === undefined
326
+ ? undefined
327
+ : { ownerId: descriptor.ownerId, leaseGeneration: descriptor.leaseGeneration };
328
+ }
329
+ });
295
330
  node.setMailboxRecordDroppedHandler?.((record) =>
296
331
  this.options.dispatchErrors?.report({
297
332
  surface: ZLinkDispatchErrorSurface.RouteMeshChannel,
@@ -412,7 +447,7 @@ export class ZLinkSpotNodeRuntimeManager {
412
447
  this.meshNodes.delete(spotNodeName);
413
448
  completions.dispose(error);
414
449
  await pump?.dispose();
415
- node.close();
450
+ await node.close();
416
451
  throw error;
417
452
  }
418
453
  }
@@ -447,9 +482,8 @@ export class ZLinkSpotNodeRuntimeManager {
447
482
  const ownerChanged =
448
483
  this.publishedOwnerToken !== undefined && !sameOwnerToken(this.publishedOwnerToken, owner);
449
484
  if (ownerChanged) {
450
- // A new owner token can refer to an empty or replaced Store. The cached
451
- // descriptor was written under the previous lease and must not force a
452
- // Renew against a row that no longer exists.
485
+ // A descriptor confirmed under the previous lease must not supply
486
+ // cached population data for a new owner token.
453
487
  this.publishedMeshNodeDescriptors.clear();
454
488
  }
455
489
  for (const [meshName, registration] of this.options.registration.spotNodes) {
@@ -467,7 +501,14 @@ export class ZLinkSpotNodeRuntimeManager {
467
501
  ...instanceSpots.map(([stableType, factory]) =>
468
502
  objectCapability('instance_spot', stableType, factory)
469
503
  ),
470
- ...actors.map(([stableType, factory]) => objectCapability('actor', stableType, factory))
504
+ ...actors.map(([stableType, factory]) =>
505
+ objectCapability(
506
+ 'actor',
507
+ stableType,
508
+ factory,
509
+ registrationAcceptsNewActor(registration, stableType)
510
+ )
511
+ )
471
512
  ].sort((left, right) => {
472
513
  const kindOrder = left.objectKind.localeCompare(right.objectKind);
473
514
  return kindOrder !== 0 ? kindOrder : left.stableType.localeCompare(right.stableType);
@@ -482,9 +523,8 @@ export class ZLinkSpotNodeRuntimeManager {
482
523
  // The raw MeshNode resolves port zero and applies AdvertiseHost once.
483
524
  // Discovery and RouteMesh hello must publish that same public identity.
484
525
  endpoint: status.localEndpoint,
485
- objectRole: effectiveObjectRole(registration),
526
+ ...this.localDescriptorFields(meshName, registration, state),
486
527
  entrySpotId: this.entrySpotId(meshName, registration),
487
- placementWeight: this.placementWeight(meshName),
488
528
  populationCapacity: {
489
529
  actors: {
490
530
  active: current?.populationCapacity.actors.active ?? 0,
@@ -517,19 +557,6 @@ export class ZLinkSpotNodeRuntimeManager {
517
557
  active: 0,
518
558
  limit: registration.activationConcurrencyLimit ?? DEFAULT_ACTIVATION_CONCURRENCY_LIMIT
519
559
  },
520
- channelWeights: Object.fromEntries(
521
- this.serverChannels(meshName).map(([channelName, channel]) => [
522
- channelName,
523
- state === ZLinkFrameworkRuntimeState.Draining
524
- ? 0
525
- : this.effectiveChannelWeight(
526
- meshName,
527
- channelName,
528
- channel.weight ?? ZLINK_DEFAULT_PUBLIC_WEIGHT
529
- )
530
- ])
531
- ),
532
- applicationVersion: this.options.registration.applicationVersion,
533
560
  maintenanceWave: this.options.registration.maintenanceWave,
534
561
  spotTypes: [
535
562
  ...userSpots.map(([stableType]) => stableType),
@@ -540,13 +567,14 @@ export class ZLinkSpotNodeRuntimeManager {
540
567
  state,
541
568
  securityIdentity: 'default'
542
569
  };
570
+ // Revision is issued before submission: an unconfirmed Store write may
571
+ // already have applied, so the next publication must not reuse it.
572
+ this.descriptorRevisionByMesh.set(meshName, descriptor.descriptorRevision);
543
573
  const result = await location.runtime.writeMeshNode(
544
574
  descriptor,
545
- ownerChanged
546
- ? ZLinkLocationWriteIntent.Renew
547
- : current === undefined
548
- ? ZLinkLocationWriteIntent.NewClaim
549
- : ZLinkLocationWriteIntent.Renew,
575
+ previousRevision === 0n
576
+ ? ZLinkLocationWriteIntent.NewClaim
577
+ : ZLinkLocationWriteIntent.Renew,
550
578
  signal
551
579
  );
552
580
  if (result.status !== ZLinkLocationWriteStatus.Stored) {
@@ -560,11 +588,37 @@ export class ZLinkSpotNodeRuntimeManager {
560
588
  leaseGeneration: location.runtime.currentOwnerToken!.leaseGeneration,
561
589
  updatedAt: result.updatedAt
562
590
  });
563
- this.descriptorRevisionByMesh.set(meshName, descriptor.descriptorRevision);
564
591
  }
565
592
  this.publishedOwnerToken = owner;
566
593
  }
567
594
 
595
+ private localDescriptorFields(
596
+ meshName: string,
597
+ registration: ZLinkSpotNodeOptions,
598
+ state: ZLinkFrameworkRuntimeState
599
+ ): Pick<
600
+ ZLinkMeshNodeDescriptor,
601
+ 'objectRole' | 'placementWeight' | 'channelWeights' | 'applicationVersion'
602
+ > {
603
+ return {
604
+ objectRole: effectiveObjectRole(registration),
605
+ placementWeight: this.placementWeight(meshName),
606
+ channelWeights: Object.fromEntries(
607
+ this.serverChannels(meshName).map(([channelName, channel]) => [
608
+ channelName,
609
+ state === ZLinkFrameworkRuntimeState.Draining
610
+ ? 0
611
+ : this.effectiveChannelWeight(
612
+ meshName,
613
+ channelName,
614
+ channel.weight ?? ZLINK_DEFAULT_PUBLIC_WEIGHT
615
+ )
616
+ ])
617
+ ),
618
+ applicationVersion: this.options.registration.applicationVersion
619
+ };
620
+ }
621
+
568
622
  async reconcileAndPublishMeshNodeState(
569
623
  state: ZLinkFrameworkRuntimeState,
570
624
  meshName: string,
@@ -578,13 +632,20 @@ export class ZLinkSpotNodeRuntimeManager {
578
632
  if (owner === undefined) return;
579
633
  const current = (await location.runtime.listLiveMeshNodes(meshName, signal)).find(
580
634
  (descriptor) =>
581
- String(descriptor.rid) === String(status.routingId) &&
635
+ routingIdsEqual(descriptor.rid, status.routingId) &&
582
636
  descriptor.lifecycleGeneration === status.lifecycleGeneration &&
583
637
  descriptor.ownerId === owner.ownerId &&
584
638
  descriptor.leaseGeneration === owner.leaseGeneration
585
639
  );
586
640
  if (current !== undefined) {
587
- this.publishedMeshNodeDescriptors.set(meshName, current);
641
+ this.publishedMeshNodeDescriptors.set(meshName, {
642
+ ...current,
643
+ ...this.localDescriptorFields(
644
+ meshName,
645
+ this.options.registration.spotNodes.get(meshName)!,
646
+ state
647
+ )
648
+ });
588
649
  this.descriptorRevisionByMesh.set(
589
650
  meshName,
590
651
  maxBigInt(this.descriptorRevisionByMesh.get(meshName) ?? 0n, current.descriptorRevision)
@@ -848,12 +909,16 @@ export class ZLinkSpotNodeRuntimeManager {
848
909
  };
849
910
  await settle(publishers.map(async (publisher) => publisher.close()));
850
911
  await settle(autoConnectLoops.map((loop) => loop.prepareTransportShutdown()));
851
- await settle(entryActivations.reverse().map((activation) => activation.dispose(deadline)));
852
- await settle(meshPumps.reverse().map((pump) => pump.dispose()));
912
+ await settle(
913
+ entryActivations
914
+ .reverse()
915
+ .map((activation) => awaitWithAbort(activation.dispose(deadline), signal))
916
+ );
917
+ await settle(meshPumps.reverse().map((pump) => pump.dispose(signal)));
853
918
  await settle(
854
919
  meshNodes.reverse().map(async (node) => {
855
- node.shutdown(DEFAULT_SPOT_NODE_SHUTDOWN_TIMEOUT_MS);
856
- node.close();
920
+ await node.shutdown(DEFAULT_SPOT_NODE_SHUTDOWN_TIMEOUT_MS);
921
+ await node.close();
857
922
  })
858
923
  );
859
924
  for (const completions of meshCompletions) {
@@ -870,39 +935,61 @@ export class ZLinkSpotNodeRuntimeManager {
870
935
  this.meshCompletions.clear();
871
936
  }
872
937
 
873
- private async dispatchMeshRecord(
938
+ /**
939
+ * Node and Channel records go straight to the framework dispatcher in the
940
+ * pump's turn. Only Spot and Actor records addressed to the Entry Spot wait
941
+ * for its activation first.
942
+ */
943
+ private dispatchMeshRecord(
874
944
  meshName: string,
875
945
  owner: ReadyRecord,
876
946
  record: ReceiveRecord
877
- ): Promise<void> {
878
- const node = this.meshNodes.get(meshName);
879
- const targetsEntrySpot =
880
- owner.spotId === null ||
881
- (node !== undefined &&
882
- routingIdsEqual(owner.spotId as unknown as RoutingId, String(node.status().routingId)));
947
+ ): void | Promise<void> {
883
948
  if (
884
- targetsEntrySpot &&
885
949
  (record.kind === ReceiveKind.ActorSend ||
886
950
  record.kind === ReceiveKind.ActorRequest ||
887
951
  record.kind === ReceiveKind.SpotSend ||
888
952
  record.kind === ReceiveKind.SpotRequest ||
889
- record.kind === ReceiveKind.SpotMulticast)
953
+ record.kind === ReceiveKind.SpotMulticast) &&
954
+ this.targetsEntrySpot(meshName, owner)
890
955
  ) {
891
- await this.ensureEntryActivation(meshName);
956
+ return this.ensureEntryActivation(meshName).then(() =>
957
+ this.dispatchFrameworkRecord(meshName, owner, record)
958
+ );
892
959
  }
960
+ return this.dispatchFrameworkRecord(meshName, owner, record);
961
+ }
962
+
963
+ private targetsEntrySpot(meshName: string, owner: ReadyRecord): boolean {
964
+ if (owner.spotId === null) return true;
965
+ const node = this.meshNodes.get(meshName);
966
+ return (
967
+ node !== undefined &&
968
+ routingIdsEqual(owner.spotId as unknown as RoutingId, String(node.status().routingId))
969
+ );
970
+ }
971
+
972
+ private dispatchFrameworkRecord(
973
+ meshName: string,
974
+ owner: ReadyRecord,
975
+ record: ReceiveRecord
976
+ ): void | Promise<void> {
893
977
  const dispatcher = this.options.meshRecordDispatcher;
894
978
  if (dispatcher === undefined) {
895
- throw new ZLinkConfigurationException(
896
- `MeshNode '${meshName}' received a record before its framework dispatcher was registered.`
979
+ return Promise.reject(
980
+ new ZLinkConfigurationException(
981
+ `MeshNode '${meshName}' received a record before its framework dispatcher was registered.`
982
+ )
897
983
  );
898
984
  }
899
- await dispatcher(meshName, owner, record);
985
+ return dispatcher(meshName, owner, record);
900
986
  }
901
987
 
902
988
  async dispatchEntrySpotRecord(
903
989
  meshName: string,
904
990
  owner: ReadyRecord,
905
- record: ReceiveRecord
991
+ record: ReceiveRecord,
992
+ admit?: ZLinkMeshDispatchAdmission
906
993
  ): Promise<boolean> {
907
994
  if (
908
995
  record.kind !== ReceiveKind.SpotSend &&
@@ -922,11 +1009,13 @@ export class ZLinkSpotNodeRuntimeManager {
922
1009
  'MeshNode Entry Spot multicast record is missing its topic.'
923
1010
  );
924
1011
  }
925
- await activation.dispatchSubscriptionRecord(
926
- record.topic,
927
- record.parts,
928
- record.sourceNodeRid as unknown as RoutingId | null
929
- );
1012
+ const dispatch = () =>
1013
+ activation.dispatchSubscriptionRecord(
1014
+ record.topic!,
1015
+ record.parts,
1016
+ record.sourceNodeRid as unknown as RoutingId | null
1017
+ );
1018
+ await (admit === undefined ? dispatch() : admit(dispatch));
930
1019
  return true;
931
1020
  }
932
1021
  const envelope = decodeChannelEnvelope(
@@ -940,21 +1029,30 @@ export class ZLinkSpotNodeRuntimeManager {
940
1029
  channelName: envelope.header.channelName,
941
1030
  contentType: envelope.header.contentType
942
1031
  };
943
- if (record.kind === ReceiveKind.SpotSend) {
944
- await activation.dispatchPacketEncoded(envelope.packetName, decodePayload, context, false);
945
- return true;
946
- }
947
1032
  try {
948
- const response = await activation.dispatchPacketEncoded(
949
- envelope.packetName,
950
- decodePayload,
951
- context,
952
- true
953
- );
954
- requireEntrySpotReply(
955
- record.reply(encodeChannelReplyParts(envelope.header, response, codecs))
956
- );
1033
+ const dispatch = async () => {
1034
+ if (record.kind === ReceiveKind.SpotSend) {
1035
+ await activation.dispatchPacketEncoded(
1036
+ envelope.packetName,
1037
+ decodePayload,
1038
+ context,
1039
+ false
1040
+ );
1041
+ return;
1042
+ }
1043
+ const response = await activation.dispatchPacketEncoded(
1044
+ envelope.packetName,
1045
+ decodePayload,
1046
+ context,
1047
+ true
1048
+ );
1049
+ requireEntrySpotReply(
1050
+ record.reply(encodeChannelReplyParts(envelope.header, response, codecs))
1051
+ );
1052
+ };
1053
+ await (admit === undefined ? dispatch() : admit(dispatch));
957
1054
  } catch (error) {
1055
+ if (record.kind !== ReceiveKind.SpotRequest) throw error;
958
1056
  requireEntrySpotReply(record.reply(encodeChannelErrorReplyParts(envelope.header, error)));
959
1057
  }
960
1058
  return true;
@@ -1110,6 +1208,20 @@ export class ZLinkSpotNodeRuntimeManager {
1110
1208
  await activation.commitServiceActorJoin(actor, handoffBacklog);
1111
1209
  }
1112
1210
 
1211
+ admitEntryActorPacketPrefix(
1212
+ meshName: string,
1213
+ actorId: string,
1214
+ records: readonly import('../actors/actor-handoff').ZLinkActorHandoffPrefixRecord[]
1215
+ ): import('../actors/actor-handoff').ZLinkActorHandoffPrefixAdmission {
1216
+ const activation = this.entryActivations.get(meshName);
1217
+ if (activation === undefined) {
1218
+ throw new ZLinkConfigurationException(
1219
+ `Entry Spot Actor '${actorId}' has no activation for MeshNode '${meshName}'.`
1220
+ );
1221
+ }
1222
+ return activation.admitActorPacketPrefix(actorId, records);
1223
+ }
1224
+
1113
1225
  executeEntryActor<T>(meshName: string, actorId: string, operation: () => Promise<T>): Promise<T> {
1114
1226
  const activation = this.entryActivations.get(meshName);
1115
1227
  if (activation === undefined) {
@@ -1345,7 +1457,8 @@ function effectiveObjectRole(registration: ZLinkSpotNodeOptions): ZLinkObjectRol
1345
1457
  function objectCapability(
1346
1458
  objectKind: 'actor' | 'user_spot' | 'instance_spot',
1347
1459
  stableType: string,
1348
- factory: DescriptorFactoryRegistration
1460
+ factory: DescriptorFactoryRegistration,
1461
+ entryAccepted = false
1349
1462
  ) {
1350
1463
  const policy = factory.relocation?.kind ?? 'disabled';
1351
1464
  return {
@@ -1353,10 +1466,27 @@ function objectCapability(
1353
1466
  stableType,
1354
1467
  policy,
1355
1468
  hasSnapshotAdapter: policy === 'snapshot',
1356
- limit: objectKind === 'actor' ? 0 : (factory.options?.stableTypeLimit ?? 0)
1469
+ limit: objectKind === 'actor' ? 0 : (factory.options?.stableTypeLimit ?? 0),
1470
+ entryAccepted
1357
1471
  };
1358
1472
  }
1359
1473
 
1474
+ /**
1475
+ * The one decision for creating a new Actor on this node (Actor model §6.3): the node registered
1476
+ * an Entry Spot type that accepts the Actor type and an Actor factory for it. Publication and the
1477
+ * target refusal both read it.
1478
+ */
1479
+ export function registrationAcceptsNewActor(
1480
+ registration: ZLinkSpotNodeOptions,
1481
+ stableType: string
1482
+ ): boolean {
1483
+ return (
1484
+ registration.entrySpotType !== undefined &&
1485
+ registration.entrySpotActorType === stableType &&
1486
+ effectiveActorRegistrations(registration).some(([type]) => type === stableType)
1487
+ );
1488
+ }
1489
+
1360
1490
  function aggregatePlacementCapacity(actorLimit: number, spotLimit: number): number {
1361
1491
  const unlimited = ZLINK_MAX_CAPACITY;
1362
1492
  const actors = actorLimit === 0 ? unlimited : actorLimit;