@zlink-systems/framework 0.24.0 → 0.26.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 (215) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Channels/IZLinkFanoutClient.d.ts +0 -6
  3. package/dist/contracts/RouteMesh/RuntimeTopology.d.ts +8 -0
  4. package/dist/internal.d.ts +1 -0
  5. package/dist/internal.js +1 -0
  6. package/dist/runtime/activation-admission.d.ts +29 -0
  7. package/dist/runtime/activation-admission.js +61 -0
  8. package/dist/runtime/actors/actor-context.js +6 -6
  9. package/dist/runtime/actors/actor-handoff.d.ts +9 -3
  10. package/dist/runtime/actors/actor-handoff.js +28 -17
  11. package/dist/runtime/actors/actor-local-native-join.js +2 -18
  12. package/dist/runtime/actors/actor-remote-joiner.d.ts +2 -2
  13. package/dist/runtime/actors/actor-remote-joiner.js +6 -8
  14. package/dist/runtime/actors/actor-runtime-contracts.d.ts +4 -2
  15. package/dist/runtime/actors/actor-source-transfer.d.ts +5 -5
  16. package/dist/runtime/actors/deferred-join-completion.d.ts +14 -0
  17. package/dist/runtime/actors/deferred-join-completion.js +20 -0
  18. package/dist/runtime/actors/index.d.ts +1 -1
  19. package/dist/runtime/actors/index.js +15 -5
  20. package/dist/runtime/admission.d.ts +5 -1
  21. package/dist/runtime/admission.js +4 -0
  22. package/dist/runtime/backend/contracts/index.d.ts +2 -10
  23. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -9
  24. package/dist/runtime/backend/node/node-backend-adapter-factory.d.ts +1 -2
  25. package/dist/runtime/backend/node/node-backend-adapter-factory.js +4 -18
  26. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +6 -3
  27. package/dist/runtime/backend/node/node-backend-adapter-support.js +12 -28
  28. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +1 -1
  29. package/dist/runtime/backend/node/node-event-loop-poller.js +8 -2
  30. package/dist/runtime/backend/node/node-raw-binding-port.d.ts +1 -1
  31. package/dist/runtime/backend/node/node-raw-binding-port.js +11 -3
  32. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +12 -9
  33. package/dist/runtime/backend/node/node-raw-mesh-backend.js +61 -29
  34. package/dist/runtime/backend/node/node-socket-backend-adapter.js +1 -1
  35. package/dist/runtime/backend/raw-binding-port.d.ts +12 -0
  36. package/dist/runtime/channels/channel-clients.d.ts +0 -1
  37. package/dist/runtime/channels/channel-clients.js +0 -8
  38. package/dist/runtime/channels/channel-outbound-operations.js +2 -10
  39. package/dist/runtime/channels/channel-runtime-manager.d.ts +2 -5
  40. package/dist/runtime/channels/channel-runtime-manager.js +1 -12
  41. package/dist/runtime/channels/channel-socket-registry.d.ts +17 -4
  42. package/dist/runtime/channels/channel-socket-registry.js +49 -62
  43. package/dist/runtime/channels/channel-transports.d.ts +0 -3
  44. package/dist/runtime/channels/fanout-location-runtime.js +3 -9
  45. package/dist/runtime/execution/index.d.ts +18 -8
  46. package/dist/runtime/execution/index.js +55 -29
  47. package/dist/runtime/execution/serial-execution-queue.d.ts +5 -6
  48. package/dist/runtime/execution/serial-execution-queue.js +49 -15
  49. package/dist/runtime/foundation/listener-records.d.ts +11 -0
  50. package/dist/runtime/foundation/listener-records.js +20 -0
  51. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +10 -21
  52. package/dist/runtime/foundation/raw-service-mesh-runtime.js +66 -392
  53. package/dist/runtime/foundation/service-authority-payload-codec.d.ts +1 -0
  54. package/dist/runtime/foundation/service-authority-payload-codec.js +8 -0
  55. package/dist/runtime/foundation/service-maintenance-runtime.js +23 -2
  56. package/dist/runtime/foundation/service-relocation-coordinator.d.ts +9 -0
  57. package/dist/runtime/foundation/service-relocation-coordinator.js +14 -1
  58. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +8 -0
  59. package/dist/runtime/foundation/service-relocation-object-owner.js +16 -4
  60. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +6 -13
  61. package/dist/runtime/foundation/service-stateful-runtime.d.ts +10 -7
  62. package/dist/runtime/foundation/service-stateful-runtime.js +100 -60
  63. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +9 -4
  64. package/dist/runtime/foundation/service-stateful-wire-codec.js +153 -90
  65. package/dist/runtime/foundation/service-topology-registry.d.ts +1 -2
  66. package/dist/runtime/foundation/service-topology-registry.js +6 -30
  67. package/dist/runtime/host/actor-transfer-runtime.d.ts +17 -15
  68. package/dist/runtime/host/actor-transfer-runtime.js +73 -86
  69. package/dist/runtime/host/index.d.ts +6 -2
  70. package/dist/runtime/host/index.js +63 -37
  71. package/dist/runtime/host/remote-bound-session-relay.js +4 -3
  72. package/dist/runtime/host/route-mesh-runtime.d.ts +2 -0
  73. package/dist/runtime/host/route-mesh-runtime.js +7 -5
  74. package/dist/runtime/host/service-relocation-host-runtime.d.ts +50 -8
  75. package/dist/runtime/host/service-relocation-host-runtime.js +343 -270
  76. package/dist/runtime/host/spot-runtime-options-factory.d.ts +7 -4
  77. package/dist/runtime/host/spot-runtime-options-factory.js +4 -8
  78. package/dist/runtime/host/stateful-authority-route-runtime.js +6 -2
  79. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +11 -3
  80. package/dist/runtime/host/user-spot-creation-coordinator.js +85 -87
  81. package/dist/runtime/locations/in-memory-provider-location-store.js +8 -6
  82. package/dist/runtime/locations/lifecycle.d.ts +1 -1
  83. package/dist/runtime/locations/lifecycle.js +2 -2
  84. package/dist/runtime/locations/resolvers.js +7 -2
  85. package/dist/runtime/locations/spot-location-claims.d.ts +2 -2
  86. package/dist/runtime/locations/spot-location-claims.js +3 -27
  87. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +1 -0
  88. package/dist/runtime/protocol/service_wire_codec.generated.js +5 -1
  89. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +1 -0
  90. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +3 -2
  91. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +3 -3
  92. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +4 -4
  93. package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +3 -3
  94. package/dist/runtime/spots/index.d.ts +25 -19
  95. package/dist/runtime/spots/index.js +207 -205
  96. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
  97. package/dist/runtime/spots/spot-activation-registry.js +34 -31
  98. package/dist/runtime/spots/spot-activation-state.d.ts +2 -11
  99. package/dist/runtime/spots/spot-activation-state.js +4 -17
  100. package/dist/runtime/spots/spot-activation.d.ts +8 -6
  101. package/dist/runtime/spots/spot-activation.js +54 -49
  102. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -1
  103. package/dist/runtime/spots/spot-actor-admission-coordinator.js +1 -1
  104. package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +2 -2
  105. package/dist/runtime/spots/spot-actor-join-dispatch.js +3 -5
  106. package/dist/runtime/spots/spot-actor-lifecycle-drain.js +2 -2
  107. package/dist/runtime/spots/spot-actor-membership.d.ts +4 -0
  108. package/dist/runtime/spots/spot-actor-membership.js +26 -12
  109. package/dist/runtime/spots/spot-entry-activation.d.ts +1 -2
  110. package/dist/runtime/spots/spot-entry-activation.js +0 -1
  111. package/dist/runtime/spots/spot-manager-public.js +1 -1
  112. package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +1 -1
  113. package/dist/runtime/spots/spot-native-actor-join-admission.js +2 -2
  114. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +5 -5
  115. package/dist/runtime/spots/spot-node-runtime-manager.js +7 -11
  116. package/dist/runtime/spots/spot-outbound.js +1 -29
  117. package/dist/runtime/spots/spot-routed-actor-admission.d.ts +1 -0
  118. package/dist/runtime/spots/spot-routed-actor-admission.js +10 -0
  119. package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +2 -6
  120. package/dist/runtime/spots/spot-routed-frame-dispatch.js +2 -70
  121. package/dist/runtime/spots/spot-runtime-ports.d.ts +3 -5
  122. package/dist/runtime/spots/spot-serial-executor.d.ts +5 -0
  123. package/dist/runtime/spots/spot-serial-executor.js +8 -1
  124. package/dist/runtime/spots/spot-serial-turn-executor.d.ts +3 -0
  125. package/dist/runtime/spots/spot-serial-turn-executor.js +8 -4
  126. package/dist/runtime/streams/actor-session-binding-registry.d.ts +13 -15
  127. package/dist/runtime/streams/actor-session-binding-registry.js +19 -171
  128. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +3 -4
  129. package/dist/runtime/streams/bound-session-service.js +1 -18
  130. package/dist/runtime/streams/index.d.ts +2 -0
  131. package/dist/runtime/streams/index.js +19 -19
  132. package/dist/runtime/streams/session-serial-executor.js +2 -2
  133. package/package.json +3 -3
  134. package/src/contracts/Channels/IZLinkFanoutClient.ts +0 -7
  135. package/src/contracts/RouteMesh/RuntimeTopology.ts +10 -0
  136. package/src/internal.ts +1 -0
  137. package/src/runtime/activation-admission.ts +78 -0
  138. package/src/runtime/actors/actor-context.ts +6 -6
  139. package/src/runtime/actors/actor-handoff.ts +31 -23
  140. package/src/runtime/actors/actor-local-native-join.ts +3 -42
  141. package/src/runtime/actors/actor-remote-joiner.ts +6 -25
  142. package/src/runtime/actors/actor-runtime-contracts.ts +4 -10
  143. package/src/runtime/actors/actor-source-transfer.ts +5 -18
  144. package/src/runtime/actors/deferred-join-completion.ts +40 -0
  145. package/src/runtime/actors/index.ts +22 -9
  146. package/src/runtime/admission.ts +5 -1
  147. package/src/runtime/backend/contracts/index.ts +2 -13
  148. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +2 -10
  149. package/src/runtime/backend/node/node-backend-adapter-factory.ts +5 -25
  150. package/src/runtime/backend/node/node-backend-adapter-support.ts +9 -29
  151. package/src/runtime/backend/node/node-event-loop-poller.ts +14 -2
  152. package/src/runtime/backend/node/node-raw-binding-port.ts +17 -3
  153. package/src/runtime/backend/node/node-raw-mesh-backend.ts +65 -32
  154. package/src/runtime/backend/node/node-socket-backend-adapter.ts +2 -2
  155. package/src/runtime/backend/raw-binding-port.ts +13 -0
  156. package/src/runtime/channels/channel-clients.ts +0 -11
  157. package/src/runtime/channels/channel-outbound-operations.ts +3 -11
  158. package/src/runtime/channels/channel-runtime-manager.ts +4 -15
  159. package/src/runtime/channels/channel-socket-registry.ts +69 -71
  160. package/src/runtime/channels/channel-transports.ts +0 -3
  161. package/src/runtime/channels/fanout-location-runtime.ts +4 -16
  162. package/src/runtime/execution/index.ts +68 -30
  163. package/src/runtime/execution/serial-execution-queue.ts +52 -20
  164. package/src/runtime/foundation/listener-records.ts +21 -0
  165. package/src/runtime/foundation/raw-service-mesh-runtime.ts +66 -466
  166. package/src/runtime/foundation/service-authority-payload-codec.ts +10 -0
  167. package/src/runtime/foundation/service-maintenance-runtime.ts +30 -9
  168. package/src/runtime/foundation/service-relocation-coordinator.ts +13 -0
  169. package/src/runtime/foundation/service-relocation-object-owner.ts +18 -5
  170. package/src/runtime/foundation/service-session-binding-ingress-port.ts +6 -14
  171. package/src/runtime/foundation/service-stateful-runtime.ts +151 -89
  172. package/src/runtime/foundation/service-stateful-wire-codec.ts +203 -121
  173. package/src/runtime/foundation/service-topology-registry.ts +8 -48
  174. package/src/runtime/host/actor-transfer-runtime.ts +94 -166
  175. package/src/runtime/host/index.ts +119 -54
  176. package/src/runtime/host/remote-bound-session-relay.ts +4 -3
  177. package/src/runtime/host/route-mesh-runtime.ts +9 -5
  178. package/src/runtime/host/service-relocation-host-runtime.ts +495 -376
  179. package/src/runtime/host/spot-runtime-options-factory.ts +24 -13
  180. package/src/runtime/host/stateful-authority-route-runtime.ts +8 -4
  181. package/src/runtime/host/user-spot-creation-coordinator.ts +147 -142
  182. package/src/runtime/locations/in-memory-provider-location-store.ts +11 -7
  183. package/src/runtime/locations/lifecycle.ts +3 -2
  184. package/src/runtime/locations/resolvers.ts +19 -13
  185. package/src/runtime/locations/spot-location-claims.ts +5 -34
  186. package/src/runtime/protocol/service_wire_codec.generated.ts +9 -2
  187. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +4 -4
  188. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +6 -6
  189. package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +3 -3
  190. package/src/runtime/spots/index.ts +341 -295
  191. package/src/runtime/spots/spot-activation-registry.ts +41 -31
  192. package/src/runtime/spots/spot-activation-state.ts +4 -16
  193. package/src/runtime/spots/spot-activation.ts +102 -80
  194. package/src/runtime/spots/spot-actor-admission-coordinator.ts +2 -2
  195. package/src/runtime/spots/spot-actor-join-dispatch.ts +6 -7
  196. package/src/runtime/spots/spot-actor-lifecycle-drain.ts +20 -18
  197. package/src/runtime/spots/spot-actor-membership.ts +81 -17
  198. package/src/runtime/spots/spot-entry-activation.ts +0 -3
  199. package/src/runtime/spots/spot-manager-public.ts +8 -4
  200. package/src/runtime/spots/spot-native-actor-join-admission.ts +2 -2
  201. package/src/runtime/spots/spot-node-runtime-manager.ts +12 -18
  202. package/src/runtime/spots/spot-outbound.ts +4 -47
  203. package/src/runtime/spots/spot-routed-actor-admission.ts +20 -0
  204. package/src/runtime/spots/spot-routed-frame-dispatch.ts +6 -76
  205. package/src/runtime/spots/spot-runtime-ports.ts +6 -17
  206. package/src/runtime/spots/spot-serial-executor.ts +9 -1
  207. package/src/runtime/spots/spot-serial-turn-executor.ts +10 -4
  208. package/src/runtime/streams/actor-session-binding-registry.ts +20 -308
  209. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +2 -12
  210. package/src/runtime/streams/bound-session-service.ts +2 -36
  211. package/src/runtime/streams/index.ts +29 -27
  212. package/src/runtime/streams/session-serial-executor.ts +2 -2
  213. package/dist/runtime/actors/deferred-join-accepted-journal.d.ts +0 -47
  214. package/dist/runtime/actors/deferred-join-accepted-journal.js +0 -992
  215. package/src/runtime/actors/deferred-join-accepted-journal.ts +0 -1346
@@ -67,6 +67,10 @@ export class ZLinkSpotSerialTurnExecutor {
67
67
  return this.scheduler.close();
68
68
  }
69
69
 
70
+ closeAdmission(): void {
71
+ this.scheduler.closeAdmission();
72
+ }
73
+
70
74
  /** Distinguishes a gate-owning turn from a suspended AsyncLocalStorage tail. */
71
75
  isActiveTurn(turn: ZLinkSpotSerialTurn, turnId: number): boolean {
72
76
  return (
@@ -157,6 +161,11 @@ export class ZLinkSpotSerialTurnExecutor {
157
161
  return this.enqueueFrameworkTurn(operation, workOptions);
158
162
  }
159
163
 
164
+ /** Holds this Spot's lifecycle FIFO until the full operation result settles. */
165
+ executeLifecycleOperation<T>(operation: () => Promise<T> | T): Promise<T> {
166
+ return this.scheduler.submitLifecycleOperation(operation);
167
+ }
168
+
160
169
  private async enqueueApplicationTurn<T>(
161
170
  operation: () => Promise<T> | T,
162
171
  workOptions: ZLinkSerialWorkOptions = {}
@@ -275,9 +284,7 @@ export class ZLinkSpotSerialTurnExecutor {
275
284
  resume: () => void,
276
285
  reject: (reason: unknown) => void
277
286
  ): boolean {
278
- const barrier = this.executionBarrier;
279
- const resumeClaim = barrier?.tryEnter();
280
- if (barrier !== undefined && resumeClaim === undefined) {
287
+ if (!turn.resumeExecutionClaim()) {
281
288
  reject(
282
289
  createInternalFrameworkException(
283
290
  ZLinkFrameworkInternalErrorKind.SpotMoving,
@@ -286,7 +293,6 @@ export class ZLinkSpotSerialTurnExecutor {
286
293
  );
287
294
  return true;
288
295
  }
289
- turn.bindExecutionClaim(resumeClaim);
290
296
  void this.enqueueContinuationTurn(async () => {
291
297
  this.resumedOwnerTurn = turn;
292
298
  try {
@@ -5,11 +5,7 @@ import {
5
5
  import { createAbortError, throwIfAborted } from '../abort';
6
6
  import { AsyncResource } from 'node:async_hooks';
7
7
  import { ZLinkStateLane } from '../execution/state-lane';
8
- import { routingIdsEqual } from '../routing-id';
9
- import type {
10
- ServiceSessionBindingAdmissionClaim,
11
- ServiceSessionBindingAdmissionResult
12
- } from '../foundation/service-session-binding-ingress-port';
8
+ import type { ServiceSessionBindingAdmissionResult } from '../foundation/service-session-binding-ingress-port';
13
9
 
14
10
  const detachedStateLaneResource = new AsyncResource('zlink:actor-session-binding-registry');
15
11
  export interface ZLinkActorSessionBindingActor {
@@ -55,15 +51,6 @@ export interface ZLinkActorSessionRetainedOutbound {
55
51
  fail(error: unknown): void;
56
52
  }
57
53
 
58
- export interface ZLinkActorSessionAcceptedProducerProof {
59
- readonly actorId: string;
60
- readonly objectGeneration: bigint;
61
- readonly actorNodeRid: string;
62
- readonly actorNodeGeneration: bigint;
63
- readonly sessionIdentity: string;
64
- readonly bindingGeneration: bigint;
65
- }
66
-
67
54
  export interface ZLinkActorSessionRelocationSnapshot extends ZLinkActorSessionRelocationClaim {
68
55
  readonly phase: 'sealed' | 'applying' | 'applied' | 'terminal';
69
56
  readonly applyFingerprint?: string;
@@ -107,7 +94,6 @@ interface ZLinkActorSessionRelocationState {
107
94
  phase: 'sealed' | 'applying' | 'applied' | 'terminal';
108
95
  applyFingerprint?: string;
109
96
  applyPromise?: Promise<void>;
110
- acceptedProducerProof?: ZLinkActorSessionAcceptedProducerProof;
111
97
  readonly ready: Promise<void>;
112
98
  readonly terminal: Promise<void>;
113
99
  readonly resolveTerminal: () => void;
@@ -117,8 +103,6 @@ interface ZLinkActorSessionOutboundEntry {
117
103
  readonly sealId?: string;
118
104
  readonly operation: ZLinkActorSessionRetainedOutbound;
119
105
  readonly arrivalOrder: bigint;
120
- readonly claim?: ServiceSessionBindingAdmissionClaim;
121
- readonly authorization: 'legacy' | 'source' | 'pendingTarget';
122
106
  released: boolean;
123
107
  settled: boolean;
124
108
  }
@@ -851,65 +835,18 @@ export class ZLinkActorSessionBindingRegistry<
851
835
  return 'rejected';
852
836
  }
853
837
  }
854
- return this.retainRelocationOutboundCore(actorId, operation, 'legacy');
855
- }
856
-
857
- async admitRelocationOutbound(
858
- claim: ServiceSessionBindingAdmissionClaim,
859
- operation: ZLinkActorSessionRetainedOutbound
860
- ): Promise<ServiceSessionBindingAdmissionResult> {
861
- return await this.lane.run(() => this.admitRelocationOutboundCore(claim, operation));
862
- }
863
-
864
- private admitRelocationOutboundCore(
865
- claim: ServiceSessionBindingAdmissionClaim,
866
- operation: ZLinkActorSessionRetainedOutbound
867
- ): ServiceSessionBindingAdmissionResult {
868
- const queue = this.relocations.get(claim.actorId);
869
- const state =
870
- queue?.activeSealId === undefined ? undefined : queue.seals.get(queue.activeSealId);
871
- const error = this.outboundAdmissionError(claim);
872
- if (error !== undefined) {
873
- failRetainedOutbound(operation, error);
874
- return 'rejected';
875
- }
876
- if (queue === undefined || state === undefined) {
877
- if (!this.matchesCurrentProducerNode(claim)) {
878
- failRetainedOutbound(
879
- operation,
880
- new Error(
881
- `Actor '${claim.actorId}' Session outbound admission was fenced by its current binding.`
882
- )
883
- );
884
- return 'rejected';
885
- }
886
- if (queue === undefined) return 'passThrough';
887
- return this.retainRelocationOutboundCore(claim.actorId, operation, 'source', claim);
888
- }
889
- if (state.phase === 'sealed' || state.phase === 'applying') {
890
- const matchesSource = matchesRelocationSourceProof(state, claim);
891
- const matchesCurrent = this.matchesCurrentProducerNode(claim);
892
- const authorization = matchesSource || matchesCurrent ? 'source' : 'pendingTarget';
893
- return this.retainRelocationOutboundCore(claim.actorId, operation, authorization, claim);
894
- }
895
- const acceptedProof = state.acceptedProducerProof;
896
- if (acceptedProof === undefined || !matchesAcceptedProducerProof(acceptedProof, claim)) {
897
- failRetainedOutbound(
898
- operation,
899
- new Error(
900
- `Actor '${claim.actorId}' Session outbound admission did not match its accepted producer proof.`
901
- )
902
- );
903
- return 'rejected';
904
- }
905
- return this.retainRelocationOutboundCore(claim.actorId, operation, 'source', claim);
838
+ return this.retainRelocationOutboundCore(actorId, operation);
906
839
  }
907
840
 
841
+ /**
842
+ * Session–Actor binding §8.1: the Session owner holds a push only while the
843
+ * binding's relocation seal is open, and keeps it behind earlier held pushes.
844
+ * Whether the push names the current binding was decided once by the Session
845
+ * owner's binding record before this call.
846
+ */
908
847
  private retainRelocationOutboundCore(
909
848
  actorId: string,
910
- operation: ZLinkActorSessionRetainedOutbound,
911
- authorization: ZLinkActorSessionOutboundEntry['authorization'],
912
- claim?: ServiceSessionBindingAdmissionClaim
849
+ operation: ZLinkActorSessionRetainedOutbound
913
850
  ): ServiceSessionBindingAdmissionResult {
914
851
  const queue = this.relocations.get(actorId);
915
852
  const state =
@@ -920,9 +857,7 @@ export class ZLinkActorSessionBindingRegistry<
920
857
  if (!this.reserveOutbound(queue, operation)) return 'rejected';
921
858
  queue.outbound.push({
922
859
  operation,
923
- authorization,
924
860
  arrivalOrder: queue.nextArrivalOrder++,
925
- ...(claim === undefined ? {} : { claim }),
926
861
  released: true,
927
862
  settled: false
928
863
  });
@@ -933,9 +868,7 @@ export class ZLinkActorSessionBindingRegistry<
933
868
  queue.outbound.push({
934
869
  sealId: state.sealId,
935
870
  operation,
936
- authorization,
937
871
  arrivalOrder: queue.nextArrivalOrder++,
938
- ...(claim === undefined ? {} : { claim }),
939
872
  released: false,
940
873
  settled: false
941
874
  });
@@ -962,12 +895,10 @@ export class ZLinkActorSessionBindingRegistry<
962
895
  actorId: string,
963
896
  sealId: string,
964
897
  applyFingerprint: string,
965
- action: 'commit' | 'abort',
966
- commitOwnerTransition: () => Promise<void>,
967
- acceptedProducerProof?: ZLinkActorSessionAcceptedProducerProof
898
+ commitOwnerTransition: () => Promise<void>
968
899
  ): Promise<void> {
969
900
  const prepared = await this.lane.run(() =>
970
- this.prepareRelocationApply(actorId, sealId, applyFingerprint, action, acceptedProducerProof)
901
+ this.prepareRelocationApply(actorId, sealId, applyFingerprint)
971
902
  );
972
903
  if (prepared.applyPromise !== undefined) {
973
904
  await prepared.applyPromise;
@@ -991,19 +922,14 @@ export class ZLinkActorSessionBindingRegistry<
991
922
  private prepareRelocationApply(
992
923
  actorId: string,
993
924
  sealId: string,
994
- applyFingerprint: string,
995
- action: 'commit' | 'abort',
996
- acceptedProducerProof?: ZLinkActorSessionAcceptedProducerProof
925
+ applyFingerprint: string
997
926
  ): {
998
927
  readonly queue: ZLinkActorSessionRelocationQueue;
999
928
  readonly state: ZLinkActorSessionRelocationState;
1000
929
  readonly applyPromise?: Promise<void>;
1001
- readonly action?: 'commit' | 'abort';
1002
- readonly acceptedProducerProof?: ZLinkActorSessionAcceptedProducerProof;
1003
930
  readonly promise?: Promise<void>;
1004
931
  readonly resolve?: () => void;
1005
932
  readonly reject?: (error: unknown) => void;
1006
- readonly actorId?: string;
1007
933
  readonly sealId?: string;
1008
934
  } {
1009
935
  const queue = this.relocations.get(actorId);
@@ -1025,24 +951,6 @@ export class ZLinkActorSessionBindingRegistry<
1025
951
  }
1026
952
  return { queue, state, applyPromise: state.applyPromise };
1027
953
  }
1028
- if (
1029
- action === 'commit' &&
1030
- acceptedProducerProof !== undefined &&
1031
- !validAcceptedTargetProof(state, acceptedProducerProof)
1032
- ) {
1033
- throw createInternalFrameworkException(
1034
- ZLinkFrameworkInternalErrorKind.ActorLocationStale,
1035
- `Actor '${actorId}' command 44 target producer proof did not match its Session seal.`,
1036
- true
1037
- );
1038
- }
1039
- if (action === 'abort' && acceptedProducerProof !== undefined) {
1040
- throw createInternalFrameworkException(
1041
- ZLinkFrameworkInternalErrorKind.ActorLocationStale,
1042
- `Actor '${actorId}' abort route supplied a target producer proof.`,
1043
- true
1044
- );
1045
- }
1046
954
 
1047
955
  state.phase = 'applying';
1048
956
  state.applyFingerprint = applyFingerprint;
@@ -1056,52 +964,26 @@ export class ZLinkActorSessionBindingRegistry<
1056
964
  return {
1057
965
  queue,
1058
966
  state,
1059
- action,
1060
- acceptedProducerProof,
1061
967
  promise,
1062
968
  resolve,
1063
969
  reject,
1064
- actorId,
1065
970
  sealId
1066
971
  };
1067
972
  }
1068
973
 
974
+ /**
975
+ * Command 44 commit or abort releases every push held under this seal in
976
+ * arrival order (Session–Actor binding §8.1). The held pushes were admitted
977
+ * by the current binding; the route change does not judge them again.
978
+ */
1069
979
  private completeRelocationApply(prepared: {
1070
980
  readonly queue: ZLinkActorSessionRelocationQueue;
1071
981
  readonly state: ZLinkActorSessionRelocationState;
1072
- readonly action?: 'commit' | 'abort';
1073
- readonly acceptedProducerProof?: ZLinkActorSessionAcceptedProducerProof;
1074
- readonly actorId?: string;
1075
982
  readonly sealId?: string;
1076
983
  }): void {
1077
- const { queue, state, action, acceptedProducerProof, actorId, sealId } = prepared;
1078
- const proof =
1079
- action === 'commit'
1080
- ? (acceptedProducerProof ?? this.currentProducerProof(actorId!))
1081
- : relocationSourceProof(state);
1082
- state.acceptedProducerProof = proof;
1083
- for (let index = queue.outbound.length - 1; index >= 0; index--) {
1084
- const entry = queue.outbound[index]!;
1085
- if (entry.sealId !== sealId) continue;
1086
- if (entry.authorization !== 'pendingTarget') {
1087
- entry.released = true;
1088
- continue;
1089
- }
1090
- if (
1091
- action === 'commit' &&
1092
- proof !== undefined &&
1093
- entry.claim !== undefined &&
1094
- matchesAcceptedProducerProof(proof, entry.claim)
1095
- ) {
1096
- entry.released = true;
1097
- continue;
1098
- }
1099
- queue.outbound.splice(index, 1);
1100
- this.failOutbound(
1101
- queue,
1102
- entry,
1103
- new Error(`Actor '${actorId}' pending Session producer did not match command 44 proof.`)
1104
- );
984
+ const { queue, state, sealId } = prepared;
985
+ for (const entry of queue.outbound) {
986
+ if (entry.sealId === sealId) entry.released = true;
1105
987
  }
1106
988
  this.startOutboundDrain(queue);
1107
989
  state.phase = 'applied';
@@ -1113,49 +995,6 @@ export class ZLinkActorSessionBindingRegistry<
1113
995
  prepared.state.phase = 'sealed';
1114
996
  prepared.state.applyFingerprint = undefined;
1115
997
  prepared.state.applyPromise = undefined;
1116
- prepared.state.acceptedProducerProof = undefined;
1117
- }
1118
-
1119
- private currentProducerProof(
1120
- actorId: string
1121
- ): ZLinkActorSessionAcceptedProducerProof | undefined {
1122
- const route = this.routes.get(actorId);
1123
- const actorRef = (
1124
- route?.actor as TActor & {
1125
- readonly ref?: {
1126
- readonly actorId?: unknown;
1127
- readonly objectGeneration?: unknown;
1128
- readonly generation?: unknown;
1129
- readonly nodeRid?: unknown;
1130
- readonly ownerNodeGeneration?: unknown;
1131
- readonly bindingGeneration?: unknown;
1132
- };
1133
- }
1134
- ).ref;
1135
- const sessionIdentity = route?.sessionIdentity;
1136
- if (
1137
- route === undefined ||
1138
- actorRef === undefined ||
1139
- sessionIdentity === undefined ||
1140
- actorRef.ownerNodeGeneration === undefined
1141
- )
1142
- return undefined;
1143
- return {
1144
- actorId,
1145
- objectGeneration: BigInt(
1146
- (actorRef.objectGeneration as bigint | number | string | boolean | undefined) ??
1147
- (actorRef.generation as bigint | number | string | boolean | undefined) ??
1148
- -1
1149
- ),
1150
- actorNodeRid: String(actorRef.nodeRid ?? ''),
1151
- actorNodeGeneration: BigInt(
1152
- actorRef.ownerNodeGeneration as bigint | number | string | boolean
1153
- ),
1154
- sessionIdentity: String(sessionIdentity),
1155
- bindingGeneration: BigInt(
1156
- (actorRef.bindingGeneration as bigint | number | string | boolean | undefined) ?? -1
1157
- )
1158
- };
1159
998
  }
1160
999
 
1161
1000
  async observeRelocationTerminal(
@@ -1548,71 +1387,6 @@ export class ZLinkActorSessionBindingRegistry<
1548
1387
  failRetainedOutbound(entry.operation, error);
1549
1388
  }
1550
1389
 
1551
- private outboundAdmissionError(claim: ServiceSessionBindingAdmissionClaim): Error | undefined {
1552
- if (
1553
- claim.actorId.length === 0 ||
1554
- claim.objectGeneration <= 0n ||
1555
- claim.actorNodeRid.length === 0 ||
1556
- claim.actorNodeGeneration <= 0n ||
1557
- claim.producerNodeRid.length === 0 ||
1558
- claim.producerNodeGeneration <= 0n ||
1559
- claim.bindingGeneration <= 0n ||
1560
- claim.sessionIdentity.length === 0 ||
1561
- !routingIdsEqual(claim.producerNodeRid, claim.actorNodeRid) ||
1562
- claim.producerNodeGeneration !== claim.actorNodeGeneration
1563
- ) {
1564
- return new Error(`Actor '${claim.actorId}' Session outbound admission claim is invalid.`);
1565
- }
1566
- const route = this.routes.get(claim.actorId);
1567
- const ref = route?.actor as
1568
- | (TActor & {
1569
- readonly ref?: {
1570
- readonly actorId?: unknown;
1571
- readonly objectGeneration?: unknown;
1572
- readonly generation?: unknown;
1573
- readonly bindingGeneration?: unknown;
1574
- };
1575
- })
1576
- | undefined;
1577
- const actorRef = ref?.ref;
1578
- const routeSessionIdentity = route?.sessionIdentity;
1579
- if (
1580
- route === undefined ||
1581
- actorRef === undefined ||
1582
- String(actorRef.actorId ?? claim.actorId) !== claim.actorId ||
1583
- BigInt(
1584
- (actorRef.objectGeneration as bigint | number | string | boolean | undefined) ??
1585
- (actorRef.generation as bigint | number | string | boolean | undefined) ??
1586
- -1
1587
- ) !== claim.objectGeneration ||
1588
- BigInt(
1589
- (actorRef.bindingGeneration as bigint | number | string | boolean | undefined) ?? -1
1590
- ) !== claim.bindingGeneration ||
1591
- String(routeSessionIdentity ?? '') !== claim.sessionIdentity
1592
- ) {
1593
- return new Error(
1594
- `Actor '${claim.actorId}' Session outbound admission was fenced by its current binding.`
1595
- );
1596
- }
1597
- return undefined;
1598
- }
1599
-
1600
- private matchesCurrentProducerNode(claim: ServiceSessionBindingAdmissionClaim): boolean {
1601
- const route = this.routes.get(claim.actorId);
1602
- const actorRef = (
1603
- route?.actor as TActor & {
1604
- readonly ref?: {
1605
- readonly nodeRid?: unknown;
1606
- };
1607
- }
1608
- ).ref;
1609
- return (
1610
- route !== undefined &&
1611
- actorRef !== undefined &&
1612
- routingIdsEqual(String(actorRef.nodeRid ?? ''), claim.actorNodeRid)
1613
- );
1614
- }
1615
-
1616
1390
  private rememberTerminalRelocation(state: ZLinkActorSessionRelocationState): void {
1617
1391
  this.terminalRelocations.delete(state);
1618
1392
  this.terminalRelocations.set(state, true);
@@ -1679,68 +1453,6 @@ function startOutsideStateLane<T>(work: () => T): T {
1679
1453
  return detachedStateLaneResource.runInAsyncScope(work);
1680
1454
  }
1681
1455
 
1682
- function matchesRelocationSourceProof(
1683
- state: ZLinkActorSessionRelocationState,
1684
- claim: ServiceSessionBindingAdmissionClaim
1685
- ): boolean {
1686
- return (
1687
- state.actorId === claim.actorId &&
1688
- state.actorGeneration === claim.objectGeneration &&
1689
- state.bindingGeneration === claim.bindingGeneration &&
1690
- state.sessionIdentity === claim.sessionIdentity &&
1691
- state.actorNodeRid !== undefined &&
1692
- routingIdsEqual(state.actorNodeRid, claim.actorNodeRid) &&
1693
- state.actorNodeGeneration === claim.actorNodeGeneration
1694
- );
1695
- }
1696
-
1697
- function matchesAcceptedProducerProof(
1698
- proof: ZLinkActorSessionAcceptedProducerProof,
1699
- claim: ServiceSessionBindingAdmissionClaim
1700
- ): boolean {
1701
- return (
1702
- proof.actorId === claim.actorId &&
1703
- proof.objectGeneration === claim.objectGeneration &&
1704
- routingIdsEqual(proof.actorNodeRid, claim.actorNodeRid) &&
1705
- proof.actorNodeGeneration === claim.actorNodeGeneration &&
1706
- proof.sessionIdentity === claim.sessionIdentity &&
1707
- proof.bindingGeneration === claim.bindingGeneration
1708
- );
1709
- }
1710
-
1711
- function validAcceptedTargetProof(
1712
- state: ZLinkActorSessionRelocationState,
1713
- proof: ZLinkActorSessionAcceptedProducerProof
1714
- ): boolean {
1715
- return (
1716
- proof.actorId === state.actorId &&
1717
- proof.objectGeneration === state.actorGeneration &&
1718
- proof.actorNodeRid.length > 0 &&
1719
- proof.actorNodeGeneration > 0n &&
1720
- proof.sessionIdentity === state.sessionIdentity &&
1721
- proof.bindingGeneration === state.bindingGeneration
1722
- );
1723
- }
1724
-
1725
- function relocationSourceProof(
1726
- state: ZLinkActorSessionRelocationState
1727
- ): ZLinkActorSessionAcceptedProducerProof | undefined {
1728
- if (
1729
- state.sessionIdentity === undefined ||
1730
- state.actorNodeRid === undefined ||
1731
- state.actorNodeGeneration === undefined
1732
- )
1733
- return undefined;
1734
- return {
1735
- actorId: state.actorId,
1736
- objectGeneration: state.actorGeneration,
1737
- actorNodeRid: state.actorNodeRid,
1738
- actorNodeGeneration: state.actorNodeGeneration,
1739
- sessionIdentity: state.sessionIdentity,
1740
- bindingGeneration: state.bindingGeneration
1741
- };
1742
- }
1743
-
1744
1456
  function failRetainedOutbound(operation: ZLinkActorSessionRetainedOutbound, error: unknown): void {
1745
1457
  try {
1746
1458
  operation.fail(error);
@@ -1,11 +1,7 @@
1
1
  import type { ActorRef } from '../../contracts';
2
- import type {
3
- ServiceSessionBindingAdmissionClaim,
4
- ServiceSessionBindingAdmissionResult
5
- } from '../foundation/service-session-binding-ingress-port';
2
+ import type { ServiceSessionBindingAdmissionResult } from '../foundation/service-session-binding-ingress-port';
6
3
  import type {
7
4
  ZLinkActorSessionAuthorityFence,
8
- ZLinkActorSessionAcceptedProducerProof,
9
5
  ZLinkActorSessionRelocationClaim,
10
6
  ZLinkActorSessionRelocationSnapshot,
11
7
  ZLinkActorSessionRetainedOutbound,
@@ -28,18 +24,12 @@ export interface ZLinkActorSessionBindingRuntimeOwner {
28
24
  operation: ZLinkActorSessionRetainedOutbound,
29
25
  sealId?: string
30
26
  ): Promise<ServiceSessionBindingAdmissionResult>;
31
- admitRelocationOutbound(
32
- claim: ServiceSessionBindingAdmissionClaim,
33
- operation: ZLinkActorSessionRetainedOutbound
34
- ): Promise<ServiceSessionBindingAdmissionResult>;
35
27
  discardRelocationOutbound(actorId: string, sealId: string, error: unknown): Promise<void>;
36
28
  applyRelocation(
37
29
  actorId: string,
38
30
  sealId: string,
39
31
  applyFingerprint: string,
40
- action: 'commit' | 'abort',
41
- commitOwnerTransition: () => Promise<void>,
42
- acceptedProducerProof?: ZLinkActorSessionAcceptedProducerProof
32
+ commitOwnerTransition: () => Promise<void>
43
33
  ): Promise<void>;
44
34
  observeRelocationTerminal(
45
35
  actorId: string,
@@ -7,11 +7,7 @@ import type { ActorRef } from '../../contracts';
7
7
  import { ZLinkSubmitStatus, type ZLinkSubmitResult } from '../messaging/submission-result';
8
8
  import type { Message } from '../../contracts/Common/Message';
9
9
  import { throwIfAborted } from '../abort';
10
- import type {
11
- ZLinkBackendActorRef,
12
- ZLinkBackendActorSessionSendFence,
13
- ZLinkBackendActorSessionNode
14
- } from '../backend/contracts';
10
+ import type { ZLinkBackendActorRef, ZLinkBackendActorSessionNode } from '../backend/contracts';
15
11
  import {
16
12
  encodeStreamHeader,
17
13
  resolvePacketName,
@@ -439,8 +435,7 @@ export class ZLinkBoundSessionService {
439
435
  backendActorRef,
440
436
  requireBoundSessionGeneration(actorRef),
441
437
  [frame],
442
- ZLINK_SEND_DONT_WAIT,
443
- boundSessionSendFence(node, backendActorRef, actorRef)
438
+ ZLINK_SEND_DONT_WAIT
444
439
  );
445
440
  }
446
441
 
@@ -479,32 +474,3 @@ function toBoundSessionSendActorRef(actor: ActorRef): ZLinkBackendActorRef {
479
474
  generation: actor.objectGeneration
480
475
  };
481
476
  }
482
-
483
- function boundSessionSendFence(
484
- node: ZLinkBackendActorSessionNode,
485
- backendActor: ZLinkBackendActorRef,
486
- actor: ActorRef
487
- ): ZLinkBackendActorSessionSendFence | undefined {
488
- const internal = actor as ActorRef & {
489
- readonly ownershipGeneration?: bigint;
490
- readonly ownerLeaseGeneration?: bigint;
491
- readonly ownerNodeGeneration?: bigint;
492
- };
493
- const ownerNodeGeneration =
494
- internal.ownerNodeGeneration ?? node.actorNodeGeneration?.(backendActor);
495
- if (
496
- internal.ownershipGeneration === undefined ||
497
- internal.ownershipGeneration <= 0n ||
498
- internal.ownerLeaseGeneration === undefined ||
499
- internal.ownerLeaseGeneration <= 0n ||
500
- ownerNodeGeneration === undefined ||
501
- ownerNodeGeneration <= 0n
502
- ) {
503
- return undefined;
504
- }
505
- return Object.freeze({
506
- targetNodeGeneration: ownerNodeGeneration,
507
- authorityOwnerGeneration: internal.ownershipGeneration,
508
- ownerLeaseGeneration: internal.ownerLeaseGeneration
509
- });
510
- }