@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
@@ -9,6 +9,7 @@ import type { ZLinkListenerRecords } from '../foundation/listener-records';
9
9
  import { ApplicationJobQueue } from '../host/application-job-queue';
10
10
  import type { ZLinkSubmitResult } from '../messaging/submission-result';
11
11
  import { type ZLinkActorSessionAuthorityFence } from './actor-session-binding-registry';
12
+ import { type ZLinkBoundActorRelaySenderOptions } from './bound-actor-relay-sender';
12
13
  import { type ZLinkBoundSessionResponseTarget } from './bound-session-response-target';
13
14
  import { type ZLinkBoundSessionTransport } from './bound-session-service';
14
15
  import { ZLinkManagedStream } from './managed-stream';
@@ -45,7 +46,7 @@ export interface ZLinkStreamBindingRuntimeOptions {
45
46
  reportRuntimeTaskException(taskName: string, error: unknown): void;
46
47
  } | undefined;
47
48
  readonly relay?: (actor: ZLinkSessionActor, header: ZLinkStreamFrameHeader, payload: Message) => Promise<boolean>;
48
- readonly notifyDisconnected?: (actor: ZLinkSessionActor, signal?: AbortSignal) => Promise<void>;
49
+ readonly notifyDisconnected?: ZLinkBoundActorRelaySenderOptions['notifyDisconnected'];
49
50
  readonly flowCreationEnabled?: () => boolean;
50
51
  readonly metrics?: import('../diagnostics').ZLinkRuntimeMetrics;
51
52
  }
@@ -139,7 +140,7 @@ export declare class ZLinkStreamBindingRuntime {
139
140
  sendNativeBoundSession(node: ZLinkBackendActorSessionNode, actorRef: ActorRef, message: unknown, packetName: string | undefined, metadata: ReadonlyMap<string, string>, signal?: AbortSignal): Promise<ZLinkSubmitResult>;
140
141
  sendNativeBoundSessionResponse(node: ZLinkBackendActorSessionNode, actorRef: ActorRef, packetName: string, requestSeq: bigint, message: unknown, metadata: ReadonlyMap<string, string>, compressPayload: boolean, signal?: AbortSignal): Promise<void>;
141
142
  sendNativeBoundSessionError(node: ZLinkBackendActorSessionNode, actorRef: ActorRef, packetName: string, requestSeq: bigint, error: unknown, metadata: ReadonlyMap<string, string>, signal?: AbortSignal): Promise<void>;
142
- disconnectNativeBoundSession(node: ZLinkBackendActorSessionNode, actorRef: ActorRef, signal?: AbortSignal): Promise<void>;
143
+ disconnectNativeBoundSession(node: ZLinkBackendActorSessionNode, actorRef: ActorRef, timeoutMs: number, signal?: AbortSignal): Promise<void>;
143
144
  disconnectBoundSession(actorId: string, signal?: AbortSignal): Promise<void>;
144
145
  closeSessionBinding(actorId: string, expected: ZLinkSessionBindingIdentity, signal?: AbortSignal): Promise<void>;
145
146
  relay(actor: DefaultZLinkSessionActor, payload: ZLinkMessage, dispatchHeader?: ZLinkStreamFrameHeader): Promise<ZLinkSubmitResult>;
@@ -220,12 +220,14 @@ class ZLinkStreamBindingRuntime {
220
220
  this.sessionActors = new session_actor_coordinator_1.ZLinkSessionActorCoordinator(this.routes, this, runtimeOptions, actorSessionLifecycle);
221
221
  this.boundActorRelay = new bound_actor_relay_sender_1.ZLinkBoundActorRelaySender(this.routes, this.frameMessages, runtimeOptions, actorSessionLifecycle);
222
222
  (0, actor_session_binding_runtime_owner_1.registerActorSessionBindingRuntimeOwner)(this, {
223
+ prepareSessionRelocationSeal: (...args) => this.routes.prepareSessionRelocationSeal(...args),
224
+ acceptSessionRelocationRoute: (value, apply) => this.routes.acceptSessionRelocationRoute(value, apply),
225
+ clearSessionRelocationResults: () => this.routes.clearSessionRelocationResults(),
223
226
  actorSlot: async (actorId, sessionRid) => (await this.routes.routeForSessionBinding(actorId, sessionRid))?.actorSlot,
224
- sealRelocation: (claim, expected, signal) => this.routes.sealRelocation(claim, expected, signal),
225
227
  relocationSnapshot: (actorId, sealId) => this.routes.relocationSnapshot(actorId, sealId),
226
228
  applyRelocation: (...args) => this.routes.applyRelocation(...args),
227
229
  observeRelocationTerminal: (...args) => this.routes.observeRelocationTerminal(...args),
228
- clearRelocation: (actorId, error) => this.routes.clearRelocation(actorId, error),
230
+ clearRelocation: (...args) => this.routes.clearRelocation(...args),
229
231
  committedRoute: async (actorId) => {
230
232
  const route = await this.routes.route(actorId);
231
233
  return route === undefined
@@ -319,8 +321,8 @@ class ZLinkStreamBindingRuntime {
319
321
  async sendNativeBoundSessionError(node, actorRef, packetName, requestSeq, error, metadata, signal) {
320
322
  await this.boundSessions.sendNativeBoundSessionError(node, actorRef, packetName, requestSeq, error, metadata, signal);
321
323
  }
322
- async disconnectNativeBoundSession(node, actorRef, signal) {
323
- await this.boundSessions.disconnectNativeBoundSession(node, actorRef, signal);
324
+ async disconnectNativeBoundSession(node, actorRef, timeoutMs, signal) {
325
+ await this.boundSessions.disconnectNativeBoundSession(node, actorRef, timeoutMs, signal);
324
326
  }
325
327
  async disconnectBoundSession(actorId, signal) {
326
328
  await this.boundSessions.disconnectBoundSession(actorId, signal);
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ZLinkManagedStream = void 0;
4
4
  exports.streamSessionIdFromRoutingId = streamSessionIdFromRoutingId;
5
+ const routing_id_1 = require("../routing-id");
5
6
  const framework_errors_internal_1 = require("../framework-errors-internal");
6
7
  const submission_result_1 = require("../messaging/submission-result");
7
8
  const abort_1 = require("../abort");
@@ -140,7 +141,7 @@ class ZLinkManagedStream {
140
141
  ? undefined
141
142
  : (_actorId, retiredSession, replacedActor) => {
142
143
  onBindingReplaced(replacedActor, retiredSession);
143
- }, toStreamSessionActorAuthorityFence(authorityFence)), signal), `Actor '${actor.actorId}' native session bind`);
144
+ }, toStreamSessionActorAuthorityFence(authorityFence), () => this.close()), signal), `Actor '${actor.actorId}' native session bind`);
144
145
  const binding = route.service
145
146
  .bindings(this.backendRoutingId())
146
147
  .find((candidate) => candidate.actor.actorId === nativeActor.actorId &&
@@ -180,7 +181,7 @@ class ZLinkManagedStream {
180
181
  resolved === undefined ||
181
182
  resolved.actorId !== actor.actorId ||
182
183
  resolved.generation !== actor.objectGeneration ||
183
- String(resolved.nodeRid) !== String(actor.nodeRid)) {
184
+ !(0, routing_id_1.routingIdsEqual)(resolved.nodeRid, actor.nodeRid)) {
184
185
  throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorRouteNotFound, `Actor '${actor.actorId}' native route fence does not match its ActorRef ` +
185
186
  `(expected ${String(actor.nodeRid)}/${actor.objectGeneration}, ` +
186
187
  `resolved ${(0, diagnostic_text_1.diagnosticTextOrAbsent)(resolved === undefined
@@ -1,14 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ZLinkNativeFallbackBoundSession = void 0;
4
+ const Registration_1 = require("../../contracts/Configuration/Registration");
4
5
  const framework_errors_internal_1 = require("../framework-errors-internal");
5
6
  const contracts_1 = require("../../contracts");
6
7
  const submission_result_1 = require("../messaging/submission-result");
7
8
  const actors_1 = require("../actors");
8
9
  const actor_packet_relay_wire_1 = require("../actors/actor-packet-relay-wire");
9
10
  const bound_session_wire_1 = require("../actors/bound-session-wire");
10
- const actor_routed_json_request_1 = require("../actors/actor-routed-json-request");
11
- const protocol_1 = require("./protocol");
12
11
  const packet_name_1 = require("../messaging/packet-name");
13
12
  const flow_context_1 = require("../diagnostics/flow-context");
14
13
  class ZLinkNativeFallbackBoundSession {
@@ -20,40 +19,12 @@ class ZLinkNativeFallbackBoundSession {
20
19
  return new ZLinkNativeFallbackBoundSessionSendCall(this.options, message);
21
20
  }
22
21
  async disconnect(signal) {
23
- const remoteTarget = this.options.remoteBoundSessionTargetProvider();
24
- if (remoteTarget !== undefined) {
25
- const spotKind = 'spotKind' in remoteTarget
26
- ? remoteTarget.spotKind
27
- : undefined;
28
- const payload = (0, actor_packet_relay_wire_1.encodeRemoteActorPacketRelayPayload)({
29
- actorId: this.options.actorId,
30
- routerChannelId: remoteTarget.routerChannelId,
31
- header: (0, protocol_1.encodeStreamHeader)(disconnectedFrameHeader()),
32
- payload: Buffer.alloc(0)
33
- });
34
- const target = {
35
- routerChannelId: remoteTarget.routerChannelId,
36
- targetNodeRid: remoteTarget.targetNodeRid,
37
- spotId: remoteTarget.spotId,
38
- spotKind: spotKind ?? contracts_1.ZLinkSpotKind.Entry
39
- };
40
- if (await (0, actor_routed_json_request_1.tryRequestRoutedJson)(this.options.routedTransport, target, payload, {
41
- timeoutMs: this.options.requestTimeoutMs,
42
- signal
43
- })) {
44
- return;
45
- }
46
- await this.options.routedTransport.sendToSpot(target, payload, {
47
- packetName: actors_1.ZLINK_REMOTE_ACTOR_PACKET_RELAY_PACKET
48
- });
49
- return;
50
- }
51
22
  const actorRef = this.options.actorRefProvider();
52
23
  const node = this.options.nativeActorNodeProvider();
53
24
  if (actorRef !== undefined &&
54
25
  node !== undefined &&
55
26
  currentBindingGeneration(actorRef) !== undefined) {
56
- await this.options.runtime.disconnectNativeBoundSession(node, actorRef, signal);
27
+ await this.options.runtime.disconnectNativeBoundSession(node, actorRef, this.options.requestTimeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS, signal);
57
28
  return;
58
29
  }
59
30
  await this.options.runtime.disconnectBoundSession(this.options.actorId, signal);
@@ -96,30 +67,11 @@ class ZLinkNativeFallbackBoundSessionSendCall {
96
67
  async executeScoped(packetName) {
97
68
  const localActor = this.options.localActorProvider?.() === true;
98
69
  const remoteTarget = this.options.remoteBoundSessionTargetProvider();
99
- let nativeAttempted = false;
100
- if (localActor) {
101
- const result = await this.options.runtime.submitLocalBoundSession(this.options.actorId, this.message, packetName, this.selectedMetadata);
102
- if (result.status !== submission_result_1.ZLinkSubmitStatus.TargetNotFound) {
103
- this.traceSubmitted(result, packetName);
104
- return result;
105
- }
106
- // A local Actor with a concrete native owner has a direct binding path.
107
- // Use that path before a routed transfer target. The transfer target is
108
- // retained for actors whose current owner is remote or whose native
109
- // binding is no longer available.
110
- const actorRef = this.options.actorRefProvider();
111
- const node = this.options.nativeActorNodeProvider();
112
- const bindingGeneration = currentBindingGeneration(actorRef);
113
- if (actorRef !== undefined && node !== undefined && bindingGeneration !== undefined) {
114
- nativeAttempted = true;
115
- const result = await this.options.runtime.sendNativeBoundSession(node, actorRef, this.message, packetName, this.selectedMetadata);
116
- if (result.status !== submission_result_1.ZLinkSubmitStatus.TargetNotFound) {
117
- this.traceSubmitted(result, packetName);
118
- return result;
119
- }
120
- if (remoteTarget === undefined) {
121
- return result;
122
- }
70
+ if (localActor || remoteTarget === undefined) {
71
+ const localResult = await this.options.runtime.submitLocalBoundSession(this.options.actorId, this.message, packetName, this.selectedMetadata);
72
+ if (localResult.status !== submission_result_1.ZLinkSubmitStatus.TargetNotFound) {
73
+ this.traceSubmitted(localResult, packetName);
74
+ return localResult;
123
75
  }
124
76
  }
125
77
  if (remoteTarget !== undefined) {
@@ -152,18 +104,10 @@ class ZLinkNativeFallbackBoundSessionSendCall {
152
104
  this.traceSubmitted(result, packetName);
153
105
  return result;
154
106
  }
155
- const localResult = await this.options.runtime.submitLocalBoundSession(this.options.actorId, this.message, packetName, this.selectedMetadata);
156
- if (localResult.status !== submission_result_1.ZLinkSubmitStatus.TargetNotFound) {
157
- this.traceSubmitted(localResult, packetName);
158
- return localResult;
159
- }
160
107
  const actorRef = this.options.actorRefProvider();
161
108
  const node = this.options.nativeActorNodeProvider();
162
109
  const bindingGeneration = currentBindingGeneration(actorRef);
163
- if (!nativeAttempted &&
164
- actorRef !== undefined &&
165
- node !== undefined &&
166
- bindingGeneration !== undefined) {
110
+ if (actorRef !== undefined && node !== undefined && bindingGeneration !== undefined) {
167
111
  const result = await this.options.runtime.sendNativeBoundSession(node, actorRef, this.message, packetName, this.selectedMetadata);
168
112
  this.traceSubmitted(result, packetName);
169
113
  return result;
@@ -189,12 +133,3 @@ function currentBindingGeneration(actorRef) {
189
133
  function positiveBindingGeneration(generation) {
190
134
  return generation !== undefined && generation > 0n ? generation : undefined;
191
135
  }
192
- function disconnectedFrameHeader() {
193
- return {
194
- kind: protocol_1.ZLinkStreamMessageKind.Send,
195
- codec: protocol_1.ZLinkStreamCodec.Raw,
196
- flags: protocol_1.ZLinkStreamHeaderFlags.None,
197
- name: actors_1.ZLINK_REMOTE_ACTOR_SESSION_DISCONNECTED_PACKET,
198
- metadata: new Map()
199
- };
200
- }
@@ -3,7 +3,7 @@ import type { ZLinkRuntimeMetrics } from '../diagnostics';
3
3
  import { ZLinkActorSessionBindingRegistry, type ZLinkActorSessionAuthorityFence } from './actor-session-binding-registry';
4
4
  import { ZLinkActorSessionLifecycleCoordinator } from './actor-session-lifecycle-coordinator';
5
5
  import { DefaultZLinkSessionActor, DefaultZLinkSessionContext } from './session-context';
6
- import type { ZLinkSessionBindingConfirmationOptions } from './stream-binding-runtime-ports';
6
+ import type { ZLinkActorRouteCommitOptions, ZLinkSessionBindingConfirmationOptions } from './stream-binding-runtime-ports';
7
7
  export interface ZLinkSessionActorCoordinatorOptions {
8
8
  readonly actorBindTimeoutMs?: number;
9
9
  readonly actorRefResolver?: (actor: ZLinkActor) => ActorRef;
@@ -28,17 +28,11 @@ export declare class ZLinkSessionActorCoordinator {
28
28
  constructor(routes: ZLinkActorSessionBindingRegistry<DefaultZLinkSessionContext, DefaultZLinkSessionActor>, sessionActorRuntime: ConstructorParameters<typeof DefaultZLinkSessionActor>[0], options?: ZLinkSessionActorCoordinatorOptions, lifecycle?: ZLinkActorSessionLifecycleCoordinator);
29
29
  bind(context: DefaultZLinkSessionContext, actorOrRef: ZLinkActor | ActorRef, signal?: AbortSignal): Promise<DefaultZLinkSessionActor>;
30
30
  private replaceBinding;
31
- private replaceBindingCore;
32
31
  private resolveAuthorityFence;
33
32
  bindOrGet(context: DefaultZLinkSessionContext, actorRef: ActorRef, signal?: AbortSignal): Promise<DefaultZLinkSessionActor>;
34
33
  rebindActor(actorRef: ActorRef, signal?: AbortSignal): Promise<void>;
35
34
  refreshActor(actorRef: ActorRef, signal?: AbortSignal): Promise<void>;
36
- commitActorRoute(actorRef: ActorRef, signal?: AbortSignal, options?: {
37
- readonly confirmRemoteSessionBinding?: boolean | 'send';
38
- readonly releaseSeal?: {
39
- readonly sealId: string;
40
- };
41
- }): Promise<void>;
35
+ commitActorRoute(actorRef: ActorRef, signal?: AbortSignal, options?: ZLinkActorRouteCommitOptions): Promise<void>;
42
36
  retireRemoteBinding(actorRef: ActorRef, sessionRid: ActorRef['nodeRid'], bindingGeneration: bigint, signal?: AbortSignal): Promise<boolean>;
43
37
  authorityFence(actorId: string): Promise<{
44
38
  readonly authorityOwnerGeneration: bigint;
@@ -26,10 +26,7 @@ class ZLinkSessionActorCoordinator {
26
26
  : this.resolveActorRef(actorOrRef);
27
27
  return await this.lifecycle.run(actorRef.actorId, async () => this.replaceBinding(context, actorRef, signal));
28
28
  }
29
- async replaceBinding(context, actorRef, signal, confirmRemoteSessionBinding = true, releaseSeal) {
30
- return await this.replaceBindingCore(context, actorRef, signal, confirmRemoteSessionBinding, releaseSeal);
31
- }
32
- async replaceBindingCore(context, actorRef, signal, confirmRemoteSessionBinding = true, releaseSeal) {
29
+ async replaceBinding(context, actorRef, signal) {
33
30
  (0, abort_1.throwIfAborted)(signal);
34
31
  if (actorRef.actorId.trim().length === 0) {
35
32
  throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorRouteNotFound, 'Actor id must not be empty.');
@@ -60,22 +57,15 @@ class ZLinkSessionActorCoordinator {
60
57
  : undefined, previous?.actor.ref);
61
58
  const sessionActor = reuseActor ??
62
59
  new session_context_1.DefaultZLinkSessionActor(this.sessionActorRuntime, boundActorRef, bindingToken);
63
- const sessionIdentity = String(this.actorBindingRoutingId(context));
60
+ const sessionIdentity = this.actorBindingRoutingId(context);
64
61
  if (previous === undefined) {
65
- if (releaseSeal !== undefined) {
66
- throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorSessionNotBound, `Actor '${actorRef.actorId}' route switch has no Session binding to release.`, true);
67
- }
68
62
  await this.routes.bind(context, sessionActor, bindingToken, authorityFence, sessionIdentity, () => sessionActor.updateRef(boundActorRef));
69
63
  }
70
- else if (releaseSeal !== undefined) {
71
- await this.routes.replaceAndReleaseSeal(previous, context, sessionActor, bindingToken, releaseSeal.sealId, authorityFence, sessionIdentity, () => sessionActor.updateRef(boundActorRef));
72
- }
73
64
  else {
74
65
  await this.routes.replace(previous, context, sessionActor, bindingToken, authorityFence, sessionIdentity, () => sessionActor.updateRef(boundActorRef));
75
66
  }
76
- if (confirmRemoteSessionBinding !== false &&
77
- this.options.confirmRemoteActorSessionBinding !== undefined) {
78
- const waitForAcknowledgement = previous === undefined && confirmRemoteSessionBinding !== 'send';
67
+ if (this.options.confirmRemoteActorSessionBinding !== undefined) {
68
+ const waitForAcknowledgement = previous === undefined;
79
69
  const confirmation = this.options.confirmRemoteActorSessionBinding(boundActorRef, this.actorBindingRoutingId(context), undefined, {
80
70
  waitForAcknowledgement,
81
71
  binding: context.stream instanceof managed_stream_1.ZLinkManagedStream
@@ -204,25 +194,18 @@ class ZLinkSessionActorCoordinator {
204
194
  if (route === undefined)
205
195
  return;
206
196
  requireSameIncarnation(route.actor.ref, normalizedActorRef);
207
- if ((0, routing_id_1.routingIdsEqual)(route.actor.ref.nodeRid, normalizedActorRef.nodeRid)) {
208
- const authorityFence = await this.resolveAuthorityFence(normalizedActorRef, signal);
209
- if (options.releaseSeal !== undefined &&
210
- !(await this.routes.validateSeal(normalizedActorRef.actorId, options.releaseSeal.sealId))) {
211
- throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale, `Actor '${normalizedActorRef.actorId}' route switch did not match its relocation seal.`, true);
212
- }
213
- // A location refresh never changes the route's Session binding
214
- // generation; the native bind owns it.
215
- route.actor.updateRef(withBindingGeneration(normalizedActorRef, bindingGenerationOf(route.actor.ref), undefined));
216
- if (authorityFence !== undefined) {
217
- await this.routes.updateAuthorityFence(normalizedActorRef.actorId, authorityFence);
218
- }
219
- if (options.releaseSeal !== undefined &&
220
- !(await this.routes.abortSeal(normalizedActorRef.actorId, options.releaseSeal.sealId))) {
221
- throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale, `Actor '${normalizedActorRef.actorId}' route switch lost its relocation seal.`, true);
222
- }
223
- return;
197
+ const authorityFence = await this.resolveAuthorityFence(normalizedActorRef, signal);
198
+ // Relocation changes only the Actor route of this physical binding.
199
+ // Publish the ref and authority together in the binding registry's turn;
200
+ // a native bind would issue a different binding generation.
201
+ const boundActorRef = withBindingGeneration(normalizedActorRef, bindingGenerationOf(route.actor.ref), undefined);
202
+ const commitActor = () => route.actor.updateRef(boundActorRef);
203
+ if (options.releaseSeal !== undefined) {
204
+ await this.routes.replaceAndReleaseSeal(route, route.context, route.actor, route.bindingToken, options.releaseSeal.sealId, authorityFence, route.sessionIdentity, commitActor);
205
+ }
206
+ else {
207
+ await this.routes.replace(route, route.context, route.actor, route.bindingToken, authorityFence, route.sessionIdentity, commitActor);
224
208
  }
225
- await this.replaceBinding(route.context, normalizedActorRef, signal, options.confirmRemoteSessionBinding, options.releaseSeal);
226
209
  });
227
210
  }
228
211
  async retireRemoteBinding(actorRef, sessionRid, bindingGeneration, signal) {
@@ -26,15 +26,8 @@ export interface ZLinkStreamActorLifecyclePort {
26
26
  }
27
27
  export interface ZLinkActorRouteCommitOptions {
28
28
  /**
29
- * Relocation already carries the binding identity to the target actor. The
30
- * follow-up confirmation can use a one-way route submission because a
31
- * request/ACK would create a nested route request while the Session
32
- * ownership command is being dispatched.
33
- */
34
- readonly confirmRemoteSessionBinding?: boolean | 'send';
35
- /**
36
- * Command 44 keeps ingress sealed while the native route is prepared, then
37
- * publishes the new route and releases this exact seal in one owner turn.
29
+ * Command 44 publishes the Actor route of the existing binding and releases
30
+ * this exact seal in one owner turn.
38
31
  */
39
32
  readonly releaseSeal?: {
40
33
  readonly sealId: string;
@@ -68,7 +61,7 @@ export interface ZLinkRemoteBoundSessionPort extends ZLinkStreamActorLifecyclePo
68
61
  sendNativeBoundSessionError(node: ZLinkBackendActorSessionNode, actorRef: ActorRef, packetName: string, requestSeq: bigint, error: unknown, metadata: ReadonlyMap<string, string>, signal?: AbortSignal): Promise<void>;
69
62
  }
70
63
  export interface ZLinkNativeFallbackBoundSessionPort {
71
- disconnectNativeBoundSession(node: ZLinkBackendActorSessionNode, actorRef: ActorRef, signal?: AbortSignal): Promise<void>;
64
+ disconnectNativeBoundSession(node: ZLinkBackendActorSessionNode, actorRef: ActorRef, timeoutMs: number, signal?: AbortSignal): Promise<void>;
72
65
  disconnectBoundSession(actorId: string, signal?: AbortSignal): Promise<void>;
73
66
  sendLocalBoundSession(actorId: string, message: unknown, packetName: string | undefined, metadata: ReadonlyMap<string, string>): Promise<boolean>;
74
67
  submitLocalBoundSession(actorId: string, message: unknown, packetName: string | undefined, metadata: ReadonlyMap<string, string>, signal?: AbortSignal): Promise<ZLinkSubmitResult>;
@@ -66,7 +66,7 @@ class ZLinkStreamSessionRuntime {
66
66
  this.traceFrameWritten(kind, packetName, correlationId);
67
67
  });
68
68
  const sessionOrPromise = options.sessionFactory(this.context);
69
- this.sessionReady = isPromiseLike(sessionOrPromise)
69
+ this.sessionReady = (0, abort_1.isPromiseLike)(sessionOrPromise)
70
70
  ? sessionOrPromise.then((session) => this.completeSessionCreation(session), (error) => {
71
71
  this.context.completeConfiguration();
72
72
  throw error;
@@ -1139,9 +1139,6 @@ function streamMonitorHasEndpoint(event) {
1139
1139
  const endpoint = event;
1140
1140
  return endpoint.localAddr !== undefined || endpoint.remoteAddr !== undefined;
1141
1141
  }
1142
- function isPromiseLike(value) {
1143
- return typeof value.then === 'function';
1144
- }
1145
1142
  function normalizeStreamCloseReason(reason) {
1146
1143
  switch (reason) {
1147
1144
  case 'client_close':
@@ -409,7 +409,7 @@ class DefaultZLinkWorkerCall {
409
409
  yield(signal) {
410
410
  const turn = (0, execution_1.requireZLinkYieldTurn)(this.turn);
411
411
  const pending = this.begin(signal);
412
- return turn.yieldPromise(pending);
412
+ return turn.yieldFrameworkPromise(pending);
413
413
  }
414
414
  begin(signal) {
415
415
  if (this.terminatorSelected) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zlink-systems/framework",
3
- "version": "0.30.1",
3
+ "version": "0.30.2",
4
4
  "license": "SEE LICENSE IN LICENSE",
5
5
  "repository": {
6
6
  "type": "git",
@@ -19,7 +19,7 @@
19
19
  "dependencies": {
20
20
  "@opentelemetry/api": "^1.9.1",
21
21
  "@opentelemetry/api-logs": "^0.221.0",
22
- "@zlink-systems/stream-wire": "0.30.1",
23
- "@zlink-systems/zlink": "1.19.0"
22
+ "@zlink-systems/stream-wire": "0.30.2",
23
+ "@zlink-systems/zlink": "1.20.0"
24
24
  }
25
25
  }
@@ -1,18 +1,38 @@
1
- import { borrowEncodedPayload, storeEncodedPayload } from './encoded-payload-storage';
1
+ import {
2
+ adoptEncodedPayload,
3
+ borrowEncodedPayload,
4
+ storeEncodedPayload
5
+ } from './encoded-payload-storage';
2
6
 
3
7
  export class ZLinkEncodedPayload {
4
- private constructor(bytes: Uint8Array) {
5
- storeEncodedPayload(this, bytes);
8
+ private constructor(bytes: Uint8Array, owned: boolean) {
9
+ if (owned) {
10
+ adoptEncodedPayload(this, bytes);
11
+ } else {
12
+ storeEncodedPayload(this, bytes);
13
+ }
6
14
  }
7
15
 
16
+ /** Copies the supplied bytes. */
8
17
  static from(bytes: Uint8Array): ZLinkEncodedPayload {
9
- return new ZLinkEncodedPayload(bytes);
18
+ return new ZLinkEncodedPayload(bytes, false);
19
+ }
20
+
21
+ /** Retains the supplied bytes without copying. Do not modify them afterward; mutation changes the payload. */
22
+ static fromOwned(bytes: Uint8Array): ZLinkEncodedPayload {
23
+ return new ZLinkEncodedPayload(bytes, true);
10
24
  }
11
25
 
26
+ /** Returns a copy of the stored bytes. */
12
27
  data(): Uint8Array {
13
28
  return new Uint8Array(this.stored());
14
29
  }
15
30
 
31
+ /** Returns the stored bytes without copying. Do not modify this view or its backing buffer. */
32
+ view(): Readonly<Uint8Array> {
33
+ return this.stored();
34
+ }
35
+
16
36
  toBytes(): Uint8Array {
17
37
  return this.data();
18
38
  }
@@ -6,9 +6,12 @@ export function storeEncodedPayload(owner: object, bytes: Uint8Array): Buffer {
6
6
  return stored;
7
7
  }
8
8
 
9
- export function adoptEncodedPayload(owner: object, bytes: Buffer): Buffer {
10
- encodedPayloadStorage.set(owner, bytes);
11
- return bytes;
9
+ export function adoptEncodedPayload(owner: object, bytes: Uint8Array): Buffer {
10
+ const stored = Buffer.isBuffer(bytes)
11
+ ? bytes
12
+ : Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength);
13
+ encodedPayloadStorage.set(owner, stored);
14
+ return stored;
12
15
  }
13
16
 
14
17
  export function borrowEncodedPayload(owner: object): Buffer | undefined {
@@ -141,7 +141,10 @@ export interface ZLinkMeshObjectRoleBuilder {
141
141
  export interface ZLinkMeshObjectClientBuilder {}
142
142
 
143
143
  export interface ZLinkMeshObjectServerBuilder {
144
- addEntrySpot<TEntrySpot extends ZLinkEntrySpot>(entrySpotType: Type<TEntrySpot>): this;
144
+ addEntrySpot<TEntrySpot extends ZLinkEntrySpot>(
145
+ entrySpotType: Type<TEntrySpot>,
146
+ actorType: string
147
+ ): this;
145
148
  addSpotFactory<TSpot extends ZLinkSpot>(
146
149
  spotType: string,
147
150
  implementation: Type<TSpot>,
@@ -68,13 +68,18 @@ export function validateSessionReplacementCallbackTimeout(timeoutMs: number): nu
68
68
  }
69
69
 
70
70
  export function registerEntrySpot(
71
- options: { entrySpotType?: Type<ZLinkEntrySpot> },
72
- entrySpotType: Type<ZLinkEntrySpot>
71
+ options: { entrySpotType?: Type<ZLinkEntrySpot>; entrySpotActorType?: string },
72
+ entrySpotType: Type<ZLinkEntrySpot>,
73
+ actorType: string
73
74
  ): void {
74
75
  if (options.entrySpotType !== undefined) {
75
76
  throw new ZLinkConfigurationException('Duplicate Entry Spot registration on SpotNode.');
76
77
  }
78
+ if (typeof actorType !== 'string' || actorType.length === 0) {
79
+ throw new ZLinkConfigurationException('Entry Spot Actor type must be a non-empty string.');
80
+ }
77
81
  options.entrySpotType = entrySpotType;
82
+ options.entrySpotActorType = actorType;
78
83
  }
79
84
 
80
85
  export function registerSpotFactory(
@@ -1234,8 +1234,11 @@ class DefaultMeshObjectServerBuilder implements ZLinkMeshObjectServerBuilder {
1234
1234
  private readonly node: MutableSpotNodeOptions
1235
1235
  ) {}
1236
1236
 
1237
- addEntrySpot<TEntrySpot extends ZLinkEntrySpot>(entrySpotType: Type<TEntrySpot>): this {
1238
- registerEntrySpot(this.node, entrySpotType);
1237
+ addEntrySpot<TEntrySpot extends ZLinkEntrySpot>(
1238
+ entrySpotType: Type<TEntrySpot>,
1239
+ actorType: string
1240
+ ): this {
1241
+ registerEntrySpot(this.node, entrySpotType, actorType);
1239
1242
  return this;
1240
1243
  }
1241
1244
 
@@ -1646,6 +1649,7 @@ interface MutableSpotNodeOptions {
1646
1649
  router?: MutableSpotRouterCapabilityOptions;
1647
1650
  pubSub?: MutableSpotPubSubCapabilityOptions;
1648
1651
  entrySpotType?: Type<ZLinkEntrySpot>;
1652
+ entrySpotActorType?: string;
1649
1653
  spotFactories?: Type<ZLinkSpot>[];
1650
1654
  spotFactoryRegistrations?: Record<
1651
1655
  string,
@@ -268,6 +268,7 @@ export interface ZLinkSpotNodeOptions {
268
268
  readonly router?: ZLinkSpotRouterCapabilityOptions;
269
269
  readonly pubSub?: ZLinkSpotPubSubCapabilityOptions;
270
270
  readonly entrySpotType?: Type<ZLinkEntrySpot>;
271
+ readonly entrySpotActorType?: string;
271
272
  readonly spotFactories?: readonly Type<ZLinkSpot>[];
272
273
  readonly spotFactoryRegistrations?: Readonly<
273
274
  Record<
@@ -85,7 +85,7 @@ export interface ZLinkRuntimeMessageFlowEvent {
85
85
  readonly commandId?: number;
86
86
  readonly messageSize?: number;
87
87
  readonly durationSeconds?: number;
88
- readonly errorReason?: ZLinkDispatchErrorReason;
88
+ readonly errorReason?: ZLinkDispatchErrorReason | 'activation_timeout' | 'activation_rejected';
89
89
  readonly errorAction?: ZLinkDispatchErrorAction;
90
90
  readonly errorType?: string;
91
91
  readonly errorMessage?: string;
@@ -195,6 +195,7 @@ export type ZLinkDispatchErrorReason =
195
195
  | 'unexpected_reply'
196
196
  | 'backpressure'
197
197
  | 'target_closed'
198
+ | 'location_unavailable'
198
199
  | 'stale_target'
199
200
  | 'shutdown';
200
201
 
@@ -25,6 +25,8 @@ export interface ZLinkObjectCapability {
25
25
  readonly policy: ZLinkObjectMaintenancePolicyKind;
26
26
  readonly hasSnapshotAdapter: boolean;
27
27
  readonly limit: number;
28
+ /** True only for an Actor capability whose node registered an Entry Spot type accepting it. */
29
+ readonly entryAccepted: boolean;
28
30
  }
29
31
 
30
32
  export interface ZLinkPopulationCapacity {
@@ -16,12 +16,20 @@ export interface ZLinkActorHandlerRegistry {
16
16
  }
17
17
 
18
18
  export interface ZLinkSpotHandlerRegistry extends ZLinkActorHandlerRegistry {
19
+ /** Declares a timer handler constructor for relocation without registering an endpoint. */
20
+ addTimerHandler<THandler extends ZLinkSpotTimerHandler<ZLinkSpot>>(
21
+ handlerType: Type<THandler>
22
+ ): this;
19
23
  addPacket<THandler>(handlerType: Type<THandler>): this;
20
24
  addSubscribe<THandler>(handlerType: Type<THandler>, channelName: string, topic: string): this;
21
25
  }
22
26
 
23
27
  export interface ZLinkInstanceSpotHandlerRegistry {
24
28
  addPacket<THandler>(handlerType: Type<THandler>): this;
29
+ /** Declares a timer handler constructor for relocation without registering an endpoint. */
30
+ addTimerHandler<THandler extends ZLinkSpotTimerHandler<ZLinkInstanceSpot>>(
31
+ handlerType: Type<THandler>
32
+ ): this;
25
33
  }
26
34
 
27
35
  export interface ZLinkWorkerCall<T> {
@@ -61,8 +61,8 @@ export interface ZLinkSpot<
61
61
  > extends ZLinkUserSpotActorLifecycle<TActor> {
62
62
  readonly context: ZLinkSpotContext<TActor>;
63
63
  configure?(): void;
64
- onCreate?(request: ZLinkMessage): Promise<ZLinkSpotCreateResponse>;
65
- onInitialize?(): Promise<void>;
64
+ onCreate?(request: ZLinkMessage, signal?: AbortSignal): Promise<ZLinkSpotCreateResponse>;
65
+ onInitialize?(signal?: AbortSignal): Promise<void>;
66
66
  onClosing?(context: ZLinkSpotClosingContext, cleanupSignal: AbortSignal): Promise<void>;
67
67
  onRelocationReadyCompleted?(completion: ZLinkSpotRelocationReadyCompletion): Promise<void>;
68
68
  }
@@ -70,7 +70,7 @@ export interface ZLinkSpot<
70
70
  export interface ZLinkInstanceSpot {
71
71
  readonly context: ZLinkInstanceSpotContext;
72
72
  configure?(): void;
73
- onInitialize?(): Promise<void>;
73
+ onInitialize?(signal?: AbortSignal): Promise<void>;
74
74
  onClosing?(context: ZLinkSpotClosingContext, cleanupSignal: AbortSignal): Promise<void>;
75
75
  }
76
76
 
@@ -38,6 +38,18 @@ export function throwIfAborted(signal: AbortSignal | undefined): void {
38
38
  }
39
39
  }
40
40
 
41
+ /**
42
+ * Whether a handler or dispatch result is a thenable the caller must wait
43
+ * for. Synchronous results, including null and undefined, are not.
44
+ */
45
+ export function isPromiseLike<T>(value: T | PromiseLike<T>): value is PromiseLike<T> {
46
+ return (
47
+ value !== null &&
48
+ (typeof value === 'object' || typeof value === 'function') &&
49
+ typeof (value as { then?: unknown }).then === 'function'
50
+ );
51
+ }
52
+
41
53
  export function macrotaskBoundary(): Promise<void> {
42
54
  return new Promise((resolve) => setImmediate(resolve));
43
55
  }
@@ -1,3 +1,4 @@
1
+ import { routingIdsEqual } from '../routing-id';
1
2
  import { createHash } from 'node:crypto';
2
3
  import type { ActorRef } from '../../contracts';
3
4
  import { ZLinkSpotKind } from '../../contracts';
@@ -278,7 +279,7 @@ function requireActorAuthority(
278
279
  snapshot.allocation.objectKind !== 'actor' ||
279
280
  snapshot.allocation.stableType !== expected.actorType ||
280
281
  snapshot.allocation.descriptor.meshName !== expected.meshName ||
281
- String(snapshot.allocation.descriptor.rid) !== String(expected.actor.nodeRid) ||
282
+ !routingIdsEqual(snapshot.allocation.descriptor.rid, expected.actor.nodeRid) ||
282
283
  snapshot.allocation.descriptorLifecycleGeneration !== expected.ownerNodeGeneration ||
283
284
  snapshot.ownerId !== expected.owner.ownerId ||
284
285
  snapshot.ownerLeaseGeneration !== expected.owner.leaseGeneration ||
@@ -286,7 +287,7 @@ function requireActorAuthority(
286
287
  actual.actorType !== expected.actorType ||
287
288
  actual.actor.actorId !== expected.actor.actorId ||
288
289
  actual.actor.objectGeneration !== expected.actor.objectGeneration ||
289
- String(actual.actor.nodeRid) !== String(expected.actor.nodeRid)
290
+ !routingIdsEqual(actual.actor.nodeRid, expected.actor.nodeRid)
290
291
  ) {
291
292
  throw new Error(
292
293
  `Actor '${expected.actor.actorId}' authority fence does not match its ActorRef.`