@zlink-systems/framework 0.26.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 (521) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Common/CoreTypes.d.ts +6 -0
  3. package/dist/contracts/Common/CoreTypes.js +7 -0
  4. package/dist/contracts/Common/index.d.ts +1 -1
  5. package/dist/contracts/Common/index.js +0 -1
  6. package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
  7. package/dist/contracts/Configuration/InternalDefaults.js +9 -1
  8. package/dist/contracts/Configuration/Registration.d.ts +13 -2
  9. package/dist/contracts/Configuration/Registration.js +58 -36
  10. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
  12. package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
  13. package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
  14. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  15. package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
  16. package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
  17. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
  18. package/dist/contracts/Handlers/JsonContract.js +10 -4
  19. package/dist/contracts/Locations/Authority.d.ts +1 -1
  20. package/dist/contracts/Locations/Authority.js +3 -2
  21. package/dist/contracts/Locations/Options.js +1 -1
  22. package/dist/contracts/Locations/Stores.d.ts +12 -0
  23. package/dist/contracts/Locations/Stores.js +9 -0
  24. package/dist/contracts/Spots/Contracts.d.ts +1 -1
  25. package/dist/internal.d.ts +4 -0
  26. package/dist/internal.js +15 -1
  27. package/dist/nest-integration.d.ts +4 -2
  28. package/dist/nest-integration.js +14 -4
  29. package/dist/runtime/abort.d.ts +1 -0
  30. package/dist/runtime/abort.js +8 -5
  31. package/dist/runtime/activation-admission.d.ts +1 -2
  32. package/dist/runtime/activation-admission.js +2 -6
  33. package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
  34. package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
  35. package/dist/runtime/actors/actor-client.d.ts +2 -2
  36. package/dist/runtime/actors/actor-client.js +42 -143
  37. package/dist/runtime/actors/actor-context.d.ts +3 -5
  38. package/dist/runtime/actors/actor-context.js +13 -11
  39. package/dist/runtime/actors/actor-handoff.d.ts +4 -4
  40. package/dist/runtime/actors/actor-handoff.js +8 -8
  41. package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
  42. package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
  43. package/dist/runtime/actors/actor-local-native-join.js +83 -105
  44. package/dist/runtime/actors/actor-native-lookup.js +2 -8
  45. package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
  46. package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
  47. package/dist/runtime/actors/actor-remote-joiner.d.ts +1 -1
  48. package/dist/runtime/actors/actor-remote-joiner.js +5 -9
  49. package/dist/runtime/actors/actor-remote-wire.js +5 -3
  50. package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
  51. package/dist/runtime/actors/actor-request-deadline.js +31 -0
  52. package/dist/runtime/actors/actor-retry-delay.js +2 -1
  53. package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
  54. package/dist/runtime/actors/actor-runtime-state.js +70 -187
  55. package/dist/runtime/actors/bound-session-wire.js +2 -7
  56. package/dist/runtime/actors/deferred-join-completion.d.ts +11 -6
  57. package/dist/runtime/actors/deferred-join-completion.js +1 -0
  58. package/dist/runtime/actors/index.d.ts +9 -7
  59. package/dist/runtime/actors/index.js +87 -69
  60. package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
  61. package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
  62. package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
  63. package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
  64. package/dist/runtime/admission.d.ts +2 -0
  65. package/dist/runtime/admission.js +7 -1
  66. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
  67. package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
  68. package/dist/runtime/backend/contracts/index.d.ts +6 -23
  69. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +1 -17
  70. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
  71. package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
  72. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +1 -1
  73. package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -6
  74. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
  75. package/dist/runtime/backend/node/node-event-loop-poller.js +6 -7
  76. package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
  77. package/dist/runtime/backend/node/node-raw-binding-port.js +40 -16
  78. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +14 -15
  79. package/dist/runtime/backend/node/node-raw-mesh-backend.js +146 -118
  80. package/dist/runtime/backend/node/node-socket-backend-adapter.js +3 -2
  81. package/dist/runtime/backend/raw-binding-port.d.ts +1 -1
  82. package/dist/runtime/backend/runtime-values.d.ts +4 -1
  83. package/dist/runtime/backend/runtime-values.js +2 -0
  84. package/dist/runtime/channels/channel-clients.d.ts +20 -8
  85. package/dist/runtime/channels/channel-clients.js +68 -52
  86. package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
  87. package/dist/runtime/channels/channel-envelope.js +47 -29
  88. package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
  89. package/dist/runtime/channels/channel-outbound-operations.js +9 -10
  90. package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
  91. package/dist/runtime/channels/channel-receive-loops.js +27 -6
  92. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
  93. package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
  94. package/dist/runtime/channels/channel-runtime-manager.js +5 -2
  95. package/dist/runtime/channels/channel-socket-options.js +3 -2
  96. package/dist/runtime/channels/channel-socket-registry.d.ts +14 -29
  97. package/dist/runtime/channels/channel-socket-registry.js +248 -174
  98. package/dist/runtime/channels/channel-transports.d.ts +11 -17
  99. package/dist/runtime/channels/channel-transports.js +68 -47
  100. package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
  101. package/dist/runtime/channels/client-server-location-runtime.js +10 -11
  102. package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
  103. package/dist/runtime/channels/client-server-service-wire.js +32 -11
  104. package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
  105. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  106. package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
  107. package/dist/runtime/channels/fanout-location-runtime.js +130 -72
  108. package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
  109. package/dist/runtime/channels/spot-direct-envelope.js +4 -3
  110. package/dist/runtime/channels/spot-node-route-transport.js +3 -2
  111. package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
  112. package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
  113. package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
  114. package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
  115. package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
  116. package/dist/runtime/diagnostics/flow-context.js +16 -2
  117. package/dist/runtime/diagnostics/index.d.ts +4 -2
  118. package/dist/runtime/diagnostics/index.js +14 -4
  119. package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
  120. package/dist/runtime/diagnostics/message-flow.js +10 -19
  121. package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
  122. package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
  123. package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
  124. package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
  125. package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
  126. package/dist/runtime/disposal.d.ts +5 -0
  127. package/dist/runtime/disposal.js +22 -0
  128. package/dist/runtime/execution/index.d.ts +12 -9
  129. package/dist/runtime/execution/index.js +58 -14
  130. package/dist/runtime/execution/serial-execution-queue.d.ts +8 -2
  131. package/dist/runtime/execution/serial-execution-queue.js +54 -15
  132. package/dist/runtime/execution/state-lane.d.ts +8 -1
  133. package/dist/runtime/execution/state-lane.js +118 -3
  134. package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
  135. package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
  136. package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
  137. package/dist/runtime/foundation/event-loop-resources.js +6 -119
  138. package/dist/runtime/foundation/operation-identity.d.ts +2 -0
  139. package/dist/runtime/foundation/operation-identity.js +9 -5
  140. package/dist/runtime/foundation/operation-registry.d.ts +5 -7
  141. package/dist/runtime/foundation/operation-registry.js +34 -44
  142. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +8 -5
  143. package/dist/runtime/foundation/raw-service-mesh-runtime.js +62 -83
  144. package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
  145. package/dist/runtime/foundation/runtime-state-projections.js +8 -0
  146. package/dist/runtime/foundation/service-authority-payload-codec.js +22 -12
  147. package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
  148. package/dist/runtime/foundation/service-discovery-registry.js +22 -3
  149. package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
  150. package/dist/runtime/foundation/service-liveness-registry.js +2 -1
  151. package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
  152. package/dist/runtime/foundation/service-maintenance-runtime.js +0 -6
  153. package/dist/runtime/foundation/service-metadata-codec.js +3 -3
  154. package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
  155. package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
  156. package/dist/runtime/foundation/service-relocation-object-owner.js +3 -2
  157. package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
  158. package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
  159. package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
  160. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -12
  161. package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
  162. package/dist/runtime/foundation/service-stateful-registry.js +10 -2
  163. package/dist/runtime/foundation/service-stateful-runtime.d.ts +26 -25
  164. package/dist/runtime/foundation/service-stateful-runtime.js +217 -204
  165. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -3
  166. package/dist/runtime/foundation/service-stateful-wire-codec.js +89 -55
  167. package/dist/runtime/foundation/service-topology-registry.d.ts +0 -1
  168. package/dist/runtime/foundation/service-topology-registry.js +17 -32
  169. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
  170. package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
  171. package/dist/runtime/foundation/service-wire-codec.js +10 -8
  172. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  173. package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
  174. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
  175. package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
  176. package/dist/runtime/framework-errors-internal.d.ts +2 -1
  177. package/dist/runtime/framework-errors-internal.js +343 -122
  178. package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
  179. package/dist/runtime/handlers/handler-instance-scope.js +61 -74
  180. package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
  181. package/dist/runtime/host/actor-packet-relay.js +48 -91
  182. package/dist/runtime/host/actor-placement-coordinator.js +7 -5
  183. package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
  184. package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
  185. package/dist/runtime/host/actor-transfer-runtime.d.ts +16 -18
  186. package/dist/runtime/host/actor-transfer-runtime.js +143 -176
  187. package/dist/runtime/host/application-job-queue.js +16 -33
  188. package/dist/runtime/host/bound-session-relay.js +1 -1
  189. package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
  190. package/dist/runtime/host/index.d.ts +14 -13
  191. package/dist/runtime/host/index.js +190 -157
  192. package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
  193. package/dist/runtime/host/instance-activation-authority.js +17 -45
  194. package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
  195. package/dist/runtime/host/location-runtime-owner.js +2 -2
  196. package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
  197. package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
  198. package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
  199. package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
  200. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
  201. package/dist/runtime/host/remote-bound-session-relay.js +7 -20
  202. package/dist/runtime/host/route-mesh-runtime.d.ts +13 -11
  203. package/dist/runtime/host/route-mesh-runtime.js +171 -252
  204. package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
  205. package/dist/runtime/host/runtime-shutdown.js +18 -21
  206. package/dist/runtime/host/service-relocation-control.js +6 -1
  207. package/dist/runtime/host/service-relocation-host-runtime.d.ts +21 -30
  208. package/dist/runtime/host/service-relocation-host-runtime.js +508 -416
  209. package/dist/runtime/host/spot-address-transport.d.ts +2 -3
  210. package/dist/runtime/host/spot-address-transport.js +34 -136
  211. package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
  212. package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
  213. package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -10
  214. package/dist/runtime/host/spot-runtime-options-factory.js +50 -14
  215. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -3
  216. package/dist/runtime/host/user-spot-creation-coordinator.js +11 -8
  217. package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
  218. package/dist/runtime/locations/authority-key-codec.js +4 -3
  219. package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
  220. package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
  221. package/dist/runtime/locations/creation-operation-id.js +6 -4
  222. package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
  223. package/dist/runtime/locations/in-memory-authority-store.js +31 -15
  224. package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
  225. package/dist/runtime/locations/in-memory-location-store.js +17 -14
  226. package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
  227. package/dist/runtime/locations/in-memory-provider-location-store.js +72 -22
  228. package/dist/runtime/locations/key-codec.js +3 -2
  229. package/dist/runtime/locations/lease-tracker.d.ts +3 -5
  230. package/dist/runtime/locations/lease-tracker.js +7 -11
  231. package/dist/runtime/locations/lifecycle.d.ts +4 -9
  232. package/dist/runtime/locations/lifecycle.js +2 -31
  233. package/dist/runtime/locations/location-store-failure.d.ts +2 -0
  234. package/dist/runtime/locations/location-store-failure.js +7 -0
  235. package/dist/runtime/locations/location-store-pages.d.ts +3 -0
  236. package/dist/runtime/locations/location-store-pages.js +13 -0
  237. package/dist/runtime/locations/location-store-repository.d.ts +5 -7
  238. package/dist/runtime/locations/location-store-repository.js +303 -332
  239. package/dist/runtime/locations/relocation-blob.js +18 -5
  240. package/dist/runtime/locations/resolvers.d.ts +5 -5
  241. package/dist/runtime/locations/resolvers.js +37 -28
  242. package/dist/runtime/locations/runtime.d.ts +5 -4
  243. package/dist/runtime/locations/runtime.js +123 -92
  244. package/dist/runtime/locations/spot-location-claims.d.ts +6 -0
  245. package/dist/runtime/locations/spot-location-claims.js +42 -1
  246. package/dist/runtime/messaging/payload-codec.js +26 -20
  247. package/dist/runtime/messaging/submission-result.d.ts +3 -0
  248. package/dist/runtime/messaging/submission-result.js +48 -0
  249. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +1 -0
  250. package/dist/runtime/protocol/service_wire_codec.generated.js +12 -7
  251. package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +4 -1
  252. package/dist/runtime/spots/index.d.ts +14 -20
  253. package/dist/runtime/spots/index.js +302 -176
  254. package/dist/runtime/spots/spot-activation-registry.d.ts +3 -5
  255. package/dist/runtime/spots/spot-activation-registry.js +14 -50
  256. package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
  257. package/dist/runtime/spots/spot-activation-state.js +2 -2
  258. package/dist/runtime/spots/spot-activation.d.ts +3 -4
  259. package/dist/runtime/spots/spot-activation.js +49 -32
  260. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
  261. package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
  262. package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
  263. package/dist/runtime/spots/spot-actor-join-dispatch.js +4 -52
  264. package/dist/runtime/spots/spot-actor-membership.d.ts +4 -6
  265. package/dist/runtime/spots/spot-actor-membership.js +22 -45
  266. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
  267. package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
  268. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
  269. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
  270. package/dist/runtime/spots/spot-context.d.ts +2 -2
  271. package/dist/runtime/spots/spot-entry-activation.d.ts +2 -2
  272. package/dist/runtime/spots/spot-entry-activation.js +9 -20
  273. package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
  274. package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
  275. package/dist/runtime/spots/spot-manager-public.js +5 -4
  276. package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
  277. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -18
  278. package/dist/runtime/spots/spot-node-runtime-manager.js +67 -72
  279. package/dist/runtime/spots/spot-outbound.d.ts +4 -3
  280. package/dist/runtime/spots/spot-outbound.js +9 -8
  281. package/dist/runtime/spots/spot-remote-codec.js +5 -3
  282. package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
  283. package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
  284. package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
  285. package/dist/runtime/spots/spot-route-replies.js +3 -1
  286. package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -3
  287. package/dist/runtime/spots/spot-routed-actor-admission.js +3 -12
  288. package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +1 -2
  289. package/dist/runtime/spots/spot-routed-frame-dispatch.js +0 -1
  290. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
  291. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
  292. package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -16
  293. package/dist/runtime/spots/spot-serial-executor.js +2 -2
  294. package/dist/runtime/spots/spot-serial-turn-executor.d.ts +27 -7
  295. package/dist/runtime/spots/spot-serial-turn-executor.js +83 -11
  296. package/dist/runtime/spots/spot-timer.d.ts +3 -2
  297. package/dist/runtime/streams/actor-session-binding-registry.d.ts +16 -29
  298. package/dist/runtime/streams/actor-session-binding-registry.js +142 -212
  299. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +1 -4
  300. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
  301. package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
  302. package/dist/runtime/streams/bound-session-service.d.ts +7 -0
  303. package/dist/runtime/streams/bound-session-service.js +11 -1
  304. package/dist/runtime/streams/index.d.ts +14 -15
  305. package/dist/runtime/streams/index.js +20 -21
  306. package/dist/runtime/streams/managed-stream.d.ts +3 -0
  307. package/dist/runtime/streams/managed-stream.js +17 -8
  308. package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
  309. package/dist/runtime/streams/protocol.d.ts +6 -33
  310. package/dist/runtime/streams/protocol.js +38 -110
  311. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
  312. package/dist/runtime/streams/session-actor-coordinator.js +12 -4
  313. package/dist/runtime/streams/session-calls.d.ts +1 -1
  314. package/dist/runtime/streams/session-calls.js +5 -4
  315. package/dist/runtime/streams/session-context.d.ts +6 -6
  316. package/dist/runtime/streams/session-context.js +22 -4
  317. package/dist/runtime/streams/session-requests.js +2 -1
  318. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
  319. package/dist/runtime/streams/stream-frame-factory.js +2 -2
  320. package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
  321. package/dist/runtime/streams/stream-session-runtime.js +25 -33
  322. package/dist/runtime/workers/index.d.ts +2 -2
  323. package/dist/runtime/workers/index.js +5 -4
  324. package/package.json +3 -3
  325. package/src/contracts/Common/CoreTypes.ts +7 -0
  326. package/src/contracts/Common/index.ts +1 -1
  327. package/src/contracts/Configuration/InternalDefaults.ts +12 -0
  328. package/src/contracts/Configuration/Registration.ts +92 -48
  329. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
  330. package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
  331. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  332. package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
  333. package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
  334. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
  335. package/src/contracts/Handlers/JsonContract.ts +14 -4
  336. package/src/contracts/Locations/Authority.ts +7 -3
  337. package/src/contracts/Locations/Options.ts +1 -1
  338. package/src/contracts/Locations/Stores.ts +14 -0
  339. package/src/contracts/Spots/Contracts.ts +1 -1
  340. package/src/internal.ts +14 -0
  341. package/src/nest-integration.ts +28 -10
  342. package/src/runtime/abort.ts +6 -5
  343. package/src/runtime/activation-admission.ts +2 -8
  344. package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
  345. package/src/runtime/actors/actor-client.ts +77 -204
  346. package/src/runtime/actors/actor-context.ts +39 -33
  347. package/src/runtime/actors/actor-handoff.ts +24 -22
  348. package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
  349. package/src/runtime/actors/actor-local-native-join.ts +172 -174
  350. package/src/runtime/actors/actor-native-lookup.ts +2 -9
  351. package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
  352. package/src/runtime/actors/actor-remote-joiner.ts +9 -11
  353. package/src/runtime/actors/actor-remote-wire.ts +5 -3
  354. package/src/runtime/actors/actor-request-deadline.ts +49 -0
  355. package/src/runtime/actors/actor-retry-delay.ts +2 -1
  356. package/src/runtime/actors/actor-runtime-state.ts +85 -247
  357. package/src/runtime/actors/bound-session-wire.ts +2 -8
  358. package/src/runtime/actors/deferred-join-completion.ts +10 -6
  359. package/src/runtime/actors/index.ts +100 -79
  360. package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
  361. package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
  362. package/src/runtime/admission.ts +8 -1
  363. package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
  364. package/src/runtime/backend/contracts/index.ts +13 -29
  365. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +2 -18
  366. package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
  367. package/src/runtime/backend/node/node-backend-adapter-support.ts +23 -6
  368. package/src/runtime/backend/node/node-event-loop-poller.ts +8 -12
  369. package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
  370. package/src/runtime/backend/node/node-raw-binding-port.ts +41 -20
  371. package/src/runtime/backend/node/node-raw-mesh-backend.ts +227 -170
  372. package/src/runtime/backend/node/node-socket-backend-adapter.ts +3 -2
  373. package/src/runtime/backend/raw-binding-port.ts +1 -1
  374. package/src/runtime/backend/runtime-values.ts +4 -1
  375. package/src/runtime/channels/channel-clients.ts +132 -85
  376. package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
  377. package/src/runtime/channels/channel-envelope.ts +58 -29
  378. package/src/runtime/channels/channel-outbound-operations.ts +10 -23
  379. package/src/runtime/channels/channel-receive-loops.ts +39 -7
  380. package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
  381. package/src/runtime/channels/channel-runtime-manager.ts +6 -2
  382. package/src/runtime/channels/channel-socket-options.ts +8 -2
  383. package/src/runtime/channels/channel-socket-registry.ts +301 -192
  384. package/src/runtime/channels/channel-transports.ts +161 -112
  385. package/src/runtime/channels/client-server-location-runtime.ts +17 -17
  386. package/src/runtime/channels/client-server-service-wire.ts +40 -12
  387. package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
  388. package/src/runtime/channels/fanout-location-runtime.ts +172 -91
  389. package/src/runtime/channels/spot-direct-envelope.ts +1 -1
  390. package/src/runtime/channels/spot-node-route-transport.ts +5 -2
  391. package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
  392. package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
  393. package/src/runtime/diagnostics/flow-context.ts +16 -2
  394. package/src/runtime/diagnostics/index.ts +27 -17
  395. package/src/runtime/diagnostics/message-flow.ts +15 -25
  396. package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
  397. package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
  398. package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
  399. package/src/runtime/disposal.ts +19 -0
  400. package/src/runtime/execution/index.ts +60 -20
  401. package/src/runtime/execution/serial-execution-queue.ts +131 -18
  402. package/src/runtime/execution/state-lane.ts +142 -4
  403. package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
  404. package/src/runtime/foundation/event-loop-resources.ts +5 -122
  405. package/src/runtime/foundation/operation-identity.ts +11 -5
  406. package/src/runtime/foundation/operation-registry.ts +33 -50
  407. package/src/runtime/foundation/raw-service-mesh-runtime.ts +110 -111
  408. package/src/runtime/foundation/runtime-state-projections.ts +9 -1
  409. package/src/runtime/foundation/service-authority-payload-codec.ts +31 -13
  410. package/src/runtime/foundation/service-discovery-registry.ts +32 -3
  411. package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
  412. package/src/runtime/foundation/service-liveness-registry.ts +2 -1
  413. package/src/runtime/foundation/service-maintenance-runtime.ts +0 -10
  414. package/src/runtime/foundation/service-metadata-codec.ts +2 -2
  415. package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
  416. package/src/runtime/foundation/service-relocation-object-owner.ts +5 -2
  417. package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
  418. package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
  419. package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -17
  420. package/src/runtime/foundation/service-stateful-registry.ts +14 -2
  421. package/src/runtime/foundation/service-stateful-runtime.ts +322 -276
  422. package/src/runtime/foundation/service-stateful-wire-codec.ts +128 -80
  423. package/src/runtime/foundation/service-topology-registry.ts +23 -32
  424. package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
  425. package/src/runtime/foundation/service-wire-codec.ts +15 -8
  426. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  427. package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
  428. package/src/runtime/framework-errors-internal.ts +380 -134
  429. package/src/runtime/handlers/handler-instance-scope.ts +68 -95
  430. package/src/runtime/host/actor-packet-relay.ts +57 -147
  431. package/src/runtime/host/actor-placement-coordinator.ts +8 -5
  432. package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
  433. package/src/runtime/host/actor-transfer-runtime.ts +180 -260
  434. package/src/runtime/host/application-job-queue.ts +28 -34
  435. package/src/runtime/host/bound-session-relay.ts +1 -2
  436. package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
  437. package/src/runtime/host/index.ts +327 -296
  438. package/src/runtime/host/instance-activation-authority.ts +89 -109
  439. package/src/runtime/host/location-runtime-owner.ts +4 -2
  440. package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
  441. package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
  442. package/src/runtime/host/remote-bound-session-relay.ts +8 -41
  443. package/src/runtime/host/route-mesh-runtime.ts +228 -271
  444. package/src/runtime/host/runtime-shutdown.ts +17 -21
  445. package/src/runtime/host/service-relocation-control.ts +14 -1
  446. package/src/runtime/host/service-relocation-host-runtime.ts +699 -561
  447. package/src/runtime/host/spot-address-transport.ts +73 -195
  448. package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
  449. package/src/runtime/host/spot-runtime-options-factory.ts +73 -22
  450. package/src/runtime/host/user-spot-creation-coordinator.ts +36 -22
  451. package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
  452. package/src/runtime/locations/authority-key-codec.ts +7 -3
  453. package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
  454. package/src/runtime/locations/creation-operation-id.ts +6 -3
  455. package/src/runtime/locations/domain-store-contract.ts +12 -3
  456. package/src/runtime/locations/in-memory-authority-store.ts +44 -15
  457. package/src/runtime/locations/in-memory-location-store.ts +50 -39
  458. package/src/runtime/locations/in-memory-provider-location-store.ts +100 -25
  459. package/src/runtime/locations/key-codec.ts +3 -2
  460. package/src/runtime/locations/lease-tracker.ts +8 -14
  461. package/src/runtime/locations/lifecycle.ts +13 -43
  462. package/src/runtime/locations/location-store-failure.ts +4 -0
  463. package/src/runtime/locations/location-store-pages.ts +18 -0
  464. package/src/runtime/locations/location-store-repository.ts +450 -478
  465. package/src/runtime/locations/relocation-blob.ts +17 -6
  466. package/src/runtime/locations/resolvers.ts +75 -49
  467. package/src/runtime/locations/runtime.ts +220 -110
  468. package/src/runtime/locations/spot-location-claims.ts +58 -1
  469. package/src/runtime/messaging/payload-codec.ts +35 -24
  470. package/src/runtime/messaging/submission-result.ts +57 -1
  471. package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
  472. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
  473. package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +4 -1
  474. package/src/runtime/spots/index.ts +433 -229
  475. package/src/runtime/spots/spot-activation-registry.ts +30 -69
  476. package/src/runtime/spots/spot-activation-state.ts +2 -2
  477. package/src/runtime/spots/spot-activation.ts +67 -37
  478. package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
  479. package/src/runtime/spots/spot-actor-join-dispatch.ts +24 -77
  480. package/src/runtime/spots/spot-actor-membership.ts +40 -72
  481. package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
  482. package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
  483. package/src/runtime/spots/spot-context.ts +3 -3
  484. package/src/runtime/spots/spot-entry-activation.ts +13 -30
  485. package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
  486. package/src/runtime/spots/spot-manager-public.ts +21 -17
  487. package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
  488. package/src/runtime/spots/spot-node-runtime-manager.ts +136 -125
  489. package/src/runtime/spots/spot-outbound.ts +45 -23
  490. package/src/runtime/spots/spot-remote-codec.ts +7 -3
  491. package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
  492. package/src/runtime/spots/spot-route-replies.ts +6 -4
  493. package/src/runtime/spots/spot-routed-actor-admission.ts +13 -26
  494. package/src/runtime/spots/spot-routed-frame-dispatch.ts +2 -3
  495. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
  496. package/src/runtime/spots/spot-runtime-ports.ts +5 -27
  497. package/src/runtime/spots/spot-serial-executor.ts +2 -2
  498. package/src/runtime/spots/spot-serial-turn-executor.ts +112 -11
  499. package/src/runtime/spots/spot-timer.ts +3 -2
  500. package/src/runtime/streams/actor-session-binding-registry.ts +179 -269
  501. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +0 -8
  502. package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
  503. package/src/runtime/streams/bound-session-service.ts +21 -1
  504. package/src/runtime/streams/index.ts +76 -64
  505. package/src/runtime/streams/managed-stream.ts +29 -10
  506. package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
  507. package/src/runtime/streams/protocol.ts +34 -88
  508. package/src/runtime/streams/session-actor-coordinator.ts +17 -5
  509. package/src/runtime/streams/session-calls.ts +6 -5
  510. package/src/runtime/streams/session-context.ts +54 -10
  511. package/src/runtime/streams/session-requests.ts +2 -1
  512. package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
  513. package/src/runtime/streams/stream-frame-factory.ts +2 -3
  514. package/src/runtime/streams/stream-session-runtime.ts +57 -59
  515. package/src/runtime/workers/index.ts +13 -12
  516. package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
  517. package/dist/runtime/actors/post-commit-actor-location.js +0 -72
  518. package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
  519. package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
  520. package/src/runtime/actors/post-commit-actor-location.ts +0 -121
  521. package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
@@ -1,87 +1,104 @@
1
+ import { UINT64_MAX } from '@zlink-systems/stream-wire';
1
2
  import { createHash, randomUUID } from 'node:crypto';
2
- import type {
3
- ZLinkLocationStore,
4
- ZLinkLocationPage,
5
- ZLinkClientServerServerDescriptor,
6
- ZLinkClientServerServerDescriptorKey,
7
- ZLinkFanoutPublisherDescriptor,
8
- ZLinkFanoutPublisherDescriptorKey,
9
- ZLinkMeshNodeDescriptor,
10
- ZLinkMeshNodeDescriptorKey,
11
- ZLinkPageRequest,
12
- ZLinkStoreCondition,
13
- ZLinkStoreKey,
14
- ZLinkStoreReadResult,
15
- ZLinkStoreScanCursor,
16
- ZLinkStoreScanRequest,
17
- ZLinkStoreScanResult,
18
- ZLinkStoreWriteRequest,
19
- ZLinkStoreWriteResult,
20
- ZLinkStoreVersion
3
+ import { zlinkRuntimeDefaultLocationOptions } from '../../contracts/Locations/Options';
4
+ import {
5
+ type ZLinkClientServerServerDescriptor,
6
+ type ZLinkClientServerServerDescriptorKey,
7
+ type ZLinkFanoutPublisherDescriptor,
8
+ type ZLinkFanoutPublisherDescriptorKey,
9
+ type ZLinkLocationPage,
10
+ type ZLinkLocationStore,
11
+ type ZLinkMeshNodeDescriptor,
12
+ type ZLinkMeshNodeDescriptorKey,
13
+ type ZLinkPageRequest,
14
+ type ZLinkStoreCondition,
15
+ type ZLinkStoreKey,
16
+ type ZLinkStoreReadResult,
17
+ type ZLinkStoreScanCursor,
18
+ type ZLinkStoreVersion,
19
+ type ZLinkStoreWriteRequest,
20
+ ZLinkFrameworkRuntimeState,
21
+ ZLinkObjectRole
21
22
  } from '../../contracts';
22
- import type {
23
- ZLinkAggregateAbortResult,
24
- ZLinkAggregateCommitResult,
25
- ZLinkAggregateFence,
26
- ZLinkAggregateId,
27
- ZLinkAggregatePrepareRequest,
28
- ZLinkAggregatePrepareResult,
29
- ZLinkAuthorityCompareExchangeResult,
30
- ZLinkAuthorityKey,
31
- ZLinkAuthorityMutation,
32
- ZLinkAuthorityReadResult,
33
- ZLinkAuthorityScanCursor,
34
- ZLinkAuthorityScanResult,
35
- ZLinkAuthoritySnapshot,
36
- ZLinkAuthorityStoreVersion,
37
- ZLinkCapacityVector,
38
- ZLinkCreationOperationIdentity,
39
- ZLinkCreationTerminalReadResult,
40
- ZLinkCreationTerminalRecord,
41
- ZLinkLocationOwnerToken,
42
- ZLinkLocationWriteResult,
43
- ZLinkLocationWriteStatus,
44
- ZLinkObjectCommitRequest,
45
- ZLinkObjectCommitResult,
46
- ZLinkObjectAbortRequest,
47
- ZLinkObjectAbortResult,
48
- ZLinkObjectCreationCompleteRequest,
49
- ZLinkObjectCreationCompleteResult,
50
- ZLinkObjectReserveRequest,
51
- ZLinkObjectReserveResult,
52
- ZLinkOwnerLeaseClaimResult,
53
- ZLinkOwnerLeaseReadResult,
54
- ZLinkOwnerLeaseReleaseResult,
55
- ZLinkOwnerLeaseRenewResult,
56
- ZLinkPlacementAllocation
57
- } from './internal-location-contracts';
58
- import { ZLinkLocationWriteIntent } from './internal-location-contracts';
59
- import type {
60
- ZLinkActorLocation,
61
- ZLinkActorLocationFilter,
62
- ZLinkActorLocationKey,
63
- ZLinkRouteLocation,
64
- ZLinkRouteLocationFilter,
65
- ZLinkRouteLocationKey,
66
- ZLinkSpotLocation,
67
- ZLinkSpotLocationFilter,
68
- ZLinkSpotLocationKey
69
- } from './internal-location-contracts';
70
- import { ZLinkFrameworkRuntimeState, ZLinkObjectRole } from '../../contracts';
23
+
24
+ import { type RoutingId, ZLINK_MAX_ROUTING_ID_BYTES } from '../../contracts/Common/CoreTypes';
25
+
26
+ import {
27
+ AUTHORITY_ENVELOPE_MAX_BYTES,
28
+ CREATION_TERMINAL_ENVELOPE_MAX_BYTES
29
+ } from '../../contracts/Configuration/InternalDefaults';
30
+ import {
31
+ isValidPublicWeight,
32
+ ZLINK_MAX_PUBLIC_WEIGHT
33
+ } from '../../contracts/Configuration/RegistrationBuilderPolicy';
71
34
  import { ZLinkLocationWriteStatus as WriteStatus } from '../../contracts/Locations';
35
+ import {
36
+ ZLINK_PROVIDER_MAX_PAGE_SIZE,
37
+ ZLINK_PROVIDER_MAX_VALUE_BYTES
38
+ } from '../../contracts/Locations/Stores';
39
+ import { SHA256_DIGEST_BYTES } from '../foundation/actor-join-recovery-codec';
40
+ import { decodeRoutingId, encodeRoutingIdStorageHex } from '../routing-id';
41
+ import { ZLinkAggregateInventoryStore } from './aggregate-inventory-store';
42
+ import { decodeAuthorityKey, encodeAuthorityKey } from './authority-key-codec';
72
43
  import { ZLinkInMemoryLocationStore } from './in-memory-location-store';
73
- import { storeKey } from './in-memory-provider-location-store';
44
+ import { PROVIDER_STORAGE_NAMESPACE_PREFIX, storeKey } from './in-memory-provider-location-store';
45
+ import {
46
+ type ZLinkActorLocation,
47
+ type ZLinkActorLocationFilter,
48
+ type ZLinkActorLocationKey,
49
+ type ZLinkAggregateAbortResult,
50
+ type ZLinkAggregateCommitResult,
51
+ type ZLinkAggregateFence,
52
+ type ZLinkAggregateId,
53
+ type ZLinkAggregatePrepareRequest,
54
+ type ZLinkAggregatePrepareResult,
55
+ type ZLinkAuthorityCompareExchangeResult,
56
+ type ZLinkAuthorityKey,
57
+ type ZLinkAuthorityMutation,
58
+ type ZLinkAuthorityReadResult,
59
+ type ZLinkAuthorityScanCursor,
60
+ type ZLinkAuthorityScanResult,
61
+ type ZLinkAuthoritySnapshot,
62
+ type ZLinkAuthorityStoreVersion,
63
+ type ZLinkCapacityVector,
64
+ type ZLinkCreationOperationIdentity,
65
+ type ZLinkCreationTerminalReadResult,
66
+ type ZLinkCreationTerminalRecord,
67
+ type ZLinkLocationOwnerToken,
68
+ type ZLinkLocationWriteResult,
69
+ type ZLinkLocationWriteStatus,
70
+ type ZLinkObjectAbortRequest,
71
+ type ZLinkObjectAbortResult,
72
+ type ZLinkObjectCommitRequest,
73
+ type ZLinkObjectCommitResult,
74
+ type ZLinkObjectCreationCompleteRequest,
75
+ type ZLinkObjectCreationCompleteResult,
76
+ type ZLinkObjectReserveRequest,
77
+ type ZLinkObjectReserveResult,
78
+ type ZLinkOwnerLeaseClaimResult,
79
+ type ZLinkOwnerLeaseReadResult,
80
+ type ZLinkOwnerLeaseReleaseResult,
81
+ type ZLinkOwnerLeaseRenewResult,
82
+ type ZLinkPlacementAllocation,
83
+ type ZLinkRouteLocation,
84
+ type ZLinkRouteLocationFilter,
85
+ type ZLinkRouteLocationKey,
86
+ type ZLinkSpotLocation,
87
+ type ZLinkSpotLocationFilter,
88
+ type ZLinkSpotLocationKey,
89
+ ZLinkLocationWriteIntent
90
+ } from './internal-location-contracts';
91
+
74
92
  import {
75
93
  creationTerminalPreimage,
76
94
  opaqueRecordPreimage,
77
95
  routingIdHexSegment
78
96
  } from './opaque-record-key';
79
- import { decodeAuthorityKey, encodeAuthorityKey } from './authority-key-codec';
80
- import { ZLinkAggregateInventoryStore } from './aggregate-inventory-store';
81
- import type { RoutingId } from '../../contracts/Common/CoreTypes';
82
- import { decodeRoutingId, encodeRoutingIdStorageHex } from '../routing-id';
97
+ const LOCATION_STORE_WRITE_CONCURRENCY = 64;
83
98
 
84
- const PREFIX = 'zlink:v11:';
99
+ const LOCATION_RECORD_VERSION = 1;
100
+
101
+ const PREFIX = PROVIDER_STORAGE_NAMESPACE_PREFIX;
85
102
  const OWNER_COUNTER_KEY = storeKey(`${PREFIX}owner-counter`);
86
103
  // These counters are store-wide fences. They deliberately are not derived
87
104
  // from an authority identity: deleting and recreating an authority must never
@@ -89,11 +106,9 @@ const OWNER_COUNTER_KEY = storeKey(`${PREFIX}owner-counter`);
89
106
  const OBJECT_COUNTER_KEY = storeKey(`${PREFIX}object-counter`);
90
107
  const AUTHORITY_OWNER_COUNTER_KEY = storeKey(`${PREFIX}authority-owner-counter`);
91
108
  const MAX_GENERATION = 0x7fff_ffff_ffff_ffffn;
92
- const MAX_U64 = 0xffff_ffff_ffff_ffffn;
93
- const MAX_CREATION_TERMINAL_BYTES = 1024 * 1024;
109
+ const MAX_U64 = UINT64_MAX;
110
+
94
111
  const CREATION_TERMINAL_RETENTION_MS = 5 * 60 * 1000;
95
- const AGGREGATE_COMMIT_RETRY_WINDOW_MS = 5_000;
96
- const MAX_AGGREGATE_COMMIT_CONFLICT_RETRIES = 64;
97
112
  const MAX_DESCRIPTOR_WRITE_RETRIES = 3;
98
113
 
99
114
  type StoredAuthoritySnapshot = Omit<ZLinkAuthoritySnapshot, 'kind' | 'storeVersion' | 'storeNow'>;
@@ -142,7 +157,7 @@ interface AggregateRecord {
142
157
  }
143
158
 
144
159
  interface OwnerRecord {
145
- readonly recordVersion: 1;
160
+ readonly recordVersion: typeof LOCATION_RECORD_VERSION;
146
161
  readonly ownerId: string;
147
162
  readonly leaseGeneration: string;
148
163
  }
@@ -153,7 +168,7 @@ interface DescriptorRecord<T> {
153
168
  }
154
169
 
155
170
  interface CanonicalDescriptorRecord<T> {
156
- readonly recordVersion: 1;
171
+ readonly recordVersion: typeof LOCATION_RECORD_VERSION;
157
172
  /** Legacy Node-private row generation. Canonical v1 records omit this. */
158
173
  readonly generation?: string;
159
174
  readonly ownerId: string;
@@ -189,7 +204,7 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
189
204
  private readonly nowProvider: () => Date = () => new Date()
190
205
  ) {
191
206
  super(nowProvider);
192
- this.provider = new AmbiguousWriteReconcilingLocationStore(provider);
207
+ this.provider = provider;
193
208
  this.aggregateInventory = new ZLinkAggregateInventoryStore(this.provider);
194
209
  }
195
210
 
@@ -215,8 +230,8 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
215
230
  limit: number,
216
231
  signal?: AbortSignal
217
232
  ): Promise<ZLinkAuthorityScanResult> {
218
- if (!Number.isInteger(limit) || limit < 1 || limit > 1_000) {
219
- throw new RangeError('Authority scan limit must be in 1..1000.');
233
+ if (!Number.isInteger(limit) || limit < 1 || limit > ZLINK_PROVIDER_MAX_PAGE_SIZE) {
234
+ throw new RangeError(`Authority scan limit must be in 1..${ZLINK_PROVIDER_MAX_PAGE_SIZE}.`);
220
235
  }
221
236
  const scan = await this.provider.scan(
222
237
  {
@@ -323,7 +338,7 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
323
338
  conditions: [
324
339
  { kind: 'version', key: rowKey, expected: current.value.version },
325
340
  versionCondition(descriptorKey, descriptorRead),
326
- versionCondition(ownerKey(mutation.targetOwner.ownerId), targetLeaseRead)
341
+ leaseValueCondition(ownerKey(mutation.targetOwner.ownerId), mutation.targetOwner)
327
342
  ],
328
343
  mutations: [{ kind: 'put', key: rowKey, bytes: encodeAuthorityRecord(nextRecord) }]
329
344
  },
@@ -358,6 +373,19 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
358
373
  );
359
374
  const capacityRead =
360
375
  mutation.kind === 'delete' ? await this.provider.read(capacityRowKey, signal) : undefined;
376
+ const generations =
377
+ mutation.kind === 'put' && mutation.generationTransition === 'reincarnate'
378
+ ? await Promise.all([
379
+ this.provider.read(OBJECT_COUNTER_KEY, signal),
380
+ this.provider.read(AUTHORITY_OWNER_COUNTER_KEY, signal)
381
+ ])
382
+ : undefined;
383
+ if (
384
+ generations !== undefined &&
385
+ generations.some((counter) => counterNextValue(counter) >= MAX_GENERATION)
386
+ ) {
387
+ return { kind: 'generationExhausted' };
388
+ }
361
389
  const nextRecord: AuthorityRecord | undefined =
362
390
  mutation.kind === 'delete'
363
391
  ? undefined
@@ -366,6 +394,12 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
366
394
  visibleStoreVersion: undefined,
367
395
  snapshot: {
368
396
  ...record.snapshot,
397
+ ...(generations === undefined
398
+ ? {}
399
+ : {
400
+ objectGeneration: counterNextValue(generations[0]),
401
+ authorityOwnerGeneration: counterNextValue(generations[1])
402
+ }),
369
403
  payload: Buffer.from(mutation.payload)
370
404
  }
371
405
  };
@@ -373,8 +407,21 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
373
407
  {
374
408
  conditions: [
375
409
  { kind: 'version', key: rowKey, expected: current.value.version },
376
- ...(mutation.kind === 'restore' ? [] : [versionCondition(leaseKey, lease)]),
377
- ...(capacityRead === undefined ? [] : [conditionFor(capacityRowKey, capacityRead)])
410
+ ...(mutation.kind === 'restore'
411
+ ? []
412
+ : [
413
+ leaseValueCondition(leaseKey, {
414
+ ownerId: record.snapshot.ownerId,
415
+ leaseGeneration: record.snapshot.ownerLeaseGeneration
416
+ })
417
+ ]),
418
+ ...(capacityRead === undefined ? [] : [conditionFor(capacityRowKey, capacityRead)]),
419
+ ...(generations === undefined
420
+ ? []
421
+ : [
422
+ conditionFor(OBJECT_COUNTER_KEY, generations[0]),
423
+ conditionFor(AUTHORITY_OWNER_COUNTER_KEY, generations[1])
424
+ ])
378
425
  ],
379
426
  mutations:
380
427
  mutation.kind === 'delete'
@@ -397,7 +444,23 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
397
444
  } satisfies CapacityRecord)
398
445
  }
399
446
  ]
400
- : [{ kind: 'put', key: rowKey, bytes: encodeAuthorityRecord(nextRecord!) }]
447
+ : [
448
+ { kind: 'put', key: rowKey, bytes: encodeAuthorityRecord(nextRecord!) },
449
+ ...(generations === undefined
450
+ ? []
451
+ : [
452
+ {
453
+ kind: 'put' as const,
454
+ key: OBJECT_COUNTER_KEY,
455
+ bytes: encodeText((counterNextValue(generations[0]) + 1n).toString())
456
+ },
457
+ {
458
+ kind: 'put' as const,
459
+ key: AUTHORITY_OWNER_COUNTER_KEY,
460
+ bytes: encodeText((counterNextValue(generations[1]) + 1n).toString())
461
+ }
462
+ ])
463
+ ]
401
464
  },
402
465
  signal
403
466
  );
@@ -483,26 +546,30 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
483
546
  if (entries.length !== request.participants.length) {
484
547
  throw new Error('Aggregate inventory count changed after staging.');
485
548
  }
486
- await parallelForEach(request.participants, 64, async (participant, index) => {
487
- const entry = entries[index]!;
488
- if (
489
- entry.authorityKey !== participant.authorityKey.value ||
490
- entry.expectedStoreVersion !== participant.expectedStoreVersion.value ||
491
- entry.ownerTransition !== participant.ownerTransition
492
- ) {
493
- throw new Error('Aggregate inventory differs from its participant request.');
549
+ await parallelForEach(
550
+ request.participants,
551
+ LOCATION_STORE_WRITE_CONCURRENCY,
552
+ async (participant, index) => {
553
+ const entry = entries[index]!;
554
+ if (
555
+ entry.authorityKey !== participant.authorityKey.value ||
556
+ entry.expectedStoreVersion !== participant.expectedStoreVersion.value ||
557
+ entry.ownerTransition !== participant.ownerTransition
558
+ ) {
559
+ throw new Error('Aggregate inventory differs from its participant request.');
560
+ }
561
+ await this.putImmutable(
562
+ aggregateParticipantPayloadKey(fence, index),
563
+ participant.authorityPayload,
564
+ signal
565
+ );
566
+ await this.putImmutable(
567
+ aggregateParticipantMembershipKey(fence, index),
568
+ participant.membershipMutation,
569
+ signal
570
+ );
494
571
  }
495
- await this.putImmutable(
496
- aggregateParticipantPayloadKey(fence, index),
497
- participant.authorityPayload,
498
- signal
499
- );
500
- await this.putImmutable(
501
- aggregateParticipantMembershipKey(fence, index),
502
- participant.membershipMutation,
503
- signal
504
- );
505
- });
572
+ );
506
573
 
507
574
  const targetDescriptorKey = meshKey(
508
575
  request.targetDescriptor.meshName,
@@ -744,7 +811,7 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
744
811
  conditions: [
745
812
  { kind: 'version', key: rowKey, expected: aggregateRead.value.version },
746
813
  versionCondition(targetDescriptorKey, descriptorRead),
747
- versionCondition(targetLeaseKey, leaseRead),
814
+ leaseValueCondition(targetLeaseKey, request.targetOwner),
748
815
  conditionFor(targetCapacityKey, targetCapacityRead)
749
816
  ],
750
817
  mutations: [
@@ -788,195 +855,190 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
788
855
  signal?: AbortSignal
789
856
  ): Promise<ZLinkAggregateCommitResult> {
790
857
  validateAggregateFence(fence);
791
- return await this.commitAggregateCore(
792
- fence,
793
- 0,
794
- performance.now() + AGGREGATE_COMMIT_RETRY_WINDOW_MS,
795
- signal
796
- );
858
+ return await this.commitAggregateCore(fence, signal);
797
859
  }
798
860
 
799
861
  private async commitAggregateCore(
800
862
  fence: ZLinkAggregateFence,
801
- retryAttempt: number,
802
- retryDeadlineAtMs: number,
803
863
  signal?: AbortSignal
804
864
  ): Promise<ZLinkAggregateCommitResult> {
805
- const rowKey = aggregateKey(fence);
806
- let aggregateRead = await this.provider.read(rowKey, signal);
807
- if (aggregateRead.kind === 'missing') return { kind: 'stale' };
808
- let aggregate = decodeJson<AggregateRecord>(aggregateRead.value.bytes);
809
- if (aggregate.state === 'aborted' || aggregate.state === 'staging') {
810
- return { kind: 'stale' };
811
- }
812
- if (aggregate.state === 'committed') {
813
- await this.normalizeCommittedAggregate(fence, aggregate, signal);
814
- return { kind: 'alreadyCommitted' };
815
- }
816
- const entries = await this.aggregateInventory.read(
817
- fence,
818
- Buffer.from(aggregate.inventoryDigest),
819
- signal
820
- );
821
- if (entries.length !== aggregate.participantCount) {
822
- throw new Error('Aggregate inventory count differs from its authority record.');
823
- }
824
- const authorityRows = [];
825
- for (let index = 0; index < entries.length; index++) {
826
- const entry = entries[index]!;
827
- const rowKeyForParticipant = authorityKey(entry.authorityKey);
828
- const current = await this.provider.read(rowKeyForParticipant, signal);
829
- if (current.kind === 'missing') return { kind: 'stale' };
830
- const record = decodeAuthorityRecord(current.value.bytes);
831
- if (!sameAggregateMarkerEntry(record.aggregate, fence, index, entry)) {
832
- // A competing committer may already have published the aggregate and
833
- // normalized this participant before this reader reached it. The
834
- // committed aggregate is the terminal outcome to adopt, not a stale
835
- // failure caused by observing the post-normalization row.
836
- const latest = await this.provider.read(rowKey, signal);
837
- if (latest.kind === 'found') {
838
- const latestAggregate = decodeJson<AggregateRecord>(latest.value.bytes);
839
- if (latestAggregate.state === 'committed') {
840
- await this.normalizeCommittedAggregate(fence, latestAggregate, signal);
841
- return { kind: 'alreadyCommitted' };
865
+ for (;;) {
866
+ signal?.throwIfAborted();
867
+ const rowKey = aggregateKey(fence);
868
+ let aggregateRead = await this.provider.read(rowKey, signal);
869
+ if (aggregateRead.kind === 'missing') return { kind: 'stale' };
870
+ let aggregate = decodeJson<AggregateRecord>(aggregateRead.value.bytes);
871
+ if (aggregate.state === 'aborted' || aggregate.state === 'staging') {
872
+ return { kind: 'stale' };
873
+ }
874
+ if (aggregate.state === 'committed') {
875
+ await this.normalizeCommittedAggregate(fence, aggregate, signal);
876
+ return { kind: 'alreadyCommitted' };
877
+ }
878
+ const entries = await this.aggregateInventory.read(
879
+ fence,
880
+ Buffer.from(aggregate.inventoryDigest),
881
+ signal
882
+ );
883
+ if (entries.length !== aggregate.participantCount) {
884
+ throw new Error('Aggregate inventory count differs from its authority record.');
885
+ }
886
+ const authorityRows = [];
887
+ for (let index = 0; index < entries.length; index++) {
888
+ const entry = entries[index]!;
889
+ const rowKeyForParticipant = authorityKey(entry.authorityKey);
890
+ const current = await this.provider.read(rowKeyForParticipant, signal);
891
+ if (current.kind === 'missing') return { kind: 'stale' };
892
+ const record = decodeAuthorityRecord(current.value.bytes);
893
+ if (!sameAggregateMarkerEntry(record.aggregate, fence, index, entry)) {
894
+ // A competing committer may already have published the aggregate and
895
+ // normalized this participant before this reader reached it. The
896
+ // committed aggregate is the terminal outcome to adopt, not a stale
897
+ // failure caused by observing the post-normalization row.
898
+ const latest = await this.provider.read(rowKey, signal);
899
+ if (latest.kind === 'found') {
900
+ const latestAggregate = decodeJson<AggregateRecord>(latest.value.bytes);
901
+ if (latestAggregate.state === 'committed') {
902
+ await this.normalizeCommittedAggregate(fence, latestAggregate, signal);
903
+ return { kind: 'alreadyCommitted' };
904
+ }
842
905
  }
906
+ return { kind: 'stale' };
843
907
  }
844
- return { kind: 'stale' };
908
+ const [payload, membership] = await Promise.all([
909
+ requireProviderBytes(this.provider, aggregateParticipantPayloadKey(fence, index), signal),
910
+ requireProviderBytes(
911
+ this.provider,
912
+ aggregateParticipantMembershipKey(fence, index),
913
+ signal
914
+ )
915
+ ]);
916
+ if (
917
+ sha256Hex(payload) !== entry.authorityPayloadSha256 ||
918
+ sha256Hex(membership) !== entry.membershipMutationSha256
919
+ ) {
920
+ throw new Error('Aggregate participant staging checksum does not match inventory.');
921
+ }
922
+ authorityRows.push({ key: rowKeyForParticipant, current, record, entry });
845
923
  }
846
- const [payload, membership] = await Promise.all([
847
- requireProviderBytes(this.provider, aggregateParticipantPayloadKey(fence, index), signal),
848
- requireProviderBytes(this.provider, aggregateParticipantMembershipKey(fence, index), signal)
924
+
925
+ const targetDescriptorKey = meshKey(
926
+ aggregate.targetDescriptor.meshName,
927
+ aggregate.targetDescriptor.rid
928
+ );
929
+ const targetLeaseKey = ownerKey(aggregate.targetOwner.ownerId);
930
+ const targetCapacityKey = capacityKey(
931
+ aggregate.targetDescriptor.meshName,
932
+ String(aggregate.targetDescriptor.rid)
933
+ );
934
+ const [descriptorRead, leaseRead] = await Promise.all([
935
+ this.provider.read(targetDescriptorKey, signal),
936
+ this.provider.read(targetLeaseKey, signal)
849
937
  ]);
850
938
  if (
851
- sha256Hex(payload) !== entry.authorityPayloadSha256 ||
852
- sha256Hex(membership) !== entry.membershipMutationSha256
939
+ liveTargetDescriptor(descriptorRead, leaseRead, aggregateTargetFromRecord(aggregate)) ===
940
+ undefined
853
941
  ) {
854
- throw new Error('Aggregate participant staging checksum does not match inventory.');
942
+ return { kind: 'stale' };
855
943
  }
856
- authorityRows.push({ key: rowKeyForParticipant, current, record, entry });
857
- }
858
944
 
859
- const targetDescriptorKey = meshKey(
860
- aggregate.targetDescriptor.meshName,
861
- aggregate.targetDescriptor.rid
862
- );
863
- const targetLeaseKey = ownerKey(aggregate.targetOwner.ownerId);
864
- const targetCapacityKey = capacityKey(
865
- aggregate.targetDescriptor.meshName,
866
- String(aggregate.targetDescriptor.rid)
867
- );
868
- const [descriptorRead, leaseRead] = await Promise.all([
869
- this.provider.read(targetDescriptorKey, signal),
870
- this.provider.read(targetLeaseKey, signal)
871
- ]);
872
- if (
873
- liveTargetDescriptor(descriptorRead, leaseRead, aggregateTargetFromRecord(aggregate)) ===
874
- undefined
875
- ) {
876
- return { kind: 'stale' };
877
- }
878
-
879
- const capacityDeltas = new Map<string, ZLinkCapacityVector>();
880
- for (const row of authorityRows) {
881
- if (row.entry.ownerTransition !== 'newOwner') continue;
882
- const key = capacityKey(
883
- row.record.snapshot.allocation.descriptor.meshName,
884
- String(row.record.snapshot.allocation.descriptor.rid)
885
- ).value;
886
- capacityDeltas.set(
887
- key,
888
- addCapacityVector(
889
- capacityDeltas.get(key) ?? { actors: 0, spots: 0 },
890
- row.record.snapshot.allocation.capacity
891
- )
892
- );
893
- }
894
- const capacityKeys = new Map<string, ZLinkStoreKey>();
895
- capacityKeys.set(targetCapacityKey.value, targetCapacityKey);
896
- for (const value of capacityDeltas.keys()) capacityKeys.set(value, storeKey(value));
897
- const capacityReads = new Map<string, Extract<ZLinkStoreReadResult, { kind: 'found' }>>();
898
- for (const [value, key] of capacityKeys) {
899
- const read = await this.provider.read(key, signal);
900
- if (read.kind === 'missing') {
901
- // Capacity rows are provider-private. A foreign source legitimately
902
- // has no row under this provider's key encoding; its source runtime
903
- // releases that capacity after observing the committed authority.
904
- // The target row remains mandatory because this provider reserved it
905
- // during prepare and must consume it atomically with commit.
906
- if (value === targetCapacityKey.value) return { kind: 'stale' };
907
- capacityKeys.delete(value);
908
- continue;
945
+ const capacityDeltas = new Map<string, ZLinkCapacityVector>();
946
+ for (const row of authorityRows) {
947
+ if (row.entry.ownerTransition !== 'newOwner') continue;
948
+ const key = capacityKey(
949
+ row.record.snapshot.allocation.descriptor.meshName,
950
+ String(row.record.snapshot.allocation.descriptor.rid)
951
+ ).value;
952
+ capacityDeltas.set(
953
+ key,
954
+ addCapacityVector(
955
+ capacityDeltas.get(key) ?? { actors: 0, spots: 0 },
956
+ row.record.snapshot.allocation.capacity
957
+ )
958
+ );
909
959
  }
910
- capacityReads.set(value, read);
911
- }
912
- const capacityMutations = [];
913
- for (const [value, key] of capacityKeys) {
914
- const read = capacityReads.get(value)!;
915
- let capacity = decodeJson<CapacityRecord>(read.value.bytes);
916
- const sourceDelta = capacityDeltas.get(value);
917
- if (sourceDelta !== undefined) {
918
- capacity = {
919
- active: subtractCapacity(capacity.active, sourceDelta),
920
- pending: capacity.pending
921
- };
960
+ const capacityKeys = new Map<string, ZLinkStoreKey>();
961
+ capacityKeys.set(targetCapacityKey.value, targetCapacityKey);
962
+ for (const value of capacityDeltas.keys()) capacityKeys.set(value, storeKey(value));
963
+ const capacityReads = new Map<string, Extract<ZLinkStoreReadResult, { kind: 'found' }>>();
964
+ for (const [value, key] of capacityKeys) {
965
+ const read = await this.provider.read(key, signal);
966
+ if (read.kind === 'missing') {
967
+ // Capacity rows are provider-private. A foreign source legitimately
968
+ // has no row under this provider's key encoding; its source runtime
969
+ // releases that capacity after observing the committed authority.
970
+ // The target row remains mandatory because this provider reserved it
971
+ // during prepare and must consume it atomically with commit.
972
+ if (value === targetCapacityKey.value) return { kind: 'stale' };
973
+ capacityKeys.delete(value);
974
+ continue;
975
+ }
976
+ capacityReads.set(value, read);
922
977
  }
923
- if (value === targetCapacityKey.value) {
924
- capacity = {
925
- active: addCapacity(capacity.active, aggregate.capacity),
926
- pending: subtractCapacity(capacity.pending, aggregate.capacity)
927
- };
978
+ const capacityMutations = [];
979
+ for (const [value, key] of capacityKeys) {
980
+ const read = capacityReads.get(value)!;
981
+ let capacity = decodeJson<CapacityRecord>(read.value.bytes);
982
+ const sourceDelta = capacityDeltas.get(value);
983
+ if (sourceDelta !== undefined) {
984
+ capacity = {
985
+ active: subtractCapacity(capacity.active, sourceDelta),
986
+ pending: capacity.pending
987
+ };
988
+ }
989
+ if (value === targetCapacityKey.value) {
990
+ capacity = {
991
+ active: addCapacity(capacity.active, aggregate.capacity),
992
+ pending: subtractCapacity(capacity.pending, aggregate.capacity)
993
+ };
994
+ }
995
+ capacityMutations.push({
996
+ kind: 'put' as const,
997
+ key,
998
+ bytes: encodeJson(capacity)
999
+ });
928
1000
  }
929
- capacityMutations.push({
930
- kind: 'put' as const,
931
- key,
932
- bytes: encodeJson(capacity)
933
- });
934
- }
935
- const published = await this.provider.write(
936
- {
937
- conditions: [
938
- { kind: 'version', key: rowKey, expected: aggregateRead.value.version },
939
- versionCondition(targetDescriptorKey, descriptorRead),
940
- versionCondition(targetLeaseKey, leaseRead),
941
- ...[...capacityReads.entries()].map(([value, read]) => ({
942
- kind: 'version' as const,
943
- key: capacityKeys.get(value)!,
944
- expected: read.value.version
945
- }))
946
- ],
947
- mutations: [
948
- {
949
- kind: 'put',
950
- key: rowKey,
951
- bytes: encodeJson({ ...aggregate, state: 'committed' } satisfies AggregateRecord)
952
- },
953
- ...capacityMutations
954
- ]
955
- },
956
- signal
957
- );
958
- if (published.kind === 'conflict') {
959
- aggregateRead = await this.provider.read(rowKey, signal);
960
- if (aggregateRead.kind === 'missing') return { kind: 'stale' };
961
- aggregate = decodeJson<AggregateRecord>(aggregateRead.value.bytes);
962
- if (
963
- aggregate.state === 'prepared' &&
964
- retryAttempt < MAX_AGGREGATE_COMMIT_CONFLICT_RETRIES &&
965
- performance.now() < retryDeadlineAtMs
966
- ) {
967
- // The commit CAS also fences the target's live owner lease, descriptor,
968
- // and capacity rows. Re-read the whole prepared fence after an
969
- // auxiliary-row race; a changed aggregate or participant fence exits
970
- // through the normal stale checks on the next attempt.
971
- await waitForAggregateCommitRetry(retryAttempt, retryDeadlineAtMs, signal);
972
- return await this.commitAggregateCore(fence, retryAttempt + 1, retryDeadlineAtMs, signal);
1001
+ const published = await this.provider.write(
1002
+ {
1003
+ conditions: [
1004
+ { kind: 'version', key: rowKey, expected: aggregateRead.value.version },
1005
+ versionCondition(targetDescriptorKey, descriptorRead),
1006
+ leaseValueCondition(targetLeaseKey, aggregate.targetOwner),
1007
+ ...[...capacityReads.entries()].map(([value, read]) => ({
1008
+ kind: 'version' as const,
1009
+ key: capacityKeys.get(value)!,
1010
+ expected: read.value.version
1011
+ }))
1012
+ ],
1013
+ mutations: [
1014
+ {
1015
+ kind: 'put',
1016
+ key: rowKey,
1017
+ bytes: encodeJson({ ...aggregate, state: 'committed' } satisfies AggregateRecord)
1018
+ },
1019
+ ...capacityMutations
1020
+ ]
1021
+ },
1022
+ signal
1023
+ );
1024
+ if (published.kind === 'conflict') {
1025
+ aggregateRead = await this.provider.read(rowKey, signal);
1026
+ if (aggregateRead.kind === 'missing') return { kind: 'stale' };
1027
+ aggregate = decodeJson<AggregateRecord>(aggregateRead.value.bytes);
1028
+ if (aggregate.state === 'prepared') {
1029
+ // The commit CAS also fences the target's live owner lease, descriptor,
1030
+ // and capacity rows. Re-read the whole prepared fence after an
1031
+ // auxiliary-row race; a changed aggregate or participant fence exits
1032
+ // through the normal stale checks on the next attempt.
1033
+ continue;
1034
+ }
1035
+ if (aggregate.state !== 'committed') return { kind: 'stale' };
1036
+ } else {
1037
+ aggregate = { ...aggregate, state: 'committed' };
973
1038
  }
974
- if (aggregate.state !== 'committed') return { kind: 'stale' };
975
- } else {
976
- aggregate = { ...aggregate, state: 'committed' };
1039
+ await this.normalizeCommittedAggregate(fence, aggregate, signal);
1040
+ return { kind: 'committed' };
977
1041
  }
978
- await this.normalizeCommittedAggregate(fence, aggregate, signal);
979
- return { kind: 'committed' };
980
1042
  }
981
1043
 
982
1044
  override async abortAggregate(
@@ -1039,30 +1101,18 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
1039
1101
 
1040
1102
  override async reserve(
1041
1103
  request: ZLinkObjectReserveRequest,
1042
- signal?: AbortSignal
1104
+ signal?: AbortSignal,
1105
+ deadlineUnixMs?: bigint
1043
1106
  ): Promise<ZLinkObjectReserveResult> {
1044
1107
  const encodedAuthorityKey = encodeAuthorityKey(request.key.kind, request.key.globalId);
1108
+ const reservationId = randomUUID();
1045
1109
  for (;;) {
1046
- signal?.throwIfAborted();
1110
+ throwIfOperationExpired(signal, deadlineUnixMs);
1047
1111
  const rowKey = authorityKey(encodedAuthorityKey.value);
1048
1112
  const descriptorKey = meshKey(request.target.meshName, request.target.nodeRid);
1049
1113
  const leaseKey = ownerKey(request.target.owner.ownerId);
1050
1114
  const capacityRowKey = capacityKey(request.target.meshName, String(request.target.nodeRid));
1051
- const [
1052
- current,
1053
- descriptorRead,
1054
- leaseRead,
1055
- capacityRead,
1056
- objectGenerationRead,
1057
- authorityOwnerGenerationRead
1058
- ] = await Promise.all([
1059
- this.provider.read(rowKey, signal),
1060
- this.provider.read(descriptorKey, signal),
1061
- this.provider.read(leaseKey, signal),
1062
- this.provider.read(capacityRowKey, signal),
1063
- this.provider.read(OBJECT_COUNTER_KEY, signal),
1064
- this.provider.read(AUTHORITY_OWNER_COUNTER_KEY, signal)
1065
- ]);
1115
+ const current = await this.provider.read(rowKey, signal);
1066
1116
  if (current.kind === 'found') {
1067
1117
  const record = decodeAuthorityRecord(current.value.bytes);
1068
1118
  const snapshot = authoritySnapshot(
@@ -1138,10 +1188,19 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
1138
1188
  );
1139
1189
  continue;
1140
1190
  }
1191
+ const [descriptorRead, leaseRead] = await Promise.all([
1192
+ this.provider.read(descriptorKey, signal),
1193
+ this.provider.read(leaseKey, signal)
1194
+ ]);
1141
1195
  const descriptor = liveTargetDescriptor(descriptorRead, leaseRead, request.target);
1142
1196
  if (descriptor === undefined) {
1143
1197
  return { kind: 'conflict', current: { kind: 'missing', storeNow: current.storeNow } };
1144
1198
  }
1199
+ const [capacityRead, objectGenerationRead, authorityOwnerGenerationRead] = await Promise.all([
1200
+ this.provider.read(capacityRowKey, signal),
1201
+ this.provider.read(OBJECT_COUNTER_KEY, signal),
1202
+ this.provider.read(AUTHORITY_OWNER_COUNTER_KEY, signal)
1203
+ ]);
1145
1204
  const capacity =
1146
1205
  capacityRead.kind === 'missing'
1147
1206
  ? emptyCapacityRecord()
@@ -1157,7 +1216,6 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
1157
1216
  if (generation >= MAX_GENERATION || authorityOwnerGeneration >= MAX_GENERATION) {
1158
1217
  return { kind: 'generationExhausted' };
1159
1218
  }
1160
- const reservationId = randomUUID();
1161
1219
  const allocation: ZLinkPlacementAllocation = {
1162
1220
  state: 'reserved',
1163
1221
  objectKind: request.key.kind,
@@ -1190,7 +1248,7 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
1190
1248
  conditions: [
1191
1249
  { kind: 'missing', key: rowKey },
1192
1250
  versionCondition(descriptorKey, descriptorRead),
1193
- versionCondition(leaseKey, leaseRead),
1251
+ leaseValueCondition(leaseKey, request.target.owner),
1194
1252
  conditionFor(capacityRowKey, capacityRead),
1195
1253
  conditionFor(OBJECT_COUNTER_KEY, objectGenerationRead),
1196
1254
  conditionFor(AUTHORITY_OWNER_COUNTER_KEY, authorityOwnerGenerationRead)
@@ -1232,12 +1290,13 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
1232
1290
 
1233
1291
  override async commit(
1234
1292
  request: ZLinkObjectCommitRequest,
1235
- signal?: AbortSignal
1293
+ signal?: AbortSignal,
1294
+ deadlineUnixMs?: bigint
1236
1295
  ): Promise<ZLinkObjectCommitResult> {
1237
1296
  const key = encodeAuthorityKey(request.key.kind, request.key.globalId);
1238
1297
  const rowKey = authorityKey(key.value);
1239
1298
  for (;;) {
1240
- signal?.throwIfAborted();
1299
+ throwIfOperationExpired(signal, deadlineUnixMs);
1241
1300
  const current = await this.provider.read(rowKey, signal);
1242
1301
  if (current.kind === 'missing') return { kind: 'stale' };
1243
1302
  const record = decodeAuthorityRecord(current.value.bytes);
@@ -1288,7 +1347,7 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
1288
1347
  conditions: [
1289
1348
  { kind: 'version', key: rowKey, expected: current.value.version },
1290
1349
  versionCondition(descriptorKey, descriptorRead),
1291
- versionCondition(leaseKey, leaseRead),
1350
+ leaseValueCondition(leaseKey, request.target.owner),
1292
1351
  conditionFor(capacityRowKey, capacityRead)
1293
1352
  ],
1294
1353
  mutations: [
@@ -1317,12 +1376,13 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
1317
1376
 
1318
1377
  override async abort(
1319
1378
  request: ZLinkObjectAbortRequest,
1320
- signal?: AbortSignal
1379
+ signal?: AbortSignal,
1380
+ deadlineUnixMs?: bigint
1321
1381
  ): Promise<ZLinkObjectAbortResult> {
1322
1382
  const key = encodeAuthorityKey(request.key.kind, request.key.globalId);
1323
1383
  const rowKey = authorityKey(key.value);
1324
1384
  for (;;) {
1325
- signal?.throwIfAborted();
1385
+ throwIfOperationExpired(signal, deadlineUnixMs);
1326
1386
  const current = await this.provider.read(rowKey, signal);
1327
1387
  if (current.kind === 'missing') return { kind: 'stale' };
1328
1388
  const record = decodeAuthorityRecord(current.value.bytes);
@@ -1355,7 +1415,10 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
1355
1415
  {
1356
1416
  conditions: [
1357
1417
  { kind: 'version', key: rowKey, expected: current.value.version },
1358
- versionCondition(leaseKey, leaseRead),
1418
+ leaseValueCondition(leaseKey, {
1419
+ ownerId: record.snapshot.ownerId,
1420
+ leaseGeneration: record.snapshot.ownerLeaseGeneration
1421
+ }),
1359
1422
  conditionFor(capacityRowKey, capacityRead)
1360
1423
  ],
1361
1424
  mutations: [
@@ -1388,11 +1451,11 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
1388
1451
  const rowKey = authorityKey(encodeAuthorityKey(request.key.kind, request.key.globalId).value);
1389
1452
  const terminalRowKey = creationTerminalKey(terminal.operation);
1390
1453
  for (;;) {
1391
- signal?.throwIfAborted();
1392
- const [current, existingTerminal] = await Promise.all([
1393
- this.provider.read(rowKey, signal),
1394
- this.provider.read(terminalRowKey, signal)
1395
- ]);
1454
+ throwIfOperationExpired(
1455
+ signal,
1456
+ BigInt(request.completion.terminal.operationDeadline.getTime())
1457
+ );
1458
+ const existingTerminal = await this.provider.read(terminalRowKey, signal);
1396
1459
  if (existingTerminal.kind === 'found') {
1397
1460
  return {
1398
1461
  kind: 'alreadyCompleted',
@@ -1404,6 +1467,7 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
1404
1467
  )
1405
1468
  };
1406
1469
  }
1470
+ const current = await this.provider.read(rowKey, signal);
1407
1471
  if (current.kind === 'missing') return { kind: 'stale' };
1408
1472
  const record = decodeAuthorityRecord(current.value.bytes);
1409
1473
  if (
@@ -1417,14 +1481,14 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
1417
1481
  const descriptorKey = meshKey(request.target.meshName, request.target.nodeRid);
1418
1482
  const leaseKey = ownerKey(request.target.owner.ownerId);
1419
1483
  const capacityRowKey = capacityKey(request.target.meshName, request.target.nodeRid);
1420
- const [descriptorRead, leaseRead, capacityRead] = await Promise.all([
1484
+ const [descriptorRead, leaseRead] = await Promise.all([
1421
1485
  this.provider.read(descriptorKey, signal),
1422
- this.provider.read(leaseKey, signal),
1423
- this.provider.read(capacityRowKey, signal)
1486
+ this.provider.read(leaseKey, signal)
1424
1487
  ]);
1425
1488
  if (liveTargetDescriptor(descriptorRead, leaseRead, request.target) === undefined) {
1426
1489
  return { kind: 'stale' };
1427
1490
  }
1491
+ const capacityRead = await this.provider.read(capacityRowKey, signal);
1428
1492
  const capacity =
1429
1493
  capacityRead.kind === 'missing'
1430
1494
  ? emptyCapacityRecord()
@@ -1481,7 +1545,7 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
1481
1545
  { kind: 'version', key: rowKey, expected: current.value.version },
1482
1546
  { kind: 'missing', key: terminalRowKey },
1483
1547
  versionCondition(descriptorKey, descriptorRead),
1484
- versionCondition(leaseKey, leaseRead),
1548
+ leaseValueCondition(leaseKey, request.target.owner),
1485
1549
  conditionFor(capacityRowKey, capacityRead)
1486
1550
  ],
1487
1551
  mutations: [
@@ -1718,7 +1782,7 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
1718
1782
  page.continuationToken === undefined
1719
1783
  ? undefined
1720
1784
  : ({ value: page.continuationToken } as ZLinkStoreScanCursor),
1721
- limit: page.pageSize ?? 100
1785
+ limit: page.pageSize ?? zlinkRuntimeDefaultLocationOptions.listPageSize
1722
1786
  },
1723
1787
  signal
1724
1788
  );
@@ -2346,7 +2410,6 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
2346
2410
  leaseKey,
2347
2411
  descriptor.ownerId,
2348
2412
  descriptor.leaseGeneration,
2349
- lease,
2350
2413
  rowKey,
2351
2414
  current,
2352
2415
  encodeCanonicalDescriptorRecord(generation, descriptor),
@@ -2359,14 +2422,12 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
2359
2422
  leaseKey: ZLinkStoreKey,
2360
2423
  ownerId: string,
2361
2424
  leaseGeneration: bigint,
2362
- liveLease: Extract<ZLinkStoreReadResult, { kind: 'found' }>,
2363
2425
  rowKey: ZLinkStoreKey,
2364
2426
  predecessor: ZLinkStoreReadResult,
2365
2427
  encodedDescriptor: Uint8Array,
2366
2428
  generation: bigint,
2367
2429
  signal?: AbortSignal
2368
2430
  ): Promise<ZLinkLocationWriteResult> {
2369
- let currentLease = liveLease;
2370
2431
  let currentRow = predecessor;
2371
2432
 
2372
2433
  for (let attempt = 0; attempt <= MAX_DESCRIPTOR_WRITE_RETRIES; attempt += 1) {
@@ -2376,10 +2437,7 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
2376
2437
  : { kind: 'missing', key: rowKey };
2377
2438
  const result = await this.provider.write(
2378
2439
  {
2379
- conditions: [
2380
- { kind: 'version', key: leaseKey, expected: currentLease.value.version },
2381
- rowCondition
2382
- ],
2440
+ conditions: [leaseValueCondition(leaseKey, { ownerId, leaseGeneration }), rowCondition],
2383
2441
  mutations: [{ kind: 'put', key: rowKey, bytes: encodedDescriptor }]
2384
2442
  },
2385
2443
  signal
@@ -2401,7 +2459,6 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
2401
2459
  return ignoredStale(result.storeNow);
2402
2460
  }
2403
2461
 
2404
- currentLease = refreshedLease;
2405
2462
  currentRow = refreshedRow;
2406
2463
  }
2407
2464
  throw new Error('Descriptor write retry loop exhausted unexpectedly.');
@@ -2445,7 +2502,7 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
2445
2502
  page.continuationToken === undefined
2446
2503
  ? undefined
2447
2504
  : ({ value: page.continuationToken } as ZLinkStoreScanCursor),
2448
- limit: page.pageSize ?? 100
2505
+ limit: page.pageSize ?? zlinkRuntimeDefaultLocationOptions.listPageSize
2449
2506
  },
2450
2507
  signal
2451
2508
  );
@@ -2521,7 +2578,10 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
2521
2578
  const result = await this.provider.write(
2522
2579
  {
2523
2580
  conditions: [
2524
- { kind: 'version', key: leaseKey, expected: lease.value.version },
2581
+ leaseValueCondition(leaseKey, {
2582
+ ownerId: location.ownerId,
2583
+ leaseGeneration: locationOwnerGeneration(location)
2584
+ }),
2525
2585
  rowCondition
2526
2586
  ],
2527
2587
  mutations: [
@@ -2585,7 +2645,7 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
2585
2645
  matches: (value: T) => boolean,
2586
2646
  signal?: AbortSignal
2587
2647
  ): Promise<ZLinkLocationPage<T>> {
2588
- const requested = page.pageSize ?? 100;
2648
+ const requested = page.pageSize ?? zlinkRuntimeDefaultLocationOptions.listPageSize;
2589
2649
  let cursor =
2590
2650
  page.continuationToken === undefined
2591
2651
  ? undefined
@@ -2690,7 +2750,7 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
2690
2750
  Buffer.from(aggregate.inventoryDigest),
2691
2751
  signal
2692
2752
  );
2693
- await parallelForEach(entries, 64, async (entry, index) => {
2753
+ await parallelForEach(entries, LOCATION_STORE_WRITE_CONCURRENCY, async (entry, index) => {
2694
2754
  const rowKey = authorityKey(entry.authorityKey);
2695
2755
  for (;;) {
2696
2756
  const current = await this.provider.read(rowKey, signal);
@@ -2779,8 +2839,10 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
2779
2839
  bytes: Uint8Array,
2780
2840
  signal?: AbortSignal
2781
2841
  ): Promise<void> {
2782
- if (bytes.byteLength > 1024 * 1024) {
2783
- throw new RangeError('Aggregate participant staging value exceeds 1 MiB.');
2842
+ if (bytes.byteLength > ZLINK_PROVIDER_MAX_VALUE_BYTES) {
2843
+ throw new RangeError(
2844
+ `Aggregate participant staging value exceeds ${ZLINK_PROVIDER_MAX_VALUE_BYTES / (1024 * 1024)} MiB.`
2845
+ );
2784
2846
  }
2785
2847
  const result = await this.provider.write(
2786
2848
  {
@@ -2838,7 +2900,7 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
2838
2900
  }[],
2839
2901
  signal?: AbortSignal
2840
2902
  ): Promise<void> {
2841
- await parallelForEach(installed, 64, async (value) => {
2903
+ await parallelForEach(installed, LOCATION_STORE_WRITE_CONCURRENCY, async (value) => {
2842
2904
  await this.clearAggregateMarker(fence, value.key, signal);
2843
2905
  });
2844
2906
  }
@@ -2868,7 +2930,7 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
2868
2930
  record.aggregate.aggregateGeneration === fence.aggregateGeneration
2869
2931
  );
2870
2932
  });
2871
- await parallelForEach(matching, 64, async (item) => {
2933
+ await parallelForEach(matching, LOCATION_STORE_WRITE_CONCURRENCY, async (item) => {
2872
2934
  await this.clearAggregateMarker(fence, item.key, signal);
2873
2935
  });
2874
2936
  if (result.value.nextCursor === undefined) return;
@@ -2913,97 +2975,6 @@ export class ZLinkLocationStoreRepository extends ZLinkInMemoryLocationStore {
2913
2975
  }
2914
2976
  }
2915
2977
 
2916
- const AMBIGUOUS_WRITE_RECONCILIATION_TIMEOUT_MS = 5_000;
2917
-
2918
- /**
2919
- * Keeps provider failures private while preserving the opaque Store contract.
2920
- *
2921
- * A write response can be lost after the provider applied the atomic batch.
2922
- * The Framework confirms every mutation by an independent exact read. A put
2923
- * must retain the requested bytes and a version different from the conditioned
2924
- * version; a delete must remain absent. Any mismatch is a normal conflict, so
2925
- * the domain repository can reread its authoritative record and classify the
2926
- * operation without exposing a provider-specific retry API.
2927
- */
2928
- class AmbiguousWriteReconcilingLocationStore implements ZLinkLocationStore {
2929
- constructor(private readonly inner: ZLinkLocationStore) {}
2930
-
2931
- read(key: ZLinkStoreKey, signal?: AbortSignal): Promise<ZLinkStoreReadResult> {
2932
- return this.inner.read(key, signal);
2933
- }
2934
-
2935
- scan(request: ZLinkStoreScanRequest, signal?: AbortSignal): Promise<ZLinkStoreScanResult> {
2936
- return this.inner.scan(request, signal);
2937
- }
2938
-
2939
- async write(
2940
- request: ZLinkStoreWriteRequest,
2941
- signal?: AbortSignal
2942
- ): Promise<ZLinkStoreWriteResult> {
2943
- try {
2944
- return await this.inner.write(request, signal);
2945
- } catch (failure) {
2946
- try {
2947
- return await this.reconcile(request);
2948
- } catch {
2949
- throw failure;
2950
- }
2951
- }
2952
- }
2953
-
2954
- private async reconcile(request: ZLinkStoreWriteRequest): Promise<ZLinkStoreWriteResult> {
2955
- if (request.mutations.length === 0) {
2956
- throw new Error('Cannot reconcile an opaque Store write without mutations.');
2957
- }
2958
- const reconciliationSignal = AbortSignal.timeout(AMBIGUOUS_WRITE_RECONCILIATION_TIMEOUT_MS);
2959
- const reads = await Promise.all(
2960
- request.mutations.map((mutation) => this.inner.read(mutation.key, reconciliationSignal))
2961
- );
2962
- const putVersions: Array<{
2963
- readonly key: ZLinkStoreKey;
2964
- readonly version: ZLinkStoreVersion;
2965
- }> = [];
2966
- let storeNow = new Date(0);
2967
-
2968
- for (let index = 0; index < request.mutations.length; index += 1) {
2969
- const mutation = request.mutations[index];
2970
- const read = reads[index];
2971
- storeNow =
2972
- read.kind === 'found'
2973
- ? latestDate(storeNow, read.value.storeNow)
2974
- : latestDate(storeNow, read.storeNow);
2975
-
2976
- if (mutation.kind === 'delete') {
2977
- if (read.kind !== 'missing') return { kind: 'conflict', storeNow };
2978
- continue;
2979
- }
2980
- if (
2981
- read.kind !== 'found' ||
2982
- !Buffer.from(read.value.bytes).equals(Buffer.from(mutation.bytes)) ||
2983
- !versionAdvanced(request.conditions, mutation.key, read.value.version)
2984
- ) {
2985
- return { kind: 'conflict', storeNow };
2986
- }
2987
- putVersions.push({ key: mutation.key, version: read.value.version });
2988
- }
2989
-
2990
- return { kind: 'applied', putVersions, storeNow };
2991
- }
2992
- }
2993
-
2994
- function versionAdvanced(
2995
- conditions: readonly ZLinkStoreCondition[],
2996
- key: ZLinkStoreKey,
2997
- current: ZLinkStoreVersion
2998
- ): boolean {
2999
- const condition = conditions.find((candidate) => candidate.key.value === key.value);
3000
- return condition?.kind !== 'version' || condition.expected.value !== current.value;
3001
- }
3002
-
3003
- function latestDate(left: Date, right: Date): Date {
3004
- return left.getTime() >= right.getTime() ? left : right;
3005
- }
3006
-
3007
2978
  type OwnedDescriptor =
3008
2979
  ZLinkMeshNodeDescriptor | ZLinkClientServerServerDescriptor | ZLinkFanoutPublisherDescriptor;
3009
2980
 
@@ -3016,8 +2987,8 @@ function validateProviderAggregateRequest(request: ZLinkAggregatePrepareRequest)
3016
2987
  if (request.aggregateGeneration < 1n || request.participants.length < 1) {
3017
2988
  throw new RangeError('Aggregate generation and participant count are invalid.');
3018
2989
  }
3019
- if (request.inventoryDigest.byteLength !== 32) {
3020
- throw new TypeError('Aggregate inventory digest must contain 32 bytes.');
2990
+ if (request.inventoryDigest.byteLength !== SHA256_DIGEST_BYTES) {
2991
+ throw new TypeError(`Aggregate inventory digest must contain ${SHA256_DIGEST_BYTES} bytes.`);
3021
2992
  }
3022
2993
  const keys = request.participants.map((value) => value.authorityKey.value);
3023
2994
  if (
@@ -3030,10 +3001,12 @@ function validateProviderAggregateRequest(request: ZLinkAggregatePrepareRequest)
3030
3001
  requireText(participant.authorityKey.value, 'aggregate authority key');
3031
3002
  requireText(participant.expectedStoreVersion.value, 'aggregate expected Store version');
3032
3003
  if (
3033
- participant.authorityPayload.byteLength > 1024 * 1024 ||
3034
- participant.membershipMutation.byteLength > 1024 * 1024
3004
+ participant.authorityPayload.byteLength > ZLINK_PROVIDER_MAX_VALUE_BYTES ||
3005
+ participant.membershipMutation.byteLength > ZLINK_PROVIDER_MAX_VALUE_BYTES
3035
3006
  ) {
3036
- throw new RangeError('Aggregate participant value exceeds 1 MiB.');
3007
+ throw new RangeError(
3008
+ `Aggregate participant value exceeds ${ZLINK_PROVIDER_MAX_VALUE_BYTES / (1024 * 1024)} MiB.`
3009
+ );
3037
3010
  }
3038
3011
  }
3039
3012
  }
@@ -3186,33 +3159,6 @@ async function parallelForEach<T>(
3186
3159
  );
3187
3160
  }
3188
3161
 
3189
- async function waitForAggregateCommitRetry(
3190
- retryAttempt: number,
3191
- deadlineAtMs: number,
3192
- signal?: AbortSignal
3193
- ): Promise<void> {
3194
- signal?.throwIfAborted();
3195
- const remainingMs = deadlineAtMs - performance.now();
3196
- if (remainingMs <= 0) return;
3197
- const exponentialMs = Math.min(100, 2 << Math.min(retryAttempt, 5));
3198
- const delayMs = Math.min(
3199
- remainingMs,
3200
- exponentialMs + Math.floor(Math.random() * (exponentialMs + 1))
3201
- );
3202
- await new Promise<void>((resolve, reject) => {
3203
- let timer: ReturnType<typeof setTimeout> | undefined;
3204
- const aborted = () => {
3205
- if (timer !== undefined) clearTimeout(timer);
3206
- reject(signal?.reason ?? new Error('Aggregate commit was aborted.'));
3207
- };
3208
- signal?.addEventListener('abort', aborted, { once: true });
3209
- timer = setTimeout(() => {
3210
- signal?.removeEventListener('abort', aborted);
3211
- resolve();
3212
- }, delayMs);
3213
- });
3214
- }
3215
-
3216
3162
  function sha256Hex(bytes: Uint8Array): string {
3217
3163
  return createHash('sha256').update(bytes).digest('hex');
3218
3164
  }
@@ -3443,7 +3389,7 @@ function requireRecordVersion(value: unknown, kind: string): void {
3443
3389
  if (
3444
3390
  value === null ||
3445
3391
  typeof value !== 'object' ||
3446
- (value as { recordVersion?: unknown }).recordVersion !== 1
3392
+ (value as { recordVersion?: unknown }).recordVersion !== LOCATION_RECORD_VERSION
3447
3393
  ) {
3448
3394
  throw new Error(`Location Store ${kind} record has an unrecognized recordVersion.`);
3449
3395
  }
@@ -3462,21 +3408,23 @@ function canonicalize(value: unknown): unknown {
3462
3408
  return value;
3463
3409
  }
3464
3410
 
3411
+ const GENERATION_KEYS = new Set([
3412
+ 'generation',
3413
+ 'leaseGeneration',
3414
+ 'ownerLeaseGeneration',
3415
+ 'objectGeneration',
3416
+ 'authorityOwnerGeneration',
3417
+ 'targetAuthorityOwnerGeneration',
3418
+ 'aggregateGeneration',
3419
+ 'lifecycleGeneration',
3420
+ 'descriptorRevision',
3421
+ 'nodeGeneration',
3422
+ 'applicationVersion',
3423
+ 'requestEncodedSize'
3424
+ ]);
3425
+
3465
3426
  function reviveCanonical(value: unknown, key = ''): unknown {
3466
- const generationKeys = new Set([
3467
- 'generation',
3468
- 'leaseGeneration',
3469
- 'ownerLeaseGeneration',
3470
- 'objectGeneration',
3471
- 'authorityOwnerGeneration',
3472
- 'aggregateGeneration',
3473
- 'lifecycleGeneration',
3474
- 'descriptorRevision',
3475
- 'nodeGeneration',
3476
- 'applicationVersion',
3477
- 'requestEncodedSize'
3478
- ]);
3479
- if (typeof value === 'string' && generationKeys.has(key)) return BigInt(value);
3427
+ if (typeof value === 'string' && GENERATION_KEYS.has(key)) return BigInt(value);
3480
3428
  if (Array.isArray(value)) return value.map((item) => reviveCanonical(item));
3481
3429
  if (value !== null && typeof value === 'object') {
3482
3430
  return Object.fromEntries(
@@ -3494,7 +3442,7 @@ function decodeOwnerRecord(bytes: Uint8Array): OwnerRecord {
3494
3442
 
3495
3443
  function encodeOwnerRecord(ownerId: string, leaseGeneration: bigint): Uint8Array {
3496
3444
  return encodeJson<OwnerRecord>({
3497
- recordVersion: 1,
3445
+ recordVersion: LOCATION_RECORD_VERSION,
3498
3446
  ownerId,
3499
3447
  leaseGeneration: leaseGeneration.toString()
3500
3448
  });
@@ -3510,7 +3458,7 @@ function encodeCanonicalDescriptorRecord<T extends OwnedDescriptor>(
3510
3458
  void generation;
3511
3459
  return Buffer.from(
3512
3460
  JSON.stringify({
3513
- recordVersion: 1,
3461
+ recordVersion: LOCATION_RECORD_VERSION,
3514
3462
  ownerId: descriptor.ownerId,
3515
3463
  leaseGeneration: descriptor.leaseGeneration.toString(),
3516
3464
  descriptorRevision: descriptor.descriptorRevision.toString(),
@@ -3525,7 +3473,7 @@ function decodeCanonicalDescriptorRecord<T extends OwnedDescriptor>(
3525
3473
  ): CanonicalDescriptorRecord<T> {
3526
3474
  const record = JSON.parse(decodeText(bytes)) as CanonicalDescriptorRecord<unknown>;
3527
3475
  requireRecordVersion(record, 'descriptor');
3528
- return reviveCanonical(record) as CanonicalDescriptorRecord<T>;
3476
+ return record as CanonicalDescriptorRecord<T>;
3529
3477
  }
3530
3478
 
3531
3479
  function descriptorStoreGeneration(
@@ -3668,7 +3616,7 @@ function encodeAuthorityRecord(record: AuthorityRecord): Uint8Array {
3668
3616
  const snapshot = record.snapshot;
3669
3617
  const allocation = snapshot.allocation;
3670
3618
  const envelope: Record<string, unknown> = {
3671
- recordVersion: 1,
3619
+ recordVersion: LOCATION_RECORD_VERSION,
3672
3620
  payload: Buffer.from(snapshot.payload).toString('base64'),
3673
3621
  objectGeneration: snapshot.objectGeneration.toString(),
3674
3622
  authorityOwnerGeneration: snapshot.authorityOwnerGeneration.toString(),
@@ -3822,8 +3770,10 @@ function createTerminalRecord(
3822
3770
  ): ZLinkCreationTerminalRecord {
3823
3771
  const publication = request.completion.terminal;
3824
3772
  validateCreationOperation(publication.operation);
3825
- if (publication.terminalEnvelope.byteLength > MAX_CREATION_TERMINAL_BYTES) {
3826
- throw new RangeError('Creation terminal envelope must not exceed 1 MiB.');
3773
+ if (publication.terminalEnvelope.byteLength > CREATION_TERMINAL_ENVELOPE_MAX_BYTES) {
3774
+ throw new RangeError(
3775
+ `Creation terminal envelope must not exceed ${CREATION_TERMINAL_ENVELOPE_MAX_BYTES / (1024 * 1024)} MiB.`
3776
+ );
3827
3777
  }
3828
3778
  const deadlineMs = publication.operationDeadline.getTime();
3829
3779
  const expiresAtMs = deadlineMs + CREATION_TERMINAL_RETENTION_MS;
@@ -3875,9 +3825,13 @@ function retainedCreationTerminal(
3875
3825
  function validateCreationOperation(operation: ZLinkCreationOperationIdentity): void {
3876
3826
  const sourceRid = String(operation.sourceNodeRid);
3877
3827
  const sourceRidBytes = Buffer.byteLength(sourceRid, 'utf8');
3878
- if (sourceRidBytes < 1 || sourceRidBytes > 255 || sourceRid.includes('\0')) {
3828
+ if (
3829
+ sourceRidBytes < 1 ||
3830
+ sourceRidBytes > ZLINK_MAX_ROUTING_ID_BYTES ||
3831
+ sourceRid.includes('\0')
3832
+ ) {
3879
3833
  throw new TypeError(
3880
- 'Creation terminal source node RID must contain 1..255 UTF-8 bytes without NUL.'
3834
+ `Creation terminal source node RID must contain 1..${ZLINK_MAX_ROUTING_ID_BYTES} UTF-8 bytes without NUL.`
3881
3835
  );
3882
3836
  }
3883
3837
  if (
@@ -3894,8 +3848,10 @@ function validateCreationOperation(operation: ZLinkCreationOperationIdentity): v
3894
3848
  }
3895
3849
 
3896
3850
  function validatePayloadSize(value: Uint8Array, name: string): void {
3897
- if (value.byteLength > MAX_CREATION_TERMINAL_BYTES) {
3898
- throw new RangeError(`${name} must not exceed 1 MiB.`);
3851
+ if (value.byteLength > AUTHORITY_ENVELOPE_MAX_BYTES) {
3852
+ throw new RangeError(
3853
+ `${name} must not exceed ${AUTHORITY_ENVELOPE_MAX_BYTES / (1024 * 1024)} MiB.`
3854
+ );
3899
3855
  }
3900
3856
  }
3901
3857
 
@@ -3970,6 +3926,13 @@ function versionCondition(key: ZLinkStoreKey, read: ZLinkStoreReadResult): ZLink
3970
3926
  return { kind: 'version', key, expected: read.value.version };
3971
3927
  }
3972
3928
 
3929
+ function leaseValueCondition(
3930
+ key: ZLinkStoreKey,
3931
+ owner: ZLinkLocationOwnerToken
3932
+ ): ZLinkStoreCondition {
3933
+ return { kind: 'value', key, expected: encodeOwnerRecord(owner.ownerId, owner.leaseGeneration) };
3934
+ }
3935
+
3973
3936
  function emptyCapacityRecord(): CapacityRecord {
3974
3937
  return {
3975
3938
  active: { actors: 0, spots: 0, spotTypes: {} },
@@ -4404,8 +4367,10 @@ function validateClientServerDescriptor(descriptor: ZLinkClientServerServerDescr
4404
4367
  'ClientServer'
4405
4368
  );
4406
4369
  validateDescriptorGenerations(descriptor, 'ClientServer');
4407
- if (!Number.isInteger(descriptor.weight) || descriptor.weight < 0 || descriptor.weight > 10_000) {
4408
- throw new RangeError('ClientServer descriptor weight must be an integer in 0..10000.');
4370
+ if (!isValidPublicWeight(descriptor.weight)) {
4371
+ throw new RangeError(
4372
+ `ClientServer descriptor weight must be an integer in 0..${ZLINK_MAX_PUBLIC_WEIGHT}.`
4373
+ );
4409
4374
  }
4410
4375
  }
4411
4376
 
@@ -4466,3 +4431,10 @@ function requireOwnerInput(ownerId: string, leaseTtlMs: number): void {
4466
4431
  throw new RangeError('Owner lease TTL must be a positive safe integer.');
4467
4432
  }
4468
4433
  }
4434
+
4435
+ function throwIfOperationExpired(signal?: AbortSignal, deadlineUnixMs?: bigint): void {
4436
+ signal?.throwIfAborted();
4437
+ if (deadlineUnixMs !== undefined && Date.now() >= Number(deadlineUnixMs)) {
4438
+ throw new DOMException('Operation deadline exceeded.', 'TimeoutError');
4439
+ }
4440
+ }