@zlink-systems/framework 0.30.0 → 0.30.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/LICENSE +150 -68
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/contracts/Actors/ZLinkActorClient.d.ts +2 -1
  4. package/dist/contracts/Channels/Calls.d.ts +2 -1
  5. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
  6. package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
  7. package/dist/contracts/Common/ZLinkMessageMetadata.js +11 -5
  8. package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
  9. package/dist/contracts/Common/encoded-payload-storage.js +5 -2
  10. package/dist/contracts/Configuration/Builders.d.ts +1 -1
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
  12. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
  13. package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
  14. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  15. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
  16. package/dist/contracts/Handlers/Attributes.d.ts +5 -13
  17. package/dist/contracts/Handlers/Attributes.js +7 -11
  18. package/dist/contracts/Handlers/JsonContract.d.ts +2 -46
  19. package/dist/contracts/Handlers/JsonContract.js +4 -153
  20. package/dist/contracts/Locations/Rows.d.ts +2 -0
  21. package/dist/contracts/Spots/Contracts.d.ts +6 -1
  22. package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
  23. package/dist/nest-integration.d.ts +1 -1
  24. package/dist/nest-integration.js +2 -1
  25. package/dist/runtime/abort.d.ts +5 -0
  26. package/dist/runtime/abort.js +10 -0
  27. package/dist/runtime/actors/actor-authority-publication.js +3 -2
  28. package/dist/runtime/actors/actor-client.d.ts +1 -2
  29. package/dist/runtime/actors/actor-client.js +52 -57
  30. package/dist/runtime/actors/actor-context.d.ts +2 -0
  31. package/dist/runtime/actors/actor-context.js +46 -9
  32. package/dist/runtime/actors/actor-handoff.d.ts +8 -4
  33. package/dist/runtime/actors/actor-handoff.js +219 -92
  34. package/dist/runtime/actors/actor-join-relocation.d.ts +3 -0
  35. package/dist/runtime/actors/actor-local-native-join.js +13 -12
  36. package/dist/runtime/actors/actor-mailbox.js +27 -1
  37. package/dist/runtime/actors/actor-remote-joiner.js +3 -1
  38. package/dist/runtime/actors/actor-remote-wire.js +15 -0
  39. package/dist/runtime/actors/actor-reply.d.ts +4 -0
  40. package/dist/runtime/actors/actor-reply.js +29 -0
  41. package/dist/runtime/actors/actor-routed-join-transport.d.ts +6 -2
  42. package/dist/runtime/actors/actor-routed-json-request.d.ts +2 -0
  43. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
  44. package/dist/runtime/actors/actor-runtime-state.js +2 -20
  45. package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
  46. package/dist/runtime/actors/index.d.ts +8 -3
  47. package/dist/runtime/actors/index.js +55 -27
  48. package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
  49. package/dist/runtime/actors/session-disconnected-wire.js +48 -0
  50. package/dist/runtime/actors/spot-actor-dispatch.js +2 -2
  51. package/dist/runtime/admission.d.ts +9 -1
  52. package/dist/runtime/admission.js +56 -23
  53. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +6 -8
  54. package/dist/runtime/application-jobs/application-ingress-record-owner.js +39 -22
  55. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +15 -1
  56. package/dist/runtime/application-jobs/application-job-queue-scope.js +61 -20
  57. package/dist/runtime/application-jobs/contracts.d.ts +12 -1
  58. package/dist/runtime/backend/contracts/index.d.ts +37 -12
  59. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
  60. package/dist/runtime/backend/mesh-completion-table.d.ts +9 -1
  61. package/dist/runtime/backend/mesh-completion-table.js +154 -49
  62. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +28 -1
  63. package/dist/runtime/backend/mesh-dispatch-pump.js +208 -101
  64. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +2 -2
  65. package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -9
  66. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +1 -1
  67. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +5 -2
  68. package/dist/runtime/backend/node/node-raw-binding-port.js +124 -72
  69. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +46 -13
  70. package/dist/runtime/backend/node/node-raw-mesh-backend.js +181 -164
  71. package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
  72. package/dist/runtime/backend/node/node-socket-backend-adapter.js +11 -11
  73. package/dist/runtime/backend/raw-binding-port.d.ts +2 -2
  74. package/dist/runtime/backend/runtime-message.d.ts +1 -0
  75. package/dist/runtime/backend/runtime-message.js +5 -0
  76. package/dist/runtime/backend/runtime-values.d.ts +1 -0
  77. package/dist/runtime/backend/runtime-values.js +2 -1
  78. package/dist/runtime/channels/channel-clients.d.ts +2 -0
  79. package/dist/runtime/channels/channel-clients.js +75 -23
  80. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +25 -5
  81. package/dist/runtime/channels/channel-dispatch-pipeline.js +111 -56
  82. package/dist/runtime/channels/channel-dispatch-services.d.ts +1 -0
  83. package/dist/runtime/channels/channel-dispatch-services.js +45 -0
  84. package/dist/runtime/channels/channel-dispatchers.d.ts +4 -3
  85. package/dist/runtime/channels/channel-dispatchers.js +62 -54
  86. package/dist/runtime/channels/channel-envelope-inspection.d.ts +1 -2
  87. package/dist/runtime/channels/channel-envelope-inspection.js +1 -16
  88. package/dist/runtime/channels/channel-envelope.d.ts +2 -0
  89. package/dist/runtime/channels/channel-envelope.js +146 -28
  90. package/dist/runtime/channels/channel-outbound-operations.d.ts +2 -2
  91. package/dist/runtime/channels/channel-outbound-operations.js +8 -8
  92. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
  93. package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
  94. package/dist/runtime/channels/channel-runtime-manager.d.ts +9 -8
  95. package/dist/runtime/channels/channel-runtime-manager.js +16 -16
  96. package/dist/runtime/channels/channel-transports.d.ts +18 -16
  97. package/dist/runtime/channels/channel-transports.js +77 -58
  98. package/dist/runtime/channels/client-server-location-runtime.js +5 -4
  99. package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
  100. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  101. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  102. package/dist/runtime/channels/fanout-location-runtime.js +3 -3
  103. package/dist/runtime/channels/local-spot-route-transport.d.ts +1 -1
  104. package/dist/runtime/channels/local-spot-route-transport.js +2 -1
  105. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +2 -2
  106. package/dist/runtime/channels/router-socket-spot-route-transport.js +4 -4
  107. package/dist/runtime/channels/source-spot-router.d.ts +2 -2
  108. package/dist/runtime/channels/source-spot-router.js +4 -4
  109. package/dist/runtime/channels/spot-node-route-transport.d.ts +2 -2
  110. package/dist/runtime/channels/spot-node-route-transport.js +4 -4
  111. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +2 -2
  112. package/dist/runtime/channels/spot-route-bridge-transport.js +4 -4
  113. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +5 -4
  114. package/dist/runtime/channels/spot-route-dispatch-strategy.js +18 -18
  115. package/dist/runtime/diagnostics/flow-context.js +19 -7
  116. package/dist/runtime/diagnostics/index.js +4 -9
  117. package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
  118. package/dist/runtime/diagnostics/message-flow.js +35 -5
  119. package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
  120. package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
  121. package/dist/runtime/execution/index.d.ts +4 -2
  122. package/dist/runtime/execution/index.js +33 -10
  123. package/dist/runtime/execution/serial-execution-queue.d.ts +5 -0
  124. package/dist/runtime/execution/serial-execution-queue.js +22 -2
  125. package/dist/runtime/execution/state-lane.d.ts +2 -0
  126. package/dist/runtime/execution/state-lane.js +5 -0
  127. package/dist/runtime/foundation/actor-join-recovery-codec.js +2 -2
  128. package/dist/runtime/foundation/durable-service-request.d.ts +14 -0
  129. package/dist/runtime/foundation/durable-service-request.js +98 -0
  130. package/dist/runtime/foundation/operation-identity.d.ts +1 -0
  131. package/dist/runtime/foundation/operation-identity.js +5 -1
  132. package/dist/runtime/foundation/operation-registry.d.ts +25 -1
  133. package/dist/runtime/foundation/operation-registry.js +86 -18
  134. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +61 -8
  135. package/dist/runtime/foundation/raw-service-mesh-runtime.js +486 -266
  136. package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
  137. package/dist/runtime/foundation/service-liveness-registry.js +38 -0
  138. package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
  139. package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
  140. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +3 -3
  141. package/dist/runtime/foundation/service-relocation-object-owner.js +48 -34
  142. package/dist/runtime/foundation/service-relocation-runtime.d.ts +2 -0
  143. package/dist/runtime/foundation/service-relocation-runtime.js +20 -4
  144. package/dist/runtime/foundation/service-runtime-contracts.d.ts +10 -1
  145. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
  146. package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
  147. package/dist/runtime/foundation/service-stateful-registry.js +24 -26
  148. package/dist/runtime/foundation/service-stateful-runtime.d.ts +75 -9
  149. package/dist/runtime/foundation/service-stateful-runtime.js +486 -218
  150. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -6
  151. package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
  152. package/dist/runtime/foundation/service-topology-registry.d.ts +12 -2
  153. package/dist/runtime/foundation/service-topology-registry.js +61 -27
  154. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
  155. package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
  156. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  157. package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
  158. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +13 -3
  159. package/dist/runtime/foundation/service-wire-m6a-codec.js +189 -78
  160. package/dist/runtime/handlers/handler-instance-scope.d.ts +8 -0
  161. package/dist/runtime/handlers/handler-instance-scope.js +54 -11
  162. package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
  163. package/dist/runtime/host/actor-packet-relay.js +59 -72
  164. package/dist/runtime/host/actor-placement-coordinator.js +25 -8
  165. package/dist/runtime/host/actor-runtime-options-factory.js +2 -2
  166. package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
  167. package/dist/runtime/host/actor-transfer-runtime.js +85 -331
  168. package/dist/runtime/host/application-job-queue.d.ts +40 -7
  169. package/dist/runtime/host/application-job-queue.js +137 -42
  170. package/dist/runtime/host/entry-actor-runtime.d.ts +1 -0
  171. package/dist/runtime/host/entry-actor-runtime.js +3 -0
  172. package/dist/runtime/host/index.d.ts +12 -2
  173. package/dist/runtime/host/index.js +300 -202
  174. package/dist/runtime/host/location-runtime-owner.js +2 -6
  175. package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
  176. package/dist/runtime/host/mesh-router-resolver.js +14 -6
  177. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
  178. package/dist/runtime/host/remote-bound-session-relay.js +73 -208
  179. package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
  180. package/dist/runtime/host/route-mesh-runtime.js +6 -4
  181. package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
  182. package/dist/runtime/host/runtime-shutdown.js +3 -2
  183. package/dist/runtime/host/service-relocation-control.d.ts +1 -0
  184. package/dist/runtime/host/service-relocation-control.js +10 -4
  185. package/dist/runtime/host/service-relocation-host-runtime.d.ts +22 -14
  186. package/dist/runtime/host/service-relocation-host-runtime.js +754 -599
  187. package/dist/runtime/host/spot-address-transport.js +3 -2
  188. package/dist/runtime/host/spot-runtime-options-factory.js +16 -7
  189. package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
  190. package/dist/runtime/locations/actor-location-claims.d.ts +2 -2
  191. package/dist/runtime/locations/actor-location-claims.js +34 -19
  192. package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
  193. package/dist/runtime/locations/auto-connect-loop.js +22 -14
  194. package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
  195. package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
  196. package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
  197. package/dist/runtime/locations/descriptor-publication.js +11 -0
  198. package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
  199. package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
  200. package/dist/runtime/locations/in-memory-authority-store.js +56 -19
  201. package/dist/runtime/locations/in-memory-location-store.js +1 -10
  202. package/dist/runtime/locations/index.d.ts +1 -0
  203. package/dist/runtime/locations/index.js +1 -0
  204. package/dist/runtime/locations/lease-tracker.js +1 -6
  205. package/dist/runtime/locations/lifecycle.d.ts +1 -2
  206. package/dist/runtime/locations/lifecycle.js +2 -5
  207. package/dist/runtime/locations/location-store-repository.d.ts +51 -1
  208. package/dist/runtime/locations/location-store-repository.js +363 -139
  209. package/dist/runtime/locations/relocation-blob.d.ts +18 -1
  210. package/dist/runtime/locations/relocation-blob.js +52 -1
  211. package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
  212. package/dist/runtime/locations/request-source-resolver.js +80 -0
  213. package/dist/runtime/locations/resolvers.js +1 -1
  214. package/dist/runtime/locations/runtime.d.ts +7 -3
  215. package/dist/runtime/locations/runtime.js +61 -53
  216. package/dist/runtime/messaging/framework-json-v1.d.ts +4 -6
  217. package/dist/runtime/messaging/framework-json-v1.js +38 -294
  218. package/dist/runtime/messaging/packet-name.d.ts +1 -1
  219. package/dist/runtime/messaging/packet-name.js +8 -24
  220. package/dist/runtime/messaging/payload-codec.d.ts +7 -1
  221. package/dist/runtime/messaging/payload-codec.js +7 -6
  222. package/dist/runtime/messaging/request-result.d.ts +2 -0
  223. package/dist/runtime/messaging/request-result.js +57 -0
  224. package/dist/runtime/messaging/submission-result.d.ts +1 -0
  225. package/dist/runtime/messaging/submission-result.js +5 -2
  226. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +34 -1
  227. package/dist/runtime/protocol/service_wire_codec.generated.js +229 -0
  228. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +16 -1
  229. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +37 -8
  230. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +7 -2
  231. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +36 -21
  232. package/dist/runtime/spots/index.d.ts +21 -11
  233. package/dist/runtime/spots/index.js +243 -178
  234. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
  235. package/dist/runtime/spots/spot-activation-registry.js +21 -11
  236. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  237. package/dist/runtime/spots/spot-activation-state.js +7 -7
  238. package/dist/runtime/spots/spot-activation.d.ts +7 -3
  239. package/dist/runtime/spots/spot-activation.js +140 -52
  240. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
  241. package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
  242. package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
  243. package/dist/runtime/spots/spot-actor-membership.js +0 -8
  244. package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
  245. package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
  246. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
  247. package/dist/runtime/spots/spot-entry-activation.js +20 -11
  248. package/dist/runtime/spots/spot-handler-registry.d.ts +7 -4
  249. package/dist/runtime/spots/spot-handler-registry.js +24 -10
  250. package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
  251. package/dist/runtime/spots/spot-manager-public.js +2 -2
  252. package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
  253. package/dist/runtime/spots/spot-node-autoconnect.js +22 -42
  254. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
  255. package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
  256. package/dist/runtime/spots/spot-outbound.d.ts +3 -0
  257. package/dist/runtime/spots/spot-outbound.js +27 -18
  258. package/dist/runtime/spots/spot-remote-codec.js +5 -1
  259. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +1 -0
  260. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +1 -1
  261. package/dist/runtime/spots/spot-runtime-ports.d.ts +1 -1
  262. package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
  263. package/dist/runtime/spots/spot-serial-executor.js +61 -8
  264. package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
  265. package/dist/runtime/spots/spot-subscription-dispatch.js +1 -4
  266. package/dist/runtime/spots/spot-timer.d.ts +57 -5
  267. package/dist/runtime/spots/spot-timer.js +288 -103
  268. package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
  269. package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
  270. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
  271. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
  272. package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
  273. package/dist/runtime/streams/bound-session-service.d.ts +1 -1
  274. package/dist/runtime/streams/bound-session-service.js +6 -11
  275. package/dist/runtime/streams/index.d.ts +3 -2
  276. package/dist/runtime/streams/index.js +6 -4
  277. package/dist/runtime/streams/managed-stream.js +3 -2
  278. package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
  279. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
  280. package/dist/runtime/streams/session-actor-coordinator.js +15 -32
  281. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
  282. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -1
  283. package/dist/runtime/streams/stream-session-runtime.js +14 -31
  284. package/dist/runtime/workers/index.js +1 -1
  285. package/package.json +3 -3
  286. package/src/contracts/Actors/ZLinkActorClient.ts +2 -1
  287. package/src/contracts/Channels/Calls.ts +2 -1
  288. package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
  289. package/src/contracts/Common/ZLinkMessageMetadata.ts +13 -8
  290. package/src/contracts/Common/encoded-payload-storage.ts +6 -3
  291. package/src/contracts/Configuration/Builders.ts +4 -1
  292. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
  293. package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
  294. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  295. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
  296. package/src/contracts/Handlers/Attributes.ts +14 -21
  297. package/src/contracts/Handlers/JsonContract.ts +8 -216
  298. package/src/contracts/Locations/Rows.ts +2 -0
  299. package/src/contracts/Spots/Contracts.ts +10 -1
  300. package/src/contracts/Spots/ZLinkSpot.ts +3 -3
  301. package/src/nest-integration.ts +1 -0
  302. package/src/runtime/abort.ts +12 -0
  303. package/src/runtime/actors/actor-authority-publication.ts +3 -2
  304. package/src/runtime/actors/actor-client.ts +100 -85
  305. package/src/runtime/actors/actor-context.ts +49 -9
  306. package/src/runtime/actors/actor-handoff.ts +291 -110
  307. package/src/runtime/actors/actor-join-relocation.ts +3 -0
  308. package/src/runtime/actors/actor-local-native-join.ts +21 -26
  309. package/src/runtime/actors/actor-mailbox.ts +40 -2
  310. package/src/runtime/actors/actor-remote-joiner.ts +6 -1
  311. package/src/runtime/actors/actor-remote-wire.ts +17 -0
  312. package/src/runtime/actors/actor-reply.ts +42 -0
  313. package/src/runtime/actors/actor-routed-join-transport.ts +14 -4
  314. package/src/runtime/actors/actor-routed-json-request.ts +10 -2
  315. package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
  316. package/src/runtime/actors/actor-runtime-state.ts +2 -20
  317. package/src/runtime/actors/actor-source-transfer.ts +1 -34
  318. package/src/runtime/actors/index.ts +60 -32
  319. package/src/runtime/actors/session-disconnected-wire.ts +66 -0
  320. package/src/runtime/actors/spot-actor-dispatch.ts +4 -2
  321. package/src/runtime/admission.ts +69 -21
  322. package/src/runtime/application-jobs/application-ingress-record-owner.ts +41 -25
  323. package/src/runtime/application-jobs/application-job-queue-scope.ts +83 -22
  324. package/src/runtime/application-jobs/contracts.ts +16 -1
  325. package/src/runtime/backend/contracts/index.ts +92 -18
  326. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
  327. package/src/runtime/backend/mesh-completion-table.ts +160 -57
  328. package/src/runtime/backend/mesh-dispatch-pump.ts +237 -108
  329. package/src/runtime/backend/node/node-backend-adapter-support.ts +17 -8
  330. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +12 -2
  331. package/src/runtime/backend/node/node-raw-binding-port.ts +148 -85
  332. package/src/runtime/backend/node/node-raw-mesh-backend.ts +315 -201
  333. package/src/runtime/backend/node/node-socket-backend-adapter.ts +26 -11
  334. package/src/runtime/backend/raw-binding-port.ts +7 -2
  335. package/src/runtime/backend/runtime-message.ts +6 -0
  336. package/src/runtime/backend/runtime-values.ts +1 -0
  337. package/src/runtime/channels/channel-clients.ts +132 -58
  338. package/src/runtime/channels/channel-dispatch-pipeline.ts +198 -114
  339. package/src/runtime/channels/channel-dispatch-services.ts +69 -1
  340. package/src/runtime/channels/channel-dispatchers.ts +136 -90
  341. package/src/runtime/channels/channel-envelope-inspection.ts +2 -16
  342. package/src/runtime/channels/channel-envelope.ts +225 -31
  343. package/src/runtime/channels/channel-outbound-operations.ts +22 -8
  344. package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
  345. package/src/runtime/channels/channel-runtime-manager.ts +41 -17
  346. package/src/runtime/channels/channel-transports.ts +171 -112
  347. package/src/runtime/channels/client-server-location-runtime.ts +11 -10
  348. package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
  349. package/src/runtime/channels/fanout-location-runtime.ts +17 -9
  350. package/src/runtime/channels/local-spot-route-transport.ts +3 -1
  351. package/src/runtime/channels/router-socket-spot-route-transport.ts +13 -4
  352. package/src/runtime/channels/source-spot-router.ts +8 -4
  353. package/src/runtime/channels/spot-node-route-transport.ts +8 -4
  354. package/src/runtime/channels/spot-route-bridge-transport.ts +6 -4
  355. package/src/runtime/channels/spot-route-dispatch-strategy.ts +47 -18
  356. package/src/runtime/diagnostics/flow-context.ts +20 -7
  357. package/src/runtime/diagnostics/index.ts +1 -7
  358. package/src/runtime/diagnostics/message-flow.ts +47 -9
  359. package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
  360. package/src/runtime/execution/index.ts +40 -14
  361. package/src/runtime/execution/serial-execution-queue.ts +33 -4
  362. package/src/runtime/execution/state-lane.ts +7 -0
  363. package/src/runtime/foundation/actor-join-recovery-codec.ts +2 -2
  364. package/src/runtime/foundation/durable-service-request.ts +137 -0
  365. package/src/runtime/foundation/operation-identity.ts +5 -1
  366. package/src/runtime/foundation/operation-registry.ts +98 -20
  367. package/src/runtime/foundation/raw-service-mesh-runtime.ts +704 -336
  368. package/src/runtime/foundation/service-liveness-registry.ts +39 -0
  369. package/src/runtime/foundation/service-mailbox.ts +8 -0
  370. package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
  371. package/src/runtime/foundation/service-relocation-object-owner.ts +55 -36
  372. package/src/runtime/foundation/service-relocation-runtime.ts +25 -4
  373. package/src/runtime/foundation/service-runtime-contracts.ts +19 -2
  374. package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
  375. package/src/runtime/foundation/service-stateful-registry.ts +38 -35
  376. package/src/runtime/foundation/service-stateful-runtime.ts +732 -275
  377. package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -16
  378. package/src/runtime/foundation/service-topology-registry.ts +91 -36
  379. package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
  380. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  381. package/src/runtime/foundation/service-wire-m6a-codec.ts +231 -76
  382. package/src/runtime/handlers/handler-instance-scope.ts +67 -16
  383. package/src/runtime/host/actor-packet-relay.ts +113 -94
  384. package/src/runtime/host/actor-placement-coordinator.ts +31 -8
  385. package/src/runtime/host/actor-runtime-options-factory.ts +13 -2
  386. package/src/runtime/host/actor-transfer-runtime.ts +104 -430
  387. package/src/runtime/host/application-job-queue.ts +160 -41
  388. package/src/runtime/host/entry-actor-runtime.ts +4 -0
  389. package/src/runtime/host/index.ts +473 -271
  390. package/src/runtime/host/location-runtime-owner.ts +2 -6
  391. package/src/runtime/host/mesh-router-resolver.ts +13 -5
  392. package/src/runtime/host/remote-bound-session-relay.ts +88 -271
  393. package/src/runtime/host/route-mesh-runtime.ts +12 -6
  394. package/src/runtime/host/runtime-shutdown.ts +15 -4
  395. package/src/runtime/host/service-relocation-control.ts +11 -5
  396. package/src/runtime/host/service-relocation-host-runtime.ts +1092 -759
  397. package/src/runtime/host/spot-address-transport.ts +4 -2
  398. package/src/runtime/host/spot-runtime-options-factory.ts +20 -7
  399. package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
  400. package/src/runtime/locations/actor-location-claims.ts +52 -30
  401. package/src/runtime/locations/auto-connect-loop.ts +22 -14
  402. package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
  403. package/src/runtime/locations/auto-connect-types.ts +0 -1
  404. package/src/runtime/locations/descriptor-publication.ts +7 -0
  405. package/src/runtime/locations/domain-store-contract.ts +5 -0
  406. package/src/runtime/locations/in-memory-authority-store.ts +85 -23
  407. package/src/runtime/locations/in-memory-location-store.ts +1 -12
  408. package/src/runtime/locations/index.ts +1 -0
  409. package/src/runtime/locations/lease-tracker.ts +2 -9
  410. package/src/runtime/locations/lifecycle.ts +8 -26
  411. package/src/runtime/locations/location-store-repository.ts +628 -152
  412. package/src/runtime/locations/relocation-blob.ts +75 -1
  413. package/src/runtime/locations/request-source-resolver.ts +138 -0
  414. package/src/runtime/locations/resolvers.ts +2 -2
  415. package/src/runtime/locations/runtime.ts +98 -64
  416. package/src/runtime/messaging/framework-json-v1.ts +5 -325
  417. package/src/runtime/messaging/packet-name.ts +5 -25
  418. package/src/runtime/messaging/payload-codec.ts +8 -11
  419. package/src/runtime/messaging/request-result.ts +62 -0
  420. package/src/runtime/messaging/submission-result.ts +5 -1
  421. package/src/runtime/protocol/service_wire_codec.generated.ts +218 -5
  422. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +16 -13
  423. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +46 -25
  424. package/src/runtime/spots/index.ts +389 -283
  425. package/src/runtime/spots/spot-activation-registry.ts +25 -13
  426. package/src/runtime/spots/spot-activation-state.ts +12 -19
  427. package/src/runtime/spots/spot-activation.ts +198 -96
  428. package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
  429. package/src/runtime/spots/spot-actor-membership.ts +0 -15
  430. package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
  431. package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
  432. package/src/runtime/spots/spot-entry-activation.ts +33 -21
  433. package/src/runtime/spots/spot-handler-registry.ts +56 -12
  434. package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
  435. package/src/runtime/spots/spot-manager-public.ts +2 -2
  436. package/src/runtime/spots/spot-node-autoconnect.ts +28 -47
  437. package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
  438. package/src/runtime/spots/spot-outbound.ts +39 -19
  439. package/src/runtime/spots/spot-remote-codec.ts +9 -2
  440. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +2 -1
  441. package/src/runtime/spots/spot-runtime-ports.ts +1 -1
  442. package/src/runtime/spots/spot-serial-executor.ts +97 -25
  443. package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
  444. package/src/runtime/spots/spot-subscription-dispatch.ts +1 -4
  445. package/src/runtime/spots/spot-timer.ts +418 -158
  446. package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
  447. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
  448. package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
  449. package/src/runtime/streams/bound-session-service.ts +7 -10
  450. package/src/runtime/streams/index.ts +12 -6
  451. package/src/runtime/streams/managed-stream.ts +4 -2
  452. package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
  453. package/src/runtime/streams/session-actor-coordinator.ts +39 -88
  454. package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
  455. package/src/runtime/streams/stream-session-runtime.ts +13 -34
  456. package/src/runtime/workers/index.ts +1 -1
@@ -1,4 +1,9 @@
1
+ import { isUtf8 } from 'node:buffer';
2
+ import { channelErrorKindFromCode } from '../channels/channel-envelope';
3
+ import { routingIdsEqual } from '../routing-id';
1
4
  import { ZlinkStreamContentType } from '@zlink-systems/stream-wire';
5
+ import { createZLinkRequest } from '../messaging/request-result';
6
+ import type { ZLinkRequest } from '../../contracts/Handlers/Attributes';
2
7
  import {
3
8
  type ActorRef,
4
9
  type RoutingId,
@@ -6,7 +11,6 @@ import {
6
11
  type ZLinkActorRequestCall,
7
12
  type ZLinkActorSendCall,
8
13
  type ZLinkMessageSerializer,
9
- ZLinkFrameworkErrorKind,
10
14
  ZLinkFrameworkException,
11
15
  ZLinkSpotKind
12
16
  } from '../../contracts';
@@ -25,7 +29,6 @@ import { ZLinkBufferMessage as RuntimeMessage } from '../backend/runtime-message
25
29
  import {
26
30
  isZLinkBackendResultError,
27
31
  RequestResult,
28
- SubmitResult,
29
32
  ZLINK_BACKEND_SEND_NONE
30
33
  } from '../backend/runtime-values';
31
34
  import { ZLinkConfigurationException } from '../configuration';
@@ -58,6 +61,7 @@ import {
58
61
  encodeStreamHeader,
59
62
  streamCodecForContentType,
60
63
  tryDecodeStreamFrame,
64
+ ZLinkStreamCodec,
61
65
  ZLinkStreamHeaderFlags,
62
66
  ZLinkStreamMessageKind
63
67
  } from '../streams/protocol';
@@ -89,7 +93,8 @@ export interface ZLinkActorClientOptions {
89
93
  parts: readonly Message[],
90
94
  returnResponse: boolean,
91
95
  actor: ActorRef,
92
- deadlineUnixMs?: number
96
+ deadlineUnixMs?: number,
97
+ onAdmitted?: () => void
93
98
  ) => Promise<unknown> | undefined;
94
99
  readonly sendErrorReporter?: (error: unknown) => void;
95
100
  readonly routeTransport?: ZLinkActorRoutedJoinTransport;
@@ -118,8 +123,17 @@ export class DefaultZLinkActorClient implements ZLinkActorClient {
118
123
  requestToActor(actorId: string, request: unknown): ZLinkActorRequestCall {
119
124
  requireActorId(actorId);
120
125
  return new DefaultZLinkActorRequestCall(
121
- (packetName, timeoutMs, metadata, signal) =>
122
- this.request(actorId, packetName, request, timeoutMs, metadata, signal, 'async'),
126
+ (packetName, timeoutMs, metadata, signal, onAdmitted) =>
127
+ this.request(
128
+ actorId,
129
+ packetName,
130
+ request,
131
+ timeoutMs,
132
+ metadata,
133
+ signal,
134
+ 'async',
135
+ onAdmitted
136
+ ),
123
137
  (packetName, timeoutMs, metadata, signal) =>
124
138
  this.request(actorId, packetName, request, timeoutMs, metadata, signal, 'yield'),
125
139
  actorId,
@@ -174,7 +188,7 @@ export class DefaultZLinkActorClient implements ZLinkActorClient {
174
188
  const node = this.requireNode(meshName);
175
189
  if (
176
190
  this.options.routeTransport !== undefined &&
177
- String(node.status().routingId) !== String(actor.nodeRid)
191
+ !routingIdsEqual(node.status().routingId, actor.nodeRid)
178
192
  ) {
179
193
  await this.options.routeTransport.sendToSpot(
180
194
  remoteActorRouteTarget(route),
@@ -191,7 +205,7 @@ export class DefaultZLinkActorClient implements ZLinkActorClient {
191
205
  );
192
206
  return { status: ZLinkSubmitStatus.Submitted };
193
207
  }
194
- return await this.submitActorSend(meshName, toBackendActorRef(actor), parts);
208
+ return await this.submitActorSend(meshName, toBackendActorRef(actor), parts, route);
195
209
  } catch (error) {
196
210
  if (isStaleActorError(error)) {
197
211
  this.invalidateActorRoute(actorId);
@@ -211,7 +225,8 @@ export class DefaultZLinkActorClient implements ZLinkActorClient {
211
225
  timeoutMs: number | undefined,
212
226
  metadata: ReadonlyMap<string, string>,
213
227
  signal?: AbortSignal,
214
- waitPolicy: 'async' | 'yield' = 'async'
228
+ waitPolicy: 'async' | 'yield' = 'async',
229
+ onAdmitted?: () => void
215
230
  ): Promise<TReply> {
216
231
  throwIfAborted(signal);
217
232
  const sourceSpotId = currentZLinkActorExecution()?.spotId ?? currentZLinkSpotSerialSourceId();
@@ -267,7 +282,8 @@ export class DefaultZLinkActorClient implements ZLinkActorClient {
267
282
  parts,
268
283
  true,
269
284
  routedActor,
270
- deadlineUnixMs
285
+ deadlineUnixMs,
286
+ onAdmitted
271
287
  );
272
288
  if (handoff !== undefined) {
273
289
  const submissions = [handoff];
@@ -278,7 +294,8 @@ export class DefaultZLinkActorClient implements ZLinkActorClient {
278
294
  parts,
279
295
  true,
280
296
  routedActor,
281
- deadlineUnixMs
297
+ deadlineUnixMs,
298
+ onAdmitted
282
299
  );
283
300
  if (duplicate !== undefined) submissions.push(duplicate);
284
301
  }
@@ -297,7 +314,8 @@ export class DefaultZLinkActorClient implements ZLinkActorClient {
297
314
  remainingActorRequestTimeout(actorId, deadlineMs),
298
315
  signal,
299
316
  route,
300
- messageFollow
317
+ messageFollow,
318
+ onAdmitted
301
319
  );
302
320
  } catch (error) {
303
321
  if (isStaleActorError(error)) {
@@ -398,13 +416,15 @@ export class DefaultZLinkActorClient implements ZLinkActorClient {
398
416
  private async submitActorSend(
399
417
  meshName: string,
400
418
  actor: ZLinkBackendActorRef,
401
- parts: readonly Message[]
419
+ parts: readonly Message[],
420
+ route: ZLinkResolvedActorRoute
402
421
  ): Promise<ZLinkSubmitResult> {
403
422
  const node = this.requireNode(meshName);
404
423
  try {
405
424
  return classifySubmitResult(
406
425
  await node.sendToActor(actor, toMessageLikeParts(parts), {
407
- flags: ZLINK_BACKEND_SEND_NONE
426
+ flags: ZLINK_BACKEND_SEND_NONE,
427
+ routeFence: nativeActorRouteFence(route, actor)
408
428
  }),
409
429
  'Actor send'
410
430
  );
@@ -421,15 +441,15 @@ export class DefaultZLinkActorClient implements ZLinkActorClient {
421
441
  actor: ZLinkBackendActorRef,
422
442
  parts: readonly Message[],
423
443
  timeoutMs: number | undefined,
424
- signal?: AbortSignal,
425
- route?: ZLinkResolvedActorRoute,
426
- messageFollowContext?: ZLinkActorMessageFollowContext
444
+ signal: AbortSignal | undefined,
445
+ route: ZLinkResolvedActorRoute,
446
+ messageFollowContext: ZLinkActorMessageFollowContext,
447
+ onAdmitted?: () => void
427
448
  ): Promise<TReply> {
428
449
  const node = this.requireNode(meshName);
429
450
  if (
430
451
  this.options.routeTransport !== undefined &&
431
- String(node.status().routingId) !== String(actor.nodeRid) &&
432
- route !== undefined
452
+ !routingIdsEqual(node.status().routingId, actor.nodeRid)
433
453
  ) {
434
454
  const relay = encodeRemoteActorPacketRelayPayload({
435
455
  actorId: actor.actorId,
@@ -459,7 +479,7 @@ export class DefaultZLinkActorClient implements ZLinkActorClient {
459
479
  this.options.routeTransport,
460
480
  remoteActorRouteTarget(route),
461
481
  relay,
462
- { timeoutMs, signal },
482
+ { timeoutMs, signal, onAdmitted },
463
483
  `Remote Actor request is not available for '${actor.actorId}'.`,
464
484
  (replyParts) => JSON.parse(replyParts[0]?.getString('utf8') ?? '{}')
465
485
  );
@@ -481,7 +501,9 @@ export class DefaultZLinkActorClient implements ZLinkActorClient {
481
501
  () =>
482
502
  node.requestToActor(actor, toMessageLikeParts(parts), {
483
503
  flags: ZLINK_BACKEND_SEND_NONE,
484
- timeoutMs
504
+ routeFence: nativeActorRouteFence(route, actor),
505
+ timeoutMs,
506
+ onAdmitted
485
507
  }),
486
508
  signal
487
509
  );
@@ -509,6 +531,15 @@ export class DefaultZLinkActorClient implements ZLinkActorClient {
509
531
  }
510
532
  }
511
533
 
534
+ function nativeActorRouteFence(route: ZLinkResolvedActorRoute, actor: ZLinkBackendActorRef) {
535
+ return {
536
+ actor,
537
+ targetNodeGeneration: route.ownerNodeGeneration,
538
+ authorityOwnerGeneration: route.authorityOwnerGeneration,
539
+ ownerLeaseGeneration: route.ownerLeaseGeneration
540
+ };
541
+ }
542
+
512
543
  function remoteActorRouteTarget(route: ZLinkResolvedActorRoute) {
513
544
  if (route.enclosingSpotRoute !== undefined) {
514
545
  return route.enclosingSpotRoute;
@@ -579,45 +610,6 @@ function requireActorId(actorId: string): void {
579
610
  }
580
611
  }
581
612
 
582
- export async function forwardEncodedActorPacket(
583
- node: ZLinkBackendMeshNode,
584
- completions: ZLinkMeshCompletionTable,
585
- actor: ActorRef,
586
- header: Buffer,
587
- payload: Buffer,
588
- returnResponse: boolean,
589
- timeoutMs: number | undefined,
590
- serializers?: ReadonlyMap<string, ZLinkMessageSerializer>
591
- ): Promise<unknown> {
592
- const target = toBackendActorRef(actor);
593
- const parts = [header, payload];
594
- const packetName = decodeStreamHeader(header).name;
595
- if (!returnResponse) {
596
- if (
597
- (await node.sendToActor(target, parts, { flags: ZLINK_BACKEND_SEND_NONE })) !==
598
- SubmitResult.Ok
599
- ) {
600
- throw routeNotConnected('Actor handoff send submit was not accepted.');
601
- }
602
- return undefined;
603
- }
604
- const completion = await completions.submit(() =>
605
- node.requestToActor(target, parts, {
606
- flags: ZLINK_BACKEND_SEND_NONE,
607
- timeoutMs
608
- })
609
- );
610
- if (completion.terminalResult !== RequestResult.Ok) {
611
- closeMeshCompletion(completion);
612
- throw mapRequestResult(
613
- completion.terminalResult,
614
- completion.failureErrno,
615
- 'Actor handoff request'
616
- );
617
- }
618
- return decodeActorReply(completion.parts, serializers, packetName);
619
- }
620
-
621
613
  function toBackendActorRef(actor: ActorRef): ZLinkBackendActorRef {
622
614
  return {
623
615
  nodeRid: actor.nodeRid,
@@ -700,7 +692,8 @@ class DefaultZLinkActorRequestCall implements ZLinkActorRequestCall {
700
692
  packetName: string | undefined,
701
693
  timeoutMs: number | undefined,
702
694
  metadata: ReadonlyMap<string, string>,
703
- signal?: AbortSignal
695
+ signal?: AbortSignal,
696
+ onAdmitted?: () => void
704
697
  ) => Promise<TReply>,
705
698
  private readonly yieldSubmitter: <TReply>(
706
699
  packetName: string | undefined,
@@ -728,20 +721,24 @@ class DefaultZLinkActorRequestCall implements ZLinkActorRequestCall {
728
721
  return this;
729
722
  }
730
723
 
731
- submit<TReply>(signal?: AbortSignal): Promise<TReply> {
732
- return this.execute<TReply>('async', signal);
724
+ submit<TReply>(signal?: AbortSignal): ZLinkRequest<TReply> {
725
+ this.rejectSelfActorRequest();
726
+ return createZLinkRequest((onAdmitted) => this.execute<TReply>('async', signal, onAdmitted));
733
727
  }
734
728
 
735
729
  yield<TReply>(signal?: AbortSignal): Promise<TReply> {
736
730
  this.rejectSelfActorRequest();
737
731
  const turn = requireZLinkYieldTurn(this.turn);
738
732
  const pending = this.execute<TReply>('yield', signal);
739
- return turn.yieldPromise(pending);
733
+ return turn.yieldFrameworkPromise(pending);
740
734
  }
741
735
 
742
- private execute<TReply>(waitPolicy: 'async' | 'yield', signal?: AbortSignal): Promise<TReply> {
736
+ private execute<TReply>(
737
+ waitPolicy: 'async' | 'yield',
738
+ signal?: AbortSignal,
739
+ onAdmitted?: () => void
740
+ ): Promise<TReply> {
743
741
  ensureSingleSubmit(this.executed);
744
- this.rejectSelfActorRequest();
745
742
  this.executed = true;
746
743
  throwIfAborted(signal);
747
744
  const submitter = waitPolicy === 'async' ? this.asyncSubmitter : this.yieldSubmitter;
@@ -749,7 +746,8 @@ class DefaultZLinkActorRequestCall implements ZLinkActorRequestCall {
749
746
  this.packet ?? resolveFrameworkPacketName(this.request, undefined, 'Actor'),
750
747
  this.timeoutMs ?? this.defaultRequestTimeoutMs,
751
748
  this.selectedMetadata,
752
- signal
749
+ signal,
750
+ onAdmitted
753
751
  );
754
752
  }
755
753
 
@@ -780,19 +778,21 @@ function decodeActorReply<TReply>(
780
778
  const header = decodeStreamHeader(frame.header);
781
779
  const payload = RuntimeMessage.from(frame.payload) as Message;
782
780
  try {
783
- return decodeActorReplyPayload<TReply>(header.kind, payload, serializers, packetName);
781
+ return decodeActorReplyPayload<TReply>(
782
+ header.kind,
783
+ header.codec,
784
+ payload,
785
+ serializers,
786
+ packetName
787
+ );
784
788
  } finally {
785
789
  payload.close();
786
790
  }
787
791
  }
788
792
  }
789
- if (reply.length >= 2) {
790
- const header = decodeStreamHeader(reply[0].data());
791
- return decodeActorReplyPayload<TReply>(header.kind, reply[1], serializers, packetName);
792
- }
793
793
  throw createInternalFrameworkException(
794
794
  ZLinkFrameworkInternalErrorKind.RequestProtocolError,
795
- 'Actor request reply is empty.'
795
+ 'Actor request reply must contain one valid STREAM frame.'
796
796
  );
797
797
  } finally {
798
798
  closeMessages(reply);
@@ -805,24 +805,39 @@ function closeMessages(parts: readonly Message[]): void {
805
805
 
806
806
  function decodeActorReplyPayload<TReply>(
807
807
  kind: ZLinkStreamMessageKind,
808
+ codec: ZLinkStreamCodec,
808
809
  payload: Message,
809
810
  serializers?: ReadonlyMap<string, ZLinkMessageSerializer>,
810
811
  packetName?: string
811
812
  ): TReply {
812
813
  if (kind === ZLinkStreamMessageKind.Error) {
813
- const error = decodeFrameworkPayloadMessage<{
814
- readonly message?: string;
815
- readonly kind?: number;
816
- }>(payload, serializers);
817
- const wireKind = error.kind;
818
- const publicKind =
819
- typeof wireKind === 'number' &&
820
- Number.isInteger(wireKind) &&
821
- wireKind >= ZLinkFrameworkErrorKind.NotFound &&
822
- wireKind <= ZLinkFrameworkErrorKind.InternalFailure
823
- ? (wireKind as ZLinkFrameworkErrorKind)
824
- : ZLinkFrameworkErrorKind.InternalFailure;
825
- throw new ZLinkFrameworkException(publicKind, error.message ?? 'Actor request failed.');
814
+ if (codec !== ZLinkStreamCodec.Json || !isUtf8(payload.data())) {
815
+ throw createInternalFrameworkException(
816
+ ZLinkFrameworkInternalErrorKind.RequestProtocolError,
817
+ 'Actor Error reply requires UTF-8 JSON.'
818
+ );
819
+ }
820
+ const error = decodeFrameworkPayloadMessage<unknown>(payload);
821
+ if (
822
+ typeof error !== 'object' ||
823
+ error === null ||
824
+ typeof (error as { code?: unknown }).code !== 'string' ||
825
+ typeof (error as { message?: unknown }).message !== 'string'
826
+ ) {
827
+ throw createInternalFrameworkException(
828
+ ZLinkFrameworkInternalErrorKind.RequestProtocolError,
829
+ 'Actor Error reply requires code and message strings.'
830
+ );
831
+ }
832
+ const wire = error as { code: string; message: string };
833
+ const kind = channelErrorKindFromCode(wire.code);
834
+ if (kind === undefined) {
835
+ throw createInternalFrameworkException(
836
+ ZLinkFrameworkInternalErrorKind.RequestProtocolError,
837
+ `Actor Error reply uses an unknown error code '${wire.code}'.`
838
+ );
839
+ }
840
+ throw new ZLinkFrameworkException(kind, wire.message);
826
841
  }
827
842
  return decodeFrameworkPayloadMessage<TReply>(
828
843
  payload,
@@ -1,3 +1,4 @@
1
+ import { routingIdsEqual } from '../routing-id';
1
2
  import {
2
3
  type RoutingId,
3
4
  type SpotId,
@@ -90,6 +91,11 @@ export class DefaultZLinkActorContext implements ZLinkActorContext {
90
91
  return this.state.actorId;
91
92
  }
92
93
 
94
+ /** Actor-turn view of the single current Session binding (§7). */
95
+ get currentSessionBinding() {
96
+ return this.state.boundSession;
97
+ }
98
+
93
99
  get objectGeneration(): bigint {
94
100
  return this.state.nativeActorRef?.generation ?? 1n;
95
101
  }
@@ -282,11 +288,24 @@ class DefaultZLinkActorJoinSpotCall implements ZLinkActorJoinSpotCall {
282
288
  deadline.close();
283
289
  requestMessage.close();
284
290
  }
291
+ if (result.sourceCleanup !== undefined) {
292
+ // Infrastructure cleanup has its own terminal, outside the public Failed conversion.
293
+ try {
294
+ const cleanup = result.sourceCleanup();
295
+ await (this.turn === undefined ? cleanup : this.turn.yieldFrameworkPromise(cleanup));
296
+ } catch (error) {
297
+ traceJoinError(this.actor, error, this.coordinator, ZLinkDispatchErrorAction.Drop);
298
+ throw error;
299
+ } finally {
300
+ this.state.endDeferredJoin();
301
+ }
302
+ return;
303
+ }
285
304
  if (
286
305
  !result.accepted ||
287
306
  sourceNodeRid === undefined ||
288
307
  result.actor === undefined ||
289
- String(sourceNodeRid) === String(result.actor.nodeRid)
308
+ routingIdsEqual(sourceNodeRid, result.actor.nodeRid)
290
309
  ) {
291
310
  await notifyJoinCompletion(this.actor, operationId, result, this.messageSerializers);
292
311
  } else {
@@ -417,11 +436,24 @@ class DefaultZLinkActorJoinEntrySpotCall implements ZLinkActorJoinEntrySpotCall
417
436
  deadline.close();
418
437
  requestMessage.close();
419
438
  }
439
+ if (result.sourceCleanup !== undefined) {
440
+ // Infrastructure cleanup has its own terminal, outside the public Failed conversion.
441
+ try {
442
+ const cleanup = result.sourceCleanup();
443
+ await (this.turn === undefined ? cleanup : this.turn.yieldFrameworkPromise(cleanup));
444
+ } catch (error) {
445
+ traceJoinError(this.actor, error, this.coordinator, ZLinkDispatchErrorAction.Drop);
446
+ throw error;
447
+ } finally {
448
+ this.state.endDeferredJoin();
449
+ }
450
+ return;
451
+ }
420
452
  if (
421
453
  !result.accepted ||
422
454
  sourceNodeRid === undefined ||
423
455
  result.actor === undefined ||
424
- String(sourceNodeRid) === String(result.actor.nodeRid)
456
+ routingIdsEqual(sourceNodeRid, result.actor.nodeRid)
425
457
  ) {
426
458
  await notifyJoinCompletion(this.actor, operationId, result, this.messageSerializers);
427
459
  } else {
@@ -580,7 +612,6 @@ async function notifyJoinFailure(
580
612
  error: unknown,
581
613
  coordinator?: ZLinkActorJoinCoordinator
582
614
  ): Promise<void> {
583
- console.error(`actor join failure actor=${actor.context.actorId}`, error);
584
615
  const frameworkError =
585
616
  error instanceof ZLinkFrameworkException
586
617
  ? error
@@ -590,6 +621,20 @@ async function notifyJoinFailure(
590
621
  false,
591
622
  error
592
623
  );
624
+ traceJoinError(actor, error, coordinator, ZLinkDispatchErrorAction.ReplyError);
625
+ await actor.onJoinCompleted?.({
626
+ status: 'failed',
627
+ operationId,
628
+ kind: frameworkError.kind
629
+ });
630
+ }
631
+
632
+ function traceJoinError(
633
+ actor: ZLinkActor,
634
+ error: unknown,
635
+ coordinator: ZLinkActorJoinCoordinator | undefined,
636
+ errorAction: ZLinkDispatchErrorAction
637
+ ): void {
593
638
  // The completion carries only an error kind, so trace the cause on the
594
639
  // message flow under the same flow id as the Join that produced it.
595
640
  const tracePoint = coordinator?.messageFlow?.()?.begin(ZLinkMessageFlowOutcome.Error);
@@ -601,13 +646,8 @@ async function notifyJoinFailure(
601
646
  packetName: 'JoinSpot',
602
647
  actorId: actor.context.actorId,
603
648
  errorReason: ZLinkDispatchErrorReason.HandlerException,
604
- errorAction: ZLinkDispatchErrorAction.ReplyError,
649
+ errorAction,
605
650
  errorType: errorDetails?.errorType,
606
651
  errorMessage: errorDetails?.errorMessage
607
652
  });
608
- await actor.onJoinCompleted?.({
609
- status: 'failed',
610
- operationId,
611
- kind: frameworkError.kind
612
- });
613
653
  }