@zlink-systems/framework 0.30.1 → 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 (340) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
  3. package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
  4. package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
  5. package/dist/contracts/Common/encoded-payload-storage.js +5 -2
  6. package/dist/contracts/Configuration/Builders.d.ts +1 -1
  7. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
  8. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
  9. package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
  10. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  11. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
  12. package/dist/contracts/Locations/Rows.d.ts +2 -0
  13. package/dist/contracts/Spots/Contracts.d.ts +4 -0
  14. package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
  15. package/dist/runtime/abort.d.ts +5 -0
  16. package/dist/runtime/abort.js +10 -0
  17. package/dist/runtime/actors/actor-authority-publication.js +3 -2
  18. package/dist/runtime/actors/actor-client.d.ts +0 -1
  19. package/dist/runtime/actors/actor-client.js +38 -45
  20. package/dist/runtime/actors/actor-context.d.ts +2 -0
  21. package/dist/runtime/actors/actor-context.js +46 -9
  22. package/dist/runtime/actors/actor-handoff.d.ts +7 -3
  23. package/dist/runtime/actors/actor-handoff.js +212 -88
  24. package/dist/runtime/actors/actor-join-relocation.d.ts +2 -0
  25. package/dist/runtime/actors/actor-local-native-join.js +4 -0
  26. package/dist/runtime/actors/actor-mailbox.js +27 -1
  27. package/dist/runtime/actors/actor-remote-joiner.js +3 -1
  28. package/dist/runtime/actors/actor-reply.d.ts +4 -0
  29. package/dist/runtime/actors/actor-reply.js +29 -0
  30. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
  31. package/dist/runtime/actors/actor-runtime-state.js +2 -20
  32. package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
  33. package/dist/runtime/actors/index.d.ts +6 -2
  34. package/dist/runtime/actors/index.js +37 -21
  35. package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
  36. package/dist/runtime/actors/session-disconnected-wire.js +48 -0
  37. package/dist/runtime/admission.d.ts +9 -1
  38. package/dist/runtime/admission.js +55 -32
  39. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +13 -0
  40. package/dist/runtime/application-jobs/application-job-queue-scope.js +27 -1
  41. package/dist/runtime/application-jobs/contracts.d.ts +2 -0
  42. package/dist/runtime/backend/contracts/index.d.ts +19 -3
  43. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
  44. package/dist/runtime/backend/mesh-completion-table.js +5 -0
  45. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +26 -2
  46. package/dist/runtime/backend/mesh-dispatch-pump.js +193 -107
  47. package/dist/runtime/backend/node/node-raw-binding-port.js +90 -58
  48. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +33 -8
  49. package/dist/runtime/backend/node/node-raw-mesh-backend.js +142 -143
  50. package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
  51. package/dist/runtime/backend/node/node-socket-backend-adapter.js +5 -5
  52. package/dist/runtime/channels/channel-clients.d.ts +1 -0
  53. package/dist/runtime/channels/channel-clients.js +20 -5
  54. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +22 -3
  55. package/dist/runtime/channels/channel-dispatch-pipeline.js +103 -57
  56. package/dist/runtime/channels/channel-dispatchers.d.ts +3 -2
  57. package/dist/runtime/channels/channel-dispatchers.js +44 -37
  58. package/dist/runtime/channels/channel-envelope.d.ts +1 -0
  59. package/dist/runtime/channels/channel-envelope.js +74 -31
  60. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
  61. package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
  62. package/dist/runtime/channels/channel-runtime-manager.d.ts +3 -2
  63. package/dist/runtime/channels/channel-runtime-manager.js +4 -4
  64. package/dist/runtime/channels/channel-transports.d.ts +0 -1
  65. package/dist/runtime/channels/channel-transports.js +35 -33
  66. package/dist/runtime/channels/client-server-location-runtime.js +5 -4
  67. package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
  68. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  69. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  70. package/dist/runtime/channels/fanout-location-runtime.js +3 -3
  71. package/dist/runtime/diagnostics/flow-context.js +19 -7
  72. package/dist/runtime/diagnostics/index.js +4 -9
  73. package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
  74. package/dist/runtime/diagnostics/message-flow.js +35 -5
  75. package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
  76. package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
  77. package/dist/runtime/execution/index.d.ts +4 -2
  78. package/dist/runtime/execution/index.js +33 -10
  79. package/dist/runtime/execution/serial-execution-queue.d.ts +4 -0
  80. package/dist/runtime/execution/serial-execution-queue.js +21 -2
  81. package/dist/runtime/execution/state-lane.d.ts +2 -0
  82. package/dist/runtime/execution/state-lane.js +5 -0
  83. package/dist/runtime/foundation/operation-registry.d.ts +25 -1
  84. package/dist/runtime/foundation/operation-registry.js +86 -18
  85. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +39 -3
  86. package/dist/runtime/foundation/raw-service-mesh-runtime.js +151 -55
  87. package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
  88. package/dist/runtime/foundation/service-liveness-registry.js +38 -0
  89. package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
  90. package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
  91. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -3
  92. package/dist/runtime/foundation/service-relocation-object-owner.js +48 -35
  93. package/dist/runtime/foundation/service-relocation-runtime.js +7 -3
  94. package/dist/runtime/foundation/service-runtime-contracts.d.ts +8 -1
  95. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
  96. package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
  97. package/dist/runtime/foundation/service-stateful-registry.js +24 -26
  98. package/dist/runtime/foundation/service-stateful-runtime.d.ts +72 -6
  99. package/dist/runtime/foundation/service-stateful-runtime.js +444 -117
  100. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -1
  101. package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
  102. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
  103. package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
  104. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  105. package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
  106. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +10 -0
  107. package/dist/runtime/foundation/service-wire-m6a-codec.js +166 -53
  108. package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
  109. package/dist/runtime/host/actor-packet-relay.js +59 -72
  110. package/dist/runtime/host/actor-placement-coordinator.js +25 -8
  111. package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
  112. package/dist/runtime/host/actor-transfer-runtime.js +85 -331
  113. package/dist/runtime/host/application-job-queue.d.ts +24 -3
  114. package/dist/runtime/host/application-job-queue.js +28 -41
  115. package/dist/runtime/host/index.d.ts +5 -1
  116. package/dist/runtime/host/index.js +171 -97
  117. package/dist/runtime/host/location-runtime-owner.js +2 -6
  118. package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
  119. package/dist/runtime/host/mesh-router-resolver.js +14 -6
  120. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
  121. package/dist/runtime/host/remote-bound-session-relay.js +71 -190
  122. package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
  123. package/dist/runtime/host/route-mesh-runtime.js +5 -3
  124. package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
  125. package/dist/runtime/host/runtime-shutdown.js +3 -2
  126. package/dist/runtime/host/service-relocation-host-runtime.d.ts +17 -7
  127. package/dist/runtime/host/service-relocation-host-runtime.js +550 -367
  128. package/dist/runtime/host/spot-runtime-options-factory.js +15 -7
  129. package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
  130. package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
  131. package/dist/runtime/locations/auto-connect-loop.js +22 -14
  132. package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
  133. package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
  134. package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
  135. package/dist/runtime/locations/descriptor-publication.js +11 -0
  136. package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
  137. package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
  138. package/dist/runtime/locations/in-memory-authority-store.js +56 -19
  139. package/dist/runtime/locations/in-memory-location-store.js +1 -10
  140. package/dist/runtime/locations/index.d.ts +1 -0
  141. package/dist/runtime/locations/index.js +1 -0
  142. package/dist/runtime/locations/lease-tracker.js +1 -6
  143. package/dist/runtime/locations/location-store-repository.d.ts +51 -1
  144. package/dist/runtime/locations/location-store-repository.js +363 -139
  145. package/dist/runtime/locations/relocation-blob.d.ts +18 -1
  146. package/dist/runtime/locations/relocation-blob.js +52 -1
  147. package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
  148. package/dist/runtime/locations/request-source-resolver.js +80 -0
  149. package/dist/runtime/locations/resolvers.js +1 -1
  150. package/dist/runtime/locations/runtime.d.ts +6 -2
  151. package/dist/runtime/locations/runtime.js +37 -30
  152. package/dist/runtime/messaging/payload-codec.d.ts +7 -1
  153. package/dist/runtime/messaging/payload-codec.js +7 -6
  154. package/dist/runtime/messaging/request-result.js +29 -26
  155. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +19 -1
  156. package/dist/runtime/protocol/service_wire_codec.generated.js +85 -0
  157. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +7 -1
  158. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +23 -7
  159. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +3 -2
  160. package/dist/runtime/spots/index.d.ts +18 -11
  161. package/dist/runtime/spots/index.js +234 -176
  162. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
  163. package/dist/runtime/spots/spot-activation-registry.js +21 -11
  164. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  165. package/dist/runtime/spots/spot-activation-state.js +7 -7
  166. package/dist/runtime/spots/spot-activation.d.ts +6 -3
  167. package/dist/runtime/spots/spot-activation.js +123 -44
  168. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
  169. package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
  170. package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
  171. package/dist/runtime/spots/spot-actor-membership.js +0 -8
  172. package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
  173. package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
  174. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
  175. package/dist/runtime/spots/spot-entry-activation.js +14 -9
  176. package/dist/runtime/spots/spot-handler-registry.d.ts +4 -3
  177. package/dist/runtime/spots/spot-handler-registry.js +6 -2
  178. package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
  179. package/dist/runtime/spots/spot-manager-public.js +2 -2
  180. package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
  181. package/dist/runtime/spots/spot-node-autoconnect.js +18 -39
  182. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
  183. package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
  184. package/dist/runtime/spots/spot-outbound.js +3 -3
  185. package/dist/runtime/spots/spot-remote-codec.js +5 -1
  186. package/dist/runtime/spots/spot-runtime-ports.d.ts +0 -1
  187. package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
  188. package/dist/runtime/spots/spot-serial-executor.js +61 -8
  189. package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
  190. package/dist/runtime/spots/spot-subscription-dispatch.js +1 -1
  191. package/dist/runtime/spots/spot-timer.d.ts +57 -5
  192. package/dist/runtime/spots/spot-timer.js +287 -103
  193. package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
  194. package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
  195. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
  196. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
  197. package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
  198. package/dist/runtime/streams/bound-session-service.d.ts +1 -1
  199. package/dist/runtime/streams/bound-session-service.js +6 -11
  200. package/dist/runtime/streams/index.d.ts +3 -2
  201. package/dist/runtime/streams/index.js +6 -4
  202. package/dist/runtime/streams/managed-stream.js +3 -2
  203. package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
  204. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
  205. package/dist/runtime/streams/session-actor-coordinator.js +15 -32
  206. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
  207. package/dist/runtime/streams/stream-session-runtime.js +1 -4
  208. package/dist/runtime/workers/index.js +1 -1
  209. package/package.json +3 -3
  210. package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
  211. package/src/contracts/Common/encoded-payload-storage.ts +6 -3
  212. package/src/contracts/Configuration/Builders.ts +4 -1
  213. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
  214. package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
  215. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  216. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
  217. package/src/contracts/Locations/Rows.ts +2 -0
  218. package/src/contracts/Spots/Contracts.ts +8 -0
  219. package/src/contracts/Spots/ZLinkSpot.ts +3 -3
  220. package/src/runtime/abort.ts +12 -0
  221. package/src/runtime/actors/actor-authority-publication.ts +3 -2
  222. package/src/runtime/actors/actor-client.ts +61 -70
  223. package/src/runtime/actors/actor-context.ts +49 -9
  224. package/src/runtime/actors/actor-handoff.ts +282 -106
  225. package/src/runtime/actors/actor-join-relocation.ts +2 -0
  226. package/src/runtime/actors/actor-local-native-join.ts +4 -0
  227. package/src/runtime/actors/actor-mailbox.ts +40 -2
  228. package/src/runtime/actors/actor-remote-joiner.ts +6 -1
  229. package/src/runtime/actors/actor-reply.ts +42 -0
  230. package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
  231. package/src/runtime/actors/actor-runtime-state.ts +2 -20
  232. package/src/runtime/actors/actor-source-transfer.ts +1 -34
  233. package/src/runtime/actors/index.ts +41 -27
  234. package/src/runtime/actors/session-disconnected-wire.ts +66 -0
  235. package/src/runtime/admission.ts +69 -34
  236. package/src/runtime/application-jobs/application-job-queue-scope.ts +33 -1
  237. package/src/runtime/application-jobs/contracts.ts +2 -0
  238. package/src/runtime/backend/contracts/index.ts +39 -4
  239. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
  240. package/src/runtime/backend/mesh-completion-table.ts +4 -0
  241. package/src/runtime/backend/mesh-dispatch-pump.ts +223 -124
  242. package/src/runtime/backend/node/node-raw-binding-port.ts +106 -70
  243. package/src/runtime/backend/node/node-raw-mesh-backend.ts +221 -170
  244. package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -5
  245. package/src/runtime/channels/channel-clients.ts +49 -24
  246. package/src/runtime/channels/channel-dispatch-pipeline.ts +173 -124
  247. package/src/runtime/channels/channel-dispatchers.ts +116 -72
  248. package/src/runtime/channels/channel-envelope.ts +105 -36
  249. package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
  250. package/src/runtime/channels/channel-runtime-manager.ts +12 -5
  251. package/src/runtime/channels/channel-transports.ts +49 -58
  252. package/src/runtime/channels/client-server-location-runtime.ts +11 -10
  253. package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
  254. package/src/runtime/channels/fanout-location-runtime.ts +17 -9
  255. package/src/runtime/diagnostics/flow-context.ts +20 -7
  256. package/src/runtime/diagnostics/index.ts +1 -7
  257. package/src/runtime/diagnostics/message-flow.ts +47 -9
  258. package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
  259. package/src/runtime/execution/index.ts +40 -14
  260. package/src/runtime/execution/serial-execution-queue.ts +31 -4
  261. package/src/runtime/execution/state-lane.ts +7 -0
  262. package/src/runtime/foundation/operation-registry.ts +98 -20
  263. package/src/runtime/foundation/raw-service-mesh-runtime.ts +244 -67
  264. package/src/runtime/foundation/service-liveness-registry.ts +39 -0
  265. package/src/runtime/foundation/service-mailbox.ts +8 -0
  266. package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
  267. package/src/runtime/foundation/service-relocation-object-owner.ts +54 -37
  268. package/src/runtime/foundation/service-relocation-runtime.ts +7 -3
  269. package/src/runtime/foundation/service-runtime-contracts.ts +12 -1
  270. package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
  271. package/src/runtime/foundation/service-stateful-registry.ts +38 -35
  272. package/src/runtime/foundation/service-stateful-runtime.ts +667 -152
  273. package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -11
  274. package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
  275. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  276. package/src/runtime/foundation/service-wire-m6a-codec.ts +187 -51
  277. package/src/runtime/host/actor-packet-relay.ts +113 -94
  278. package/src/runtime/host/actor-placement-coordinator.ts +31 -8
  279. package/src/runtime/host/actor-transfer-runtime.ts +104 -430
  280. package/src/runtime/host/application-job-queue.ts +29 -44
  281. package/src/runtime/host/index.ts +286 -129
  282. package/src/runtime/host/location-runtime-owner.ts +2 -6
  283. package/src/runtime/host/mesh-router-resolver.ts +13 -5
  284. package/src/runtime/host/remote-bound-session-relay.ts +86 -248
  285. package/src/runtime/host/route-mesh-runtime.ts +11 -5
  286. package/src/runtime/host/runtime-shutdown.ts +15 -4
  287. package/src/runtime/host/service-relocation-host-runtime.ts +784 -475
  288. package/src/runtime/host/spot-runtime-options-factory.ts +18 -7
  289. package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
  290. package/src/runtime/locations/auto-connect-loop.ts +22 -14
  291. package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
  292. package/src/runtime/locations/auto-connect-types.ts +0 -1
  293. package/src/runtime/locations/descriptor-publication.ts +7 -0
  294. package/src/runtime/locations/domain-store-contract.ts +5 -0
  295. package/src/runtime/locations/in-memory-authority-store.ts +85 -23
  296. package/src/runtime/locations/in-memory-location-store.ts +1 -12
  297. package/src/runtime/locations/index.ts +1 -0
  298. package/src/runtime/locations/lease-tracker.ts +2 -9
  299. package/src/runtime/locations/location-store-repository.ts +628 -152
  300. package/src/runtime/locations/relocation-blob.ts +75 -1
  301. package/src/runtime/locations/request-source-resolver.ts +138 -0
  302. package/src/runtime/locations/resolvers.ts +2 -2
  303. package/src/runtime/locations/runtime.ts +70 -40
  304. package/src/runtime/messaging/payload-codec.ts +8 -11
  305. package/src/runtime/messaging/request-result.ts +33 -29
  306. package/src/runtime/protocol/service_wire_codec.generated.ts +87 -4
  307. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +13 -10
  308. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +3 -2
  309. package/src/runtime/spots/index.ts +375 -281
  310. package/src/runtime/spots/spot-activation-registry.ts +25 -13
  311. package/src/runtime/spots/spot-activation-state.ts +12 -19
  312. package/src/runtime/spots/spot-activation.ts +170 -86
  313. package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
  314. package/src/runtime/spots/spot-actor-membership.ts +0 -15
  315. package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
  316. package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
  317. package/src/runtime/spots/spot-entry-activation.ts +24 -19
  318. package/src/runtime/spots/spot-handler-registry.ts +15 -4
  319. package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
  320. package/src/runtime/spots/spot-manager-public.ts +2 -2
  321. package/src/runtime/spots/spot-node-autoconnect.ts +22 -45
  322. package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
  323. package/src/runtime/spots/spot-outbound.ts +3 -3
  324. package/src/runtime/spots/spot-remote-codec.ts +9 -2
  325. package/src/runtime/spots/spot-runtime-ports.ts +0 -1
  326. package/src/runtime/spots/spot-serial-executor.ts +97 -25
  327. package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
  328. package/src/runtime/spots/spot-subscription-dispatch.ts +1 -1
  329. package/src/runtime/spots/spot-timer.ts +413 -157
  330. package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
  331. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
  332. package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
  333. package/src/runtime/streams/bound-session-service.ts +7 -10
  334. package/src/runtime/streams/index.ts +12 -6
  335. package/src/runtime/streams/managed-stream.ts +4 -2
  336. package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
  337. package/src/runtime/streams/session-actor-coordinator.ts +39 -88
  338. package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
  339. package/src/runtime/streams/stream-session-runtime.ts +1 -5
  340. package/src/runtime/workers/index.ts +1 -1
@@ -1,6 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ZLinkSpotActorPacketDispatch = void 0;
4
+ const actor_message_follow_context_1 = require("../actors/actor-message-follow-context");
5
+ const actor_context_1 = require("../actors/actor-context");
6
+ const session_disconnected_wire_1 = require("../actors/session-disconnected-wire");
7
+ const routing_id_1 = require("../routing-id");
4
8
  const framework_errors_internal_1 = require("../framework-errors-internal");
5
9
  const contracts_1 = require("../../contracts");
6
10
  const ZLinkDispatchOptions_1 = require("../../contracts/Dispatch/ZLinkDispatchOptions");
@@ -12,6 +16,7 @@ const protocol_1 = require("../streams/protocol");
12
16
  const payload_codec_1 = require("../messaging/payload-codec");
13
17
  const serial_work_size_1 = require("../execution/serial-work-size");
14
18
  const application_job_queue_scope_1 = require("../application-jobs/application-job-queue-scope");
19
+ const emptyDisconnectedReply = contracts_1.ZLinkMessage.fromEncoded(contracts_1.ZLinkEncodedPayload.fromOwned(Buffer.alloc(0)));
15
20
  class ZLinkSpotActorPacketDispatch {
16
21
  options;
17
22
  constructor(options) {
@@ -62,9 +67,12 @@ class ZLinkSpotActorPacketDispatch {
62
67
  ? ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.ReplyError
63
68
  : ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop;
64
69
  this.trace(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Received, actorId, header, messageKind);
65
- if (this.options.actorLeft?.(actorId) === true &&
66
- header.name === actors_1.ZLINK_REMOTE_ACTOR_SESSION_DISCONNECTED_PACKET) {
67
- return undefined;
70
+ const disconnected = header.name === actors_1.ZLINK_REMOTE_ACTOR_SESSION_DISCONNECTED_PACKET;
71
+ const disconnectedReply = disconnected && header.kind === protocol_1.ZLinkStreamMessageKind.Request
72
+ ? emptyDisconnectedReply
73
+ : undefined;
74
+ if (this.options.actorLeft?.(actorId) === true && disconnected) {
75
+ return disconnectedReply;
68
76
  }
69
77
  const routed = await this.options.routeBeforeLocal?.(delivery);
70
78
  if (routed?.handled === true) {
@@ -74,9 +82,23 @@ class ZLinkSpotActorPacketDispatch {
74
82
  if (actor === undefined) {
75
83
  return this.handleMissingActor(delivery.origin, actorId, parts, header, messageKind, action, returnResponse, remoteBoundSessionTarget, fallbackActorRef, requestTerminal);
76
84
  }
77
- if (header.name === actors_1.ZLINK_REMOTE_ACTOR_SESSION_DISCONNECTED_PACKET) {
85
+ if (disconnected) {
86
+ const identity = (0, session_disconnected_wire_1.decodeSessionDisconnected)((0, protocol_1.messageToBytes)(parts[1]));
87
+ if (identity === undefined) {
88
+ if (this.options.dispatchErrors?.captureEnabled() === true)
89
+ this.reportInvalidFrame(actorId, messageKind, new contracts_1.ZLinkFrameworkException(contracts_1.ZLinkFrameworkErrorKind.ProtocolError, 'ProtocolError: malformed Session disconnect identity.'), 'warning');
90
+ return disconnectedReply;
91
+ }
92
+ const current = actor.context instanceof actor_context_1.DefaultZLinkActorContext
93
+ ? actor.context.currentSessionBinding
94
+ : undefined;
95
+ if (current !== undefined &&
96
+ (!(0, routing_id_1.routingIdsEqual)(current.sessionNodeRid, identity.sessionOwnerNodeRid) ||
97
+ current.sessionOwnerNodeGeneration !== identity.sessionOwnerNodeGeneration ||
98
+ current.bindingGeneration !== identity.bindingGeneration))
99
+ return disconnectedReply;
78
100
  await this.options.onDisconnectActor(actor);
79
- return undefined;
101
+ return disconnectedReply;
80
102
  }
81
103
  const decodePayload = this.createPayloadDecoder(parts[1], header);
82
104
  return this.dispatchActorPacket(actor, actorId, decodePayload, header, messageKind, action, returnResponse, remoteBoundSessionTarget, fallbackActorRef, requestTerminal, requestDeadlineUnixMs, (0, serial_work_size_1.zlinkSerialWorkOptions)(parts[1].data().byteLength, (0, serial_work_size_1.zlinkMetadataByteLength)(header.metadata)));
@@ -108,7 +130,9 @@ class ZLinkSpotActorPacketDispatch {
108
130
  if (messageKind !== ZLinkDispatchOptions_1.ZLinkDispatchMessageKind.ActorRequest) {
109
131
  return undefined;
110
132
  }
111
- const missingActorError = (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorDispatchHandlerNotFound, `SPOT actor is not registered locally: ${actorId}`);
133
+ const missingActorError = (0, framework_errors_internal_1.createInternalFrameworkException)((0, actor_message_follow_context_1.actorMessageFollowContext)(fallbackActorRef) === undefined
134
+ ? framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorDispatchHandlerNotFound
135
+ : framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale, `SPOT actor is not registered locally: ${actorId}`);
112
136
  if (header.requestSeq !== undefined &&
113
137
  !returnResponse &&
114
138
  this.options.actorErrorSender !== undefined) {
@@ -290,7 +314,7 @@ class ZLinkSpotActorPacketDispatch {
290
314
  throw error;
291
315
  }
292
316
  }
293
- reportInvalidFrame(actorId, messageKind, error) {
317
+ reportInvalidFrame(actorId, messageKind, error, severity) {
294
318
  this.options.dispatchErrors?.report({
295
319
  surface: ZLinkDispatchOptions_1.ZLinkDispatchErrorSurface.SpotActor,
296
320
  messageKind,
@@ -298,7 +322,8 @@ class ZLinkSpotActorPacketDispatch {
298
322
  action: ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop,
299
323
  spotId: this.options.spotId(),
300
324
  actorId,
301
- error
325
+ error,
326
+ severity
302
327
  });
303
328
  }
304
329
  trace(outcome, actorId, header, messageKind) {
@@ -1,13 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ZLinkSpotActorPacketDrain = void 0;
4
- const contracts_1 = require("../../contracts");
5
4
  const runtime_message_1 = require("../backend/runtime-message");
6
5
  const runtime_values_1 = require("../backend/runtime-values");
7
6
  const spot_remote_codec_1 = require("./spot-remote-codec");
8
7
  const spot_native_flags_1 = require("./spot-native-flags");
9
8
  const protocol_1 = require("../streams/protocol");
10
- const payload_codec_1 = require("../messaging/payload-codec");
9
+ const actor_reply_1 = require("../actors/actor-reply");
10
+ const bound_session_response_target_1 = require("../streams/bound-session-response-target");
11
11
  const ZLINK_SPOT_ACTOR_RECV_INFO_NO_BIND = 1;
12
12
  class ZLinkSpotActorPacketDrain {
13
13
  options;
@@ -143,33 +143,13 @@ class ZLinkSpotActorPacketDrain {
143
143
  }
144
144
  catch (error) {
145
145
  this.options.replyActorNoBind?.(info, [
146
- this.encodeActorReplyFrame(parts[0], protocol_1.ZLinkStreamMessageKind.Error, frameworkErrorPayload(error))
146
+ this.encodeActorReplyFrame(parts[0], protocol_1.ZLinkStreamMessageKind.Error, (0, bound_session_response_target_1.boundSessionErrorPayload)(error))
147
147
  ], runtime_values_1.RequestResult.Ok);
148
148
  }
149
149
  }
150
150
  encodeActorReplyFrame(requestHeaderPart, kind, payload) {
151
- const requestHeader = (0, protocol_1.decodeStreamHeader)((0, protocol_1.messageToBytes)(requestHeaderPart), this.flowEnabled());
152
- const encoded = (0, payload_codec_1.encodeFrameworkPayload)(payload, this.options.messageSerializers, kind === protocol_1.ZLinkStreamMessageKind.Response ? requestHeader.name : undefined, 'payload');
153
- try {
154
- // encodeStreamFrame returns a fresh, unaliased array; view it without re-copying.
155
- const frame = (0, protocol_1.encodeStreamFrame)({
156
- kind,
157
- codec: (0, protocol_1.streamCodecForContentType)(encoded.contentType),
158
- flags: protocol_1.ZLinkStreamHeaderFlags.None,
159
- requestSeq: requestHeader.requestSeq,
160
- name: '',
161
- metadata: new Map(),
162
- correlationId: requestHeader.correlationId,
163
- // Spec 27 §7: preserve the request flow pair on the reply while
164
- // tracing is on; the gated decode above already strips it at Off.
165
- flowId: requestHeader.flowId,
166
- flowOrigin: requestHeader.flowOrigin
167
- }, encoded.message.data());
168
- return runtime_message_1.ZLinkBufferMessage.fromOwned(Buffer.from(frame.buffer, frame.byteOffset, frame.byteLength));
169
- }
170
- finally {
171
- encoded.message.close();
172
- }
151
+ const [frame] = (0, actor_reply_1.encodeActorReply)((0, protocol_1.messageToBytes)(requestHeaderPart), kind, payload, this.options.messageSerializers, this.flowEnabled());
152
+ return runtime_message_1.ZLinkBufferMessage.fromOwned(frame);
173
153
  }
174
154
  consumeRemoteBoundSessionBind(actor, sourceNodeRid, sourceSessionRid, parts) {
175
155
  if (parts.length < 1) {
@@ -231,11 +211,3 @@ function closeMessages(messages) {
231
211
  for (const message of messages)
232
212
  message.close();
233
213
  }
234
- function frameworkErrorPayload(error) {
235
- return {
236
- message: error instanceof Error ? error.message : String(error),
237
- kind: error instanceof contracts_1.ZLinkFrameworkException
238
- ? error.kind
239
- : contracts_1.ZLinkFrameworkErrorKind.InternalFailure
240
- };
241
- }
@@ -100,6 +100,8 @@ export declare class ZLinkEntrySpotActivation {
100
100
  notifyLeaveActor(actor: ZLinkActor, signal?: AbortSignal, _actorRef?: ActorRef, _membershipEpoch?: bigint): Promise<void>;
101
101
  notifyDisconnectActor(actor: ZLinkActor, signal?: AbortSignal): Promise<void>;
102
102
  dispatchActorPacket(delivery: ZLinkActorPacketDelivery): Promise<unknown>;
103
+ /** Restores source packets through the Entry Actor's existing executor. */
104
+ admitActorPacketPrefix(actorId: string, records: readonly import('../actors/actor-handoff').ZLinkActorHandoffPrefixRecord[]): import('../actors/actor-handoff').ZLinkActorHandoffPrefixAdmission;
103
105
  private replayActorBacklog;
104
106
  private dispatchActorPacketInsideMailbox;
105
107
  private replyActorNoBind;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ZLinkEntrySpotActivation = void 0;
4
+ const application_job_queue_scope_1 = require("../application-jobs/application-job-queue-scope");
4
5
  const contracts_1 = require("../../contracts");
5
6
  const abort_1 = require("../abort");
6
7
  const routing_id_1 = require("../routing-id");
@@ -140,7 +141,7 @@ class ZLinkEntrySpotActivation {
140
141
  : this.packetDispatch.sendEncoded(this.spotId, packetName, decodePayload, context);
141
142
  }
142
143
  async create() {
143
- const entrySpot = await (0, spot_provider_1.createProviderInstance)(this.options.entrySpotType, this.options.providerResolver, this.context);
144
+ const entrySpot = await (0, spot_provider_1.createFreshProviderInstance)(this.options.entrySpotType, this.options.providerResolver, this.context);
144
145
  this.entrySpot = entrySpot;
145
146
  Object.defineProperty(this.entrySpot, 'context', {
146
147
  configurable: true,
@@ -291,18 +292,22 @@ class ZLinkEntrySpotActivation {
291
292
  }
292
293
  async dispatchActorPacket(delivery) {
293
294
  const { actorId, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef, messageFollowOrigin } = delivery;
294
- const handoff = this.options.actorHandoffRuntime?.capture(delivery.origin, actorId, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef, undefined, messageFollowOrigin, (replayedParts, replayReturnResponse, replayRemoteBoundSessionTarget, replayFallbackActorRef) => this.spotSerialExecutor.executeActor(actorId, () => this.dispatchActorPacketInsideMailbox({
295
- origin: delivery.origin,
296
- actorId,
297
- parts: replayedParts,
298
- returnResponse: replayReturnResponse,
299
- remoteBoundSessionTarget: replayRemoteBoundSessionTarget,
300
- fallbackActorRef: replayFallbackActorRef
301
- })));
295
+ const handoff = this.options.actorHandoffRuntime?.capture(delivery.origin, actorId, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef, undefined, messageFollowOrigin);
302
296
  if (handoff !== undefined)
303
297
  return await handoff;
304
298
  return this.spotSerialExecutor.executeActor(actorId, () => this.dispatchActorPacketInsideMailbox(delivery));
305
299
  }
300
+ /** Restores source packets through the Entry Actor's existing executor. */
301
+ admitActorPacketPrefix(actorId, records) {
302
+ return this.spotSerialExecutor.admitActorPacketPrefix(actorId, records, (_serial, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef) => this.dispatchActorPacketInsideMailbox({
303
+ origin: (0, application_job_queue_scope_1.currentApplicationJobOrigin)(),
304
+ actorId,
305
+ parts,
306
+ returnResponse,
307
+ remoteBoundSessionTarget,
308
+ fallbackActorRef
309
+ }));
310
+ }
306
311
  async replayActorBacklog(actor, backlog) {
307
312
  return await (0, actor_handoff_1.replayActorHandoffBacklog)(backlog, (parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef) => this.spotSerialExecutor.executeActor(actor.context.actorId, () => this.dispatchActorPacketInsideMailbox({
308
313
  origin: 'remote',
@@ -1,9 +1,9 @@
1
- import type { Type, ZLinkActor, ZLinkEntrySpot, ZLinkInstanceSpotHandlerRegistry, ZLinkSpot, ZLinkSpotHandlerRegistry } from '../../contracts';
1
+ import type { Type, ZLinkActor, ZLinkEntrySpot, ZLinkInstanceSpot, ZLinkInstanceSpotHandlerRegistry, ZLinkSpot, ZLinkSpotHandlerRegistry, ZLinkSpotTimerHandler } from '../../contracts';
2
2
  import type { ZLinkEntrySpotActorRequestHandlerRegistration, ZLinkEntrySpotActorSendHandlerRegistration, ZLinkEntrySpotPacketHandlerRegistration, ZLinkEntrySpotSubscriptionHandlerRegistration, ZLinkSpotActorRequestHandlerRegistration, ZLinkSpotActorSendHandlerRegistration, ZLinkSpotPacketHandlerRegistration, ZLinkSpotSubscriptionHandlerRegistration } from '../../contracts/Configuration/RegistrationTypes';
3
3
  import type { ZLinkProviderResolver } from '../../contracts/Common/ZLinkProviderResolver';
4
4
  import { ZLinkActorPacketKind, ZLinkSpotActorHandlerRegistryRuntime } from '../actors';
5
5
  export interface ZLinkSpotHandlerRegistration {
6
- readonly kind: 'packet' | 'subscribe' | 'actorSend' | 'actorRequest' | 'spotHandler';
6
+ readonly kind: 'packet' | 'subscribe' | 'actorSend' | 'actorRequest' | 'timer';
7
7
  readonly handlerType: Type;
8
8
  readonly packetName?: string;
9
9
  readonly channelName?: string;
@@ -24,7 +24,7 @@ export declare class DefaultZLinkSpotHandlerRegistry<TActor extends ZLinkActor =
24
24
  actorRequest(packetName: string, handlerType: Type, actorType?: Type<TActor>): this;
25
25
  addSubscribe(handlerType: Type, channelName: string, topic: string): this;
26
26
  subscribe(channelName: string, topic: string, handlerType: Type): this;
27
- addSpotHandler(handlerType: Type): this;
27
+ addTimerHandler<THandler extends ZLinkSpotTimerHandler<ZLinkSpot>>(handlerType: Type<THandler>): this;
28
28
  snapshot(): readonly ZLinkSpotHandlerRegistration[];
29
29
  }
30
30
  /**
@@ -35,6 +35,7 @@ export declare class DefaultZLinkInstanceSpotHandlerRegistry implements ZLinkIns
35
35
  private readonly registrations;
36
36
  constructor(registrations: DefaultZLinkSpotHandlerRegistry);
37
37
  addPacket<THandler>(handlerType: Type<THandler>): this;
38
+ addTimerHandler<THandler extends ZLinkSpotTimerHandler<ZLinkInstanceSpot>>(handlerType: Type<THandler>): this;
38
39
  snapshot(): readonly ZLinkSpotHandlerRegistration[];
39
40
  }
40
41
  interface ZLinkEntrySpotHandlerRegistrationSet {
@@ -88,9 +88,9 @@ class DefaultZLinkSpotHandlerRegistry {
88
88
  subscribe(channelName, topic, handlerType) {
89
89
  return this.addSubscribe(handlerType, channelName, topic);
90
90
  }
91
- addSpotHandler(handlerType) {
91
+ addTimerHandler(handlerType) {
92
92
  (0, handler_instance_scope_1.prepareHandlerInstance)(this.providerResolver, handlerType);
93
- this.entries.push({ kind: 'spotHandler', handlerType });
93
+ this.entries.push({ kind: 'timer', handlerType });
94
94
  return this;
95
95
  }
96
96
  snapshot() {
@@ -111,6 +111,10 @@ class DefaultZLinkInstanceSpotHandlerRegistry {
111
111
  this.registrations.addPacket(handlerType);
112
112
  return this;
113
113
  }
114
+ addTimerHandler(handlerType) {
115
+ this.registrations.addTimerHandler(handlerType);
116
+ return this;
117
+ }
114
118
  snapshot() {
115
119
  return this.registrations.snapshot();
116
120
  }
@@ -4,7 +4,7 @@ export interface ZLinkLocalSpotCreateResult {
4
4
  readonly state: ZLinkSpotCreateState;
5
5
  readonly reply?: unknown;
6
6
  readonly publication?: {
7
- publish(): void;
8
- abort(): void;
7
+ publish(): void | Promise<void>;
8
+ abort(): void | Promise<void>;
9
9
  };
10
10
  }
@@ -123,7 +123,7 @@ class ZLinkPublicSpotManager {
123
123
  yield: (signal) => {
124
124
  const yieldTurn = (0, execution_1.requireZLinkYieldTurn)(turn);
125
125
  const pending = this.submit(spotId, stableType, generatedIdentity, state, signal);
126
- return yieldTurn.yieldPromise(pending);
126
+ return yieldTurn.yieldFrameworkPromise(pending);
127
127
  }
128
128
  };
129
129
  return call;
@@ -166,7 +166,7 @@ class ZLinkPublicSpotManager {
166
166
  };
167
167
  }
168
168
  catch (error) {
169
- this.options.local.abortUserSpotPublication(target.meshName, spotId);
169
+ await this.options.local.abortUserSpotPublication(target.meshName, spotId);
170
170
  throw error;
171
171
  }
172
172
  }, async (cleanupSignal) => {
@@ -4,13 +4,14 @@ import type { ZLinkDomainLocationStore as ZLinkLocationStore } from '../location
4
4
  import type { ZLinkPeerLocation } from '../../contracts/Locations/Rows';
5
5
  import type { ZLinkSpotNodeOptions } from '../configuration';
6
6
  import type { ZLinkBackendMeshNode } from '../backend/contracts';
7
- import { ZLinkLocationRuntime, ZLinkOwnerLeaseTracker, type IZLinkAutoConnectExecutor, type ZLinkAutoConnectLocal, type ZLinkLocationEventSink, type ZLinkLocationRuntimeStores } from '../locations';
7
+ import { ZLinkLocationRuntime, ZLinkOwnerLeaseTracker, ZLinkRequestSourceResolver, type IZLinkAutoConnectExecutor, type ZLinkAutoConnectLocal, type ZLinkLocationEventSink, type ZLinkLocationRuntimeStores } from '../locations';
8
8
  export interface ZLinkSpotNodeLocationAutoConnectContext {
9
9
  readonly runtime: ZLinkLocationRuntime;
10
10
  readonly stores: ZLinkLocationRuntimeStores;
11
11
  readonly options: ZLinkLocationOptionOverrides;
12
12
  readonly leaseTracker: ZLinkOwnerLeaseTracker;
13
13
  readonly resolver: ZLinkPeerLocationResolver;
14
+ readonly requestSources: ZLinkRequestSourceResolver;
14
15
  readonly events?: ZLinkLocationEventSink;
15
16
  readonly changeStampStore?: Pick<ZLinkLocationStore, 'getMeshNodeChangeStamp'>;
16
17
  }
@@ -2,12 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createSpotNodeLocationAutoConnectContext = createSpotNodeLocationAutoConnectContext;
4
4
  exports.spotNodeAutoConnectCapability = spotNodeAutoConnectCapability;
5
+ const routing_id_1 = require("../routing-id");
5
6
  const RegistrationBuilderPolicy_1 = require("../../contracts/Configuration/RegistrationBuilderPolicy");
6
7
  const Values_1 = require("../../contracts/Locations/Values");
7
8
  const contracts_1 = require("../../contracts");
8
- const node_async_hooks_1 = require("node:async_hooks");
9
9
  const state_lane_1 = require("../execution/state-lane");
10
- const routing_id_1 = require("../routing-id");
10
+ const routing_id_2 = require("../routing-id");
11
11
  const service_runtime_contracts_1 = require("../foundation/service-runtime-contracts");
12
12
  const locations_1 = require("../locations");
13
13
  function createSpotNodeLocationAutoConnectContext(runtime, stores, options, events) {
@@ -15,12 +15,17 @@ function createSpotNodeLocationAutoConnectContext(runtime, stores, options, even
15
15
  store: stores.ownerLeaseStore,
16
16
  options
17
17
  });
18
+ const requestSources = new locations_1.ZLinkRequestSourceResolver({
19
+ listLiveMeshNodes: (meshName, signal) => runtime.listLiveMeshNodes(meshName, signal),
20
+ remainingOwnerTokenLeaseMs: (owner, signal) => runtime.remainingOwnerTokenLeaseMs(owner, signal)
21
+ });
18
22
  return {
19
23
  runtime,
20
24
  stores,
21
25
  options,
22
26
  leaseTracker,
23
- resolver: meshDescriptorPeerResolver(runtime),
27
+ resolver: meshDescriptorPeerResolver(runtime, requestSources),
28
+ requestSources,
24
29
  events,
25
30
  // The opaque provider has no cross-process change notification primitive.
26
31
  // A process-local inherited stamp would hide descriptors written by peers,
@@ -46,13 +51,12 @@ function spotNodeAutoConnectCapability(spotNodeName, spotNode, node) {
46
51
  objectRole: spotNode.objectRole ?? 'none',
47
52
  hasRouteMeshServerChannel: Object.values(spotNode.meshChannels ?? {}).some((channel) => channel.server === true)
48
53
  };
49
- const manualConnections = hasManualRouterConnections(spotNode);
50
54
  return {
51
55
  local,
52
- executor: new ZLinkSpotNodeAutoConnectExecutor(node, manualConnections)
56
+ executor: new ZLinkSpotNodeAutoConnectExecutor(node)
53
57
  };
54
58
  }
55
- function meshDescriptorPeerResolver(runtime) {
59
+ function meshDescriptorPeerResolver(runtime, requestSources) {
56
60
  return {
57
61
  async listLivePeers(filter, signal) {
58
62
  if (filter.meshName === undefined ||
@@ -62,6 +66,8 @@ function meshDescriptorPeerResolver(runtime) {
62
66
  return [];
63
67
  }
64
68
  const descriptors = await runtime.listLiveMeshNodes(filter.meshName, signal);
69
+ // The auto-connect poll owns the live descriptors; request acceptance reads them.
70
+ await requestSources.observeLiveDescriptors(filter.meshName, descriptors, signal);
65
71
  return descriptors
66
72
  .map((descriptor) => ({
67
73
  autoConnectType: Values_1.ZLinkLocationAutoConnectType.RouteMesh,
@@ -82,24 +88,17 @@ function meshDescriptorPeerResolver(runtime) {
82
88
  securityIdentity: descriptor.securityIdentity
83
89
  }
84
90
  }))
85
- .filter((peer) => (filter.nodeRid === undefined || String(peer.nodeRid) === String(filter.nodeRid)) &&
91
+ .filter((peer) => (filter.nodeRid === undefined || (0, routing_id_1.routingIdsEqual)(peer.nodeRid, filter.nodeRid)) &&
86
92
  (filter.endpoint === undefined || peer.endpoint === filter.endpoint));
87
93
  }
88
94
  };
89
95
  }
90
- function hasManualRouterConnections(spotNode) {
91
- return ((spotNode.router?.manualConnections?.length ?? 0) > 0 ||
92
- (spotNode.router?.manualPeerConnections?.length ?? 0) > 0);
93
- }
94
- const detachedSpotNodeAutoConnectResource = new node_async_hooks_1.AsyncResource('zlink:spot-node-autoconnect');
95
96
  class ZLinkSpotNodeAutoConnectExecutor {
96
97
  node;
97
- manualConnections;
98
98
  lane = new state_lane_1.ZLinkStateLane();
99
99
  connectionIntents = new Map();
100
- constructor(node, manualConnections) {
100
+ constructor(node) {
101
101
  this.node = node;
102
- this.manualConnections = manualConnections;
103
102
  }
104
103
  onDisconnected(handler) {
105
104
  this.node.onPeerDisconnected?.(handler);
@@ -112,30 +111,13 @@ class ZLinkSpotNodeAutoConnectExecutor {
112
111
  const intent = await this.lane.run(() => this.prepareConnectCore(key));
113
112
  if (intent === undefined)
114
113
  return true;
115
- return await runDetachedSpotNodeAutoConnect(() => this.connectPeer(target, key, intent));
114
+ return await (0, state_lane_1.startOutsideStateLane)(() => this.connectPeer(target, key, intent));
116
115
  }
117
116
  disconnect(target) {
118
117
  if (!this.connectionIntents.has(connectionKey(target)))
119
118
  return;
120
119
  this.disconnectPeer(target);
121
120
  }
122
- disconnectStalePeers(targets) {
123
- if (this.manualConnections)
124
- return;
125
- const current = new Map(targets
126
- .filter((target) => target.nodeRid !== undefined)
127
- .map((target) => [String(target.nodeRid), target]));
128
- const peers = this.node.peers();
129
- for (const peer of peers) {
130
- if (peer.routingId === null)
131
- continue;
132
- const target = current.get(String(peer.routingId));
133
- if (target !== undefined && peer.endpoint === target.endpoint) {
134
- continue;
135
- }
136
- this.node.disconnectPeer(peer.routingId, peer.lifecycleGeneration);
137
- }
138
- }
139
121
  isDisconnected(target) {
140
122
  // A connect intent still owns transport state even when its peer has not
141
123
  // reached the admitted table yet. Shutdown must remove that intent before
@@ -146,7 +128,7 @@ class ZLinkSpotNodeAutoConnectExecutor {
146
128
  .peers()
147
129
  .some((peer) => peer.routingId !== null &&
148
130
  peer.endpoint === target.endpoint &&
149
- (target.nodeRid === undefined || String(peer.routingId) === String(target.nodeRid)) &&
131
+ (target.nodeRid === undefined || (0, routing_id_1.routingIdsEqual)(peer.routingId, target.nodeRid)) &&
150
132
  peer.lifecycleGeneration === target.lifecycleGeneration &&
151
133
  peer.state === service_runtime_contracts_1.MeshPeerRuntimeState.Serving);
152
134
  }
@@ -183,7 +165,7 @@ class ZLinkSpotNodeAutoConnectExecutor {
183
165
  async connectPeer(target, key, intent) {
184
166
  const connectionIntentId = await this.node.connectPeer({
185
167
  endpoint: target.endpoint,
186
- expectedRid: target.nodeRid === undefined ? undefined : (0, routing_id_1.toBackendRoutingId)(target.nodeRid),
168
+ expectedRid: target.nodeRid === undefined ? undefined : (0, routing_id_2.toBackendRoutingId)(target.nodeRid),
187
169
  expectedSecurityIdentity: toAdmissionSecurityIdentity(target.metadata?.securityIdentity),
188
170
  expectedLifecycleGeneration: target.lifecycleGeneration
189
171
  });
@@ -213,16 +195,13 @@ class ZLinkSpotNodeAutoConnectExecutor {
213
195
  if (peer.endpoint !== target.endpoint) {
214
196
  continue;
215
197
  }
216
- if (target.nodeRid !== undefined && String(peer.routingId) !== String(target.nodeRid)) {
198
+ if (target.nodeRid !== undefined && !(0, routing_id_1.routingIdsEqual)(peer.routingId, target.nodeRid)) {
217
199
  continue;
218
200
  }
219
201
  this.node.disconnectPeer(peer.routingId, peer.lifecycleGeneration);
220
202
  }
221
203
  }
222
204
  }
223
- function runDetachedSpotNodeAutoConnect(work) {
224
- return detachedSpotNodeAutoConnectResource.runInAsyncScope(work);
225
- }
226
205
  function connectionKey(target) {
227
206
  return `${target.nodeRid ?? ''}\0${target.lifecycleGeneration}\0${target.endpoint}`;
228
207
  }
@@ -1,3 +1,4 @@
1
+ import type { ZLinkMeshDispatchAdmission } from '../admission';
1
2
  import type { ApplicationJobOrigin } from '../application-jobs/contracts';
2
3
  import { type ActorRef, type RoutingId, type ZLinkActor, type ZLinkChannelClient, type ZLinkFanoutClient, type ZLinkMeshNodeDescriptor, type ZLinkMessage, type ZLinkMessageSerializer, type ZLinkSpotPublisherClient, ZLinkFrameworkRuntimeState } from '../../contracts';
3
4
  import type { Message } from '../../contracts/Common/Message';
@@ -9,7 +10,7 @@ import type { ZLinkActorHandoffPacket } from '../actors/actor-handoff';
9
10
  import type { ZLinkBackendAdapterFactory, ZLinkBackendContext, ZLinkBackendMeshNode } from '../backend/contracts';
10
11
  import { ZLinkMeshCompletionTable } from '../backend/mesh-completion-table';
11
12
  import type { ZLinkDispatchErrorReporter } from '../channels';
12
- import { type ZLinkFrameworkRegistration } from '../configuration';
13
+ import { type ZLinkFrameworkRegistration, type ZLinkSpotNodeOptions } from '../configuration';
13
14
  import type { ZLinkRuntimeEventPublisher } from '../diagnostics';
14
15
  import type { ZLinkListenerRecords } from '../foundation/listener-records';
15
16
  import { type ZLinkMessageFollowOrigin, type ReadyRecord, type ReceiveRecord } from '../foundation/service-runtime-contracts';
@@ -75,6 +76,7 @@ export declare class ZLinkSpotNodeRuntimeManager {
75
76
  constructor(options: ZLinkSpotNodeRuntimeManagerOptions);
76
77
  createTopicMessage(): import("../backend/runtime-values").ZLinkBackendTopicMessage;
77
78
  configureLocationAutoConnect(runtime: ZLinkLocationRuntime, stores: ZLinkLocationRuntimeStores, options: ZLinkLocationOptionOverrides, events?: ZLinkLocationEventSink): void;
79
+ requestPeerReconcile(meshName: string, peerRid: string): Promise<void>;
78
80
  startLocationAutoConnect(signal?: AbortSignal): Promise<void>;
79
81
  /**
80
82
  * Fences transport connections that were created under an owner token which
@@ -85,6 +87,7 @@ export declare class ZLinkSpotNodeRuntimeManager {
85
87
  start(): Promise<void>;
86
88
  publishMeshNodeState(state: ZLinkFrameworkRuntimeState, signal?: AbortSignal, selectedMeshName?: string): Promise<void>;
87
89
  private publishMeshNodeStateCore;
90
+ private localDescriptorFields;
88
91
  reconcileAndPublishMeshNodeState(state: ZLinkFrameworkRuntimeState, meshName: string, signal?: AbortSignal): Promise<void>;
89
92
  private entrySpotId;
90
93
  get meshNodesByName(): ReadonlyMap<string, ZLinkBackendMeshNode>;
@@ -112,13 +115,21 @@ export declare class ZLinkSpotNodeRuntimeManager {
112
115
  serverChannels(meshName: string): [string, import("../configuration").ZLinkMeshChannelOptions][];
113
116
  dispose(signal?: AbortSignal, deadline?: Date): Promise<void>;
114
117
  private disposeCore;
118
+ /**
119
+ * Node and Channel records go straight to the framework dispatcher in the
120
+ * pump's turn. Only Spot and Actor records addressed to the Entry Spot wait
121
+ * for its activation first.
122
+ */
115
123
  private dispatchMeshRecord;
116
- dispatchEntrySpotRecord(meshName: string, owner: ReadyRecord, record: ReceiveRecord): Promise<boolean>;
124
+ private targetsEntrySpot;
125
+ private dispatchFrameworkRecord;
126
+ dispatchEntrySpotRecord(meshName: string, owner: ReadyRecord, record: ReceiveRecord, admit?: ZLinkMeshDispatchAdmission): Promise<boolean>;
117
127
  private ensureEntryActivation;
118
128
  private initializeEntrySpot;
119
129
  private primaryEntryActivation;
120
130
  dispatchEntryActorPacket(origin: ApplicationJobOrigin, actorId: string, parts: readonly Message[], returnResponse?: boolean, remoteBoundSessionTarget?: ZLinkRemoteBoundSessionTarget, fallbackActorRef?: ActorRef, requestTerminal?: (response: unknown) => Promise<void> | void, messageFollowOrigin?: ZLinkMessageFollowOrigin): Promise<unknown>;
121
131
  dispatchEntryActorJoin(meshName: string, actor: ZLinkActor, handoffBacklog?: readonly ZLinkActorHandoffPacket[]): Promise<void>;
132
+ admitEntryActorPacketPrefix(meshName: string, actorId: string, records: readonly import('../actors/actor-handoff').ZLinkActorHandoffPrefixRecord[]): import('../actors/actor-handoff').ZLinkActorHandoffPrefixAdmission;
122
133
  executeEntryActor<T>(meshName: string, actorId: string, operation: () => Promise<T>): Promise<T>;
123
134
  publish(meshName: string, channelName: string, topic: string, packetName: string | undefined, event: Message, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>): Promise<ZLinkSubmitResult>;
124
135
  private executePublish;
@@ -126,3 +137,9 @@ export declare class ZLinkSpotNodeRuntimeManager {
126
137
  private publishWithFlags;
127
138
  }
128
139
  export declare function createFrameworkEntrySpotId(prefix: string): string;
140
+ /**
141
+ * The one decision for creating a new Actor on this node (Actor model §6.3): the node registered
142
+ * an Entry Spot type that accepts the Actor type and an Actor factory for it. Publication and the
143
+ * target refusal both read it.
144
+ */
145
+ export declare function registrationAcceptsNewActor(registration: ZLinkSpotNodeOptions, stableType: string): boolean;