@zlink-systems/framework 0.25.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
@@ -42,6 +42,7 @@ const framework_errors_internal_1 = require("../framework-errors-internal");
42
42
  const routing_id_1 = require("../routing-id");
43
43
  const service_wire_constants_generated_1 = require("./service-wire-constants.generated");
44
44
  const service_wire_binary_primitives_1 = require("./service-wire-binary-primitives");
45
+ const service_wire_codec_generated_1 = require("../protocol/service_wire_codec.generated");
45
46
  const service_wire_pilot_codec_generated_1 = require("../protocol/service_wire_pilot_codec.generated");
46
47
  const PREFIX_SIZE = 5;
47
48
  const MAGIC_0 = service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[0];
@@ -491,20 +492,85 @@ function fromGeneratedReplyRelay(value) {
491
492
  })
492
493
  };
493
494
  }
494
- function encodeSpotHeader(kind, sourceSpotId, target, correlation) {
495
- return concat(prefix(kind === 'spotSend' ? exports.M6bServiceWireCommand.spotSend : exports.M6bServiceWireCommand.spotRequest), ...(kind === 'spotRequest' ? [u64(requirePositive(correlation, 'correlation'))] : []), rid(sourceSpotId, 'sourceSpotId'), directSpotFence(target));
495
+ const STATEFUL_MESSAGE_CONTEXT = {
496
+ effectiveCompleteMessageBytesMinusActualEnvelopeOverhead: 0xffff_fdf6,
497
+ effectiveCompleteMessageBytes: 0xffff_ffff
498
+ };
499
+ const STATEFUL_HEADER_PAYLOAD = {
500
+ packetName: 'wire',
501
+ contentType: 'application/json',
502
+ payload: Buffer.from('{}')
503
+ };
504
+ function generatedSpotFence(target) {
505
+ return {
506
+ spot: { spotId: target.spot.spotId, objectGeneration: target.spot.generation },
507
+ targetNodeRid: toGeneratedRoutingId(target.targetNodeRid, 'targetNodeRid'),
508
+ targetNodeGeneration: target.targetNodeGeneration,
509
+ expectedAuthorityOwnerGeneration: target.authorityOwnerGeneration,
510
+ expectedOwnerLeaseGeneration: target.ownerLeaseGeneration
511
+ };
512
+ }
513
+ function generatedActorFence(target) {
514
+ return {
515
+ actor: { actorId: target.actor.actorId, objectGeneration: target.actor.generation },
516
+ targetNodeRid: toGeneratedRoutingId(target.actor.nodeRid, 'targetNodeRid'),
517
+ targetNodeGeneration: target.targetNodeGeneration,
518
+ expectedAuthorityOwnerGeneration: target.authorityOwnerGeneration,
519
+ expectedOwnerLeaseGeneration: target.ownerLeaseGeneration
520
+ };
496
521
  }
497
- function encodeActorHeader(kind, target, correlation, sourceActor, boundSession) {
522
+ function encodeSpotHeader(kind, sourceSpotId, target, correlation, operation = { high: 0n, low: 1n }, messageFollowHopCount = 0, metadataFrame) {
523
+ const common = {
524
+ flags: metadataFrame === undefined ? 0 : exports.M6bServiceWireFlag.metadata,
525
+ operation,
526
+ messageFollowHopCount,
527
+ sourceSpotId,
528
+ targetSpot: generatedSpotFence(target),
529
+ payload: STATEFUL_HEADER_PAYLOAD,
530
+ ...(metadataFrame === undefined
531
+ ? {}
532
+ : { metadata: (0, service_wire_codec_generated_1.decodeMetadataFrame)(metadataFrame, STATEFUL_MESSAGE_CONTEXT) })
533
+ };
534
+ const frames = kind === 'spotSend'
535
+ ? (0, service_wire_codec_generated_1.encodeSpotSendCommand)({ command: kind, ...common }, STATEFUL_MESSAGE_CONTEXT)
536
+ : (0, service_wire_codec_generated_1.encodeSpotRequestCommand)({
537
+ command: kind,
538
+ ...common,
539
+ correlation: requirePositive(correlation, 'correlation')
540
+ }, STATEFUL_MESSAGE_CONTEXT);
541
+ return Buffer.from(frames[0]);
542
+ }
543
+ function encodeActorHeader(kind, target, correlation, sourceActor, boundSession, operation = { high: 0n, low: 1n }, messageFollowHopCount = 0) {
498
544
  const flags = boundSession === undefined
499
545
  ? 0
500
546
  : exports.M6bServiceWireFlag.boundSession | exports.M6bServiceWireFlag.sourceSpotId;
501
- return concat(prefix(kind === 'actorSend' ? exports.M6bServiceWireCommand.actorSend : exports.M6bServiceWireCommand.actorRequest, flags), ...(kind === 'actorRequest' ? [u64(requirePositive(correlation, 'correlation'))] : []), optionalActor(sourceActor), actorFence(target), ...(boundSession === undefined
502
- ? []
503
- : [
504
- rid(boundSession.sessionRid, 'sourceSessionRid'),
505
- u64(boundSession.bindingGeneration),
506
- u64(boundSession.sequence)
507
- ]));
547
+ const common = {
548
+ flags,
549
+ operation,
550
+ messageFollowHopCount,
551
+ sourceActor: sourceActor === undefined
552
+ ? { actorId: null }
553
+ : { actorId: sourceActor.actorId, generation: sourceActor.generation },
554
+ targetActor: generatedActorFence(target),
555
+ ...(boundSession === undefined
556
+ ? {}
557
+ : {
558
+ boundSessionTail: {
559
+ sourceSessionRid: toGeneratedRoutingId(boundSession.sessionRid, 'sourceSessionRid'),
560
+ sourceBindingGeneration: boundSession.bindingGeneration,
561
+ sourceSessionSequence: boundSession.sequence
562
+ }
563
+ }),
564
+ payload: STATEFUL_HEADER_PAYLOAD
565
+ };
566
+ const frames = kind === 'actorSend'
567
+ ? (0, service_wire_codec_generated_1.encodeActorSendCommand)({ command: kind, ...common }, STATEFUL_MESSAGE_CONTEXT)
568
+ : (0, service_wire_codec_generated_1.encodeActorRequestCommand)({
569
+ command: kind,
570
+ ...common,
571
+ correlation: requirePositive(correlation, 'correlation')
572
+ }, STATEFUL_MESSAGE_CONTEXT);
573
+ return Buffer.from(frames[0]);
508
574
  }
509
575
  function encodeLogicalMulticastHeader(channelName, topic, sourceSpotId) {
510
576
  return concat(prefix(exports.M6bServiceWireCommand.logicalMulticast), text8(channelName, 'channelName'), text8(topic, 'topic'), rid(sourceSpotId, 'sourceSpotId'));
@@ -590,7 +656,7 @@ function encodeMessageFollowHeader(record) {
590
656
  }
591
657
  return concat(prefix(exports.M6bServiceWireCommand.messageFollow), Buffer.of(1), u32(body.byteLength, 'messageFollow.length'), body);
592
658
  }
593
- function decodeStatefulHeader(frame) {
659
+ function decodeStatefulHeader(frame, payloadFrame, metadataFrame) {
594
660
  switch (frame[3]) {
595
661
  case exports.M6bServiceWireCommand.userSpotCreate:
596
662
  return fromGeneratedUserSpotCreate((0, service_wire_pilot_codec_generated_1.decodeUserSpotCreate47)(frame));
@@ -598,49 +664,87 @@ function decodeStatefulHeader(frame) {
598
664
  return fromGeneratedUserSpotClose((0, service_wire_pilot_codec_generated_1.decodeUserSpotClose48)(frame));
599
665
  case exports.M6bServiceWireCommand.actorCreate:
600
666
  return fromGeneratedActorCreate((0, service_wire_pilot_codec_generated_1.decodeActorCreate49)(frame));
601
- }
602
- const reader = new Reader(frame);
603
- const command = reader.prefix();
604
- switch (command.command) {
605
667
  case exports.M6bServiceWireCommand.spotSend:
606
- case exports.M6bServiceWireCommand.spotRequest: {
607
- requireFlags(command.flags, 0);
608
- const request = command.command === exports.M6bServiceWireCommand.spotRequest;
609
- const correlation = request ? reader.nonZeroU64('correlation') : undefined;
610
- const sourceSpotId = reader.rid('sourceSpotId');
611
- const target = reader.directSpotFence();
612
- reader.end();
613
- return {
614
- kind: request ? 'spotRequest' : 'spotSend',
615
- ...(correlation === undefined ? {} : { correlation }),
616
- sourceSpotId,
617
- target
618
- };
619
- }
668
+ case exports.M6bServiceWireCommand.spotRequest:
620
669
  case exports.M6bServiceWireCommand.actorSend:
621
670
  case exports.M6bServiceWireCommand.actorRequest: {
622
- const request = command.command === exports.M6bServiceWireCommand.actorRequest;
623
- const hasBinding = command.flags !== 0;
624
- requireFlags(command.flags, hasBinding ? exports.M6bServiceWireFlag.boundSession | exports.M6bServiceWireFlag.sourceSpotId : 0);
625
- const correlation = request ? reader.nonZeroU64('correlation') : undefined;
626
- const sourceActor = reader.optionalActor();
627
- const target = reader.actorFence();
628
- const boundSession = hasBinding
629
- ? {
630
- sessionRid: reader.rid('sourceSessionRid'),
631
- bindingGeneration: reader.nonZeroU64('sourceBindingGeneration'),
632
- sequence: reader.nonZeroU64('sourceSessionSequence')
671
+ const frames = [
672
+ frame,
673
+ ...(metadataFrame === undefined ? [] : [metadataFrame]),
674
+ payloadFrame ??
675
+ (0, service_wire_codec_generated_1.encodeApplicationPayloadEnvelopeV1)(STATEFUL_HEADER_PAYLOAD, STATEFUL_MESSAGE_CONTEXT)
676
+ ];
677
+ try {
678
+ if (frame[3] === exports.M6bServiceWireCommand.spotSend ||
679
+ frame[3] === exports.M6bServiceWireCommand.spotRequest) {
680
+ const decoded = frame[3] === exports.M6bServiceWireCommand.spotSend
681
+ ? (0, service_wire_codec_generated_1.decodeSpotSendCommand)(frames, STATEFUL_MESSAGE_CONTEXT)
682
+ : (0, service_wire_codec_generated_1.decodeSpotRequestCommand)(frames, STATEFUL_MESSAGE_CONTEXT);
683
+ return {
684
+ kind: decoded.command,
685
+ ...(decoded.command === 'spotRequest' ? { correlation: decoded.correlation } : {}),
686
+ operation: decoded.operation,
687
+ messageFollowHopCount: decoded.messageFollowHopCount,
688
+ sourceSpotId: decoded.sourceSpotId,
689
+ target: {
690
+ spot: {
691
+ spotId: decoded.targetSpot.spot.spotId,
692
+ generation: decoded.targetSpot.spot.objectGeneration
693
+ },
694
+ targetNodeRid: fromGeneratedRoutingId(decoded.targetSpot.targetNodeRid, 'targetNodeRid'),
695
+ targetNodeGeneration: decoded.targetSpot.targetNodeGeneration,
696
+ authorityOwnerGeneration: decoded.targetSpot.expectedAuthorityOwnerGeneration,
697
+ ownerLeaseGeneration: decoded.targetSpot.expectedOwnerLeaseGeneration
698
+ }
699
+ };
633
700
  }
634
- : undefined;
635
- reader.end();
636
- return {
637
- kind: request ? 'actorRequest' : 'actorSend',
638
- ...(correlation === undefined ? {} : { correlation }),
639
- ...(sourceActor === undefined ? {} : { sourceActor }),
640
- target,
641
- ...(boundSession === undefined ? {} : { boundSession })
642
- };
701
+ const decoded = frame[3] === exports.M6bServiceWireCommand.actorSend
702
+ ? (0, service_wire_codec_generated_1.decodeActorSendCommand)(frames, STATEFUL_MESSAGE_CONTEXT)
703
+ : (0, service_wire_codec_generated_1.decodeActorRequestCommand)(frames, STATEFUL_MESSAGE_CONTEXT);
704
+ const source = decoded.sourceActor;
705
+ return {
706
+ kind: decoded.command,
707
+ ...(decoded.command === 'actorRequest' ? { correlation: decoded.correlation } : {}),
708
+ operation: decoded.operation,
709
+ messageFollowHopCount: decoded.messageFollowHopCount,
710
+ ...(source.actorId === null
711
+ ? {}
712
+ : {
713
+ sourceActor: {
714
+ nodeRid: '',
715
+ actorId: source.actorId,
716
+ generation: source.generation
717
+ }
718
+ }),
719
+ target: {
720
+ actor: {
721
+ nodeRid: fromGeneratedRoutingId(decoded.targetActor.targetNodeRid, 'targetNodeRid'),
722
+ actorId: decoded.targetActor.actor.actorId,
723
+ generation: decoded.targetActor.actor.objectGeneration
724
+ },
725
+ targetNodeGeneration: decoded.targetActor.targetNodeGeneration,
726
+ authorityOwnerGeneration: decoded.targetActor.expectedAuthorityOwnerGeneration,
727
+ ownerLeaseGeneration: decoded.targetActor.expectedOwnerLeaseGeneration
728
+ },
729
+ ...(decoded.boundSessionTail === undefined
730
+ ? {}
731
+ : {
732
+ boundSession: {
733
+ sessionRid: fromGeneratedRoutingId(decoded.boundSessionTail.sourceSessionRid, 'sourceSessionRid'),
734
+ bindingGeneration: decoded.boundSessionTail.sourceBindingGeneration,
735
+ sequence: decoded.boundSessionTail.sourceSessionSequence
736
+ }
737
+ })
738
+ };
739
+ }
740
+ catch (error) {
741
+ throw new service_wire_m6a_codec_1.ServiceWireProtocolError(error instanceof Error ? error.message : 'Invalid stateful message.');
742
+ }
643
743
  }
744
+ }
745
+ const reader = new Reader(frame);
746
+ const command = reader.prefix();
747
+ switch (command.command) {
644
748
  case exports.M6bServiceWireCommand.logicalMulticast: {
645
749
  requireFlags(command.flags, 0);
646
750
  const result = {
@@ -1182,12 +1286,6 @@ function actorFence(value) {
1182
1286
  function actorAuthorityFence(value) {
1183
1287
  return concat(actorRef(value.actor), rid(value.actor.nodeRid, 'targetNodeRid'), u64(value.targetNodeGeneration), u64(value.authorityOwnerGeneration), u64(value.ownerLeaseGeneration));
1184
1288
  }
1185
- function spotFence(value) {
1186
- return concat(spotRef(value.spot), rid(value.targetNodeRid, 'targetNodeRid'), u64(value.targetNodeGeneration), u64(value.authorityOwnerGeneration), u64(value.ownerLeaseGeneration));
1187
- }
1188
- function directSpotFence(value) {
1189
- return concat(spotFence(value), text16(value.storeVersion, 'storeVersion'));
1190
- }
1191
1289
  function messageFollowRoute(value) {
1192
1290
  const body = value.kind === 'actor'
1193
1291
  ? concat(actorRef(value.actor), rid(value.targetNodeRid, 'targetNodeRid'), u64(value.targetNodeGeneration), u64(value.authorityOwnerGeneration), u64(value.ownerLeaseGeneration))
@@ -1232,11 +1330,6 @@ function validateMessageFollowRecord(value, invalid = (message) => {
1232
1330
  function actorRef(value) {
1233
1331
  return concat(text8(value.actorId, 'actorId'), u64(value.generation));
1234
1332
  }
1235
- function optionalActor(value) {
1236
- return value === undefined
1237
- ? Buffer.of(0)
1238
- : concat(text8(value.actorId, 'sourceActorId'), u64(value.generation));
1239
- }
1240
1333
  function spotRef(value) {
1241
1334
  return concat(rid(value.spotId, 'spotId'), u64(value.generation));
1242
1335
  }
@@ -1408,20 +1501,6 @@ class Reader {
1408
1501
  generation: this.nonZeroU64(`${name}.generation`)
1409
1502
  };
1410
1503
  }
1411
- optionalActor() {
1412
- const length = this.u8('sourceActorId.length');
1413
- if (length === 0)
1414
- return undefined;
1415
- this.need(length, 'sourceActorId');
1416
- const bytes = this.bytes.subarray(this.offset, this.offset + length);
1417
- this.offset += length;
1418
- const actorId = (0, service_wire_binary_primitives_1.decodeCanonicalServiceWireText)(bytes, 'sourceActorId', fail);
1419
- return {
1420
- nodeRid: '',
1421
- actorId,
1422
- generation: this.nonZeroU64('sourceActorGeneration')
1423
- };
1424
- }
1425
1504
  spotRef() {
1426
1505
  return {
1427
1506
  spotId: this.rid('spotId'),
@@ -1438,22 +1517,6 @@ class Reader {
1438
1517
  ownerLeaseGeneration: this.nonZeroU64('ownerLeaseGeneration')
1439
1518
  };
1440
1519
  }
1441
- spotFence() {
1442
- const spot = this.spotRef();
1443
- return {
1444
- spot,
1445
- targetNodeRid: this.rid('targetNodeRid'),
1446
- targetNodeGeneration: this.nonZeroU64('targetNodeGeneration'),
1447
- authorityOwnerGeneration: this.nonZeroU64('authorityOwnerGeneration'),
1448
- ownerLeaseGeneration: this.nonZeroU64('ownerLeaseGeneration')
1449
- };
1450
- }
1451
- directSpotFence() {
1452
- return {
1453
- ...this.spotFence(),
1454
- storeVersion: this.text16('storeVersion')
1455
- };
1456
- }
1457
1520
  messageFollowRoute(name) {
1458
1521
  const kind = this.u8(`${name}.objectKind`);
1459
1522
  const length = this.u16(`${name}.length`);
@@ -26,7 +26,6 @@ export interface ServiceNodeDescriptor {
26
26
  export interface AdmittedServicePeer {
27
27
  readonly descriptor: ServiceNodeDescriptor;
28
28
  readonly connectionId: string;
29
- readonly connectionDiscriminator: string;
30
29
  }
31
30
  export interface ServicePeerAdmissionExpectation {
32
31
  readonly endpoint?: string;
@@ -45,7 +44,7 @@ export declare class ServiceTopologyRegistry {
45
44
  constructor(local: ServiceNodeDescriptor);
46
45
  localDescriptor(): ServiceNodeDescriptor;
47
46
  publishLocal(descriptor: ServiceNodeDescriptor): void;
48
- admit(descriptor: ServiceNodeDescriptor, connectionId: string, expected?: ServicePeerAdmissionExpectation, connectionDiscriminator?: string): PeerAdmissionResult;
47
+ admit(descriptor: ServiceNodeDescriptor, connectionId: string, expected?: ServicePeerAdmissionExpectation): PeerAdmissionResult;
49
48
  disconnect(nodeRoutingId: string, connectionId: string): boolean;
50
49
  peer(nodeRoutingId: string): AdmittedServicePeer | undefined;
51
50
  peers(): readonly AdmittedServicePeer[];
@@ -41,11 +41,10 @@ class ServiceTopologyRegistry {
41
41
  }
42
42
  this.rebuildSelections();
43
43
  }
44
- admit(descriptor, connectionId, expected, connectionDiscriminator = connectionId) {
44
+ admit(descriptor, connectionId, expected) {
45
45
  try {
46
46
  validateDescriptor(descriptor);
47
47
  requireText(connectionId, 'connectionId');
48
- requireText(connectionDiscriminator, 'connectionDiscriminator');
49
48
  }
50
49
  catch (error) {
51
50
  return 'invalidDescriptor';
@@ -83,25 +82,11 @@ class ServiceTopologyRegistry {
83
82
  !sameServiceNodeDescriptor(current.descriptor, descriptor)))) {
84
83
  return 'staleDescriptor';
85
84
  }
86
- if (current !== undefined &&
87
- current.descriptor.lifecycleGeneration === descriptor.lifecycleGeneration &&
88
- current.descriptor.descriptorRevision === descriptor.descriptorRevision &&
89
- sameServiceNodeDescriptor(current.descriptor, descriptor) &&
90
- current.connectionId !== connectionId &&
91
- // A fallback candidate is only a logical placeholder. Once the
92
- // monitor reports the physical connection, its evidence supersedes
93
- // candidate ordering so the request path uses the native route.
94
- !(isUnmonitoredConnectionId(current.connectionId) && !isUnmonitoredConnectionId(connectionId)) &&
95
- compareConnectionCandidate(current.connectionDiscriminator, current.connectionId, connectionDiscriminator, connectionId) <= 0) {
96
- // Both manual directions can reach admission. The same comparison on
97
- // every retry keeps one physical candidate instead of replacing it in
98
- // arrival order.
99
- return 'staleDescriptor';
100
- }
85
+ // Core selects the one route per RID (Core ROUTER §10.1); an admission on
86
+ // that route replaces the admission of a route it replaced.
101
87
  this.peersByRid.set(descriptor.nodeRoutingId, {
102
88
  descriptor: cloneDescriptor(descriptor),
103
- connectionId,
104
- connectionDiscriminator
89
+ connectionId
105
90
  });
106
91
  this.remember(descriptor);
107
92
  this.rebuildSelections();
@@ -188,8 +173,7 @@ class ServiceTopologyRegistry {
188
173
  return this.selectWeightedCycle(`channel:${channelName}`, () => {
189
174
  const local = {
190
175
  descriptor: cloneDescriptor(this.local),
191
- connectionId: 'local',
192
- connectionDiscriminator: 'local'
176
+ connectionId: 'local'
193
177
  };
194
178
  return [local, ...this.peersByRid.values()]
195
179
  .map((peer) => ({
@@ -361,8 +345,7 @@ function cloneDescriptor(descriptor) {
361
345
  function clonePeer(peer) {
362
346
  return {
363
347
  descriptor: cloneDescriptor(peer.descriptor),
364
- connectionId: peer.connectionId,
365
- connectionDiscriminator: peer.connectionDiscriminator
348
+ connectionId: peer.connectionId
366
349
  };
367
350
  }
368
351
  function sameServiceNodeDescriptor(left, right) {
@@ -382,13 +365,6 @@ function sameImmutableDescriptor(left, right) {
382
365
  function arraysEqual(left, right) {
383
366
  return left.length === right.length && left.every((value, index) => value === right[index]);
384
367
  }
385
- function isUnmonitoredConnectionId(connectionId) {
386
- return connectionId.startsWith('unmonitored:');
387
- }
388
- function compareConnectionCandidate(leftDiscriminator, leftId, rightDiscriminator, rightId) {
389
- const discriminator = compareOrdinal(leftDiscriminator, rightDiscriminator);
390
- return discriminator === 0 ? compareOrdinal(leftId, rightId) : discriminator;
391
- }
392
368
  function compareOrdinal(left, right) {
393
369
  return left < right ? -1 : left > right ? 1 : 0;
394
370
  }
@@ -1,9 +1,10 @@
1
- import type { ActorRef, RoutingId, ZLinkActor, ZLinkActorJoinOperationId, ZLinkMessage, ZLinkMessageSerializer, ZLinkRelocationStore, ZLinkSpot } from '../../contracts';
1
+ import type { ActorRef, RoutingId, ZLinkActor, ZLinkActorJoinOperationId, ZLinkMessageSerializer, ZLinkSpot } from '../../contracts';
2
+ import { ZLinkMessage } from '../../contracts';
2
3
  import type { ZLinkAuthoritySnapshot, ZLinkLocationOwnerToken } from '../locations/internal-location-contracts';
3
4
  import type { ZLinkAuthorityStore, ZLinkObjectCreationStore, ZLinkOwnerLeaseStore } from '../locations/internal-store-contracts';
4
5
  import type { Message } from '../../contracts/Common/Message';
5
6
  import type { ZLinkBackendActorRef, ZLinkBackendMeshNode } from '../backend';
6
- import { type ZLinkActorHandoffCoordinator, type ZLinkActorHandoffReplayPreparation, type ZLinkActorRoutedJoinTransport, type ZLinkActorTransferRegistry, type ZLinkDeferredJoinAcceptedRoot, type ZLinkDeferredJoinRootIdentity, type ZLinkRemoteBoundSessionTarget } from '../actors';
7
+ import { type ZLinkActorHandoffCoordinator, type ZLinkActorHandoffReplayPreparation, type ZLinkActorRoutedJoinTransport, type ZLinkActorTransferRegistry, type ZLinkDeferredJoinCompletion, type ZLinkRemoteBoundSessionTarget } from '../actors';
7
8
  import type { ZLinkActorRuntimeState } from '../actors/actor-runtime-state';
8
9
  import type { ZLinkLocationLifecycle } from '../locations';
9
10
  import type { DefaultZLinkSpotManager } from '../spots';
@@ -50,7 +51,6 @@ export interface ZLinkActorTransferRuntimeOptions {
50
51
  readonly actorTransferRegistry: ZLinkActorTransferRegistry;
51
52
  readonly authorityStore: () => (ZLinkAuthorityStore & ZLinkObjectCreationStore & ZLinkOwnerLeaseStore) | undefined;
52
53
  readonly currentOwner: () => ZLinkLocationOwnerToken | undefined;
53
- readonly relocationStore: () => ZLinkRelocationStore | undefined;
54
54
  /** Live admitted peers of a mesh; used to stop retries against a gone session owner. */
55
55
  readonly liveDescriptors?: (meshName: string, signal?: AbortSignal) => Promise<readonly import('../../contracts').ZLinkMeshNodeDescriptor[]>;
56
56
  /** Service-wire command 42/43/44 bridge, installed after the host runtime is assembled. */
@@ -70,17 +70,18 @@ export declare class ZLinkActorTransferRuntime {
70
70
  private readonly activeDeferredJoinTerminals;
71
71
  private readonly deferredJoinTerminals;
72
72
  constructor(options: ZLinkActorTransferRuntimeOptions);
73
- beginDeferredActorHandoff(actor: ZLinkActor, state: ZLinkActorRuntimeState, operationId: string): void;
74
- promoteDeferredActorHandoff(actor: ZLinkActor, _state: ZLinkActorRuntimeState, operationId: string): void;
75
- completeDeferredActorHandoff(actor: ZLinkActor, target: ZLinkSpotRouteTarget, _targetActorRef: ActorRef, operationId: string): Promise<void>;
76
- cancelDeferredActorHandoff(actor: ZLinkActor, _state: ZLinkActorRuntimeState, operationId: string): Promise<void>;
77
- prepareDeferredJoinAccepted(actorId: string, operationId: ZLinkActorJoinOperationId, actorRef: ActorRef, rawReply: Uint8Array, replyContentType?: string, signal?: AbortSignal, canonicalInventoryDigest?: string): Promise<ZLinkDeferredJoinAcceptedRoot>;
78
- isDeferredJoinAcceptedRootPublication(reference: string, checksumCrc32c: number, expected: ZLinkDeferredJoinRootIdentity, signal?: AbortSignal): Promise<boolean>;
79
- discardDeferredJoinAccepted(root: ZLinkDeferredJoinAcceptedRoot, signal?: AbortSignal): Promise<void>;
80
- markDeferredJoinAcceptedCommitted(root: ZLinkDeferredJoinAcceptedRoot, actorRef: ActorRef, signal?: AbortSignal): Promise<ZLinkDeferredJoinAcceptedRoot>;
81
- commitAndDeliverDeferredJoinAccepted(root: ZLinkDeferredJoinAcceptedRoot, actor: ZLinkActor, actorRef: ActorRef, submitMailbox: <T>(operation: () => Promise<T>) => Promise<T>, signal?: AbortSignal): Promise<ZLinkDeferredJoinAcceptedRoot>;
82
- private commitAndDeliverDeferredJoinAcceptedCore;
83
- private requireDeferredJoinJournal;
73
+ beginDeferredActorHandoff(actor: ZLinkActor, state: ZLinkActorRuntimeState): void;
74
+ promoteDeferredActorHandoff(actor: ZLinkActor, _state: ZLinkActorRuntimeState): void;
75
+ completeDeferredActorHandoff(actor: ZLinkActor, target: ZLinkSpotRouteTarget, _targetActorRef: ActorRef): Promise<void>;
76
+ cancelDeferredActorHandoff(actor: ZLinkActor, state: ZLinkActorRuntimeState): Promise<void>;
77
+ prepareDeferredJoinAccepted(actorId: string, operationId: ZLinkActorJoinOperationId, actorRef: ActorRef, rawReply: Uint8Array, replyContentType?: string): ZLinkDeferredJoinCompletion;
78
+ /**
79
+ * Runs the Accepted completion callback once in the target Actor mailbox.
80
+ * A repeated delivery of the same OperationId in this process observes the
81
+ * first terminal (completion idempotency only).
82
+ */
83
+ deliverDeferredJoinAccepted(completion: ZLinkDeferredJoinCompletion, actor: ZLinkActor, actorRef: ActorRef, submitMailbox: <T>(operation: () => Promise<T>) => Promise<T>, signal?: AbortSignal): Promise<void>;
84
+ private deliverDeferredJoinAcceptedCore;
84
85
  private prepareSourceActorLeave;
85
86
  private restoreSourceActor;
86
87
  private beginSourceActorMove;
@@ -89,7 +90,7 @@ export declare class ZLinkActorTransferRuntime {
89
90
  private admitDeferredSourcePrefix;
90
91
  private observeHandoffReplay;
91
92
  private sourceHandoffPrefixQueue;
92
- prepareSource(actor: ZLinkActor, state: ZLinkActorRuntimeState, signal?: AbortSignal, lifecycleAuthority?: 'framework' | 'core', deferredOperationId?: string, relocation?: ServiceWireOperationId): Promise<{
93
+ prepareSource(actor: ZLinkActor, state: ZLinkActorRuntimeState, signal?: AbortSignal, lifecycleAuthority?: 'framework' | 'core', deferredJoin?: boolean, relocation?: ServiceWireOperationId): Promise<{
93
94
  handoffBacklog: readonly ZLinkActorHandoffPacket[];
94
95
  sourceLeaveCompletion: Promise<void> | undefined;
95
96
  sourceLeaveSubmitted: Promise<void> | undefined;
@@ -107,6 +108,7 @@ export declare class ZLinkActorTransferRuntime {
107
108
  setReplayResults(results: readonly import('../actors').ZLinkActorHandoffResult[]): void;
108
109
  commit(target: ZLinkSpotRouteTarget, targetActorRef: ActorRef, targetOwnerFence: ZLinkActorMessageFollowOwnerFence): Promise<void>;
109
110
  rollback(): Promise<void>;
111
+ discard(reason: unknown): void;
110
112
  }>;
111
113
  notifyCoreSourceLeave(actor: ZLinkActor, callback: () => Promise<void>): Promise<void>;
112
114
  completeRelocationSourceLeave(actor: ZLinkActor, sourceSpotId: RoutingId | undefined, signal?: AbortSignal): Promise<void>;