@zlink-systems/framework 0.21.0 → 0.22.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 (487) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Common/ZLinkMessage.js +5 -5
  3. package/dist/contracts/Configuration/CodecContentType.js +5 -7
  4. package/dist/contracts/Configuration/DiagnosticsValidation.js +1 -6
  5. package/dist/contracts/Configuration/EndpointNotation.js +4 -8
  6. package/dist/contracts/Configuration/Registration.js +14 -11
  7. package/dist/contracts/Configuration/RegistrationBuilders.js +32 -25
  8. package/dist/contracts/Configuration/RegistrationNormalizers.js +25 -26
  9. package/dist/contracts/Configuration/RegistrationValidators.js +36 -38
  10. package/dist/contracts/Configuration/SendTimeoutValidation.js +4 -4
  11. package/dist/contracts/Configuration/TimerRegistrationValidator.js +7 -7
  12. package/dist/contracts/Handlers/JsonContract.js +23 -11
  13. package/dist/contracts/Spots/SpotKind.js +16 -8
  14. package/dist/location-store-integration.js +16 -16
  15. package/dist/nest-integration.js +17 -11
  16. package/dist/runtime/abort.js +9 -5
  17. package/dist/runtime/actors/actor-authority-payload-codec.js +12 -16
  18. package/dist/runtime/actors/actor-authority-publication.js +18 -17
  19. package/dist/runtime/actors/actor-client.js +83 -63
  20. package/dist/runtime/actors/actor-context.js +24 -18
  21. package/dist/runtime/actors/actor-creation.js +4 -3
  22. package/dist/runtime/actors/actor-handoff.js +89 -92
  23. package/dist/runtime/actors/actor-local-native-join.js +18 -19
  24. package/dist/runtime/actors/actor-mailbox.js +1 -1
  25. package/dist/runtime/actors/actor-message-follow-context.js +24 -21
  26. package/dist/runtime/actors/actor-packet-relay-wire.js +1 -3
  27. package/dist/runtime/actors/actor-remote-joiner.js +20 -17
  28. package/dist/runtime/actors/actor-remote-wire.js +6 -7
  29. package/dist/runtime/actors/actor-runtime-state.js +87 -81
  30. package/dist/runtime/actors/actor-transfer-registry.js +3 -5
  31. package/dist/runtime/actors/bound-session-wire.js +14 -9
  32. package/dist/runtime/actors/deferred-join-accepted-journal.js +158 -124
  33. package/dist/runtime/actors/index.js +2 -5
  34. package/dist/runtime/actors/post-commit-actor-binder.js +3 -6
  35. package/dist/runtime/actors/post-commit-actor-location.js +1 -1
  36. package/dist/runtime/actors/spot-actor-dispatch.js +5 -5
  37. package/dist/runtime/actors/transferred-actor-rollback.js +4 -4
  38. package/dist/runtime/admission.js +2 -6
  39. package/dist/runtime/application-jobs/application-ingress-record-owner.js +2 -6
  40. package/dist/runtime/application-jobs/receive-flow-controller.js +11 -12
  41. package/dist/runtime/backend/mesh-completion-table.js +1 -3
  42. package/dist/runtime/backend/mesh-dispatch-pump.js +12 -16
  43. package/dist/runtime/backend/node/node-backend-adapter-factory.js +1 -3
  44. package/dist/runtime/backend/node/node-backend-adapter-support.js +26 -17
  45. package/dist/runtime/backend/node/node-mesh-backend-adapter.js +4 -3
  46. package/dist/runtime/backend/node/node-raw-binding-port.js +7 -6
  47. package/dist/runtime/backend/node/node-raw-mesh-backend.js +116 -113
  48. package/dist/runtime/backend/node/node-socket-backend-adapter.js +12 -13
  49. package/dist/runtime/backend/runtime-message.js +3 -3
  50. package/dist/runtime/backend/runtime-values.d.ts +2 -2
  51. package/dist/runtime/backend/runtime-values.js +4 -5
  52. package/dist/runtime/channels/channel-clients.js +27 -24
  53. package/dist/runtime/channels/channel-dispatch-pipeline.js +10 -18
  54. package/dist/runtime/channels/channel-dispatch-services.js +7 -4
  55. package/dist/runtime/channels/channel-dispatchers.js +9 -9
  56. package/dist/runtime/channels/channel-envelope-inspection.js +16 -13
  57. package/dist/runtime/channels/channel-envelope.js +83 -47
  58. package/dist/runtime/channels/channel-outbound-operations.js +8 -8
  59. package/dist/runtime/channels/channel-receive-loops.js +20 -22
  60. package/dist/runtime/channels/channel-receive-task-tracker.js +1 -1
  61. package/dist/runtime/channels/channel-runtime-lifecycle.js +61 -56
  62. package/dist/runtime/channels/channel-runtime-manager.js +18 -9
  63. package/dist/runtime/channels/channel-socket-registry.js +126 -123
  64. package/dist/runtime/channels/channel-transports.js +43 -33
  65. package/dist/runtime/channels/client-server-location-runtime.js +32 -40
  66. package/dist/runtime/channels/client-server-service-wire.js +29 -22
  67. package/dist/runtime/channels/dispatch-error-reporter.js +9 -7
  68. package/dist/runtime/channels/fanout-location-runtime.js +34 -47
  69. package/dist/runtime/channels/fanout-service-wire.js +3 -5
  70. package/dist/runtime/channels/local-spot-route-transport.js +7 -1
  71. package/dist/runtime/channels/route-member-snapshot.js +3 -3
  72. package/dist/runtime/channels/source-spot-router.js +6 -2
  73. package/dist/runtime/channels/spot-route-bridge-transport.js +5 -2
  74. package/dist/runtime/channels/spot-route-dispatch-strategy.js +2 -2
  75. package/dist/runtime/channels/spot-route-target-resolver.js +6 -6
  76. package/dist/runtime/diagnostics/index.js +38 -10
  77. package/dist/runtime/diagnostics/message-flow.js +47 -39
  78. package/dist/runtime/diagnostics/runtime-metrics.js +18 -9
  79. package/dist/runtime/diagnostics/runtime-observation-queue.js +8 -10
  80. package/dist/runtime/diagnostics/topology-runtime-projections.js +17 -10
  81. package/dist/runtime/execution/index.js +7 -6
  82. package/dist/runtime/execution/serial-execution-queue.js +12 -18
  83. package/dist/runtime/execution/state-lane.js +2 -2
  84. package/dist/runtime/foundation/actor-join-recovery-codec.js +31 -23
  85. package/dist/runtime/foundation/event-loop-resources.js +4 -4
  86. package/dist/runtime/foundation/message-follow-suppression-registry.js +4 -4
  87. package/dist/runtime/foundation/raw-service-mesh-runtime.js +136 -136
  88. package/dist/runtime/foundation/route-mesh-connection-policy.js +4 -4
  89. package/dist/runtime/foundation/runtime-state-projections.js +22 -11
  90. package/dist/runtime/foundation/service-authority-payload-codec.js +13 -15
  91. package/dist/runtime/foundation/service-discovery-registry.js +35 -33
  92. package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +20 -22
  93. package/dist/runtime/foundation/service-liveness-registry.js +16 -12
  94. package/dist/runtime/foundation/service-maintenance-runtime.js +2 -4
  95. package/dist/runtime/foundation/service-relocation-aggregate-committer.js +24 -24
  96. package/dist/runtime/foundation/service-relocation-object-owner.js +6 -6
  97. package/dist/runtime/foundation/service-relocation-runtime.js +137 -94
  98. package/dist/runtime/foundation/service-runtime-contracts.js +5 -5
  99. package/dist/runtime/foundation/service-stateful-registry.js +24 -23
  100. package/dist/runtime/foundation/service-stateful-runtime.js +416 -438
  101. package/dist/runtime/foundation/service-stateful-wire-codec.js +95 -98
  102. package/dist/runtime/foundation/service-topology-registry.js +96 -95
  103. package/dist/runtime/foundation/service-weighted-selection.js +6 -11
  104. package/dist/runtime/foundation/service-wire-binary-primitives.js +5 -6
  105. package/dist/runtime/foundation/service-wire-m6a-codec.js +46 -35
  106. package/dist/runtime/framework-errors-internal.js +7 -10
  107. package/dist/runtime/handlers/handler-instance-scope.js +4 -5
  108. package/dist/runtime/handlers/index.js +3 -1
  109. package/dist/runtime/host/actor-packet-relay.js +74 -70
  110. package/dist/runtime/host/actor-placement-coordinator.js +29 -31
  111. package/dist/runtime/host/actor-runtime-options-factory.js +12 -14
  112. package/dist/runtime/host/actor-transfer-authority-runtime.js +7 -9
  113. package/dist/runtime/host/actor-transfer-runtime.js +176 -153
  114. package/dist/runtime/host/application-job-queue.js +18 -22
  115. package/dist/runtime/host/bound-session-relay.js +3 -1
  116. package/dist/runtime/host/channel-runtime-options-factory.js +31 -14
  117. package/dist/runtime/host/host-capacity-status.js +8 -4
  118. package/dist/runtime/host/index.js +244 -227
  119. package/dist/runtime/host/instance-activation-authority.js +93 -96
  120. package/dist/runtime/host/location-runtime-owner.js +16 -14
  121. package/dist/runtime/host/mesh-router-resolver.js +11 -13
  122. package/dist/runtime/host/relocation-direct-transfer.js +10 -9
  123. package/dist/runtime/host/remote-actor-join-receiver.js +20 -15
  124. package/dist/runtime/host/remote-actor-packet-target-store.js +18 -22
  125. package/dist/runtime/host/remote-bound-session-relay.js +97 -73
  126. package/dist/runtime/host/route-mesh-runtime.js +64 -69
  127. package/dist/runtime/host/runtime-shutdown.js +1 -2
  128. package/dist/runtime/host/service-relocation-host-runtime.js +586 -511
  129. package/dist/runtime/host/spot-address-transport.js +69 -71
  130. package/dist/runtime/host/spot-runtime-options-factory.js +30 -29
  131. package/dist/runtime/host/stateful-authority-route-runtime.js +65 -68
  132. package/dist/runtime/host/user-spot-creation-coordinator.js +61 -67
  133. package/dist/runtime/locations/actor-location-claims.js +26 -20
  134. package/dist/runtime/locations/aggregate-inventory-store.js +72 -75
  135. package/dist/runtime/locations/authority-key-codec.js +7 -7
  136. package/dist/runtime/locations/auto-connect-loop.js +3 -3
  137. package/dist/runtime/locations/auto-connect-planner.js +25 -19
  138. package/dist/runtime/locations/auto-connect-reconciler.js +51 -31
  139. package/dist/runtime/locations/in-memory-authority-store.js +128 -118
  140. package/dist/runtime/locations/in-memory-location-store.js +195 -168
  141. package/dist/runtime/locations/in-memory-provider-location-store.js +8 -10
  142. package/dist/runtime/locations/key-codec.js +1 -1
  143. package/dist/runtime/locations/lease-tracker.js +23 -21
  144. package/dist/runtime/locations/lifecycle.js +4 -5
  145. package/dist/runtime/locations/location-store-repository.js +368 -324
  146. package/dist/runtime/locations/opaque-record-key.js +2 -2
  147. package/dist/runtime/locations/resolvers.js +73 -82
  148. package/dist/runtime/locations/runtime.js +68 -63
  149. package/dist/runtime/locations/spot-location-claims.js +39 -35
  150. package/dist/runtime/messaging/framework-json-v1.js +7 -7
  151. package/dist/runtime/messaging/packet-name.js +7 -6
  152. package/dist/runtime/messaging/payload-codec.js +21 -18
  153. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +30 -2
  154. package/dist/runtime/protocol/service_wire_codec.generated.js +1671 -234
  155. package/dist/runtime/routing-id.js +3 -5
  156. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +35 -31
  157. package/dist/runtime/spots/formal-remote-actor-transfer-registry.js +1 -2
  158. package/dist/runtime/spots/index.js +208 -219
  159. package/dist/runtime/spots/spot-activation-registry.js +15 -14
  160. package/dist/runtime/spots/spot-activation-state.js +17 -15
  161. package/dist/runtime/spots/spot-activation.js +33 -16
  162. package/dist/runtime/spots/spot-actor-admission-coordinator.js +18 -15
  163. package/dist/runtime/spots/spot-actor-membership.js +1 -3
  164. package/dist/runtime/spots/spot-actor-packet-dispatch.js +23 -20
  165. package/dist/runtime/spots/spot-actor-packet-drain.js +12 -10
  166. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +10 -6
  167. package/dist/runtime/spots/spot-closing.js +3 -7
  168. package/dist/runtime/spots/spot-context.js +2 -2
  169. package/dist/runtime/spots/spot-entry-activation.js +13 -14
  170. package/dist/runtime/spots/spot-handle.js +6 -3
  171. package/dist/runtime/spots/spot-handler-registry.js +12 -12
  172. package/dist/runtime/spots/spot-manager-public.js +5 -6
  173. package/dist/runtime/spots/spot-native-actor-join-admission.js +4 -3
  174. package/dist/runtime/spots/spot-node-autoconnect.js +15 -18
  175. package/dist/runtime/spots/spot-node-runtime-manager.js +74 -85
  176. package/dist/runtime/spots/spot-outbound.js +10 -14
  177. package/dist/runtime/spots/spot-remote-codec.js +22 -26
  178. package/dist/runtime/spots/spot-remote-route-codec.js +5 -7
  179. package/dist/runtime/spots/spot-route-packet-dispatch.js +16 -14
  180. package/dist/runtime/spots/spot-route-replies.js +4 -6
  181. package/dist/runtime/spots/spot-routed-actor-admission.js +9 -7
  182. package/dist/runtime/spots/spot-routed-bound-session-dispatch.js +1 -2
  183. package/dist/runtime/spots/spot-routed-frame-dispatch.js +5 -5
  184. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +14 -10
  185. package/dist/runtime/spots/spot-serial-executor.js +5 -8
  186. package/dist/runtime/spots/spot-serial-turn-executor.js +4 -6
  187. package/dist/runtime/spots/spot-subscription-dispatch.js +5 -5
  188. package/dist/runtime/spots/spot-timer.js +25 -29
  189. package/dist/runtime/streams/actor-session-binding-registry.js +98 -107
  190. package/dist/runtime/streams/actor-session-lifecycle-coordinator.js +3 -1
  191. package/dist/runtime/streams/bound-actor-relay-sender.js +18 -16
  192. package/dist/runtime/streams/bound-session-service.js +8 -9
  193. package/dist/runtime/streams/index.js +20 -19
  194. package/dist/runtime/streams/managed-stream.js +32 -30
  195. package/dist/runtime/streams/native-fallback-bound-session.js +21 -17
  196. package/dist/runtime/streams/protocol.js +29 -18
  197. package/dist/runtime/streams/session-actor-coordinator.js +34 -37
  198. package/dist/runtime/streams/session-context.js +30 -28
  199. package/dist/runtime/streams/session-provider.js +2 -2
  200. package/dist/runtime/streams/session-serial-executor.js +1 -2
  201. package/dist/runtime/streams/stream-frame-factory.js +11 -5
  202. package/dist/runtime/streams/stream-session-runtime.js +70 -66
  203. package/dist/runtime/workers/index.js +15 -4
  204. package/package.json +2 -2
  205. package/src/contracts/Channels/RouteCalls.ts +6 -1
  206. package/src/contracts/Common/ZLinkMessage.ts +5 -5
  207. package/src/contracts/Common/ZLinkMessageMetadata.ts +4 -3
  208. package/src/contracts/Configuration/Builders.ts +14 -14
  209. package/src/contracts/Configuration/CodecContentType.ts +8 -10
  210. package/src/contracts/Configuration/DiagnosticsValidation.ts +1 -6
  211. package/src/contracts/Configuration/EndpointNotation.ts +11 -11
  212. package/src/contracts/Configuration/ObjectRoles.ts +1 -3
  213. package/src/contracts/Configuration/Registration.ts +46 -17
  214. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +10 -8
  215. package/src/contracts/Configuration/RegistrationBuilders.ts +107 -96
  216. package/src/contracts/Configuration/RegistrationCodecRegistry.ts +9 -3
  217. package/src/contracts/Configuration/RegistrationNormalizers.ts +116 -84
  218. package/src/contracts/Configuration/RegistrationTypes.ts +21 -25
  219. package/src/contracts/Configuration/RegistrationValidators.ts +122 -73
  220. package/src/contracts/Configuration/RouteChannelInternalState.ts +1 -4
  221. package/src/contracts/Configuration/RuntimeEndpointConnections.ts +4 -1
  222. package/src/contracts/Configuration/SendTimeoutValidation.ts +6 -4
  223. package/src/contracts/Configuration/TimerRegistrationValidator.ts +8 -13
  224. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -6
  225. package/src/contracts/Errors/index.ts +1 -4
  226. package/src/contracts/Handlers/Attributes.ts +15 -9
  227. package/src/contracts/Handlers/IZLinkChannelHandlers.ts +24 -4
  228. package/src/contracts/Handlers/JsonContract.ts +53 -19
  229. package/src/contracts/Locations/ActorTransfer.ts +1 -5
  230. package/src/contracts/Locations/Authority.ts +4 -11
  231. package/src/contracts/Locations/Keys.ts +6 -1
  232. package/src/contracts/Locations/Options.ts +3 -2
  233. package/src/contracts/Locations/RelocationStore.ts +1 -4
  234. package/src/contracts/Locations/Resolvers.ts +5 -5
  235. package/src/contracts/Locations/RuntimeQuery.ts +6 -2
  236. package/src/contracts/Locations/Stores.ts +1 -2
  237. package/src/contracts/Locations/index.ts +2 -8
  238. package/src/contracts/RouteMesh/Contracts.ts +1 -7
  239. package/src/contracts/RouteMesh/RuntimeTopology.ts +1 -4
  240. package/src/contracts/Spots/Contracts.ts +2 -8
  241. package/src/contracts/Spots/SpotKind.ts +16 -8
  242. package/src/contracts/Spots/ZLinkSpot.ts +8 -11
  243. package/src/contracts/Streams/IZLinkSession.ts +0 -1
  244. package/src/contracts/Streams/IZLinkSessionActor.ts +5 -1
  245. package/src/contracts/Streams/IZLinkSessionPacketHandler.ts +5 -1
  246. package/src/internal.ts +5 -4
  247. package/src/location-store-integration.ts +24 -16
  248. package/src/nest-integration.ts +40 -25
  249. package/src/runtime/abort.ts +10 -4
  250. package/src/runtime/actors/actor-authority-payload-codec.ts +20 -29
  251. package/src/runtime/actors/actor-authority-publication.ts +92 -77
  252. package/src/runtime/actors/actor-client.ts +162 -133
  253. package/src/runtime/actors/actor-context.ts +138 -130
  254. package/src/runtime/actors/actor-creation.ts +47 -44
  255. package/src/runtime/actors/actor-execution-context.ts +6 -4
  256. package/src/runtime/actors/actor-handoff.ts +269 -293
  257. package/src/runtime/actors/actor-join-deferred-scope.ts +5 -4
  258. package/src/runtime/actors/actor-lifecycle-snapshot.ts +5 -8
  259. package/src/runtime/actors/actor-local-native-join.ts +131 -159
  260. package/src/runtime/actors/actor-mailbox.ts +16 -19
  261. package/src/runtime/actors/actor-message-follow-context.ts +46 -36
  262. package/src/runtime/actors/actor-packet-relay-wire.ts +32 -21
  263. package/src/runtime/actors/actor-remote-joiner.ts +50 -54
  264. package/src/runtime/actors/actor-remote-wire.ts +9 -13
  265. package/src/runtime/actors/actor-routed-join-transport.ts +10 -2
  266. package/src/runtime/actors/actor-runtime-contracts.ts +2 -5
  267. package/src/runtime/actors/actor-runtime-state.ts +127 -124
  268. package/src/runtime/actors/actor-transfer-registry.ts +9 -14
  269. package/src/runtime/actors/actor-transport-delivery-gate.ts +4 -6
  270. package/src/runtime/actors/bound-session-wire.ts +37 -17
  271. package/src/runtime/actors/deferred-join-accepted-journal.ts +351 -320
  272. package/src/runtime/actors/index.ts +43 -86
  273. package/src/runtime/actors/post-commit-actor-binder.ts +10 -10
  274. package/src/runtime/actors/post-commit-actor-location.ts +30 -23
  275. package/src/runtime/actors/spot-actor-dispatch.ts +78 -53
  276. package/src/runtime/actors/transferred-actor-rollback.ts +18 -13
  277. package/src/runtime/admission.ts +9 -9
  278. package/src/runtime/application-jobs/application-ingress-record-owner.ts +5 -15
  279. package/src/runtime/application-jobs/application-job-queue-handler-start-gate.ts +3 -2
  280. package/src/runtime/application-jobs/receive-flow-controller.ts +17 -14
  281. package/src/runtime/backend/contracts/index.ts +73 -52
  282. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -14
  283. package/src/runtime/backend/mesh-completion-table.ts +6 -9
  284. package/src/runtime/backend/mesh-dispatch-pump.ts +38 -30
  285. package/src/runtime/backend/node/node-backend-adapter-factory.ts +23 -21
  286. package/src/runtime/backend/node/node-backend-adapter-support.ts +36 -22
  287. package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +59 -58
  288. package/src/runtime/backend/node/node-event-loop-poller.ts +2 -10
  289. package/src/runtime/backend/node/node-mesh-backend-adapter.ts +12 -5
  290. package/src/runtime/backend/node/node-monitor-backend-adapter.ts +4 -3
  291. package/src/runtime/backend/node/node-raw-binding-port.ts +29 -29
  292. package/src/runtime/backend/node/node-raw-mesh-backend.ts +335 -383
  293. package/src/runtime/backend/node/node-socket-backend-adapter.ts +101 -54
  294. package/src/runtime/backend/runtime-message.ts +5 -3
  295. package/src/runtime/backend/runtime-values.ts +10 -7
  296. package/src/runtime/channels/channel-autoconnect.ts +1 -4
  297. package/src/runtime/channels/channel-clients.ts +93 -73
  298. package/src/runtime/channels/channel-dispatch-pipeline.ts +40 -42
  299. package/src/runtime/channels/channel-dispatch-services.ts +51 -49
  300. package/src/runtime/channels/channel-dispatchers.ts +152 -96
  301. package/src/runtime/channels/channel-envelope-inspection.ts +20 -16
  302. package/src/runtime/channels/channel-envelope.ts +256 -150
  303. package/src/runtime/channels/channel-multipart.ts +13 -5
  304. package/src/runtime/channels/channel-outbound-operations.ts +37 -41
  305. package/src/runtime/channels/channel-receive-loops.ts +102 -98
  306. package/src/runtime/channels/channel-receive-task-tracker.ts +1 -1
  307. package/src/runtime/channels/channel-runtime-lifecycle.ts +248 -190
  308. package/src/runtime/channels/channel-runtime-manager.ts +63 -37
  309. package/src/runtime/channels/channel-socket-options.ts +3 -10
  310. package/src/runtime/channels/channel-socket-registry.ts +331 -273
  311. package/src/runtime/channels/channel-transports.ts +215 -197
  312. package/src/runtime/channels/client-server-location-runtime.ts +116 -100
  313. package/src/runtime/channels/client-server-service-wire.ts +37 -36
  314. package/src/runtime/channels/dispatch-error-reporter.ts +11 -8
  315. package/src/runtime/channels/fanout-location-runtime.ts +91 -94
  316. package/src/runtime/channels/fanout-service-wire.ts +5 -12
  317. package/src/runtime/channels/handler-filter-scope.ts +1 -4
  318. package/src/runtime/channels/index.ts +1 -4
  319. package/src/runtime/channels/local-spot-route-transport.ts +20 -5
  320. package/src/runtime/channels/route-member-snapshot.ts +11 -5
  321. package/src/runtime/channels/router-socket-spot-route-transport.ts +1 -7
  322. package/src/runtime/channels/source-spot-router.ts +26 -22
  323. package/src/runtime/channels/spot-direct-envelope.ts +10 -8
  324. package/src/runtime/channels/spot-node-route-transport.ts +13 -16
  325. package/src/runtime/channels/spot-route-bridge-transport.ts +26 -9
  326. package/src/runtime/channels/spot-route-dispatch-strategy.ts +40 -13
  327. package/src/runtime/channels/spot-route-target-resolver.ts +18 -9
  328. package/src/runtime/codecs/index.ts +3 -2
  329. package/src/runtime/diagnostics/flow-context.ts +12 -3
  330. package/src/runtime/diagnostics/index.ts +96 -61
  331. package/src/runtime/diagnostics/internal-event-contracts.ts +87 -33
  332. package/src/runtime/diagnostics/message-flow.ts +95 -76
  333. package/src/runtime/diagnostics/runtime-metrics.ts +46 -24
  334. package/src/runtime/diagnostics/runtime-observation-queue.ts +17 -28
  335. package/src/runtime/diagnostics/topology-runtime-projections.ts +62 -43
  336. package/src/runtime/execution/index.ts +18 -26
  337. package/src/runtime/execution/serial-execution-queue.ts +31 -40
  338. package/src/runtime/execution/state-lane.ts +2 -2
  339. package/src/runtime/foundation/actor-join-recovery-codec.ts +69 -51
  340. package/src/runtime/foundation/event-loop-resources.ts +8 -4
  341. package/src/runtime/foundation/message-follow-suppression-registry.ts +7 -14
  342. package/src/runtime/foundation/operation-identity.ts +1 -2
  343. package/src/runtime/foundation/operation-registry.ts +8 -2
  344. package/src/runtime/foundation/raw-service-mesh-runtime.ts +312 -385
  345. package/src/runtime/foundation/route-mesh-connection-policy.ts +7 -8
  346. package/src/runtime/foundation/runtime-state-projections.ts +24 -23
  347. package/src/runtime/foundation/service-authority-payload-codec.ts +54 -57
  348. package/src/runtime/foundation/service-discovery-registry.ts +67 -59
  349. package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +28 -29
  350. package/src/runtime/foundation/service-liveness-registry.ts +18 -13
  351. package/src/runtime/foundation/service-mailbox.ts +14 -14
  352. package/src/runtime/foundation/service-maintenance-runtime.ts +22 -21
  353. package/src/runtime/foundation/service-metadata-codec.ts +2 -9
  354. package/src/runtime/foundation/service-relocation-aggregate-committer.ts +39 -36
  355. package/src/runtime/foundation/service-relocation-coordinator.ts +1 -4
  356. package/src/runtime/foundation/service-relocation-object-owner.ts +40 -58
  357. package/src/runtime/foundation/service-relocation-runtime.ts +292 -216
  358. package/src/runtime/foundation/service-runtime-contracts.ts +8 -8
  359. package/src/runtime/foundation/service-session-binding-ingress-port.ts +1 -4
  360. package/src/runtime/foundation/service-stateful-registry.ts +69 -59
  361. package/src/runtime/foundation/service-stateful-runtime.ts +1174 -1112
  362. package/src/runtime/foundation/service-stateful-wire-codec.ts +318 -270
  363. package/src/runtime/foundation/service-topology-registry.ts +157 -159
  364. package/src/runtime/foundation/service-weighted-selection.ts +9 -15
  365. package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -12
  366. package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -47
  367. package/src/runtime/framework-errors-internal.ts +31 -30
  368. package/src/runtime/handlers/handler-instance-scope.ts +18 -29
  369. package/src/runtime/handlers/index.ts +18 -8
  370. package/src/runtime/host/actor-packet-relay.ts +290 -261
  371. package/src/runtime/host/actor-placement-coordinator.ts +165 -150
  372. package/src/runtime/host/actor-runtime-options-factory.ts +89 -87
  373. package/src/runtime/host/actor-transfer-authority-runtime.ts +46 -38
  374. package/src/runtime/host/actor-transfer-runtime.ts +391 -395
  375. package/src/runtime/host/application-job-queue.ts +32 -48
  376. package/src/runtime/host/bound-session-relay.ts +7 -9
  377. package/src/runtime/host/channel-runtime-options-factory.ts +75 -35
  378. package/src/runtime/host/host-capacity-status.ts +10 -9
  379. package/src/runtime/host/index.ts +861 -789
  380. package/src/runtime/host/instance-activation-authority.ts +125 -143
  381. package/src/runtime/host/location-runtime-owner.ts +38 -26
  382. package/src/runtime/host/mesh-router-resolver.ts +30 -23
  383. package/src/runtime/host/relocation-direct-transfer.ts +15 -15
  384. package/src/runtime/host/relocation-integrity-fault-gate.ts +3 -2
  385. package/src/runtime/host/remote-actor-join-receiver.ts +43 -34
  386. package/src/runtime/host/remote-actor-packet-target-store.ts +54 -52
  387. package/src/runtime/host/remote-bound-session-relay.ts +274 -247
  388. package/src/runtime/host/route-mesh-runtime-options.ts +1 -3
  389. package/src/runtime/host/route-mesh-runtime.ts +227 -181
  390. package/src/runtime/host/runtime-shutdown.ts +4 -3
  391. package/src/runtime/host/service-relocation-control.ts +14 -5
  392. package/src/runtime/host/service-relocation-host-runtime.ts +1388 -1165
  393. package/src/runtime/host/spot-address-transport.ts +284 -237
  394. package/src/runtime/host/spot-node-runtime-options-factory.ts +14 -8
  395. package/src/runtime/host/spot-runtime-options-factory.ts +71 -62
  396. package/src/runtime/host/stateful-authority-route-runtime.ts +117 -116
  397. package/src/runtime/host/user-spot-creation-coordinator.ts +225 -220
  398. package/src/runtime/locations/actor-location-claims.ts +61 -49
  399. package/src/runtime/locations/actor-session-route-claims.ts +1 -4
  400. package/src/runtime/locations/aggregate-inventory-store.ts +105 -134
  401. package/src/runtime/locations/authority-key-codec.ts +13 -10
  402. package/src/runtime/locations/auto-connect-loop.ts +14 -11
  403. package/src/runtime/locations/auto-connect-planner.ts +42 -31
  404. package/src/runtime/locations/auto-connect-reconciler.ts +106 -63
  405. package/src/runtime/locations/canonical-codec.ts +3 -1
  406. package/src/runtime/locations/creation-operation-id.ts +4 -3
  407. package/src/runtime/locations/domain-store-contract.ts +13 -7
  408. package/src/runtime/locations/in-memory-authority-store.ts +232 -199
  409. package/src/runtime/locations/in-memory-location-store.ts +432 -250
  410. package/src/runtime/locations/in-memory-provider-location-store.ts +16 -17
  411. package/src/runtime/locations/internal-store-contracts.ts +95 -38
  412. package/src/runtime/locations/key-codec.ts +3 -4
  413. package/src/runtime/locations/lease-tracker.ts +36 -27
  414. package/src/runtime/locations/lifecycle-runtime.ts +15 -3
  415. package/src/runtime/locations/lifecycle.ts +33 -28
  416. package/src/runtime/locations/location-store-repository.ts +1329 -1185
  417. package/src/runtime/locations/opaque-record-key.ts +4 -9
  418. package/src/runtime/locations/resolvers.ts +201 -178
  419. package/src/runtime/locations/runtime.ts +251 -159
  420. package/src/runtime/locations/spot-location-claims.ts +110 -112
  421. package/src/runtime/messaging/creation-payload-codec.ts +4 -1
  422. package/src/runtime/messaging/framework-json-v1.ts +34 -15
  423. package/src/runtime/messaging/packet-name.ts +8 -6
  424. package/src/runtime/messaging/payload-codec.ts +70 -50
  425. package/src/runtime/messaging/submission-result.ts +6 -9
  426. package/src/runtime/protocol/service_wire_codec.generated.ts +1376 -159
  427. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
  428. package/src/runtime/routing-id.ts +10 -7
  429. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +56 -62
  430. package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +23 -20
  431. package/src/runtime/spots/index.ts +593 -563
  432. package/src/runtime/spots/spot-activation-registry.ts +38 -34
  433. package/src/runtime/spots/spot-activation-state.ts +43 -51
  434. package/src/runtime/spots/spot-activation.ts +179 -116
  435. package/src/runtime/spots/spot-actor-admission-coordinator.ts +110 -78
  436. package/src/runtime/spots/spot-actor-join-dispatch.ts +57 -41
  437. package/src/runtime/spots/spot-actor-lifecycle-drain.ts +5 -7
  438. package/src/runtime/spots/spot-actor-membership.ts +25 -27
  439. package/src/runtime/spots/spot-actor-packet-dispatch.ts +184 -153
  440. package/src/runtime/spots/spot-actor-packet-drain.ts +54 -42
  441. package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +37 -39
  442. package/src/runtime/spots/spot-closing.ts +11 -12
  443. package/src/runtime/spots/spot-context.ts +46 -26
  444. package/src/runtime/spots/spot-entry-activation.ts +84 -65
  445. package/src/runtime/spots/spot-handle.ts +17 -15
  446. package/src/runtime/spots/spot-handler-registry.ts +44 -31
  447. package/src/runtime/spots/spot-location-claim.ts +5 -4
  448. package/src/runtime/spots/spot-manager-public.ts +62 -82
  449. package/src/runtime/spots/spot-native-actor-join-admission.ts +20 -16
  450. package/src/runtime/spots/spot-node-autoconnect.ts +54 -61
  451. package/src/runtime/spots/spot-node-runtime-manager.ts +230 -221
  452. package/src/runtime/spots/spot-outbound.ts +47 -59
  453. package/src/runtime/spots/spot-publisher-transport.ts +5 -4
  454. package/src/runtime/spots/spot-remote-codec.ts +66 -65
  455. package/src/runtime/spots/spot-remote-route-codec.ts +61 -41
  456. package/src/runtime/spots/spot-route-packet-dispatch.ts +128 -95
  457. package/src/runtime/spots/spot-route-replies.ts +23 -24
  458. package/src/runtime/spots/spot-route-reply-wire.ts +3 -2
  459. package/src/runtime/spots/spot-routed-actor-admission.ts +37 -27
  460. package/src/runtime/spots/spot-routed-bound-session-dispatch.ts +11 -17
  461. package/src/runtime/spots/spot-routed-frame-dispatch.ts +18 -15
  462. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +35 -26
  463. package/src/runtime/spots/spot-routing-internal.ts +1 -4
  464. package/src/runtime/spots/spot-runtime-ports.ts +5 -5
  465. package/src/runtime/spots/spot-serial-executor.ts +5 -9
  466. package/src/runtime/spots/spot-serial-turn-executor.ts +19 -26
  467. package/src/runtime/spots/spot-subscription-dispatch.ts +56 -46
  468. package/src/runtime/spots/spot-timer.ts +98 -91
  469. package/src/runtime/streams/actor-session-binding-registry.ts +277 -235
  470. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +7 -4
  471. package/src/runtime/streams/actor-session-lifecycle-coordinator.ts +3 -1
  472. package/src/runtime/streams/bound-actor-relay-sender.ts +53 -51
  473. package/src/runtime/streams/bound-session-response-target.ts +29 -8
  474. package/src/runtime/streams/bound-session-service.ts +39 -39
  475. package/src/runtime/streams/index.ts +176 -100
  476. package/src/runtime/streams/managed-stream.ts +98 -87
  477. package/src/runtime/streams/native-fallback-bound-session.ts +57 -52
  478. package/src/runtime/streams/protocol.ts +73 -43
  479. package/src/runtime/streams/session-actor-coordinator.ts +97 -89
  480. package/src/runtime/streams/session-calls.ts +2 -8
  481. package/src/runtime/streams/session-context.ts +66 -48
  482. package/src/runtime/streams/session-provider.ts +5 -7
  483. package/src/runtime/streams/session-serial-executor.ts +7 -6
  484. package/src/runtime/streams/stream-binding-runtime-ports.ts +79 -29
  485. package/src/runtime/streams/stream-frame-factory.ts +55 -38
  486. package/src/runtime/streams/stream-session-runtime.ts +268 -210
  487. package/src/runtime/workers/index.ts +68 -29
@@ -3,12 +3,7 @@ import { SmoothWeightedSelection } from './service-weighted-selection';
3
3
  import { SERVICE_WIRE_REQUIRED_CAPABILITY } from './service-wire-constants.generated';
4
4
 
5
5
  export type ServiceNodeState =
6
- | 'preparing'
7
- | 'serving'
8
- | 'retiring'
9
- | 'draining'
10
- | 'stopped'
11
- | 'error';
6
+ 'preparing' | 'serving' | 'retiring' | 'draining' | 'stopped' | 'error';
12
7
 
13
8
  export type ServiceObjectRole = 'none' | 'client' | 'server';
14
9
 
@@ -50,17 +45,9 @@ export interface ServicePeerAdmissionExpectation {
50
45
  }
51
46
 
52
47
  export type PeerAdmissionResult =
53
- | 'admitted'
54
- | 'notRequired'
55
- | 'meshMismatch'
56
- | 'invalidDescriptor'
57
- | 'staleDescriptor';
58
-
59
- export type ServiceObjectPlacementStatus =
60
- | 'available'
61
- | 'unsupported'
62
- | 'capacity'
63
- | 'unavailable';
48
+ 'admitted' | 'notRequired' | 'meshMismatch' | 'invalidDescriptor' | 'staleDescriptor';
49
+
50
+ export type ServiceObjectPlacementStatus = 'available' | 'unsupported' | 'capacity' | 'unavailable';
64
51
 
65
52
  const REQUIRED_CAPABILITY = SERVICE_WIRE_REQUIRED_CAPABILITY;
66
53
  const MAX_CAPACITY = 0x7fff_ffff;
@@ -90,9 +77,9 @@ export class ServiceTopologyRegistry {
90
77
  publishLocal(descriptor: ServiceNodeDescriptor): void {
91
78
  validateDescriptor(descriptor);
92
79
  if (
93
- descriptor.meshName !== this.local.meshName
94
- || descriptor.nodeRoutingId !== this.local.nodeRoutingId
95
- || descriptor.lifecycleGeneration !== this.local.lifecycleGeneration
80
+ descriptor.meshName !== this.local.meshName ||
81
+ descriptor.nodeRoutingId !== this.local.nodeRoutingId ||
82
+ descriptor.lifecycleGeneration !== this.local.lifecycleGeneration
96
83
  ) {
97
84
  throw new TypeError('Published descriptor changes the local node identity.');
98
85
  }
@@ -124,12 +111,11 @@ export class ServiceTopologyRegistry {
124
111
  if (descriptor.meshName !== this.local.meshName) return 'meshMismatch';
125
112
  if (descriptor.nodeRoutingId === this.local.nodeRoutingId) return 'invalidDescriptor';
126
113
  if (
127
- (expected?.endpoint !== undefined
128
- && descriptor.advertisedEndpoint !== expected.endpoint)
129
- || (expected?.securityIdentity !== undefined
130
- && descriptor.securityIdentity !== expected.securityIdentity)
131
- || (expected?.lifecycleGeneration !== undefined
132
- && descriptor.lifecycleGeneration !== expected.lifecycleGeneration)
114
+ (expected?.endpoint !== undefined && descriptor.advertisedEndpoint !== expected.endpoint) ||
115
+ (expected?.securityIdentity !== undefined &&
116
+ descriptor.securityIdentity !== expected.securityIdentity) ||
117
+ (expected?.lifecycleGeneration !== undefined &&
118
+ descriptor.lifecycleGeneration !== expected.lifecycleGeneration)
133
119
  ) {
134
120
  return 'invalidDescriptor';
135
121
  }
@@ -144,40 +130,35 @@ export class ServiceTopologyRegistry {
144
130
 
145
131
  const current = this.peersByRid.get(descriptor.nodeRoutingId);
146
132
  if (
147
- current !== undefined
148
- && current.descriptor.lifecycleGeneration === descriptor.lifecycleGeneration
149
- && descriptor.descriptorRevision > current.descriptor.descriptorRevision
150
- && !sameImmutableDescriptor(current.descriptor, descriptor)
133
+ current !== undefined &&
134
+ current.descriptor.lifecycleGeneration === descriptor.lifecycleGeneration &&
135
+ descriptor.descriptorRevision > current.descriptor.descriptorRevision &&
136
+ !sameImmutableDescriptor(current.descriptor, descriptor)
151
137
  ) {
152
138
  return 'invalidDescriptor';
153
139
  }
154
140
  if (
155
- current !== undefined
156
- && current.descriptor.lifecycleGeneration === descriptor.lifecycleGeneration
157
- && (
158
- current.descriptor.descriptorRevision > descriptor.descriptorRevision
159
- || (
160
- current.descriptor.descriptorRevision === descriptor.descriptorRevision
161
- && !sameServiceNodeDescriptor(current.descriptor, descriptor)
162
- )
163
- )
141
+ current !== undefined &&
142
+ current.descriptor.lifecycleGeneration === descriptor.lifecycleGeneration &&
143
+ (current.descriptor.descriptorRevision > descriptor.descriptorRevision ||
144
+ (current.descriptor.descriptorRevision === descriptor.descriptorRevision &&
145
+ !sameServiceNodeDescriptor(current.descriptor, descriptor)))
164
146
  ) {
165
147
  return 'staleDescriptor';
166
148
  }
167
149
  if (
168
- current !== undefined
169
- && current.descriptor.lifecycleGeneration === descriptor.lifecycleGeneration
170
- && current.descriptor.descriptorRevision === descriptor.descriptorRevision
171
- && sameServiceNodeDescriptor(current.descriptor, descriptor)
172
- && current.connectionId !== connectionId
150
+ current !== undefined &&
151
+ current.descriptor.lifecycleGeneration === descriptor.lifecycleGeneration &&
152
+ current.descriptor.descriptorRevision === descriptor.descriptorRevision &&
153
+ sameServiceNodeDescriptor(current.descriptor, descriptor) &&
154
+ current.connectionId !== connectionId &&
173
155
  // A fallback candidate is only a logical placeholder. Once the
174
156
  // monitor reports the physical connection, its evidence supersedes
175
157
  // candidate ordering so the request path uses the native route.
176
- && !(
177
- isUnmonitoredConnectionId(current.connectionId)
178
- && !isUnmonitoredConnectionId(connectionId)
179
- )
180
- && compareConnectionCandidate(
158
+ !(
159
+ isUnmonitoredConnectionId(current.connectionId) && !isUnmonitoredConnectionId(connectionId)
160
+ ) &&
161
+ compareConnectionCandidate(
181
162
  current.connectionDiscriminator,
182
163
  current.connectionId,
183
164
  connectionDiscriminator,
@@ -218,7 +199,9 @@ export class ServiceTopologyRegistry {
218
199
 
219
200
  private peersCore(): readonly AdmittedServicePeer[] {
220
201
  return [...this.peersByRid.values()]
221
- .sort((left, right) => compareOrdinal(left.descriptor.nodeRoutingId, right.descriptor.nodeRoutingId))
202
+ .sort((left, right) =>
203
+ compareOrdinal(left.descriptor.nodeRoutingId, right.descriptor.nodeRoutingId)
204
+ )
222
205
  .map(clonePeer);
223
206
  }
224
207
 
@@ -228,16 +211,14 @@ export class ServiceTopologyRegistry {
228
211
  .map(cloneDescriptor);
229
212
  }
230
213
 
231
- replaceDiscoveredNotRequired(
232
- descriptors: readonly ServiceNodeDescriptor[]
233
- ): void {
214
+ replaceDiscoveredNotRequired(descriptors: readonly ServiceNodeDescriptor[]): void {
234
215
  const next = new Map<string, ServiceNodeDescriptor>();
235
216
  for (const descriptor of descriptors) {
236
217
  validateDescriptor(descriptor);
237
218
  if (
238
- descriptor.meshName === this.local.meshName
239
- && descriptor.nodeRoutingId !== this.local.nodeRoutingId
240
- && descriptorConnectionNotRequired(this.local, descriptor)
219
+ descriptor.meshName === this.local.meshName &&
220
+ descriptor.nodeRoutingId !== this.local.nodeRoutingId &&
221
+ descriptorConnectionNotRequired(this.local, descriptor)
241
222
  ) {
242
223
  next.set(descriptor.nodeRoutingId, cloneDescriptor(descriptor));
243
224
  }
@@ -253,9 +234,9 @@ export class ServiceTopologyRegistry {
253
234
  markNotRequired(descriptor: ServiceNodeDescriptor): void {
254
235
  validateDescriptor(descriptor);
255
236
  if (
256
- descriptor.meshName !== this.local.meshName
257
- || descriptor.nodeRoutingId === this.local.nodeRoutingId
258
- || !descriptorConnectionNotRequired(this.local, descriptor)
237
+ descriptor.meshName !== this.local.meshName ||
238
+ descriptor.nodeRoutingId === this.local.nodeRoutingId ||
239
+ !descriptorConnectionNotRequired(this.local, descriptor)
259
240
  ) {
260
241
  return;
261
242
  }
@@ -271,21 +252,18 @@ export class ServiceTopologyRegistry {
271
252
 
272
253
  knownDescriptor(nodeRoutingId: string): ServiceNodeDescriptor | undefined {
273
254
  const admitted = this.peersByRid.get(nodeRoutingId)?.descriptor;
274
- const descriptor = admitted
275
- ?? this.notRequiredByRid.get(nodeRoutingId)
276
- ?? this.knownByRid.get(nodeRoutingId);
255
+ const descriptor =
256
+ admitted ?? this.notRequiredByRid.get(nodeRoutingId) ?? this.knownByRid.get(nodeRoutingId);
277
257
  return descriptor === undefined ? undefined : cloneDescriptor(descriptor);
278
258
  }
279
259
 
280
260
  private remember(descriptor: ServiceNodeDescriptor): void {
281
261
  const current = this.knownByRid.get(descriptor.nodeRoutingId);
282
262
  if (
283
- current === undefined
284
- || descriptor.lifecycleGeneration !== current.lifecycleGeneration
285
- || (
286
- descriptor.lifecycleGeneration === current.lifecycleGeneration
287
- && descriptor.descriptorRevision >= current.descriptorRevision
288
- )
263
+ current === undefined ||
264
+ descriptor.lifecycleGeneration !== current.lifecycleGeneration ||
265
+ (descriptor.lifecycleGeneration === current.lifecycleGeneration &&
266
+ descriptor.descriptorRevision >= current.descriptorRevision)
289
267
  ) {
290
268
  this.knownByRid.set(descriptor.nodeRoutingId, cloneDescriptor(descriptor));
291
269
  }
@@ -304,23 +282,28 @@ export class ServiceTopologyRegistry {
304
282
  connectionId: 'local',
305
283
  connectionDiscriminator: 'local'
306
284
  };
307
- return [local, ...this.peersByRid.values()].map(peer => ({
308
- peer: clonePeer(peer),
309
- channel: findChannel(peer.descriptor, channelName)
310
- })).filter((value): value is {
311
- peer: AdmittedServicePeer;
312
- channel: ServiceChannelDescriptor;
313
- } => value.channel !== undefined
314
- && value.peer.descriptor.state === 'serving'
315
- && value.channel.weight > 0);
285
+ return [local, ...this.peersByRid.values()]
286
+ .map((peer) => ({
287
+ peer: clonePeer(peer),
288
+ channel: findChannel(peer.descriptor, channelName)
289
+ }))
290
+ .filter(
291
+ (
292
+ value
293
+ ): value is {
294
+ peer: AdmittedServicePeer;
295
+ channel: ServiceChannelDescriptor;
296
+ } =>
297
+ value.channel !== undefined &&
298
+ value.peer.descriptor.state === 'serving' &&
299
+ value.channel.weight > 0
300
+ );
316
301
  },
317
- value => value.channel.weight,
318
- value => value.peer.descriptor.nodeRoutingId,
319
- (left, right) => compareOrdinal(
320
- left.peer.descriptor.nodeRoutingId,
321
- right.peer.descriptor.nodeRoutingId
322
- ),
323
- value => isReady(value.peer)
302
+ (value) => value.channel.weight,
303
+ (value) => value.peer.descriptor.nodeRoutingId,
304
+ (left, right) =>
305
+ compareOrdinal(left.peer.descriptor.nodeRoutingId, right.peer.descriptor.nodeRoutingId),
306
+ (value) => isReady(value.peer)
324
307
  )?.peer;
325
308
  }
326
309
 
@@ -329,17 +312,23 @@ export class ServiceTopologyRegistry {
329
312
  ): AdmittedServicePeer | undefined {
330
313
  return this.selectWeightedCycle(
331
314
  'placement',
332
- () => [...this.peersByRid.values()].filter(peer => {
333
- const descriptor = peer.descriptor;
334
- return descriptor.state === 'serving'
335
- && descriptor.objectRole === 'server'
336
- && descriptor.placementWeight > 0
337
- && descriptor.activeCapacityUsed < descriptor.activeCapacityLimit
338
- && descriptor.pendingCapacityUsed < descriptor.pendingCapacityLimit;
339
- }).map(clonePeer),
340
- peer => peer.descriptor.placementWeight,
341
- peer => peer.descriptor.nodeRoutingId,
342
- (left, right) => compareOrdinal(left.descriptor.nodeRoutingId, right.descriptor.nodeRoutingId),
315
+ () =>
316
+ [...this.peersByRid.values()]
317
+ .filter((peer) => {
318
+ const descriptor = peer.descriptor;
319
+ return (
320
+ descriptor.state === 'serving' &&
321
+ descriptor.objectRole === 'server' &&
322
+ descriptor.placementWeight > 0 &&
323
+ descriptor.activeCapacityUsed < descriptor.activeCapacityLimit &&
324
+ descriptor.pendingCapacityUsed < descriptor.pendingCapacityLimit
325
+ );
326
+ })
327
+ .map(clonePeer),
328
+ (peer) => peer.descriptor.placementWeight,
329
+ (peer) => peer.descriptor.nodeRoutingId,
330
+ (left, right) =>
331
+ compareOrdinal(left.descriptor.nodeRoutingId, right.descriptor.nodeRoutingId),
343
332
  isReady
344
333
  );
345
334
  }
@@ -353,19 +342,21 @@ export class ServiceTopologyRegistry {
353
342
  `object:${stableType}`,
354
343
  () => {
355
344
  const capability = `object-type:${stableType}`;
356
- return [this.local, ...this.peersByRid.values()].map(value =>
357
- 'descriptor' in value ? value.descriptor : value
358
- ).filter(descriptor =>
359
- descriptor.state === 'serving'
360
- && descriptor.objectRole === 'server'
361
- && descriptor.placementWeight > 0
362
- && descriptor.activeCapacityUsed < descriptor.activeCapacityLimit
363
- && descriptor.pendingCapacityUsed < descriptor.pendingCapacityLimit
364
- && descriptor.protocolCapabilities.includes(capability)
365
- ).map(cloneDescriptor);
345
+ return [this.local, ...this.peersByRid.values()]
346
+ .map((value) => ('descriptor' in value ? value.descriptor : value))
347
+ .filter(
348
+ (descriptor) =>
349
+ descriptor.state === 'serving' &&
350
+ descriptor.objectRole === 'server' &&
351
+ descriptor.placementWeight > 0 &&
352
+ descriptor.activeCapacityUsed < descriptor.activeCapacityLimit &&
353
+ descriptor.pendingCapacityUsed < descriptor.pendingCapacityLimit &&
354
+ descriptor.protocolCapabilities.includes(capability)
355
+ )
356
+ .map(cloneDescriptor);
366
357
  },
367
- descriptor => descriptor.placementWeight,
368
- descriptor => descriptor.nodeRoutingId,
358
+ (descriptor) => descriptor.placementWeight,
359
+ (descriptor) => descriptor.nodeRoutingId,
369
360
  (left, right) => compareOrdinal(left.nodeRoutingId, right.nodeRoutingId),
370
361
  isReady
371
362
  );
@@ -377,37 +368,41 @@ export class ServiceTopologyRegistry {
377
368
  ): ServiceObjectPlacementStatus {
378
369
  requireText(stableType, 'stableType');
379
370
  const capability = `object-type:${stableType}`;
380
- const supported = [this.local, ...[...this.peersByRid.values()].map(peer => peer.descriptor)]
381
- .filter(descriptor =>
382
- descriptor.state === 'serving'
383
- && descriptor.objectRole === 'server'
384
- && descriptor.protocolCapabilities.includes(capability)
385
- );
371
+ const supported = [
372
+ this.local,
373
+ ...[...this.peersByRid.values()].map((peer) => peer.descriptor)
374
+ ].filter(
375
+ (descriptor) =>
376
+ descriptor.state === 'serving' &&
377
+ descriptor.objectRole === 'server' &&
378
+ descriptor.protocolCapabilities.includes(capability)
379
+ );
386
380
  if (supported.length === 0) return 'unsupported';
387
- const withCapacity = supported.filter(descriptor =>
388
- descriptor.activeCapacityUsed < descriptor.activeCapacityLimit
389
- && descriptor.pendingCapacityUsed < descriptor.pendingCapacityLimit
381
+ const withCapacity = supported.filter(
382
+ (descriptor) =>
383
+ descriptor.activeCapacityUsed < descriptor.activeCapacityLimit &&
384
+ descriptor.pendingCapacityUsed < descriptor.pendingCapacityLimit
390
385
  );
391
386
  if (withCapacity.length === 0) return 'capacity';
392
- const weighted = withCapacity.filter(descriptor => descriptor.placementWeight > 0);
387
+ const weighted = withCapacity.filter((descriptor) => descriptor.placementWeight > 0);
393
388
  if (weighted.length === 0) return 'unsupported';
394
389
  return weighted.some(isReady) ? 'available' : 'unavailable';
395
390
  }
396
391
 
397
392
  instanceSpotPlacementTypes(): readonly string[] {
398
393
  const prefix = 'instance-spot-type:';
399
- return [...new Set([
400
- this.local,
401
- ...this.peersCore().map(peer => peer.descriptor)
402
- ]
403
- .filter(descriptor =>
404
- descriptor.state === 'serving'
405
- && descriptor.objectRole === 'server')
406
- .flatMap(descriptor => descriptor.protocolCapabilities)
407
- .filter(capability => capability.startsWith(prefix))
408
- .map(capability => capability.slice(prefix.length))
409
- .filter(stableType => stableType.length > 0))]
410
- .sort();
394
+ return [
395
+ ...new Set(
396
+ [this.local, ...this.peersCore().map((peer) => peer.descriptor)]
397
+ .filter(
398
+ (descriptor) => descriptor.state === 'serving' && descriptor.objectRole === 'server'
399
+ )
400
+ .flatMap((descriptor) => descriptor.protocolCapabilities)
401
+ .filter((capability) => capability.startsWith(prefix))
402
+ .map((capability) => capability.slice(prefix.length))
403
+ .filter((stableType) => stableType.length > 0)
404
+ )
405
+ ].sort();
411
406
  }
412
407
 
413
408
  private selectWeightedCycle<T>(
@@ -420,17 +415,19 @@ export class ServiceTopologyRegistry {
420
415
  ): T | undefined {
421
416
  let entry = this.selections.get(key);
422
417
  if (entry === undefined) {
423
- const selection = new SmoothWeightedSelection<unknown>(() => eligible()
424
- .map(value => ({
425
- value,
426
- id: identity(value),
427
- weight: weight(value)
428
- }))
429
- .sort((left, right) => compare(left.value as T, right.value as T)));
418
+ const selection = new SmoothWeightedSelection<unknown>(() =>
419
+ eligible()
420
+ .map((value) => ({
421
+ value,
422
+ id: identity(value),
423
+ weight: weight(value)
424
+ }))
425
+ .sort((left, right) => compare(left.value as T, right.value as T))
426
+ );
430
427
  entry = { selection };
431
428
  this.selections.set(key, entry);
432
429
  }
433
- return entry.selection.select(value => accept(value as T)) as T | undefined;
430
+ return entry.selection.select((value) => accept(value as T)) as T | undefined;
434
431
  }
435
432
 
436
433
  private rebuildSelections(): void {
@@ -446,9 +443,7 @@ export function validateDescriptor(descriptor: ServiceNodeDescriptor): void {
446
443
  if (descriptor.lifecycleGeneration <= 0n || descriptor.descriptorRevision <= 0n) {
447
444
  throw new RangeError('Lifecycle generation and descriptor revision must be non-zero.');
448
445
  }
449
- if (
450
- descriptor.applicationVersion < 0n
451
- ) {
446
+ if (descriptor.applicationVersion < 0n) {
452
447
  throw new RangeError('Descriptor application version is invalid.');
453
448
  }
454
449
  if (descriptor.maintenanceWave !== undefined) {
@@ -463,14 +458,14 @@ export function validateDescriptor(descriptor: ServiceNodeDescriptor): void {
463
458
  validateCapacity(descriptor.activeCapacityUsed, true, 'activeCapacityUsed');
464
459
  validateCapacity(descriptor.pendingCapacityUsed, true, 'pendingCapacityUsed');
465
460
  if (
466
- descriptor.activeCapacityUsed > descriptor.activeCapacityLimit
467
- || descriptor.pendingCapacityUsed > descriptor.pendingCapacityLimit
461
+ descriptor.activeCapacityUsed > descriptor.activeCapacityLimit ||
462
+ descriptor.pendingCapacityUsed > descriptor.pendingCapacityLimit
468
463
  ) {
469
464
  throw new RangeError('Descriptor capacity use exceeds its limit.');
470
465
  }
471
466
  validateSortedUnique(
472
467
  descriptor.channels,
473
- channel => {
468
+ (channel) => {
474
469
  requireText(channel.name, 'channel.name');
475
470
  validatePublicWeight(channel.weight, 'channel.weight');
476
471
  return channel.name;
@@ -479,7 +474,7 @@ export function validateDescriptor(descriptor: ServiceNodeDescriptor): void {
479
474
  );
480
475
  validateSortedUnique(
481
476
  descriptor.protocolCapabilities,
482
- capability => {
477
+ (capability) => {
483
478
  requireText(capability, 'protocol capability');
484
479
  return capability;
485
480
  },
@@ -521,7 +516,7 @@ function findChannel(
521
516
  descriptor: ServiceNodeDescriptor,
522
517
  channelName: string
523
518
  ): ServiceChannelDescriptor | undefined {
524
- return descriptor.channels.find(channel => channel.name === channelName);
519
+ return descriptor.channels.find((channel) => channel.name === channelName);
525
520
  }
526
521
 
527
522
  function requireText(value: string, field: string): void {
@@ -533,7 +528,7 @@ function requireText(value: string, field: string): void {
533
528
  function cloneDescriptor(descriptor: ServiceNodeDescriptor): ServiceNodeDescriptor {
534
529
  return {
535
530
  ...descriptor,
536
- channels: descriptor.channels.map(channel => ({ ...channel })),
531
+ channels: descriptor.channels.map((channel) => ({ ...channel })),
537
532
  protocolCapabilities: [...descriptor.protocolCapabilities]
538
533
  };
539
534
  }
@@ -546,7 +541,10 @@ function clonePeer(peer: AdmittedServicePeer): AdmittedServicePeer {
546
541
  };
547
542
  }
548
543
 
549
- export function sameServiceNodeDescriptor(left: ServiceNodeDescriptor, right: ServiceNodeDescriptor): boolean {
544
+ export function sameServiceNodeDescriptor(
545
+ left: ServiceNodeDescriptor,
546
+ right: ServiceNodeDescriptor
547
+ ): boolean {
550
548
  return JSON.stringify(toComparable(left)) === JSON.stringify(toComparable(right));
551
549
  }
552
550
 
@@ -554,21 +552,21 @@ function sameImmutableDescriptor(
554
552
  left: ServiceNodeDescriptor,
555
553
  right: ServiceNodeDescriptor
556
554
  ): boolean {
557
- return left.advertisedEndpoint === right.advertisedEndpoint
558
- && left.securityIdentity === right.securityIdentity
559
- && left.applicationVersion === right.applicationVersion
560
- && arraysEqual(left.protocolCapabilities, right.protocolCapabilities)
561
- && left.objectRole === right.objectRole
562
- && left.activeCapacityLimit === right.activeCapacityLimit
563
- && left.pendingCapacityLimit === right.pendingCapacityLimit
564
- && left.channels.length === right.channels.length
565
- && left.channels.every((channel, index) =>
566
- channel.name === right.channels[index]?.name);
555
+ return (
556
+ left.advertisedEndpoint === right.advertisedEndpoint &&
557
+ left.securityIdentity === right.securityIdentity &&
558
+ left.applicationVersion === right.applicationVersion &&
559
+ arraysEqual(left.protocolCapabilities, right.protocolCapabilities) &&
560
+ left.objectRole === right.objectRole &&
561
+ left.activeCapacityLimit === right.activeCapacityLimit &&
562
+ left.pendingCapacityLimit === right.pendingCapacityLimit &&
563
+ left.channels.length === right.channels.length &&
564
+ left.channels.every((channel, index) => channel.name === right.channels[index]?.name)
565
+ );
567
566
  }
568
567
 
569
568
  function arraysEqual(left: readonly string[], right: readonly string[]): boolean {
570
- return left.length === right.length
571
- && left.every((value, index) => value === right[index]);
569
+ return left.length === right.length && left.every((value, index) => value === right[index]);
572
570
  }
573
571
 
574
572
  function isUnmonitoredConnectionId(connectionId: string): boolean {
@@ -59,9 +59,7 @@ export class SmoothWeightedSelection<T> {
59
59
  for (let attempts = 0; attempts < this.plan.values.length; attempts += 1) {
60
60
  const cursor = this.plan.cursor;
61
61
  const selected = this.plan.values[cursor]!;
62
- const nextCursor = cursor + 1 < this.plan.values.length
63
- ? cursor + 1
64
- : this.plan.cycleStart;
62
+ const nextCursor = cursor + 1 < this.plan.values.length ? cursor + 1 : this.plan.cycleStart;
65
63
  this.plan.cursor = nextCursor;
66
64
  if (accept(selected)) return selected;
67
65
  }
@@ -73,17 +71,14 @@ function buildSelectionPlan<T>(
73
71
  eligible: readonly ServiceWeightedSelectionCandidate<T>[],
74
72
  current: Map<string, bigint>
75
73
  ): SelectionPlan<T> {
76
- const candidates: readonly WeightedCandidate<T>[] = eligible.map(candidate => ({
74
+ const candidates: readonly WeightedCandidate<T>[] = eligible.map((candidate) => ({
77
75
  ...candidate,
78
76
  weight: BigInt(candidate.weight)
79
77
  }));
80
78
  const total = candidates.reduce((sum, candidate) => sum + candidate.weight, 0n);
81
79
  replaceState(
82
80
  current,
83
- new Map(candidates.map(candidate => [
84
- candidate.id,
85
- current.get(candidate.id) ?? 0n
86
- ]))
81
+ new Map(candidates.map((candidate) => [candidate.id, current.get(candidate.id) ?? 0n]))
87
82
  );
88
83
  if (total === 0n) return emptyCycle();
89
84
 
@@ -93,12 +88,14 @@ function buildSelectionPlan<T>(
93
88
  const working = new Map(current);
94
89
  const startedAt = performance.now();
95
90
  for (;;) {
96
- if (values.length >= MAX_CYCLE_SEARCH_STEPS
97
- || performance.now() - startedAt >= MAX_CYCLE_SEARCH_MS) {
91
+ if (
92
+ values.length >= MAX_CYCLE_SEARCH_STEPS ||
93
+ performance.now() - startedAt >= MAX_CYCLE_SEARCH_MS
94
+ ) {
98
95
  return { kind: 'direct', candidates };
99
96
  }
100
97
  const stateKey = candidates
101
- .map(candidate => `${candidate.id}\u0000${working.get(candidate.id) ?? 0n}`)
98
+ .map((candidate) => `${candidate.id}\u0000${working.get(candidate.id) ?? 0n}`)
102
99
  .join('\u0001');
103
100
  const cycleStart = seen.get(stateKey);
104
101
  if (cycleStart !== undefined) {
@@ -157,10 +154,7 @@ function selectDirect<T>(
157
154
  return selected.value;
158
155
  }
159
156
 
160
- function replaceState(
161
- target: Map<string, bigint>,
162
- source: ReadonlyMap<string, bigint>
163
- ): void {
157
+ function replaceState(target: Map<string, bigint>, source: ReadonlyMap<string, bigint>): void {
164
158
  target.clear();
165
159
  for (const [key, value] of source) target.set(key, value);
166
160
  }
@@ -1,8 +1,5 @@
1
1
  import type { RoutingId } from '../../contracts';
2
- import {
3
- decodeRoutingId,
4
- encodeRoutingIdStorageHex
5
- } from '../routing-id';
2
+ import { decodeRoutingId, encodeRoutingIdStorageHex } from '../routing-id';
6
3
 
7
4
  export type ServiceWireInvalid = (message: string) => never;
8
5
 
@@ -15,10 +12,10 @@ export function encodeCanonicalServiceWireText(
15
12
  ): Buffer {
16
13
  const bytes = Buffer.from(value, 'utf8');
17
14
  if (
18
- bytes.byteLength < 1
19
- || bytes.byteLength > maximumBytes
20
- || value.includes('\0')
21
- || bytes.toString('utf8') !== value
15
+ bytes.byteLength < 1 ||
16
+ bytes.byteLength > maximumBytes ||
17
+ value.includes('\0') ||
18
+ bytes.toString('utf8') !== value
22
19
  ) {
23
20
  invalid(`${field} must be 1..${maximumBytes} canonical UTF-8 bytes without NUL.`);
24
21
  }
@@ -33,10 +30,7 @@ export function decodeCanonicalServiceWireText(
33
30
  ): string {
34
31
  const encoded = Buffer.from(bytes);
35
32
  const value = encoded.toString('utf8');
36
- if (
37
- value.includes('\0')
38
- || !Buffer.from(value, 'utf8').equals(encoded)
39
- ) {
33
+ if (value.includes('\0') || !Buffer.from(value, 'utf8').equals(encoded)) {
40
34
  invalid(`${field} is not canonical UTF-8 without NUL.`);
41
35
  }
42
36
  return value;