@zlink-systems/framework 0.10.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.
- package/LICENSE +105 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/contracts/Actors/ZLinkActor.d.ts +7 -0
- package/dist/contracts/Actors/ZLinkActor.js +2 -0
- package/dist/contracts/Actors/ZLinkActorClient.d.ts +15 -0
- package/dist/contracts/Actors/ZLinkActorClient.js +2 -0
- package/dist/contracts/Actors/ZLinkActorContext.d.ts +14 -0
- package/dist/contracts/Actors/ZLinkActorContext.js +2 -0
- package/dist/contracts/Actors/ZLinkActorFactory.d.ts +34 -0
- package/dist/contracts/Actors/ZLinkActorFactory.js +2 -0
- package/dist/contracts/Actors/ZLinkActorManager.d.ts +34 -0
- package/dist/contracts/Actors/ZLinkActorManager.js +2 -0
- package/dist/contracts/Actors/index.d.ts +5 -0
- package/dist/contracts/Actors/index.js +21 -0
- package/dist/contracts/Channels/Calls.d.ts +28 -0
- package/dist/contracts/Channels/Calls.js +2 -0
- package/dist/contracts/Channels/IZLinkChannelClient.d.ts +5 -0
- package/dist/contracts/Channels/IZLinkChannelClient.js +2 -0
- package/dist/contracts/Channels/IZLinkFanoutClient.d.ts +11 -0
- package/dist/contracts/Channels/IZLinkFanoutClient.js +2 -0
- package/dist/contracts/Channels/RouteCalls.d.ts +11 -0
- package/dist/contracts/Channels/RouteCalls.js +2 -0
- package/dist/contracts/Channels/index.d.ts +4 -0
- package/dist/contracts/Channels/index.js +20 -0
- package/dist/contracts/Codecs/IZLinkCodecRegistryBuilder.d.ts +14 -0
- package/dist/contracts/Codecs/IZLinkCodecRegistryBuilder.js +2 -0
- package/dist/contracts/Codecs/ZLinkMessageSerializer.d.ts +5 -0
- package/dist/contracts/Codecs/ZLinkMessageSerializer.js +2 -0
- package/dist/contracts/Codecs/index.d.ts +2 -0
- package/dist/contracts/Codecs/index.js +18 -0
- package/dist/contracts/Common/ActorRef.d.ts +7 -0
- package/dist/contracts/Common/ActorRef.js +2 -0
- package/dist/contracts/Common/CoreTypes.d.ts +6 -0
- package/dist/contracts/Common/CoreTypes.js +2 -0
- package/dist/contracts/Common/Message.d.ts +9 -0
- package/dist/contracts/Common/Message.js +2 -0
- package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +12 -0
- package/dist/contracts/Common/ZLinkEncodedPayload.js +41 -0
- package/dist/contracts/Common/ZLinkMessage.d.ts +25 -0
- package/dist/contracts/Common/ZLinkMessage.js +127 -0
- package/dist/contracts/Common/ZLinkMessageMetadata.d.ts +10 -0
- package/dist/contracts/Common/ZLinkMessageMetadata.js +49 -0
- package/dist/contracts/Common/ZLinkProviderResolver.d.ts +5 -0
- package/dist/contracts/Common/ZLinkProviderResolver.js +2 -0
- package/dist/contracts/Common/encoded-payload-storage.d.ts +3 -0
- package/dist/contracts/Common/encoded-payload-storage.js +18 -0
- package/dist/contracts/Common/index.d.ts +5 -0
- package/dist/contracts/Common/index.js +24 -0
- package/dist/contracts/Configuration/Builders.d.ts +153 -0
- package/dist/contracts/Configuration/Builders.js +2 -0
- package/dist/contracts/Configuration/CodecContentType.d.ts +2 -0
- package/dist/contracts/Configuration/CodecContentType.js +68 -0
- package/dist/contracts/Configuration/CodecSerializerSelection.d.ts +9 -0
- package/dist/contracts/Configuration/CodecSerializerSelection.js +15 -0
- package/dist/contracts/Configuration/Configs.d.ts +23 -0
- package/dist/contracts/Configuration/Configs.js +2 -0
- package/dist/contracts/Configuration/ConfigurationException.d.ts +3 -0
- package/dist/contracts/Configuration/ConfigurationException.js +10 -0
- package/dist/contracts/Configuration/Connections.d.ts +5 -0
- package/dist/contracts/Configuration/Connections.js +2 -0
- package/dist/contracts/Configuration/DiagnosticsValidation.d.ts +3 -0
- package/dist/contracts/Configuration/DiagnosticsValidation.js +23 -0
- package/dist/contracts/Configuration/EndpointNotation.d.ts +77 -0
- package/dist/contracts/Configuration/EndpointNotation.js +218 -0
- package/dist/contracts/Configuration/InternalDefaults.d.ts +7 -0
- package/dist/contracts/Configuration/InternalDefaults.js +47 -0
- package/dist/contracts/Configuration/ObjectRoles.d.ts +38 -0
- package/dist/contracts/Configuration/ObjectRoles.js +13 -0
- package/dist/contracts/Configuration/Registration.d.ts +11 -0
- package/dist/contracts/Configuration/Registration.js +162 -0
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +14 -0
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +61 -0
- package/dist/contracts/Configuration/RegistrationBuilders.d.ts +61 -0
- package/dist/contracts/Configuration/RegistrationBuilders.js +1181 -0
- package/dist/contracts/Configuration/RegistrationCodecRegistry.d.ts +19 -0
- package/dist/contracts/Configuration/RegistrationCodecRegistry.js +79 -0
- package/dist/contracts/Configuration/RegistrationNormalizers.d.ts +23 -0
- package/dist/contracts/Configuration/RegistrationNormalizers.js +319 -0
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +414 -0
- package/dist/contracts/Configuration/RegistrationTypes.js +2 -0
- package/dist/contracts/Configuration/RegistrationValidators.d.ts +2 -0
- package/dist/contracts/Configuration/RegistrationValidators.js +461 -0
- package/dist/contracts/Configuration/RouteChannelInternalState.d.ts +10 -0
- package/dist/contracts/Configuration/RouteChannelInternalState.js +39 -0
- package/dist/contracts/Configuration/RuntimeEndpointConnections.d.ts +9 -0
- package/dist/contracts/Configuration/RuntimeEndpointConnections.js +80 -0
- package/dist/contracts/Configuration/SendTimeoutValidation.d.ts +2 -0
- package/dist/contracts/Configuration/SendTimeoutValidation.js +16 -0
- package/dist/contracts/Configuration/TimerRegistrationValidator.d.ts +2 -0
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +24 -0
- package/dist/contracts/Configuration/index.d.ts +5 -0
- package/dist/contracts/Configuration/index.js +18 -0
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +181 -0
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.js +89 -0
- package/dist/contracts/Dispatch/ZLinkFlowOrigin.d.ts +1 -0
- package/dist/contracts/Dispatch/ZLinkFlowOrigin.js +2 -0
- package/dist/contracts/Dispatch/index.d.ts +2 -0
- package/dist/contracts/Dispatch/index.js +18 -0
- package/dist/contracts/Errors/ZLinkFrameworkException.d.ts +20 -0
- package/dist/contracts/Errors/ZLinkFrameworkException.js +29 -0
- package/dist/contracts/Errors/index.d.ts +1 -0
- package/dist/contracts/Errors/index.js +6 -0
- package/dist/contracts/Eventing/Metrics.d.ts +29 -0
- package/dist/contracts/Eventing/Metrics.js +4 -0
- package/dist/contracts/Eventing/index.d.ts +1 -0
- package/dist/contracts/Eventing/index.js +17 -0
- package/dist/contracts/Handlers/Attributes.d.ts +24 -0
- package/dist/contracts/Handlers/Attributes.js +84 -0
- package/dist/contracts/Handlers/Contexts.d.ts +18 -0
- package/dist/contracts/Handlers/Contexts.js +2 -0
- package/dist/contracts/Handlers/IZLinkChannelHandlers.d.ts +43 -0
- package/dist/contracts/Handlers/IZLinkChannelHandlers.js +2 -0
- package/dist/contracts/Handlers/IZLinkHandlerFilter.d.ts +15 -0
- package/dist/contracts/Handlers/IZLinkHandlerFilter.js +11 -0
- package/dist/contracts/Handlers/JsonContract.d.ts +46 -0
- package/dist/contracts/Handlers/JsonContract.js +137 -0
- package/dist/contracts/Handlers/ZLinkHandlerFilterNext.d.ts +1 -0
- package/dist/contracts/Handlers/ZLinkHandlerFilterNext.js +2 -0
- package/dist/contracts/Handlers/index.d.ts +5 -0
- package/dist/contracts/Handlers/index.js +33 -0
- package/dist/contracts/Locations/ActorTransfer.d.ts +41 -0
- package/dist/contracts/Locations/ActorTransfer.js +2 -0
- package/dist/contracts/Locations/Authority.d.ts +296 -0
- package/dist/contracts/Locations/Authority.js +17 -0
- package/dist/contracts/Locations/Diagnostics.d.ts +42 -0
- package/dist/contracts/Locations/Diagnostics.js +12 -0
- package/dist/contracts/Locations/Keys.d.ts +86 -0
- package/dist/contracts/Locations/Keys.js +2 -0
- package/dist/contracts/Locations/Models.d.ts +7 -0
- package/dist/contracts/Locations/Models.js +23 -0
- package/dist/contracts/Locations/Options.d.ts +23 -0
- package/dist/contracts/Locations/Options.js +20 -0
- package/dist/contracts/Locations/Readiness.d.ts +5 -0
- package/dist/contracts/Locations/Readiness.js +2 -0
- package/dist/contracts/Locations/RelocationStore.d.ts +38 -0
- package/dist/contracts/Locations/RelocationStore.js +2 -0
- package/dist/contracts/Locations/Resolvers.d.ts +4 -0
- package/dist/contracts/Locations/Resolvers.js +2 -0
- package/dist/contracts/Locations/Rows.d.ts +152 -0
- package/dist/contracts/Locations/Rows.js +19 -0
- package/dist/contracts/Locations/RuntimeQuery.d.ts +25 -0
- package/dist/contracts/Locations/RuntimeQuery.js +2 -0
- package/dist/contracts/Locations/Stores.d.ts +88 -0
- package/dist/contracts/Locations/Stores.js +2 -0
- package/dist/contracts/Locations/Values.d.ts +27 -0
- package/dist/contracts/Locations/Values.js +36 -0
- package/dist/contracts/Locations/Watch.d.ts +14 -0
- package/dist/contracts/Locations/Watch.js +12 -0
- package/dist/contracts/Locations/Writes.d.ts +48 -0
- package/dist/contracts/Locations/Writes.js +15 -0
- package/dist/contracts/Locations/index.d.ts +12 -0
- package/dist/contracts/Locations/index.js +30 -0
- package/dist/contracts/RouteMesh/Contracts.d.ts +102 -0
- package/dist/contracts/RouteMesh/Contracts.js +39 -0
- package/dist/contracts/RouteMesh/RuntimeTopology.d.ts +165 -0
- package/dist/contracts/RouteMesh/RuntimeTopology.js +38 -0
- package/dist/contracts/RouteMesh/index.d.ts +2 -0
- package/dist/contracts/RouteMesh/index.js +18 -0
- package/dist/contracts/Spots/Builders.d.ts +10 -0
- package/dist/contracts/Spots/Builders.js +2 -0
- package/dist/contracts/Spots/Contracts.d.ts +110 -0
- package/dist/contracts/Spots/Contracts.js +9 -0
- package/dist/contracts/Spots/SpotKind.d.ts +8 -0
- package/dist/contracts/Spots/SpotKind.js +28 -0
- package/dist/contracts/Spots/ZLinkSpot.d.ts +62 -0
- package/dist/contracts/Spots/ZLinkSpot.js +15 -0
- package/dist/contracts/Spots/index.d.ts +3 -0
- package/dist/contracts/Spots/index.js +19 -0
- package/dist/contracts/Streams/BoundSessionContracts.d.ts +8 -0
- package/dist/contracts/Streams/BoundSessionContracts.js +2 -0
- package/dist/contracts/Streams/IZLinkSession.d.ts +44 -0
- package/dist/contracts/Streams/IZLinkSession.js +2 -0
- package/dist/contracts/Streams/IZLinkSessionActor.d.ts +15 -0
- package/dist/contracts/Streams/IZLinkSessionActor.js +2 -0
- package/dist/contracts/Streams/IZLinkSessionPacketHandler.d.ts +9 -0
- package/dist/contracts/Streams/IZLinkSessionPacketHandler.js +2 -0
- package/dist/contracts/Streams/IZLinkStream.d.ts +9 -0
- package/dist/contracts/Streams/IZLinkStream.js +2 -0
- package/dist/contracts/Streams/ZLinkMessageMetadata.d.ts +1 -0
- package/dist/contracts/Streams/ZLinkMessageMetadata.js +2 -0
- package/dist/contracts/Streams/ZLinkStreamCompression.d.ts +8 -0
- package/dist/contracts/Streams/ZLinkStreamCompression.js +2 -0
- package/dist/contracts/Streams/ZLinkStreamError.d.ts +8 -0
- package/dist/contracts/Streams/ZLinkStreamError.js +8 -0
- package/dist/contracts/Streams/index.d.ts +8 -0
- package/dist/contracts/Streams/index.js +24 -0
- package/dist/contracts/Timers/IZLinkTimer.d.ts +5 -0
- package/dist/contracts/Timers/IZLinkTimer.js +2 -0
- package/dist/contracts/Timers/ZLinkTimerOptions.d.ts +10 -0
- package/dist/contracts/Timers/ZLinkTimerOptions.js +9 -0
- package/dist/contracts/Timers/ZLinkTimerTick.d.ts +12 -0
- package/dist/contracts/Timers/ZLinkTimerTick.js +2 -0
- package/dist/contracts/Timers/index.d.ts +3 -0
- package/dist/contracts/Timers/index.js +19 -0
- package/dist/contracts/index.d.ts +25 -0
- package/dist/contracts/index.js +45 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +17 -0
- package/dist/internal.d.ts +26 -0
- package/dist/internal.js +48 -0
- package/dist/location-store-integration.d.ts +5 -0
- package/dist/location-store-integration.js +31 -0
- package/dist/nest-integration.d.ts +49 -0
- package/dist/nest-integration.js +143 -0
- package/dist/runtime/abort.d.ts +13 -0
- package/dist/runtime/abort.js +71 -0
- package/dist/runtime/actors/actor-authority-payload-codec.d.ts +33 -0
- package/dist/runtime/actors/actor-authority-payload-codec.js +366 -0
- package/dist/runtime/actors/actor-authority-publication.d.ts +28 -0
- package/dist/runtime/actors/actor-authority-publication.js +207 -0
- package/dist/runtime/actors/actor-client.d.ts +36 -0
- package/dist/runtime/actors/actor-client.js +612 -0
- package/dist/runtime/actors/actor-context.d.ts +26 -0
- package/dist/runtime/actors/actor-context.js +433 -0
- package/dist/runtime/actors/actor-creation.d.ts +19 -0
- package/dist/runtime/actors/actor-creation.js +158 -0
- package/dist/runtime/actors/actor-execution-context.d.ts +6 -0
- package/dist/runtime/actors/actor-execution-context.js +27 -0
- package/dist/runtime/actors/actor-handoff.d.ts +191 -0
- package/dist/runtime/actors/actor-handoff.js +1252 -0
- package/dist/runtime/actors/actor-join-deferred-scope.d.ts +11 -0
- package/dist/runtime/actors/actor-join-deferred-scope.js +144 -0
- package/dist/runtime/actors/actor-join-relocation.d.ts +38 -0
- package/dist/runtime/actors/actor-join-relocation.js +2 -0
- package/dist/runtime/actors/actor-lifecycle-snapshot.d.ts +21 -0
- package/dist/runtime/actors/actor-lifecycle-snapshot.js +58 -0
- package/dist/runtime/actors/actor-local-native-join.d.ts +27 -0
- package/dist/runtime/actors/actor-local-native-join.js +409 -0
- package/dist/runtime/actors/actor-mailbox.d.ts +10 -0
- package/dist/runtime/actors/actor-mailbox.js +53 -0
- package/dist/runtime/actors/actor-message-follow-context.d.ts +46 -0
- package/dist/runtime/actors/actor-message-follow-context.js +257 -0
- package/dist/runtime/actors/actor-native-lookup.d.ts +4 -0
- package/dist/runtime/actors/actor-native-lookup.js +30 -0
- package/dist/runtime/actors/actor-packet-relay-wire.d.ts +73 -0
- package/dist/runtime/actors/actor-packet-relay-wire.js +144 -0
- package/dist/runtime/actors/actor-remote-joiner.d.ts +37 -0
- package/dist/runtime/actors/actor-remote-joiner.js +122 -0
- package/dist/runtime/actors/actor-remote-wire.d.ts +73 -0
- package/dist/runtime/actors/actor-remote-wire.js +84 -0
- package/dist/runtime/actors/actor-retry-delay.d.ts +5 -0
- package/dist/runtime/actors/actor-retry-delay.js +40 -0
- package/dist/runtime/actors/actor-routed-join-transport.d.ts +33 -0
- package/dist/runtime/actors/actor-routed-join-transport.js +2 -0
- package/dist/runtime/actors/actor-routed-json-request.d.ts +11 -0
- package/dist/runtime/actors/actor-routed-json-request.js +39 -0
- package/dist/runtime/actors/actor-runtime-contracts.d.ts +63 -0
- package/dist/runtime/actors/actor-runtime-contracts.js +2 -0
- package/dist/runtime/actors/actor-runtime-state.d.ts +152 -0
- package/dist/runtime/actors/actor-runtime-state.js +545 -0
- package/dist/runtime/actors/actor-source-transfer.d.ts +27 -0
- package/dist/runtime/actors/actor-source-transfer.js +2 -0
- package/dist/runtime/actors/actor-transfer-registry.d.ts +18 -0
- package/dist/runtime/actors/actor-transfer-registry.js +71 -0
- package/dist/runtime/actors/actor-transport-delivery-gate.d.ts +6 -0
- package/dist/runtime/actors/actor-transport-delivery-gate.js +4 -0
- package/dist/runtime/actors/bound-session-wire.d.ts +81 -0
- package/dist/runtime/actors/bound-session-wire.js +184 -0
- package/dist/runtime/actors/deferred-join-accepted-journal.d.ts +47 -0
- package/dist/runtime/actors/deferred-join-accepted-journal.js +962 -0
- package/dist/runtime/actors/index.d.ts +79 -0
- package/dist/runtime/actors/index.js +639 -0
- package/dist/runtime/actors/post-commit-actor-binder.d.ts +18 -0
- package/dist/runtime/actors/post-commit-actor-binder.js +68 -0
- package/dist/runtime/actors/post-commit-actor-location.d.ts +19 -0
- package/dist/runtime/actors/post-commit-actor-location.js +72 -0
- package/dist/runtime/actors/spot-actor-dispatch.d.ts +59 -0
- package/dist/runtime/actors/spot-actor-dispatch.js +179 -0
- package/dist/runtime/actors/transferred-actor-rollback.d.ts +16 -0
- package/dist/runtime/actors/transferred-actor-rollback.js +91 -0
- package/dist/runtime/admission.d.ts +20 -0
- package/dist/runtime/admission.js +166 -0
- package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +57 -0
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +185 -0
- package/dist/runtime/application-jobs/application-job-queue-handler-start-gate.d.ts +8 -0
- package/dist/runtime/application-jobs/application-job-queue-handler-start-gate.js +8 -0
- package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +17 -0
- package/dist/runtime/application-jobs/application-job-queue-scope.js +57 -0
- package/dist/runtime/application-jobs/contracts.d.ts +19 -0
- package/dist/runtime/application-jobs/contracts.js +2 -0
- package/dist/runtime/application-jobs/receive-flow-controller.d.ts +32 -0
- package/dist/runtime/application-jobs/receive-flow-controller.js +165 -0
- package/dist/runtime/backend/contracts/index.d.ts +487 -0
- package/dist/runtime/backend/contracts/index.js +29 -0
- package/dist/runtime/backend/index.d.ts +9 -0
- package/dist/runtime/backend/index.js +25 -0
- package/dist/runtime/backend/mesh-actor-session-node-adapter.d.ts +3 -0
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +51 -0
- package/dist/runtime/backend/mesh-completion-table.d.ts +34 -0
- package/dist/runtime/backend/mesh-completion-table.js +124 -0
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +48 -0
- package/dist/runtime/backend/mesh-dispatch-pump.js +322 -0
- package/dist/runtime/backend/mesh-record-dispatcher.d.ts +19 -0
- package/dist/runtime/backend/mesh-record-dispatcher.js +53 -0
- package/dist/runtime/backend/node/index.d.ts +4 -0
- package/dist/runtime/backend/node/index.js +22 -0
- package/dist/runtime/backend/node/node-backend-adapter-factory.d.ts +12 -0
- package/dist/runtime/backend/node/node-backend-adapter-factory.js +161 -0
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +52 -0
- package/dist/runtime/backend/node/node-backend-adapter-support.js +203 -0
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +13 -0
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +52 -0
- package/dist/runtime/backend/node/node-mesh-backend-adapter.d.ts +11 -0
- package/dist/runtime/backend/node/node-mesh-backend-adapter.js +23 -0
- package/dist/runtime/backend/node/node-monitor-backend-adapter.d.ts +6 -0
- package/dist/runtime/backend/node/node-monitor-backend-adapter.js +38 -0
- package/dist/runtime/backend/node/node-raw-binding-port.d.ts +8 -0
- package/dist/runtime/backend/node/node-raw-binding-port.js +411 -0
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +266 -0
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +1707 -0
- package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +9 -0
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +286 -0
- package/dist/runtime/backend/node-backend-adapter.d.ts +9 -0
- package/dist/runtime/backend/node-backend-adapter.js +12 -0
- package/dist/runtime/backend/raw-binding-port.d.ts +58 -0
- package/dist/runtime/backend/raw-binding-port.js +2 -0
- package/dist/runtime/backend/runtime-message.d.ts +14 -0
- package/dist/runtime/backend/runtime-message.js +44 -0
- package/dist/runtime/backend/runtime-values.d.ts +78 -0
- package/dist/runtime/backend/runtime-values.js +66 -0
- package/dist/runtime/channels/channel-autoconnect.d.ts +14 -0
- package/dist/runtime/channels/channel-autoconnect.js +23 -0
- package/dist/runtime/channels/channel-clients.d.ts +50 -0
- package/dist/runtime/channels/channel-clients.js +329 -0
- package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +76 -0
- package/dist/runtime/channels/channel-dispatch-pipeline.js +237 -0
- package/dist/runtime/channels/channel-dispatch-services.d.ts +52 -0
- package/dist/runtime/channels/channel-dispatch-services.js +132 -0
- package/dist/runtime/channels/channel-dispatchers.d.ts +125 -0
- package/dist/runtime/channels/channel-dispatchers.js +575 -0
- package/dist/runtime/channels/channel-envelope-inspection.d.ts +25 -0
- package/dist/runtime/channels/channel-envelope-inspection.js +96 -0
- package/dist/runtime/channels/channel-envelope.d.ts +73 -0
- package/dist/runtime/channels/channel-envelope.js +546 -0
- package/dist/runtime/channels/channel-framework-packets.d.ts +2 -0
- package/dist/runtime/channels/channel-framework-packets.js +6 -0
- package/dist/runtime/channels/channel-multipart.d.ts +16 -0
- package/dist/runtime/channels/channel-multipart.js +31 -0
- package/dist/runtime/channels/channel-outbound-operations.d.ts +33 -0
- package/dist/runtime/channels/channel-outbound-operations.js +343 -0
- package/dist/runtime/channels/channel-receive-loops.d.ts +151 -0
- package/dist/runtime/channels/channel-receive-loops.js +728 -0
- package/dist/runtime/channels/channel-receive-task-tracker.d.ts +14 -0
- package/dist/runtime/channels/channel-receive-task-tracker.js +37 -0
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +77 -0
- package/dist/runtime/channels/channel-runtime-lifecycle.js +630 -0
- package/dist/runtime/channels/channel-runtime-manager.d.ts +84 -0
- package/dist/runtime/channels/channel-runtime-manager.js +193 -0
- package/dist/runtime/channels/channel-socket-options.d.ts +18 -0
- package/dist/runtime/channels/channel-socket-options.js +119 -0
- package/dist/runtime/channels/channel-socket-registry.d.ts +157 -0
- package/dist/runtime/channels/channel-socket-registry.js +1428 -0
- package/dist/runtime/channels/channel-transports.d.ts +126 -0
- package/dist/runtime/channels/channel-transports.js +448 -0
- package/dist/runtime/channels/client-server-location-runtime.d.ts +41 -0
- package/dist/runtime/channels/client-server-location-runtime.js +465 -0
- package/dist/runtime/channels/client-server-service-wire.d.ts +48 -0
- package/dist/runtime/channels/client-server-service-wire.js +306 -0
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +22 -0
- package/dist/runtime/channels/dispatch-error-reporter.js +133 -0
- package/dist/runtime/channels/fanout-location-runtime.d.ts +38 -0
- package/dist/runtime/channels/fanout-location-runtime.js +356 -0
- package/dist/runtime/channels/fanout-service-wire.d.ts +12 -0
- package/dist/runtime/channels/fanout-service-wire.js +29 -0
- package/dist/runtime/channels/handler-filter-scope.d.ts +8 -0
- package/dist/runtime/channels/handler-filter-scope.js +11 -0
- package/dist/runtime/channels/index.d.ts +9 -0
- package/dist/runtime/channels/index.js +30 -0
- package/dist/runtime/channels/local-spot-route-transport.d.ts +9 -0
- package/dist/runtime/channels/local-spot-route-transport.js +40 -0
- package/dist/runtime/channels/route-disconnected-error.d.ts +3 -0
- package/dist/runtime/channels/route-disconnected-error.js +10 -0
- package/dist/runtime/channels/route-member-snapshot.d.ts +10 -0
- package/dist/runtime/channels/route-member-snapshot.js +55 -0
- package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +12 -0
- package/dist/runtime/channels/router-socket-spot-route-transport.js +43 -0
- package/dist/runtime/channels/source-spot-router.d.ts +10 -0
- package/dist/runtime/channels/source-spot-router.js +46 -0
- package/dist/runtime/channels/spot-direct-envelope.d.ts +5 -0
- package/dist/runtime/channels/spot-direct-envelope.js +29 -0
- package/dist/runtime/channels/spot-node-route-transport.d.ts +13 -0
- package/dist/runtime/channels/spot-node-route-transport.js +60 -0
- package/dist/runtime/channels/spot-route-bridge-transport.d.ts +14 -0
- package/dist/runtime/channels/spot-route-bridge-transport.js +58 -0
- package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +50 -0
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +128 -0
- package/dist/runtime/channels/spot-route-target-resolver.d.ts +16 -0
- package/dist/runtime/channels/spot-route-target-resolver.js +92 -0
- package/dist/runtime/codecs/index.d.ts +14 -0
- package/dist/runtime/codecs/index.js +44 -0
- package/dist/runtime/configuration/index.d.ts +1 -0
- package/dist/runtime/configuration/index.js +17 -0
- package/dist/runtime/diagnostics/dispatch-error-port.d.ts +8 -0
- package/dist/runtime/diagnostics/dispatch-error-port.js +2 -0
- package/dist/runtime/diagnostics/flow-context.d.ts +21 -0
- package/dist/runtime/diagnostics/flow-context.js +68 -0
- package/dist/runtime/diagnostics/index.d.ts +82 -0
- package/dist/runtime/diagnostics/index.js +335 -0
- package/dist/runtime/diagnostics/internal-event-contracts.d.ts +139 -0
- package/dist/runtime/diagnostics/internal-event-contracts.js +68 -0
- package/dist/runtime/diagnostics/message-flow.d.ts +55 -0
- package/dist/runtime/diagnostics/message-flow.js +420 -0
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +123 -0
- package/dist/runtime/diagnostics/runtime-metrics.js +454 -0
- package/dist/runtime/diagnostics/runtime-observation-queue.d.ts +58 -0
- package/dist/runtime/diagnostics/runtime-observation-queue.js +324 -0
- package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +33 -0
- package/dist/runtime/diagnostics/topology-runtime-projections.js +255 -0
- package/dist/runtime/execution/index.d.ts +114 -0
- package/dist/runtime/execution/index.js +363 -0
- package/dist/runtime/execution/serial-execution-queue.d.ts +94 -0
- package/dist/runtime/execution/serial-execution-queue.js +411 -0
- package/dist/runtime/execution/serial-work-size.d.ts +4 -0
- package/dist/runtime/execution/serial-work-size.js +28 -0
- package/dist/runtime/execution/state-lane.d.ts +28 -0
- package/dist/runtime/execution/state-lane.js +105 -0
- package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +72 -0
- package/dist/runtime/foundation/actor-join-recovery-codec.js +333 -0
- package/dist/runtime/foundation/event-loop-resources.d.ts +37 -0
- package/dist/runtime/foundation/event-loop-resources.js +163 -0
- package/dist/runtime/foundation/index.d.ts +18 -0
- package/dist/runtime/foundation/index.js +34 -0
- package/dist/runtime/foundation/message-follow-suppression-registry.d.ts +38 -0
- package/dist/runtime/foundation/message-follow-suppression-registry.js +89 -0
- package/dist/runtime/foundation/operation-identity.d.ts +12 -0
- package/dist/runtime/foundation/operation-identity.js +33 -0
- package/dist/runtime/foundation/operation-registry.d.ts +42 -0
- package/dist/runtime/foundation/operation-registry.js +146 -0
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +143 -0
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +1349 -0
- package/dist/runtime/foundation/route-mesh-connection-policy.d.ts +3 -0
- package/dist/runtime/foundation/route-mesh-connection-policy.js +13 -0
- package/dist/runtime/foundation/runtime-state-projections.d.ts +13 -0
- package/dist/runtime/foundation/runtime-state-projections.js +44 -0
- package/dist/runtime/foundation/service-authority-payload-codec.d.ts +56 -0
- package/dist/runtime/foundation/service-authority-payload-codec.js +411 -0
- package/dist/runtime/foundation/service-discovery-registry.d.ts +42 -0
- package/dist/runtime/foundation/service-discovery-registry.js +175 -0
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.d.ts +19 -0
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +287 -0
- package/dist/runtime/foundation/service-liveness-registry.d.ts +28 -0
- package/dist/runtime/foundation/service-liveness-registry.js +109 -0
- package/dist/runtime/foundation/service-mailbox.d.ts +60 -0
- package/dist/runtime/foundation/service-mailbox.js +283 -0
- package/dist/runtime/foundation/service-maintenance-runtime.d.ts +45 -0
- package/dist/runtime/foundation/service-maintenance-runtime.js +198 -0
- package/dist/runtime/foundation/service-metadata-codec.d.ts +2 -0
- package/dist/runtime/foundation/service-metadata-codec.js +69 -0
- package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +35 -0
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +139 -0
- package/dist/runtime/foundation/service-relocation-coordinator.d.ts +19 -0
- package/dist/runtime/foundation/service-relocation-coordinator.js +16 -0
- package/dist/runtime/foundation/service-relocation-object-owner.d.ts +71 -0
- package/dist/runtime/foundation/service-relocation-object-owner.js +242 -0
- package/dist/runtime/foundation/service-relocation-runtime.d.ts +143 -0
- package/dist/runtime/foundation/service-relocation-runtime.js +1080 -0
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +332 -0
- package/dist/runtime/foundation/service-runtime-contracts.js +66 -0
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +23 -0
- package/dist/runtime/foundation/service-session-binding-ingress-port.js +11 -0
- package/dist/runtime/foundation/service-stateful-registry.d.ts +142 -0
- package/dist/runtime/foundation/service-stateful-registry.js +465 -0
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +393 -0
- package/dist/runtime/foundation/service-stateful-runtime.js +3898 -0
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +597 -0
- package/dist/runtime/foundation/service-stateful-wire-codec.js +2006 -0
- package/dist/runtime/foundation/service-topology-registry.d.ts +68 -0
- package/dist/runtime/foundation/service-topology-registry.js +393 -0
- package/dist/runtime/foundation/service-weighted-selection.d.ts +14 -0
- package/dist/runtime/foundation/service-weighted-selection.js +128 -0
- package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +10 -0
- package/dist/runtime/foundation/service-wire-binary-primitives.js +53 -0
- package/dist/runtime/foundation/service-wire-codec.d.ts +22 -0
- package/dist/runtime/foundation/service-wire-codec.js +67 -0
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +110 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +132 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +102 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.js +568 -0
- package/dist/runtime/framework-errors-internal.d.ts +95 -0
- package/dist/runtime/framework-errors-internal.js +301 -0
- package/dist/runtime/handlers/handler-instance-scope.d.ts +11 -0
- package/dist/runtime/handlers/handler-instance-scope.js +284 -0
- package/dist/runtime/handlers/index.d.ts +13 -0
- package/dist/runtime/handlers/index.js +57 -0
- package/dist/runtime/host/actor-packet-relay.d.ts +60 -0
- package/dist/runtime/host/actor-packet-relay.js +664 -0
- package/dist/runtime/host/actor-placement-coordinator.d.ts +32 -0
- package/dist/runtime/host/actor-placement-coordinator.js +386 -0
- package/dist/runtime/host/actor-runtime-options-factory.d.ts +65 -0
- package/dist/runtime/host/actor-runtime-options-factory.js +160 -0
- package/dist/runtime/host/actor-transfer-authority-runtime.d.ts +26 -0
- package/dist/runtime/host/actor-transfer-authority-runtime.js +138 -0
- package/dist/runtime/host/actor-transfer-runtime.d.ts +149 -0
- package/dist/runtime/host/actor-transfer-runtime.js +1245 -0
- package/dist/runtime/host/application-job-queue.d.ts +99 -0
- package/dist/runtime/host/application-job-queue.js +409 -0
- package/dist/runtime/host/bound-session-relay.d.ts +41 -0
- package/dist/runtime/host/bound-session-relay.js +52 -0
- package/dist/runtime/host/bounded-replay-map.d.ts +12 -0
- package/dist/runtime/host/bounded-replay-map.js +42 -0
- package/dist/runtime/host/channel-runtime-options-factory.d.ts +22 -0
- package/dist/runtime/host/channel-runtime-options-factory.js +76 -0
- package/dist/runtime/host/entry-actor-runtime.d.ts +30 -0
- package/dist/runtime/host/entry-actor-runtime.js +80 -0
- package/dist/runtime/host/host-capacity-status.d.ts +11 -0
- package/dist/runtime/host/host-capacity-status.js +85 -0
- package/dist/runtime/host/index.d.ts +188 -0
- package/dist/runtime/host/index.js +2552 -0
- package/dist/runtime/host/instance-activation-authority.d.ts +33 -0
- package/dist/runtime/host/instance-activation-authority.js +496 -0
- package/dist/runtime/host/location-runtime-owner.d.ts +48 -0
- package/dist/runtime/host/location-runtime-owner.js +227 -0
- package/dist/runtime/host/mesh-router-resolver.d.ts +16 -0
- package/dist/runtime/host/mesh-router-resolver.js +108 -0
- package/dist/runtime/host/relocation-direct-transfer.d.ts +81 -0
- package/dist/runtime/host/relocation-direct-transfer.js +240 -0
- package/dist/runtime/host/relocation-integrity-fault-gate.d.ts +6 -0
- package/dist/runtime/host/relocation-integrity-fault-gate.js +5 -0
- package/dist/runtime/host/relocation-state-adapter.d.ts +8 -0
- package/dist/runtime/host/relocation-state-adapter.js +13 -0
- package/dist/runtime/host/remote-actor-join-receiver.d.ts +47 -0
- package/dist/runtime/host/remote-actor-join-receiver.js +161 -0
- package/dist/runtime/host/remote-actor-packet-target-store.d.ts +29 -0
- package/dist/runtime/host/remote-actor-packet-target-store.js +185 -0
- package/dist/runtime/host/remote-bound-session-relay.d.ts +58 -0
- package/dist/runtime/host/remote-bound-session-relay.js +540 -0
- package/dist/runtime/host/route-mesh-runtime-options.d.ts +9 -0
- package/dist/runtime/host/route-mesh-runtime-options.js +41 -0
- package/dist/runtime/host/route-mesh-runtime.d.ts +76 -0
- package/dist/runtime/host/route-mesh-runtime.js +746 -0
- package/dist/runtime/host/runtime-shutdown.d.ts +33 -0
- package/dist/runtime/host/runtime-shutdown.js +68 -0
- package/dist/runtime/host/service-relocation-control.d.ts +7 -0
- package/dist/runtime/host/service-relocation-control.js +24 -0
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +241 -0
- package/dist/runtime/host/service-relocation-host-runtime.js +4113 -0
- package/dist/runtime/host/spot-address-transport.d.ts +47 -0
- package/dist/runtime/host/spot-address-transport.js +601 -0
- package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +38 -0
- package/dist/runtime/host/spot-node-runtime-options-factory.js +36 -0
- package/dist/runtime/host/spot-runtime-options-factory.d.ts +48 -0
- package/dist/runtime/host/spot-runtime-options-factory.js +169 -0
- package/dist/runtime/host/stateful-authority-route-runtime.d.ts +34 -0
- package/dist/runtime/host/stateful-authority-route-runtime.js +440 -0
- package/dist/runtime/host/user-spot-creation-coordinator.d.ts +69 -0
- package/dist/runtime/host/user-spot-creation-coordinator.js +759 -0
- package/dist/runtime/locations/actor-location-claims.d.ts +43 -0
- package/dist/runtime/locations/actor-location-claims.js +319 -0
- package/dist/runtime/locations/actor-session-route-claims.d.ts +10 -0
- package/dist/runtime/locations/actor-session-route-claims.js +51 -0
- package/dist/runtime/locations/aggregate-inventory-store.d.ts +18 -0
- package/dist/runtime/locations/aggregate-inventory-store.js +399 -0
- package/dist/runtime/locations/authority-key-codec.d.ts +6 -0
- package/dist/runtime/locations/authority-key-codec.js +78 -0
- package/dist/runtime/locations/auto-connect-loop.d.ts +37 -0
- package/dist/runtime/locations/auto-connect-loop.js +112 -0
- package/dist/runtime/locations/auto-connect-planner.d.ts +9 -0
- package/dist/runtime/locations/auto-connect-planner.js +137 -0
- package/dist/runtime/locations/auto-connect-reconciler.d.ts +57 -0
- package/dist/runtime/locations/auto-connect-reconciler.js +358 -0
- package/dist/runtime/locations/auto-connect-types.d.ts +42 -0
- package/dist/runtime/locations/auto-connect-types.js +2 -0
- package/dist/runtime/locations/auto-connect.d.ts +4 -0
- package/dist/runtime/locations/auto-connect.js +20 -0
- package/dist/runtime/locations/canonical-codec.d.ts +7 -0
- package/dist/runtime/locations/canonical-codec.js +48 -0
- package/dist/runtime/locations/domain-store-contract.d.ts +34 -0
- package/dist/runtime/locations/domain-store-contract.js +2 -0
- package/dist/runtime/locations/in-memory-authority-store.d.ts +51 -0
- package/dist/runtime/locations/in-memory-authority-store.js +895 -0
- package/dist/runtime/locations/in-memory-location-store.d.ts +78 -0
- package/dist/runtime/locations/in-memory-location-store.js +1008 -0
- package/dist/runtime/locations/in-memory-provider-location-store.d.ts +19 -0
- package/dist/runtime/locations/in-memory-provider-location-store.js +183 -0
- package/dist/runtime/locations/index.d.ts +11 -0
- package/dist/runtime/locations/index.js +27 -0
- package/dist/runtime/locations/internal-location-contracts.d.ts +7 -0
- package/dist/runtime/locations/internal-location-contracts.js +21 -0
- package/dist/runtime/locations/internal-store-contracts.d.ts +35 -0
- package/dist/runtime/locations/internal-store-contracts.js +2 -0
- package/dist/runtime/locations/key-codec.d.ts +13 -0
- package/dist/runtime/locations/key-codec.js +41 -0
- package/dist/runtime/locations/lease-tracker.d.ts +36 -0
- package/dist/runtime/locations/lease-tracker.js +155 -0
- package/dist/runtime/locations/lifecycle-runtime.d.ts +19 -0
- package/dist/runtime/locations/lifecycle-runtime.js +2 -0
- package/dist/runtime/locations/lifecycle.d.ts +40 -0
- package/dist/runtime/locations/lifecycle.js +120 -0
- package/dist/runtime/locations/location-store-repository.d.ts +72 -0
- package/dist/runtime/locations/location-store-repository.js +3198 -0
- package/dist/runtime/locations/relocation-blob.d.ts +7 -0
- package/dist/runtime/locations/relocation-blob.js +24 -0
- package/dist/runtime/locations/resolvers.d.ts +145 -0
- package/dist/runtime/locations/resolvers.js +693 -0
- package/dist/runtime/locations/runtime.d.ts +144 -0
- package/dist/runtime/locations/runtime.js +792 -0
- package/dist/runtime/locations/spot-location-claims.d.ts +36 -0
- package/dist/runtime/locations/spot-location-claims.js +305 -0
- package/dist/runtime/messaging/creation-payload-codec.d.ts +4 -0
- package/dist/runtime/messaging/creation-payload-codec.js +40 -0
- package/dist/runtime/messaging/framework-json-v1.d.ts +7 -0
- package/dist/runtime/messaging/framework-json-v1.js +296 -0
- package/dist/runtime/messaging/index.d.ts +1 -0
- package/dist/runtime/messaging/index.js +2 -0
- package/dist/runtime/messaging/packet-name.d.ts +4 -0
- package/dist/runtime/messaging/packet-name.js +79 -0
- package/dist/runtime/messaging/payload-codec.d.ts +25 -0
- package/dist/runtime/messaging/payload-codec.js +255 -0
- package/dist/runtime/messaging/submission-result.d.ts +15 -0
- package/dist/runtime/messaging/submission-result.js +37 -0
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +395 -0
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +645 -0
- package/dist/runtime/routing-id.d.ts +8 -0
- package/dist/runtime/routing-id.js +112 -0
- package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +124 -0
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +269 -0
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +33 -0
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.js +94 -0
- package/dist/runtime/spots/index.d.ts +247 -0
- package/dist/runtime/spots/index.js +2090 -0
- package/dist/runtime/spots/spot-activation-registry.d.ts +47 -0
- package/dist/runtime/spots/spot-activation-registry.js +272 -0
- package/dist/runtime/spots/spot-activation-state.d.ts +104 -0
- package/dist/runtime/spots/spot-activation-state.js +288 -0
- package/dist/runtime/spots/spot-activation.d.ts +89 -0
- package/dist/runtime/spots/spot-activation.js +601 -0
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +20 -0
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +194 -0
- package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +83 -0
- package/dist/runtime/spots/spot-actor-join-dispatch.js +185 -0
- package/dist/runtime/spots/spot-actor-lifecycle-drain.d.ts +22 -0
- package/dist/runtime/spots/spot-actor-lifecycle-drain.js +51 -0
- package/dist/runtime/spots/spot-actor-membership.d.ts +39 -0
- package/dist/runtime/spots/spot-actor-membership.js +179 -0
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +91 -0
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +315 -0
- package/dist/runtime/spots/spot-actor-packet-drain.d.ts +40 -0
- package/dist/runtime/spots/spot-actor-packet-drain.js +235 -0
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +18 -0
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +110 -0
- package/dist/runtime/spots/spot-closing.d.ts +2 -0
- package/dist/runtime/spots/spot-closing.js +30 -0
- package/dist/runtime/spots/spot-context.d.ts +46 -0
- package/dist/runtime/spots/spot-context.js +113 -0
- package/dist/runtime/spots/spot-entry-activation.d.ts +107 -0
- package/dist/runtime/spots/spot-entry-activation.js +342 -0
- package/dist/runtime/spots/spot-handle.d.ts +28 -0
- package/dist/runtime/spots/spot-handle.js +38 -0
- package/dist/runtime/spots/spot-handler-registry.d.ts +52 -0
- package/dist/runtime/spots/spot-handler-registry.js +155 -0
- package/dist/runtime/spots/spot-lifecycle-metrics.d.ts +8 -0
- package/dist/runtime/spots/spot-lifecycle-metrics.js +16 -0
- package/dist/runtime/spots/spot-location-claim.d.ts +25 -0
- package/dist/runtime/spots/spot-location-claim.js +55 -0
- package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +10 -0
- package/dist/runtime/spots/spot-manager-internal-contracts.js +2 -0
- package/dist/runtime/spots/spot-manager-public.d.ts +32 -0
- package/dist/runtime/spots/spot-manager-public.js +219 -0
- package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +26 -0
- package/dist/runtime/spots/spot-native-actor-join-admission.js +105 -0
- package/dist/runtime/spots/spot-native-flags.d.ts +2 -0
- package/dist/runtime/spots/spot-native-flags.js +5 -0
- package/dist/runtime/spots/spot-node-autoconnect.d.ts +23 -0
- package/dist/runtime/spots/spot-node-autoconnect.js +246 -0
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +137 -0
- package/dist/runtime/spots/spot-node-runtime-manager.js +1111 -0
- package/dist/runtime/spots/spot-outbound.d.ts +78 -0
- package/dist/runtime/spots/spot-outbound.js +460 -0
- package/dist/runtime/spots/spot-provider.d.ts +4 -0
- package/dist/runtime/spots/spot-provider.js +28 -0
- package/dist/runtime/spots/spot-publisher-transport.d.ts +14 -0
- package/dist/runtime/spots/spot-publisher-transport.js +28 -0
- package/dist/runtime/spots/spot-remote-codec.d.ts +50 -0
- package/dist/runtime/spots/spot-remote-codec.js +190 -0
- package/dist/runtime/spots/spot-remote-route-codec.d.ts +47 -0
- package/dist/runtime/spots/spot-remote-route-codec.js +168 -0
- package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +25 -0
- package/dist/runtime/spots/spot-route-packet-dispatch.js +238 -0
- package/dist/runtime/spots/spot-route-replies.d.ts +17 -0
- package/dist/runtime/spots/spot-route-replies.js +76 -0
- package/dist/runtime/spots/spot-route-reply-wire.d.ts +10 -0
- package/dist/runtime/spots/spot-route-reply-wire.js +6 -0
- package/dist/runtime/spots/spot-routed-actor-admission.d.ts +36 -0
- package/dist/runtime/spots/spot-routed-actor-admission.js +240 -0
- package/dist/runtime/spots/spot-routed-bound-session-dispatch.d.ts +19 -0
- package/dist/runtime/spots/spot-routed-bound-session-dispatch.js +46 -0
- package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +54 -0
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +162 -0
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +43 -0
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +152 -0
- package/dist/runtime/spots/spot-routing-internal.d.ts +28 -0
- package/dist/runtime/spots/spot-routing-internal.js +2 -0
- package/dist/runtime/spots/spot-runtime-ports.d.ts +64 -0
- package/dist/runtime/spots/spot-runtime-ports.js +2 -0
- package/dist/runtime/spots/spot-serial-executor.d.ts +38 -0
- package/dist/runtime/spots/spot-serial-executor.js +133 -0
- package/dist/runtime/spots/spot-serial-turn-executor.d.ts +54 -0
- package/dist/runtime/spots/spot-serial-turn-executor.js +219 -0
- package/dist/runtime/spots/spot-subscription-dispatch.d.ts +32 -0
- package/dist/runtime/spots/spot-subscription-dispatch.js +194 -0
- package/dist/runtime/spots/spot-timer.d.ts +110 -0
- package/dist/runtime/spots/spot-timer.js +419 -0
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +193 -0
- package/dist/runtime/streams/actor-session-binding-registry.js +1127 -0
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +20 -0
- package/dist/runtime/streams/actor-session-binding-runtime-owner.js +19 -0
- package/dist/runtime/streams/actor-session-lifecycle-coordinator.d.ts +4 -0
- package/dist/runtime/streams/actor-session-lifecycle-coordinator.js +24 -0
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +29 -0
- package/dist/runtime/streams/bound-actor-relay-sender.js +181 -0
- package/dist/runtime/streams/bound-session-response-target.d.ts +25 -0
- package/dist/runtime/streams/bound-session-response-target.js +54 -0
- package/dist/runtime/streams/bound-session-service.d.ts +48 -0
- package/dist/runtime/streams/bound-session-service.js +201 -0
- package/dist/runtime/streams/index.d.ts +152 -0
- package/dist/runtime/streams/index.js +338 -0
- package/dist/runtime/streams/managed-stream.d.ts +53 -0
- package/dist/runtime/streams/managed-stream.js +329 -0
- package/dist/runtime/streams/native-fallback-bound-session.d.ts +24 -0
- package/dist/runtime/streams/native-fallback-bound-session.js +201 -0
- package/dist/runtime/streams/protocol.d.ts +67 -0
- package/dist/runtime/streams/protocol.js +244 -0
- package/dist/runtime/streams/session-actor-coordinator.d.ts +56 -0
- package/dist/runtime/streams/session-actor-coordinator.js +371 -0
- package/dist/runtime/streams/session-calls.d.ts +59 -0
- package/dist/runtime/streams/session-calls.js +123 -0
- package/dist/runtime/streams/session-context.d.ts +108 -0
- package/dist/runtime/streams/session-context.js +377 -0
- package/dist/runtime/streams/session-local-actors.d.ts +10 -0
- package/dist/runtime/streams/session-local-actors.js +26 -0
- package/dist/runtime/streams/session-provider.d.ts +4 -0
- package/dist/runtime/streams/session-provider.js +30 -0
- package/dist/runtime/streams/session-requests.d.ts +25 -0
- package/dist/runtime/streams/session-requests.js +100 -0
- package/dist/runtime/streams/session-serial-executor.d.ts +12 -0
- package/dist/runtime/streams/session-serial-executor.js +58 -0
- package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +62 -0
- package/dist/runtime/streams/stream-binding-runtime-ports.js +2 -0
- package/dist/runtime/streams/stream-frame-factory.d.ts +44 -0
- package/dist/runtime/streams/stream-frame-factory.js +149 -0
- package/dist/runtime/streams/stream-message-utils.d.ts +5 -0
- package/dist/runtime/streams/stream-message-utils.js +74 -0
- package/dist/runtime/streams/stream-session-runtime.d.ts +166 -0
- package/dist/runtime/streams/stream-session-runtime.js +1144 -0
- package/dist/runtime/workers/index.d.ts +38 -0
- package/dist/runtime/workers/index.js +474 -0
- package/package.json +19 -0
- package/src/contracts/Actors/ZLinkActor.ts +8 -0
- package/src/contracts/Actors/ZLinkActorClient.ts +18 -0
- package/src/contracts/Actors/ZLinkActorContext.ts +15 -0
- package/src/contracts/Actors/ZLinkActorFactory.ts +41 -0
- package/src/contracts/Actors/ZLinkActorManager.ts +31 -0
- package/src/contracts/Actors/index.ts +5 -0
- package/src/contracts/Channels/Calls.ts +33 -0
- package/src/contracts/Channels/IZLinkChannelClient.ts +6 -0
- package/src/contracts/Channels/IZLinkFanoutClient.ts +13 -0
- package/src/contracts/Channels/RouteCalls.ts +13 -0
- package/src/contracts/Channels/index.ts +4 -0
- package/src/contracts/Codecs/IZLinkCodecRegistryBuilder.ts +22 -0
- package/src/contracts/Codecs/ZLinkMessageSerializer.ts +6 -0
- package/src/contracts/Codecs/index.ts +2 -0
- package/src/contracts/Common/ActorRef.ts +8 -0
- package/src/contracts/Common/CoreTypes.ts +6 -0
- package/src/contracts/Common/Message.ts +9 -0
- package/src/contracts/Common/ZLinkEncodedPayload.ts +47 -0
- package/src/contracts/Common/ZLinkMessage.ts +135 -0
- package/src/contracts/Common/ZLinkMessageMetadata.ts +77 -0
- package/src/contracts/Common/ZLinkProviderResolver.ts +6 -0
- package/src/contracts/Common/encoded-payload-storage.ts +16 -0
- package/src/contracts/Common/index.ts +5 -0
- package/src/contracts/Configuration/Builders.ts +200 -0
- package/src/contracts/Configuration/CodecContentType.ts +68 -0
- package/src/contracts/Configuration/CodecSerializerSelection.ts +28 -0
- package/src/contracts/Configuration/Configs.ts +27 -0
- package/src/contracts/Configuration/ConfigurationException.ts +6 -0
- package/src/contracts/Configuration/Connections.ts +5 -0
- package/src/contracts/Configuration/DiagnosticsValidation.ts +25 -0
- package/src/contracts/Configuration/EndpointNotation.ts +232 -0
- package/src/contracts/Configuration/InternalDefaults.ts +13 -0
- package/src/contracts/Configuration/ObjectRoles.ts +47 -0
- package/src/contracts/Configuration/Registration.ts +191 -0
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +76 -0
- package/src/contracts/Configuration/RegistrationBuilders.ts +1705 -0
- package/src/contracts/Configuration/RegistrationCodecRegistry.ts +118 -0
- package/src/contracts/Configuration/RegistrationNormalizers.ts +404 -0
- package/src/contracts/Configuration/RegistrationTypes.ts +499 -0
- package/src/contracts/Configuration/RegistrationValidators.ts +698 -0
- package/src/contracts/Configuration/RouteChannelInternalState.ts +50 -0
- package/src/contracts/Configuration/RuntimeEndpointConnections.ts +91 -0
- package/src/contracts/Configuration/SendTimeoutValidation.ts +15 -0
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +37 -0
- package/src/contracts/Configuration/index.ts +35 -0
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +222 -0
- package/src/contracts/Dispatch/ZLinkFlowOrigin.ts +1 -0
- package/src/contracts/Dispatch/index.ts +2 -0
- package/src/contracts/Errors/ZLinkFrameworkException.ts +27 -0
- package/src/contracts/Errors/index.ts +4 -0
- package/src/contracts/Eventing/Metrics.ts +27 -0
- package/src/contracts/Eventing/index.ts +1 -0
- package/src/contracts/Handlers/Attributes.ts +111 -0
- package/src/contracts/Handlers/Contexts.ts +21 -0
- package/src/contracts/Handlers/IZLinkChannelHandlers.ts +69 -0
- package/src/contracts/Handlers/IZLinkHandlerFilter.ts +22 -0
- package/src/contracts/Handlers/JsonContract.ts +172 -0
- package/src/contracts/Handlers/ZLinkHandlerFilterNext.ts +1 -0
- package/src/contracts/Handlers/index.ts +17 -0
- package/src/contracts/Locations/ActorTransfer.ts +84 -0
- package/src/contracts/Locations/Authority.ts +308 -0
- package/src/contracts/Locations/Diagnostics.ts +48 -0
- package/src/contracts/Locations/Keys.ts +93 -0
- package/src/contracts/Locations/Models.ts +7 -0
- package/src/contracts/Locations/Options.ts +42 -0
- package/src/contracts/Locations/Readiness.ts +11 -0
- package/src/contracts/Locations/RelocationStore.ts +51 -0
- package/src/contracts/Locations/Resolvers.ts +8 -0
- package/src/contracts/Locations/Rows.ts +164 -0
- package/src/contracts/Locations/RuntimeQuery.ts +56 -0
- package/src/contracts/Locations/Stores.ts +92 -0
- package/src/contracts/Locations/Values.ts +32 -0
- package/src/contracts/Locations/Watch.ts +16 -0
- package/src/contracts/Locations/Writes.ts +56 -0
- package/src/contracts/Locations/index.ts +48 -0
- package/src/contracts/RouteMesh/Contracts.ts +145 -0
- package/src/contracts/RouteMesh/RuntimeTopology.ts +201 -0
- package/src/contracts/RouteMesh/index.ts +2 -0
- package/src/contracts/Spots/Builders.ts +11 -0
- package/src/contracts/Spots/Contracts.ts +150 -0
- package/src/contracts/Spots/SpotKind.ts +24 -0
- package/src/contracts/Spots/ZLinkSpot.ts +88 -0
- package/src/contracts/Spots/index.ts +3 -0
- package/src/contracts/Streams/BoundSessionContracts.ts +9 -0
- package/src/contracts/Streams/IZLinkSession.ts +52 -0
- package/src/contracts/Streams/IZLinkSessionActor.ts +17 -0
- package/src/contracts/Streams/IZLinkSessionPacketHandler.ts +11 -0
- package/src/contracts/Streams/IZLinkStream.ts +10 -0
- package/src/contracts/Streams/ZLinkMessageMetadata.ts +1 -0
- package/src/contracts/Streams/ZLinkStreamCompression.ts +9 -0
- package/src/contracts/Streams/ZLinkStreamError.ts +9 -0
- package/src/contracts/Streams/index.ts +8 -0
- package/src/contracts/Timers/IZLinkTimer.ts +5 -0
- package/src/contracts/Timers/ZLinkTimerOptions.ts +11 -0
- package/src/contracts/Timers/ZLinkTimerTick.ts +12 -0
- package/src/contracts/Timers/index.ts +3 -0
- package/src/contracts/index.ts +71 -0
- package/src/index.ts +1 -0
- package/src/internal.ts +29 -0
- package/src/location-store-integration.ts +51 -0
- package/src/nest-integration.ts +251 -0
- package/src/runtime/abort.ts +70 -0
- package/src/runtime/actors/actor-authority-payload-codec.ts +454 -0
- package/src/runtime/actors/actor-authority-publication.ts +277 -0
- package/src/runtime/actors/actor-client.ts +1018 -0
- package/src/runtime/actors/actor-context.ts +583 -0
- package/src/runtime/actors/actor-creation.ts +254 -0
- package/src/runtime/actors/actor-execution-context.ts +38 -0
- package/src/runtime/actors/actor-handoff.ts +1911 -0
- package/src/runtime/actors/actor-join-deferred-scope.ts +183 -0
- package/src/runtime/actors/actor-join-relocation.ts +39 -0
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +90 -0
- package/src/runtime/actors/actor-local-native-join.ts +725 -0
- package/src/runtime/actors/actor-mailbox.ts +92 -0
- package/src/runtime/actors/actor-message-follow-context.ts +347 -0
- package/src/runtime/actors/actor-native-lookup.ts +38 -0
- package/src/runtime/actors/actor-packet-relay-wire.ts +223 -0
- package/src/runtime/actors/actor-remote-joiner.ts +238 -0
- package/src/runtime/actors/actor-remote-wire.ts +169 -0
- package/src/runtime/actors/actor-retry-delay.ts +37 -0
- package/src/runtime/actors/actor-routed-join-transport.ts +58 -0
- package/src/runtime/actors/actor-routed-json-request.ts +44 -0
- package/src/runtime/actors/actor-runtime-contracts.ts +126 -0
- package/src/runtime/actors/actor-runtime-state.ts +805 -0
- package/src/runtime/actors/actor-source-transfer.ts +62 -0
- package/src/runtime/actors/actor-transfer-registry.ts +112 -0
- package/src/runtime/actors/actor-transport-delivery-gate.ts +17 -0
- package/src/runtime/actors/bound-session-wire.ts +257 -0
- package/src/runtime/actors/deferred-join-accepted-journal.ts +1319 -0
- package/src/runtime/actors/index.ts +972 -0
- package/src/runtime/actors/post-commit-actor-binder.ts +70 -0
- package/src/runtime/actors/post-commit-actor-location.ts +114 -0
- package/src/runtime/actors/spot-actor-dispatch.ts +362 -0
- package/src/runtime/actors/transferred-actor-rollback.ts +123 -0
- package/src/runtime/admission.ts +192 -0
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +216 -0
- package/src/runtime/application-jobs/application-job-queue-handler-start-gate.ts +10 -0
- package/src/runtime/application-jobs/application-job-queue-scope.ts +64 -0
- package/src/runtime/application-jobs/contracts.ts +26 -0
- package/src/runtime/application-jobs/receive-flow-controller.ts +188 -0
- package/src/runtime/backend/contracts/index.ts +765 -0
- package/src/runtime/backend/index.ts +9 -0
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +73 -0
- package/src/runtime/backend/mesh-completion-table.ts +165 -0
- package/src/runtime/backend/mesh-dispatch-pump.ts +363 -0
- package/src/runtime/backend/mesh-record-dispatcher.ts +65 -0
- package/src/runtime/backend/node/index.ts +4 -0
- package/src/runtime/backend/node/node-backend-adapter-factory.ts +204 -0
- package/src/runtime/backend/node/node-backend-adapter-support.ts +257 -0
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +133 -0
- package/src/runtime/backend/node/node-mesh-backend-adapter.ts +44 -0
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +39 -0
- package/src/runtime/backend/node/node-raw-binding-port.contract.ts +21 -0
- package/src/runtime/backend/node/node-raw-binding-port.ts +518 -0
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +2669 -0
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +372 -0
- package/src/runtime/backend/node-backend-adapter.ts +19 -0
- package/src/runtime/backend/raw-binding-port.ts +69 -0
- package/src/runtime/backend/runtime-message.ts +51 -0
- package/src/runtime/backend/runtime-values.ts +107 -0
- package/src/runtime/channels/channel-autoconnect.ts +46 -0
- package/src/runtime/channels/channel-clients.ts +527 -0
- package/src/runtime/channels/channel-dispatch-pipeline.ts +408 -0
- package/src/runtime/channels/channel-dispatch-services.ts +234 -0
- package/src/runtime/channels/channel-dispatchers.ts +790 -0
- package/src/runtime/channels/channel-envelope-inspection.ts +125 -0
- package/src/runtime/channels/channel-envelope.ts +743 -0
- package/src/runtime/channels/channel-framework-packets.ts +8 -0
- package/src/runtime/channels/channel-multipart.ts +61 -0
- package/src/runtime/channels/channel-outbound-operations.ts +584 -0
- package/src/runtime/channels/channel-receive-loops.ts +901 -0
- package/src/runtime/channels/channel-receive-task-tracker.ts +39 -0
- package/src/runtime/channels/channel-runtime-lifecycle.ts +969 -0
- package/src/runtime/channels/channel-runtime-manager.ts +444 -0
- package/src/runtime/channels/channel-socket-options.ts +153 -0
- package/src/runtime/channels/channel-socket-registry.ts +1837 -0
- package/src/runtime/channels/channel-transports.ts +1154 -0
- package/src/runtime/channels/client-server-location-runtime.ts +576 -0
- package/src/runtime/channels/client-server-service-wire.ts +390 -0
- package/src/runtime/channels/dispatch-error-reporter.ts +165 -0
- package/src/runtime/channels/fanout-location-runtime.ts +459 -0
- package/src/runtime/channels/fanout-service-wire.ts +43 -0
- package/src/runtime/channels/handler-filter-scope.ts +29 -0
- package/src/runtime/channels/index.ts +45 -0
- package/src/runtime/channels/local-spot-route-transport.ts +59 -0
- package/src/runtime/channels/route-disconnected-error.ts +6 -0
- package/src/runtime/channels/route-member-snapshot.ts +55 -0
- package/src/runtime/channels/router-socket-spot-route-transport.ts +77 -0
- package/src/runtime/channels/source-spot-router.ts +89 -0
- package/src/runtime/channels/spot-direct-envelope.ts +44 -0
- package/src/runtime/channels/spot-node-route-transport.ts +92 -0
- package/src/runtime/channels/spot-route-bridge-transport.ts +75 -0
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +329 -0
- package/src/runtime/channels/spot-route-target-resolver.ts +101 -0
- package/src/runtime/codecs/index.ts +69 -0
- package/src/runtime/configuration/index.ts +1 -0
- package/src/runtime/diagnostics/dispatch-error-port.ts +8 -0
- package/src/runtime/diagnostics/flow-context.ts +84 -0
- package/src/runtime/diagnostics/index.ts +441 -0
- package/src/runtime/diagnostics/internal-event-contracts.ts +135 -0
- package/src/runtime/diagnostics/message-flow.ts +560 -0
- package/src/runtime/diagnostics/runtime-metrics.ts +601 -0
- package/src/runtime/diagnostics/runtime-observation-queue.ts +362 -0
- package/src/runtime/diagnostics/topology-runtime-projections.ts +298 -0
- package/src/runtime/execution/index.ts +466 -0
- package/src/runtime/execution/serial-execution-queue.ts +534 -0
- package/src/runtime/execution/serial-work-size.ts +31 -0
- package/src/runtime/execution/state-lane.ts +116 -0
- package/src/runtime/foundation/actor-join-recovery-codec.ts +465 -0
- package/src/runtime/foundation/event-loop-resources.ts +162 -0
- package/src/runtime/foundation/index.ts +18 -0
- package/src/runtime/foundation/message-follow-suppression-registry.ts +130 -0
- package/src/runtime/foundation/operation-identity.ts +49 -0
- package/src/runtime/foundation/operation-registry.ts +162 -0
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +1771 -0
- package/src/runtime/foundation/route-mesh-connection-policy.ts +28 -0
- package/src/runtime/foundation/runtime-state-projections.ts +68 -0
- package/src/runtime/foundation/service-authority-payload-codec.ts +566 -0
- package/src/runtime/foundation/service-discovery-registry.ts +263 -0
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +329 -0
- package/src/runtime/foundation/service-liveness-registry.ts +144 -0
- package/src/runtime/foundation/service-mailbox.ts +369 -0
- package/src/runtime/foundation/service-maintenance-runtime.ts +242 -0
- package/src/runtime/foundation/service-metadata-codec.ts +75 -0
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +218 -0
- package/src/runtime/foundation/service-relocation-coordinator.ts +37 -0
- package/src/runtime/foundation/service-relocation-object-owner.ts +428 -0
- package/src/runtime/foundation/service-relocation-runtime.ts +1407 -0
- package/src/runtime/foundation/service-runtime-contracts.ts +423 -0
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +45 -0
- package/src/runtime/foundation/service-stateful-registry.ts +664 -0
- package/src/runtime/foundation/service-stateful-runtime.ts +5753 -0
- package/src/runtime/foundation/service-stateful-wire-codec.ts +3008 -0
- package/src/runtime/foundation/service-topology-registry.ts +599 -0
- package/src/runtime/foundation/service-weighted-selection.ts +166 -0
- package/src/runtime/foundation/service-wire-binary-primitives.ts +80 -0
- package/src/runtime/foundation/service-wire-codec.ts +91 -0
- package/src/runtime/foundation/service-wire-constants.generated.ts +131 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +647 -0
- package/src/runtime/framework-errors-internal.ts +338 -0
- package/src/runtime/handlers/handler-instance-scope.ts +372 -0
- package/src/runtime/handlers/index.ts +93 -0
- package/src/runtime/host/actor-packet-relay.ts +1070 -0
- package/src/runtime/host/actor-placement-coordinator.ts +573 -0
- package/src/runtime/host/actor-runtime-options-factory.ts +282 -0
- package/src/runtime/host/actor-transfer-authority-runtime.ts +225 -0
- package/src/runtime/host/actor-transfer-runtime.ts +1958 -0
- package/src/runtime/host/application-job-queue.ts +518 -0
- package/src/runtime/host/bound-session-relay.ts +94 -0
- package/src/runtime/host/bounded-replay-map.ts +42 -0
- package/src/runtime/host/channel-runtime-options-factory.ts +104 -0
- package/src/runtime/host/entry-actor-runtime.ts +115 -0
- package/src/runtime/host/host-capacity-status.ts +103 -0
- package/src/runtime/host/index.ts +3492 -0
- package/src/runtime/host/instance-activation-authority.ts +658 -0
- package/src/runtime/host/location-runtime-owner.ts +313 -0
- package/src/runtime/host/mesh-router-resolver.ts +114 -0
- package/src/runtime/host/relocation-direct-transfer.ts +273 -0
- package/src/runtime/host/relocation-integrity-fault-gate.ts +8 -0
- package/src/runtime/host/relocation-state-adapter.ts +24 -0
- package/src/runtime/host/remote-actor-join-receiver.ts +264 -0
- package/src/runtime/host/remote-actor-packet-target-store.ts +244 -0
- package/src/runtime/host/remote-bound-session-relay.ts +900 -0
- package/src/runtime/host/route-mesh-runtime-options.ts +46 -0
- package/src/runtime/host/route-mesh-runtime.ts +891 -0
- package/src/runtime/host/runtime-shutdown.ts +101 -0
- package/src/runtime/host/service-relocation-control.ts +28 -0
- package/src/runtime/host/service-relocation-host-runtime.ts +5817 -0
- package/src/runtime/host/spot-address-transport.ts +997 -0
- package/src/runtime/host/spot-node-runtime-options-factory.ts +82 -0
- package/src/runtime/host/spot-runtime-options-factory.ts +286 -0
- package/src/runtime/host/stateful-authority-route-runtime.ts +662 -0
- package/src/runtime/host/user-spot-creation-coordinator.ts +1176 -0
- package/src/runtime/locations/actor-location-claims.ts +426 -0
- package/src/runtime/locations/actor-session-route-claims.ts +64 -0
- package/src/runtime/locations/aggregate-inventory-store.ts +581 -0
- package/src/runtime/locations/authority-key-codec.ts +80 -0
- package/src/runtime/locations/auto-connect-loop.ts +131 -0
- package/src/runtime/locations/auto-connect-planner.ts +178 -0
- package/src/runtime/locations/auto-connect-reconciler.ts +425 -0
- package/src/runtime/locations/auto-connect-types.ts +62 -0
- package/src/runtime/locations/auto-connect.ts +4 -0
- package/src/runtime/locations/canonical-codec.ts +54 -0
- package/src/runtime/locations/domain-store-contract.ts +149 -0
- package/src/runtime/locations/in-memory-authority-store.ts +1172 -0
- package/src/runtime/locations/in-memory-location-store.ts +1467 -0
- package/src/runtime/locations/in-memory-provider-location-store.ts +213 -0
- package/src/runtime/locations/index.ts +11 -0
- package/src/runtime/locations/internal-location-contracts.ts +22 -0
- package/src/runtime/locations/internal-store-contracts.ts +90 -0
- package/src/runtime/locations/key-codec.ts +61 -0
- package/src/runtime/locations/lease-tracker.ts +221 -0
- package/src/runtime/locations/lifecycle-runtime.ts +44 -0
- package/src/runtime/locations/lifecycle.ts +272 -0
- package/src/runtime/locations/location-store-repository.ts +4211 -0
- package/src/runtime/locations/relocation-blob.ts +36 -0
- package/src/runtime/locations/resolvers.ts +1054 -0
- package/src/runtime/locations/runtime.ts +1126 -0
- package/src/runtime/locations/spot-location-claims.ts +435 -0
- package/src/runtime/messaging/creation-payload-codec.ts +59 -0
- package/src/runtime/messaging/framework-json-v1.ts +307 -0
- package/src/runtime/messaging/index.ts +1 -0
- package/src/runtime/messaging/packet-name.ts +94 -0
- package/src/runtime/messaging/payload-codec.ts +418 -0
- package/src/runtime/messaging/submission-result.ts +61 -0
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +189 -0
- package/src/runtime/routing-id.ts +125 -0
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +418 -0
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +147 -0
- package/src/runtime/spots/index.ts +3303 -0
- package/src/runtime/spots/spot-activation-registry.ts +335 -0
- package/src/runtime/spots/spot-activation-state.ts +414 -0
- package/src/runtime/spots/spot-activation.ts +1027 -0
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +354 -0
- package/src/runtime/spots/spot-actor-join-dispatch.ts +303 -0
- package/src/runtime/spots/spot-actor-lifecycle-drain.ts +79 -0
- package/src/runtime/spots/spot-actor-membership.ts +266 -0
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +593 -0
- package/src/runtime/spots/spot-actor-packet-drain.ts +328 -0
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +162 -0
- package/src/runtime/spots/spot-closing.ts +34 -0
- package/src/runtime/spots/spot-context.ts +259 -0
- package/src/runtime/spots/spot-entry-activation.ts +551 -0
- package/src/runtime/spots/spot-handle.ts +101 -0
- package/src/runtime/spots/spot-handler-registry.ts +273 -0
- package/src/runtime/spots/spot-lifecycle-metrics.ts +15 -0
- package/src/runtime/spots/spot-location-claim.ts +86 -0
- package/src/runtime/spots/spot-manager-internal-contracts.ts +11 -0
- package/src/runtime/spots/spot-manager-public.ts +361 -0
- package/src/runtime/spots/spot-native-actor-join-admission.ts +151 -0
- package/src/runtime/spots/spot-native-flags.ts +4 -0
- package/src/runtime/spots/spot-node-autoconnect.ts +325 -0
- package/src/runtime/spots/spot-node-runtime-manager.ts +1573 -0
- package/src/runtime/spots/spot-outbound.ts +761 -0
- package/src/runtime/spots/spot-provider.ts +36 -0
- package/src/runtime/spots/spot-publisher-transport.ts +69 -0
- package/src/runtime/spots/spot-remote-codec.ts +308 -0
- package/src/runtime/spots/spot-remote-route-codec.ts +284 -0
- package/src/runtime/spots/spot-route-packet-dispatch.ts +359 -0
- package/src/runtime/spots/spot-route-replies.ts +126 -0
- package/src/runtime/spots/spot-route-reply-wire.ts +15 -0
- package/src/runtime/spots/spot-routed-actor-admission.ts +351 -0
- package/src/runtime/spots/spot-routed-bound-session-dispatch.ts +132 -0
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +250 -0
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +254 -0
- package/src/runtime/spots/spot-routing-internal.ts +33 -0
- package/src/runtime/spots/spot-runtime-ports.ts +196 -0
- package/src/runtime/spots/spot-serial-executor.ts +170 -0
- package/src/runtime/spots/spot-serial-turn-executor.ts +319 -0
- package/src/runtime/spots/spot-subscription-dispatch.ts +252 -0
- package/src/runtime/spots/spot-timer.ts +609 -0
- package/src/runtime/streams/actor-session-binding-registry.ts +1691 -0
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +78 -0
- package/src/runtime/streams/actor-session-lifecycle-coordinator.ts +20 -0
- package/src/runtime/streams/bound-actor-relay-sender.ts +275 -0
- package/src/runtime/streams/bound-session-response-target.ts +91 -0
- package/src/runtime/streams/bound-session-service.ts +500 -0
- package/src/runtime/streams/index.ts +706 -0
- package/src/runtime/streams/managed-stream.ts +509 -0
- package/src/runtime/streams/native-fallback-bound-session.ts +321 -0
- package/src/runtime/streams/protocol.ts +291 -0
- package/src/runtime/streams/session-actor-coordinator.ts +605 -0
- package/src/runtime/streams/session-calls.ts +221 -0
- package/src/runtime/streams/session-context.ts +609 -0
- package/src/runtime/streams/session-local-actors.ts +30 -0
- package/src/runtime/streams/session-provider.ts +50 -0
- package/src/runtime/streams/session-requests.ts +109 -0
- package/src/runtime/streams/session-serial-executor.ts +97 -0
- package/src/runtime/streams/stream-binding-runtime-ports.ts +106 -0
- package/src/runtime/streams/stream-frame-factory.ts +255 -0
- package/src/runtime/streams/stream-message-utils.ts +89 -0
- package/src/runtime/streams/stream-session-runtime.ts +1420 -0
- package/src/runtime/workers/index.ts +580 -0
- package/tsconfig.json +17 -0
|
@@ -0,0 +1,1691 @@
|
|
|
1
|
+
import { ZLinkFrameworkInternalErrorKind, createInternalFrameworkException } from '../framework-errors-internal';
|
|
2
|
+
import { createAbortError, throwIfAborted } from '../abort';
|
|
3
|
+
import { AsyncResource } from 'node:async_hooks';
|
|
4
|
+
import { ZLinkStateLane } from '../execution/state-lane';
|
|
5
|
+
import { routingIdsEqual } from '../routing-id';
|
|
6
|
+
import type {
|
|
7
|
+
ServiceSessionBindingAdmissionClaim,
|
|
8
|
+
ServiceSessionBindingAdmissionResult
|
|
9
|
+
} from '../foundation/service-session-binding-ingress-port';
|
|
10
|
+
|
|
11
|
+
const detachedStateLaneResource = new AsyncResource('zlink:actor-session-binding-registry');
|
|
12
|
+
export interface ZLinkActorSessionBindingActor {
|
|
13
|
+
readonly actorId: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface ZLinkActorSessionBindingContext<TActor extends ZLinkActorSessionBindingActor> {
|
|
17
|
+
readonly routingId?: unknown;
|
|
18
|
+
bindLocal(actor: TActor, bindingToken: string): void;
|
|
19
|
+
unbindLocal(actorId: string, bindingToken: string): void;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface ZLinkActorSessionRoute<
|
|
23
|
+
TContext extends ZLinkActorSessionBindingContext<TActor>,
|
|
24
|
+
TActor extends ZLinkActorSessionBindingActor
|
|
25
|
+
> {
|
|
26
|
+
readonly context: TContext;
|
|
27
|
+
readonly actor: TActor;
|
|
28
|
+
readonly bindingToken: string;
|
|
29
|
+
readonly sessionIdentity?: string;
|
|
30
|
+
readonly activeFrames: ZLinkActorSessionActiveFrames;
|
|
31
|
+
sealId?: string;
|
|
32
|
+
authorityFence?: ZLinkActorSessionAuthorityFence;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface ZLinkActorSessionRelocationClaim {
|
|
36
|
+
readonly actorId: string;
|
|
37
|
+
readonly actorGeneration: bigint;
|
|
38
|
+
readonly bindingGeneration: bigint;
|
|
39
|
+
readonly sessionIdentity?: string;
|
|
40
|
+
readonly actorNodeRid?: string;
|
|
41
|
+
readonly actorNodeGeneration?: bigint;
|
|
42
|
+
readonly sealId: string;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface ZLinkActorSessionRetainedOutbound {
|
|
46
|
+
deliver(): Promise<boolean>;
|
|
47
|
+
fail(error: unknown): void;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface ZLinkActorSessionAcceptedProducerProof {
|
|
51
|
+
readonly actorId: string;
|
|
52
|
+
readonly objectGeneration: bigint;
|
|
53
|
+
readonly actorNodeRid: string;
|
|
54
|
+
readonly actorNodeGeneration: bigint;
|
|
55
|
+
readonly sessionIdentity: string;
|
|
56
|
+
readonly bindingGeneration: bigint;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface ZLinkActorSessionRelocationSnapshot extends ZLinkActorSessionRelocationClaim {
|
|
60
|
+
readonly phase: 'sealed' | 'applying' | 'applied' | 'terminal';
|
|
61
|
+
readonly applyFingerprint?: string;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
interface ZLinkActorSessionFrameAdmission {
|
|
65
|
+
complete(): Promise<void>;
|
|
66
|
+
completeCore(): void;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
interface ZLinkActorSessionRequestFrameAdmission {
|
|
70
|
+
complete(): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Claims the one allowed submission attempt. A request captured by a seal
|
|
73
|
+
* before this call waits for that exact seal to publish or abort its route;
|
|
74
|
+
* a request captured after this call only observes its original terminal.
|
|
75
|
+
*/
|
|
76
|
+
beginSubmission(signal?: AbortSignal): Promise<void> | undefined;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
interface ZLinkActorSessionActiveFrames {
|
|
80
|
+
count: number;
|
|
81
|
+
readonly requests: Set<{
|
|
82
|
+
captureBySeal(): void;
|
|
83
|
+
}>;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
interface ZLinkActorSessionActiveFrameWaiter {
|
|
87
|
+
readonly resolve: () => void;
|
|
88
|
+
readonly reject: (error: unknown) => void;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
interface ZLinkActorSessionRelocationState {
|
|
92
|
+
readonly actorId: string;
|
|
93
|
+
readonly actorGeneration: bigint;
|
|
94
|
+
readonly bindingGeneration: bigint;
|
|
95
|
+
readonly sessionIdentity?: string;
|
|
96
|
+
readonly actorNodeRid?: string;
|
|
97
|
+
readonly actorNodeGeneration?: bigint;
|
|
98
|
+
readonly sealId: string;
|
|
99
|
+
phase: 'sealed' | 'applying' | 'applied' | 'terminal';
|
|
100
|
+
applyFingerprint?: string;
|
|
101
|
+
applyPromise?: Promise<void>;
|
|
102
|
+
acceptedProducerProof?: ZLinkActorSessionAcceptedProducerProof;
|
|
103
|
+
readonly ready: Promise<void>;
|
|
104
|
+
readonly terminal: Promise<void>;
|
|
105
|
+
readonly resolveTerminal: () => void;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
interface ZLinkActorSessionOutboundEntry {
|
|
109
|
+
readonly sealId?: string;
|
|
110
|
+
readonly operation: ZLinkActorSessionRetainedOutbound;
|
|
111
|
+
readonly arrivalOrder: bigint;
|
|
112
|
+
readonly claim?: ServiceSessionBindingAdmissionClaim;
|
|
113
|
+
readonly authorization: 'legacy' | 'source' | 'pendingTarget';
|
|
114
|
+
released: boolean;
|
|
115
|
+
settled: boolean;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
interface ZLinkActorSessionRelocationQueue {
|
|
119
|
+
readonly actorId: string;
|
|
120
|
+
activeSealId?: string;
|
|
121
|
+
readonly seals: Map<string, ZLinkActorSessionRelocationState>;
|
|
122
|
+
readonly outbound: ZLinkActorSessionOutboundEntry[];
|
|
123
|
+
nextArrivalOrder: bigint;
|
|
124
|
+
outboundCount: number;
|
|
125
|
+
drainPromise?: Promise<void>;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export interface ZLinkActorSessionAuthorityFence {
|
|
129
|
+
readonly authorityOwnerGeneration: bigint;
|
|
130
|
+
readonly ownerLeaseGeneration: bigint;
|
|
131
|
+
readonly ownerId?: string;
|
|
132
|
+
readonly ownerNodeGeneration?: bigint;
|
|
133
|
+
readonly authorityStoreVersion?: string;
|
|
134
|
+
readonly actorType?: string;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export class ZLinkActorSessionBindingRegistry<
|
|
138
|
+
TContext extends ZLinkActorSessionBindingContext<TActor>,
|
|
139
|
+
TActor extends ZLinkActorSessionBindingActor
|
|
140
|
+
> {
|
|
141
|
+
private readonly lane = new ZLinkStateLane();
|
|
142
|
+
private readonly routes = new Map<string, ZLinkActorSessionRoute<TContext, TActor>>();
|
|
143
|
+
private readonly sealWaiters = new Map<string, Set<{
|
|
144
|
+
readonly bindingToken: string;
|
|
145
|
+
readonly resolve: () => void;
|
|
146
|
+
readonly reject: (error: unknown) => void;
|
|
147
|
+
}>>();
|
|
148
|
+
private readonly activeFrameWaiters = new Map<string, Set<ZLinkActorSessionActiveFrameWaiter>>();
|
|
149
|
+
private readonly relocations = new Map<string, ZLinkActorSessionRelocationQueue>();
|
|
150
|
+
private readonly terminalRelocations = new Map<ZLinkActorSessionRelocationState, true>();
|
|
151
|
+
|
|
152
|
+
constructor(
|
|
153
|
+
private readonly terminalRelocationCapacity = 4096,
|
|
154
|
+
private readonly outboundCapacity = 4096,
|
|
155
|
+
// Spec 06 — SessionRelocationSealTimeout bounds how long a session
|
|
156
|
+
// relocation seal may hold ingress (default 3,000 ms, finite only).
|
|
157
|
+
// Every wait on the seal (accept paths) and on active-frame drain
|
|
158
|
+
// (the sealing side) must observe that bound; an unbounded wait here
|
|
159
|
+
// turns a lost control or a lifecycle interlock into a silent stall
|
|
160
|
+
// (spec 48:205 — transport/deadline limits apply during relocation).
|
|
161
|
+
private readonly sealWaitTimeoutMs = 3_000
|
|
162
|
+
) {
|
|
163
|
+
if (!Number.isSafeInteger(terminalRelocationCapacity) || terminalRelocationCapacity <= 0) {
|
|
164
|
+
throw new RangeError('Session relocation terminal capacity must be a positive safe integer.');
|
|
165
|
+
}
|
|
166
|
+
if (!Number.isSafeInteger(outboundCapacity) || outboundCapacity <= 0) {
|
|
167
|
+
throw new RangeError('Session relocation outbound capacity must be a positive safe integer.');
|
|
168
|
+
}
|
|
169
|
+
if (!Number.isSafeInteger(sealWaitTimeoutMs) || sealWaitTimeoutMs <= 0) {
|
|
170
|
+
throw new RangeError('Session relocation seal timeout must be a positive safe integer.');
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
async bind(
|
|
175
|
+
context: TContext,
|
|
176
|
+
actor: TActor,
|
|
177
|
+
bindingToken: string,
|
|
178
|
+
authorityFence?: ZLinkActorSessionAuthorityFence,
|
|
179
|
+
sessionIdentity?: string
|
|
180
|
+
): Promise<void> {
|
|
181
|
+
await this.lane.run(() => this.bindCore(context, actor, bindingToken, authorityFence, sessionIdentity));
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
private bindCore(
|
|
185
|
+
context: TContext,
|
|
186
|
+
actor: TActor,
|
|
187
|
+
bindingToken: string,
|
|
188
|
+
authorityFence?: ZLinkActorSessionAuthorityFence,
|
|
189
|
+
sessionIdentity?: string
|
|
190
|
+
): void {
|
|
191
|
+
this.routes.set(actor.actorId, {
|
|
192
|
+
context,
|
|
193
|
+
actor,
|
|
194
|
+
bindingToken,
|
|
195
|
+
sessionIdentity: sessionIdentity ?? sessionIdentityFromContext(context),
|
|
196
|
+
activeFrames: { count: 0, requests: new Set() },
|
|
197
|
+
authorityFence
|
|
198
|
+
});
|
|
199
|
+
context.bindLocal(actor, bindingToken);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
async replace(
|
|
203
|
+
previous: ZLinkActorSessionRoute<TContext, TActor>,
|
|
204
|
+
context: TContext,
|
|
205
|
+
actor: TActor,
|
|
206
|
+
bindingToken: string,
|
|
207
|
+
authorityFence?: ZLinkActorSessionAuthorityFence,
|
|
208
|
+
sessionIdentity?: string
|
|
209
|
+
): Promise<void> {
|
|
210
|
+
await this.lane.run(() => this.replaceCore(
|
|
211
|
+
previous, context, actor, bindingToken, authorityFence, sessionIdentity
|
|
212
|
+
));
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
private replaceCore(
|
|
216
|
+
previous: ZLinkActorSessionRoute<TContext, TActor>,
|
|
217
|
+
context: TContext,
|
|
218
|
+
actor: TActor,
|
|
219
|
+
bindingToken: string,
|
|
220
|
+
authorityFence?: ZLinkActorSessionAuthorityFence,
|
|
221
|
+
sessionIdentity?: string
|
|
222
|
+
): void {
|
|
223
|
+
const current = this.routes.get(actor.actorId);
|
|
224
|
+
if (current !== previous) {
|
|
225
|
+
throw createInternalFrameworkException(
|
|
226
|
+
ZLinkFrameworkInternalErrorKind.ActorSessionNotBound,
|
|
227
|
+
`Actor '${actor.actorId}' session binding changed before route replacement.`,
|
|
228
|
+
true
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
context.bindLocal(actor, bindingToken);
|
|
233
|
+
const sameLocalBinding = previous.context === context
|
|
234
|
+
&& previous.bindingToken === bindingToken;
|
|
235
|
+
if (!sameLocalBinding) {
|
|
236
|
+
try {
|
|
237
|
+
previous.context.unbindLocal(actor.actorId, previous.bindingToken);
|
|
238
|
+
} catch (error) {
|
|
239
|
+
context.unbindLocal(actor.actorId, bindingToken);
|
|
240
|
+
previous.context.bindLocal(previous.actor, previous.bindingToken);
|
|
241
|
+
throw error;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
this.routes.set(actor.actorId, {
|
|
245
|
+
context,
|
|
246
|
+
actor,
|
|
247
|
+
bindingToken,
|
|
248
|
+
sessionIdentity: sessionIdentity ?? sessionIdentityFromContext(context),
|
|
249
|
+
activeFrames: previous.activeFrames,
|
|
250
|
+
sealId: previous.sealId,
|
|
251
|
+
authorityFence: authorityFence ?? previous.authorityFence
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
async replaceAndReleaseSeal(
|
|
256
|
+
previous: ZLinkActorSessionRoute<TContext, TActor>,
|
|
257
|
+
context: TContext,
|
|
258
|
+
actor: TActor,
|
|
259
|
+
bindingToken: string,
|
|
260
|
+
sealId: string,
|
|
261
|
+
authorityFence?: ZLinkActorSessionAuthorityFence,
|
|
262
|
+
sessionIdentity?: string
|
|
263
|
+
): Promise<void> {
|
|
264
|
+
await this.lane.run(() => this.replaceAndReleaseSealCore(
|
|
265
|
+
previous, context, actor, bindingToken, sealId, authorityFence, sessionIdentity
|
|
266
|
+
));
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
private replaceAndReleaseSealCore(
|
|
270
|
+
previous: ZLinkActorSessionRoute<TContext, TActor>,
|
|
271
|
+
context: TContext,
|
|
272
|
+
actor: TActor,
|
|
273
|
+
bindingToken: string,
|
|
274
|
+
sealId: string,
|
|
275
|
+
authorityFence?: ZLinkActorSessionAuthorityFence,
|
|
276
|
+
sessionIdentity?: string
|
|
277
|
+
): void {
|
|
278
|
+
if (previous.sealId !== sealId) {
|
|
279
|
+
throw createInternalFrameworkException(
|
|
280
|
+
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
281
|
+
`Actor '${actor.actorId}' route switch did not match its relocation seal.`,
|
|
282
|
+
true
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
// JavaScript cannot interleave another ingress turn between these two
|
|
286
|
+
// synchronous mutations. The replacement preserves the seal, then the
|
|
287
|
+
// exact release publishes the route to held ingress as one owner turn.
|
|
288
|
+
this.replaceCore(previous, context, actor, bindingToken, authorityFence, sessionIdentity);
|
|
289
|
+
if (!this.abortSealCore(actor.actorId, sealId)) {
|
|
290
|
+
throw createInternalFrameworkException(
|
|
291
|
+
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
292
|
+
`Actor '${actor.actorId}' route switch lost its relocation seal.`,
|
|
293
|
+
true
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
async find(actorId: string): Promise<TActor | undefined> {
|
|
299
|
+
return await this.lane.run(() => this.findCore(actorId));
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
private findCore(actorId: string): TActor | undefined {
|
|
303
|
+
return this.routes.get(actorId)?.actor;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
async route(actorId: string): Promise<ZLinkActorSessionRoute<TContext, TActor> | undefined> {
|
|
307
|
+
return await this.lane.run(() => this.routeCore(actorId));
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
private routeCore(actorId: string): ZLinkActorSessionRoute<TContext, TActor> | undefined {
|
|
311
|
+
return this.routes.get(actorId);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
async capturePendingReplyClaim(
|
|
315
|
+
actorId: string,
|
|
316
|
+
actor: ZLinkActorSessionBindingActor,
|
|
317
|
+
bindingToken: string
|
|
318
|
+
): Promise<{ readonly context: TContext } | undefined> {
|
|
319
|
+
return await this.lane.run(() => this.capturePendingReplyClaimCore(actorId, actor, bindingToken));
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
private capturePendingReplyClaimCore(
|
|
323
|
+
actorId: string,
|
|
324
|
+
actor: ZLinkActorSessionBindingActor,
|
|
325
|
+
bindingToken: string
|
|
326
|
+
): { readonly context: TContext } | undefined {
|
|
327
|
+
const route = this.routes.get(actorId);
|
|
328
|
+
if (route === undefined || route.actor !== actor || route.bindingToken !== bindingToken) {
|
|
329
|
+
return undefined;
|
|
330
|
+
}
|
|
331
|
+
return Object.freeze({ context: route.context });
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
async unbind(actorId: string, context: TContext, bindingToken: string): Promise<void> {
|
|
335
|
+
await this.lane.run(() => this.unbindCore(actorId, context, bindingToken));
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
private unbindCore(actorId: string, context: TContext, bindingToken: string): void {
|
|
339
|
+
const route = this.routes.get(actorId);
|
|
340
|
+
if (route === undefined || route.context !== context || route.bindingToken !== bindingToken) {
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
this.routes.delete(actorId);
|
|
344
|
+
context.unbindLocal(actorId, bindingToken);
|
|
345
|
+
this.rejectSealWaiters(
|
|
346
|
+
actorId,
|
|
347
|
+
new Error(`Actor '${actorId}' session binding was removed while ingress was held.`)
|
|
348
|
+
);
|
|
349
|
+
this.rejectActiveFrameWaiters(
|
|
350
|
+
actorId,
|
|
351
|
+
new Error(`Actor '${actorId}' session binding was removed while accepted frames were active.`)
|
|
352
|
+
);
|
|
353
|
+
this.clearRouteRelocation(
|
|
354
|
+
actorId,
|
|
355
|
+
route,
|
|
356
|
+
new Error(`Actor '${actorId}' session binding was removed.`)
|
|
357
|
+
);
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
async unbindActor(actorId: string): Promise<void> {
|
|
361
|
+
await this.lane.run(() => this.unbindActorCore(actorId));
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
private unbindActorCore(actorId: string): void {
|
|
365
|
+
const route = this.routes.get(actorId);
|
|
366
|
+
if (route === undefined) {
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
this.unbindCore(actorId, route.context, route.bindingToken);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
async cleanup(context: TContext): Promise<void> {
|
|
373
|
+
await this.lane.run(() => this.cleanupCore(context));
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
private cleanupCore(context: TContext): void {
|
|
377
|
+
for (const route of [...this.routes.values()]) {
|
|
378
|
+
if (route.context === context) {
|
|
379
|
+
this.unbindCore(route.actor.actorId, context, route.bindingToken);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
async requireRoute(actorId: string): Promise<ZLinkActorSessionRoute<TContext, TActor>> {
|
|
385
|
+
return await this.lane.run(() => this.requireRouteCore(actorId));
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
private requireRouteCore(actorId: string): ZLinkActorSessionRoute<TContext, TActor> {
|
|
389
|
+
const route = this.routes.get(actorId);
|
|
390
|
+
if (route !== undefined) {
|
|
391
|
+
return route;
|
|
392
|
+
}
|
|
393
|
+
throw createInternalFrameworkException(
|
|
394
|
+
ZLinkFrameworkInternalErrorKind.ActorSessionNotBound,
|
|
395
|
+
`No current session binding exists for actor '${actorId}'.`,
|
|
396
|
+
true
|
|
397
|
+
);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
async requireCurrentToken(actorId: string, bindingToken: string): Promise<void> {
|
|
401
|
+
await this.lane.run(() => this.requireCurrentTokenCore(actorId, bindingToken));
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
private requireCurrentTokenCore(actorId: string, bindingToken: string): void {
|
|
405
|
+
const route = this.requireRouteCore(actorId);
|
|
406
|
+
if (route.bindingToken === bindingToken) {
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
throw createInternalFrameworkException(
|
|
410
|
+
ZLinkFrameworkInternalErrorKind.ActorSessionNotBound,
|
|
411
|
+
`Actor '${actorId}' session binding is stale.`,
|
|
412
|
+
true
|
|
413
|
+
);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
async accept(actorId: string, bindingToken: string): Promise<void> {
|
|
417
|
+
await this.lane.run(() => this.acceptCore(actorId, bindingToken));
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
private acceptCore(actorId: string, bindingToken: string): void {
|
|
421
|
+
const route = this.requireRouteCore(actorId);
|
|
422
|
+
if (route.bindingToken !== bindingToken) {
|
|
423
|
+
throw createInternalFrameworkException(
|
|
424
|
+
ZLinkFrameworkInternalErrorKind.ActorSessionNotBound,
|
|
425
|
+
`Actor '${actorId}' session binding is stale.`,
|
|
426
|
+
true
|
|
427
|
+
);
|
|
428
|
+
}
|
|
429
|
+
if (route.sealId !== undefined) {
|
|
430
|
+
throw createInternalFrameworkException(
|
|
431
|
+
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
432
|
+
`Actor '${actorId}' session ingress is sealed for relocation.`,
|
|
433
|
+
true
|
|
434
|
+
);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* Holds Session ingress accepted after a relocation seal until the target
|
|
440
|
+
* route is published and the seal is released. The caller keeps the
|
|
441
|
+
* request payload and reply context open while this wait is in progress.
|
|
442
|
+
*/
|
|
443
|
+
async acceptWhenReady(
|
|
444
|
+
actorId: string,
|
|
445
|
+
bindingToken: string,
|
|
446
|
+
signal?: AbortSignal
|
|
447
|
+
): Promise<void> {
|
|
448
|
+
for (;;) {
|
|
449
|
+
throwIfAborted(signal);
|
|
450
|
+
const accepted = await this.lane.run(() => this.acceptWhenReadyCore(actorId, bindingToken));
|
|
451
|
+
if (accepted) return;
|
|
452
|
+
await this.waitForSealRelease(actorId, bindingToken, signal);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
private acceptWhenReadyCore(actorId: string, bindingToken: string): boolean {
|
|
457
|
+
const route = this.requireRouteCore(actorId);
|
|
458
|
+
this.requireCurrentTokenCore(actorId, bindingToken);
|
|
459
|
+
if (route.sealId === undefined) {
|
|
460
|
+
try {
|
|
461
|
+
this.acceptCore(actorId, bindingToken);
|
|
462
|
+
return true;
|
|
463
|
+
} catch (error) {
|
|
464
|
+
// A new seal can race the check above. Re-enter the wait only for
|
|
465
|
+
// that relocation fence; unrelated binding failures stay visible.
|
|
466
|
+
if (this.routes.get(actorId)?.sealId === undefined) throw error;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
return false;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
async beginAcceptedFrameWhenReady(
|
|
473
|
+
actorId: string,
|
|
474
|
+
bindingToken: string,
|
|
475
|
+
signal?: AbortSignal
|
|
476
|
+
): Promise<ZLinkActorSessionFrameAdmission> {
|
|
477
|
+
for (;;) {
|
|
478
|
+
throwIfAborted(signal);
|
|
479
|
+
const admission = await this.lane.run(() => this.beginAcceptedFrameCore(actorId, bindingToken));
|
|
480
|
+
if (admission !== undefined) return admission;
|
|
481
|
+
await this.waitForSealRelease(actorId, bindingToken, signal);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
private beginAcceptedFrameCore(
|
|
486
|
+
actorId: string,
|
|
487
|
+
bindingToken: string
|
|
488
|
+
): ZLinkActorSessionFrameAdmission | undefined {
|
|
489
|
+
const route = this.requireRouteCore(actorId);
|
|
490
|
+
this.requireCurrentTokenCore(actorId, bindingToken);
|
|
491
|
+
if (route.sealId !== undefined) return undefined;
|
|
492
|
+
route.activeFrames.count++;
|
|
493
|
+
let completed = false;
|
|
494
|
+
const completeCore = () => {
|
|
495
|
+
if (completed) return;
|
|
496
|
+
completed = true;
|
|
497
|
+
route.activeFrames.count--;
|
|
498
|
+
if (
|
|
499
|
+
route.activeFrames.count === 0
|
|
500
|
+
&& this.routes.get(actorId)?.activeFrames === route.activeFrames
|
|
501
|
+
) {
|
|
502
|
+
this.resolveActiveFrameWaiters(actorId);
|
|
503
|
+
}
|
|
504
|
+
};
|
|
505
|
+
return {
|
|
506
|
+
complete: async () => {
|
|
507
|
+
await this.lane.run(completeCore);
|
|
508
|
+
},
|
|
509
|
+
completeCore
|
|
510
|
+
};
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
async beginAcceptedRequestFrameWhenReady(
|
|
514
|
+
actorId: string,
|
|
515
|
+
bindingToken: string,
|
|
516
|
+
signal?: AbortSignal
|
|
517
|
+
): Promise<ZLinkActorSessionRequestFrameAdmission> {
|
|
518
|
+
const frame = await this.beginAcceptedFrameWhenReady(actorId, bindingToken, signal);
|
|
519
|
+
return await this.lane.run(() => this.beginAcceptedRequestFrameCore(actorId, bindingToken, frame));
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
private beginAcceptedRequestFrameCore(
|
|
523
|
+
actorId: string,
|
|
524
|
+
bindingToken: string,
|
|
525
|
+
frame: ZLinkActorSessionFrameAdmission
|
|
526
|
+
): ZLinkActorSessionRequestFrameAdmission {
|
|
527
|
+
const activeFrames = this.requireRouteCore(actorId).activeFrames;
|
|
528
|
+
let submissionStarted = false;
|
|
529
|
+
let capturedBySeal = false;
|
|
530
|
+
let finished = false;
|
|
531
|
+
const request = {
|
|
532
|
+
captureBySeal: () => {
|
|
533
|
+
if (finished || capturedBySeal) return;
|
|
534
|
+
capturedBySeal = true;
|
|
535
|
+
// Spec 20:389-396,408-412 — command 42 captures the Session-side
|
|
536
|
+
// frame, while the request correlation and its detached terminal
|
|
537
|
+
// remain alive. This removes the 42 -> request terminal -> 44 -> 42
|
|
538
|
+
// cycle without turning the capture into another submission.
|
|
539
|
+
frame.completeCore();
|
|
540
|
+
}
|
|
541
|
+
};
|
|
542
|
+
activeFrames.requests.add(request);
|
|
543
|
+
return {
|
|
544
|
+
beginSubmission: async (submissionSignal) => {
|
|
545
|
+
const captured = await this.lane.run(() => {
|
|
546
|
+
if (submissionStarted) return false;
|
|
547
|
+
// Claim before the asynchronous seal wait. A second continuation
|
|
548
|
+
// must not observe an unclaimed request while the first is waiting
|
|
549
|
+
// for command 44 to publish the route.
|
|
550
|
+
submissionStarted = true;
|
|
551
|
+
return capturedBySeal;
|
|
552
|
+
});
|
|
553
|
+
if (!captured) return;
|
|
554
|
+
await this.acceptWhenReady(actorId, bindingToken, submissionSignal);
|
|
555
|
+
},
|
|
556
|
+
complete: async () => {
|
|
557
|
+
await this.lane.run(() => {
|
|
558
|
+
if (finished) return;
|
|
559
|
+
finished = true;
|
|
560
|
+
activeFrames.requests.delete(request);
|
|
561
|
+
frame.completeCore();
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
async runAcceptedFrameWhenReady<TResult>(
|
|
568
|
+
actorId: string,
|
|
569
|
+
bindingToken: string,
|
|
570
|
+
operation: () => Promise<TResult>,
|
|
571
|
+
signal?: AbortSignal
|
|
572
|
+
): Promise<TResult> {
|
|
573
|
+
const admission = await this.beginAcceptedFrameWhenReady(
|
|
574
|
+
actorId,
|
|
575
|
+
bindingToken,
|
|
576
|
+
signal
|
|
577
|
+
);
|
|
578
|
+
try {
|
|
579
|
+
return await operation();
|
|
580
|
+
} finally {
|
|
581
|
+
await admission.complete();
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
async seal(actorId: string, sealId: string, expected: ZLinkActorSessionRouteFence): Promise<void> {
|
|
586
|
+
await this.lane.run(() => this.sealCore(actorId, sealId, expected));
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
private sealCore(actorId: string, sealId: string, expected: ZLinkActorSessionRouteFence): void {
|
|
590
|
+
const route = this.requireRouteCore(actorId);
|
|
591
|
+
if (route.sealId !== undefined) {
|
|
592
|
+
if (route.sealId === sealId && routeMatchesFence(route, expected)) {
|
|
593
|
+
return;
|
|
594
|
+
}
|
|
595
|
+
throw createInternalFrameworkException(
|
|
596
|
+
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
597
|
+
`Actor '${actorId}' session ingress is sealed by another relocation.`,
|
|
598
|
+
true
|
|
599
|
+
);
|
|
600
|
+
}
|
|
601
|
+
if (!routeMatchesFence(route, expected)) {
|
|
602
|
+
throw createInternalFrameworkException(
|
|
603
|
+
ZLinkFrameworkInternalErrorKind.ActorSessionNotBound,
|
|
604
|
+
`Actor '${actorId}' session route seal was fenced by its binding identity.`,
|
|
605
|
+
true
|
|
606
|
+
);
|
|
607
|
+
}
|
|
608
|
+
route.sealId = sealId;
|
|
609
|
+
// A pre-seal REQUEST is captured as part of installing command 42. Its
|
|
610
|
+
// Session frame no longer gates the seal; its single submission attempt
|
|
611
|
+
// and terminal continue under the request admission state above.
|
|
612
|
+
for (const request of route.activeFrames.requests) {
|
|
613
|
+
request.captureBySeal();
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
async sealAndWait(
|
|
618
|
+
actorId: string,
|
|
619
|
+
sealId: string,
|
|
620
|
+
expected: ZLinkActorSessionRouteFence,
|
|
621
|
+
signal?: AbortSignal
|
|
622
|
+
): Promise<void> {
|
|
623
|
+
await this.lane.run(() => this.sealCore(actorId, sealId, expected));
|
|
624
|
+
await this.waitForActiveFrames(actorId, signal);
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
async sealRelocation(
|
|
628
|
+
claim: ZLinkActorSessionRelocationClaim,
|
|
629
|
+
expected: ZLinkActorSessionRouteFence,
|
|
630
|
+
signal?: AbortSignal
|
|
631
|
+
): Promise<void> {
|
|
632
|
+
for (;;) {
|
|
633
|
+
throwIfAborted(signal);
|
|
634
|
+
const step = await this.lane.run(() => this.prepareRelocationSeal(claim, expected, signal));
|
|
635
|
+
if (step.kind === 'existing') {
|
|
636
|
+
await waitForSessionRelocation(step.wait, signal);
|
|
637
|
+
return;
|
|
638
|
+
}
|
|
639
|
+
if (step.kind === 'predecessor') {
|
|
640
|
+
await waitForSessionRelocation(step.wait, signal);
|
|
641
|
+
continue;
|
|
642
|
+
}
|
|
643
|
+
await step.wait;
|
|
644
|
+
return;
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
private prepareRelocationSeal(
|
|
649
|
+
claim: ZLinkActorSessionRelocationClaim,
|
|
650
|
+
expected: ZLinkActorSessionRouteFence,
|
|
651
|
+
signal?: AbortSignal
|
|
652
|
+
):
|
|
653
|
+
| { readonly kind: 'existing' | 'predecessor'; readonly wait: Promise<void> }
|
|
654
|
+
| { readonly kind: 'new'; readonly wait: Promise<void> } {
|
|
655
|
+
const queue = this.relocations.get(claim.actorId);
|
|
656
|
+
const existing = queue?.seals.get(claim.sealId);
|
|
657
|
+
if (existing !== undefined) {
|
|
658
|
+
assertRelocationClaim(existing, claim);
|
|
659
|
+
return { kind: 'existing', wait: existing.ready };
|
|
660
|
+
}
|
|
661
|
+
const predecessor = queue?.activeSealId === undefined
|
|
662
|
+
? undefined
|
|
663
|
+
: queue.seals.get(queue.activeSealId);
|
|
664
|
+
if (predecessor !== undefined && predecessor.phase !== 'terminal') {
|
|
665
|
+
if (predecessor.sessionIdentity === undefined || claim.sessionIdentity === undefined) {
|
|
666
|
+
throw createInternalFrameworkException(
|
|
667
|
+
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
668
|
+
`Actor '${claim.actorId}' session ingress is sealed by another relocation.`,
|
|
669
|
+
true
|
|
670
|
+
);
|
|
671
|
+
}
|
|
672
|
+
assertSuccessorSessionIdentity(predecessor, claim);
|
|
673
|
+
return { kind: 'predecessor', wait: predecessor.terminal };
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
this.sealCore(claim.actorId, claim.sealId, expected);
|
|
677
|
+
let resolveTerminal!: () => void;
|
|
678
|
+
const terminal = new Promise<void>((resolve) => { resolveTerminal = resolve; });
|
|
679
|
+
const ready = this.waitForActiveFramesCore(claim.actorId, signal);
|
|
680
|
+
const actorQueue: ZLinkActorSessionRelocationQueue = queue ?? {
|
|
681
|
+
actorId: claim.actorId,
|
|
682
|
+
seals: new Map(),
|
|
683
|
+
outbound: [],
|
|
684
|
+
nextArrivalOrder: 1n,
|
|
685
|
+
outboundCount: 0
|
|
686
|
+
};
|
|
687
|
+
const state: ZLinkActorSessionRelocationState = {
|
|
688
|
+
...claim,
|
|
689
|
+
phase: 'sealed',
|
|
690
|
+
ready,
|
|
691
|
+
terminal,
|
|
692
|
+
resolveTerminal
|
|
693
|
+
};
|
|
694
|
+
actorQueue.seals.set(claim.sealId, state);
|
|
695
|
+
actorQueue.activeSealId = claim.sealId;
|
|
696
|
+
this.relocations.set(claim.actorId, actorQueue);
|
|
697
|
+
return { kind: 'new', wait: ready };
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
async relocationSnapshot(
|
|
701
|
+
actorId: string,
|
|
702
|
+
sealId: string
|
|
703
|
+
): Promise<ZLinkActorSessionRelocationSnapshot | undefined> {
|
|
704
|
+
return await this.lane.run(() => this.relocationSnapshotCore(actorId, sealId));
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
private relocationSnapshotCore(
|
|
708
|
+
actorId: string,
|
|
709
|
+
sealId: string
|
|
710
|
+
): ZLinkActorSessionRelocationSnapshot | undefined {
|
|
711
|
+
return this.relocations.get(actorId)?.seals.get(sealId);
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
async retainRelocationOutbound(
|
|
715
|
+
actorId: string,
|
|
716
|
+
operation: ZLinkActorSessionRetainedOutbound,
|
|
717
|
+
sealId?: string
|
|
718
|
+
): Promise<ServiceSessionBindingAdmissionResult> {
|
|
719
|
+
return await this.lane.run(() => this.retainRelocationOutboundCorePublic(actorId, operation, sealId));
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
private retainRelocationOutboundCorePublic(
|
|
723
|
+
actorId: string,
|
|
724
|
+
operation: ZLinkActorSessionRetainedOutbound,
|
|
725
|
+
sealId?: string
|
|
726
|
+
): ServiceSessionBindingAdmissionResult {
|
|
727
|
+
if (sealId !== undefined) {
|
|
728
|
+
const queue = this.relocations.get(actorId);
|
|
729
|
+
const state = queue?.seals.get(sealId);
|
|
730
|
+
if (
|
|
731
|
+
queue === undefined
|
|
732
|
+
|| state === undefined
|
|
733
|
+
|| (queue.activeSealId !== sealId
|
|
734
|
+
&& !(queue.activeSealId === undefined && state.phase === 'terminal'))
|
|
735
|
+
) {
|
|
736
|
+
failRetainedOutbound(
|
|
737
|
+
operation,
|
|
738
|
+
new Error(`Actor '${actorId}' Session outbound did not match its exact relocation seal.`)
|
|
739
|
+
);
|
|
740
|
+
return 'rejected';
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
return this.retainRelocationOutboundCore(actorId, operation, 'legacy');
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
async admitRelocationOutbound(
|
|
747
|
+
claim: ServiceSessionBindingAdmissionClaim,
|
|
748
|
+
operation: ZLinkActorSessionRetainedOutbound
|
|
749
|
+
): Promise<ServiceSessionBindingAdmissionResult> {
|
|
750
|
+
return await this.lane.run(() => this.admitRelocationOutboundCore(claim, operation));
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
private admitRelocationOutboundCore(
|
|
754
|
+
claim: ServiceSessionBindingAdmissionClaim,
|
|
755
|
+
operation: ZLinkActorSessionRetainedOutbound
|
|
756
|
+
): ServiceSessionBindingAdmissionResult {
|
|
757
|
+
const queue = this.relocations.get(claim.actorId);
|
|
758
|
+
const state = queue?.activeSealId === undefined
|
|
759
|
+
? undefined
|
|
760
|
+
: queue.seals.get(queue.activeSealId);
|
|
761
|
+
const error = this.outboundAdmissionError(claim);
|
|
762
|
+
if (error !== undefined) {
|
|
763
|
+
failRetainedOutbound(operation, error);
|
|
764
|
+
return 'rejected';
|
|
765
|
+
}
|
|
766
|
+
if (queue === undefined || state === undefined) {
|
|
767
|
+
if (!this.matchesCurrentProducerNode(claim)) {
|
|
768
|
+
failRetainedOutbound(
|
|
769
|
+
operation,
|
|
770
|
+
new Error(`Actor '${claim.actorId}' Session outbound admission was fenced by its current binding.`)
|
|
771
|
+
);
|
|
772
|
+
return 'rejected';
|
|
773
|
+
}
|
|
774
|
+
if (queue === undefined) return 'passThrough';
|
|
775
|
+
return this.retainRelocationOutboundCore(
|
|
776
|
+
claim.actorId,
|
|
777
|
+
operation,
|
|
778
|
+
'source',
|
|
779
|
+
claim
|
|
780
|
+
);
|
|
781
|
+
}
|
|
782
|
+
if (state.phase === 'sealed' || state.phase === 'applying') {
|
|
783
|
+
const matchesSource = matchesRelocationSourceProof(state, claim);
|
|
784
|
+
const matchesCurrent = this.matchesCurrentProducerNode(claim);
|
|
785
|
+
const authorization = matchesSource || matchesCurrent
|
|
786
|
+
? 'source'
|
|
787
|
+
: 'pendingTarget';
|
|
788
|
+
return this.retainRelocationOutboundCore(
|
|
789
|
+
claim.actorId,
|
|
790
|
+
operation,
|
|
791
|
+
authorization,
|
|
792
|
+
claim
|
|
793
|
+
);
|
|
794
|
+
}
|
|
795
|
+
const acceptedProof = state.acceptedProducerProof;
|
|
796
|
+
if (
|
|
797
|
+
acceptedProof === undefined
|
|
798
|
+
|| !matchesAcceptedProducerProof(acceptedProof, claim)
|
|
799
|
+
) {
|
|
800
|
+
failRetainedOutbound(
|
|
801
|
+
operation,
|
|
802
|
+
new Error(`Actor '${claim.actorId}' Session outbound admission did not match its accepted producer proof.`)
|
|
803
|
+
);
|
|
804
|
+
return 'rejected';
|
|
805
|
+
}
|
|
806
|
+
return this.retainRelocationOutboundCore(
|
|
807
|
+
claim.actorId,
|
|
808
|
+
operation,
|
|
809
|
+
'source',
|
|
810
|
+
claim
|
|
811
|
+
);
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
private retainRelocationOutboundCore(
|
|
815
|
+
actorId: string,
|
|
816
|
+
operation: ZLinkActorSessionRetainedOutbound,
|
|
817
|
+
authorization: ZLinkActorSessionOutboundEntry['authorization'],
|
|
818
|
+
claim?: ServiceSessionBindingAdmissionClaim
|
|
819
|
+
): ServiceSessionBindingAdmissionResult {
|
|
820
|
+
const queue = this.relocations.get(actorId);
|
|
821
|
+
const state = queue?.activeSealId === undefined
|
|
822
|
+
? undefined
|
|
823
|
+
: queue.seals.get(queue.activeSealId);
|
|
824
|
+
if (queue === undefined) return 'passThrough';
|
|
825
|
+
if (state === undefined || state.phase === 'applied' || state.phase === 'terminal') {
|
|
826
|
+
if (queue.drainPromise === undefined && queue.outbound.length === 0) return 'passThrough';
|
|
827
|
+
if (!this.reserveOutbound(queue, operation)) return 'rejected';
|
|
828
|
+
queue.outbound.push({
|
|
829
|
+
operation,
|
|
830
|
+
authorization,
|
|
831
|
+
arrivalOrder: queue.nextArrivalOrder++,
|
|
832
|
+
...(claim === undefined ? {} : { claim }),
|
|
833
|
+
released: true,
|
|
834
|
+
settled: false
|
|
835
|
+
});
|
|
836
|
+
this.startOutboundDrain(queue);
|
|
837
|
+
return 'retained';
|
|
838
|
+
}
|
|
839
|
+
if (!this.reserveOutbound(queue, operation)) return 'rejected';
|
|
840
|
+
queue.outbound.push({
|
|
841
|
+
sealId: state.sealId,
|
|
842
|
+
operation,
|
|
843
|
+
authorization,
|
|
844
|
+
arrivalOrder: queue.nextArrivalOrder++,
|
|
845
|
+
...(claim === undefined ? {} : { claim }),
|
|
846
|
+
released: false,
|
|
847
|
+
settled: false
|
|
848
|
+
});
|
|
849
|
+
return 'retained';
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
async discardRelocationOutbound(actorId: string, sealId: string, error: unknown): Promise<void> {
|
|
853
|
+
await this.lane.run(() => this.discardRelocationOutboundCore(actorId, sealId, error));
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
private discardRelocationOutboundCore(actorId: string, sealId: string, error: unknown): void {
|
|
857
|
+
const queue = this.relocations.get(actorId);
|
|
858
|
+
if (queue === undefined) return;
|
|
859
|
+
for (let index = queue.outbound.length - 1; index >= 0; index--) {
|
|
860
|
+
const entry = queue.outbound[index]!;
|
|
861
|
+
if (entry.sealId !== sealId) continue;
|
|
862
|
+
queue.outbound.splice(index, 1);
|
|
863
|
+
this.failOutbound(queue, entry, error);
|
|
864
|
+
}
|
|
865
|
+
this.deleteEmptyRelocationQueue(queue);
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
async applyRelocation(
|
|
869
|
+
actorId: string,
|
|
870
|
+
sealId: string,
|
|
871
|
+
applyFingerprint: string,
|
|
872
|
+
action: 'commit' | 'abort',
|
|
873
|
+
commitOwnerTransition: () => Promise<void>,
|
|
874
|
+
acceptedProducerProof?: ZLinkActorSessionAcceptedProducerProof
|
|
875
|
+
): Promise<void> {
|
|
876
|
+
const prepared = await this.lane.run(() => this.prepareRelocationApply(
|
|
877
|
+
actorId,
|
|
878
|
+
sealId,
|
|
879
|
+
applyFingerprint,
|
|
880
|
+
action,
|
|
881
|
+
acceptedProducerProof
|
|
882
|
+
));
|
|
883
|
+
if (prepared.applyPromise !== undefined) {
|
|
884
|
+
await prepared.applyPromise;
|
|
885
|
+
return;
|
|
886
|
+
}
|
|
887
|
+
startOutsideStateLane(() => {
|
|
888
|
+
void (async () => {
|
|
889
|
+
try {
|
|
890
|
+
await commitOwnerTransition();
|
|
891
|
+
await this.lane.run(() => this.completeRelocationApply(prepared));
|
|
892
|
+
prepared.resolve!();
|
|
893
|
+
} catch (error) {
|
|
894
|
+
await this.lane.run(() => this.failRelocationApply(prepared));
|
|
895
|
+
prepared.reject!(error);
|
|
896
|
+
}
|
|
897
|
+
})();
|
|
898
|
+
});
|
|
899
|
+
await prepared.promise!;
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
private prepareRelocationApply(
|
|
903
|
+
actorId: string,
|
|
904
|
+
sealId: string,
|
|
905
|
+
applyFingerprint: string,
|
|
906
|
+
action: 'commit' | 'abort',
|
|
907
|
+
acceptedProducerProof?: ZLinkActorSessionAcceptedProducerProof
|
|
908
|
+
): {
|
|
909
|
+
readonly queue: ZLinkActorSessionRelocationQueue;
|
|
910
|
+
readonly state: ZLinkActorSessionRelocationState;
|
|
911
|
+
readonly applyPromise?: Promise<void>;
|
|
912
|
+
readonly action?: 'commit' | 'abort';
|
|
913
|
+
readonly acceptedProducerProof?: ZLinkActorSessionAcceptedProducerProof;
|
|
914
|
+
readonly promise?: Promise<void>;
|
|
915
|
+
readonly resolve?: () => void;
|
|
916
|
+
readonly reject?: (error: unknown) => void;
|
|
917
|
+
readonly actorId?: string;
|
|
918
|
+
readonly sealId?: string;
|
|
919
|
+
} {
|
|
920
|
+
const queue = this.relocations.get(actorId);
|
|
921
|
+
const state = queue?.seals.get(sealId);
|
|
922
|
+
if (queue === undefined || state === undefined) {
|
|
923
|
+
throw createInternalFrameworkException(
|
|
924
|
+
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
925
|
+
`Actor '${actorId}' route apply did not match its exact Session seal.`,
|
|
926
|
+
true
|
|
927
|
+
);
|
|
928
|
+
}
|
|
929
|
+
if (state.phase !== 'sealed') {
|
|
930
|
+
if (state.applyFingerprint !== applyFingerprint || state.applyPromise === undefined) {
|
|
931
|
+
throw createInternalFrameworkException(
|
|
932
|
+
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
933
|
+
`Actor '${actorId}' Session seal received a conflicting route apply.`,
|
|
934
|
+
true
|
|
935
|
+
);
|
|
936
|
+
}
|
|
937
|
+
return { queue, state, applyPromise: state.applyPromise };
|
|
938
|
+
}
|
|
939
|
+
if (
|
|
940
|
+
action === 'commit'
|
|
941
|
+
&& acceptedProducerProof !== undefined
|
|
942
|
+
&& !validAcceptedTargetProof(state, acceptedProducerProof)
|
|
943
|
+
) {
|
|
944
|
+
throw createInternalFrameworkException(
|
|
945
|
+
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
946
|
+
`Actor '${actorId}' command 44 target producer proof did not match its Session seal.`,
|
|
947
|
+
true
|
|
948
|
+
);
|
|
949
|
+
}
|
|
950
|
+
if (action === 'abort' && acceptedProducerProof !== undefined) {
|
|
951
|
+
throw createInternalFrameworkException(
|
|
952
|
+
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
953
|
+
`Actor '${actorId}' abort route supplied a target producer proof.`,
|
|
954
|
+
true
|
|
955
|
+
);
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
state.phase = 'applying';
|
|
959
|
+
state.applyFingerprint = applyFingerprint;
|
|
960
|
+
let resolve!: () => void;
|
|
961
|
+
let reject!: (error: unknown) => void;
|
|
962
|
+
const promise = new Promise<void>((complete, fail) => {
|
|
963
|
+
resolve = complete;
|
|
964
|
+
reject = fail;
|
|
965
|
+
});
|
|
966
|
+
state.applyPromise = promise;
|
|
967
|
+
return {
|
|
968
|
+
queue,
|
|
969
|
+
state,
|
|
970
|
+
action,
|
|
971
|
+
acceptedProducerProof,
|
|
972
|
+
promise,
|
|
973
|
+
resolve,
|
|
974
|
+
reject,
|
|
975
|
+
actorId,
|
|
976
|
+
sealId
|
|
977
|
+
};
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
private completeRelocationApply(prepared: {
|
|
981
|
+
readonly queue: ZLinkActorSessionRelocationQueue;
|
|
982
|
+
readonly state: ZLinkActorSessionRelocationState;
|
|
983
|
+
readonly action?: 'commit' | 'abort';
|
|
984
|
+
readonly acceptedProducerProof?: ZLinkActorSessionAcceptedProducerProof;
|
|
985
|
+
readonly actorId?: string;
|
|
986
|
+
readonly sealId?: string;
|
|
987
|
+
}): void {
|
|
988
|
+
const { queue, state, action, acceptedProducerProof, actorId, sealId } = prepared;
|
|
989
|
+
const proof = action === 'commit'
|
|
990
|
+
? acceptedProducerProof ?? this.currentProducerProof(actorId!)
|
|
991
|
+
: relocationSourceProof(state);
|
|
992
|
+
state.acceptedProducerProof = proof;
|
|
993
|
+
for (let index = queue.outbound.length - 1; index >= 0; index--) {
|
|
994
|
+
const entry = queue.outbound[index]!;
|
|
995
|
+
if (entry.sealId !== sealId) continue;
|
|
996
|
+
if (entry.authorization !== 'pendingTarget') {
|
|
997
|
+
entry.released = true;
|
|
998
|
+
continue;
|
|
999
|
+
}
|
|
1000
|
+
if (
|
|
1001
|
+
action === 'commit'
|
|
1002
|
+
&& proof !== undefined
|
|
1003
|
+
&& entry.claim !== undefined
|
|
1004
|
+
&& matchesAcceptedProducerProof(proof, entry.claim)
|
|
1005
|
+
) {
|
|
1006
|
+
entry.released = true;
|
|
1007
|
+
continue;
|
|
1008
|
+
}
|
|
1009
|
+
queue.outbound.splice(index, 1);
|
|
1010
|
+
this.failOutbound(
|
|
1011
|
+
queue,
|
|
1012
|
+
entry,
|
|
1013
|
+
new Error(`Actor '${actorId}' pending Session producer did not match command 44 proof.`)
|
|
1014
|
+
);
|
|
1015
|
+
}
|
|
1016
|
+
this.startOutboundDrain(queue);
|
|
1017
|
+
state.phase = 'applied';
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
private failRelocationApply(prepared: {
|
|
1021
|
+
readonly state: ZLinkActorSessionRelocationState;
|
|
1022
|
+
}): void {
|
|
1023
|
+
prepared.state.phase = 'sealed';
|
|
1024
|
+
prepared.state.applyFingerprint = undefined;
|
|
1025
|
+
prepared.state.applyPromise = undefined;
|
|
1026
|
+
prepared.state.acceptedProducerProof = undefined;
|
|
1027
|
+
}
|
|
1028
|
+
|
|
1029
|
+
private currentProducerProof(
|
|
1030
|
+
actorId: string
|
|
1031
|
+
): ZLinkActorSessionAcceptedProducerProof | undefined {
|
|
1032
|
+
const route = this.routes.get(actorId);
|
|
1033
|
+
const actorRef = (route?.actor as TActor & { readonly ref?: {
|
|
1034
|
+
readonly actorId?: unknown;
|
|
1035
|
+
readonly objectGeneration?: unknown;
|
|
1036
|
+
readonly generation?: unknown;
|
|
1037
|
+
readonly nodeRid?: unknown;
|
|
1038
|
+
readonly ownerNodeGeneration?: unknown;
|
|
1039
|
+
readonly bindingGeneration?: unknown;
|
|
1040
|
+
} }).ref;
|
|
1041
|
+
const sessionIdentity = route?.sessionIdentity;
|
|
1042
|
+
if (
|
|
1043
|
+
route === undefined
|
|
1044
|
+
|| actorRef === undefined
|
|
1045
|
+
|| sessionIdentity === undefined
|
|
1046
|
+
|| actorRef.ownerNodeGeneration === undefined
|
|
1047
|
+
) return undefined;
|
|
1048
|
+
return {
|
|
1049
|
+
actorId,
|
|
1050
|
+
objectGeneration: BigInt(
|
|
1051
|
+
actorRef.objectGeneration as bigint | number | string | boolean | undefined
|
|
1052
|
+
?? actorRef.generation as bigint | number | string | boolean | undefined
|
|
1053
|
+
?? -1
|
|
1054
|
+
),
|
|
1055
|
+
actorNodeRid: String(actorRef.nodeRid ?? ''),
|
|
1056
|
+
actorNodeGeneration: BigInt(
|
|
1057
|
+
actorRef.ownerNodeGeneration as bigint | number | string | boolean
|
|
1058
|
+
),
|
|
1059
|
+
sessionIdentity: String(sessionIdentity),
|
|
1060
|
+
bindingGeneration: BigInt(
|
|
1061
|
+
actorRef.bindingGeneration as bigint | number | string | boolean | undefined ?? -1
|
|
1062
|
+
)
|
|
1063
|
+
};
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
async observeRelocationTerminal(
|
|
1067
|
+
actorId: string,
|
|
1068
|
+
sealId: string,
|
|
1069
|
+
applyFingerprint: string
|
|
1070
|
+
): Promise<void> {
|
|
1071
|
+
await this.lane.run(() => this.observeRelocationTerminalCore(actorId, sealId, applyFingerprint));
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
private observeRelocationTerminalCore(
|
|
1075
|
+
actorId: string,
|
|
1076
|
+
sealId: string,
|
|
1077
|
+
applyFingerprint: string
|
|
1078
|
+
): void {
|
|
1079
|
+
const queue = this.relocations.get(actorId);
|
|
1080
|
+
const state = queue?.seals.get(sealId);
|
|
1081
|
+
if (
|
|
1082
|
+
queue === undefined
|
|
1083
|
+
|| state === undefined
|
|
1084
|
+
|| state.applyFingerprint !== applyFingerprint
|
|
1085
|
+
|| (state.phase !== 'applied' && state.phase !== 'terminal')
|
|
1086
|
+
) {
|
|
1087
|
+
throw createInternalFrameworkException(
|
|
1088
|
+
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
1089
|
+
`Actor '${actorId}' Session relocation terminal did not match its exact route apply.`,
|
|
1090
|
+
true
|
|
1091
|
+
);
|
|
1092
|
+
}
|
|
1093
|
+
if (state.phase === 'terminal') {
|
|
1094
|
+
this.rememberTerminalRelocation(state);
|
|
1095
|
+
return;
|
|
1096
|
+
}
|
|
1097
|
+
state.phase = 'terminal';
|
|
1098
|
+
if (queue.activeSealId === sealId) queue.activeSealId = undefined;
|
|
1099
|
+
state.resolveTerminal();
|
|
1100
|
+
this.rememberTerminalRelocation(state);
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
/**
|
|
1104
|
+
* Actor-wide relocation teardown: every seal (active and terminal-retained)
|
|
1105
|
+
* and every held outbound entry for `actorId` is discarded unconditionally.
|
|
1106
|
+
* Reserved for paths where the Actor itself is gone or being torn down
|
|
1107
|
+
* (destroy, ownership clear, relocation-seal expiry/failure) — never for a
|
|
1108
|
+
* single physical route's disconnect, which must not disturb a relocation
|
|
1109
|
+
* seal it does not own (see `clearRouteRelocation`).
|
|
1110
|
+
*/
|
|
1111
|
+
async clearRelocation(actorId: string, error: unknown): Promise<void> {
|
|
1112
|
+
await this.lane.run(() => this.clearRelocationCore(actorId, error));
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
private clearRelocationCore(actorId: string, error: unknown): void {
|
|
1116
|
+
const queue = this.relocations.get(actorId);
|
|
1117
|
+
if (queue === undefined) return;
|
|
1118
|
+
this.relocations.delete(actorId);
|
|
1119
|
+
for (const entry of queue.outbound.splice(0)) this.failOutbound(queue, entry, error);
|
|
1120
|
+
for (const state of queue.seals.values()) {
|
|
1121
|
+
this.terminalRelocations.delete(state);
|
|
1122
|
+
if (state.phase !== 'terminal') state.resolveTerminal();
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1126
|
+
/**
|
|
1127
|
+
* Spec 48 §137: a relocation seal's lifecycle is independent of any single
|
|
1128
|
+
* physical route's binding. Unbinding one physical route (a disconnect)
|
|
1129
|
+
* must retire only the still-open (nonterminal) relocation seal that this
|
|
1130
|
+
* exact route's Session owns, and the outbound held against that seal — it
|
|
1131
|
+
* must never reach into a seal that has already reached 'terminal' (its
|
|
1132
|
+
* bounded retention exists precisely so a late same-seal relay can still
|
|
1133
|
+
* pass on a successor route) nor into a different Session's active seal
|
|
1134
|
+
* (a concurrent successor that already re-sealed before this stale route
|
|
1135
|
+
* noticed the disconnect).
|
|
1136
|
+
*/
|
|
1137
|
+
private clearRouteRelocation(
|
|
1138
|
+
actorId: string,
|
|
1139
|
+
route: ZLinkActorSessionRoute<TContext, TActor>,
|
|
1140
|
+
error: unknown
|
|
1141
|
+
): void {
|
|
1142
|
+
const queue = this.relocations.get(actorId);
|
|
1143
|
+
if (queue === undefined) return;
|
|
1144
|
+
const activeSealId = queue.activeSealId;
|
|
1145
|
+
const activeState = activeSealId === undefined ? undefined : queue.seals.get(activeSealId);
|
|
1146
|
+
const ownsActiveSeal = activeState !== undefined
|
|
1147
|
+
&& activeState.phase !== 'terminal'
|
|
1148
|
+
&& activeState.sessionIdentity === route.sessionIdentity;
|
|
1149
|
+
if (!ownsActiveSeal) {
|
|
1150
|
+
// Nothing this exact route still holds open — leave terminal
|
|
1151
|
+
// retention and any other Session's active seal untouched.
|
|
1152
|
+
this.deleteEmptyRelocationQueue(queue);
|
|
1153
|
+
return;
|
|
1154
|
+
}
|
|
1155
|
+
for (let index = queue.outbound.length - 1; index >= 0; index--) {
|
|
1156
|
+
const entry = queue.outbound[index]!;
|
|
1157
|
+
if (entry.sealId !== activeSealId) continue;
|
|
1158
|
+
queue.outbound.splice(index, 1);
|
|
1159
|
+
this.failOutbound(queue, entry, error);
|
|
1160
|
+
}
|
|
1161
|
+
queue.activeSealId = undefined;
|
|
1162
|
+
queue.seals.delete(activeSealId!);
|
|
1163
|
+
this.terminalRelocations.delete(activeState);
|
|
1164
|
+
activeState.resolveTerminal();
|
|
1165
|
+
this.deleteEmptyRelocationQueue(queue);
|
|
1166
|
+
}
|
|
1167
|
+
|
|
1168
|
+
async abortSeal(actorId: string, sealId: string): Promise<boolean> {
|
|
1169
|
+
return await this.lane.run(() => this.abortSealCore(actorId, sealId));
|
|
1170
|
+
}
|
|
1171
|
+
|
|
1172
|
+
private abortSealCore(actorId: string, sealId: string): boolean {
|
|
1173
|
+
const route = this.routes.get(actorId);
|
|
1174
|
+
if (route === undefined || route.sealId !== sealId) return false;
|
|
1175
|
+
route.sealId = undefined;
|
|
1176
|
+
this.resolveSealWaiters(actorId, sealId);
|
|
1177
|
+
return true;
|
|
1178
|
+
}
|
|
1179
|
+
|
|
1180
|
+
async updateAuthorityFence(
|
|
1181
|
+
actorId: string,
|
|
1182
|
+
authorityFence: ZLinkActorSessionAuthorityFence
|
|
1183
|
+
): Promise<void> {
|
|
1184
|
+
await this.lane.run(() => this.updateAuthorityFenceCore(actorId, authorityFence));
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
private updateAuthorityFenceCore(actorId: string, authorityFence: ZLinkActorSessionAuthorityFence): void {
|
|
1188
|
+
const route = this.requireRouteCore(actorId);
|
|
1189
|
+
route.authorityFence = authorityFence;
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
async validateSeal(actorId: string, sealId: string): Promise<boolean> {
|
|
1193
|
+
return await this.lane.run(() => this.validateSealCore(actorId, sealId));
|
|
1194
|
+
}
|
|
1195
|
+
|
|
1196
|
+
private validateSealCore(actorId: string, sealId: string): boolean {
|
|
1197
|
+
const route = this.routes.get(actorId);
|
|
1198
|
+
return route !== undefined
|
|
1199
|
+
&& route.sealId === sealId;
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
/** True while a relocation seal currently holds this actor's ingress. */
|
|
1203
|
+
async isSealed(actorId: string): Promise<boolean> {
|
|
1204
|
+
return await this.lane.run(() => this.isSealedCore(actorId));
|
|
1205
|
+
}
|
|
1206
|
+
|
|
1207
|
+
private isSealedCore(actorId: string): boolean {
|
|
1208
|
+
return this.routes.get(actorId)?.sealId !== undefined;
|
|
1209
|
+
}
|
|
1210
|
+
|
|
1211
|
+
private async waitForSealRelease(
|
|
1212
|
+
actorId: string,
|
|
1213
|
+
bindingToken: string,
|
|
1214
|
+
signal?: AbortSignal
|
|
1215
|
+
): Promise<void> {
|
|
1216
|
+
const prepared = await this.lane.run(() => ({
|
|
1217
|
+
wait: this.waitForSealReleaseCore(actorId, bindingToken, signal)
|
|
1218
|
+
}));
|
|
1219
|
+
await prepared.wait;
|
|
1220
|
+
}
|
|
1221
|
+
|
|
1222
|
+
private waitForSealReleaseCore(
|
|
1223
|
+
actorId: string,
|
|
1224
|
+
bindingToken: string,
|
|
1225
|
+
signal?: AbortSignal
|
|
1226
|
+
): Promise<void> {
|
|
1227
|
+
const route = this.requireRouteCore(actorId);
|
|
1228
|
+
this.requireCurrentTokenCore(actorId, bindingToken);
|
|
1229
|
+
if (route.sealId === undefined) return Promise.resolve();
|
|
1230
|
+
return new Promise<void>((resolve, reject) => {
|
|
1231
|
+
const waiters = this.sealWaiters.get(actorId) ?? new Set();
|
|
1232
|
+
let settled = false;
|
|
1233
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
1234
|
+
const cleanup = () => {
|
|
1235
|
+
if (timer !== undefined) clearTimeout(timer);
|
|
1236
|
+
signal?.removeEventListener('abort', onAbort);
|
|
1237
|
+
};
|
|
1238
|
+
const resolveWaiter = () => {
|
|
1239
|
+
if (settled) return;
|
|
1240
|
+
settled = true;
|
|
1241
|
+
cleanup();
|
|
1242
|
+
resolve();
|
|
1243
|
+
};
|
|
1244
|
+
const rejectWaiter = (error: unknown) => {
|
|
1245
|
+
if (settled) return;
|
|
1246
|
+
settled = true;
|
|
1247
|
+
cleanup();
|
|
1248
|
+
reject(error);
|
|
1249
|
+
};
|
|
1250
|
+
const waiter = { bindingToken, resolve: resolveWaiter, reject: rejectWaiter };
|
|
1251
|
+
waiters.add(waiter);
|
|
1252
|
+
this.sealWaiters.set(actorId, waiters);
|
|
1253
|
+
const removeWaiter = () => {
|
|
1254
|
+
waiters.delete(waiter);
|
|
1255
|
+
if (waiters.size === 0) this.sealWaiters.delete(actorId);
|
|
1256
|
+
};
|
|
1257
|
+
timer = startOutsideStateLane(() => setTimeout(() => {
|
|
1258
|
+
this.lane.tryPost(() => {
|
|
1259
|
+
removeWaiter();
|
|
1260
|
+
rejectWaiter(createInternalFrameworkException(
|
|
1261
|
+
ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
|
|
1262
|
+
`Actor '${actorId}' session seal was not released within the relocation seal timeout.`,
|
|
1263
|
+
true
|
|
1264
|
+
));
|
|
1265
|
+
});
|
|
1266
|
+
}, this.sealWaitTimeoutMs));
|
|
1267
|
+
timer.unref();
|
|
1268
|
+
const onAbort = () => {
|
|
1269
|
+
this.lane.tryPost(() => {
|
|
1270
|
+
removeWaiter();
|
|
1271
|
+
rejectWaiter(signal?.reason ?? createAbortError());
|
|
1272
|
+
});
|
|
1273
|
+
};
|
|
1274
|
+
if (signal === undefined) return;
|
|
1275
|
+
if (signal.aborted) {
|
|
1276
|
+
onAbort();
|
|
1277
|
+
return;
|
|
1278
|
+
}
|
|
1279
|
+
startOutsideStateLane(() => signal.addEventListener('abort', onAbort, { once: true }));
|
|
1280
|
+
});
|
|
1281
|
+
}
|
|
1282
|
+
|
|
1283
|
+
private async waitForActiveFrames(actorId: string, signal?: AbortSignal): Promise<void> {
|
|
1284
|
+
const prepared = await this.lane.run(() => ({
|
|
1285
|
+
wait: this.waitForActiveFramesCore(actorId, signal)
|
|
1286
|
+
}));
|
|
1287
|
+
await prepared.wait;
|
|
1288
|
+
}
|
|
1289
|
+
|
|
1290
|
+
private waitForActiveFramesCore(actorId: string, signal?: AbortSignal): Promise<void> {
|
|
1291
|
+
const route = this.requireRouteCore(actorId);
|
|
1292
|
+
if (route.activeFrames.count === 0) return Promise.resolve();
|
|
1293
|
+
return new Promise<void>((resolve, reject) => {
|
|
1294
|
+
const waiters = this.activeFrameWaiters.get(actorId) ?? new Set();
|
|
1295
|
+
let settled = false;
|
|
1296
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
1297
|
+
const cleanup = () => {
|
|
1298
|
+
if (timer !== undefined) clearTimeout(timer);
|
|
1299
|
+
signal?.removeEventListener('abort', onAbort);
|
|
1300
|
+
};
|
|
1301
|
+
const waiter: ZLinkActorSessionActiveFrameWaiter = {
|
|
1302
|
+
resolve: () => {
|
|
1303
|
+
if (settled) return;
|
|
1304
|
+
settled = true;
|
|
1305
|
+
cleanup();
|
|
1306
|
+
resolve();
|
|
1307
|
+
},
|
|
1308
|
+
reject: (error) => {
|
|
1309
|
+
if (settled) return;
|
|
1310
|
+
settled = true;
|
|
1311
|
+
cleanup();
|
|
1312
|
+
reject(error);
|
|
1313
|
+
}
|
|
1314
|
+
};
|
|
1315
|
+
const onAbort = () => {
|
|
1316
|
+
this.lane.tryPost(() => {
|
|
1317
|
+
waiters.delete(waiter);
|
|
1318
|
+
if (waiters.size === 0) this.activeFrameWaiters.delete(actorId);
|
|
1319
|
+
waiter.reject(signal?.reason ?? createAbortError());
|
|
1320
|
+
});
|
|
1321
|
+
};
|
|
1322
|
+
waiters.add(waiter);
|
|
1323
|
+
this.activeFrameWaiters.set(actorId, waiters);
|
|
1324
|
+
// Spec 48:205 — transport/deadline limits keep applying during
|
|
1325
|
+
// relocation: the sealing side must not wait forever for active
|
|
1326
|
+
// frames that themselves may be waiting on this relocation.
|
|
1327
|
+
timer = startOutsideStateLane(() => setTimeout(() => {
|
|
1328
|
+
this.lane.tryPost(() => {
|
|
1329
|
+
waiters.delete(waiter);
|
|
1330
|
+
if (waiters.size === 0) this.activeFrameWaiters.delete(actorId);
|
|
1331
|
+
waiter.reject(createInternalFrameworkException(
|
|
1332
|
+
ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
|
|
1333
|
+
`Actor '${actorId}' session seal timed out waiting for active frames.`,
|
|
1334
|
+
true
|
|
1335
|
+
));
|
|
1336
|
+
});
|
|
1337
|
+
}, this.sealWaitTimeoutMs));
|
|
1338
|
+
timer.unref();
|
|
1339
|
+
if (signal === undefined) return;
|
|
1340
|
+
if (signal.aborted) onAbort();
|
|
1341
|
+
else startOutsideStateLane(() => signal.addEventListener('abort', onAbort, { once: true }));
|
|
1342
|
+
});
|
|
1343
|
+
}
|
|
1344
|
+
|
|
1345
|
+
private resolveActiveFrameWaiters(actorId: string): void {
|
|
1346
|
+
const waiters = this.activeFrameWaiters.get(actorId);
|
|
1347
|
+
if (waiters === undefined) return;
|
|
1348
|
+
this.activeFrameWaiters.delete(actorId);
|
|
1349
|
+
for (const waiter of waiters) waiter.resolve();
|
|
1350
|
+
}
|
|
1351
|
+
|
|
1352
|
+
private rejectActiveFrameWaiters(actorId: string, error: unknown): void {
|
|
1353
|
+
const waiters = this.activeFrameWaiters.get(actorId);
|
|
1354
|
+
if (waiters === undefined) return;
|
|
1355
|
+
this.activeFrameWaiters.delete(actorId);
|
|
1356
|
+
for (const waiter of waiters) waiter.reject(error);
|
|
1357
|
+
}
|
|
1358
|
+
|
|
1359
|
+
private startOutboundDrain(queue: ZLinkActorSessionRelocationQueue): void {
|
|
1360
|
+
if (queue.drainPromise !== undefined) return;
|
|
1361
|
+
const drain = startOutsideStateLane(async () => {
|
|
1362
|
+
for (;;) {
|
|
1363
|
+
const entry = await this.lane.run(() => {
|
|
1364
|
+
const current = queue.outbound.at(0);
|
|
1365
|
+
if (current === undefined || !current.released) return undefined;
|
|
1366
|
+
if (current.settled) {
|
|
1367
|
+
queue.outbound.shift();
|
|
1368
|
+
return null;
|
|
1369
|
+
}
|
|
1370
|
+
return current;
|
|
1371
|
+
});
|
|
1372
|
+
if (entry === undefined) return;
|
|
1373
|
+
if (entry === null) continue;
|
|
1374
|
+
try {
|
|
1375
|
+
const delivered = await entry.operation.deliver();
|
|
1376
|
+
await this.lane.run(() => {
|
|
1377
|
+
if (delivered) this.settleOutbound(queue, entry);
|
|
1378
|
+
else this.failOutbound(
|
|
1379
|
+
queue,
|
|
1380
|
+
entry,
|
|
1381
|
+
new Error(`Actor '${queue.actorId}' retained Session outbound delivery was rejected.`)
|
|
1382
|
+
);
|
|
1383
|
+
if (queue.outbound[0] === entry) queue.outbound.shift();
|
|
1384
|
+
});
|
|
1385
|
+
} catch (error) {
|
|
1386
|
+
await this.lane.run(() => {
|
|
1387
|
+
this.failOutbound(queue, entry, error);
|
|
1388
|
+
if (queue.outbound[0] === entry) queue.outbound.shift();
|
|
1389
|
+
});
|
|
1390
|
+
}
|
|
1391
|
+
}
|
|
1392
|
+
});
|
|
1393
|
+
startOutsideStateLane(() => {
|
|
1394
|
+
void drain.finally(async () => await this.lane.run(() => {
|
|
1395
|
+
if (queue.drainPromise === drain) queue.drainPromise = undefined;
|
|
1396
|
+
if (queue.outbound[0]?.released === true) this.startOutboundDrain(queue);
|
|
1397
|
+
else this.deleteEmptyRelocationQueue(queue);
|
|
1398
|
+
}));
|
|
1399
|
+
});
|
|
1400
|
+
queue.drainPromise = drain;
|
|
1401
|
+
}
|
|
1402
|
+
|
|
1403
|
+
private reserveOutbound(
|
|
1404
|
+
queue: ZLinkActorSessionRelocationQueue,
|
|
1405
|
+
operation: ZLinkActorSessionRetainedOutbound
|
|
1406
|
+
): boolean {
|
|
1407
|
+
if (queue.outboundCount < this.outboundCapacity) {
|
|
1408
|
+
queue.outboundCount++;
|
|
1409
|
+
return true;
|
|
1410
|
+
}
|
|
1411
|
+
failRetainedOutbound(
|
|
1412
|
+
operation,
|
|
1413
|
+
new Error(`Actor '${queue.actorId}' Session relocation outbound capacity was exhausted.`)
|
|
1414
|
+
);
|
|
1415
|
+
return false;
|
|
1416
|
+
}
|
|
1417
|
+
|
|
1418
|
+
private settleOutbound(
|
|
1419
|
+
queue: ZLinkActorSessionRelocationQueue,
|
|
1420
|
+
entry: ZLinkActorSessionOutboundEntry
|
|
1421
|
+
): void {
|
|
1422
|
+
if (entry.settled) return;
|
|
1423
|
+
entry.settled = true;
|
|
1424
|
+
queue.outboundCount--;
|
|
1425
|
+
}
|
|
1426
|
+
|
|
1427
|
+
private failOutbound(
|
|
1428
|
+
queue: ZLinkActorSessionRelocationQueue,
|
|
1429
|
+
entry: ZLinkActorSessionOutboundEntry,
|
|
1430
|
+
error: unknown
|
|
1431
|
+
): void {
|
|
1432
|
+
if (entry.settled) return;
|
|
1433
|
+
this.settleOutbound(queue, entry);
|
|
1434
|
+
failRetainedOutbound(entry.operation, error);
|
|
1435
|
+
}
|
|
1436
|
+
|
|
1437
|
+
private outboundAdmissionError(
|
|
1438
|
+
claim: ServiceSessionBindingAdmissionClaim
|
|
1439
|
+
): Error | undefined {
|
|
1440
|
+
if (
|
|
1441
|
+
claim.actorId.length === 0
|
|
1442
|
+
|| claim.objectGeneration <= 0n
|
|
1443
|
+
|| claim.actorNodeRid.length === 0
|
|
1444
|
+
|| claim.actorNodeGeneration <= 0n
|
|
1445
|
+
|| claim.producerNodeRid.length === 0
|
|
1446
|
+
|| claim.producerNodeGeneration <= 0n
|
|
1447
|
+
|| claim.bindingGeneration <= 0n
|
|
1448
|
+
|| claim.sessionIdentity.length === 0
|
|
1449
|
+
|| !routingIdsEqual(claim.producerNodeRid, claim.actorNodeRid)
|
|
1450
|
+
|| claim.producerNodeGeneration !== claim.actorNodeGeneration
|
|
1451
|
+
) {
|
|
1452
|
+
return new Error(`Actor '${claim.actorId}' Session outbound admission claim is invalid.`);
|
|
1453
|
+
}
|
|
1454
|
+
const route = this.routes.get(claim.actorId);
|
|
1455
|
+
const ref = route?.actor as (TActor & { readonly ref?: {
|
|
1456
|
+
readonly actorId?: unknown;
|
|
1457
|
+
readonly objectGeneration?: unknown;
|
|
1458
|
+
readonly generation?: unknown;
|
|
1459
|
+
readonly bindingGeneration?: unknown;
|
|
1460
|
+
} }) | undefined;
|
|
1461
|
+
const actorRef = ref?.ref;
|
|
1462
|
+
const routeSessionIdentity = route?.sessionIdentity;
|
|
1463
|
+
if (
|
|
1464
|
+
route === undefined
|
|
1465
|
+
|| actorRef === undefined
|
|
1466
|
+
|| String(actorRef.actorId ?? claim.actorId) !== claim.actorId
|
|
1467
|
+
|| BigInt(
|
|
1468
|
+
actorRef.objectGeneration as bigint | number | string | boolean | undefined
|
|
1469
|
+
?? actorRef.generation as bigint | number | string | boolean | undefined
|
|
1470
|
+
?? -1
|
|
1471
|
+
) !== claim.objectGeneration
|
|
1472
|
+
|| BigInt(
|
|
1473
|
+
actorRef.bindingGeneration as bigint | number | string | boolean | undefined ?? -1
|
|
1474
|
+
) !== claim.bindingGeneration
|
|
1475
|
+
|| String(routeSessionIdentity ?? '') !== claim.sessionIdentity
|
|
1476
|
+
) {
|
|
1477
|
+
return new Error(`Actor '${claim.actorId}' Session outbound admission was fenced by its current binding.`);
|
|
1478
|
+
}
|
|
1479
|
+
return undefined;
|
|
1480
|
+
}
|
|
1481
|
+
|
|
1482
|
+
private matchesCurrentProducerNode(claim: ServiceSessionBindingAdmissionClaim): boolean {
|
|
1483
|
+
const route = this.routes.get(claim.actorId);
|
|
1484
|
+
const actorRef = (route?.actor as TActor & { readonly ref?: {
|
|
1485
|
+
readonly nodeRid?: unknown;
|
|
1486
|
+
} }).ref;
|
|
1487
|
+
return route !== undefined
|
|
1488
|
+
&& actorRef !== undefined
|
|
1489
|
+
&& routingIdsEqual(String(actorRef.nodeRid ?? ''), claim.actorNodeRid);
|
|
1490
|
+
}
|
|
1491
|
+
|
|
1492
|
+
private rememberTerminalRelocation(state: ZLinkActorSessionRelocationState): void {
|
|
1493
|
+
this.terminalRelocations.delete(state);
|
|
1494
|
+
this.terminalRelocations.set(state, true);
|
|
1495
|
+
while (this.terminalRelocations.size > this.terminalRelocationCapacity) {
|
|
1496
|
+
const oldest = this.terminalRelocations.keys().next().value as
|
|
1497
|
+
ZLinkActorSessionRelocationState | undefined;
|
|
1498
|
+
if (oldest === undefined) return;
|
|
1499
|
+
this.terminalRelocations.delete(oldest);
|
|
1500
|
+
const queue = this.relocations.get(oldest.actorId);
|
|
1501
|
+
if (queue?.seals.get(oldest.sealId) === oldest) {
|
|
1502
|
+
queue.seals.delete(oldest.sealId);
|
|
1503
|
+
this.deleteEmptyRelocationQueue(queue);
|
|
1504
|
+
}
|
|
1505
|
+
}
|
|
1506
|
+
}
|
|
1507
|
+
|
|
1508
|
+
private deleteEmptyRelocationQueue(queue: ZLinkActorSessionRelocationQueue): void {
|
|
1509
|
+
if (
|
|
1510
|
+
queue.activeSealId === undefined
|
|
1511
|
+
&& queue.seals.size === 0
|
|
1512
|
+
&& queue.outbound.length === 0
|
|
1513
|
+
&& queue.drainPromise === undefined
|
|
1514
|
+
&& this.relocations.get(queue.actorId) === queue
|
|
1515
|
+
) {
|
|
1516
|
+
this.relocations.delete(queue.actorId);
|
|
1517
|
+
}
|
|
1518
|
+
}
|
|
1519
|
+
|
|
1520
|
+
private resolveSealWaiters(actorId: string, _sealId: string): void {
|
|
1521
|
+
const waiters = this.sealWaiters.get(actorId);
|
|
1522
|
+
if (waiters === undefined) return;
|
|
1523
|
+
this.sealWaiters.delete(actorId);
|
|
1524
|
+
for (const waiter of waiters) waiter.resolve();
|
|
1525
|
+
}
|
|
1526
|
+
|
|
1527
|
+
private rejectSealWaiters(actorId: string, error: unknown): void {
|
|
1528
|
+
const waiters = this.sealWaiters.get(actorId);
|
|
1529
|
+
if (waiters === undefined) return;
|
|
1530
|
+
this.sealWaiters.delete(actorId);
|
|
1531
|
+
for (const waiter of waiters) waiter.reject(error);
|
|
1532
|
+
}
|
|
1533
|
+
}
|
|
1534
|
+
|
|
1535
|
+
function assertRelocationClaim(
|
|
1536
|
+
state: ZLinkActorSessionRelocationState,
|
|
1537
|
+
claim: ZLinkActorSessionRelocationClaim
|
|
1538
|
+
): void {
|
|
1539
|
+
if (
|
|
1540
|
+
state.actorGeneration !== claim.actorGeneration
|
|
1541
|
+
|| state.bindingGeneration !== claim.bindingGeneration
|
|
1542
|
+
|| state.sessionIdentity !== claim.sessionIdentity
|
|
1543
|
+
|| state.actorNodeRid !== claim.actorNodeRid
|
|
1544
|
+
|| state.actorNodeGeneration !== claim.actorNodeGeneration
|
|
1545
|
+
) {
|
|
1546
|
+
throw createInternalFrameworkException(
|
|
1547
|
+
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
1548
|
+
`Actor '${claim.actorId}' repeated Session seal changed its exact identity.`,
|
|
1549
|
+
true
|
|
1550
|
+
);
|
|
1551
|
+
}
|
|
1552
|
+
}
|
|
1553
|
+
|
|
1554
|
+
function startOutsideStateLane<T>(work: () => T): T {
|
|
1555
|
+
return detachedStateLaneResource.runInAsyncScope(work);
|
|
1556
|
+
}
|
|
1557
|
+
|
|
1558
|
+
function matchesRelocationSourceProof(
|
|
1559
|
+
state: ZLinkActorSessionRelocationState,
|
|
1560
|
+
claim: ServiceSessionBindingAdmissionClaim
|
|
1561
|
+
): boolean {
|
|
1562
|
+
return state.actorId === claim.actorId
|
|
1563
|
+
&& state.actorGeneration === claim.objectGeneration
|
|
1564
|
+
&& state.bindingGeneration === claim.bindingGeneration
|
|
1565
|
+
&& state.sessionIdentity === claim.sessionIdentity
|
|
1566
|
+
&& state.actorNodeRid !== undefined
|
|
1567
|
+
&& routingIdsEqual(state.actorNodeRid, claim.actorNodeRid)
|
|
1568
|
+
&& state.actorNodeGeneration === claim.actorNodeGeneration;
|
|
1569
|
+
}
|
|
1570
|
+
|
|
1571
|
+
function matchesAcceptedProducerProof(
|
|
1572
|
+
proof: ZLinkActorSessionAcceptedProducerProof,
|
|
1573
|
+
claim: ServiceSessionBindingAdmissionClaim
|
|
1574
|
+
): boolean {
|
|
1575
|
+
return proof.actorId === claim.actorId
|
|
1576
|
+
&& proof.objectGeneration === claim.objectGeneration
|
|
1577
|
+
&& routingIdsEqual(proof.actorNodeRid, claim.actorNodeRid)
|
|
1578
|
+
&& proof.actorNodeGeneration === claim.actorNodeGeneration
|
|
1579
|
+
&& proof.sessionIdentity === claim.sessionIdentity
|
|
1580
|
+
&& proof.bindingGeneration === claim.bindingGeneration;
|
|
1581
|
+
}
|
|
1582
|
+
|
|
1583
|
+
function validAcceptedTargetProof(
|
|
1584
|
+
state: ZLinkActorSessionRelocationState,
|
|
1585
|
+
proof: ZLinkActorSessionAcceptedProducerProof
|
|
1586
|
+
): boolean {
|
|
1587
|
+
return proof.actorId === state.actorId
|
|
1588
|
+
&& proof.objectGeneration === state.actorGeneration
|
|
1589
|
+
&& proof.actorNodeRid.length > 0
|
|
1590
|
+
&& proof.actorNodeGeneration > 0n
|
|
1591
|
+
&& proof.sessionIdentity === state.sessionIdentity
|
|
1592
|
+
&& proof.bindingGeneration === state.bindingGeneration;
|
|
1593
|
+
}
|
|
1594
|
+
|
|
1595
|
+
function relocationSourceProof(
|
|
1596
|
+
state: ZLinkActorSessionRelocationState
|
|
1597
|
+
): ZLinkActorSessionAcceptedProducerProof | undefined {
|
|
1598
|
+
if (
|
|
1599
|
+
state.sessionIdentity === undefined
|
|
1600
|
+
|| state.actorNodeRid === undefined
|
|
1601
|
+
|| state.actorNodeGeneration === undefined
|
|
1602
|
+
) return undefined;
|
|
1603
|
+
return {
|
|
1604
|
+
actorId: state.actorId,
|
|
1605
|
+
objectGeneration: state.actorGeneration,
|
|
1606
|
+
actorNodeRid: state.actorNodeRid,
|
|
1607
|
+
actorNodeGeneration: state.actorNodeGeneration,
|
|
1608
|
+
sessionIdentity: state.sessionIdentity,
|
|
1609
|
+
bindingGeneration: state.bindingGeneration
|
|
1610
|
+
};
|
|
1611
|
+
}
|
|
1612
|
+
|
|
1613
|
+
function failRetainedOutbound(
|
|
1614
|
+
operation: ZLinkActorSessionRetainedOutbound,
|
|
1615
|
+
error: unknown
|
|
1616
|
+
): void {
|
|
1617
|
+
try {
|
|
1618
|
+
operation.fail(error);
|
|
1619
|
+
} catch {
|
|
1620
|
+
// The aggregate has already removed the entry. A failure observer cannot
|
|
1621
|
+
// retain or settle the same delivery a second time.
|
|
1622
|
+
}
|
|
1623
|
+
}
|
|
1624
|
+
|
|
1625
|
+
function assertSuccessorSessionIdentity(
|
|
1626
|
+
predecessor: ZLinkActorSessionRelocationState,
|
|
1627
|
+
successor: ZLinkActorSessionRelocationClaim
|
|
1628
|
+
): void {
|
|
1629
|
+
if (
|
|
1630
|
+
predecessor.actorGeneration !== successor.actorGeneration
|
|
1631
|
+
|| predecessor.bindingGeneration !== successor.bindingGeneration
|
|
1632
|
+
|| predecessor.sessionIdentity !== successor.sessionIdentity
|
|
1633
|
+
) {
|
|
1634
|
+
throw createInternalFrameworkException(
|
|
1635
|
+
ZLinkFrameworkInternalErrorKind.ActorLocationStale,
|
|
1636
|
+
`Actor '${successor.actorId}' successor Session seal changed its exact Session identity.`,
|
|
1637
|
+
true
|
|
1638
|
+
);
|
|
1639
|
+
}
|
|
1640
|
+
}
|
|
1641
|
+
|
|
1642
|
+
export interface ZLinkActorSessionRouteFence {
|
|
1643
|
+
readonly objectGeneration: bigint;
|
|
1644
|
+
readonly bindingGeneration: bigint;
|
|
1645
|
+
}
|
|
1646
|
+
|
|
1647
|
+
function routeMatchesFence<
|
|
1648
|
+
TContext extends ZLinkActorSessionBindingContext<TActor>,
|
|
1649
|
+
TActor extends ZLinkActorSessionBindingActor
|
|
1650
|
+
>(route: ZLinkActorSessionRoute<TContext, TActor>, expected: ZLinkActorSessionRouteFence): boolean {
|
|
1651
|
+
const ref = (route.actor as TActor & { readonly ref?: unknown }).ref as {
|
|
1652
|
+
readonly objectGeneration?: bigint;
|
|
1653
|
+
readonly generation?: bigint;
|
|
1654
|
+
readonly bindingGeneration?: bigint;
|
|
1655
|
+
} | undefined;
|
|
1656
|
+
return ref !== undefined
|
|
1657
|
+
&& BigInt(ref.objectGeneration ?? ref.generation ?? -1n) === expected.objectGeneration
|
|
1658
|
+
&& ref.bindingGeneration === expected.bindingGeneration;
|
|
1659
|
+
}
|
|
1660
|
+
|
|
1661
|
+
function sessionIdentityFromContext<
|
|
1662
|
+
TActor extends ZLinkActorSessionBindingActor,
|
|
1663
|
+
TContext extends ZLinkActorSessionBindingContext<TActor>
|
|
1664
|
+
>(context: TContext): string | undefined {
|
|
1665
|
+
return context.routingId === undefined ? undefined : String(context.routingId);
|
|
1666
|
+
}
|
|
1667
|
+
|
|
1668
|
+
function waitForSessionRelocation(
|
|
1669
|
+
operation: Promise<void>,
|
|
1670
|
+
signal?: AbortSignal
|
|
1671
|
+
): Promise<void> {
|
|
1672
|
+
if (signal === undefined) return operation;
|
|
1673
|
+
if (signal.aborted) return Promise.reject(signal.reason ?? createAbortError());
|
|
1674
|
+
return new Promise<void>((resolve, reject) => {
|
|
1675
|
+
const onAbort = () => {
|
|
1676
|
+
signal.removeEventListener('abort', onAbort);
|
|
1677
|
+
reject(signal.reason ?? createAbortError());
|
|
1678
|
+
};
|
|
1679
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
1680
|
+
operation.then(
|
|
1681
|
+
() => {
|
|
1682
|
+
signal.removeEventListener('abort', onAbort);
|
|
1683
|
+
resolve();
|
|
1684
|
+
},
|
|
1685
|
+
error => {
|
|
1686
|
+
signal.removeEventListener('abort', onAbort);
|
|
1687
|
+
reject(error);
|
|
1688
|
+
}
|
|
1689
|
+
);
|
|
1690
|
+
});
|
|
1691
|
+
}
|