import { CustomEventType, Html5EventType } from '../../../../event/event-type';
import Track from '../../../../track/track';
import VideoTrack from '../../../../track/video-track';
import AudioTrack from '../../../../track/audio-track';
import PKTextTrack from '../../../../track/text-track';
import { RequestType } from '../../../../enums/request-type';
import BaseMediaSourceAdapter from '../base-media-source-adapter';
import { getSuitableSourceForResolution } from '../../../../utils/resolution';
import { filterTracksByRestriction } from '../../../../utils/restrictions';
import * as Utils from '../../../../utils/util';
import FairPlay from '../../../../drm/fairplay';
import Env from '../../../../utils/env';
import Error from '../../../../error/error';
import defaultConfig from './native-adapter-default-config.json';
import type { FairPlayDrmConfigType } from './fairplay-drm-handler';
import { FairPlayDrmHandler } from './fairplay-drm-handler';
import { IDrmProtocol, IMediaSourceAdapter, PKABRRestrictionObject, PKDrmConfigObject, PKDrmDataObject, PKMediaSourceObject, PKRequestObject, PKVideoDimensionsObject } from '../../../../types';
import { FairPlayDrmHandlerV2 } from './fairplay-drm-handler-v2';
import { ManifestHandler } from './manifest-handler';
const BACK_TO_FOCUS_TIMEOUT: number = 1000;
const MAX_MEDIA_RECOVERY_ATTEMPTS: number = 3;
const NUDGE_SEEK_AFTER_FOCUS: number = 0.1;
const SAFARI_BUFFERED_SEGMENTS_COUNT: number = 3;
const LIVE_DURATION_INTERVAL_MS = 1000;
const NATIVE_TEXT_CLASS = 'playkit-native-text';
/**
* An illustration of media source extension for progressive download
* @classdesc
* @implements {IMediaSourceAdapter}
*/
export default class NativeAdapter extends BaseMediaSourceAdapter {
/**
* The id of the Adapter
* @member {string} id
* @static
* @public
*/
public static id: string = 'NativeAdapter';
/**
* The adapter logger
* @member {any} _logger
* @private
* @static
*/
protected static _logger = BaseMediaSourceAdapter.getLogger(NativeAdapter.id);
/**
* static video element for canPlayType testing
* @member {} TEST_VIDEO
* @type {HTMLVideoElement}
* @static
*/
public static TEST_VIDEO: HTMLVideoElement = Utils.Dom.createElement('video');
/**
* The DRM protocols implementations for native adapter.
* @type {Array}
* @private
* @static
*/
private static _drmProtocols: Array = [FairPlay];
/**
* The DRM protocol for the current playback.
* @type {?Function}
* @private
* @static
*/
private static _drmProtocol: IDrmProtocol | null = null;
/**
* The supported progressive mime types by the native adapter.
* @member {Array} _progressiveMimeTypes
* @static
* @private
*/
private static _progressiveMimeTypes: Array = ['video/mp4', 'audio/mp3'];
/**
* The DRM handler playback.
* @type {?FairPlayDrmHandler}
* @private
*/
private _drmHandler: FairPlayDrmHandler | FairPlayDrmHandlerV2 | undefined;
/**
* The original progressive sources
* @member {Array} - _progressiveSources
* @private
*/
private _progressiveSources: Array;
/**
* The player tracks.
* @member {Array