@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
@@ -219,21 +219,6 @@ export class ZLinkSpotActorMembership {
219
219
  );
220
220
  }
221
221
 
222
- async restoreActorAfterFailedTransfer(
223
- spotId: RoutingId,
224
- actor: ZLinkActor,
225
- signal?: AbortSignal
226
- ): Promise<void> {
227
- throwIfAborted(signal);
228
- const activation = this.requireActivation(spotId);
229
- await this.runLifecycleOperation(activation, () =>
230
- activation.serial.execute(async () => {
231
- activation.cancelActorTransfer(actor.context.actorId);
232
- await activation.spot.onJoinedActor(actor);
233
- })
234
- );
235
- }
236
-
237
222
  async beginActorTransfer(spotId: RoutingId, actorId: string): Promise<void> {
238
223
  const activation = this.requireActivation(spotId);
239
224
  await this.runLifecycleOperation(activation, () =>
@@ -1,3 +1,7 @@
1
+ import { actorMessageFollowContext } from '../actors/actor-message-follow-context';
2
+ import { DefaultZLinkActorContext } from '../actors/actor-context';
3
+ import { decodeSessionDisconnected } from '../actors/session-disconnected-wire';
4
+ import { routingIdsEqual } from '../routing-id';
1
5
  import type { ApplicationJobOrigin } from '../application-jobs/contracts';
2
6
  import {
3
7
  ZLinkFrameworkInternalErrorKind,
@@ -12,7 +16,13 @@ import type {
12
16
  ZLinkSpot
13
17
  } from '../../contracts';
14
18
  import type { Message } from '../../contracts/Common/Message';
15
- import { ZLinkFrameworkException, zlinkMessageMetadata } from '../../contracts';
19
+ import {
20
+ ZLinkFrameworkException,
21
+ ZLinkFrameworkErrorKind,
22
+ ZLinkMessage,
23
+ ZLinkEncodedPayload,
24
+ zlinkMessageMetadata
25
+ } from '../../contracts';
16
26
  import {
17
27
  ZLinkRuntimeMessageFlowOutcome as ZLinkMessageFlowOutcome,
18
28
  ZLinkRuntimeDispatchErrorAction as ZLinkDispatchErrorAction,
@@ -45,6 +55,10 @@ import { zlinkMetadataByteLength, zlinkSerialWorkOptions } from '../execution/se
45
55
  import type { ZLinkMessageFollowOrigin } from '../foundation/service-runtime-contracts';
46
56
  import { releaseApplicationJobPermitBeforeHandler } from '../application-jobs/application-job-queue-scope';
47
57
 
58
+ const emptyDisconnectedReply = ZLinkMessage.fromEncoded(
59
+ ZLinkEncodedPayload.fromOwned(Buffer.alloc(0))
60
+ );
61
+
48
62
  export interface ZLinkActorResponseOptions {
49
63
  readonly metadata: ReadonlyMap<string, string>;
50
64
  readonly compressPayload: boolean;
@@ -204,11 +218,13 @@ export class ZLinkSpotActorPacketDispatch {
204
218
  ? ZLinkDispatchErrorAction.ReplyError
205
219
  : ZLinkDispatchErrorAction.Drop;
206
220
  this.trace(ZLinkMessageFlowOutcome.Received, actorId, header, messageKind);
207
- if (
208
- this.options.actorLeft?.(actorId) === true &&
209
- header.name === ZLINK_REMOTE_ACTOR_SESSION_DISCONNECTED_PACKET
210
- ) {
211
- return undefined;
221
+ const disconnected = header.name === ZLINK_REMOTE_ACTOR_SESSION_DISCONNECTED_PACKET;
222
+ const disconnectedReply =
223
+ disconnected && header.kind === ZLinkStreamMessageKind.Request
224
+ ? emptyDisconnectedReply
225
+ : undefined;
226
+ if (this.options.actorLeft?.(actorId) === true && disconnected) {
227
+ return disconnectedReply;
212
228
  }
213
229
  const routed = await this.options.routeBeforeLocal?.(delivery);
214
230
  if (routed?.handled === true) {
@@ -229,9 +245,34 @@ export class ZLinkSpotActorPacketDispatch {
229
245
  requestTerminal
230
246
  );
231
247
  }
232
- if (header.name === ZLINK_REMOTE_ACTOR_SESSION_DISCONNECTED_PACKET) {
248
+ if (disconnected) {
249
+ const identity = decodeSessionDisconnected(messageToBytes(parts[1]));
250
+ if (identity === undefined) {
251
+ if (this.options.dispatchErrors?.captureEnabled() === true)
252
+ this.reportInvalidFrame(
253
+ actorId,
254
+ messageKind,
255
+ new ZLinkFrameworkException(
256
+ ZLinkFrameworkErrorKind.ProtocolError,
257
+ 'ProtocolError: malformed Session disconnect identity.'
258
+ ),
259
+ 'warning'
260
+ );
261
+ return disconnectedReply;
262
+ }
263
+ const current =
264
+ actor.context instanceof DefaultZLinkActorContext
265
+ ? actor.context.currentSessionBinding
266
+ : undefined;
267
+ if (
268
+ current !== undefined &&
269
+ (!routingIdsEqual(current.sessionNodeRid, identity.sessionOwnerNodeRid) ||
270
+ current.sessionOwnerNodeGeneration !== identity.sessionOwnerNodeGeneration ||
271
+ current.bindingGeneration !== identity.bindingGeneration)
272
+ )
273
+ return disconnectedReply;
233
274
  await this.options.onDisconnectActor(actor);
234
- return undefined;
275
+ return disconnectedReply;
235
276
  }
236
277
  const decodePayload = this.createPayloadDecoder(parts[1], header);
237
278
  return this.dispatchActorPacket(
@@ -303,7 +344,9 @@ export class ZLinkSpotActorPacketDispatch {
303
344
  return undefined;
304
345
  }
305
346
  const missingActorError = createInternalFrameworkException(
306
- ZLinkFrameworkInternalErrorKind.ActorDispatchHandlerNotFound,
347
+ actorMessageFollowContext(fallbackActorRef) === undefined
348
+ ? ZLinkFrameworkInternalErrorKind.ActorDispatchHandlerNotFound
349
+ : ZLinkFrameworkInternalErrorKind.ActorLocationStale,
307
350
  `SPOT actor is not registered locally: ${actorId}`
308
351
  );
309
352
  if (
@@ -603,7 +646,8 @@ export class ZLinkSpotActorPacketDispatch {
603
646
  private reportInvalidFrame(
604
647
  actorId: string,
605
648
  messageKind: ZLinkDispatchMessageKind,
606
- error?: unknown
649
+ error?: unknown,
650
+ severity?: 'warning'
607
651
  ): void {
608
652
  this.options.dispatchErrors?.report({
609
653
  surface: ZLinkDispatchErrorSurface.SpotActor,
@@ -612,7 +656,8 @@ export class ZLinkSpotActorPacketDispatch {
612
656
  action: ZLinkDispatchErrorAction.Drop,
613
657
  spotId: this.options.spotId(),
614
658
  actorId,
615
- error
659
+ error,
660
+ severity
616
661
  });
617
662
  }
618
663
 
@@ -1,5 +1,4 @@
1
1
  import type { ActorRef, RoutingId, ZLinkMessageSerializer } from '../../contracts';
2
- import { ZLinkFrameworkException, ZLinkFrameworkErrorKind } from '../../contracts';
3
2
  import type { Message } from '../../contracts/Common/Message';
4
3
  import { ZLinkBufferMessage as RuntimeMessage } from '../backend/runtime-message';
5
4
  import { RequestResult } from '../backend/runtime-values';
@@ -7,15 +6,9 @@ import type { ZLinkBackendActorRef, ZLinkBackendActorRecvInfo } from '../backend
7
6
  import type { ZLinkActorPacketDelivery } from './spot-actor-packet-dispatch';
8
7
  import { REMOTE_BOUND_SESSION_BIND_PACKET } from './spot-remote-codec';
9
8
  import { ZLINK_RECV_DONT_WAIT } from './spot-native-flags';
10
- import {
11
- decodeStreamHeader,
12
- encodeStreamFrame,
13
- messageToBytes,
14
- streamCodecForContentType,
15
- ZLinkStreamHeaderFlags,
16
- ZLinkStreamMessageKind
17
- } from '../streams/protocol';
18
- import { encodeFrameworkPayload } from '../messaging/payload-codec';
9
+ import { decodeStreamHeader, messageToBytes, ZLinkStreamMessageKind } from '../streams/protocol';
10
+ import { encodeActorReply } from '../actors/actor-reply';
11
+ import { boundSessionErrorPayload } from '../streams/bound-session-response-target';
19
12
 
20
13
  export interface ZLinkActorDispatchPart {
21
14
  readonly info: {
@@ -218,7 +211,7 @@ export class ZLinkSpotActorPacketDrain {
218
211
  this.encodeActorReplyFrame(
219
212
  parts[0],
220
213
  ZLinkStreamMessageKind.Error,
221
- frameworkErrorPayload(error)
214
+ boundSessionErrorPayload(error)
222
215
  )
223
216
  ],
224
217
  RequestResult.Ok
@@ -231,37 +224,14 @@ export class ZLinkSpotActorPacketDrain {
231
224
  kind: ZLinkStreamMessageKind.Response | ZLinkStreamMessageKind.Error,
232
225
  payload: unknown
233
226
  ): Message {
234
- const requestHeader = decodeStreamHeader(messageToBytes(requestHeaderPart), this.flowEnabled());
235
- const encoded = encodeFrameworkPayload(
227
+ const [frame] = encodeActorReply(
228
+ messageToBytes(requestHeaderPart),
229
+ kind,
236
230
  payload,
237
231
  this.options.messageSerializers,
238
- kind === ZLinkStreamMessageKind.Response ? requestHeader.name : undefined,
239
- 'payload'
232
+ this.flowEnabled()
240
233
  );
241
- try {
242
- // encodeStreamFrame returns a fresh, unaliased array; view it without re-copying.
243
- const frame = encodeStreamFrame(
244
- {
245
- kind,
246
- codec: streamCodecForContentType(encoded.contentType),
247
- flags: ZLinkStreamHeaderFlags.None,
248
- requestSeq: requestHeader.requestSeq,
249
- name: '',
250
- metadata: new Map(),
251
- correlationId: requestHeader.correlationId,
252
- // Spec 27 §7: preserve the request flow pair on the reply while
253
- // tracing is on; the gated decode above already strips it at Off.
254
- flowId: requestHeader.flowId,
255
- flowOrigin: requestHeader.flowOrigin
256
- },
257
- encoded.message.data()
258
- );
259
- return RuntimeMessage.fromOwned(
260
- Buffer.from(frame.buffer, frame.byteOffset, frame.byteLength)
261
- ) as Message;
262
- } finally {
263
- encoded.message.close();
264
- }
234
+ return RuntimeMessage.fromOwned(frame) as Message;
265
235
  }
266
236
 
267
237
  private consumeRemoteBoundSessionBind(
@@ -329,16 +299,3 @@ function isStreamHeaderMessage(message: Message, flowEnabled: boolean): boolean
329
299
  function closeMessages(messages: readonly Message[]): void {
330
300
  for (const message of messages) message.close();
331
301
  }
332
-
333
- function frameworkErrorPayload(error: unknown): {
334
- readonly message: string;
335
- readonly kind: ZLinkFrameworkErrorKind;
336
- } {
337
- return {
338
- message: error instanceof Error ? error.message : String(error),
339
- kind:
340
- error instanceof ZLinkFrameworkException
341
- ? error.kind
342
- : ZLinkFrameworkErrorKind.InternalFailure
343
- };
344
- }
@@ -1,3 +1,4 @@
1
+ import { currentApplicationJobOrigin } from '../application-jobs/application-job-queue-scope';
1
2
  import type {
2
3
  ActorRef,
3
4
  RoutingId,
@@ -50,7 +51,7 @@ import {
50
51
  DefaultZLinkSpotHandlerRegistry
51
52
  } from './spot-handler-registry';
52
53
  import { DefaultZLinkSpotOutbound, type ZLinkSpotRoutedTransport } from './spot-outbound';
53
- import { createProviderInstance } from './spot-provider';
54
+ import { createFreshProviderInstance } from './spot-provider';
54
55
  import { ZLinkSpotSerialTurnExecutor } from './spot-serial-turn-executor';
55
56
  import { ZLinkSpotSerialExecutor } from './spot-serial-executor';
56
57
  import { invokeSpotClosing } from './spot-closing';
@@ -269,7 +270,7 @@ export class ZLinkEntrySpotActivation {
269
270
  }
270
271
 
271
272
  async create(): Promise<void> {
272
- const entrySpot = await createProviderInstance(
273
+ const entrySpot = await createFreshProviderInstance(
273
274
  this.options.entrySpotType,
274
275
  this.options.providerResolver,
275
276
  this.context
@@ -479,23 +480,7 @@ export class ZLinkEntrySpotActivation {
479
480
  remoteBoundSessionTarget,
480
481
  fallbackActorRef,
481
482
  undefined,
482
- messageFollowOrigin,
483
- (
484
- replayedParts,
485
- replayReturnResponse,
486
- replayRemoteBoundSessionTarget,
487
- replayFallbackActorRef
488
- ) =>
489
- this.spotSerialExecutor.executeActor(actorId, () =>
490
- this.dispatchActorPacketInsideMailbox({
491
- origin: delivery.origin,
492
- actorId,
493
- parts: replayedParts,
494
- returnResponse: replayReturnResponse,
495
- remoteBoundSessionTarget: replayRemoteBoundSessionTarget,
496
- fallbackActorRef: replayFallbackActorRef
497
- })
498
- )
483
+ messageFollowOrigin
499
484
  );
500
485
  if (handoff !== undefined) return await handoff;
501
486
  return this.spotSerialExecutor.executeActor(actorId, () =>
@@ -503,6 +488,26 @@ export class ZLinkEntrySpotActivation {
503
488
  );
504
489
  }
505
490
 
491
+ /** Restores source packets through the Entry Actor's existing executor. */
492
+ admitActorPacketPrefix(
493
+ actorId: string,
494
+ records: readonly import('../actors/actor-handoff').ZLinkActorHandoffPrefixRecord[]
495
+ ): import('../actors/actor-handoff').ZLinkActorHandoffPrefixAdmission {
496
+ return this.spotSerialExecutor.admitActorPacketPrefix(
497
+ actorId,
498
+ records,
499
+ (_serial, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef) =>
500
+ this.dispatchActorPacketInsideMailbox({
501
+ origin: currentApplicationJobOrigin(),
502
+ actorId,
503
+ parts,
504
+ returnResponse,
505
+ remoteBoundSessionTarget,
506
+ fallbackActorRef
507
+ })
508
+ );
509
+ }
510
+
506
511
  private async replayActorBacklog(
507
512
  actor: ZLinkActor,
508
513
  backlog: readonly ZLinkActorHandoffPacket[]
@@ -2,9 +2,11 @@ import type {
2
2
  Type,
3
3
  ZLinkActor,
4
4
  ZLinkEntrySpot,
5
+ ZLinkInstanceSpot,
5
6
  ZLinkInstanceSpotHandlerRegistry,
6
7
  ZLinkSpot,
7
- ZLinkSpotHandlerRegistry
8
+ ZLinkSpotHandlerRegistry,
9
+ ZLinkSpotTimerHandler
8
10
  } from '../../contracts';
9
11
  import type {
10
12
  ZLinkEntrySpotActorRequestHandlerRegistration,
@@ -26,7 +28,7 @@ import { ZLinkActorPacketKind, ZLinkSpotActorHandlerRegistryRuntime } from '../a
26
28
  import { readZLinkDecoratorMetadata } from '../../contracts/Handlers/Attributes';
27
29
 
28
30
  export interface ZLinkSpotHandlerRegistration {
29
- readonly kind: 'packet' | 'subscribe' | 'actorSend' | 'actorRequest' | 'spotHandler';
31
+ readonly kind: 'packet' | 'subscribe' | 'actorSend' | 'actorRequest' | 'timer';
30
32
  readonly handlerType: Type;
31
33
  readonly packetName?: string;
32
34
  readonly channelName?: string;
@@ -195,9 +197,11 @@ export class DefaultZLinkSpotHandlerRegistry<
195
197
  return this.addSubscribe(handlerType, channelName, topic);
196
198
  }
197
199
 
198
- addSpotHandler(handlerType: Type): this {
200
+ addTimerHandler<THandler extends ZLinkSpotTimerHandler<ZLinkSpot>>(
201
+ handlerType: Type<THandler>
202
+ ): this {
199
203
  prepareHandlerInstance(this.providerResolver, handlerType);
200
- this.entries.push({ kind: 'spotHandler', handlerType });
204
+ this.entries.push({ kind: 'timer', handlerType });
201
205
  return this;
202
206
  }
203
207
 
@@ -218,6 +222,13 @@ export class DefaultZLinkInstanceSpotHandlerRegistry implements ZLinkInstanceSpo
218
222
  return this;
219
223
  }
220
224
 
225
+ addTimerHandler<THandler extends ZLinkSpotTimerHandler<ZLinkInstanceSpot>>(
226
+ handlerType: Type<THandler>
227
+ ): this {
228
+ this.registrations.addTimerHandler(handlerType as never);
229
+ return this;
230
+ }
231
+
221
232
  snapshot(): readonly ZLinkSpotHandlerRegistration[] {
222
233
  return this.registrations.snapshot();
223
234
  }
@@ -5,7 +5,7 @@ export interface ZLinkLocalSpotCreateResult {
5
5
  readonly state: ZLinkSpotCreateState;
6
6
  readonly reply?: unknown;
7
7
  readonly publication?: {
8
- publish(): void;
9
- abort(): void;
8
+ publish(): void | Promise<void>;
9
+ abort(): void | Promise<void>;
10
10
  };
11
11
  }
@@ -196,7 +196,7 @@ export class ZLinkPublicSpotManager implements ZLinkSpotManager {
196
196
  yield: (signal) => {
197
197
  const yieldTurn = requireZLinkYieldTurn(turn);
198
198
  const pending = this.submit(spotId, stableType, generatedIdentity, state, signal);
199
- return yieldTurn.yieldPromise(pending);
199
+ return yieldTurn.yieldFrameworkPromise(pending);
200
200
  }
201
201
  };
202
202
  return call;
@@ -264,7 +264,7 @@ export class ZLinkPublicSpotManager implements ZLinkSpotManager {
264
264
  }
265
265
  };
266
266
  } catch (error) {
267
- this.options.local.abortUserSpotPublication(target.meshName, spotId);
267
+ await this.options.local.abortUserSpotPublication(target.meshName, spotId);
268
268
  throw error;
269
269
  }
270
270
  },
@@ -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,10 +156,7 @@ 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);
@@ -172,7 +171,7 @@ class ZLinkSpotNodeAutoConnectExecutor implements IZLinkAutoConnectExecutor {
172
171
  return false;
173
172
  const intent = await this.lane.run(() => this.prepareConnectCore(key));
174
173
  if (intent === undefined) return true;
175
- return await runDetachedSpotNodeAutoConnect(() => this.connectPeer(target, key, intent));
174
+ return await startOutsideStateLane(() => this.connectPeer(target, key, intent));
176
175
  }
177
176
 
178
177
  disconnect(target: ZLinkAutoConnectTarget): void {
@@ -180,24 +179,6 @@ class ZLinkSpotNodeAutoConnectExecutor implements IZLinkAutoConnectExecutor {
180
179
  this.disconnectPeer(target);
181
180
  }
182
181
 
183
- disconnectStalePeers(targets: readonly ZLinkAutoConnectTarget[]): void {
184
- if (this.manualConnections) return;
185
- const current = new Map(
186
- targets
187
- .filter((target) => target.nodeRid !== undefined)
188
- .map((target) => [String(target.nodeRid), target])
189
- );
190
- const peers = this.node.peers();
191
- for (const peer of peers) {
192
- if (peer.routingId === null) continue;
193
- const target = current.get(String(peer.routingId));
194
- if (target !== undefined && peer.endpoint === target.endpoint) {
195
- continue;
196
- }
197
- this.node.disconnectPeer(peer.routingId, peer.lifecycleGeneration);
198
- }
199
- }
200
-
201
182
  isDisconnected(target: ZLinkAutoConnectTarget): boolean {
202
183
  // A connect intent still owns transport state even when its peer has not
203
184
  // reached the admitted table yet. Shutdown must remove that intent before
@@ -209,7 +190,7 @@ class ZLinkSpotNodeAutoConnectExecutor implements IZLinkAutoConnectExecutor {
209
190
  (peer) =>
210
191
  peer.routingId !== null &&
211
192
  peer.endpoint === target.endpoint &&
212
- (target.nodeRid === undefined || String(peer.routingId) === String(target.nodeRid)) &&
193
+ (target.nodeRid === undefined || routingIdsEqual(peer.routingId, target.nodeRid)) &&
213
194
  peer.lifecycleGeneration === target.lifecycleGeneration &&
214
195
  peer.state === MeshPeerRuntimeState.Serving
215
196
  );
@@ -291,7 +272,7 @@ class ZLinkSpotNodeAutoConnectExecutor implements IZLinkAutoConnectExecutor {
291
272
  if (peer.endpoint !== target.endpoint) {
292
273
  continue;
293
274
  }
294
- if (target.nodeRid !== undefined && String(peer.routingId) !== String(target.nodeRid)) {
275
+ if (target.nodeRid !== undefined && !routingIdsEqual(peer.routingId, target.nodeRid)) {
295
276
  continue;
296
277
  }
297
278
  this.node.disconnectPeer(peer.routingId, peer.lifecycleGeneration);
@@ -299,10 +280,6 @@ class ZLinkSpotNodeAutoConnectExecutor implements IZLinkAutoConnectExecutor {
299
280
  }
300
281
  }
301
282
 
302
- function runDetachedSpotNodeAutoConnect<T>(work: () => Promise<T>): Promise<T> {
303
- return detachedSpotNodeAutoConnectResource.runInAsyncScope(work);
304
- }
305
-
306
283
  function connectionKey(target: ZLinkAutoConnectTarget): string {
307
284
  return `${target.nodeRid ?? ''}\0${target.lifecycleGeneration}\0${target.endpoint}`;
308
285
  }