@zlink-systems/framework 0.25.0 → 0.27.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 (557) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Channels/IZLinkFanoutClient.d.ts +0 -6
  3. package/dist/contracts/Common/CoreTypes.d.ts +6 -0
  4. package/dist/contracts/Common/CoreTypes.js +7 -0
  5. package/dist/contracts/Common/index.d.ts +1 -1
  6. package/dist/contracts/Common/index.js +0 -1
  7. package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
  8. package/dist/contracts/Configuration/InternalDefaults.js +9 -1
  9. package/dist/contracts/Configuration/Registration.d.ts +13 -2
  10. package/dist/contracts/Configuration/Registration.js +58 -36
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
  12. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
  13. package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
  14. package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
  15. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  16. package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
  17. package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
  18. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
  19. package/dist/contracts/Handlers/JsonContract.js +10 -4
  20. package/dist/contracts/Locations/Authority.d.ts +1 -1
  21. package/dist/contracts/Locations/Authority.js +3 -2
  22. package/dist/contracts/Locations/Options.js +1 -1
  23. package/dist/contracts/Locations/Stores.d.ts +12 -0
  24. package/dist/contracts/Locations/Stores.js +9 -0
  25. package/dist/contracts/RouteMesh/RuntimeTopology.d.ts +8 -0
  26. package/dist/contracts/Spots/Contracts.d.ts +1 -1
  27. package/dist/internal.d.ts +5 -0
  28. package/dist/internal.js +16 -1
  29. package/dist/nest-integration.d.ts +4 -2
  30. package/dist/nest-integration.js +14 -4
  31. package/dist/runtime/abort.d.ts +1 -0
  32. package/dist/runtime/abort.js +8 -5
  33. package/dist/runtime/activation-admission.d.ts +28 -0
  34. package/dist/runtime/activation-admission.js +57 -0
  35. package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
  36. package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
  37. package/dist/runtime/actors/actor-client.d.ts +2 -2
  38. package/dist/runtime/actors/actor-client.js +42 -143
  39. package/dist/runtime/actors/actor-context.d.ts +3 -5
  40. package/dist/runtime/actors/actor-context.js +19 -17
  41. package/dist/runtime/actors/actor-handoff.d.ts +13 -7
  42. package/dist/runtime/actors/actor-handoff.js +36 -25
  43. package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
  44. package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
  45. package/dist/runtime/actors/actor-local-native-join.js +85 -123
  46. package/dist/runtime/actors/actor-native-lookup.js +2 -8
  47. package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
  48. package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
  49. package/dist/runtime/actors/actor-remote-joiner.d.ts +3 -3
  50. package/dist/runtime/actors/actor-remote-joiner.js +11 -17
  51. package/dist/runtime/actors/actor-remote-wire.js +5 -3
  52. package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
  53. package/dist/runtime/actors/actor-request-deadline.js +31 -0
  54. package/dist/runtime/actors/actor-retry-delay.js +2 -1
  55. package/dist/runtime/actors/actor-runtime-contracts.d.ts +4 -2
  56. package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
  57. package/dist/runtime/actors/actor-runtime-state.js +70 -187
  58. package/dist/runtime/actors/actor-source-transfer.d.ts +5 -5
  59. package/dist/runtime/actors/bound-session-wire.js +2 -7
  60. package/dist/runtime/actors/deferred-join-completion.d.ts +19 -0
  61. package/dist/runtime/actors/deferred-join-completion.js +21 -0
  62. package/dist/runtime/actors/index.d.ts +10 -8
  63. package/dist/runtime/actors/index.js +101 -73
  64. package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
  65. package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
  66. package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
  67. package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
  68. package/dist/runtime/admission.d.ts +7 -1
  69. package/dist/runtime/admission.js +11 -1
  70. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
  71. package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
  72. package/dist/runtime/backend/contracts/index.d.ts +8 -33
  73. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +3 -26
  74. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
  75. package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
  76. package/dist/runtime/backend/node/node-backend-adapter-factory.d.ts +1 -2
  77. package/dist/runtime/backend/node/node-backend-adapter-factory.js +4 -18
  78. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +7 -4
  79. package/dist/runtime/backend/node/node-backend-adapter-support.js +28 -34
  80. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
  81. package/dist/runtime/backend/node/node-event-loop-poller.js +11 -6
  82. package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
  83. package/dist/runtime/backend/node/node-raw-binding-port.d.ts +1 -1
  84. package/dist/runtime/backend/node/node-raw-binding-port.js +51 -19
  85. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +21 -19
  86. package/dist/runtime/backend/node/node-raw-mesh-backend.js +171 -111
  87. package/dist/runtime/backend/node/node-socket-backend-adapter.js +4 -3
  88. package/dist/runtime/backend/raw-binding-port.d.ts +13 -1
  89. package/dist/runtime/backend/runtime-values.d.ts +4 -1
  90. package/dist/runtime/backend/runtime-values.js +2 -0
  91. package/dist/runtime/channels/channel-clients.d.ts +20 -9
  92. package/dist/runtime/channels/channel-clients.js +68 -60
  93. package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
  94. package/dist/runtime/channels/channel-envelope.js +47 -29
  95. package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
  96. package/dist/runtime/channels/channel-outbound-operations.js +9 -18
  97. package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
  98. package/dist/runtime/channels/channel-receive-loops.js +27 -6
  99. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
  100. package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
  101. package/dist/runtime/channels/channel-runtime-manager.d.ts +2 -5
  102. package/dist/runtime/channels/channel-runtime-manager.js +4 -12
  103. package/dist/runtime/channels/channel-socket-options.js +3 -2
  104. package/dist/runtime/channels/channel-socket-registry.d.ts +30 -32
  105. package/dist/runtime/channels/channel-socket-registry.js +296 -235
  106. package/dist/runtime/channels/channel-transports.d.ts +11 -20
  107. package/dist/runtime/channels/channel-transports.js +68 -47
  108. package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
  109. package/dist/runtime/channels/client-server-location-runtime.js +10 -11
  110. package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
  111. package/dist/runtime/channels/client-server-service-wire.js +32 -11
  112. package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
  113. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  114. package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
  115. package/dist/runtime/channels/fanout-location-runtime.js +133 -81
  116. package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
  117. package/dist/runtime/channels/spot-direct-envelope.js +4 -3
  118. package/dist/runtime/channels/spot-node-route-transport.js +3 -2
  119. package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
  120. package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
  121. package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
  122. package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
  123. package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
  124. package/dist/runtime/diagnostics/flow-context.js +16 -2
  125. package/dist/runtime/diagnostics/index.d.ts +4 -2
  126. package/dist/runtime/diagnostics/index.js +14 -4
  127. package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
  128. package/dist/runtime/diagnostics/message-flow.js +10 -19
  129. package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
  130. package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
  131. package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
  132. package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
  133. package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
  134. package/dist/runtime/disposal.d.ts +5 -0
  135. package/dist/runtime/disposal.js +22 -0
  136. package/dist/runtime/execution/index.d.ts +22 -9
  137. package/dist/runtime/execution/index.js +107 -37
  138. package/dist/runtime/execution/serial-execution-queue.d.ts +12 -7
  139. package/dist/runtime/execution/serial-execution-queue.js +99 -26
  140. package/dist/runtime/execution/state-lane.d.ts +8 -1
  141. package/dist/runtime/execution/state-lane.js +118 -3
  142. package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
  143. package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
  144. package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
  145. package/dist/runtime/foundation/event-loop-resources.js +6 -119
  146. package/dist/runtime/foundation/listener-records.d.ts +11 -0
  147. package/dist/runtime/foundation/listener-records.js +20 -0
  148. package/dist/runtime/foundation/operation-identity.d.ts +2 -0
  149. package/dist/runtime/foundation/operation-identity.js +9 -5
  150. package/dist/runtime/foundation/operation-registry.d.ts +5 -7
  151. package/dist/runtime/foundation/operation-registry.js +34 -44
  152. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +18 -26
  153. package/dist/runtime/foundation/raw-service-mesh-runtime.js +122 -469
  154. package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
  155. package/dist/runtime/foundation/runtime-state-projections.js +8 -0
  156. package/dist/runtime/foundation/service-authority-payload-codec.d.ts +1 -0
  157. package/dist/runtime/foundation/service-authority-payload-codec.js +30 -12
  158. package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
  159. package/dist/runtime/foundation/service-discovery-registry.js +22 -3
  160. package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
  161. package/dist/runtime/foundation/service-liveness-registry.js +2 -1
  162. package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
  163. package/dist/runtime/foundation/service-maintenance-runtime.js +23 -8
  164. package/dist/runtime/foundation/service-metadata-codec.js +3 -3
  165. package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
  166. package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
  167. package/dist/runtime/foundation/service-relocation-coordinator.d.ts +9 -0
  168. package/dist/runtime/foundation/service-relocation-coordinator.js +14 -1
  169. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +8 -0
  170. package/dist/runtime/foundation/service-relocation-object-owner.js +19 -6
  171. package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
  172. package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
  173. package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
  174. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -19
  175. package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
  176. package/dist/runtime/foundation/service-stateful-registry.js +10 -2
  177. package/dist/runtime/foundation/service-stateful-runtime.d.ts +28 -24
  178. package/dist/runtime/foundation/service-stateful-runtime.js +297 -244
  179. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +12 -7
  180. package/dist/runtime/foundation/service-stateful-wire-codec.js +240 -143
  181. package/dist/runtime/foundation/service-topology-registry.d.ts +1 -3
  182. package/dist/runtime/foundation/service-topology-registry.js +22 -61
  183. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
  184. package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
  185. package/dist/runtime/foundation/service-wire-codec.js +10 -8
  186. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  187. package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
  188. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
  189. package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
  190. package/dist/runtime/framework-errors-internal.d.ts +2 -1
  191. package/dist/runtime/framework-errors-internal.js +343 -122
  192. package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
  193. package/dist/runtime/handlers/handler-instance-scope.js +61 -74
  194. package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
  195. package/dist/runtime/host/actor-packet-relay.js +48 -91
  196. package/dist/runtime/host/actor-placement-coordinator.js +7 -5
  197. package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
  198. package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
  199. package/dist/runtime/host/actor-transfer-runtime.d.ts +28 -28
  200. package/dist/runtime/host/actor-transfer-runtime.js +210 -256
  201. package/dist/runtime/host/application-job-queue.js +16 -33
  202. package/dist/runtime/host/bound-session-relay.js +1 -1
  203. package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
  204. package/dist/runtime/host/index.d.ts +19 -14
  205. package/dist/runtime/host/index.js +234 -175
  206. package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
  207. package/dist/runtime/host/instance-activation-authority.js +17 -45
  208. package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
  209. package/dist/runtime/host/location-runtime-owner.js +2 -2
  210. package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
  211. package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
  212. package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
  213. package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
  214. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
  215. package/dist/runtime/host/remote-bound-session-relay.js +11 -23
  216. package/dist/runtime/host/route-mesh-runtime.d.ts +14 -10
  217. package/dist/runtime/host/route-mesh-runtime.js +178 -257
  218. package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
  219. package/dist/runtime/host/runtime-shutdown.js +18 -21
  220. package/dist/runtime/host/service-relocation-control.js +6 -1
  221. package/dist/runtime/host/service-relocation-host-runtime.d.ts +71 -38
  222. package/dist/runtime/host/service-relocation-host-runtime.js +816 -651
  223. package/dist/runtime/host/spot-address-transport.d.ts +2 -3
  224. package/dist/runtime/host/spot-address-transport.js +34 -136
  225. package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
  226. package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
  227. package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -7
  228. package/dist/runtime/host/spot-runtime-options-factory.js +53 -21
  229. package/dist/runtime/host/stateful-authority-route-runtime.js +6 -2
  230. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +14 -6
  231. package/dist/runtime/host/user-spot-creation-coordinator.js +96 -95
  232. package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
  233. package/dist/runtime/locations/authority-key-codec.js +4 -3
  234. package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
  235. package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
  236. package/dist/runtime/locations/creation-operation-id.js +6 -4
  237. package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
  238. package/dist/runtime/locations/in-memory-authority-store.js +31 -15
  239. package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
  240. package/dist/runtime/locations/in-memory-location-store.js +17 -14
  241. package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
  242. package/dist/runtime/locations/in-memory-provider-location-store.js +79 -27
  243. package/dist/runtime/locations/key-codec.js +3 -2
  244. package/dist/runtime/locations/lease-tracker.d.ts +3 -5
  245. package/dist/runtime/locations/lease-tracker.js +7 -11
  246. package/dist/runtime/locations/lifecycle.d.ts +5 -10
  247. package/dist/runtime/locations/lifecycle.js +4 -33
  248. package/dist/runtime/locations/location-store-failure.d.ts +2 -0
  249. package/dist/runtime/locations/location-store-failure.js +7 -0
  250. package/dist/runtime/locations/location-store-pages.d.ts +3 -0
  251. package/dist/runtime/locations/location-store-pages.js +13 -0
  252. package/dist/runtime/locations/location-store-repository.d.ts +5 -7
  253. package/dist/runtime/locations/location-store-repository.js +303 -332
  254. package/dist/runtime/locations/relocation-blob.js +18 -5
  255. package/dist/runtime/locations/resolvers.d.ts +5 -5
  256. package/dist/runtime/locations/resolvers.js +44 -30
  257. package/dist/runtime/locations/runtime.d.ts +5 -4
  258. package/dist/runtime/locations/runtime.js +123 -92
  259. package/dist/runtime/locations/spot-location-claims.d.ts +8 -2
  260. package/dist/runtime/locations/spot-location-claims.js +40 -23
  261. package/dist/runtime/messaging/payload-codec.js +26 -20
  262. package/dist/runtime/messaging/submission-result.d.ts +3 -0
  263. package/dist/runtime/messaging/submission-result.js +48 -0
  264. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +2 -0
  265. package/dist/runtime/protocol/service_wire_codec.generated.js +17 -8
  266. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +1 -0
  267. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +3 -2
  268. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +3 -3
  269. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +4 -4
  270. package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +6 -3
  271. package/dist/runtime/spots/index.d.ts +29 -29
  272. package/dist/runtime/spots/index.js +441 -313
  273. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -4
  274. package/dist/runtime/spots/spot-activation-registry.js +27 -60
  275. package/dist/runtime/spots/spot-activation-state.d.ts +2 -11
  276. package/dist/runtime/spots/spot-activation-state.js +4 -17
  277. package/dist/runtime/spots/spot-activation.d.ts +10 -9
  278. package/dist/runtime/spots/spot-activation.js +103 -81
  279. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
  280. package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
  281. package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
  282. package/dist/runtime/spots/spot-actor-join-dispatch.js +5 -55
  283. package/dist/runtime/spots/spot-actor-lifecycle-drain.js +2 -2
  284. package/dist/runtime/spots/spot-actor-membership.d.ts +7 -5
  285. package/dist/runtime/spots/spot-actor-membership.js +44 -53
  286. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
  287. package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
  288. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
  289. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
  290. package/dist/runtime/spots/spot-context.d.ts +2 -2
  291. package/dist/runtime/spots/spot-entry-activation.d.ts +3 -4
  292. package/dist/runtime/spots/spot-entry-activation.js +9 -21
  293. package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
  294. package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
  295. package/dist/runtime/spots/spot-manager-public.js +6 -5
  296. package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
  297. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +22 -21
  298. package/dist/runtime/spots/spot-node-runtime-manager.js +73 -82
  299. package/dist/runtime/spots/spot-outbound.d.ts +4 -3
  300. package/dist/runtime/spots/spot-outbound.js +10 -37
  301. package/dist/runtime/spots/spot-remote-codec.js +5 -3
  302. package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
  303. package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
  304. package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
  305. package/dist/runtime/spots/spot-route-replies.js +3 -1
  306. package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -2
  307. package/dist/runtime/spots/spot-routed-actor-admission.js +3 -2
  308. package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +2 -7
  309. package/dist/runtime/spots/spot-routed-frame-dispatch.js +1 -70
  310. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
  311. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
  312. package/dist/runtime/spots/spot-runtime-ports.d.ts +4 -20
  313. package/dist/runtime/spots/spot-serial-executor.d.ts +5 -0
  314. package/dist/runtime/spots/spot-serial-executor.js +9 -2
  315. package/dist/runtime/spots/spot-serial-turn-executor.d.ts +29 -6
  316. package/dist/runtime/spots/spot-serial-turn-executor.js +89 -13
  317. package/dist/runtime/spots/spot-timer.d.ts +3 -2
  318. package/dist/runtime/streams/actor-session-binding-registry.d.ts +17 -32
  319. package/dist/runtime/streams/actor-session-binding-registry.js +145 -367
  320. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +2 -6
  321. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
  322. package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
  323. package/dist/runtime/streams/bound-session-service.d.ts +7 -0
  324. package/dist/runtime/streams/bound-session-service.js +12 -19
  325. package/dist/runtime/streams/index.d.ts +15 -14
  326. package/dist/runtime/streams/index.js +38 -39
  327. package/dist/runtime/streams/managed-stream.d.ts +3 -0
  328. package/dist/runtime/streams/managed-stream.js +17 -8
  329. package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
  330. package/dist/runtime/streams/protocol.d.ts +6 -33
  331. package/dist/runtime/streams/protocol.js +38 -110
  332. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
  333. package/dist/runtime/streams/session-actor-coordinator.js +12 -4
  334. package/dist/runtime/streams/session-calls.d.ts +1 -1
  335. package/dist/runtime/streams/session-calls.js +5 -4
  336. package/dist/runtime/streams/session-context.d.ts +6 -6
  337. package/dist/runtime/streams/session-context.js +22 -4
  338. package/dist/runtime/streams/session-requests.js +2 -1
  339. package/dist/runtime/streams/session-serial-executor.js +2 -2
  340. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
  341. package/dist/runtime/streams/stream-frame-factory.js +2 -2
  342. package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
  343. package/dist/runtime/streams/stream-session-runtime.js +25 -33
  344. package/dist/runtime/workers/index.d.ts +2 -2
  345. package/dist/runtime/workers/index.js +5 -4
  346. package/package.json +3 -3
  347. package/src/contracts/Channels/IZLinkFanoutClient.ts +0 -7
  348. package/src/contracts/Common/CoreTypes.ts +7 -0
  349. package/src/contracts/Common/index.ts +1 -1
  350. package/src/contracts/Configuration/InternalDefaults.ts +12 -0
  351. package/src/contracts/Configuration/Registration.ts +92 -48
  352. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
  353. package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
  354. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  355. package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
  356. package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
  357. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
  358. package/src/contracts/Handlers/JsonContract.ts +14 -4
  359. package/src/contracts/Locations/Authority.ts +7 -3
  360. package/src/contracts/Locations/Options.ts +1 -1
  361. package/src/contracts/Locations/Stores.ts +14 -0
  362. package/src/contracts/RouteMesh/RuntimeTopology.ts +10 -0
  363. package/src/contracts/Spots/Contracts.ts +1 -1
  364. package/src/internal.ts +15 -0
  365. package/src/nest-integration.ts +28 -10
  366. package/src/runtime/abort.ts +6 -5
  367. package/src/runtime/activation-admission.ts +72 -0
  368. package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
  369. package/src/runtime/actors/actor-client.ts +77 -204
  370. package/src/runtime/actors/actor-context.ts +45 -39
  371. package/src/runtime/actors/actor-handoff.ts +55 -45
  372. package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
  373. package/src/runtime/actors/actor-local-native-join.ts +174 -215
  374. package/src/runtime/actors/actor-native-lookup.ts +2 -9
  375. package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
  376. package/src/runtime/actors/actor-remote-joiner.ts +15 -36
  377. package/src/runtime/actors/actor-remote-wire.ts +5 -3
  378. package/src/runtime/actors/actor-request-deadline.ts +49 -0
  379. package/src/runtime/actors/actor-retry-delay.ts +2 -1
  380. package/src/runtime/actors/actor-runtime-contracts.ts +4 -10
  381. package/src/runtime/actors/actor-runtime-state.ts +85 -247
  382. package/src/runtime/actors/actor-source-transfer.ts +5 -18
  383. package/src/runtime/actors/bound-session-wire.ts +2 -8
  384. package/src/runtime/actors/deferred-join-completion.ts +44 -0
  385. package/src/runtime/actors/index.ts +122 -88
  386. package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
  387. package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
  388. package/src/runtime/admission.ts +13 -2
  389. package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
  390. package/src/runtime/backend/contracts/index.ts +15 -42
  391. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -28
  392. package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
  393. package/src/runtime/backend/node/node-backend-adapter-factory.ts +5 -25
  394. package/src/runtime/backend/node/node-backend-adapter-support.ts +32 -35
  395. package/src/runtime/backend/node/node-event-loop-poller.ts +16 -8
  396. package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
  397. package/src/runtime/backend/node/node-raw-binding-port.ts +58 -23
  398. package/src/runtime/backend/node/node-raw-mesh-backend.ts +252 -162
  399. package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -4
  400. package/src/runtime/backend/raw-binding-port.ts +14 -1
  401. package/src/runtime/backend/runtime-values.ts +4 -1
  402. package/src/runtime/channels/channel-clients.ts +132 -96
  403. package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
  404. package/src/runtime/channels/channel-envelope.ts +58 -29
  405. package/src/runtime/channels/channel-outbound-operations.ts +10 -31
  406. package/src/runtime/channels/channel-receive-loops.ts +39 -7
  407. package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
  408. package/src/runtime/channels/channel-runtime-manager.ts +8 -15
  409. package/src/runtime/channels/channel-socket-options.ts +8 -2
  410. package/src/runtime/channels/channel-socket-registry.ts +369 -262
  411. package/src/runtime/channels/channel-transports.ts +161 -115
  412. package/src/runtime/channels/client-server-location-runtime.ts +17 -17
  413. package/src/runtime/channels/client-server-service-wire.ts +40 -12
  414. package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
  415. package/src/runtime/channels/fanout-location-runtime.ts +175 -106
  416. package/src/runtime/channels/spot-direct-envelope.ts +1 -1
  417. package/src/runtime/channels/spot-node-route-transport.ts +5 -2
  418. package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
  419. package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
  420. package/src/runtime/diagnostics/flow-context.ts +16 -2
  421. package/src/runtime/diagnostics/index.ts +27 -17
  422. package/src/runtime/diagnostics/message-flow.ts +15 -25
  423. package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
  424. package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
  425. package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
  426. package/src/runtime/disposal.ts +19 -0
  427. package/src/runtime/execution/index.ts +116 -38
  428. package/src/runtime/execution/serial-execution-queue.ts +179 -34
  429. package/src/runtime/execution/state-lane.ts +142 -4
  430. package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
  431. package/src/runtime/foundation/event-loop-resources.ts +5 -122
  432. package/src/runtime/foundation/listener-records.ts +21 -0
  433. package/src/runtime/foundation/operation-identity.ts +11 -5
  434. package/src/runtime/foundation/operation-registry.ts +33 -50
  435. package/src/runtime/foundation/raw-service-mesh-runtime.ts +170 -571
  436. package/src/runtime/foundation/runtime-state-projections.ts +9 -1
  437. package/src/runtime/foundation/service-authority-payload-codec.ts +41 -13
  438. package/src/runtime/foundation/service-discovery-registry.ts +32 -3
  439. package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
  440. package/src/runtime/foundation/service-liveness-registry.ts +2 -1
  441. package/src/runtime/foundation/service-maintenance-runtime.ts +30 -19
  442. package/src/runtime/foundation/service-metadata-codec.ts +2 -2
  443. package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
  444. package/src/runtime/foundation/service-relocation-coordinator.ts +13 -0
  445. package/src/runtime/foundation/service-relocation-object-owner.ts +23 -7
  446. package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
  447. package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
  448. package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -25
  449. package/src/runtime/foundation/service-stateful-registry.ts +14 -2
  450. package/src/runtime/foundation/service-stateful-runtime.ts +435 -327
  451. package/src/runtime/foundation/service-stateful-wire-codec.ts +329 -199
  452. package/src/runtime/foundation/service-topology-registry.ts +30 -79
  453. package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
  454. package/src/runtime/foundation/service-wire-codec.ts +15 -8
  455. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  456. package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
  457. package/src/runtime/framework-errors-internal.ts +380 -134
  458. package/src/runtime/handlers/handler-instance-scope.ts +68 -95
  459. package/src/runtime/host/actor-packet-relay.ts +57 -147
  460. package/src/runtime/host/actor-placement-coordinator.ts +8 -5
  461. package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
  462. package/src/runtime/host/actor-transfer-runtime.ts +266 -418
  463. package/src/runtime/host/application-job-queue.ts +28 -34
  464. package/src/runtime/host/bound-session-relay.ts +1 -2
  465. package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
  466. package/src/runtime/host/index.ts +408 -312
  467. package/src/runtime/host/instance-activation-authority.ts +89 -109
  468. package/src/runtime/host/location-runtime-owner.ts +4 -2
  469. package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
  470. package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
  471. package/src/runtime/host/remote-bound-session-relay.ts +12 -44
  472. package/src/runtime/host/route-mesh-runtime.ts +236 -275
  473. package/src/runtime/host/runtime-shutdown.ts +17 -21
  474. package/src/runtime/host/service-relocation-control.ts +14 -1
  475. package/src/runtime/host/service-relocation-host-runtime.ts +1161 -904
  476. package/src/runtime/host/spot-address-transport.ts +73 -195
  477. package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
  478. package/src/runtime/host/spot-runtime-options-factory.ts +92 -30
  479. package/src/runtime/host/stateful-authority-route-runtime.ts +8 -4
  480. package/src/runtime/host/user-spot-creation-coordinator.ts +182 -163
  481. package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
  482. package/src/runtime/locations/authority-key-codec.ts +7 -3
  483. package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
  484. package/src/runtime/locations/creation-operation-id.ts +6 -3
  485. package/src/runtime/locations/domain-store-contract.ts +12 -3
  486. package/src/runtime/locations/in-memory-authority-store.ts +44 -15
  487. package/src/runtime/locations/in-memory-location-store.ts +50 -39
  488. package/src/runtime/locations/in-memory-provider-location-store.ts +110 -31
  489. package/src/runtime/locations/key-codec.ts +3 -2
  490. package/src/runtime/locations/lease-tracker.ts +8 -14
  491. package/src/runtime/locations/lifecycle.ts +16 -45
  492. package/src/runtime/locations/location-store-failure.ts +4 -0
  493. package/src/runtime/locations/location-store-pages.ts +18 -0
  494. package/src/runtime/locations/location-store-repository.ts +450 -478
  495. package/src/runtime/locations/relocation-blob.ts +17 -6
  496. package/src/runtime/locations/resolvers.ts +90 -58
  497. package/src/runtime/locations/runtime.ts +220 -110
  498. package/src/runtime/locations/spot-location-claims.ts +54 -26
  499. package/src/runtime/messaging/payload-codec.ts +35 -24
  500. package/src/runtime/messaging/submission-result.ts +57 -1
  501. package/src/runtime/protocol/service_wire_codec.generated.ts +27 -10
  502. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +4 -4
  503. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +6 -6
  504. package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +6 -3
  505. package/src/runtime/spots/index.ts +687 -437
  506. package/src/runtime/spots/spot-activation-registry.ts +42 -71
  507. package/src/runtime/spots/spot-activation-state.ts +4 -16
  508. package/src/runtime/spots/spot-activation.ts +167 -115
  509. package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
  510. package/src/runtime/spots/spot-actor-join-dispatch.ts +25 -79
  511. package/src/runtime/spots/spot-actor-lifecycle-drain.ts +20 -18
  512. package/src/runtime/spots/spot-actor-membership.ts +107 -75
  513. package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
  514. package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
  515. package/src/runtime/spots/spot-context.ts +3 -3
  516. package/src/runtime/spots/spot-entry-activation.ts +13 -33
  517. package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
  518. package/src/runtime/spots/spot-manager-public.ts +29 -21
  519. package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
  520. package/src/runtime/spots/spot-node-runtime-manager.ts +145 -140
  521. package/src/runtime/spots/spot-outbound.ts +47 -68
  522. package/src/runtime/spots/spot-remote-codec.ts +7 -3
  523. package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
  524. package/src/runtime/spots/spot-route-replies.ts +6 -4
  525. package/src/runtime/spots/spot-routed-actor-admission.ts +13 -6
  526. package/src/runtime/spots/spot-routed-frame-dispatch.ts +6 -77
  527. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
  528. package/src/runtime/spots/spot-runtime-ports.ts +10 -43
  529. package/src/runtime/spots/spot-serial-executor.ts +10 -2
  530. package/src/runtime/spots/spot-serial-turn-executor.ts +120 -13
  531. package/src/runtime/spots/spot-timer.ts +3 -2
  532. package/src/runtime/streams/actor-session-binding-registry.ts +182 -560
  533. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +1 -19
  534. package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
  535. package/src/runtime/streams/bound-session-service.ts +23 -37
  536. package/src/runtime/streams/index.ts +102 -88
  537. package/src/runtime/streams/managed-stream.ts +29 -10
  538. package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
  539. package/src/runtime/streams/protocol.ts +34 -88
  540. package/src/runtime/streams/session-actor-coordinator.ts +17 -5
  541. package/src/runtime/streams/session-calls.ts +6 -5
  542. package/src/runtime/streams/session-context.ts +54 -10
  543. package/src/runtime/streams/session-requests.ts +2 -1
  544. package/src/runtime/streams/session-serial-executor.ts +2 -2
  545. package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
  546. package/src/runtime/streams/stream-frame-factory.ts +2 -3
  547. package/src/runtime/streams/stream-session-runtime.ts +57 -59
  548. package/src/runtime/workers/index.ts +13 -12
  549. package/dist/runtime/actors/deferred-join-accepted-journal.d.ts +0 -47
  550. package/dist/runtime/actors/deferred-join-accepted-journal.js +0 -992
  551. package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
  552. package/dist/runtime/actors/post-commit-actor-location.js +0 -72
  553. package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
  554. package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
  555. package/src/runtime/actors/deferred-join-accepted-journal.ts +0 -1346
  556. package/src/runtime/actors/post-commit-actor-location.ts +0 -121
  557. package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
@@ -2,23 +2,31 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ServiceStatefulRuntime = exports.ServiceInstanceActivationRedirectError = void 0;
4
4
  exports.statefulMailboxData = statefulMailboxData;
5
+ const stream_wire_1 = require("@zlink-systems/stream-wire");
5
6
  const node_async_hooks_1 = require("node:async_hooks");
7
+ const contracts_1 = require("../../contracts");
8
+ const service_authority_payload_codec_1 = require("./service-authority-payload-codec");
9
+ const ZLinkDispatchOptions_1 = require("../../contracts/Dispatch/ZLinkDispatchOptions");
6
10
  const abort_1 = require("../abort");
11
+ const admission_1 = require("../admission");
12
+ const runtime_values_1 = require("../backend/runtime-values");
13
+ const message_flow_1 = require("../diagnostics/message-flow");
7
14
  const execution_1 = require("../execution");
8
15
  const framework_errors_internal_1 = require("../framework-errors-internal");
9
- const runtime_values_1 = require("../backend/runtime-values");
10
- const ZLinkDispatchOptions_1 = require("../../contracts/Dispatch/ZLinkDispatchOptions");
11
- const service_runtime_contracts_1 = require("./service-runtime-contracts");
16
+ const service_wire_pilot_codec_generated_1 = require("../protocol/service_wire_pilot_codec.generated");
17
+ const actor_join_recovery_codec_1 = require("./actor-join-recovery-codec");
18
+ const operation_registry_1 = require("./operation-registry");
12
19
  const message_follow_suppression_registry_1 = require("./message-follow-suppression-registry");
20
+ const operation_identity_1 = require("./operation-identity");
21
+ const service_metadata_codec_1 = require("./service-metadata-codec");
22
+ const service_runtime_contracts_1 = require("./service-runtime-contracts");
13
23
  const service_stateful_registry_1 = require("./service-stateful-registry");
14
24
  const service_stateful_wire_codec_1 = require("./service-stateful-wire-codec");
15
- const routing_id_1 = require("../routing-id");
16
- const service_wire_pilot_codec_generated_1 = require("../protocol/service_wire_pilot_codec.generated");
17
- const actor_join_recovery_codec_1 = require("./actor-join-recovery-codec");
25
+ const service_wire_binary_primitives_1 = require("./service-wire-binary-primitives");
26
+ const service_wire_constants_generated_1 = require("./service-wire-constants.generated");
18
27
  const service_wire_m6a_codec_1 = require("./service-wire-m6a-codec");
19
- const service_metadata_codec_1 = require("./service-metadata-codec");
20
- const contracts_1 = require("../../contracts");
21
- const ACTOR_ROUTE_STALE = 21;
28
+ const STATEFUL_OPERATION_RETRY_TICK_MS = 20;
29
+ const MAX_NODE_TIMER_DELAY_MS = 2_147_483_647;
22
30
  const SPOT_MOVING = 34;
23
31
  const USER_SPOT_OPERATION_CAPACITY = 65_536;
24
32
  const USER_SPOT_OPERATION_REPLAY_RETENTION_MS = 5 * 60_000;
@@ -46,7 +54,7 @@ class ServiceStatefulRuntime {
46
54
  // behaves exactly like a frame arriving from the receive pump.
47
55
  static detachedIngressScope = node_async_hooks_1.AsyncLocalStorage.snapshot();
48
56
  registry;
49
- operations = new service_stateful_registry_1.ServiceTerminalOperationRegistry();
57
+ operations;
50
58
  sessionDeliveries = new Map();
51
59
  /**
52
60
  * A local Actor owner can replace its own session binding before the
@@ -58,7 +66,6 @@ class ServiceStatefulRuntime {
58
66
  subscriptions = new Map();
59
67
  instanceIntents = new Map();
60
68
  admittedInstanceOperations = new Map();
61
- pendingInstanceTerminals = new Map();
62
69
  pendingInstanceAuthorityTerminals = new Map();
63
70
  instanceApplicationWaiters = new Map();
64
71
  canonicalActorJoinHandoffs = new Map();
@@ -87,10 +94,11 @@ class ServiceStatefulRuntime {
87
94
  admittedUserSpotOperations = new Map();
88
95
  pendingInstanceActivations = new Map();
89
96
  closed = false;
90
- constructor(raw, nodeRid, nodeGeneration) {
97
+ constructor(raw, nodeRid, nodeGeneration, onPendingOperationsChanged) {
91
98
  this.raw = raw;
92
99
  this.nodeRid = nodeRid;
93
100
  this.nodeGeneration = nodeGeneration;
101
+ this.operations = new service_stateful_registry_1.ServiceTerminalOperationRegistry(new operation_registry_1.OperationRegistry(undefined, onPendingOperationsChanged));
94
102
  this.registry = new service_stateful_registry_1.ServiceStatefulRegistry(nodeRid, nodeGeneration);
95
103
  this.registry.createEntrySpot(nodeRid);
96
104
  raw.setServiceIngress((record) => this.ingress(record));
@@ -356,6 +364,7 @@ class ServiceStatefulRuntime {
356
364
  ...(envelope.replyRouteId === undefined ? {} : { replyRouteId: envelope.replyRouteId })
357
365
  };
358
366
  const applicationJobOwner = await this.raw.reserveLocalIngress();
367
+ const terminal = this.activationTerminalCompletion(target, route);
359
368
  try {
360
369
  const admitted = this.enqueueActivatedInstanceSpot({
361
370
  command: service_stateful_wire_codec_1.M6bServiceWireCommand.instanceSpot,
@@ -365,9 +374,9 @@ class ServiceStatefulRuntime {
365
374
  (0, service_stateful_wire_codec_1.encodeInstanceSpotActivationHeader)(target, envelope.sourceNodeGeneration, envelope.sourceNodeRid, envelope.sourceSpotId, envelope.operationKind, envelope.operation, envelope.deadlineUnixMs, envelope.replyRouteId, envelope.metadataFrame !== undefined)
366
375
  ],
367
376
  applicationJobOwner
368
- }, record, Buffer.from(envelope.applicationPayloadFrame), spot, undefined, this.activationTerminalCompletion(target, route), envelope.metadataFrame === undefined
377
+ }, record, Buffer.from(envelope.applicationPayloadFrame), spot, undefined, terminal.onTerminalCompletion, envelope.metadataFrame === undefined
369
378
  ? undefined
370
- : (0, service_metadata_codec_1.validateServiceMetadataFrame)(envelope.metadataFrame), true, this.instanceApplicationTarget(record, route.objectGeneration));
379
+ : (0, service_metadata_codec_1.validateServiceMetadataFrame)(envelope.metadataFrame), terminal.onHandlerTurnStarted, this.instanceApplicationTarget(record, route.objectGeneration));
371
380
  if (admitted !== 'application') {
372
381
  throw new Error('Recovered Instance activation was not admitted to the local queue.');
373
382
  }
@@ -436,10 +445,10 @@ class ServiceStatefulRuntime {
436
445
  }
437
446
  return released;
438
447
  }
448
+ /** Resolves once every first terminal record of an activated Instance message is durable. */
439
449
  waitForInstanceApplicationQuiescence(spotId, signal) {
440
450
  const key = String(spotId);
441
- if ((this.pendingInstanceTerminals.get(key) ?? 0) === 0 &&
442
- (this.pendingInstanceAuthorityTerminals.get(key) ?? 0) === 0) {
451
+ if ((this.pendingInstanceAuthorityTerminals.get(key) ?? 0) === 0) {
443
452
  return Promise.resolve();
444
453
  }
445
454
  if (signal?.aborted === true) {
@@ -653,7 +662,11 @@ class ServiceStatefulRuntime {
653
662
  reporter.report({
654
663
  surface: ZLinkDispatchOptions_1.ZLinkDispatchErrorSurface.SpotRoute,
655
664
  messageKind: ZLinkDispatchOptions_1.ZLinkDispatchMessageKind.Send,
656
- reason: serviceSpotPublishFailureReason(undefined, this.raw.isPeerRouteReady(target.descriptor.nodeRoutingId), this.closed),
665
+ reason: this.closed
666
+ ? ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.Shutdown
667
+ : this.raw.isPeerRouteReady(target.descriptor.nodeRoutingId)
668
+ ? ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.Backpressure
669
+ : ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.StaleTarget,
657
670
  action: ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop,
658
671
  meshName: this.dispatchErrorMeshName,
659
672
  channelName,
@@ -669,20 +682,23 @@ class ServiceStatefulRuntime {
669
682
  if (target === undefined) {
670
683
  return runtime_values_1.SubmitResult.NotFound;
671
684
  }
672
- const header = (0, service_stateful_wire_codec_1.encodeSpotHeader)('spotSend', sourceSpotId, target);
685
+ const header = (0, service_stateful_wire_codec_1.encodeSpotHeader)('spotSend', sourceSpotId, target, undefined, {
686
+ high: this.nodeGeneration,
687
+ low: this.nextMessageFollowOperation++
688
+ });
673
689
  return this.submitOneWay(target.targetNodeRid, [header, (0, service_wire_m6a_codec_1.encodeApplicationPayload)(payload)]);
674
690
  }
675
691
  requestToSpot(sourceSpotId, requested, payload, timeoutMs) {
676
692
  const pending = this.operations.register(timeoutMs);
677
693
  const target = this.acceptSpotAuthority(requested);
678
694
  if (target === undefined) {
679
- this.operations.reply(pending.id, {
680
- terminalResult: runtime_values_1.RequestResult.NotFound,
681
- failureCode: ACTOR_ROUTE_STALE
682
- });
695
+ this.operations.reply(pending.id, (0, framework_errors_internal_1.internalFrameworkWireReply)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale));
683
696
  return pending;
684
697
  }
685
- const header = (0, service_stateful_wire_codec_1.encodeSpotHeader)('spotRequest', sourceSpotId, target, pending.id);
698
+ const header = (0, service_stateful_wire_codec_1.encodeSpotHeader)('spotRequest', sourceSpotId, target, pending.id, {
699
+ high: this.nodeGeneration,
700
+ low: this.nextMessageFollowOperation++
701
+ });
686
702
  this.submitRequest(pending, target.targetNodeRid, [header, (0, service_wire_m6a_codec_1.encodeApplicationPayload)(payload)], timeoutMs, 'spotRequest');
687
703
  return pending;
688
704
  }
@@ -695,17 +711,14 @@ class ServiceStatefulRuntime {
695
711
  : {
696
712
  ...boundSession,
697
713
  sequence: this.nextSessionSequence++
698
- });
714
+ }, { high: this.nodeGeneration, low: this.nextMessageFollowOperation++ });
699
715
  return this.submitOneWay(target.nodeRid, [header, (0, service_wire_m6a_codec_1.encodeApplicationPayload)(payload)]);
700
716
  }
701
717
  requestToActor(target, _targetNodeGeneration, _authorityOwnerGeneration, payload, timeoutMs, sourceActor, boundSession) {
702
718
  const pending = this.operations.register(timeoutMs);
703
719
  const route = this.tryActorFence(target);
704
720
  if (route === undefined) {
705
- this.operations.reply(pending.id, {
706
- terminalResult: runtime_values_1.RequestResult.NotFound,
707
- failureCode: ACTOR_ROUTE_STALE
708
- });
721
+ this.operations.reply(pending.id, (0, framework_errors_internal_1.internalFrameworkWireReply)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale));
709
722
  return pending;
710
723
  }
711
724
  const header = (0, service_stateful_wire_codec_1.encodeActorHeader)('actorRequest', route, pending.id, sourceActor, boundSession === undefined
@@ -713,13 +726,13 @@ class ServiceStatefulRuntime {
713
726
  : {
714
727
  ...boundSession,
715
728
  sequence: this.nextSessionSequence++
716
- });
729
+ }, { high: this.nodeGeneration, low: this.nextMessageFollowOperation++ });
717
730
  this.submitRequest(pending, target.nodeRid, [header, (0, service_wire_m6a_codec_1.encodeApplicationPayload)(payload)], timeoutMs, 'actorRequest');
718
731
  return pending;
719
732
  }
720
- async sendToInstanceSpot(route, payload, sourceSpotId, metadataFrame) {
733
+ async sendToInstanceSpot(route, payload, sourceSpotId, metadataFrame, instanceIntent = false) {
721
734
  return this.submitOneWay(route.targetNodeRid, instanceOperationParts([
722
- (0, service_stateful_wire_codec_1.encodeInstanceSpotHeader)(route, this.nodeGeneration, this.nodeRid, sourceSpotId, 'send', { high: 0n, low: 0n }, undefined, metadataFrame !== undefined),
735
+ (0, service_stateful_wire_codec_1.encodeInstanceSpotHeader)(route, this.nodeGeneration, this.nodeRid, sourceSpotId, 'send', { high: 0n, low: 0n }, undefined, metadataFrame !== undefined, instanceIntent),
723
736
  (0, service_wire_m6a_codec_1.encodeApplicationPayload)(payload)
724
737
  ], metadataFrame));
725
738
  }
@@ -733,10 +746,10 @@ class ServiceStatefulRuntime {
733
746
  payloadFrame
734
747
  ], metadataFrame));
735
748
  }
736
- requestToInstanceSpot(route, payload, timeoutMs, sourceSpotId, metadataFrame) {
749
+ requestToInstanceSpot(route, payload, timeoutMs, sourceSpotId, metadataFrame, instanceIntent = false) {
737
750
  const pending = this.operations.register(timeoutMs);
738
751
  this.submitRequest(pending, route.targetNodeRid, instanceOperationParts([
739
- (0, service_stateful_wire_codec_1.encodeInstanceSpotHeader)(route, this.nodeGeneration, this.nodeRid, sourceSpotId, 'request', { high: 2n, low: pending.id }, pending.id, metadataFrame !== undefined),
752
+ (0, service_stateful_wire_codec_1.encodeInstanceSpotHeader)(route, this.nodeGeneration, this.nodeRid, sourceSpotId, 'request', { high: operation_identity_1.ZLINK_NATIVE_CORRELATION_OPERATION_NAMESPACE, low: pending.id }, pending.id, metadataFrame !== undefined, instanceIntent),
740
753
  (0, service_wire_m6a_codec_1.encodeApplicationPayload)(payload)
741
754
  ], metadataFrame), timeoutMs, 'instanceSpotRequest');
742
755
  return pending;
@@ -841,7 +854,7 @@ class ServiceStatefulRuntime {
841
854
  });
842
855
  return pending;
843
856
  }
844
- bindSession(sessionRid, actor, timeoutMs, deliver, onBindingReplaced, bindingIngress, actorAuthority) {
857
+ bindSession(sessionRid, actor, timeoutMs, deliver, onBindingReplaced, actorAuthority) {
845
858
  const deadlineMs = performance.now() + timeoutMs;
846
859
  const pending = this.operations.register(timeoutMs, 'sender');
847
860
  const generation = this.nextSessionSequence++;
@@ -858,7 +871,6 @@ class ServiceStatefulRuntime {
858
871
  const delivery = {
859
872
  binding: localBinding,
860
873
  deliver,
861
- ...(bindingIngress === undefined ? {} : { bindingIngress }),
862
874
  ...(onBindingReplaced === undefined ? {} : { onBindingReplaced })
863
875
  };
864
876
  const deliveryKey = actorKey(actor);
@@ -966,10 +978,7 @@ class ServiceStatefulRuntime {
966
978
  if (delivery === undefined ||
967
979
  delivery.binding.sessionRid !== sessionRid ||
968
980
  delivery.binding.bindingGeneration !== expectedBindingGeneration) {
969
- this.operations.reply(pending.id, {
970
- terminalResult: runtime_values_1.RequestResult.NotFound,
971
- failureCode: ACTOR_ROUTE_STALE
972
- });
981
+ this.operations.reply(pending.id, (0, framework_errors_internal_1.internalFrameworkWireReply)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale));
973
982
  return pending;
974
983
  }
975
984
  this.sessionDeliveries.delete(actorKey(actor));
@@ -993,7 +1002,16 @@ class ServiceStatefulRuntime {
993
1002
  sessionBindings(sessionRid) {
994
1003
  return [...this.sessionDeliveries.values()]
995
1004
  .map((value) => value.binding)
996
- .filter((binding) => binding.sessionRid === sessionRid);
1005
+ .filter((binding) => binding.sessionRid === sessionRid)
1006
+ .map((binding) => {
1007
+ const owner = requireSessionOwnerIdentity(binding);
1008
+ return {
1009
+ ...binding,
1010
+ sessionOwnerNodeGeneration: owner.nodeGeneration,
1011
+ sessionOwnerId: owner.ownerId,
1012
+ sessionOwnerLeaseGeneration: owner.leaseGeneration
1013
+ };
1014
+ });
997
1015
  }
998
1016
  allSessionBindings() {
999
1017
  return [...this.sessionDeliveries.values()].map((value) => value.binding);
@@ -1008,15 +1026,21 @@ class ServiceStatefulRuntime {
1008
1026
  bindingGeneration: delivery.binding.bindingGeneration
1009
1027
  });
1010
1028
  }
1011
- async sendBoundSession(actor, expectedBindingGeneration, payload, senderFence) {
1029
+ async sendBoundSession(actor, expectedBindingGeneration, payload) {
1030
+ // Session–Actor binding §3 item 3: the source sends by binding identity to
1031
+ // the registered route. The header's owner lifecycle fields are this node's
1032
+ // current route values, not send conditions; the Session owner alone
1033
+ // decides whether the binding is current.
1012
1034
  let binding;
1013
1035
  try {
1014
1036
  binding = this.registry.validateBoundSession(actor, expectedBindingGeneration);
1015
1037
  }
1016
- catch {
1017
- return runtime_values_1.SubmitResult.InvalidState;
1038
+ catch (error) {
1039
+ if (error instanceof service_stateful_registry_1.ServiceStaleGenerationError)
1040
+ return runtime_values_1.SubmitResult.NotFound;
1041
+ throw error;
1018
1042
  }
1019
- const actorFence = this.tryBoundSessionSendFence(actor, senderFence);
1043
+ const actorFence = this.tryActorFence(actor);
1020
1044
  if (actorFence === undefined)
1021
1045
  return runtime_values_1.SubmitResult.InvalidState;
1022
1046
  const header = (0, service_stateful_wire_codec_1.encodeBoundSessionSendHeader)(actorFence, expectedBindingGeneration);
@@ -1025,26 +1049,21 @@ class ServiceStatefulRuntime {
1025
1049
  (0, service_wire_m6a_codec_1.encodeApplicationPayload)(payload)
1026
1050
  ]);
1027
1051
  }
1052
+ expireOperations(nowMs, turnDeadlineMs) {
1053
+ return this.operations.expire(nowMs, turnDeadlineMs);
1054
+ }
1055
+ get pendingOperationCount() {
1056
+ return this.operations.size;
1057
+ }
1028
1058
  close() {
1029
1059
  if (this.closed)
1030
1060
  return;
1031
1061
  this.closed = true;
1032
1062
  this.operations.close();
1033
- const clearedActors = new Set();
1034
- for (const deliveries of [this.sessionDeliveries, this.retiredSessionDeliveries]) {
1035
- for (const delivery of deliveries.values()) {
1036
- const actorId = delivery.binding.actor.actorId;
1037
- if (clearedActors.has(actorId))
1038
- continue;
1039
- clearedActors.add(actorId);
1040
- delivery.bindingIngress?.clearOutbound(actorId, new Error(`Actor '${actorId}' Session service closed with retained outbound delivery.`));
1041
- }
1042
- }
1043
1063
  this.sessionDeliveries.clear();
1044
1064
  this.retiredSessionDeliveries.clear();
1045
1065
  this.appliedReplacementNotices.clear();
1046
1066
  this.instanceIntents.clear();
1047
- this.pendingInstanceTerminals.clear();
1048
1067
  this.pendingInstanceAuthorityTerminals.clear();
1049
1068
  for (const waiters of this.instanceApplicationWaiters.values()) {
1050
1069
  for (const waiter of waiters)
@@ -1094,7 +1113,8 @@ class ServiceStatefulRuntime {
1094
1113
  decoded = statefulActorJoinFromCanonical(canonicalActorJoin);
1095
1114
  }
1096
1115
  else {
1097
- decoded = (0, service_stateful_wire_codec_1.decodeStatefulHeader)(record.parts[0]);
1116
+ const metadata = (record.flags & service_stateful_wire_codec_1.M6bServiceWireFlag.metadata) !== 0;
1117
+ decoded = (0, service_stateful_wire_codec_1.decodeStatefulHeader)(record.parts[0], record.parts[metadata ? 2 : 1], metadata ? record.parts[1] : undefined);
1098
1118
  }
1099
1119
  const hasPayload = [
1100
1120
  'spotSend',
@@ -1106,19 +1126,26 @@ class ServiceStatefulRuntime {
1106
1126
  'boundSessionSend'
1107
1127
  ].includes(decoded.kind);
1108
1128
  const instanceMetadata = decoded.kind === 'instanceSpot' && (record.flags & service_stateful_wire_codec_1.M6bServiceWireFlag.metadata) !== 0;
1129
+ const statefulMetadata = (decoded.kind === 'spotSend' ||
1130
+ decoded.kind === 'spotRequest' ||
1131
+ decoded.kind === 'actorSend' ||
1132
+ decoded.kind === 'actorRequest') &&
1133
+ (record.flags & service_stateful_wire_codec_1.M6bServiceWireFlag.metadata) !== 0;
1109
1134
  const userSpotInfrastructure = decoded.kind === 'userSpotCreate' ||
1110
1135
  decoded.kind === 'userSpotClose' ||
1111
1136
  decoded.kind === 'actorCreate' ||
1112
1137
  decoded.kind === 'messageFollow' ||
1113
1138
  decoded.kind === 'boundSessionReplaced';
1114
1139
  if (record.parts.length < 1 ||
1115
- record.parts.length > (instanceMetadata ? 3 : 2) ||
1116
- (hasPayload && decoded.kind !== 'actorJoin' && record.parts.length !== 2) ||
1140
+ record.parts.length > (instanceMetadata || statefulMetadata ? 3 : 2) ||
1141
+ (hasPayload &&
1142
+ decoded.kind !== 'actorJoin' &&
1143
+ record.parts.length !== ((record.flags & service_stateful_wire_codec_1.M6bServiceWireFlag.metadata) !== 0 ? 3 : 2)) ||
1117
1144
  (decoded.kind === 'instanceSpot' && record.parts.length !== (instanceMetadata ? 3 : 2)) ||
1118
1145
  (userSpotInfrastructure && record.parts.length !== 1)) {
1119
1146
  return 'protocolError';
1120
1147
  }
1121
- const metadataFrame = instanceMetadata
1148
+ const metadataFrame = instanceMetadata || statefulMetadata
1122
1149
  ? (0, service_metadata_codec_1.validateServiceMetadataFrame)(record.parts[1])
1123
1150
  : undefined;
1124
1151
  const canonicalPayload = canonicalActorJoin?.payload === undefined
@@ -1150,6 +1177,21 @@ class ServiceStatefulRuntime {
1150
1177
  if (kind === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestTargetNotFound ||
1151
1178
  kind === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving ||
1152
1179
  kind === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotGenerationStale) {
1180
+ const reporter = this.dispatchErrors;
1181
+ if (decoded.kind === 'instanceSpot' && reporter?.captureEnabled() === true) {
1182
+ reporter.report({
1183
+ surface: ZLinkDispatchOptions_1.ZLinkDispatchErrorSurface.InstanceSpot,
1184
+ messageKind: ZLinkDispatchOptions_1.ZLinkDispatchMessageKind.Send,
1185
+ reason: ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.StaleTarget,
1186
+ action: ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop,
1187
+ meshName: this.dispatchErrorMeshName,
1188
+ sourceRid: decoded.sourceNodeRid,
1189
+ spotId: decoded.activation === 'ready'
1190
+ ? decoded.route.targetSpotId
1191
+ : decoded.target.targetSpotId,
1192
+ error
1193
+ });
1194
+ }
1153
1195
  return 'protocolError';
1154
1196
  }
1155
1197
  }
@@ -1319,15 +1361,9 @@ class ServiceStatefulRuntime {
1319
1361
  targetSpotId: record.route.targetSpotId,
1320
1362
  stableType: intent.instanceType
1321
1363
  };
1322
- // A close seals execution only after the current application count reaches
1323
- // zero. A new Instance message must wait for that close even while the old
1324
- // activation is still materialized; otherwise it can be admitted after
1325
- // the close quiescence check and be removed with the old activation.
1326
- if (lifecycle.isClosing?.(applicationTarget) === true)
1327
- return true;
1328
1364
  return !lifecycle.isMaterialized(applicationTarget);
1329
1365
  }
1330
- enqueueActivatedInstanceSpot(ingress, record, payloadFrame, spot, localReply, onTerminalCompletion, metadataFrame, activationTerminal = false, applicationTargetOverride) {
1366
+ enqueueActivatedInstanceSpot(ingress, record, payloadFrame, spot, localReply, onTerminalCompletion, metadataFrame, onHandlerTurnStarted, applicationTargetOverride) {
1331
1367
  let operationKey;
1332
1368
  if (record.activation === 'missing') {
1333
1369
  const now = BigInt(Date.now());
@@ -1354,10 +1390,6 @@ class ServiceStatefulRuntime {
1354
1390
  const terminalCompletion = onTerminalCompletion === undefined
1355
1391
  ? undefined
1356
1392
  : async () => {
1357
- // The application turn has returned before authority cleanup starts.
1358
- // Mark it quiescent first so a close requested by that turn can finish
1359
- // its local cleanup and release the exact authority fence below.
1360
- this.completeInstanceApplicationOperation(applicationTarget.targetSpotId);
1361
1393
  try {
1362
1394
  await onTerminalCompletion();
1363
1395
  }
@@ -1373,8 +1405,11 @@ class ServiceStatefulRuntime {
1373
1405
  ...(record.operationKind === 'request' ? { correlation: record.replyRouteId } : {}),
1374
1406
  ...(record.sourceSpotId === undefined ? {} : { sourceSpotId: record.sourceSpotId }),
1375
1407
  targetSpot: spot.ref,
1408
+ activationRecord: record,
1409
+ ...(record.activation === 'missing' ? { deadlineUnixMs: record.deadlineUnixMs } : {}),
1376
1410
  ...(metadataFrame === undefined ? {} : { applicationMetadata: metadataFrame }),
1377
1411
  ...(terminalCompletion === undefined ? {} : { onTerminalCompletion: terminalCompletion }),
1412
+ ...(onHandlerTurnStarted === undefined ? {} : { onHandlerTurnStarted }),
1378
1413
  ...(record.operationKind === 'request'
1379
1414
  ? {
1380
1415
  reply: onTerminalCompletion === undefined
@@ -1390,10 +1425,6 @@ class ServiceStatefulRuntime {
1390
1425
  this.admittedInstanceOperations.set(operationKey, record.deadlineUnixMs);
1391
1426
  }
1392
1427
  if (onTerminalCompletion !== undefined && result === 'application') {
1393
- this.beginInstanceApplicationOperation(applicationTarget.targetSpotId);
1394
- if (activationTerminal) {
1395
- this.beginInstanceAuthorityOperation(applicationTarget.targetSpotId);
1396
- }
1397
1428
  this.instanceApplicationLifecycle?.beginTerminal(applicationTarget);
1398
1429
  }
1399
1430
  return result;
@@ -1404,7 +1435,8 @@ class ServiceStatefulRuntime {
1404
1435
  const activation = await this.activateMissingInstanceAsync(record, payloadFrame, metadataFrame);
1405
1436
  if (this.closed)
1406
1437
  return;
1407
- const admitted = this.enqueueActivatedInstanceSpot(ingress, record, payloadFrame, activation.spot, localReply, this.activationTerminalCompletion(record.target, activation.route), metadataFrame, true, this.instanceApplicationTarget(record, activation.route.objectGeneration));
1438
+ const terminal = this.activationTerminalCompletion(record.target, activation.route);
1439
+ const admitted = this.enqueueActivatedInstanceSpot(ingress, record, payloadFrame, activation.spot, localReply, terminal.onTerminalCompletion, metadataFrame, terminal.onHandlerTurnStarted, this.instanceApplicationTarget(record, activation.route.objectGeneration));
1408
1440
  if (admitted !== 'application') {
1409
1441
  throw new Error('Activated Instance message was not admitted to the local queue.');
1410
1442
  }
@@ -1454,7 +1486,7 @@ class ServiceStatefulRuntime {
1454
1486
  ? { ...record, route: latestRoute }
1455
1487
  : record;
1456
1488
  const spot = this.requireInstanceActivation(ingress, refreshedRecord);
1457
- const admitted = this.enqueueActivatedInstanceSpot(ingress, refreshedRecord, payloadFrame, spot, undefined, this.instanceApplicationTerminalCompletion(this.instanceApplicationTarget(refreshedRecord)), metadataFrame);
1489
+ const admitted = this.enqueueActivatedInstanceSpot(ingress, record, payloadFrame, spot, undefined, this.instanceApplicationTerminalCompletion(this.instanceApplicationTarget(refreshedRecord)), metadataFrame, undefined, this.instanceApplicationTarget(refreshedRecord));
1458
1490
  if (admitted !== 'application') {
1459
1491
  throw new Error('Rematerialized Instance message was not admitted to the local queue.');
1460
1492
  }
@@ -1466,19 +1498,33 @@ class ServiceStatefulRuntime {
1466
1498
  this.replyWire(ingress, record.replyRouteId, result.terminalResult, result.failureCode);
1467
1499
  }
1468
1500
  }
1501
+ /**
1502
+ * Spot messaging §4 step 12 with §7 step 1: a Close waits for the first terminal
1503
+ * record only of a message whose handler turn started before it; a message queued
1504
+ * behind that Close is not counted, so it cannot hold the Close it follows.
1505
+ */
1469
1506
  activationTerminalCompletion(target, route) {
1470
1507
  let completion;
1508
+ let started = false;
1471
1509
  const applicationTarget = {
1472
1510
  targetSpotId: target.targetSpotId,
1473
1511
  stableType: target.stableType,
1474
1512
  objectGeneration: route.objectGeneration
1475
1513
  };
1476
- return () => (completion ??= (async () => {
1477
- let authorityCompletionSignaled = false;
1514
+ const onHandlerTurnStarted = () => {
1515
+ if (started || completion !== undefined)
1516
+ return;
1517
+ started = true;
1518
+ this.beginInstanceAuthorityOperation(target.targetSpotId);
1519
+ };
1520
+ const onTerminalCompletion = () => (completion ??= (async () => {
1521
+ let authorityCompletionSignaled = !started;
1478
1522
  try {
1479
1523
  const released = await this.asyncInstanceAuthority?.complete(target, route);
1480
- this.completeInstanceAuthorityOperation(target.targetSpotId);
1481
- authorityCompletionSignaled = true;
1524
+ if (!authorityCompletionSignaled) {
1525
+ this.completeInstanceAuthorityOperation(target.targetSpotId);
1526
+ authorityCompletionSignaled = true;
1527
+ }
1482
1528
  if (released !== undefined) {
1483
1529
  const authorityReleased = (await this.instanceApplicationLifecycle?.completeTerminal(applicationTarget)) ??
1484
1530
  false;
@@ -1496,6 +1542,7 @@ class ServiceStatefulRuntime {
1496
1542
  }
1497
1543
  }
1498
1544
  })());
1545
+ return { onTerminalCompletion, onHandlerTurnStarted };
1499
1546
  }
1500
1547
  instanceApplicationTerminalCompletion(target) {
1501
1548
  return async () => {
@@ -1530,24 +1577,10 @@ class ServiceStatefulRuntime {
1530
1577
  objectGeneration: record.route.objectGeneration
1531
1578
  };
1532
1579
  }
1533
- beginInstanceApplicationOperation(spotId) {
1534
- const key = String(spotId);
1535
- this.pendingInstanceTerminals.set(key, (this.pendingInstanceTerminals.get(key) ?? 0) + 1);
1536
- }
1537
1580
  beginInstanceAuthorityOperation(spotId) {
1538
1581
  const key = String(spotId);
1539
1582
  this.pendingInstanceAuthorityTerminals.set(key, (this.pendingInstanceAuthorityTerminals.get(key) ?? 0) + 1);
1540
1583
  }
1541
- completeInstanceApplicationOperation(spotId) {
1542
- const key = String(spotId);
1543
- const pending = this.pendingInstanceTerminals.get(key);
1544
- if (pending === undefined || pending <= 1) {
1545
- this.pendingInstanceTerminals.delete(key);
1546
- this.completeInstanceApplicationWaitersIfQuiescent(key);
1547
- return;
1548
- }
1549
- this.pendingInstanceTerminals.set(key, pending - 1);
1550
- }
1551
1584
  completeInstanceAuthorityOperation(spotId) {
1552
1585
  const key = String(spotId);
1553
1586
  const pending = this.pendingInstanceAuthorityTerminals.get(key);
@@ -1559,8 +1592,7 @@ class ServiceStatefulRuntime {
1559
1592
  this.pendingInstanceAuthorityTerminals.set(key, pending - 1);
1560
1593
  }
1561
1594
  completeInstanceApplicationWaitersIfQuiescent(key) {
1562
- if ((this.pendingInstanceTerminals.get(key) ?? 0) !== 0 ||
1563
- (this.pendingInstanceAuthorityTerminals.get(key) ?? 0) !== 0)
1595
+ if ((this.pendingInstanceAuthorityTerminals.get(key) ?? 0) !== 0)
1564
1596
  return;
1565
1597
  const waiters = this.instanceApplicationWaiters.get(key);
1566
1598
  if (waiters === undefined)
@@ -1637,8 +1669,8 @@ class ServiceStatefulRuntime {
1637
1669
  // activation continuation can publish its in-memory intent. If the
1638
1670
  // local ready projection already carries the exact object and owner
1639
1671
  // fence from the received route, publish that validated projection
1640
- // instead of exposing a transient NotFound result to a following
1641
- // request. A mismatched or absent local projection remains NotFound.
1672
+ // instead of rejecting a following request while publication finishes.
1673
+ // An absent Ready projection cannot validate the received owner fence.
1642
1674
  const local = this.registry.spot(record.route.targetSpotId);
1643
1675
  if (local?.kind === 'instance' &&
1644
1676
  local.state === 'ready' &&
@@ -1648,7 +1680,7 @@ class ServiceStatefulRuntime {
1648
1680
  }
1649
1681
  }
1650
1682
  if (intent === undefined) {
1651
- throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestTargetNotFound, `Instance Spot '${record.route.targetSpotId}' has no current Ready authority.`);
1683
+ throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving, `Instance Spot '${record.route.targetSpotId}' has no current Ready authority.`);
1652
1684
  }
1653
1685
  const current = intent.route;
1654
1686
  if (current.objectGeneration < record.route.objectGeneration) {
@@ -1754,6 +1786,40 @@ class ServiceStatefulRuntime {
1754
1786
  }
1755
1787
  const local = this.registry.spot(target.targetSpotId);
1756
1788
  const current = await authority.read(target);
1789
+ if (current.kind === 'creating' &&
1790
+ current.authority?.allocation.state === 'active' &&
1791
+ this.instanceApplicationLifecycle?.isMaterializing?.(target) === true) {
1792
+ return {
1793
+ spot: { ref: { spotId: target.targetSpotId, generation: current.objectGeneration } },
1794
+ route: {
1795
+ targetSpotId: target.targetSpotId,
1796
+ targetNodeRid: this.nodeRid,
1797
+ targetNodeGeneration: this.nodeGeneration,
1798
+ objectGeneration: current.objectGeneration,
1799
+ authorityOwnerGeneration: current.authorityOwnerGeneration,
1800
+ ownerId: current.authority.ownerId,
1801
+ leaseGeneration: current.authority.ownerLeaseGeneration,
1802
+ storeVersion: current.authority.storeVersion.value
1803
+ }
1804
+ };
1805
+ }
1806
+ if (current.kind === 'ready' &&
1807
+ current.authority !== undefined &&
1808
+ (0, service_authority_payload_codec_1.decodeServiceClosingSpotAuthority)(current.authority.payload) !== undefined) {
1809
+ if (current.route.targetNodeRid !== this.nodeRid) {
1810
+ throw new ServiceInstanceActivationRedirectError(current.route);
1811
+ }
1812
+ if (current.route.targetNodeGeneration !== this.nodeGeneration ||
1813
+ (local !== undefined &&
1814
+ !routeMatchesLocal(current.route, local, this.nodeRid, this.nodeGeneration)) ||
1815
+ (local === undefined && this.instanceApplicationLifecycle?.isMaterialized(target) !== true)) {
1816
+ throw new service_stateful_registry_1.ServiceStaleGenerationError('spot', target.targetSpotId);
1817
+ }
1818
+ return {
1819
+ spot: { ref: { spotId: target.targetSpotId, generation: current.route.objectGeneration } },
1820
+ route: current.route
1821
+ };
1822
+ }
1757
1823
  if (!this.acceptsLocalMissingInstancePlacement()) {
1758
1824
  if (current.kind === 'ready' && current.route.targetNodeRid !== this.nodeRid) {
1759
1825
  throw new ServiceInstanceActivationRedirectError(current.route);
@@ -1781,7 +1847,6 @@ class ServiceStatefulRuntime {
1781
1847
  }
1782
1848
  if (local !== undefined) {
1783
1849
  const lifecycle = this.instanceApplicationLifecycle;
1784
- const closing = lifecycle?.isClosing?.(target) === true;
1785
1850
  let materialized = lifecycle === undefined ? undefined : lifecycle.isMaterialized(target);
1786
1851
  const materializing = lifecycle?.isMaterializing?.(target) === true;
1787
1852
  if (local.kind !== 'instance' || local.stableType !== target.stableType) {
@@ -1790,9 +1855,7 @@ class ServiceStatefulRuntime {
1790
1855
  const joinsCreating = current.kind === 'creating' &&
1791
1856
  local.ref.generation === current.objectGeneration &&
1792
1857
  local.authorityOwnerGeneration === current.authorityOwnerGeneration;
1793
- const replacesClosingProjection = current.kind === 'creating' && closing;
1794
1858
  if (current.kind === 'missing' &&
1795
- !closing &&
1796
1859
  !materializing &&
1797
1860
  materialized === true &&
1798
1861
  lifecycle !== undefined) {
@@ -1814,23 +1877,30 @@ class ServiceStatefulRuntime {
1814
1877
  // failure.
1815
1878
  // If disposal did not remove an orphaned materialization, keep fencing
1816
1879
  // it instead of admitting work into two application generations.
1817
- if ((!joinsCreating && !replacesClosingProjection && current.kind !== 'missing') ||
1818
- (!joinsCreating && !closing && materialized !== false && !materializing)) {
1880
+ if ((!joinsCreating && current.kind !== 'missing') ||
1881
+ (!joinsCreating && materialized !== false && !materializing)) {
1819
1882
  throw new service_stateful_registry_1.ServiceStaleGenerationError('spot', target.targetSpotId);
1820
1883
  }
1821
1884
  }
1822
- const reserved = await authority.reserve({
1823
- target,
1824
- sourceNodeRid: record.sourceNodeRid,
1825
- sourceNodeGeneration: record.sourceNodeGeneration,
1826
- ...(record.sourceSpotId === undefined ? {} : { sourceSpotId: record.sourceSpotId }),
1827
- operationKind: record.operationKind,
1828
- operation: record.operation,
1829
- ...(record.replyRouteId === undefined ? {} : { replyRouteId: record.replyRouteId }),
1830
- deadlineUnixMs: record.deadlineUnixMs,
1831
- ...(metadataFrame === undefined ? {} : { metadataFrame }),
1832
- applicationPayloadFrame: payloadFrame
1833
- });
1885
+ const deadline = operationDeadline(record.deadlineUnixMs);
1886
+ let reserved;
1887
+ try {
1888
+ reserved = await authority.reserve({
1889
+ target,
1890
+ sourceNodeRid: record.sourceNodeRid,
1891
+ sourceNodeGeneration: record.sourceNodeGeneration,
1892
+ ...(record.sourceSpotId === undefined ? {} : { sourceSpotId: record.sourceSpotId }),
1893
+ operationKind: record.operationKind,
1894
+ operation: record.operation,
1895
+ ...(record.replyRouteId === undefined ? {} : { replyRouteId: record.replyRouteId }),
1896
+ deadlineUnixMs: record.deadlineUnixMs,
1897
+ ...(metadataFrame === undefined ? {} : { metadataFrame }),
1898
+ applicationPayloadFrame: payloadFrame
1899
+ }, deadline.signal);
1900
+ }
1901
+ finally {
1902
+ deadline.close();
1903
+ }
1834
1904
  if (reserved.kind === 'ready') {
1835
1905
  throw new ServiceInstanceActivationRedirectError(reserved.route);
1836
1906
  }
@@ -1850,7 +1920,7 @@ class ServiceStatefulRuntime {
1850
1920
  }
1851
1921
  let committed;
1852
1922
  try {
1853
- committed = await authority.commit(target, reserved.reservation, activation.spot);
1923
+ committed = await authority.commit(target, reserved.reservation, activation.spot, record.deadlineUnixMs);
1854
1924
  }
1855
1925
  catch (error) {
1856
1926
  if (activation.created)
@@ -2203,7 +2273,15 @@ class ServiceStatefulRuntime {
2203
2273
  const accepted = this.raw.mailbox.tryEnqueue({
2204
2274
  owner: `actor:${actor.actorId}\0${actor.generation}`,
2205
2275
  domain: 'infrastructure',
2206
- parts: [Buffer.from([0x5a, 0x4d, 1, service_stateful_wire_codec_1.M6bServiceWireCommand.boundSessionBind, 0])],
2276
+ parts: [
2277
+ Buffer.from([
2278
+ service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[0],
2279
+ service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[1],
2280
+ service_wire_constants_generated_1.SERVICE_WIRE_MAJOR,
2281
+ service_stateful_wire_codec_1.M6bServiceWireCommand.boundSessionBind,
2282
+ 0
2283
+ ])
2284
+ ],
2207
2285
  sourceRoutingId: binding.sessionOwnerNodeRid,
2208
2286
  stateful: {
2209
2287
  receiveKind: service_runtime_contracts_1.ReceiveKind.ActorBinding,
@@ -2232,63 +2310,26 @@ class ServiceStatefulRuntime {
2232
2310
  return accepted;
2233
2311
  }
2234
2312
  async deliverBoundSession(ingress, record, payloadFrame) {
2313
+ // Session–Actor binding §3 item 3, §8.1: this Session owner's binding
2314
+ // record alone decides whether command 36 names the current binding
2315
+ // (ActorId, ObjectGeneration, binding generation; SessionRid is the
2316
+ // record's own). The transport boundary has already authenticated the
2317
+ // source peer, and the header's route fields are not compared here.
2318
+ if (payloadFrame === undefined)
2319
+ return 'protocolError';
2235
2320
  const delivery = this.sessionDeliveries.get(actorKey(record.actor.actor));
2236
2321
  if (delivery === undefined ||
2237
- delivery.binding.bindingGeneration !== record.expectedBindingGeneration ||
2238
- payloadFrame === undefined ||
2239
- ingress.sourceNodeGeneration === undefined ||
2240
- !(0, routing_id_1.routingIdsEqual)(ingress.sourceRoutingId, record.actor.actor.nodeRid) ||
2241
- ingress.sourceNodeGeneration !== record.actor.targetNodeGeneration) {
2322
+ delivery.binding.bindingGeneration !== record.expectedBindingGeneration) {
2323
+ this.traceRejectedBoundSessionSend(ingress, record, payloadFrame);
2242
2324
  return 'protocolError';
2243
2325
  }
2244
2326
  const sessionRid = delivery.binding.sessionRid;
2245
- let retainedPayload = payloadFrame;
2246
- let settled = false;
2247
- const settle = () => {
2248
- if (settled)
2249
- return false;
2250
- settled = true;
2251
- retainedPayload = undefined;
2252
- return true;
2253
- };
2254
- const operation = {
2255
- deliver: async () => {
2256
- if (settled || retainedPayload === undefined)
2257
- return false;
2258
- const delivered = await delivery.deliver(sessionRid, retainedPayload);
2259
- if (delivered)
2260
- settle();
2261
- return delivered;
2262
- },
2263
- fail: (_error) => {
2264
- settle();
2265
- }
2266
- };
2267
- const decision = await delivery.bindingIngress?.retainOutbound({
2268
- actorId: record.actor.actor.actorId,
2269
- objectGeneration: record.actor.actor.generation,
2270
- actorNodeRid: record.actor.actor.nodeRid,
2271
- actorNodeGeneration: record.actor.targetNodeGeneration,
2272
- authorityOwnerGeneration: record.actor.authorityOwnerGeneration,
2273
- ownerLeaseGeneration: record.actor.ownerLeaseGeneration,
2274
- producerNodeRid: ingress.sourceRoutingId,
2275
- producerNodeGeneration: ingress.sourceNodeGeneration,
2276
- sessionIdentity: sessionRid,
2277
- bindingGeneration: record.expectedBindingGeneration
2278
- }, operation);
2279
- if (decision === 'retained')
2280
- return 'application';
2281
- if (decision === 'rejected') {
2282
- return 'protocolError';
2283
- }
2284
2327
  try {
2285
- const delivered = await delivery.deliver(sessionRid, retainedPayload);
2286
- settle();
2328
+ const delivered = await delivery.deliver(sessionRid, payloadFrame);
2287
2329
  if (!delivered)
2288
2330
  return 'protocolError';
2289
2331
  }
2290
2332
  catch (error) {
2291
- operation.fail(error);
2292
2333
  // Remote command 36 is one-way: its source transport admission has
2293
2334
  // already completed, so a later client delivery terminal is local to
2294
2335
  // this session owner. Local fast paths still preserve the typed result.
@@ -2301,6 +2342,35 @@ class ServiceStatefulRuntime {
2301
2342
  }
2302
2343
  return 'application';
2303
2344
  }
2345
+ // Session–Actor binding §3 item 4: a push refused as not current is
2346
+ // recorded with the closed flow vocabulary (dropped, stream_session, send,
2347
+ // stale_target) instead of disappearing. Nothing is built while tracing is
2348
+ // off.
2349
+ traceRejectedBoundSessionSend(ingress, record, payloadFrame) {
2350
+ const tracePoint = (0, message_flow_1.flowIfEnabled)(this.dispatchErrors?.flow, ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Dropped);
2351
+ if (tracePoint === undefined)
2352
+ return;
2353
+ let packetName;
2354
+ try {
2355
+ packetName = (0, service_wire_m6a_codec_1.decodeApplicationPayloadView)(payloadFrame).packetName;
2356
+ }
2357
+ catch (error) {
2358
+ // A malformed payload is still a refused push; it is traced without a
2359
+ // packet name.
2360
+ if (!(error instanceof service_wire_m6a_codec_1.ServiceWireProtocolError))
2361
+ throw error;
2362
+ }
2363
+ tracePoint.trace({
2364
+ outcome: ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Dropped,
2365
+ surface: ZLinkDispatchOptions_1.ZLinkDispatchErrorSurface.StreamSession,
2366
+ messageKind: ZLinkDispatchOptions_1.ZLinkDispatchMessageKind.Send,
2367
+ ...(packetName === undefined ? {} : { packetName }),
2368
+ ...(this.dispatchErrorMeshName === undefined ? {} : { meshName: this.dispatchErrorMeshName }),
2369
+ sourceRid: ingress.sourceRoutingId,
2370
+ actorId: record.actor.actor.actorId,
2371
+ errorReason: ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.StaleTarget
2372
+ });
2373
+ }
2304
2374
  enqueueApplicationFrame(ingress, owner, payloadFrame, stateful) {
2305
2375
  return this.enqueueFrame('application', ingress, owner, payloadFrame, stateful);
2306
2376
  }
@@ -2378,7 +2448,13 @@ class ServiceStatefulRuntime {
2378
2448
  }
2379
2449
  }
2380
2450
  enqueueActorControl(spotId, control, onTerminalCompletion) {
2381
- const header = Buffer.from([0x5a, 0x4d, 1, service_stateful_wire_codec_1.M6bServiceWireCommand.actorJoined, 0]);
2451
+ const header = Buffer.from([
2452
+ service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[0],
2453
+ service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[1],
2454
+ service_wire_constants_generated_1.SERVICE_WIRE_MAJOR,
2455
+ service_stateful_wire_codec_1.M6bServiceWireCommand.actorJoined,
2456
+ 0
2457
+ ]);
2382
2458
  let terminalAttempted = false;
2383
2459
  void (async () => {
2384
2460
  const applicationJobOwner = await this.raw.reserveLocalIngress();
@@ -2421,7 +2497,13 @@ class ServiceStatefulRuntime {
2421
2497
  enqueueActorBindingControl(ingress, binding, actorAuthority, reply) {
2422
2498
  const actor = binding.actor;
2423
2499
  const sessionOwner = requireSessionOwnerIdentity(binding);
2424
- const header = Buffer.from([0x5a, 0x4d, 1, service_stateful_wire_codec_1.M6bServiceWireCommand.boundSessionBind, 0]);
2500
+ const header = Buffer.from([
2501
+ service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[0],
2502
+ service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[1],
2503
+ service_wire_constants_generated_1.SERVICE_WIRE_MAJOR,
2504
+ service_stateful_wire_codec_1.M6bServiceWireCommand.boundSessionBind,
2505
+ 0
2506
+ ]);
2425
2507
  const applicationJob = requireApplicationJobOwner(ingress).takeInitial('infrastructure');
2426
2508
  const accepted = this.raw.mailbox.tryEnqueue({
2427
2509
  owner: `actor:${actor.actorId}\0${actor.generation}`,
@@ -2561,7 +2643,7 @@ class ServiceStatefulRuntime {
2561
2643
  }
2562
2644
  }
2563
2645
  async executeUserSpotOperation(handler, record) {
2564
- const deadline = userSpotDeadline(record.deadlineUnixMs);
2646
+ const deadline = operationDeadline(record.deadlineUnixMs);
2565
2647
  try {
2566
2648
  const result = record.kind === 'userSpotCreate'
2567
2649
  ? await handler.create(record, deadline.signal)
@@ -2640,7 +2722,7 @@ class ServiceStatefulRuntime {
2640
2722
  throw error;
2641
2723
  if (durableRequestWasAdmitted(error))
2642
2724
  wasAdmitted = true;
2643
- const retryDelayMs = Math.min(20, deadlineMs - performance.now());
2725
+ const retryDelayMs = Math.min(STATEFUL_OPERATION_RETRY_TICK_MS, deadlineMs - performance.now());
2644
2726
  if (retryDelayMs <= 0) {
2645
2727
  throw durableOperationExhausted(operationKind, wasAdmitted, error);
2646
2728
  }
@@ -2689,8 +2771,8 @@ class ServiceStatefulRuntime {
2689
2771
  const applicationJobOwner = await this.raw.reserveLocalIngress();
2690
2772
  try {
2691
2773
  const result = await this.ingress({
2692
- command: header[3],
2693
- flags: header[4],
2774
+ command: header[service_wire_binary_primitives_1.SERVICE_WIRE_COMMAND_OFFSET],
2775
+ flags: header[service_wire_binary_primitives_1.SERVICE_WIRE_FLAGS_OFFSET],
2694
2776
  sourceRoutingId: this.nodeRid,
2695
2777
  requestSequence,
2696
2778
  reply: finish,
@@ -2723,8 +2805,8 @@ class ServiceStatefulRuntime {
2723
2805
  void ServiceStatefulRuntime.detachedIngressScope(async () => {
2724
2806
  try {
2725
2807
  await this.ingress({
2726
- command: parts[0][3],
2727
- flags: parts[0][4],
2808
+ command: parts[0][service_wire_binary_primitives_1.SERVICE_WIRE_COMMAND_OFFSET],
2809
+ flags: parts[0][service_wire_binary_primitives_1.SERVICE_WIRE_FLAGS_OFFSET],
2728
2810
  sourceRoutingId: this.nodeRid,
2729
2811
  sourceNodeGeneration: this.nodeGeneration,
2730
2812
  parts,
@@ -2744,8 +2826,8 @@ class ServiceStatefulRuntime {
2744
2826
  }
2745
2827
  try {
2746
2828
  const result = await this.ingress({
2747
- command: parts[0][3],
2748
- flags: parts[0][4],
2829
+ command: parts[0][service_wire_binary_primitives_1.SERVICE_WIRE_COMMAND_OFFSET],
2830
+ flags: parts[0][service_wire_binary_primitives_1.SERVICE_WIRE_FLAGS_OFFSET],
2749
2831
  sourceRoutingId: this.nodeRid,
2750
2832
  sourceNodeGeneration: this.nodeGeneration,
2751
2833
  parts,
@@ -2772,18 +2854,22 @@ class ServiceStatefulRuntime {
2772
2854
  submitRequest(pending, targetNodeRid, parts, timeoutMs, operationKind, actor) {
2773
2855
  if (targetNodeRid === this.nodeRid) {
2774
2856
  const deadlineUnixMs = BigInt(Date.now() + Math.max(0, timeoutMs));
2857
+ const capacityStop = new AbortController();
2858
+ void pending.promise.then(() => capacityStop.abort(), () => capacityStop.abort());
2775
2859
  void (async () => {
2776
- const applicationJobOwner = await this.raw.reserveLocalIngress();
2777
- const localIngress = {
2778
- command: parts[0][3],
2779
- flags: parts[0][4],
2780
- sourceRoutingId: this.nodeRid,
2781
- requestSequence: pending.id,
2782
- parts,
2783
- applicationJobOwner
2784
- };
2860
+ const applicationJobOwner = await this.raw.reserveLocalIngress(capacityStop.signal);
2785
2861
  try {
2786
- this.submitLocalRequest(localIngress, pending, operationKind, actor, deadlineUnixMs);
2862
+ if (!this.operations.isPending(pending.id))
2863
+ return;
2864
+ const localIngress = {
2865
+ command: parts[0][service_wire_binary_primitives_1.SERVICE_WIRE_COMMAND_OFFSET],
2866
+ flags: parts[0][service_wire_binary_primitives_1.SERVICE_WIRE_FLAGS_OFFSET],
2867
+ sourceRoutingId: this.nodeRid,
2868
+ requestSequence: pending.id,
2869
+ parts,
2870
+ applicationJobOwner
2871
+ };
2872
+ await this.submitLocalRequest(localIngress, pending, operationKind, actor, deadlineUnixMs);
2787
2873
  }
2788
2874
  catch (error) {
2789
2875
  this.operations.reply(pending.id, failure(error));
@@ -2801,10 +2887,7 @@ class ServiceStatefulRuntime {
2801
2887
  ? this.tryActorFence(actor)
2802
2888
  : this.acceptCanonicalActorFence(actor, canonical.actorFence);
2803
2889
  if (target === undefined || actorRoute === undefined) {
2804
- this.operations.reply(pending.id, {
2805
- terminalResult: runtime_values_1.RequestResult.NotFound,
2806
- failureCode: ACTOR_ROUTE_STALE
2807
- });
2890
+ this.operations.reply(pending.id, (0, framework_errors_internal_1.internalFrameworkWireReply)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale));
2808
2891
  return;
2809
2892
  }
2810
2893
  if (canonical !== undefined) {
@@ -2854,7 +2937,7 @@ class ServiceStatefulRuntime {
2854
2937
  this.operations.fail(pending.id, error);
2855
2938
  });
2856
2939
  }
2857
- submitLocalRequest(ingress, pending, operationKind, actor, deadlineUnixMs) {
2940
+ async submitLocalRequest(ingress, pending, operationKind, actor, deadlineUnixMs) {
2858
2941
  const canonicalActorJoin = operationKind === 'actorJoin' ? (0, service_wire_pilot_codec_generated_1.decodeActorJoin28)(ingress.parts) : undefined;
2859
2942
  const decoded = canonicalActorJoin === undefined
2860
2943
  ? (0, service_stateful_wire_codec_1.decodeStatefulHeader)(ingress.parts[0])
@@ -2911,7 +2994,9 @@ class ServiceStatefulRuntime {
2911
2994
  operationKind: service_runtime_contracts_1.OperationKind.ActorRequest,
2912
2995
  correlation: decoded.correlation,
2913
2996
  targetActor: current.ref,
2914
- ...(decoded.sourceActor === undefined ? {} : { sourceActor: decoded.sourceActor }),
2997
+ ...(decoded.sourceActor === undefined
2998
+ ? {}
2999
+ : { sourceActor: { ...decoded.sourceActor, nodeRid: ingress.sourceRoutingId } }),
2915
3000
  ...(decoded.boundSession === undefined
2916
3001
  ? {}
2917
3002
  : { sourceBindingGeneration: decoded.boundSession.bindingGeneration }),
@@ -3147,6 +3232,10 @@ class ServiceStatefulRuntime {
3147
3232
  return spot;
3148
3233
  }
3149
3234
  validateDirectSpotFence(fence) {
3235
+ if (fence.targetNodeRid !== this.nodeRid ||
3236
+ fence.targetNodeGeneration !== this.nodeGeneration) {
3237
+ throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving, `Spot '${fence.spot.spotId}' targets an unavailable owner route.`);
3238
+ }
3150
3239
  const spot = this.registry.spot(fence.spot.spotId);
3151
3240
  if (spot === undefined) {
3152
3241
  throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestTargetNotFound, `Spot '${fence.spot.spotId}' has no current Ready authority.`);
@@ -3154,10 +3243,6 @@ class ServiceStatefulRuntime {
3154
3243
  if (spot.state !== 'ready') {
3155
3244
  throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving, `Spot '${fence.spot.spotId}' is not Ready.`);
3156
3245
  }
3157
- if (fence.targetNodeRid !== this.nodeRid ||
3158
- fence.targetNodeGeneration !== this.nodeGeneration) {
3159
- throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving, `Spot '${fence.spot.spotId}' targets an unavailable owner route.`);
3160
- }
3161
3246
  if (spot.kind === 'entry') {
3162
3247
  if (!isEntrySpotFence(fence)) {
3163
3248
  throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving, `Entry Spot '${fence.spot.spotId}' has an invalid owner fence.`);
@@ -3179,7 +3264,7 @@ class ServiceStatefulRuntime {
3179
3264
  }
3180
3265
  holdOrRelaySpotMessage(ingress, wire) {
3181
3266
  const state = this.spotMessageFollow.get(spotKey(wire.target.spot));
3182
- if (state === undefined || !sameDirectSpotRoute(state.source, wire.target)) {
3267
+ if (state === undefined || !sameDirectSpotRouteIdentity(state.source, wire.target)) {
3183
3268
  return undefined;
3184
3269
  }
3185
3270
  if (state.expiresAtMs !== undefined && state.expiresAtMs <= performance.now()) {
@@ -3224,9 +3309,13 @@ class ServiceStatefulRuntime {
3224
3309
  }
3225
3310
  const current = this.peekSpotMessageFollow(state);
3226
3311
  try {
3312
+ const metadata = (current.ingress.parts[0][service_wire_binary_primitives_1.SERVICE_WIRE_FLAGS_OFFSET] &
3313
+ service_stateful_wire_codec_1.M6bServiceWireFlag.metadata) !==
3314
+ 0;
3227
3315
  const parts = [
3228
- (0, service_stateful_wire_codec_1.encodeSpotHeader)(current.wire.kind, current.wire.sourceSpotId, state.target, current.wire.correlation),
3229
- current.ingress.parts[1]
3316
+ (0, service_stateful_wire_codec_1.encodeSpotHeader)(current.wire.kind, current.wire.sourceSpotId, state.target, current.wire.correlation, current.wire.operation, current.wire.messageFollowHopCount + 1, metadata ? current.ingress.parts[1] : undefined),
3317
+ ...(metadata ? [current.ingress.parts[1]] : []),
3318
+ current.ingress.parts[metadata ? 2 : 1]
3230
3319
  ];
3231
3320
  if (current.wire.kind === 'spotSend') {
3232
3321
  if (!(await this.raw.sendService(state.target.targetNodeRid, parts)))
@@ -3330,7 +3419,7 @@ class ServiceStatefulRuntime {
3330
3419
  state.queued.length = 0;
3331
3420
  state.queuedHead = 0;
3332
3421
  }
3333
- else if (state.queuedHead >= 1024 && state.queuedHead * 2 >= state.queued.length) {
3422
+ else if ((0, admission_1.shouldCompactBackingArray)(state.queuedHead, state.queued.length)) {
3334
3423
  state.queued.splice(0, state.queuedHead);
3335
3424
  state.queuedHead = 0;
3336
3425
  }
@@ -3341,26 +3430,6 @@ class ServiceStatefulRuntime {
3341
3430
  throw new service_stateful_registry_1.ServiceStaleGenerationError('actor', actor.actorId);
3342
3431
  return route;
3343
3432
  }
3344
- tryBoundSessionSendFence(actor, senderFence) {
3345
- if (senderFence === undefined ||
3346
- senderFence.targetNodeGeneration !== this.nodeGeneration ||
3347
- senderFence.authorityOwnerGeneration <= 0n ||
3348
- senderFence.ownerLeaseGeneration <= 0n) {
3349
- return undefined;
3350
- }
3351
- const local = actor.nodeRid === this.nodeRid ? this.registry.actor(actor.actorId) : undefined;
3352
- if (local === undefined ||
3353
- !sameActorRef(local.ref, actor) ||
3354
- local.authorityOwnerGeneration !== senderFence.authorityOwnerGeneration) {
3355
- return undefined;
3356
- }
3357
- return {
3358
- actor,
3359
- targetNodeGeneration: senderFence.targetNodeGeneration,
3360
- authorityOwnerGeneration: senderFence.authorityOwnerGeneration,
3361
- ownerLeaseGeneration: senderFence.ownerLeaseGeneration
3362
- };
3363
- }
3364
3433
  tryActorFence(actor) {
3365
3434
  const local = actor.nodeRid === this.nodeRid ? this.registry.actor(actor.actorId) : undefined;
3366
3435
  if (local !== undefined && sameActorRef(local.ref, actor)) {
@@ -3536,35 +3605,19 @@ class ServiceStatefulRuntime {
3536
3605
  }
3537
3606
  }
3538
3607
  exports.ServiceStatefulRuntime = ServiceStatefulRuntime;
3539
- function serviceSpotPublishFailureReason(result, routeReady, closed) {
3540
- if (closed || result === runtime_values_1.SubmitResult.Terminated)
3541
- return 'shutdown';
3542
- switch (result) {
3543
- case runtime_values_1.SubmitResult.Backpressured:
3544
- return 'backpressure';
3545
- case runtime_values_1.SubmitResult.NotAdmitted:
3546
- case runtime_values_1.SubmitResult.NotConnected:
3547
- case runtime_values_1.SubmitResult.NotFound:
3548
- case runtime_values_1.SubmitResult.InvalidHandle:
3549
- return 'stale_target';
3550
- default:
3551
- // RawServiceMeshRuntime exposes failed Core submissions as false. A
3552
- // ready route therefore identifies queue admission failure; a route
3553
- // that became unready after selection is a stale target.
3554
- return routeReady ? 'backpressure' : 'stale_target';
3555
- }
3556
- }
3557
3608
  function isEntrySpotFence(fence) {
3558
3609
  return (fence.spot.spotId === fence.targetNodeRid &&
3559
3610
  fence.spot.generation === fence.targetNodeGeneration &&
3560
3611
  fence.authorityOwnerGeneration === fence.targetNodeGeneration &&
3561
- fence.ownerLeaseGeneration === fence.targetNodeGeneration &&
3562
- fence.storeVersion === `entry:${fence.targetNodeGeneration}`);
3612
+ fence.ownerLeaseGeneration === fence.targetNodeGeneration);
3563
3613
  }
3564
- function userSpotDeadline(deadlineUnixMs) {
3614
+ function operationDeadline(deadlineUnixMs) {
3565
3615
  const controller = new AbortController();
3566
3616
  const delay = Number(deadlineUnixMs - BigInt(Date.now()));
3567
- const timeout = setTimeout(() => controller.abort(new Error('User Spot operation deadline exceeded.')), Math.max(0, Math.min(delay, 0x7fff_ffff)));
3617
+ const expire = () => controller.abort((0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.DeadlineExceeded, 'Operation deadline exceeded.'));
3618
+ const timeout = delay <= 0
3619
+ ? (expire(), undefined)
3620
+ : setTimeout(expire, Math.min(delay, MAX_NODE_TIMER_DELAY_MS));
3568
3621
  return {
3569
3622
  signal: controller.signal,
3570
3623
  close: () => clearTimeout(timeout)
@@ -3620,12 +3673,12 @@ function actorLocation(actor) {
3620
3673
  }
3621
3674
  function failure(error) {
3622
3675
  if (error instanceof service_stateful_registry_1.ServiceStaleGenerationError) {
3623
- return { terminalResult: runtime_values_1.RequestResult.NotFound, failureCode: ACTOR_ROUTE_STALE };
3676
+ return (0, framework_errors_internal_1.internalFrameworkWireReply)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale);
3624
3677
  }
3625
3678
  if (error instanceof contracts_1.ZLinkFrameworkException) {
3626
3679
  return (0, framework_errors_internal_1.internalFrameworkWireReply)(error);
3627
3680
  }
3628
- return { terminalResult: runtime_values_1.RequestResult.InternalError, failureCode: 17 };
3681
+ return (0, framework_errors_internal_1.internalFrameworkWireReply)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestFailed);
3629
3682
  }
3630
3683
  function actorKey(actor) {
3631
3684
  return `${actor.actorId}\0${actor.generation}`;
@@ -3870,7 +3923,7 @@ function topicMatches(filter, topic) {
3870
3923
  function emptyPayload() {
3871
3924
  return {
3872
3925
  packetName: 'ZLinkFrameworkEmpty',
3873
- contentType: 'application/octet-stream',
3926
+ contentType: stream_wire_1.ZlinkStreamContentType.Raw,
3874
3927
  payload: Buffer.alloc(0)
3875
3928
  };
3876
3929
  }