import type { IResolutionInfo, IManifestFetcherSettings, ISegmentQueueCreatorBackoffOptions, IPausedPlaybackObservation, IRepresentationsChoice, ITrackSwitchingMode } from "../core/types";
import type { IDefaultConfig } from "../default_config";
import type { ISerializedSourceBufferError } from "../errors/source_buffer_error";
import type { SourceBufferType } from "../mse";
import type { IFreezingStatus, IRebufferingStatus } from "../playback_observer";
import type { ICmcdOptions, IManifestLoader, IRepresentationFilter, ISegmentLoader, ITrackType } from "../public_types";
import type { ITransportOptions } from "../transports";
import type { ILogFormat, ILoggerLevel } from "../utils/logger";
import type { IRange } from "../utils/ranges";
import type RxPlayer from "./api";
import type { IContentProtection, IProcessedProtectionData } from "./decrypt";
import type { ITextDisplayer, ITextDisplayerData } from "./text_displayer";
export type IRxPlayer = RxPlayer;
export type { IContentProtection, IProcessedProtectionData, ITextDisplayer, ITextDisplayerData, };
/**
 * First message sent by the main thread to the Core.
 * The Core should only receive one `IInitMessage` at most and it should be
 * always the first message received.
 *
 * Allows for Core initialization.
 */
export interface IInitMessage {
    type: MainThreadMessageType.Init;
    value: {
        /** Link to the DASH_WASM's feature WebAssembly file to parse DASH MPDs. */
        dashWasmUrl: string | undefined;
        /**
         * If `true` the final element on the current page displaying the content
         * can display video content.
         *
         * If `false`, it cannot, but it can be assumed to be able to play audio
         * content.
         * An example where it would be set to `false` is for `HTMLAudioElement`
         * elements (`<audio>` tags).
         */
        hasVideo: boolean;
        /** Initial logging level that should be set. */
        logLevel: ILoggerLevel;
        /** Intitial logger's log format that should be set. */
        logFormat: ILogFormat;
        /**
         * If `true`, logs should be sent back to the main thread, through a
         * `ILogMessageCoreMessage` message.
         */
        sendBackLogs: boolean;
        /**
         * Value of `Date.now()` at the time the `timestamp` property was generated.
         *
         * This is mostly useful for timestamp synchronization: by calling both
         * `performance.now` (the same call on the main thread made to calculate
         * `timestamp` - but which is not synchronized initially to the Core's)
         * and `Date.now()` both on the main thread and on the Core,
         * calculating the difference between the two and comparing both the main
         * thread's difference and the Core's difference, you're able to
         * produce a relatively-synchronized timestamp between the two if they run
         * in different environment, e.g. a WebWorker.
         */
        date: number;
        /**
         * Value returned by `performance.now()` at the same time `date` was
         * calculated.
         *
         * Allows for timestamp synchronization.
         * @see date property.
         */
        timestamp: number;
    };
}
/** Options needed when initializing a new content. */
export interface IContentInitializationData {
    /**
     * Identifier uniquely identifying a specific content.
     *
     * Protects against all kind of race conditions or asynchronous issues.
     */
    contentId: string;
    /**
     * When set to an object, enable "Common Media Client Data", or "CMCD".
     */
    cmcd?: ICmcdOptions | undefined;
    /**
     * If `true`, the RxPlayer can enable its "Representation avoidance"
     * mechanism, where it avoid loading Representation that it suspect
     * have issues being decoded on the current device.
     */
    enableRepresentationAvoidance: boolean;
    /**
     * URL at which the content's Manifest is accessible.
     * `undefined` if unknown.
     */
    url?: string | undefined;
    /** If `true`, text buffer (e.g. for subtitles) is enabled. */
    hasText: boolean;
    /**
     * The type of "transport" wanted, e.g. "dash" or "smooth".
     */
    transport: string;
    /** Options relative to the streaming protocol. */
    transportOptions: Omit<ITransportOptions, "representationFilter" | "manifestLoader" | "segmentLoader"> & {
        manifestLoader: {
            fn?: IManifestLoader | undefined;
            workerId?: string | undefined;
        } | undefined;
        segmentLoader: {
            fn?: ISegmentLoader | undefined;
            workerId?: string | undefined;
        } | undefined;
        representationFilter: undefined | {
            fn?: IRepresentationFilter | undefined;
            eval?: string | undefined;
            workerId?: string | undefined;
        };
    };
    /** Initial video bitrate on which the adaptive logic will base itself. */
    initialVideoBitrate?: number | undefined;
    /** Initial audio bitrate on which the adaptive logic will base itself. */
    initialAudioBitrate?: number | undefined;
    /**
     * Options relative to the fetching and refreshing of the Manifest.
     */
    manifestRetryOptions: Omit<IManifestFetcherSettings, "cmcdDataBuilder">;
    /** Options relative to the fetching of media segments. */
    segmentRetryOptions: ISegmentQueueCreatorBackoffOptions;
    /**
     * If `true`, MSE API should be used in the core part of the RxPlayer when
     * relying on a WebWorker.
     * If `false`, they should be relied on on main thread.
     *
     * This might depend on both browser capabilities and preferences. It is
     * assumed that the caller perform all those checks, the core won't check
     * again the validity of this value.
     */
    useMseInWorker: boolean;
}
export interface ILogLevelUpdateMessage {
    type: MainThreadMessageType.LogLevelUpdate;
    value: {
        /** The new logger level that should be set. */
        logLevel: ILoggerLevel;
        /** Intitial logger's log format that should be set. */
        logFormat: ILogFormat;
        /**
         * If `true`, logs should be sent back to the main thread, through a
         * `ILogMessageCoreMessage` message.
         */
        sendBackLogs: boolean;
    };
}
/** Message sent by the main thread to update the Worker's global config. */
export interface IConfigUpdateMessage {
    type: MainThreadMessageType.ConfigUpdate;
    value: Partial<IDefaultConfig>;
}
/**
 * Message sent by the main thread when a new content should be "prepared".
 *
 * You can begin performing operarions which do not interrupt the previous
 * content, like fetching its Manifest.
 *
 * Note that on the receivings-side, you only need to prepare one content at
 * most. Meaning that if multiple `IPrepareContentMessage` arrive in a row, you
 * can stop the preparation of previous contents.
 */
export interface IPrepareContentMessage {
    type: MainThreadMessageType.PrepareContent;
    value: IContentInitializationData;
}
/**
 * Message sent by the main thread to stop playback of the last prepared content
 * (through a `IPrepareContentMessage`) - if it was playing - and dispose all
 * associated resources.
 */
export interface IStopContentMessage {
    type: MainThreadMessageType.StopContent;
    /**
     * Same `contentId` than for the corresponding `IPrepareContentMessage` message.
     *
     * Allows to ensure no race condition lead to actually stopping another content
     * than the one meant by the main thread.
     */
    contentId: string;
    value: null;
}
/**
 * Message sent by the main thread to start playback of the last prepared content
 * (through a `IPrepareContentMessage`).
 */
export interface IStartPreparedContentMessage {
    type: MainThreadMessageType.StartPreparedContent;
    /**
     * Same `contentId` than for the corresponding `IPrepareContentMessage` message.
     *
     * Allows to ensure no race condition lead to starting another content than
     * the one meant by the main thread.
     */
    contentId: string;
    value: IStartPreparedContentMessageValue;
}
/** Options needed when starting a new content. */
export interface IStartPreparedContentMessageValue {
    /** The start time at which we should play, in seconds. */
    initialTime: number;
    /** The current playback observation. */
    initialObservation: ISerializedPlaybackObservation;
    /**
     * Hex-encoded string identifying the key system used.
     * May be cross-referenced with the content's metadata when performing
     * optimizations.
     */
    drmSystemId: string | undefined;
    /**
     * Enable/Disable fastSwitching: allow to replace lower-quality segments by
     * higher-quality ones to have a faster transition.
     */
    enableFastSwitching: boolean;
    /** Behavior when a new video and/or audio codec is encountered. */
    onCodecSwitch: "continue" | "reload";
}
/**
 * Message sent by the main thread when it has updated its list of supported
 * codecs and has reasons to think that the Core is not aware of it
 * (e.g. their support was not set in a Manifest).
 */
export interface ICodecSupportUpdateMessage {
    type: MainThreadMessageType.CodecSupportUpdate;
    value: ICodecSupportInfo[];
}
export interface ICodecSupportInfo {
    mimeType: string;
    codec: string;
    supported?: boolean | undefined;
    supportedIfEncrypted?: boolean | undefined;
}
/**
 * Message sent by the main thread to the Core regularly after an
 * `IPrepareContentMessage` to provide various media-related metadata
 * only obtainable on the main thread.
 *
 * Those messages are sent until the `IStopContentMessage` for that same
 * `contentId`.
 */
export interface IPlaybackObservationMessage {
    type: MainThreadMessageType.PlaybackObservation;
    /**
     * Same `contentId` than for the corresponding `IPrepareContentMessage` message.
     * Allows to prevent race conditions.
     */
    contentId: string;
    /** The media-related metadata that has just been observed now. */
    value: ISerializedPlaybackObservation;
}
/**
 * Message sent by the main thread when at least one of the `Representation` of
 * the current content just had a change of decipherability status.
 *
 * That is if one of the Representation either:
 *   - became undecipherable
 *   - became decipherable
 *   - had its decipherability status transition from being known to unknown
 */
export interface IDecipherabilityStatusChangedMessage {
    type: MainThreadMessageType.DecipherabilityStatusUpdate;
    /**
     * Same `contentId` than for the corresponding `IPrepareContentMessage` message.
     * Allows to prevent race conditions.
     */
    contentId: string;
    /** List of the `Representation` which had their decipherability status updated. */
    value: IDecipherabilityStatusChangedPayload[];
}
/** Object describing the new decipherability status of a `Representation`. */
export interface IDecipherabilityStatusChangedPayload {
    /** `uniqueId` for the concerned `Representation`. */
    representationUniqueId: string;
    /**
     * If set to `true`, the `Representation` became decipherable.
     *
     * If set to `false`, the `Representation` became undecipherable.
     *
     * If set to `undefined`, the `Representation`'s decipherability status became
     * unknown.
     */
    decipherable: boolean | undefined;
}
/** Message allowing to update the URL of the content being played. */
export interface IUpdateContentUrlsMessage {
    type: MainThreadMessageType.ContentUrlsUpdate;
    /**
     * Same `contentId` than for the corresponding `IPrepareContentMessage` message.
     * Allows to prevent race conditions.
     */
    contentId: string;
    /** Information on the new URL to set. */
    value: IUpdateContentUrlsMessageValue;
}
/** Payload of an `IUpdateContentUrlsMessage`. */
export interface IUpdateContentUrlsMessageValue {
    /**
     * URLs to reach that Manifest from the most prioritized URL to the least
     * prioritized URL.
     */
    urls: string[] | undefined;
    /**
     * If `true` the resource in question (e.g. DASH's MPD) will be refreshed
     * immediately.
     */
    refreshNow: boolean;
}
export interface ITrackUpdateMessage {
    type: MainThreadMessageType.TrackUpdate;
    contentId: string;
    value: {
        periodId: string;
        bufferType: ITrackType;
        choice: ITrackUpdateChoiceObject | null | undefined;
    };
}
export interface ITrackUpdateChoiceObject {
    /** The Adaptation choosen. */
    adaptationId: string;
    /** "Switching mode" in which the track switch should happen. */
    switchingMode: ITrackSwitchingMode;
    /**
     * Shared reference allowing to indicate which Representations from
     * that Adaptation are allowed.
     */
    initialRepresentations: IRepresentationsChoice;
    /** Relative resuming position after a track change */
    relativeResumingPosition: number | undefined;
}
export interface IRepresentationUpdateMessage {
    type: MainThreadMessageType.RepresentationUpdate;
    contentId: string;
    value: {
        periodId: string;
        bufferType: ITrackType;
        adaptationId: string;
        choice: IRepresentationsChoice;
    };
}
/** Media-related metadata. */
export interface ISerializedPlaybackObservation {
    /**
     * Information on whether the media element was paused at the time of the
     * Observation.
     */
    paused: IPausedPlaybackObservation;
    position: [number, number | null];
    /** `readyState` property of the HTMLMediaElement. */
    readyState: number;
    /** Target playback rate at which we want to play the content. */
    speed: number;
    /** Theoretical maximum position on the content that can currently be played. */
    maximumPosition: number;
    /**
     * Ranges of buffered data per type of media.
     *
     * `null` as a record's value if no buffer exists for that type of media.
     *
     * `null` as a `buffered` value if this could not have been obtained on the
     * current environment (e.g. in the main thread).
     */
    buffered: Record<ITrackType, IRange[] | null>;
    duration: number;
    /**
     * Set if the player is short on audio and/or video media data and is a such,
     * rebuffering.
     * `null` if not.
     */
    rebuffering: IRebufferingStatus | null;
    /**
     * Set if the player is frozen, that is, stuck in place for unknown reason.
     * Note that this reason can be a valid one, such as a necessary license not
     * being obtained yet.
     *
     * `null` if the player is not frozen.
     */
    freezing: IFreezingStatus | null;
    /**
     * Gap between `currentTime` and the next position with un-buffered data.
     * `Infinity` if we don't have buffered data right now.
     * `undefined` if we cannot determine the buffer gap.
     */
    bufferGap: number | undefined;
    /**
     * Indicates whether the user agent believes it has enough buffered data to ensure
     * uninterrupted playback for a meaningful period or needs more data.
     * It also reflects whether the user agent can retrieve and buffer data in an
     * energy-efficient manner while maintaining the desired memory usage.
     * `true` indicates that the buffer is low, and more data should be buffered.
     * `false` indicates that there is enough buffered data, and no additional data needs
     *  to be buffered at this time.
     */
    canStream: boolean;
    /** If `true` the content is loaded until its maximum position. */
    fullyLoaded: boolean;
}
/**
 * Sent when the main thread had to "reload" the media source.
 * The worker should understand that this MediaSource won't be used anymore.
 */
export interface ITriggerMediaSourceReloadMainMessage {
    type: MainThreadMessageType.MediaSourceReload;
    /** Identify the MediaSource concerned by this message. */
    mediaSourceId: string;
    /** No message is necessary. */
    value: null;
}
/**
 * Sent when the SourceBuffer linked to the given `mediaSourceId` and
 * `SourceBufferType`, running on the main thread, succeeded to perform the last
 * operation given to it (either through an `AppendBufferCoreMessage` or a
 * `RemoveBufferCoreMessage`).
 */
export interface ISourceBufferOperationSuccessMainMessage {
    type: MainThreadMessageType.SourceBufferSuccess;
    /**
     * Identify the MediaSource which contains the SourceBuffer concerned by
     * this update.
     */
    mediaSourceId: string;
    /**
     * Id uniquely identifying this SourceBuffer.
     * It should be the same `SourceBufferType` than the one on the
     * `CreateSourceBufferCoreMessage`.
     */
    sourceBufferType: SourceBufferType;
    /** Identify the corresponding SourceBuffer operation. */
    operationId: string;
    value: {
        /**
         * New contiguous buffered time ranges, in chronological order in seconds.
         */
        buffered: IRange[];
    };
}
export interface ISourceBufferErrorMainMessage {
    type: MainThreadMessageType.SourceBufferError;
    /**
     * Identify the MediaSource which contains the SourceBuffer concerned by
     * this update.
     */
    mediaSourceId: string;
    /** Identify the SourceBuffer in question. */
    sourceBufferType: SourceBufferType;
    /** Identify the corresponding SourceBuffer operation. */
    operationId: string;
    value: ISerializedSourceBufferError | {
        /**
         * Identify a cancellation-specific error (the corresponding operation
         * was cancelled.
         */
        errorName: "CancellationError";
    };
}
/**
 * Sent by the main thread to a Worker when the MediaSource linked to the
 * `mediaSourceId` changed its readyState.
 *
 * This message is only sent if the MediaSource is created on the main thread.
 */
export interface IMediaSourceReadyStateChangeMainMessage {
    type: MainThreadMessageType.MediaSourceReadyStateChange;
    /** Identify the MediaSource through this unique identifier. */
    mediaSourceId: string;
    value: ReadyState;
}
export interface IPushTextDataSuccessMessage {
    type: MainThreadMessageType.PushTextDataSuccess;
    contentId: string;
    value: {
        ranges: IRange[];
    };
}
export interface IRemoveTextDataSuccessMessage {
    type: MainThreadMessageType.RemoveTextDataSuccess;
    contentId: string;
    value: {
        ranges: IRange[];
    };
}
export interface IPushTextDataErrorMessage {
    type: MainThreadMessageType.PushTextDataError;
    contentId: string;
    value: {
        message: string;
    };
}
export interface IRemoveTextDataErrorMessage {
    type: MainThreadMessageType.RemoveTextDataError;
    contentId: string;
    value: {
        message: string;
    };
}
/** Message sent from main thread when it wants to fetch thumbnail data. */
export interface IThumbnailDataRequestMainMessage {
    type: MainThreadMessageType.ThumbnailDataRequest;
    contentId: string;
    value: {
        requestId: number;
        periodId: string;
        thumbnailTrackId: string;
        time: number;
    };
}
/**
 * Template for a message originating from main thread to update
 * `SharedReference` objects (a common abstraction of the RxPlayer allowing for
 * passing values whose updates can be listened to through a callback).
 *
 * Here, `TRefName` is the "name" of the `SharedReference` (the identifier
 * choosen for it) and `TRefType` is the type of its value.
 */
export interface IReferenceUpdate<TRefName extends string, TRefType> {
    type: MainThreadMessageType.ReferenceUpdate;
    value: {
        name: TRefName;
        newVal: TRefType;
    };
}
export type IReferenceUpdateMessage = IReferenceUpdate<"wantedBufferAhead", number> | IReferenceUpdate<"maxVideoBufferSize", number> | IReferenceUpdate<"maxBufferBehind", number> | IReferenceUpdate<"maxBufferAhead", number> | IReferenceUpdate<"limitVideoResolution", IResolutionInfo> | IReferenceUpdate<"throttleVideoBitrate", number>;
export interface IPullSegmentSinkStoreInfos {
    type: MainThreadMessageType.PullSegmentSinkStoreInfos;
    value: {
        requestId: number;
    };
}
/** Message sent by the application to the worker. */
export interface IAppDefinedMessage {
    type: MainThreadMessageType.AppDefined;
    value: {
        /** "name" for this event, application-defined. */
        name: string;
        /** application-defined payload for this event. */
        payload: unknown;
    };
}
export declare const enum MainThreadMessageType {
    Init = "init",
    PushTextDataSuccess = "add-text-success",
    RemoveTextDataSuccess = "remove-text-success",
    PushTextDataError = "push-text-error",
    RemoveTextDataError = "remove-text-error",
    CodecSupportUpdate = "codec-support-update",
    ContentUrlsUpdate = "urls-update",
    ConfigUpdate = "config-update",
    DecipherabilityStatusUpdate = "decipherability-update",
    LogLevelUpdate = "log-level-update",
    MediaSourceReadyStateChange = "media-source-ready-state-change",
    PlaybackObservation = "observation",
    PrepareContent = "prepare",
    ReferenceUpdate = "ref-update",
    RepresentationUpdate = "rep-update",
    MediaSourceReload = "ms-reload",
    SourceBufferError = "sb-error",
    SourceBufferSuccess = "sb-success",
    StartPreparedContent = "start",
    StopContent = "stop",
    TrackUpdate = "track-update",
    PullSegmentSinkStoreInfos = "pull-segment-sink-store-infos",
    ThumbnailDataRequest = "thumbnail-request",
    AppDefined = "app-defined"
}
export type IMainThreadMessage = IInitMessage | ILogLevelUpdateMessage | IConfigUpdateMessage | IPrepareContentMessage | IStopContentMessage | IStartPreparedContentMessage | IReferenceUpdateMessage | ICodecSupportUpdateMessage | IPlaybackObservationMessage | IDecipherabilityStatusChangedMessage | IUpdateContentUrlsMessage | ITriggerMediaSourceReloadMainMessage | ISourceBufferErrorMainMessage | ISourceBufferOperationSuccessMainMessage | ITrackUpdateMessage | IRepresentationUpdateMessage | IPushTextDataSuccessMessage | IRemoveTextDataSuccessMessage | IPushTextDataErrorMessage | IRemoveTextDataErrorMessage | IMediaSourceReadyStateChangeMainMessage | IPullSegmentSinkStoreInfos | IThumbnailDataRequestMainMessage | IAppDefinedMessage;
//# sourceMappingURL=types.d.ts.map