@zlink-systems/framework 0.30.0 → 0.30.2
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 +150 -68
- package/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Actors/ZLinkActorClient.d.ts +2 -1
- package/dist/contracts/Channels/Calls.d.ts +2 -1
- package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
- package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
- package/dist/contracts/Common/ZLinkMessageMetadata.js +11 -5
- package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
- package/dist/contracts/Common/encoded-payload-storage.js +5 -2
- package/dist/contracts/Configuration/Builders.d.ts +1 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
- package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
- package/dist/contracts/Handlers/Attributes.d.ts +5 -13
- package/dist/contracts/Handlers/Attributes.js +7 -11
- package/dist/contracts/Handlers/JsonContract.d.ts +2 -46
- package/dist/contracts/Handlers/JsonContract.js +4 -153
- package/dist/contracts/Locations/Rows.d.ts +2 -0
- package/dist/contracts/Spots/Contracts.d.ts +6 -1
- package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
- package/dist/nest-integration.d.ts +1 -1
- package/dist/nest-integration.js +2 -1
- package/dist/runtime/abort.d.ts +5 -0
- package/dist/runtime/abort.js +10 -0
- package/dist/runtime/actors/actor-authority-publication.js +3 -2
- package/dist/runtime/actors/actor-client.d.ts +1 -2
- package/dist/runtime/actors/actor-client.js +52 -57
- package/dist/runtime/actors/actor-context.d.ts +2 -0
- package/dist/runtime/actors/actor-context.js +46 -9
- package/dist/runtime/actors/actor-handoff.d.ts +8 -4
- package/dist/runtime/actors/actor-handoff.js +219 -92
- package/dist/runtime/actors/actor-join-relocation.d.ts +3 -0
- package/dist/runtime/actors/actor-local-native-join.js +13 -12
- package/dist/runtime/actors/actor-mailbox.js +27 -1
- package/dist/runtime/actors/actor-remote-joiner.js +3 -1
- package/dist/runtime/actors/actor-remote-wire.js +15 -0
- package/dist/runtime/actors/actor-reply.d.ts +4 -0
- package/dist/runtime/actors/actor-reply.js +29 -0
- package/dist/runtime/actors/actor-routed-join-transport.d.ts +6 -2
- package/dist/runtime/actors/actor-routed-json-request.d.ts +2 -0
- package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
- package/dist/runtime/actors/actor-runtime-state.js +2 -20
- package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
- package/dist/runtime/actors/index.d.ts +8 -3
- package/dist/runtime/actors/index.js +55 -27
- package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
- package/dist/runtime/actors/session-disconnected-wire.js +48 -0
- package/dist/runtime/actors/spot-actor-dispatch.js +2 -2
- package/dist/runtime/admission.d.ts +9 -1
- package/dist/runtime/admission.js +56 -23
- package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +6 -8
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +39 -22
- package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +15 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.js +61 -20
- package/dist/runtime/application-jobs/contracts.d.ts +12 -1
- package/dist/runtime/backend/contracts/index.d.ts +37 -12
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
- package/dist/runtime/backend/mesh-completion-table.d.ts +9 -1
- package/dist/runtime/backend/mesh-completion-table.js +154 -49
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +28 -1
- package/dist/runtime/backend/mesh-dispatch-pump.js +208 -101
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +2 -2
- package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -9
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +1 -1
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +5 -2
- package/dist/runtime/backend/node/node-raw-binding-port.js +124 -72
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +46 -13
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +181 -164
- package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +11 -11
- package/dist/runtime/backend/raw-binding-port.d.ts +2 -2
- package/dist/runtime/backend/runtime-message.d.ts +1 -0
- package/dist/runtime/backend/runtime-message.js +5 -0
- package/dist/runtime/backend/runtime-values.d.ts +1 -0
- package/dist/runtime/backend/runtime-values.js +2 -1
- package/dist/runtime/channels/channel-clients.d.ts +2 -0
- package/dist/runtime/channels/channel-clients.js +75 -23
- package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +25 -5
- package/dist/runtime/channels/channel-dispatch-pipeline.js +111 -56
- package/dist/runtime/channels/channel-dispatch-services.d.ts +1 -0
- package/dist/runtime/channels/channel-dispatch-services.js +45 -0
- package/dist/runtime/channels/channel-dispatchers.d.ts +4 -3
- package/dist/runtime/channels/channel-dispatchers.js +62 -54
- package/dist/runtime/channels/channel-envelope-inspection.d.ts +1 -2
- package/dist/runtime/channels/channel-envelope-inspection.js +1 -16
- package/dist/runtime/channels/channel-envelope.d.ts +2 -0
- package/dist/runtime/channels/channel-envelope.js +146 -28
- package/dist/runtime/channels/channel-outbound-operations.d.ts +2 -2
- package/dist/runtime/channels/channel-outbound-operations.js +8 -8
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
- package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
- package/dist/runtime/channels/channel-runtime-manager.d.ts +9 -8
- package/dist/runtime/channels/channel-runtime-manager.js +16 -16
- package/dist/runtime/channels/channel-transports.d.ts +18 -16
- package/dist/runtime/channels/channel-transports.js +77 -58
- package/dist/runtime/channels/client-server-location-runtime.js +5 -4
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
- package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
- package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/fanout-location-runtime.js +3 -3
- package/dist/runtime/channels/local-spot-route-transport.d.ts +1 -1
- package/dist/runtime/channels/local-spot-route-transport.js +2 -1
- package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +2 -2
- package/dist/runtime/channels/router-socket-spot-route-transport.js +4 -4
- package/dist/runtime/channels/source-spot-router.d.ts +2 -2
- package/dist/runtime/channels/source-spot-router.js +4 -4
- package/dist/runtime/channels/spot-node-route-transport.d.ts +2 -2
- package/dist/runtime/channels/spot-node-route-transport.js +4 -4
- package/dist/runtime/channels/spot-route-bridge-transport.d.ts +2 -2
- package/dist/runtime/channels/spot-route-bridge-transport.js +4 -4
- package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +5 -4
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +18 -18
- package/dist/runtime/diagnostics/flow-context.js +19 -7
- package/dist/runtime/diagnostics/index.js +4 -9
- package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
- package/dist/runtime/diagnostics/message-flow.js +35 -5
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
- package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
- package/dist/runtime/execution/index.d.ts +4 -2
- package/dist/runtime/execution/index.js +33 -10
- package/dist/runtime/execution/serial-execution-queue.d.ts +5 -0
- package/dist/runtime/execution/serial-execution-queue.js +22 -2
- package/dist/runtime/execution/state-lane.d.ts +2 -0
- package/dist/runtime/execution/state-lane.js +5 -0
- package/dist/runtime/foundation/actor-join-recovery-codec.js +2 -2
- package/dist/runtime/foundation/durable-service-request.d.ts +14 -0
- package/dist/runtime/foundation/durable-service-request.js +98 -0
- package/dist/runtime/foundation/operation-identity.d.ts +1 -0
- package/dist/runtime/foundation/operation-identity.js +5 -1
- package/dist/runtime/foundation/operation-registry.d.ts +25 -1
- package/dist/runtime/foundation/operation-registry.js +86 -18
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +61 -8
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +486 -266
- package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
- package/dist/runtime/foundation/service-liveness-registry.js +38 -0
- package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
- package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
- package/dist/runtime/foundation/service-relocation-object-owner.d.ts +3 -3
- package/dist/runtime/foundation/service-relocation-object-owner.js +48 -34
- package/dist/runtime/foundation/service-relocation-runtime.d.ts +2 -0
- package/dist/runtime/foundation/service-relocation-runtime.js +20 -4
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +10 -1
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
- package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
- package/dist/runtime/foundation/service-stateful-registry.js +24 -26
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +75 -9
- package/dist/runtime/foundation/service-stateful-runtime.js +486 -218
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -6
- package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
- package/dist/runtime/foundation/service-topology-registry.d.ts +12 -2
- package/dist/runtime/foundation/service-topology-registry.js +61 -27
- package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
- package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +13 -3
- package/dist/runtime/foundation/service-wire-m6a-codec.js +189 -78
- package/dist/runtime/handlers/handler-instance-scope.d.ts +8 -0
- package/dist/runtime/handlers/handler-instance-scope.js +54 -11
- package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
- package/dist/runtime/host/actor-packet-relay.js +59 -72
- package/dist/runtime/host/actor-placement-coordinator.js +25 -8
- package/dist/runtime/host/actor-runtime-options-factory.js +2 -2
- package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
- package/dist/runtime/host/actor-transfer-runtime.js +85 -331
- package/dist/runtime/host/application-job-queue.d.ts +40 -7
- package/dist/runtime/host/application-job-queue.js +137 -42
- package/dist/runtime/host/entry-actor-runtime.d.ts +1 -0
- package/dist/runtime/host/entry-actor-runtime.js +3 -0
- package/dist/runtime/host/index.d.ts +12 -2
- package/dist/runtime/host/index.js +300 -202
- package/dist/runtime/host/location-runtime-owner.js +2 -6
- package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
- package/dist/runtime/host/mesh-router-resolver.js +14 -6
- package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
- package/dist/runtime/host/remote-bound-session-relay.js +73 -208
- package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
- package/dist/runtime/host/route-mesh-runtime.js +6 -4
- package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
- package/dist/runtime/host/runtime-shutdown.js +3 -2
- package/dist/runtime/host/service-relocation-control.d.ts +1 -0
- package/dist/runtime/host/service-relocation-control.js +10 -4
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +22 -14
- package/dist/runtime/host/service-relocation-host-runtime.js +754 -599
- package/dist/runtime/host/spot-address-transport.js +3 -2
- package/dist/runtime/host/spot-runtime-options-factory.js +16 -7
- package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
- package/dist/runtime/locations/actor-location-claims.d.ts +2 -2
- package/dist/runtime/locations/actor-location-claims.js +34 -19
- package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
- package/dist/runtime/locations/auto-connect-loop.js +22 -14
- package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
- package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
- package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
- package/dist/runtime/locations/descriptor-publication.js +11 -0
- package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
- package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
- package/dist/runtime/locations/in-memory-authority-store.js +56 -19
- package/dist/runtime/locations/in-memory-location-store.js +1 -10
- package/dist/runtime/locations/index.d.ts +1 -0
- package/dist/runtime/locations/index.js +1 -0
- package/dist/runtime/locations/lease-tracker.js +1 -6
- package/dist/runtime/locations/lifecycle.d.ts +1 -2
- package/dist/runtime/locations/lifecycle.js +2 -5
- package/dist/runtime/locations/location-store-repository.d.ts +51 -1
- package/dist/runtime/locations/location-store-repository.js +363 -139
- package/dist/runtime/locations/relocation-blob.d.ts +18 -1
- package/dist/runtime/locations/relocation-blob.js +52 -1
- package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
- package/dist/runtime/locations/request-source-resolver.js +80 -0
- package/dist/runtime/locations/resolvers.js +1 -1
- package/dist/runtime/locations/runtime.d.ts +7 -3
- package/dist/runtime/locations/runtime.js +61 -53
- package/dist/runtime/messaging/framework-json-v1.d.ts +4 -6
- package/dist/runtime/messaging/framework-json-v1.js +38 -294
- package/dist/runtime/messaging/packet-name.d.ts +1 -1
- package/dist/runtime/messaging/packet-name.js +8 -24
- package/dist/runtime/messaging/payload-codec.d.ts +7 -1
- package/dist/runtime/messaging/payload-codec.js +7 -6
- package/dist/runtime/messaging/request-result.d.ts +2 -0
- package/dist/runtime/messaging/request-result.js +57 -0
- package/dist/runtime/messaging/submission-result.d.ts +1 -0
- package/dist/runtime/messaging/submission-result.js +5 -2
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +34 -1
- package/dist/runtime/protocol/service_wire_codec.generated.js +229 -0
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +16 -1
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +37 -8
- package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +7 -2
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +36 -21
- package/dist/runtime/spots/index.d.ts +21 -11
- package/dist/runtime/spots/index.js +243 -178
- package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
- package/dist/runtime/spots/spot-activation-registry.js +21 -11
- package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
- package/dist/runtime/spots/spot-activation-state.js +7 -7
- package/dist/runtime/spots/spot-activation.d.ts +7 -3
- package/dist/runtime/spots/spot-activation.js +140 -52
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
- package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
- package/dist/runtime/spots/spot-actor-membership.js +0 -8
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
- package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
- package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
- package/dist/runtime/spots/spot-entry-activation.js +20 -11
- package/dist/runtime/spots/spot-handler-registry.d.ts +7 -4
- package/dist/runtime/spots/spot-handler-registry.js +24 -10
- package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
- package/dist/runtime/spots/spot-manager-public.js +2 -2
- package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
- package/dist/runtime/spots/spot-node-autoconnect.js +22 -42
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
- package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
- package/dist/runtime/spots/spot-outbound.d.ts +3 -0
- package/dist/runtime/spots/spot-outbound.js +27 -18
- package/dist/runtime/spots/spot-remote-codec.js +5 -1
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +1 -0
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +1 -1
- package/dist/runtime/spots/spot-runtime-ports.d.ts +1 -1
- package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
- package/dist/runtime/spots/spot-serial-executor.js +61 -8
- package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
- package/dist/runtime/spots/spot-subscription-dispatch.js +1 -4
- package/dist/runtime/spots/spot-timer.d.ts +57 -5
- package/dist/runtime/spots/spot-timer.js +288 -103
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
- package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
- package/dist/runtime/streams/bound-session-service.d.ts +1 -1
- package/dist/runtime/streams/bound-session-service.js +6 -11
- package/dist/runtime/streams/index.d.ts +3 -2
- package/dist/runtime/streams/index.js +6 -4
- package/dist/runtime/streams/managed-stream.js +3 -2
- package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
- package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
- package/dist/runtime/streams/session-actor-coordinator.js +15 -32
- package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
- package/dist/runtime/streams/stream-session-runtime.d.ts +1 -1
- package/dist/runtime/streams/stream-session-runtime.js +14 -31
- package/dist/runtime/workers/index.js +1 -1
- package/package.json +3 -3
- package/src/contracts/Actors/ZLinkActorClient.ts +2 -1
- package/src/contracts/Channels/Calls.ts +2 -1
- package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
- package/src/contracts/Common/ZLinkMessageMetadata.ts +13 -8
- package/src/contracts/Common/encoded-payload-storage.ts +6 -3
- package/src/contracts/Configuration/Builders.ts +4 -1
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
- package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
- package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
- package/src/contracts/Handlers/Attributes.ts +14 -21
- package/src/contracts/Handlers/JsonContract.ts +8 -216
- package/src/contracts/Locations/Rows.ts +2 -0
- package/src/contracts/Spots/Contracts.ts +10 -1
- package/src/contracts/Spots/ZLinkSpot.ts +3 -3
- package/src/nest-integration.ts +1 -0
- package/src/runtime/abort.ts +12 -0
- package/src/runtime/actors/actor-authority-publication.ts +3 -2
- package/src/runtime/actors/actor-client.ts +100 -85
- package/src/runtime/actors/actor-context.ts +49 -9
- package/src/runtime/actors/actor-handoff.ts +291 -110
- package/src/runtime/actors/actor-join-relocation.ts +3 -0
- package/src/runtime/actors/actor-local-native-join.ts +21 -26
- package/src/runtime/actors/actor-mailbox.ts +40 -2
- package/src/runtime/actors/actor-remote-joiner.ts +6 -1
- package/src/runtime/actors/actor-remote-wire.ts +17 -0
- package/src/runtime/actors/actor-reply.ts +42 -0
- package/src/runtime/actors/actor-routed-join-transport.ts +14 -4
- package/src/runtime/actors/actor-routed-json-request.ts +10 -2
- package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
- package/src/runtime/actors/actor-runtime-state.ts +2 -20
- package/src/runtime/actors/actor-source-transfer.ts +1 -34
- package/src/runtime/actors/index.ts +60 -32
- package/src/runtime/actors/session-disconnected-wire.ts +66 -0
- package/src/runtime/actors/spot-actor-dispatch.ts +4 -2
- package/src/runtime/admission.ts +69 -21
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +41 -25
- package/src/runtime/application-jobs/application-job-queue-scope.ts +83 -22
- package/src/runtime/application-jobs/contracts.ts +16 -1
- package/src/runtime/backend/contracts/index.ts +92 -18
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
- package/src/runtime/backend/mesh-completion-table.ts +160 -57
- package/src/runtime/backend/mesh-dispatch-pump.ts +237 -108
- package/src/runtime/backend/node/node-backend-adapter-support.ts +17 -8
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +12 -2
- package/src/runtime/backend/node/node-raw-binding-port.ts +148 -85
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +315 -201
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +26 -11
- package/src/runtime/backend/raw-binding-port.ts +7 -2
- package/src/runtime/backend/runtime-message.ts +6 -0
- package/src/runtime/backend/runtime-values.ts +1 -0
- package/src/runtime/channels/channel-clients.ts +132 -58
- package/src/runtime/channels/channel-dispatch-pipeline.ts +198 -114
- package/src/runtime/channels/channel-dispatch-services.ts +69 -1
- package/src/runtime/channels/channel-dispatchers.ts +136 -90
- package/src/runtime/channels/channel-envelope-inspection.ts +2 -16
- package/src/runtime/channels/channel-envelope.ts +225 -31
- package/src/runtime/channels/channel-outbound-operations.ts +22 -8
- package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
- package/src/runtime/channels/channel-runtime-manager.ts +41 -17
- package/src/runtime/channels/channel-transports.ts +171 -112
- package/src/runtime/channels/client-server-location-runtime.ts +11 -10
- package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
- package/src/runtime/channels/fanout-location-runtime.ts +17 -9
- package/src/runtime/channels/local-spot-route-transport.ts +3 -1
- package/src/runtime/channels/router-socket-spot-route-transport.ts +13 -4
- package/src/runtime/channels/source-spot-router.ts +8 -4
- package/src/runtime/channels/spot-node-route-transport.ts +8 -4
- package/src/runtime/channels/spot-route-bridge-transport.ts +6 -4
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +47 -18
- package/src/runtime/diagnostics/flow-context.ts +20 -7
- package/src/runtime/diagnostics/index.ts +1 -7
- package/src/runtime/diagnostics/message-flow.ts +47 -9
- package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
- package/src/runtime/execution/index.ts +40 -14
- package/src/runtime/execution/serial-execution-queue.ts +33 -4
- package/src/runtime/execution/state-lane.ts +7 -0
- package/src/runtime/foundation/actor-join-recovery-codec.ts +2 -2
- package/src/runtime/foundation/durable-service-request.ts +137 -0
- package/src/runtime/foundation/operation-identity.ts +5 -1
- package/src/runtime/foundation/operation-registry.ts +98 -20
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +704 -336
- package/src/runtime/foundation/service-liveness-registry.ts +39 -0
- package/src/runtime/foundation/service-mailbox.ts +8 -0
- package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
- package/src/runtime/foundation/service-relocation-object-owner.ts +55 -36
- package/src/runtime/foundation/service-relocation-runtime.ts +25 -4
- package/src/runtime/foundation/service-runtime-contracts.ts +19 -2
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
- package/src/runtime/foundation/service-stateful-registry.ts +38 -35
- package/src/runtime/foundation/service-stateful-runtime.ts +732 -275
- package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -16
- package/src/runtime/foundation/service-topology-registry.ts +91 -36
- package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
- package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +231 -76
- package/src/runtime/handlers/handler-instance-scope.ts +67 -16
- package/src/runtime/host/actor-packet-relay.ts +113 -94
- package/src/runtime/host/actor-placement-coordinator.ts +31 -8
- package/src/runtime/host/actor-runtime-options-factory.ts +13 -2
- package/src/runtime/host/actor-transfer-runtime.ts +104 -430
- package/src/runtime/host/application-job-queue.ts +160 -41
- package/src/runtime/host/entry-actor-runtime.ts +4 -0
- package/src/runtime/host/index.ts +473 -271
- package/src/runtime/host/location-runtime-owner.ts +2 -6
- package/src/runtime/host/mesh-router-resolver.ts +13 -5
- package/src/runtime/host/remote-bound-session-relay.ts +88 -271
- package/src/runtime/host/route-mesh-runtime.ts +12 -6
- package/src/runtime/host/runtime-shutdown.ts +15 -4
- package/src/runtime/host/service-relocation-control.ts +11 -5
- package/src/runtime/host/service-relocation-host-runtime.ts +1092 -759
- package/src/runtime/host/spot-address-transport.ts +4 -2
- package/src/runtime/host/spot-runtime-options-factory.ts +20 -7
- package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
- package/src/runtime/locations/actor-location-claims.ts +52 -30
- package/src/runtime/locations/auto-connect-loop.ts +22 -14
- package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
- package/src/runtime/locations/auto-connect-types.ts +0 -1
- package/src/runtime/locations/descriptor-publication.ts +7 -0
- package/src/runtime/locations/domain-store-contract.ts +5 -0
- package/src/runtime/locations/in-memory-authority-store.ts +85 -23
- package/src/runtime/locations/in-memory-location-store.ts +1 -12
- package/src/runtime/locations/index.ts +1 -0
- package/src/runtime/locations/lease-tracker.ts +2 -9
- package/src/runtime/locations/lifecycle.ts +8 -26
- package/src/runtime/locations/location-store-repository.ts +628 -152
- package/src/runtime/locations/relocation-blob.ts +75 -1
- package/src/runtime/locations/request-source-resolver.ts +138 -0
- package/src/runtime/locations/resolvers.ts +2 -2
- package/src/runtime/locations/runtime.ts +98 -64
- package/src/runtime/messaging/framework-json-v1.ts +5 -325
- package/src/runtime/messaging/packet-name.ts +5 -25
- package/src/runtime/messaging/payload-codec.ts +8 -11
- package/src/runtime/messaging/request-result.ts +62 -0
- package/src/runtime/messaging/submission-result.ts +5 -1
- package/src/runtime/protocol/service_wire_codec.generated.ts +218 -5
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +16 -13
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +46 -25
- package/src/runtime/spots/index.ts +389 -283
- package/src/runtime/spots/spot-activation-registry.ts +25 -13
- package/src/runtime/spots/spot-activation-state.ts +12 -19
- package/src/runtime/spots/spot-activation.ts +198 -96
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
- package/src/runtime/spots/spot-actor-membership.ts +0 -15
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
- package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
- package/src/runtime/spots/spot-entry-activation.ts +33 -21
- package/src/runtime/spots/spot-handler-registry.ts +56 -12
- package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
- package/src/runtime/spots/spot-manager-public.ts +2 -2
- package/src/runtime/spots/spot-node-autoconnect.ts +28 -47
- package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
- package/src/runtime/spots/spot-outbound.ts +39 -19
- package/src/runtime/spots/spot-remote-codec.ts +9 -2
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +2 -1
- package/src/runtime/spots/spot-runtime-ports.ts +1 -1
- package/src/runtime/spots/spot-serial-executor.ts +97 -25
- package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
- package/src/runtime/spots/spot-subscription-dispatch.ts +1 -4
- package/src/runtime/spots/spot-timer.ts +418 -158
- package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
- package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
- package/src/runtime/streams/bound-session-service.ts +7 -10
- package/src/runtime/streams/index.ts +12 -6
- package/src/runtime/streams/managed-stream.ts +4 -2
- package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
- package/src/runtime/streams/session-actor-coordinator.ts +39 -88
- package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
- package/src/runtime/streams/stream-session-runtime.ts +13 -34
- package/src/runtime/workers/index.ts +1 -1
|
@@ -57,7 +57,6 @@ function createHandoffReplayGate() {
|
|
|
57
57
|
}
|
|
58
58
|
class ZLinkActorTransferRuntime {
|
|
59
59
|
options;
|
|
60
|
-
coreSourceLeaves = new Map();
|
|
61
60
|
// Spot Actor membership sections 4-5: Join completion idempotency is
|
|
62
61
|
// process-local. These maps end with the process; nothing is replayed.
|
|
63
62
|
activeDeferredJoinTerminals = new Map();
|
|
@@ -69,8 +68,15 @@ class ZLinkActorTransferRuntime {
|
|
|
69
68
|
const actorId = actor.context.actorId;
|
|
70
69
|
this.options.actorHandoff.beginProvisional(actorId, requireSourceObjectGeneration(actorId, state));
|
|
71
70
|
}
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
/** Relocation activation owns admission; handler terminals are observed independently. */
|
|
72
|
+
admitRelocationPrefix(actor, objectGeneration, packets, start, onResult) {
|
|
73
|
+
const manager = this.options.spotManager();
|
|
74
|
+
if (manager === undefined)
|
|
75
|
+
throw new Error('Relocated Actor has no local FIFO owner.');
|
|
76
|
+
const admitted = this.options.actorHandoff.admitTransferredPrefix(actor.context.actorId, objectGeneration, packets, (records) => manager.admitSourceActorPacketPrefix(actor.context.actorId, records), this.options.prepareApplicationJob, start, (packet, result) => {
|
|
77
|
+
void this.observeHandoffReplay(onResult(packet, result));
|
|
78
|
+
});
|
|
79
|
+
void this.observeHandoffReplay(admitted.terminal);
|
|
74
80
|
}
|
|
75
81
|
async completeDeferredActorHandoff(actor, target, _targetActorRef) {
|
|
76
82
|
const actorId = actor.context.actorId;
|
|
@@ -83,8 +89,8 @@ class ZLinkActorTransferRuntime {
|
|
|
83
89
|
const admitted = this.options.actorHandoff.admitDeferredPrefix(actorId, (drain) => manager.admitRoutedActorPacketPrefix(target.spotId, actorId, drain), this.options.prepareApplicationJob);
|
|
84
90
|
void this.observeHandoffReplay(admitted.terminal);
|
|
85
91
|
}
|
|
86
|
-
async cancelDeferredActorHandoff(actor,
|
|
87
|
-
const admitted = this.admitDeferredSourcePrefix(actor
|
|
92
|
+
async cancelDeferredActorHandoff(actor, _state) {
|
|
93
|
+
const admitted = this.admitDeferredSourcePrefix(actor);
|
|
88
94
|
void this.observeHandoffReplay(admitted.terminal);
|
|
89
95
|
}
|
|
90
96
|
prepareDeferredJoinAccepted(actorId, operationId, actorRef, rawReply, replyContentType) {
|
|
@@ -162,20 +168,7 @@ class ZLinkActorTransferRuntime {
|
|
|
162
168
|
}
|
|
163
169
|
await this.options.notifyEntrySpotActorLeft(actor, signal);
|
|
164
170
|
}
|
|
165
|
-
async
|
|
166
|
-
if (sourceSpotId !== undefined) {
|
|
167
|
-
const manager = this.options.spotManager();
|
|
168
|
-
if (manager !== undefined) {
|
|
169
|
-
await manager.restoreActorAfterFailedTransfer(sourceSpotId, actor, signal);
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
await this.options.restoreEntrySpotActorJoined(actor, signal);
|
|
174
|
-
}
|
|
175
|
-
async beginSourceActorMove(actor, state, deferredJoin = false) {
|
|
176
|
-
if (deferredJoin && this.options.actorHandoff.isProvisional(actor.context.actorId)) {
|
|
177
|
-
this.promoteDeferredActorHandoff(actor, state);
|
|
178
|
-
}
|
|
171
|
+
async beginSourceActorMove(actor, state) {
|
|
179
172
|
state.beginMove();
|
|
180
173
|
if (!this.options.actorHandoff.isActive(actor.context.actorId)) {
|
|
181
174
|
this.options.actorHandoff.begin(actor.context.actorId, requireSourceObjectGeneration(actor.context.actorId, state));
|
|
@@ -198,18 +191,12 @@ class ZLinkActorTransferRuntime {
|
|
|
198
191
|
}
|
|
199
192
|
}
|
|
200
193
|
catch (error) {
|
|
201
|
-
|
|
202
|
-
this.options.actorHandoff.cancel(actor.context.actorId);
|
|
203
|
-
}
|
|
204
|
-
else {
|
|
205
|
-
const admitted = this.admitDeferredSourcePrefix(actor, state);
|
|
206
|
-
void this.observeHandoffReplay(admitted.terminal);
|
|
207
|
-
}
|
|
194
|
+
this.options.actorHandoff.cancel(actor.context.actorId);
|
|
208
195
|
state.endMove();
|
|
209
196
|
throw error;
|
|
210
197
|
}
|
|
211
198
|
}
|
|
212
|
-
async cancelSourceActorMove(actor, state,
|
|
199
|
+
async cancelSourceActorMove(actor, state, replayStart = Promise.resolve()) {
|
|
213
200
|
try {
|
|
214
201
|
if (state.spotId !== undefined) {
|
|
215
202
|
await this.options.spotManager()?.cancelActorTransfer(state.spotId, actor.context.actorId);
|
|
@@ -217,38 +204,32 @@ class ZLinkActorTransferRuntime {
|
|
|
217
204
|
}
|
|
218
205
|
finally {
|
|
219
206
|
try {
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
void this.observeHandoffReplay(admitted.terminal);
|
|
223
|
-
}
|
|
224
|
-
else {
|
|
225
|
-
const admitted = this.admitDeferredSourcePrefix(actor, state, replayStart);
|
|
226
|
-
void this.observeHandoffReplay(admitted.terminal);
|
|
227
|
-
}
|
|
207
|
+
const admitted = this.admitCanceledSourcePrefix(actor, replayStart);
|
|
208
|
+
void this.observeHandoffReplay(admitted.terminal);
|
|
228
209
|
}
|
|
229
210
|
finally {
|
|
230
211
|
state.endMove();
|
|
231
212
|
}
|
|
232
213
|
}
|
|
233
214
|
}
|
|
234
|
-
admitCanceledSourcePrefix(actor,
|
|
215
|
+
admitCanceledSourcePrefix(actor, replayStart = Promise.resolve()) {
|
|
235
216
|
// The seal-era ingress hold returns to the source queue on a precommit
|
|
236
217
|
// abort. Rejection stays reserved for a source Actor whose dispatch is
|
|
237
218
|
// gone, because held packets then have no queue left to return to.
|
|
238
|
-
const
|
|
239
|
-
if (
|
|
219
|
+
const manager = this.options.spotManager();
|
|
220
|
+
if (manager === undefined) {
|
|
240
221
|
this.options.actorHandoff.cancel(actor.context.actorId);
|
|
241
222
|
return { terminal: Promise.resolve() };
|
|
242
223
|
}
|
|
243
|
-
return this.options.actorHandoff.admitCanceledPrefix(actor.context.actorId,
|
|
224
|
+
return this.options.actorHandoff.admitCanceledPrefix(actor.context.actorId, (records) => manager.admitSourceActorPacketPrefix(actor.context.actorId, records), this.options.prepareApplicationJob, replayStart);
|
|
244
225
|
}
|
|
245
|
-
admitDeferredSourcePrefix(actor,
|
|
246
|
-
const
|
|
247
|
-
if (
|
|
226
|
+
admitDeferredSourcePrefix(actor, replayStart = Promise.resolve()) {
|
|
227
|
+
const manager = this.options.spotManager();
|
|
228
|
+
if (manager === undefined) {
|
|
248
229
|
this.options.actorHandoff.cancel(actor.context.actorId);
|
|
249
230
|
return { terminal: Promise.resolve() };
|
|
250
231
|
}
|
|
251
|
-
return this.options.actorHandoff.admitDeferredPrefix(actor.context.actorId,
|
|
232
|
+
return this.options.actorHandoff.admitDeferredPrefix(actor.context.actorId, (records) => manager.admitSourceActorPacketPrefix(actor.context.actorId, records), this.options.prepareApplicationJob, replayStart);
|
|
252
233
|
}
|
|
253
234
|
async observeHandoffReplay(release) {
|
|
254
235
|
try {
|
|
@@ -266,175 +247,48 @@ class ZLinkActorTransferRuntime {
|
|
|
266
247
|
}
|
|
267
248
|
}
|
|
268
249
|
}
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
250
|
+
async prepareMaintenanceSession(actor, state, signal, manageMembership = true, relocation, relocationTarget) {
|
|
251
|
+
if ((0, diagnostics_1.isRelocationDebugEnabled)()) {
|
|
252
|
+
(0, diagnostics_1.relocationDebug)('maintenance_session.begin', {
|
|
253
|
+
actorId: actor.context.actorId,
|
|
254
|
+
spotId: state.spotId === undefined ? undefined : String(state.spotId)
|
|
255
|
+
});
|
|
274
256
|
}
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
257
|
+
// Relocation 04 §4.1: the Session owner seals a bound Actor's binding
|
|
258
|
+
// (command 42/43) before the source stops that Actor's application
|
|
259
|
+
// dispatch, so Session messages that arrive after the seal wait at the
|
|
260
|
+
// Session owner and never enter the source handoff backlog. A failed seal
|
|
261
|
+
// leaves the source dispatching; a dispatch stop that fails after the seal
|
|
262
|
+
// releases the matching seal with command 44 abort. The relocation
|
|
263
|
+
// operation owns this seal; the Actor keeps only its current binding
|
|
264
|
+
// (Session–Actor binding §8.1).
|
|
265
|
+
const bound = state.boundSession !== undefined;
|
|
266
|
+
const sealedSession = bound
|
|
267
|
+
? await this.sealBoundSessionRoute(actor, state, signal, relocation, relocationTarget)
|
|
268
|
+
: undefined;
|
|
287
269
|
try {
|
|
288
|
-
if (
|
|
289
|
-
|
|
290
|
-
this.options.actorHandoff.sealConnectionBoundIngress(actor.context.actorId);
|
|
270
|
+
if (manageMembership) {
|
|
271
|
+
await this.beginSourceActorMove(actor, state);
|
|
291
272
|
}
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
// (spec 28 §2 — direct transfer is the only handoff original).
|
|
296
|
-
relocationMetric?.recordBytes(transfer.state.toEncodedPayload().toBytes().byteLength);
|
|
297
|
-
if (lifecycleAuthority === 'framework') {
|
|
298
|
-
sourceLeaveStarted = true;
|
|
299
|
-
await this.prepareSourceActorLeave(actor, sourceSpotId, signal);
|
|
273
|
+
else {
|
|
274
|
+
state.beginMove();
|
|
275
|
+
this.options.actorHandoff.begin(actor.context.actorId, requireSourceObjectGeneration(actor.context.actorId, state));
|
|
300
276
|
}
|
|
301
|
-
const coreSourceLeave = lifecycleAuthority === 'core'
|
|
302
|
-
? this.beginCoreSourceLeave(actor.context.actorId)
|
|
303
|
-
: undefined;
|
|
304
|
-
const sourceLeaveCompletion = coreSourceLeave?.completion;
|
|
305
|
-
const handoffBacklog = lifecycleAuthority === 'core'
|
|
306
|
-
? this.options.actorHandoff.snapshotCoreBacklog(actor.context.actorId)
|
|
307
|
-
: this.options.actorHandoff.snapshot(actor.context.actorId);
|
|
308
|
-
let phase = 'prepared';
|
|
309
|
-
let committedTargetOwnerFence;
|
|
310
|
-
return {
|
|
311
|
-
...transfer,
|
|
312
|
-
handoffBacklog,
|
|
313
|
-
sourceLeaveCompletion,
|
|
314
|
-
sourceLeaveSubmitted: coreSourceLeave?.submitted,
|
|
315
|
-
onSourceLeaveSubmitted: (notify) => {
|
|
316
|
-
const pending = this.coreSourceLeaves.get(actor.context.actorId);
|
|
317
|
-
if (pending === undefined) {
|
|
318
|
-
throw new Error(`Actor '${actor.context.actorId}' has no pending Core source leave.`);
|
|
319
|
-
}
|
|
320
|
-
pending.notifySubmitted = notify;
|
|
321
|
-
},
|
|
322
|
-
observeTargetAuthority: async (target, targetActorRef, observeSignal) => {
|
|
323
|
-
const authority = this.options.authorityStore();
|
|
324
|
-
if (authority === undefined ||
|
|
325
|
-
target.targetOwnerId === undefined ||
|
|
326
|
-
target.ownerLeaseGeneration === undefined ||
|
|
327
|
-
target.targetNodeGeneration === undefined) {
|
|
328
|
-
throw new Error(`Actor '${actor.context.actorId}' relocation target has no complete authority fence.`);
|
|
329
|
-
}
|
|
330
|
-
const committed = await authority.readAuthority((0, authority_key_codec_1.encodeAuthorityKey)('actor', actor.context.actorId), observeSignal);
|
|
331
|
-
if (committed.kind !== 'snapshot' ||
|
|
332
|
-
committed.ownerId !== target.targetOwnerId ||
|
|
333
|
-
committed.ownerLeaseGeneration !== target.ownerLeaseGeneration ||
|
|
334
|
-
committed.allocation.descriptorLifecycleGeneration !== target.targetNodeGeneration ||
|
|
335
|
-
!(0, routing_id_1.routingIdsEqual)(committed.allocation.descriptor.rid, target.targetNodeRid) ||
|
|
336
|
-
committed.objectGeneration !== targetActorRef.objectGeneration) {
|
|
337
|
-
throw new Error(`Actor '${actor.context.actorId}' relocation target authority was not committed exactly.`);
|
|
338
|
-
}
|
|
339
|
-
committedTargetOwnerFence = committedActorOwnerFence(actor.context.actorId, targetActorRef, committed);
|
|
340
|
-
},
|
|
341
|
-
commit: (target, targetActorRef, results, releaseLocation = true) => {
|
|
342
|
-
if (phase !== 'prepared')
|
|
343
|
-
return;
|
|
344
|
-
if (committedTargetOwnerFence === undefined) {
|
|
345
|
-
throw new Error(`Actor '${actor.context.actorId}' handoff has no committed target authority fence.`);
|
|
346
|
-
}
|
|
347
|
-
phase = 'committed';
|
|
348
|
-
relocationMetric?.complete('completed');
|
|
349
|
-
try {
|
|
350
|
-
this.options.actorHandoff.complete(actor.context.actorId, target, targetActorRef, results, committedTargetOwnerFence);
|
|
351
|
-
}
|
|
352
|
-
catch (error) {
|
|
353
|
-
// The target has already committed. Local Message Follow setup is now
|
|
354
|
-
// post-commit work and must not turn the accepted transfer into a
|
|
355
|
-
// source rollback that can no longer undo the target.
|
|
356
|
-
this.options.reportPostCommitError?.(error);
|
|
357
|
-
}
|
|
358
|
-
finally {
|
|
359
|
-
const releaseSourceLocation = lifecycleAuthority === 'core' && releaseLocation;
|
|
360
|
-
if (releaseSourceLocation && sourceLeaveCompletion !== undefined) {
|
|
361
|
-
// Core sends the source leave control after the authority
|
|
362
|
-
// transition. Keep the source shell available for that
|
|
363
|
-
// callback, then release the old location and registry entry.
|
|
364
|
-
void sourceLeaveCompletion.then(() => this.scheduleSourceDeparture(actor, sourceSpotId, true), (error) => {
|
|
365
|
-
this.scheduleSourceDeparture(actor, sourceSpotId, true, [error]);
|
|
366
|
-
});
|
|
367
|
-
}
|
|
368
|
-
else {
|
|
369
|
-
this.scheduleSourceDeparture(actor, sourceSpotId, releaseSourceLocation);
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
},
|
|
373
|
-
rollback: async () => {
|
|
374
|
-
if (phase !== 'prepared')
|
|
375
|
-
return;
|
|
376
|
-
phase = 'rolledBack';
|
|
377
|
-
relocationMetric?.complete('aborted');
|
|
378
|
-
this.coreSourceLeaves.delete(actor.context.actorId);
|
|
379
|
-
const replayGate = createHandoffReplayGate();
|
|
380
|
-
try {
|
|
381
|
-
await this.cancelSourceActorMove(actor, state, deferredJoin, replayGate.start);
|
|
382
|
-
await this.restoreSourceActor(actor, sourceSpotId);
|
|
383
|
-
if (sealedSession !== undefined) {
|
|
384
|
-
await this.observeBoundSessionSealAbort(actor, state, sealedSession);
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
finally {
|
|
388
|
-
replayGate.open();
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
};
|
|
392
277
|
}
|
|
393
278
|
catch (error) {
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
try {
|
|
397
|
-
await this.cancelSourceActorMove(actor, state, deferredJoin, replayGate.start);
|
|
398
|
-
if (sourceLeaveStarted)
|
|
399
|
-
await this.restoreSourceActor(actor, sourceSpotId);
|
|
400
|
-
if (sealedSession !== undefined) {
|
|
401
|
-
await this.observeBoundSessionSealAbort(actor, state, sealedSession);
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
catch (rollbackError) {
|
|
405
|
-
throw new AggregateError([error, rollbackError], 'Actor source leave and rollback both failed.');
|
|
406
|
-
}
|
|
407
|
-
finally {
|
|
408
|
-
replayGate.open();
|
|
279
|
+
if (sealedSession !== undefined) {
|
|
280
|
+
await this.observeBoundSessionSealAbort(actor, state, sealedSession);
|
|
409
281
|
}
|
|
410
282
|
throw error;
|
|
411
283
|
}
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
if ((0, diagnostics_1.isRelocationDebugEnabled)()) {
|
|
415
|
-
(0, diagnostics_1.relocationDebug)('maintenance_session.begin', {
|
|
416
|
-
actorId: actor.context.actorId,
|
|
417
|
-
spotId: state.spotId === undefined ? undefined : String(state.spotId)
|
|
418
|
-
});
|
|
419
|
-
}
|
|
420
|
-
if (manageMembership) {
|
|
421
|
-
await this.beginSourceActorMove(actor, state);
|
|
422
|
-
}
|
|
423
|
-
else {
|
|
424
|
-
state.beginMove();
|
|
425
|
-
this.options.actorHandoff.begin(actor.context.actorId, requireSourceObjectGeneration(actor.context.actorId, state));
|
|
426
|
-
}
|
|
284
|
+
if (bound)
|
|
285
|
+
this.options.actorHandoff.sealConnectionBoundIngress(actor.context.actorId);
|
|
427
286
|
if ((0, diagnostics_1.isRelocationDebugEnabled)()) {
|
|
428
287
|
(0, diagnostics_1.relocationDebug)('maintenance_session.source_move_complete', {
|
|
429
288
|
actorId: actor.context.actorId
|
|
430
289
|
});
|
|
431
290
|
}
|
|
432
|
-
let sealedSession;
|
|
433
291
|
try {
|
|
434
|
-
if (state.boundSession !== undefined) {
|
|
435
|
-
sealedSession = await this.sealBoundSessionRoute(actor, state, signal, relocation);
|
|
436
|
-
this.options.actorHandoff.sealConnectionBoundIngress(actor.context.actorId);
|
|
437
|
-
}
|
|
438
292
|
const handoffBacklog = this.options.actorHandoff.snapshot(actor.context.actorId);
|
|
439
293
|
let terminal = 'prepared';
|
|
440
294
|
let replayResults = [];
|
|
@@ -492,11 +346,11 @@ class ZLinkActorTransferRuntime {
|
|
|
492
346
|
const replayGate = createHandoffReplayGate();
|
|
493
347
|
try {
|
|
494
348
|
if (manageMembership) {
|
|
495
|
-
await this.cancelSourceActorMove(actor, state,
|
|
349
|
+
await this.cancelSourceActorMove(actor, state, replayGate.start);
|
|
496
350
|
}
|
|
497
351
|
else {
|
|
498
352
|
try {
|
|
499
|
-
const admitted = this.admitCanceledSourcePrefix(actor,
|
|
353
|
+
const admitted = this.admitCanceledSourcePrefix(actor, replayGate.start);
|
|
500
354
|
void this.observeHandoffReplay(admitted.terminal);
|
|
501
355
|
}
|
|
502
356
|
finally {
|
|
@@ -519,14 +373,14 @@ class ZLinkActorTransferRuntime {
|
|
|
519
373
|
try {
|
|
520
374
|
if (manageMembership) {
|
|
521
375
|
try {
|
|
522
|
-
await this.cancelSourceActorMove(actor, state,
|
|
376
|
+
await this.cancelSourceActorMove(actor, state, replayGate.start);
|
|
523
377
|
sourceRestored = true;
|
|
524
378
|
}
|
|
525
379
|
catch { }
|
|
526
380
|
}
|
|
527
381
|
else {
|
|
528
382
|
try {
|
|
529
|
-
const admitted = this.admitCanceledSourcePrefix(actor,
|
|
383
|
+
const admitted = this.admitCanceledSourcePrefix(actor, replayGate.start);
|
|
530
384
|
void this.observeHandoffReplay(admitted.terminal);
|
|
531
385
|
sourceRestored = true;
|
|
532
386
|
}
|
|
@@ -548,39 +402,6 @@ class ZLinkActorTransferRuntime {
|
|
|
548
402
|
throw error;
|
|
549
403
|
}
|
|
550
404
|
}
|
|
551
|
-
async notifyCoreSourceLeave(actor, callback) {
|
|
552
|
-
const pending = this.coreSourceLeaves.get(actor.context.actorId);
|
|
553
|
-
let callbackResult;
|
|
554
|
-
try {
|
|
555
|
-
callbackResult = Promise.resolve(callback());
|
|
556
|
-
}
|
|
557
|
-
catch (error) {
|
|
558
|
-
callbackResult = Promise.reject(error);
|
|
559
|
-
}
|
|
560
|
-
// Submission, not the callback result, releases the target Join. Observe
|
|
561
|
-
// a fast rejection while the submission ACK is in flight without making
|
|
562
|
-
// that rejection an unhandled promise.
|
|
563
|
-
void callbackResult.catch(() => { });
|
|
564
|
-
try {
|
|
565
|
-
if (pending !== undefined) {
|
|
566
|
-
if (pending.notifySubmitted === undefined) {
|
|
567
|
-
throw new Error(`Actor '${actor.context.actorId}' has no Core source leave submission notifier.`);
|
|
568
|
-
}
|
|
569
|
-
await pending.notifySubmitted();
|
|
570
|
-
pending.resolveSubmitted();
|
|
571
|
-
}
|
|
572
|
-
await callbackResult;
|
|
573
|
-
pending?.resolve();
|
|
574
|
-
}
|
|
575
|
-
catch (error) {
|
|
576
|
-
pending?.rejectSubmitted(error);
|
|
577
|
-
pending?.reject(error);
|
|
578
|
-
throw error;
|
|
579
|
-
}
|
|
580
|
-
finally {
|
|
581
|
-
this.coreSourceLeaves.delete(actor.context.actorId);
|
|
582
|
-
}
|
|
583
|
-
}
|
|
584
405
|
async completeRelocationSourceLeave(actor, sourceSpotId, signal) {
|
|
585
406
|
await this.prepareSourceActorLeave(actor, sourceSpotId, signal);
|
|
586
407
|
}
|
|
@@ -590,13 +411,16 @@ class ZLinkActorTransferRuntime {
|
|
|
590
411
|
relayCanonicalMaintenanceTerminal(operationId, replyRouteId, result, sourceNodeRid, targetAuthorityOwnerGeneration) {
|
|
591
412
|
return this.options.actorHandoff.acceptRelocatedTerminalRelay(operationId, replyRouteId, undefined, result, sourceNodeRid, targetAuthorityOwnerGeneration);
|
|
592
413
|
}
|
|
593
|
-
async sealBoundSessionRoute(actor, state, signal, relocation) {
|
|
414
|
+
async sealBoundSessionRoute(actor, state, signal, relocation, relocationTarget) {
|
|
594
415
|
const target = state.boundSession;
|
|
595
416
|
const actorRef = state.nativeActorRef;
|
|
596
417
|
if (target === undefined ||
|
|
597
418
|
actorRef === undefined ||
|
|
598
419
|
target.bindingGeneration === undefined ||
|
|
599
420
|
target.bindingGeneration <= 0n ||
|
|
421
|
+
target.sessionOwnerNodeGeneration === undefined ||
|
|
422
|
+
target.sessionOwnerId === undefined ||
|
|
423
|
+
target.sessionOwnerLeaseGeneration === undefined ||
|
|
600
424
|
state.locationGeneration === undefined ||
|
|
601
425
|
state.locationGeneration < 0n ||
|
|
602
426
|
state.ownerLeaseGeneration === undefined ||
|
|
@@ -605,48 +429,47 @@ class ZLinkActorTransferRuntime {
|
|
|
605
429
|
}
|
|
606
430
|
const serviceWire = this.options.sessionRelocationWire?.();
|
|
607
431
|
const authorityStore = this.options.authorityStore();
|
|
608
|
-
const descriptors = this.options.liveDescriptors;
|
|
609
432
|
if (relocation === undefined ||
|
|
433
|
+
relocationTarget === undefined ||
|
|
610
434
|
serviceWire === undefined ||
|
|
611
435
|
authorityStore === undefined ||
|
|
612
|
-
descriptors === undefined ||
|
|
613
436
|
target.sessionRid === undefined) {
|
|
614
437
|
throw new Error(`Actor '${actor.context.actorId}' Session relocation requires the command 42/43 service-wire path.`);
|
|
615
438
|
}
|
|
616
|
-
const
|
|
617
|
-
authorityStore.readAuthority((0, authority_key_codec_1.encodeAuthorityKey)('actor', actor.context.actorId), signal),
|
|
618
|
-
descriptors(target.routerChannelId, signal)
|
|
619
|
-
]);
|
|
439
|
+
const authority = await authorityStore.readAuthority((0, authority_key_codec_1.encodeAuthorityKey)('actor', actor.context.actorId), signal);
|
|
620
440
|
const local = this.options.primaryMeshNode().status();
|
|
621
|
-
const sessionOwner = live.find((value) => String(value.rid) === String(target.targetNodeRid));
|
|
622
441
|
if (authority.kind !== 'snapshot' ||
|
|
623
|
-
|
|
624
|
-
String(local.routingId) !== String(actorRef.nodeRid) ||
|
|
442
|
+
!(0, routing_id_1.routingIdsEqual)(local.routingId, actorRef.nodeRid) ||
|
|
625
443
|
authority.objectGeneration !== actorRef.generation ||
|
|
626
444
|
authority.authorityOwnerGeneration !== state.locationGeneration ||
|
|
627
445
|
authority.ownerLeaseGeneration !== state.ownerLeaseGeneration ||
|
|
628
|
-
|
|
446
|
+
!(0, routing_id_1.routingIdsEqual)(authority.allocation.descriptor.rid, actorRef.nodeRid) ||
|
|
629
447
|
authority.allocation.descriptorLifecycleGeneration !== local.lifecycleGeneration ||
|
|
630
448
|
(target.sessionNodeRid !== undefined &&
|
|
631
|
-
|
|
449
|
+
!(0, routing_id_1.routingIdsEqual)(target.sessionNodeRid, target.targetNodeRid))) {
|
|
632
450
|
throw new Error(`Actor '${actor.context.actorId}' Session route service-wire source fence is stale.`);
|
|
633
451
|
}
|
|
452
|
+
const sourceNodeRid = local.routingId;
|
|
634
453
|
const coordinator = {
|
|
635
454
|
ownerId: authority.ownerId,
|
|
636
455
|
leaseGeneration: authority.ownerLeaseGeneration,
|
|
637
|
-
nodeRid:
|
|
456
|
+
nodeRid: sourceNodeRid,
|
|
638
457
|
nodeGeneration: local.lifecycleGeneration,
|
|
639
458
|
expectedAuthorityStoreVersion: authority.storeVersion.value
|
|
640
459
|
};
|
|
460
|
+
// Session-Actor binding §4: command 42 carries the Session owner identity
|
|
461
|
+
// stored at bind unchanged.
|
|
641
462
|
const session = {
|
|
642
|
-
sessionOwnerNodeRid:
|
|
643
|
-
sessionOwnerNodeGeneration:
|
|
644
|
-
sessionOwnerId:
|
|
645
|
-
sessionOwnerLeaseGeneration:
|
|
646
|
-
sessionRid:
|
|
463
|
+
sessionOwnerNodeRid: target.targetNodeRid,
|
|
464
|
+
sessionOwnerNodeGeneration: target.sessionOwnerNodeGeneration,
|
|
465
|
+
sessionOwnerId: target.sessionOwnerId,
|
|
466
|
+
sessionOwnerLeaseGeneration: target.sessionOwnerLeaseGeneration,
|
|
467
|
+
sessionRid: target.sessionRid,
|
|
647
468
|
bindingGeneration: target.bindingGeneration
|
|
648
469
|
};
|
|
649
470
|
const request = {
|
|
471
|
+
targetNodeRid: relocationTarget.rid,
|
|
472
|
+
targetNodeGeneration: relocationTarget.lifecycleGeneration,
|
|
650
473
|
relocation,
|
|
651
474
|
coordinator,
|
|
652
475
|
senderRole: 'source',
|
|
@@ -654,7 +477,7 @@ class ZLinkActorTransferRuntime {
|
|
|
654
477
|
actor: {
|
|
655
478
|
actorId: actor.context.actorId,
|
|
656
479
|
generation: actorRef.generation,
|
|
657
|
-
nodeRid:
|
|
480
|
+
nodeRid: sourceNodeRid
|
|
658
481
|
},
|
|
659
482
|
targetNodeGeneration: local.lifecycleGeneration,
|
|
660
483
|
authorityOwnerGeneration: authority.authorityOwnerGeneration,
|
|
@@ -662,7 +485,9 @@ class ZLinkActorTransferRuntime {
|
|
|
662
485
|
},
|
|
663
486
|
session
|
|
664
487
|
};
|
|
665
|
-
await serviceWire.requestSessionRelocationSeal(target.routerChannelId, target.targetNodeRid, request, signal);
|
|
488
|
+
const response = await serviceWire.requestSessionRelocationSeal(target.routerChannelId, target.targetNodeRid, request, signal);
|
|
489
|
+
if (response.sealResult === 'bindingAbsent')
|
|
490
|
+
return undefined;
|
|
666
491
|
return {
|
|
667
492
|
...target,
|
|
668
493
|
previousAuthorityOwnerGeneration: authority.authorityOwnerGeneration,
|
|
@@ -691,7 +516,7 @@ class ZLinkActorTransferRuntime {
|
|
|
691
516
|
actor: {
|
|
692
517
|
actorId: actor.context.actorId,
|
|
693
518
|
generation: actorRef.generation,
|
|
694
|
-
nodeRid:
|
|
519
|
+
nodeRid: actorRef.nodeRid
|
|
695
520
|
},
|
|
696
521
|
session: serviceFence.session,
|
|
697
522
|
route: {
|
|
@@ -717,78 +542,6 @@ class ZLinkActorTransferRuntime {
|
|
|
717
542
|
}
|
|
718
543
|
}
|
|
719
544
|
}
|
|
720
|
-
beginCoreSourceLeave(actorId) {
|
|
721
|
-
let resolve;
|
|
722
|
-
let reject;
|
|
723
|
-
const promise = new Promise((accept, fail) => {
|
|
724
|
-
resolve = accept;
|
|
725
|
-
reject = fail;
|
|
726
|
-
});
|
|
727
|
-
let resolveSubmitted;
|
|
728
|
-
let rejectSubmitted;
|
|
729
|
-
const submitted = new Promise((accept, fail) => {
|
|
730
|
-
resolveSubmitted = accept;
|
|
731
|
-
rejectSubmitted = fail;
|
|
732
|
-
});
|
|
733
|
-
void promise.catch(() => { });
|
|
734
|
-
void submitted.catch(() => { });
|
|
735
|
-
this.coreSourceLeaves.set(actorId, {
|
|
736
|
-
promise,
|
|
737
|
-
resolve,
|
|
738
|
-
reject,
|
|
739
|
-
submitted,
|
|
740
|
-
resolveSubmitted,
|
|
741
|
-
rejectSubmitted
|
|
742
|
-
});
|
|
743
|
-
return { completion: promise, submitted };
|
|
744
|
-
}
|
|
745
|
-
scheduleSourceDeparture(actor, sourceSpotId, releaseLocation, failures = []) {
|
|
746
|
-
void this.finishSourceDeparture(actor, sourceSpotId, releaseLocation, failures);
|
|
747
|
-
}
|
|
748
|
-
async finishSourceDeparture(actor, sourceSpotId, releaseLocation, failures) {
|
|
749
|
-
if (sourceSpotId !== undefined) {
|
|
750
|
-
try {
|
|
751
|
-
await this.options
|
|
752
|
-
.spotManager()
|
|
753
|
-
?.commitActorLeaveAfterTransfer(sourceSpotId, actor.context.actorId);
|
|
754
|
-
}
|
|
755
|
-
catch (error) {
|
|
756
|
-
failures.push(error);
|
|
757
|
-
}
|
|
758
|
-
}
|
|
759
|
-
if (releaseLocation) {
|
|
760
|
-
try {
|
|
761
|
-
const state = this.options.actorManager()?.getState(actor.context.actorId);
|
|
762
|
-
if (state?.actorType !== undefined && state.ownsLocation) {
|
|
763
|
-
await this.options
|
|
764
|
-
.locationLifecycle()
|
|
765
|
-
?.releaseActor(state.actorType, actor.context.actorId);
|
|
766
|
-
state.markLocationReleased();
|
|
767
|
-
}
|
|
768
|
-
}
|
|
769
|
-
catch (error) {
|
|
770
|
-
failures.push(error);
|
|
771
|
-
}
|
|
772
|
-
}
|
|
773
|
-
try {
|
|
774
|
-
// Message Follow keeps its route separately from the retired application instance.
|
|
775
|
-
await this.options.actorManager()?.completeCoreRelocationSource(actor.context.actorId);
|
|
776
|
-
}
|
|
777
|
-
catch (error) {
|
|
778
|
-
failures.push(error);
|
|
779
|
-
}
|
|
780
|
-
try {
|
|
781
|
-
this.options.onSourceDepartureCompleted?.(actor.context.actorId);
|
|
782
|
-
}
|
|
783
|
-
catch (error) {
|
|
784
|
-
failures.push(error);
|
|
785
|
-
}
|
|
786
|
-
if (failures.length > 0) {
|
|
787
|
-
this.options.reportPostCommitError?.(failures.length === 1
|
|
788
|
-
? failures[0]
|
|
789
|
-
: new AggregateError(failures, 'Actor source retirement failed.'));
|
|
790
|
-
}
|
|
791
|
-
}
|
|
792
545
|
async getOrCreateRoutedActor(actorId, actorType, actorRef, remoteBoundSessionTarget, actorCreateRequest, signal) {
|
|
793
546
|
const actorManager = this.requireActorManager('Routed actor join requires ZLINK_ACTOR_MANAGER.');
|
|
794
547
|
const actor = actorRef === undefined
|
|
@@ -1018,7 +771,7 @@ class ZLinkActorTransferRuntime {
|
|
|
1018
771
|
?.readAuthority((0, authority_key_codec_1.encodeAuthorityKey)('actor', actor.context.actorId));
|
|
1019
772
|
if (authority?.kind === 'snapshot' &&
|
|
1020
773
|
authority.allocation.state === 'active' &&
|
|
1021
|
-
|
|
774
|
+
(0, routing_id_1.routingIdsEqual)(authority.allocation.descriptor.rid, node.status().routingId) &&
|
|
1022
775
|
authority.allocation.descriptorLifecycleGeneration === ownerNodeGeneration) {
|
|
1023
776
|
state.setLocationGeneration(authority.authorityOwnerGeneration);
|
|
1024
777
|
state.setOwnerLeaseGeneration(authority.ownerLeaseGeneration);
|
|
@@ -1141,9 +894,10 @@ class ZLinkActorTransferRuntime {
|
|
|
1141
894
|
authority.objectGeneration !== actorRef.generation ||
|
|
1142
895
|
authority.authorityOwnerGeneration !== ownershipGeneration ||
|
|
1143
896
|
authority.ownerLeaseGeneration !== targetOwnerLeaseGeneration ||
|
|
1144
|
-
|
|
897
|
+
!(0, routing_id_1.routingIdsEqual)(authority.allocation.descriptor.rid, actorRef.nodeRid)) {
|
|
1145
898
|
throw new Error(`Actor '${actorId}' command 44 target authority fence is stale.`);
|
|
1146
899
|
}
|
|
900
|
+
const targetNodeRid = actorRef.nodeRid;
|
|
1147
901
|
await serviceWire.sendSessionRelocationRoute(target.routerChannelId, target.targetNodeRid, {
|
|
1148
902
|
relocation: serviceFence.relocation,
|
|
1149
903
|
coordinator: serviceFence.coordinator,
|
|
@@ -1151,14 +905,14 @@ class ZLinkActorTransferRuntime {
|
|
|
1151
905
|
actor: {
|
|
1152
906
|
actorId,
|
|
1153
907
|
generation: actorRef.generation,
|
|
1154
|
-
nodeRid:
|
|
908
|
+
nodeRid: targetNodeRid
|
|
1155
909
|
},
|
|
1156
910
|
session: serviceFence.session,
|
|
1157
911
|
route: {
|
|
1158
912
|
action: 'commit',
|
|
1159
913
|
previousAuthorityOwnerGeneration: target.previousAuthorityOwnerGeneration,
|
|
1160
914
|
targetAuthorityOwnerGeneration: ownershipGeneration,
|
|
1161
|
-
targetNodeRid
|
|
915
|
+
targetNodeRid,
|
|
1162
916
|
targetNodeGeneration: authority.allocation.descriptorLifecycleGeneration,
|
|
1163
917
|
targetOwnerLeaseGeneration: authority.ownerLeaseGeneration
|
|
1164
918
|
}
|