@zlink-systems/framework 0.30.0 → 0.30.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/LICENSE +150 -68
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/contracts/Actors/ZLinkActorClient.d.ts +2 -1
  4. package/dist/contracts/Channels/Calls.d.ts +2 -1
  5. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
  6. package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
  7. package/dist/contracts/Common/ZLinkMessageMetadata.js +11 -5
  8. package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
  9. package/dist/contracts/Common/encoded-payload-storage.js +5 -2
  10. package/dist/contracts/Configuration/Builders.d.ts +1 -1
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
  12. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
  13. package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
  14. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  15. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
  16. package/dist/contracts/Handlers/Attributes.d.ts +5 -13
  17. package/dist/contracts/Handlers/Attributes.js +7 -11
  18. package/dist/contracts/Handlers/JsonContract.d.ts +2 -46
  19. package/dist/contracts/Handlers/JsonContract.js +4 -153
  20. package/dist/contracts/Locations/Rows.d.ts +2 -0
  21. package/dist/contracts/Spots/Contracts.d.ts +6 -1
  22. package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
  23. package/dist/nest-integration.d.ts +1 -1
  24. package/dist/nest-integration.js +2 -1
  25. package/dist/runtime/abort.d.ts +5 -0
  26. package/dist/runtime/abort.js +10 -0
  27. package/dist/runtime/actors/actor-authority-publication.js +3 -2
  28. package/dist/runtime/actors/actor-client.d.ts +1 -2
  29. package/dist/runtime/actors/actor-client.js +52 -57
  30. package/dist/runtime/actors/actor-context.d.ts +2 -0
  31. package/dist/runtime/actors/actor-context.js +46 -9
  32. package/dist/runtime/actors/actor-handoff.d.ts +8 -4
  33. package/dist/runtime/actors/actor-handoff.js +219 -92
  34. package/dist/runtime/actors/actor-join-relocation.d.ts +3 -0
  35. package/dist/runtime/actors/actor-local-native-join.js +13 -12
  36. package/dist/runtime/actors/actor-mailbox.js +27 -1
  37. package/dist/runtime/actors/actor-remote-joiner.js +3 -1
  38. package/dist/runtime/actors/actor-remote-wire.js +15 -0
  39. package/dist/runtime/actors/actor-reply.d.ts +4 -0
  40. package/dist/runtime/actors/actor-reply.js +29 -0
  41. package/dist/runtime/actors/actor-routed-join-transport.d.ts +6 -2
  42. package/dist/runtime/actors/actor-routed-json-request.d.ts +2 -0
  43. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
  44. package/dist/runtime/actors/actor-runtime-state.js +2 -20
  45. package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
  46. package/dist/runtime/actors/index.d.ts +8 -3
  47. package/dist/runtime/actors/index.js +55 -27
  48. package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
  49. package/dist/runtime/actors/session-disconnected-wire.js +48 -0
  50. package/dist/runtime/actors/spot-actor-dispatch.js +2 -2
  51. package/dist/runtime/admission.d.ts +9 -1
  52. package/dist/runtime/admission.js +56 -23
  53. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +6 -8
  54. package/dist/runtime/application-jobs/application-ingress-record-owner.js +39 -22
  55. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +15 -1
  56. package/dist/runtime/application-jobs/application-job-queue-scope.js +61 -20
  57. package/dist/runtime/application-jobs/contracts.d.ts +12 -1
  58. package/dist/runtime/backend/contracts/index.d.ts +37 -12
  59. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
  60. package/dist/runtime/backend/mesh-completion-table.d.ts +9 -1
  61. package/dist/runtime/backend/mesh-completion-table.js +154 -49
  62. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +28 -1
  63. package/dist/runtime/backend/mesh-dispatch-pump.js +208 -101
  64. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +2 -2
  65. package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -9
  66. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +1 -1
  67. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +5 -2
  68. package/dist/runtime/backend/node/node-raw-binding-port.js +124 -72
  69. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +46 -13
  70. package/dist/runtime/backend/node/node-raw-mesh-backend.js +181 -164
  71. package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
  72. package/dist/runtime/backend/node/node-socket-backend-adapter.js +11 -11
  73. package/dist/runtime/backend/raw-binding-port.d.ts +2 -2
  74. package/dist/runtime/backend/runtime-message.d.ts +1 -0
  75. package/dist/runtime/backend/runtime-message.js +5 -0
  76. package/dist/runtime/backend/runtime-values.d.ts +1 -0
  77. package/dist/runtime/backend/runtime-values.js +2 -1
  78. package/dist/runtime/channels/channel-clients.d.ts +2 -0
  79. package/dist/runtime/channels/channel-clients.js +75 -23
  80. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +25 -5
  81. package/dist/runtime/channels/channel-dispatch-pipeline.js +111 -56
  82. package/dist/runtime/channels/channel-dispatch-services.d.ts +1 -0
  83. package/dist/runtime/channels/channel-dispatch-services.js +45 -0
  84. package/dist/runtime/channels/channel-dispatchers.d.ts +4 -3
  85. package/dist/runtime/channels/channel-dispatchers.js +62 -54
  86. package/dist/runtime/channels/channel-envelope-inspection.d.ts +1 -2
  87. package/dist/runtime/channels/channel-envelope-inspection.js +1 -16
  88. package/dist/runtime/channels/channel-envelope.d.ts +2 -0
  89. package/dist/runtime/channels/channel-envelope.js +146 -28
  90. package/dist/runtime/channels/channel-outbound-operations.d.ts +2 -2
  91. package/dist/runtime/channels/channel-outbound-operations.js +8 -8
  92. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
  93. package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
  94. package/dist/runtime/channels/channel-runtime-manager.d.ts +9 -8
  95. package/dist/runtime/channels/channel-runtime-manager.js +16 -16
  96. package/dist/runtime/channels/channel-transports.d.ts +18 -16
  97. package/dist/runtime/channels/channel-transports.js +77 -58
  98. package/dist/runtime/channels/client-server-location-runtime.js +5 -4
  99. package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
  100. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  101. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  102. package/dist/runtime/channels/fanout-location-runtime.js +3 -3
  103. package/dist/runtime/channels/local-spot-route-transport.d.ts +1 -1
  104. package/dist/runtime/channels/local-spot-route-transport.js +2 -1
  105. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +2 -2
  106. package/dist/runtime/channels/router-socket-spot-route-transport.js +4 -4
  107. package/dist/runtime/channels/source-spot-router.d.ts +2 -2
  108. package/dist/runtime/channels/source-spot-router.js +4 -4
  109. package/dist/runtime/channels/spot-node-route-transport.d.ts +2 -2
  110. package/dist/runtime/channels/spot-node-route-transport.js +4 -4
  111. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +2 -2
  112. package/dist/runtime/channels/spot-route-bridge-transport.js +4 -4
  113. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +5 -4
  114. package/dist/runtime/channels/spot-route-dispatch-strategy.js +18 -18
  115. package/dist/runtime/diagnostics/flow-context.js +19 -7
  116. package/dist/runtime/diagnostics/index.js +4 -9
  117. package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
  118. package/dist/runtime/diagnostics/message-flow.js +35 -5
  119. package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
  120. package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
  121. package/dist/runtime/execution/index.d.ts +4 -2
  122. package/dist/runtime/execution/index.js +33 -10
  123. package/dist/runtime/execution/serial-execution-queue.d.ts +5 -0
  124. package/dist/runtime/execution/serial-execution-queue.js +22 -2
  125. package/dist/runtime/execution/state-lane.d.ts +2 -0
  126. package/dist/runtime/execution/state-lane.js +5 -0
  127. package/dist/runtime/foundation/actor-join-recovery-codec.js +2 -2
  128. package/dist/runtime/foundation/durable-service-request.d.ts +14 -0
  129. package/dist/runtime/foundation/durable-service-request.js +98 -0
  130. package/dist/runtime/foundation/operation-identity.d.ts +1 -0
  131. package/dist/runtime/foundation/operation-identity.js +5 -1
  132. package/dist/runtime/foundation/operation-registry.d.ts +25 -1
  133. package/dist/runtime/foundation/operation-registry.js +86 -18
  134. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +61 -8
  135. package/dist/runtime/foundation/raw-service-mesh-runtime.js +486 -266
  136. package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
  137. package/dist/runtime/foundation/service-liveness-registry.js +38 -0
  138. package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
  139. package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
  140. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +3 -3
  141. package/dist/runtime/foundation/service-relocation-object-owner.js +48 -34
  142. package/dist/runtime/foundation/service-relocation-runtime.d.ts +2 -0
  143. package/dist/runtime/foundation/service-relocation-runtime.js +20 -4
  144. package/dist/runtime/foundation/service-runtime-contracts.d.ts +10 -1
  145. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
  146. package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
  147. package/dist/runtime/foundation/service-stateful-registry.js +24 -26
  148. package/dist/runtime/foundation/service-stateful-runtime.d.ts +75 -9
  149. package/dist/runtime/foundation/service-stateful-runtime.js +486 -218
  150. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -6
  151. package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
  152. package/dist/runtime/foundation/service-topology-registry.d.ts +12 -2
  153. package/dist/runtime/foundation/service-topology-registry.js +61 -27
  154. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
  155. package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
  156. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  157. package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
  158. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +13 -3
  159. package/dist/runtime/foundation/service-wire-m6a-codec.js +189 -78
  160. package/dist/runtime/handlers/handler-instance-scope.d.ts +8 -0
  161. package/dist/runtime/handlers/handler-instance-scope.js +54 -11
  162. package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
  163. package/dist/runtime/host/actor-packet-relay.js +59 -72
  164. package/dist/runtime/host/actor-placement-coordinator.js +25 -8
  165. package/dist/runtime/host/actor-runtime-options-factory.js +2 -2
  166. package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
  167. package/dist/runtime/host/actor-transfer-runtime.js +85 -331
  168. package/dist/runtime/host/application-job-queue.d.ts +40 -7
  169. package/dist/runtime/host/application-job-queue.js +137 -42
  170. package/dist/runtime/host/entry-actor-runtime.d.ts +1 -0
  171. package/dist/runtime/host/entry-actor-runtime.js +3 -0
  172. package/dist/runtime/host/index.d.ts +12 -2
  173. package/dist/runtime/host/index.js +300 -202
  174. package/dist/runtime/host/location-runtime-owner.js +2 -6
  175. package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
  176. package/dist/runtime/host/mesh-router-resolver.js +14 -6
  177. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
  178. package/dist/runtime/host/remote-bound-session-relay.js +73 -208
  179. package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
  180. package/dist/runtime/host/route-mesh-runtime.js +6 -4
  181. package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
  182. package/dist/runtime/host/runtime-shutdown.js +3 -2
  183. package/dist/runtime/host/service-relocation-control.d.ts +1 -0
  184. package/dist/runtime/host/service-relocation-control.js +10 -4
  185. package/dist/runtime/host/service-relocation-host-runtime.d.ts +22 -14
  186. package/dist/runtime/host/service-relocation-host-runtime.js +754 -599
  187. package/dist/runtime/host/spot-address-transport.js +3 -2
  188. package/dist/runtime/host/spot-runtime-options-factory.js +16 -7
  189. package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
  190. package/dist/runtime/locations/actor-location-claims.d.ts +2 -2
  191. package/dist/runtime/locations/actor-location-claims.js +34 -19
  192. package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
  193. package/dist/runtime/locations/auto-connect-loop.js +22 -14
  194. package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
  195. package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
  196. package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
  197. package/dist/runtime/locations/descriptor-publication.js +11 -0
  198. package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
  199. package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
  200. package/dist/runtime/locations/in-memory-authority-store.js +56 -19
  201. package/dist/runtime/locations/in-memory-location-store.js +1 -10
  202. package/dist/runtime/locations/index.d.ts +1 -0
  203. package/dist/runtime/locations/index.js +1 -0
  204. package/dist/runtime/locations/lease-tracker.js +1 -6
  205. package/dist/runtime/locations/lifecycle.d.ts +1 -2
  206. package/dist/runtime/locations/lifecycle.js +2 -5
  207. package/dist/runtime/locations/location-store-repository.d.ts +51 -1
  208. package/dist/runtime/locations/location-store-repository.js +363 -139
  209. package/dist/runtime/locations/relocation-blob.d.ts +18 -1
  210. package/dist/runtime/locations/relocation-blob.js +52 -1
  211. package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
  212. package/dist/runtime/locations/request-source-resolver.js +80 -0
  213. package/dist/runtime/locations/resolvers.js +1 -1
  214. package/dist/runtime/locations/runtime.d.ts +7 -3
  215. package/dist/runtime/locations/runtime.js +61 -53
  216. package/dist/runtime/messaging/framework-json-v1.d.ts +4 -6
  217. package/dist/runtime/messaging/framework-json-v1.js +38 -294
  218. package/dist/runtime/messaging/packet-name.d.ts +1 -1
  219. package/dist/runtime/messaging/packet-name.js +8 -24
  220. package/dist/runtime/messaging/payload-codec.d.ts +7 -1
  221. package/dist/runtime/messaging/payload-codec.js +7 -6
  222. package/dist/runtime/messaging/request-result.d.ts +2 -0
  223. package/dist/runtime/messaging/request-result.js +57 -0
  224. package/dist/runtime/messaging/submission-result.d.ts +1 -0
  225. package/dist/runtime/messaging/submission-result.js +5 -2
  226. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +34 -1
  227. package/dist/runtime/protocol/service_wire_codec.generated.js +229 -0
  228. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +16 -1
  229. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +37 -8
  230. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +7 -2
  231. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +36 -21
  232. package/dist/runtime/spots/index.d.ts +21 -11
  233. package/dist/runtime/spots/index.js +243 -178
  234. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
  235. package/dist/runtime/spots/spot-activation-registry.js +21 -11
  236. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  237. package/dist/runtime/spots/spot-activation-state.js +7 -7
  238. package/dist/runtime/spots/spot-activation.d.ts +7 -3
  239. package/dist/runtime/spots/spot-activation.js +140 -52
  240. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
  241. package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
  242. package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
  243. package/dist/runtime/spots/spot-actor-membership.js +0 -8
  244. package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
  245. package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
  246. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
  247. package/dist/runtime/spots/spot-entry-activation.js +20 -11
  248. package/dist/runtime/spots/spot-handler-registry.d.ts +7 -4
  249. package/dist/runtime/spots/spot-handler-registry.js +24 -10
  250. package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
  251. package/dist/runtime/spots/spot-manager-public.js +2 -2
  252. package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
  253. package/dist/runtime/spots/spot-node-autoconnect.js +22 -42
  254. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
  255. package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
  256. package/dist/runtime/spots/spot-outbound.d.ts +3 -0
  257. package/dist/runtime/spots/spot-outbound.js +27 -18
  258. package/dist/runtime/spots/spot-remote-codec.js +5 -1
  259. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +1 -0
  260. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +1 -1
  261. package/dist/runtime/spots/spot-runtime-ports.d.ts +1 -1
  262. package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
  263. package/dist/runtime/spots/spot-serial-executor.js +61 -8
  264. package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
  265. package/dist/runtime/spots/spot-subscription-dispatch.js +1 -4
  266. package/dist/runtime/spots/spot-timer.d.ts +57 -5
  267. package/dist/runtime/spots/spot-timer.js +288 -103
  268. package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
  269. package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
  270. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
  271. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
  272. package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
  273. package/dist/runtime/streams/bound-session-service.d.ts +1 -1
  274. package/dist/runtime/streams/bound-session-service.js +6 -11
  275. package/dist/runtime/streams/index.d.ts +3 -2
  276. package/dist/runtime/streams/index.js +6 -4
  277. package/dist/runtime/streams/managed-stream.js +3 -2
  278. package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
  279. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
  280. package/dist/runtime/streams/session-actor-coordinator.js +15 -32
  281. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
  282. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -1
  283. package/dist/runtime/streams/stream-session-runtime.js +14 -31
  284. package/dist/runtime/workers/index.js +1 -1
  285. package/package.json +3 -3
  286. package/src/contracts/Actors/ZLinkActorClient.ts +2 -1
  287. package/src/contracts/Channels/Calls.ts +2 -1
  288. package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
  289. package/src/contracts/Common/ZLinkMessageMetadata.ts +13 -8
  290. package/src/contracts/Common/encoded-payload-storage.ts +6 -3
  291. package/src/contracts/Configuration/Builders.ts +4 -1
  292. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
  293. package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
  294. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  295. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
  296. package/src/contracts/Handlers/Attributes.ts +14 -21
  297. package/src/contracts/Handlers/JsonContract.ts +8 -216
  298. package/src/contracts/Locations/Rows.ts +2 -0
  299. package/src/contracts/Spots/Contracts.ts +10 -1
  300. package/src/contracts/Spots/ZLinkSpot.ts +3 -3
  301. package/src/nest-integration.ts +1 -0
  302. package/src/runtime/abort.ts +12 -0
  303. package/src/runtime/actors/actor-authority-publication.ts +3 -2
  304. package/src/runtime/actors/actor-client.ts +100 -85
  305. package/src/runtime/actors/actor-context.ts +49 -9
  306. package/src/runtime/actors/actor-handoff.ts +291 -110
  307. package/src/runtime/actors/actor-join-relocation.ts +3 -0
  308. package/src/runtime/actors/actor-local-native-join.ts +21 -26
  309. package/src/runtime/actors/actor-mailbox.ts +40 -2
  310. package/src/runtime/actors/actor-remote-joiner.ts +6 -1
  311. package/src/runtime/actors/actor-remote-wire.ts +17 -0
  312. package/src/runtime/actors/actor-reply.ts +42 -0
  313. package/src/runtime/actors/actor-routed-join-transport.ts +14 -4
  314. package/src/runtime/actors/actor-routed-json-request.ts +10 -2
  315. package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
  316. package/src/runtime/actors/actor-runtime-state.ts +2 -20
  317. package/src/runtime/actors/actor-source-transfer.ts +1 -34
  318. package/src/runtime/actors/index.ts +60 -32
  319. package/src/runtime/actors/session-disconnected-wire.ts +66 -0
  320. package/src/runtime/actors/spot-actor-dispatch.ts +4 -2
  321. package/src/runtime/admission.ts +69 -21
  322. package/src/runtime/application-jobs/application-ingress-record-owner.ts +41 -25
  323. package/src/runtime/application-jobs/application-job-queue-scope.ts +83 -22
  324. package/src/runtime/application-jobs/contracts.ts +16 -1
  325. package/src/runtime/backend/contracts/index.ts +92 -18
  326. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
  327. package/src/runtime/backend/mesh-completion-table.ts +160 -57
  328. package/src/runtime/backend/mesh-dispatch-pump.ts +237 -108
  329. package/src/runtime/backend/node/node-backend-adapter-support.ts +17 -8
  330. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +12 -2
  331. package/src/runtime/backend/node/node-raw-binding-port.ts +148 -85
  332. package/src/runtime/backend/node/node-raw-mesh-backend.ts +315 -201
  333. package/src/runtime/backend/node/node-socket-backend-adapter.ts +26 -11
  334. package/src/runtime/backend/raw-binding-port.ts +7 -2
  335. package/src/runtime/backend/runtime-message.ts +6 -0
  336. package/src/runtime/backend/runtime-values.ts +1 -0
  337. package/src/runtime/channels/channel-clients.ts +132 -58
  338. package/src/runtime/channels/channel-dispatch-pipeline.ts +198 -114
  339. package/src/runtime/channels/channel-dispatch-services.ts +69 -1
  340. package/src/runtime/channels/channel-dispatchers.ts +136 -90
  341. package/src/runtime/channels/channel-envelope-inspection.ts +2 -16
  342. package/src/runtime/channels/channel-envelope.ts +225 -31
  343. package/src/runtime/channels/channel-outbound-operations.ts +22 -8
  344. package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
  345. package/src/runtime/channels/channel-runtime-manager.ts +41 -17
  346. package/src/runtime/channels/channel-transports.ts +171 -112
  347. package/src/runtime/channels/client-server-location-runtime.ts +11 -10
  348. package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
  349. package/src/runtime/channels/fanout-location-runtime.ts +17 -9
  350. package/src/runtime/channels/local-spot-route-transport.ts +3 -1
  351. package/src/runtime/channels/router-socket-spot-route-transport.ts +13 -4
  352. package/src/runtime/channels/source-spot-router.ts +8 -4
  353. package/src/runtime/channels/spot-node-route-transport.ts +8 -4
  354. package/src/runtime/channels/spot-route-bridge-transport.ts +6 -4
  355. package/src/runtime/channels/spot-route-dispatch-strategy.ts +47 -18
  356. package/src/runtime/diagnostics/flow-context.ts +20 -7
  357. package/src/runtime/diagnostics/index.ts +1 -7
  358. package/src/runtime/diagnostics/message-flow.ts +47 -9
  359. package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
  360. package/src/runtime/execution/index.ts +40 -14
  361. package/src/runtime/execution/serial-execution-queue.ts +33 -4
  362. package/src/runtime/execution/state-lane.ts +7 -0
  363. package/src/runtime/foundation/actor-join-recovery-codec.ts +2 -2
  364. package/src/runtime/foundation/durable-service-request.ts +137 -0
  365. package/src/runtime/foundation/operation-identity.ts +5 -1
  366. package/src/runtime/foundation/operation-registry.ts +98 -20
  367. package/src/runtime/foundation/raw-service-mesh-runtime.ts +704 -336
  368. package/src/runtime/foundation/service-liveness-registry.ts +39 -0
  369. package/src/runtime/foundation/service-mailbox.ts +8 -0
  370. package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
  371. package/src/runtime/foundation/service-relocation-object-owner.ts +55 -36
  372. package/src/runtime/foundation/service-relocation-runtime.ts +25 -4
  373. package/src/runtime/foundation/service-runtime-contracts.ts +19 -2
  374. package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
  375. package/src/runtime/foundation/service-stateful-registry.ts +38 -35
  376. package/src/runtime/foundation/service-stateful-runtime.ts +732 -275
  377. package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -16
  378. package/src/runtime/foundation/service-topology-registry.ts +91 -36
  379. package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
  380. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  381. package/src/runtime/foundation/service-wire-m6a-codec.ts +231 -76
  382. package/src/runtime/handlers/handler-instance-scope.ts +67 -16
  383. package/src/runtime/host/actor-packet-relay.ts +113 -94
  384. package/src/runtime/host/actor-placement-coordinator.ts +31 -8
  385. package/src/runtime/host/actor-runtime-options-factory.ts +13 -2
  386. package/src/runtime/host/actor-transfer-runtime.ts +104 -430
  387. package/src/runtime/host/application-job-queue.ts +160 -41
  388. package/src/runtime/host/entry-actor-runtime.ts +4 -0
  389. package/src/runtime/host/index.ts +473 -271
  390. package/src/runtime/host/location-runtime-owner.ts +2 -6
  391. package/src/runtime/host/mesh-router-resolver.ts +13 -5
  392. package/src/runtime/host/remote-bound-session-relay.ts +88 -271
  393. package/src/runtime/host/route-mesh-runtime.ts +12 -6
  394. package/src/runtime/host/runtime-shutdown.ts +15 -4
  395. package/src/runtime/host/service-relocation-control.ts +11 -5
  396. package/src/runtime/host/service-relocation-host-runtime.ts +1092 -759
  397. package/src/runtime/host/spot-address-transport.ts +4 -2
  398. package/src/runtime/host/spot-runtime-options-factory.ts +20 -7
  399. package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
  400. package/src/runtime/locations/actor-location-claims.ts +52 -30
  401. package/src/runtime/locations/auto-connect-loop.ts +22 -14
  402. package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
  403. package/src/runtime/locations/auto-connect-types.ts +0 -1
  404. package/src/runtime/locations/descriptor-publication.ts +7 -0
  405. package/src/runtime/locations/domain-store-contract.ts +5 -0
  406. package/src/runtime/locations/in-memory-authority-store.ts +85 -23
  407. package/src/runtime/locations/in-memory-location-store.ts +1 -12
  408. package/src/runtime/locations/index.ts +1 -0
  409. package/src/runtime/locations/lease-tracker.ts +2 -9
  410. package/src/runtime/locations/lifecycle.ts +8 -26
  411. package/src/runtime/locations/location-store-repository.ts +628 -152
  412. package/src/runtime/locations/relocation-blob.ts +75 -1
  413. package/src/runtime/locations/request-source-resolver.ts +138 -0
  414. package/src/runtime/locations/resolvers.ts +2 -2
  415. package/src/runtime/locations/runtime.ts +98 -64
  416. package/src/runtime/messaging/framework-json-v1.ts +5 -325
  417. package/src/runtime/messaging/packet-name.ts +5 -25
  418. package/src/runtime/messaging/payload-codec.ts +8 -11
  419. package/src/runtime/messaging/request-result.ts +62 -0
  420. package/src/runtime/messaging/submission-result.ts +5 -1
  421. package/src/runtime/protocol/service_wire_codec.generated.ts +218 -5
  422. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +16 -13
  423. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +46 -25
  424. package/src/runtime/spots/index.ts +389 -283
  425. package/src/runtime/spots/spot-activation-registry.ts +25 -13
  426. package/src/runtime/spots/spot-activation-state.ts +12 -19
  427. package/src/runtime/spots/spot-activation.ts +198 -96
  428. package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
  429. package/src/runtime/spots/spot-actor-membership.ts +0 -15
  430. package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
  431. package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
  432. package/src/runtime/spots/spot-entry-activation.ts +33 -21
  433. package/src/runtime/spots/spot-handler-registry.ts +56 -12
  434. package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
  435. package/src/runtime/spots/spot-manager-public.ts +2 -2
  436. package/src/runtime/spots/spot-node-autoconnect.ts +28 -47
  437. package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
  438. package/src/runtime/spots/spot-outbound.ts +39 -19
  439. package/src/runtime/spots/spot-remote-codec.ts +9 -2
  440. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +2 -1
  441. package/src/runtime/spots/spot-runtime-ports.ts +1 -1
  442. package/src/runtime/spots/spot-serial-executor.ts +97 -25
  443. package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
  444. package/src/runtime/spots/spot-subscription-dispatch.ts +1 -4
  445. package/src/runtime/spots/spot-timer.ts +418 -158
  446. package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
  447. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
  448. package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
  449. package/src/runtime/streams/bound-session-service.ts +7 -10
  450. package/src/runtime/streams/index.ts +12 -6
  451. package/src/runtime/streams/managed-stream.ts +4 -2
  452. package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
  453. package/src/runtime/streams/session-actor-coordinator.ts +39 -88
  454. package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
  455. package/src/runtime/streams/stream-session-runtime.ts +13 -34
  456. package/src/runtime/workers/index.ts +1 -1
@@ -59,22 +59,7 @@ export class ZLinkSpotActorAdmissionCoordinator {
59
59
  remoteBoundSessionTarget,
60
60
  fallbackActorRef,
61
61
  undefined,
62
- messageFollowOrigin,
63
- (
64
- replayedParts,
65
- replayReturnResponse,
66
- replayRemoteBoundSessionTarget,
67
- replayFallbackActorRef
68
- ) =>
69
- this.dispatchActorPacketDirect(
70
- origin,
71
- activation,
72
- actorId,
73
- replayedParts,
74
- replayReturnResponse,
75
- replayRemoteBoundSessionTarget,
76
- replayFallbackActorRef
77
- )
62
+ messageFollowOrigin
78
63
  );
79
64
  if (handoff !== undefined) return await handoff;
80
65
  return await this.dispatchActorPacketDirect(
@@ -102,10 +87,7 @@ export class ZLinkSpotActorAdmissionCoordinator {
102
87
  ),
103
88
  serial: activation.serial,
104
89
  actors: {
105
- resolveActor: (actorId) =>
106
- activation.hasDepartedActor(actorId)
107
- ? undefined
108
- : (activation.resolveJoinedActor(actorId) ?? this.options.actorResolver?.(actorId)),
90
+ resolveActor: (actorId) => this.resolveActor(activation, actorId),
109
91
  getTarget: () => activation.spot,
110
92
  defaultAccept: false,
111
93
  transfer:
@@ -192,38 +174,21 @@ export class ZLinkSpotActorAdmissionCoordinator {
192
174
  actorId: string,
193
175
  records: readonly ZLinkActorHandoffPrefixRecord[]
194
176
  ): ZLinkActorHandoffPrefixAdmission {
195
- const terminals = activation.admitActorDurablePrefix(
177
+ return activation.admitActorPacketPrefix(
196
178
  actorId,
197
- records.map((record) => ({
198
- operation: (executeChild) =>
199
- record.drain((parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef) =>
200
- executeChild((actorSerial) =>
201
- this.dispatchActorPacketInActorTurn(
202
- currentApplicationJobOrigin(),
203
- activation,
204
- actorSerial,
205
- actorId,
206
- parts,
207
- returnResponse,
208
- remoteBoundSessionTarget,
209
- fallbackActorRef
210
- )
211
- )
212
- ),
213
- preparation: record.preparation,
214
- workOptions: { payloadBytes: record.payloadBytes }
215
- }))
179
+ records,
180
+ (actorSerial, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef) =>
181
+ this.dispatchActorPacketInActorTurn(
182
+ currentApplicationJobOrigin(),
183
+ activation,
184
+ actorSerial,
185
+ actorId,
186
+ parts,
187
+ returnResponse,
188
+ remoteBoundSessionTarget,
189
+ fallbackActorRef
190
+ )
216
191
  );
217
- const terminal = Promise.allSettled(terminals).then((outcomes) => {
218
- const errors = outcomes.flatMap((outcome) =>
219
- outcome.status === 'rejected' ? [outcome.reason] : []
220
- );
221
- if (errors.length === 1) throw errors[0];
222
- if (errors.length > 1) {
223
- throw new AggregateError(errors, `Actor '${actorId}' durable prefix replay failed.`);
224
- }
225
- });
226
- return { terminal };
227
192
  }
228
193
 
229
194
  private dispatchActorPacketInActorTurn(
@@ -242,11 +207,7 @@ export class ZLinkSpotActorAdmissionCoordinator {
242
207
  spotId: () => String(activation.spotId),
243
208
  registry: activation.actorHandlers,
244
209
  serial: actorSerial,
245
- resolveActor: (targetActorId) =>
246
- activation.hasDepartedActor(targetActorId)
247
- ? undefined
248
- : (activation.resolveJoinedActor(targetActorId) ??
249
- this.options.actorResolver?.(targetActorId)),
210
+ resolveActor: (targetActorId) => this.resolveActor(activation, targetActorId),
250
211
  actorLeft: (targetActorId) => activation.hasDepartedActor(targetActorId),
251
212
  onDisconnectActor: (actor) =>
252
213
  activation.serial.execute(() => activation.spot.onDisconnectActor?.(actor)),
@@ -271,6 +232,15 @@ export class ZLinkSpotActorAdmissionCoordinator {
271
232
  );
272
233
  }
273
234
 
235
+ private resolveActor(activation: ZLinkSpotActivation, actorId: string): ZLinkActor | undefined {
236
+ if (activation.hasDepartedActor(actorId)) return undefined;
237
+ // The manager owns relocation visibility. Membership alone cannot publish
238
+ // a staged Actor; resolver absence supports standalone Spot runtimes.
239
+ return this.options.actorResolver === undefined
240
+ ? activation.resolveJoinedActor(actorId)
241
+ : this.options.actorResolver(actorId);
242
+ }
243
+
274
244
  private async commitTransferredActorTransaction(
275
245
  activation: ZLinkSpotActivation,
276
246
  actor: ZLinkActor,
@@ -219,21 +219,6 @@ export class ZLinkSpotActorMembership {
219
219
  );
220
220
  }
221
221
 
222
- async restoreActorAfterFailedTransfer(
223
- spotId: RoutingId,
224
- actor: ZLinkActor,
225
- signal?: AbortSignal
226
- ): Promise<void> {
227
- throwIfAborted(signal);
228
- const activation = this.requireActivation(spotId);
229
- await this.runLifecycleOperation(activation, () =>
230
- activation.serial.execute(async () => {
231
- activation.cancelActorTransfer(actor.context.actorId);
232
- await activation.spot.onJoinedActor(actor);
233
- })
234
- );
235
- }
236
-
237
222
  async beginActorTransfer(spotId: RoutingId, actorId: string): Promise<void> {
238
223
  const activation = this.requireActivation(spotId);
239
224
  await this.runLifecycleOperation(activation, () =>
@@ -1,3 +1,7 @@
1
+ import { actorMessageFollowContext } from '../actors/actor-message-follow-context';
2
+ import { DefaultZLinkActorContext } from '../actors/actor-context';
3
+ import { decodeSessionDisconnected } from '../actors/session-disconnected-wire';
4
+ import { routingIdsEqual } from '../routing-id';
1
5
  import type { ApplicationJobOrigin } from '../application-jobs/contracts';
2
6
  import {
3
7
  ZLinkFrameworkInternalErrorKind,
@@ -12,7 +16,13 @@ import type {
12
16
  ZLinkSpot
13
17
  } from '../../contracts';
14
18
  import type { Message } from '../../contracts/Common/Message';
15
- import { ZLinkFrameworkException, zlinkMessageMetadata } from '../../contracts';
19
+ import {
20
+ ZLinkFrameworkException,
21
+ ZLinkFrameworkErrorKind,
22
+ ZLinkMessage,
23
+ ZLinkEncodedPayload,
24
+ zlinkMessageMetadata
25
+ } from '../../contracts';
16
26
  import {
17
27
  ZLinkRuntimeMessageFlowOutcome as ZLinkMessageFlowOutcome,
18
28
  ZLinkRuntimeDispatchErrorAction as ZLinkDispatchErrorAction,
@@ -45,6 +55,10 @@ import { zlinkMetadataByteLength, zlinkSerialWorkOptions } from '../execution/se
45
55
  import type { ZLinkMessageFollowOrigin } from '../foundation/service-runtime-contracts';
46
56
  import { releaseApplicationJobPermitBeforeHandler } from '../application-jobs/application-job-queue-scope';
47
57
 
58
+ const emptyDisconnectedReply = ZLinkMessage.fromEncoded(
59
+ ZLinkEncodedPayload.fromOwned(Buffer.alloc(0))
60
+ );
61
+
48
62
  export interface ZLinkActorResponseOptions {
49
63
  readonly metadata: ReadonlyMap<string, string>;
50
64
  readonly compressPayload: boolean;
@@ -204,11 +218,13 @@ export class ZLinkSpotActorPacketDispatch {
204
218
  ? ZLinkDispatchErrorAction.ReplyError
205
219
  : ZLinkDispatchErrorAction.Drop;
206
220
  this.trace(ZLinkMessageFlowOutcome.Received, actorId, header, messageKind);
207
- if (
208
- this.options.actorLeft?.(actorId) === true &&
209
- header.name === ZLINK_REMOTE_ACTOR_SESSION_DISCONNECTED_PACKET
210
- ) {
211
- return undefined;
221
+ const disconnected = header.name === ZLINK_REMOTE_ACTOR_SESSION_DISCONNECTED_PACKET;
222
+ const disconnectedReply =
223
+ disconnected && header.kind === ZLinkStreamMessageKind.Request
224
+ ? emptyDisconnectedReply
225
+ : undefined;
226
+ if (this.options.actorLeft?.(actorId) === true && disconnected) {
227
+ return disconnectedReply;
212
228
  }
213
229
  const routed = await this.options.routeBeforeLocal?.(delivery);
214
230
  if (routed?.handled === true) {
@@ -229,9 +245,34 @@ export class ZLinkSpotActorPacketDispatch {
229
245
  requestTerminal
230
246
  );
231
247
  }
232
- if (header.name === ZLINK_REMOTE_ACTOR_SESSION_DISCONNECTED_PACKET) {
248
+ if (disconnected) {
249
+ const identity = decodeSessionDisconnected(messageToBytes(parts[1]));
250
+ if (identity === undefined) {
251
+ if (this.options.dispatchErrors?.captureEnabled() === true)
252
+ this.reportInvalidFrame(
253
+ actorId,
254
+ messageKind,
255
+ new ZLinkFrameworkException(
256
+ ZLinkFrameworkErrorKind.ProtocolError,
257
+ 'ProtocolError: malformed Session disconnect identity.'
258
+ ),
259
+ 'warning'
260
+ );
261
+ return disconnectedReply;
262
+ }
263
+ const current =
264
+ actor.context instanceof DefaultZLinkActorContext
265
+ ? actor.context.currentSessionBinding
266
+ : undefined;
267
+ if (
268
+ current !== undefined &&
269
+ (!routingIdsEqual(current.sessionNodeRid, identity.sessionOwnerNodeRid) ||
270
+ current.sessionOwnerNodeGeneration !== identity.sessionOwnerNodeGeneration ||
271
+ current.bindingGeneration !== identity.bindingGeneration)
272
+ )
273
+ return disconnectedReply;
233
274
  await this.options.onDisconnectActor(actor);
234
- return undefined;
275
+ return disconnectedReply;
235
276
  }
236
277
  const decodePayload = this.createPayloadDecoder(parts[1], header);
237
278
  return this.dispatchActorPacket(
@@ -303,7 +344,9 @@ export class ZLinkSpotActorPacketDispatch {
303
344
  return undefined;
304
345
  }
305
346
  const missingActorError = createInternalFrameworkException(
306
- ZLinkFrameworkInternalErrorKind.ActorDispatchHandlerNotFound,
347
+ actorMessageFollowContext(fallbackActorRef) === undefined
348
+ ? ZLinkFrameworkInternalErrorKind.ActorDispatchHandlerNotFound
349
+ : ZLinkFrameworkInternalErrorKind.ActorLocationStale,
307
350
  `SPOT actor is not registered locally: ${actorId}`
308
351
  );
309
352
  if (
@@ -603,7 +646,8 @@ export class ZLinkSpotActorPacketDispatch {
603
646
  private reportInvalidFrame(
604
647
  actorId: string,
605
648
  messageKind: ZLinkDispatchMessageKind,
606
- error?: unknown
649
+ error?: unknown,
650
+ severity?: 'warning'
607
651
  ): void {
608
652
  this.options.dispatchErrors?.report({
609
653
  surface: ZLinkDispatchErrorSurface.SpotActor,
@@ -612,7 +656,8 @@ export class ZLinkSpotActorPacketDispatch {
612
656
  action: ZLinkDispatchErrorAction.Drop,
613
657
  spotId: this.options.spotId(),
614
658
  actorId,
615
- error
659
+ error,
660
+ severity
616
661
  });
617
662
  }
618
663
 
@@ -1,5 +1,4 @@
1
1
  import type { ActorRef, RoutingId, ZLinkMessageSerializer } from '../../contracts';
2
- import { ZLinkFrameworkException, ZLinkFrameworkErrorKind } from '../../contracts';
3
2
  import type { Message } from '../../contracts/Common/Message';
4
3
  import { ZLinkBufferMessage as RuntimeMessage } from '../backend/runtime-message';
5
4
  import { RequestResult } from '../backend/runtime-values';
@@ -7,15 +6,9 @@ import type { ZLinkBackendActorRef, ZLinkBackendActorRecvInfo } from '../backend
7
6
  import type { ZLinkActorPacketDelivery } from './spot-actor-packet-dispatch';
8
7
  import { REMOTE_BOUND_SESSION_BIND_PACKET } from './spot-remote-codec';
9
8
  import { ZLINK_RECV_DONT_WAIT } from './spot-native-flags';
10
- import {
11
- decodeStreamHeader,
12
- encodeStreamFrame,
13
- messageToBytes,
14
- streamCodecForContentType,
15
- ZLinkStreamHeaderFlags,
16
- ZLinkStreamMessageKind
17
- } from '../streams/protocol';
18
- import { encodeFrameworkPayload } from '../messaging/payload-codec';
9
+ import { decodeStreamHeader, messageToBytes, ZLinkStreamMessageKind } from '../streams/protocol';
10
+ import { encodeActorReply } from '../actors/actor-reply';
11
+ import { boundSessionErrorPayload } from '../streams/bound-session-response-target';
19
12
 
20
13
  export interface ZLinkActorDispatchPart {
21
14
  readonly info: {
@@ -218,7 +211,7 @@ export class ZLinkSpotActorPacketDrain {
218
211
  this.encodeActorReplyFrame(
219
212
  parts[0],
220
213
  ZLinkStreamMessageKind.Error,
221
- frameworkErrorPayload(error)
214
+ boundSessionErrorPayload(error)
222
215
  )
223
216
  ],
224
217
  RequestResult.Ok
@@ -231,37 +224,14 @@ export class ZLinkSpotActorPacketDrain {
231
224
  kind: ZLinkStreamMessageKind.Response | ZLinkStreamMessageKind.Error,
232
225
  payload: unknown
233
226
  ): Message {
234
- const requestHeader = decodeStreamHeader(messageToBytes(requestHeaderPart), this.flowEnabled());
235
- const encoded = encodeFrameworkPayload(
227
+ const [frame] = encodeActorReply(
228
+ messageToBytes(requestHeaderPart),
229
+ kind,
236
230
  payload,
237
231
  this.options.messageSerializers,
238
- kind === ZLinkStreamMessageKind.Response ? requestHeader.name : undefined,
239
- 'payload'
232
+ this.flowEnabled()
240
233
  );
241
- try {
242
- // encodeStreamFrame returns a fresh, unaliased array; view it without re-copying.
243
- const frame = encodeStreamFrame(
244
- {
245
- kind,
246
- codec: streamCodecForContentType(encoded.contentType),
247
- flags: ZLinkStreamHeaderFlags.None,
248
- requestSeq: requestHeader.requestSeq,
249
- name: '',
250
- metadata: new Map(),
251
- correlationId: requestHeader.correlationId,
252
- // Spec 27 §7: preserve the request flow pair on the reply while
253
- // tracing is on; the gated decode above already strips it at Off.
254
- flowId: requestHeader.flowId,
255
- flowOrigin: requestHeader.flowOrigin
256
- },
257
- encoded.message.data()
258
- );
259
- return RuntimeMessage.fromOwned(
260
- Buffer.from(frame.buffer, frame.byteOffset, frame.byteLength)
261
- ) as Message;
262
- } finally {
263
- encoded.message.close();
264
- }
234
+ return RuntimeMessage.fromOwned(frame) as Message;
265
235
  }
266
236
 
267
237
  private consumeRemoteBoundSessionBind(
@@ -329,16 +299,3 @@ function isStreamHeaderMessage(message: Message, flowEnabled: boolean): boolean
329
299
  function closeMessages(messages: readonly Message[]): void {
330
300
  for (const message of messages) message.close();
331
301
  }
332
-
333
- function frameworkErrorPayload(error: unknown): {
334
- readonly message: string;
335
- readonly kind: ZLinkFrameworkErrorKind;
336
- } {
337
- return {
338
- message: error instanceof Error ? error.message : String(error),
339
- kind:
340
- error instanceof ZLinkFrameworkException
341
- ? error.kind
342
- : ZLinkFrameworkErrorKind.InternalFailure
343
- };
344
- }
@@ -1,3 +1,4 @@
1
+ import { currentApplicationJobOrigin } from '../application-jobs/application-job-queue-scope';
1
2
  import type {
2
3
  ActorRef,
3
4
  RoutingId,
@@ -50,7 +51,7 @@ import {
50
51
  DefaultZLinkSpotHandlerRegistry
51
52
  } from './spot-handler-registry';
52
53
  import { DefaultZLinkSpotOutbound, type ZLinkSpotRoutedTransport } from './spot-outbound';
53
- import { createProviderInstance } from './spot-provider';
54
+ import { createFreshProviderInstance } from './spot-provider';
54
55
  import { ZLinkSpotSerialTurnExecutor } from './spot-serial-turn-executor';
55
56
  import { ZLinkSpotSerialExecutor } from './spot-serial-executor';
56
57
  import { invokeSpotClosing } from './spot-closing';
@@ -106,7 +107,7 @@ export class ZLinkEntrySpotActivation {
106
107
  private readonly spotSerialExecutor: ZLinkSpotSerialExecutor;
107
108
  private readonly timers: ZLinkSpotTimerRegistry;
108
109
  private readonly actorHandlers = new ZLinkSpotActorHandlerRegistryRuntime();
109
- private readonly handlers = new DefaultZLinkSpotHandlerRegistry(this.actorHandlers);
110
+ private readonly handlers: DefaultZLinkSpotHandlerRegistry;
110
111
  private readonly outbound: DefaultZLinkSpotOutbound;
111
112
  private readonly workerRuntime: ZLinkWorkerRuntime;
112
113
  private readonly lifecycleMetrics: ZLinkSpotLifecycleMetrics;
@@ -125,6 +126,10 @@ export class ZLinkEntrySpotActivation {
125
126
  'Entry Spot activation requires a detached task runner.'
126
127
  );
127
128
  }
129
+ this.handlers = new DefaultZLinkSpotHandlerRegistry(
130
+ this.actorHandlers,
131
+ options.providerResolver
132
+ );
128
133
  this.serial = new ZLinkSpotSerialTurnExecutor(false, options.nativeSpot.routingId);
129
134
  this.spotSerialExecutor = new ZLinkSpotSerialExecutor(
130
135
  this.serial,
@@ -265,7 +270,7 @@ export class ZLinkEntrySpotActivation {
265
270
  }
266
271
 
267
272
  async create(): Promise<void> {
268
- const entrySpot = await createProviderInstance(
273
+ const entrySpot = await createFreshProviderInstance(
269
274
  this.options.entrySpotType,
270
275
  this.options.providerResolver,
271
276
  this.context
@@ -328,7 +333,10 @@ export class ZLinkEntrySpotActivation {
328
333
  await cleanup(() => this.timers.dispose());
329
334
  await cleanup(() => this.spotSerialExecutor.close());
330
335
  await cleanup(() => disposeLifecycleHandlers(this.entrySpot, this.options.detachedTaskRunner));
331
- await cleanup(() => this.options.nativeSpot.dispose());
336
+ await cleanup(async () => {
337
+ await this.options.entryActorRuntime?.releaseMembers?.(this.options.spotNodeName);
338
+ await this.options.nativeSpot.dispose();
339
+ });
332
340
  if (this.initialized) {
333
341
  this.lifecycleMetrics.closed('entry');
334
342
  }
@@ -472,23 +480,7 @@ export class ZLinkEntrySpotActivation {
472
480
  remoteBoundSessionTarget,
473
481
  fallbackActorRef,
474
482
  undefined,
475
- messageFollowOrigin,
476
- (
477
- replayedParts,
478
- replayReturnResponse,
479
- replayRemoteBoundSessionTarget,
480
- replayFallbackActorRef
481
- ) =>
482
- this.spotSerialExecutor.executeActor(actorId, () =>
483
- this.dispatchActorPacketInsideMailbox({
484
- origin: delivery.origin,
485
- actorId,
486
- parts: replayedParts,
487
- returnResponse: replayReturnResponse,
488
- remoteBoundSessionTarget: replayRemoteBoundSessionTarget,
489
- fallbackActorRef: replayFallbackActorRef
490
- })
491
- )
483
+ messageFollowOrigin
492
484
  );
493
485
  if (handoff !== undefined) return await handoff;
494
486
  return this.spotSerialExecutor.executeActor(actorId, () =>
@@ -496,6 +488,26 @@ export class ZLinkEntrySpotActivation {
496
488
  );
497
489
  }
498
490
 
491
+ /** Restores source packets through the Entry Actor's existing executor. */
492
+ admitActorPacketPrefix(
493
+ actorId: string,
494
+ records: readonly import('../actors/actor-handoff').ZLinkActorHandoffPrefixRecord[]
495
+ ): import('../actors/actor-handoff').ZLinkActorHandoffPrefixAdmission {
496
+ return this.spotSerialExecutor.admitActorPacketPrefix(
497
+ actorId,
498
+ records,
499
+ (_serial, parts, returnResponse, remoteBoundSessionTarget, fallbackActorRef) =>
500
+ this.dispatchActorPacketInsideMailbox({
501
+ origin: currentApplicationJobOrigin(),
502
+ actorId,
503
+ parts,
504
+ returnResponse,
505
+ remoteBoundSessionTarget,
506
+ fallbackActorRef
507
+ })
508
+ );
509
+ }
510
+
499
511
  private async replayActorBacklog(
500
512
  actor: ZLinkActor,
501
513
  backlog: readonly ZLinkActorHandoffPacket[]
@@ -2,9 +2,11 @@ import type {
2
2
  Type,
3
3
  ZLinkActor,
4
4
  ZLinkEntrySpot,
5
+ ZLinkInstanceSpot,
5
6
  ZLinkInstanceSpotHandlerRegistry,
6
7
  ZLinkSpot,
7
- ZLinkSpotHandlerRegistry
8
+ ZLinkSpotHandlerRegistry,
9
+ ZLinkSpotTimerHandler
8
10
  } from '../../contracts';
9
11
  import type {
10
12
  ZLinkEntrySpotActorRequestHandlerRegistration,
@@ -16,12 +18,17 @@ import type {
16
18
  ZLinkSpotPacketHandlerRegistration,
17
19
  ZLinkSpotSubscriptionHandlerRegistration
18
20
  } from '../../contracts/Configuration/RegistrationTypes';
19
- import { ZLinkConfigurationException } from '../configuration';
21
+ import type { ZLinkProviderResolver } from '../../contracts/Common/ZLinkProviderResolver';
22
+ import { prepareHandlerInstance } from '../handlers/handler-instance-scope';
23
+ import {
24
+ ZLinkFrameworkInternalErrorKind,
25
+ createInternalFrameworkException
26
+ } from '../framework-errors-internal';
20
27
  import { ZLinkActorPacketKind, ZLinkSpotActorHandlerRegistryRuntime } from '../actors';
21
28
  import { readZLinkDecoratorMetadata } from '../../contracts/Handlers/Attributes';
22
29
 
23
30
  export interface ZLinkSpotHandlerRegistration {
24
- readonly kind: 'packet' | 'subscribe' | 'actorSend' | 'actorRequest' | 'spotHandler';
31
+ readonly kind: 'packet' | 'subscribe' | 'actorSend' | 'actorRequest' | 'timer';
25
32
  readonly handlerType: Type;
26
33
  readonly packetName?: string;
27
34
  readonly channelName?: string;
@@ -34,7 +41,10 @@ export class DefaultZLinkSpotHandlerRegistry<
34
41
  > implements ZLinkSpotHandlerRegistry {
35
42
  private readonly entries: ZLinkSpotHandlerRegistration[] = [];
36
43
 
37
- constructor(private readonly actorHandlers?: ZLinkSpotActorHandlerRegistryRuntime) {}
44
+ constructor(
45
+ private readonly actorHandlers?: ZLinkSpotActorHandlerRegistryRuntime,
46
+ private readonly providerResolver?: ZLinkProviderResolver
47
+ ) {}
38
48
 
39
49
  addHandler<THandler>(handlerType: Type<THandler>, packetName?: string): this {
40
50
  const metadata = readZLinkDecoratorMetadata(handlerType).find(
@@ -42,7 +52,8 @@ export class DefaultZLinkSpotHandlerRegistry<
42
52
  );
43
53
  const resolvedPacketName = packetName ?? metadata?.packetName;
44
54
  if (metadata === undefined || resolvedPacketName === undefined) {
45
- throw new ZLinkConfigurationException(
55
+ throw createInternalFrameworkException(
56
+ ZLinkFrameworkInternalErrorKind.InvalidOperation,
46
57
  `Actor packet handler '${handlerType.name}' must declare a packet name.`
47
58
  );
48
59
  }
@@ -62,7 +73,8 @@ export class DefaultZLinkSpotHandlerRegistry<
62
73
  (entry) => entry.kind === 'spotActorSend' || entry.kind === 'spotActorRequest'
63
74
  );
64
75
  if (metadata?.packetName === undefined) {
65
- throw new ZLinkConfigurationException(
76
+ throw createInternalFrameworkException(
77
+ ZLinkFrameworkInternalErrorKind.InvalidOperation,
66
78
  `Actor packet handler '${handlerType.name}' must declare a packet name.`
67
79
  );
68
80
  }
@@ -78,10 +90,21 @@ export class DefaultZLinkSpotHandlerRegistry<
78
90
  const declared = readZLinkDecoratorMetadata(handlerType).find(
79
91
  (entry) => entry.kind === 'packet'
80
92
  )?.packetName;
93
+ prepareHandlerInstance(this.providerResolver, handlerType);
94
+ const resolvedPacketName = packetName ?? declared ?? handlerType.name;
95
+ if (
96
+ this.entries.some(
97
+ (entry) => entry.kind === 'packet' && entry.packetName === resolvedPacketName
98
+ )
99
+ )
100
+ throw createInternalFrameworkException(
101
+ ZLinkFrameworkInternalErrorKind.InvalidOperation,
102
+ `SPOT packet '${resolvedPacketName}' is already registered.`
103
+ );
81
104
  this.entries.push({
82
105
  kind: 'packet',
83
106
  handlerType,
84
- packetName: packetName ?? declared ?? handlerType.name
107
+ packetName: resolvedPacketName
85
108
  });
86
109
  return this;
87
110
  }
@@ -96,6 +119,7 @@ export class DefaultZLinkSpotHandlerRegistry<
96
119
  actorType: Type<TActor>,
97
120
  packetName: string
98
121
  ): this {
122
+ prepareHandlerInstance(this.providerResolver, handlerType);
99
123
  this.entries.push({
100
124
  kind: kind === ZLinkActorPacketKind.Send ? 'actorSend' : 'actorRequest',
101
125
  handlerType,
@@ -139,10 +163,16 @@ export class DefaultZLinkSpotHandlerRegistry<
139
163
 
140
164
  addSubscribe(handlerType: Type, channelName: string, topic: string): this {
141
165
  if (channelName.trim().length === 0) {
142
- throw new ZLinkConfigurationException('SPOT subscribe channel name must not be empty.');
166
+ throw createInternalFrameworkException(
167
+ ZLinkFrameworkInternalErrorKind.InvalidOperation,
168
+ 'SPOT subscribe channel name must not be empty.'
169
+ );
143
170
  }
144
171
  if (topic.trim().length === 0) {
145
- throw new ZLinkConfigurationException('SPOT subscribe topic must not be empty.');
172
+ throw createInternalFrameworkException(
173
+ ZLinkFrameworkInternalErrorKind.InvalidOperation,
174
+ 'SPOT subscribe topic must not be empty.'
175
+ );
146
176
  }
147
177
  if (
148
178
  this.entries.some(
@@ -153,8 +183,12 @@ export class DefaultZLinkSpotHandlerRegistry<
153
183
  entry.topic === topic
154
184
  )
155
185
  ) {
156
- return this;
186
+ throw createInternalFrameworkException(
187
+ ZLinkFrameworkInternalErrorKind.InvalidOperation,
188
+ `SPOT subscription '${channelName}/${topic}' is already registered.`
189
+ );
157
190
  }
191
+ prepareHandlerInstance(this.providerResolver, handlerType);
158
192
  this.entries.push({ kind: 'subscribe', handlerType, channelName, topic });
159
193
  return this;
160
194
  }
@@ -163,8 +197,11 @@ export class DefaultZLinkSpotHandlerRegistry<
163
197
  return this.addSubscribe(handlerType, channelName, topic);
164
198
  }
165
199
 
166
- addSpotHandler(handlerType: Type): this {
167
- this.entries.push({ kind: 'spotHandler', handlerType });
200
+ addTimerHandler<THandler extends ZLinkSpotTimerHandler<ZLinkSpot>>(
201
+ handlerType: Type<THandler>
202
+ ): this {
203
+ prepareHandlerInstance(this.providerResolver, handlerType);
204
+ this.entries.push({ kind: 'timer', handlerType });
168
205
  return this;
169
206
  }
170
207
 
@@ -185,6 +222,13 @@ export class DefaultZLinkInstanceSpotHandlerRegistry implements ZLinkInstanceSpo
185
222
  return this;
186
223
  }
187
224
 
225
+ addTimerHandler<THandler extends ZLinkSpotTimerHandler<ZLinkInstanceSpot>>(
226
+ handlerType: Type<THandler>
227
+ ): this {
228
+ this.registrations.addTimerHandler(handlerType as never);
229
+ return this;
230
+ }
231
+
188
232
  snapshot(): readonly ZLinkSpotHandlerRegistration[] {
189
233
  return this.registrations.snapshot();
190
234
  }
@@ -5,7 +5,7 @@ export interface ZLinkLocalSpotCreateResult {
5
5
  readonly state: ZLinkSpotCreateState;
6
6
  readonly reply?: unknown;
7
7
  readonly publication?: {
8
- publish(): void;
9
- abort(): void;
8
+ publish(): void | Promise<void>;
9
+ abort(): void | Promise<void>;
10
10
  };
11
11
  }
@@ -196,7 +196,7 @@ export class ZLinkPublicSpotManager implements ZLinkSpotManager {
196
196
  yield: (signal) => {
197
197
  const yieldTurn = requireZLinkYieldTurn(turn);
198
198
  const pending = this.submit(spotId, stableType, generatedIdentity, state, signal);
199
- return yieldTurn.yieldPromise(pending);
199
+ return yieldTurn.yieldFrameworkPromise(pending);
200
200
  }
201
201
  };
202
202
  return call;
@@ -264,7 +264,7 @@ export class ZLinkPublicSpotManager implements ZLinkSpotManager {
264
264
  }
265
265
  };
266
266
  } catch (error) {
267
- this.options.local.abortUserSpotPublication(target.meshName, spotId);
267
+ await this.options.local.abortUserSpotPublication(target.meshName, spotId);
268
268
  throw error;
269
269
  }
270
270
  },