UNPKG

rx-player

Version:
566 lines 22.2 kB
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