@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
@@ -30,8 +30,11 @@ export interface ZLinkActorJoinRelocation {
30
30
  };
31
31
  /** Target's advertised relocation state chunk cap from the accepted admission reply. */
32
32
  readonly advertisedReceiveChunkLimitBytes?: number;
33
+ readonly deadlineAtMs?: number;
33
34
  readonly signal?: AbortSignal;
34
35
  }): Promise<{
36
+ /** Source-only terminal after relay readiness transferred public completion. */
37
+ readonly sourceCleanup?: () => Promise<void>;
35
38
  readonly actorRef: ZLinkBackendActorRef;
36
39
  readonly membershipEpoch: bigint;
37
40
  readonly spotGeneration: bigint;
@@ -199,33 +199,24 @@ export class ZLinkLocalNativeActorJoin {
199
199
  );
200
200
  }
201
201
  const membershipEpoch = location.membershipEpoch + 1n;
202
+ const currentActor = toFrameworkActorRef(actorRef, meshName);
203
+ const authorityOwnerGeneration = state.locationGeneration ?? actorRef.generation;
202
204
  const commit = async (spot?: ZLinkSpot): Promise<void> => {
203
205
  throwIfAborted(signal);
204
- if (target.spotKind === ZLinkSpotKind.Entry) {
205
- await this.options.locationLifecycle?.notifyActorLeftSpot(
206
- actorType,
207
- actor.context.actorId,
208
- storeSpotId,
209
- spotGeneration,
210
- membershipEpoch,
211
- node.status().lifecycleGeneration
212
- );
213
- } else {
214
- await this.options.locationLifecycle?.notifyActorJoinedSpot(
215
- actorType,
216
- actor.context.actorId,
217
- meshName,
218
- storeSpotId,
219
- spotGeneration,
220
- membershipEpoch,
221
- node.status().lifecycleGeneration
222
- );
223
- }
206
+ await this.options.locationLifecycle?.commitActorMembership(
207
+ actorType,
208
+ currentActor,
209
+ authorityOwnerGeneration,
210
+ storeSpotId,
211
+ spotGeneration,
212
+ target.spotKind === ZLinkSpotKind.Entry ? ZLinkSpotKind.Entry : ZLinkSpotKind.User,
213
+ node.status().lifecycleGeneration
214
+ );
224
215
  const committedActor = node.restoreActorAuthority!(
225
216
  actor.context.actorId,
226
217
  actorType,
227
218
  actorRef.generation,
228
- state.locationGeneration ?? actorRef.generation,
219
+ authorityOwnerGeneration,
229
220
  target.spotKind === ZLinkSpotKind.Entry ? undefined : String(target.spotId),
230
221
  spotGeneration,
231
222
  membershipEpoch
@@ -297,6 +288,7 @@ export class ZLinkLocalNativeActorJoin {
297
288
  completionOperationId: ZLinkActorJoinOperationId | undefined,
298
289
  entrySpot: boolean
299
290
  ): Promise<ZLinkActorJoinRuntimeResult<Message>> {
291
+ const deadlineAtMs = timeoutMs === undefined ? undefined : performance.now() + timeoutMs;
300
292
  const actorType = state.actorType;
301
293
  if (actorType === undefined) {
302
294
  throw createInternalFrameworkException(
@@ -443,6 +435,7 @@ export class ZLinkLocalNativeActorJoin {
443
435
  target,
444
436
  relocationId,
445
437
  completionOperationId,
438
+ deadlineAtMs,
446
439
  ...(control.canonicalHandoffId === undefined || canonicalAdmission === undefined
447
440
  ? {}
448
441
  : {
@@ -456,11 +449,9 @@ export class ZLinkLocalNativeActorJoin {
456
449
  },
457
450
  requestContentType: canonicalAdmission.request.contentType,
458
451
  request: Buffer.from(canonicalAdmission.request.payload),
459
- ...(completionOperationId === undefined
452
+ ...(completionOperationId === undefined || control.replyContentType === undefined
460
453
  ? {}
461
- : {
462
- replyContentType: control.replyContentType ?? ZlinkStreamContentType.Raw
463
- }),
454
+ : { replyContentType: control.replyContentType }),
464
455
  reply:
465
456
  completionOperationId === undefined
466
457
  ? Buffer.alloc(0)
@@ -469,7 +460,7 @@ export class ZLinkLocalNativeActorJoin {
469
460
  expectedOwnerLeaseGeneration: actorAuthorityFence!.ownerLeaseGeneration,
470
461
  targetNodeGeneration: target.targetNodeGeneration!,
471
462
  targetSpotGeneration: control.location.spotGeneration,
472
- targetAuthorityOwnerGeneration: actorAuthorityFence!.authorityOwnerGeneration + 1n,
463
+ targetAuthorityOwnerGeneration: actorAuthorityFence!.authorityOwnerGeneration,
473
464
  targetSpotAuthorityOwnerGeneration: target.authorityOwnerGeneration ?? 1n
474
465
  }
475
466
  }),
@@ -480,6 +471,10 @@ export class ZLinkLocalNativeActorJoin {
480
471
  admission.parts[0]?.close();
481
472
  throw error;
482
473
  }
474
+ if (relocated.sourceCleanup !== undefined) {
475
+ admission.parts[0]?.close();
476
+ return { accepted: false, sourceCleanup: relocated.sourceCleanup };
477
+ }
483
478
  state.setNativeActorRef(relocated.actorRef);
484
479
  if (entrySpot) {
485
480
  state.clearJoinedSpot();
@@ -8,8 +8,10 @@ import {
8
8
  import { runZLinkActorExecution } from './actor-execution-context';
9
9
  import {
10
10
  bindApplicationJobPermit,
11
- hasApplicationJobPermit
11
+ currentApplicationJobPermit,
12
+ runWithApplicationJobPermit
12
13
  } from '../application-jobs/application-job-queue-scope';
14
+ import type { ApplicationJobPermitPort } from '../application-jobs/contracts';
13
15
 
14
16
  export class ZLinkActorSerialExecutor {
15
17
  private readonly scheduler: ZLinkSerialExecutionQueue;
@@ -28,10 +30,46 @@ export class ZLinkActorSerialExecutor {
28
30
  }
29
31
 
30
32
  execute<T>(operation: () => Promise<T> | T, workOptions?: ZLinkSerialWorkOptions): Promise<T> {
33
+ const initial = currentApplicationJobPermit();
34
+ if (
35
+ initial !== undefined &&
36
+ workOptions?.lane !== 'lifecycle' &&
37
+ this.scheduler.hasPendingDurableApplication
38
+ ) {
39
+ let prepared: ApplicationJobPermitPort | undefined;
40
+ const cancel = (): void => {
41
+ prepared?.releaseAfterInternalProcessing();
42
+ prepared = undefined;
43
+ };
44
+ const terminal = this.scheduler.admitDurablePrefix(
45
+ () =>
46
+ runWithApplicationJobPermit(prepared!, () =>
47
+ runZLinkActorExecution(this.actorId, this.sourceSpotId, operation)
48
+ ),
49
+ workOptions,
50
+ undefined,
51
+ {
52
+ prepare: async (signal) => {
53
+ if (initial.reacquire === undefined) {
54
+ throw new Error('Durable Actor ingress requires its host permit source.');
55
+ }
56
+ prepared = await initial.reacquire(signal);
57
+ if (signal.aborted) {
58
+ cancel();
59
+ throw signal.reason;
60
+ }
61
+ prepared.markApplicationQueued();
62
+ },
63
+ cancel
64
+ }
65
+ );
66
+ initial.releaseAfterInternalProcessing();
67
+ return terminal;
68
+ }
31
69
  const boundOperation = bindApplicationJobPermit(() =>
32
70
  runZLinkActorExecution(this.actorId, this.sourceSpotId, operation)
33
71
  );
34
- return hasApplicationJobPermit()
72
+ return initial !== undefined
35
73
  ? this.scheduler.submitPreAdmitted(boundOperation, workOptions)
36
74
  : this.scheduler.submit(boundOperation, workOptions);
37
75
  }
@@ -164,7 +164,12 @@ export class ZLinkActorNativeJoinCoordinator implements ZLinkActorJoinCoordinato
164
164
  result: ZLinkActorJoinRuntimeResult<Message>,
165
165
  operationId: import('../../contracts').ZLinkActorJoinOperationId | undefined
166
166
  ): ZLinkActorJoinRuntimeResult<Message> {
167
- if (operationId === undefined || this.options.sourceTransfer === undefined) return result;
167
+ if (
168
+ result.sourceCleanup !== undefined ||
169
+ operationId === undefined ||
170
+ this.options.sourceTransfer === undefined
171
+ )
172
+ return result;
168
173
  return {
169
174
  ...result,
170
175
  finalizeDeferredJoin: async () => {
@@ -21,9 +21,26 @@ export interface ZLinkRemoteActorSourceLeaveTerminal {
21
21
  readonly succeeded: boolean;
22
22
  }
23
23
 
24
+ const JSON_OBJECT_START = '{'.charCodeAt(0);
25
+ const JSON_SPACE = ' '.charCodeAt(0);
26
+ const JSON_TAB = '\t'.charCodeAt(0);
27
+ const JSON_LINE_FEED = '\n'.charCodeAt(0);
28
+ const JSON_CARRIAGE_RETURN = '\r'.charCodeAt(0);
29
+
24
30
  export function decodeRemoteActorSourceLeaveTerminal(
25
31
  payload: Buffer
26
32
  ): ZLinkRemoteActorSourceLeaveTerminal | undefined {
33
+ // A SourceLeave terminal is a JSON object. Binary channel frames and JSON
34
+ // primitives cannot be terminals, so do not materialize or parse them.
35
+ let offset = 0;
36
+ while (
37
+ payload[offset] === JSON_SPACE ||
38
+ payload[offset] === JSON_TAB ||
39
+ payload[offset] === JSON_LINE_FEED ||
40
+ payload[offset] === JSON_CARRIAGE_RETURN
41
+ )
42
+ offset++;
43
+ if (payload[offset] !== JSON_OBJECT_START) return undefined;
27
44
  let decoded: unknown;
28
45
  try {
29
46
  decoded = JSON.parse(payload.toString());
@@ -0,0 +1,42 @@
1
+ import { encodeFrameworkPayload } from '../messaging/payload-codec';
2
+ import {
3
+ decodeStreamHeader,
4
+ encodeStreamFrame,
5
+ streamCodecForContentType,
6
+ ZLinkStreamHeaderFlags,
7
+ ZLinkStreamMessageKind
8
+ } from '../streams/protocol';
9
+
10
+ /** Ordinary dispatch and relocation use the same typed Actor reply envelope. */
11
+ export function encodeActorReply(
12
+ requestHeaderBytes: Uint8Array,
13
+ kind: ZLinkStreamMessageKind.Response | ZLinkStreamMessageKind.Error,
14
+ payload: unknown,
15
+ serializers: Parameters<typeof encodeFrameworkPayload>[1],
16
+ flowEnabled: boolean
17
+ ): readonly Buffer[] {
18
+ const requestHeader = decodeStreamHeader(requestHeaderBytes, flowEnabled);
19
+ const encoded =
20
+ kind === ZLinkStreamMessageKind.Response
21
+ ? encodeFrameworkPayload(payload, serializers, requestHeader.name, 'reply')
22
+ : encodeFrameworkPayload(payload);
23
+ try {
24
+ const frame = encodeStreamFrame(
25
+ {
26
+ kind,
27
+ codec: streamCodecForContentType(encoded.contentType),
28
+ flags: ZLinkStreamHeaderFlags.None,
29
+ requestSeq: requestHeader.requestSeq,
30
+ name: '',
31
+ metadata: new Map(),
32
+ correlationId: requestHeader.correlationId,
33
+ flowId: requestHeader.flowId,
34
+ flowOrigin: requestHeader.flowOrigin
35
+ },
36
+ encoded.message.data()
37
+ );
38
+ return [Buffer.from(frame.buffer, frame.byteOffset, frame.byteLength)];
39
+ } finally {
40
+ encoded.message.close();
41
+ }
42
+ }
@@ -19,13 +19,13 @@ export interface ZLinkActorRoutedJoinTransport {
19
19
  targetNodeRid: string,
20
20
  packetName: string | undefined,
21
21
  message: unknown
22
- ): Promise<ZLinkSubmitResult>;
22
+ ): ZLinkSubmitResult | Promise<ZLinkSubmitResult>;
23
23
  submitInfrastructure?(
24
24
  routerChannelId: string,
25
25
  targetNodeRid: string,
26
26
  packetName: string | undefined,
27
27
  message: unknown
28
- ): Promise<ZLinkSubmitResult>;
28
+ ): ZLinkSubmitResult | Promise<ZLinkSubmitResult>;
29
29
  sendToSpot(
30
30
  spotRouteTarget: ZLinkSpotRouteTarget,
31
31
  message: unknown,
@@ -34,7 +34,11 @@ export interface ZLinkActorRoutedJoinTransport {
34
34
  requestRawToSpot?(
35
35
  spotRouteTarget: ZLinkSpotRouteTarget,
36
36
  request: Message,
37
- options: { readonly timeoutMs?: number; readonly signal?: AbortSignal }
37
+ options: {
38
+ readonly timeoutMs?: number;
39
+ readonly signal?: AbortSignal;
40
+ readonly onAdmitted?: () => void;
41
+ }
38
42
  ): Promise<readonly Message[]>;
39
43
  requestToSpot<TReply = unknown>(
40
44
  spotRouteTarget: ZLinkSpotRouteTarget,
@@ -43,6 +47,7 @@ export interface ZLinkActorRoutedJoinTransport {
43
47
  readonly packetName?: string;
44
48
  readonly timeoutMs?: number;
45
49
  readonly signal?: AbortSignal;
50
+ readonly onAdmitted?: () => void;
46
51
  }
47
52
  ): Promise<TReply>;
48
53
  requestFromSpotToSpot?<TReply = unknown>(
@@ -53,12 +58,17 @@ export interface ZLinkActorRoutedJoinTransport {
53
58
  readonly packetName?: string;
54
59
  readonly timeoutMs?: number;
55
60
  readonly signal?: AbortSignal;
61
+ readonly onAdmitted?: () => void;
56
62
  }
57
63
  ): Promise<TReply>;
58
64
  requestRawFromSpotToSpot?(
59
65
  sourceSpot: ZLinkBackendSpot,
60
66
  spotRouteTarget: ZLinkSpotRouteTarget,
61
67
  request: Message,
62
- options: { readonly timeoutMs?: number; readonly signal?: AbortSignal }
68
+ options: {
69
+ readonly timeoutMs?: number;
70
+ readonly signal?: AbortSignal;
71
+ readonly onAdmitted?: () => void;
72
+ }
63
73
  ): Promise<readonly Message[]>;
64
74
  }
@@ -7,7 +7,11 @@ export async function tryRequestRoutedJson(
7
7
  transport: ZLinkActorRoutedJoinTransport,
8
8
  target: ZLinkSpotRouteTarget,
9
9
  payload: unknown,
10
- options: { readonly timeoutMs?: number; readonly signal?: AbortSignal }
10
+ options: {
11
+ readonly timeoutMs?: number;
12
+ readonly signal?: AbortSignal;
13
+ readonly onAdmitted?: () => void;
14
+ }
11
15
  ): Promise<boolean> {
12
16
  const request = transport.requestRawToSpot;
13
17
  if (request === undefined) return false;
@@ -24,7 +28,11 @@ export async function requestRoutedJsonReply<T>(
24
28
  transport: ZLinkActorRoutedJoinTransport,
25
29
  target: ZLinkSpotRouteTarget,
26
30
  payload: unknown,
27
- options: { readonly timeoutMs?: number; readonly signal?: AbortSignal },
31
+ options: {
32
+ readonly timeoutMs?: number;
33
+ readonly signal?: AbortSignal;
34
+ readonly onAdmitted?: () => void;
35
+ },
28
36
  unavailableMessage: string,
29
37
  decode: (replyParts: readonly Message[]) => T
30
38
  ): Promise<T> {
@@ -19,6 +19,8 @@ import type { ZLinkRuntimeAdmissionGate } from '../admission';
19
19
  import type { ZLinkActivationAdmission } from '../activation-admission';
20
20
 
21
21
  export interface ZLinkActorJoinRuntimeResult<TReply> {
22
+ /** Relay-ready transferred completion; this continuation only releases source work. */
23
+ readonly sourceCleanup?: () => Promise<void>;
22
24
  readonly accepted: boolean;
23
25
  readonly actor?: import('../../contracts').ActorRef;
24
26
  readonly reply?: TReply;
@@ -94,14 +94,8 @@ function sameRemoteSessionOwnerLifecycle(
94
94
  right.sessionNodeRid !== undefined &&
95
95
  left.sessionOwnerNodeGeneration !== undefined &&
96
96
  right.sessionOwnerNodeGeneration !== undefined &&
97
- left.sessionOwnerId !== undefined &&
98
- right.sessionOwnerId !== undefined &&
99
- left.sessionOwnerLeaseGeneration !== undefined &&
100
- right.sessionOwnerLeaseGeneration !== undefined &&
101
97
  routingIdsEqual(left.sessionNodeRid, right.sessionNodeRid) &&
102
- left.sessionOwnerNodeGeneration === right.sessionOwnerNodeGeneration &&
103
- left.sessionOwnerId === right.sessionOwnerId &&
104
- left.sessionOwnerLeaseGeneration === right.sessionOwnerLeaseGeneration
98
+ left.sessionOwnerNodeGeneration === right.sessionOwnerNodeGeneration
105
99
  );
106
100
  }
107
101
 
@@ -495,19 +489,7 @@ export class ZLinkActorRuntimeState {
495
489
  ) {
496
490
  throw new TypeError('An installed bound Session target requires its binding identity.');
497
491
  }
498
- const current = this.boundSessionValue;
499
- if (current !== undefined && sameRemoteSessionOwnerLifecycle(current, target)) {
500
- // A duplicate or late older command for the exact physical Session
501
- // leaves the current binding; a newer generation of the same Session
502
- // replaces it. A different Session in the same owner lifecycle must
503
- // advance that lifecycle's generation; a late equal/lower one is stale.
504
- const advances =
505
- current.bindingGeneration === undefined ||
506
- target.bindingGeneration > current.bindingGeneration;
507
- if (!advances) return sameRemoteSessionOwner(current, target);
508
- }
509
- // Binding generations are scoped to a Session-owner lifecycle. A restarted
510
- // owner can legitimately reset its counter below the predecessor value.
492
+ // The service registry accepted this identity in the Actor owner turn.
511
493
  this.boundSessionValue = boundSessionIdentity(target);
512
494
  return true;
513
495
  }
@@ -1,35 +1,10 @@
1
- import type { ActorRef, ZLinkActor, ZLinkMessage } from '../../contracts';
1
+ import type { ActorRef, ZLinkActor } from '../../contracts';
2
2
  import type { ZLinkSpotRouteTarget } from '../spots/spot-routing-internal';
3
3
  import type { ZLinkActorRuntimeState } from './actor-runtime-state';
4
- import type { ZLinkActorHandoffPacket, ZLinkActorHandoffResult } from './actor-handoff';
5
- import type { ServiceWireOperationId } from '../foundation/service-stateful-wire-codec';
6
-
7
- export interface ZLinkPreparedActorSource {
8
- readonly adapterKey?: string;
9
- readonly state: ZLinkMessage;
10
- readonly handoffBacklog: readonly ZLinkActorHandoffPacket[];
11
- readonly sourceLeaveCompletion?: Promise<void>;
12
- readonly sourceLeaveSubmitted?: Promise<void>;
13
- onSourceLeaveSubmitted(notify: () => Promise<void>): void;
14
- observeTargetAuthority(
15
- target: ZLinkSpotRouteTarget,
16
- targetActorRef: ActorRef,
17
- signal?: AbortSignal
18
- ): Promise<void>;
19
- commit(
20
- target: ZLinkSpotRouteTarget,
21
- targetActorRef: ActorRef,
22
- results: readonly ZLinkActorHandoffResult[],
23
- releaseLocation?: boolean
24
- ): void;
25
- rollback(): Promise<void>;
26
- }
27
4
 
28
5
  export interface ZLinkActorSourceTransfer {
29
6
  /** Starts the ingress handoff before target route lookup. */
30
7
  beginDeferredActorHandoff?(actor: ZLinkActor, state: ZLinkActorRuntimeState): void;
31
- /** Changes a provisional ingress fence into a relocation handoff. */
32
- promoteDeferredActorHandoff?(actor: ZLinkActor, state: ZLinkActorRuntimeState): void;
33
8
  /** Finishes a same-node deferred Join handoff after completion callback. */
34
9
  completeDeferredActorHandoff?(
35
10
  actor: ZLinkActor,
@@ -38,12 +13,4 @@ export interface ZLinkActorSourceTransfer {
38
13
  ): Promise<void>;
39
14
  /** Releases an early handoff when Join cannot commit. */
40
15
  cancelDeferredActorHandoff?(actor: ZLinkActor, state: ZLinkActorRuntimeState): Promise<void>;
41
- prepareSource(
42
- actor: ZLinkActor,
43
- state: ZLinkActorRuntimeState,
44
- signal?: AbortSignal,
45
- lifecycleAuthority?: 'framework' | 'core',
46
- deferredJoin?: boolean,
47
- relocation?: ServiceWireOperationId
48
- ): Promise<ZLinkPreparedActorSource>;
49
16
  }
@@ -42,11 +42,7 @@ import { ZLinkTransferredActorRollbackCoordinator } from './transferred-actor-ro
42
42
  const ACTOR_CREATION_RETRY_INTERVAL_MS = 5;
43
43
  const LOCAL_DIAGNOSTIC_NODE_RID = 'local';
44
44
 
45
- export {
46
- DefaultZLinkActorClient,
47
- forwardEncodedActorPacket,
48
- type ZLinkActorClientOptions
49
- } from './actor-client';
45
+ export { DefaultZLinkActorClient, type ZLinkActorClientOptions } from './actor-client';
50
46
  export { DefaultZLinkActorContext, ZLINK_ACTOR_JOIN_ENTRY_SPOT_RUNTIME } from './actor-context';
51
47
  export { ZLinkActorSerialExecutor } from './actor-mailbox';
52
48
  export {
@@ -191,7 +187,7 @@ export class DefaultZLinkActorManager implements ZLinkActorManager {
191
187
  const actorRef = this.actorRefForState(state);
192
188
  return {
193
189
  spotId: spotId,
194
- objectGeneration: state.locationGeneration ?? 0n,
190
+ objectGeneration: state.spotGeneration ?? 0n,
195
191
  meshName: this.actorMeshNames.get(actorId) ?? '',
196
192
  nodeRid: actorRef.nodeRid
197
193
  };
@@ -400,6 +396,11 @@ export class DefaultZLinkActorManager implements ZLinkActorManager {
400
396
 
401
397
  async findActor(actorId: string, signal?: AbortSignal): Promise<ZLinkActor | undefined> {
402
398
  throwIfAborted(signal);
399
+ return this.resolveLocalActor(actorId);
400
+ }
401
+
402
+ /** @internal Uses the relocation owner's publication boundary for local dispatch. */
403
+ resolveLocalActor(actorId: string): ZLinkActor | undefined {
403
404
  if (this.relocationStaged.has(actorId)) return undefined;
404
405
  return this.states.get(actorId)?.actor;
405
406
  }
@@ -467,13 +468,14 @@ export class DefaultZLinkActorManager implements ZLinkActorManager {
467
468
  await registry.restore(transfer.adapterKey, actor, transfer.state, signal);
468
469
  }
469
470
  state.setLocationGeneration(authorityOwnerGeneration);
470
- if (spotId !== undefined) state.setJoinedSpot(spotId, undefined, membershipEpoch);
471
+ if (spotId !== undefined)
472
+ state.setJoinedSpot(spotId, undefined, membershipEpoch, spotGeneration);
471
473
  return actor;
472
474
  } catch (error) {
473
475
  if (nativeRef !== undefined) node.discardRelocatedActor?.(nativeRef);
474
476
  this.relocationStaged.delete(actorId);
475
477
  const failedState = this.states.get(actorId);
476
- await this.finalizeActorState(actorId, failedState);
478
+ await this.finalizeActorState(failedState);
477
479
  throw error;
478
480
  }
479
481
  }
@@ -486,33 +488,50 @@ export class DefaultZLinkActorManager implements ZLinkActorManager {
486
488
  }
487
489
 
488
490
  async abortRelocationActor(actorId: string): Promise<void> {
489
- await this.removeRelocationActor(actorId);
491
+ await this.releaseLocalActor(actorId);
490
492
  }
491
493
 
492
494
  async completeRelocationSource(
493
495
  actorId: string,
494
496
  sourceActorRef?: ZLinkBackendActorRef
495
497
  ): Promise<void> {
496
- await this.removeRelocationActor(actorId, sourceActorRef);
498
+ await this.releaseLocalActor(actorId, sourceActorRef);
499
+ }
500
+
501
+ /** Commit removes current ownership; a Join profile may still own its leave callback. */
502
+ detachRelocationSource(state: ZLinkActorRuntimeState): void {
503
+ if (this.detachActorStateRegistration(state)) {
504
+ this.discardNativeRelocationSource(state.nativeActorRef);
505
+ }
497
506
  }
498
507
 
499
- private async removeRelocationActor(
508
+ async releaseSpotActorMembers(meshName: string, spotId?: RoutingId): Promise<void> {
509
+ const results = await Promise.allSettled(
510
+ [...this.states.values()]
511
+ .filter((state) => state.meshName === meshName && state.spotId === spotId)
512
+ .map((state) => this.releaseLocalActor(state.actorId))
513
+ );
514
+ const errors = results
515
+ .filter((result): result is PromiseRejectedResult => result.status === 'rejected')
516
+ .map((result) => result.reason);
517
+ if (errors.length === 1) throw errors[0];
518
+ if (errors.length > 1) throw new AggregateError(errors, 'Actor member cleanup failed.');
519
+ }
520
+
521
+ private async releaseLocalActor(
500
522
  actorId: string,
501
523
  exactNativeActorRef?: ZLinkBackendActorRef
502
524
  ): Promise<void> {
503
525
  const state = this.states.get(actorId);
504
- const node = this.options.nativeActorNodeProvider?.() ?? this.options.nativeActorNode;
505
- const nativeActorRef = exactNativeActorRef ?? state?.nativeActorRef;
526
+ if (state === undefined) return;
506
527
  const failures: unknown[] = [];
507
528
  try {
508
- if (nativeActorRef !== undefined) {
509
- node?.discardRelocatedActor?.(nativeActorRef);
510
- }
529
+ this.discardNativeRelocationSource(exactNativeActorRef ?? state.nativeActorRef);
511
530
  } catch (error) {
512
531
  failures.push(error);
513
532
  }
514
533
  try {
515
- await this.completeCoreRelocationSource(actorId);
534
+ await this.completeCoreRelocationSource(actorId, state);
516
535
  } catch (error) {
517
536
  failures.push(error);
518
537
  }
@@ -523,29 +542,38 @@ export class DefaultZLinkActorManager implements ZLinkActorManager {
523
542
  }
524
543
  }
525
544
 
526
- async completeCoreRelocationSource(actorId: string): Promise<void> {
527
- const state = this.states.get(actorId);
528
- await this.finalizeActorState(actorId, state);
529
- }
530
-
531
- private async finalizeActorState(
545
+ async completeCoreRelocationSource(
532
546
  actorId: string,
533
- state: ZLinkActorRuntimeState | undefined
547
+ state = this.states.get(actorId)
534
548
  ): Promise<void> {
535
- if (state === undefined || this.states.get(actorId) !== state) return;
549
+ await this.finalizeActorState(state);
550
+ }
551
+
552
+ private discardNativeRelocationSource(nativeActorRef: ZLinkBackendActorRef | undefined): void {
553
+ if (nativeActorRef === undefined) return;
554
+ const node = this.options.nativeActorNodeProvider?.() ?? this.options.nativeActorNode;
555
+ node?.discardRelocatedActor?.(nativeActorRef);
556
+ }
557
+
558
+ private async finalizeActorState(state: ZLinkActorRuntimeState | undefined): Promise<void> {
559
+ if (state === undefined) return;
536
560
  try {
537
561
  if (state.actor !== undefined)
538
562
  await disposeLifecycleHandlers(state.actor, this.detachedTaskRunner);
539
563
  } finally {
540
564
  state.clearAfterDestroy();
541
- if (this.states.get(actorId) === state) {
542
- this.states.delete(actorId);
543
- this.actorMeshNames.delete(actorId);
544
- this.relocationStaged.delete(actorId);
545
- }
565
+ this.detachActorStateRegistration(state);
546
566
  }
547
567
  }
548
568
 
569
+ private detachActorStateRegistration(state: ZLinkActorRuntimeState): boolean {
570
+ if (this.states.get(state.actorId) !== state) return false;
571
+ this.states.delete(state.actorId);
572
+ this.actorMeshNames.delete(state.actorId);
573
+ this.relocationStaged.delete(state.actorId);
574
+ return true;
575
+ }
576
+
549
577
  private async finalizeDestroyedActor(
550
578
  actorId: string,
551
579
  state: ZLinkActorRuntimeState
@@ -554,7 +582,7 @@ export class DefaultZLinkActorManager implements ZLinkActorManager {
554
582
  try {
555
583
  this.options.actorDestroyedCleanup?.(actorId);
556
584
  } finally {
557
- await this.finalizeActorState(actorId, state);
585
+ await this.finalizeActorState(state);
558
586
  this.options.metrics?.change(METRIC_NAMES.ActorCount, -1);
559
587
  }
560
588
  }
@@ -930,7 +958,7 @@ class ZLinkActorCreateCallRuntime implements ZLinkActorCreateCall {
930
958
  yield(signal?: AbortSignal): Promise<ZLinkActorCreateResult> {
931
959
  const turn = requireZLinkYieldTurn(this.turn);
932
960
  const pending = this.executeOnce(signal);
933
- return turn.yieldPromise(pending);
961
+ return turn.yieldFrameworkPromise(pending);
934
962
  }
935
963
 
936
964
  private executeOnce(signal?: AbortSignal): Promise<ZLinkActorCreateResult> {
@@ -0,0 +1,66 @@
1
+ import type { RoutingId } from '../../contracts';
2
+ import { ZLINK_MAX_ROUTING_ID_BYTES } from '../../contracts/Common/CoreTypes';
3
+ import { ZLinkFrameworkErrorKind, ZLinkFrameworkException } from '../../contracts';
4
+ import { decodeRoutingId, encodeRoutingIdStorageHex } from '../routing-id';
5
+
6
+ const RID_LENGTH_BYTES = 1;
7
+ const GENERATION_BYTES = 8;
8
+ const GENERATIONS_BYTES = GENERATION_BYTES * 2;
9
+
10
+ export interface SessionDisconnectedIdentity {
11
+ readonly sessionOwnerNodeRid: RoutingId;
12
+ readonly sessionOwnerNodeGeneration: bigint;
13
+ readonly bindingGeneration: bigint;
14
+ }
15
+
16
+ export function encodeSessionDisconnected(
17
+ sessionOwnerNodeRid: RoutingId | undefined,
18
+ sessionOwnerNodeGeneration: bigint | undefined,
19
+ bindingGeneration: bigint | undefined
20
+ ): Buffer {
21
+ if (
22
+ sessionOwnerNodeRid === undefined ||
23
+ sessionOwnerNodeGeneration === undefined ||
24
+ sessionOwnerNodeGeneration === 0n ||
25
+ bindingGeneration === undefined ||
26
+ bindingGeneration === 0n
27
+ ) {
28
+ throw new ZLinkFrameworkException(
29
+ ZLinkFrameworkErrorKind.ProtocolError,
30
+ 'Session disconnect requires an exact binding identity.'
31
+ );
32
+ }
33
+ const rid = Buffer.from(encodeRoutingIdStorageHex(sessionOwnerNodeRid), 'hex');
34
+ if (rid.length === 0 || rid.length > ZLINK_MAX_ROUTING_ID_BYTES) {
35
+ throw new ZLinkFrameworkException(
36
+ ZLinkFrameworkErrorKind.ProtocolError,
37
+ 'Invalid Session owner Node RID length.'
38
+ );
39
+ }
40
+ const payload = Buffer.allocUnsafe(RID_LENGTH_BYTES + rid.length + GENERATIONS_BYTES);
41
+ payload[0] = rid.length;
42
+ rid.copy(payload, RID_LENGTH_BYTES);
43
+ payload.writeBigUInt64BE(sessionOwnerNodeGeneration, RID_LENGTH_BYTES + rid.length);
44
+ payload.writeBigUInt64BE(bindingGeneration, RID_LENGTH_BYTES + rid.length + GENERATION_BYTES);
45
+ return payload;
46
+ }
47
+
48
+ export function decodeSessionDisconnected(
49
+ bytes: Uint8Array
50
+ ): SessionDisconnectedIdentity | undefined {
51
+ const payload = Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength);
52
+ if (payload.length < RID_LENGTH_BYTES + 1 + GENERATIONS_BYTES) return undefined;
53
+ const ridLength = payload[0];
54
+ if (ridLength === 0 || payload.length !== RID_LENGTH_BYTES + ridLength + GENERATIONS_BYTES)
55
+ return undefined;
56
+ const offset = RID_LENGTH_BYTES + ridLength;
57
+ const sessionOwnerNodeGeneration = payload.readBigUInt64BE(offset);
58
+ const bindingGeneration = payload.readBigUInt64BE(offset + GENERATION_BYTES);
59
+ if (sessionOwnerNodeGeneration === 0n || bindingGeneration === 0n) return undefined;
60
+ const hex = payload.subarray(RID_LENGTH_BYTES, offset).toString('hex');
61
+ return {
62
+ sessionOwnerNodeRid: decodeRoutingId(hex, hex),
63
+ sessionOwnerNodeGeneration,
64
+ bindingGeneration
65
+ };
66
+ }