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