@js-toolkit/web-utils 1.51.0 → 1.52.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/media/Capabilities.d.ts +11 -0
- package/media/Capabilities.js +1 -0
- package/media/MediaNotAttachedError.d.ts +4 -0
- package/media/MediaNotAttachedError.js +1 -0
- package/media/PipController.js +1 -0
- package/media/TextTracksController/TextTracksController.d.ts +67 -0
- package/media/TextTracksController/TextTracksController.js +1 -0
- package/media/TextTracksController/index.d.ts +1 -0
- package/media/TextTracksController/index.js +1 -0
- package/media/TextTracksController/utils.d.ts +12 -0
- package/media/TextTracksController/utils.js +1 -0
- package/media/getMediaSource.d.ts +18 -0
- package/media/toggleNativeSubtitles.d.ts +1 -1
- package/media/toggleNativeSubtitles.js +1 -1
- package/package.json +8 -8
- package/platform/getPlatformInfo.d.ts +1 -1
- package/platform/getPlatformInfo.js +1 -1
- package/platform/isChrome.d.ts +1 -0
- package/platform/isChrome.js +1 -0
- package/platform/isEMESupported.d.ts +2 -0
- package/platform/isEMESupported.js +1 -0
- package/platform/isMSESupported.d.ts +7 -0
- package/platform/isMSESupported.js +1 -0
- package/platform/isMediaCapabilitiesSupported.d.ts +1 -0
- package/platform/isMediaCapabilitiesSupported.js +1 -0
- package/platform/isMobileSimulation.d.ts +2 -0
- package/platform/isMobileSimulation.js +1 -0
- package/PipController.js +0 -1
- package/media/mse/getMediaSource.d.ts +0 -6
- package/media/mse/index.d.ts +0 -2
- package/media/mse/index.js +0 -1
- package/media/mse/isMSESupported.d.ts +0 -1
- package/media/mse/isMSESupported.js +0 -1
- /package/{PipController.d.ts → media/PipController.d.ts} +0 -0
- /package/media/{mse/getMediaSource.js → getMediaSource.js} +0 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare abstract class Capabilities {
|
|
2
|
+
private static readonly supportMap;
|
|
3
|
+
private static readonly canPlayMap;
|
|
4
|
+
private static tmpVideo;
|
|
5
|
+
private static cacheTimer;
|
|
6
|
+
/** Check video element. Mime type and optional codecs. */
|
|
7
|
+
static isCanPlayType(type: string): boolean;
|
|
8
|
+
/** Check MediaSource. */
|
|
9
|
+
static isTypeSupported(type: string): boolean;
|
|
10
|
+
static reset(): void;
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getMediaSource}from"./getMediaSource";export class Capabilities{static isCanPlayType(t){if(this.canPlayMap.has(t))return!!this.canPlayMap.get(t);this.tmpVideo||(this.tmpVideo=document.getElementsByTagName("video")[0]||document.createElement("video"),window.clearTimeout(this.cacheTimer),this.cacheTimer=window.setTimeout((()=>{this.tmpVideo=void 0}),1e3));const e=!!this.tmpVideo.canPlayType(t);return this.supportMap.set(t,e),e}static isTypeSupported(t){if(this.supportMap.has(t))return!!this.supportMap.get(t);const e=getMediaSource();if(e){const i=e.isTypeSupported(t);return this.supportMap.set(t,i),i}return!1}static reset(){window.clearTimeout(this.cacheTimer),this.tmpVideo=void 0,this.supportMap.clear(),this.canPlayMap.clear()}}Capabilities.supportMap=new Map,Capabilities.canPlayMap=new Map;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ErrorCompat}from"@js-toolkit/utils/ErrorCompat";export class MediaNotAttachedError extends ErrorCompat{constructor(t="Media element is not attached yet.",r=void 0){super(MediaNotAttachedError,t,r)}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{EventEmitter}from"eventemitter3";import{EventEmitterListener}from"../EventEmitterListener";const getPipUnavailableError=()=>new Error("PiP is not available");export class PipController extends EventEmitter{static isApiEnabled(){return!!HTMLVideoElement.prototype.requestPictureInPicture&&!!document.exitPictureInPicture&&!!document.pictureInPictureEnabled}static isWebkitApiEnabled(e){return!!e.webkitSupportsPresentationMode&&e.webkitSupportsPresentationMode("picture-in-picture")}static isAvailable(e){return this.isApiEnabled()&&!e.disablePictureInPicture||this.isWebkitApiEnabled(e)}get Events(){return PipController.Events}constructor(e){if(super(),this.listener=new EventEmitterListener(e),PipController.isAvailable(e)){const e=()=>{this.emit(this.Events.Change,{pip:!0})},t=()=>{this.emit(this.Events.Change,{pip:!1})};PipController.isApiEnabled()?(this.listener.on("enterpictureinpicture",e),this.listener.on("leavepictureinpicture",t)):this.listener.on("webkitpresentationmodechanged",(()=>{let i=this.listener.target.webkitPresentationMode;return()=>{"picture-in-picture"===this.listener.target.webkitPresentationMode?e():"picture-in-picture"===i&&t(),i=this.listener.target.webkitPresentationMode}})(),!0)}}destroy(){return this.exit().finally((()=>{this.removeAllListeners(),this.listener.removeAllListeners()}))}isPip(){return PipController.isApiEnabled()?document.pictureInPictureElement===this.listener.target:"picture-in-picture"===this.listener.target.webkitPresentationMode}getCurrentElement(){return this.isPip()?this.listener.target:null}request(){return new Promise(((e,t)=>{if(this.isPip())e();else{if(!PipController.isAvailable(this.listener.target))throw getPipUnavailableError();PipController.isApiEnabled()?this.listener.target.requestPictureInPicture().then((()=>e()),t):(this.listener.once("webkitpresentationmodechanged",(()=>{"picture-in-picture"===this.listener.target.webkitPresentationMode?e():t(new Error("Something went wrong."))}),!0),this.listener.target.webkitSetPresentationMode("picture-in-picture"))}}))}exit(){return new Promise(((e,t)=>{if(this.isPip()){if(!PipController.isAvailable(this.listener.target))throw getPipUnavailableError();PipController.isApiEnabled()?document.exitPictureInPicture().then(e,t):(this.listener.once("webkitpresentationmodechanged",(()=>{"picture-in-picture"!==this.listener.target.webkitPresentationMode?e():t(new Error("Something went wrong."))}),!0),this.listener.target.webkitSetPresentationMode("inline"))}else e()}))}}!function(e){let t;!function(e){e.Change="change"}(t=e.Events||(e.Events={}))}(PipController||(PipController={}));
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { EventEmitter } from 'eventemitter3';
|
|
2
|
+
import type { BaseMediaController } from '../BaseMediaController';
|
|
3
|
+
import { type ActivateTextTrackInfo, type TextTrackInfo, type TextTrackItem } from './utils';
|
|
4
|
+
declare global {
|
|
5
|
+
interface HTMLMediaElementEventMap extends TextTracksEventMap {
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
interface TextTracksEventMap {
|
|
9
|
+
texttracklistchange: CustomEvent<TextTracksController.EventMap[TextTracksController.Events.TextTrackListChanged][0]>;
|
|
10
|
+
texttrackchange: CustomEvent<TextTracksController.EventMap[TextTracksController.Events.CurrentTextTrackChanged][0]>;
|
|
11
|
+
texttrackcuechange: CustomEvent<TextTracksController.EventMap[TextTracksController.Events.TextTrackCueChanged][0]>;
|
|
12
|
+
}
|
|
13
|
+
export interface Cue {
|
|
14
|
+
id: string;
|
|
15
|
+
text: string;
|
|
16
|
+
}
|
|
17
|
+
export type { TextTrackInfo, ActivateTextTrackInfo, TextTrackItem };
|
|
18
|
+
export declare class TextTracksController extends EventEmitter<TextTracksController.EventMap> implements BaseMediaController {
|
|
19
|
+
private readonly options;
|
|
20
|
+
private readonly eventListeners;
|
|
21
|
+
private addedTracks;
|
|
22
|
+
private textTrackList;
|
|
23
|
+
private media;
|
|
24
|
+
private textTrack;
|
|
25
|
+
private nextTextTrack;
|
|
26
|
+
get Events(): typeof TextTracksController.Events;
|
|
27
|
+
constructor(options?: TextTracksController.Options | undefined);
|
|
28
|
+
isAttached(): boolean;
|
|
29
|
+
getMediaElement(): HTMLMediaElement;
|
|
30
|
+
detach(): void;
|
|
31
|
+
attach(media: HTMLMediaElement): void;
|
|
32
|
+
setTextTracks(textTrackList: readonly TextTrackItem[]): void;
|
|
33
|
+
getActiveTextTrack(): TextTrackInfo | undefined;
|
|
34
|
+
setActiveTextTrack(tt: ActivateTextTrackInfo | undefined): void;
|
|
35
|
+
destroy(): void;
|
|
36
|
+
}
|
|
37
|
+
export declare namespace TextTracksController {
|
|
38
|
+
interface Options {
|
|
39
|
+
/** Default `true`. */
|
|
40
|
+
readonly emitNativeEvents?: boolean | undefined;
|
|
41
|
+
/** Default `true`. */
|
|
42
|
+
readonly hideActiveTrack?: boolean | undefined;
|
|
43
|
+
}
|
|
44
|
+
enum Events {
|
|
45
|
+
TextTrackListChanged = "TrackListChanged",
|
|
46
|
+
CurrentTextTrackChanged = "CurrentTextTrackChanged",
|
|
47
|
+
TextTrackCueChanged = "TextTrackCueChanged"
|
|
48
|
+
}
|
|
49
|
+
type EventMap = DefineAll<Events, {
|
|
50
|
+
[Events.TextTrackListChanged]: [
|
|
51
|
+
{
|
|
52
|
+
readonly textTracks: readonly TextTrackInfo[];
|
|
53
|
+
}
|
|
54
|
+
];
|
|
55
|
+
[Events.CurrentTextTrackChanged]: [
|
|
56
|
+
{
|
|
57
|
+
readonly textTrack: TextTrackInfo | undefined;
|
|
58
|
+
readonly index: number;
|
|
59
|
+
}
|
|
60
|
+
];
|
|
61
|
+
[Events.TextTrackCueChanged]: [
|
|
62
|
+
{
|
|
63
|
+
readonly cues: readonly Cue[];
|
|
64
|
+
}
|
|
65
|
+
];
|
|
66
|
+
}>;
|
|
67
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{EventEmitter}from"eventemitter3";import{EventListeners}from"../../EventListeners";import{MediaNotAttachedError}from"../MediaNotAttachedError";import{parseTextTracks,setActiveTextTrack,addTextTracks,isIOSFullscreen}from"./utils";function dispatchNativeEvent(t,e,i){t.dispatchEvent(new CustomEvent(e,{detail:i}))}export class TextTracksController extends EventEmitter{get Events(){return TextTracksController.Events}constructor(t){var e,i;super(),this.eventListeners=new EventListeners,this.addedTracks=[],this.textTrackList=[],this.options=Object.assign(Object.assign({},t),{emitNativeEvents:null===(e=null==t?void 0:t.emitNativeEvents)||void 0===e||e,hideActiveTrack:null===(i=null==t?void 0:t.hideActiveTrack)||void 0===i||i})}isAttached(){return!!this.media}getMediaElement(){if(!this.media)throw new MediaNotAttachedError;return this.media}detach(){this.eventListeners.removeAllListeners(),this.media=void 0,this.addedTracks=[],this.textTrackList=[],this.textTrack=void 0,this.nextTextTrack=void 0}attach(t){this.detach(),this.media=t;const{textTracks:e}=t;let i=!1;const s=e=>{const{activeCues:i}=e.target;if(!i)return;const s=new Array(i.length);for(let t=0;t<s.length;t+=1)s[t]={id:i[t].id||String(t),text:i[t].text};this.emit(this.Events.TextTrackCueChanged,{cues:s}),this.options.emitNativeEvents&&dispatchNativeEvent(t,"texttrackcuechange",{cues:s})},a=()=>{var e;setActiveTextTrack(t,null!==(e=this.textTrack)&&void 0!==e?e:this.nextTextTrack,this.options.hideActiveTrack||isIOSFullscreen(t)),this.textTrackList=parseTextTracks(t),this.emit(this.Events.TextTrackListChanged,{textTracks:this.textTrackList}),this.options.emitNativeEvents&&dispatchNativeEvent(t,"texttracklistchange",{textTracks:this.textTrackList})},n=t=>{i||a(),this.eventListeners.scope(t).on("cuechange",s)},r=t=>{a(),this.eventListeners.scope(t).off("cuechange",s)};if(this.eventListeners.scope(e).on("change",(()=>{var e,i,s;const{textTracks:a}=t,{nextTextTrack:n}=this;let r=-1;for(let e=0;e<a.length;e+=1){const i=a[e];if(i.language===(null==n?void 0:n.language)&&i.kind===(null==n?void 0:n.kind)||isIOSFullscreen(t)||(i.mode="disabled"),"disabled"!==i.mode&&r>=0&&(i.mode="disabled"),"disabled"!==i.mode){if(r=e,!i.native&&!isIOSFullscreen(t)){const t=this.options.hideActiveTrack?"hidden":"showing";i.mode!==t&&(i.mode=t)}i.native&&i.language===(null==n?void 0:n.language)&&i.kind===n.kind&&(i.mode="showing")}}const c=a[r]&&(null!==(e=this.textTrackList[r])&&void 0!==e?e:{type:a[r].kind,lang:a[r].language,label:a[r].label});(null===(i=this.textTrack)||void 0===i?void 0:i.language)===(null==c?void 0:c.language)&&(null===(s=this.textTrack)||void 0===s?void 0:s.kind)===(null==c?void 0:c.kind)||(this.textTrack=c,this.nextTextTrack=this.textTrack,this.emit(this.Events.CurrentTextTrackChanged,{textTrack:this.textTrack,index:r}),this.options.emitNativeEvents&&dispatchNativeEvent(t,"texttrackchange",{textTrack:this.textTrack,index:r}))})).on("addtrack",(({track:t})=>t&&n(t))).on("removetrack",(({track:t})=>t&&r(t))),e.length>0){i=!0;try{Array.prototype.forEach.call(e,n),a()}finally{i=!1}}}setTextTracks(t){const e=this.getMediaElement();if(this.eventListeners.scope(e,"@@setTextTracks").removeAllListeners(),this.addedTracks.forEach((t=>t.remove())),0===t.length)return;const i=()=>{addTextTracks(e,t,(t=>this.addedTracks.push(t)))};e.readyState>=e.HAVE_CURRENT_DATA?i():this.eventListeners.scope(e,"@@setTextTracks").once("loadeddata",i)}getActiveTextTrack(){return this.textTrack}setActiveTextTrack(t){const e=this.getMediaElement();this.nextTextTrack=t&&this.textTrackList.find((e=>e.language===t.language&&(!t.kind||e.kind===t.kind))),setActiveTextTrack(e,this.nextTextTrack,this.options.hideActiveTrack||isIOSFullscreen(e))}destroy(){this.detach(),this.removeAllListeners()}}!function(t){let e;!function(t){t.TextTrackListChanged="TrackListChanged",t.CurrentTextTrackChanged="CurrentTextTrackChanged",t.TextTrackCueChanged="TextTrackCueChanged"}(e=t.Events||(t.Events={}))}(TextTracksController||(TextTracksController={}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './TextTracksController';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./TextTracksController";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type TextTrackItem = Readonly<PartialSome<RequiredStrict<Pick<HTMLTrackElement, 'src' | 'default'> & Pick<TextTrack, 'kind' | 'label' | 'language'>>, 'default' | 'kind'>>;
|
|
2
|
+
export interface TextTrackInfo extends Pick<TextTrackItem, 'kind' | 'language' | 'label'> {
|
|
3
|
+
}
|
|
4
|
+
export type ActivateTextTrackInfo = OptionalToUndefined<PartialBut<Pick<TextTrackInfo, 'kind' | 'language'>, 'language'>>;
|
|
5
|
+
export declare const DETACHED_GROUP_ID = "__detached__";
|
|
6
|
+
/** Hack: MSE can't remove texttracks on detaching because of no browser api for that. */
|
|
7
|
+
export declare function fakeDetachTextTracks(media: HTMLMediaElement): void;
|
|
8
|
+
export declare function parseTextTracks(media: HTMLMediaElement): TextTrackInfo[];
|
|
9
|
+
export declare function isIOSFullscreen(media: HTMLMediaElement): boolean;
|
|
10
|
+
export declare function setActiveTextTrack(media: HTMLMediaElement, tt: ActivateTextTrackInfo | undefined, hideActiveTrack: boolean): void;
|
|
11
|
+
/** Dynamically add text tracks */
|
|
12
|
+
export declare function addTextTracks(media: HTMLMediaElement, textTrackList: readonly TextTrackItem[], onAdd: (el: HTMLTrackElement) => void): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{isIOS}from"../../platform/isIOS";export const DETACHED_GROUP_ID="__detached__";export function fakeDetachTextTracks(e){[].forEach.call(e.textTracks,(e=>{const t=e;t.groupId&&(t.groupId="__detached__")}))}export function parseTextTracks(e){return 0===e.textTracks.length?[]:Array.from(e.textTracks).filter((e=>"__detached__"!==e.groupId&&!!e.language)).map((({kind:e,language:t,label:a})=>({kind:e,language:t,label:null!=a?a:""})))}export function isIOSFullscreen(e){return isIOS()&&!!e.webkitDisplayingFullscreen}export function setActiveTextTrack(e,t,a){if(0===e.textTracks.length)return;const{textTracks:n}=e;let r=!1;for(let e=0;e<n.length;e+=1){const l=n[e];if(r||l.language!==(null==t?void 0:t.language)||t.kind&&l.kind!==t.kind)l.mode="disabled";else{const e=a?"hidden":"showing";l.mode=e,r=!0}}}export function addTextTracks(e,t,a){const n=Array.from(e.textTracks).reduce(((e,t)=>(t.language&&(e[t.language]=t),e)),{});t.forEach((t=>{var r;if(!n[t.language]){const n=document.createElement("track");n.src=t.src,n.srclang=t.language,n.label=t.label,n.kind=null!==(r=t.kind)&&void 0!==r?r:"captions",n.default=!1,a(e.appendChild(n))}}))}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
declare global {
|
|
2
|
+
interface ManagedMediaSourceEventMap extends MediaSourceEventMap {
|
|
3
|
+
startstreaming: Event;
|
|
4
|
+
endstreaming: Event;
|
|
5
|
+
}
|
|
6
|
+
interface ManagedMediaSource extends MediaSource {
|
|
7
|
+
readonly streaming: boolean;
|
|
8
|
+
onstartstreaming: ((this: ManagedMediaSource, ev: Event) => any) | null;
|
|
9
|
+
onendstreaming: ((this: ManagedMediaSource, ev: Event) => any) | null;
|
|
10
|
+
addEventListener<K extends keyof ManagedMediaSourceEventMap>(type: K, listener: (this: MediaSource, ev: ManagedMediaSourceEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
|
|
11
|
+
removeEventListener<K extends keyof ManagedMediaSourceEventMap>(type: K, listener: (this: MediaSource, ev: ManagedMediaSourceEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
|
|
12
|
+
}
|
|
13
|
+
interface Window {
|
|
14
|
+
WebKitMediaSource?: typeof MediaSource;
|
|
15
|
+
ManagedMediaSource?: ManagedMediaSource;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export declare function getMediaSource(): typeof MediaSource | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export function toggleNativeSubtitles(e,
|
|
1
|
+
export function toggleNativeSubtitles(e,t){for(let o=0;o<t.length;o+=1){const n=t[o];e?n.native=!0:delete n.native,e&&"hidden"===n.mode?n.mode="showing":e||"showing"!==n.mode||(n.mode="hidden")}}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@js-toolkit/web-utils",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.52.0",
|
|
4
4
|
"description": "Web utils",
|
|
5
5
|
"author": "VZH",
|
|
6
6
|
"license": "MIT",
|
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"@js-toolkit/configs": "^3.90.0",
|
|
24
|
-
"@js-toolkit/utils": "^1.
|
|
25
|
-
"@types/uuid": "^9.0.
|
|
26
|
-
"@typescript-eslint/eslint-plugin": "^6.
|
|
27
|
-
"@typescript-eslint/parser": "^6.
|
|
24
|
+
"@js-toolkit/utils": "^1.51.1",
|
|
25
|
+
"@types/uuid": "^9.0.8",
|
|
26
|
+
"@typescript-eslint/eslint-plugin": "^6.21.0",
|
|
27
|
+
"@typescript-eslint/parser": "^6.21.0",
|
|
28
28
|
"copyfiles": "^2.4.1",
|
|
29
29
|
"eslint": "^8.56.0",
|
|
30
30
|
"eslint-config-airbnb-base": "^15.0.0",
|
|
@@ -32,14 +32,14 @@
|
|
|
32
32
|
"eslint-plugin-import": "^2.29.1",
|
|
33
33
|
"eslint-plugin-prettier": "^5.1.3",
|
|
34
34
|
"eventemitter3": "^5.0.1",
|
|
35
|
-
"prettier": "^3.2.
|
|
35
|
+
"prettier": "^3.2.5",
|
|
36
36
|
"reconnecting-websocket": "^4.4.0",
|
|
37
37
|
"rimraf": "^5.0.5",
|
|
38
38
|
"terser": "^5.27.0",
|
|
39
39
|
"typescript": "^5.3.3",
|
|
40
|
-
"ua-parser-js": "^2.0.0-beta.
|
|
40
|
+
"ua-parser-js": "^2.0.0-beta.2",
|
|
41
41
|
"uuid": "^9.0.1",
|
|
42
|
-
"webpack": "^5.
|
|
42
|
+
"webpack": "^5.90.1",
|
|
43
43
|
"yargs": "^17.7.2"
|
|
44
44
|
}
|
|
45
45
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
/// <reference types="ua-parser-js/src/main/ua-parser" />
|
|
2
2
|
type PlatformInfo = DeepReadonly<OmitStrict<UAParser.IResult, 'withClientHints' | 'withFeatureCheck'>> & {
|
|
3
3
|
toStringObject(): Record<Keys<ExcludeKeysOfType<UAParser.IResult, AnyFunction>>, string>;
|
|
4
4
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{__awaiter}from"tslib";import{UAParser}from"ua-parser-js";
|
|
1
|
+
import{__awaiter}from"tslib";import{UAParser}from"ua-parser-js";let result,promise;export function getPlatformInfo(){return __awaiter(this,void 0,void 0,(function*(){return null==result&&(promise=null!=promise?promise:Promise.resolve(new UAParser(navigator.userAgent).getResult().withFeatureCheck().withClientHints()),result=Object.assign(Object.assign({},yield promise),{toStringObject(){return Object.getOwnPropertyNames(this).reduce(((t,e)=>{const r=e;return null!=this[r]&&"function"!=typeof this[r]&&(t[r]=this[r].toString()),t}),{})}}),promise=void 0),result}))}export function getCachedPlatformInfo(){return null==result&&(console.warn("PlatformInfo is not ready yet."),getPlatformInfo()),result}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isChrome(): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getCachedPlatformInfo}from"./getPlatformInfo";export function isChrome(){const o=getCachedPlatformInfo();if(!o)return!1;const r=o.browser.name;return"Chrome"===r||"Mobile Chrome"===r}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function isEMESupported(){return!!(window.MediaKeys&&window.navigator&&window.navigator.requestMediaKeySystemAccess&&window.MediaKeySystemAccess&&window.MediaKeySystemAccess.prototype.getConfiguration)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getMediaSource}from"../media/getMediaSource";function getSourceBuffer(){return window.SourceBuffer||window.WebKitSourceBuffer}export function isMSESupported(){var e;if(!(null===(e=getMediaSource())||void 0===e?void 0:e.isTypeSupported))return!1;const o=getSourceBuffer();return!o||o.prototype&&"function"==typeof o.prototype.appendBuffer&&"function"==typeof o.prototype.remove}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isMediaCapabilitiesSupported(): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function isMediaCapabilitiesSupported(){var i;return!!window.MediaCapabilities&&!!window.navigator&&!!(null===(i=window.navigator.mediaCapabilities)||void 0===i?void 0:i.decodingInfo)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function isTouchDevice(){return window.matchMedia("(any-pointer: coarse) and (any-hover: none)").matches}export function isMobileSimulation(){return isTouchDevice()&&1===navigator.maxTouchPoints}
|
package/PipController.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{EventEmitter}from"eventemitter3";import{EventEmitterListener}from"./EventEmitterListener";const getPipUnavailableError=()=>new Error("PiP is not available");export class PipController extends EventEmitter{static isApiEnabled(){return!!HTMLVideoElement.prototype.requestPictureInPicture&&!!document.exitPictureInPicture&&!!document.pictureInPictureEnabled}static isWebkitApiEnabled(e){return!!e.webkitSupportsPresentationMode&&e.webkitSupportsPresentationMode("picture-in-picture")}static isAvailable(e){return this.isApiEnabled()&&!e.disablePictureInPicture||this.isWebkitApiEnabled(e)}get Events(){return PipController.Events}constructor(e){if(super(),this.listener=new EventEmitterListener(e),PipController.isAvailable(e)){const e=()=>{this.emit(this.Events.Change,{pip:!0})},t=()=>{this.emit(this.Events.Change,{pip:!1})};PipController.isApiEnabled()?(this.listener.on("enterpictureinpicture",e),this.listener.on("leavepictureinpicture",t)):this.listener.on("webkitpresentationmodechanged",(()=>{let i=this.listener.target.webkitPresentationMode;return()=>{"picture-in-picture"===this.listener.target.webkitPresentationMode?e():"picture-in-picture"===i&&t(),i=this.listener.target.webkitPresentationMode}})(),!0)}}destroy(){return this.exit().finally((()=>{this.removeAllListeners(),this.listener.removeAllListeners()}))}isPip(){return PipController.isApiEnabled()?document.pictureInPictureElement===this.listener.target:"picture-in-picture"===this.listener.target.webkitPresentationMode}getCurrentElement(){return this.isPip()?this.listener.target:null}request(){return new Promise(((e,t)=>{if(this.isPip())e();else{if(!PipController.isAvailable(this.listener.target))throw getPipUnavailableError();PipController.isApiEnabled()?this.listener.target.requestPictureInPicture().then((()=>e()),t):(this.listener.once("webkitpresentationmodechanged",(()=>{"picture-in-picture"===this.listener.target.webkitPresentationMode?e():t(new Error("Something went wrong."))}),!0),this.listener.target.webkitSetPresentationMode("picture-in-picture"))}}))}exit(){return new Promise(((e,t)=>{if(this.isPip()){if(!PipController.isAvailable(this.listener.target))throw getPipUnavailableError();PipController.isApiEnabled()?document.exitPictureInPicture().then(e,t):(this.listener.once("webkitpresentationmodechanged",(()=>{"picture-in-picture"!==this.listener.target.webkitPresentationMode?e():t(new Error("Something went wrong."))}),!0),this.listener.target.webkitSetPresentationMode("inline"))}else e()}))}}!function(e){let t;!function(e){e.Change="change"}(t=e.Events||(e.Events={}))}(PipController||(PipController={}));
|
package/media/mse/index.d.ts
DELETED
package/media/mse/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export*from"./getMediaSource";export*from"./isMSESupported";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function isMSESupported(): boolean;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{getMediaSource}from"./getMediaSource";export function isMSESupported(){var e;return!!(null===(e=getMediaSource())||void 0===e?void 0:e.isTypeSupported)}
|
|
File without changes
|
|
File without changes
|