@zlink-systems/framework 0.10.0

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 (1121) hide show
  1. package/LICENSE +105 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/contracts/Actors/ZLinkActor.d.ts +7 -0
  4. package/dist/contracts/Actors/ZLinkActor.js +2 -0
  5. package/dist/contracts/Actors/ZLinkActorClient.d.ts +15 -0
  6. package/dist/contracts/Actors/ZLinkActorClient.js +2 -0
  7. package/dist/contracts/Actors/ZLinkActorContext.d.ts +14 -0
  8. package/dist/contracts/Actors/ZLinkActorContext.js +2 -0
  9. package/dist/contracts/Actors/ZLinkActorFactory.d.ts +34 -0
  10. package/dist/contracts/Actors/ZLinkActorFactory.js +2 -0
  11. package/dist/contracts/Actors/ZLinkActorManager.d.ts +34 -0
  12. package/dist/contracts/Actors/ZLinkActorManager.js +2 -0
  13. package/dist/contracts/Actors/index.d.ts +5 -0
  14. package/dist/contracts/Actors/index.js +21 -0
  15. package/dist/contracts/Channels/Calls.d.ts +28 -0
  16. package/dist/contracts/Channels/Calls.js +2 -0
  17. package/dist/contracts/Channels/IZLinkChannelClient.d.ts +5 -0
  18. package/dist/contracts/Channels/IZLinkChannelClient.js +2 -0
  19. package/dist/contracts/Channels/IZLinkFanoutClient.d.ts +11 -0
  20. package/dist/contracts/Channels/IZLinkFanoutClient.js +2 -0
  21. package/dist/contracts/Channels/RouteCalls.d.ts +11 -0
  22. package/dist/contracts/Channels/RouteCalls.js +2 -0
  23. package/dist/contracts/Channels/index.d.ts +4 -0
  24. package/dist/contracts/Channels/index.js +20 -0
  25. package/dist/contracts/Codecs/IZLinkCodecRegistryBuilder.d.ts +14 -0
  26. package/dist/contracts/Codecs/IZLinkCodecRegistryBuilder.js +2 -0
  27. package/dist/contracts/Codecs/ZLinkMessageSerializer.d.ts +5 -0
  28. package/dist/contracts/Codecs/ZLinkMessageSerializer.js +2 -0
  29. package/dist/contracts/Codecs/index.d.ts +2 -0
  30. package/dist/contracts/Codecs/index.js +18 -0
  31. package/dist/contracts/Common/ActorRef.d.ts +7 -0
  32. package/dist/contracts/Common/ActorRef.js +2 -0
  33. package/dist/contracts/Common/CoreTypes.d.ts +6 -0
  34. package/dist/contracts/Common/CoreTypes.js +2 -0
  35. package/dist/contracts/Common/Message.d.ts +9 -0
  36. package/dist/contracts/Common/Message.js +2 -0
  37. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +12 -0
  38. package/dist/contracts/Common/ZLinkEncodedPayload.js +41 -0
  39. package/dist/contracts/Common/ZLinkMessage.d.ts +25 -0
  40. package/dist/contracts/Common/ZLinkMessage.js +127 -0
  41. package/dist/contracts/Common/ZLinkMessageMetadata.d.ts +10 -0
  42. package/dist/contracts/Common/ZLinkMessageMetadata.js +49 -0
  43. package/dist/contracts/Common/ZLinkProviderResolver.d.ts +5 -0
  44. package/dist/contracts/Common/ZLinkProviderResolver.js +2 -0
  45. package/dist/contracts/Common/encoded-payload-storage.d.ts +3 -0
  46. package/dist/contracts/Common/encoded-payload-storage.js +18 -0
  47. package/dist/contracts/Common/index.d.ts +5 -0
  48. package/dist/contracts/Common/index.js +24 -0
  49. package/dist/contracts/Configuration/Builders.d.ts +153 -0
  50. package/dist/contracts/Configuration/Builders.js +2 -0
  51. package/dist/contracts/Configuration/CodecContentType.d.ts +2 -0
  52. package/dist/contracts/Configuration/CodecContentType.js +68 -0
  53. package/dist/contracts/Configuration/CodecSerializerSelection.d.ts +9 -0
  54. package/dist/contracts/Configuration/CodecSerializerSelection.js +15 -0
  55. package/dist/contracts/Configuration/Configs.d.ts +23 -0
  56. package/dist/contracts/Configuration/Configs.js +2 -0
  57. package/dist/contracts/Configuration/ConfigurationException.d.ts +3 -0
  58. package/dist/contracts/Configuration/ConfigurationException.js +10 -0
  59. package/dist/contracts/Configuration/Connections.d.ts +5 -0
  60. package/dist/contracts/Configuration/Connections.js +2 -0
  61. package/dist/contracts/Configuration/DiagnosticsValidation.d.ts +3 -0
  62. package/dist/contracts/Configuration/DiagnosticsValidation.js +23 -0
  63. package/dist/contracts/Configuration/EndpointNotation.d.ts +77 -0
  64. package/dist/contracts/Configuration/EndpointNotation.js +218 -0
  65. package/dist/contracts/Configuration/InternalDefaults.d.ts +7 -0
  66. package/dist/contracts/Configuration/InternalDefaults.js +47 -0
  67. package/dist/contracts/Configuration/ObjectRoles.d.ts +38 -0
  68. package/dist/contracts/Configuration/ObjectRoles.js +13 -0
  69. package/dist/contracts/Configuration/Registration.d.ts +11 -0
  70. package/dist/contracts/Configuration/Registration.js +162 -0
  71. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +14 -0
  72. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +61 -0
  73. package/dist/contracts/Configuration/RegistrationBuilders.d.ts +61 -0
  74. package/dist/contracts/Configuration/RegistrationBuilders.js +1181 -0
  75. package/dist/contracts/Configuration/RegistrationCodecRegistry.d.ts +19 -0
  76. package/dist/contracts/Configuration/RegistrationCodecRegistry.js +79 -0
  77. package/dist/contracts/Configuration/RegistrationNormalizers.d.ts +23 -0
  78. package/dist/contracts/Configuration/RegistrationNormalizers.js +319 -0
  79. package/dist/contracts/Configuration/RegistrationTypes.d.ts +414 -0
  80. package/dist/contracts/Configuration/RegistrationTypes.js +2 -0
  81. package/dist/contracts/Configuration/RegistrationValidators.d.ts +2 -0
  82. package/dist/contracts/Configuration/RegistrationValidators.js +461 -0
  83. package/dist/contracts/Configuration/RouteChannelInternalState.d.ts +10 -0
  84. package/dist/contracts/Configuration/RouteChannelInternalState.js +39 -0
  85. package/dist/contracts/Configuration/RuntimeEndpointConnections.d.ts +9 -0
  86. package/dist/contracts/Configuration/RuntimeEndpointConnections.js +80 -0
  87. package/dist/contracts/Configuration/SendTimeoutValidation.d.ts +2 -0
  88. package/dist/contracts/Configuration/SendTimeoutValidation.js +16 -0
  89. package/dist/contracts/Configuration/TimerRegistrationValidator.d.ts +2 -0
  90. package/dist/contracts/Configuration/TimerRegistrationValidator.js +24 -0
  91. package/dist/contracts/Configuration/index.d.ts +5 -0
  92. package/dist/contracts/Configuration/index.js +18 -0
  93. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +181 -0
  94. package/dist/contracts/Dispatch/ZLinkDispatchOptions.js +89 -0
  95. package/dist/contracts/Dispatch/ZLinkFlowOrigin.d.ts +1 -0
  96. package/dist/contracts/Dispatch/ZLinkFlowOrigin.js +2 -0
  97. package/dist/contracts/Dispatch/index.d.ts +2 -0
  98. package/dist/contracts/Dispatch/index.js +18 -0
  99. package/dist/contracts/Errors/ZLinkFrameworkException.d.ts +20 -0
  100. package/dist/contracts/Errors/ZLinkFrameworkException.js +29 -0
  101. package/dist/contracts/Errors/index.d.ts +1 -0
  102. package/dist/contracts/Errors/index.js +6 -0
  103. package/dist/contracts/Eventing/Metrics.d.ts +29 -0
  104. package/dist/contracts/Eventing/Metrics.js +4 -0
  105. package/dist/contracts/Eventing/index.d.ts +1 -0
  106. package/dist/contracts/Eventing/index.js +17 -0
  107. package/dist/contracts/Handlers/Attributes.d.ts +24 -0
  108. package/dist/contracts/Handlers/Attributes.js +84 -0
  109. package/dist/contracts/Handlers/Contexts.d.ts +18 -0
  110. package/dist/contracts/Handlers/Contexts.js +2 -0
  111. package/dist/contracts/Handlers/IZLinkChannelHandlers.d.ts +43 -0
  112. package/dist/contracts/Handlers/IZLinkChannelHandlers.js +2 -0
  113. package/dist/contracts/Handlers/IZLinkHandlerFilter.d.ts +15 -0
  114. package/dist/contracts/Handlers/IZLinkHandlerFilter.js +11 -0
  115. package/dist/contracts/Handlers/JsonContract.d.ts +46 -0
  116. package/dist/contracts/Handlers/JsonContract.js +137 -0
  117. package/dist/contracts/Handlers/ZLinkHandlerFilterNext.d.ts +1 -0
  118. package/dist/contracts/Handlers/ZLinkHandlerFilterNext.js +2 -0
  119. package/dist/contracts/Handlers/index.d.ts +5 -0
  120. package/dist/contracts/Handlers/index.js +33 -0
  121. package/dist/contracts/Locations/ActorTransfer.d.ts +41 -0
  122. package/dist/contracts/Locations/ActorTransfer.js +2 -0
  123. package/dist/contracts/Locations/Authority.d.ts +296 -0
  124. package/dist/contracts/Locations/Authority.js +17 -0
  125. package/dist/contracts/Locations/Diagnostics.d.ts +42 -0
  126. package/dist/contracts/Locations/Diagnostics.js +12 -0
  127. package/dist/contracts/Locations/Keys.d.ts +86 -0
  128. package/dist/contracts/Locations/Keys.js +2 -0
  129. package/dist/contracts/Locations/Models.d.ts +7 -0
  130. package/dist/contracts/Locations/Models.js +23 -0
  131. package/dist/contracts/Locations/Options.d.ts +23 -0
  132. package/dist/contracts/Locations/Options.js +20 -0
  133. package/dist/contracts/Locations/Readiness.d.ts +5 -0
  134. package/dist/contracts/Locations/Readiness.js +2 -0
  135. package/dist/contracts/Locations/RelocationStore.d.ts +38 -0
  136. package/dist/contracts/Locations/RelocationStore.js +2 -0
  137. package/dist/contracts/Locations/Resolvers.d.ts +4 -0
  138. package/dist/contracts/Locations/Resolvers.js +2 -0
  139. package/dist/contracts/Locations/Rows.d.ts +152 -0
  140. package/dist/contracts/Locations/Rows.js +19 -0
  141. package/dist/contracts/Locations/RuntimeQuery.d.ts +25 -0
  142. package/dist/contracts/Locations/RuntimeQuery.js +2 -0
  143. package/dist/contracts/Locations/Stores.d.ts +88 -0
  144. package/dist/contracts/Locations/Stores.js +2 -0
  145. package/dist/contracts/Locations/Values.d.ts +27 -0
  146. package/dist/contracts/Locations/Values.js +36 -0
  147. package/dist/contracts/Locations/Watch.d.ts +14 -0
  148. package/dist/contracts/Locations/Watch.js +12 -0
  149. package/dist/contracts/Locations/Writes.d.ts +48 -0
  150. package/dist/contracts/Locations/Writes.js +15 -0
  151. package/dist/contracts/Locations/index.d.ts +12 -0
  152. package/dist/contracts/Locations/index.js +30 -0
  153. package/dist/contracts/RouteMesh/Contracts.d.ts +102 -0
  154. package/dist/contracts/RouteMesh/Contracts.js +39 -0
  155. package/dist/contracts/RouteMesh/RuntimeTopology.d.ts +165 -0
  156. package/dist/contracts/RouteMesh/RuntimeTopology.js +38 -0
  157. package/dist/contracts/RouteMesh/index.d.ts +2 -0
  158. package/dist/contracts/RouteMesh/index.js +18 -0
  159. package/dist/contracts/Spots/Builders.d.ts +10 -0
  160. package/dist/contracts/Spots/Builders.js +2 -0
  161. package/dist/contracts/Spots/Contracts.d.ts +110 -0
  162. package/dist/contracts/Spots/Contracts.js +9 -0
  163. package/dist/contracts/Spots/SpotKind.d.ts +8 -0
  164. package/dist/contracts/Spots/SpotKind.js +28 -0
  165. package/dist/contracts/Spots/ZLinkSpot.d.ts +62 -0
  166. package/dist/contracts/Spots/ZLinkSpot.js +15 -0
  167. package/dist/contracts/Spots/index.d.ts +3 -0
  168. package/dist/contracts/Spots/index.js +19 -0
  169. package/dist/contracts/Streams/BoundSessionContracts.d.ts +8 -0
  170. package/dist/contracts/Streams/BoundSessionContracts.js +2 -0
  171. package/dist/contracts/Streams/IZLinkSession.d.ts +44 -0
  172. package/dist/contracts/Streams/IZLinkSession.js +2 -0
  173. package/dist/contracts/Streams/IZLinkSessionActor.d.ts +15 -0
  174. package/dist/contracts/Streams/IZLinkSessionActor.js +2 -0
  175. package/dist/contracts/Streams/IZLinkSessionPacketHandler.d.ts +9 -0
  176. package/dist/contracts/Streams/IZLinkSessionPacketHandler.js +2 -0
  177. package/dist/contracts/Streams/IZLinkStream.d.ts +9 -0
  178. package/dist/contracts/Streams/IZLinkStream.js +2 -0
  179. package/dist/contracts/Streams/ZLinkMessageMetadata.d.ts +1 -0
  180. package/dist/contracts/Streams/ZLinkMessageMetadata.js +2 -0
  181. package/dist/contracts/Streams/ZLinkStreamCompression.d.ts +8 -0
  182. package/dist/contracts/Streams/ZLinkStreamCompression.js +2 -0
  183. package/dist/contracts/Streams/ZLinkStreamError.d.ts +8 -0
  184. package/dist/contracts/Streams/ZLinkStreamError.js +8 -0
  185. package/dist/contracts/Streams/index.d.ts +8 -0
  186. package/dist/contracts/Streams/index.js +24 -0
  187. package/dist/contracts/Timers/IZLinkTimer.d.ts +5 -0
  188. package/dist/contracts/Timers/IZLinkTimer.js +2 -0
  189. package/dist/contracts/Timers/ZLinkTimerOptions.d.ts +10 -0
  190. package/dist/contracts/Timers/ZLinkTimerOptions.js +9 -0
  191. package/dist/contracts/Timers/ZLinkTimerTick.d.ts +12 -0
  192. package/dist/contracts/Timers/ZLinkTimerTick.js +2 -0
  193. package/dist/contracts/Timers/index.d.ts +3 -0
  194. package/dist/contracts/Timers/index.js +19 -0
  195. package/dist/contracts/index.d.ts +25 -0
  196. package/dist/contracts/index.js +45 -0
  197. package/dist/index.d.ts +1 -0
  198. package/dist/index.js +17 -0
  199. package/dist/internal.d.ts +26 -0
  200. package/dist/internal.js +48 -0
  201. package/dist/location-store-integration.d.ts +5 -0
  202. package/dist/location-store-integration.js +31 -0
  203. package/dist/nest-integration.d.ts +49 -0
  204. package/dist/nest-integration.js +143 -0
  205. package/dist/runtime/abort.d.ts +13 -0
  206. package/dist/runtime/abort.js +71 -0
  207. package/dist/runtime/actors/actor-authority-payload-codec.d.ts +33 -0
  208. package/dist/runtime/actors/actor-authority-payload-codec.js +366 -0
  209. package/dist/runtime/actors/actor-authority-publication.d.ts +28 -0
  210. package/dist/runtime/actors/actor-authority-publication.js +207 -0
  211. package/dist/runtime/actors/actor-client.d.ts +36 -0
  212. package/dist/runtime/actors/actor-client.js +612 -0
  213. package/dist/runtime/actors/actor-context.d.ts +26 -0
  214. package/dist/runtime/actors/actor-context.js +433 -0
  215. package/dist/runtime/actors/actor-creation.d.ts +19 -0
  216. package/dist/runtime/actors/actor-creation.js +158 -0
  217. package/dist/runtime/actors/actor-execution-context.d.ts +6 -0
  218. package/dist/runtime/actors/actor-execution-context.js +27 -0
  219. package/dist/runtime/actors/actor-handoff.d.ts +191 -0
  220. package/dist/runtime/actors/actor-handoff.js +1252 -0
  221. package/dist/runtime/actors/actor-join-deferred-scope.d.ts +11 -0
  222. package/dist/runtime/actors/actor-join-deferred-scope.js +144 -0
  223. package/dist/runtime/actors/actor-join-relocation.d.ts +38 -0
  224. package/dist/runtime/actors/actor-join-relocation.js +2 -0
  225. package/dist/runtime/actors/actor-lifecycle-snapshot.d.ts +21 -0
  226. package/dist/runtime/actors/actor-lifecycle-snapshot.js +58 -0
  227. package/dist/runtime/actors/actor-local-native-join.d.ts +27 -0
  228. package/dist/runtime/actors/actor-local-native-join.js +409 -0
  229. package/dist/runtime/actors/actor-mailbox.d.ts +10 -0
  230. package/dist/runtime/actors/actor-mailbox.js +53 -0
  231. package/dist/runtime/actors/actor-message-follow-context.d.ts +46 -0
  232. package/dist/runtime/actors/actor-message-follow-context.js +257 -0
  233. package/dist/runtime/actors/actor-native-lookup.d.ts +4 -0
  234. package/dist/runtime/actors/actor-native-lookup.js +30 -0
  235. package/dist/runtime/actors/actor-packet-relay-wire.d.ts +73 -0
  236. package/dist/runtime/actors/actor-packet-relay-wire.js +144 -0
  237. package/dist/runtime/actors/actor-remote-joiner.d.ts +37 -0
  238. package/dist/runtime/actors/actor-remote-joiner.js +122 -0
  239. package/dist/runtime/actors/actor-remote-wire.d.ts +73 -0
  240. package/dist/runtime/actors/actor-remote-wire.js +84 -0
  241. package/dist/runtime/actors/actor-retry-delay.d.ts +5 -0
  242. package/dist/runtime/actors/actor-retry-delay.js +40 -0
  243. package/dist/runtime/actors/actor-routed-join-transport.d.ts +33 -0
  244. package/dist/runtime/actors/actor-routed-join-transport.js +2 -0
  245. package/dist/runtime/actors/actor-routed-json-request.d.ts +11 -0
  246. package/dist/runtime/actors/actor-routed-json-request.js +39 -0
  247. package/dist/runtime/actors/actor-runtime-contracts.d.ts +63 -0
  248. package/dist/runtime/actors/actor-runtime-contracts.js +2 -0
  249. package/dist/runtime/actors/actor-runtime-state.d.ts +152 -0
  250. package/dist/runtime/actors/actor-runtime-state.js +545 -0
  251. package/dist/runtime/actors/actor-source-transfer.d.ts +27 -0
  252. package/dist/runtime/actors/actor-source-transfer.js +2 -0
  253. package/dist/runtime/actors/actor-transfer-registry.d.ts +18 -0
  254. package/dist/runtime/actors/actor-transfer-registry.js +71 -0
  255. package/dist/runtime/actors/actor-transport-delivery-gate.d.ts +6 -0
  256. package/dist/runtime/actors/actor-transport-delivery-gate.js +4 -0
  257. package/dist/runtime/actors/bound-session-wire.d.ts +81 -0
  258. package/dist/runtime/actors/bound-session-wire.js +184 -0
  259. package/dist/runtime/actors/deferred-join-accepted-journal.d.ts +47 -0
  260. package/dist/runtime/actors/deferred-join-accepted-journal.js +962 -0
  261. package/dist/runtime/actors/index.d.ts +79 -0
  262. package/dist/runtime/actors/index.js +639 -0
  263. package/dist/runtime/actors/post-commit-actor-binder.d.ts +18 -0
  264. package/dist/runtime/actors/post-commit-actor-binder.js +68 -0
  265. package/dist/runtime/actors/post-commit-actor-location.d.ts +19 -0
  266. package/dist/runtime/actors/post-commit-actor-location.js +72 -0
  267. package/dist/runtime/actors/spot-actor-dispatch.d.ts +59 -0
  268. package/dist/runtime/actors/spot-actor-dispatch.js +179 -0
  269. package/dist/runtime/actors/transferred-actor-rollback.d.ts +16 -0
  270. package/dist/runtime/actors/transferred-actor-rollback.js +91 -0
  271. package/dist/runtime/admission.d.ts +20 -0
  272. package/dist/runtime/admission.js +166 -0
  273. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +57 -0
  274. package/dist/runtime/application-jobs/application-ingress-record-owner.js +185 -0
  275. package/dist/runtime/application-jobs/application-job-queue-handler-start-gate.d.ts +8 -0
  276. package/dist/runtime/application-jobs/application-job-queue-handler-start-gate.js +8 -0
  277. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +17 -0
  278. package/dist/runtime/application-jobs/application-job-queue-scope.js +57 -0
  279. package/dist/runtime/application-jobs/contracts.d.ts +19 -0
  280. package/dist/runtime/application-jobs/contracts.js +2 -0
  281. package/dist/runtime/application-jobs/receive-flow-controller.d.ts +32 -0
  282. package/dist/runtime/application-jobs/receive-flow-controller.js +165 -0
  283. package/dist/runtime/backend/contracts/index.d.ts +487 -0
  284. package/dist/runtime/backend/contracts/index.js +29 -0
  285. package/dist/runtime/backend/index.d.ts +9 -0
  286. package/dist/runtime/backend/index.js +25 -0
  287. package/dist/runtime/backend/mesh-actor-session-node-adapter.d.ts +3 -0
  288. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +51 -0
  289. package/dist/runtime/backend/mesh-completion-table.d.ts +34 -0
  290. package/dist/runtime/backend/mesh-completion-table.js +124 -0
  291. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +48 -0
  292. package/dist/runtime/backend/mesh-dispatch-pump.js +322 -0
  293. package/dist/runtime/backend/mesh-record-dispatcher.d.ts +19 -0
  294. package/dist/runtime/backend/mesh-record-dispatcher.js +53 -0
  295. package/dist/runtime/backend/node/index.d.ts +4 -0
  296. package/dist/runtime/backend/node/index.js +22 -0
  297. package/dist/runtime/backend/node/node-backend-adapter-factory.d.ts +12 -0
  298. package/dist/runtime/backend/node/node-backend-adapter-factory.js +161 -0
  299. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +52 -0
  300. package/dist/runtime/backend/node/node-backend-adapter-support.js +203 -0
  301. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +13 -0
  302. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +52 -0
  303. package/dist/runtime/backend/node/node-mesh-backend-adapter.d.ts +11 -0
  304. package/dist/runtime/backend/node/node-mesh-backend-adapter.js +23 -0
  305. package/dist/runtime/backend/node/node-monitor-backend-adapter.d.ts +6 -0
  306. package/dist/runtime/backend/node/node-monitor-backend-adapter.js +38 -0
  307. package/dist/runtime/backend/node/node-raw-binding-port.d.ts +8 -0
  308. package/dist/runtime/backend/node/node-raw-binding-port.js +411 -0
  309. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +266 -0
  310. package/dist/runtime/backend/node/node-raw-mesh-backend.js +1707 -0
  311. package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +9 -0
  312. package/dist/runtime/backend/node/node-socket-backend-adapter.js +286 -0
  313. package/dist/runtime/backend/node-backend-adapter.d.ts +9 -0
  314. package/dist/runtime/backend/node-backend-adapter.js +12 -0
  315. package/dist/runtime/backend/raw-binding-port.d.ts +58 -0
  316. package/dist/runtime/backend/raw-binding-port.js +2 -0
  317. package/dist/runtime/backend/runtime-message.d.ts +14 -0
  318. package/dist/runtime/backend/runtime-message.js +44 -0
  319. package/dist/runtime/backend/runtime-values.d.ts +78 -0
  320. package/dist/runtime/backend/runtime-values.js +66 -0
  321. package/dist/runtime/channels/channel-autoconnect.d.ts +14 -0
  322. package/dist/runtime/channels/channel-autoconnect.js +23 -0
  323. package/dist/runtime/channels/channel-clients.d.ts +50 -0
  324. package/dist/runtime/channels/channel-clients.js +329 -0
  325. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +76 -0
  326. package/dist/runtime/channels/channel-dispatch-pipeline.js +237 -0
  327. package/dist/runtime/channels/channel-dispatch-services.d.ts +52 -0
  328. package/dist/runtime/channels/channel-dispatch-services.js +132 -0
  329. package/dist/runtime/channels/channel-dispatchers.d.ts +125 -0
  330. package/dist/runtime/channels/channel-dispatchers.js +575 -0
  331. package/dist/runtime/channels/channel-envelope-inspection.d.ts +25 -0
  332. package/dist/runtime/channels/channel-envelope-inspection.js +96 -0
  333. package/dist/runtime/channels/channel-envelope.d.ts +73 -0
  334. package/dist/runtime/channels/channel-envelope.js +546 -0
  335. package/dist/runtime/channels/channel-framework-packets.d.ts +2 -0
  336. package/dist/runtime/channels/channel-framework-packets.js +6 -0
  337. package/dist/runtime/channels/channel-multipart.d.ts +16 -0
  338. package/dist/runtime/channels/channel-multipart.js +31 -0
  339. package/dist/runtime/channels/channel-outbound-operations.d.ts +33 -0
  340. package/dist/runtime/channels/channel-outbound-operations.js +343 -0
  341. package/dist/runtime/channels/channel-receive-loops.d.ts +151 -0
  342. package/dist/runtime/channels/channel-receive-loops.js +728 -0
  343. package/dist/runtime/channels/channel-receive-task-tracker.d.ts +14 -0
  344. package/dist/runtime/channels/channel-receive-task-tracker.js +37 -0
  345. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +77 -0
  346. package/dist/runtime/channels/channel-runtime-lifecycle.js +630 -0
  347. package/dist/runtime/channels/channel-runtime-manager.d.ts +84 -0
  348. package/dist/runtime/channels/channel-runtime-manager.js +193 -0
  349. package/dist/runtime/channels/channel-socket-options.d.ts +18 -0
  350. package/dist/runtime/channels/channel-socket-options.js +119 -0
  351. package/dist/runtime/channels/channel-socket-registry.d.ts +157 -0
  352. package/dist/runtime/channels/channel-socket-registry.js +1428 -0
  353. package/dist/runtime/channels/channel-transports.d.ts +126 -0
  354. package/dist/runtime/channels/channel-transports.js +448 -0
  355. package/dist/runtime/channels/client-server-location-runtime.d.ts +41 -0
  356. package/dist/runtime/channels/client-server-location-runtime.js +465 -0
  357. package/dist/runtime/channels/client-server-service-wire.d.ts +48 -0
  358. package/dist/runtime/channels/client-server-service-wire.js +306 -0
  359. package/dist/runtime/channels/dispatch-error-reporter.d.ts +22 -0
  360. package/dist/runtime/channels/dispatch-error-reporter.js +133 -0
  361. package/dist/runtime/channels/fanout-location-runtime.d.ts +38 -0
  362. package/dist/runtime/channels/fanout-location-runtime.js +356 -0
  363. package/dist/runtime/channels/fanout-service-wire.d.ts +12 -0
  364. package/dist/runtime/channels/fanout-service-wire.js +29 -0
  365. package/dist/runtime/channels/handler-filter-scope.d.ts +8 -0
  366. package/dist/runtime/channels/handler-filter-scope.js +11 -0
  367. package/dist/runtime/channels/index.d.ts +9 -0
  368. package/dist/runtime/channels/index.js +30 -0
  369. package/dist/runtime/channels/local-spot-route-transport.d.ts +9 -0
  370. package/dist/runtime/channels/local-spot-route-transport.js +40 -0
  371. package/dist/runtime/channels/route-disconnected-error.d.ts +3 -0
  372. package/dist/runtime/channels/route-disconnected-error.js +10 -0
  373. package/dist/runtime/channels/route-member-snapshot.d.ts +10 -0
  374. package/dist/runtime/channels/route-member-snapshot.js +55 -0
  375. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +12 -0
  376. package/dist/runtime/channels/router-socket-spot-route-transport.js +43 -0
  377. package/dist/runtime/channels/source-spot-router.d.ts +10 -0
  378. package/dist/runtime/channels/source-spot-router.js +46 -0
  379. package/dist/runtime/channels/spot-direct-envelope.d.ts +5 -0
  380. package/dist/runtime/channels/spot-direct-envelope.js +29 -0
  381. package/dist/runtime/channels/spot-node-route-transport.d.ts +13 -0
  382. package/dist/runtime/channels/spot-node-route-transport.js +60 -0
  383. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +14 -0
  384. package/dist/runtime/channels/spot-route-bridge-transport.js +58 -0
  385. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +50 -0
  386. package/dist/runtime/channels/spot-route-dispatch-strategy.js +128 -0
  387. package/dist/runtime/channels/spot-route-target-resolver.d.ts +16 -0
  388. package/dist/runtime/channels/spot-route-target-resolver.js +92 -0
  389. package/dist/runtime/codecs/index.d.ts +14 -0
  390. package/dist/runtime/codecs/index.js +44 -0
  391. package/dist/runtime/configuration/index.d.ts +1 -0
  392. package/dist/runtime/configuration/index.js +17 -0
  393. package/dist/runtime/diagnostics/dispatch-error-port.d.ts +8 -0
  394. package/dist/runtime/diagnostics/dispatch-error-port.js +2 -0
  395. package/dist/runtime/diagnostics/flow-context.d.ts +21 -0
  396. package/dist/runtime/diagnostics/flow-context.js +68 -0
  397. package/dist/runtime/diagnostics/index.d.ts +82 -0
  398. package/dist/runtime/diagnostics/index.js +335 -0
  399. package/dist/runtime/diagnostics/internal-event-contracts.d.ts +139 -0
  400. package/dist/runtime/diagnostics/internal-event-contracts.js +68 -0
  401. package/dist/runtime/diagnostics/message-flow.d.ts +55 -0
  402. package/dist/runtime/diagnostics/message-flow.js +420 -0
  403. package/dist/runtime/diagnostics/runtime-metrics.d.ts +123 -0
  404. package/dist/runtime/diagnostics/runtime-metrics.js +454 -0
  405. package/dist/runtime/diagnostics/runtime-observation-queue.d.ts +58 -0
  406. package/dist/runtime/diagnostics/runtime-observation-queue.js +324 -0
  407. package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +33 -0
  408. package/dist/runtime/diagnostics/topology-runtime-projections.js +255 -0
  409. package/dist/runtime/execution/index.d.ts +114 -0
  410. package/dist/runtime/execution/index.js +363 -0
  411. package/dist/runtime/execution/serial-execution-queue.d.ts +94 -0
  412. package/dist/runtime/execution/serial-execution-queue.js +411 -0
  413. package/dist/runtime/execution/serial-work-size.d.ts +4 -0
  414. package/dist/runtime/execution/serial-work-size.js +28 -0
  415. package/dist/runtime/execution/state-lane.d.ts +28 -0
  416. package/dist/runtime/execution/state-lane.js +105 -0
  417. package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +72 -0
  418. package/dist/runtime/foundation/actor-join-recovery-codec.js +333 -0
  419. package/dist/runtime/foundation/event-loop-resources.d.ts +37 -0
  420. package/dist/runtime/foundation/event-loop-resources.js +163 -0
  421. package/dist/runtime/foundation/index.d.ts +18 -0
  422. package/dist/runtime/foundation/index.js +34 -0
  423. package/dist/runtime/foundation/message-follow-suppression-registry.d.ts +38 -0
  424. package/dist/runtime/foundation/message-follow-suppression-registry.js +89 -0
  425. package/dist/runtime/foundation/operation-identity.d.ts +12 -0
  426. package/dist/runtime/foundation/operation-identity.js +33 -0
  427. package/dist/runtime/foundation/operation-registry.d.ts +42 -0
  428. package/dist/runtime/foundation/operation-registry.js +146 -0
  429. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +143 -0
  430. package/dist/runtime/foundation/raw-service-mesh-runtime.js +1349 -0
  431. package/dist/runtime/foundation/route-mesh-connection-policy.d.ts +3 -0
  432. package/dist/runtime/foundation/route-mesh-connection-policy.js +13 -0
  433. package/dist/runtime/foundation/runtime-state-projections.d.ts +13 -0
  434. package/dist/runtime/foundation/runtime-state-projections.js +44 -0
  435. package/dist/runtime/foundation/service-authority-payload-codec.d.ts +56 -0
  436. package/dist/runtime/foundation/service-authority-payload-codec.js +411 -0
  437. package/dist/runtime/foundation/service-discovery-registry.d.ts +42 -0
  438. package/dist/runtime/foundation/service-discovery-registry.js +175 -0
  439. package/dist/runtime/foundation/service-instance-activation-recovery-codec.d.ts +19 -0
  440. package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +287 -0
  441. package/dist/runtime/foundation/service-liveness-registry.d.ts +28 -0
  442. package/dist/runtime/foundation/service-liveness-registry.js +109 -0
  443. package/dist/runtime/foundation/service-mailbox.d.ts +60 -0
  444. package/dist/runtime/foundation/service-mailbox.js +283 -0
  445. package/dist/runtime/foundation/service-maintenance-runtime.d.ts +45 -0
  446. package/dist/runtime/foundation/service-maintenance-runtime.js +198 -0
  447. package/dist/runtime/foundation/service-metadata-codec.d.ts +2 -0
  448. package/dist/runtime/foundation/service-metadata-codec.js +69 -0
  449. package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +35 -0
  450. package/dist/runtime/foundation/service-relocation-aggregate-committer.js +139 -0
  451. package/dist/runtime/foundation/service-relocation-coordinator.d.ts +19 -0
  452. package/dist/runtime/foundation/service-relocation-coordinator.js +16 -0
  453. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +71 -0
  454. package/dist/runtime/foundation/service-relocation-object-owner.js +242 -0
  455. package/dist/runtime/foundation/service-relocation-runtime.d.ts +143 -0
  456. package/dist/runtime/foundation/service-relocation-runtime.js +1080 -0
  457. package/dist/runtime/foundation/service-runtime-contracts.d.ts +332 -0
  458. package/dist/runtime/foundation/service-runtime-contracts.js +66 -0
  459. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +23 -0
  460. package/dist/runtime/foundation/service-session-binding-ingress-port.js +11 -0
  461. package/dist/runtime/foundation/service-stateful-registry.d.ts +142 -0
  462. package/dist/runtime/foundation/service-stateful-registry.js +465 -0
  463. package/dist/runtime/foundation/service-stateful-runtime.d.ts +393 -0
  464. package/dist/runtime/foundation/service-stateful-runtime.js +3898 -0
  465. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +597 -0
  466. package/dist/runtime/foundation/service-stateful-wire-codec.js +2006 -0
  467. package/dist/runtime/foundation/service-topology-registry.d.ts +68 -0
  468. package/dist/runtime/foundation/service-topology-registry.js +393 -0
  469. package/dist/runtime/foundation/service-weighted-selection.d.ts +14 -0
  470. package/dist/runtime/foundation/service-weighted-selection.js +128 -0
  471. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +10 -0
  472. package/dist/runtime/foundation/service-wire-binary-primitives.js +53 -0
  473. package/dist/runtime/foundation/service-wire-codec.d.ts +22 -0
  474. package/dist/runtime/foundation/service-wire-codec.js +67 -0
  475. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +110 -0
  476. package/dist/runtime/foundation/service-wire-constants.generated.js +132 -0
  477. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +102 -0
  478. package/dist/runtime/foundation/service-wire-m6a-codec.js +568 -0
  479. package/dist/runtime/framework-errors-internal.d.ts +95 -0
  480. package/dist/runtime/framework-errors-internal.js +301 -0
  481. package/dist/runtime/handlers/handler-instance-scope.d.ts +11 -0
  482. package/dist/runtime/handlers/handler-instance-scope.js +284 -0
  483. package/dist/runtime/handlers/index.d.ts +13 -0
  484. package/dist/runtime/handlers/index.js +57 -0
  485. package/dist/runtime/host/actor-packet-relay.d.ts +60 -0
  486. package/dist/runtime/host/actor-packet-relay.js +664 -0
  487. package/dist/runtime/host/actor-placement-coordinator.d.ts +32 -0
  488. package/dist/runtime/host/actor-placement-coordinator.js +386 -0
  489. package/dist/runtime/host/actor-runtime-options-factory.d.ts +65 -0
  490. package/dist/runtime/host/actor-runtime-options-factory.js +160 -0
  491. package/dist/runtime/host/actor-transfer-authority-runtime.d.ts +26 -0
  492. package/dist/runtime/host/actor-transfer-authority-runtime.js +138 -0
  493. package/dist/runtime/host/actor-transfer-runtime.d.ts +149 -0
  494. package/dist/runtime/host/actor-transfer-runtime.js +1245 -0
  495. package/dist/runtime/host/application-job-queue.d.ts +99 -0
  496. package/dist/runtime/host/application-job-queue.js +409 -0
  497. package/dist/runtime/host/bound-session-relay.d.ts +41 -0
  498. package/dist/runtime/host/bound-session-relay.js +52 -0
  499. package/dist/runtime/host/bounded-replay-map.d.ts +12 -0
  500. package/dist/runtime/host/bounded-replay-map.js +42 -0
  501. package/dist/runtime/host/channel-runtime-options-factory.d.ts +22 -0
  502. package/dist/runtime/host/channel-runtime-options-factory.js +76 -0
  503. package/dist/runtime/host/entry-actor-runtime.d.ts +30 -0
  504. package/dist/runtime/host/entry-actor-runtime.js +80 -0
  505. package/dist/runtime/host/host-capacity-status.d.ts +11 -0
  506. package/dist/runtime/host/host-capacity-status.js +85 -0
  507. package/dist/runtime/host/index.d.ts +188 -0
  508. package/dist/runtime/host/index.js +2552 -0
  509. package/dist/runtime/host/instance-activation-authority.d.ts +33 -0
  510. package/dist/runtime/host/instance-activation-authority.js +496 -0
  511. package/dist/runtime/host/location-runtime-owner.d.ts +48 -0
  512. package/dist/runtime/host/location-runtime-owner.js +227 -0
  513. package/dist/runtime/host/mesh-router-resolver.d.ts +16 -0
  514. package/dist/runtime/host/mesh-router-resolver.js +108 -0
  515. package/dist/runtime/host/relocation-direct-transfer.d.ts +81 -0
  516. package/dist/runtime/host/relocation-direct-transfer.js +240 -0
  517. package/dist/runtime/host/relocation-integrity-fault-gate.d.ts +6 -0
  518. package/dist/runtime/host/relocation-integrity-fault-gate.js +5 -0
  519. package/dist/runtime/host/relocation-state-adapter.d.ts +8 -0
  520. package/dist/runtime/host/relocation-state-adapter.js +13 -0
  521. package/dist/runtime/host/remote-actor-join-receiver.d.ts +47 -0
  522. package/dist/runtime/host/remote-actor-join-receiver.js +161 -0
  523. package/dist/runtime/host/remote-actor-packet-target-store.d.ts +29 -0
  524. package/dist/runtime/host/remote-actor-packet-target-store.js +185 -0
  525. package/dist/runtime/host/remote-bound-session-relay.d.ts +58 -0
  526. package/dist/runtime/host/remote-bound-session-relay.js +540 -0
  527. package/dist/runtime/host/route-mesh-runtime-options.d.ts +9 -0
  528. package/dist/runtime/host/route-mesh-runtime-options.js +41 -0
  529. package/dist/runtime/host/route-mesh-runtime.d.ts +76 -0
  530. package/dist/runtime/host/route-mesh-runtime.js +746 -0
  531. package/dist/runtime/host/runtime-shutdown.d.ts +33 -0
  532. package/dist/runtime/host/runtime-shutdown.js +68 -0
  533. package/dist/runtime/host/service-relocation-control.d.ts +7 -0
  534. package/dist/runtime/host/service-relocation-control.js +24 -0
  535. package/dist/runtime/host/service-relocation-host-runtime.d.ts +241 -0
  536. package/dist/runtime/host/service-relocation-host-runtime.js +4113 -0
  537. package/dist/runtime/host/spot-address-transport.d.ts +47 -0
  538. package/dist/runtime/host/spot-address-transport.js +601 -0
  539. package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +38 -0
  540. package/dist/runtime/host/spot-node-runtime-options-factory.js +36 -0
  541. package/dist/runtime/host/spot-runtime-options-factory.d.ts +48 -0
  542. package/dist/runtime/host/spot-runtime-options-factory.js +169 -0
  543. package/dist/runtime/host/stateful-authority-route-runtime.d.ts +34 -0
  544. package/dist/runtime/host/stateful-authority-route-runtime.js +440 -0
  545. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +69 -0
  546. package/dist/runtime/host/user-spot-creation-coordinator.js +759 -0
  547. package/dist/runtime/locations/actor-location-claims.d.ts +43 -0
  548. package/dist/runtime/locations/actor-location-claims.js +319 -0
  549. package/dist/runtime/locations/actor-session-route-claims.d.ts +10 -0
  550. package/dist/runtime/locations/actor-session-route-claims.js +51 -0
  551. package/dist/runtime/locations/aggregate-inventory-store.d.ts +18 -0
  552. package/dist/runtime/locations/aggregate-inventory-store.js +399 -0
  553. package/dist/runtime/locations/authority-key-codec.d.ts +6 -0
  554. package/dist/runtime/locations/authority-key-codec.js +78 -0
  555. package/dist/runtime/locations/auto-connect-loop.d.ts +37 -0
  556. package/dist/runtime/locations/auto-connect-loop.js +112 -0
  557. package/dist/runtime/locations/auto-connect-planner.d.ts +9 -0
  558. package/dist/runtime/locations/auto-connect-planner.js +137 -0
  559. package/dist/runtime/locations/auto-connect-reconciler.d.ts +57 -0
  560. package/dist/runtime/locations/auto-connect-reconciler.js +358 -0
  561. package/dist/runtime/locations/auto-connect-types.d.ts +42 -0
  562. package/dist/runtime/locations/auto-connect-types.js +2 -0
  563. package/dist/runtime/locations/auto-connect.d.ts +4 -0
  564. package/dist/runtime/locations/auto-connect.js +20 -0
  565. package/dist/runtime/locations/canonical-codec.d.ts +7 -0
  566. package/dist/runtime/locations/canonical-codec.js +48 -0
  567. package/dist/runtime/locations/domain-store-contract.d.ts +34 -0
  568. package/dist/runtime/locations/domain-store-contract.js +2 -0
  569. package/dist/runtime/locations/in-memory-authority-store.d.ts +51 -0
  570. package/dist/runtime/locations/in-memory-authority-store.js +895 -0
  571. package/dist/runtime/locations/in-memory-location-store.d.ts +78 -0
  572. package/dist/runtime/locations/in-memory-location-store.js +1008 -0
  573. package/dist/runtime/locations/in-memory-provider-location-store.d.ts +19 -0
  574. package/dist/runtime/locations/in-memory-provider-location-store.js +183 -0
  575. package/dist/runtime/locations/index.d.ts +11 -0
  576. package/dist/runtime/locations/index.js +27 -0
  577. package/dist/runtime/locations/internal-location-contracts.d.ts +7 -0
  578. package/dist/runtime/locations/internal-location-contracts.js +21 -0
  579. package/dist/runtime/locations/internal-store-contracts.d.ts +35 -0
  580. package/dist/runtime/locations/internal-store-contracts.js +2 -0
  581. package/dist/runtime/locations/key-codec.d.ts +13 -0
  582. package/dist/runtime/locations/key-codec.js +41 -0
  583. package/dist/runtime/locations/lease-tracker.d.ts +36 -0
  584. package/dist/runtime/locations/lease-tracker.js +155 -0
  585. package/dist/runtime/locations/lifecycle-runtime.d.ts +19 -0
  586. package/dist/runtime/locations/lifecycle-runtime.js +2 -0
  587. package/dist/runtime/locations/lifecycle.d.ts +40 -0
  588. package/dist/runtime/locations/lifecycle.js +120 -0
  589. package/dist/runtime/locations/location-store-repository.d.ts +72 -0
  590. package/dist/runtime/locations/location-store-repository.js +3198 -0
  591. package/dist/runtime/locations/relocation-blob.d.ts +7 -0
  592. package/dist/runtime/locations/relocation-blob.js +24 -0
  593. package/dist/runtime/locations/resolvers.d.ts +145 -0
  594. package/dist/runtime/locations/resolvers.js +693 -0
  595. package/dist/runtime/locations/runtime.d.ts +144 -0
  596. package/dist/runtime/locations/runtime.js +792 -0
  597. package/dist/runtime/locations/spot-location-claims.d.ts +36 -0
  598. package/dist/runtime/locations/spot-location-claims.js +305 -0
  599. package/dist/runtime/messaging/creation-payload-codec.d.ts +4 -0
  600. package/dist/runtime/messaging/creation-payload-codec.js +40 -0
  601. package/dist/runtime/messaging/framework-json-v1.d.ts +7 -0
  602. package/dist/runtime/messaging/framework-json-v1.js +296 -0
  603. package/dist/runtime/messaging/index.d.ts +1 -0
  604. package/dist/runtime/messaging/index.js +2 -0
  605. package/dist/runtime/messaging/packet-name.d.ts +4 -0
  606. package/dist/runtime/messaging/packet-name.js +79 -0
  607. package/dist/runtime/messaging/payload-codec.d.ts +25 -0
  608. package/dist/runtime/messaging/payload-codec.js +255 -0
  609. package/dist/runtime/messaging/submission-result.d.ts +15 -0
  610. package/dist/runtime/messaging/submission-result.js +37 -0
  611. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +395 -0
  612. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +645 -0
  613. package/dist/runtime/routing-id.d.ts +8 -0
  614. package/dist/runtime/routing-id.js +112 -0
  615. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +124 -0
  616. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +269 -0
  617. package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +33 -0
  618. package/dist/runtime/spots/formal-remote-actor-transfer-registry.js +94 -0
  619. package/dist/runtime/spots/index.d.ts +247 -0
  620. package/dist/runtime/spots/index.js +2090 -0
  621. package/dist/runtime/spots/spot-activation-registry.d.ts +47 -0
  622. package/dist/runtime/spots/spot-activation-registry.js +272 -0
  623. package/dist/runtime/spots/spot-activation-state.d.ts +104 -0
  624. package/dist/runtime/spots/spot-activation-state.js +288 -0
  625. package/dist/runtime/spots/spot-activation.d.ts +89 -0
  626. package/dist/runtime/spots/spot-activation.js +601 -0
  627. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +20 -0
  628. package/dist/runtime/spots/spot-actor-admission-coordinator.js +194 -0
  629. package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +83 -0
  630. package/dist/runtime/spots/spot-actor-join-dispatch.js +185 -0
  631. package/dist/runtime/spots/spot-actor-lifecycle-drain.d.ts +22 -0
  632. package/dist/runtime/spots/spot-actor-lifecycle-drain.js +51 -0
  633. package/dist/runtime/spots/spot-actor-membership.d.ts +39 -0
  634. package/dist/runtime/spots/spot-actor-membership.js +179 -0
  635. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +91 -0
  636. package/dist/runtime/spots/spot-actor-packet-dispatch.js +315 -0
  637. package/dist/runtime/spots/spot-actor-packet-drain.d.ts +40 -0
  638. package/dist/runtime/spots/spot-actor-packet-drain.js +235 -0
  639. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +18 -0
  640. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +110 -0
  641. package/dist/runtime/spots/spot-closing.d.ts +2 -0
  642. package/dist/runtime/spots/spot-closing.js +30 -0
  643. package/dist/runtime/spots/spot-context.d.ts +46 -0
  644. package/dist/runtime/spots/spot-context.js +113 -0
  645. package/dist/runtime/spots/spot-entry-activation.d.ts +107 -0
  646. package/dist/runtime/spots/spot-entry-activation.js +342 -0
  647. package/dist/runtime/spots/spot-handle.d.ts +28 -0
  648. package/dist/runtime/spots/spot-handle.js +38 -0
  649. package/dist/runtime/spots/spot-handler-registry.d.ts +52 -0
  650. package/dist/runtime/spots/spot-handler-registry.js +155 -0
  651. package/dist/runtime/spots/spot-lifecycle-metrics.d.ts +8 -0
  652. package/dist/runtime/spots/spot-lifecycle-metrics.js +16 -0
  653. package/dist/runtime/spots/spot-location-claim.d.ts +25 -0
  654. package/dist/runtime/spots/spot-location-claim.js +55 -0
  655. package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +10 -0
  656. package/dist/runtime/spots/spot-manager-internal-contracts.js +2 -0
  657. package/dist/runtime/spots/spot-manager-public.d.ts +32 -0
  658. package/dist/runtime/spots/spot-manager-public.js +219 -0
  659. package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +26 -0
  660. package/dist/runtime/spots/spot-native-actor-join-admission.js +105 -0
  661. package/dist/runtime/spots/spot-native-flags.d.ts +2 -0
  662. package/dist/runtime/spots/spot-native-flags.js +5 -0
  663. package/dist/runtime/spots/spot-node-autoconnect.d.ts +23 -0
  664. package/dist/runtime/spots/spot-node-autoconnect.js +246 -0
  665. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +137 -0
  666. package/dist/runtime/spots/spot-node-runtime-manager.js +1111 -0
  667. package/dist/runtime/spots/spot-outbound.d.ts +78 -0
  668. package/dist/runtime/spots/spot-outbound.js +460 -0
  669. package/dist/runtime/spots/spot-provider.d.ts +4 -0
  670. package/dist/runtime/spots/spot-provider.js +28 -0
  671. package/dist/runtime/spots/spot-publisher-transport.d.ts +14 -0
  672. package/dist/runtime/spots/spot-publisher-transport.js +28 -0
  673. package/dist/runtime/spots/spot-remote-codec.d.ts +50 -0
  674. package/dist/runtime/spots/spot-remote-codec.js +190 -0
  675. package/dist/runtime/spots/spot-remote-route-codec.d.ts +47 -0
  676. package/dist/runtime/spots/spot-remote-route-codec.js +168 -0
  677. package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +25 -0
  678. package/dist/runtime/spots/spot-route-packet-dispatch.js +238 -0
  679. package/dist/runtime/spots/spot-route-replies.d.ts +17 -0
  680. package/dist/runtime/spots/spot-route-replies.js +76 -0
  681. package/dist/runtime/spots/spot-route-reply-wire.d.ts +10 -0
  682. package/dist/runtime/spots/spot-route-reply-wire.js +6 -0
  683. package/dist/runtime/spots/spot-routed-actor-admission.d.ts +36 -0
  684. package/dist/runtime/spots/spot-routed-actor-admission.js +240 -0
  685. package/dist/runtime/spots/spot-routed-bound-session-dispatch.d.ts +19 -0
  686. package/dist/runtime/spots/spot-routed-bound-session-dispatch.js +46 -0
  687. package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +54 -0
  688. package/dist/runtime/spots/spot-routed-frame-dispatch.js +162 -0
  689. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +43 -0
  690. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +152 -0
  691. package/dist/runtime/spots/spot-routing-internal.d.ts +28 -0
  692. package/dist/runtime/spots/spot-routing-internal.js +2 -0
  693. package/dist/runtime/spots/spot-runtime-ports.d.ts +64 -0
  694. package/dist/runtime/spots/spot-runtime-ports.js +2 -0
  695. package/dist/runtime/spots/spot-serial-executor.d.ts +38 -0
  696. package/dist/runtime/spots/spot-serial-executor.js +133 -0
  697. package/dist/runtime/spots/spot-serial-turn-executor.d.ts +54 -0
  698. package/dist/runtime/spots/spot-serial-turn-executor.js +219 -0
  699. package/dist/runtime/spots/spot-subscription-dispatch.d.ts +32 -0
  700. package/dist/runtime/spots/spot-subscription-dispatch.js +194 -0
  701. package/dist/runtime/spots/spot-timer.d.ts +110 -0
  702. package/dist/runtime/spots/spot-timer.js +419 -0
  703. package/dist/runtime/streams/actor-session-binding-registry.d.ts +193 -0
  704. package/dist/runtime/streams/actor-session-binding-registry.js +1127 -0
  705. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +20 -0
  706. package/dist/runtime/streams/actor-session-binding-runtime-owner.js +19 -0
  707. package/dist/runtime/streams/actor-session-lifecycle-coordinator.d.ts +4 -0
  708. package/dist/runtime/streams/actor-session-lifecycle-coordinator.js +24 -0
  709. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +29 -0
  710. package/dist/runtime/streams/bound-actor-relay-sender.js +181 -0
  711. package/dist/runtime/streams/bound-session-response-target.d.ts +25 -0
  712. package/dist/runtime/streams/bound-session-response-target.js +54 -0
  713. package/dist/runtime/streams/bound-session-service.d.ts +48 -0
  714. package/dist/runtime/streams/bound-session-service.js +201 -0
  715. package/dist/runtime/streams/index.d.ts +152 -0
  716. package/dist/runtime/streams/index.js +338 -0
  717. package/dist/runtime/streams/managed-stream.d.ts +53 -0
  718. package/dist/runtime/streams/managed-stream.js +329 -0
  719. package/dist/runtime/streams/native-fallback-bound-session.d.ts +24 -0
  720. package/dist/runtime/streams/native-fallback-bound-session.js +201 -0
  721. package/dist/runtime/streams/protocol.d.ts +67 -0
  722. package/dist/runtime/streams/protocol.js +244 -0
  723. package/dist/runtime/streams/session-actor-coordinator.d.ts +56 -0
  724. package/dist/runtime/streams/session-actor-coordinator.js +371 -0
  725. package/dist/runtime/streams/session-calls.d.ts +59 -0
  726. package/dist/runtime/streams/session-calls.js +123 -0
  727. package/dist/runtime/streams/session-context.d.ts +108 -0
  728. package/dist/runtime/streams/session-context.js +377 -0
  729. package/dist/runtime/streams/session-local-actors.d.ts +10 -0
  730. package/dist/runtime/streams/session-local-actors.js +26 -0
  731. package/dist/runtime/streams/session-provider.d.ts +4 -0
  732. package/dist/runtime/streams/session-provider.js +30 -0
  733. package/dist/runtime/streams/session-requests.d.ts +25 -0
  734. package/dist/runtime/streams/session-requests.js +100 -0
  735. package/dist/runtime/streams/session-serial-executor.d.ts +12 -0
  736. package/dist/runtime/streams/session-serial-executor.js +58 -0
  737. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +62 -0
  738. package/dist/runtime/streams/stream-binding-runtime-ports.js +2 -0
  739. package/dist/runtime/streams/stream-frame-factory.d.ts +44 -0
  740. package/dist/runtime/streams/stream-frame-factory.js +149 -0
  741. package/dist/runtime/streams/stream-message-utils.d.ts +5 -0
  742. package/dist/runtime/streams/stream-message-utils.js +74 -0
  743. package/dist/runtime/streams/stream-session-runtime.d.ts +166 -0
  744. package/dist/runtime/streams/stream-session-runtime.js +1144 -0
  745. package/dist/runtime/workers/index.d.ts +38 -0
  746. package/dist/runtime/workers/index.js +474 -0
  747. package/package.json +19 -0
  748. package/src/contracts/Actors/ZLinkActor.ts +8 -0
  749. package/src/contracts/Actors/ZLinkActorClient.ts +18 -0
  750. package/src/contracts/Actors/ZLinkActorContext.ts +15 -0
  751. package/src/contracts/Actors/ZLinkActorFactory.ts +41 -0
  752. package/src/contracts/Actors/ZLinkActorManager.ts +31 -0
  753. package/src/contracts/Actors/index.ts +5 -0
  754. package/src/contracts/Channels/Calls.ts +33 -0
  755. package/src/contracts/Channels/IZLinkChannelClient.ts +6 -0
  756. package/src/contracts/Channels/IZLinkFanoutClient.ts +13 -0
  757. package/src/contracts/Channels/RouteCalls.ts +13 -0
  758. package/src/contracts/Channels/index.ts +4 -0
  759. package/src/contracts/Codecs/IZLinkCodecRegistryBuilder.ts +22 -0
  760. package/src/contracts/Codecs/ZLinkMessageSerializer.ts +6 -0
  761. package/src/contracts/Codecs/index.ts +2 -0
  762. package/src/contracts/Common/ActorRef.ts +8 -0
  763. package/src/contracts/Common/CoreTypes.ts +6 -0
  764. package/src/contracts/Common/Message.ts +9 -0
  765. package/src/contracts/Common/ZLinkEncodedPayload.ts +47 -0
  766. package/src/contracts/Common/ZLinkMessage.ts +135 -0
  767. package/src/contracts/Common/ZLinkMessageMetadata.ts +77 -0
  768. package/src/contracts/Common/ZLinkProviderResolver.ts +6 -0
  769. package/src/contracts/Common/encoded-payload-storage.ts +16 -0
  770. package/src/contracts/Common/index.ts +5 -0
  771. package/src/contracts/Configuration/Builders.ts +200 -0
  772. package/src/contracts/Configuration/CodecContentType.ts +68 -0
  773. package/src/contracts/Configuration/CodecSerializerSelection.ts +28 -0
  774. package/src/contracts/Configuration/Configs.ts +27 -0
  775. package/src/contracts/Configuration/ConfigurationException.ts +6 -0
  776. package/src/contracts/Configuration/Connections.ts +5 -0
  777. package/src/contracts/Configuration/DiagnosticsValidation.ts +25 -0
  778. package/src/contracts/Configuration/EndpointNotation.ts +232 -0
  779. package/src/contracts/Configuration/InternalDefaults.ts +13 -0
  780. package/src/contracts/Configuration/ObjectRoles.ts +47 -0
  781. package/src/contracts/Configuration/Registration.ts +191 -0
  782. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +76 -0
  783. package/src/contracts/Configuration/RegistrationBuilders.ts +1705 -0
  784. package/src/contracts/Configuration/RegistrationCodecRegistry.ts +118 -0
  785. package/src/contracts/Configuration/RegistrationNormalizers.ts +404 -0
  786. package/src/contracts/Configuration/RegistrationTypes.ts +499 -0
  787. package/src/contracts/Configuration/RegistrationValidators.ts +698 -0
  788. package/src/contracts/Configuration/RouteChannelInternalState.ts +50 -0
  789. package/src/contracts/Configuration/RuntimeEndpointConnections.ts +91 -0
  790. package/src/contracts/Configuration/SendTimeoutValidation.ts +15 -0
  791. package/src/contracts/Configuration/TimerRegistrationValidator.ts +37 -0
  792. package/src/contracts/Configuration/index.ts +35 -0
  793. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +222 -0
  794. package/src/contracts/Dispatch/ZLinkFlowOrigin.ts +1 -0
  795. package/src/contracts/Dispatch/index.ts +2 -0
  796. package/src/contracts/Errors/ZLinkFrameworkException.ts +27 -0
  797. package/src/contracts/Errors/index.ts +4 -0
  798. package/src/contracts/Eventing/Metrics.ts +27 -0
  799. package/src/contracts/Eventing/index.ts +1 -0
  800. package/src/contracts/Handlers/Attributes.ts +111 -0
  801. package/src/contracts/Handlers/Contexts.ts +21 -0
  802. package/src/contracts/Handlers/IZLinkChannelHandlers.ts +69 -0
  803. package/src/contracts/Handlers/IZLinkHandlerFilter.ts +22 -0
  804. package/src/contracts/Handlers/JsonContract.ts +172 -0
  805. package/src/contracts/Handlers/ZLinkHandlerFilterNext.ts +1 -0
  806. package/src/contracts/Handlers/index.ts +17 -0
  807. package/src/contracts/Locations/ActorTransfer.ts +84 -0
  808. package/src/contracts/Locations/Authority.ts +308 -0
  809. package/src/contracts/Locations/Diagnostics.ts +48 -0
  810. package/src/contracts/Locations/Keys.ts +93 -0
  811. package/src/contracts/Locations/Models.ts +7 -0
  812. package/src/contracts/Locations/Options.ts +42 -0
  813. package/src/contracts/Locations/Readiness.ts +11 -0
  814. package/src/contracts/Locations/RelocationStore.ts +51 -0
  815. package/src/contracts/Locations/Resolvers.ts +8 -0
  816. package/src/contracts/Locations/Rows.ts +164 -0
  817. package/src/contracts/Locations/RuntimeQuery.ts +56 -0
  818. package/src/contracts/Locations/Stores.ts +92 -0
  819. package/src/contracts/Locations/Values.ts +32 -0
  820. package/src/contracts/Locations/Watch.ts +16 -0
  821. package/src/contracts/Locations/Writes.ts +56 -0
  822. package/src/contracts/Locations/index.ts +48 -0
  823. package/src/contracts/RouteMesh/Contracts.ts +145 -0
  824. package/src/contracts/RouteMesh/RuntimeTopology.ts +201 -0
  825. package/src/contracts/RouteMesh/index.ts +2 -0
  826. package/src/contracts/Spots/Builders.ts +11 -0
  827. package/src/contracts/Spots/Contracts.ts +150 -0
  828. package/src/contracts/Spots/SpotKind.ts +24 -0
  829. package/src/contracts/Spots/ZLinkSpot.ts +88 -0
  830. package/src/contracts/Spots/index.ts +3 -0
  831. package/src/contracts/Streams/BoundSessionContracts.ts +9 -0
  832. package/src/contracts/Streams/IZLinkSession.ts +52 -0
  833. package/src/contracts/Streams/IZLinkSessionActor.ts +17 -0
  834. package/src/contracts/Streams/IZLinkSessionPacketHandler.ts +11 -0
  835. package/src/contracts/Streams/IZLinkStream.ts +10 -0
  836. package/src/contracts/Streams/ZLinkMessageMetadata.ts +1 -0
  837. package/src/contracts/Streams/ZLinkStreamCompression.ts +9 -0
  838. package/src/contracts/Streams/ZLinkStreamError.ts +9 -0
  839. package/src/contracts/Streams/index.ts +8 -0
  840. package/src/contracts/Timers/IZLinkTimer.ts +5 -0
  841. package/src/contracts/Timers/ZLinkTimerOptions.ts +11 -0
  842. package/src/contracts/Timers/ZLinkTimerTick.ts +12 -0
  843. package/src/contracts/Timers/index.ts +3 -0
  844. package/src/contracts/index.ts +71 -0
  845. package/src/index.ts +1 -0
  846. package/src/internal.ts +29 -0
  847. package/src/location-store-integration.ts +51 -0
  848. package/src/nest-integration.ts +251 -0
  849. package/src/runtime/abort.ts +70 -0
  850. package/src/runtime/actors/actor-authority-payload-codec.ts +454 -0
  851. package/src/runtime/actors/actor-authority-publication.ts +277 -0
  852. package/src/runtime/actors/actor-client.ts +1018 -0
  853. package/src/runtime/actors/actor-context.ts +583 -0
  854. package/src/runtime/actors/actor-creation.ts +254 -0
  855. package/src/runtime/actors/actor-execution-context.ts +38 -0
  856. package/src/runtime/actors/actor-handoff.ts +1911 -0
  857. package/src/runtime/actors/actor-join-deferred-scope.ts +183 -0
  858. package/src/runtime/actors/actor-join-relocation.ts +39 -0
  859. package/src/runtime/actors/actor-lifecycle-snapshot.ts +90 -0
  860. package/src/runtime/actors/actor-local-native-join.ts +725 -0
  861. package/src/runtime/actors/actor-mailbox.ts +92 -0
  862. package/src/runtime/actors/actor-message-follow-context.ts +347 -0
  863. package/src/runtime/actors/actor-native-lookup.ts +38 -0
  864. package/src/runtime/actors/actor-packet-relay-wire.ts +223 -0
  865. package/src/runtime/actors/actor-remote-joiner.ts +238 -0
  866. package/src/runtime/actors/actor-remote-wire.ts +169 -0
  867. package/src/runtime/actors/actor-retry-delay.ts +37 -0
  868. package/src/runtime/actors/actor-routed-join-transport.ts +58 -0
  869. package/src/runtime/actors/actor-routed-json-request.ts +44 -0
  870. package/src/runtime/actors/actor-runtime-contracts.ts +126 -0
  871. package/src/runtime/actors/actor-runtime-state.ts +805 -0
  872. package/src/runtime/actors/actor-source-transfer.ts +62 -0
  873. package/src/runtime/actors/actor-transfer-registry.ts +112 -0
  874. package/src/runtime/actors/actor-transport-delivery-gate.ts +17 -0
  875. package/src/runtime/actors/bound-session-wire.ts +257 -0
  876. package/src/runtime/actors/deferred-join-accepted-journal.ts +1319 -0
  877. package/src/runtime/actors/index.ts +972 -0
  878. package/src/runtime/actors/post-commit-actor-binder.ts +70 -0
  879. package/src/runtime/actors/post-commit-actor-location.ts +114 -0
  880. package/src/runtime/actors/spot-actor-dispatch.ts +362 -0
  881. package/src/runtime/actors/transferred-actor-rollback.ts +123 -0
  882. package/src/runtime/admission.ts +192 -0
  883. package/src/runtime/application-jobs/application-ingress-record-owner.ts +216 -0
  884. package/src/runtime/application-jobs/application-job-queue-handler-start-gate.ts +10 -0
  885. package/src/runtime/application-jobs/application-job-queue-scope.ts +64 -0
  886. package/src/runtime/application-jobs/contracts.ts +26 -0
  887. package/src/runtime/application-jobs/receive-flow-controller.ts +188 -0
  888. package/src/runtime/backend/contracts/index.ts +765 -0
  889. package/src/runtime/backend/index.ts +9 -0
  890. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +73 -0
  891. package/src/runtime/backend/mesh-completion-table.ts +165 -0
  892. package/src/runtime/backend/mesh-dispatch-pump.ts +363 -0
  893. package/src/runtime/backend/mesh-record-dispatcher.ts +65 -0
  894. package/src/runtime/backend/node/index.ts +4 -0
  895. package/src/runtime/backend/node/node-backend-adapter-factory.ts +204 -0
  896. package/src/runtime/backend/node/node-backend-adapter-support.ts +257 -0
  897. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +133 -0
  898. package/src/runtime/backend/node/node-mesh-backend-adapter.ts +44 -0
  899. package/src/runtime/backend/node/node-monitor-backend-adapter.ts +39 -0
  900. package/src/runtime/backend/node/node-raw-binding-port.contract.ts +21 -0
  901. package/src/runtime/backend/node/node-raw-binding-port.ts +518 -0
  902. package/src/runtime/backend/node/node-raw-mesh-backend.ts +2669 -0
  903. package/src/runtime/backend/node/node-socket-backend-adapter.ts +372 -0
  904. package/src/runtime/backend/node-backend-adapter.ts +19 -0
  905. package/src/runtime/backend/raw-binding-port.ts +69 -0
  906. package/src/runtime/backend/runtime-message.ts +51 -0
  907. package/src/runtime/backend/runtime-values.ts +107 -0
  908. package/src/runtime/channels/channel-autoconnect.ts +46 -0
  909. package/src/runtime/channels/channel-clients.ts +527 -0
  910. package/src/runtime/channels/channel-dispatch-pipeline.ts +408 -0
  911. package/src/runtime/channels/channel-dispatch-services.ts +234 -0
  912. package/src/runtime/channels/channel-dispatchers.ts +790 -0
  913. package/src/runtime/channels/channel-envelope-inspection.ts +125 -0
  914. package/src/runtime/channels/channel-envelope.ts +743 -0
  915. package/src/runtime/channels/channel-framework-packets.ts +8 -0
  916. package/src/runtime/channels/channel-multipart.ts +61 -0
  917. package/src/runtime/channels/channel-outbound-operations.ts +584 -0
  918. package/src/runtime/channels/channel-receive-loops.ts +901 -0
  919. package/src/runtime/channels/channel-receive-task-tracker.ts +39 -0
  920. package/src/runtime/channels/channel-runtime-lifecycle.ts +969 -0
  921. package/src/runtime/channels/channel-runtime-manager.ts +444 -0
  922. package/src/runtime/channels/channel-socket-options.ts +153 -0
  923. package/src/runtime/channels/channel-socket-registry.ts +1837 -0
  924. package/src/runtime/channels/channel-transports.ts +1154 -0
  925. package/src/runtime/channels/client-server-location-runtime.ts +576 -0
  926. package/src/runtime/channels/client-server-service-wire.ts +390 -0
  927. package/src/runtime/channels/dispatch-error-reporter.ts +165 -0
  928. package/src/runtime/channels/fanout-location-runtime.ts +459 -0
  929. package/src/runtime/channels/fanout-service-wire.ts +43 -0
  930. package/src/runtime/channels/handler-filter-scope.ts +29 -0
  931. package/src/runtime/channels/index.ts +45 -0
  932. package/src/runtime/channels/local-spot-route-transport.ts +59 -0
  933. package/src/runtime/channels/route-disconnected-error.ts +6 -0
  934. package/src/runtime/channels/route-member-snapshot.ts +55 -0
  935. package/src/runtime/channels/router-socket-spot-route-transport.ts +77 -0
  936. package/src/runtime/channels/source-spot-router.ts +89 -0
  937. package/src/runtime/channels/spot-direct-envelope.ts +44 -0
  938. package/src/runtime/channels/spot-node-route-transport.ts +92 -0
  939. package/src/runtime/channels/spot-route-bridge-transport.ts +75 -0
  940. package/src/runtime/channels/spot-route-dispatch-strategy.ts +329 -0
  941. package/src/runtime/channels/spot-route-target-resolver.ts +101 -0
  942. package/src/runtime/codecs/index.ts +69 -0
  943. package/src/runtime/configuration/index.ts +1 -0
  944. package/src/runtime/diagnostics/dispatch-error-port.ts +8 -0
  945. package/src/runtime/diagnostics/flow-context.ts +84 -0
  946. package/src/runtime/diagnostics/index.ts +441 -0
  947. package/src/runtime/diagnostics/internal-event-contracts.ts +135 -0
  948. package/src/runtime/diagnostics/message-flow.ts +560 -0
  949. package/src/runtime/diagnostics/runtime-metrics.ts +601 -0
  950. package/src/runtime/diagnostics/runtime-observation-queue.ts +362 -0
  951. package/src/runtime/diagnostics/topology-runtime-projections.ts +298 -0
  952. package/src/runtime/execution/index.ts +466 -0
  953. package/src/runtime/execution/serial-execution-queue.ts +534 -0
  954. package/src/runtime/execution/serial-work-size.ts +31 -0
  955. package/src/runtime/execution/state-lane.ts +116 -0
  956. package/src/runtime/foundation/actor-join-recovery-codec.ts +465 -0
  957. package/src/runtime/foundation/event-loop-resources.ts +162 -0
  958. package/src/runtime/foundation/index.ts +18 -0
  959. package/src/runtime/foundation/message-follow-suppression-registry.ts +130 -0
  960. package/src/runtime/foundation/operation-identity.ts +49 -0
  961. package/src/runtime/foundation/operation-registry.ts +162 -0
  962. package/src/runtime/foundation/raw-service-mesh-runtime.ts +1771 -0
  963. package/src/runtime/foundation/route-mesh-connection-policy.ts +28 -0
  964. package/src/runtime/foundation/runtime-state-projections.ts +68 -0
  965. package/src/runtime/foundation/service-authority-payload-codec.ts +566 -0
  966. package/src/runtime/foundation/service-discovery-registry.ts +263 -0
  967. package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +329 -0
  968. package/src/runtime/foundation/service-liveness-registry.ts +144 -0
  969. package/src/runtime/foundation/service-mailbox.ts +369 -0
  970. package/src/runtime/foundation/service-maintenance-runtime.ts +242 -0
  971. package/src/runtime/foundation/service-metadata-codec.ts +75 -0
  972. package/src/runtime/foundation/service-relocation-aggregate-committer.ts +218 -0
  973. package/src/runtime/foundation/service-relocation-coordinator.ts +37 -0
  974. package/src/runtime/foundation/service-relocation-object-owner.ts +428 -0
  975. package/src/runtime/foundation/service-relocation-runtime.ts +1407 -0
  976. package/src/runtime/foundation/service-runtime-contracts.ts +423 -0
  977. package/src/runtime/foundation/service-session-binding-ingress-port.ts +45 -0
  978. package/src/runtime/foundation/service-stateful-registry.ts +664 -0
  979. package/src/runtime/foundation/service-stateful-runtime.ts +5753 -0
  980. package/src/runtime/foundation/service-stateful-wire-codec.ts +3008 -0
  981. package/src/runtime/foundation/service-topology-registry.ts +599 -0
  982. package/src/runtime/foundation/service-weighted-selection.ts +166 -0
  983. package/src/runtime/foundation/service-wire-binary-primitives.ts +80 -0
  984. package/src/runtime/foundation/service-wire-codec.ts +91 -0
  985. package/src/runtime/foundation/service-wire-constants.generated.ts +131 -0
  986. package/src/runtime/foundation/service-wire-m6a-codec.ts +647 -0
  987. package/src/runtime/framework-errors-internal.ts +338 -0
  988. package/src/runtime/handlers/handler-instance-scope.ts +372 -0
  989. package/src/runtime/handlers/index.ts +93 -0
  990. package/src/runtime/host/actor-packet-relay.ts +1070 -0
  991. package/src/runtime/host/actor-placement-coordinator.ts +573 -0
  992. package/src/runtime/host/actor-runtime-options-factory.ts +282 -0
  993. package/src/runtime/host/actor-transfer-authority-runtime.ts +225 -0
  994. package/src/runtime/host/actor-transfer-runtime.ts +1958 -0
  995. package/src/runtime/host/application-job-queue.ts +518 -0
  996. package/src/runtime/host/bound-session-relay.ts +94 -0
  997. package/src/runtime/host/bounded-replay-map.ts +42 -0
  998. package/src/runtime/host/channel-runtime-options-factory.ts +104 -0
  999. package/src/runtime/host/entry-actor-runtime.ts +115 -0
  1000. package/src/runtime/host/host-capacity-status.ts +103 -0
  1001. package/src/runtime/host/index.ts +3492 -0
  1002. package/src/runtime/host/instance-activation-authority.ts +658 -0
  1003. package/src/runtime/host/location-runtime-owner.ts +313 -0
  1004. package/src/runtime/host/mesh-router-resolver.ts +114 -0
  1005. package/src/runtime/host/relocation-direct-transfer.ts +273 -0
  1006. package/src/runtime/host/relocation-integrity-fault-gate.ts +8 -0
  1007. package/src/runtime/host/relocation-state-adapter.ts +24 -0
  1008. package/src/runtime/host/remote-actor-join-receiver.ts +264 -0
  1009. package/src/runtime/host/remote-actor-packet-target-store.ts +244 -0
  1010. package/src/runtime/host/remote-bound-session-relay.ts +900 -0
  1011. package/src/runtime/host/route-mesh-runtime-options.ts +46 -0
  1012. package/src/runtime/host/route-mesh-runtime.ts +891 -0
  1013. package/src/runtime/host/runtime-shutdown.ts +101 -0
  1014. package/src/runtime/host/service-relocation-control.ts +28 -0
  1015. package/src/runtime/host/service-relocation-host-runtime.ts +5817 -0
  1016. package/src/runtime/host/spot-address-transport.ts +997 -0
  1017. package/src/runtime/host/spot-node-runtime-options-factory.ts +82 -0
  1018. package/src/runtime/host/spot-runtime-options-factory.ts +286 -0
  1019. package/src/runtime/host/stateful-authority-route-runtime.ts +662 -0
  1020. package/src/runtime/host/user-spot-creation-coordinator.ts +1176 -0
  1021. package/src/runtime/locations/actor-location-claims.ts +426 -0
  1022. package/src/runtime/locations/actor-session-route-claims.ts +64 -0
  1023. package/src/runtime/locations/aggregate-inventory-store.ts +581 -0
  1024. package/src/runtime/locations/authority-key-codec.ts +80 -0
  1025. package/src/runtime/locations/auto-connect-loop.ts +131 -0
  1026. package/src/runtime/locations/auto-connect-planner.ts +178 -0
  1027. package/src/runtime/locations/auto-connect-reconciler.ts +425 -0
  1028. package/src/runtime/locations/auto-connect-types.ts +62 -0
  1029. package/src/runtime/locations/auto-connect.ts +4 -0
  1030. package/src/runtime/locations/canonical-codec.ts +54 -0
  1031. package/src/runtime/locations/domain-store-contract.ts +149 -0
  1032. package/src/runtime/locations/in-memory-authority-store.ts +1172 -0
  1033. package/src/runtime/locations/in-memory-location-store.ts +1467 -0
  1034. package/src/runtime/locations/in-memory-provider-location-store.ts +213 -0
  1035. package/src/runtime/locations/index.ts +11 -0
  1036. package/src/runtime/locations/internal-location-contracts.ts +22 -0
  1037. package/src/runtime/locations/internal-store-contracts.ts +90 -0
  1038. package/src/runtime/locations/key-codec.ts +61 -0
  1039. package/src/runtime/locations/lease-tracker.ts +221 -0
  1040. package/src/runtime/locations/lifecycle-runtime.ts +44 -0
  1041. package/src/runtime/locations/lifecycle.ts +272 -0
  1042. package/src/runtime/locations/location-store-repository.ts +4211 -0
  1043. package/src/runtime/locations/relocation-blob.ts +36 -0
  1044. package/src/runtime/locations/resolvers.ts +1054 -0
  1045. package/src/runtime/locations/runtime.ts +1126 -0
  1046. package/src/runtime/locations/spot-location-claims.ts +435 -0
  1047. package/src/runtime/messaging/creation-payload-codec.ts +59 -0
  1048. package/src/runtime/messaging/framework-json-v1.ts +307 -0
  1049. package/src/runtime/messaging/index.ts +1 -0
  1050. package/src/runtime/messaging/packet-name.ts +94 -0
  1051. package/src/runtime/messaging/payload-codec.ts +418 -0
  1052. package/src/runtime/messaging/submission-result.ts +61 -0
  1053. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +189 -0
  1054. package/src/runtime/routing-id.ts +125 -0
  1055. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +418 -0
  1056. package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +147 -0
  1057. package/src/runtime/spots/index.ts +3303 -0
  1058. package/src/runtime/spots/spot-activation-registry.ts +335 -0
  1059. package/src/runtime/spots/spot-activation-state.ts +414 -0
  1060. package/src/runtime/spots/spot-activation.ts +1027 -0
  1061. package/src/runtime/spots/spot-actor-admission-coordinator.ts +354 -0
  1062. package/src/runtime/spots/spot-actor-join-dispatch.ts +303 -0
  1063. package/src/runtime/spots/spot-actor-lifecycle-drain.ts +79 -0
  1064. package/src/runtime/spots/spot-actor-membership.ts +266 -0
  1065. package/src/runtime/spots/spot-actor-packet-dispatch.ts +593 -0
  1066. package/src/runtime/spots/spot-actor-packet-drain.ts +328 -0
  1067. package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +162 -0
  1068. package/src/runtime/spots/spot-closing.ts +34 -0
  1069. package/src/runtime/spots/spot-context.ts +259 -0
  1070. package/src/runtime/spots/spot-entry-activation.ts +551 -0
  1071. package/src/runtime/spots/spot-handle.ts +101 -0
  1072. package/src/runtime/spots/spot-handler-registry.ts +273 -0
  1073. package/src/runtime/spots/spot-lifecycle-metrics.ts +15 -0
  1074. package/src/runtime/spots/spot-location-claim.ts +86 -0
  1075. package/src/runtime/spots/spot-manager-internal-contracts.ts +11 -0
  1076. package/src/runtime/spots/spot-manager-public.ts +361 -0
  1077. package/src/runtime/spots/spot-native-actor-join-admission.ts +151 -0
  1078. package/src/runtime/spots/spot-native-flags.ts +4 -0
  1079. package/src/runtime/spots/spot-node-autoconnect.ts +325 -0
  1080. package/src/runtime/spots/spot-node-runtime-manager.ts +1573 -0
  1081. package/src/runtime/spots/spot-outbound.ts +761 -0
  1082. package/src/runtime/spots/spot-provider.ts +36 -0
  1083. package/src/runtime/spots/spot-publisher-transport.ts +69 -0
  1084. package/src/runtime/spots/spot-remote-codec.ts +308 -0
  1085. package/src/runtime/spots/spot-remote-route-codec.ts +284 -0
  1086. package/src/runtime/spots/spot-route-packet-dispatch.ts +359 -0
  1087. package/src/runtime/spots/spot-route-replies.ts +126 -0
  1088. package/src/runtime/spots/spot-route-reply-wire.ts +15 -0
  1089. package/src/runtime/spots/spot-routed-actor-admission.ts +351 -0
  1090. package/src/runtime/spots/spot-routed-bound-session-dispatch.ts +132 -0
  1091. package/src/runtime/spots/spot-routed-frame-dispatch.ts +250 -0
  1092. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +254 -0
  1093. package/src/runtime/spots/spot-routing-internal.ts +33 -0
  1094. package/src/runtime/spots/spot-runtime-ports.ts +196 -0
  1095. package/src/runtime/spots/spot-serial-executor.ts +170 -0
  1096. package/src/runtime/spots/spot-serial-turn-executor.ts +319 -0
  1097. package/src/runtime/spots/spot-subscription-dispatch.ts +252 -0
  1098. package/src/runtime/spots/spot-timer.ts +609 -0
  1099. package/src/runtime/streams/actor-session-binding-registry.ts +1691 -0
  1100. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +78 -0
  1101. package/src/runtime/streams/actor-session-lifecycle-coordinator.ts +20 -0
  1102. package/src/runtime/streams/bound-actor-relay-sender.ts +275 -0
  1103. package/src/runtime/streams/bound-session-response-target.ts +91 -0
  1104. package/src/runtime/streams/bound-session-service.ts +500 -0
  1105. package/src/runtime/streams/index.ts +706 -0
  1106. package/src/runtime/streams/managed-stream.ts +509 -0
  1107. package/src/runtime/streams/native-fallback-bound-session.ts +321 -0
  1108. package/src/runtime/streams/protocol.ts +291 -0
  1109. package/src/runtime/streams/session-actor-coordinator.ts +605 -0
  1110. package/src/runtime/streams/session-calls.ts +221 -0
  1111. package/src/runtime/streams/session-context.ts +609 -0
  1112. package/src/runtime/streams/session-local-actors.ts +30 -0
  1113. package/src/runtime/streams/session-provider.ts +50 -0
  1114. package/src/runtime/streams/session-requests.ts +109 -0
  1115. package/src/runtime/streams/session-serial-executor.ts +97 -0
  1116. package/src/runtime/streams/stream-binding-runtime-ports.ts +106 -0
  1117. package/src/runtime/streams/stream-frame-factory.ts +255 -0
  1118. package/src/runtime/streams/stream-message-utils.ts +89 -0
  1119. package/src/runtime/streams/stream-session-runtime.ts +1420 -0
  1120. package/src/runtime/workers/index.ts +580 -0
  1121. package/tsconfig.json +17 -0
@@ -0,0 +1,1911 @@
1
+ import { ZLinkFrameworkInternalErrorKind, createInternalFrameworkException, internalFrameworkErrorKind } from '../framework-errors-internal';
2
+ import { ZLinkBufferMessage as RuntimeMessage } from '../backend/runtime-message';
3
+ import type { ActorRef, RoutingId } from '../../contracts';
4
+ import {
5
+ ZLinkFrameworkException
6
+ } from '../../contracts';
7
+ import type { Message } from '../../contracts/Common/Message';
8
+ import type { ZLinkMessageFollowOrigin } from '../foundation/service-runtime-contracts';
9
+ import {
10
+ MessageFollowSuppressionRegistry,
11
+ type MessageFollowSuppressionFence
12
+ } from '../foundation/message-follow-suppression-registry';
13
+ import type { ZLinkSpotRouteTarget } from '../spots/spot-routing-internal';
14
+ import { encodeRoutingIdStorageHex, routingIdsEqual } from '../routing-id';
15
+ import { releaseApplicationJobPermitForDurableHandoff } from '../application-jobs/application-job-queue-scope';
16
+ import {
17
+ decodeActorRequestDeadlineUnixMs,
18
+ decodeStreamHeader
19
+ } from '../streams/protocol';
20
+ import type { ZLinkActorRoutedJoinTransport } from './actor-routed-join-transport';
21
+ import { requestRoutedJsonReply } from './actor-routed-json-request';
22
+ import type { ZLinkRemoteBoundSessionTarget } from './actor-runtime-state';
23
+ import {
24
+ encodeMessageFollowRemoteActorPacketRelayPayload,
25
+ ZLINK_REMOTE_ACTOR_PACKET_RELAY_PACKET
26
+ } from './actor-packet-relay-wire';
27
+ import {
28
+ actorMessageFollowContext,
29
+ actorMessageFollowPayloadChecksum,
30
+ attachActorMessageFollowContext,
31
+ advanceActorMessageFollowContext,
32
+ createMessageFollowId,
33
+ messageFollowOwnerFenceKey,
34
+ messageFollowOwnerFencesEqual,
35
+ messageFollowOwnerNodeRid,
36
+ ownerFence,
37
+ verifyActorMessageFollowPayload,
38
+ type ZLinkActorMessageFollowContext,
39
+ type ZLinkActorMessageFollowOwnerFence
40
+ } from './actor-message-follow-context';
41
+
42
+ export const DEFAULT_MESSAGE_FOLLOW_DURATION_MS = 30_000;
43
+ const MAX_MESSAGE_FOLLOW_HOPS = 8;
44
+ const RELOCATION_REPLY_RETENTION_MS = 24 * 60 * 60 * 1_000;
45
+
46
+ export interface ZLinkActorHandoffPacket {
47
+ readonly index: number;
48
+ readonly header: string;
49
+ readonly payload: string;
50
+ readonly returnResponse: boolean;
51
+ readonly source?: ZLinkActorHandoffRequestSource;
52
+ readonly remoteBoundSessionTarget?: {
53
+ readonly routerChannelId: string;
54
+ readonly targetNodeRid: string;
55
+ readonly spotId: string;
56
+ readonly bindingGeneration?: string;
57
+ readonly previousAuthorityOwnerGeneration?: string;
58
+ readonly previousOwnerLeaseGeneration?: string;
59
+ readonly relocationSealId?: string;
60
+ };
61
+ readonly fallbackActorRef?: {
62
+ readonly actorId: string;
63
+ readonly objectGeneration: string;
64
+ readonly meshName: string;
65
+ readonly nodeRid: string;
66
+ };
67
+ readonly messageFollowContext: ZLinkActorMessageFollowContext;
68
+ readonly messageFollowOrigin?: ZLinkMessageFollowOrigin;
69
+ }
70
+
71
+ export interface ZLinkActorHandoffRequestSource {
72
+ readonly ownerId: string;
73
+ readonly ownerLeaseGeneration: string;
74
+ readonly nodeRid: string;
75
+ readonly nodeGeneration: string;
76
+ readonly replyRouteId: string;
77
+ }
78
+
79
+ export type ZLinkActorHandoffTerminalAck =
80
+ | 'terminalReceived'
81
+ | 'alreadyTerminal'
82
+ | 'notAcknowledged';
83
+
84
+ export interface ZLinkActorHandoffTerminalAcceptance {
85
+ readonly status: ZLinkActorHandoffTerminalAck;
86
+ readonly source?: ZLinkActorHandoffRequestSource;
87
+ }
88
+
89
+ export interface ZLinkActorHandoffResult {
90
+ readonly index: number;
91
+ readonly ok: boolean;
92
+ readonly response?: unknown;
93
+ readonly error?: string;
94
+ readonly errorKind?: ZLinkFrameworkInternalErrorKind;
95
+ }
96
+
97
+ export type ZLinkActorHandoffDispatch = (
98
+ parts: readonly Message[],
99
+ returnResponse: boolean,
100
+ remoteBoundSessionTarget?: ZLinkRemoteBoundSessionTarget,
101
+ fallbackActorRef?: ActorRef
102
+ ) => Promise<unknown>;
103
+
104
+ export type ZLinkActorHandoffReplayAdmission = <T>(
105
+ operation: () => Promise<T>
106
+ ) => Promise<T>;
107
+
108
+ export interface ZLinkActorHandoffPreparedReplayAdmission {
109
+ run<T>(operation: () => Promise<T>): Promise<T>;
110
+ cancel(): void;
111
+ }
112
+
113
+ export type ZLinkActorHandoffReplayPreparation = (
114
+ signal: AbortSignal
115
+ ) => Promise<ZLinkActorHandoffPreparedReplayAdmission>;
116
+
117
+ export interface ZLinkActorHandoffPrefixAdmission {
118
+ /** Completes after every child callback reaches its real terminal. */
119
+ readonly terminal: Promise<void>;
120
+ }
121
+
122
+ export interface ZLinkActorHandoffPrefixRecord {
123
+ readonly drain: (dispatch: ZLinkActorHandoffDispatch) => Promise<void>;
124
+ readonly preparation?: {
125
+ prepare(signal: AbortSignal): Promise<void>;
126
+ cancel(): void;
127
+ };
128
+ readonly payloadBytes: number;
129
+ }
130
+
131
+ /**
132
+ * Atomically installs one non-executing durable prefix in an Actor FIFO.
133
+ * Invoking the function is the queue-admission linearization point; a failure
134
+ * to admit must throw synchronously.
135
+ *
136
+ * @internal
137
+ */
138
+ export type ZLinkActorHandoffPrefixQueue = (
139
+ records: readonly ZLinkActorHandoffPrefixRecord[]
140
+ ) => ZLinkActorHandoffPrefixAdmission;
141
+
142
+ interface PendingPacket {
143
+ readonly packet: ZLinkActorHandoffPacket;
144
+ readonly resolve?: (value: unknown) => void;
145
+ readonly reject?: (reason: unknown) => void;
146
+ }
147
+
148
+ interface ActivePrefixRelease {
149
+ readonly queue: ZLinkActorHandoffPrefixQueue;
150
+ readonly preparation?: ZLinkActorHandoffReplayPreparation;
151
+ readonly start: Promise<void>;
152
+ startOpen: boolean;
153
+ cursor: number;
154
+ inFlight: number;
155
+ readonly errors: unknown[];
156
+ readonly terminal: Promise<void>;
157
+ resolve(): void;
158
+ reject(reason: unknown): void;
159
+ }
160
+
161
+ interface ReplySourceEvidence {
162
+ readonly meshName: string;
163
+ readonly objectGeneration: bigint;
164
+ readonly ownerId: string;
165
+ readonly ownerLeaseGeneration: bigint;
166
+ readonly nodeRid: string;
167
+ readonly nodeRidHex: string;
168
+ readonly nodeGeneration: bigint;
169
+ readonly authorityOwnerGeneration: bigint;
170
+ }
171
+
172
+ interface ReplyRoute {
173
+ readonly actorId: string;
174
+ readonly operationId: string;
175
+ readonly source: ZLinkActorHandoffRequestSource;
176
+ readonly sourceEvidence: ReplySourceEvidence;
177
+ readonly sourceOwner: ZLinkActorMessageFollowOwnerFence;
178
+ readonly resolve: (value: unknown) => void;
179
+ readonly reject: (reason: unknown) => void;
180
+ deadline?: ReturnType<typeof setTimeout>;
181
+ targetNodeRid?: RoutingId;
182
+ targetAuthorityOwnerGeneration?: bigint;
183
+ delivered: boolean;
184
+ }
185
+
186
+ interface ActiveHandoff {
187
+ readonly oldGeneration: bigint;
188
+ readonly oldNodeRid?: string;
189
+ readonly oldNodeRidHex?: string;
190
+ readonly sourceEvidence: ReplySourceEvidence;
191
+ readonly sourceOwner: ZLinkActorMessageFollowOwnerFence;
192
+ phase: 'provisional' | 'releasing' | 'relocating';
193
+ readonly operationId?: string;
194
+ replay?: ZLinkActorHandoffDispatch;
195
+ connectionBoundSealed: boolean;
196
+ readonly pending: PendingPacket[];
197
+ nextIndex: number;
198
+ snapshotIndex: number;
199
+ pendingBytes: number;
200
+ releaseTask?: Promise<void>;
201
+ prefixRelease?: ActivePrefixRelease;
202
+ }
203
+
204
+ interface MessageFollowRoute {
205
+ readonly key: string;
206
+ readonly oldGeneration: bigint;
207
+ readonly oldNodeRid?: string;
208
+ readonly oldNodeRidHex?: string;
209
+ readonly sourceOwner: ZLinkActorMessageFollowOwnerFence;
210
+ readonly targetOwner: ZLinkActorMessageFollowOwnerFence;
211
+ readonly target: ZLinkSpotRouteTarget;
212
+ readonly targetActorRef: ActorRef;
213
+ readonly suppressionFence: MessageFollowSuppressionFence;
214
+ readonly expiresAt: number;
215
+ readonly deadline: ReturnType<typeof setTimeout>;
216
+ tail: Promise<void>;
217
+ queuedMessages: number;
218
+ queuedBytes: number;
219
+ readonly operations: Map<string, {
220
+ readonly checksum: string;
221
+ readonly request: boolean;
222
+ readonly replyRouteId?: string;
223
+ readonly result: Promise<unknown>;
224
+ }>;
225
+ }
226
+
227
+ export interface ZLinkActorHandoffCoordinatorOptions {
228
+ readonly routedTransport: ZLinkActorRoutedJoinTransport;
229
+ readonly messageFollowDurationMs?: number;
230
+ readonly requestTimeoutMs?: number;
231
+ readonly onMarker?: (
232
+ marker: string,
233
+ actorId: string,
234
+ index?: number,
235
+ context?: ZLinkActorMessageFollowContext
236
+ ) => void;
237
+ readonly onRequestFrame?: (
238
+ actorId: string,
239
+ index: number,
240
+ requestSeq: bigint | undefined,
241
+ flags: number
242
+ ) => void;
243
+ readonly onMessageFollowRelayed?: (
244
+ actorId: string,
245
+ targetActorRef: ActorRef,
246
+ context: ZLinkActorMessageFollowContext,
247
+ origin: ZLinkMessageFollowOrigin,
248
+ queuedMessages: number,
249
+ queuedBytes: number
250
+ ) => boolean | Promise<boolean>;
251
+ readonly isStaleActorRef?: (actorId: string, actorRef?: ActorRef) => boolean;
252
+ readonly isCurrentHandoffTarget?: (actorId: string, spotId: string) => boolean;
253
+ readonly isCurrentActorRef?: (actorId: string, actorRef: ActorRef) => boolean;
254
+ readonly requestSource: (actorId: string) => {
255
+ readonly meshName: string;
256
+ readonly objectGeneration: bigint;
257
+ readonly ownerId: string;
258
+ readonly ownerLeaseGeneration: bigint;
259
+ readonly nodeRid: string;
260
+ readonly nodeRidHex?: string;
261
+ readonly nodeGeneration: bigint;
262
+ readonly authorityOwnerGeneration: bigint;
263
+ };
264
+ readonly validateReplySource: (source: ReplySourceEvidence) => boolean;
265
+ readonly currentOwnerFence?: (
266
+ actorId: string
267
+ ) => ZLinkActorMessageFollowOwnerFence | undefined;
268
+ }
269
+
270
+ function requireExactTargetOwnerFence(
271
+ actorId: string,
272
+ fence: ZLinkActorMessageFollowOwnerFence | undefined
273
+ ): ZLinkActorMessageFollowOwnerFence {
274
+ if (fence === undefined) {
275
+ throw new Error(`Actor '${actorId}' handoff requires a committed target owner fence.`);
276
+ }
277
+ try {
278
+ return ownerFence(fence);
279
+ } catch {
280
+ throw new Error(`Actor '${actorId}' handoff requires a committed target owner fence.`);
281
+ }
282
+ }
283
+
284
+ /** Owns packet ordering from relocation start through Message Follow removal. */
285
+ export class ZLinkActorHandoffCoordinator {
286
+ private readonly active = new Map<string, ActiveHandoff>();
287
+ private readonly messageFollowRoutes = new Map<string, MessageFollowRoute>();
288
+ private readonly messageFollowSuppression = new MessageFollowSuppressionRegistry();
289
+ // Relocation preserves ObjectGeneration, so (nodeRid, objectGeneration) alone
290
+ // also matches a tenure that later RETURNS to a previously-visited node. The
291
+ // stale-tenure identity therefore keeps the departing tenure's
292
+ // authorityOwnerGeneration: a ref is stale only while its authority fence is
293
+ // not strictly newer than the recorded departure. Entries live exactly as
294
+ // long as their Message Follow route and are pruned with it.
295
+ private readonly staleGenerations = new Map<string, Map<bigint, bigint>>();
296
+ private readonly staleActorRefs = new Map<string, Map<string, bigint>>();
297
+ private readonly messageFollowDurationMs: number;
298
+ private nextReplyRouteId = 0n;
299
+ private readonly replyRoutes = new Map<string, ReplyRoute>();
300
+
301
+ constructor(private readonly options: ZLinkActorHandoffCoordinatorOptions) {
302
+ this.messageFollowDurationMs = options.messageFollowDurationMs ?? DEFAULT_MESSAGE_FOLLOW_DURATION_MS;
303
+ }
304
+
305
+ begin(
306
+ actorId: string,
307
+ oldGeneration: bigint
308
+ ): void {
309
+ this.startHandoff(actorId, oldGeneration, { phase: 'relocating' });
310
+ }
311
+
312
+ beginProvisional(
313
+ actorId: string,
314
+ operationId: string,
315
+ oldGeneration: bigint
316
+ ): void {
317
+ this.startHandoff(
318
+ actorId,
319
+ oldGeneration,
320
+ { phase: 'provisional', operationId }
321
+ );
322
+ }
323
+
324
+ private startHandoff(
325
+ actorId: string,
326
+ oldGeneration: bigint,
327
+ transition: { readonly phase: 'relocating' } | {
328
+ readonly phase: 'provisional';
329
+ readonly operationId: string;
330
+ }
331
+ ): void {
332
+ if (this.active.has(actorId)) {
333
+ throw new Error(`Actor '${actorId}' already has an active packet handoff.`);
334
+ }
335
+ if (oldGeneration <= 0n) {
336
+ throw new Error(`Actor '${actorId}' handoff requires a positive source ObjectGeneration.`);
337
+ }
338
+ const source = this.options.requestSource(actorId);
339
+ if (source.meshName.length === 0 || source.ownerId.length === 0
340
+ || source.ownerLeaseGeneration <= 0n
341
+ || source.nodeRid.length === 0 || source.nodeGeneration <= 0n
342
+ || source.authorityOwnerGeneration <= 0n) {
343
+ throw new Error(`Actor '${actorId}' handoff requires an exact source owner fence.`);
344
+ }
345
+ if (source.objectGeneration !== oldGeneration) {
346
+ throw new Error(
347
+ `Actor '${actorId}' handoff source ObjectGeneration changed from ${oldGeneration} to ${source.objectGeneration}.`
348
+ );
349
+ }
350
+ const sourceOwner = ownerFence({
351
+ ownerId: source.ownerId,
352
+ ownerLeaseGeneration: source.ownerLeaseGeneration,
353
+ nodeRid: source.nodeRid,
354
+ nodeRidHex: source.nodeRidHex,
355
+ nodeGeneration: source.nodeGeneration,
356
+ authorityOwnerGeneration: source.authorityOwnerGeneration
357
+ });
358
+ const sourceEvidence = Object.freeze({
359
+ meshName: source.meshName,
360
+ objectGeneration: source.objectGeneration,
361
+ ownerId: source.ownerId,
362
+ ownerLeaseGeneration: source.ownerLeaseGeneration,
363
+ nodeRid: sourceOwner.nodeRid,
364
+ nodeRidHex: sourceOwner.nodeRidHex
365
+ ?? encodeRoutingIdStorageHex(sourceOwner.nodeRid),
366
+ nodeGeneration: source.nodeGeneration,
367
+ authorityOwnerGeneration: source.authorityOwnerGeneration
368
+ });
369
+ this.active.set(actorId, {
370
+ oldGeneration,
371
+ oldNodeRid: sourceOwner.nodeRid,
372
+ oldNodeRidHex: sourceEvidence.nodeRidHex,
373
+ sourceEvidence,
374
+ sourceOwner,
375
+ phase: transition.phase,
376
+ ...(transition.phase === 'provisional' ? { operationId: transition.operationId } : {}),
377
+ connectionBoundSealed: false,
378
+ pending: [],
379
+ nextIndex: 0,
380
+ snapshotIndex: -1,
381
+ pendingBytes: 0
382
+ });
383
+ }
384
+
385
+ isActive(actorId: string): boolean {
386
+ return this.active.has(actorId);
387
+ }
388
+
389
+ isProvisional(actorId: string): boolean {
390
+ return this.active.get(actorId)?.phase === 'provisional';
391
+ }
392
+
393
+ promoteProvisional(actorId: string, operationId: string): void {
394
+ const handoff = this.active.get(actorId);
395
+ if (handoff === undefined) {
396
+ throw new Error(`Actor '${actorId}' does not have a provisional packet handoff.`);
397
+ }
398
+ if (handoff.phase !== 'provisional' || handoff.operationId !== operationId) {
399
+ throw new Error(`Actor '${actorId}' packet handoff belongs to another operation.`);
400
+ }
401
+ handoff.phase = 'relocating';
402
+ }
403
+
404
+ sealConnectionBoundIngress(actorId: string): void {
405
+ const handoff = this.active.get(actorId);
406
+ if (handoff !== undefined) handoff.connectionBoundSealed = true;
407
+ }
408
+
409
+ activeSourceOwner(actorId: string): ZLinkActorMessageFollowOwnerFence | undefined {
410
+ return this.active.get(actorId)?.sourceOwner;
411
+ }
412
+
413
+ async releaseDeferred(
414
+ actorId: string,
415
+ operationId: string,
416
+ dispatch?: ZLinkActorHandoffDispatch,
417
+ admission?: ZLinkActorHandoffReplayAdmission
418
+ ): Promise<void> {
419
+ const handoff = this.active.get(actorId);
420
+ if (handoff === undefined) return;
421
+ if (handoff.operationId !== operationId) {
422
+ throw new Error(`Actor '${actorId}' packet handoff belongs to another operation.`);
423
+ }
424
+ await this.releaseHandoff(
425
+ actorId,
426
+ handoff,
427
+ dispatch ?? handoff.replay,
428
+ admission
429
+ );
430
+ }
431
+
432
+ async releaseCanceled(
433
+ actorId: string,
434
+ dispatch: ZLinkActorHandoffDispatch,
435
+ admission?: ZLinkActorHandoffReplayAdmission
436
+ ): Promise<void> {
437
+ const handoff = this.active.get(actorId);
438
+ if (handoff === undefined) return;
439
+ await this.releaseHandoff(actorId, handoff, dispatch, admission);
440
+ }
441
+
442
+ /**
443
+ * Restores a deferred hold as one durable FIFO prefix. The returned
444
+ * admission means every held record is owned by the source/target Actor
445
+ * queue, not that any handler has run.
446
+ *
447
+ * @internal
448
+ */
449
+ admitDeferredPrefix(
450
+ actorId: string,
451
+ operationId: string,
452
+ queue: ZLinkActorHandoffPrefixQueue,
453
+ preparation?: ZLinkActorHandoffReplayPreparation,
454
+ start: Promise<void> = Promise.resolve()
455
+ ): ZLinkActorHandoffPrefixAdmission {
456
+ const handoff = this.active.get(actorId);
457
+ if (handoff === undefined) return { terminal: Promise.resolve() };
458
+ if (handoff.operationId !== operationId) {
459
+ throw new Error(`Actor '${actorId}' packet handoff belongs to another operation.`);
460
+ }
461
+ return this.admitHandoffPrefix(actorId, handoff, queue, preparation, start);
462
+ }
463
+
464
+ /** @internal Restores a canceled relocation hold as one Actor FIFO prefix. */
465
+ admitCanceledPrefix(
466
+ actorId: string,
467
+ queue: ZLinkActorHandoffPrefixQueue,
468
+ preparation?: ZLinkActorHandoffReplayPreparation,
469
+ start: Promise<void> = Promise.resolve()
470
+ ): ZLinkActorHandoffPrefixAdmission {
471
+ const handoff = this.active.get(actorId);
472
+ if (handoff === undefined) return { terminal: Promise.resolve() };
473
+ return this.admitHandoffPrefix(actorId, handoff, queue, preparation, start);
474
+ }
475
+
476
+ private admitHandoffPrefix(
477
+ actorId: string,
478
+ handoff: ActiveHandoff,
479
+ queue: ZLinkActorHandoffPrefixQueue,
480
+ preparation: ZLinkActorHandoffReplayPreparation | undefined,
481
+ start: Promise<void>
482
+ ): ZLinkActorHandoffPrefixAdmission {
483
+ if (handoff.releaseTask !== undefined) {
484
+ return { terminal: handoff.releaseTask };
485
+ }
486
+ handoff.phase = 'releasing';
487
+ let resolveTerminal!: () => void;
488
+ let rejectTerminal!: (reason: unknown) => void;
489
+ const terminal = new Promise<void>((resolve, reject) => {
490
+ resolveTerminal = resolve;
491
+ rejectTerminal = reject;
492
+ });
493
+ const release: ActivePrefixRelease = {
494
+ queue,
495
+ preparation,
496
+ start,
497
+ startOpen: false,
498
+ cursor: 0,
499
+ inFlight: 0,
500
+ errors: [],
501
+ terminal,
502
+ resolve: resolveTerminal,
503
+ reject: rejectTerminal
504
+ };
505
+ handoff.prefixRelease = release;
506
+ handoff.releaseTask = terminal;
507
+ void start.then(
508
+ () => {
509
+ release.startOpen = true;
510
+ this.finishPrefixReleaseIfIdle(actorId, handoff, release);
511
+ },
512
+ error => {
513
+ release.startOpen = true;
514
+ if (handoff.pending.length === 0) release.errors.push(error);
515
+ this.finishPrefixReleaseIfIdle(actorId, handoff, release);
516
+ }
517
+ );
518
+ try {
519
+ this.admitPendingPrefix(actorId, handoff, release);
520
+ } catch (error) {
521
+ // The synchronous caller receives the admission error directly. Observe
522
+ // the shared terminal as well so this path cannot create an unhandled
523
+ // rejection before the relocation rollback reports the original error.
524
+ void terminal.catch(() => undefined);
525
+ this.finishPrefixReleaseIfIdle(actorId, handoff, release);
526
+ throw error;
527
+ }
528
+ return { terminal };
529
+ }
530
+
531
+ private admitPendingPrefix(
532
+ actorId: string,
533
+ handoff: ActiveHandoff,
534
+ release: ActivePrefixRelease
535
+ ): void {
536
+ if (release.cursor >= handoff.pending.length) return;
537
+ const begin = release.cursor;
538
+ const end = handoff.pending.length;
539
+ const pending = handoff.pending.slice(begin, end);
540
+ let admitted: ZLinkActorHandoffPrefixAdmission;
541
+ try {
542
+ admitted = release.queue(pending.map(record =>
543
+ this.createPrefixRecord(record, release)));
544
+ } catch (error) {
545
+ this.failUnqueuedPrefix(handoff, release, error);
546
+ throw error;
547
+ }
548
+ release.cursor = end;
549
+ release.inFlight += 1;
550
+ void admitted.terminal.then(
551
+ () => this.completePrefixBatch(actorId, handoff, release),
552
+ error => {
553
+ release.errors.push(error);
554
+ this.completePrefixBatch(actorId, handoff, release);
555
+ }
556
+ );
557
+ }
558
+
559
+ private createPrefixRecord(
560
+ pending: PendingPacket,
561
+ release: ActivePrefixRelease
562
+ ): ZLinkActorHandoffPrefixRecord {
563
+ let prepared: ZLinkActorHandoffPreparedReplayAdmission | undefined;
564
+ const cancel = (): void => {
565
+ prepared?.cancel();
566
+ prepared = undefined;
567
+ };
568
+ return {
569
+ payloadBytes: packetBytes(pending.packet),
570
+ preparation: {
571
+ prepare: async signal => {
572
+ try {
573
+ await waitForHandoffReplayStart(release.start, signal);
574
+ if (release.preparation !== undefined) {
575
+ const next = await release.preparation(signal);
576
+ if (signal.aborted) {
577
+ next.cancel();
578
+ throw signal.reason;
579
+ }
580
+ prepared = next;
581
+ }
582
+ } catch (error) {
583
+ if (!signal.aborted) this.failReleasedPending(pending, error);
584
+ throw error;
585
+ }
586
+ },
587
+ cancel
588
+ },
589
+ drain: async replay => {
590
+ const admission = prepared === undefined
591
+ ? undefined
592
+ : <T>(operation: () => Promise<T>) => prepared!.run(operation);
593
+ try {
594
+ await this.replayReleasedPending(pending, replay, admission);
595
+ } finally {
596
+ cancel();
597
+ }
598
+ }
599
+ };
600
+ }
601
+
602
+ private completePrefixBatch(
603
+ actorId: string,
604
+ handoff: ActiveHandoff,
605
+ release: ActivePrefixRelease
606
+ ): void {
607
+ release.inFlight -= 1;
608
+ if (release.inFlight === 0 && release.cursor < handoff.pending.length) {
609
+ try {
610
+ this.admitPendingPrefix(actorId, handoff, release);
611
+ } catch {
612
+ // admitPendingPrefix recorded the exact error and rejected every
613
+ // request that never reached the Actor FIFO.
614
+ }
615
+ }
616
+ this.finishPrefixReleaseIfIdle(actorId, handoff, release);
617
+ }
618
+
619
+ private finishPrefixReleaseIfIdle(
620
+ actorId: string,
621
+ handoff: ActiveHandoff,
622
+ release: ActivePrefixRelease
623
+ ): void {
624
+ if (!release.startOpen
625
+ || release.inFlight !== 0
626
+ || release.cursor !== handoff.pending.length) return;
627
+ if (handoff.prefixRelease === release) handoff.prefixRelease = undefined;
628
+ if (this.active.get(actorId) === handoff) this.active.delete(actorId);
629
+ if (release.errors.length === 0) {
630
+ release.resolve();
631
+ } else if (release.errors.length === 1) {
632
+ release.reject(release.errors[0]);
633
+ } else {
634
+ release.reject(new AggregateError(
635
+ release.errors,
636
+ `Actor '${actorId}' durable prefix replay failed.`
637
+ ));
638
+ }
639
+ }
640
+
641
+ private failUnqueuedPrefix(
642
+ handoff: ActiveHandoff,
643
+ release: ActivePrefixRelease,
644
+ error: unknown
645
+ ): void {
646
+ release.errors.push(error);
647
+ for (let index = release.cursor; index < handoff.pending.length; index += 1) {
648
+ this.failReleasedPending(handoff.pending[index]!, error);
649
+ }
650
+ release.cursor = handoff.pending.length;
651
+ }
652
+
653
+ private async releaseHandoff(
654
+ actorId: string,
655
+ handoff: ActiveHandoff,
656
+ replay: ZLinkActorHandoffDispatch | undefined,
657
+ admission?: ZLinkActorHandoffReplayAdmission
658
+ ): Promise<void> {
659
+ if (handoff.releaseTask !== undefined) {
660
+ await handoff.releaseTask;
661
+ return;
662
+ }
663
+ // Keep the hold installed while each record obtains a fresh application
664
+ // permit. Arrivals appended during an awaited replay remain behind the
665
+ // frozen prefix, and the final active-map removal is atomic with observing
666
+ // the drained tail. A shared task makes duplicate release callbacks join
667
+ // the same drain instead of replaying a record twice.
668
+ handoff.phase = 'releasing';
669
+ const releaseTask = Promise.resolve().then(
670
+ () => this.replayReleasedBacklog(actorId, handoff, replay, admission)
671
+ );
672
+ handoff.releaseTask = releaseTask;
673
+ await releaseTask;
674
+ }
675
+
676
+ private async replayReleasedBacklog(
677
+ actorId: string,
678
+ handoff: ActiveHandoff,
679
+ replay: ZLinkActorHandoffDispatch | undefined,
680
+ admission?: ZLinkActorHandoffReplayAdmission
681
+ ): Promise<void> {
682
+ try {
683
+ if (handoff.pending.length === 0) return;
684
+ if (replay === undefined) {
685
+ const error = new Error(`Actor '${actorId}' provisional packet handoff has no replay target.`);
686
+ for (const pending of handoff.pending) {
687
+ if (pending.packet.source !== undefined) {
688
+ this.removeReplyRoute(pending.packet.source.replyRouteId);
689
+ }
690
+ pending.reject?.(error);
691
+ }
692
+ throw error;
693
+ }
694
+ let cursor = 0;
695
+ const oneWayErrors: unknown[] = [];
696
+ while (cursor < handoff.pending.length) {
697
+ const pending = handoff.pending[cursor++];
698
+ try {
699
+ await this.replayReleasedPending(pending, replay, admission);
700
+ } catch (error) {
701
+ oneWayErrors.push(error);
702
+ }
703
+ }
704
+ if (oneWayErrors.length === 1) throw oneWayErrors[0];
705
+ if (oneWayErrors.length > 1) {
706
+ throw new AggregateError(oneWayErrors, `Actor '${actorId}' handoff replay failed.`);
707
+ }
708
+ } finally {
709
+ if (this.active.get(actorId) === handoff) {
710
+ this.active.delete(actorId);
711
+ }
712
+ }
713
+ }
714
+
715
+ private async replayReleasedPending(
716
+ pending: PendingPacket,
717
+ replay: ZLinkActorHandoffDispatch,
718
+ admission?: ZLinkActorHandoffReplayAdmission
719
+ ): Promise<void> {
720
+ const results = await replayActorHandoffBacklog(
721
+ [pending.packet],
722
+ (parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef) => {
723
+ const operation = () => replay(
724
+ parts,
725
+ returnResponse,
726
+ remoteBoundSessionTarget,
727
+ fallbackActorRef
728
+ );
729
+ return admission === undefined ? operation() : admission(operation);
730
+ }
731
+ );
732
+ if (pending.packet.source !== undefined) {
733
+ this.removeReplyRoute(pending.packet.source.replyRouteId);
734
+ }
735
+ const result = results[0]!;
736
+ if (result.ok === true) {
737
+ pending.resolve?.(result.response);
738
+ return;
739
+ }
740
+ const error = result.errorKind === undefined
741
+ ? new Error(result.error ?? 'Actor provisional packet replay failed.')
742
+ : createInternalFrameworkException(
743
+ result.errorKind,
744
+ result.error ?? 'Actor provisional packet replay failed.'
745
+ );
746
+ if (pending.reject !== undefined) {
747
+ pending.reject(error);
748
+ return;
749
+ }
750
+ throw error;
751
+ }
752
+
753
+ private failReleasedPending(pending: PendingPacket, error: unknown): void {
754
+ if (pending.packet.source !== undefined) {
755
+ this.removeReplyRoute(pending.packet.source.replyRouteId);
756
+ }
757
+ pending.reject?.(error);
758
+ }
759
+
760
+ cancel(actorId: string): void {
761
+ const handoff = this.active.get(actorId);
762
+ if (handoff === undefined) return;
763
+ if (handoff.phase === 'releasing') return;
764
+ this.active.delete(actorId);
765
+ const error = new Error(`Actor '${actorId}' transfer was canceled.`);
766
+ for (const pending of handoff.pending) {
767
+ if (pending.packet.source !== undefined) {
768
+ this.removeReplyRoute(pending.packet.source.replyRouteId);
769
+ }
770
+ pending.reject?.(error);
771
+ }
772
+ }
773
+
774
+ capture(
775
+ actorId: string,
776
+ parts: readonly Message[],
777
+ returnResponse = false,
778
+ remoteBoundSessionTarget?: ZLinkRemoteBoundSessionTarget,
779
+ fallbackActorRef?: ActorRef,
780
+ deadlineUnixMs?: number,
781
+ messageFollowOrigin?: ZLinkMessageFollowOrigin,
782
+ provisionalReplay?: ZLinkActorHandoffDispatch
783
+ ): Promise<unknown> | undefined {
784
+ const incomingContext = actorMessageFollowContext(fallbackActorRef);
785
+ const originalDeadlineUnixMs = deadlineUnixMs
786
+ ?? incomingContext?.deadlineUnixMs
787
+ ?? packetDeadlineUnixMs(parts);
788
+ const handoff = this.active.get(actorId);
789
+ if (handoff !== undefined) {
790
+ if (parts.length < 2) return Promise.resolve(undefined);
791
+ if (handoff.connectionBoundSealed && !returnResponse && remoteBoundSessionTarget !== undefined) {
792
+ // The Session route seal already fixed the accepted high water. A
793
+ // send whose lifetime is only the Session connection can no longer
794
+ // drain here and must never enter the durable frozen journal, so the
795
+ // Session owner keeps redelivery ownership of it.
796
+ return Promise.reject(actorMoving(actorId));
797
+ }
798
+ if (handoff.phase === 'provisional' && handoff.replay === undefined) {
799
+ handoff.replay = provisionalReplay;
800
+ }
801
+ const context = incomingContext ?? this.createInitialIngressContext(
802
+ handoff.sourceOwner,
803
+ handoff.oldGeneration,
804
+ parts,
805
+ returnResponse,
806
+ originalDeadlineUnixMs
807
+ );
808
+ try {
809
+ this.validateContext(actorId, context, parts, returnResponse, fallbackActorRef);
810
+ } catch (error) {
811
+ return Promise.reject(error);
812
+ }
813
+ const packet = encodePacket(
814
+ handoff.nextIndex++,
815
+ parts,
816
+ returnResponse,
817
+ remoteBoundSessionTarget,
818
+ fallbackActorRef,
819
+ context,
820
+ messageFollowOrigin
821
+ );
822
+ handoff.pendingBytes += packetBytes(packet);
823
+ this.options.onMarker?.('handoff_backlog', actorId, packet.index);
824
+ if (returnResponse) {
825
+ this.reportRequestFrame(actorId, packet);
826
+ }
827
+ if (!returnResponse) {
828
+ handoff.pending.push({ packet });
829
+ // The durable handoff now owns this record. Return the ingress permit
830
+ // before waiting for a later replay, which must acquire its own fresh
831
+ // application-job permit.
832
+ releaseApplicationJobPermitForDurableHandoff();
833
+ if (handoff.prefixRelease !== undefined) {
834
+ try {
835
+ this.admitPendingPrefix(actorId, handoff, handoff.prefixRelease);
836
+ } catch (error) {
837
+ this.finishPrefixReleaseIfIdle(actorId, handoff, handoff.prefixRelease);
838
+ return Promise.reject(error);
839
+ }
840
+ }
841
+ return Promise.resolve(undefined);
842
+ }
843
+ const result = new Promise((resolve, reject) => {
844
+ const source = this.captureRequestSource(
845
+ handoff.sourceEvidence,
846
+ context.replyRouteId
847
+ );
848
+ const requestPacket = { ...packet, source };
849
+ const route: ReplyRoute = {
850
+ actorId,
851
+ operationId: requestPacket.messageFollowContext.operationId,
852
+ source,
853
+ sourceEvidence: handoff.sourceEvidence,
854
+ sourceOwner: handoff.sourceOwner,
855
+ resolve,
856
+ reject,
857
+ delivered: false
858
+ };
859
+ route.deadline = setTimeout(() => {
860
+ if (this.replyRoutes.get(source.replyRouteId) !== route) return;
861
+ this.replyRoutes.delete(source.replyRouteId);
862
+ if (!route.delivered) route.reject(new Error('Relocation reply route retention expired.'));
863
+ }, RELOCATION_REPLY_RETENTION_MS);
864
+ route.deadline.unref();
865
+ this.replyRoutes.set(source.replyRouteId, route);
866
+ handoff.pending.push({ packet: requestPacket, resolve, reject });
867
+ });
868
+ releaseApplicationJobPermitForDurableHandoff();
869
+ if (handoff.prefixRelease !== undefined) {
870
+ try {
871
+ this.admitPendingPrefix(actorId, handoff, handoff.prefixRelease);
872
+ } catch {
873
+ // failUnqueuedPrefix rejected this request with the exact queue
874
+ // admission error and finish below closes the shared release.
875
+ this.finishPrefixReleaseIfIdle(actorId, handoff, handoff.prefixRelease);
876
+ }
877
+ }
878
+ return result;
879
+ }
880
+
881
+ const followRoute = this.findMessageFollowRoute(actorId, incomingContext);
882
+ const staleGeneration = fallbackActorRef?.objectGeneration;
883
+ if (
884
+ fallbackActorRef !== undefined
885
+ && this.options.isCurrentActorRef?.(actorId, fallbackActorRef) === true
886
+ ) {
887
+ if (incomingContext !== undefined) {
888
+ this.validateContext(
889
+ actorId,
890
+ incomingContext,
891
+ parts,
892
+ returnResponse,
893
+ fallbackActorRef
894
+ );
895
+ const currentFence = this.options.currentOwnerFence?.(actorId);
896
+ if (currentFence !== undefined
897
+ && !messageFollowOwnerFencesEqual(
898
+ incomingContext.targetOwner,
899
+ currentFence
900
+ )) {
901
+ // A relocation round trip (A→B→A) keeps the ObjectGeneration, so a
902
+ // context resolved against a departed tenure still addresses this
903
+ // node while the current tenure holds strictly newer authority
904
+ // fences. The departed fence keeps its exact-fence Message Follow
905
+ // chain: relay through it instead of a terminal stale verdict.
906
+ if (followRoute !== undefined) {
907
+ if (performance.now() >= followRoute.expiresAt) {
908
+ this.removeMessageFollowRoute(followRoute);
909
+ this.options.onMarker?.('message_follow_rejected', actorId);
910
+ return Promise.reject(actorLocationStale(actorId));
911
+ }
912
+ const packet = encodePacket(
913
+ 0,
914
+ parts,
915
+ returnResponse,
916
+ remoteBoundSessionTarget,
917
+ fallbackActorRef,
918
+ incomingContext,
919
+ messageFollowOrigin
920
+ );
921
+ return this.enqueueMessageFollow(followRoute, actorId, packet);
922
+ }
923
+ this.options.onMarker?.('message_follow_rejected', actorId);
924
+ return Promise.reject(actorLocationStale(actorId));
925
+ }
926
+ }
927
+ return undefined;
928
+ }
929
+ if (
930
+ incomingContext === undefined
931
+ && fallbackActorRef !== undefined
932
+ && this.hasMessageFollowRouteForStaleRef(actorId, fallbackActorRef)
933
+ ) {
934
+ this.options.onMarker?.('message_follow_rejected', actorId);
935
+ return Promise.reject(actorLocationStale(actorId));
936
+ }
937
+ if (
938
+ followRoute === undefined
939
+ &&
940
+ staleGeneration !== undefined
941
+ && this.staleGenerations.get(actorId)?.has(staleGeneration) === true
942
+ && fallbackActorRef !== undefined
943
+ && this.isKnownStaleRef(actorId, fallbackActorRef)
944
+ ) {
945
+ this.options.onMarker?.('message_follow_expired', actorId);
946
+ return Promise.reject(actorLocationStale(actorId));
947
+ }
948
+ if (followRoute === undefined) {
949
+ if (fallbackActorRef !== undefined && this.isKnownStaleRef(actorId, fallbackActorRef)) {
950
+ this.options.onMarker?.('message_follow_rejected', actorId);
951
+ return Promise.reject(actorLocationStale(actorId));
952
+ }
953
+ return undefined;
954
+ }
955
+ if (performance.now() >= followRoute.expiresAt) {
956
+ this.removeMessageFollowRoute(followRoute);
957
+ this.options.onMarker?.('message_follow_rejected', actorId);
958
+ return Promise.reject(actorLocationStale(actorId));
959
+ }
960
+ if (incomingContext === undefined) {
961
+ this.options.onMarker?.('message_follow_rejected', actorId);
962
+ return Promise.reject(actorLocationStale(actorId));
963
+ }
964
+ const context = incomingContext;
965
+ try {
966
+ this.validateContext(actorId, context, parts, returnResponse, fallbackActorRef);
967
+ } catch (error) {
968
+ return Promise.reject(error);
969
+ }
970
+ const packet = encodePacket(
971
+ 0,
972
+ parts,
973
+ returnResponse,
974
+ remoteBoundSessionTarget,
975
+ fallbackActorRef,
976
+ context,
977
+ messageFollowOrigin
978
+ );
979
+ return this.enqueueMessageFollow(followRoute, actorId, packet);
980
+ }
981
+
982
+ snapshot(actorId: string): readonly ZLinkActorHandoffPacket[] {
983
+ const handoff = this.requireActive(actorId);
984
+ handoff.snapshotIndex = handoff.pending.length - 1;
985
+ return handoff.pending.map((entry) => entry.packet);
986
+ }
987
+
988
+ snapshotCoreBacklog(actorId: string): readonly ZLinkActorHandoffPacket[] {
989
+ const handoff = this.requireActive(actorId);
990
+ let snapshotIndex = -1;
991
+ while (
992
+ snapshotIndex + 1 < handoff.pending.length
993
+ && handoff.pending[snapshotIndex + 1].packet.returnResponse === false
994
+ ) {
995
+ snapshotIndex++;
996
+ }
997
+ handoff.snapshotIndex = snapshotIndex;
998
+ return handoff.pending.slice(0, snapshotIndex + 1).map((entry) => entry.packet);
999
+ }
1000
+
1001
+ /**
1002
+ * Freezes the post-capture ingress segment immediately before the caller
1003
+ * appends the one-way cutover on the same relocation lane. Records returned
1004
+ * here become part of the transferred prefix and are therefore excluded
1005
+ * from the later Message Follow tail.
1006
+ */
1007
+ takeRelocationRelay(actorId: string): readonly ZLinkActorHandoffPacket[] {
1008
+ const handoff = this.requireActive(actorId);
1009
+ const first = handoff.snapshotIndex + 1;
1010
+ handoff.snapshotIndex = handoff.pending.length - 1;
1011
+ return handoff.pending.slice(first).map(entry => entry.packet);
1012
+ }
1013
+
1014
+ complete(
1015
+ actorId: string,
1016
+ target: ZLinkSpotRouteTarget,
1017
+ targetActorRef: ActorRef,
1018
+ results: readonly ZLinkActorHandoffResult[],
1019
+ targetOwnerFence: ZLinkActorMessageFollowOwnerFence
1020
+ ): void {
1021
+ const handoff = this.requireActive(actorId);
1022
+ const committedTargetOwner = requireExactTargetOwnerFence(actorId, targetOwnerFence);
1023
+ this.active.delete(actorId);
1024
+ const byIndex = new Map(results.map((result) => [result.index, result]));
1025
+ for (let i = 0; i <= handoff.snapshotIndex; i++) {
1026
+ const pending = handoff.pending[i];
1027
+ if (pending.packet.source !== undefined) continue;
1028
+ const result = byIndex.get(pending.packet.index);
1029
+ if (result?.ok === false) {
1030
+ pending.reject?.(new Error(result.error ?? 'Actor handoff replay failed.'));
1031
+ } else if (result === undefined && pending.resolve !== undefined) {
1032
+ pending.reject?.(new Error(`Actor handoff reply '${pending.packet.index}' was not returned by the target.`));
1033
+ } else {
1034
+ pending.resolve?.(result?.response);
1035
+ }
1036
+ }
1037
+
1038
+ const followRoute = this.installMessageFollowRoute(
1039
+ actorId,
1040
+ handoff.oldGeneration,
1041
+ handoff.oldNodeRid,
1042
+ handoff.oldNodeRidHex,
1043
+ handoff.sourceOwner,
1044
+ committedTargetOwner,
1045
+ target,
1046
+ targetActorRef
1047
+ );
1048
+ for (const pending of handoff.pending) {
1049
+ const source = pending.packet.source;
1050
+ if (source === undefined) continue;
1051
+ const route = this.replyRoutes.get(source.replyRouteId);
1052
+ if (route !== undefined) {
1053
+ route.targetNodeRid = target.targetNodeRid;
1054
+ route.targetAuthorityOwnerGeneration = BigInt(
1055
+ committedTargetOwner.authorityOwnerGeneration
1056
+ );
1057
+ }
1058
+ }
1059
+ for (let i = handoff.snapshotIndex + 1; i < handoff.pending.length; i++) {
1060
+ const pending = handoff.pending[i];
1061
+ if (pending.packet.source !== undefined) {
1062
+ this.removeReplyRoute(pending.packet.source.replyRouteId);
1063
+ }
1064
+ void this.enqueueMessageFollow(followRoute, actorId, pending.packet)
1065
+ .then(
1066
+ value => {
1067
+ pending.resolve?.(value);
1068
+ },
1069
+ error => {
1070
+ pending.reject?.(error);
1071
+ }
1072
+ );
1073
+ }
1074
+ }
1075
+
1076
+ messageFollowCount(actorId?: string): number {
1077
+ return actorId === undefined
1078
+ ? this.messageFollowRoutes.size
1079
+ : [...this.messageFollowRoutes.values()]
1080
+ .filter(route => route.targetActorRef.actorId === actorId).length;
1081
+ }
1082
+
1083
+ pendingCount(actorId: string): number {
1084
+ return this.active.get(actorId)?.pending.length ?? 0;
1085
+ }
1086
+
1087
+ isKnownStale(actor: ActorRef): boolean {
1088
+ return this.messageFollowCount(actor.actorId) === 0
1089
+ && this.options.isCurrentActorRef?.(actor.actorId, actor) !== true
1090
+ && this.isKnownStaleRef(actor.actorId, actor);
1091
+ }
1092
+
1093
+ recordStaleFailure(actorId: string): void {
1094
+ this.options.onMarker?.('message_follow_rejected', actorId);
1095
+ }
1096
+
1097
+ acceptRelocatedTerminal(
1098
+ actorId: string,
1099
+ packet: ZLinkActorHandoffPacket,
1100
+ result: ZLinkActorHandoffResult,
1101
+ sourceNodeRid: RoutingId,
1102
+ targetAuthorityOwnerGeneration: bigint | undefined
1103
+ ): ZLinkActorHandoffTerminalAck {
1104
+ const source = packet.source;
1105
+ if (source === undefined || source.replyRouteId.length === 0) return 'notAcknowledged';
1106
+ const route = this.replyRoutes.get(source.replyRouteId);
1107
+ if (route === undefined
1108
+ || packet.messageFollowContext.objectGeneration
1109
+ !== route.sourceEvidence.objectGeneration.toString()
1110
+ || !messageFollowOwnerFencesEqual(
1111
+ packet.messageFollowContext.targetOwner,
1112
+ route.sourceOwner
1113
+ )) {
1114
+ return 'notAcknowledged';
1115
+ }
1116
+ return this.acceptRelocatedTerminalRelay(
1117
+ packet.messageFollowContext.operationId,
1118
+ source.replyRouteId,
1119
+ source,
1120
+ result,
1121
+ sourceNodeRid,
1122
+ targetAuthorityOwnerGeneration,
1123
+ actorId
1124
+ ).status;
1125
+ }
1126
+
1127
+ acceptRelocatedTerminalRelay(
1128
+ operationId: string,
1129
+ replyRouteId: string,
1130
+ source: ZLinkActorHandoffRequestSource | undefined,
1131
+ result: ZLinkActorHandoffResult,
1132
+ sourceNodeRid: RoutingId,
1133
+ targetAuthorityOwnerGeneration: bigint | undefined,
1134
+ actorId?: string
1135
+ ): ZLinkActorHandoffTerminalAcceptance {
1136
+ if (replyRouteId.length === 0) return { status: 'notAcknowledged' };
1137
+ const route = this.replyRoutes.get(replyRouteId);
1138
+ if (route === undefined) return { status: 'notAcknowledged' };
1139
+ const exactSource = source ?? route.source;
1140
+ if (!requestSourcesEqual(route.source, exactSource)
1141
+ || (actorId !== undefined && route.actorId !== actorId)
1142
+ || route.operationId !== operationId
1143
+ || route.targetNodeRid === undefined
1144
+ || !routingIdsEqual(route.targetNodeRid, sourceNodeRid)
1145
+ || route.targetAuthorityOwnerGeneration === undefined
1146
+ || (targetAuthorityOwnerGeneration !== undefined
1147
+ && route.targetAuthorityOwnerGeneration !== targetAuthorityOwnerGeneration)) {
1148
+ return { status: 'notAcknowledged' };
1149
+ }
1150
+ try {
1151
+ if (this.options.validateReplySource(route.sourceEvidence) !== true) {
1152
+ return { status: 'notAcknowledged' };
1153
+ }
1154
+ } catch {
1155
+ return { status: 'notAcknowledged' };
1156
+ }
1157
+ if (route.delivered) {
1158
+ return { status: 'alreadyTerminal', source: terminalRequestSource(route) };
1159
+ }
1160
+ route.delivered = true;
1161
+ if (result.ok) {
1162
+ route.resolve(result.response);
1163
+ } else if (result.errorKind === ZLinkFrameworkInternalErrorKind.DeadlineExceeded) {
1164
+ route.reject(actorDeadlineExceeded(route.actorId));
1165
+ } else {
1166
+ route.reject(new Error(result.error ?? 'Actor handoff replay failed.'));
1167
+ }
1168
+ return { status: 'terminalReceived', source: terminalRequestSource(route) };
1169
+ }
1170
+
1171
+ private captureRequestSource(
1172
+ source: ReplySourceEvidence,
1173
+ replyRouteId?: string
1174
+ ): ZLinkActorHandoffRequestSource {
1175
+ if (replyRouteId === undefined) {
1176
+ this.nextReplyRouteId += 1n;
1177
+ replyRouteId = this.nextReplyRouteId.toString();
1178
+ }
1179
+ return {
1180
+ ownerId: source.ownerId,
1181
+ ownerLeaseGeneration: source.ownerLeaseGeneration.toString(),
1182
+ nodeRid: source.nodeRid,
1183
+ nodeGeneration: source.nodeGeneration.toString(),
1184
+ replyRouteId
1185
+ };
1186
+ }
1187
+
1188
+ private removeReplyRoute(replyRouteId: string): void {
1189
+ const route = this.replyRoutes.get(replyRouteId);
1190
+ if (route === undefined) return;
1191
+ if (route.deadline !== undefined) clearTimeout(route.deadline);
1192
+ this.replyRoutes.delete(replyRouteId);
1193
+ }
1194
+
1195
+ private reportRequestFrame(actorId: string, packet: ZLinkActorHandoffPacket): void {
1196
+ try {
1197
+ const header = decodeStreamHeader(Buffer.from(packet.header, 'base64'));
1198
+ this.options.onRequestFrame?.(actorId, packet.index, header.requestSeq, header.flags);
1199
+ } catch {
1200
+ // Evidence collection must not change how a malformed packet is replayed and rejected.
1201
+ }
1202
+ }
1203
+
1204
+ private requireActive(actorId: string): ActiveHandoff {
1205
+ const handoff = this.active.get(actorId);
1206
+ if (handoff === undefined) throw new Error(`Actor '${actorId}' does not have an active packet handoff.`);
1207
+ return handoff;
1208
+ }
1209
+
1210
+ private installMessageFollowRoute(
1211
+ actorId: string,
1212
+ oldGeneration: bigint,
1213
+ oldNodeRid: string | undefined,
1214
+ oldNodeRidHex: string | undefined,
1215
+ sourceOwner: ZLinkActorMessageFollowOwnerFence,
1216
+ targetOwner: ZLinkActorMessageFollowOwnerFence,
1217
+ target: ZLinkSpotRouteTarget,
1218
+ targetActorRef: ActorRef
1219
+ ): MessageFollowRoute {
1220
+ const departedAuthorityOwnerGeneration = BigInt(sourceOwner.authorityOwnerGeneration);
1221
+ let stale = this.staleGenerations.get(actorId);
1222
+ if (stale === undefined) {
1223
+ stale = new Map();
1224
+ this.staleGenerations.set(actorId, stale);
1225
+ }
1226
+ const recordedGeneration = stale.get(oldGeneration);
1227
+ if (recordedGeneration === undefined || recordedGeneration < departedAuthorityOwnerGeneration) {
1228
+ stale.set(oldGeneration, departedAuthorityOwnerGeneration);
1229
+ }
1230
+ if (oldNodeRid !== undefined) {
1231
+ let refs = this.staleActorRefs.get(actorId);
1232
+ if (refs === undefined) {
1233
+ refs = new Map();
1234
+ this.staleActorRefs.set(actorId, refs);
1235
+ }
1236
+ const exactRefKey = actorRefEvidenceKey(
1237
+ oldNodeRid,
1238
+ oldNodeRidHex,
1239
+ oldGeneration
1240
+ );
1241
+ const recordedRef = refs.get(exactRefKey);
1242
+ if (recordedRef === undefined || recordedRef < departedAuthorityOwnerGeneration) {
1243
+ refs.set(exactRefKey, departedAuthorityOwnerGeneration);
1244
+ }
1245
+ }
1246
+ const key = messageFollowRouteKey(actorId, oldGeneration, sourceOwner);
1247
+ const previous = this.messageFollowRoutes.get(key);
1248
+ if (previous !== undefined) clearTimeout(previous.deadline);
1249
+ const suppressionFence = actorMessageFollowSuppressionFence(
1250
+ actorId,
1251
+ oldGeneration,
1252
+ sourceOwner,
1253
+ targetOwner
1254
+ );
1255
+ const expiresAt = performance.now() + this.messageFollowDurationMs;
1256
+ const entry = {
1257
+ key,
1258
+ oldGeneration,
1259
+ oldNodeRid,
1260
+ oldNodeRidHex,
1261
+ sourceOwner,
1262
+ targetOwner,
1263
+ target,
1264
+ targetActorRef,
1265
+ suppressionFence,
1266
+ expiresAt,
1267
+ deadline: undefined as unknown as ReturnType<typeof setTimeout>,
1268
+ tail: Promise.resolve(),
1269
+ queuedMessages: 0,
1270
+ queuedBytes: 0,
1271
+ operations: new Map()
1272
+ };
1273
+ entry.deadline = setTimeout(
1274
+ () => this.removeMessageFollowRoute(entry),
1275
+ this.messageFollowDurationMs
1276
+ );
1277
+ entry.deadline.unref();
1278
+ if (previous === undefined) {
1279
+ this.messageFollowSuppression.retainRoute(suppressionFence);
1280
+ } else {
1281
+ this.messageFollowSuppression.replaceRoute(
1282
+ previous.suppressionFence,
1283
+ suppressionFence
1284
+ );
1285
+ }
1286
+ this.messageFollowRoutes.set(key, entry);
1287
+ this.options.onMarker?.('message_follow_registered', actorId, this.messageFollowDurationMs);
1288
+ return entry;
1289
+ }
1290
+
1291
+ private removeMessageFollowRoute(entry: MessageFollowRoute): void {
1292
+ if (this.messageFollowRoutes.get(entry.key) !== entry) return;
1293
+ clearTimeout(entry.deadline);
1294
+ this.messageFollowRoutes.delete(entry.key);
1295
+ this.messageFollowSuppression.expireRoute(entry.suppressionFence);
1296
+ this.pruneStaleTenureRecords(entry);
1297
+ this.options.onMarker?.(
1298
+ 'message_follow_route_removed',
1299
+ entry.targetActorRef.actorId
1300
+ );
1301
+ }
1302
+
1303
+ /**
1304
+ * Stale-tenure records must outlive only the Message Follow window of the
1305
+ * departure that wrote them. A later departure of the same
1306
+ * (nodeRid, objectGeneration) re-records a newer authority generation, so a
1307
+ * record is removed only while it still belongs to this route's departure.
1308
+ */
1309
+ private pruneStaleTenureRecords(entry: MessageFollowRoute): void {
1310
+ const actorId = entry.targetActorRef.actorId;
1311
+ const departedAuthorityOwnerGeneration = BigInt(entry.sourceOwner.authorityOwnerGeneration);
1312
+ const stale = this.staleGenerations.get(actorId);
1313
+ if (stale !== undefined) {
1314
+ const recordedGeneration = stale.get(entry.oldGeneration);
1315
+ if (recordedGeneration !== undefined
1316
+ && recordedGeneration <= departedAuthorityOwnerGeneration) {
1317
+ stale.delete(entry.oldGeneration);
1318
+ }
1319
+ if (stale.size === 0) this.staleGenerations.delete(actorId);
1320
+ }
1321
+ if (entry.oldNodeRid === undefined) return;
1322
+ const refs = this.staleActorRefs.get(actorId);
1323
+ if (refs === undefined) return;
1324
+ const refKey = actorRefEvidenceKey(
1325
+ entry.oldNodeRid,
1326
+ entry.oldNodeRidHex,
1327
+ entry.oldGeneration
1328
+ );
1329
+ const recordedRef = refs.get(refKey);
1330
+ if (recordedRef !== undefined && recordedRef <= departedAuthorityOwnerGeneration) {
1331
+ refs.delete(refKey);
1332
+ }
1333
+ if (refs.size === 0) this.staleActorRefs.delete(actorId);
1334
+ }
1335
+
1336
+ private findMessageFollowRoute(
1337
+ actorId: string,
1338
+ context: ZLinkActorMessageFollowContext | undefined
1339
+ ): MessageFollowRoute | undefined {
1340
+ if (context === undefined) return undefined;
1341
+ return this.messageFollowRoutes.get(messageFollowRouteKey(
1342
+ actorId,
1343
+ BigInt(context.objectGeneration),
1344
+ context.targetOwner
1345
+ ));
1346
+ }
1347
+
1348
+ private hasMessageFollowRouteForStaleRef(actorId: string, actorRef: ActorRef): boolean {
1349
+ return [...this.messageFollowRoutes.values()].some(route =>
1350
+ route.targetActorRef.actorId === actorId
1351
+ && actorRef.objectGeneration === route.oldGeneration
1352
+ && (
1353
+ route.oldNodeRid === undefined
1354
+ || routingIdsEqual(
1355
+ actorRef.nodeRid,
1356
+ messageFollowOwnerNodeRid(route.sourceOwner)
1357
+ )
1358
+ )
1359
+ );
1360
+ }
1361
+
1362
+ private createInitialIngressContext(
1363
+ sourceOwner: ZLinkActorMessageFollowOwnerFence,
1364
+ generation: bigint,
1365
+ parts: readonly Message[],
1366
+ request: boolean,
1367
+ deadlineUnixMs?: number
1368
+ ): ZLinkActorMessageFollowContext {
1369
+ const operationId = createMessageFollowId();
1370
+ return Object.freeze({
1371
+ operationId,
1372
+ objectGeneration: generation.toString(),
1373
+ sourceOwner,
1374
+ targetOwner: sourceOwner,
1375
+ deadlineUnixMs,
1376
+ correlationId: request ? createMessageFollowId() : undefined,
1377
+ replyRouteId: request ? createMessageFollowId() : undefined,
1378
+ request,
1379
+ hopCount: 0,
1380
+ visitedOwners: Object.freeze([messageFollowOwnerFenceKey(sourceOwner)]),
1381
+ payloadChecksumSha256: actorMessageFollowPayloadChecksum(parts)
1382
+ });
1383
+ }
1384
+
1385
+ private validateContext(
1386
+ actorId: string,
1387
+ context: ZLinkActorMessageFollowContext,
1388
+ parts: readonly Message[],
1389
+ request: boolean,
1390
+ actorRef?: ActorRef
1391
+ ): void {
1392
+ if (actorRef !== undefined
1393
+ && context.objectGeneration !== actorRef.objectGeneration.toString()) {
1394
+ throw actorGenerationStale(actorId);
1395
+ }
1396
+ if (context.objectGeneration === '0' || context.request !== request) {
1397
+ throw actorLocationStale(actorId);
1398
+ }
1399
+ if (context.deadlineUnixMs !== undefined
1400
+ && Date.now() >= context.deadlineUnixMs) {
1401
+ throw actorDeadlineExceeded(actorId);
1402
+ }
1403
+ verifyActorMessageFollowPayload(context, parts);
1404
+ }
1405
+
1406
+ private isKnownStaleRef(actorId: string, actor: ActorRef): boolean {
1407
+ const physicalRefs = this.staleActorRefs.get(actorId);
1408
+ if (physicalRefs !== undefined) {
1409
+ const departedAuthorityOwnerGeneration = physicalRefs.get(
1410
+ actorRefKey(actor.nodeRid, actor.objectGeneration)
1411
+ );
1412
+ return departedAuthorityOwnerGeneration !== undefined
1413
+ && !this.isNewerTenureRef(actorId, actor, departedAuthorityOwnerGeneration);
1414
+ }
1415
+ const departedAuthorityOwnerGeneration =
1416
+ this.staleGenerations.get(actorId)?.get(actor.objectGeneration);
1417
+ return departedAuthorityOwnerGeneration !== undefined
1418
+ && !this.isNewerTenureRef(actorId, actor, departedAuthorityOwnerGeneration)
1419
+ && this.options.isStaleActorRef?.(actorId, actor) === true;
1420
+ }
1421
+
1422
+ /**
1423
+ * The stale record captures the departing tenure's full fence. A ref whose
1424
+ * authority fence is strictly newer than the recorded departure addresses a
1425
+ * returning tenure (A→B→A keeps the ObjectGeneration), never the departed
1426
+ * one, so it must not match the stale record.
1427
+ */
1428
+ private isNewerTenureRef(
1429
+ actorId: string,
1430
+ actor: ActorRef,
1431
+ departedAuthorityOwnerGeneration: bigint
1432
+ ): boolean {
1433
+ const tenure = this.tenureAuthorityOwnerGeneration(actorId, actor);
1434
+ return tenure !== undefined && tenure > departedAuthorityOwnerGeneration;
1435
+ }
1436
+
1437
+ private tenureAuthorityOwnerGeneration(
1438
+ actorId: string,
1439
+ actor: ActorRef
1440
+ ): bigint | undefined {
1441
+ const context = actorMessageFollowContext(actor);
1442
+ if (context !== undefined) {
1443
+ return BigInt(context.targetOwner.authorityOwnerGeneration);
1444
+ }
1445
+ const current = this.options.currentOwnerFence?.(actorId);
1446
+ if (current !== undefined && current.nodeRid === String(actor.nodeRid)) {
1447
+ return BigInt(current.authorityOwnerGeneration);
1448
+ }
1449
+ return undefined;
1450
+ }
1451
+
1452
+ private enqueueMessageFollow(
1453
+ entry: MessageFollowRoute,
1454
+ actorId: string,
1455
+ packet: ZLinkActorHandoffPacket
1456
+ ): Promise<unknown> {
1457
+ const context = packet.messageFollowContext;
1458
+ const duplicate = entry.operations.get(context.operationId);
1459
+ if (duplicate !== undefined) {
1460
+ if (duplicate.checksum !== context.payloadChecksumSha256
1461
+ || duplicate.request !== context.request
1462
+ || duplicate.replyRouteId !== context.replyRouteId) {
1463
+ this.options.onMarker?.('message_follow_rejected', actorId);
1464
+ return Promise.reject(actorLocationStale(actorId));
1465
+ }
1466
+ return duplicate.result;
1467
+ }
1468
+ const bytes = packetBytes(packet);
1469
+ if (context.hopCount >= MAX_MESSAGE_FOLLOW_HOPS) {
1470
+ this.options.onMarker?.('message_follow_rejected', actorId);
1471
+ return Promise.reject(actorLocationStale(actorId));
1472
+ }
1473
+ entry.queuedMessages++;
1474
+ entry.queuedBytes += bytes;
1475
+ let resolve!: (value: unknown) => void;
1476
+ let reject!: (reason: unknown) => void;
1477
+ const result = new Promise<unknown>((done, fail) => {
1478
+ resolve = done;
1479
+ reject = fail;
1480
+ });
1481
+ entry.operations.set(context.operationId, {
1482
+ checksum: context.payloadChecksumSha256,
1483
+ request: context.request,
1484
+ replyRouteId: context.replyRouteId,
1485
+ result
1486
+ });
1487
+ entry.tail = entry.tail.then(async () => {
1488
+ try {
1489
+ resolve(await this.relayMessageFollow(actorId, entry, packet));
1490
+ } catch (error) {
1491
+ this.options.onMarker?.('message_follow_rejected', actorId);
1492
+ reject(error);
1493
+ } finally {
1494
+ entry.queuedMessages--;
1495
+ entry.queuedBytes -= bytes;
1496
+ }
1497
+ });
1498
+ return result;
1499
+ }
1500
+
1501
+ private async relayMessageFollow(
1502
+ actorId: string,
1503
+ entry: MessageFollowRoute,
1504
+ packet: ZLinkActorHandoffPacket
1505
+ ): Promise<unknown> {
1506
+ const { target, targetActorRef } = entry;
1507
+ const context = packet.messageFollowContext;
1508
+ let advanced: ZLinkActorMessageFollowContext;
1509
+ try {
1510
+ advanced = advanceActorMessageFollowContext(
1511
+ context,
1512
+ entry.sourceOwner,
1513
+ entry.targetOwner
1514
+ );
1515
+ } catch {
1516
+ throw actorLocationStale(actorId);
1517
+ }
1518
+ const payload = encodeMessageFollowRemoteActorPacketRelayPayload({
1519
+ actorId,
1520
+ routerChannelId: packet.remoteBoundSessionTarget?.routerChannelId,
1521
+ boundSessionTargetNodeRid: packet.remoteBoundSessionTarget?.targetNodeRid,
1522
+ boundSessionSpotId: packet.remoteBoundSessionTarget?.spotId,
1523
+ header: packet.header,
1524
+ payload: packet.payload,
1525
+ actorNodeRid: String(targetActorRef.nodeRid),
1526
+ actorNodeRidHex: encodeRoutingIdStorageHex(targetActorRef.nodeRid),
1527
+ actorGeneration: targetActorRef.objectGeneration.toString(),
1528
+ returnResponse: packet.returnResponse,
1529
+ messageFollowContext: advanced
1530
+ });
1531
+ if (!packet.returnResponse) {
1532
+ await this.options.routedTransport.sendToSpot(target, payload, {
1533
+ packetName: ZLINK_REMOTE_ACTOR_PACKET_RELAY_PACKET
1534
+ });
1535
+ await this.messageFollowRelayed(actorId, entry, packet, advanced);
1536
+ return undefined;
1537
+ }
1538
+ const remainingMs = remainingRequestTime(
1539
+ actorId,
1540
+ packet.messageFollowContext.deadlineUnixMs
1541
+ );
1542
+ if (this.options.routedTransport.requestRawToSpot === undefined) {
1543
+ const reply = await awaitBeforeDeadline(
1544
+ this.options.routedTransport.requestToSpot<Record<string, unknown>>(target, payload, {
1545
+ packetName: ZLINK_REMOTE_ACTOR_PACKET_RELAY_PACKET,
1546
+ timeoutMs: remainingMs ?? this.options.requestTimeoutMs
1547
+ }),
1548
+ actorId,
1549
+ remainingMs
1550
+ );
1551
+ if (reply.ok === false) {
1552
+ throw actorRelayError(actorId, reply.errorKind, reply.error);
1553
+ }
1554
+ await this.messageFollowRelayed(actorId, entry, packet, advanced);
1555
+ return reply.response;
1556
+ }
1557
+ const response = await awaitBeforeDeadline(
1558
+ requestRoutedJsonReply(
1559
+ this.options.routedTransport,
1560
+ target,
1561
+ payload,
1562
+ { timeoutMs: remainingMs ?? this.options.requestTimeoutMs },
1563
+ `Actor Message Follow raw request is not available for '${actorId}'.`,
1564
+ (parts) => {
1565
+ if (parts.length === 0) {
1566
+ throw new Error(`Actor Message Follow reply was empty for '${actorId}'.`);
1567
+ }
1568
+ const reply = JSON.parse(parts[0].getString('utf8')) as {
1569
+ readonly ok?: boolean;
1570
+ readonly response?: unknown;
1571
+ readonly error?: unknown;
1572
+ readonly errorKind?: unknown;
1573
+ };
1574
+ if (reply.ok === false) {
1575
+ throw actorRelayError(actorId, reply.errorKind, reply.error);
1576
+ }
1577
+ return reply.response;
1578
+ }
1579
+ ),
1580
+ actorId,
1581
+ remainingMs
1582
+ );
1583
+ await this.messageFollowRelayed(actorId, entry, packet, advanced);
1584
+ return response;
1585
+ }
1586
+
1587
+ private async messageFollowRelayed(
1588
+ actorId: string,
1589
+ entry: MessageFollowRoute,
1590
+ packet: ZLinkActorHandoffPacket,
1591
+ context: ZLinkActorMessageFollowContext
1592
+ ): Promise<void> {
1593
+ this.options.onMarker?.('message_follow_relay', actorId, undefined, context);
1594
+ if (packet.messageFollowOrigin !== undefined) {
1595
+ const claim = this.messageFollowSuppression.begin(entry.suppressionFence);
1596
+ if (claim === undefined) return;
1597
+ let accepted = false;
1598
+ try {
1599
+ accepted = await this.options.onMessageFollowRelayed?.(
1600
+ actorId,
1601
+ entry.targetActorRef,
1602
+ context,
1603
+ packet.messageFollowOrigin,
1604
+ entry.queuedMessages,
1605
+ entry.queuedBytes
1606
+ ) === true;
1607
+ } catch {
1608
+ accepted = false;
1609
+ }
1610
+ if (accepted) {
1611
+ this.messageFollowSuppression.markSent(claim);
1612
+ } else {
1613
+ this.messageFollowSuppression.abort(claim);
1614
+ }
1615
+ }
1616
+ }
1617
+ }
1618
+
1619
+ function actorMessageFollowSuppressionFence(
1620
+ actorId: string,
1621
+ objectGeneration: bigint,
1622
+ source: ZLinkActorMessageFollowOwnerFence,
1623
+ target: ZLinkActorMessageFollowOwnerFence
1624
+ ): MessageFollowSuppressionFence {
1625
+ return Object.freeze({
1626
+ objectKind: 'actor',
1627
+ logicalObjectId: actorId,
1628
+ objectGeneration: objectGeneration.toString(),
1629
+ sourceNodeRid: source.nodeRid,
1630
+ ...(source.nodeRidHex === undefined ? {} : { sourceNodeRidHex: source.nodeRidHex }),
1631
+ sourceNodeGeneration: source.nodeGeneration,
1632
+ sourceAuthorityOwnerGeneration: source.authorityOwnerGeneration,
1633
+ sourceOwnerLeaseGeneration: source.ownerLeaseGeneration,
1634
+ targetNodeRid: target.nodeRid,
1635
+ ...(target.nodeRidHex === undefined ? {} : { targetNodeRidHex: target.nodeRidHex }),
1636
+ targetNodeGeneration: target.nodeGeneration,
1637
+ targetAuthorityOwnerGeneration: target.authorityOwnerGeneration,
1638
+ targetOwnerLeaseGeneration: target.ownerLeaseGeneration
1639
+ });
1640
+ }
1641
+
1642
+ export function decodeHandoffPacket(packet: ZLinkActorHandoffPacket): {
1643
+ readonly parts: readonly Message[];
1644
+ readonly remoteBoundSessionTarget?: ZLinkRemoteBoundSessionTarget;
1645
+ readonly fallbackActorRef?: ActorRef;
1646
+ } {
1647
+ return {
1648
+ parts: [
1649
+ RuntimeMessage.from(Buffer.from(packet.header, 'base64')) as Message,
1650
+ RuntimeMessage.from(Buffer.from(packet.payload, 'base64')) as Message
1651
+ ],
1652
+ remoteBoundSessionTarget: packet.remoteBoundSessionTarget === undefined
1653
+ ? undefined
1654
+ : {
1655
+ routerChannelId: packet.remoteBoundSessionTarget.routerChannelId,
1656
+ targetNodeRid: packet.remoteBoundSessionTarget.targetNodeRid,
1657
+ spotId: packet.remoteBoundSessionTarget.spotId,
1658
+ bindingGeneration: optionalBigInt(packet.remoteBoundSessionTarget.bindingGeneration),
1659
+ previousAuthorityOwnerGeneration:
1660
+ optionalBigInt(packet.remoteBoundSessionTarget.previousAuthorityOwnerGeneration),
1661
+ previousOwnerLeaseGeneration:
1662
+ optionalBigInt(packet.remoteBoundSessionTarget.previousOwnerLeaseGeneration),
1663
+ relocationSealId: packet.remoteBoundSessionTarget.relocationSealId
1664
+ },
1665
+ fallbackActorRef: packet.fallbackActorRef === undefined
1666
+ ? undefined
1667
+ : attachActorMessageFollowContext({
1668
+ actorId: packet.fallbackActorRef.actorId,
1669
+ objectGeneration: BigInt(packet.fallbackActorRef.objectGeneration),
1670
+ meshName: packet.fallbackActorRef.meshName,
1671
+ nodeRid: packet.fallbackActorRef.nodeRid
1672
+ }, packet.messageFollowContext)
1673
+ };
1674
+ }
1675
+
1676
+ export async function replayActorHandoffBacklog(
1677
+ backlog: readonly ZLinkActorHandoffPacket[],
1678
+ dispatch: (
1679
+ parts: readonly Message[],
1680
+ returnResponse: boolean,
1681
+ remoteBoundSessionTarget?: ZLinkRemoteBoundSessionTarget,
1682
+ fallbackActorRef?: ActorRef
1683
+ ) => Promise<unknown>,
1684
+ onEnqueued?: (index: number) => Promise<void> | void
1685
+ ): Promise<readonly ZLinkActorHandoffResult[]> {
1686
+ const results: ZLinkActorHandoffResult[] = [];
1687
+ for (const packet of backlog) {
1688
+ const decoded = decodeHandoffPacket(packet);
1689
+ try {
1690
+ if (
1691
+ packet.returnResponse
1692
+ && packet.messageFollowContext.deadlineUnixMs !== undefined
1693
+ && Date.now() >= packet.messageFollowContext.deadlineUnixMs
1694
+ ) {
1695
+ throw actorDeadlineExceeded(packet.fallbackActorRef?.actorId ?? 'accepted-handoff');
1696
+ }
1697
+ await onEnqueued?.(packet.index);
1698
+ const response = await dispatch(
1699
+ decoded.parts,
1700
+ packet.returnResponse,
1701
+ decoded.remoteBoundSessionTarget,
1702
+ decoded.fallbackActorRef
1703
+ );
1704
+ results.push({ index: packet.index, ok: true, response });
1705
+ } catch (error) {
1706
+ results.push({
1707
+ index: packet.index,
1708
+ ok: false,
1709
+ error: error instanceof Error ? error.message : String(error),
1710
+ errorKind: error instanceof ZLinkFrameworkException
1711
+ ? internalFrameworkErrorKind(error)
1712
+ : undefined
1713
+ });
1714
+ } finally {
1715
+ decoded.parts.forEach((part) => part.close());
1716
+ }
1717
+ }
1718
+ return results;
1719
+ }
1720
+
1721
+ function encodePacket(
1722
+ index: number,
1723
+ parts: readonly Message[],
1724
+ returnResponse: boolean,
1725
+ remoteBoundSessionTarget?: ZLinkRemoteBoundSessionTarget,
1726
+ fallbackActorRef?: ActorRef,
1727
+ messageFollowContext?: ZLinkActorMessageFollowContext,
1728
+ messageFollowOrigin?: ZLinkMessageFollowOrigin
1729
+ ): ZLinkActorHandoffPacket {
1730
+ if (messageFollowContext === undefined) {
1731
+ throw new Error('Actor handoff packet requires a Message Follow context.');
1732
+ }
1733
+ return {
1734
+ index,
1735
+ header: Buffer.from(parts[0].data()).toString('base64'),
1736
+ payload: Buffer.from(parts[1].data()).toString('base64'),
1737
+ returnResponse,
1738
+ messageFollowContext,
1739
+ ...(messageFollowOrigin === undefined ? {} : { messageFollowOrigin }),
1740
+ remoteBoundSessionTarget: remoteBoundSessionTarget === undefined
1741
+ ? undefined
1742
+ : {
1743
+ routerChannelId: remoteBoundSessionTarget.routerChannelId,
1744
+ targetNodeRid: String(remoteBoundSessionTarget.targetNodeRid),
1745
+ spotId: String(remoteBoundSessionTarget.spotId),
1746
+ bindingGeneration: remoteBoundSessionTarget.bindingGeneration?.toString(),
1747
+ previousAuthorityOwnerGeneration:
1748
+ remoteBoundSessionTarget.previousAuthorityOwnerGeneration?.toString(),
1749
+ previousOwnerLeaseGeneration:
1750
+ remoteBoundSessionTarget.previousOwnerLeaseGeneration?.toString(),
1751
+ relocationSealId: remoteBoundSessionTarget.relocationSealId
1752
+ },
1753
+ fallbackActorRef: fallbackActorRef === undefined
1754
+ ? undefined
1755
+ : {
1756
+ actorId: fallbackActorRef.actorId,
1757
+ objectGeneration: fallbackActorRef.objectGeneration.toString(),
1758
+ meshName: fallbackActorRef.meshName,
1759
+ nodeRid: String(fallbackActorRef.nodeRid)
1760
+ }
1761
+ };
1762
+ }
1763
+
1764
+ function optionalBigInt(value: string | undefined): bigint | undefined {
1765
+ return value === undefined ? undefined : BigInt(value);
1766
+ }
1767
+
1768
+ function packetBytes(packet: ZLinkActorHandoffPacket): number {
1769
+ return Buffer.byteLength(packet.header, 'base64') + Buffer.byteLength(packet.payload, 'base64');
1770
+ }
1771
+
1772
+ function packetDeadlineUnixMs(parts: readonly Message[]): number | undefined {
1773
+ if (parts.length === 0) return undefined;
1774
+ try {
1775
+ return decodeActorRequestDeadlineUnixMs(parts[0].data());
1776
+ } catch {
1777
+ return undefined;
1778
+ }
1779
+ }
1780
+
1781
+ function remainingRequestTime(actorId: string, deadlineUnixMs: number | undefined): number | undefined {
1782
+ if (deadlineUnixMs === undefined) return undefined;
1783
+ const remaining = deadlineUnixMs - Date.now();
1784
+ if (remaining <= 0) throw actorDeadlineExceeded(actorId);
1785
+ return Math.max(1, Math.ceil(remaining));
1786
+ }
1787
+
1788
+ async function awaitBeforeDeadline<T>(
1789
+ operation: Promise<T>,
1790
+ actorId: string,
1791
+ remainingMs: number | undefined
1792
+ ): Promise<T> {
1793
+ if (remainingMs === undefined) return await operation;
1794
+ let timer: ReturnType<typeof setTimeout> | undefined;
1795
+ try {
1796
+ return await Promise.race([
1797
+ operation,
1798
+ new Promise<never>((_resolve, reject) => {
1799
+ timer = setTimeout(() => reject(actorDeadlineExceeded(actorId)), remainingMs);
1800
+ })
1801
+ ]);
1802
+ } finally {
1803
+ if (timer !== undefined) clearTimeout(timer);
1804
+ }
1805
+ }
1806
+
1807
+ async function waitForHandoffReplayStart(
1808
+ start: Promise<void>,
1809
+ signal: AbortSignal
1810
+ ): Promise<void> {
1811
+ if (signal.aborted) throw signal.reason;
1812
+ let abort!: () => void;
1813
+ const aborted = new Promise<never>((_resolve, reject) => {
1814
+ abort = () => reject(signal.reason);
1815
+ signal.addEventListener('abort', abort, { once: true });
1816
+ });
1817
+ try {
1818
+ await Promise.race([start, aborted]);
1819
+ } finally {
1820
+ signal.removeEventListener('abort', abort);
1821
+ }
1822
+ }
1823
+
1824
+ function messageFollowRouteKey(
1825
+ actorId: string,
1826
+ objectGeneration: bigint,
1827
+ sourceOwner: ZLinkActorMessageFollowOwnerFence
1828
+ ): string {
1829
+ return `${actorId}\u0000${objectGeneration}\u0000${messageFollowOwnerFenceKey(sourceOwner)}`;
1830
+ }
1831
+
1832
+ function actorRefKey(nodeRid: ActorRef['nodeRid'], generation: bigint): string {
1833
+ return `${encodeRoutingIdStorageHex(nodeRid)}\u0000${generation}`;
1834
+ }
1835
+
1836
+ function actorRefEvidenceKey(
1837
+ nodeRid: string,
1838
+ nodeRidHex: string | undefined,
1839
+ generation: bigint
1840
+ ): string {
1841
+ return `${nodeRidHex ?? encodeRoutingIdStorageHex(nodeRid)}\u0000${generation}`;
1842
+ }
1843
+
1844
+ function requestSourcesEqual(
1845
+ expected: ZLinkActorHandoffRequestSource,
1846
+ actual: ZLinkActorHandoffRequestSource
1847
+ ): boolean {
1848
+ return expected.replyRouteId === actual.replyRouteId
1849
+ && expected.ownerId === actual.ownerId
1850
+ && expected.ownerLeaseGeneration === actual.ownerLeaseGeneration
1851
+ && expected.nodeRid === actual.nodeRid
1852
+ && expected.nodeGeneration === actual.nodeGeneration
1853
+ && /^[1-9][0-9]*$/.test(actual.ownerLeaseGeneration)
1854
+ && /^[1-9][0-9]*$/.test(actual.nodeGeneration);
1855
+ }
1856
+
1857
+ function terminalRequestSource(route: ReplyRoute): ZLinkActorHandoffRequestSource {
1858
+ return Object.freeze({
1859
+ ...route.source,
1860
+ // The durable packet keeps its legacy text field. The local ACK path can
1861
+ // restore the exact binary RID from the captured owner fence without
1862
+ // changing that packet wire shape.
1863
+ nodeRid: messageFollowOwnerNodeRid(route.sourceOwner)
1864
+ });
1865
+ }
1866
+
1867
+ function actorLocationStale(actorId: string): ZLinkFrameworkException {
1868
+ return createInternalFrameworkException(
1869
+ ZLinkFrameworkInternalErrorKind.ActorLocationStale,
1870
+ `Actor route '${actorId}' is stale after the Message Follow duration.`
1871
+ );
1872
+ }
1873
+
1874
+ function actorGenerationStale(actorId: string): ZLinkFrameworkException {
1875
+ return createInternalFrameworkException(
1876
+ ZLinkFrameworkInternalErrorKind.ActorGenerationStale,
1877
+ `Actor route '${actorId}' carries a different object generation.`
1878
+ );
1879
+ }
1880
+
1881
+ function actorDeadlineExceeded(actorId: string): ZLinkFrameworkException {
1882
+ return createInternalFrameworkException(
1883
+ ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
1884
+ `Actor request '${actorId}' exceeded its original deadline during Message Follow.`
1885
+ );
1886
+ }
1887
+
1888
+ function actorMoving(actorId: string): ZLinkFrameworkException {
1889
+ return createInternalFrameworkException(
1890
+ ZLinkFrameworkInternalErrorKind.ActorMoving,
1891
+ `Actor '${actorId}' bound-session send arrived after its Session route seal.`,
1892
+ true
1893
+ );
1894
+ }
1895
+
1896
+ function actorRelayError(
1897
+ actorId: string,
1898
+ errorKind: unknown,
1899
+ error: unknown
1900
+ ): ZLinkFrameworkException {
1901
+ const kind = Object.values(ZLinkFrameworkInternalErrorKind)
1902
+ .includes(errorKind as ZLinkFrameworkInternalErrorKind)
1903
+ ? errorKind as ZLinkFrameworkInternalErrorKind
1904
+ : ZLinkFrameworkInternalErrorKind.RequestFailed;
1905
+ return createInternalFrameworkException(
1906
+ kind,
1907
+ String(error ?? `Actor Message Follow relay failed for '${actorId}'.`),
1908
+ kind === ZLinkFrameworkInternalErrorKind.ActorMoving
1909
+ || kind === ZLinkFrameworkInternalErrorKind.RouteNotConnected
1910
+ );
1911
+ }