import { MessageType } from '@protobuf-ts/runtime';
import { CallEndedReason, CallGrants, CallState, ClientCapability, ClientDetails, Codec, ConnectionQuality, DegradationPreference, Error as Error$, GoAwayReason, ICETrickle as ICETrickle$, Participant, ParticipantCount, ParticipantSource, PeerType, Pin, PublishOption, SubscribeOption, TrackInfo, TrackType, TrackUnpublishReason, WebsocketReconnectStrategy } from '../models/models';
import { TrackSubscriptionDetails } from '../signal_rpc/signal';
/**
 * SFUEvent is a message that is sent from the SFU to the client.
 *
 * @generated from protobuf message stream.video.sfu.event.SfuEvent
 */
export interface SfuEvent {
    /**
     * @generated from protobuf oneof: event_payload
     */
    eventPayload: {
        oneofKind: 'subscriberOffer';
        /**
         * SubscriberOffer sends the SDP offer for establishing the
         * subscriber PeerConnection.
         *
         * @generated from protobuf field: stream.video.sfu.event.SubscriberOffer subscriber_offer = 1;
         */
        subscriberOffer: SubscriberOffer;
    } | {
        oneofKind: 'publisherAnswer';
        /**
         * PublisherAnswer sends the SDP answer to the offer sent by
         * the client for establishing the Publisher PeerConnection.
         *
         * @generated from protobuf field: stream.video.sfu.event.PublisherAnswer publisher_answer = 2;
         */
        publisherAnswer: PublisherAnswer;
    } | {
        oneofKind: 'connectionQualityChanged';
        /**
         * ConnectionQualityChanged is sent to inform the connection
         * quality of the participants in the call. It does not have
         * to contain the full list of call participants in it.
         *
         * @generated from protobuf field: stream.video.sfu.event.ConnectionQualityChanged connection_quality_changed = 3;
         */
        connectionQualityChanged: ConnectionQualityChanged;
    } | {
        oneofKind: 'audioLevelChanged';
        /**
         * AudioLevelChanged is sent for change in audio levels of
         * the participants.
         *
         * @generated from protobuf field: stream.video.sfu.event.AudioLevelChanged audio_level_changed = 4;
         */
        audioLevelChanged: AudioLevelChanged;
    } | {
        oneofKind: 'iceTrickle';
        /**
         * ICETrickle contains the ICE candidate required to establish
         * the ICE transport: part of establishing the PeerConnection
         * and also for ICE restarts.
         *
         * @generated from protobuf field: stream.video.sfu.models.ICETrickle ice_trickle = 5;
         */
        iceTrickle: ICETrickle$;
    } | {
        oneofKind: 'changePublishQuality';
        /**
         * ChangePublishQuality advises the publisher to switch on/off
         * various qualities of their video stream based on the subscription.
         * This is done to save the bandwidth and the CPU of the publisher.
         *
         * @generated from protobuf field: stream.video.sfu.event.ChangePublishQuality change_publish_quality = 6;
         */
        changePublishQuality: ChangePublishQuality;
    } | {
        oneofKind: 'participantJoined';
        /**
         * ParticipantJoined notifies the client that a new participant
         * has joined the call. This is not sent for anonymous users.
         *
         * @generated from protobuf field: stream.video.sfu.event.ParticipantJoined participant_joined = 10;
         */
        participantJoined: ParticipantJoined;
    } | {
        oneofKind: 'participantLeft';
        /**
         * ParticipantLeft notifies the client that a call participant
         * has left the call. This is not sent for anonymous users.
         *
         * @generated from protobuf field: stream.video.sfu.event.ParticipantLeft participant_left = 11;
         */
        participantLeft: ParticipantLeft;
    } | {
        oneofKind: 'dominantSpeakerChanged';
        /**
         * DominantSpeakerChanged notifies the client about the current
         * dominant speaker. This is required for certain use cases like
         * the spotlight view.
         *
         * @generated from protobuf field: stream.video.sfu.event.DominantSpeakerChanged dominant_speaker_changed = 12;
         */
        dominantSpeakerChanged: DominantSpeakerChanged;
    } | {
        oneofKind: 'joinResponse';
        /**
         * JoinResponse acknowledges a participant successfully joining
         * the call. This is sent in response to the JoinRequest.
         *
         * @generated from protobuf field: stream.video.sfu.event.JoinResponse join_response = 13;
         */
        joinResponse: JoinResponse;
    } | {
        oneofKind: 'healthCheckResponse';
        /**
         * HealthCheckResponse is sent in response to the HealthCheckRequest.
         * It contains the participant count in the call.
         *
         * @generated from protobuf field: stream.video.sfu.event.HealthCheckResponse health_check_response = 14;
         */
        healthCheckResponse: HealthCheckResponse;
    } | {
        oneofKind: 'trackPublished';
        /**
         * TrackPublished is sent when a new track (like audio, video, screenshare)
         * is published by a participant in the call. It is also sent on mute/unmute.
         *
         * @generated from protobuf field: stream.video.sfu.event.TrackPublished track_published = 16;
         */
        trackPublished: TrackPublished;
    } | {
        oneofKind: 'trackUnpublished';
        /**
         * TrackUnpublished is sent when a track (like audio, video, screenshare)
         * is no longer published. It is sent on muting a track or when the participant
         * is leaving the call.
         *
         * @generated from protobuf field: stream.video.sfu.event.TrackUnpublished track_unpublished = 17;
         */
        trackUnpublished: TrackUnpublished;
    } | {
        oneofKind: 'error';
        /**
         * Error is used to communicate any error related to the participant. The
         * error code and the message explain what went wrong. Whether the participant
         * can retry is also indicated.
         *
         * @generated from protobuf field: stream.video.sfu.event.Error error = 18;
         */
        error: Error;
    } | {
        oneofKind: 'callGrantsUpdated';
        /**
         * CallGrantsUpdated tells what tracks a participant is allowed to publish.
         *
         * @generated from protobuf field: stream.video.sfu.event.CallGrantsUpdated call_grants_updated = 19;
         */
        callGrantsUpdated: CallGrantsUpdated;
    } | {
        oneofKind: 'goAway';
        /**
         * GoAway tells the client to migrate away from the SFU it is connected to.
         * The reason field indicates why this message was sent.
         *
         * @generated from protobuf field: stream.video.sfu.event.GoAway go_away = 20;
         */
        goAway: GoAway;
    } | {
        oneofKind: 'iceRestart';
        /**
         * ICERestart tells the client to perform ICE restart.
         *
         * @generated from protobuf field: stream.video.sfu.event.ICERestart ice_restart = 21;
         */
        iceRestart: ICERestart;
    } | {
        oneofKind: 'pinsUpdated';
        /**
         * PinsChanged is sent the list of pins in the call changes. This event contains the entire list of pins.
         *
         * @generated from protobuf field: stream.video.sfu.event.PinsChanged pins_updated = 22;
         */
        pinsUpdated: PinsChanged;
    } | {
        oneofKind: 'callEnded';
        /**
         * CallEnded is sent by the SFU to the client to signal that the call has ended.
         * The reason may specify why the call has ended.
         *
         * @generated from protobuf field: stream.video.sfu.event.CallEnded call_ended = 23;
         */
        callEnded: CallEnded;
    } | {
        oneofKind: 'participantUpdated';
        /**
         * ParticipantUpdated is sent when user data is updated
         *
         * @generated from protobuf field: stream.video.sfu.event.ParticipantUpdated participant_updated = 24;
         */
        participantUpdated: ParticipantUpdated;
    } | {
        oneofKind: 'participantMigrationComplete';
        /**
         * ParticipantMigrationComplete is sent when the participant migration is complete
         *
         * @generated from protobuf field: stream.video.sfu.event.ParticipantMigrationComplete participant_migration_complete = 25;
         */
        participantMigrationComplete: ParticipantMigrationComplete;
    } | {
        oneofKind: 'changePublishOptions';
        /**
         * ChangePublishOptions is sent to signal the change in publish options such as a new codec or simulcast layers
         *
         * @generated from protobuf field: stream.video.sfu.event.ChangePublishOptions change_publish_options = 27;
         */
        changePublishOptions: ChangePublishOptions;
    } | {
        oneofKind: 'inboundStateNotification';
        /**
         * InboundStateNotification
         *
         * @generated from protobuf field: stream.video.sfu.event.InboundStateNotification inbound_state_notification = 28;
         */
        inboundStateNotification: InboundStateNotification;
    } | {
        oneofKind: undefined;
    };
}
/**
 * @generated from protobuf message stream.video.sfu.event.ChangePublishOptions
 */
export interface ChangePublishOptions {
    /**
     * @generated from protobuf field: repeated stream.video.sfu.models.PublishOption publish_options = 1;
     */
    publishOptions: PublishOption[];
    /**
     * @generated from protobuf field: string reason = 2;
     */
    reason: string;
}
/**
 * @generated from protobuf message stream.video.sfu.event.ChangePublishOptionsComplete
 */
export interface ChangePublishOptionsComplete {
}
/**
 * @generated from protobuf message stream.video.sfu.event.ParticipantMigrationComplete
 */
export interface ParticipantMigrationComplete {
}
/**
 * @generated from protobuf message stream.video.sfu.event.PinsChanged
 */
export interface PinsChanged {
    /**
     * the list of pins in the call.
     * Pins are ordered in descending order (most important first).
     *
     * @generated from protobuf field: repeated stream.video.sfu.models.Pin pins = 1;
     */
    pins: Pin[];
}
/**
 * @generated from protobuf message stream.video.sfu.event.Error
 */
export interface Error {
    /**
     * @generated from protobuf field: stream.video.sfu.models.Error error = 4;
     */
    error?: Error$;
    /**
     * returns the reconnect strategy to be used by the client
     *
     * @generated from protobuf field: stream.video.sfu.models.WebsocketReconnectStrategy reconnect_strategy = 5;
     */
    reconnectStrategy: WebsocketReconnectStrategy;
}
/**
 * @generated from protobuf message stream.video.sfu.event.ICETrickle
 */
export interface ICETrickle {
    /**
     * @generated from protobuf field: stream.video.sfu.models.PeerType peer_type = 1;
     */
    peerType: PeerType;
    /**
     * @generated from protobuf field: string ice_candidate = 2;
     */
    iceCandidate: string;
}
/**
 * @generated from protobuf message stream.video.sfu.event.ICERestart
 */
export interface ICERestart {
    /**
     * @generated from protobuf field: stream.video.sfu.models.PeerType peer_type = 1;
     */
    peerType: PeerType;
}
/**
 * SfuRequest is a message that is sent from the client to the SFU.
 *
 * @generated from protobuf message stream.video.sfu.event.SfuRequest
 */
export interface SfuRequest {
    /**
     * @generated from protobuf oneof: request_payload
     */
    requestPayload: {
        oneofKind: 'joinRequest';
        /**
         * @generated from protobuf field: stream.video.sfu.event.JoinRequest join_request = 1;
         */
        joinRequest: JoinRequest;
    } | {
        oneofKind: 'healthCheckRequest';
        /**
         * @generated from protobuf field: stream.video.sfu.event.HealthCheckRequest health_check_request = 2;
         */
        healthCheckRequest: HealthCheckRequest;
    } | {
        oneofKind: 'leaveCallRequest';
        /**
         * @generated from protobuf field: stream.video.sfu.event.LeaveCallRequest leave_call_request = 3;
         */
        leaveCallRequest: LeaveCallRequest;
    } | {
        oneofKind: undefined;
    };
}
/**
 * @generated from protobuf message stream.video.sfu.event.LeaveCallRequest
 */
export interface LeaveCallRequest {
    /**
     * @generated from protobuf field: string session_id = 1;
     */
    sessionId: string;
    /**
     * @generated from protobuf field: string reason = 2;
     */
    reason: string;
}
/**
 * @generated from protobuf message stream.video.sfu.event.HealthCheckRequest
 */
export interface HealthCheckRequest {
}
/**
 * @generated from protobuf message stream.video.sfu.event.HealthCheckResponse
 */
export interface HealthCheckResponse {
    /**
     * @generated from protobuf field: stream.video.sfu.models.ParticipantCount participant_count = 1;
     */
    participantCount?: ParticipantCount;
}
/**
 * @generated from protobuf message stream.video.sfu.event.TrackPublished
 */
export interface TrackPublished {
    /**
     * @generated from protobuf field: string user_id = 1;
     */
    userId: string;
    /**
     * @generated from protobuf field: string session_id = 2;
     */
    sessionId: string;
    /**
     * @generated from protobuf field: stream.video.sfu.models.TrackType type = 3;
     */
    type: TrackType;
    /**
     * Participant information here is included as an optimisation
     * for large calls where broadcasting on every participant join
     * is expensive. You should **NOT** assume that this will always
     * be available though you can use it to update the participant
     * list when it is there.
     *
     * @generated from protobuf field: stream.video.sfu.models.Participant participant = 4;
     */
    participant?: Participant;
}
/**
 * @generated from protobuf message stream.video.sfu.event.TrackUnpublished
 */
export interface TrackUnpublished {
    /**
     * @generated from protobuf field: string user_id = 1;
     */
    userId: string;
    /**
     * @generated from protobuf field: string session_id = 2;
     */
    sessionId: string;
    /**
     * @generated from protobuf field: stream.video.sfu.models.TrackType type = 3;
     */
    type: TrackType;
    /**
     * @generated from protobuf field: stream.video.sfu.models.TrackUnpublishReason cause = 4;
     */
    cause: TrackUnpublishReason;
    /**
     * Participant information here is included as an optimisation
     * for large calls where broadcasting on every participant join
     * is expensive. You should **NOT** assume that this will always
     * be available though you can use it to update the participant
     * list when it is there.
     *
     * @generated from protobuf field: stream.video.sfu.models.Participant participant = 5;
     */
    participant?: Participant;
}
/**
 * @generated from protobuf message stream.video.sfu.event.JoinRequest
 */
export interface JoinRequest {
    /**
     * @generated from protobuf field: string token = 1;
     */
    token: string;
    /**
     * @generated from protobuf field: string session_id = 2;
     */
    sessionId: string;
    /**
     * user_session id can change during reconnects, this helps us to
     * identify the user across reconnects and should remain consistent until the user explicitly
     * disconnects, is kicked or the call is ended.
     *
     * @generated from protobuf field: string unified_session_id = 13;
     */
    unifiedSessionId: string;
    /**
     * dumb SDP that allow us to extract subscriber's decode codecs
     *
     * @generated from protobuf field: string subscriber_sdp = 3;
     */
    subscriberSdp: string;
    /**
     * @generated from protobuf field: string publisher_sdp = 8;
     */
    publisherSdp: string;
    /**
     * @generated from protobuf field: stream.video.sfu.models.ClientDetails client_details = 4;
     */
    clientDetails?: ClientDetails;
    /**
     * Deprecated: use ReconnectDetails instead
     *
     * @deprecated
     * @generated from protobuf field: stream.video.sfu.event.Migration migration = 5 [deprecated = true];
     */
    migration?: Migration;
    /**
     * Fast reconnect flag explicitly indicates that if the participant session
     * and the associated state is still present in the SFU, the client is ready
     * to restore the PeerConnection with an ICE restart. If the SFU replies with
     * "reconnected: true" in its JoinResponse, then it is safe to perform an ICE
     * restart or else the existing PeerConnections must be cleaned up.
     *
     * For the SFU, fast_reconnect:false indicates that even if it has the state
     * cached, the client state is not in sync and hence it must be cleaned up before
     * proceeding further.
     *
     * @deprecated
     * @generated from protobuf field: bool fast_reconnect = 6 [deprecated = true];
     */
    fastReconnect: boolean;
    /**
     * @generated from protobuf field: stream.video.sfu.event.ReconnectDetails reconnect_details = 7;
     */
    reconnectDetails?: ReconnectDetails;
    /**
     * @generated from protobuf field: repeated stream.video.sfu.models.PublishOption preferred_publish_options = 9;
     */
    preferredPublishOptions: PublishOption[];
    /**
     * @generated from protobuf field: repeated stream.video.sfu.models.SubscribeOption preferred_subscribe_options = 10;
     */
    preferredSubscribeOptions: SubscribeOption[];
    /**
     * @generated from protobuf field: repeated stream.video.sfu.models.ClientCapability capabilities = 11;
     */
    capabilities: ClientCapability[];
    /**
     * @generated from protobuf field: stream.video.sfu.models.ParticipantSource source = 12;
     */
    source: ParticipantSource;
}
/**
 * @generated from protobuf message stream.video.sfu.event.ReconnectDetails
 */
export interface ReconnectDetails {
    /**
     * @generated from protobuf field: stream.video.sfu.models.WebsocketReconnectStrategy strategy = 1;
     */
    strategy: WebsocketReconnectStrategy;
    /**
     * @generated from protobuf field: repeated stream.video.sfu.models.TrackInfo announced_tracks = 3;
     */
    announcedTracks: TrackInfo[];
    /**
     * @generated from protobuf field: repeated stream.video.sfu.signal.TrackSubscriptionDetails subscriptions = 4;
     */
    subscriptions: TrackSubscriptionDetails[];
    /**
     * @generated from protobuf field: uint32 reconnect_attempt = 5;
     */
    reconnectAttempt: number;
    /**
     * @generated from protobuf field: string from_sfu_id = 6;
     */
    fromSfuId: string;
    /**
     * only set in case of rejoin
     *
     * @generated from protobuf field: string previous_session_id = 7;
     */
    previousSessionId: string;
    /**
     * the reconnect reason
     *
     * @generated from protobuf field: string reason = 8;
     */
    reason: string;
}
/**
 * @generated from protobuf message stream.video.sfu.event.Migration
 */
export interface Migration {
    /**
     * @generated from protobuf field: string from_sfu_id = 1;
     */
    fromSfuId: string;
    /**
     * @generated from protobuf field: repeated stream.video.sfu.models.TrackInfo announced_tracks = 2;
     */
    announcedTracks: TrackInfo[];
    /**
     * @generated from protobuf field: repeated stream.video.sfu.signal.TrackSubscriptionDetails subscriptions = 3;
     */
    subscriptions: TrackSubscriptionDetails[];
}
/**
 * @generated from protobuf message stream.video.sfu.event.JoinResponse
 */
export interface JoinResponse {
    /**
     * @generated from protobuf field: stream.video.sfu.models.CallState call_state = 1;
     */
    callState?: CallState;
    /**
     * @generated from protobuf field: bool reconnected = 2;
     */
    reconnected: boolean;
    /**
     * @generated from protobuf field: int32 fast_reconnect_deadline_seconds = 3;
     */
    fastReconnectDeadlineSeconds: number;
    /**
     * @generated from protobuf field: repeated stream.video.sfu.models.PublishOption publish_options = 4;
     */
    publishOptions: PublishOption[];
}
/**
 * ParticipantJoined is fired when a user joins a call
 *
 * @generated from protobuf message stream.video.sfu.event.ParticipantJoined
 */
export interface ParticipantJoined {
    /**
     * @generated from protobuf field: string call_cid = 1;
     */
    callCid: string;
    /**
     * @generated from protobuf field: stream.video.sfu.models.Participant participant = 2;
     */
    participant?: Participant;
    /**
     * @generated from protobuf field: bool is_pinned = 3;
     */
    isPinned: boolean;
}
/**
 * ParticipantJoined is fired when a user leaves a call
 *
 * @generated from protobuf message stream.video.sfu.event.ParticipantLeft
 */
export interface ParticipantLeft {
    /**
     * @generated from protobuf field: string call_cid = 1;
     */
    callCid: string;
    /**
     * @generated from protobuf field: stream.video.sfu.models.Participant participant = 2;
     */
    participant?: Participant;
}
/**
 * ParticipantUpdated is fired when user data is updated
 *
 * @generated from protobuf message stream.video.sfu.event.ParticipantUpdated
 */
export interface ParticipantUpdated {
    /**
     * @generated from protobuf field: string call_cid = 1;
     */
    callCid: string;
    /**
     * @generated from protobuf field: stream.video.sfu.models.Participant participant = 2;
     */
    participant?: Participant;
}
/**
 * SubscriberOffer is sent when the SFU adds tracks to a subscription
 *
 * @generated from protobuf message stream.video.sfu.event.SubscriberOffer
 */
export interface SubscriberOffer {
    /**
     * @generated from protobuf field: bool ice_restart = 1;
     */
    iceRestart: boolean;
    /**
     * @generated from protobuf field: string sdp = 2;
     */
    sdp: string;
    /**
     * @generated from protobuf field: uint32 negotiation_id = 3;
     */
    negotiationId: number;
}
/**
 * @generated from protobuf message stream.video.sfu.event.PublisherAnswer
 */
export interface PublisherAnswer {
    /**
     * @generated from protobuf field: string sdp = 1;
     */
    sdp: string;
}
/**
 * ConnectionQuality is sent to inform about connection quality changes
 * eg. thierry's connection is not good -> render a red icon Zoom style
 *
 * @generated from protobuf message stream.video.sfu.event.ConnectionQualityChanged
 */
export interface ConnectionQualityChanged {
    /**
     * @generated from protobuf field: repeated stream.video.sfu.event.ConnectionQualityInfo connection_quality_updates = 1;
     */
    connectionQualityUpdates: ConnectionQualityInfo[];
}
/**
 * @generated from protobuf message stream.video.sfu.event.ConnectionQualityInfo
 */
export interface ConnectionQualityInfo {
    /**
     * @generated from protobuf field: string user_id = 1;
     */
    userId: string;
    /**
     * @generated from protobuf field: string session_id = 2;
     */
    sessionId: string;
    /**
     * @generated from protobuf field: stream.video.sfu.models.ConnectionQuality connection_quality = 3;
     */
    connectionQuality: ConnectionQuality;
}
/**
 * DominantSpeakerChanged is sent by the SFU to notify when there is a new dominant speaker in the call
 *
 * @generated from protobuf message stream.video.sfu.event.DominantSpeakerChanged
 */
export interface DominantSpeakerChanged {
    /**
     * @generated from protobuf field: string user_id = 1;
     */
    userId: string;
    /**
     * @generated from protobuf field: string session_id = 2;
     */
    sessionId: string;
}
/**
 * @generated from protobuf message stream.video.sfu.event.AudioLevel
 */
export interface AudioLevel {
    /**
     * @generated from protobuf field: string user_id = 1;
     */
    userId: string;
    /**
     * @generated from protobuf field: string session_id = 2;
     */
    sessionId: string;
    /**
     * 0.0 means complete silence, 1.0 loudest
     *
     * @generated from protobuf field: float level = 3;
     */
    level: number;
    /**
     * @generated from protobuf field: bool is_speaking = 4;
     */
    isSpeaking: boolean;
}
/**
 * AudioLevelChanged is sent by the SFU to notify about audio levels by user
 *
 * @generated from protobuf message stream.video.sfu.event.AudioLevelChanged
 */
export interface AudioLevelChanged {
    /**
     * @generated from protobuf field: repeated stream.video.sfu.event.AudioLevel audio_levels = 1;
     */
    audioLevels: AudioLevel[];
}
/**
 * @generated from protobuf message stream.video.sfu.event.AudioSender
 */
export interface AudioSender {
    /**
     * @generated from protobuf field: stream.video.sfu.models.Codec codec = 2;
     */
    codec?: Codec;
    /**
     * @generated from protobuf field: stream.video.sfu.models.TrackType track_type = 3;
     */
    trackType: TrackType;
    /**
     * @generated from protobuf field: int32 publish_option_id = 4;
     */
    publishOptionId: number;
}
/**
 * VideoLayerSetting is used to specify various parameters of a particular encoding in simulcast.
 * The parameters are specified here - https://developer.mozilla.org/en-US/docs/Web/API/RTCRtpEncodingParameters
 * SDKs use these parameters sent from the server to dynamically adjust these parameters to save CPU, bandwidth
 *
 * @generated from protobuf message stream.video.sfu.event.VideoLayerSetting
 */
export interface VideoLayerSetting {
    /**
     * @generated from protobuf field: string name = 1;
     */
    name: string;
    /**
     * @generated from protobuf field: bool active = 2;
     */
    active: boolean;
    /**
     * @generated from protobuf field: int32 max_bitrate = 3;
     */
    maxBitrate: number;
    /**
     * @generated from protobuf field: float scale_resolution_down_by = 4;
     */
    scaleResolutionDownBy: number;
    /**
     * @generated from protobuf field: stream.video.sfu.models.Codec codec = 6;
     */
    codec?: Codec;
    /**
     * @generated from protobuf field: uint32 max_framerate = 7;
     */
    maxFramerate: number;
    /**
     * @generated from protobuf field: string scalability_mode = 8;
     */
    scalabilityMode: string;
}
/**
 * @generated from protobuf message stream.video.sfu.event.VideoSender
 */
export interface VideoSender {
    /**
     * @generated from protobuf field: stream.video.sfu.models.Codec codec = 2;
     */
    codec?: Codec;
    /**
     * @generated from protobuf field: repeated stream.video.sfu.event.VideoLayerSetting layers = 3;
     */
    layers: VideoLayerSetting[];
    /**
     * @generated from protobuf field: stream.video.sfu.models.TrackType track_type = 4;
     */
    trackType: TrackType;
    /**
     * @generated from protobuf field: int32 publish_option_id = 5;
     */
    publishOptionId: number;
    /**
     * @generated from protobuf field: stream.video.sfu.models.DegradationPreference degradation_preference = 6;
     */
    degradationPreference: DegradationPreference;
}
/**
 * sent to users when they need to change the quality of their video
 *
 * @generated from protobuf message stream.video.sfu.event.ChangePublishQuality
 */
export interface ChangePublishQuality {
    /**
     * @generated from protobuf field: repeated stream.video.sfu.event.AudioSender audio_senders = 1;
     */
    audioSenders: AudioSender[];
    /**
     * @generated from protobuf field: repeated stream.video.sfu.event.VideoSender video_senders = 2;
     */
    videoSenders: VideoSender[];
}
/**
 * CallGrants is sent to users when there is a change in the call permissions
 * to publish audio, video or share the screen for a user or a role. This is
 * idempotent and can be sent at any time. Only the current_grants in the latest
 * message should be considered. In other words, this is not dependent on any
 * other message (including previous call_grants_updated message)
 *
 * When this message is received, the client (say, React component) should mute
 * the tracks which are not allowed anymore. For example, if the message has
 * grants {audio:true, video:false} while the user is publishing video, then the
 * client component should mute the video track and gray out the video button.
 * This way, the user will not be able to publish video until the permissions
 * are granted again. Also, muting the track on the client side will prevent
 * the SFU from receiving the video track and will save bandwidth.
 *
 * In simple words, this is exactly the same as muting a track on the client.
 * Here, instead of the user instructing the client, SFU would be doing it.
 *
 * @generated from protobuf message stream.video.sfu.event.CallGrantsUpdated
 */
export interface CallGrantsUpdated {
    /**
     * @generated from protobuf field: stream.video.sfu.models.CallGrants current_grants = 1;
     */
    currentGrants?: CallGrants;
    /**
     * @generated from protobuf field: string message = 2;
     */
    message: string;
}
/**
 * Go away is sent by the SFU to the client to signal to migrate away from the SFU.
 * The evict reason may specify why the user is being evicted.
 *
 * @generated from protobuf message stream.video.sfu.event.GoAway
 */
export interface GoAway {
    /**
     * @generated from protobuf field: stream.video.sfu.models.GoAwayReason reason = 1;
     */
    reason: GoAwayReason;
}
/**
 * CallEnded is sent by the SFU to the client to signal that the call has ended.
 * The reason may specify why the call has ended.
 *
 * @generated from protobuf message stream.video.sfu.event.CallEnded
 */
export interface CallEnded {
    /**
     * @generated from protobuf field: stream.video.sfu.models.CallEndedReason reason = 1;
     */
    reason: CallEndedReason;
}
/**
 * @generated from protobuf message stream.video.sfu.event.InboundStateNotification
 */
export interface InboundStateNotification {
    /**
     * @generated from protobuf field: repeated stream.video.sfu.event.InboundVideoState inbound_video_states = 1;
     */
    inboundVideoStates: InboundVideoState[];
}
/**
 * @generated from protobuf message stream.video.sfu.event.InboundVideoState
 */
export interface InboundVideoState {
    /**
     * @generated from protobuf field: string user_id = 1;
     */
    userId: string;
    /**
     * @generated from protobuf field: string session_id = 2;
     */
    sessionId: string;
    /**
     * @generated from protobuf field: stream.video.sfu.models.TrackType track_type = 3;
     */
    trackType: TrackType;
    /**
     * @generated from protobuf field: bool paused = 4;
     */
    paused: boolean;
}
declare class SfuEvent$Type extends MessageType<SfuEvent> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.SfuEvent
 */
export declare const SfuEvent: SfuEvent$Type;
declare class ChangePublishOptions$Type extends MessageType<ChangePublishOptions> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.ChangePublishOptions
 */
export declare const ChangePublishOptions: ChangePublishOptions$Type;
declare class ChangePublishOptionsComplete$Type extends MessageType<ChangePublishOptionsComplete> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.ChangePublishOptionsComplete
 */
export declare const ChangePublishOptionsComplete: ChangePublishOptionsComplete$Type;
declare class ParticipantMigrationComplete$Type extends MessageType<ParticipantMigrationComplete> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.ParticipantMigrationComplete
 */
export declare const ParticipantMigrationComplete: ParticipantMigrationComplete$Type;
declare class PinsChanged$Type extends MessageType<PinsChanged> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.PinsChanged
 */
export declare const PinsChanged: PinsChanged$Type;
declare class Error$Type extends MessageType<Error> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.Error
 */
export declare const Error: Error$Type;
declare class ICETrickle$Type extends MessageType<ICETrickle> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.ICETrickle
 */
export declare const ICETrickle: ICETrickle$Type;
declare class ICERestart$Type extends MessageType<ICERestart> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.ICERestart
 */
export declare const ICERestart: ICERestart$Type;
declare class SfuRequest$Type extends MessageType<SfuRequest> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.SfuRequest
 */
export declare const SfuRequest: SfuRequest$Type;
declare class LeaveCallRequest$Type extends MessageType<LeaveCallRequest> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.LeaveCallRequest
 */
export declare const LeaveCallRequest: LeaveCallRequest$Type;
declare class HealthCheckRequest$Type extends MessageType<HealthCheckRequest> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.HealthCheckRequest
 */
export declare const HealthCheckRequest: HealthCheckRequest$Type;
declare class HealthCheckResponse$Type extends MessageType<HealthCheckResponse> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.HealthCheckResponse
 */
export declare const HealthCheckResponse: HealthCheckResponse$Type;
declare class TrackPublished$Type extends MessageType<TrackPublished> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.TrackPublished
 */
export declare const TrackPublished: TrackPublished$Type;
declare class TrackUnpublished$Type extends MessageType<TrackUnpublished> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.TrackUnpublished
 */
export declare const TrackUnpublished: TrackUnpublished$Type;
declare class JoinRequest$Type extends MessageType<JoinRequest> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.JoinRequest
 */
export declare const JoinRequest: JoinRequest$Type;
declare class ReconnectDetails$Type extends MessageType<ReconnectDetails> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.ReconnectDetails
 */
export declare const ReconnectDetails: ReconnectDetails$Type;
declare class Migration$Type extends MessageType<Migration> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.Migration
 */
export declare const Migration: Migration$Type;
declare class JoinResponse$Type extends MessageType<JoinResponse> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.JoinResponse
 */
export declare const JoinResponse: JoinResponse$Type;
declare class ParticipantJoined$Type extends MessageType<ParticipantJoined> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.ParticipantJoined
 */
export declare const ParticipantJoined: ParticipantJoined$Type;
declare class ParticipantLeft$Type extends MessageType<ParticipantLeft> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.ParticipantLeft
 */
export declare const ParticipantLeft: ParticipantLeft$Type;
declare class ParticipantUpdated$Type extends MessageType<ParticipantUpdated> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.ParticipantUpdated
 */
export declare const ParticipantUpdated: ParticipantUpdated$Type;
declare class SubscriberOffer$Type extends MessageType<SubscriberOffer> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.SubscriberOffer
 */
export declare const SubscriberOffer: SubscriberOffer$Type;
declare class PublisherAnswer$Type extends MessageType<PublisherAnswer> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.PublisherAnswer
 */
export declare const PublisherAnswer: PublisherAnswer$Type;
declare class ConnectionQualityChanged$Type extends MessageType<ConnectionQualityChanged> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.ConnectionQualityChanged
 */
export declare const ConnectionQualityChanged: ConnectionQualityChanged$Type;
declare class ConnectionQualityInfo$Type extends MessageType<ConnectionQualityInfo> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.ConnectionQualityInfo
 */
export declare const ConnectionQualityInfo: ConnectionQualityInfo$Type;
declare class DominantSpeakerChanged$Type extends MessageType<DominantSpeakerChanged> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.DominantSpeakerChanged
 */
export declare const DominantSpeakerChanged: DominantSpeakerChanged$Type;
declare class AudioLevel$Type extends MessageType<AudioLevel> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.AudioLevel
 */
export declare const AudioLevel: AudioLevel$Type;
declare class AudioLevelChanged$Type extends MessageType<AudioLevelChanged> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.AudioLevelChanged
 */
export declare const AudioLevelChanged: AudioLevelChanged$Type;
declare class AudioSender$Type extends MessageType<AudioSender> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.AudioSender
 */
export declare const AudioSender: AudioSender$Type;
declare class VideoLayerSetting$Type extends MessageType<VideoLayerSetting> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.VideoLayerSetting
 */
export declare const VideoLayerSetting: VideoLayerSetting$Type;
declare class VideoSender$Type extends MessageType<VideoSender> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.VideoSender
 */
export declare const VideoSender: VideoSender$Type;
declare class ChangePublishQuality$Type extends MessageType<ChangePublishQuality> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.ChangePublishQuality
 */
export declare const ChangePublishQuality: ChangePublishQuality$Type;
declare class CallGrantsUpdated$Type extends MessageType<CallGrantsUpdated> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.CallGrantsUpdated
 */
export declare const CallGrantsUpdated: CallGrantsUpdated$Type;
declare class GoAway$Type extends MessageType<GoAway> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.GoAway
 */
export declare const GoAway: GoAway$Type;
declare class CallEnded$Type extends MessageType<CallEnded> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.CallEnded
 */
export declare const CallEnded: CallEnded$Type;
declare class InboundStateNotification$Type extends MessageType<InboundStateNotification> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.InboundStateNotification
 */
export declare const InboundStateNotification: InboundStateNotification$Type;
declare class InboundVideoState$Type extends MessageType<InboundVideoState> {
    constructor();
}
/**
 * @generated MessageType for protobuf message stream.video.sfu.event.InboundVideoState
 */
export declare const InboundVideoState: InboundVideoState$Type;
export {};
