@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
@@ -70,12 +70,8 @@ import {
70
70
  type ServiceStatefulPendingOperation,
71
71
  type ServiceStatefulResult
72
72
  } from '../../foundation/service-stateful-runtime';
73
- import type {
74
- ServiceActorRef,
75
- ServiceSpotState
76
- } from '../../foundation/service-stateful-registry';
77
- import { serviceSessionBindingIngressPortIfRegistered } from
78
- '../../foundation/service-session-binding-ingress-port';
73
+ import type { ServiceActorRef, ServiceSpotState } from '../../foundation/service-stateful-registry';
74
+ import { serviceSessionBindingIngressPortIfRegistered } from '../../foundation/service-session-binding-ingress-port';
79
75
  import type {
80
76
  ServiceActorCreateRecord,
81
77
  ServiceDirectSpotRouteFence,
@@ -87,9 +83,7 @@ import type {
87
83
  ServiceUserSpotCreateRecord
88
84
  } from '../../foundation/service-stateful-wire-codec';
89
85
  import { encodeServiceMetadataFrame } from '../../foundation/service-metadata-codec';
90
- import type {
91
- ServiceInstanceActivationRecoveryEnvelope
92
- } from '../../foundation/service-instance-activation-recovery-codec';
86
+ import type { ServiceInstanceActivationRecoveryEnvelope } from '../../foundation/service-instance-activation-recovery-codec';
93
87
  import type {
94
88
  ServiceMailboxClaim,
95
89
  ServiceMailboxDomain,
@@ -101,8 +95,7 @@ import type {
101
95
  } from '../../foundation/service-topology-registry';
102
96
  import type { RoutingId } from '../../../contracts';
103
97
  import { buildAdvertisedEndpoint } from '../../../contracts/Configuration/EndpointNotation';
104
- import { ZLinkConfigurationException } from
105
- '../../../contracts/Configuration/ConfigurationException';
98
+ import { ZLinkConfigurationException } from '../../../contracts/Configuration/ConfigurationException';
106
99
  import type {
107
100
  ZLinkBackendActorRef,
108
101
  ZLinkBackendActorSessionSendFence,
@@ -135,11 +128,14 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
135
128
  readonly nativeInstance = this;
136
129
 
137
130
  private readonly channels = new Map<string, number>();
138
- private readonly peerIntents = new Map<bigint, {
139
- readonly endpoint: string;
140
- readonly nodeRoutingId?: string;
141
- readonly lifecycleGeneration?: bigint;
142
- }>();
131
+ private readonly peerIntents = new Map<
132
+ bigint,
133
+ {
134
+ readonly endpoint: string;
135
+ readonly nodeRoutingId?: string;
136
+ readonly lifecycleGeneration?: bigint;
137
+ }
138
+ >();
143
139
  private readonly completions: Array<PendingCompletion | undefined> = [];
144
140
  private completionHead = 0;
145
141
  private completionCount = 0;
@@ -209,10 +205,7 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
209
205
  }): void {
210
206
  this.requireNotStarted();
211
207
  this.objectRole = options.role;
212
- this.placementWeight = requirePublicWeight(
213
- options.placementWeight,
214
- 'placementWeight'
215
- );
208
+ this.placementWeight = requirePublicWeight(options.placementWeight, 'placementWeight');
216
209
  this.activeCapacityLimit = requirePositivePlacementValue(
217
210
  options.activeCapacityLimit,
218
211
  'activeCapacityLimit'
@@ -225,20 +218,24 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
225
218
  this.maintenanceWave = options.maintenanceWave;
226
219
  }
227
220
 
228
- setMailboxRecordDroppedHandler(handler: (record: {
229
- readonly kind: 'spot_multicast' | 'actor_control' | 'actor_binding';
230
- readonly owner: string;
231
- }) => void): void {
221
+ setMailboxRecordDroppedHandler(
222
+ handler: (record: {
223
+ readonly kind: 'spot_multicast' | 'actor_control' | 'actor_binding';
224
+ readonly owner: string;
225
+ }) => void
226
+ ): void {
232
227
  this.mailboxRecordDropped = handler;
233
228
  this.stateful?.setMailboxDropHandler(handler);
234
229
  }
235
230
 
236
- setProtocolErrorHandler(handler: (record: {
237
- readonly sourceNodeRid: string;
238
- readonly request: boolean;
239
- readonly replied: boolean;
240
- readonly command?: number;
241
- }) => void): void {
231
+ setProtocolErrorHandler(
232
+ handler: (record: {
233
+ readonly sourceNodeRid: string;
234
+ readonly request: boolean;
235
+ readonly replied: boolean;
236
+ readonly command?: number;
237
+ }) => void
238
+ ): void {
242
239
  this.protocolError = handler;
243
240
  }
244
241
 
@@ -251,14 +248,16 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
251
248
  const localNodeRid = runtime.topology.localDescriptor().nodeRoutingId;
252
249
  const status = runtime.topology.objectPlacementStatus(
253
250
  stableType,
254
- candidate => candidate.nodeRoutingId === localNodeRid
255
- || runtime.isPeerRouteReady(candidate.nodeRoutingId)
251
+ (candidate) =>
252
+ candidate.nodeRoutingId === localNodeRid ||
253
+ runtime.isPeerRouteReady(candidate.nodeRoutingId)
256
254
  );
257
255
  if (status !== 'available') return { kind: status };
258
256
  const descriptor = runtime.topology.selectObjectPlacement(
259
257
  stableType,
260
- candidate => candidate.nodeRoutingId === localNodeRid
261
- || runtime.isPeerRouteReady(candidate.nodeRoutingId)
258
+ (candidate) =>
259
+ candidate.nodeRoutingId === localNodeRid ||
260
+ runtime.isPeerRouteReady(candidate.nodeRoutingId)
262
261
  );
263
262
  return descriptor === undefined
264
263
  ? { kind: 'unavailable' }
@@ -333,33 +332,32 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
333
332
  start(): void {
334
333
  if (this.runtime !== undefined) return;
335
334
  if (this.closed) throw new Error('MeshNode is closed.');
336
- if (this.bindEndpoint === undefined) throw new Error('MeshNode bind endpoint is not configured.');
335
+ if (this.bindEndpoint === undefined)
336
+ throw new Error('MeshNode bind endpoint is not configured.');
337
337
  const descriptor = this.createDescriptor();
338
338
  const runtime = new RawServiceMeshRuntime({
339
339
  descriptor,
340
- resolveAdvertisedEndpoint: boundEndpoint =>
341
- this.resolveAdvertisedEndpoint(boundEndpoint),
340
+ resolveAdvertisedEndpoint: (boundEndpoint) => this.resolveAdvertisedEndpoint(boundEndpoint),
342
341
  bindingPort: this.bindingPort,
343
342
  applicationJobQueue: this.requireApplicationJobQueue(),
344
343
  peerAdmissionSealed: this.peerAdmissionSealed,
345
344
  onReceiveFlowConfigFailure: this.applicationJobReceiveFlowFailureSink,
346
- onMailboxReady: (domain) => this.readyHandler?.(
347
- domain === 'application' ? ReadyDomain.Application : ReadyDomain.Infrastructure
348
- ),
349
- onProtocolError: (record) => this.protocolError?.({
350
- sourceNodeRid: record.sourceRoutingId,
351
- request: record.request,
352
- replied: record.replied,
353
- ...(record.command === undefined ? {} : { command: record.command })
354
- }),
345
+ onMailboxReady: (domain) =>
346
+ this.readyHandler?.(
347
+ domain === 'application' ? ReadyDomain.Application : ReadyDomain.Infrastructure
348
+ ),
349
+ onProtocolError: (record) =>
350
+ this.protocolError?.({
351
+ sourceNodeRid: record.sourceRoutingId,
352
+ request: record.request,
353
+ replied: record.replied,
354
+ ...(record.command === undefined ? {} : { command: record.command })
355
+ }),
355
356
  onPeerNotRequired: (nodeRoutingId, endpoint) => {
356
357
  for (const [intent, peer] of this.peerIntents) {
357
358
  if (
358
- (
359
- peer.nodeRoutingId === undefined
360
- || peer.nodeRoutingId === nodeRoutingId
361
- )
362
- && peer.endpoint === endpoint
359
+ (peer.nodeRoutingId === undefined || peer.nodeRoutingId === nodeRoutingId) &&
360
+ peer.endpoint === endpoint
363
361
  ) {
364
362
  this.peerIntents.delete(intent);
365
363
  }
@@ -368,8 +366,8 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
368
366
  onPeerDisconnected: (nodeRoutingId, endpoint) => {
369
367
  for (const [intentId, peer] of this.peerIntents) {
370
368
  if (
371
- peer.endpoint === endpoint
372
- && (peer.nodeRoutingId === undefined || peer.nodeRoutingId === nodeRoutingId)
369
+ peer.endpoint === endpoint &&
370
+ (peer.nodeRoutingId === undefined || peer.nodeRoutingId === nodeRoutingId)
373
371
  ) {
374
372
  this.peerIntents.delete(intentId);
375
373
  }
@@ -397,9 +395,11 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
397
395
  this.scheduleMaintenance();
398
396
  }
399
397
 
400
- setMessageFollowHandler(handler: (
401
- record: import('../../foundation/service-stateful-wire-codec').ServiceMessageFollowRecord
402
- ) => void): void {
398
+ setMessageFollowHandler(
399
+ handler: (
400
+ record: import('../../foundation/service-stateful-wire-codec').ServiceMessageFollowRecord
401
+ ) => void
402
+ ): void {
403
403
  this.messageFollowHandler = handler;
404
404
  }
405
405
 
@@ -470,27 +470,27 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
470
470
  readonly expectedLifecycleGeneration?: bigint;
471
471
  }): Promise<bigint> {
472
472
  const runtime = this.requireRuntime();
473
- const nodeRoutingId = options.expectedRid === undefined
474
- ? undefined
475
- : String(options.expectedRid);
473
+ const nodeRoutingId =
474
+ options.expectedRid === undefined ? undefined : String(options.expectedRid);
476
475
  if (nodeRoutingId === undefined) {
477
476
  runtime.connectPeerEndpoint(options.endpoint);
478
477
  } else {
479
478
  runtime.connectPeerByRoutingId(
480
479
  options.endpoint,
481
480
  nodeRoutingId,
482
- options.expectedSecurityIdentity
483
- ?? runtime.topology.localDescriptor().securityIdentity,
481
+ options.expectedSecurityIdentity ?? runtime.topology.localDescriptor().securityIdentity,
484
482
  options.expectedLifecycleGeneration
485
483
  );
486
484
  }
487
485
  const intent = this.nextPeerIntent++;
488
486
  this.peerIntents.set(intent, {
489
487
  endpoint: options.endpoint,
490
- ...(nodeRoutingId === undefined ? {} : {
491
- nodeRoutingId,
492
- lifecycleGeneration: options.expectedLifecycleGeneration
493
- })
488
+ ...(nodeRoutingId === undefined
489
+ ? {}
490
+ : {
491
+ nodeRoutingId,
492
+ lifecycleGeneration: options.expectedLifecycleGeneration
493
+ })
494
494
  });
495
495
  if (nodeRoutingId !== undefined) await runtime.announcePeer(nodeRoutingId);
496
496
  return intent;
@@ -528,27 +528,19 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
528
528
  disconnectPeer(peerRid: unknown, lifecycleGeneration: bigint): void {
529
529
  const nodeRoutingId = String(peerRid);
530
530
  const admitted = this.runtime?.topology.peer(nodeRoutingId);
531
- if (
532
- admitted !== undefined
533
- && admitted.descriptor.lifecycleGeneration !== lifecycleGeneration
534
- ) {
531
+ if (admitted !== undefined && admitted.descriptor.lifecycleGeneration !== lifecycleGeneration) {
535
532
  return;
536
533
  }
537
534
  const admittedEndpoint = admitted?.descriptor.advertisedEndpoint;
538
- const found = [...this.peerIntents.entries()]
539
- .find(([, intent]) =>
540
- (
541
- intent.nodeRoutingId === nodeRoutingId
542
- && (
543
- intent.lifecycleGeneration === undefined
544
- || intent.lifecycleGeneration === lifecycleGeneration
545
- )
546
- )
547
- || (
548
- intent.nodeRoutingId === undefined
549
- && admittedEndpoint !== undefined
550
- && intent.endpoint === admittedEndpoint
551
- ));
535
+ const found = [...this.peerIntents.entries()].find(
536
+ ([, intent]) =>
537
+ (intent.nodeRoutingId === nodeRoutingId &&
538
+ (intent.lifecycleGeneration === undefined ||
539
+ intent.lifecycleGeneration === lifecycleGeneration)) ||
540
+ (intent.nodeRoutingId === undefined &&
541
+ admittedEndpoint !== undefined &&
542
+ intent.endpoint === admittedEndpoint)
543
+ );
552
544
  if (found === undefined) {
553
545
  if (admitted !== undefined) {
554
546
  this.runtime?.disconnectPeer(
@@ -562,22 +554,26 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
562
554
  this.removePeerConnection(found[0]);
563
555
  }
564
556
 
565
- replaceDiscoveredNotRequiredPeers(peers: readonly {
566
- readonly nodeRoutingId: string;
567
- readonly lifecycleGeneration: bigint;
568
- readonly descriptorRevision: bigint;
569
- readonly endpoint: string;
570
- }[]): void {
557
+ replaceDiscoveredNotRequiredPeers(
558
+ peers: readonly {
559
+ readonly nodeRoutingId: string;
560
+ readonly lifecycleGeneration: bigint;
561
+ readonly descriptorRevision: bigint;
562
+ readonly endpoint: string;
563
+ }[]
564
+ ): void {
571
565
  const local = this.requireRuntime().topology.localDescriptor();
572
- this.requireRuntime().replaceDiscoveredNotRequired(peers.map(peer => ({
573
- ...local,
574
- nodeRoutingId: peer.nodeRoutingId,
575
- lifecycleGeneration: peer.lifecycleGeneration,
576
- descriptorRevision: peer.descriptorRevision,
577
- advertisedEndpoint: peer.endpoint,
578
- channels: [],
579
- objectRole: 'client'
580
- })));
566
+ this.requireRuntime().replaceDiscoveredNotRequired(
567
+ peers.map((peer) => ({
568
+ ...local,
569
+ nodeRoutingId: peer.nodeRoutingId,
570
+ lifecycleGeneration: peer.lifecycleGeneration,
571
+ descriptorRevision: peer.descriptorRevision,
572
+ advertisedEndpoint: peer.endpoint,
573
+ channels: [],
574
+ objectRole: 'client'
575
+ }))
576
+ );
581
577
  }
582
578
 
583
579
  isObjectClientNodeDirectTarget(targetRid: unknown): boolean {
@@ -592,30 +588,36 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
592
588
  targetRid: unknown,
593
589
  parts: MessageLike | readonly MessageLike[]
594
590
  ): Promise<SubmitResultValue> {
595
- return await this.requireRuntime().sendToNode(
591
+ return (await this.requireRuntime().sendToNode(
596
592
  String(targetRid),
597
593
  encodeMultipartApplicationFrame(parts)
598
- ) ? SubmitResult.Ok : SubmitResult.NotConnected;
594
+ ))
595
+ ? SubmitResult.Ok
596
+ : SubmitResult.NotConnected;
599
597
  }
600
598
 
601
599
  async sendInfrastructureControl(
602
600
  targetRid: unknown,
603
601
  record: Uint8Array | readonly Uint8Array[]
604
602
  ): Promise<SubmitResultValue> {
605
- return await this.requireRuntime().sendService(
603
+ return (await this.requireRuntime().sendService(
606
604
  String(targetRid),
607
- (Array.isArray(record) ? record : [record]).map(value => Buffer.from(value))
608
- ) ? SubmitResult.Ok : SubmitResult.NotConnected;
605
+ (Array.isArray(record) ? record : [record]).map((value) => Buffer.from(value))
606
+ ))
607
+ ? SubmitResult.Ok
608
+ : SubmitResult.NotConnected;
609
609
  }
610
610
 
611
611
  async sendInfrastructureControlFrames(
612
612
  targetRid: unknown,
613
613
  frames: readonly Uint8Array[]
614
614
  ): Promise<SubmitResultValue> {
615
- return await this.requireRuntime().sendService(
615
+ return (await this.requireRuntime().sendService(
616
616
  String(targetRid),
617
- frames.map(frame => Buffer.from(frame))
618
- ) ? SubmitResult.Ok : SubmitResult.NotConnected;
617
+ frames.map((frame) => Buffer.from(frame))
618
+ ))
619
+ ? SubmitResult.Ok
620
+ : SubmitResult.NotConnected;
619
621
  }
620
622
 
621
623
  async requestInfrastructureControlFrames(
@@ -625,7 +627,7 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
625
627
  ): Promise<readonly Uint8Array[]> {
626
628
  return await this.requireRuntime().requestService(
627
629
  String(targetRid),
628
- frames.map(frame => Buffer.from(frame)),
630
+ frames.map((frame) => Buffer.from(frame)),
629
631
  options?.timeoutMs ?? 30_000
630
632
  );
631
633
  }
@@ -647,10 +649,12 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
647
649
  channelName: string,
648
650
  parts: MessageLike | readonly MessageLike[]
649
651
  ): Promise<SubmitResultValue> {
650
- return await this.requireRuntime().sendToChannel(
652
+ return (await this.requireRuntime().sendToChannel(
651
653
  channelName,
652
654
  encodeMultipartApplicationFrame(parts)
653
- ) ? SubmitResult.Ok : SubmitResult.NotConnected;
655
+ ))
656
+ ? SubmitResult.Ok
657
+ : SubmitResult.NotConnected;
654
658
  }
655
659
 
656
660
  requestToChannel(
@@ -682,14 +686,14 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
682
686
  channelCount: descriptor.channels.length,
683
687
  configuredPeerCount: this.peerIntents.size,
684
688
  admittedPeerCount: peers.length,
685
- drainingPeerCount: peers.filter(peer => peer.descriptor.state === 'draining').length,
689
+ drainingPeerCount: peers.filter((peer) => peer.descriptor.state === 'draining').length,
686
690
  pendingApplicationMessages: BigInt(this.runtime?.mailbox.pendingMessages('application') ?? 0),
687
691
  pendingInfrastructureMessages: BigInt(
688
692
  (this.runtime?.mailbox.pendingMessages('infrastructure') ?? 0) + this.completionCount
689
693
  ),
690
694
  pendingBytes: BigInt(
691
- (this.runtime?.mailbox.pendingBytes('application') ?? 0)
692
- + (this.runtime?.mailbox.pendingBytes('infrastructure') ?? 0)
695
+ (this.runtime?.mailbox.pendingBytes('application') ?? 0) +
696
+ (this.runtime?.mailbox.pendingBytes('infrastructure') ?? 0)
693
697
  ),
694
698
  lastError: 0,
695
699
  lastChangedMs: BigInt(Math.trunc(performance.now()))
@@ -702,21 +706,19 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
702
706
  ...intent
703
707
  }));
704
708
  const findIntent = (nodeRoutingId: string, endpoint: string) =>
705
- intents.find(intent =>
706
- intent.nodeRoutingId === nodeRoutingId
707
- || (
708
- intent.nodeRoutingId === undefined
709
- && intent.endpoint === endpoint
710
- ));
711
- const admitted = (this.runtime?.topology.peers() ?? []).map(peer => ({
712
- connectionIntentId: findIntent(
713
- peer.descriptor.nodeRoutingId,
714
- peer.descriptor.advertisedEndpoint
715
- )?.id ?? 0n,
709
+ intents.find(
710
+ (intent) =>
711
+ intent.nodeRoutingId === nodeRoutingId ||
712
+ (intent.nodeRoutingId === undefined && intent.endpoint === endpoint)
713
+ );
714
+ const admitted = (this.runtime?.topology.peers() ?? []).map((peer) => ({
715
+ connectionIntentId:
716
+ findIntent(peer.descriptor.nodeRoutingId, peer.descriptor.advertisedEndpoint)?.id ?? 0n,
716
717
  source: 1,
717
- state: this.runtime?.isPeerRouteReady(peer.descriptor.nodeRoutingId) === false
718
- ? 1
719
- : peerStateCode(peer.descriptor.state),
718
+ state:
719
+ this.runtime?.isPeerRouteReady(peer.descriptor.nodeRoutingId) === false
720
+ ? 1
721
+ : peerStateCode(peer.descriptor.state),
720
722
  routingId: peer.descriptor.nodeRoutingId as RoutingId,
721
723
  lifecycleGeneration: peer.descriptor.lifecycleGeneration,
722
724
  descriptorRevision: peer.descriptor.descriptorRevision,
@@ -725,11 +727,9 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
725
727
  lastError: 0,
726
728
  lastChangedMs: BigInt(Math.trunc(performance.now()))
727
729
  }));
728
- const notRequired = (this.runtime?.topology.notRequiredPeers() ?? []).map(descriptor => ({
729
- connectionIntentId: findIntent(
730
- descriptor.nodeRoutingId,
731
- descriptor.advertisedEndpoint
732
- )?.id ?? 0n,
730
+ const notRequired = (this.runtime?.topology.notRequiredPeers() ?? []).map((descriptor) => ({
731
+ connectionIntentId:
732
+ findIntent(descriptor.nodeRoutingId, descriptor.advertisedEndpoint)?.id ?? 0n,
733
733
  source: 1,
734
734
  state: 6,
735
735
  routingId: descriptor.nodeRoutingId as RoutingId,
@@ -741,14 +741,12 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
741
741
  lastChangedMs: BigInt(Math.trunc(performance.now()))
742
742
  }));
743
743
  const projected = new Set([
744
- ...admitted.map(peer => peer.connectionIntentId),
745
- ...notRequired.map(peer => peer.connectionIntentId)
744
+ ...admitted.map((peer) => peer.connectionIntentId),
745
+ ...notRequired.map((peer) => peer.connectionIntentId)
746
746
  ]);
747
747
  const disconnected = intents
748
- .filter(intent =>
749
- intent.nodeRoutingId !== undefined
750
- && !projected.has(intent.id))
751
- .map(intent => {
748
+ .filter((intent) => intent.nodeRoutingId !== undefined && !projected.has(intent.id))
749
+ .map((intent) => {
752
750
  const descriptor = this.runtime?.topology.knownDescriptor(intent.nodeRoutingId!);
753
751
  return {
754
752
  connectionIntentId: intent.id,
@@ -765,8 +763,9 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
765
763
  lastChangedMs: BigInt(Math.trunc(performance.now()))
766
764
  };
767
765
  });
768
- return [...admitted, ...notRequired, ...disconnected]
769
- .sort((left, right) => String(left.routingId).localeCompare(String(right.routingId)));
766
+ return [...admitted, ...notRequired, ...disconnected].sort((left, right) =>
767
+ String(left.routingId).localeCompare(String(right.routingId))
768
+ );
770
769
  }
771
770
 
772
771
  peerChannels(peerRid: unknown, lifecycleGeneration: bigint) {
@@ -775,8 +774,8 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
775
774
  return { names: [], weights: [] };
776
775
  }
777
776
  return {
778
- names: descriptor.channels.map(channel => channel.name),
779
- weights: descriptor.channels.map(channel => channel.weight)
777
+ names: descriptor.channels.map((channel) => channel.name),
778
+ weights: descriptor.channels.map((channel) => channel.weight)
780
779
  };
781
780
  }
782
781
 
@@ -815,17 +814,18 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
815
814
  return new RawReadyBatch(capacity);
816
815
  }
817
816
 
818
- createReceiveBatch(
819
- messageCapacity: number,
820
- partCapacity: number
821
- ): ReceiveBatch {
817
+ createReceiveBatch(messageCapacity: number, partCapacity: number): ReceiveBatch {
822
818
  return new RawReceiveBatch(messageCapacity, partCapacity);
823
819
  }
824
820
 
825
821
  drainReady(
826
822
  domains: number,
827
823
  batch: ReadyBatch
828
- ): { readonly ok: boolean; readonly hasResidue: boolean; readonly records: readonly ReadyRecord[] } {
824
+ ): {
825
+ readonly ok: boolean;
826
+ readonly hasResidue: boolean;
827
+ readonly records: readonly ReadyRecord[];
828
+ } {
829
829
  const target = requireRawReadyBatch(batch);
830
830
  if ((domains & ReadyDomain.Infrastructure) !== 0) {
831
831
  this.drainCompletions(target);
@@ -835,13 +835,12 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
835
835
  this.drainMailbox('application', target);
836
836
  }
837
837
  const runtime = this.runtime;
838
- const infrastructureResidue = (domains & ReadyDomain.Infrastructure) !== 0
839
- && (
840
- this.completionCount > 0
841
- || (runtime?.mailbox.pendingMessages('infrastructure') ?? 0) > 0
842
- );
843
- const applicationResidue = (domains & ReadyDomain.Application) !== 0
844
- && (runtime?.mailbox.pendingMessages('application') ?? 0) > 0;
838
+ const infrastructureResidue =
839
+ (domains & ReadyDomain.Infrastructure) !== 0 &&
840
+ (this.completionCount > 0 || (runtime?.mailbox.pendingMessages('infrastructure') ?? 0) > 0);
841
+ const applicationResidue =
842
+ (domains & ReadyDomain.Application) !== 0 &&
843
+ (runtime?.mailbox.pendingMessages('application') ?? 0) > 0;
845
844
  return {
846
845
  ok: true,
847
846
  // Residue is scoped to the requested lane. The pump drains lanes in
@@ -873,10 +872,7 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
873
872
  return this.requireStateful().instanceSpotApplicationTarget(spotId);
874
873
  }
875
874
 
876
- waitForInstanceApplicationQuiescence(
877
- spotId: string,
878
- signal?: AbortSignal
879
- ): Promise<void> {
875
+ waitForInstanceApplicationQuiescence(spotId: string, signal?: AbortSignal): Promise<void> {
880
876
  return this.requireStateful().waitForInstanceApplicationQuiescence(spotId, signal);
881
877
  }
882
878
 
@@ -980,9 +976,7 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
980
976
  this.requireStateful().registerAsyncInstanceActivationAuthority(authority);
981
977
  }
982
978
 
983
- registerInstanceApplicationLifecycle(
984
- lifecycle: ServiceInstanceApplicationLifecycle
985
- ): void {
979
+ registerInstanceApplicationLifecycle(lifecycle: ServiceInstanceApplicationLifecycle): void {
986
980
  this.requireStateful().registerInstanceApplicationLifecycle(lifecycle);
987
981
  }
988
982
 
@@ -1027,7 +1021,11 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
1027
1021
  pending: ServicePendingInstanceActivation,
1028
1022
  expectedCurrentRoute?: ServiceInstanceRouteFence | null
1029
1023
  ): Promise<boolean> {
1030
- return this.requireStateful().recoverPendingInstanceActivation(envelope, pending, expectedCurrentRoute);
1024
+ return this.requireStateful().recoverPendingInstanceActivation(
1025
+ envelope,
1026
+ pending,
1027
+ expectedCurrentRoute
1028
+ );
1031
1029
  }
1032
1030
 
1033
1031
  completeRecoveredInstanceActivation(
@@ -1035,7 +1033,11 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
1035
1033
  route: ServiceInstanceRouteFence,
1036
1034
  expectedCurrentRoute?: ServiceInstanceRouteFence | null
1037
1035
  ): Promise<ServiceInstanceRouteFence | undefined> {
1038
- return this.requireStateful().completeRecoveredInstanceActivation(target, route, expectedCurrentRoute);
1036
+ return this.requireStateful().completeRecoveredInstanceActivation(
1037
+ target,
1038
+ route,
1039
+ expectedCurrentRoute
1040
+ );
1039
1041
  }
1040
1042
 
1041
1043
  forgetInstanceIntent(
@@ -1059,10 +1061,7 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
1059
1061
  this.requireStateful().rememberSpotRoute(route, expectedCurrentRoute);
1060
1062
  }
1061
1063
 
1062
- entrySpotRouteFence(
1063
- targetNodeRid: string,
1064
- targetSpotId: string
1065
- ): ServiceDirectSpotRouteFence {
1064
+ entrySpotRouteFence(targetNodeRid: string, targetSpotId: string): ServiceDirectSpotRouteFence {
1066
1065
  const generation = this.peerGeneration(targetNodeRid);
1067
1066
  return {
1068
1067
  spot: { spotId: targetSpotId, generation },
@@ -1089,11 +1088,7 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
1089
1088
  target: ServiceDirectSpotRouteFence,
1090
1089
  durationMs: number
1091
1090
  ): Promise<boolean> {
1092
- return this.requireStateful().commitSpotMessageFollowIngress(
1093
- seal,
1094
- target,
1095
- durationMs
1096
- );
1091
+ return this.requireStateful().commitSpotMessageFollowIngress(seal, target, durationMs);
1097
1092
  }
1098
1093
 
1099
1094
  forgetSpotRoute(
@@ -1224,12 +1219,7 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
1224
1219
  const target = String(targetNodeRid);
1225
1220
  return this.observeStateful(
1226
1221
  OperationKind.ActorJoin,
1227
- this.requireStateful().joinActorEntrySpot(
1228
- actor,
1229
- target,
1230
- request,
1231
- timeoutMs
1232
- )
1222
+ this.requireStateful().joinActorEntrySpot(actor, target, request, timeoutMs)
1233
1223
  );
1234
1224
  }
1235
1225
 
@@ -1293,13 +1283,13 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
1293
1283
  target: ZLinkBackendActorRef,
1294
1284
  parts: MessageLike | readonly MessageLike[]
1295
1285
  ): Promise<SubmitResultValue> {
1296
- return await this.requireStateful().sendToActor(
1286
+ return (await this.requireStateful().sendToActor(
1297
1287
  target,
1298
1288
  this.peerGeneration(String(target.nodeRid)),
1299
1289
  target.generation,
1300
1290
  encodeMultipart(parts),
1301
1291
  source
1302
- ) as SubmitResultValue;
1292
+ )) as SubmitResultValue;
1303
1293
  }
1304
1294
 
1305
1295
  actorRequestToActor(
@@ -1328,12 +1318,12 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
1328
1318
  _flags?: number,
1329
1319
  actorFence?: ZLinkBackendActorSessionSendFence
1330
1320
  ): Promise<SubmitResultValue> {
1331
- return await this.requireStateful().sendBoundSession(
1321
+ return (await this.requireStateful().sendBoundSession(
1332
1322
  actor,
1333
1323
  expectedBindingGeneration,
1334
1324
  encodeMultipart(parts),
1335
1325
  actorFence
1336
- ) as SubmitResultValue;
1326
+ )) as SubmitResultValue;
1337
1327
  }
1338
1328
 
1339
1329
  closeActorBoundSession(
@@ -1380,11 +1370,11 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
1380
1370
  target: ServiceDirectSpotRouteFence,
1381
1371
  parts: MessageLike | readonly MessageLike[]
1382
1372
  ): Promise<SubmitResultValue> {
1383
- return await this.requireStateful().sendToSpot(
1373
+ return (await this.requireStateful().sendToSpot(
1384
1374
  source.ref.spotId,
1385
1375
  target,
1386
1376
  encodeMultipart(parts)
1387
- ) as SubmitResultValue;
1377
+ )) as SubmitResultValue;
1388
1378
  }
1389
1379
 
1390
1380
  requestFromSpot(
@@ -1422,19 +1412,11 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
1422
1412
  );
1423
1413
  }
1424
1414
 
1425
- setSpotSubscription(
1426
- state: ServiceSpotState,
1427
- channelName: string,
1428
- topicFilter: string
1429
- ): void {
1415
+ setSpotSubscription(state: ServiceSpotState, channelName: string, topicFilter: string): void {
1430
1416
  this.requireStateful().setSubscription(state, channelName, topicFilter);
1431
1417
  }
1432
1418
 
1433
- unsetSpotSubscription(
1434
- state: ServiceSpotState,
1435
- channelName: string,
1436
- topicFilter: string
1437
- ): void {
1419
+ unsetSpotSubscription(state: ServiceSpotState, channelName: string, topicFilter: string): void {
1438
1420
  this.requireStateful().unsetSubscription(state, channelName, topicFilter);
1439
1421
  }
1440
1422
 
@@ -1458,10 +1440,7 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
1458
1440
  securityIdentity: 'default',
1459
1441
  applicationVersion: 0n,
1460
1442
  ...(this.maintenanceWave === undefined ? {} : { maintenanceWave: this.maintenanceWave }),
1461
- protocolCapabilities: [
1462
- SERVICE_WIRE_REQUIRED_CAPABILITY,
1463
- ...this.objectCapabilities
1464
- ].sort(),
1443
+ protocolCapabilities: [SERVICE_WIRE_REQUIRED_CAPABILITY, ...this.objectCapabilities].sort(),
1465
1444
  objectRole: this.objectRole,
1466
1445
  placementWeight: this.placementWeight,
1467
1446
  activeCapacityLimit: this.activeCapacityLimit,
@@ -1483,10 +1462,7 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
1483
1462
 
1484
1463
  private scheduleMaintenance(): void {
1485
1464
  if (this.closed || this.maintenanceTimer !== undefined) return;
1486
- this.maintenanceTimer = setTimeout(
1487
- this.onMaintenance,
1488
- MESH_BACKEND_MAINTENANCE_INTERVAL_MS
1489
- );
1465
+ this.maintenanceTimer = setTimeout(this.onMaintenance, MESH_BACKEND_MAINTENANCE_INTERVAL_MS);
1490
1466
  }
1491
1467
 
1492
1468
  private async pump(): Promise<void> {
@@ -1535,9 +1511,8 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
1535
1511
  ): MeshOperationId {
1536
1512
  const id = { high: 1n, low };
1537
1513
  void promise.then(
1538
- result => this.enqueueCompletion(id, operationKind, result),
1539
- error => this.enqueueCompletion(
1540
- id, operationKind, genericOperationFailure(error))
1514
+ (result) => this.enqueueCompletion(id, operationKind, result),
1515
+ (error) => this.enqueueCompletion(id, operationKind, genericOperationFailure(error))
1541
1516
  );
1542
1517
  return id;
1543
1518
  }
@@ -1548,8 +1523,8 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
1548
1523
  ): MeshOperationId {
1549
1524
  const id = { high: 2n, low: pending.id };
1550
1525
  void pending.promise.then(
1551
- result => this.enqueueCompletion(id, operationKind, result),
1552
- error => this.enqueueCompletion(id, operationKind, statefulOperationFailure(error))
1526
+ (result) => this.enqueueCompletion(id, operationKind, result),
1527
+ (error) => this.enqueueCompletion(id, operationKind, statefulOperationFailure(error))
1553
1528
  );
1554
1529
  return id;
1555
1530
  }
@@ -1597,8 +1572,7 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
1597
1572
  this.completionCount -= 1;
1598
1573
  if (this.completionCount === 0) {
1599
1574
  this.clearCompletions();
1600
- } else if (this.completionHead >= 1024
1601
- && this.completionHead * 2 >= this.completions.length) {
1575
+ } else if (this.completionHead >= 1024 && this.completionHead * 2 >= this.completions.length) {
1602
1576
  this.completions.splice(0, this.completionHead);
1603
1577
  this.completionHead = 0;
1604
1578
  }
@@ -1615,17 +1589,10 @@ export class ZLinkNodeRawMeshBackend implements ZLinkBackendMeshNode {
1615
1589
  const runtime = this.runtime;
1616
1590
  if (runtime === undefined) return;
1617
1591
  while (!batch.full) {
1618
- const claim = runtime.mailbox.tryClaim(
1619
- domain,
1620
- MAX_DRAIN_RECORDS,
1621
- Number.MAX_SAFE_INTEGER
1622
- );
1592
+ const claim = runtime.mailbox.tryClaim(domain, MAX_DRAIN_RECORDS, Number.MAX_SAFE_INTEGER);
1623
1593
  if (claim === undefined) break;
1624
1594
  const owner = readyOwner(claim.owner, this.routingId, this.stateful, domain);
1625
- batch.push(
1626
- owner,
1627
- new MailboxClaim(runtime, claim)
1628
- );
1595
+ batch.push(owner, new MailboxClaim(runtime, claim));
1629
1596
  }
1630
1597
  }
1631
1598
 
@@ -1730,17 +1697,10 @@ class RawServiceSpot implements ServiceSpot {
1730
1697
  String(targetSpotId),
1731
1698
  targetSpotGeneration,
1732
1699
  options?.entrySpot === true
1733
- ? this.backend.entrySpotRouteFence(
1734
- String(targetNodeRid),
1735
- String(targetSpotId)
1736
- )
1700
+ ? this.backend.entrySpotRouteFence(String(targetNodeRid), String(targetSpotId))
1737
1701
  : undefined
1738
1702
  );
1739
- return this.backend.sendFromSpot(
1740
- this.state,
1741
- routeFence,
1742
- parts
1743
- );
1703
+ return this.backend.sendFromSpot(this.state, routeFence, parts);
1744
1704
  }
1745
1705
 
1746
1706
  requestToSpot(
@@ -1761,10 +1721,7 @@ class RawServiceSpot implements ServiceSpot {
1761
1721
  String(targetSpotId),
1762
1722
  targetSpotGeneration,
1763
1723
  options?.entrySpot === true
1764
- ? this.backend.entrySpotRouteFence(
1765
- String(targetNodeRid),
1766
- String(targetSpotId)
1767
- )
1724
+ ? this.backend.entrySpotRouteFence(String(targetNodeRid), String(targetSpotId))
1768
1725
  : undefined
1769
1726
  );
1770
1727
  return this.backend.requestFromSpot(
@@ -1788,14 +1745,16 @@ class RawServiceSpot implements ServiceSpot {
1788
1745
 
1789
1746
  setSubscription(channelName: string, topicFilter: string, kind = 0): void {
1790
1747
  this.requireOpen();
1791
- if (kind !== 0) throw new RangeError('Only the default logical multicast subscription kind is supported.');
1748
+ if (kind !== 0)
1749
+ throw new RangeError('Only the default logical multicast subscription kind is supported.');
1792
1750
  this.backend.setSpotSubscription(this.state, channelName, topicFilter);
1793
1751
  this.subscriptions.add(`${channelName}\0${topicFilter}\0${kind}`);
1794
1752
  }
1795
1753
 
1796
1754
  unsetSubscription(channelName: string, topicFilter: string, kind = 0): void {
1797
1755
  this.requireOpen();
1798
- if (kind !== 0) throw new RangeError('Only the default logical multicast subscription kind is supported.');
1756
+ if (kind !== 0)
1757
+ throw new RangeError('Only the default logical multicast subscription kind is supported.');
1799
1758
  this.backend.unsetSpotSubscription(this.state, channelName, topicFilter);
1800
1759
  this.subscriptions.delete(`${channelName}\0${topicFilter}\0${kind}`);
1801
1760
  }
@@ -1830,10 +1789,10 @@ function requireDirectSpotRouteFence(
1830
1789
  return entryRoute;
1831
1790
  }
1832
1791
  if (
1833
- route === undefined
1834
- || route.targetNodeRid !== targetNodeRid
1835
- || route.spot.spotId !== targetSpotId
1836
- || route.spot.generation !== targetSpotGeneration
1792
+ route === undefined ||
1793
+ route.targetNodeRid !== targetNodeRid ||
1794
+ route.spot.spotId !== targetSpotId ||
1795
+ route.spot.generation !== targetSpotGeneration
1837
1796
  ) {
1838
1797
  throw new TypeError('Direct Spot submission requires the exact resolved authority fence.');
1839
1798
  }
@@ -1880,7 +1839,7 @@ class RawStreamSessionService implements StreamSessionService {
1880
1839
  return {
1881
1840
  state: this.state,
1882
1841
  lifecycleGeneration: 1n,
1883
- sessionCount: BigInt(new Set(bindings.map(value => value.sessionRid)).size),
1842
+ sessionCount: BigInt(new Set(bindings.map((value) => value.sessionRid)).size),
1884
1843
  bindingCount: BigInt(bindings.length),
1885
1844
  pendingMessageCount: 0n,
1886
1845
  pendingByteCount: 0n,
@@ -1888,11 +1847,7 @@ class RawStreamSessionService implements StreamSessionService {
1888
1847
  };
1889
1848
  }
1890
1849
 
1891
- lookupActor(
1892
- targetNodeRid: RoutingId,
1893
- actorId: string,
1894
- timeoutMs = 30_000
1895
- ): MeshOperationId {
1850
+ lookupActor(targetNodeRid: RoutingId, actorId: string, timeoutMs = 30_000): MeshOperationId {
1896
1851
  this.requireStarted();
1897
1852
  return this.observe(
1898
1853
  OperationKind.ActorLookup,
@@ -1937,12 +1892,7 @@ class RawStreamSessionService implements StreamSessionService {
1937
1892
  this.requireStarted();
1938
1893
  return this.observe(
1939
1894
  OperationKind.StreamUnbind,
1940
- this.stateful.unbindSession(
1941
- String(sessionRid),
1942
- actor,
1943
- expectedBindingGeneration,
1944
- timeoutMs
1945
- )
1895
+ this.stateful.unbindSession(String(sessionRid), actor, expectedBindingGeneration, timeoutMs)
1946
1896
  );
1947
1897
  }
1948
1898
 
@@ -1956,11 +1906,11 @@ class RawStreamSessionService implements StreamSessionService {
1956
1906
  parts: MessageLike | readonly MessageLike[]
1957
1907
  ): Promise<SubmitResultValue> {
1958
1908
  this.requireStarted();
1959
- return await this.stateful.sendSessionToActor(
1909
+ return (await this.stateful.sendSessionToActor(
1960
1910
  String(sessionRid),
1961
1911
  actor,
1962
1912
  encodeMultipart(parts)
1963
- ) as SubmitResultValue;
1913
+ )) as SubmitResultValue;
1964
1914
  }
1965
1915
 
1966
1916
  private async deliver(sessionRid: string, payload: Uint8Array): Promise<boolean> {
@@ -1985,20 +1935,14 @@ class RawStreamSessionService implements StreamSessionService {
1985
1935
  // Let the socket monitor drive the existing STREAM close/unbind
1986
1936
  // lifecycle instead of maintaining a second session-close state.
1987
1937
  disconnectStreamPeer(this.stream, target);
1988
- throw new ZLinkBackendResultError(
1989
- 'submit',
1990
- error.result,
1991
- error.nativeErrno,
1992
- { cause: error }
1993
- );
1938
+ throw new ZLinkBackendResultError('submit', error.result, error.nativeErrno, {
1939
+ cause: error
1940
+ });
1994
1941
  case SubmitResult.Backpressured:
1995
1942
  case SubmitResult.NotAdmitted:
1996
- throw new ZLinkBackendResultError(
1997
- 'submit',
1998
- error.result,
1999
- error.nativeErrno,
2000
- { cause: error }
2001
- );
1943
+ throw new ZLinkBackendResultError('submit', error.result, error.nativeErrno, {
1944
+ cause: error
1945
+ });
2002
1946
  default:
2003
1947
  throw error;
2004
1948
  }
@@ -2017,7 +1961,8 @@ class RawReadyBatch implements ReadyBatch {
2017
1961
  private readonly claims: RawClaim[] = [];
2018
1962
 
2019
1963
  constructor(private readonly capacity: number) {
2020
- if (!Number.isInteger(capacity) || capacity < 1) throw new RangeError('Ready capacity must be positive.');
1964
+ if (!Number.isInteger(capacity) || capacity < 1)
1965
+ throw new RangeError('Ready capacity must be positive.');
2021
1966
  }
2022
1967
 
2023
1968
  get full(): boolean {
@@ -2054,7 +1999,7 @@ class RawReceiveBatch implements ReceiveBatch {
2054
1999
  private readonly capacity: number,
2055
2000
  readonly partCapacity: number
2056
2001
  ) {
2057
- if ([capacity, partCapacity].some(value => !Number.isInteger(value) || value < 1)) {
2002
+ if ([capacity, partCapacity].some((value) => !Number.isInteger(value) || value < 1)) {
2058
2003
  throw new RangeError('Receive batch capacities must be positive.');
2059
2004
  }
2060
2005
  this.receiveCapacity = capacity;
@@ -2065,7 +2010,11 @@ class RawReceiveBatch implements ReceiveBatch {
2065
2010
  }
2066
2011
 
2067
2012
  reset(messageCapacity = this.capacity): void {
2068
- if (!Number.isInteger(messageCapacity) || messageCapacity < 1 || messageCapacity > this.capacity) {
2013
+ if (
2014
+ !Number.isInteger(messageCapacity) ||
2015
+ messageCapacity < 1 ||
2016
+ messageCapacity > this.capacity
2017
+ ) {
2069
2018
  throw new RangeError('Receive limit must be within the batch capacity.');
2070
2019
  }
2071
2020
  this.receiveCapacity = messageCapacity;
@@ -2111,10 +2060,7 @@ class MailboxClaim implements RawClaim {
2111
2060
  throw error;
2112
2061
  }
2113
2062
  const nextParts = decoded.parts.length;
2114
- if (
2115
- records.length >= capacity.messageCapacity
2116
- || parts + nextParts > capacity.partCapacity
2117
- ) {
2063
+ if (records.length >= capacity.messageCapacity || parts + nextParts > capacity.partCapacity) {
2118
2064
  for (const part of decoded.parts) part.close();
2119
2065
  this.remaining = this.claim.records.slice(index);
2120
2066
  break;
@@ -2144,31 +2090,33 @@ class CompletionClaim implements RawClaim {
2144
2090
  const payload = this.completion.result.payload;
2145
2091
  return {
2146
2092
  ok: true,
2147
- records: [{
2148
- kind: ReceiveKind.Completion,
2149
- domain: ReadyDomain.Infrastructure,
2150
- sourceNodeRid: null,
2151
- sourceSpotId: null,
2152
- sourceBindingGeneration: 0n,
2153
- sourceActor: null,
2154
- operationId: this.completion.operationId,
2155
- operationKind: this.completion.operationKind,
2156
- channelName: null,
2157
- topic: null,
2158
- applicationMetadata: null,
2159
- kindData: 'kindData' in this.completion.result
2160
- ? this.completion.result.kindData ?? null
2161
- : null,
2162
- terminalResult: this.completion.result.terminalResult,
2163
- failureErrno: this.completion.result.failureCode,
2164
- parts: payload === undefined
2165
- ? []
2166
- : payload.contentType === MULTIPART_CONTENT_TYPE
2167
- ? decodeMultipart(payload.payload)
2168
- : [Message.from(payload.payload)],
2169
- reply: () => SubmitResult.InvalidState,
2170
- replyActorJoin: () => SubmitResult.NotSupported
2171
- }]
2093
+ records: [
2094
+ {
2095
+ kind: ReceiveKind.Completion,
2096
+ domain: ReadyDomain.Infrastructure,
2097
+ sourceNodeRid: null,
2098
+ sourceSpotId: null,
2099
+ sourceBindingGeneration: 0n,
2100
+ sourceActor: null,
2101
+ operationId: this.completion.operationId,
2102
+ operationKind: this.completion.operationKind,
2103
+ channelName: null,
2104
+ topic: null,
2105
+ applicationMetadata: null,
2106
+ kindData:
2107
+ 'kindData' in this.completion.result ? (this.completion.result.kindData ?? null) : null,
2108
+ terminalResult: this.completion.result.terminalResult,
2109
+ failureErrno: this.completion.result.failureCode,
2110
+ parts:
2111
+ payload === undefined
2112
+ ? []
2113
+ : payload.contentType === MULTIPART_CONTENT_TYPE
2114
+ ? decodeMultipart(payload.payload)
2115
+ : [Message.from(payload.payload)],
2116
+ reply: () => SubmitResult.InvalidState,
2117
+ replyActorJoin: () => SubmitResult.NotSupported
2118
+ }
2119
+ ]
2172
2120
  };
2173
2121
  }
2174
2122
 
@@ -2196,12 +2144,11 @@ function decodeMultipartRecord(
2196
2144
  // multi-frame infrastructure control (Prepare + sideband) from being
2197
2145
  // misread as a 2-frame application envelope and dropped as invalid_frame.
2198
2146
  if (record.parts.length === 1 || record.domain === 'infrastructure') {
2199
- const request = record.requestSequence !== undefined
2200
- && record.sourceRoutingId !== undefined;
2147
+ const request = record.requestSequence !== undefined && record.sourceRoutingId !== undefined;
2201
2148
  return {
2202
2149
  kind: request ? ReceiveKind.NodeRequest : ReceiveKind.NodeSend,
2203
2150
  domain: readyDomain(record.domain),
2204
- sourceNodeRid: record.sourceRoutingId as RoutingId | undefined ?? null,
2151
+ sourceNodeRid: (record.sourceRoutingId as RoutingId | undefined) ?? null,
2205
2152
  sourceSpotId: null,
2206
2153
  sourceBindingGeneration: 0n,
2207
2154
  sourceActor: null,
@@ -2216,17 +2163,20 @@ function decodeMultipartRecord(
2216
2163
  terminalResult: 0,
2217
2164
  failureErrno: 0,
2218
2165
  ...receiveIngressLifecycle(record),
2219
- parts: record.parts.map(part => Message.from(part)),
2166
+ parts: record.parts.map((part) => Message.from(part)),
2220
2167
  reply(parts) {
2221
2168
  if (!request) return SubmitResult.InvalidState;
2222
2169
  const values = Array.isArray(parts) ? parts : [parts];
2223
2170
  if (values.length === 0) return SubmitResult.InvalidState;
2224
- runtime.replyService({
2225
- sourceRoutingId: record.sourceRoutingId!,
2226
- ...(record.sourceRoute === undefined ? {} : { sourceRoute: record.sourceRoute }),
2227
- requestSequence: record.requestSequence!,
2228
- ...(record.reply === undefined ? {} : { reply: record.reply })
2229
- }, values.map(value => Buffer.from(messageBytesView(value))));
2171
+ runtime.replyService(
2172
+ {
2173
+ sourceRoutingId: record.sourceRoutingId!,
2174
+ ...(record.sourceRoute === undefined ? {} : { sourceRoute: record.sourceRoute }),
2175
+ requestSequence: record.requestSequence!,
2176
+ ...(record.reply === undefined ? {} : { reply: record.reply })
2177
+ },
2178
+ values.map((value) => Buffer.from(messageBytesView(value)))
2179
+ );
2230
2180
  return SubmitResult.Ok;
2231
2181
  },
2232
2182
  replyActorJoin: () => SubmitResult.NotSupported
@@ -2236,27 +2186,32 @@ function decodeMultipartRecord(
2236
2186
  const command = header[3]!;
2237
2187
  const payloadFrame = record.parts[1]!;
2238
2188
  const application = decodeApplicationEnvelope(payloadFrame);
2239
- const channelName = record.owner.startsWith('channel:') ? record.owner.slice('channel:'.length) : null;
2240
- const operationId = record.correlation === undefined
2241
- ? { high: 0n, low: 0n }
2242
- : { high: 1n, low: record.correlation };
2243
- const kind = command === 16
2244
- ? ReceiveKind.NodeSend
2245
- : command === 17
2246
- ? ReceiveKind.NodeRequest
2247
- : command === 18
2248
- ? ReceiveKind.ChannelSend
2249
- : ReceiveKind.ChannelRequest;
2250
- const operationKind = kind === ReceiveKind.NodeRequest
2251
- ? OperationKind.NodeRequest
2252
- : kind === ReceiveKind.ChannelRequest
2253
- ? OperationKind.ChannelRequest
2254
- : 0;
2189
+ const channelName = record.owner.startsWith('channel:')
2190
+ ? record.owner.slice('channel:'.length)
2191
+ : null;
2192
+ const operationId =
2193
+ record.correlation === undefined
2194
+ ? { high: 0n, low: 0n }
2195
+ : { high: 1n, low: record.correlation };
2196
+ const kind =
2197
+ command === 16
2198
+ ? ReceiveKind.NodeSend
2199
+ : command === 17
2200
+ ? ReceiveKind.NodeRequest
2201
+ : command === 18
2202
+ ? ReceiveKind.ChannelSend
2203
+ : ReceiveKind.ChannelRequest;
2204
+ const operationKind =
2205
+ kind === ReceiveKind.NodeRequest
2206
+ ? OperationKind.NodeRequest
2207
+ : kind === ReceiveKind.ChannelRequest
2208
+ ? OperationKind.ChannelRequest
2209
+ : 0;
2255
2210
  const ingressLifecycle = receiveIngressLifecycle(record);
2256
2211
  return {
2257
2212
  kind,
2258
2213
  domain: readyDomain(record.domain),
2259
- sourceNodeRid: record.sourceRoutingId as RoutingId | undefined ?? null,
2214
+ sourceNodeRid: (record.sourceRoutingId as RoutingId | undefined) ?? null,
2260
2215
  sourceSpotId: null,
2261
2216
  sourceBindingGeneration: 0n,
2262
2217
  sourceActor: null,
@@ -2286,22 +2241,27 @@ function decodeStatefulRecord(
2286
2241
  stateful: ServiceStatefulMailboxData
2287
2242
  ): ReceiveRecord {
2288
2243
  const payloadFrame = record.parts.length < 2 ? undefined : record.parts[1];
2289
- const canonicalActorJoin = stateful.kindData?.kind === 'actorControl'
2290
- && stateful.kindData.canonicalActorJoin !== undefined;
2291
- const canonicalActorJoinPayload = stateful.operationKind === OperationKind.ActorJoin
2292
- && stateful.canonicalApplicationPayload !== undefined;
2244
+ const canonicalActorJoin =
2245
+ stateful.kindData?.kind === 'actorControl' &&
2246
+ stateful.kindData.canonicalActorJoin !== undefined;
2247
+ const canonicalActorJoinPayload =
2248
+ stateful.operationKind === OperationKind.ActorJoin &&
2249
+ stateful.canonicalApplicationPayload !== undefined;
2293
2250
  const application = canonicalActorJoinPayload
2294
2251
  ? stateful.canonicalApplicationPayload
2295
- : (payloadFrame === undefined ? undefined : decodeApplicationEnvelope(payloadFrame));
2296
- const operationId = record.correlation === undefined
2297
- ? { high: 0n, low: 0n }
2298
- : { high: 2n, low: record.correlation };
2252
+ : payloadFrame === undefined
2253
+ ? undefined
2254
+ : decodeApplicationEnvelope(payloadFrame);
2255
+ const operationId =
2256
+ record.correlation === undefined
2257
+ ? { high: 0n, low: 0n }
2258
+ : { high: 2n, low: record.correlation };
2299
2259
  const ingressLifecycle = receiveIngressLifecycle(record);
2300
2260
  return {
2301
2261
  kind: stateful.receiveKind,
2302
2262
  domain: readyDomain(record.domain),
2303
- sourceNodeRid: record.sourceRoutingId as RoutingId | undefined ?? null,
2304
- sourceSpotId: stateful.sourceSpotId as RoutingId | undefined ?? null,
2263
+ sourceNodeRid: (record.sourceRoutingId as RoutingId | undefined) ?? null,
2264
+ sourceSpotId: (stateful.sourceSpotId as RoutingId | undefined) ?? null,
2305
2265
  sourceBindingGeneration: stateful.sourceBindingGeneration ?? 0n,
2306
2266
  sourceActor: stateful.sourceActor ?? null,
2307
2267
  operationId,
@@ -2319,11 +2279,12 @@ function decodeStatefulRecord(
2319
2279
  terminalResult: 0,
2320
2280
  failureErrno: 0,
2321
2281
  ...ingressLifecycle,
2322
- parts: application === undefined
2323
- ? []
2324
- : canonicalActorJoinPayload
2325
- ? [Message.from(application.payload)]
2326
- : decodeMultipart(application.payload),
2282
+ parts:
2283
+ application === undefined
2284
+ ? []
2285
+ : canonicalActorJoinPayload
2286
+ ? [Message.from(application.payload)]
2287
+ : decodeMultipart(application.payload),
2327
2288
  ...(stateful.isPending === undefined ? {} : { isPending: stateful.isPending }),
2328
2289
  ...(stateful.deadlineUnixMs === undefined ? {} : { deadlineUnixMs: stateful.deadlineUnixMs }),
2329
2290
  ...(stateful.messageFollowOrigin === undefined
@@ -2334,19 +2295,18 @@ function decodeStatefulRecord(
2334
2295
  : { onTerminalCompletion: stateful.onTerminalCompletion }),
2335
2296
  reply(parts) {
2336
2297
  if (stateful.reply === undefined) return SubmitResult.InvalidState;
2337
- return stateful.reply(
2338
- RequestResult.Ok,
2339
- 0,
2340
- encodeMultipart(parts)
2341
- ) ? SubmitResult.Ok : SubmitResult.InvalidState;
2298
+ return stateful.reply(RequestResult.Ok, 0, encodeMultipart(parts))
2299
+ ? SubmitResult.Ok
2300
+ : SubmitResult.InvalidState;
2342
2301
  },
2343
2302
  replyActorJoin(joinResult, parts, _flags, _replyContentType) {
2344
2303
  if (stateful.reply === undefined || stateful.targetSpot === undefined) {
2345
2304
  return SubmitResult.InvalidState;
2346
2305
  }
2347
- const membershipEpoch = stateful.kindData?.kind === 'actorControl'
2348
- ? stateful.kindData.currentMembershipEpoch
2349
- : undefined;
2306
+ const membershipEpoch =
2307
+ stateful.kindData?.kind === 'actorControl'
2308
+ ? stateful.kindData.currentMembershipEpoch
2309
+ : undefined;
2350
2310
  if (joinResult === 0 && membershipEpoch === undefined) {
2351
2311
  return SubmitResult.InvalidState;
2352
2312
  }
@@ -2354,26 +2314,19 @@ function decodeStatefulRecord(
2354
2314
  if (canonicalActorJoin && replyParts.length > 1) {
2355
2315
  return SubmitResult.InvalidState;
2356
2316
  }
2357
- const replyPayload = replyParts.length === 0
2358
- ? undefined
2359
- : encodeMultipart(replyParts);
2360
- const accepted = stateful.reply(
2361
- RequestResult.Ok,
2362
- 0,
2363
- replyPayload,
2364
- {
2365
- kind: 'actorJoin',
2366
- joinResult: joinResult === 0 ? 0 : 1,
2367
- spot: stateful.targetSpot,
2368
- ...(membershipEpoch === undefined ? {} : { membershipEpoch }),
2369
- // Spec 15 §4.2: the accepted admission reply carries the target's
2370
- // valid receive chunk cap for this join's relocation state chunks —
2371
- // a conservative, recompute-stable bound (never lowered).
2372
- ...(joinResult === 0
2373
- ? { receiveChunkLimitBytes: ACTOR_JOIN_ADVERTISED_RECEIVE_CHUNK_LIMIT_BYTES }
2374
- : {})
2375
- }
2376
- );
2317
+ const replyPayload = replyParts.length === 0 ? undefined : encodeMultipart(replyParts);
2318
+ const accepted = stateful.reply(RequestResult.Ok, 0, replyPayload, {
2319
+ kind: 'actorJoin',
2320
+ joinResult: joinResult === 0 ? 0 : 1,
2321
+ spot: stateful.targetSpot,
2322
+ ...(membershipEpoch === undefined ? {} : { membershipEpoch }),
2323
+ // Spec 15 §4.2: the accepted admission reply carries the target's
2324
+ // valid receive chunk cap for this join's relocation state chunks —
2325
+ // a conservative, recompute-stable bound (never lowered).
2326
+ ...(joinResult === 0
2327
+ ? { receiveChunkLimitBytes: ACTOR_JOIN_ADVERTISED_RECEIVE_CHUNK_LIMIT_BYTES }
2328
+ : {})
2329
+ });
2377
2330
  return accepted ? SubmitResult.Ok : SubmitResult.InvalidState;
2378
2331
  },
2379
2332
  replyFailure(terminalResult, failureCode) {
@@ -2415,9 +2368,8 @@ function readyOwner(
2415
2368
  }
2416
2369
  if (owner.startsWith('actor:')) {
2417
2370
  const separator = owner.indexOf('\0', 'actor:'.length);
2418
- const actorId = separator < 0
2419
- ? owner.slice('actor:'.length)
2420
- : owner.slice('actor:'.length, separator);
2371
+ const actorId =
2372
+ separator < 0 ? owner.slice('actor:'.length) : owner.slice('actor:'.length, separator);
2421
2373
  const generation = separator < 0 ? 0n : BigInt(owner.slice(separator + 1));
2422
2374
  const current = stateful?.actor(actorId);
2423
2375
  return {
@@ -2442,9 +2394,7 @@ function readyOwner(
2442
2394
  }
2443
2395
 
2444
2396
  function readyDomain(domain: ServiceMailboxDomain): number {
2445
- return domain === 'infrastructure'
2446
- ? ReadyDomain.Infrastructure
2447
- : ReadyDomain.Application;
2397
+ return domain === 'infrastructure' ? ReadyDomain.Infrastructure : ReadyDomain.Application;
2448
2398
  }
2449
2399
 
2450
2400
  /**
@@ -2506,9 +2456,7 @@ function encodeMultipart(parts: MessageLike | readonly MessageLike[]) {
2506
2456
  };
2507
2457
  }
2508
2458
 
2509
- function encodeMultipartApplicationFrame(
2510
- parts: MessageLike | readonly MessageLike[]
2511
- ): Buffer {
2459
+ function encodeMultipartApplicationFrame(parts: MessageLike | readonly MessageLike[]): Buffer {
2512
2460
  const values = Array.isArray(parts) ? parts : [parts];
2513
2461
  if (values.length === 0) throw new TypeError('Multipart payload must contain at least one part.');
2514
2462
  return encodeMultipartApplicationPayload(
@@ -2553,9 +2501,9 @@ function decodeApplicationEnvelope(frame: Uint8Array) {
2553
2501
  const payloadLength = bytes.readUInt32BE(offset);
2554
2502
  offset += 4;
2555
2503
  if (
2556
- packetName !== MULTIPART_PACKET_NAME
2557
- || contentType !== MULTIPART_CONTENT_TYPE
2558
- || payloadLength !== bytes.length - offset
2504
+ packetName !== MULTIPART_PACKET_NAME ||
2505
+ contentType !== MULTIPART_CONTENT_TYPE ||
2506
+ payloadLength !== bytes.length - offset
2559
2507
  ) {
2560
2508
  throw new ServiceWireProtocolError('Unexpected M6A application payload.');
2561
2509
  }
@@ -2613,7 +2561,8 @@ function messageBytesView(value: MessageLike): Uint8Array {
2613
2561
  }
2614
2562
 
2615
2563
  function requireRawReadyBatch(batch: ReadyBatch): RawReadyBatch {
2616
- if (!(batch instanceof RawReadyBatch)) throw new TypeError('Ready batch belongs to another backend.');
2564
+ if (!(batch instanceof RawReadyBatch))
2565
+ throw new TypeError('Ready batch belongs to another backend.');
2617
2566
  return batch;
2618
2567
  }
2619
2568
 
@@ -2623,12 +2572,16 @@ function stateCode(state: ServiceNodeDescriptor['state']): number {
2623
2572
 
2624
2573
  function peerStateCode(state: ServiceNodeDescriptor['state']): number {
2625
2574
  switch (state) {
2626
- case 'preparing': return 2;
2575
+ case 'preparing':
2576
+ return 2;
2627
2577
  case 'serving':
2628
- case 'retiring': return 3;
2629
- case 'draining': return 4;
2578
+ case 'retiring':
2579
+ return 3;
2580
+ case 'draining':
2581
+ return 4;
2630
2582
  case 'stopped':
2631
- case 'error': return 5;
2583
+ case 'error':
2584
+ return 5;
2632
2585
  }
2633
2586
  }
2634
2587
 
@@ -2636,8 +2589,7 @@ function createLifecycleGeneration(): bigint {
2636
2589
  // Node's public Spot context exposes this lifecycle token as a number. Keep
2637
2590
  // the opaque equality token within the exact range that surface can carry;
2638
2591
  // lifecycle ordering is never inferred from its numeric value.
2639
- const generation = randomBytes(8).readBigUInt64BE()
2640
- & BigInt(Number.MAX_SAFE_INTEGER);
2592
+ const generation = randomBytes(8).readBigUInt64BE() & BigInt(Number.MAX_SAFE_INTEGER);
2641
2593
  return generation === 0n ? 1n : generation;
2642
2594
  }
2643
2595