@zlink-systems/framework 0.30.1 → 0.30.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
  3. package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
  4. package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
  5. package/dist/contracts/Common/encoded-payload-storage.js +5 -2
  6. package/dist/contracts/Configuration/Builders.d.ts +1 -1
  7. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
  8. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
  9. package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
  10. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  11. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
  12. package/dist/contracts/Locations/Rows.d.ts +2 -0
  13. package/dist/contracts/Spots/Contracts.d.ts +4 -0
  14. package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
  15. package/dist/runtime/abort.d.ts +5 -0
  16. package/dist/runtime/abort.js +10 -0
  17. package/dist/runtime/actors/actor-authority-publication.js +3 -2
  18. package/dist/runtime/actors/actor-client.d.ts +0 -1
  19. package/dist/runtime/actors/actor-client.js +38 -45
  20. package/dist/runtime/actors/actor-context.d.ts +2 -0
  21. package/dist/runtime/actors/actor-context.js +46 -9
  22. package/dist/runtime/actors/actor-handoff.d.ts +7 -3
  23. package/dist/runtime/actors/actor-handoff.js +212 -88
  24. package/dist/runtime/actors/actor-join-relocation.d.ts +2 -0
  25. package/dist/runtime/actors/actor-local-native-join.js +4 -0
  26. package/dist/runtime/actors/actor-mailbox.js +27 -1
  27. package/dist/runtime/actors/actor-remote-joiner.js +3 -1
  28. package/dist/runtime/actors/actor-reply.d.ts +4 -0
  29. package/dist/runtime/actors/actor-reply.js +29 -0
  30. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
  31. package/dist/runtime/actors/actor-runtime-state.js +2 -20
  32. package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
  33. package/dist/runtime/actors/index.d.ts +6 -2
  34. package/dist/runtime/actors/index.js +37 -21
  35. package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
  36. package/dist/runtime/actors/session-disconnected-wire.js +48 -0
  37. package/dist/runtime/admission.d.ts +9 -1
  38. package/dist/runtime/admission.js +55 -32
  39. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +13 -0
  40. package/dist/runtime/application-jobs/application-job-queue-scope.js +27 -1
  41. package/dist/runtime/application-jobs/contracts.d.ts +2 -0
  42. package/dist/runtime/backend/contracts/index.d.ts +19 -3
  43. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
  44. package/dist/runtime/backend/mesh-completion-table.js +5 -0
  45. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +26 -2
  46. package/dist/runtime/backend/mesh-dispatch-pump.js +193 -107
  47. package/dist/runtime/backend/node/node-raw-binding-port.js +90 -58
  48. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +33 -8
  49. package/dist/runtime/backend/node/node-raw-mesh-backend.js +142 -143
  50. package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
  51. package/dist/runtime/backend/node/node-socket-backend-adapter.js +5 -5
  52. package/dist/runtime/channels/channel-clients.d.ts +1 -0
  53. package/dist/runtime/channels/channel-clients.js +20 -5
  54. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +22 -3
  55. package/dist/runtime/channels/channel-dispatch-pipeline.js +103 -57
  56. package/dist/runtime/channels/channel-dispatchers.d.ts +3 -2
  57. package/dist/runtime/channels/channel-dispatchers.js +44 -37
  58. package/dist/runtime/channels/channel-envelope.d.ts +1 -0
  59. package/dist/runtime/channels/channel-envelope.js +74 -31
  60. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
  61. package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
  62. package/dist/runtime/channels/channel-runtime-manager.d.ts +3 -2
  63. package/dist/runtime/channels/channel-runtime-manager.js +4 -4
  64. package/dist/runtime/channels/channel-transports.d.ts +0 -1
  65. package/dist/runtime/channels/channel-transports.js +35 -33
  66. package/dist/runtime/channels/client-server-location-runtime.js +5 -4
  67. package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
  68. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  69. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  70. package/dist/runtime/channels/fanout-location-runtime.js +3 -3
  71. package/dist/runtime/diagnostics/flow-context.js +19 -7
  72. package/dist/runtime/diagnostics/index.js +4 -9
  73. package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
  74. package/dist/runtime/diagnostics/message-flow.js +35 -5
  75. package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
  76. package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
  77. package/dist/runtime/execution/index.d.ts +4 -2
  78. package/dist/runtime/execution/index.js +33 -10
  79. package/dist/runtime/execution/serial-execution-queue.d.ts +4 -0
  80. package/dist/runtime/execution/serial-execution-queue.js +21 -2
  81. package/dist/runtime/execution/state-lane.d.ts +2 -0
  82. package/dist/runtime/execution/state-lane.js +5 -0
  83. package/dist/runtime/foundation/operation-registry.d.ts +25 -1
  84. package/dist/runtime/foundation/operation-registry.js +86 -18
  85. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +39 -3
  86. package/dist/runtime/foundation/raw-service-mesh-runtime.js +151 -55
  87. package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
  88. package/dist/runtime/foundation/service-liveness-registry.js +38 -0
  89. package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
  90. package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
  91. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -3
  92. package/dist/runtime/foundation/service-relocation-object-owner.js +48 -35
  93. package/dist/runtime/foundation/service-relocation-runtime.js +7 -3
  94. package/dist/runtime/foundation/service-runtime-contracts.d.ts +8 -1
  95. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
  96. package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
  97. package/dist/runtime/foundation/service-stateful-registry.js +24 -26
  98. package/dist/runtime/foundation/service-stateful-runtime.d.ts +72 -6
  99. package/dist/runtime/foundation/service-stateful-runtime.js +444 -117
  100. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -1
  101. package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
  102. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
  103. package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
  104. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  105. package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
  106. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +10 -0
  107. package/dist/runtime/foundation/service-wire-m6a-codec.js +166 -53
  108. package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
  109. package/dist/runtime/host/actor-packet-relay.js +59 -72
  110. package/dist/runtime/host/actor-placement-coordinator.js +25 -8
  111. package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
  112. package/dist/runtime/host/actor-transfer-runtime.js +85 -331
  113. package/dist/runtime/host/application-job-queue.d.ts +24 -3
  114. package/dist/runtime/host/application-job-queue.js +28 -41
  115. package/dist/runtime/host/index.d.ts +5 -1
  116. package/dist/runtime/host/index.js +171 -97
  117. package/dist/runtime/host/location-runtime-owner.js +2 -6
  118. package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
  119. package/dist/runtime/host/mesh-router-resolver.js +14 -6
  120. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
  121. package/dist/runtime/host/remote-bound-session-relay.js +71 -190
  122. package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
  123. package/dist/runtime/host/route-mesh-runtime.js +5 -3
  124. package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
  125. package/dist/runtime/host/runtime-shutdown.js +3 -2
  126. package/dist/runtime/host/service-relocation-host-runtime.d.ts +17 -7
  127. package/dist/runtime/host/service-relocation-host-runtime.js +550 -367
  128. package/dist/runtime/host/spot-runtime-options-factory.js +15 -7
  129. package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
  130. package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
  131. package/dist/runtime/locations/auto-connect-loop.js +22 -14
  132. package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
  133. package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
  134. package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
  135. package/dist/runtime/locations/descriptor-publication.js +11 -0
  136. package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
  137. package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
  138. package/dist/runtime/locations/in-memory-authority-store.js +56 -19
  139. package/dist/runtime/locations/in-memory-location-store.js +1 -10
  140. package/dist/runtime/locations/index.d.ts +1 -0
  141. package/dist/runtime/locations/index.js +1 -0
  142. package/dist/runtime/locations/lease-tracker.js +1 -6
  143. package/dist/runtime/locations/location-store-repository.d.ts +51 -1
  144. package/dist/runtime/locations/location-store-repository.js +363 -139
  145. package/dist/runtime/locations/relocation-blob.d.ts +18 -1
  146. package/dist/runtime/locations/relocation-blob.js +52 -1
  147. package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
  148. package/dist/runtime/locations/request-source-resolver.js +80 -0
  149. package/dist/runtime/locations/resolvers.js +1 -1
  150. package/dist/runtime/locations/runtime.d.ts +6 -2
  151. package/dist/runtime/locations/runtime.js +37 -30
  152. package/dist/runtime/messaging/payload-codec.d.ts +7 -1
  153. package/dist/runtime/messaging/payload-codec.js +7 -6
  154. package/dist/runtime/messaging/request-result.js +29 -26
  155. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +19 -1
  156. package/dist/runtime/protocol/service_wire_codec.generated.js +85 -0
  157. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +7 -1
  158. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +23 -7
  159. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +3 -2
  160. package/dist/runtime/spots/index.d.ts +18 -11
  161. package/dist/runtime/spots/index.js +234 -176
  162. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
  163. package/dist/runtime/spots/spot-activation-registry.js +21 -11
  164. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  165. package/dist/runtime/spots/spot-activation-state.js +7 -7
  166. package/dist/runtime/spots/spot-activation.d.ts +6 -3
  167. package/dist/runtime/spots/spot-activation.js +123 -44
  168. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
  169. package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
  170. package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
  171. package/dist/runtime/spots/spot-actor-membership.js +0 -8
  172. package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
  173. package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
  174. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
  175. package/dist/runtime/spots/spot-entry-activation.js +14 -9
  176. package/dist/runtime/spots/spot-handler-registry.d.ts +4 -3
  177. package/dist/runtime/spots/spot-handler-registry.js +6 -2
  178. package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
  179. package/dist/runtime/spots/spot-manager-public.js +2 -2
  180. package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
  181. package/dist/runtime/spots/spot-node-autoconnect.js +18 -39
  182. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
  183. package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
  184. package/dist/runtime/spots/spot-outbound.js +3 -3
  185. package/dist/runtime/spots/spot-remote-codec.js +5 -1
  186. package/dist/runtime/spots/spot-runtime-ports.d.ts +0 -1
  187. package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
  188. package/dist/runtime/spots/spot-serial-executor.js +61 -8
  189. package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
  190. package/dist/runtime/spots/spot-subscription-dispatch.js +1 -1
  191. package/dist/runtime/spots/spot-timer.d.ts +57 -5
  192. package/dist/runtime/spots/spot-timer.js +287 -103
  193. package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
  194. package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
  195. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
  196. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
  197. package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
  198. package/dist/runtime/streams/bound-session-service.d.ts +1 -1
  199. package/dist/runtime/streams/bound-session-service.js +6 -11
  200. package/dist/runtime/streams/index.d.ts +3 -2
  201. package/dist/runtime/streams/index.js +6 -4
  202. package/dist/runtime/streams/managed-stream.js +3 -2
  203. package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
  204. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
  205. package/dist/runtime/streams/session-actor-coordinator.js +15 -32
  206. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
  207. package/dist/runtime/streams/stream-session-runtime.js +1 -4
  208. package/dist/runtime/workers/index.js +1 -1
  209. package/package.json +3 -3
  210. package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
  211. package/src/contracts/Common/encoded-payload-storage.ts +6 -3
  212. package/src/contracts/Configuration/Builders.ts +4 -1
  213. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
  214. package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
  215. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  216. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
  217. package/src/contracts/Locations/Rows.ts +2 -0
  218. package/src/contracts/Spots/Contracts.ts +8 -0
  219. package/src/contracts/Spots/ZLinkSpot.ts +3 -3
  220. package/src/runtime/abort.ts +12 -0
  221. package/src/runtime/actors/actor-authority-publication.ts +3 -2
  222. package/src/runtime/actors/actor-client.ts +61 -70
  223. package/src/runtime/actors/actor-context.ts +49 -9
  224. package/src/runtime/actors/actor-handoff.ts +282 -106
  225. package/src/runtime/actors/actor-join-relocation.ts +2 -0
  226. package/src/runtime/actors/actor-local-native-join.ts +4 -0
  227. package/src/runtime/actors/actor-mailbox.ts +40 -2
  228. package/src/runtime/actors/actor-remote-joiner.ts +6 -1
  229. package/src/runtime/actors/actor-reply.ts +42 -0
  230. package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
  231. package/src/runtime/actors/actor-runtime-state.ts +2 -20
  232. package/src/runtime/actors/actor-source-transfer.ts +1 -34
  233. package/src/runtime/actors/index.ts +41 -27
  234. package/src/runtime/actors/session-disconnected-wire.ts +66 -0
  235. package/src/runtime/admission.ts +69 -34
  236. package/src/runtime/application-jobs/application-job-queue-scope.ts +33 -1
  237. package/src/runtime/application-jobs/contracts.ts +2 -0
  238. package/src/runtime/backend/contracts/index.ts +39 -4
  239. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
  240. package/src/runtime/backend/mesh-completion-table.ts +4 -0
  241. package/src/runtime/backend/mesh-dispatch-pump.ts +223 -124
  242. package/src/runtime/backend/node/node-raw-binding-port.ts +106 -70
  243. package/src/runtime/backend/node/node-raw-mesh-backend.ts +221 -170
  244. package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -5
  245. package/src/runtime/channels/channel-clients.ts +49 -24
  246. package/src/runtime/channels/channel-dispatch-pipeline.ts +173 -124
  247. package/src/runtime/channels/channel-dispatchers.ts +116 -72
  248. package/src/runtime/channels/channel-envelope.ts +105 -36
  249. package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
  250. package/src/runtime/channels/channel-runtime-manager.ts +12 -5
  251. package/src/runtime/channels/channel-transports.ts +49 -58
  252. package/src/runtime/channels/client-server-location-runtime.ts +11 -10
  253. package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
  254. package/src/runtime/channels/fanout-location-runtime.ts +17 -9
  255. package/src/runtime/diagnostics/flow-context.ts +20 -7
  256. package/src/runtime/diagnostics/index.ts +1 -7
  257. package/src/runtime/diagnostics/message-flow.ts +47 -9
  258. package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
  259. package/src/runtime/execution/index.ts +40 -14
  260. package/src/runtime/execution/serial-execution-queue.ts +31 -4
  261. package/src/runtime/execution/state-lane.ts +7 -0
  262. package/src/runtime/foundation/operation-registry.ts +98 -20
  263. package/src/runtime/foundation/raw-service-mesh-runtime.ts +244 -67
  264. package/src/runtime/foundation/service-liveness-registry.ts +39 -0
  265. package/src/runtime/foundation/service-mailbox.ts +8 -0
  266. package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
  267. package/src/runtime/foundation/service-relocation-object-owner.ts +54 -37
  268. package/src/runtime/foundation/service-relocation-runtime.ts +7 -3
  269. package/src/runtime/foundation/service-runtime-contracts.ts +12 -1
  270. package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
  271. package/src/runtime/foundation/service-stateful-registry.ts +38 -35
  272. package/src/runtime/foundation/service-stateful-runtime.ts +667 -152
  273. package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -11
  274. package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
  275. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  276. package/src/runtime/foundation/service-wire-m6a-codec.ts +187 -51
  277. package/src/runtime/host/actor-packet-relay.ts +113 -94
  278. package/src/runtime/host/actor-placement-coordinator.ts +31 -8
  279. package/src/runtime/host/actor-transfer-runtime.ts +104 -430
  280. package/src/runtime/host/application-job-queue.ts +29 -44
  281. package/src/runtime/host/index.ts +286 -129
  282. package/src/runtime/host/location-runtime-owner.ts +2 -6
  283. package/src/runtime/host/mesh-router-resolver.ts +13 -5
  284. package/src/runtime/host/remote-bound-session-relay.ts +86 -248
  285. package/src/runtime/host/route-mesh-runtime.ts +11 -5
  286. package/src/runtime/host/runtime-shutdown.ts +15 -4
  287. package/src/runtime/host/service-relocation-host-runtime.ts +784 -475
  288. package/src/runtime/host/spot-runtime-options-factory.ts +18 -7
  289. package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
  290. package/src/runtime/locations/auto-connect-loop.ts +22 -14
  291. package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
  292. package/src/runtime/locations/auto-connect-types.ts +0 -1
  293. package/src/runtime/locations/descriptor-publication.ts +7 -0
  294. package/src/runtime/locations/domain-store-contract.ts +5 -0
  295. package/src/runtime/locations/in-memory-authority-store.ts +85 -23
  296. package/src/runtime/locations/in-memory-location-store.ts +1 -12
  297. package/src/runtime/locations/index.ts +1 -0
  298. package/src/runtime/locations/lease-tracker.ts +2 -9
  299. package/src/runtime/locations/location-store-repository.ts +628 -152
  300. package/src/runtime/locations/relocation-blob.ts +75 -1
  301. package/src/runtime/locations/request-source-resolver.ts +138 -0
  302. package/src/runtime/locations/resolvers.ts +2 -2
  303. package/src/runtime/locations/runtime.ts +70 -40
  304. package/src/runtime/messaging/payload-codec.ts +8 -11
  305. package/src/runtime/messaging/request-result.ts +33 -29
  306. package/src/runtime/protocol/service_wire_codec.generated.ts +87 -4
  307. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +13 -10
  308. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +3 -2
  309. package/src/runtime/spots/index.ts +375 -281
  310. package/src/runtime/spots/spot-activation-registry.ts +25 -13
  311. package/src/runtime/spots/spot-activation-state.ts +12 -19
  312. package/src/runtime/spots/spot-activation.ts +170 -86
  313. package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
  314. package/src/runtime/spots/spot-actor-membership.ts +0 -15
  315. package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
  316. package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
  317. package/src/runtime/spots/spot-entry-activation.ts +24 -19
  318. package/src/runtime/spots/spot-handler-registry.ts +15 -4
  319. package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
  320. package/src/runtime/spots/spot-manager-public.ts +2 -2
  321. package/src/runtime/spots/spot-node-autoconnect.ts +22 -45
  322. package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
  323. package/src/runtime/spots/spot-outbound.ts +3 -3
  324. package/src/runtime/spots/spot-remote-codec.ts +9 -2
  325. package/src/runtime/spots/spot-runtime-ports.ts +0 -1
  326. package/src/runtime/spots/spot-serial-executor.ts +97 -25
  327. package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
  328. package/src/runtime/spots/spot-subscription-dispatch.ts +1 -1
  329. package/src/runtime/spots/spot-timer.ts +413 -157
  330. package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
  331. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
  332. package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
  333. package/src/runtime/streams/bound-session-service.ts +7 -10
  334. package/src/runtime/streams/index.ts +12 -6
  335. package/src/runtime/streams/managed-stream.ts +4 -2
  336. package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
  337. package/src/runtime/streams/session-actor-coordinator.ts +39 -88
  338. package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
  339. package/src/runtime/streams/stream-session-runtime.ts +1 -5
  340. package/src/runtime/workers/index.ts +1 -1
@@ -1,7 +1,13 @@
1
1
  export declare class ZLinkEncodedPayload {
2
2
  private constructor();
3
+ /** Copies the supplied bytes. */
3
4
  static from(bytes: Uint8Array): ZLinkEncodedPayload;
5
+ /** Retains the supplied bytes without copying. Do not modify them afterward; mutation changes the payload. */
6
+ static fromOwned(bytes: Uint8Array): ZLinkEncodedPayload;
7
+ /** Returns a copy of the stored bytes. */
4
8
  data(): Uint8Array;
9
+ /** Returns the stored bytes without copying. Do not modify this view or its backing buffer. */
10
+ view(): Readonly<Uint8Array>;
5
11
  toBytes(): Uint8Array;
6
12
  copy(): ZLinkEncodedPayload;
7
13
  size(): number;
@@ -3,15 +3,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ZLinkEncodedPayload = void 0;
4
4
  const encoded_payload_storage_1 = require("./encoded-payload-storage");
5
5
  class ZLinkEncodedPayload {
6
- constructor(bytes) {
7
- (0, encoded_payload_storage_1.storeEncodedPayload)(this, bytes);
6
+ constructor(bytes, owned) {
7
+ if (owned) {
8
+ (0, encoded_payload_storage_1.adoptEncodedPayload)(this, bytes);
9
+ }
10
+ else {
11
+ (0, encoded_payload_storage_1.storeEncodedPayload)(this, bytes);
12
+ }
8
13
  }
14
+ /** Copies the supplied bytes. */
9
15
  static from(bytes) {
10
- return new ZLinkEncodedPayload(bytes);
16
+ return new ZLinkEncodedPayload(bytes, false);
11
17
  }
18
+ /** Retains the supplied bytes without copying. Do not modify them afterward; mutation changes the payload. */
19
+ static fromOwned(bytes) {
20
+ return new ZLinkEncodedPayload(bytes, true);
21
+ }
22
+ /** Returns a copy of the stored bytes. */
12
23
  data() {
13
24
  return new Uint8Array(this.stored());
14
25
  }
26
+ /** Returns the stored bytes without copying. Do not modify this view or its backing buffer. */
27
+ view() {
28
+ return this.stored();
29
+ }
15
30
  toBytes() {
16
31
  return this.data();
17
32
  }
@@ -1,3 +1,3 @@
1
1
  export declare function storeEncodedPayload(owner: object, bytes: Uint8Array): Buffer;
2
- export declare function adoptEncodedPayload(owner: object, bytes: Buffer): Buffer;
2
+ export declare function adoptEncodedPayload(owner: object, bytes: Uint8Array): Buffer;
3
3
  export declare function borrowEncodedPayload(owner: object): Buffer | undefined;
@@ -10,8 +10,11 @@ function storeEncodedPayload(owner, bytes) {
10
10
  return stored;
11
11
  }
12
12
  function adoptEncodedPayload(owner, bytes) {
13
- encodedPayloadStorage.set(owner, bytes);
14
- return bytes;
13
+ const stored = Buffer.isBuffer(bytes)
14
+ ? bytes
15
+ : Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength);
16
+ encodedPayloadStorage.set(owner, stored);
17
+ return stored;
15
18
  }
16
19
  function borrowEncodedPayload(owner) {
17
20
  return encodedPayloadStorage.get(owner);
@@ -112,7 +112,7 @@ export interface ZLinkMeshObjectRoleBuilder {
112
112
  export interface ZLinkMeshObjectClientBuilder {
113
113
  }
114
114
  export interface ZLinkMeshObjectServerBuilder {
115
- addEntrySpot<TEntrySpot extends ZLinkEntrySpot>(entrySpotType: Type<TEntrySpot>): this;
115
+ addEntrySpot<TEntrySpot extends ZLinkEntrySpot>(entrySpotType: Type<TEntrySpot>, actorType: string): this;
116
116
  addSpotFactory<TSpot extends ZLinkSpot>(spotType: string, implementation: Type<TSpot>, configure: (builder: ZLinkUserSpotFactoryBuilder<TSpot>) => void): this;
117
117
  addInstanceSpotFactory<TSpot extends ZLinkInstanceSpot>(instanceSpotType: string, implementation: Type<TSpot>, configure: (builder: ZLinkInstanceSpotFactoryBuilder<TSpot>) => void): this;
118
118
  addActorFactory<TActor extends ZLinkActor>(actorType: string, implementation: Type<ZLinkActorFactory<TActor>>, configure: (builder: ZLinkActorFactoryBuilder<TActor>) => void): this;
@@ -16,7 +16,8 @@ export declare function validateActorTransferTimeout(timeoutMs: number): number;
16
16
  export declare function validateSessionReplacementCallbackTimeout(timeoutMs: number): number;
17
17
  export declare function registerEntrySpot(options: {
18
18
  entrySpotType?: Type<ZLinkEntrySpot>;
19
- }, entrySpotType: Type<ZLinkEntrySpot>): void;
19
+ entrySpotActorType?: string;
20
+ }, entrySpotType: Type<ZLinkEntrySpot>, actorType: string): void;
20
21
  export declare function registerSpotFactory(options: {
21
22
  spotFactories?: Type<ZLinkSpot>[];
22
23
  }, spotType: Type<ZLinkSpot>): void;
@@ -62,11 +62,15 @@ function validateSessionReplacementCallbackTimeout(timeoutMs) {
62
62
  }
63
63
  return timeoutMs;
64
64
  }
65
- function registerEntrySpot(options, entrySpotType) {
65
+ function registerEntrySpot(options, entrySpotType, actorType) {
66
66
  if (options.entrySpotType !== undefined) {
67
67
  throw new ConfigurationException_1.ZLinkConfigurationException('Duplicate Entry Spot registration on SpotNode.');
68
68
  }
69
+ if (typeof actorType !== 'string' || actorType.length === 0) {
70
+ throw new ConfigurationException_1.ZLinkConfigurationException('Entry Spot Actor type must be a non-empty string.');
71
+ }
69
72
  options.entrySpotType = entrySpotType;
73
+ options.entrySpotActorType = actorType;
70
74
  }
71
75
  function registerSpotFactory(options, spotType) {
72
76
  options.spotFactories ??= [];
@@ -942,8 +942,8 @@ class DefaultMeshObjectServerBuilder {
942
942
  this.meshName = meshName;
943
943
  this.node = node;
944
944
  }
945
- addEntrySpot(entrySpotType) {
946
- (0, RegistrationBuilderPolicy_1.registerEntrySpot)(this.node, entrySpotType);
945
+ addEntrySpot(entrySpotType, actorType) {
946
+ (0, RegistrationBuilderPolicy_1.registerEntrySpot)(this.node, entrySpotType, actorType);
947
947
  return this;
948
948
  }
949
949
  addSpotFactory(spotType, implementation, configure) {
@@ -233,6 +233,7 @@ export interface ZLinkSpotNodeOptions {
233
233
  readonly router?: ZLinkSpotRouterCapabilityOptions;
234
234
  readonly pubSub?: ZLinkSpotPubSubCapabilityOptions;
235
235
  readonly entrySpotType?: Type<ZLinkEntrySpot>;
236
+ readonly entrySpotActorType?: string;
236
237
  readonly spotFactories?: readonly Type<ZLinkSpot>[];
237
238
  readonly spotFactoryRegistrations?: Readonly<Record<string, ZLinkObjectFactoryRegistration<ZLinkSpot, ZLinkSpot, ZLinkUserSpotFactoryConfiguration>>>;
238
239
  readonly instanceSpotFactories?: Readonly<Record<string, Type<ZLinkInstanceSpot>>>;
@@ -76,7 +76,7 @@ export interface ZLinkRuntimeMessageFlowEvent {
76
76
  readonly commandId?: number;
77
77
  readonly messageSize?: number;
78
78
  readonly durationSeconds?: number;
79
- readonly errorReason?: ZLinkDispatchErrorReason;
79
+ readonly errorReason?: ZLinkDispatchErrorReason | 'activation_timeout' | 'activation_rejected';
80
80
  readonly errorAction?: ZLinkDispatchErrorAction;
81
81
  readonly errorType?: string;
82
82
  readonly errorMessage?: string;
@@ -162,7 +162,7 @@ export declare enum ZLinkDispatchMessageKind {
162
162
  ActorRequest = "actorRequest",
163
163
  ActorSend = "actorSend"
164
164
  }
165
- export type ZLinkDispatchErrorReason = 'no_handler' | 'decode_error' | 'handler_exception' | 'invalid_frame' | 'reply_path_missing' | 'unexpected_reply' | 'backpressure' | 'target_closed' | 'stale_target' | 'shutdown';
165
+ export type ZLinkDispatchErrorReason = 'no_handler' | 'decode_error' | 'handler_exception' | 'invalid_frame' | 'reply_path_missing' | 'unexpected_reply' | 'backpressure' | 'target_closed' | 'location_unavailable' | 'stale_target' | 'shutdown';
166
166
  export type ZLinkDispatchErrorAction = 'reply_error' | 'fail_caller' | 'drop';
167
167
  export declare enum ZLinkRuntimeDispatchErrorReason {
168
168
  HandlerMissing = "no_handler",
@@ -22,6 +22,8 @@ export interface ZLinkObjectCapability {
22
22
  readonly policy: ZLinkObjectMaintenancePolicyKind;
23
23
  readonly hasSnapshotAdapter: boolean;
24
24
  readonly limit: number;
25
+ /** True only for an Actor capability whose node registered an Entry Spot type accepting it. */
26
+ readonly entryAccepted: boolean;
25
27
  }
26
28
  export interface ZLinkPopulationCapacity {
27
29
  readonly active: number;
@@ -9,11 +9,15 @@ export interface ZLinkActorHandlerRegistry {
9
9
  addHandler<THandler>(handlerType: Type<THandler>, packetName?: string): this;
10
10
  }
11
11
  export interface ZLinkSpotHandlerRegistry extends ZLinkActorHandlerRegistry {
12
+ /** Declares a timer handler constructor for relocation without registering an endpoint. */
13
+ addTimerHandler<THandler extends ZLinkSpotTimerHandler<ZLinkSpot>>(handlerType: Type<THandler>): this;
12
14
  addPacket<THandler>(handlerType: Type<THandler>): this;
13
15
  addSubscribe<THandler>(handlerType: Type<THandler>, channelName: string, topic: string): this;
14
16
  }
15
17
  export interface ZLinkInstanceSpotHandlerRegistry {
16
18
  addPacket<THandler>(handlerType: Type<THandler>): this;
19
+ /** Declares a timer handler constructor for relocation without registering an endpoint. */
20
+ addTimerHandler<THandler extends ZLinkSpotTimerHandler<ZLinkInstanceSpot>>(handlerType: Type<THandler>): this;
17
21
  }
18
22
  export interface ZLinkWorkerCall<T> {
19
23
  timeoutMs(durationMs: number): ZLinkWorkerCall<T>;
@@ -42,15 +42,15 @@ export interface ZLinkUserSpotActorLifecycle<TActor extends ZLinkActor = ZLinkAc
42
42
  export interface ZLinkSpot<TActor extends ZLinkActor = ZLinkActor> extends ZLinkUserSpotActorLifecycle<TActor> {
43
43
  readonly context: ZLinkSpotContext<TActor>;
44
44
  configure?(): void;
45
- onCreate?(request: ZLinkMessage): Promise<ZLinkSpotCreateResponse>;
46
- onInitialize?(): Promise<void>;
45
+ onCreate?(request: ZLinkMessage, signal?: AbortSignal): Promise<ZLinkSpotCreateResponse>;
46
+ onInitialize?(signal?: AbortSignal): Promise<void>;
47
47
  onClosing?(context: ZLinkSpotClosingContext, cleanupSignal: AbortSignal): Promise<void>;
48
48
  onRelocationReadyCompleted?(completion: ZLinkSpotRelocationReadyCompletion): Promise<void>;
49
49
  }
50
50
  export interface ZLinkInstanceSpot {
51
51
  readonly context: ZLinkInstanceSpotContext;
52
52
  configure?(): void;
53
- onInitialize?(): Promise<void>;
53
+ onInitialize?(signal?: AbortSignal): Promise<void>;
54
54
  onClosing?(context: ZLinkSpotClosingContext, cleanupSignal: AbortSignal): Promise<void>;
55
55
  }
56
56
  export interface ZLinkEntrySpot<TActor extends ZLinkActor = ZLinkActor> extends ZLinkSpotActorMembershipLifecycle<TActor> {
@@ -10,5 +10,10 @@ export declare function isAbortError(error: unknown): boolean;
10
10
  export declare function createDeadlineExceededError(message?: string): ZLinkDeadlineExceededError;
11
11
  export declare function isDeadlineExceededError(error: unknown): boolean;
12
12
  export declare function throwIfAborted(signal: AbortSignal | undefined): void;
13
+ /**
14
+ * Whether a handler or dispatch result is a thenable the caller must wait
15
+ * for. Synchronous results, including null and undefined, are not.
16
+ */
17
+ export declare function isPromiseLike<T>(value: T | PromiseLike<T>): value is PromiseLike<T>;
13
18
  export declare function macrotaskBoundary(): Promise<void>;
14
19
  export declare function awaitWithAbort<T>(operation: Promise<T>, signal: AbortSignal | undefined, abortOperation?: () => void): Promise<T>;
@@ -6,6 +6,7 @@ exports.isAbortError = isAbortError;
6
6
  exports.createDeadlineExceededError = createDeadlineExceededError;
7
7
  exports.isDeadlineExceededError = isDeadlineExceededError;
8
8
  exports.throwIfAborted = throwIfAborted;
9
+ exports.isPromiseLike = isPromiseLike;
9
10
  exports.macrotaskBoundary = macrotaskBoundary;
10
11
  exports.awaitWithAbort = awaitWithAbort;
11
12
  /** The typed cancellation error produced by Framework admission helpers. */
@@ -41,6 +42,15 @@ function throwIfAborted(signal) {
41
42
  throw createAbortError();
42
43
  }
43
44
  }
45
+ /**
46
+ * Whether a handler or dispatch result is a thenable the caller must wait
47
+ * for. Synchronous results, including null and undefined, are not.
48
+ */
49
+ function isPromiseLike(value) {
50
+ return (value !== null &&
51
+ (typeof value === 'object' || typeof value === 'function') &&
52
+ typeof value.then === 'function');
53
+ }
44
54
  function macrotaskBoundary() {
45
55
  return new Promise((resolve) => setImmediate(resolve));
46
56
  }
@@ -7,6 +7,7 @@ exports.decodeRelocatingActorAuthorityIdentity = decodeRelocatingActorAuthorityI
7
7
  exports.rewriteActorAuthorityRoute = rewriteActorAuthorityRoute;
8
8
  exports.rewriteActorAuthorityOwner = rewriteActorAuthorityOwner;
9
9
  exports.isActorAuthorityPayload = isActorAuthorityPayload;
10
+ const routing_id_1 = require("../routing-id");
10
11
  const node_crypto_1 = require("node:crypto");
11
12
  const creation_operation_id_1 = require("../locations/creation-operation-id");
12
13
  const actor_authority_payload_codec_1 = require("./actor-authority-payload-codec");
@@ -197,7 +198,7 @@ function requireActorAuthority(snapshot, expected) {
197
198
  snapshot.allocation.objectKind !== 'actor' ||
198
199
  snapshot.allocation.stableType !== expected.actorType ||
199
200
  snapshot.allocation.descriptor.meshName !== expected.meshName ||
200
- String(snapshot.allocation.descriptor.rid) !== String(expected.actor.nodeRid) ||
201
+ !(0, routing_id_1.routingIdsEqual)(snapshot.allocation.descriptor.rid, expected.actor.nodeRid) ||
201
202
  snapshot.allocation.descriptorLifecycleGeneration !== expected.ownerNodeGeneration ||
202
203
  snapshot.ownerId !== expected.owner.ownerId ||
203
204
  snapshot.ownerLeaseGeneration !== expected.owner.leaseGeneration ||
@@ -205,7 +206,7 @@ function requireActorAuthority(snapshot, expected) {
205
206
  actual.actorType !== expected.actorType ||
206
207
  actual.actor.actorId !== expected.actor.actorId ||
207
208
  actual.actor.objectGeneration !== expected.actor.objectGeneration ||
208
- String(actual.actor.nodeRid) !== String(expected.actor.nodeRid)) {
209
+ !(0, routing_id_1.routingIdsEqual)(actual.actor.nodeRid, expected.actor.nodeRid)) {
209
210
  throw new Error(`Actor '${expected.actor.actorId}' authority fence does not match its ActorRef.`);
210
211
  }
211
212
  }
@@ -33,4 +33,3 @@ export declare class DefaultZLinkActorClient implements ZLinkActorClient {
33
33
  private submitActorRequest;
34
34
  private requireNode;
35
35
  }
36
- export declare function forwardEncodedActorPacket(node: ZLinkBackendMeshNode, completions: ZLinkMeshCompletionTable, actor: ActorRef, header: Buffer, payload: Buffer, returnResponse: boolean, timeoutMs: number | undefined, serializers?: ReadonlyMap<string, ZLinkMessageSerializer>): Promise<unknown>;
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DefaultZLinkActorClient = void 0;
4
- exports.forwardEncodedActorPacket = forwardEncodedActorPacket;
4
+ const node_buffer_1 = require("node:buffer");
5
+ const channel_envelope_1 = require("../channels/channel-envelope");
6
+ const routing_id_1 = require("../routing-id");
5
7
  const stream_wire_1 = require("@zlink-systems/stream-wire");
6
8
  const request_result_1 = require("../messaging/request-result");
7
9
  const contracts_1 = require("../../contracts");
@@ -57,7 +59,7 @@ class DefaultZLinkActorClient {
57
59
  }
58
60
  const node = this.requireNode(meshName);
59
61
  if (this.options.routeTransport !== undefined &&
60
- String(node.status().routingId) !== String(actor.nodeRid)) {
62
+ !(0, routing_id_1.routingIdsEqual)(node.status().routingId, actor.nodeRid)) {
61
63
  await this.options.routeTransport.sendToSpot(remoteActorRouteTarget(route), (0, actor_packet_relay_wire_1.encodeRemoteActorPacketRelayPayload)({
62
64
  actorId,
63
65
  header: parts[0].data(),
@@ -69,7 +71,7 @@ class DefaultZLinkActorClient {
69
71
  }), { packetName: actor_packet_relay_wire_1.ZLINK_REMOTE_ACTOR_PACKET_RELAY_PACKET });
70
72
  return { status: submission_result_1.ZLinkSubmitStatus.Submitted };
71
73
  }
72
- return await this.submitActorSend(meshName, toBackendActorRef(actor), parts);
74
+ return await this.submitActorSend(meshName, toBackendActorRef(actor), parts, route);
73
75
  }
74
76
  catch (error) {
75
77
  if (isStaleActorError(error)) {
@@ -191,11 +193,12 @@ class DefaultZLinkActorClient {
191
193
  throw error;
192
194
  }
193
195
  }
194
- async submitActorSend(meshName, actor, parts) {
196
+ async submitActorSend(meshName, actor, parts, route) {
195
197
  const node = this.requireNode(meshName);
196
198
  try {
197
199
  return (0, submission_result_1.classifySubmitResult)(await node.sendToActor(actor, toMessageLikeParts(parts), {
198
- flags: runtime_values_1.ZLINK_BACKEND_SEND_NONE
200
+ flags: runtime_values_1.ZLINK_BACKEND_SEND_NONE,
201
+ routeFence: nativeActorRouteFence(route, actor)
199
202
  }), 'Actor send');
200
203
  }
201
204
  catch (error) {
@@ -208,8 +211,7 @@ class DefaultZLinkActorClient {
208
211
  async submitActorRequest(meshName, actor, parts, timeoutMs, signal, route, messageFollowContext, onAdmitted) {
209
212
  const node = this.requireNode(meshName);
210
213
  if (this.options.routeTransport !== undefined &&
211
- String(node.status().routingId) !== String(actor.nodeRid) &&
212
- route !== undefined) {
214
+ !(0, routing_id_1.routingIdsEqual)(node.status().routingId, actor.nodeRid)) {
213
215
  const relay = (0, actor_packet_relay_wire_1.encodeRemoteActorPacketRelayPayload)({
214
216
  actorId: actor.actorId,
215
217
  header: parts[0].data(),
@@ -243,6 +245,7 @@ class DefaultZLinkActorClient {
243
245
  }
244
246
  const completion = await completions.submit(() => node.requestToActor(actor, toMessageLikeParts(parts), {
245
247
  flags: runtime_values_1.ZLINK_BACKEND_SEND_NONE,
248
+ routeFence: nativeActorRouteFence(route, actor),
246
249
  timeoutMs,
247
250
  onAdmitted
248
251
  }), signal);
@@ -261,6 +264,14 @@ class DefaultZLinkActorClient {
261
264
  }
262
265
  }
263
266
  exports.DefaultZLinkActorClient = DefaultZLinkActorClient;
267
+ function nativeActorRouteFence(route, actor) {
268
+ return {
269
+ actor,
270
+ targetNodeGeneration: route.ownerNodeGeneration,
271
+ authorityOwnerGeneration: route.authorityOwnerGeneration,
272
+ ownerLeaseGeneration: route.ownerLeaseGeneration
273
+ };
274
+ }
264
275
  function remoteActorRouteTarget(route) {
265
276
  if (route.enclosingSpotRoute !== undefined) {
266
277
  return route.enclosingSpotRoute;
@@ -304,27 +315,6 @@ function requireActorId(actorId) {
304
315
  throw new configuration_1.ZLinkConfigurationException(`Actor ID must contain 1..${CoreTypes_1.ZLINK_MAX_ACTOR_ID_BYTES} UTF-8 bytes.`);
305
316
  }
306
317
  }
307
- async function forwardEncodedActorPacket(node, completions, actor, header, payload, returnResponse, timeoutMs, serializers) {
308
- const target = toBackendActorRef(actor);
309
- const parts = [header, payload];
310
- const packetName = (0, protocol_1.decodeStreamHeader)(header).name;
311
- if (!returnResponse) {
312
- if ((await node.sendToActor(target, parts, { flags: runtime_values_1.ZLINK_BACKEND_SEND_NONE })) !==
313
- runtime_values_1.SubmitResult.Ok) {
314
- throw routeNotConnected('Actor handoff send submit was not accepted.');
315
- }
316
- return undefined;
317
- }
318
- const completion = await completions.submit(() => node.requestToActor(target, parts, {
319
- flags: runtime_values_1.ZLINK_BACKEND_SEND_NONE,
320
- timeoutMs
321
- }));
322
- if (completion.terminalResult !== runtime_values_1.RequestResult.Ok) {
323
- (0, backend_1.closeMeshCompletion)(completion);
324
- throw mapRequestResult(completion.terminalResult, completion.failureErrno, 'Actor handoff request');
325
- }
326
- return decodeActorReply(completion.parts, serializers, packetName);
327
- }
328
318
  function toBackendActorRef(actor) {
329
319
  return {
330
320
  nodeRid: actor.nodeRid,
@@ -414,7 +404,7 @@ class DefaultZLinkActorRequestCall {
414
404
  this.rejectSelfActorRequest();
415
405
  const turn = (0, execution_1.requireZLinkYieldTurn)(this.turn);
416
406
  const pending = this.execute('yield', signal);
417
- return turn.yieldPromise(pending);
407
+ return turn.yieldFrameworkPromise(pending);
418
408
  }
419
409
  execute(waitPolicy, signal, onAdmitted) {
420
410
  ensureSingleSubmit(this.executed);
@@ -442,18 +432,14 @@ function decodeActorReply(reply, serializers, packetName) {
442
432
  const header = (0, protocol_1.decodeStreamHeader)(frame.header);
443
433
  const payload = runtime_message_1.ZLinkBufferMessage.from(frame.payload);
444
434
  try {
445
- return decodeActorReplyPayload(header.kind, payload, serializers, packetName);
435
+ return decodeActorReplyPayload(header.kind, header.codec, payload, serializers, packetName);
446
436
  }
447
437
  finally {
448
438
  payload.close();
449
439
  }
450
440
  }
451
441
  }
452
- if (reply.length >= 2) {
453
- const header = (0, protocol_1.decodeStreamHeader)(reply[0].data());
454
- return decodeActorReplyPayload(header.kind, reply[1], serializers, packetName);
455
- }
456
- throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestProtocolError, 'Actor request reply is empty.');
442
+ throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestProtocolError, 'Actor request reply must contain one valid STREAM frame.');
457
443
  }
458
444
  finally {
459
445
  closeMessages(reply);
@@ -463,17 +449,24 @@ function closeMessages(parts) {
463
449
  for (const part of parts)
464
450
  part.close();
465
451
  }
466
- function decodeActorReplyPayload(kind, payload, serializers, packetName) {
452
+ function decodeActorReplyPayload(kind, codec, payload, serializers, packetName) {
467
453
  if (kind === protocol_1.ZLinkStreamMessageKind.Error) {
468
- const error = (0, payload_codec_1.decodeFrameworkPayloadMessage)(payload, serializers);
469
- const wireKind = error.kind;
470
- const publicKind = typeof wireKind === 'number' &&
471
- Number.isInteger(wireKind) &&
472
- wireKind >= contracts_1.ZLinkFrameworkErrorKind.NotFound &&
473
- wireKind <= contracts_1.ZLinkFrameworkErrorKind.InternalFailure
474
- ? wireKind
475
- : contracts_1.ZLinkFrameworkErrorKind.InternalFailure;
476
- throw new contracts_1.ZLinkFrameworkException(publicKind, error.message ?? 'Actor request failed.');
454
+ if (codec !== protocol_1.ZLinkStreamCodec.Json || !(0, node_buffer_1.isUtf8)(payload.data())) {
455
+ throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestProtocolError, 'Actor Error reply requires UTF-8 JSON.');
456
+ }
457
+ const error = (0, payload_codec_1.decodeFrameworkPayloadMessage)(payload);
458
+ if (typeof error !== 'object' ||
459
+ error === null ||
460
+ typeof error.code !== 'string' ||
461
+ typeof error.message !== 'string') {
462
+ throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestProtocolError, 'Actor Error reply requires code and message strings.');
463
+ }
464
+ const wire = error;
465
+ const kind = (0, channel_envelope_1.channelErrorKindFromCode)(wire.code);
466
+ if (kind === undefined) {
467
+ throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestProtocolError, `Actor Error reply uses an unknown error code '${wire.code}'.`);
468
+ }
469
+ throw new contracts_1.ZLinkFrameworkException(kind, wire.message);
477
470
  }
478
471
  return (0, payload_codec_1.decodeFrameworkPayloadMessage)(payload, serializers, undefined, stream_wire_1.ZlinkStreamContentType.Json, packetName, 'reply');
479
472
  }
@@ -13,6 +13,8 @@ export declare class DefaultZLinkActorContext implements ZLinkActorContext {
13
13
  constructor(state: ZLinkActorRuntimeState, joinCoordinator: ZLinkActorJoinCoordinator | undefined, boundSessionFactory: ZLinkActorBoundSessionFactory | undefined, messageSerializers: ReadonlyMap<string, ZLinkMessageSerializer> | undefined, meshNameProvider: ZLinkActorManagerOptions['actorMeshNameProvider']);
14
14
  get meshName(): string;
15
15
  get actorId(): string;
16
+ /** Actor-turn view of the single current Session binding (§7). */
17
+ get currentSessionBinding(): import("./actor-runtime-state").ZLinkRemoteBoundSessionTarget | undefined;
16
18
  get objectGeneration(): bigint;
17
19
  get spotId(): SpotId | undefined;
18
20
  [ZLINK_ACTOR_LIFECYCLE_SNAPSHOT](): ZLinkActorLifecycleSnapshotSource;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DefaultZLinkActorContext = exports.ZLINK_ACTOR_JOIN_ENTRY_SPOT_RUNTIME = void 0;
4
+ const routing_id_1 = require("../routing-id");
4
5
  const contracts_1 = require("../../contracts");
5
6
  const ZLinkDispatchOptions_1 = require("../../contracts/Dispatch/ZLinkDispatchOptions");
6
7
  const runtime_message_1 = require("../backend/runtime-message");
@@ -53,6 +54,10 @@ class DefaultZLinkActorContext {
53
54
  get actorId() {
54
55
  return this.state.actorId;
55
56
  }
57
+ /** Actor-turn view of the single current Session binding (§7). */
58
+ get currentSessionBinding() {
59
+ return this.state.boundSession;
60
+ }
56
61
  get objectGeneration() {
57
62
  return this.state.nativeActorRef?.generation ?? 1n;
58
63
  }
@@ -200,10 +205,25 @@ class DefaultZLinkActorJoinSpotCall {
200
205
  deadline.close();
201
206
  requestMessage.close();
202
207
  }
208
+ if (result.sourceCleanup !== undefined) {
209
+ // Infrastructure cleanup has its own terminal, outside the public Failed conversion.
210
+ try {
211
+ const cleanup = result.sourceCleanup();
212
+ await (this.turn === undefined ? cleanup : this.turn.yieldFrameworkPromise(cleanup));
213
+ }
214
+ catch (error) {
215
+ traceJoinError(this.actor, error, this.coordinator, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop);
216
+ throw error;
217
+ }
218
+ finally {
219
+ this.state.endDeferredJoin();
220
+ }
221
+ return;
222
+ }
203
223
  if (!result.accepted ||
204
224
  sourceNodeRid === undefined ||
205
225
  result.actor === undefined ||
206
- String(sourceNodeRid) === String(result.actor.nodeRid)) {
226
+ (0, routing_id_1.routingIdsEqual)(sourceNodeRid, result.actor.nodeRid)) {
207
227
  await notifyJoinCompletion(this.actor, operationId, result, this.messageSerializers);
208
228
  }
209
229
  else {
@@ -322,10 +342,25 @@ class DefaultZLinkActorJoinEntrySpotCall {
322
342
  deadline.close();
323
343
  requestMessage.close();
324
344
  }
345
+ if (result.sourceCleanup !== undefined) {
346
+ // Infrastructure cleanup has its own terminal, outside the public Failed conversion.
347
+ try {
348
+ const cleanup = result.sourceCleanup();
349
+ await (this.turn === undefined ? cleanup : this.turn.yieldFrameworkPromise(cleanup));
350
+ }
351
+ catch (error) {
352
+ traceJoinError(this.actor, error, this.coordinator, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop);
353
+ throw error;
354
+ }
355
+ finally {
356
+ this.state.endDeferredJoin();
357
+ }
358
+ return;
359
+ }
325
360
  if (!result.accepted ||
326
361
  sourceNodeRid === undefined ||
327
362
  result.actor === undefined ||
328
- String(sourceNodeRid) === String(result.actor.nodeRid)) {
363
+ (0, routing_id_1.routingIdsEqual)(sourceNodeRid, result.actor.nodeRid)) {
329
364
  await notifyJoinCompletion(this.actor, operationId, result, this.messageSerializers);
330
365
  }
331
366
  else {
@@ -430,10 +465,17 @@ async function notifyJoinCompletion(actor, operationId, result, _messageSerializ
430
465
  await actor.onJoinCompleted?.(completion);
431
466
  }
432
467
  async function notifyJoinFailure(actor, operationId, error, coordinator) {
433
- console.error(`actor join failure actor=${actor.context.actorId}`, error);
434
468
  const frameworkError = error instanceof contracts_1.ZLinkFrameworkException
435
469
  ? error
436
470
  : (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestFailed, 'Deferred actor join failed.', false, error);
471
+ traceJoinError(actor, error, coordinator, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.ReplyError);
472
+ await actor.onJoinCompleted?.({
473
+ status: 'failed',
474
+ operationId,
475
+ kind: frameworkError.kind
476
+ });
477
+ }
478
+ function traceJoinError(actor, error, coordinator, errorAction) {
437
479
  // The completion carries only an error kind, so trace the cause on the
438
480
  // message flow under the same flow id as the Join that produced it.
439
481
  const tracePoint = coordinator?.messageFlow?.()?.begin(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Error);
@@ -445,13 +487,8 @@ async function notifyJoinFailure(actor, operationId, error, coordinator) {
445
487
  packetName: 'JoinSpot',
446
488
  actorId: actor.context.actorId,
447
489
  errorReason: ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.HandlerException,
448
- errorAction: ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.ReplyError,
490
+ errorAction,
449
491
  errorType: errorDetails?.errorType,
450
492
  errorMessage: errorDetails?.errorMessage
451
493
  });
452
- await actor.onJoinCompleted?.({
453
- status: 'failed',
454
- operationId,
455
- kind: frameworkError.kind
456
- });
457
494
  }
@@ -8,6 +8,7 @@ import { type ZLinkActorMessageFollowContext, type ZLinkActorMessageFollowOwnerF
8
8
  import type { ZLinkActorRoutedJoinTransport } from './actor-routed-join-transport';
9
9
  import type { ZLinkRemoteBoundSessionTarget } from './actor-runtime-state';
10
10
  export declare const DEFAULT_MESSAGE_FOLLOW_DURATION_MS: number;
11
+ export declare const RELOCATED_REQUEST_OWNED_BY_REQUESTER: unique symbol;
11
12
  export interface ZLinkActorHandoffPacket {
12
13
  readonly index: number;
13
14
  readonly header: string;
@@ -36,6 +37,7 @@ export interface ZLinkActorHandoffRequestSource {
36
37
  readonly ownerId: string;
37
38
  readonly ownerLeaseGeneration: string;
38
39
  readonly nodeRid: string;
40
+ readonly nodeRidHex?: string;
39
41
  readonly nodeGeneration: string;
40
42
  readonly replyRouteId: string;
41
43
  }
@@ -63,6 +65,7 @@ export interface ZLinkActorHandoffPrefixAdmission {
63
65
  readonly terminal: Promise<void>;
64
66
  }
65
67
  export interface ZLinkActorHandoffPrefixRecord {
68
+ readonly onWithdrawable?: (withdraw: () => boolean) => void;
66
69
  readonly drain: (dispatch: ZLinkActorHandoffDispatch) => Promise<void>;
67
70
  readonly preparation?: {
68
71
  prepare(signal: AbortSignal): Promise<void>;
@@ -118,13 +121,15 @@ export declare class ZLinkActorHandoffCoordinator {
118
121
  begin(actorId: string, oldGeneration: bigint): void;
119
122
  beginProvisional(actorId: string, oldGeneration: bigint): void;
120
123
  private startHandoff;
124
+ /** True while a hold owns this Actor's ingress, before its release to the Actor FIFO. */
121
125
  isActive(actorId: string): boolean;
122
126
  isProvisional(actorId: string): boolean;
123
- promoteProvisional(actorId: string): void;
124
127
  sealConnectionBoundIngress(actorId: string): void;
125
128
  activeSourceOwner(actorId: string): ZLinkActorMessageFollowOwnerFence | undefined;
126
129
  releaseDeferred(actorId: string, dispatch?: ZLinkActorHandoffDispatch, admission?: ZLinkActorHandoffReplayAdmission): Promise<void>;
127
130
  releaseCanceled(actorId: string, dispatch: ZLinkActorHandoffDispatch, admission?: ZLinkActorHandoffReplayAdmission): Promise<void>;
131
+ /** Installs a restored target's payload in the same owner used by local handoffs. */
132
+ admitTransferredPrefix(actorId: string, objectGeneration: bigint, packets: readonly ZLinkActorHandoffPacket[], queue: ZLinkActorHandoffPrefixQueue, preparation: ZLinkActorHandoffReplayPreparation | undefined, start: Promise<void>, onResult: (packet: ZLinkActorHandoffPacket, result: ZLinkActorHandoffResult) => void): ZLinkActorHandoffPrefixAdmission;
128
133
  private admitHandoffPrefix;
129
134
  private admitPendingPrefix;
130
135
  private createPrefixRecord;
@@ -144,7 +149,6 @@ export declare class ZLinkActorHandoffCoordinator {
144
149
  cancel(actorId: string): void;
145
150
  capture(origin: ApplicationJobOrigin, actorId: string, parts: readonly Message[], returnResponse?: boolean, remoteBoundSessionTarget?: ZLinkRemoteBoundSessionTarget, fallbackActorRef?: ActorRef, deadlineUnixMs?: number, messageFollowOrigin?: ZLinkMessageFollowOrigin, provisionalReplay?: ZLinkActorHandoffDispatch, onAdmitted?: () => void): Promise<unknown> | undefined;
146
151
  snapshot(actorId: string): readonly ZLinkActorHandoffPacket[];
147
- snapshotCoreBacklog(actorId: string): readonly ZLinkActorHandoffPacket[];
148
152
  /**
149
153
  * Freezes the post-capture ingress segment immediately before the caller
150
154
  * appends the one-way cutover on the same relocation lane. Records returned
@@ -152,7 +156,7 @@ export declare class ZLinkActorHandoffCoordinator {
152
156
  * from the later Message Follow tail.
153
157
  */
154
158
  takeRelocationRelay(actorId: string): readonly ZLinkActorHandoffPacket[];
155
- complete(actorId: string, target: ZLinkSpotRouteTarget, targetActorRef: ActorRef, results: readonly ZLinkActorHandoffResult[], targetOwnerFence: ZLinkActorMessageFollowOwnerFence): void;
159
+ complete(actorId: string, target: ZLinkSpotRouteTarget, targetActorRef: ActorRef, results: readonly ZLinkActorHandoffResult[], targetOwnerFence: ZLinkActorMessageFollowOwnerFence | null): void;
156
160
  messageFollowCount(actorId?: string): number;
157
161
  pendingCount(actorId: string): number;
158
162
  isKnownStale(actor: ActorRef): boolean;