@zlink-systems/framework 0.30.3 → 0.32.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 (398) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Actors/ZLinkActor.d.ts +2 -0
  3. package/dist/contracts/Actors/ZLinkSessionBindingIdentity.d.ts +6 -0
  4. package/dist/contracts/Actors/ZLinkSessionBindingIdentity.js +2 -0
  5. package/dist/contracts/Actors/index.d.ts +1 -0
  6. package/dist/contracts/Actors/index.js +1 -0
  7. package/dist/contracts/Common/CoreTypes.d.ts +1 -0
  8. package/dist/contracts/Common/HandlerMessageType.d.ts +8 -0
  9. package/dist/contracts/Common/HandlerMessageType.js +41 -0
  10. package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +1 -1
  11. package/dist/contracts/Common/ZLinkEncodedPayload.js +12 -20
  12. package/dist/contracts/Common/ZLinkMessage.js +11 -7
  13. package/dist/contracts/Common/encoded-payload-storage.d.ts +0 -2
  14. package/dist/contracts/Common/encoded-payload-storage.js +4 -16
  15. package/dist/contracts/Common/index.d.ts +1 -1
  16. package/dist/contracts/Common/payload-slab.d.ts +4 -0
  17. package/dist/contracts/Common/payload-slab.js +30 -0
  18. package/dist/contracts/Configuration/RegistrationBuilders.js +15 -9
  19. package/dist/contracts/Configuration/RegistrationTypes.d.ts +19 -0
  20. package/dist/contracts/Handlers/Contexts.d.ts +1 -0
  21. package/dist/contracts/Locations/Authority.d.ts +2 -0
  22. package/dist/internal.d.ts +9 -0
  23. package/dist/internal.js +23 -1
  24. package/dist/nest-integration.d.ts +1 -0
  25. package/dist/nest-integration.js +3 -1
  26. package/dist/runtime/actors/actor-client.d.ts +6 -2
  27. package/dist/runtime/actors/actor-client.js +120 -82
  28. package/dist/runtime/actors/actor-context.js +16 -5
  29. package/dist/runtime/actors/actor-execution-context.js +2 -2
  30. package/dist/runtime/actors/actor-handoff.d.ts +12 -1
  31. package/dist/runtime/actors/actor-handoff.js +79 -34
  32. package/dist/runtime/actors/actor-join-deferred-scope.js +6 -6
  33. package/dist/runtime/actors/actor-local-native-join.d.ts +2 -2
  34. package/dist/runtime/actors/actor-local-native-join.js +19 -17
  35. package/dist/runtime/actors/actor-mailbox.d.ts +1 -1
  36. package/dist/runtime/actors/actor-remote-joiner.d.ts +2 -2
  37. package/dist/runtime/actors/actor-remote-joiner.js +4 -4
  38. package/dist/runtime/actors/actor-routed-join-transport.d.ts +9 -3
  39. package/dist/runtime/actors/actor-routed-json-request.d.ts +3 -0
  40. package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -2
  41. package/dist/runtime/actors/actor-runtime-state.d.ts +1 -1
  42. package/dist/runtime/actors/spot-actor-dispatch.d.ts +9 -5
  43. package/dist/runtime/actors/spot-actor-dispatch.js +60 -38
  44. package/dist/runtime/admission.d.ts +6 -4
  45. package/dist/runtime/admission.js +21 -10
  46. package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +1 -0
  47. package/dist/runtime/application-jobs/application-ingress-record-owner.js +3 -0
  48. package/dist/runtime/backend/contracts/index.d.ts +26 -10
  49. package/dist/runtime/backend/mesh-completion-table.d.ts +7 -1
  50. package/dist/runtime/backend/mesh-completion-table.js +84 -20
  51. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +19 -6
  52. package/dist/runtime/backend/mesh-dispatch-pump.js +246 -147
  53. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +3 -2
  54. package/dist/runtime/backend/node/node-backend-adapter-support.js +27 -19
  55. package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +5 -2
  56. package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +70 -13
  57. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
  58. package/dist/runtime/backend/node/node-event-loop-poller.js +4 -3
  59. package/dist/runtime/backend/node/node-mesh-backend-adapter.js +5 -1
  60. package/dist/runtime/backend/node/node-raw-binding-port.d.ts +7 -2
  61. package/dist/runtime/backend/node/node-raw-binding-port.js +99 -63
  62. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +34 -16
  63. package/dist/runtime/backend/node/node-raw-mesh-backend.js +210 -106
  64. package/dist/runtime/backend/node/node-socket-backend-adapter.js +20 -6
  65. package/dist/runtime/backend/raw-binding-port.d.ts +6 -3
  66. package/dist/runtime/channels/channel-clients.js +3 -3
  67. package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +11 -7
  68. package/dist/runtime/channels/channel-dispatch-pipeline.js +40 -22
  69. package/dist/runtime/channels/channel-dispatch-services.d.ts +3 -1
  70. package/dist/runtime/channels/channel-dispatch-services.js +7 -6
  71. package/dist/runtime/channels/channel-dispatchers.d.ts +13 -6
  72. package/dist/runtime/channels/channel-dispatchers.js +57 -36
  73. package/dist/runtime/channels/channel-envelope.d.ts +2 -2
  74. package/dist/runtime/channels/channel-envelope.js +609 -83
  75. package/dist/runtime/channels/channel-multipart.d.ts +1 -0
  76. package/dist/runtime/channels/channel-multipart.js +10 -6
  77. package/dist/runtime/channels/channel-outbound-operations.d.ts +6 -9
  78. package/dist/runtime/channels/channel-outbound-operations.js +107 -105
  79. package/dist/runtime/channels/channel-receive-loops.d.ts +9 -7
  80. package/dist/runtime/channels/channel-receive-loops.js +126 -90
  81. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +23 -6
  82. package/dist/runtime/channels/channel-runtime-lifecycle.js +47 -38
  83. package/dist/runtime/channels/channel-runtime-manager.d.ts +13 -6
  84. package/dist/runtime/channels/channel-runtime-manager.js +32 -14
  85. package/dist/runtime/channels/channel-socket-registry.d.ts +28 -4
  86. package/dist/runtime/channels/channel-socket-registry.js +9 -1
  87. package/dist/runtime/channels/channel-transports.d.ts +23 -16
  88. package/dist/runtime/channels/channel-transports.js +139 -119
  89. package/dist/runtime/channels/dispatch-error-reporter.d.ts +4 -4
  90. package/dist/runtime/channels/dispatch-error-reporter.js +5 -5
  91. package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
  92. package/dist/runtime/channels/local-spot-route-transport.d.ts +5 -2
  93. package/dist/runtime/channels/local-spot-route-transport.js +15 -18
  94. package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +6 -3
  95. package/dist/runtime/channels/router-socket-spot-route-transport.js +33 -19
  96. package/dist/runtime/channels/source-spot-router.d.ts +6 -3
  97. package/dist/runtime/channels/source-spot-router.js +34 -23
  98. package/dist/runtime/channels/spot-node-route-transport.d.ts +6 -3
  99. package/dist/runtime/channels/spot-node-route-transport.js +23 -17
  100. package/dist/runtime/channels/spot-route-bridge-transport.d.ts +6 -3
  101. package/dist/runtime/channels/spot-route-bridge-transport.js +38 -24
  102. package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +8 -4
  103. package/dist/runtime/channels/spot-route-dispatch-strategy.js +36 -23
  104. package/dist/runtime/diagnostics/dispatch-error-details.js +9 -3
  105. package/dist/runtime/diagnostics/message-flow-bootstrap.d.ts +1 -0
  106. package/dist/runtime/diagnostics/message-flow-bootstrap.js +8 -0
  107. package/dist/runtime/diagnostics/message-flow-delivery.d.ts +47 -0
  108. package/dist/runtime/diagnostics/message-flow-delivery.js +149 -0
  109. package/dist/runtime/diagnostics/message-flow-record.d.ts +50 -0
  110. package/dist/runtime/diagnostics/message-flow-record.js +228 -0
  111. package/dist/runtime/diagnostics/message-flow-worker.d.ts +1 -0
  112. package/dist/runtime/diagnostics/message-flow-worker.js +118 -0
  113. package/dist/runtime/diagnostics/message-flow.d.ts +7 -19
  114. package/dist/runtime/diagnostics/message-flow.js +42 -290
  115. package/dist/runtime/diagnostics/runtime-metrics.d.ts +4 -3
  116. package/dist/runtime/diagnostics/runtime-metrics.js +8 -4
  117. package/dist/runtime/execution/index.d.ts +1 -0
  118. package/dist/runtime/execution/index.js +6 -3
  119. package/dist/runtime/execution/serial-execution-queue.d.ts +26 -13
  120. package/dist/runtime/execution/serial-execution-queue.js +75 -71
  121. package/dist/runtime/foundation/durable-service-request.d.ts +12 -3
  122. package/dist/runtime/foundation/durable-service-request.js +158 -73
  123. package/dist/runtime/foundation/operation-registry.d.ts +33 -3
  124. package/dist/runtime/foundation/operation-registry.js +272 -33
  125. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +62 -23
  126. package/dist/runtime/foundation/raw-service-mesh-runtime.js +373 -194
  127. package/dist/runtime/foundation/request-runtime.d.ts +17 -0
  128. package/dist/runtime/foundation/request-runtime.js +163 -0
  129. package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
  130. package/dist/runtime/foundation/service-discovery-registry.js +6 -0
  131. package/dist/runtime/foundation/service-liveness-registry.d.ts +1 -1
  132. package/dist/runtime/foundation/service-mailbox.d.ts +4 -2
  133. package/dist/runtime/foundation/service-mailbox.js +4 -1
  134. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -2
  135. package/dist/runtime/foundation/service-relocation-object-owner.js +12 -5
  136. package/dist/runtime/foundation/service-runtime-contracts.d.ts +7 -2
  137. package/dist/runtime/foundation/service-stateful-registry.d.ts +6 -2
  138. package/dist/runtime/foundation/service-stateful-registry.js +38 -17
  139. package/dist/runtime/foundation/service-stateful-runtime.d.ts +91 -26
  140. package/dist/runtime/foundation/service-stateful-runtime.js +245 -120
  141. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -0
  142. package/dist/runtime/foundation/service-stateful-wire-codec.js +15 -0
  143. package/dist/runtime/foundation/service-topology-registry.d.ts +2 -0
  144. package/dist/runtime/foundation/service-topology-registry.js +13 -3
  145. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  146. package/dist/runtime/foundation/service-wire-constants.generated.js +12 -0
  147. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +5 -1
  148. package/dist/runtime/foundation/service-wire-m6a-codec.js +50 -15
  149. package/dist/runtime/host/actor-packet-relay.d.ts +5 -6
  150. package/dist/runtime/host/actor-packet-relay.js +58 -57
  151. package/dist/runtime/host/actor-placement-coordinator.d.ts +1 -1
  152. package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
  153. package/dist/runtime/host/actor-runtime-options-factory.js +3 -2
  154. package/dist/runtime/host/actor-transfer-runtime.d.ts +3 -3
  155. package/dist/runtime/host/application-job-queue.d.ts +7 -5
  156. package/dist/runtime/host/application-job-queue.js +33 -21
  157. package/dist/runtime/host/bound-session-relay.js +0 -1
  158. package/dist/runtime/host/channel-runtime-options-factory.d.ts +2 -0
  159. package/dist/runtime/host/channel-runtime-options-factory.js +1 -0
  160. package/dist/runtime/host/entry-actor-runtime.d.ts +5 -2
  161. package/dist/runtime/host/entry-actor-runtime.js +2 -2
  162. package/dist/runtime/host/index.d.ts +106 -37
  163. package/dist/runtime/host/index.js +303 -151
  164. package/dist/runtime/host/location-runtime-owner.d.ts +2 -2
  165. package/dist/runtime/host/location-runtime-owner.js +1 -1
  166. package/dist/runtime/host/service-relocation-host-runtime.d.ts +195 -45
  167. package/dist/runtime/host/service-relocation-host-runtime.js +257 -144
  168. package/dist/runtime/host/spot-address-transport.d.ts +3 -0
  169. package/dist/runtime/host/spot-address-transport.js +73 -76
  170. package/dist/runtime/host/spot-runtime-options-factory.js +2 -0
  171. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -1
  172. package/dist/runtime/host/user-spot-creation-coordinator.js +49 -21
  173. package/dist/runtime/internal-observation.d.ts +1 -0
  174. package/dist/runtime/internal-observation.js +5 -0
  175. package/dist/runtime/locations/actor-location-claims.d.ts +1 -1
  176. package/dist/runtime/locations/actor-location-claims.js +15 -6
  177. package/dist/runtime/locations/auto-connect-loop.d.ts +0 -1
  178. package/dist/runtime/locations/auto-connect-loop.js +25 -19
  179. package/dist/runtime/locations/auto-connect-planner.js +2 -5
  180. package/dist/runtime/locations/auto-connect-reconciler.d.ts +1 -0
  181. package/dist/runtime/locations/auto-connect-reconciler.js +35 -23
  182. package/dist/runtime/locations/in-memory-authority-store.d.ts +1 -0
  183. package/dist/runtime/locations/in-memory-authority-store.js +15 -5
  184. package/dist/runtime/locations/in-memory-location-store.d.ts +0 -2
  185. package/dist/runtime/locations/in-memory-location-store.js +1 -38
  186. package/dist/runtime/locations/lifecycle.d.ts +1 -1
  187. package/dist/runtime/locations/lifecycle.js +2 -2
  188. package/dist/runtime/locations/location-store-repository.d.ts +0 -1
  189. package/dist/runtime/locations/location-store-repository.js +163 -246
  190. package/dist/runtime/locations/resolvers.d.ts +8 -1
  191. package/dist/runtime/locations/resolvers.js +16 -2
  192. package/dist/runtime/locations/runtime.d.ts +3 -3
  193. package/dist/runtime/locations/runtime.js +12 -16
  194. package/dist/runtime/messaging/creation-payload-codec.js +8 -7
  195. package/dist/runtime/messaging/framework-json-v1.d.ts +1 -1
  196. package/dist/runtime/messaging/framework-json-v1.js +6 -2
  197. package/dist/runtime/messaging/payload-codec.js +21 -35
  198. package/dist/runtime/messaging/request-deadline.d.ts +4 -2
  199. package/dist/runtime/messaging/request-deadline.js +40 -25
  200. package/dist/runtime/messaging/request-result.d.ts +14 -1
  201. package/dist/runtime/messaging/request-result.js +74 -13
  202. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +4 -0
  203. package/dist/runtime/protocol/service_wire_codec.generated.js +17 -7
  204. package/dist/runtime/spots/index.d.ts +28 -7
  205. package/dist/runtime/spots/index.js +31 -6
  206. package/dist/runtime/spots/spot-activation-registry.d.ts +3 -2
  207. package/dist/runtime/spots/spot-activation-registry.js +13 -8
  208. package/dist/runtime/spots/spot-activation-state.d.ts +2 -0
  209. package/dist/runtime/spots/spot-activation-state.js +1 -0
  210. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +9 -4
  211. package/dist/runtime/spots/spot-actor-admission-coordinator.js +33 -12
  212. package/dist/runtime/spots/spot-actor-ingress-admission.d.ts +40 -0
  213. package/dist/runtime/spots/spot-actor-ingress-admission.js +78 -0
  214. package/dist/runtime/spots/spot-actor-membership.js +3 -3
  215. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +16 -43
  216. package/dist/runtime/spots/spot-actor-packet-dispatch.js +56 -113
  217. package/dist/runtime/spots/spot-actor-packet-drain.d.ts +1 -0
  218. package/dist/runtime/spots/spot-actor-packet-drain.js +12 -5
  219. package/dist/runtime/spots/spot-entry-activation.d.ts +4 -3
  220. package/dist/runtime/spots/spot-entry-activation.js +7 -12
  221. package/dist/runtime/spots/spot-handler-registry.d.ts +5 -1
  222. package/dist/runtime/spots/spot-handler-registry.js +31 -15
  223. package/dist/runtime/spots/spot-manager-public.js +3 -2
  224. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +11 -6
  225. package/dist/runtime/spots/spot-node-runtime-manager.js +6 -1
  226. package/dist/runtime/spots/spot-outbound.d.ts +8 -2
  227. package/dist/runtime/spots/spot-outbound.js +5 -5
  228. package/dist/runtime/spots/spot-route-packet-dispatch.js +13 -8
  229. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +3 -3
  230. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +9 -5
  231. package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -2
  232. package/dist/runtime/spots/spot-serial-executor.d.ts +2 -1
  233. package/dist/runtime/spots/spot-serial-turn-executor.js +20 -26
  234. package/dist/runtime/spots/spot-subscription-dispatch.js +5 -2
  235. package/dist/runtime/spots/spot-timer.d.ts +1 -1
  236. package/dist/runtime/streams/actor-session-binding-registry.d.ts +11 -3
  237. package/dist/runtime/streams/actor-session-binding-registry.js +28 -0
  238. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -2
  239. package/dist/runtime/streams/bound-actor-relay-sender.js +3 -4
  240. package/dist/runtime/streams/bound-session-service.js +6 -7
  241. package/dist/runtime/streams/index.d.ts +3 -3
  242. package/dist/runtime/streams/index.js +22 -2
  243. package/dist/runtime/streams/managed-stream.js +2 -1
  244. package/dist/runtime/streams/session-calls.d.ts +1 -1
  245. package/dist/runtime/streams/session-calls.js +3 -9
  246. package/dist/runtime/streams/session-context.d.ts +2 -2
  247. package/dist/runtime/streams/session-context.js +2 -2
  248. package/dist/runtime/streams/stream-session-runtime.d.ts +1 -0
  249. package/dist/runtime/streams/stream-session-runtime.js +64 -33
  250. package/package.json +3 -3
  251. package/src/contracts/Actors/ZLinkActor.ts +6 -0
  252. package/src/contracts/Actors/ZLinkSessionBindingIdentity.ts +7 -0
  253. package/src/contracts/Actors/index.ts +1 -0
  254. package/src/contracts/Common/CoreTypes.ts +1 -0
  255. package/src/contracts/Common/HandlerMessageType.ts +50 -0
  256. package/src/contracts/Common/ZLinkEncodedPayload.ts +13 -25
  257. package/src/contracts/Common/ZLinkMessage.ts +11 -7
  258. package/src/contracts/Common/encoded-payload-storage.ts +4 -16
  259. package/src/contracts/Common/index.ts +1 -1
  260. package/src/contracts/Common/payload-slab.ts +29 -0
  261. package/src/contracts/Configuration/RegistrationBuilders.ts +29 -15
  262. package/src/contracts/Configuration/RegistrationTypes.ts +19 -0
  263. package/src/contracts/Handlers/Contexts.ts +1 -0
  264. package/src/contracts/Locations/Authority.ts +7 -1
  265. package/src/internal.ts +17 -0
  266. package/src/nest-integration.ts +1 -0
  267. package/src/runtime/actors/actor-client.ts +257 -163
  268. package/src/runtime/actors/actor-context.ts +26 -14
  269. package/src/runtime/actors/actor-execution-context.ts +2 -2
  270. package/src/runtime/actors/actor-handoff.ts +86 -51
  271. package/src/runtime/actors/actor-join-deferred-scope.ts +6 -6
  272. package/src/runtime/actors/actor-local-native-join.ts +38 -17
  273. package/src/runtime/actors/actor-mailbox.ts +1 -1
  274. package/src/runtime/actors/actor-remote-joiner.ts +8 -4
  275. package/src/runtime/actors/actor-routed-join-transport.ts +13 -5
  276. package/src/runtime/actors/actor-routed-json-request.ts +3 -0
  277. package/src/runtime/actors/actor-runtime-contracts.ts +4 -2
  278. package/src/runtime/actors/actor-runtime-state.ts +1 -1
  279. package/src/runtime/actors/spot-actor-dispatch.ts +70 -68
  280. package/src/runtime/admission.ts +42 -15
  281. package/src/runtime/application-jobs/application-ingress-record-owner.ts +4 -0
  282. package/src/runtime/backend/contracts/index.ts +77 -10
  283. package/src/runtime/backend/mesh-completion-table.ts +106 -15
  284. package/src/runtime/backend/mesh-dispatch-pump.ts +294 -146
  285. package/src/runtime/backend/node/node-backend-adapter-support.ts +42 -32
  286. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +91 -34
  287. package/src/runtime/backend/node/node-event-loop-poller.ts +14 -5
  288. package/src/runtime/backend/node/node-mesh-backend-adapter.ts +5 -1
  289. package/src/runtime/backend/node/node-raw-binding-port.ts +180 -69
  290. package/src/runtime/backend/node/node-raw-mesh-backend.ts +386 -157
  291. package/src/runtime/backend/node/node-socket-backend-adapter.ts +56 -11
  292. package/src/runtime/backend/raw-binding-port.ts +13 -5
  293. package/src/runtime/channels/channel-clients.ts +26 -11
  294. package/src/runtime/channels/channel-dispatch-pipeline.ts +77 -65
  295. package/src/runtime/channels/channel-dispatch-services.ts +7 -12
  296. package/src/runtime/channels/channel-dispatchers.ts +93 -39
  297. package/src/runtime/channels/channel-envelope.ts +680 -144
  298. package/src/runtime/channels/channel-multipart.ts +17 -13
  299. package/src/runtime/channels/channel-outbound-operations.ts +204 -178
  300. package/src/runtime/channels/channel-receive-loops.ts +160 -107
  301. package/src/runtime/channels/channel-runtime-lifecycle.ts +64 -59
  302. package/src/runtime/channels/channel-runtime-manager.ts +74 -27
  303. package/src/runtime/channels/channel-socket-registry.ts +20 -5
  304. package/src/runtime/channels/channel-transports.ts +414 -287
  305. package/src/runtime/channels/dispatch-error-reporter.ts +4 -9
  306. package/src/runtime/channels/local-spot-route-transport.ts +27 -29
  307. package/src/runtime/channels/router-socket-spot-route-transport.ts +63 -32
  308. package/src/runtime/channels/source-spot-router.ts +75 -38
  309. package/src/runtime/channels/spot-node-route-transport.ts +67 -37
  310. package/src/runtime/channels/spot-route-bridge-transport.ts +62 -30
  311. package/src/runtime/channels/spot-route-dispatch-strategy.ts +105 -34
  312. package/src/runtime/diagnostics/dispatch-error-details.ts +10 -2
  313. package/src/runtime/diagnostics/message-flow-bootstrap.ts +6 -0
  314. package/src/runtime/diagnostics/message-flow-delivery.ts +171 -0
  315. package/src/runtime/diagnostics/message-flow-record.ts +295 -0
  316. package/src/runtime/diagnostics/message-flow-worker.ts +146 -0
  317. package/src/runtime/diagnostics/message-flow.ts +49 -362
  318. package/src/runtime/diagnostics/runtime-metrics.ts +10 -4
  319. package/src/runtime/execution/index.ts +6 -0
  320. package/src/runtime/execution/serial-execution-queue.ts +94 -96
  321. package/src/runtime/foundation/durable-service-request.ts +212 -89
  322. package/src/runtime/foundation/operation-registry.ts +287 -38
  323. package/src/runtime/foundation/raw-service-mesh-runtime.ts +617 -292
  324. package/src/runtime/foundation/request-runtime.ts +227 -0
  325. package/src/runtime/foundation/service-discovery-registry.ts +7 -0
  326. package/src/runtime/foundation/service-liveness-registry.ts +1 -1
  327. package/src/runtime/foundation/service-mailbox.ts +7 -2
  328. package/src/runtime/foundation/service-relocation-object-owner.ts +21 -6
  329. package/src/runtime/foundation/service-runtime-contracts.ts +12 -2
  330. package/src/runtime/foundation/service-stateful-registry.ts +52 -19
  331. package/src/runtime/foundation/service-stateful-runtime.ts +365 -198
  332. package/src/runtime/foundation/service-stateful-wire-codec.ts +18 -0
  333. package/src/runtime/foundation/service-topology-registry.ts +21 -3
  334. package/src/runtime/foundation/service-wire-constants.generated.ts +10 -0
  335. package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -17
  336. package/src/runtime/host/actor-packet-relay.ts +160 -156
  337. package/src/runtime/host/actor-placement-coordinator.ts +1 -1
  338. package/src/runtime/host/actor-runtime-options-factory.ts +7 -2
  339. package/src/runtime/host/actor-transfer-runtime.ts +3 -3
  340. package/src/runtime/host/application-job-queue.ts +56 -27
  341. package/src/runtime/host/bound-session-relay.ts +0 -1
  342. package/src/runtime/host/channel-runtime-options-factory.ts +3 -0
  343. package/src/runtime/host/entry-actor-runtime.ts +14 -6
  344. package/src/runtime/host/index.ts +388 -113
  345. package/src/runtime/host/location-runtime-owner.ts +3 -3
  346. package/src/runtime/host/service-relocation-host-runtime.ts +380 -252
  347. package/src/runtime/host/spot-address-transport.ts +110 -95
  348. package/src/runtime/host/spot-runtime-options-factory.ts +3 -0
  349. package/src/runtime/host/user-spot-creation-coordinator.ts +69 -22
  350. package/src/runtime/internal-observation.ts +2 -0
  351. package/src/runtime/locations/actor-location-claims.ts +42 -16
  352. package/src/runtime/locations/auto-connect-loop.ts +24 -16
  353. package/src/runtime/locations/auto-connect-planner.ts +2 -5
  354. package/src/runtime/locations/auto-connect-reconciler.ts +37 -24
  355. package/src/runtime/locations/in-memory-authority-store.ts +27 -7
  356. package/src/runtime/locations/in-memory-location-store.ts +1 -74
  357. package/src/runtime/locations/lifecycle.ts +4 -2
  358. package/src/runtime/locations/location-store-repository.ts +228 -308
  359. package/src/runtime/locations/resolvers.ts +20 -8
  360. package/src/runtime/locations/runtime.ts +16 -28
  361. package/src/runtime/messaging/creation-payload-codec.ts +12 -10
  362. package/src/runtime/messaging/framework-json-v1.ts +10 -1
  363. package/src/runtime/messaging/payload-codec.ts +50 -75
  364. package/src/runtime/messaging/request-deadline.ts +47 -39
  365. package/src/runtime/messaging/request-result.ts +88 -17
  366. package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
  367. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
  368. package/src/runtime/spots/index.ts +57 -10
  369. package/src/runtime/spots/spot-activation-registry.ts +12 -8
  370. package/src/runtime/spots/spot-activation-state.ts +2 -0
  371. package/src/runtime/spots/spot-actor-admission-coordinator.ts +62 -37
  372. package/src/runtime/spots/spot-actor-ingress-admission.ts +157 -0
  373. package/src/runtime/spots/spot-actor-membership.ts +8 -5
  374. package/src/runtime/spots/spot-actor-packet-dispatch.ts +122 -206
  375. package/src/runtime/spots/spot-actor-packet-drain.ts +21 -6
  376. package/src/runtime/spots/spot-entry-activation.ts +25 -35
  377. package/src/runtime/spots/spot-handler-registry.ts +72 -15
  378. package/src/runtime/spots/spot-manager-public.ts +4 -2
  379. package/src/runtime/spots/spot-node-runtime-manager.ts +16 -7
  380. package/src/runtime/spots/spot-outbound.ts +26 -10
  381. package/src/runtime/spots/spot-route-packet-dispatch.ts +18 -8
  382. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +14 -8
  383. package/src/runtime/spots/spot-runtime-ports.ts +5 -2
  384. package/src/runtime/spots/spot-serial-executor.ts +1 -1
  385. package/src/runtime/spots/spot-serial-turn-executor.ts +25 -40
  386. package/src/runtime/spots/spot-subscription-dispatch.ts +9 -2
  387. package/src/runtime/spots/spot-timer.ts +1 -1
  388. package/src/runtime/streams/actor-session-binding-registry.ts +46 -3
  389. package/src/runtime/streams/bound-actor-relay-sender.ts +16 -5
  390. package/src/runtime/streams/bound-session-service.ts +10 -7
  391. package/src/runtime/streams/index.ts +30 -4
  392. package/src/runtime/streams/managed-stream.ts +2 -1
  393. package/src/runtime/streams/session-calls.ts +9 -14
  394. package/src/runtime/streams/session-context.ts +6 -11
  395. package/src/runtime/streams/stream-session-runtime.ts +79 -40
  396. package/dist/runtime/spots/spot-lifecycle-metrics.d.ts +0 -8
  397. package/dist/runtime/spots/spot-lifecycle-metrics.js +0 -17
  398. package/src/runtime/spots/spot-lifecycle-metrics.ts +0 -16
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ZLinkLocationStoreRepository = void 0;
4
+ const abort_1 = require("../abort");
4
5
  const routing_id_1 = require("../routing-id");
5
6
  const service_relocation_runtime_1 = require("../foundation/service-relocation-runtime");
6
7
  const service_authority_payload_codec_1 = require("../foundation/service-authority-payload-codec");
@@ -36,7 +37,6 @@ const MAX_GENERATION = 0x7fffffffffffffffn;
36
37
  const MAX_U64 = stream_wire_1.UINT64_MAX;
37
38
  const CREATION_TERMINAL_RETENTION_MS = 5 * 60 * 1000;
38
39
  const MAX_DESCRIPTOR_WRITE_RETRIES = 3;
39
- const MAX_OWNER_CLEANUP_BATCH_ROWS = 2_047;
40
40
  /**
41
41
  * Maps framework domain records to the minimal provider SPI.
42
42
  *
@@ -215,8 +215,10 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
215
215
  ],
216
216
  mutations: [{ kind: 'put', key: rowKey, bytes: encodeAuthorityRecord(nextRecord) }]
217
217
  }, signal);
218
- if (result.kind === 'conflict')
218
+ if (result.kind === 'conflict') {
219
+ await (0, abort_1.macrotaskBoundary)();
219
220
  continue;
221
+ }
220
222
  const storeVersion = result.putVersions.find((entry) => entry.key.value === rowKey.value)?.version;
221
223
  if (storeVersion === undefined) {
222
224
  throw new Error('Authority lease rebind did not return a row version.');
@@ -278,8 +280,12 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
278
280
  leaseGeneration: record.snapshot.ownerLeaseGeneration
279
281
  })
280
282
  : [];
281
- if (membershipConditions === undefined)
282
- return { kind: 'conflict', current: snapshot };
283
+ if (!Array.isArray(membershipConditions))
284
+ return {
285
+ kind: 'conflict',
286
+ current: snapshot,
287
+ membershipFailure: membershipConditions.failureKind
288
+ };
283
289
  const result = await this.provider.write({
284
290
  conditions: [
285
291
  { kind: 'version', key: rowKey, expected: current.value.version },
@@ -334,8 +340,10 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
334
340
  ])
335
341
  ]
336
342
  }, signal);
337
- if (result.kind === 'conflict')
343
+ if (result.kind === 'conflict') {
344
+ await (0, abort_1.macrotaskBoundary)();
338
345
  continue;
346
+ }
339
347
  const storeVersion = result.putVersions.find((entry) => entry.key.value === rowKey.value)?.version;
340
348
  if (mutation.kind === 'delete') {
341
349
  return {
@@ -807,7 +815,7 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
807
815
  if (membershipConditions.some((condition) => condition.key.value === authorityKey(spotKey.value).value))
808
816
  continue;
809
817
  const conditions = await this.userSpotMembershipConditions(actor.currentSpotId, actor.currentSpotGeneration, signal, aggregate.targetOwner);
810
- if (conditions === undefined)
818
+ if (!Array.isArray(conditions))
811
819
  return { kind: 'stale' };
812
820
  membershipConditions.push(...conditions.filter((condition) => !membershipConditions.some((existing) => existing.key.value === condition.key.value)));
813
821
  }
@@ -915,137 +923,151 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
915
923
  async releaseEndedReservation(key, expectedStoreVersion, signal, request) {
916
924
  return this.observeStore('release', () => this.releaseEndedReservationRequest(key, expectedStoreVersion, signal, request));
917
925
  }
918
- async releaseEndedReservationRequest(key, expectedStoreVersion, signal, request) {
919
- return ((await this.tryReleaseEndedReservation(key, expectedStoreVersion, signal, request)) ===
920
- 'reclaimed');
926
+ async releaseEndedReservationRequest(key, expectedStoreVersion, signal, request, requiredOwner) {
927
+ return ((await this.tryReleaseEndedReservation(key, expectedStoreVersion, signal, request, undefined, requiredOwner)) === 'reclaimed');
921
928
  }
922
- async tryReleaseEndedReservation(key, expectedStoreVersion, signal, request) {
923
- const rowKey = authorityKey(key.value);
924
- const current = await this.provider.read(rowKey, signal);
925
- if (current.kind === 'missing' || current.value.version.value !== expectedStoreVersion)
926
- return 'conflict';
927
- const record = decodeAuthorityRecord(current.value.bytes);
928
- const snapshot = record.snapshot;
929
- if (snapshot.allocation.state === 'active'
930
- ? request === undefined
931
- : snapshot.pendingCreation === undefined)
932
- return 'notReclaimable';
933
- const leaseKey = ownerKey(snapshot.ownerId);
934
- const descriptorKey = meshKey(snapshot.allocation.descriptor.meshName, snapshot.allocation.descriptor.rid);
935
- const capacityRowKey = capacityKey(snapshot.allocation.descriptor.meshName, String(snapshot.allocation.descriptor.rid));
936
- const [lease, descriptor, capacity] = await Promise.all([
937
- this.provider.read(leaseKey, signal),
938
- this.provider.read(descriptorKey, signal),
939
- this.provider.read(capacityRowKey, signal)
940
- ]);
941
- const ownerLive = sameLiveOwner(lease, snapshot);
942
- let members = [];
943
- if (snapshot.allocation.state === 'active') {
944
- if (ownerLive)
929
+ async tryReleaseEndedReservation(key, expectedStoreVersion, signal, request, deadlineUnixMs, requiredOwner) {
930
+ for (;;) {
931
+ throwIfOperationExpired(signal, deadlineUnixMs);
932
+ const rowKey = authorityKey(key.value);
933
+ const current = await this.provider.read(rowKey, signal);
934
+ if (current.kind === 'missing')
935
+ return 'conflict';
936
+ const record = decodeAuthorityRecord(current.value.bytes);
937
+ if (current.value.version.value !== expectedStoreVersion &&
938
+ record.visibleStoreVersion !== expectedStoreVersion)
939
+ return 'conflict';
940
+ const snapshot = record.snapshot;
941
+ if (snapshot.allocation.state === 'active'
942
+ ? request === undefined
943
+ : snapshot.pendingCreation === undefined)
945
944
  return 'notReclaimable';
946
- let unavailable = record.aggregate !== undefined || hasRelocationAuthority(snapshot.payload);
947
- if (snapshot.allocation.objectKind !== 'actor') {
948
- const spot = (0, service_authority_payload_codec_1.decodeServiceReadySpotAuthority)(snapshot.payload);
949
- unavailable ||=
950
- spot === undefined ||
951
- spot.kind !== request?.key.kind ||
952
- spot.stableType !== request.intent.stableType ||
953
- spot.spotId !== request.key.globalId ||
954
- spot.activationRecovery !== undefined;
955
- if (spot?.kind === 'user_spot' &&
956
- !unavailable &&
957
- request?.actorRelocationPolicy === 'disabled')
958
- members = await this.readEndedSpotMembers(spot.spotId, snapshot.objectGeneration, signal);
959
- }
960
- if (unavailable || request?.actorRelocationPolicy !== 'disabled')
961
- throw new contracts_2.ZLinkFrameworkException(contracts_2.ZLinkFrameworkErrorKind.Unavailable, 'Object owner lease is unavailable.');
962
- }
963
- else if (ownerLive &&
964
- descriptor.kind === 'found' &&
965
- reviveMeshDescriptor(decodeCanonicalDescriptorRecord(descriptor.value.bytes).descriptor).lifecycleGeneration === snapshot.allocation.descriptorLifecycleGeneration)
966
- return 'notReclaimable';
967
- if (snapshot.allocation.state !== 'active' &&
968
- (record.aggregate !== undefined || hasRelocationAuthority(snapshot.payload)))
969
- return 'notReclaimable';
970
- // Location runtime §6.1: the authority and every ended-owner member are released in
971
- // one conditional batch. Each member is fenced by its row version and the observed
972
- // (invalid) state of its own owner lease; member capacity is returned like the Spot's.
973
- const conditions = [
974
- { kind: 'version', key: rowKey, expected: current.value.version },
975
- conditionFor(descriptorKey, descriptor)
976
- ];
977
- const mutations = [
978
- { kind: 'delete', key: rowKey }
979
- ];
980
- const owners = new Map([[snapshot.ownerId, lease]]);
981
- for (const member of members) {
982
- let memberLease = owners.get(member.ownerId);
983
- if (memberLease === undefined) {
984
- memberLease = await this.provider.read(ownerKey(member.ownerId), signal);
985
- owners.set(member.ownerId, memberLease);
986
- }
987
- if (memberLease.kind === 'found' &&
988
- matchesLiveOwnerLease(memberLease, member.ownerId, member.leaseGeneration))
989
- throw new contracts_2.ZLinkFrameworkException(contracts_2.ZLinkFrameworkErrorKind.Unavailable, 'User Spot still has a member with a live owner lease.');
990
- conditions.push({ kind: 'version', key: member.key, expected: member.version });
991
- mutations.push({ kind: 'delete', key: member.key });
992
- }
993
- for (const [ownerId, read] of owners)
994
- conditions.push(conditionFor(ownerKey(ownerId), read));
995
- const capacities = new Map([
996
- [capacityRowKey.value, { read: capacity }]
997
- ]);
998
- const releases = [
999
- { allocation: snapshot.allocation },
1000
- ...members.map((member) => ({ allocation: member.allocation }))
1001
- ];
1002
- try {
1003
- for (const { allocation } of releases) {
1004
- const key = capacityKey(allocation.descriptor.meshName, String(allocation.descriptor.rid));
1005
- let entry = capacities.get(key.value);
1006
- if (entry === undefined) {
1007
- entry = { read: await this.provider.read(key, signal) };
1008
- capacities.set(key.value, entry);
945
+ const leaseKey = ownerKey(snapshot.ownerId);
946
+ const descriptorKey = meshKey(snapshot.allocation.descriptor.meshName, snapshot.allocation.descriptor.rid);
947
+ const capacityRowKey = capacityKey(snapshot.allocation.descriptor.meshName, String(snapshot.allocation.descriptor.rid));
948
+ const [lease, descriptor, capacity] = await Promise.all([
949
+ this.provider.read(leaseKey, signal),
950
+ this.provider.read(descriptorKey, signal),
951
+ this.provider.read(capacityRowKey, signal)
952
+ ]);
953
+ const ownerLive = sameLiveOwner(lease, snapshot);
954
+ if (requiredOwner !== undefined &&
955
+ (!ownerLive ||
956
+ requiredOwner.ownerId !== snapshot.ownerId ||
957
+ requiredOwner.leaseGeneration !== snapshot.ownerLeaseGeneration))
958
+ return 'notReclaimable';
959
+ let members = [];
960
+ if (snapshot.allocation.state === 'active') {
961
+ if (ownerLive)
962
+ return 'notReclaimable';
963
+ let unavailable = record.aggregate !== undefined || hasRelocationAuthority(snapshot.payload);
964
+ if (snapshot.allocation.objectKind !== 'actor') {
965
+ const spot = (0, service_authority_payload_codec_1.decodeServiceReadySpotAuthority)(snapshot.payload);
966
+ unavailable ||=
967
+ spot === undefined ||
968
+ spot.kind !== request?.key.kind ||
969
+ spot.stableType !== request.intent.stableType ||
970
+ spot.spotId !== request.key.globalId ||
971
+ spot.activationRecovery !== undefined;
972
+ if (spot?.kind === 'user_spot' &&
973
+ !unavailable &&
974
+ request?.actorRelocationPolicy === 'disabled')
975
+ members = await this.readEndedSpotMembers(spot.spotId, snapshot.objectGeneration, signal);
1009
976
  }
1010
- if (entry.read.kind !== 'found')
1011
- continue;
1012
- const stored = entry.next ?? decodeJson(entry.read.value.bytes);
1013
- entry.next = {
1014
- active: allocation.state === 'active'
1015
- ? subtractCapacity(stored.active, allocation.capacity)
1016
- : stored.active,
1017
- pending: allocation.state === 'reserved'
1018
- ? subtractCapacity(stored.pending, allocation.capacity)
1019
- : stored.pending
1020
- };
977
+ if (unavailable || request?.actorRelocationPolicy !== 'disabled')
978
+ throw new contracts_2.ZLinkFrameworkException(contracts_2.ZLinkFrameworkErrorKind.Unavailable, 'Object owner lease is unavailable.');
1021
979
  }
1022
- }
1023
- catch (error) {
1024
- if (!(error instanceof contracts_2.ZLinkFrameworkException) ||
1025
- error.kind !== contracts_2.ZLinkFrameworkErrorKind.DataLost)
980
+ else if (ownerLive &&
981
+ descriptor.kind === 'found' &&
982
+ reviveMeshDescriptor(decodeCanonicalDescriptorRecord(descriptor.value.bytes)
983
+ .descriptor).lifecycleGeneration === snapshot.allocation.descriptorLifecycleGeneration)
984
+ return 'notReclaimable';
985
+ if (snapshot.allocation.state !== 'active' &&
986
+ (record.aggregate !== undefined || hasRelocationAuthority(snapshot.payload)))
987
+ return 'notReclaimable';
988
+ // Location runtime §6.1: the authority and every ended-owner member are released in
989
+ // one conditional batch. Each member is fenced by its row version and the observed
990
+ // (invalid) state of its own owner lease; member capacity is returned like the Spot's.
991
+ const conditions = [
992
+ { kind: 'version', key: rowKey, expected: current.value.version },
993
+ conditionFor(descriptorKey, descriptor)
994
+ ];
995
+ const mutations = [
996
+ { kind: 'delete', key: rowKey }
997
+ ];
998
+ const owners = new Map([[snapshot.ownerId, lease]]);
999
+ for (const member of members) {
1000
+ let memberLease = owners.get(member.ownerId);
1001
+ if (memberLease === undefined) {
1002
+ memberLease = await this.provider.read(ownerKey(member.ownerId), signal);
1003
+ owners.set(member.ownerId, memberLease);
1004
+ }
1005
+ if (memberLease.kind === 'found' &&
1006
+ matchesLiveOwnerLease(memberLease, member.ownerId, member.leaseGeneration))
1007
+ throw new contracts_2.ZLinkFrameworkException(contracts_2.ZLinkFrameworkErrorKind.Unavailable, 'User Spot still has a member with a live owner lease.');
1008
+ conditions.push({ kind: 'version', key: member.key, expected: member.version });
1009
+ mutations.push({ kind: 'delete', key: member.key });
1010
+ }
1011
+ for (const [ownerId, read] of owners)
1012
+ conditions.push(conditionFor(ownerKey(ownerId), read));
1013
+ const capacities = new Map([
1014
+ [capacityRowKey.value, { read: capacity }]
1015
+ ]);
1016
+ const releases = [
1017
+ { allocation: snapshot.allocation },
1018
+ ...members.map((member) => ({ allocation: member.allocation }))
1019
+ ];
1020
+ try {
1021
+ for (const { allocation } of releases) {
1022
+ const key = capacityKey(allocation.descriptor.meshName, String(allocation.descriptor.rid));
1023
+ let entry = capacities.get(key.value);
1024
+ if (entry === undefined) {
1025
+ entry = { read: await this.provider.read(key, signal) };
1026
+ capacities.set(key.value, entry);
1027
+ }
1028
+ if (entry.read.kind !== 'found')
1029
+ continue;
1030
+ const stored = entry.next ?? decodeJson(entry.read.value.bytes);
1031
+ entry.next = {
1032
+ active: allocation.state === 'active'
1033
+ ? subtractCapacity(stored.active, allocation.capacity)
1034
+ : stored.active,
1035
+ pending: allocation.state === 'reserved'
1036
+ ? subtractCapacity(stored.pending, allocation.capacity)
1037
+ : stored.pending
1038
+ };
1039
+ }
1040
+ }
1041
+ catch (error) {
1042
+ if (!(error instanceof contracts_2.ZLinkFrameworkException) ||
1043
+ error.kind !== contracts_2.ZLinkFrameworkErrorKind.DataLost)
1044
+ throw error;
1045
+ for (const authority of [{ key: rowKey, version: current.value.version }, ...members]) {
1046
+ const observed = await this.provider.read(authority.key, signal);
1047
+ if (observed.kind === 'missing' ||
1048
+ observed.value.version.value !== authority.version.value)
1049
+ return 'conflict';
1050
+ }
1026
1051
  throw error;
1027
- for (const authority of [{ key: rowKey, version: current.value.version }, ...members]) {
1028
- const observed = await this.provider.read(authority.key, signal);
1029
- if (observed.kind === 'missing' || observed.value.version.value !== authority.version.value)
1030
- return 'conflict';
1031
1052
  }
1032
- throw error;
1033
- }
1034
- for (const [key, entry] of capacities) {
1035
- conditions.push(conditionFor((0, in_memory_provider_location_store_1.storeKey)(key), entry.read));
1036
- if (entry.next !== undefined)
1037
- mutations.push({
1038
- kind: 'put',
1039
- key: (0, in_memory_provider_location_store_1.storeKey)(key),
1040
- bytes: encodeJson(entry.next)
1041
- });
1053
+ for (const [key, entry] of capacities) {
1054
+ conditions.push(conditionFor((0, in_memory_provider_location_store_1.storeKey)(key), entry.read));
1055
+ if (entry.next !== undefined)
1056
+ mutations.push({
1057
+ kind: 'put',
1058
+ key: (0, in_memory_provider_location_store_1.storeKey)(key),
1059
+ bytes: encodeJson(entry.next)
1060
+ });
1061
+ }
1062
+ // Every mutated key is also a condition key, so the condition count is the batch's
1063
+ // unique key count. A release beyond the provider bound changes nothing.
1064
+ if (conditions.length > Stores_1.ZLINK_PROVIDER_MAX_WRITE_KEYS)
1065
+ throw new contracts_2.ZLinkFrameworkException(contracts_2.ZLinkFrameworkErrorKind.Unavailable, 'User Spot member release exceeds one Location Store batch.');
1066
+ const result = await this.provider.write({ conditions, mutations }, signal);
1067
+ if (result.kind === 'applied')
1068
+ return 'reclaimed';
1069
+ await (0, abort_1.macrotaskBoundary)();
1042
1070
  }
1043
- // Every mutated key is also a condition key, so the condition count is the batch's
1044
- // unique key count. A release beyond the provider bound changes nothing.
1045
- if (conditions.length > Stores_1.ZLINK_PROVIDER_MAX_WRITE_KEYS)
1046
- throw new contracts_2.ZLinkFrameworkException(contracts_2.ZLinkFrameworkErrorKind.Unavailable, 'User Spot member release exceeds one Location Store batch.');
1047
- const result = await this.provider.write({ conditions, mutations }, signal);
1048
- return result.kind === 'applied' ? 'reclaimed' : 'conflict';
1049
1071
  }
1050
1072
  /**
1051
1073
  * Reads every Actor membership of one User Spot incarnation from complete snapshot scans
@@ -1116,7 +1138,7 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
1116
1138
  }
1117
1139
  if (reclaimVersion !== undefined && snapshot.storeVersion.value !== reclaimVersion)
1118
1140
  return { kind: 'conflict', current: snapshot };
1119
- const reclaim = await this.tryReleaseEndedReservation(encodedAuthorityKey, current.value.version.value, signal, request);
1141
+ const reclaim = await this.tryReleaseEndedReservation(encodedAuthorityKey, current.value.version.value, signal, request, deadlineUnixMs);
1120
1142
  if (reclaim === 'notReclaimable')
1121
1143
  return snapshot.allocation.state === 'active'
1122
1144
  ? { kind: 'alreadyExists', current: snapshot }
@@ -1417,7 +1439,7 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
1417
1439
  const membershipConditions = actor?.currentSpotKind === contracts_1.ZLinkSpotKind.User
1418
1440
  ? await this.userSpotMembershipConditions(actor.currentSpotId, actor.currentSpotGeneration, signal, request.target.owner)
1419
1441
  : [];
1420
- if (membershipConditions === undefined)
1442
+ if (!Array.isArray(membershipConditions))
1421
1443
  return { kind: 'stale' };
1422
1444
  const mutations = request.completion.kind === 'created'
1423
1445
  ? [
@@ -1889,45 +1911,7 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
1889
1911
  const lease = await this.provider.read(leaseKey, signal);
1890
1912
  if (liveOwnerLeaseGeneration(lease) !== owner.leaseGeneration)
1891
1913
  return 0n;
1892
- let removed = await this.removeOwnedAuthorities(owner, signal);
1893
- const candidates = [];
1894
- for (const prefix of [
1895
- 'mesh-node\0',
1896
- 'client-server\0',
1897
- 'fanout-publisher\0',
1898
- `${PREFIX}spot:`,
1899
- `${PREFIX}actor:`,
1900
- `${PREFIX}route:`
1901
- ]) {
1902
- for (;;) {
1903
- const prefixCandidates = [];
1904
- let cursor;
1905
- let expired = false;
1906
- do {
1907
- const result = await this.provider.scan({ prefix, cursor, limit: 1_000 }, signal);
1908
- if (result.kind === 'expired') {
1909
- expired = true;
1910
- break;
1911
- }
1912
- for (const item of result.value.items) {
1913
- prefixCandidates.push({ key: item.key, scanVersion: item.value.version });
1914
- }
1915
- cursor = result.value.nextCursor;
1916
- } while (cursor !== undefined);
1917
- if (expired) {
1918
- // Snapshot scan expiry invalidates every page from this prefix.
1919
- // Restart from its first page instead of silently leaving rows
1920
- // behind after a partial scan.
1921
- continue;
1922
- }
1923
- candidates.push(...prefixCandidates);
1924
- break;
1925
- }
1926
- }
1927
- for (let offset = 0; offset < candidates.length; offset += MAX_OWNER_CLEANUP_BATCH_ROWS) {
1928
- removed += await this.removeOwnerCleanupBatch(owner, leaseKey, candidates.slice(offset, offset + MAX_OWNER_CLEANUP_BATCH_ROWS), signal);
1929
- }
1930
- return removed + (await super.removeAllByOwner(owner));
1914
+ return this.removeOwnedAuthorities(owner, signal);
1931
1915
  }
1932
1916
  async removeOwnedAuthorities(owner, signal) {
1933
1917
  const candidates = [];
@@ -1995,65 +1979,12 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
1995
1979
  }, signal);
1996
1980
  if (aborted.kind === 'aborted')
1997
1981
  removed += 1n;
1998
- }
1999
- return removed;
2000
- }
2001
- async removeOwnerCleanupBatch(owner, leaseKey, candidates, signal) {
2002
- if (candidates.length === 0)
2003
- return 0n;
2004
- const currentRows = await Promise.all(candidates.map((candidate) => this.provider.read(candidate.key, signal)));
2005
- const unchangedOwnedRows = [];
2006
- for (let index = 0; index < candidates.length; index += 1) {
2007
- const candidate = candidates[index];
2008
- const current = currentRows[index];
2009
- if (current.kind === 'missing' ||
2010
- current.value.version.value !== candidate.scanVersion.value) {
2011
- continue;
2012
- }
2013
- const record = decodeJson(current.value.bytes);
2014
- const descriptor = record.descriptor;
2015
- if (descriptor.ownerId !== owner.ownerId ||
2016
- descriptorOwnerLeaseGeneration(descriptor) !== owner.leaseGeneration) {
2017
- continue;
1982
+ else if (aborted.kind === 'stale') {
1983
+ if (await this.releaseEndedReservationRequest({ value: encodedAuthority }, current.value.version.value, signal, undefined, owner))
1984
+ removed += 1n;
2018
1985
  }
2019
- unchangedOwnedRows.push({
2020
- key: candidate.key,
2021
- scanVersion: current.value.version
2022
- });
2023
- }
2024
- if (unchangedOwnedRows.length === 0)
2025
- return 0n;
2026
- const currentLease = await this.provider.read(leaseKey, signal);
2027
- if (currentLease.kind === 'missing' ||
2028
- liveOwnerLeaseGeneration(currentLease) !== owner.leaseGeneration) {
2029
- return 0n;
2030
1986
  }
2031
- const result = await this.provider.write({
2032
- conditions: [
2033
- { kind: 'version', key: leaseKey, expected: currentLease.value.version },
2034
- ...unchangedOwnedRows.map((row) => ({
2035
- kind: 'version',
2036
- key: row.key,
2037
- expected: row.scanVersion
2038
- }))
2039
- ],
2040
- mutations: unchangedOwnedRows.map((row) => ({
2041
- kind: 'delete',
2042
- key: row.key
2043
- }))
2044
- }, signal);
2045
- if (result.kind === 'applied')
2046
- return BigInt(unchangedOwnedRows.length);
2047
- // A row may have changed while the page was being prepared. Split the
2048
- // bounded batch so unaffected rows can still be removed atomically, while
2049
- // the changed row is discarded by the next version re-read. A changed
2050
- // owner lease causes every recursive branch to stop at the fence above.
2051
- if (unchangedOwnedRows.length === 1)
2052
- return 0n;
2053
- const midpoint = Math.ceil(unchangedOwnedRows.length / 2);
2054
- const left = await this.removeOwnerCleanupBatch(owner, leaseKey, unchangedOwnedRows.slice(0, midpoint), signal);
2055
- const right = await this.removeOwnerCleanupBatch(owner, leaseKey, unchangedOwnedRows.slice(midpoint), signal);
2056
- return left + right;
1987
+ return removed;
2057
1988
  }
2058
1989
  async updateDescriptor(rowKey, descriptor, intent, revive, same, canRenew, signal) {
2059
1990
  const leaseKey = ownerKey(descriptor.ownerId);
@@ -2171,7 +2102,7 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
2171
2102
  const key = authorityKey((0, authority_key_codec_1.encodeAuthorityKey)('user_spot', spotId).value);
2172
2103
  const read = await this.provider.read(key, signal);
2173
2104
  if (read.kind === 'missing')
2174
- return undefined;
2105
+ return { failureKind: contracts_2.ZLinkFrameworkErrorKind.NotFound };
2175
2106
  const record = decodeAuthorityRecord(read.value.bytes);
2176
2107
  const snapshot = record.snapshot;
2177
2108
  if (record.aggregate !== undefined ||
@@ -2179,11 +2110,11 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
2179
2110
  snapshot.allocation.state !== 'active' ||
2180
2111
  snapshot.objectGeneration !== objectGeneration ||
2181
2112
  (0, service_authority_payload_codec_1.decodeServiceReadySpotAuthority)(snapshot.payload)?.kind !== 'user_spot')
2182
- return undefined;
2113
+ return { failureKind: contracts_2.ZLinkFrameworkErrorKind.Unavailable };
2183
2114
  const leaseKey = ownerKey(snapshot.ownerId);
2184
2115
  const lease = await this.provider.read(leaseKey, signal);
2185
2116
  if (!sameLiveOwner(lease, snapshot))
2186
- return undefined;
2117
+ return { failureKind: contracts_2.ZLinkFrameworkErrorKind.Unavailable };
2187
2118
  return [
2188
2119
  { kind: 'version', key, expected: read.value.version },
2189
2120
  ...(conditionedOwner?.ownerId === snapshot.ownerId &&
@@ -2251,7 +2182,7 @@ class ZLinkLocationStoreRepository extends in_memory_location_store_1.ZLinkInMem
2251
2182
  BigInt(previousMembership.spotGeneration) !== membership.spotGeneration)
2252
2183
  ? await this.userSpotMembershipConditions(String(membership.spotId), membership.spotGeneration, signal, { ownerId: location.ownerId, leaseGeneration: locationOwnerGeneration(location) })
2253
2184
  : [];
2254
- if (membershipConditions === undefined)
2185
+ if (!Array.isArray(membershipConditions))
2255
2186
  return rejected(lease.value.storeNow);
2256
2187
  const result = await this.provider.write({
2257
2188
  conditions: [
@@ -3527,20 +3458,6 @@ function matchesRoute(value, filter) {
3527
3458
  function locationOwnerGeneration(value) {
3528
3459
  return value.leaseGeneration;
3529
3460
  }
3530
- function descriptorOwnerLeaseGeneration(value) {
3531
- if ('leaseGeneration' in value) {
3532
- return typeof value.leaseGeneration === 'bigint'
3533
- ? value.leaseGeneration
3534
- : BigInt(value.leaseGeneration);
3535
- }
3536
- if ('generation' in value) {
3537
- return typeof value.generation === 'bigint' ? value.generation : BigInt(value.generation);
3538
- }
3539
- return undefined;
3540
- }
3541
- // Location runtime §10: a write whose result was lost is confirmed by reading
3542
- // the same key. The stored row already is this write when it differs only in
3543
- // the time the Store stamped, as for every other descriptor kind.
3544
3461
  function sameMeshDescriptor(left, right) {
3545
3462
  return descriptorFingerprint(left, ['updatedAt']) === descriptorFingerprint(right, ['updatedAt']);
3546
3463
  }
@@ -1,3 +1,5 @@
1
+ import type { PendingOperation } from '../foundation/operation-registry';
2
+ import { inspectRuntime } from '../internal-observation';
1
3
  import type { ActorRef, RoutingId, SpotId } from '../../contracts/Common';
2
4
  import { type SpotHandle, type ZLinkActorSpotHandleResolver, type ZLinkSpotHandleResolver, type ResolvedSpotHandle } from '../spots/spot-handle';
3
5
  import type { ZLinkSpotRouteResolver, ZLinkSpotRouteTarget, ZLinkInstanceReactivationRoute } from '../spots/spot-routing-internal';
@@ -67,6 +69,11 @@ export interface ZLinkSpotRouteInvalidationFence {
67
69
  }
68
70
  export declare class ZLinkStoreLocationResolvers implements ZLinkPeerLocationResolver, ZLinkSpotHandleResolver, ZLinkActorSpotHandleResolver {
69
71
  private readonly options;
72
+ [inspectRuntime](): Readonly<{
73
+ spotRouteKeys: readonly string[];
74
+ actorRouteKeys: readonly string[];
75
+ directActorRouteKeys: readonly string[];
76
+ }>;
70
77
  private readonly lane;
71
78
  private readonly liveRows;
72
79
  private readonly monotonicNowMs;
@@ -91,7 +98,7 @@ export declare class ZLinkStoreLocationResolvers implements ZLinkPeerLocationRes
91
98
  resolveSpotHandle(meshName: string, spotId: RoutingId, signal?: AbortSignal): Promise<SpotHandle | undefined>;
92
99
  resolveActorSpotRef(meshName: string, actorId: string, signal?: AbortSignal): Promise<ResolvedSpotHandle | undefined>;
93
100
  resolveActorRef(actorId: string, signal?: AbortSignal): Promise<ActorRef | undefined>;
94
- resolveDirectActorRoute(actorId: string, signal?: AbortSignal, deadlineMs?: number): Promise<ZLinkDirectActorRouteResolution>;
101
+ resolveDirectActorRoute(actorId: string, signal?: AbortSignal, deadlineMs?: number, requestOperation?: PendingOperation<unknown>): Promise<ZLinkDirectActorRouteResolution>;
95
102
  private resolveUncachedDirectActorRoute;
96
103
  private cacheDirectActorRoute;
97
104
  observeActorAuthorityVersion(actorId: string, storeVersion: string): void;
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ZLinkAuthoritySpotRouteResolver = exports.ZLinkLocationSpotRouteResolver = exports.DefaultZLinkLocationReadiness = exports.ZLinkStoreLocationResolvers = void 0;
4
+ const abort_1 = require("../abort");
5
+ const internal_observation_1 = require("../internal-observation");
4
6
  const location_store_pages_1 = require("./location-store-pages");
5
7
  const Errors_1 = require("../../contracts/Errors");
6
8
  const Options_1 = require("../../contracts/Locations/Options");
@@ -54,6 +56,13 @@ function projectCanonicalActorRoute(snapshot, actorId) {
54
56
  }
55
57
  class ZLinkStoreLocationResolvers {
56
58
  options;
59
+ [internal_observation_1.inspectRuntime]() {
60
+ return Object.freeze({
61
+ spotRouteKeys: Object.freeze([...this.spotRoutes.keys()]),
62
+ actorRouteKeys: Object.freeze([...this.actorRoutes.keys()]),
63
+ directActorRouteKeys: Object.freeze([...this.directActorRoutes.keys()])
64
+ });
65
+ }
57
66
  lane = new state_lane_1.ZLinkStateLane();
58
67
  liveRows;
59
68
  monotonicNowMs;
@@ -195,11 +204,16 @@ class ZLinkStoreLocationResolvers {
195
204
  }
196
205
  return (await this.resolveActorRow({ meshName: '', actorId }, signal))?.actorRef;
197
206
  }
198
- async resolveDirectActorRoute(actorId, signal, deadlineMs) {
207
+ async resolveDirectActorRoute(actorId, signal, deadlineMs, requestOperation) {
199
208
  const cached = await this.lane.run(() => this.getCachedCore(this.directActorRoutes, actorId));
200
209
  if (cached !== undefined)
201
210
  return { kind: 'ready', route: cached };
202
- return await (0, actor_request_deadline_1.waitActorReply)(this.resolveUncachedDirectActorRoute(actorId, signal), actorId, deadlineMs, signal);
211
+ const resolving = this.resolveUncachedDirectActorRoute(actorId, signal);
212
+ if (requestOperation === undefined) {
213
+ (0, actor_request_deadline_1.remainingActorRequestTimeout)(actorId, deadlineMs);
214
+ return await (0, abort_1.awaitWithAbort)(resolving, signal);
215
+ }
216
+ return await resolving;
203
217
  }
204
218
  async resolveUncachedDirectActorRoute(actorId, signal) {
205
219
  const current = await this.options.stores.authorityStore.readAuthority((0, authority_key_codec_1.encodeAuthorityKey)('actor', actorId), signal);
@@ -1,6 +1,6 @@
1
1
  import { type ZLinkLocationOptionOverrides } from '../../contracts/Locations/Options';
2
2
  import type { RoutingId } from '../../contracts/Common';
3
- import { ZLinkLocationAutoConnectType, ZLinkLocationWriteIntent, ZLinkLocationWriteStatus, type ZLinkLocationRuntimeQuery, type ZLinkLocationOwnerToken, type ZLinkOwnerLeaseRenewed, type ZLinkActorLocation, type ZLinkActorLocationFilter, type ZLinkActorLocationKey, type ZLinkLocationKey, type ZLinkLocationPage, type ZLinkLocationRuntimeStatus, type ZLinkLocationServiceSummary, type ZLinkLocationServiceSummaryFilter, type ZLinkMeshNodeDescriptor, type ZLinkLocationTopologyEntry, type ZLinkLocationTopologyFilter, type ZLinkLocationWriteResult, type ZLinkPageRequest, type ZLinkPeerLocation, type ZLinkPeerLocationFilter, type ZLinkPeerLocationKey, type ZLinkRouteLocation, type ZLinkRouteLocationFilter, type ZLinkRouteLocationKey, type ZLinkSpotLocation, type ZLinkSpotLocationFilter, type ZLinkSpotLocationKey } from './internal-location-contracts';
3
+ import { ZLinkLocationAutoConnectType, ZLinkLocationKind, ZLinkLocationWriteIntent, ZLinkLocationWriteStatus, type ZLinkLocationRuntimeQuery, type ZLinkLocationOwnerToken, type ZLinkOwnerLeaseRenewed, type ZLinkActorLocation, type ZLinkActorLocationFilter, type ZLinkActorLocationKey, type ZLinkLocationKey, type ZLinkLocationPage, type ZLinkLocationRuntimeStatus, type ZLinkLocationServiceSummary, type ZLinkLocationServiceSummaryFilter, type ZLinkMeshNodeDescriptor, type ZLinkLocationTopologyEntry, type ZLinkLocationTopologyFilter, type ZLinkLocationWriteResult, type ZLinkPageRequest, type ZLinkPeerLocation, type ZLinkPeerLocationFilter, type ZLinkPeerLocationKey, type ZLinkRouteLocation, type ZLinkRouteLocationFilter, type ZLinkRouteLocationKey, type ZLinkSpotLocation, type ZLinkSpotLocationFilter, type ZLinkSpotLocationKey } from './internal-location-contracts';
4
4
  import type { ZLinkLocationObjectEntry, ZLinkLocationObjectFilter } from '../../contracts/Locations/RuntimeQuery';
5
5
  import type { ZLinkActorLocationStore, ZLinkAuthorityStore, ZLinkClientServerLocationStore, ZLinkFanoutLocationStore, ZLinkOwnerLeaseStore, ZLinkPeerLocationStore, ZLinkRouteLocationStore, ZLinkSpotLocationStore } from './internal-store-contracts';
6
6
  import type { ZLinkDomainLocationStore } from './domain-store-contract';
@@ -95,7 +95,7 @@ export declare class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
95
95
  get isStarted(): boolean;
96
96
  get nodeRid(): RoutingId | undefined;
97
97
  get currentOwnerToken(): ZLinkLocationOwnerToken | undefined;
98
- /** Location runtime §5: a startup Store request ends within the renew timeout. */
98
+ /** Location runtime §5: a descriptor publication ends within the renew timeout. */
99
99
  writeDescriptor<T>(action: (signal?: AbortSignal) => Promise<T>, signal?: AbortSignal): Promise<T>;
100
100
  closeOwnerLeaseAdmission(error: unknown): void;
101
101
  reclaimOwnerAuthorities(signal?: AbortSignal): Promise<void>;
@@ -149,7 +149,7 @@ export declare class ZLinkLocationRuntime implements ZLinkLocationRuntimeQuery {
149
149
  private scheduleHeartbeat;
150
150
  private guardWrite;
151
151
  private guardStatusWrite;
152
- private notifyIfStale;
152
+ notifyIfStale(result: ZLinkLocationWriteResult, kind: ZLinkLocationKind, key: string): void;
153
153
  private notifyIfStaleStatus;
154
154
  private recordFailure;
155
155
  private recordOwnerLeaseRenewFailure;