@zlink-systems/framework 0.26.0 → 0.27.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/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Common/CoreTypes.d.ts +6 -0
- package/dist/contracts/Common/CoreTypes.js +7 -0
- package/dist/contracts/Common/index.d.ts +1 -1
- package/dist/contracts/Common/index.js +0 -1
- package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
- package/dist/contracts/Configuration/InternalDefaults.js +9 -1
- package/dist/contracts/Configuration/Registration.d.ts +13 -2
- package/dist/contracts/Configuration/Registration.js +58 -36
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
- package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
- package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
- package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
- package/dist/contracts/Handlers/JsonContract.js +10 -4
- package/dist/contracts/Locations/Authority.d.ts +1 -1
- package/dist/contracts/Locations/Authority.js +3 -2
- package/dist/contracts/Locations/Options.js +1 -1
- package/dist/contracts/Locations/Stores.d.ts +12 -0
- package/dist/contracts/Locations/Stores.js +9 -0
- package/dist/contracts/Spots/Contracts.d.ts +1 -1
- package/dist/internal.d.ts +4 -0
- package/dist/internal.js +15 -1
- package/dist/nest-integration.d.ts +4 -2
- package/dist/nest-integration.js +14 -4
- package/dist/runtime/abort.d.ts +1 -0
- package/dist/runtime/abort.js +8 -5
- package/dist/runtime/activation-admission.d.ts +1 -2
- package/dist/runtime/activation-admission.js +2 -6
- package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
- package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
- package/dist/runtime/actors/actor-client.d.ts +2 -2
- package/dist/runtime/actors/actor-client.js +42 -143
- package/dist/runtime/actors/actor-context.d.ts +3 -5
- package/dist/runtime/actors/actor-context.js +13 -11
- package/dist/runtime/actors/actor-handoff.d.ts +4 -4
- package/dist/runtime/actors/actor-handoff.js +8 -8
- package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
- package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
- package/dist/runtime/actors/actor-local-native-join.js +83 -105
- package/dist/runtime/actors/actor-native-lookup.js +2 -8
- package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
- package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
- package/dist/runtime/actors/actor-remote-joiner.d.ts +1 -1
- package/dist/runtime/actors/actor-remote-joiner.js +5 -9
- package/dist/runtime/actors/actor-remote-wire.js +5 -3
- package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
- package/dist/runtime/actors/actor-request-deadline.js +31 -0
- package/dist/runtime/actors/actor-retry-delay.js +2 -1
- package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
- package/dist/runtime/actors/actor-runtime-state.js +70 -187
- package/dist/runtime/actors/bound-session-wire.js +2 -7
- package/dist/runtime/actors/deferred-join-completion.d.ts +11 -6
- package/dist/runtime/actors/deferred-join-completion.js +1 -0
- package/dist/runtime/actors/index.d.ts +9 -7
- package/dist/runtime/actors/index.js +87 -69
- package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
- package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
- package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
- package/dist/runtime/admission.d.ts +2 -0
- package/dist/runtime/admission.js +7 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
- package/dist/runtime/backend/contracts/index.d.ts +6 -23
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +1 -17
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
- package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +1 -1
- package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -6
- package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
- package/dist/runtime/backend/node/node-event-loop-poller.js +6 -7
- package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
- package/dist/runtime/backend/node/node-raw-binding-port.js +40 -16
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +14 -15
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +146 -118
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +3 -2
- package/dist/runtime/backend/raw-binding-port.d.ts +1 -1
- package/dist/runtime/backend/runtime-values.d.ts +4 -1
- package/dist/runtime/backend/runtime-values.js +2 -0
- package/dist/runtime/channels/channel-clients.d.ts +20 -8
- package/dist/runtime/channels/channel-clients.js +68 -52
- package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
- package/dist/runtime/channels/channel-envelope.js +47 -29
- package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
- package/dist/runtime/channels/channel-outbound-operations.js +9 -10
- package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
- package/dist/runtime/channels/channel-receive-loops.js +27 -6
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
- package/dist/runtime/channels/channel-runtime-manager.js +5 -2
- package/dist/runtime/channels/channel-socket-options.js +3 -2
- package/dist/runtime/channels/channel-socket-registry.d.ts +14 -29
- package/dist/runtime/channels/channel-socket-registry.js +248 -174
- package/dist/runtime/channels/channel-transports.d.ts +11 -17
- package/dist/runtime/channels/channel-transports.js +68 -47
- package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/client-server-location-runtime.js +10 -11
- package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
- package/dist/runtime/channels/client-server-service-wire.js +32 -11
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
- package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
- package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
- package/dist/runtime/channels/fanout-location-runtime.js +130 -72
- package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
- package/dist/runtime/channels/spot-direct-envelope.js +4 -3
- package/dist/runtime/channels/spot-node-route-transport.js +3 -2
- package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
- package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
- package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
- package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
- package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
- package/dist/runtime/diagnostics/flow-context.js +16 -2
- package/dist/runtime/diagnostics/index.d.ts +4 -2
- package/dist/runtime/diagnostics/index.js +14 -4
- package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
- package/dist/runtime/diagnostics/message-flow.js +10 -19
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
- package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
- package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
- package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
- package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
- package/dist/runtime/disposal.d.ts +5 -0
- package/dist/runtime/disposal.js +22 -0
- package/dist/runtime/execution/index.d.ts +12 -9
- package/dist/runtime/execution/index.js +58 -14
- package/dist/runtime/execution/serial-execution-queue.d.ts +8 -2
- package/dist/runtime/execution/serial-execution-queue.js +54 -15
- package/dist/runtime/execution/state-lane.d.ts +8 -1
- package/dist/runtime/execution/state-lane.js +118 -3
- package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
- package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
- package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
- package/dist/runtime/foundation/event-loop-resources.js +6 -119
- package/dist/runtime/foundation/operation-identity.d.ts +2 -0
- package/dist/runtime/foundation/operation-identity.js +9 -5
- package/dist/runtime/foundation/operation-registry.d.ts +5 -7
- package/dist/runtime/foundation/operation-registry.js +34 -44
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +8 -5
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +62 -83
- package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
- package/dist/runtime/foundation/runtime-state-projections.js +8 -0
- package/dist/runtime/foundation/service-authority-payload-codec.js +22 -12
- package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
- package/dist/runtime/foundation/service-discovery-registry.js +22 -3
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
- package/dist/runtime/foundation/service-liveness-registry.js +2 -1
- package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
- package/dist/runtime/foundation/service-maintenance-runtime.js +0 -6
- package/dist/runtime/foundation/service-metadata-codec.js +3 -3
- package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
- package/dist/runtime/foundation/service-relocation-object-owner.js +3 -2
- package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
- package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -12
- package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
- package/dist/runtime/foundation/service-stateful-registry.js +10 -2
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +26 -25
- package/dist/runtime/foundation/service-stateful-runtime.js +217 -204
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -3
- package/dist/runtime/foundation/service-stateful-wire-codec.js +89 -55
- package/dist/runtime/foundation/service-topology-registry.d.ts +0 -1
- package/dist/runtime/foundation/service-topology-registry.js +17 -32
- package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
- package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
- package/dist/runtime/foundation/service-wire-codec.js +10 -8
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
- package/dist/runtime/framework-errors-internal.d.ts +2 -1
- package/dist/runtime/framework-errors-internal.js +343 -122
- package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
- package/dist/runtime/handlers/handler-instance-scope.js +61 -74
- package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
- package/dist/runtime/host/actor-packet-relay.js +48 -91
- package/dist/runtime/host/actor-placement-coordinator.js +7 -5
- package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
- package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
- package/dist/runtime/host/actor-transfer-runtime.d.ts +16 -18
- package/dist/runtime/host/actor-transfer-runtime.js +143 -176
- package/dist/runtime/host/application-job-queue.js +16 -33
- package/dist/runtime/host/bound-session-relay.js +1 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
- package/dist/runtime/host/index.d.ts +14 -13
- package/dist/runtime/host/index.js +190 -157
- package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
- package/dist/runtime/host/instance-activation-authority.js +17 -45
- package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
- package/dist/runtime/host/location-runtime-owner.js +2 -2
- package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
- package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
- package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
- package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
- package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
- package/dist/runtime/host/remote-bound-session-relay.js +7 -20
- package/dist/runtime/host/route-mesh-runtime.d.ts +13 -11
- package/dist/runtime/host/route-mesh-runtime.js +171 -252
- package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
- package/dist/runtime/host/runtime-shutdown.js +18 -21
- package/dist/runtime/host/service-relocation-control.js +6 -1
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +21 -30
- package/dist/runtime/host/service-relocation-host-runtime.js +508 -416
- package/dist/runtime/host/spot-address-transport.d.ts +2 -3
- package/dist/runtime/host/spot-address-transport.js +34 -136
- package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
- package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
- package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -10
- package/dist/runtime/host/spot-runtime-options-factory.js +50 -14
- package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -3
- package/dist/runtime/host/user-spot-creation-coordinator.js +11 -8
- package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
- package/dist/runtime/locations/authority-key-codec.js +4 -3
- package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
- package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
- package/dist/runtime/locations/creation-operation-id.js +6 -4
- package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
- package/dist/runtime/locations/in-memory-authority-store.js +31 -15
- package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
- package/dist/runtime/locations/in-memory-location-store.js +17 -14
- package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
- package/dist/runtime/locations/in-memory-provider-location-store.js +72 -22
- package/dist/runtime/locations/key-codec.js +3 -2
- package/dist/runtime/locations/lease-tracker.d.ts +3 -5
- package/dist/runtime/locations/lease-tracker.js +7 -11
- package/dist/runtime/locations/lifecycle.d.ts +4 -9
- package/dist/runtime/locations/lifecycle.js +2 -31
- package/dist/runtime/locations/location-store-failure.d.ts +2 -0
- package/dist/runtime/locations/location-store-failure.js +7 -0
- package/dist/runtime/locations/location-store-pages.d.ts +3 -0
- package/dist/runtime/locations/location-store-pages.js +13 -0
- package/dist/runtime/locations/location-store-repository.d.ts +5 -7
- package/dist/runtime/locations/location-store-repository.js +303 -332
- package/dist/runtime/locations/relocation-blob.js +18 -5
- package/dist/runtime/locations/resolvers.d.ts +5 -5
- package/dist/runtime/locations/resolvers.js +37 -28
- package/dist/runtime/locations/runtime.d.ts +5 -4
- package/dist/runtime/locations/runtime.js +123 -92
- package/dist/runtime/locations/spot-location-claims.d.ts +6 -0
- package/dist/runtime/locations/spot-location-claims.js +42 -1
- package/dist/runtime/messaging/payload-codec.js +26 -20
- package/dist/runtime/messaging/submission-result.d.ts +3 -0
- package/dist/runtime/messaging/submission-result.js +48 -0
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +1 -0
- package/dist/runtime/protocol/service_wire_codec.generated.js +12 -7
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +4 -1
- package/dist/runtime/spots/index.d.ts +14 -20
- package/dist/runtime/spots/index.js +302 -176
- package/dist/runtime/spots/spot-activation-registry.d.ts +3 -5
- package/dist/runtime/spots/spot-activation-registry.js +14 -50
- package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
- package/dist/runtime/spots/spot-activation-state.js +2 -2
- package/dist/runtime/spots/spot-activation.d.ts +3 -4
- package/dist/runtime/spots/spot-activation.js +49 -32
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
- package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
- package/dist/runtime/spots/spot-actor-join-dispatch.js +4 -52
- package/dist/runtime/spots/spot-actor-membership.d.ts +4 -6
- package/dist/runtime/spots/spot-actor-membership.js +22 -45
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
- package/dist/runtime/spots/spot-context.d.ts +2 -2
- package/dist/runtime/spots/spot-entry-activation.d.ts +2 -2
- package/dist/runtime/spots/spot-entry-activation.js +9 -20
- package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
- package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
- package/dist/runtime/spots/spot-manager-public.js +5 -4
- package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -18
- package/dist/runtime/spots/spot-node-runtime-manager.js +67 -72
- package/dist/runtime/spots/spot-outbound.d.ts +4 -3
- package/dist/runtime/spots/spot-outbound.js +9 -8
- package/dist/runtime/spots/spot-remote-codec.js +5 -3
- package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
- package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
- package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
- package/dist/runtime/spots/spot-route-replies.js +3 -1
- package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -3
- package/dist/runtime/spots/spot-routed-actor-admission.js +3 -12
- package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +1 -2
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +0 -1
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
- package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -16
- package/dist/runtime/spots/spot-serial-executor.js +2 -2
- package/dist/runtime/spots/spot-serial-turn-executor.d.ts +27 -7
- package/dist/runtime/spots/spot-serial-turn-executor.js +83 -11
- package/dist/runtime/spots/spot-timer.d.ts +3 -2
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +16 -29
- package/dist/runtime/streams/actor-session-binding-registry.js +142 -212
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +1 -4
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
- package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
- package/dist/runtime/streams/bound-session-service.d.ts +7 -0
- package/dist/runtime/streams/bound-session-service.js +11 -1
- package/dist/runtime/streams/index.d.ts +14 -15
- package/dist/runtime/streams/index.js +20 -21
- package/dist/runtime/streams/managed-stream.d.ts +3 -0
- package/dist/runtime/streams/managed-stream.js +17 -8
- package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
- package/dist/runtime/streams/protocol.d.ts +6 -33
- package/dist/runtime/streams/protocol.js +38 -110
- package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
- package/dist/runtime/streams/session-actor-coordinator.js +12 -4
- package/dist/runtime/streams/session-calls.d.ts +1 -1
- package/dist/runtime/streams/session-calls.js +5 -4
- package/dist/runtime/streams/session-context.d.ts +6 -6
- package/dist/runtime/streams/session-context.js +22 -4
- package/dist/runtime/streams/session-requests.js +2 -1
- package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
- package/dist/runtime/streams/stream-frame-factory.js +2 -2
- package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
- package/dist/runtime/streams/stream-session-runtime.js +25 -33
- package/dist/runtime/workers/index.d.ts +2 -2
- package/dist/runtime/workers/index.js +5 -4
- package/package.json +3 -3
- package/src/contracts/Common/CoreTypes.ts +7 -0
- package/src/contracts/Common/index.ts +1 -1
- package/src/contracts/Configuration/InternalDefaults.ts +12 -0
- package/src/contracts/Configuration/Registration.ts +92 -48
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
- package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
- package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
- package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
- package/src/contracts/Handlers/JsonContract.ts +14 -4
- package/src/contracts/Locations/Authority.ts +7 -3
- package/src/contracts/Locations/Options.ts +1 -1
- package/src/contracts/Locations/Stores.ts +14 -0
- package/src/contracts/Spots/Contracts.ts +1 -1
- package/src/internal.ts +14 -0
- package/src/nest-integration.ts +28 -10
- package/src/runtime/abort.ts +6 -5
- package/src/runtime/activation-admission.ts +2 -8
- package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
- package/src/runtime/actors/actor-client.ts +77 -204
- package/src/runtime/actors/actor-context.ts +39 -33
- package/src/runtime/actors/actor-handoff.ts +24 -22
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
- package/src/runtime/actors/actor-local-native-join.ts +172 -174
- package/src/runtime/actors/actor-native-lookup.ts +2 -9
- package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
- package/src/runtime/actors/actor-remote-joiner.ts +9 -11
- package/src/runtime/actors/actor-remote-wire.ts +5 -3
- package/src/runtime/actors/actor-request-deadline.ts +49 -0
- package/src/runtime/actors/actor-retry-delay.ts +2 -1
- package/src/runtime/actors/actor-runtime-state.ts +85 -247
- package/src/runtime/actors/bound-session-wire.ts +2 -8
- package/src/runtime/actors/deferred-join-completion.ts +10 -6
- package/src/runtime/actors/index.ts +100 -79
- package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
- package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
- package/src/runtime/admission.ts +8 -1
- package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
- package/src/runtime/backend/contracts/index.ts +13 -29
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +2 -18
- package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
- package/src/runtime/backend/node/node-backend-adapter-support.ts +23 -6
- package/src/runtime/backend/node/node-event-loop-poller.ts +8 -12
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
- package/src/runtime/backend/node/node-raw-binding-port.ts +41 -20
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +227 -170
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +3 -2
- package/src/runtime/backend/raw-binding-port.ts +1 -1
- package/src/runtime/backend/runtime-values.ts +4 -1
- package/src/runtime/channels/channel-clients.ts +132 -85
- package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
- package/src/runtime/channels/channel-envelope.ts +58 -29
- package/src/runtime/channels/channel-outbound-operations.ts +10 -23
- package/src/runtime/channels/channel-receive-loops.ts +39 -7
- package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
- package/src/runtime/channels/channel-runtime-manager.ts +6 -2
- package/src/runtime/channels/channel-socket-options.ts +8 -2
- package/src/runtime/channels/channel-socket-registry.ts +301 -192
- package/src/runtime/channels/channel-transports.ts +161 -112
- package/src/runtime/channels/client-server-location-runtime.ts +17 -17
- package/src/runtime/channels/client-server-service-wire.ts +40 -12
- package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
- package/src/runtime/channels/fanout-location-runtime.ts +172 -91
- package/src/runtime/channels/spot-direct-envelope.ts +1 -1
- package/src/runtime/channels/spot-node-route-transport.ts +5 -2
- package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
- package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
- package/src/runtime/diagnostics/flow-context.ts +16 -2
- package/src/runtime/diagnostics/index.ts +27 -17
- package/src/runtime/diagnostics/message-flow.ts +15 -25
- package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
- package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
- package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
- package/src/runtime/disposal.ts +19 -0
- package/src/runtime/execution/index.ts +60 -20
- package/src/runtime/execution/serial-execution-queue.ts +131 -18
- package/src/runtime/execution/state-lane.ts +142 -4
- package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
- package/src/runtime/foundation/event-loop-resources.ts +5 -122
- package/src/runtime/foundation/operation-identity.ts +11 -5
- package/src/runtime/foundation/operation-registry.ts +33 -50
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +110 -111
- package/src/runtime/foundation/runtime-state-projections.ts +9 -1
- package/src/runtime/foundation/service-authority-payload-codec.ts +31 -13
- package/src/runtime/foundation/service-discovery-registry.ts +32 -3
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
- package/src/runtime/foundation/service-liveness-registry.ts +2 -1
- package/src/runtime/foundation/service-maintenance-runtime.ts +0 -10
- package/src/runtime/foundation/service-metadata-codec.ts +2 -2
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
- package/src/runtime/foundation/service-relocation-object-owner.ts +5 -2
- package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
- package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -17
- package/src/runtime/foundation/service-stateful-registry.ts +14 -2
- package/src/runtime/foundation/service-stateful-runtime.ts +322 -276
- package/src/runtime/foundation/service-stateful-wire-codec.ts +128 -80
- package/src/runtime/foundation/service-topology-registry.ts +23 -32
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
- package/src/runtime/foundation/service-wire-codec.ts +15 -8
- package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
- package/src/runtime/framework-errors-internal.ts +380 -134
- package/src/runtime/handlers/handler-instance-scope.ts +68 -95
- package/src/runtime/host/actor-packet-relay.ts +57 -147
- package/src/runtime/host/actor-placement-coordinator.ts +8 -5
- package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
- package/src/runtime/host/actor-transfer-runtime.ts +180 -260
- package/src/runtime/host/application-job-queue.ts +28 -34
- package/src/runtime/host/bound-session-relay.ts +1 -2
- package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
- package/src/runtime/host/index.ts +327 -296
- package/src/runtime/host/instance-activation-authority.ts +89 -109
- package/src/runtime/host/location-runtime-owner.ts +4 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
- package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
- package/src/runtime/host/remote-bound-session-relay.ts +8 -41
- package/src/runtime/host/route-mesh-runtime.ts +228 -271
- package/src/runtime/host/runtime-shutdown.ts +17 -21
- package/src/runtime/host/service-relocation-control.ts +14 -1
- package/src/runtime/host/service-relocation-host-runtime.ts +699 -561
- package/src/runtime/host/spot-address-transport.ts +73 -195
- package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
- package/src/runtime/host/spot-runtime-options-factory.ts +73 -22
- package/src/runtime/host/user-spot-creation-coordinator.ts +36 -22
- package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
- package/src/runtime/locations/authority-key-codec.ts +7 -3
- package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
- package/src/runtime/locations/creation-operation-id.ts +6 -3
- package/src/runtime/locations/domain-store-contract.ts +12 -3
- package/src/runtime/locations/in-memory-authority-store.ts +44 -15
- package/src/runtime/locations/in-memory-location-store.ts +50 -39
- package/src/runtime/locations/in-memory-provider-location-store.ts +100 -25
- package/src/runtime/locations/key-codec.ts +3 -2
- package/src/runtime/locations/lease-tracker.ts +8 -14
- package/src/runtime/locations/lifecycle.ts +13 -43
- package/src/runtime/locations/location-store-failure.ts +4 -0
- package/src/runtime/locations/location-store-pages.ts +18 -0
- package/src/runtime/locations/location-store-repository.ts +450 -478
- package/src/runtime/locations/relocation-blob.ts +17 -6
- package/src/runtime/locations/resolvers.ts +75 -49
- package/src/runtime/locations/runtime.ts +220 -110
- package/src/runtime/locations/spot-location-claims.ts +58 -1
- package/src/runtime/messaging/payload-codec.ts +35 -24
- package/src/runtime/messaging/submission-result.ts +57 -1
- package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +4 -1
- package/src/runtime/spots/index.ts +433 -229
- package/src/runtime/spots/spot-activation-registry.ts +30 -69
- package/src/runtime/spots/spot-activation-state.ts +2 -2
- package/src/runtime/spots/spot-activation.ts +67 -37
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
- package/src/runtime/spots/spot-actor-join-dispatch.ts +24 -77
- package/src/runtime/spots/spot-actor-membership.ts +40 -72
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
- package/src/runtime/spots/spot-context.ts +3 -3
- package/src/runtime/spots/spot-entry-activation.ts +13 -30
- package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
- package/src/runtime/spots/spot-manager-public.ts +21 -17
- package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
- package/src/runtime/spots/spot-node-runtime-manager.ts +136 -125
- package/src/runtime/spots/spot-outbound.ts +45 -23
- package/src/runtime/spots/spot-remote-codec.ts +7 -3
- package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
- package/src/runtime/spots/spot-route-replies.ts +6 -4
- package/src/runtime/spots/spot-routed-actor-admission.ts +13 -26
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +2 -3
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
- package/src/runtime/spots/spot-runtime-ports.ts +5 -27
- package/src/runtime/spots/spot-serial-executor.ts +2 -2
- package/src/runtime/spots/spot-serial-turn-executor.ts +112 -11
- package/src/runtime/spots/spot-timer.ts +3 -2
- package/src/runtime/streams/actor-session-binding-registry.ts +179 -269
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +0 -8
- package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
- package/src/runtime/streams/bound-session-service.ts +21 -1
- package/src/runtime/streams/index.ts +76 -64
- package/src/runtime/streams/managed-stream.ts +29 -10
- package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
- package/src/runtime/streams/protocol.ts +34 -88
- package/src/runtime/streams/session-actor-coordinator.ts +17 -5
- package/src/runtime/streams/session-calls.ts +6 -5
- package/src/runtime/streams/session-context.ts +54 -10
- package/src/runtime/streams/session-requests.ts +2 -1
- package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
- package/src/runtime/streams/stream-frame-factory.ts +2 -3
- package/src/runtime/streams/stream-session-runtime.ts +57 -59
- package/src/runtime/workers/index.ts +13 -12
- package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
- package/dist/runtime/actors/post-commit-actor-location.js +0 -72
- package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
- package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
- package/src/runtime/actors/post-commit-actor-location.ts +0 -121
- package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
|
@@ -2,24 +2,31 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ServiceStatefulRuntime = exports.ServiceInstanceActivationRedirectError = void 0;
|
|
4
4
|
exports.statefulMailboxData = statefulMailboxData;
|
|
5
|
+
const stream_wire_1 = require("@zlink-systems/stream-wire");
|
|
5
6
|
const node_async_hooks_1 = require("node:async_hooks");
|
|
7
|
+
const contracts_1 = require("../../contracts");
|
|
8
|
+
const service_authority_payload_codec_1 = require("./service-authority-payload-codec");
|
|
9
|
+
const ZLinkDispatchOptions_1 = require("../../contracts/Dispatch/ZLinkDispatchOptions");
|
|
6
10
|
const abort_1 = require("../abort");
|
|
7
|
-
const
|
|
8
|
-
const framework_errors_internal_1 = require("../framework-errors-internal");
|
|
11
|
+
const admission_1 = require("../admission");
|
|
9
12
|
const runtime_values_1 = require("../backend/runtime-values");
|
|
10
|
-
const ZLinkDispatchOptions_1 = require("../../contracts/Dispatch/ZLinkDispatchOptions");
|
|
11
13
|
const message_flow_1 = require("../diagnostics/message-flow");
|
|
12
|
-
const
|
|
14
|
+
const execution_1 = require("../execution");
|
|
15
|
+
const framework_errors_internal_1 = require("../framework-errors-internal");
|
|
16
|
+
const service_wire_pilot_codec_generated_1 = require("../protocol/service_wire_pilot_codec.generated");
|
|
17
|
+
const actor_join_recovery_codec_1 = require("./actor-join-recovery-codec");
|
|
18
|
+
const operation_registry_1 = require("./operation-registry");
|
|
13
19
|
const message_follow_suppression_registry_1 = require("./message-follow-suppression-registry");
|
|
20
|
+
const operation_identity_1 = require("./operation-identity");
|
|
21
|
+
const service_metadata_codec_1 = require("./service-metadata-codec");
|
|
22
|
+
const service_runtime_contracts_1 = require("./service-runtime-contracts");
|
|
14
23
|
const service_stateful_registry_1 = require("./service-stateful-registry");
|
|
15
24
|
const service_stateful_wire_codec_1 = require("./service-stateful-wire-codec");
|
|
16
|
-
const
|
|
17
|
-
const
|
|
25
|
+
const service_wire_binary_primitives_1 = require("./service-wire-binary-primitives");
|
|
26
|
+
const service_wire_constants_generated_1 = require("./service-wire-constants.generated");
|
|
18
27
|
const service_wire_m6a_codec_1 = require("./service-wire-m6a-codec");
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
const Locations_1 = require("../../contracts/Locations");
|
|
22
|
-
const ACTOR_ROUTE_STALE = 21;
|
|
28
|
+
const STATEFUL_OPERATION_RETRY_TICK_MS = 20;
|
|
29
|
+
const MAX_NODE_TIMER_DELAY_MS = 2_147_483_647;
|
|
23
30
|
const SPOT_MOVING = 34;
|
|
24
31
|
const USER_SPOT_OPERATION_CAPACITY = 65_536;
|
|
25
32
|
const USER_SPOT_OPERATION_REPLAY_RETENTION_MS = 5 * 60_000;
|
|
@@ -47,7 +54,7 @@ class ServiceStatefulRuntime {
|
|
|
47
54
|
// behaves exactly like a frame arriving from the receive pump.
|
|
48
55
|
static detachedIngressScope = node_async_hooks_1.AsyncLocalStorage.snapshot();
|
|
49
56
|
registry;
|
|
50
|
-
operations
|
|
57
|
+
operations;
|
|
51
58
|
sessionDeliveries = new Map();
|
|
52
59
|
/**
|
|
53
60
|
* A local Actor owner can replace its own session binding before the
|
|
@@ -59,7 +66,6 @@ class ServiceStatefulRuntime {
|
|
|
59
66
|
subscriptions = new Map();
|
|
60
67
|
instanceIntents = new Map();
|
|
61
68
|
admittedInstanceOperations = new Map();
|
|
62
|
-
pendingInstanceTerminals = new Map();
|
|
63
69
|
pendingInstanceAuthorityTerminals = new Map();
|
|
64
70
|
instanceApplicationWaiters = new Map();
|
|
65
71
|
canonicalActorJoinHandoffs = new Map();
|
|
@@ -84,22 +90,19 @@ class ServiceStatefulRuntime {
|
|
|
84
90
|
messageFollowHandler;
|
|
85
91
|
mailboxDropHandler;
|
|
86
92
|
dispatchErrors;
|
|
87
|
-
spotAdmissionProvider;
|
|
88
93
|
dispatchErrorMeshName;
|
|
89
94
|
admittedUserSpotOperations = new Map();
|
|
90
95
|
pendingInstanceActivations = new Map();
|
|
91
96
|
closed = false;
|
|
92
|
-
constructor(raw, nodeRid, nodeGeneration) {
|
|
97
|
+
constructor(raw, nodeRid, nodeGeneration, onPendingOperationsChanged) {
|
|
93
98
|
this.raw = raw;
|
|
94
99
|
this.nodeRid = nodeRid;
|
|
95
100
|
this.nodeGeneration = nodeGeneration;
|
|
101
|
+
this.operations = new service_stateful_registry_1.ServiceTerminalOperationRegistry(new operation_registry_1.OperationRegistry(undefined, onPendingOperationsChanged));
|
|
96
102
|
this.registry = new service_stateful_registry_1.ServiceStatefulRegistry(nodeRid, nodeGeneration);
|
|
97
103
|
this.registry.createEntrySpot(nodeRid);
|
|
98
104
|
raw.setServiceIngress((record) => this.ingress(record));
|
|
99
105
|
}
|
|
100
|
-
setSpotAdmissionProvider(provider) {
|
|
101
|
-
this.spotAdmissionProvider = provider;
|
|
102
|
-
}
|
|
103
106
|
setMailboxDropHandler(handler) {
|
|
104
107
|
this.mailboxDropHandler = handler;
|
|
105
108
|
}
|
|
@@ -361,6 +364,7 @@ class ServiceStatefulRuntime {
|
|
|
361
364
|
...(envelope.replyRouteId === undefined ? {} : { replyRouteId: envelope.replyRouteId })
|
|
362
365
|
};
|
|
363
366
|
const applicationJobOwner = await this.raw.reserveLocalIngress();
|
|
367
|
+
const terminal = this.activationTerminalCompletion(target, route);
|
|
364
368
|
try {
|
|
365
369
|
const admitted = this.enqueueActivatedInstanceSpot({
|
|
366
370
|
command: service_stateful_wire_codec_1.M6bServiceWireCommand.instanceSpot,
|
|
@@ -370,9 +374,9 @@ class ServiceStatefulRuntime {
|
|
|
370
374
|
(0, service_stateful_wire_codec_1.encodeInstanceSpotActivationHeader)(target, envelope.sourceNodeGeneration, envelope.sourceNodeRid, envelope.sourceSpotId, envelope.operationKind, envelope.operation, envelope.deadlineUnixMs, envelope.replyRouteId, envelope.metadataFrame !== undefined)
|
|
371
375
|
],
|
|
372
376
|
applicationJobOwner
|
|
373
|
-
}, record, Buffer.from(envelope.applicationPayloadFrame), spot, undefined,
|
|
377
|
+
}, record, Buffer.from(envelope.applicationPayloadFrame), spot, undefined, terminal.onTerminalCompletion, envelope.metadataFrame === undefined
|
|
374
378
|
? undefined
|
|
375
|
-
: (0, service_metadata_codec_1.validateServiceMetadataFrame)(envelope.metadataFrame),
|
|
379
|
+
: (0, service_metadata_codec_1.validateServiceMetadataFrame)(envelope.metadataFrame), terminal.onHandlerTurnStarted, this.instanceApplicationTarget(record, route.objectGeneration));
|
|
376
380
|
if (admitted !== 'application') {
|
|
377
381
|
throw new Error('Recovered Instance activation was not admitted to the local queue.');
|
|
378
382
|
}
|
|
@@ -441,10 +445,10 @@ class ServiceStatefulRuntime {
|
|
|
441
445
|
}
|
|
442
446
|
return released;
|
|
443
447
|
}
|
|
448
|
+
/** Resolves once every first terminal record of an activated Instance message is durable. */
|
|
444
449
|
waitForInstanceApplicationQuiescence(spotId, signal) {
|
|
445
450
|
const key = String(spotId);
|
|
446
|
-
if ((this.
|
|
447
|
-
(this.pendingInstanceAuthorityTerminals.get(key) ?? 0) === 0) {
|
|
451
|
+
if ((this.pendingInstanceAuthorityTerminals.get(key) ?? 0) === 0) {
|
|
448
452
|
return Promise.resolve();
|
|
449
453
|
}
|
|
450
454
|
if (signal?.aborted === true) {
|
|
@@ -658,7 +662,11 @@ class ServiceStatefulRuntime {
|
|
|
658
662
|
reporter.report({
|
|
659
663
|
surface: ZLinkDispatchOptions_1.ZLinkDispatchErrorSurface.SpotRoute,
|
|
660
664
|
messageKind: ZLinkDispatchOptions_1.ZLinkDispatchMessageKind.Send,
|
|
661
|
-
reason:
|
|
665
|
+
reason: this.closed
|
|
666
|
+
? ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.Shutdown
|
|
667
|
+
: this.raw.isPeerRouteReady(target.descriptor.nodeRoutingId)
|
|
668
|
+
? ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.Backpressure
|
|
669
|
+
: ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.StaleTarget,
|
|
662
670
|
action: ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop,
|
|
663
671
|
meshName: this.dispatchErrorMeshName,
|
|
664
672
|
channelName,
|
|
@@ -684,10 +692,7 @@ class ServiceStatefulRuntime {
|
|
|
684
692
|
const pending = this.operations.register(timeoutMs);
|
|
685
693
|
const target = this.acceptSpotAuthority(requested);
|
|
686
694
|
if (target === undefined) {
|
|
687
|
-
this.operations.reply(pending.id,
|
|
688
|
-
terminalResult: runtime_values_1.RequestResult.NotFound,
|
|
689
|
-
failureCode: ACTOR_ROUTE_STALE
|
|
690
|
-
});
|
|
695
|
+
this.operations.reply(pending.id, (0, framework_errors_internal_1.internalFrameworkWireReply)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale));
|
|
691
696
|
return pending;
|
|
692
697
|
}
|
|
693
698
|
const header = (0, service_stateful_wire_codec_1.encodeSpotHeader)('spotRequest', sourceSpotId, target, pending.id, {
|
|
@@ -713,10 +718,7 @@ class ServiceStatefulRuntime {
|
|
|
713
718
|
const pending = this.operations.register(timeoutMs);
|
|
714
719
|
const route = this.tryActorFence(target);
|
|
715
720
|
if (route === undefined) {
|
|
716
|
-
this.operations.reply(pending.id,
|
|
717
|
-
terminalResult: runtime_values_1.RequestResult.NotFound,
|
|
718
|
-
failureCode: ACTOR_ROUTE_STALE
|
|
719
|
-
});
|
|
721
|
+
this.operations.reply(pending.id, (0, framework_errors_internal_1.internalFrameworkWireReply)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale));
|
|
720
722
|
return pending;
|
|
721
723
|
}
|
|
722
724
|
const header = (0, service_stateful_wire_codec_1.encodeActorHeader)('actorRequest', route, pending.id, sourceActor, boundSession === undefined
|
|
@@ -728,9 +730,9 @@ class ServiceStatefulRuntime {
|
|
|
728
730
|
this.submitRequest(pending, target.nodeRid, [header, (0, service_wire_m6a_codec_1.encodeApplicationPayload)(payload)], timeoutMs, 'actorRequest');
|
|
729
731
|
return pending;
|
|
730
732
|
}
|
|
731
|
-
async sendToInstanceSpot(route, payload, sourceSpotId, metadataFrame) {
|
|
733
|
+
async sendToInstanceSpot(route, payload, sourceSpotId, metadataFrame, instanceIntent = false) {
|
|
732
734
|
return this.submitOneWay(route.targetNodeRid, instanceOperationParts([
|
|
733
|
-
(0, service_stateful_wire_codec_1.encodeInstanceSpotHeader)(route, this.nodeGeneration, this.nodeRid, sourceSpotId, 'send', { high: 0n, low: 0n }, undefined, metadataFrame !== undefined),
|
|
735
|
+
(0, service_stateful_wire_codec_1.encodeInstanceSpotHeader)(route, this.nodeGeneration, this.nodeRid, sourceSpotId, 'send', { high: 0n, low: 0n }, undefined, metadataFrame !== undefined, instanceIntent),
|
|
734
736
|
(0, service_wire_m6a_codec_1.encodeApplicationPayload)(payload)
|
|
735
737
|
], metadataFrame));
|
|
736
738
|
}
|
|
@@ -744,10 +746,10 @@ class ServiceStatefulRuntime {
|
|
|
744
746
|
payloadFrame
|
|
745
747
|
], metadataFrame));
|
|
746
748
|
}
|
|
747
|
-
requestToInstanceSpot(route, payload, timeoutMs, sourceSpotId, metadataFrame) {
|
|
749
|
+
requestToInstanceSpot(route, payload, timeoutMs, sourceSpotId, metadataFrame, instanceIntent = false) {
|
|
748
750
|
const pending = this.operations.register(timeoutMs);
|
|
749
751
|
this.submitRequest(pending, route.targetNodeRid, instanceOperationParts([
|
|
750
|
-
(0, service_stateful_wire_codec_1.encodeInstanceSpotHeader)(route, this.nodeGeneration, this.nodeRid, sourceSpotId, 'request', { high:
|
|
752
|
+
(0, service_stateful_wire_codec_1.encodeInstanceSpotHeader)(route, this.nodeGeneration, this.nodeRid, sourceSpotId, 'request', { high: operation_identity_1.ZLINK_NATIVE_CORRELATION_OPERATION_NAMESPACE, low: pending.id }, pending.id, metadataFrame !== undefined, instanceIntent),
|
|
751
753
|
(0, service_wire_m6a_codec_1.encodeApplicationPayload)(payload)
|
|
752
754
|
], metadataFrame), timeoutMs, 'instanceSpotRequest');
|
|
753
755
|
return pending;
|
|
@@ -852,7 +854,7 @@ class ServiceStatefulRuntime {
|
|
|
852
854
|
});
|
|
853
855
|
return pending;
|
|
854
856
|
}
|
|
855
|
-
bindSession(sessionRid, actor, timeoutMs, deliver, onBindingReplaced,
|
|
857
|
+
bindSession(sessionRid, actor, timeoutMs, deliver, onBindingReplaced, actorAuthority) {
|
|
856
858
|
const deadlineMs = performance.now() + timeoutMs;
|
|
857
859
|
const pending = this.operations.register(timeoutMs, 'sender');
|
|
858
860
|
const generation = this.nextSessionSequence++;
|
|
@@ -869,7 +871,6 @@ class ServiceStatefulRuntime {
|
|
|
869
871
|
const delivery = {
|
|
870
872
|
binding: localBinding,
|
|
871
873
|
deliver,
|
|
872
|
-
...(bindingIngress === undefined ? {} : { bindingIngress }),
|
|
873
874
|
...(onBindingReplaced === undefined ? {} : { onBindingReplaced })
|
|
874
875
|
};
|
|
875
876
|
const deliveryKey = actorKey(actor);
|
|
@@ -977,10 +978,7 @@ class ServiceStatefulRuntime {
|
|
|
977
978
|
if (delivery === undefined ||
|
|
978
979
|
delivery.binding.sessionRid !== sessionRid ||
|
|
979
980
|
delivery.binding.bindingGeneration !== expectedBindingGeneration) {
|
|
980
|
-
this.operations.reply(pending.id,
|
|
981
|
-
terminalResult: runtime_values_1.RequestResult.NotFound,
|
|
982
|
-
failureCode: ACTOR_ROUTE_STALE
|
|
983
|
-
});
|
|
981
|
+
this.operations.reply(pending.id, (0, framework_errors_internal_1.internalFrameworkWireReply)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale));
|
|
984
982
|
return pending;
|
|
985
983
|
}
|
|
986
984
|
this.sessionDeliveries.delete(actorKey(actor));
|
|
@@ -1004,7 +1002,16 @@ class ServiceStatefulRuntime {
|
|
|
1004
1002
|
sessionBindings(sessionRid) {
|
|
1005
1003
|
return [...this.sessionDeliveries.values()]
|
|
1006
1004
|
.map((value) => value.binding)
|
|
1007
|
-
.filter((binding) => binding.sessionRid === sessionRid)
|
|
1005
|
+
.filter((binding) => binding.sessionRid === sessionRid)
|
|
1006
|
+
.map((binding) => {
|
|
1007
|
+
const owner = requireSessionOwnerIdentity(binding);
|
|
1008
|
+
return {
|
|
1009
|
+
...binding,
|
|
1010
|
+
sessionOwnerNodeGeneration: owner.nodeGeneration,
|
|
1011
|
+
sessionOwnerId: owner.ownerId,
|
|
1012
|
+
sessionOwnerLeaseGeneration: owner.leaseGeneration
|
|
1013
|
+
};
|
|
1014
|
+
});
|
|
1008
1015
|
}
|
|
1009
1016
|
allSessionBindings() {
|
|
1010
1017
|
return [...this.sessionDeliveries.values()].map((value) => value.binding);
|
|
@@ -1028,8 +1035,10 @@ class ServiceStatefulRuntime {
|
|
|
1028
1035
|
try {
|
|
1029
1036
|
binding = this.registry.validateBoundSession(actor, expectedBindingGeneration);
|
|
1030
1037
|
}
|
|
1031
|
-
catch {
|
|
1032
|
-
|
|
1038
|
+
catch (error) {
|
|
1039
|
+
if (error instanceof service_stateful_registry_1.ServiceStaleGenerationError)
|
|
1040
|
+
return runtime_values_1.SubmitResult.NotFound;
|
|
1041
|
+
throw error;
|
|
1033
1042
|
}
|
|
1034
1043
|
const actorFence = this.tryActorFence(actor);
|
|
1035
1044
|
if (actorFence === undefined)
|
|
@@ -1040,26 +1049,21 @@ class ServiceStatefulRuntime {
|
|
|
1040
1049
|
(0, service_wire_m6a_codec_1.encodeApplicationPayload)(payload)
|
|
1041
1050
|
]);
|
|
1042
1051
|
}
|
|
1052
|
+
expireOperations(nowMs, turnDeadlineMs) {
|
|
1053
|
+
return this.operations.expire(nowMs, turnDeadlineMs);
|
|
1054
|
+
}
|
|
1055
|
+
get pendingOperationCount() {
|
|
1056
|
+
return this.operations.size;
|
|
1057
|
+
}
|
|
1043
1058
|
close() {
|
|
1044
1059
|
if (this.closed)
|
|
1045
1060
|
return;
|
|
1046
1061
|
this.closed = true;
|
|
1047
1062
|
this.operations.close();
|
|
1048
|
-
const clearedActors = new Set();
|
|
1049
|
-
for (const deliveries of [this.sessionDeliveries, this.retiredSessionDeliveries]) {
|
|
1050
|
-
for (const delivery of deliveries.values()) {
|
|
1051
|
-
const actorId = delivery.binding.actor.actorId;
|
|
1052
|
-
if (clearedActors.has(actorId))
|
|
1053
|
-
continue;
|
|
1054
|
-
clearedActors.add(actorId);
|
|
1055
|
-
delivery.bindingIngress?.clearOutbound(actorId, new Error(`Actor '${actorId}' Session service closed with retained outbound delivery.`));
|
|
1056
|
-
}
|
|
1057
|
-
}
|
|
1058
1063
|
this.sessionDeliveries.clear();
|
|
1059
1064
|
this.retiredSessionDeliveries.clear();
|
|
1060
1065
|
this.appliedReplacementNotices.clear();
|
|
1061
1066
|
this.instanceIntents.clear();
|
|
1062
|
-
this.pendingInstanceTerminals.clear();
|
|
1063
1067
|
this.pendingInstanceAuthorityTerminals.clear();
|
|
1064
1068
|
for (const waiters of this.instanceApplicationWaiters.values()) {
|
|
1065
1069
|
for (const waiter of waiters)
|
|
@@ -1173,6 +1177,21 @@ class ServiceStatefulRuntime {
|
|
|
1173
1177
|
if (kind === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestTargetNotFound ||
|
|
1174
1178
|
kind === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving ||
|
|
1175
1179
|
kind === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotGenerationStale) {
|
|
1180
|
+
const reporter = this.dispatchErrors;
|
|
1181
|
+
if (decoded.kind === 'instanceSpot' && reporter?.captureEnabled() === true) {
|
|
1182
|
+
reporter.report({
|
|
1183
|
+
surface: ZLinkDispatchOptions_1.ZLinkDispatchErrorSurface.InstanceSpot,
|
|
1184
|
+
messageKind: ZLinkDispatchOptions_1.ZLinkDispatchMessageKind.Send,
|
|
1185
|
+
reason: ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.StaleTarget,
|
|
1186
|
+
action: ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop,
|
|
1187
|
+
meshName: this.dispatchErrorMeshName,
|
|
1188
|
+
sourceRid: decoded.sourceNodeRid,
|
|
1189
|
+
spotId: decoded.activation === 'ready'
|
|
1190
|
+
? decoded.route.targetSpotId
|
|
1191
|
+
: decoded.target.targetSpotId,
|
|
1192
|
+
error
|
|
1193
|
+
});
|
|
1194
|
+
}
|
|
1176
1195
|
return 'protocolError';
|
|
1177
1196
|
}
|
|
1178
1197
|
}
|
|
@@ -1224,8 +1243,6 @@ class ServiceStatefulRuntime {
|
|
|
1224
1243
|
}
|
|
1225
1244
|
case 'spotSend':
|
|
1226
1245
|
case 'spotRequest': {
|
|
1227
|
-
await this.spotAdmissionProvider?.awaitCloseDecision?.(record.target.spot.spotId);
|
|
1228
|
-
this.requireDirectSpotAdmission(record.target.spot.spotId);
|
|
1229
1246
|
const followed = this.holdOrRelaySpotMessage(ingress, record);
|
|
1230
1247
|
if (followed !== undefined)
|
|
1231
1248
|
return followed;
|
|
@@ -1344,15 +1361,9 @@ class ServiceStatefulRuntime {
|
|
|
1344
1361
|
targetSpotId: record.route.targetSpotId,
|
|
1345
1362
|
stableType: intent.instanceType
|
|
1346
1363
|
};
|
|
1347
|
-
// A close seals execution only after the current application count reaches
|
|
1348
|
-
// zero. A new Instance message must wait for that close even while the old
|
|
1349
|
-
// activation is still materialized; otherwise it can be admitted after
|
|
1350
|
-
// the close quiescence check and be removed with the old activation.
|
|
1351
|
-
if (lifecycle.isClosing?.(applicationTarget) === true)
|
|
1352
|
-
return true;
|
|
1353
1364
|
return !lifecycle.isMaterialized(applicationTarget);
|
|
1354
1365
|
}
|
|
1355
|
-
enqueueActivatedInstanceSpot(ingress, record, payloadFrame, spot, localReply, onTerminalCompletion, metadataFrame,
|
|
1366
|
+
enqueueActivatedInstanceSpot(ingress, record, payloadFrame, spot, localReply, onTerminalCompletion, metadataFrame, onHandlerTurnStarted, applicationTargetOverride) {
|
|
1356
1367
|
let operationKey;
|
|
1357
1368
|
if (record.activation === 'missing') {
|
|
1358
1369
|
const now = BigInt(Date.now());
|
|
@@ -1379,10 +1390,6 @@ class ServiceStatefulRuntime {
|
|
|
1379
1390
|
const terminalCompletion = onTerminalCompletion === undefined
|
|
1380
1391
|
? undefined
|
|
1381
1392
|
: async () => {
|
|
1382
|
-
// The application turn has returned before authority cleanup starts.
|
|
1383
|
-
// Mark it quiescent first so a close requested by that turn can finish
|
|
1384
|
-
// its local cleanup and release the exact authority fence below.
|
|
1385
|
-
this.completeInstanceApplicationOperation(applicationTarget.targetSpotId);
|
|
1386
1393
|
try {
|
|
1387
1394
|
await onTerminalCompletion();
|
|
1388
1395
|
}
|
|
@@ -1398,8 +1405,11 @@ class ServiceStatefulRuntime {
|
|
|
1398
1405
|
...(record.operationKind === 'request' ? { correlation: record.replyRouteId } : {}),
|
|
1399
1406
|
...(record.sourceSpotId === undefined ? {} : { sourceSpotId: record.sourceSpotId }),
|
|
1400
1407
|
targetSpot: spot.ref,
|
|
1408
|
+
activationRecord: record,
|
|
1409
|
+
...(record.activation === 'missing' ? { deadlineUnixMs: record.deadlineUnixMs } : {}),
|
|
1401
1410
|
...(metadataFrame === undefined ? {} : { applicationMetadata: metadataFrame }),
|
|
1402
1411
|
...(terminalCompletion === undefined ? {} : { onTerminalCompletion: terminalCompletion }),
|
|
1412
|
+
...(onHandlerTurnStarted === undefined ? {} : { onHandlerTurnStarted }),
|
|
1403
1413
|
...(record.operationKind === 'request'
|
|
1404
1414
|
? {
|
|
1405
1415
|
reply: onTerminalCompletion === undefined
|
|
@@ -1415,10 +1425,6 @@ class ServiceStatefulRuntime {
|
|
|
1415
1425
|
this.admittedInstanceOperations.set(operationKey, record.deadlineUnixMs);
|
|
1416
1426
|
}
|
|
1417
1427
|
if (onTerminalCompletion !== undefined && result === 'application') {
|
|
1418
|
-
this.beginInstanceApplicationOperation(applicationTarget.targetSpotId);
|
|
1419
|
-
if (activationTerminal) {
|
|
1420
|
-
this.beginInstanceAuthorityOperation(applicationTarget.targetSpotId);
|
|
1421
|
-
}
|
|
1422
1428
|
this.instanceApplicationLifecycle?.beginTerminal(applicationTarget);
|
|
1423
1429
|
}
|
|
1424
1430
|
return result;
|
|
@@ -1429,7 +1435,8 @@ class ServiceStatefulRuntime {
|
|
|
1429
1435
|
const activation = await this.activateMissingInstanceAsync(record, payloadFrame, metadataFrame);
|
|
1430
1436
|
if (this.closed)
|
|
1431
1437
|
return;
|
|
1432
|
-
const
|
|
1438
|
+
const terminal = this.activationTerminalCompletion(record.target, activation.route);
|
|
1439
|
+
const admitted = this.enqueueActivatedInstanceSpot(ingress, record, payloadFrame, activation.spot, localReply, terminal.onTerminalCompletion, metadataFrame, terminal.onHandlerTurnStarted, this.instanceApplicationTarget(record, activation.route.objectGeneration));
|
|
1433
1440
|
if (admitted !== 'application') {
|
|
1434
1441
|
throw new Error('Activated Instance message was not admitted to the local queue.');
|
|
1435
1442
|
}
|
|
@@ -1479,7 +1486,7 @@ class ServiceStatefulRuntime {
|
|
|
1479
1486
|
? { ...record, route: latestRoute }
|
|
1480
1487
|
: record;
|
|
1481
1488
|
const spot = this.requireInstanceActivation(ingress, refreshedRecord);
|
|
1482
|
-
const admitted = this.enqueueActivatedInstanceSpot(ingress,
|
|
1489
|
+
const admitted = this.enqueueActivatedInstanceSpot(ingress, record, payloadFrame, spot, undefined, this.instanceApplicationTerminalCompletion(this.instanceApplicationTarget(refreshedRecord)), metadataFrame, undefined, this.instanceApplicationTarget(refreshedRecord));
|
|
1483
1490
|
if (admitted !== 'application') {
|
|
1484
1491
|
throw new Error('Rematerialized Instance message was not admitted to the local queue.');
|
|
1485
1492
|
}
|
|
@@ -1491,19 +1498,33 @@ class ServiceStatefulRuntime {
|
|
|
1491
1498
|
this.replyWire(ingress, record.replyRouteId, result.terminalResult, result.failureCode);
|
|
1492
1499
|
}
|
|
1493
1500
|
}
|
|
1501
|
+
/**
|
|
1502
|
+
* Spot messaging §4 step 12 with §7 step 1: a Close waits for the first terminal
|
|
1503
|
+
* record only of a message whose handler turn started before it; a message queued
|
|
1504
|
+
* behind that Close is not counted, so it cannot hold the Close it follows.
|
|
1505
|
+
*/
|
|
1494
1506
|
activationTerminalCompletion(target, route) {
|
|
1495
1507
|
let completion;
|
|
1508
|
+
let started = false;
|
|
1496
1509
|
const applicationTarget = {
|
|
1497
1510
|
targetSpotId: target.targetSpotId,
|
|
1498
1511
|
stableType: target.stableType,
|
|
1499
1512
|
objectGeneration: route.objectGeneration
|
|
1500
1513
|
};
|
|
1501
|
-
|
|
1502
|
-
|
|
1514
|
+
const onHandlerTurnStarted = () => {
|
|
1515
|
+
if (started || completion !== undefined)
|
|
1516
|
+
return;
|
|
1517
|
+
started = true;
|
|
1518
|
+
this.beginInstanceAuthorityOperation(target.targetSpotId);
|
|
1519
|
+
};
|
|
1520
|
+
const onTerminalCompletion = () => (completion ??= (async () => {
|
|
1521
|
+
let authorityCompletionSignaled = !started;
|
|
1503
1522
|
try {
|
|
1504
1523
|
const released = await this.asyncInstanceAuthority?.complete(target, route);
|
|
1505
|
-
|
|
1506
|
-
|
|
1524
|
+
if (!authorityCompletionSignaled) {
|
|
1525
|
+
this.completeInstanceAuthorityOperation(target.targetSpotId);
|
|
1526
|
+
authorityCompletionSignaled = true;
|
|
1527
|
+
}
|
|
1507
1528
|
if (released !== undefined) {
|
|
1508
1529
|
const authorityReleased = (await this.instanceApplicationLifecycle?.completeTerminal(applicationTarget)) ??
|
|
1509
1530
|
false;
|
|
@@ -1521,6 +1542,7 @@ class ServiceStatefulRuntime {
|
|
|
1521
1542
|
}
|
|
1522
1543
|
}
|
|
1523
1544
|
})());
|
|
1545
|
+
return { onTerminalCompletion, onHandlerTurnStarted };
|
|
1524
1546
|
}
|
|
1525
1547
|
instanceApplicationTerminalCompletion(target) {
|
|
1526
1548
|
return async () => {
|
|
@@ -1555,24 +1577,10 @@ class ServiceStatefulRuntime {
|
|
|
1555
1577
|
objectGeneration: record.route.objectGeneration
|
|
1556
1578
|
};
|
|
1557
1579
|
}
|
|
1558
|
-
beginInstanceApplicationOperation(spotId) {
|
|
1559
|
-
const key = String(spotId);
|
|
1560
|
-
this.pendingInstanceTerminals.set(key, (this.pendingInstanceTerminals.get(key) ?? 0) + 1);
|
|
1561
|
-
}
|
|
1562
1580
|
beginInstanceAuthorityOperation(spotId) {
|
|
1563
1581
|
const key = String(spotId);
|
|
1564
1582
|
this.pendingInstanceAuthorityTerminals.set(key, (this.pendingInstanceAuthorityTerminals.get(key) ?? 0) + 1);
|
|
1565
1583
|
}
|
|
1566
|
-
completeInstanceApplicationOperation(spotId) {
|
|
1567
|
-
const key = String(spotId);
|
|
1568
|
-
const pending = this.pendingInstanceTerminals.get(key);
|
|
1569
|
-
if (pending === undefined || pending <= 1) {
|
|
1570
|
-
this.pendingInstanceTerminals.delete(key);
|
|
1571
|
-
this.completeInstanceApplicationWaitersIfQuiescent(key);
|
|
1572
|
-
return;
|
|
1573
|
-
}
|
|
1574
|
-
this.pendingInstanceTerminals.set(key, pending - 1);
|
|
1575
|
-
}
|
|
1576
1584
|
completeInstanceAuthorityOperation(spotId) {
|
|
1577
1585
|
const key = String(spotId);
|
|
1578
1586
|
const pending = this.pendingInstanceAuthorityTerminals.get(key);
|
|
@@ -1584,8 +1592,7 @@ class ServiceStatefulRuntime {
|
|
|
1584
1592
|
this.pendingInstanceAuthorityTerminals.set(key, pending - 1);
|
|
1585
1593
|
}
|
|
1586
1594
|
completeInstanceApplicationWaitersIfQuiescent(key) {
|
|
1587
|
-
if ((this.
|
|
1588
|
-
(this.pendingInstanceAuthorityTerminals.get(key) ?? 0) !== 0)
|
|
1595
|
+
if ((this.pendingInstanceAuthorityTerminals.get(key) ?? 0) !== 0)
|
|
1589
1596
|
return;
|
|
1590
1597
|
const waiters = this.instanceApplicationWaiters.get(key);
|
|
1591
1598
|
if (waiters === undefined)
|
|
@@ -1662,8 +1669,8 @@ class ServiceStatefulRuntime {
|
|
|
1662
1669
|
// activation continuation can publish its in-memory intent. If the
|
|
1663
1670
|
// local ready projection already carries the exact object and owner
|
|
1664
1671
|
// fence from the received route, publish that validated projection
|
|
1665
|
-
// instead of
|
|
1666
|
-
//
|
|
1672
|
+
// instead of rejecting a following request while publication finishes.
|
|
1673
|
+
// An absent Ready projection cannot validate the received owner fence.
|
|
1667
1674
|
const local = this.registry.spot(record.route.targetSpotId);
|
|
1668
1675
|
if (local?.kind === 'instance' &&
|
|
1669
1676
|
local.state === 'ready' &&
|
|
@@ -1673,7 +1680,7 @@ class ServiceStatefulRuntime {
|
|
|
1673
1680
|
}
|
|
1674
1681
|
}
|
|
1675
1682
|
if (intent === undefined) {
|
|
1676
|
-
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.
|
|
1683
|
+
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving, `Instance Spot '${record.route.targetSpotId}' has no current Ready authority.`);
|
|
1677
1684
|
}
|
|
1678
1685
|
const current = intent.route;
|
|
1679
1686
|
if (current.objectGeneration < record.route.objectGeneration) {
|
|
@@ -1779,6 +1786,40 @@ class ServiceStatefulRuntime {
|
|
|
1779
1786
|
}
|
|
1780
1787
|
const local = this.registry.spot(target.targetSpotId);
|
|
1781
1788
|
const current = await authority.read(target);
|
|
1789
|
+
if (current.kind === 'creating' &&
|
|
1790
|
+
current.authority?.allocation.state === 'active' &&
|
|
1791
|
+
this.instanceApplicationLifecycle?.isMaterializing?.(target) === true) {
|
|
1792
|
+
return {
|
|
1793
|
+
spot: { ref: { spotId: target.targetSpotId, generation: current.objectGeneration } },
|
|
1794
|
+
route: {
|
|
1795
|
+
targetSpotId: target.targetSpotId,
|
|
1796
|
+
targetNodeRid: this.nodeRid,
|
|
1797
|
+
targetNodeGeneration: this.nodeGeneration,
|
|
1798
|
+
objectGeneration: current.objectGeneration,
|
|
1799
|
+
authorityOwnerGeneration: current.authorityOwnerGeneration,
|
|
1800
|
+
ownerId: current.authority.ownerId,
|
|
1801
|
+
leaseGeneration: current.authority.ownerLeaseGeneration,
|
|
1802
|
+
storeVersion: current.authority.storeVersion.value
|
|
1803
|
+
}
|
|
1804
|
+
};
|
|
1805
|
+
}
|
|
1806
|
+
if (current.kind === 'ready' &&
|
|
1807
|
+
current.authority !== undefined &&
|
|
1808
|
+
(0, service_authority_payload_codec_1.decodeServiceClosingSpotAuthority)(current.authority.payload) !== undefined) {
|
|
1809
|
+
if (current.route.targetNodeRid !== this.nodeRid) {
|
|
1810
|
+
throw new ServiceInstanceActivationRedirectError(current.route);
|
|
1811
|
+
}
|
|
1812
|
+
if (current.route.targetNodeGeneration !== this.nodeGeneration ||
|
|
1813
|
+
(local !== undefined &&
|
|
1814
|
+
!routeMatchesLocal(current.route, local, this.nodeRid, this.nodeGeneration)) ||
|
|
1815
|
+
(local === undefined && this.instanceApplicationLifecycle?.isMaterialized(target) !== true)) {
|
|
1816
|
+
throw new service_stateful_registry_1.ServiceStaleGenerationError('spot', target.targetSpotId);
|
|
1817
|
+
}
|
|
1818
|
+
return {
|
|
1819
|
+
spot: { ref: { spotId: target.targetSpotId, generation: current.route.objectGeneration } },
|
|
1820
|
+
route: current.route
|
|
1821
|
+
};
|
|
1822
|
+
}
|
|
1782
1823
|
if (!this.acceptsLocalMissingInstancePlacement()) {
|
|
1783
1824
|
if (current.kind === 'ready' && current.route.targetNodeRid !== this.nodeRid) {
|
|
1784
1825
|
throw new ServiceInstanceActivationRedirectError(current.route);
|
|
@@ -1806,7 +1847,6 @@ class ServiceStatefulRuntime {
|
|
|
1806
1847
|
}
|
|
1807
1848
|
if (local !== undefined) {
|
|
1808
1849
|
const lifecycle = this.instanceApplicationLifecycle;
|
|
1809
|
-
const closing = lifecycle?.isClosing?.(target) === true;
|
|
1810
1850
|
let materialized = lifecycle === undefined ? undefined : lifecycle.isMaterialized(target);
|
|
1811
1851
|
const materializing = lifecycle?.isMaterializing?.(target) === true;
|
|
1812
1852
|
if (local.kind !== 'instance' || local.stableType !== target.stableType) {
|
|
@@ -1815,9 +1855,7 @@ class ServiceStatefulRuntime {
|
|
|
1815
1855
|
const joinsCreating = current.kind === 'creating' &&
|
|
1816
1856
|
local.ref.generation === current.objectGeneration &&
|
|
1817
1857
|
local.authorityOwnerGeneration === current.authorityOwnerGeneration;
|
|
1818
|
-
const replacesClosingProjection = current.kind === 'creating' && closing;
|
|
1819
1858
|
if (current.kind === 'missing' &&
|
|
1820
|
-
!closing &&
|
|
1821
1859
|
!materializing &&
|
|
1822
1860
|
materialized === true &&
|
|
1823
1861
|
lifecycle !== undefined) {
|
|
@@ -1839,23 +1877,30 @@ class ServiceStatefulRuntime {
|
|
|
1839
1877
|
// failure.
|
|
1840
1878
|
// If disposal did not remove an orphaned materialization, keep fencing
|
|
1841
1879
|
// it instead of admitting work into two application generations.
|
|
1842
|
-
if ((!joinsCreating &&
|
|
1843
|
-
(!joinsCreating &&
|
|
1880
|
+
if ((!joinsCreating && current.kind !== 'missing') ||
|
|
1881
|
+
(!joinsCreating && materialized !== false && !materializing)) {
|
|
1844
1882
|
throw new service_stateful_registry_1.ServiceStaleGenerationError('spot', target.targetSpotId);
|
|
1845
1883
|
}
|
|
1846
1884
|
}
|
|
1847
|
-
const
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1885
|
+
const deadline = operationDeadline(record.deadlineUnixMs);
|
|
1886
|
+
let reserved;
|
|
1887
|
+
try {
|
|
1888
|
+
reserved = await authority.reserve({
|
|
1889
|
+
target,
|
|
1890
|
+
sourceNodeRid: record.sourceNodeRid,
|
|
1891
|
+
sourceNodeGeneration: record.sourceNodeGeneration,
|
|
1892
|
+
...(record.sourceSpotId === undefined ? {} : { sourceSpotId: record.sourceSpotId }),
|
|
1893
|
+
operationKind: record.operationKind,
|
|
1894
|
+
operation: record.operation,
|
|
1895
|
+
...(record.replyRouteId === undefined ? {} : { replyRouteId: record.replyRouteId }),
|
|
1896
|
+
deadlineUnixMs: record.deadlineUnixMs,
|
|
1897
|
+
...(metadataFrame === undefined ? {} : { metadataFrame }),
|
|
1898
|
+
applicationPayloadFrame: payloadFrame
|
|
1899
|
+
}, deadline.signal);
|
|
1900
|
+
}
|
|
1901
|
+
finally {
|
|
1902
|
+
deadline.close();
|
|
1903
|
+
}
|
|
1859
1904
|
if (reserved.kind === 'ready') {
|
|
1860
1905
|
throw new ServiceInstanceActivationRedirectError(reserved.route);
|
|
1861
1906
|
}
|
|
@@ -1875,7 +1920,7 @@ class ServiceStatefulRuntime {
|
|
|
1875
1920
|
}
|
|
1876
1921
|
let committed;
|
|
1877
1922
|
try {
|
|
1878
|
-
committed = await authority.commit(target, reserved.reservation, activation.spot);
|
|
1923
|
+
committed = await authority.commit(target, reserved.reservation, activation.spot, record.deadlineUnixMs);
|
|
1879
1924
|
}
|
|
1880
1925
|
catch (error) {
|
|
1881
1926
|
if (activation.created)
|
|
@@ -2228,7 +2273,15 @@ class ServiceStatefulRuntime {
|
|
|
2228
2273
|
const accepted = this.raw.mailbox.tryEnqueue({
|
|
2229
2274
|
owner: `actor:${actor.actorId}\0${actor.generation}`,
|
|
2230
2275
|
domain: 'infrastructure',
|
|
2231
|
-
parts: [
|
|
2276
|
+
parts: [
|
|
2277
|
+
Buffer.from([
|
|
2278
|
+
service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[0],
|
|
2279
|
+
service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[1],
|
|
2280
|
+
service_wire_constants_generated_1.SERVICE_WIRE_MAJOR,
|
|
2281
|
+
service_stateful_wire_codec_1.M6bServiceWireCommand.boundSessionBind,
|
|
2282
|
+
0
|
|
2283
|
+
])
|
|
2284
|
+
],
|
|
2232
2285
|
sourceRoutingId: binding.sessionOwnerNodeRid,
|
|
2233
2286
|
stateful: {
|
|
2234
2287
|
receiveKind: service_runtime_contracts_1.ReceiveKind.ActorBinding,
|
|
@@ -2271,42 +2324,12 @@ class ServiceStatefulRuntime {
|
|
|
2271
2324
|
return 'protocolError';
|
|
2272
2325
|
}
|
|
2273
2326
|
const sessionRid = delivery.binding.sessionRid;
|
|
2274
|
-
let retainedPayload = payloadFrame;
|
|
2275
|
-
let settled = false;
|
|
2276
|
-
const settle = () => {
|
|
2277
|
-
if (settled)
|
|
2278
|
-
return false;
|
|
2279
|
-
settled = true;
|
|
2280
|
-
retainedPayload = undefined;
|
|
2281
|
-
return true;
|
|
2282
|
-
};
|
|
2283
|
-
const operation = {
|
|
2284
|
-
deliver: async () => {
|
|
2285
|
-
if (settled || retainedPayload === undefined)
|
|
2286
|
-
return false;
|
|
2287
|
-
const delivered = await delivery.deliver(sessionRid, retainedPayload);
|
|
2288
|
-
if (delivered)
|
|
2289
|
-
settle();
|
|
2290
|
-
return delivered;
|
|
2291
|
-
},
|
|
2292
|
-
fail: (_error) => {
|
|
2293
|
-
settle();
|
|
2294
|
-
}
|
|
2295
|
-
};
|
|
2296
|
-
const decision = await delivery.bindingIngress?.retainOutbound(record.actor.actor.actorId, operation);
|
|
2297
|
-
if (decision === 'retained')
|
|
2298
|
-
return 'application';
|
|
2299
|
-
if (decision === 'rejected') {
|
|
2300
|
-
return 'protocolError';
|
|
2301
|
-
}
|
|
2302
2327
|
try {
|
|
2303
|
-
const delivered = await delivery.deliver(sessionRid,
|
|
2304
|
-
settle();
|
|
2328
|
+
const delivered = await delivery.deliver(sessionRid, payloadFrame);
|
|
2305
2329
|
if (!delivered)
|
|
2306
2330
|
return 'protocolError';
|
|
2307
2331
|
}
|
|
2308
2332
|
catch (error) {
|
|
2309
|
-
operation.fail(error);
|
|
2310
2333
|
// Remote command 36 is one-way: its source transport admission has
|
|
2311
2334
|
// already completed, so a later client delivery terminal is local to
|
|
2312
2335
|
// this session owner. Local fast paths still preserve the typed result.
|
|
@@ -2425,7 +2448,13 @@ class ServiceStatefulRuntime {
|
|
|
2425
2448
|
}
|
|
2426
2449
|
}
|
|
2427
2450
|
enqueueActorControl(spotId, control, onTerminalCompletion) {
|
|
2428
|
-
const header = Buffer.from([
|
|
2451
|
+
const header = Buffer.from([
|
|
2452
|
+
service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[0],
|
|
2453
|
+
service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[1],
|
|
2454
|
+
service_wire_constants_generated_1.SERVICE_WIRE_MAJOR,
|
|
2455
|
+
service_stateful_wire_codec_1.M6bServiceWireCommand.actorJoined,
|
|
2456
|
+
0
|
|
2457
|
+
]);
|
|
2429
2458
|
let terminalAttempted = false;
|
|
2430
2459
|
void (async () => {
|
|
2431
2460
|
const applicationJobOwner = await this.raw.reserveLocalIngress();
|
|
@@ -2468,7 +2497,13 @@ class ServiceStatefulRuntime {
|
|
|
2468
2497
|
enqueueActorBindingControl(ingress, binding, actorAuthority, reply) {
|
|
2469
2498
|
const actor = binding.actor;
|
|
2470
2499
|
const sessionOwner = requireSessionOwnerIdentity(binding);
|
|
2471
|
-
const header = Buffer.from([
|
|
2500
|
+
const header = Buffer.from([
|
|
2501
|
+
service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[0],
|
|
2502
|
+
service_wire_constants_generated_1.SERVICE_WIRE_MAGIC[1],
|
|
2503
|
+
service_wire_constants_generated_1.SERVICE_WIRE_MAJOR,
|
|
2504
|
+
service_stateful_wire_codec_1.M6bServiceWireCommand.boundSessionBind,
|
|
2505
|
+
0
|
|
2506
|
+
]);
|
|
2472
2507
|
const applicationJob = requireApplicationJobOwner(ingress).takeInitial('infrastructure');
|
|
2473
2508
|
const accepted = this.raw.mailbox.tryEnqueue({
|
|
2474
2509
|
owner: `actor:${actor.actorId}\0${actor.generation}`,
|
|
@@ -2608,7 +2643,7 @@ class ServiceStatefulRuntime {
|
|
|
2608
2643
|
}
|
|
2609
2644
|
}
|
|
2610
2645
|
async executeUserSpotOperation(handler, record) {
|
|
2611
|
-
const deadline =
|
|
2646
|
+
const deadline = operationDeadline(record.deadlineUnixMs);
|
|
2612
2647
|
try {
|
|
2613
2648
|
const result = record.kind === 'userSpotCreate'
|
|
2614
2649
|
? await handler.create(record, deadline.signal)
|
|
@@ -2687,7 +2722,7 @@ class ServiceStatefulRuntime {
|
|
|
2687
2722
|
throw error;
|
|
2688
2723
|
if (durableRequestWasAdmitted(error))
|
|
2689
2724
|
wasAdmitted = true;
|
|
2690
|
-
const retryDelayMs = Math.min(
|
|
2725
|
+
const retryDelayMs = Math.min(STATEFUL_OPERATION_RETRY_TICK_MS, deadlineMs - performance.now());
|
|
2691
2726
|
if (retryDelayMs <= 0) {
|
|
2692
2727
|
throw durableOperationExhausted(operationKind, wasAdmitted, error);
|
|
2693
2728
|
}
|
|
@@ -2736,8 +2771,8 @@ class ServiceStatefulRuntime {
|
|
|
2736
2771
|
const applicationJobOwner = await this.raw.reserveLocalIngress();
|
|
2737
2772
|
try {
|
|
2738
2773
|
const result = await this.ingress({
|
|
2739
|
-
command: header[
|
|
2740
|
-
flags: header[
|
|
2774
|
+
command: header[service_wire_binary_primitives_1.SERVICE_WIRE_COMMAND_OFFSET],
|
|
2775
|
+
flags: header[service_wire_binary_primitives_1.SERVICE_WIRE_FLAGS_OFFSET],
|
|
2741
2776
|
sourceRoutingId: this.nodeRid,
|
|
2742
2777
|
requestSequence,
|
|
2743
2778
|
reply: finish,
|
|
@@ -2770,8 +2805,8 @@ class ServiceStatefulRuntime {
|
|
|
2770
2805
|
void ServiceStatefulRuntime.detachedIngressScope(async () => {
|
|
2771
2806
|
try {
|
|
2772
2807
|
await this.ingress({
|
|
2773
|
-
command: parts[0][
|
|
2774
|
-
flags: parts[0][
|
|
2808
|
+
command: parts[0][service_wire_binary_primitives_1.SERVICE_WIRE_COMMAND_OFFSET],
|
|
2809
|
+
flags: parts[0][service_wire_binary_primitives_1.SERVICE_WIRE_FLAGS_OFFSET],
|
|
2775
2810
|
sourceRoutingId: this.nodeRid,
|
|
2776
2811
|
sourceNodeGeneration: this.nodeGeneration,
|
|
2777
2812
|
parts,
|
|
@@ -2791,8 +2826,8 @@ class ServiceStatefulRuntime {
|
|
|
2791
2826
|
}
|
|
2792
2827
|
try {
|
|
2793
2828
|
const result = await this.ingress({
|
|
2794
|
-
command: parts[0][
|
|
2795
|
-
flags: parts[0][
|
|
2829
|
+
command: parts[0][service_wire_binary_primitives_1.SERVICE_WIRE_COMMAND_OFFSET],
|
|
2830
|
+
flags: parts[0][service_wire_binary_primitives_1.SERVICE_WIRE_FLAGS_OFFSET],
|
|
2796
2831
|
sourceRoutingId: this.nodeRid,
|
|
2797
2832
|
sourceNodeGeneration: this.nodeGeneration,
|
|
2798
2833
|
parts,
|
|
@@ -2819,17 +2854,21 @@ class ServiceStatefulRuntime {
|
|
|
2819
2854
|
submitRequest(pending, targetNodeRid, parts, timeoutMs, operationKind, actor) {
|
|
2820
2855
|
if (targetNodeRid === this.nodeRid) {
|
|
2821
2856
|
const deadlineUnixMs = BigInt(Date.now() + Math.max(0, timeoutMs));
|
|
2857
|
+
const capacityStop = new AbortController();
|
|
2858
|
+
void pending.promise.then(() => capacityStop.abort(), () => capacityStop.abort());
|
|
2822
2859
|
void (async () => {
|
|
2823
|
-
const applicationJobOwner = await this.raw.reserveLocalIngress();
|
|
2824
|
-
const localIngress = {
|
|
2825
|
-
command: parts[0][3],
|
|
2826
|
-
flags: parts[0][4],
|
|
2827
|
-
sourceRoutingId: this.nodeRid,
|
|
2828
|
-
requestSequence: pending.id,
|
|
2829
|
-
parts,
|
|
2830
|
-
applicationJobOwner
|
|
2831
|
-
};
|
|
2860
|
+
const applicationJobOwner = await this.raw.reserveLocalIngress(capacityStop.signal);
|
|
2832
2861
|
try {
|
|
2862
|
+
if (!this.operations.isPending(pending.id))
|
|
2863
|
+
return;
|
|
2864
|
+
const localIngress = {
|
|
2865
|
+
command: parts[0][service_wire_binary_primitives_1.SERVICE_WIRE_COMMAND_OFFSET],
|
|
2866
|
+
flags: parts[0][service_wire_binary_primitives_1.SERVICE_WIRE_FLAGS_OFFSET],
|
|
2867
|
+
sourceRoutingId: this.nodeRid,
|
|
2868
|
+
requestSequence: pending.id,
|
|
2869
|
+
parts,
|
|
2870
|
+
applicationJobOwner
|
|
2871
|
+
};
|
|
2833
2872
|
await this.submitLocalRequest(localIngress, pending, operationKind, actor, deadlineUnixMs);
|
|
2834
2873
|
}
|
|
2835
2874
|
catch (error) {
|
|
@@ -2848,10 +2887,7 @@ class ServiceStatefulRuntime {
|
|
|
2848
2887
|
? this.tryActorFence(actor)
|
|
2849
2888
|
: this.acceptCanonicalActorFence(actor, canonical.actorFence);
|
|
2850
2889
|
if (target === undefined || actorRoute === undefined) {
|
|
2851
|
-
this.operations.reply(pending.id,
|
|
2852
|
-
terminalResult: runtime_values_1.RequestResult.NotFound,
|
|
2853
|
-
failureCode: ACTOR_ROUTE_STALE
|
|
2854
|
-
});
|
|
2890
|
+
this.operations.reply(pending.id, (0, framework_errors_internal_1.internalFrameworkWireReply)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale));
|
|
2855
2891
|
return;
|
|
2856
2892
|
}
|
|
2857
2893
|
if (canonical !== undefined) {
|
|
@@ -2938,7 +2974,6 @@ class ServiceStatefulRuntime {
|
|
|
2938
2974
|
}
|
|
2939
2975
|
const localReply = (terminalResult, failureCode, replyPayload, tail) => this.operations.reply(pending.id, this.resultFromReply(terminalResult, failureCode, replyPayload, tail, this.nodeRid, actor));
|
|
2940
2976
|
if (decoded.kind === 'spotRequest') {
|
|
2941
|
-
await this.spotAdmissionProvider?.awaitCloseDecision?.(decoded.target.spot.spotId);
|
|
2942
2977
|
this.validateDirectSpotFence(decoded.target);
|
|
2943
2978
|
this.enqueueApplicationFrame(ingress, `spot:${decoded.target.spot.spotId}`, payloadFrame, {
|
|
2944
2979
|
receiveKind: service_runtime_contracts_1.ReceiveKind.SpotRequest,
|
|
@@ -3201,7 +3236,6 @@ class ServiceStatefulRuntime {
|
|
|
3201
3236
|
fence.targetNodeGeneration !== this.nodeGeneration) {
|
|
3202
3237
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.SpotMoving, `Spot '${fence.spot.spotId}' targets an unavailable owner route.`);
|
|
3203
3238
|
}
|
|
3204
|
-
this.requireDirectSpotAdmission(fence.spot.spotId);
|
|
3205
3239
|
const spot = this.registry.spot(fence.spot.spotId);
|
|
3206
3240
|
if (spot === undefined) {
|
|
3207
3241
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestTargetNotFound, `Spot '${fence.spot.spotId}' has no current Ready authority.`);
|
|
@@ -3228,14 +3262,6 @@ class ServiceStatefulRuntime {
|
|
|
3228
3262
|
}
|
|
3229
3263
|
return spot;
|
|
3230
3264
|
}
|
|
3231
|
-
requireDirectSpotAdmission(spotId) {
|
|
3232
|
-
if (this.spotAdmissionProvider?.runtimeState() === Locations_1.ZLinkFrameworkRuntimeState.Draining) {
|
|
3233
|
-
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RuntimeShutdown, `Spot '${spotId}' owner is Draining.`);
|
|
3234
|
-
}
|
|
3235
|
-
if (this.spotAdmissionProvider?.isClosing(spotId) === true) {
|
|
3236
|
-
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestRejected, `Spot '${spotId}' authority is Closing.`);
|
|
3237
|
-
}
|
|
3238
|
-
}
|
|
3239
3265
|
holdOrRelaySpotMessage(ingress, wire) {
|
|
3240
3266
|
const state = this.spotMessageFollow.get(spotKey(wire.target.spot));
|
|
3241
3267
|
if (state === undefined || !sameDirectSpotRouteIdentity(state.source, wire.target)) {
|
|
@@ -3283,7 +3309,9 @@ class ServiceStatefulRuntime {
|
|
|
3283
3309
|
}
|
|
3284
3310
|
const current = this.peekSpotMessageFollow(state);
|
|
3285
3311
|
try {
|
|
3286
|
-
const metadata = (current.ingress.parts[0][
|
|
3312
|
+
const metadata = (current.ingress.parts[0][service_wire_binary_primitives_1.SERVICE_WIRE_FLAGS_OFFSET] &
|
|
3313
|
+
service_stateful_wire_codec_1.M6bServiceWireFlag.metadata) !==
|
|
3314
|
+
0;
|
|
3287
3315
|
const parts = [
|
|
3288
3316
|
(0, service_stateful_wire_codec_1.encodeSpotHeader)(current.wire.kind, current.wire.sourceSpotId, state.target, current.wire.correlation, current.wire.operation, current.wire.messageFollowHopCount + 1, metadata ? current.ingress.parts[1] : undefined),
|
|
3289
3317
|
...(metadata ? [current.ingress.parts[1]] : []),
|
|
@@ -3391,7 +3419,7 @@ class ServiceStatefulRuntime {
|
|
|
3391
3419
|
state.queued.length = 0;
|
|
3392
3420
|
state.queuedHead = 0;
|
|
3393
3421
|
}
|
|
3394
|
-
else if (
|
|
3422
|
+
else if ((0, admission_1.shouldCompactBackingArray)(state.queuedHead, state.queued.length)) {
|
|
3395
3423
|
state.queued.splice(0, state.queuedHead);
|
|
3396
3424
|
state.queuedHead = 0;
|
|
3397
3425
|
}
|
|
@@ -3577,34 +3605,19 @@ class ServiceStatefulRuntime {
|
|
|
3577
3605
|
}
|
|
3578
3606
|
}
|
|
3579
3607
|
exports.ServiceStatefulRuntime = ServiceStatefulRuntime;
|
|
3580
|
-
function serviceSpotPublishFailureReason(result, routeReady, closed) {
|
|
3581
|
-
if (closed || result === runtime_values_1.SubmitResult.Terminated)
|
|
3582
|
-
return 'shutdown';
|
|
3583
|
-
switch (result) {
|
|
3584
|
-
case runtime_values_1.SubmitResult.Backpressured:
|
|
3585
|
-
return 'backpressure';
|
|
3586
|
-
case runtime_values_1.SubmitResult.NotAdmitted:
|
|
3587
|
-
case runtime_values_1.SubmitResult.NotConnected:
|
|
3588
|
-
case runtime_values_1.SubmitResult.NotFound:
|
|
3589
|
-
case runtime_values_1.SubmitResult.InvalidHandle:
|
|
3590
|
-
return 'stale_target';
|
|
3591
|
-
default:
|
|
3592
|
-
// RawServiceMeshRuntime exposes failed Core submissions as false. A
|
|
3593
|
-
// ready route therefore identifies queue admission failure; a route
|
|
3594
|
-
// that became unready after selection is a stale target.
|
|
3595
|
-
return routeReady ? 'backpressure' : 'stale_target';
|
|
3596
|
-
}
|
|
3597
|
-
}
|
|
3598
3608
|
function isEntrySpotFence(fence) {
|
|
3599
3609
|
return (fence.spot.spotId === fence.targetNodeRid &&
|
|
3600
3610
|
fence.spot.generation === fence.targetNodeGeneration &&
|
|
3601
3611
|
fence.authorityOwnerGeneration === fence.targetNodeGeneration &&
|
|
3602
3612
|
fence.ownerLeaseGeneration === fence.targetNodeGeneration);
|
|
3603
3613
|
}
|
|
3604
|
-
function
|
|
3614
|
+
function operationDeadline(deadlineUnixMs) {
|
|
3605
3615
|
const controller = new AbortController();
|
|
3606
3616
|
const delay = Number(deadlineUnixMs - BigInt(Date.now()));
|
|
3607
|
-
const
|
|
3617
|
+
const expire = () => controller.abort((0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.DeadlineExceeded, 'Operation deadline exceeded.'));
|
|
3618
|
+
const timeout = delay <= 0
|
|
3619
|
+
? (expire(), undefined)
|
|
3620
|
+
: setTimeout(expire, Math.min(delay, MAX_NODE_TIMER_DELAY_MS));
|
|
3608
3621
|
return {
|
|
3609
3622
|
signal: controller.signal,
|
|
3610
3623
|
close: () => clearTimeout(timeout)
|
|
@@ -3660,12 +3673,12 @@ function actorLocation(actor) {
|
|
|
3660
3673
|
}
|
|
3661
3674
|
function failure(error) {
|
|
3662
3675
|
if (error instanceof service_stateful_registry_1.ServiceStaleGenerationError) {
|
|
3663
|
-
return
|
|
3676
|
+
return (0, framework_errors_internal_1.internalFrameworkWireReply)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.ActorLocationStale);
|
|
3664
3677
|
}
|
|
3665
3678
|
if (error instanceof contracts_1.ZLinkFrameworkException) {
|
|
3666
3679
|
return (0, framework_errors_internal_1.internalFrameworkWireReply)(error);
|
|
3667
3680
|
}
|
|
3668
|
-
return
|
|
3681
|
+
return (0, framework_errors_internal_1.internalFrameworkWireReply)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestFailed);
|
|
3669
3682
|
}
|
|
3670
3683
|
function actorKey(actor) {
|
|
3671
3684
|
return `${actor.actorId}\0${actor.generation}`;
|
|
@@ -3910,7 +3923,7 @@ function topicMatches(filter, topic) {
|
|
|
3910
3923
|
function emptyPayload() {
|
|
3911
3924
|
return {
|
|
3912
3925
|
packetName: 'ZLinkFrameworkEmpty',
|
|
3913
|
-
contentType:
|
|
3926
|
+
contentType: stream_wire_1.ZlinkStreamContentType.Raw,
|
|
3914
3927
|
payload: Buffer.alloc(0)
|
|
3915
3928
|
};
|
|
3916
3929
|
}
|