@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,5 +1,13 @@
1
- import { crc32c } from './service-relocation-runtime';
1
+ import { UINT64_MAX } from '@zlink-systems/stream-wire';
2
+ import { ZLinkSpotKind, zlinkSpotKindToWire } from '../../contracts';
2
3
  import type { ZLinkLocationOwnerToken } from '../../contracts/Locations';
4
+ import { SHA256_DIGEST_BYTES } from './actor-join-recovery-codec';
5
+ import { crc32c } from './service-relocation-runtime';
6
+ import { SERVICE_WIRE_TEXT8_MAX_BYTES } from './service-wire-binary-primitives';
7
+ const SPOT_AUTHORITY_OBJECT_KIND = 2;
8
+ const USER_SPOT_WIRE_KIND = zlinkSpotKindToWire(ZLinkSpotKind.User);
9
+ const INSTANCE_SPOT_WIRE_KIND = zlinkSpotKindToWire(ZLinkSpotKind.Instance);
10
+ const AUTHORITY_TEXT16_MAX_BYTES = 0xffff;
3
11
 
4
12
  const AUTHORITY_MAGIC = Buffer.from([0x5a, 0x4c, 0x41, 0x55]);
5
13
  const AUTHORITY_FORMAT_VERSION = 1;
@@ -311,7 +319,7 @@ function decodeSpotAuthority(payload: Uint8Array):
311
319
  const operationKind = body.u8();
312
320
  const objectKind = body.u8();
313
321
  const object = body.takeReader(body.u16());
314
- if (objectKind !== 2) return undefined;
322
+ if (objectKind !== SPOT_AUTHORITY_OBJECT_KIND) return undefined;
315
323
  const spotKind = object.u8();
316
324
  const spot = object.takeReader(object.u16());
317
325
  if (!object.done) return undefined;
@@ -320,12 +328,12 @@ function decodeSpotAuthority(payload: Uint8Array):
320
328
  let state: number;
321
329
  let stableType: string;
322
330
  let spotId: string;
323
- if (spotKind === 2) {
331
+ if (spotKind === USER_SPOT_WIRE_KIND) {
324
332
  kind = 'user_spot';
325
333
  spotId = spot.rid();
326
334
  stableType = spot.text8();
327
335
  state = spot.u8();
328
- } else if (spotKind === 3) {
336
+ } else if (spotKind === INSTANCE_SPOT_WIRE_KIND) {
329
337
  kind = 'instance_spot';
330
338
  state = spot.u8();
331
339
  const instance = spot.takeReader(spot.u16());
@@ -417,23 +425,33 @@ function rid(value: string, name: string): Buffer {
417
425
 
418
426
  function text16(value: string, name: string): Buffer {
419
427
  const bytes = Buffer.from(value);
420
- if (bytes.byteLength < 1 || bytes.byteLength > 0xffff || bytes.includes(0)) {
421
- throw new RangeError(`${name} must contain 1..65535 UTF-8 bytes without NUL.`);
428
+ if (bytes.byteLength < 1 || bytes.byteLength > AUTHORITY_TEXT16_MAX_BYTES || bytes.includes(0)) {
429
+ throw new RangeError(
430
+ `${name} must contain 1..${AUTHORITY_TEXT16_MAX_BYTES} UTF-8 bytes without NUL.`
431
+ );
422
432
  }
423
433
  return concat(u16(bytes.byteLength), bytes);
424
434
  }
425
435
 
426
436
  function sha256(value: Uint8Array): Buffer {
427
- if (value.byteLength !== 32) {
428
- throw new RangeError('activationRecovery.sha256 must contain exactly 32 bytes.');
437
+ if (value.byteLength !== SHA256_DIGEST_BYTES) {
438
+ throw new RangeError(
439
+ `activationRecovery.sha256 must contain exactly ${SHA256_DIGEST_BYTES} bytes.`
440
+ );
429
441
  }
430
- return concat(Buffer.of(32), value);
442
+ return concat(Buffer.of(SHA256_DIGEST_BYTES), value);
431
443
  }
432
444
 
433
445
  function sized8(value: string, name: string): Buffer {
434
446
  const bytes = Buffer.from(value);
435
- if (bytes.byteLength < 1 || bytes.byteLength > 255 || bytes.includes(0)) {
436
- throw new RangeError(`${name} must contain 1..255 UTF-8 bytes without NUL.`);
447
+ if (
448
+ bytes.byteLength < 1 ||
449
+ bytes.byteLength > SERVICE_WIRE_TEXT8_MAX_BYTES ||
450
+ bytes.includes(0)
451
+ ) {
452
+ throw new RangeError(
453
+ `${name} must contain 1..${SERVICE_WIRE_TEXT8_MAX_BYTES} UTF-8 bytes without NUL.`
454
+ );
437
455
  }
438
456
  return concat(Buffer.of(bytes.byteLength), bytes);
439
457
  }
@@ -458,7 +476,7 @@ function boundedU32(value: number, name: string): Buffer {
458
476
  }
459
477
 
460
478
  function u64(value: bigint, name: string): Buffer {
461
- if (value <= 0n || value > 0xffff_ffff_ffff_ffffn) {
479
+ if (value <= 0n || value > UINT64_MAX) {
462
480
  throw new RangeError(`${name} must be a non-zero u64.`);
463
481
  }
464
482
  const result = Buffer.alloc(8);
@@ -467,7 +485,7 @@ function u64(value: bigint, name: string): Buffer {
467
485
  }
468
486
 
469
487
  function ordinalU64(value: bigint, name: string): Buffer {
470
- if (value < 0n || value > 0xffff_ffff_ffff_ffffn) {
488
+ if (value < 0n || value > UINT64_MAX) {
471
489
  throw new RangeError(`${name} must be a u64.`);
472
490
  }
473
491
  const result = Buffer.alloc(8);
@@ -1,3 +1,8 @@
1
+ import {
2
+ isValidPublicWeight,
3
+ ZLINK_MAX_PUBLIC_WEIGHT
4
+ } from '../../contracts/Configuration/RegistrationBuilderPolicy';
5
+ import { SmoothWeightedSelection } from './service-weighted-selection';
1
6
  export interface ClientServerDescriptor {
2
7
  readonly channelName: string;
3
8
  readonly serverRoutingId: string;
@@ -31,6 +36,20 @@ export interface SelectedClientServer {
31
36
 
32
37
  /** Dedicated discovery state; fanout publishers never reuse RouteMesh peer rows. */
33
38
  export class ServiceDiscoveryRegistry {
39
+ private readonly clientServerChanged = new Set<(error?: Error) => void>();
40
+
41
+ onClientServerChanged(listener: (error?: Error) => void): () => void {
42
+ this.clientServerChanged.add(listener);
43
+ return () => {
44
+ this.clientServerChanged.delete(listener);
45
+ };
46
+ }
47
+
48
+ dispose(error: Error): void {
49
+ for (const listener of this.clientServerChanged) listener(error);
50
+ this.clientServerChanged.clear();
51
+ }
52
+
34
53
  private readonly clientServers = new Map<string, Current<ClientServerDescriptor>>();
35
54
  private readonly fanoutPublishers = new Map<string, Current<FanoutPublisherDescriptor>>();
36
55
  private readonly clientServerSelections = new Map<
@@ -101,6 +120,14 @@ export class ServiceDiscoveryRegistry {
101
120
  return selection.select();
102
121
  }
103
122
 
123
+ hasReadyClientServer(channelName: string): boolean {
124
+ return [...this.clientServers.values()].some(
125
+ ({ descriptor }) =>
126
+ descriptor.channelName === channelName &&
127
+ (descriptor.state === 'serving' || descriptor.state === 'retiring')
128
+ );
129
+ }
130
+
104
131
  clientServerDescriptors(channelName: string): readonly ClientServerDescriptor[] {
105
132
  return [...this.clientServers.values()]
106
133
  .map((value) => value.descriptor)
@@ -161,6 +188,7 @@ export class ServiceDiscoveryRegistry {
161
188
  if (this.clientServerSelections.has(channelName)) {
162
189
  this.clientServerSelections.get(channelName)!.rebuild();
163
190
  }
191
+ for (const listener of this.clientServerChanged) listener();
164
192
  }
165
193
 
166
194
  private clientServerCandidates(channelName: string) {
@@ -239,8 +267,10 @@ function validateClientServer(descriptor: ClientServerDescriptor): void {
239
267
  requireText(descriptor.securityIdentity, 'securityIdentity');
240
268
  requireText(descriptor.advertisedEndpoint, 'advertisedEndpoint');
241
269
  validateRevision(descriptor.lifecycleGeneration, descriptor.descriptorRevision);
242
- if (!Number.isInteger(descriptor.weight) || descriptor.weight < 0 || descriptor.weight > 10_000) {
243
- throw new RangeError('ClientServer weight must be an integer in 0..10000.');
270
+ if (!isValidPublicWeight(descriptor.weight)) {
271
+ throw new RangeError(
272
+ `ClientServer weight must be an integer in 0..${ZLINK_MAX_PUBLIC_WEIGHT}.`
273
+ );
244
274
  }
245
275
  if (
246
276
  !Number.isSafeInteger(descriptor.effectiveMaxMessageBytes) ||
@@ -268,4 +298,3 @@ function requireText(value: string, field: string): void {
268
298
  throw new TypeError(`${field} must be non-empty text without NUL.`);
269
299
  }
270
300
  }
271
- import { SmoothWeightedSelection } from './service-weighted-selection';
@@ -1,3 +1,5 @@
1
+ import { SERVICE_WIRE_TEXT8_MAX_BYTES } from './service-wire-binary-primitives';
2
+ import { UINT64_MAX } from '@zlink-systems/stream-wire';
1
3
  import { crc32c } from './service-relocation-runtime';
2
4
  import { validateApplicationPayloadFrame } from './service-wire-m6a-codec';
3
5
  import type { ServiceInstanceActivationTarget } from './service-stateful-wire-codec';
@@ -199,8 +201,14 @@ function requireOperation(value: ServiceInstanceActivationRecoveryEnvelope): voi
199
201
 
200
202
  function textBytes(value: string, name: string): Buffer {
201
203
  const bytes = Buffer.from(value, 'utf8');
202
- if (bytes.byteLength < 1 || bytes.byteLength > 255 || bytes.includes(0)) {
203
- throw new RangeError(`${name} must contain 1..255 UTF-8 bytes without NUL.`);
204
+ if (
205
+ bytes.byteLength < 1 ||
206
+ bytes.byteLength > SERVICE_WIRE_TEXT8_MAX_BYTES ||
207
+ bytes.includes(0)
208
+ ) {
209
+ throw new RangeError(
210
+ `${name} must contain 1..${SERVICE_WIRE_TEXT8_MAX_BYTES} UTF-8 bytes without NUL.`
211
+ );
204
212
  }
205
213
  return bytes;
206
214
  }
@@ -216,13 +224,13 @@ function writeText8(target: Buffer, offset: number, value: Uint8Array): number {
216
224
  }
217
225
 
218
226
  function validatePositiveU64(value: bigint, name: string): void {
219
- if (value <= 0n || value > 0xffff_ffff_ffff_ffffn) {
227
+ if (value <= 0n || value > UINT64_MAX) {
220
228
  throw new RangeError(`${name} is out of range.`);
221
229
  }
222
230
  }
223
231
 
224
232
  function validateU64(value: bigint, name: string): void {
225
- if (value < 0n || value > 0xffff_ffff_ffff_ffffn) {
233
+ if (value < 0n || value > UINT64_MAX) {
226
234
  throw new RangeError(`${name} is out of range.`);
227
235
  }
228
236
  }
@@ -1,3 +1,4 @@
1
+ import { UINT64_MAX } from '@zlink-systems/stream-wire';
1
2
  export interface ServiceProbe {
2
3
  readonly nodeRoutingId: string;
3
4
  readonly connectionId: string;
@@ -139,7 +140,7 @@ export class ServiceLivenessRegistry {
139
140
 
140
141
  private allocateProbeId(): bigint {
141
142
  const result = this.nextProbeId++;
142
- if (this.nextProbeId > 0xffff_ffff_ffff_ffffn) this.nextProbeId = 1n;
143
+ if (this.nextProbeId > UINT64_MAX) this.nextProbeId = 1n;
143
144
  return result;
144
145
  }
145
146
  }
@@ -252,13 +252,3 @@ export class ServiceMaintenanceRuntime {
252
252
  function startOutsideStateLane<T>(work: () => T): T {
253
253
  return detachedStateLaneResource.runInAsyncScope(work);
254
254
  }
255
-
256
- export function classifyRelocationRecovery(
257
- publishedReference: boolean,
258
- payloadPresent: boolean,
259
- checksumMatches: boolean,
260
- inventoryMatches: boolean
261
- ): 'resume' | 'orphan' | 'relocationDataLost' {
262
- if (!publishedReference) return payloadPresent ? 'orphan' : 'resume';
263
- return payloadPresent && checksumMatches && inventoryMatches ? 'resume' : 'relocationDataLost';
264
- }
@@ -1,4 +1,4 @@
1
- const MAX_METADATA_BYTES = 1024;
1
+ import { ZLINK_STREAM_MAX_METADATA_BYTES as MAX_METADATA_BYTES } from '@zlink-systems/stream-wire';
2
2
  const FATAL_UTF8 = new TextDecoder('utf-8', { fatal: true });
3
3
 
4
4
  export function encodeServiceMetadataFrame(entries: ReadonlyMap<string, string>): Buffer {
@@ -18,7 +18,7 @@ export function encodeServiceMetadataFrame(entries: ReadonlyMap<string, string>)
18
18
 
19
19
  export function validateServiceMetadataFrame(frame: Uint8Array): Buffer {
20
20
  if (frame.byteLength > MAX_METADATA_BYTES) {
21
- throw new RangeError('Application metadata frame exceeds 1024 bytes.');
21
+ throw new RangeError(`Application metadata frame exceeds ${MAX_METADATA_BYTES} bytes.`);
22
22
  }
23
23
  const bytes = Buffer.from(frame);
24
24
  let offset = 0;
@@ -36,15 +36,13 @@ export interface ServicePreparedRelocationAggregate {
36
36
  readonly plan: ServiceRelocationAggregatePlan;
37
37
  }
38
38
 
39
- type AggregateStore = Pick<
40
- ZLinkObjectCreationStore,
41
- 'prepareAggregate' | 'commitAggregate' | 'abortAggregate'
42
- > &
39
+ type AggregateStore = Pick<ZLinkObjectCreationStore, 'prepareAggregate' | 'abortAggregate'> &
43
40
  Pick<ZLinkAuthorityStore, 'readAuthority'>;
44
41
 
45
42
  const MAX_PREPARE_CONFLICT_ATTEMPTS = 8;
46
43
 
47
- /** Commits every owner and membership row through one Location Store fence. */
44
+ /** Prepares and aborts relocation through one Location Store fence. */
45
+
48
46
  export class ServiceRelocationAggregateCommitter {
49
47
  constructor(private readonly store: AggregateStore) {}
50
48
 
@@ -109,73 +107,12 @@ export class ServiceRelocationAggregateCommitter {
109
107
  return true;
110
108
  }
111
109
 
112
- async commit(
113
- prepared: ServicePreparedRelocationAggregate,
114
- signal?: AbortSignal
115
- ): Promise<ReadonlyMap<string, ZLinkAuthoritySnapshot>> {
116
- try {
117
- await this.commitFence(prepared.fence, signal);
118
- } catch (firstError) {
119
- // A lost commit response is reconciled by repeating the exact durable fence.
120
- try {
121
- await this.commitFence(prepared.fence, signal);
122
- } catch {
123
- throw firstError;
124
- }
125
- }
126
- return await this.readCommittedParticipants(prepared.plan, signal);
127
- }
128
-
129
110
  async abort(prepared: ServicePreparedRelocationAggregate, signal?: AbortSignal): Promise<void> {
130
111
  const result = await this.store.abortAggregate(prepared.fence, signal);
131
112
  if (result.kind !== 'aborted' && result.kind !== 'alreadyAborted') {
132
113
  throw new Error(`Location Store rejected relocation aggregate abort: ${result.kind}.`);
133
114
  }
134
115
  }
135
-
136
- private async commitFence(fence: ZLinkAggregateFence, signal?: AbortSignal): Promise<void> {
137
- const result = await this.store.commitAggregate(fence, signal);
138
- if (result.kind !== 'committed' && result.kind !== 'alreadyCommitted') {
139
- throw new Error(`Location Store rejected relocation aggregate commit: ${result.kind}.`);
140
- }
141
- }
142
-
143
- private async readCommittedParticipants(
144
- plan: ServiceRelocationAggregatePlan,
145
- signal?: AbortSignal
146
- ): Promise<ReadonlyMap<string, ZLinkAuthoritySnapshot>> {
147
- const committed = new Map<string, ZLinkAuthoritySnapshot>();
148
- for (const participant of plan.participants) {
149
- const current = await this.store.readAuthority(participant.key, signal);
150
- if (
151
- current.kind !== 'snapshot' ||
152
- current.objectGeneration !== participant.expected.objectGeneration ||
153
- current.storeVersion.value === participant.expected.storeVersion.value ||
154
- !Buffer.from(current.payload).equals(Buffer.from(participant.authorityPayload))
155
- ) {
156
- throw new Error(
157
- 'Committed relocation aggregate does not match its exact participant plan.'
158
- );
159
- }
160
- if (participant.ownerTransition === 'newOwner') {
161
- if (
162
- current.ownerId !== plan.targetOwner.ownerId ||
163
- current.ownerLeaseGeneration !== plan.targetOwner.leaseGeneration ||
164
- current.authorityOwnerGeneration <= participant.expected.authorityOwnerGeneration
165
- ) {
166
- throw new Error('Committed relocation participant has a different owner fence.');
167
- }
168
- } else if (
169
- current.ownerId !== participant.expected.ownerId ||
170
- current.ownerLeaseGeneration !== participant.expected.ownerLeaseGeneration ||
171
- current.authorityOwnerGeneration !== participant.expected.authorityOwnerGeneration
172
- ) {
173
- throw new Error('Preserved relocation participant changed its owner fence.');
174
- }
175
- committed.set(participant.key.value, current);
176
- }
177
- return committed;
178
- }
179
116
  }
180
117
 
181
118
  function validateAndEncodeParticipants(
@@ -13,6 +13,7 @@ import type {
13
13
  ServiceRelocationQueuedMessage,
14
14
  ServiceRelocationTimer
15
15
  } from './service-relocation-runtime';
16
+ const DEFAULT_RELOCATION_CALLBACK_CONCURRENCY = 8;
16
17
 
17
18
  export interface ServiceRelocationSealedWork {
18
19
  readonly boundSessionState: Uint8Array;
@@ -84,7 +85,9 @@ export class ServiceCapturedObjectRelocation {
84
85
 
85
86
  /** Captures the two valid relocation units: User Spot aggregate or one Actor. */
86
87
  export class ServiceRelocationObjectCaptureOwner {
87
- constructor(private readonly maxConcurrentCallbacks = 8) {
88
+ constructor(
89
+ private readonly maxConcurrentCallbacks: number = DEFAULT_RELOCATION_CALLBACK_CONCURRENCY
90
+ ) {
88
91
  requireCallbackConcurrency(maxConcurrentCallbacks);
89
92
  }
90
93
 
@@ -254,7 +257,7 @@ export class ServiceRelocationObjectRestoreOwner<
254
257
  constructor(
255
258
  private readonly target: ServiceRelocationTargetObjectPort<THidden>,
256
259
  private readonly authorityKey: (value: string) => ZLinkAuthorityKey,
257
- private readonly maxConcurrentCallbacks = 8
260
+ private readonly maxConcurrentCallbacks: number = DEFAULT_RELOCATION_CALLBACK_CONCURRENCY
258
261
  ) {
259
262
  requireCallbackConcurrency(maxConcurrentCallbacks);
260
263
  }
@@ -1,15 +1,25 @@
1
+ import { UINT64_MAX } from '@zlink-systems/stream-wire';
1
2
  import { createHash } from 'node:crypto';
3
+ import { AUTHORITY_ENVELOPE_MAX_BYTES } from '../../contracts/Configuration/InternalDefaults';
4
+ import { decodeAuthorityKey } from '../locations/authority-key-codec';
2
5
  import type {
3
- ZLinkPlacementObjectKind,
4
- ZLinkAuthorityKey
6
+ ZLinkAuthorityKey,
7
+ ZLinkPlacementObjectKind
5
8
  } from '../locations/internal-location-contracts';
6
- import { decodeAuthorityKey } from '../locations/authority-key-codec';
9
+ import { enumWireRelocationPhase } from '../protocol/service_wire_codec.generated';
7
10
  import {
8
11
  decodeRelocationEnvelopeV1 as decodeGeneratedRelocationEnvelopeV1,
9
12
  encodeRelocationEnvelopeV1 as encodeGeneratedRelocationEnvelopeV1,
10
13
  type RelocationEnvelopeV1 as GeneratedRelocationEnvelopeV1,
11
14
  type RelocationObjectIdentity as GeneratedRelocationObjectIdentity
12
15
  } from '../protocol/service_wire_pilot_codec.generated';
16
+ import { SHA256_DIGEST_BYTES } from './actor-join-recovery-codec';
17
+ const MAX_RELOCATION_GENERATION = 0x7fff_ffff_ffff_ffffn;
18
+
19
+ const RELOCATION_PREPARING_PHASE = enumWireRelocationPhase('preparing');
20
+ const RELOCATION_ACTIVATING_PHASE = enumWireRelocationPhase('activating');
21
+ const RELOCATION_COMPLETED_PHASE = enumWireRelocationPhase('completed');
22
+ const RELOCATION_LAST_PHASE = enumWireRelocationPhase('aborted');
13
23
 
14
24
  export interface ServiceRelocationParticipant {
15
25
  /** Wire-local participant ordinal; identity is projected from Location Store. */
@@ -280,7 +290,7 @@ export function projectServiceRelocationAuthorityTargetReady(
280
290
  coordinatorNodeRid: target.nodeRid,
281
291
  coordinatorNodeGeneration: target.nodeGeneration,
282
292
  coordinatorExpectedStoreVersion: target.coordinatorExpectedStoreVersion,
283
- phase: 5,
293
+ phase: RELOCATION_ACTIVATING_PHASE,
284
294
  sourceCleanupState: 0
285
295
  });
286
296
  return replaceCanonicalRelocationSlot(layout, slot);
@@ -323,7 +333,7 @@ function decodeCanonicalAuthorityPublication(
323
333
  function decodeCanonicalAuthorityLayout(payload: Uint8Array): CanonicalAuthorityLayout | undefined {
324
334
  try {
325
335
  const bytes = Buffer.from(payload);
326
- if (bytes.byteLength < 20 || bytes.byteLength > 1024 * 1024) return undefined;
336
+ if (bytes.byteLength < 20 || bytes.byteLength > AUTHORITY_ENVELOPE_MAX_BYTES) return undefined;
327
337
  const reader = new CanonicalReader(bytes);
328
338
  reader.expect(Buffer.from('ZLAU'));
329
339
  if (reader.u8() !== 1) return undefined;
@@ -395,21 +405,21 @@ export function decodeCanonicalRelocationSlot(
395
405
  if (
396
406
  !reader.done ||
397
407
  aggregateGeneration > 0x7fff_ffff_ffff_fffen ||
398
- (aggregateGeneration === 0n && phase !== 1) ||
408
+ (aggregateGeneration === 0n && phase !== RELOCATION_PREPARING_PHASE) ||
399
409
  (rootAggregateGeneration !== undefined && aggregateGeneration !== rootAggregateGeneration) ||
400
- targetAttemptGeneration > 0x7fff_ffff_ffff_ffffn ||
410
+ targetAttemptGeneration > MAX_RELOCATION_GENERATION ||
401
411
  sourceNodeGeneration === 0n ||
402
- sourceNodeGeneration > 0x7fff_ffff_ffff_ffffn ||
412
+ sourceNodeGeneration > MAX_RELOCATION_GENERATION ||
403
413
  sourceOwnerLeaseGeneration === 0n ||
404
- sourceOwnerLeaseGeneration > 0x7fff_ffff_ffff_ffffn ||
405
- targetNodeGeneration > 0x7fff_ffff_ffff_ffffn ||
406
- targetOwnerLeaseGeneration > 0x7fff_ffff_ffff_ffffn ||
414
+ sourceOwnerLeaseGeneration > MAX_RELOCATION_GENERATION ||
415
+ targetNodeGeneration > MAX_RELOCATION_GENERATION ||
416
+ targetOwnerLeaseGeneration > MAX_RELOCATION_GENERATION ||
407
417
  coordinatorLeaseGeneration === 0n ||
408
- coordinatorLeaseGeneration > 0x7fff_ffff_ffff_ffffn ||
418
+ coordinatorLeaseGeneration > MAX_RELOCATION_GENERATION ||
409
419
  coordinatorNodeGeneration === 0n ||
410
- coordinatorNodeGeneration > 0x7fff_ffff_ffff_ffffn ||
411
- phase < 1 ||
412
- phase > 9 ||
420
+ coordinatorNodeGeneration > MAX_RELOCATION_GENERATION ||
421
+ phase < RELOCATION_PREPARING_PHASE ||
422
+ phase > RELOCATION_LAST_PHASE ||
413
423
  applicationVersion < 0n ||
414
424
  sourceCleanupState > 2
415
425
  )
@@ -452,10 +462,10 @@ export function encodeCanonicalRelocationSlot(value: CanonicalRelocationSlot): B
452
462
  if (aggregateGeneration > 0x7fff_ffff_ffff_fffen) {
453
463
  throw new TypeError('Aggregate generation exceeds the issued range.');
454
464
  }
455
- if (aggregateGeneration === 0n && value.phase !== 1) {
465
+ if (aggregateGeneration === 0n && value.phase !== RELOCATION_PREPARING_PHASE) {
456
466
  throw new TypeError('Zero aggregate generation is only valid while preparing.');
457
467
  }
458
- if (targetAttemptGeneration > 0x7fff_ffff_ffff_ffffn) {
468
+ if (targetAttemptGeneration > MAX_RELOCATION_GENERATION) {
459
469
  throw new TypeError('Target attempt generation exceeds the ordinal range.');
460
470
  }
461
471
  const sourceNodeGeneration = canonicalNonZeroOrdinal(
@@ -482,7 +492,11 @@ export function encodeCanonicalRelocationSlot(value: CanonicalRelocationSlot): B
482
492
  value.coordinatorNodeGeneration,
483
493
  'coordinator node generation'
484
494
  );
485
- if (!Number.isInteger(value.phase) || value.phase < 1 || value.phase > 9) {
495
+ if (
496
+ !Number.isInteger(value.phase) ||
497
+ value.phase < RELOCATION_PREPARING_PHASE ||
498
+ value.phase > RELOCATION_LAST_PHASE
499
+ ) {
486
500
  throw new TypeError('Canonical relocation phase is invalid.');
487
501
  }
488
502
  if (
@@ -553,7 +567,7 @@ function encodeCanonicalRelocationPublicationSlot(
553
567
  coordinatorNodeRid: publication.coordinatorNodeRid ?? nodeRid,
554
568
  coordinatorNodeGeneration: publication.coordinatorNodeGeneration ?? layout.nodeGeneration,
555
569
  coordinatorExpectedStoreVersion: publication.coordinatorExpectedStoreVersion ?? '',
556
- phase: publication.canonicalPhase ?? 8,
570
+ phase: publication.canonicalPhase ?? RELOCATION_COMPLETED_PHASE,
557
571
  applicationVersion,
558
572
  sourceCleanupState: publication.canonicalSourceCleanupState ?? 0
559
573
  });
@@ -579,8 +593,10 @@ function replaceCanonicalRelocationSlot(
579
593
  body
580
594
  ]);
581
595
  const result = Buffer.concat([envelope, canonicalU32(crc32c(envelope))]);
582
- if (result.byteLength > 1024 * 1024) {
583
- throw new TypeError('Canonical authority payload exceeds 1 MiB.');
596
+ if (result.byteLength > AUTHORITY_ENVELOPE_MAX_BYTES) {
597
+ throw new TypeError(
598
+ `Canonical authority payload exceeds ${AUTHORITY_ENVELOPE_MAX_BYTES / (1024 * 1024)} MiB.`
599
+ );
584
600
  }
585
601
  return result;
586
602
  }
@@ -1022,8 +1038,8 @@ function encodeAuthorityEnvelope(
1022
1038
  'target owner lease generation'
1023
1039
  );
1024
1040
  if (
1025
- aggregateGeneration > 0x7fff_ffff_ffff_ffffn ||
1026
- targetOwnerLeaseGeneration > 0x7fff_ffff_ffff_ffffn
1041
+ aggregateGeneration > MAX_RELOCATION_GENERATION ||
1042
+ targetOwnerLeaseGeneration > MAX_RELOCATION_GENERATION
1027
1043
  ) {
1028
1044
  throw new TypeError('Relocation publication generations must fit signed 64-bit storage.');
1029
1045
  }
@@ -1040,8 +1056,10 @@ function encodeAuthorityEnvelope(
1040
1056
  i64le(targetOwnerLeaseGeneration),
1041
1057
  bytes32le(base)
1042
1058
  ]);
1043
- if (payload.byteLength > 1024 * 1024) {
1044
- throw new TypeError('Location authority relocation payload exceeds 1 MiB.');
1059
+ if (payload.byteLength > AUTHORITY_ENVELOPE_MAX_BYTES) {
1060
+ throw new TypeError(
1061
+ `Location authority relocation payload exceeds ${AUTHORITY_ENVELOPE_MAX_BYTES / (1024 * 1024)} MiB.`
1062
+ );
1045
1063
  }
1046
1064
  return payload;
1047
1065
  }
@@ -1067,8 +1085,8 @@ function decodeAuthorityEnvelope(
1067
1085
  if (
1068
1086
  !reader.done ||
1069
1087
  aggregateGeneration === 0n ||
1070
- aggregateGeneration > 0x7fff_ffff_ffff_ffffn ||
1071
- inventoryDigestBytes.byteLength !== 32 ||
1088
+ aggregateGeneration > MAX_RELOCATION_GENERATION ||
1089
+ inventoryDigestBytes.byteLength !== SHA256_DIGEST_BYTES ||
1072
1090
  targetOwnerLeaseGeneration <= 0n
1073
1091
  ) {
1074
1092
  return undefined;
@@ -1181,8 +1199,10 @@ function text16le(value: string): Buffer {
1181
1199
 
1182
1200
  function bytes32le(value: Uint8Array): Buffer {
1183
1201
  const bytes = Buffer.from(value);
1184
- if (bytes.byteLength > 1024 * 1024) {
1185
- throw new TypeError('Relocation byte field exceeds 1 MiB.');
1202
+ if (bytes.byteLength > AUTHORITY_ENVELOPE_MAX_BYTES) {
1203
+ throw new TypeError(
1204
+ `Relocation byte field exceeds ${AUTHORITY_ENVELOPE_MAX_BYTES / (1024 * 1024)} MiB.`
1205
+ );
1186
1206
  }
1187
1207
  const length = Buffer.alloc(4);
1188
1208
  length.writeInt32LE(bytes.byteLength);
@@ -1350,7 +1370,7 @@ function canonicalU32(value: number): Buffer {
1350
1370
  }
1351
1371
 
1352
1372
  function canonicalU64(value: bigint): Buffer {
1353
- if (value < 0n || value > 0xffff_ffff_ffff_ffffn) {
1373
+ if (value < 0n || value > UINT64_MAX) {
1354
1374
  throw new TypeError('Canonical authority u64 is invalid.');
1355
1375
  }
1356
1376
  const result = Buffer.alloc(8);
@@ -1360,7 +1380,7 @@ function canonicalU64(value: bigint): Buffer {
1360
1380
 
1361
1381
  function canonicalOrdinal(value: bigint, name: string): bigint {
1362
1382
  const ordinal = nonNegativeBigInt(value, name);
1363
- if (ordinal > 0x7fff_ffff_ffff_ffffn) {
1383
+ if (ordinal > MAX_RELOCATION_GENERATION) {
1364
1384
  throw new TypeError(`${name} exceeds the ordinal range.`);
1365
1385
  }
1366
1386
  return ordinal;
@@ -1373,7 +1393,7 @@ function canonicalNonZeroOrdinal(value: bigint, name: string): bigint {
1373
1393
  }
1374
1394
 
1375
1395
  function canonicalI64(value: bigint): Buffer {
1376
- if (value < 0n || value > 0x7fff_ffff_ffff_ffffn) {
1396
+ if (value < 0n || value > MAX_RELOCATION_GENERATION) {
1377
1397
  throw new TypeError('Canonical authority i64 is invalid.');
1378
1398
  }
1379
1399
  const result = Buffer.alloc(8);
@@ -1387,8 +1407,10 @@ class DotnetBinaryReader {
1387
1407
 
1388
1408
  constructor(payload: Uint8Array) {
1389
1409
  this.bytes = Buffer.from(payload);
1390
- if (this.bytes.byteLength > 1024 * 1024) {
1391
- throw new TypeError('Location authority relocation payload exceeds 1 MiB.');
1410
+ if (this.bytes.byteLength > AUTHORITY_ENVELOPE_MAX_BYTES) {
1411
+ throw new TypeError(
1412
+ `Location authority relocation payload exceeds ${AUTHORITY_ENVELOPE_MAX_BYTES / (1024 * 1024)} MiB.`
1413
+ );
1392
1414
  }
1393
1415
  }
1394
1416
 
@@ -1426,7 +1448,7 @@ class DotnetBinaryReader {
1426
1448
 
1427
1449
  bytes32(): Buffer {
1428
1450
  const length = this.take(4).readInt32LE(0);
1429
- if (length < 0 || length > 1024 * 1024) {
1451
+ if (length < 0 || length > AUTHORITY_ENVELOPE_MAX_BYTES) {
1430
1452
  throw new TypeError('Location authority relocation byte field is invalid.');
1431
1453
  }
1432
1454
  return Buffer.from(this.take(length));