@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
@@ -1,4 +1,4 @@
1
- // <auto-generated> DO NOT EDIT. schema-sha256: 64df96e0f18120191975a9b2196986ffbb6ad7040e1e8328530cd754cbc66a1b
1
+ // <auto-generated> DO NOT EDIT. schema-sha256: 5099b874cd4e2fbff7fea9b821dd8fd670e0de676c6e409ba6e30455dc457e44
2
2
  export interface ServiceWireRouteFence { readonly id: string; readonly generation: bigint; readonly targetNodeRid: Uint8Array; readonly targetNodeGeneration: bigint; readonly expectedAuthorityOwnerGeneration: bigint; readonly expectedOwnerLeaseGeneration: bigint; }
3
3
  export interface ApplicationPayloadEnvelopeV1 { readonly packetName: string; readonly contentType: string; readonly payload: Uint8Array; }
4
4
  export interface ActorJoin28 { readonly correlation: bigint; readonly actor: ServiceWireRouteFence; readonly entry: boolean; readonly targetSpot: ServiceWireRouteFence; readonly payload?: ApplicationPayloadEnvelopeV1; }
@@ -6,14 +6,15 @@ export interface ServiceWireRouteFence { readonly id: string; readonly generatio
6
6
  function u64(out: number[], value: bigint): void { if (value < 0n || value > 0xffffffffffffffffn) throw new RangeError("u64"); for (let i=7;i>=0;i--) out.push(Number((value >> BigInt(i*8)) & 255n)); }
7
7
  function read64(bytes: Uint8Array, at: { value: number }): bigint { if (at.value + 8 > bytes.length) throw new RangeError("truncated u64"); let r=0n; for(let i=0;i<8;i++) r=(r<<8n)|BigInt(bytes[at.value++]); return r; }
8
8
  function u32(out: number[], value: number): void { if(!Number.isInteger(value)||value<0||value>0xffffffff)throw new RangeError("u32");out.push(value>>>24,(value>>>16)&255,(value>>>8)&255,value&255); }
9
+ function appendBytes(out: number[], bytes: Uint8Array | readonly number[]): void { for (const byte of bytes) out.push(byte); }
9
10
  function read32(bytes: Uint8Array, at: { value: number }): number { if(at.value+4>bytes.length)throw new RangeError("truncated u32");return ((bytes[at.value++]<<24)|(bytes[at.value++]<<16)|(bytes[at.value++]<<8)|bytes[at.value++])>>>0; }
10
- function text8(out: number[], value: string): void { const b=text.encode(value); if(b.length===0 || b.length>255 || b.includes(0)) throw new RangeError("text8"); out.push(b.length,...b); }
11
+ function text8(out: number[], value: string): void { const b=text.encode(value); if(b.length===0 || b.length>255 || b.includes(0)) throw new RangeError("text8"); out.push(b.length); appendBytes(out,b); }
11
12
  function readText8(bytes: Uint8Array, at: { value: number }): string { const n=bytes[at.value++]; if(n===0 || at.value+n>bytes.length) throw new RangeError("truncated text8"); const b=bytes.slice(at.value,at.value+n); at.value+=n; if(b.includes(0))throw new RangeError("text8 NUL"); return decodeText.decode(b); }
12
- function rid(out: number[], value: Uint8Array): void { if(value.length===0 || value.length>255) throw new RangeError("rid"); out.push(value.length,...value); }
13
+ function rid(out: number[], value: Uint8Array): void { if(value.length===0 || value.length>255) throw new RangeError("rid"); out.push(value.length); appendBytes(out,value); }
13
14
  function readRid(bytes: Uint8Array, at: { value: number }): Uint8Array { const n=bytes[at.value++]; if(n===0 || at.value+n>bytes.length) throw new RangeError("truncated rid"); const r=bytes.slice(at.value,at.value+n); at.value+=n; return r; }
14
15
  function fence(out: number[], value: ServiceWireRouteFence): void { if(value.generation===0n||value.targetNodeGeneration===0n||value.expectedAuthorityOwnerGeneration===0n||value.expectedOwnerLeaseGeneration===0n)throw new RangeError("invalid fence");text8(out,value.id); u64(out,value.generation); rid(out,value.targetNodeRid); u64(out,value.targetNodeGeneration); u64(out,value.expectedAuthorityOwnerGeneration); u64(out,value.expectedOwnerLeaseGeneration); }
15
16
  function readFence(bytes: Uint8Array, at: { value: number }): ServiceWireRouteFence { const value={ id:readText8(bytes,at), generation:read64(bytes,at), targetNodeRid:readRid(bytes,at), targetNodeGeneration:read64(bytes,at), expectedAuthorityOwnerGeneration:read64(bytes,at), expectedOwnerLeaseGeneration:read64(bytes,at) };if(value.generation===0n||value.targetNodeGeneration===0n||value.expectedAuthorityOwnerGeneration===0n||value.expectedOwnerLeaseGeneration===0n)throw new RangeError("invalid fence");return value; }
16
- function encodePayload(value: ApplicationPayloadEnvelopeV1): Uint8Array { const body:number[]=[];text8(body,value.packetName);text8(body,value.contentType);u32(body,value.payload.length);body.push(...value.payload);const out=[1];u32(out,body.length);out.push(...body);return Uint8Array.from(out); }
17
+ function encodePayload(value: ApplicationPayloadEnvelopeV1): Uint8Array { const body:number[]=[];text8(body,value.packetName);text8(body,value.contentType);u32(body,value.payload.length);appendBytes(body,value.payload);const out=[1];u32(out,body.length);appendBytes(out,body);return Uint8Array.from(out); }
17
18
  function decodePayload(bytes: Uint8Array): ApplicationPayloadEnvelopeV1 { const at={value:0};if(bytes[at.value++]!==1)throw new RangeError("payload version");const length=read32(bytes,at);if(length!==bytes.length-at.value)throw new RangeError("payload length");const end=bytes.length;const packetName=readText8(bytes,at);const contentType=readText8(bytes,at);const length2=read32(bytes,at);if(length2!==end-at.value)throw new RangeError("payload bytes");const payload=bytes.slice(at.value);at.value=end;if(at.value!==end)throw new RangeError("payload trailing");return {packetName,contentType,payload}; }
18
19
  export function encodeActorJoin28(value: ActorJoin28): readonly Uint8Array[] { const out=[90,77,1,28,0]; if(value.correlation===0n) throw new RangeError("correlation"); u64(out,value.correlation); fence(out,value.actor); out.push(value.entry?1:0); fence(out,value.targetSpot); return value.payload===undefined?[Uint8Array.from(out)]:[Uint8Array.from(out),encodePayload(value.payload)]; }
19
20
  export function decodeActorJoin28(frames: readonly Uint8Array[]): ActorJoin28 { if(frames.length<1||frames.length>2)throw new RangeError("actorJoin frames");const bytes=frames[0]!; const at={value:0}; if(bytes.length<5 || bytes[at.value++]!==90 || bytes[at.value++]!==77 || bytes[at.value++]!==1 || bytes[at.value++]!==28 || bytes[at.value++]!==0) throw new RangeError("actorJoin header"); const correlation=read64(bytes,at); const actor=readFence(bytes,at); const entry=bytes[at.value++]; const targetSpot=readFence(bytes,at); if(correlation===0n || entry>1 || at.value!==bytes.length) throw new RangeError("actorJoin body"); const payload=frames.length===2?decodePayload(frames[1]!):undefined; return payload===undefined?{ correlation, actor, entry:entry===1, targetSpot }:{ correlation, actor, entry:entry===1, targetSpot,payload }; }
@@ -22,16 +23,16 @@ export interface RelocationEnvelopeV1 { readonly relocationHigh: bigint; readonl
22
23
  export interface RelocationDataChunkV1 { readonly order:number;readonly data:Uint8Array; }
23
24
  export interface RelocationChunkEntryV1 { readonly order:number;readonly reference:string;readonly length:bigint;readonly checksumCrc32c:number; }
24
25
  export interface RelocationManifestV1 { readonly logicalFormatVersion:1;readonly totalLength:bigint;readonly totalChecksumCrc32c:number;readonly inventoryDigestSha256:Uint8Array;readonly chunks:readonly RelocationChunkEntryV1[]; }
25
- function bytes64(out:number[],v:Uint8Array):void{u64(out,BigInt(v.length));out.push(...v);}
26
- function body16(out:number[],write:(b:number[])=>void):void{const b:number[]=[];write(b);if(b.length>65535)throw new RangeError("body16");out.push(b.length>>>8,b.length&255,...b);}
27
- function body64(out:number[],write:(b:number[])=>void):void{const b:number[]=[];write(b);u64(out,BigInt(b.length));out.push(...b);}
26
+ function bytes64(out:number[],v:Uint8Array):void{u64(out,BigInt(v.length));appendBytes(out,v);}
27
+ function body16(out:number[],write:(b:number[])=>void):void{const b:number[]=[];write(b);if(b.length>65535)throw new RangeError("body16");out.push(b.length>>>8,b.length&255);appendBytes(out,b);}
28
+ function body64(out:number[],write:(b:number[])=>void):void{const b:number[]=[];write(b);u64(out,BigInt(b.length));appendBytes(out,b);}
28
29
  function sorted<T>(v:readonly T[],compare:(a:T,b:T)=>number,name:string):void{for(let i=1;i<v.length;i++)if(compare(v[i-1],v[i])>=0)throw new RangeError(name);}
29
30
  function read8(bytes:Uint8Array,at:{value:number}):number{if(at.value>=bytes.length)throw new RangeError("truncated u8");return bytes[at.value++]!;}
30
31
  function read16(bytes:Uint8Array,at:{value:number}):number{if(at.value+2>bytes.length)throw new RangeError("truncated u16");return (bytes[at.value++]!<<8)|bytes[at.value++]!;}
31
32
  function take(bytes:Uint8Array,at:{value:number},n:number,name:string):Uint8Array<ArrayBuffer>{if(!Number.isSafeInteger(n)||n<0||at.value+n>bytes.length)throw new RangeError("truncated "+name);const v=Uint8Array.from(bytes.subarray(at.value,at.value+n));at.value+=n;return v;}
32
33
  function nonzero64(bytes:Uint8Array,at:{value:number},name:string):bigint{const v=read64(bytes,at);if(v===0n)throw new RangeError(name);return v;}
33
34
  function readText16(bytes:Uint8Array,at:{value:number},minimum:number,maximum:number,name:string):string{const n=read16(bytes,at);if(n<minimum||n>maximum)throw new RangeError(name);const b=take(bytes,at,n,name);if(b.includes(0))throw new RangeError(name+" NUL");return decodeText.decode(b);}
34
- function writeText16(out:number[],value:string,minimum:number,maximum:number,name:string):void{const b=text.encode(value);if(b.length<minimum||b.length>maximum||b.includes(0))throw new RangeError(name);out.push(b.length>>>8,b.length&255,...b);}
35
+ function writeText16(out:number[],value:string,minimum:number,maximum:number,name:string):void{const b=text.encode(value);if(b.length<minimum||b.length>maximum||b.includes(0))throw new RangeError(name);out.push(b.length>>>8,b.length&255);appendBytes(out,b);}
35
36
  function boundedEnd(bytes:Uint8Array,at:{value:number},length:number,name:string):number{if(at.value+length>bytes.length)throw new RangeError("truncated "+name);return at.value+length;}
36
37
  function exactEnd(at:{value:number},end:number,name:string):void{if(at.value!==end)throw new RangeError(name+" trailing");}
37
38
  function skipRid(bytes:Uint8Array,at:{value:number}):void{const n=read8(bytes,at);if(n===0)throw new RangeError("rid minimumBytes");take(bytes,at,n,"rid");}
@@ -50,14 +51,14 @@ function skipFrozenRecord(bytes:Uint8Array,at:{value:number}):void{const kind=re
50
51
  function compareUtf8(a:string,b:string):number{const x=text.encode(a),y=text.encode(b),n=Math.min(x.length,y.length);for(let i=0;i<n;i++)if(x[i]!==y[i])return x[i]!-y[i]!;return x.length-y.length;}
51
52
  function writeRelocationObject(out:number[],value:RelocationObjectIdentity):void{const kind=value.objectKind==="actor"?1:value.objectKind==="userSpot"?2:3;out.push(kind);body16(out,b=>{if(value.objectKind==="actor"){text8(b,value.actorId);if(value.objectGeneration===0n||value.expectedAuthorityOwnerGeneration===0n)throw new RangeError("object");u64(b,value.objectGeneration);u64(b,value.expectedAuthorityOwnerGeneration);}else if(value.objectKind==="userSpot"){text8(b,value.spotId);if(value.objectGeneration===0n||value.expectedAuthorityOwnerGeneration===0n)throw new RangeError("object");u64(b,value.objectGeneration);u64(b,value.expectedAuthorityOwnerGeneration);}else{text8(b,value.instanceType);text8(b,value.spotId);if(value.objectGeneration===0n)throw new RangeError("object");u64(b,value.objectGeneration);}});}
52
53
  function readRelocationObject(bytes:Uint8Array,at:{value:number}):RelocationObjectIdentity{const kind=read8(bytes,at),end=boundedEnd(bytes,at,read16(bytes,at),"relocation object");let value:RelocationObjectIdentity;if(kind===1)value={objectKind:"actor",actorId:readText8(bytes,at),objectGeneration:nonzero64(bytes,at,"object generation"),expectedAuthorityOwnerGeneration:nonzero64(bytes,at,"authority generation")};else if(kind===2)value={objectKind:"userSpot",spotId:readText8(bytes,at),objectGeneration:nonzero64(bytes,at,"object generation"),expectedAuthorityOwnerGeneration:nonzero64(bytes,at,"authority generation")};else if(kind===3)value={objectKind:"instanceSpot",instanceType:readText8(bytes,at),spotId:readText8(bytes,at),objectGeneration:nonzero64(bytes,at,"object generation")};else throw new RangeError("object kind");exactEnd(at,end,"relocation object");return value;}
53
- export function encodeRelocationEnvelopeV1(value:RelocationEnvelopeV1):Uint8Array{const out:number[]=[];if(value.relocationHigh===0n&&value.relocationLow===0n)throw new RangeError("relocation");u64(out,value.relocationHigh);u64(out,value.relocationLow);writeRelocationObject(out,value.object);if(value.applicationVersion<0n||value.applicationVersion>9223372036854775807n)throw new RangeError("application version");u64(out,value.applicationVersion);sorted(value.applicationStates,(a,b)=>a.participantId<b.participantId?-1:a.participantId>b.participantId?1:0,"applicationStates");if(value.applicationStates.length===0)throw new RangeError("applicationStates");u32(out,value.applicationStates.length);for(const s of value.applicationStates){if(s.participantId===0n)throw new RangeError("participant");u64(out,s.participantId);out.push(s.hasState?1:0);body64(out,b=>{if(s.hasState)bytes64(b,s.payload);else if(s.payload.length!==0)throw new RangeError("absent state payload");});}sorted(value.savedWork,(a,b)=>a.participantId===b.participantId?(a.order<b.order?-1:a.order>b.order?1:0):(a.participantId<b.participantId?-1:1),"savedWork");u32(out,value.savedWork.length);for(const w of value.savedWork){if(w.participantId===0n||w.order===0n)throw new RangeError("saved work");const at={value:0};skipFrozenRecord(w.frozenRecord,at);exactEnd(at,w.frozenRecord.length,"frozen record");u64(out,w.participantId);u64(out,w.order);out.push(...w.frozenRecord);}sorted(value.timerRegistrations,(a,b)=>a.participantId===b.participantId?compareUtf8(a.name,b.name):a.participantId<b.participantId?-1:1,"timerRegistrations");u32(out,value.timerRegistrations.length);for(const t of value.timerRegistrations){if(t.participantId===0n||t.periodMilliseconds===0n||t.maxCatchUpTicks===0n||t.overrunPolicy<1||t.overrunPolicy>3)throw new RangeError("timer");u64(out,t.participantId);text8(out,t.name);text8(out,t.handlerType);u64(out,t.periodMilliseconds);out.push(t.overrunPolicy);u64(out,t.maxCatchUpTicks);out.push(t.stopOnUnhandledException?1:0);u64(out,t.lastCompletedDeliveryIndex);u64(out,t.lastCompletedScheduledIndex);u64(out,t.nextScheduledAtUnixMilliseconds);}sorted(value.pendingTimerTicks,(a,b)=>a.participantId===b.participantId?(a.order<b.order?-1:a.order>b.order?1:0):(a.participantId<b.participantId?-1:1),"pendingTimerTicks");u32(out,value.pendingTimerTicks.length);for(const p of value.pendingTimerTicks){if(p.participantId===0n||p.order===0n||p.deliveryIndex===0n||p.scheduledIndex===0n)throw new RangeError("pending timer");u64(out,p.participantId);u64(out,p.order);text8(out,p.timerName);u64(out,p.deliveryIndex);u64(out,p.scheduledIndex);u64(out,p.scheduledAtUnixMilliseconds);u64(out,p.skippedTicks);}if(out.length>274877906944)throw new RangeError("relocation logical bytes");return Uint8Array.from(out);}
54
+ export function encodeRelocationEnvelopeV1(value:RelocationEnvelopeV1):Uint8Array{const out:number[]=[];if(value.relocationHigh===0n&&value.relocationLow===0n)throw new RangeError("relocation");u64(out,value.relocationHigh);u64(out,value.relocationLow);writeRelocationObject(out,value.object);if(value.applicationVersion<0n||value.applicationVersion>9223372036854775807n)throw new RangeError("application version");u64(out,value.applicationVersion);sorted(value.applicationStates,(a,b)=>a.participantId<b.participantId?-1:a.participantId>b.participantId?1:0,"applicationStates");if(value.applicationStates.length===0)throw new RangeError("applicationStates");u32(out,value.applicationStates.length);for(const s of value.applicationStates){if(s.participantId===0n)throw new RangeError("participant");u64(out,s.participantId);out.push(s.hasState?1:0);body64(out,b=>{if(s.hasState)bytes64(b,s.payload);else if(s.payload.length!==0)throw new RangeError("absent state payload");});}sorted(value.savedWork,(a,b)=>a.participantId===b.participantId?(a.order<b.order?-1:a.order>b.order?1:0):(a.participantId<b.participantId?-1:1),"savedWork");u32(out,value.savedWork.length);for(const w of value.savedWork){if(w.participantId===0n||w.order===0n)throw new RangeError("saved work");const at={value:0};skipFrozenRecord(w.frozenRecord,at);exactEnd(at,w.frozenRecord.length,"frozen record");u64(out,w.participantId);u64(out,w.order);appendBytes(out,w.frozenRecord);}sorted(value.timerRegistrations,(a,b)=>a.participantId===b.participantId?compareUtf8(a.name,b.name):a.participantId<b.participantId?-1:1,"timerRegistrations");u32(out,value.timerRegistrations.length);for(const t of value.timerRegistrations){if(t.participantId===0n||t.periodMilliseconds===0n||t.maxCatchUpTicks===0n||t.overrunPolicy<1||t.overrunPolicy>3)throw new RangeError("timer");u64(out,t.participantId);text8(out,t.name);text8(out,t.handlerType);u64(out,t.periodMilliseconds);out.push(t.overrunPolicy);u64(out,t.maxCatchUpTicks);out.push(t.stopOnUnhandledException?1:0);u64(out,t.lastCompletedDeliveryIndex);u64(out,t.lastCompletedScheduledIndex);u64(out,t.nextScheduledAtUnixMilliseconds);}sorted(value.pendingTimerTicks,(a,b)=>a.participantId===b.participantId?(a.order<b.order?-1:a.order>b.order?1:0):(a.participantId<b.participantId?-1:1),"pendingTimerTicks");u32(out,value.pendingTimerTicks.length);for(const p of value.pendingTimerTicks){if(p.participantId===0n||p.order===0n||p.deliveryIndex===0n||p.scheduledIndex===0n)throw new RangeError("pending timer");u64(out,p.participantId);u64(out,p.order);text8(out,p.timerName);u64(out,p.deliveryIndex);u64(out,p.scheduledIndex);u64(out,p.scheduledAtUnixMilliseconds);u64(out,p.skippedTicks);}if(out.length>274877906944)throw new RangeError("relocation logical bytes");return Uint8Array.from(out);}
54
55
  export function decodeRelocationEnvelopeV1(chunks:readonly Uint8Array[]):RelocationEnvelopeV1{const n=chunks.reduce((s,c)=>s+c.length,0);if(n>274877906944)throw new RangeError("relocation logical bytes");const bytes=new Uint8Array(n);let offset=0;for(const c of chunks){bytes.set(c,offset);offset+=c.length;}const at={value:0},relocationHigh=read64(bytes,at),relocationLow=read64(bytes,at);if(relocationHigh===0n&&relocationLow===0n)throw new RangeError("relocation");const object=readRelocationObject(bytes,at),applicationVersion=read64(bytes,at);if(applicationVersion>9223372036854775807n)throw new RangeError("application version");const applicationStates:RelocationEnvelopeV1["applicationStates"][number][]=[];const stateCount=read32(bytes,at);if(stateCount===0)throw new RangeError("applicationStates");for(let i=0,count=stateCount;i<count;i++){const participantId=nonzero64(bytes,at,"participant"),has=read8(bytes,at),end=boundedEnd(bytes,at,Number(read64(bytes,at)),"application state");if(has>1)throw new RangeError("application state");let payload=new Uint8Array();if(has===1)payload=take(bytes,at,Number(read64(bytes,at)),"state payload");exactEnd(at,end,"application state");applicationStates.push({participantId,hasState:has===1,payload});}const participants=new Set(applicationStates.map((s)=>s.participantId));const savedWork:RelocationEnvelopeV1["savedWork"][number][]=[];for(let i=0,count=read32(bytes,at);i<count;i++){const participantId=nonzero64(bytes,at,"participant");if(!participants.has(participantId))throw new RangeError("saved work participant");const order=nonzero64(bytes,at,"order"),start=at.value;skipFrozenRecord(bytes,at);savedWork.push({participantId,order,frozenRecord:bytes.slice(start,at.value)});}const timerRegistrations:RelocationEnvelopeV1["timerRegistrations"][number][]=[],registeredTimerNames=new Map<bigint,Set<string>>();for(let i=0,count=read32(bytes,at);i<count;i++){const participantId=nonzero64(bytes,at,"participant");if(!participants.has(participantId))throw new RangeError("timer participant");const name=readText8(bytes,at),handlerType=readText8(bytes,at),periodMilliseconds=nonzero64(bytes,at,"period"),overrunPolicy=read8(bytes,at);if(overrunPolicy<1||overrunPolicy>3)throw new RangeError("overrun policy");const maxCatchUpTicks=nonzero64(bytes,at,"catch-up"),stop=read8(bytes,at);if(stop>1)throw new RangeError("stop flag");let names=registeredTimerNames.get(participantId);if(names===undefined){names=new Set<string>();registeredTimerNames.set(participantId,names);}names.add(name);timerRegistrations.push({participantId,name,handlerType,periodMilliseconds,overrunPolicy:overrunPolicy as 1|2|3,maxCatchUpTicks,stopOnUnhandledException:stop===1,lastCompletedDeliveryIndex:read64(bytes,at),lastCompletedScheduledIndex:read64(bytes,at),nextScheduledAtUnixMilliseconds:read64(bytes,at)});}const pendingTimerTicks:RelocationEnvelopeV1["pendingTimerTicks"][number][]=[];for(let i=0,count=read32(bytes,at);i<count;i++){const participantId=nonzero64(bytes,at,"participant");if(!participants.has(participantId))throw new RangeError("pending timer participant");const order=nonzero64(bytes,at,"order"),timerName=readText8(bytes,at);if(registeredTimerNames.get(participantId)?.has(timerName)!==true)throw new RangeError("pending timer registration");pendingTimerTicks.push({participantId,order,timerName,deliveryIndex:nonzero64(bytes,at,"delivery"),scheduledIndex:nonzero64(bytes,at,"scheduled"),scheduledAtUnixMilliseconds:read64(bytes,at),skippedTicks:read64(bytes,at)});}exactEnd(at,bytes.length,"relocation envelope");sorted(applicationStates,(a,b)=>a.participantId<b.participantId?-1:a.participantId>b.participantId?1:0,"applicationStates");sorted(savedWork,(a,b)=>a.participantId===b.participantId?(a.order<b.order?-1:a.order>b.order?1:0):(a.participantId<b.participantId?-1:1),"savedWork");sorted(timerRegistrations,(a,b)=>a.participantId===b.participantId?compareUtf8(a.name,b.name):a.participantId<b.participantId?-1:1,"timerRegistrations");sorted(pendingTimerTicks,(a,b)=>a.participantId===b.participantId?(a.order<b.order?-1:a.order>b.order?1:0):(a.participantId<b.participantId?-1:1),"pendingTimerTicks");return{relocationHigh,relocationLow,object,applicationVersion,applicationStates,savedWork,timerRegistrations,pendingTimerTicks};}
55
56
  function crc32c(bytes:Uint8Array):number{let crc=0xffffffff;for(const octet of bytes){crc^=octet;for(let bit=0;bit<8;bit++)crc=(crc>>>1)^((crc&1)!==0?0x82f63b78:0);}return(~crc)>>>0;}
56
- function encodeDurable(magic:readonly number[],body:readonly number[],maximum:number):Uint8Array{const out=[...magic,1,0,0];u32(out,body.length);out.push(...body);if(out.length+4>maximum)throw new RangeError("durable format bytes");u32(out,crc32c(Uint8Array.from(out)));return Uint8Array.from(out);}
57
+ function encodeDurable(magic:readonly number[],body:readonly number[],maximum:number):Uint8Array{const out=[...magic,1,0,0];u32(out,body.length);appendBytes(out,body);if(out.length+4>maximum)throw new RangeError("durable format bytes");u32(out,crc32c(Uint8Array.from(out)));return Uint8Array.from(out);}
57
58
  function decodeDurable(bytes:Uint8Array,magic:readonly number[],maximum:number):Uint8Array{if(bytes.length>maximum||bytes.length<15||magic.some((v,i)=>bytes[i]!==v)||bytes[4]!==1||bytes[5]!==0||bytes[6]!==0)throw new RangeError("durable header");const at={value:7},length=read32(bytes,at),end=boundedEnd(bytes,at,length,"durable body");if(end+4!==bytes.length)throw new RangeError("durable length");const body=bytes.slice(at.value,end);at.value=end;const expected=read32(bytes,at);if(crc32c(bytes.slice(0,end))!==expected)throw new RangeError("durable checksum");return body;}
58
- export function encodeRelocationDataChunkV1(value:RelocationDataChunkV1):Uint8Array{const body:number[]=[];u32(body,value.order);if(value.data.length>67108864)throw new RangeError("chunk data");u32(body,value.data.length);body.push(...value.data);return encodeDurable([90,76,84,67],body,67108886);}
59
+ export function encodeRelocationDataChunkV1(value:RelocationDataChunkV1):Uint8Array{const body:number[]=[];u32(body,value.order);if(value.data.length>67108864)throw new RangeError("chunk data");u32(body,value.data.length);appendBytes(body,value.data);return encodeDurable([90,76,84,67],body,67108886);}
59
60
  export function decodeRelocationDataChunkV1(bytes:Uint8Array):RelocationDataChunkV1{const body=decodeDurable(bytes,[90,76,84,67],67108886),at={value:0},order=read32(body,at),data=take(body,at,read32(body,at),"chunk data");exactEnd(at,body.length,"chunk");return{order,data};}
60
- export function encodeRelocationManifestV1(value:RelocationManifestV1):Uint8Array{if(Number(value.logicalFormatVersion)!==1||value.totalLength>274877906944n||value.inventoryDigestSha256.length!==32||value.chunks.length>4096)throw new RangeError("manifest");sorted(value.chunks,(a,b)=>a.order-b.order,"manifest chunks");const body:number[]=[1];u64(body,value.totalLength);u32(body,value.totalChecksumCrc32c);body.push(32,...value.inventoryDigestSha256);u32(body,value.chunks.length);for(const chunk of value.chunks){if(chunk.length===0n)throw new RangeError("chunk length");u32(body,chunk.order);writeText16(body,chunk.reference,1,4096,"chunk reference");u64(body,chunk.length);u32(body,chunk.checksumCrc32c);}return encodeDurable([90,76,84,77],body,33554432);}
61
+ export function encodeRelocationManifestV1(value:RelocationManifestV1):Uint8Array{if(Number(value.logicalFormatVersion)!==1||value.totalLength>274877906944n||value.inventoryDigestSha256.length!==32||value.chunks.length>4096)throw new RangeError("manifest");sorted(value.chunks,(a,b)=>a.order-b.order,"manifest chunks");const body:number[]=[1];u64(body,value.totalLength);u32(body,value.totalChecksumCrc32c);body.push(32);appendBytes(body,value.inventoryDigestSha256);u32(body,value.chunks.length);for(const chunk of value.chunks){if(chunk.length===0n)throw new RangeError("chunk length");u32(body,chunk.order);writeText16(body,chunk.reference,1,4096,"chunk reference");u64(body,chunk.length);u32(body,chunk.checksumCrc32c);}return encodeDurable([90,76,84,77],body,33554432);}
61
62
  export function decodeRelocationManifestV1(bytes:Uint8Array):RelocationManifestV1{const body=decodeDurable(bytes,[90,76,84,77],33554432),at={value:0};if(read8(body,at)!==1)throw new RangeError("logical format version");const totalLength=read64(body,at);if(totalLength>274877906944n)throw new RangeError("logical length");const totalChecksumCrc32c=read32(body,at),digestLength=read8(body,at);if(digestLength!==32)throw new RangeError("inventory digest minimumBytes");const inventoryDigestSha256=take(body,at,digestLength,"inventory digest"),count=read32(body,at);if(count>4096)throw new RangeError("chunk count");const chunks:RelocationChunkEntryV1[]=[];for(let i=0;i<count;i++)chunks.push({order:read32(body,at),reference:readText16(body,at,1,4096,"chunk reference"),length:nonzero64(body,at,"chunk length"),checksumCrc32c:read32(body,at)});exactEnd(at,body.length,"manifest");sorted(chunks,(a,b)=>a.order-b.order,"manifest chunks");return{logicalFormatVersion:1,totalLength,totalChecksumCrc32c,inventoryDigestSha256,chunks};}
62
63
  export interface LivenessProbe5 { readonly probeId: bigint; }
63
64
  export function encodeLivenessProbe5(value: LivenessProbe5): Uint8Array { const out=[90,77,1,5,0]; if(value.probeId===0n) throw new RangeError("probeId"); u64(out,value.probeId); return Uint8Array.from(out); }
@@ -144,11 +145,11 @@ export function encodeRelocationFailed53(v:RelocationFailed53):Uint8Array{const
144
145
  export function decodeRelocationFailed53(bytes:Uint8Array):RelocationFailed53{const at=b3ReadHeader(bytes,53,"relocationFailed"),v=b3ReadReadyBase(bytes,at),failureCode=read32(bytes,at);if(!b3FailureResults.has(failureCode))throw new RangeError("failure code");b3Finish(at,bytes,"relocationFailed");return{...v,failureCode};}
145
146
  function b3WriteSourceBase(o:number[],v:RelocationData31|RelocationCutover34|RelocationState52):void{b3WriteId(o,v.relocation,"relocation");if(v.targetAttemptGeneration===0n)throw new RangeError("target attempt");u64(o,v.targetAttemptGeneration);b3WriteCoordinator(o,v.coordinator);b3WriteRole(o,v.senderRole);if(v.senderRole!=="source")throw new RangeError("sender role");writeRelocationObject(o,v.object);}
146
147
  function b3ReadSourceBase(bytes:Uint8Array,at:{value:number}){const relocation=b3ReadId(bytes,at,"relocation"),targetAttemptGeneration=nonzero64(bytes,at,"target attempt"),coordinator=b3ReadCoordinator(bytes,at),senderRole=b3ReadRole(bytes,at);if(senderRole!=="source")throw new RangeError("sender role");return{relocation,targetAttemptGeneration,coordinator,senderRole,object:readRelocationObject(bytes,at)};}
147
- export function encodeRelocationData31(v:RelocationData31):Uint8Array{const o=b3Header(31);b3WriteSourceBase(o,v);const at={value:0};skipFrozenRecord(v.record,at);exactEnd(at,v.record.length,"frozen record");o.push(...v.record);return Uint8Array.from(o);}
148
+ export function encodeRelocationData31(v:RelocationData31):Uint8Array{const o=b3Header(31);b3WriteSourceBase(o,v);const at={value:0};skipFrozenRecord(v.record,at);exactEnd(at,v.record.length,"frozen record");appendBytes(o,v.record);return Uint8Array.from(o);}
148
149
  export function decodeRelocationData31(bytes:Uint8Array):RelocationData31{const at=b3ReadHeader(bytes,31,"relocationData"),v=b3ReadSourceBase(bytes,at),start=at.value;skipFrozenRecord(bytes,at);const record=bytes.slice(start,at.value);b3Finish(at,bytes,"relocationData");return{...v,record};}
149
150
  export function encodeRelocationCutover34(v:RelocationCutover34):Uint8Array{const o=b3Header(34);b3WriteSourceBase(o,v);if(v.boundaryRecordCount<0n||v.boundaryRecordCount>9223372036854775807n)throw new RangeError("boundary count");u64(o,v.boundaryRecordCount);u32(o,v.boundaryChecksumCrc32c);return Uint8Array.from(o);}
150
151
  export function decodeRelocationCutover34(bytes:Uint8Array):RelocationCutover34{const at=b3ReadHeader(bytes,34,"relocationCutover"),v=b3ReadSourceBase(bytes,at),boundaryRecordCount=read64(bytes,at);if(boundaryRecordCount>9223372036854775807n)throw new RangeError("boundary count");const boundaryChecksumCrc32c=read32(bytes,at);b3Finish(at,bytes,"relocationCutover");return{...v,boundaryRecordCount,boundaryChecksumCrc32c};}
151
- export function encodeRelocationState52(v:RelocationState52):Uint8Array{const o=b3Header(52);b3WriteSourceBase(o,v);if(v.chunkData.length>67108864)throw new RangeError("chunk data");u32(o,v.chunkOrdinal);u32(o,v.chunkData.length);o.push(...v.chunkData);return Uint8Array.from(o);}
152
+ export function encodeRelocationState52(v:RelocationState52):Uint8Array{const o=b3Header(52);b3WriteSourceBase(o,v);if(v.chunkData.length>67108864)throw new RangeError("chunk data");u32(o,v.chunkOrdinal);u32(o,v.chunkData.length);appendBytes(o,v.chunkData);return Uint8Array.from(o);}
152
153
  export function decodeRelocationState52(bytes:Uint8Array):RelocationState52{const at=b3ReadHeader(bytes,52,"relocationState"),v=b3ReadSourceBase(bytes,at),chunkOrdinal=read32(bytes,at),length=read32(bytes,at);if(length>67108864)throw new RangeError("chunk data");const chunkData=take(bytes,at,length,"chunk data");b3Finish(at,bytes,"relocationState");return{...v,chunkOrdinal,chunkData};}
153
154
  export function encodeRelocationPrepare40(v:RelocationPrepare40):Uint8Array{const o=b3Header(40);b3WriteId(o,v.relocation,"relocation");if(v.targetAttemptGeneration===0n||v.sourceNodeGeneration===0n)throw new RangeError("prepare");u64(o,v.targetAttemptGeneration);b3WriteCoordinator(o,v.coordinator);b3WriteTarget(o,v.target);b3WriteRole(o,v.initiatorRole);if(v.initiatorRole!=="source")throw new RangeError("initiator role");writeRelocationObject(o,v.object);rid(o,v.sourceNodeRid);u64(o,v.sourceNodeGeneration);if(v.payloadTotalLength<0n||v.payloadTotalLength>274877906944n||v.payloadChunkCount>4096||v.applicationVersion<0n||v.applicationVersion>9223372036854775807n)throw new RangeError("prepare bounds");u64(o,v.payloadTotalLength);u32(o,v.payloadChunkCount);u32(o,v.payloadChecksumCrc32c);u64(o,v.applicationVersion);return Uint8Array.from(o);}
154
155
  export function decodeRelocationPrepare40(bytes:Uint8Array):RelocationPrepare40{const at=b3ReadHeader(bytes,40,"relocationPrepare"),relocation=b3ReadId(bytes,at,"relocation"),targetAttemptGeneration=nonzero64(bytes,at,"target attempt"),coordinator=b3ReadCoordinator(bytes,at),target=b3ReadTarget(bytes,at),initiatorRole=b3ReadRole(bytes,at);if(initiatorRole!=="source")throw new RangeError("initiator role");const object=readRelocationObject(bytes,at),sourceNodeRid=readRid(bytes,at),sourceNodeGeneration=nonzero64(bytes,at,"source node"),payloadTotalLength=read64(bytes,at),payloadChunkCount=read32(bytes,at),payloadChecksumCrc32c=read32(bytes,at),applicationVersion=read64(bytes,at);if(payloadTotalLength>274877906944n||payloadChunkCount>4096||applicationVersion>9223372036854775807n)throw new RangeError("prepare bounds");b3Finish(at,bytes,"relocationPrepare");return{relocation,targetAttemptGeneration,coordinator,target,initiatorRole,object,sourceNodeRid,sourceNodeGeneration,payloadTotalLength,payloadChunkCount,payloadChecksumCrc32c,applicationVersion};}
@@ -173,7 +174,7 @@ function b4ReadHeader(bytes:Uint8Array,id:number,name:string):{value:number}{con
173
174
  function b4Finish(at:{value:number},bytes:Uint8Array,name:string):void{if(at.value!==bytes.length)throw new RangeError(name+" trailing");}
174
175
  function b4Reservation(out:number[],v:ServiceWireObjectReservationFence):void{text8(out,v.reservationId);writeText16(out,v.expectedStoreVersion,1,4096,"store version");if(v.objectGeneration===0n||v.authorityOwnerGeneration===0n||v.targetNodeGeneration===0n||v.targetOwnerLeaseGeneration===0n||!Number.isInteger(v.pendingCapacityDelta)||v.pendingCapacityDelta<1||v.pendingCapacityDelta>0xffffffff)throw new RangeError("reservation");u64(out,v.objectGeneration);u64(out,v.authorityOwnerGeneration);rid(out,v.targetNodeRid);u64(out,v.targetNodeGeneration);text8(out,v.targetOwnerId);u64(out,v.targetOwnerLeaseGeneration);u32(out,v.pendingCapacityDelta);}
175
176
  function b4ReadReservation(bytes:Uint8Array,at:{value:number}):ServiceWireObjectReservationFence{return{reservationId:readText8(bytes,at),expectedStoreVersion:readText16(bytes,at,1,4096,"store version"),objectGeneration:nonzero64(bytes,at,"object generation"),authorityOwnerGeneration:nonzero64(bytes,at,"authority generation"),targetNodeRid:readRid(bytes,at),targetNodeGeneration:nonzero64(bytes,at,"target node generation"),targetOwnerId:readText8(bytes,at),targetOwnerLeaseGeneration:nonzero64(bytes,at,"target lease generation"),pendingCapacityDelta:(()=>{const v=read32(bytes,at);if(v===0)throw new RangeError("pending capacity");return v;})()};}
176
- function b4Close(out:number[],v:ServiceWireUserSpotCloseFenceV1):void{const body:number[]=[];text8(body,v.spotId);if(v.objectGeneration===0n||v.targetNodeGeneration===0n||v.expectedAuthorityOwnerGeneration===0n)throw new RangeError("close fence");u64(body,v.objectGeneration);rid(body,v.targetNodeRid);u64(body,v.targetNodeGeneration);u64(body,v.expectedAuthorityOwnerGeneration);writeText16(body,v.expectedStoreVersion,1,4096,"store version");out.push(1);if(body.length>65535)throw new RangeError("close fence");out.push(body.length>>>8,body.length&255,...body);}
177
+ function b4Close(out:number[],v:ServiceWireUserSpotCloseFenceV1):void{const body:number[]=[];text8(body,v.spotId);if(v.objectGeneration===0n||v.targetNodeGeneration===0n||v.expectedAuthorityOwnerGeneration===0n)throw new RangeError("close fence");u64(body,v.objectGeneration);rid(body,v.targetNodeRid);u64(body,v.targetNodeGeneration);u64(body,v.expectedAuthorityOwnerGeneration);writeText16(body,v.expectedStoreVersion,1,4096,"store version");out.push(1);if(body.length>65535)throw new RangeError("close fence");out.push(body.length>>>8,body.length&255);appendBytes(out,body);}
177
178
  function b4ReadClose(bytes:Uint8Array,at:{value:number}):ServiceWireUserSpotCloseFenceV1{if(read8(bytes,at)!==1)throw new RangeError("close fence version");const end=boundedEnd(bytes,at,read16(bytes,at),"close fence");const value={spotId:readText8(bytes,at),objectGeneration:nonzero64(bytes,at,"object generation"),targetNodeRid:readRid(bytes,at),targetNodeGeneration:nonzero64(bytes,at,"target node generation"),expectedAuthorityOwnerGeneration:nonzero64(bytes,at,"authority generation"),expectedStoreVersion:readText16(bytes,at,1,4096,"store version")};exactEnd(at,end,"close fence");return value;}
178
179
  function b4CommandBase(out:number[],v:{correlation:bigint;operation:ServiceWireOperationId;sourceNodeRid:Uint8Array;sourceNodeGeneration:bigint}):void{if(v.correlation===0n||v.sourceNodeGeneration===0n)throw new RangeError("command base");u64(out,v.correlation);b3WriteId(out,v.operation,"operation");rid(out,v.sourceNodeRid);u64(out,v.sourceNodeGeneration);}
179
180
  function b4ReadCommandBase(bytes:Uint8Array,at:{value:number}):{correlation:bigint;operation:ServiceWireOperationId;sourceNodeRid:Uint8Array;sourceNodeGeneration:bigint}{return{correlation:nonzero64(bytes,at,"correlation"),operation:b3ReadId(bytes,at,"operation"),sourceNodeRid:readRid(bytes,at),sourceNodeGeneration:nonzero64(bytes,at,"source node generation")};}
@@ -183,7 +184,7 @@ export function encodeUserSpotClose48(v:UserSpotClose48):Uint8Array{const out=b4
183
184
  export function decodeUserSpotClose48(bytes:Uint8Array):UserSpotClose48{const at=b4ReadHeader(bytes,48,"userSpotClose"),base=b4ReadCommandBase(bytes,at),target=b4ReadClose(bytes,at),deadlineUnixMs=nonzero64(bytes,at,"deadline");b4Finish(at,bytes,"userSpotClose");return{...base,target,deadlineUnixMs};}
184
185
  export function encodeActorCreate49(v:ActorCreate49):Uint8Array{const out=b4Header(49);b4CommandBase(out,v);text8(out,v.actorId);text8(out,v.stableType);b4Reservation(out,v.reservation);if(v.deadlineUnixMs===0n)throw new RangeError("deadline");u64(out,v.deadlineUnixMs);return Uint8Array.from(out);}
185
186
  export function decodeActorCreate49(bytes:Uint8Array):ActorCreate49{const at=b4ReadHeader(bytes,49,"actorCreate"),base=b4ReadCommandBase(bytes,at),actorId=readText8(bytes,at),stableType=readText8(bytes,at),reservation=b4ReadReservation(bytes,at),deadlineUnixMs=nonzero64(bytes,at,"deadline");b4Finish(at,bytes,"actorCreate");return{...base,actorId,stableType,reservation,deadlineUnixMs};}
186
- function b4ZljrPayload(v:ZljrRecordV1):Uint8Array{if(v.metadata.length>262144||v.request.length>1048576||v.reply.length>1048576)throw new RangeError("ZLJR length");const out=[90,76,74,82,1];u32(out,v.metadata.length);u32(out,v.request.length);u32(out,v.reply.length);out.push(...v.metadata,...v.request,...v.reply);return Uint8Array.from(out);}
187
- function b4ReadZljrPayload(bytes:Uint8Array):{metadata:Uint8Array;request:Uint8Array;reply:Uint8Array}{const at={value:0};if(read32(bytes,at)!==0x5a4c4a52||read8(bytes,at)!==1)throw new RangeError("ZLJR header");const metadataLength=read32(bytes,at),requestLength=read32(bytes,at),replyLength=read32(bytes,at);if(metadataLength>262144||requestLength>1048576||replyLength>1048576)throw new RangeError("ZLJR length");const metadata=take(bytes,at,metadataLength,"ZLJR metadata"),request=take(bytes,at,requestLength,"ZLJR request"),reply=take(bytes,at,replyLength,"ZLJR reply");b4Finish(at,bytes,"ZLJR");return{metadata,request,reply};}
188
- export function encodeZljrRecordV1(v:ZljrRecordV1):Uint8Array{if(v.source.nodeGeneration===0n||v.source.ownerLeaseGeneration===0n)throw new RangeError("ZLJR record");const source:number[]=[];rid(source,v.source.nodeRid);u64(source,v.source.nodeGeneration);text8(source,v.source.ownerId);u64(source,v.source.ownerLeaseGeneration);if(source.length>65535)throw new RangeError("ZLJR source");const payload=b4ZljrPayload(v),body:number[]=[];text8(body,"__zlink.actor.routed_join.recovery");text8(body,"application/x-zlink-actor-routed-join-recovery-v1");u32(body,payload.length);body.push(...payload);const out=[1,1,source.length>>>8,source.length&255,...source,0];u64(out,v.operation.high);u64(out,v.operation.low);u32(out,0);out.push(0,0,1);u32(out,body.length);out.push(...body);return Uint8Array.from(out);}
187
+ function b4ZljrPayload(v:ZljrRecordV1):Uint8Array{if(v.metadata.length>262144)throw new RangeError("ZLJR length");const out=[90,76,74,82,1];u32(out,v.metadata.length);u32(out,v.request.length);u32(out,v.reply.length);appendBytes(out,v.metadata);appendBytes(out,v.request);appendBytes(out,v.reply);return Uint8Array.from(out);}
188
+ function b4ReadZljrPayload(bytes:Uint8Array):{metadata:Uint8Array;request:Uint8Array;reply:Uint8Array}{const at={value:0};if(read32(bytes,at)!==0x5a4c4a52||read8(bytes,at)!==1)throw new RangeError("ZLJR header");const metadataLength=read32(bytes,at),requestLength=read32(bytes,at),replyLength=read32(bytes,at);if(metadataLength>262144)throw new RangeError("ZLJR length");const metadata=take(bytes,at,metadataLength,"ZLJR metadata"),request=take(bytes,at,requestLength,"ZLJR request"),reply=take(bytes,at,replyLength,"ZLJR reply");b4Finish(at,bytes,"ZLJR");return{metadata,request,reply};}
189
+ export function encodeZljrRecordV1(v:ZljrRecordV1):Uint8Array{if(v.source.nodeGeneration===0n||v.source.ownerLeaseGeneration===0n)throw new RangeError("ZLJR record");const source:number[]=[];rid(source,v.source.nodeRid);u64(source,v.source.nodeGeneration);text8(source,v.source.ownerId);u64(source,v.source.ownerLeaseGeneration);if(source.length>65535)throw new RangeError("ZLJR source");const payload=b4ZljrPayload(v),body:number[]=[];text8(body,"__zlink.actor.routed_join.recovery");text8(body,"application/x-zlink-actor-routed-join-recovery-v1");u32(body,payload.length);appendBytes(body,payload);const out=[1,1,source.length>>>8,source.length&255,...source,0];u64(out,v.operation.high);u64(out,v.operation.low);u32(out,0);out.push(0,0,1);u32(out,body.length);appendBytes(out,body);return Uint8Array.from(out);}
189
190
  export function decodeZljrRecordV1(bytes:Uint8Array):ZljrRecordV1{const at={value:0};if(read8(bytes,at)!==1||read8(bytes,at)!==1)throw new RangeError("ZLJR frozen record");const sourceEnd=boundedEnd(bytes,at,read16(bytes,at),"ZLJR source"),nodeRid=readRid(bytes,at),nodeGeneration=nonzero64(bytes,at,"source node generation"),ownerId=readText8(bytes,at),ownerLeaseGeneration=nonzero64(bytes,at,"source owner lease");exactEnd(at,sourceEnd,"ZLJR source");if(read8(bytes,at)!==0)throw new RangeError("ZLJR metadata flag");const operation={high:read64(bytes,at),low:read64(bytes,at)};if(read32(bytes,at)!==0||read16(bytes,at)!==0||read8(bytes,at)!==1)throw new RangeError("ZLJR frozen record");const payloadEnd=boundedEnd(bytes,at,read32(bytes,at),"ZLJR payload"),packetName=readText8(bytes,at),contentType=readText8(bytes,at),payloadLength=read32(bytes,at);if(packetName!=="__zlink.actor.routed_join.recovery"||contentType!=="application/x-zlink-actor-routed-join-recovery-v1"||payloadLength!==payloadEnd-at.value)throw new RangeError("ZLJR payload");const payload=take(bytes,at,payloadLength,"ZLJR payload");exactEnd(at,payloadEnd,"ZLJR payload");b4Finish(at,bytes,"ZLJR record");return{source:{nodeRid,nodeGeneration,ownerId,ownerLeaseGeneration},operation,...b4ReadZljrPayload(payload)};}
@@ -53,8 +53,8 @@ export function decodeRoutingId(text: string, hex: unknown): RoutingId {
53
53
  const bytes = Buffer.from(normalizedHex, 'hex');
54
54
  const decoded = bytes.toString('utf8');
55
55
  if (
56
- Buffer.from(decoded, 'utf8').toString('hex') === normalizedHex
57
- && !/[\u0000-\u001f\u007f-\u009f]/u.test(decoded)
56
+ Buffer.from(decoded, 'utf8').toString('hex') === normalizedHex &&
57
+ !/[\u0000-\u001f\u007f-\u009f]/u.test(decoded)
58
58
  ) {
59
59
  return normalizeRoutingId(decoded);
60
60
  }
@@ -63,9 +63,7 @@ export function decodeRoutingId(text: string, hex: unknown): RoutingId {
63
63
 
64
64
  export function routingIdWireHex(routingId: RoutingId): string | undefined {
65
65
  const value = routingId as unknown as { toHex?: () => string };
66
- return typeof value.toHex === 'function'
67
- ? value.toHex.call(routingId).toLowerCase()
68
- : undefined;
66
+ return typeof value.toHex === 'function' ? value.toHex.call(routingId).toLowerCase() : undefined;
69
67
  }
70
68
 
71
69
  export function encodeRoutingIdStorageHex(routingId: RoutingId): string {
@@ -92,7 +90,10 @@ export function toBackendRoutingId(routingId: unknown): RoutingId {
92
90
  };
93
91
  if (typeof value.toBytes === 'function') {
94
92
  const bytes = value.toBytes.call(routingId);
95
- return new ZLinkOpaqueRoutingId(String(routingId), Buffer.from(bytes).toString('hex')) as unknown as RoutingId;
93
+ return new ZLinkOpaqueRoutingId(
94
+ String(routingId),
95
+ Buffer.from(bytes).toString('hex')
96
+ ) as unknown as RoutingId;
96
97
  }
97
98
  if (typeof value.toHex === 'function') {
98
99
  return new ZLinkOpaqueRoutingId(
@@ -107,7 +108,9 @@ export function toBackendRoutingId(routingId: unknown): RoutingId {
107
108
  function normalizeRoutingIdHex(value: string): string {
108
109
  const hex = value.toLowerCase();
109
110
  if (hex.length === 0 || hex.length % 2 !== 0 || !/^[0-9a-f]+$/.test(hex)) {
110
- throw new TypeError('RoutingId hex must contain a non-empty, even number of hexadecimal digits.');
111
+ throw new TypeError(
112
+ 'RoutingId hex must contain a non-empty, even number of hexadecimal digits.'
113
+ );
111
114
  }
112
115
  return hex;
113
116
  }
@@ -1,9 +1,4 @@
1
- import type {
2
- ActorRef,
3
- RoutingId,
4
- ZLinkActor,
5
- ZLinkActorJoinOperationId
6
- } from '../../contracts';
1
+ import type { ActorRef, RoutingId, ZLinkActor, ZLinkActorJoinOperationId } from '../../contracts';
7
2
  import type { ZLinkRemoteBoundSessionTarget } from '../actors/actor-runtime-state';
8
3
  import type { ZLinkDeferredJoinAcceptedRoot } from '../actors/deferred-join-accepted-journal';
9
4
  import type { ZLinkActorRequestTerminal } from './spot-actor-packet-dispatch';
@@ -36,13 +31,7 @@ function objectKey(actorId: string, objectGeneration: bigint): string {
36
31
  }
37
32
 
38
33
  export type ZLinkFormalRemoteActorAdmissionState =
39
- | 'provisional'
40
- | 'admitting'
41
- | 'admitted'
42
- | 'rejected'
43
- | 'committed'
44
- | 'aborted'
45
- | 'failed';
34
+ 'provisional' | 'admitting' | 'admitted' | 'rejected' | 'committed' | 'aborted' | 'failed';
46
35
 
47
36
  export interface ZLinkFormalRemoteActorAdmission {
48
37
  readonly actorId: string;
@@ -76,8 +65,7 @@ export interface ZLinkFormalRemoteActorAdmissionFailure {
76
65
  }
77
66
 
78
67
  export type ZLinkFormalRemoteActorAdmissionResult =
79
- | ZLinkFormalRemoteActorAdmissionOutcome
80
- | ZLinkFormalRemoteActorAdmissionFailure;
68
+ ZLinkFormalRemoteActorAdmissionOutcome | ZLinkFormalRemoteActorAdmissionFailure;
81
69
 
82
70
  export interface ZLinkFormalRemoteActorAdmissionRecord {
83
71
  readonly admission: ZLinkFormalRemoteActorAdmission;
@@ -124,7 +112,9 @@ export class ZLinkFormalRemoteActorAdmissionRegistry {
124
112
  const existing = this.admissions.get(input.transferId);
125
113
  if (existing !== undefined) {
126
114
  if (!sameAdmission(existing.admission, input)) {
127
- throw new Error(`Remote actor admission '${input.transferId}' does not match the original request.`);
115
+ throw new Error(
116
+ `Remote actor admission '${input.transferId}' does not match the original request.`
117
+ );
128
118
  }
129
119
  return { record: existing, created: false };
130
120
  }
@@ -144,7 +134,9 @@ export class ZLinkFormalRemoteActorAdmissionRegistry {
144
134
  const existing = this.admissions.get(input.transferId);
145
135
  if (existing !== undefined) {
146
136
  if (!sameProvisionalAdmission(existing.admission, input)) {
147
- throw new Error(`Remote actor admission '${input.transferId}' does not match the original request.`);
137
+ throw new Error(
138
+ `Remote actor admission '${input.transferId}' does not match the original request.`
139
+ );
148
140
  }
149
141
  return { record: existing, created: false };
150
142
  }
@@ -225,11 +217,11 @@ export class ZLinkFormalRemoteActorAdmissionRegistry {
225
217
  if (transferId === undefined) return 'not-found';
226
218
  const entry = this.admissions.get(transferId);
227
219
  if (
228
- entry === undefined
229
- || entry.migrated
230
- || entry.state === 'rejected'
231
- || entry.state === 'aborted'
232
- || entry.state === 'failed'
220
+ entry === undefined ||
221
+ entry.migrated ||
222
+ entry.state === 'rejected' ||
223
+ entry.state === 'aborted' ||
224
+ entry.state === 'failed'
233
225
  ) {
234
226
  return 'not-found';
235
227
  }
@@ -265,25 +257,21 @@ export class ZLinkFormalRemoteActorAdmissionRegistry {
265
257
  this.delete(transferId);
266
258
  }
267
259
 
268
- private failParked(
269
- entry: ZLinkFormalRemoteActorAdmissionEntry,
270
- reason?: unknown
271
- ): void {
260
+ private failParked(entry: ZLinkFormalRemoteActorAdmissionEntry, reason?: unknown): void {
272
261
  if (entry.parked.length === 0) return;
273
262
  const parked = entry.parked;
274
263
  entry.parked = [];
275
- const aborted = reason ?? new Error(
276
- `Actor Join relocation temporary queue for '${entry.admission.actorId}' was aborted.`
277
- );
264
+ const aborted =
265
+ reason ??
266
+ new Error(
267
+ `Actor Join relocation temporary queue for '${entry.admission.actorId}' was aborted.`
268
+ );
278
269
  for (const message of parked) {
279
270
  message.reject(aborted);
280
271
  }
281
272
  }
282
273
 
283
- complete(
284
- transferId: string,
285
- outcome: ZLinkFormalRemoteActorAdmissionOutcome
286
- ): void {
274
+ complete(transferId: string, outcome: ZLinkFormalRemoteActorAdmissionOutcome): void {
287
275
  const entry = this.admissions.get(transferId);
288
276
  if (entry === undefined || entry.state === 'aborted' || entry.state === 'committed') return;
289
277
  entry.state = outcome.accepted ? 'admitted' : 'rejected';
@@ -326,13 +314,15 @@ export class ZLinkFormalRemoteActorAdmissionRegistry {
326
314
  entry.actor = actor;
327
315
  }
328
316
 
329
- attachDeferredJoinRoot(
330
- transferId: string,
331
- root: ZLinkDeferredJoinAcceptedRoot
332
- ): void {
317
+ attachDeferredJoinRoot(transferId: string, root: ZLinkDeferredJoinAcceptedRoot): void {
333
318
  const entry = this.admissions.get(transferId);
334
- if (entry === undefined || entry.state !== 'admitted'
335
- || entry.result === undefined || 'error' in entry.result || !entry.result.accepted) {
319
+ if (
320
+ entry === undefined ||
321
+ entry.state !== 'admitted' ||
322
+ entry.result === undefined ||
323
+ 'error' in entry.result ||
324
+ !entry.result.accepted
325
+ ) {
336
326
  throw new Error(`Remote actor admission '${transferId}' cannot attach deferred recovery.`);
337
327
  }
338
328
  entry.result = { ...entry.result, deferredJoinRoot: root };
@@ -377,35 +367,39 @@ function sameAdmission(
377
367
  left: ZLinkFormalRemoteActorAdmission,
378
368
  right: ZLinkFormalRemoteActorAdmission
379
369
  ): boolean {
380
- return left.actorId === right.actorId
381
- && left.actorType === right.actorType
382
- && String(left.spotId) === String(right.spotId)
383
- && left.targetSpotGeneration === right.targetSpotGeneration
384
- && left.expectedMembershipEpoch === right.expectedMembershipEpoch
385
- && left.requestFingerprint === right.requestFingerprint
386
- && sameOperationId(left.completionOperationId, right.completionOperationId)
387
- && String(left.sourceSpotId ?? '') === String(right.sourceSpotId ?? '')
388
- && String(left.sourceActorNodeRid ?? '') === String(right.sourceActorNodeRid ?? '')
389
- && left.actorRef.actorId === right.actorRef.actorId
390
- && String(left.actorRef.nodeRid) === String(right.actorRef.nodeRid)
391
- && left.actorRef.objectGeneration === right.actorRef.objectGeneration;
370
+ return (
371
+ left.actorId === right.actorId &&
372
+ left.actorType === right.actorType &&
373
+ String(left.spotId) === String(right.spotId) &&
374
+ left.targetSpotGeneration === right.targetSpotGeneration &&
375
+ left.expectedMembershipEpoch === right.expectedMembershipEpoch &&
376
+ left.requestFingerprint === right.requestFingerprint &&
377
+ sameOperationId(left.completionOperationId, right.completionOperationId) &&
378
+ String(left.sourceSpotId ?? '') === String(right.sourceSpotId ?? '') &&
379
+ String(left.sourceActorNodeRid ?? '') === String(right.sourceActorNodeRid ?? '') &&
380
+ left.actorRef.actorId === right.actorRef.actorId &&
381
+ String(left.actorRef.nodeRid) === String(right.actorRef.nodeRid) &&
382
+ left.actorRef.objectGeneration === right.actorRef.objectGeneration
383
+ );
392
384
  }
393
385
 
394
386
  function sameProvisionalAdmission(
395
387
  left: ZLinkFormalRemoteActorAdmission,
396
388
  right: ZLinkProvisionalRemoteActorAdmission
397
389
  ): boolean {
398
- return left.actorId === right.actorId
399
- && String(left.spotId) === String(right.spotId)
400
- && left.targetSpotGeneration === right.targetSpotGeneration
401
- && left.expectedMembershipEpoch === right.expectedMembershipEpoch
402
- && left.requestFingerprint === right.requestFingerprint
403
- && sameOperationId(left.completionOperationId, right.completionOperationId)
404
- && String(left.sourceSpotId ?? '') === String(right.sourceSpotId ?? '')
405
- && String(left.sourceActorNodeRid ?? '') === String(right.sourceActorNodeRid ?? '')
406
- && left.actorRef.actorId === right.actorRef.actorId
407
- && String(left.actorRef.nodeRid) === String(right.actorRef.nodeRid)
408
- && left.actorRef.objectGeneration === right.actorRef.objectGeneration;
390
+ return (
391
+ left.actorId === right.actorId &&
392
+ String(left.spotId) === String(right.spotId) &&
393
+ left.targetSpotGeneration === right.targetSpotGeneration &&
394
+ left.expectedMembershipEpoch === right.expectedMembershipEpoch &&
395
+ left.requestFingerprint === right.requestFingerprint &&
396
+ sameOperationId(left.completionOperationId, right.completionOperationId) &&
397
+ String(left.sourceSpotId ?? '') === String(right.sourceSpotId ?? '') &&
398
+ String(left.sourceActorNodeRid ?? '') === String(right.sourceActorNodeRid ?? '') &&
399
+ left.actorRef.actorId === right.actorRef.actorId &&
400
+ String(left.actorRef.nodeRid) === String(right.actorRef.nodeRid) &&
401
+ left.actorRef.objectGeneration === right.actorRef.objectGeneration
402
+ );
409
403
  }
410
404
 
411
405
  function sameOperationId(
@@ -16,11 +16,14 @@ export interface ZLinkFormalRemoteActorTransfer {
16
16
  /** Keeps the source-leave fence attached to one admitted formal transfer. */
17
17
  export class ZLinkFormalRemoteActorTransferRegistry {
18
18
  private readonly lane = new ZLinkStateLane();
19
- private readonly transfers = new Map<string, {
20
- readonly transfer: ZLinkFormalRemoteActorTransfer;
21
- readonly resolveTargetLifecycleCompleted: () => void;
22
- readonly resolveSourceLeaveTerminal: (succeeded: boolean) => void;
23
- }>();
19
+ private readonly transfers = new Map<
20
+ string,
21
+ {
22
+ readonly transfer: ZLinkFormalRemoteActorTransfer;
23
+ readonly resolveTargetLifecycleCompleted: () => void;
24
+ readonly resolveSourceLeaveTerminal: (succeeded: boolean) => void;
25
+ }
26
+ >();
24
27
  private readonly transfersById = new Map<string, ZLinkFormalRemoteActorTransfer>();
25
28
 
26
29
  has(actorId: string): boolean {
@@ -108,19 +111,21 @@ export class ZLinkFormalRemoteActorTransferRegistry {
108
111
  const pending = this.completeSourceLeaveTerminalStartCore(actorId, transferId);
109
112
  if (pending === undefined) return false;
110
113
  await pending.transfer.targetLifecycleCompleted;
111
- return await this.lane.run(() => this.completeSourceLeaveTerminalCore(
112
- actorId,
113
- transferId,
114
- pending,
115
- succeeded
116
- ));
114
+ return await this.lane.run(() =>
115
+ this.completeSourceLeaveTerminalCore(actorId, transferId, pending, succeeded)
116
+ );
117
117
  }
118
118
 
119
- private completeSourceLeaveTerminalStartCore(actorId: string, transferId: string): {
120
- readonly transfer: ZLinkFormalRemoteActorTransfer;
121
- readonly resolveTargetLifecycleCompleted: () => void;
122
- readonly resolveSourceLeaveTerminal: (succeeded: boolean) => void;
123
- } | undefined {
119
+ private completeSourceLeaveTerminalStartCore(
120
+ actorId: string,
121
+ transferId: string
122
+ ):
123
+ | {
124
+ readonly transfer: ZLinkFormalRemoteActorTransfer;
125
+ readonly resolveTargetLifecycleCompleted: () => void;
126
+ readonly resolveSourceLeaveTerminal: (succeeded: boolean) => void;
127
+ }
128
+ | undefined {
124
129
  const pending = this.transfers.get(actorId);
125
130
  return pending === undefined || pending.transfer.transferId !== transferId
126
131
  ? undefined
@@ -137,10 +142,8 @@ export class ZLinkFormalRemoteActorTransferRegistry {
137
142
  },
138
143
  succeeded: boolean
139
144
  ): boolean {
140
- if (
141
- pending.transfer.transferId !== transferId
142
- || this.transfers.get(actorId) !== pending
143
- ) return false;
145
+ if (pending.transfer.transferId !== transferId || this.transfers.get(actorId) !== pending)
146
+ return false;
144
147
  pending.resolveSourceLeaveTerminal(succeeded);
145
148
  return true;
146
149
  }