@js-toolkit/web-utils 1.54.0 → 1.56.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/FullscreenController.d.ts +1 -2
- package/FullscreenController.js +1 -1
- package/fullscreen.js +1 -1
- package/getEventAwaiter.js +1 -1
- package/iframe/getAutoConnectClient.js +1 -1
- package/loadScript.js +1 -1
- package/media/BaseMediaController.d.ts +3 -3
- package/media/TextTracksController/TextTracksController.d.ts +5 -3
- package/media/TextTracksController/TextTracksController.js +1 -1
- package/media/TextTracksController/utils.d.ts +2 -2
- package/media/TextTracksController/utils.js +1 -1
- package/media/parseCueText.d.ts +1 -0
- package/package.json +16 -16
- package/platform/getPlatformInfo.d.ts +2 -0
- package/platform/getPlatformInfo.js +1 -1
- package/platform/isScreenHDR.d.ts +1 -0
- package/platform/isScreenHDR.js +1 -0
- package/serviceWorker/utils.d.ts +1 -0
- package/viewableTracker.d.ts +1 -1
- package/viewableTracker.js +1 -1
- package/ws/WSController.js +1 -1
|
@@ -39,8 +39,7 @@ export declare namespace FullscreenController {
|
|
|
39
39
|
/** Used for iOS. */
|
|
40
40
|
readonly toggleNativeSubtitles?: boolean | undefined;
|
|
41
41
|
};
|
|
42
|
-
|
|
43
|
-
}
|
|
42
|
+
type RequestOptions = Readonly<FullscreenOptions>;
|
|
44
43
|
enum Events {
|
|
45
44
|
Change = "change",
|
|
46
45
|
Error = "error"
|
package/FullscreenController.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{EventEmitter}from"eventemitter3";import{hasIn}from"@js-toolkit/utils/hasIn";import{fullscreen}from"./fullscreen";import{toggleNativeSubtitles}from"./media/toggleNativeSubtitles";export function enterPseudoFullscreen(e){let t,
|
|
1
|
+
import{EventEmitter}from"eventemitter3";import{hasIn}from"@js-toolkit/utils/hasIn";import{fullscreen}from"./fullscreen";import{toggleNativeSubtitles}from"./media/toggleNativeSubtitles";export function enterPseudoFullscreen(e){let t,i;return t={position:e.style.position,left:e.style.left,top:e.style.top,width:e.style.width,height:e.style.height,maxWidth:e.style.maxWidth,maxHeight:e.style.maxHeight,zIndex:e.style.zIndex},i=e,i.style.position="fixed",i.style.left="0px",i.style.top="0px",i.style.width="100%",i.style.height="100%",i.style.maxWidth="100%",i.style.maxHeight="100%",i.style.zIndex="99999",()=>{t&&i&&(i.style.position=t.position,i.style.left=t.left,i.style.top=t.top,i.style.width=t.width,i.style.height=t.height,i.style.maxWidth=t.maxWidth,i.style.maxHeight=t.maxHeight,i.style.zIndex=t.zIndex),t=void 0,i=void 0}}export class FullscreenController extends EventEmitter{static isApiAvailable(){return fullscreen.isApiEnabled()}get Events(){return FullscreenController.Events}constructor(e,t={}){super(),this.element=e,this.options=t,this.nativeChangeHandler=()=>{this.emit(this.Events.Change,{fullscreen:this.isFullscreen(),type:"native"})},this.nativeErrorHandler=e=>{this.emit(this.Events.Error,{error:e,type:"native"})},this.videoBeginFullscreenHandler=(()=>{const e=()=>{const t=this.fallback;e.controls=t.controls,e.nativeSubtitles=hasIn(this.options,"toggleNativeSubtitles")&&this.options.toggleNativeSubtitles&&t.textTracks.length>0,e.nativeSubtitles&&toggleNativeSubtitles(!0,t.textTracks),this.emit(this.Events.Change,{fullscreen:!0,type:"video"})};return e.nativeSubtitles=void 0,e.controls=void 0,e})(),this.videoEndFullscreenHandler=()=>{const e=this.fallback;null!=this.videoBeginFullscreenHandler.controls&&(e.controls=this.videoBeginFullscreenHandler.controls),this.videoBeginFullscreenHandler.nativeSubtitles&&toggleNativeSubtitles(!1,e.textTracks),this.emit(this.Events.Change,{fullscreen:!1,type:"video"})},this.setOptions(t)}unbind(){if(fullscreen.names){const{names:e}=fullscreen;this.element.removeEventListener(e.changeEventName,this.nativeChangeHandler),this.element.removeEventListener(e.errorEventName,this.nativeErrorHandler)}this.fallback instanceof HTMLVideoElement&&(this.fallback.removeEventListener("webkitbeginfullscreen",this.videoBeginFullscreenHandler),this.fallback.removeEventListener("webkitendfullscreen",this.videoEndFullscreenHandler),this.fallback=void 0)}setOptions(e){if(this.unbind(),this.options=null!=e?e:{},this.fallback=this.options.fallback,fullscreen.names&&fullscreen.isApiEnabled()){const{names:e}=fullscreen;this.element.addEventListener(e.changeEventName,this.nativeChangeHandler),this.element.addEventListener(e.errorEventName,this.nativeErrorHandler)}else this.fallback instanceof HTMLVideoElement&&(this.fallback.addEventListener("webkitbeginfullscreen",this.videoBeginFullscreenHandler),this.fallback.addEventListener("webkitendfullscreen",this.videoEndFullscreenHandler))}destroy(){return this.exit().then((()=>new Promise((e=>{requestAnimationFrame((()=>{this.removeAllListeners(),this.unbind(),e()}))}))))}isAvailable(){return fullscreen.isApiEnabled()||"pseudo"===this.fallback||this.fallback instanceof HTMLVideoElement&&!!this.fallback.webkitEnterFullscreen&&!!this.fallback.webkitSupportsFullscreen}isFullscreen(){return!!this.getCurrentElement()}isPseudoFullscreen(){return this.isFullscreen()&&!!this.exitPseudoFullscreen}getCurrentElement(){if(fullscreen.isApiEnabled()){if(fullscreen.getElement()===this.element)return this.element}else{if(this.exitPseudoFullscreen)return this.element;if(this.fallback instanceof HTMLVideoElement&&this.fallback.webkitDisplayingFullscreen)return this.fallback}return null}request(e={}){return new Promise(((t,i)=>{if(this.isFullscreen())return void t();if(fullscreen.isApiEnabled())return void fullscreen.request(this.element,e).then(t).catch(i);if("pseudo"===this.fallback)return this.exitPseudoFullscreen=enterPseudoFullscreen(this.element),this.emit(this.Events.Change,{fullscreen:!0,type:"pseudo"}),void t();const l=this.fallback instanceof HTMLVideoElement&&this.fallback||void 0;if((null==l?void 0:l.webkitEnterFullscreen)&&l.webkitSupportsFullscreen){const e=()=>{l.removeEventListener("webkitbeginfullscreen",e),t()};return l.addEventListener("webkitbeginfullscreen",e),void l.webkitEnterFullscreen()}i(new fullscreen.UnavailableError)}))}exit(){return new Promise(((e,t)=>{if(!this.isFullscreen())return void e();if(fullscreen.isApiEnabled())return void fullscreen.exit().then(e).catch(t);if(this.exitPseudoFullscreen)return this.exitPseudoFullscreen(),this.exitPseudoFullscreen=void 0,this.emit(this.Events.Change,{fullscreen:!1,type:"pseudo"}),void e();const i=this.fallback instanceof HTMLVideoElement&&this.fallback||void 0;if((null==i?void 0:i.webkitExitFullscreen)&&i.webkitSupportsFullscreen){const t=()=>{i.removeEventListener("webkitendfullscreen",t),e()};return i.addEventListener("webkitendfullscreen",t),void i.webkitExitFullscreen()}t(new fullscreen.UnavailableError)}))}}!function(e){let t;!function(e){e.Change="change",e.Error="error"}(t=e.Events||(e.Events={}))}(FullscreenController||(FullscreenController={}));
|
package/fullscreen.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{es5ErrorCompat}from"@js-toolkit/utils/es5ErrorCompat";import{promisify}from"@js-toolkit/utils/promisify";export class FullscreenUnavailableError extends Error{constructor(){super("Fullscreen is not available"),es5ErrorCompat(this,FullscreenUnavailableError)}}export var fullscreen;!function(e){e.names=[{requestFullscreenName:"requestFullscreen",exitFullscreenName:"exitFullscreen",fullscreenElementName:"fullscreenElement",fullscreenEnabledName:"fullscreenEnabled",changeEventName:"fullscreenchange",errorEventName:"fullscreenerror"},{requestFullscreenName:"webkitRequestFullscreen",exitFullscreenName:"webkitExitFullscreen",fullscreenElementName:"webkitFullscreenElement",fullscreenEnabledName:"webkitFullscreenEnabled",changeEventName:"webkitfullscreenchange",errorEventName:"webkitfullscreenerror"},{requestFullscreenName:"webkitRequestFullScreen",exitFullscreenName:"webkitCancelFullScreen",fullscreenElementName:"webkitCurrentFullScreenElement",fullscreenEnabledName:"webkitCancelFullScreen",changeEventName:"webkitfullscreenchange",errorEventName:"webkitfullscreenerror"},{requestFullscreenName:"mozRequestFullScreen",exitFullscreenName:"mozCancelFullScreen",fullscreenElementName:"mozFullScreenElement",fullscreenEnabledName:"mozFullScreenEnabled",changeEventName:"mozfullscreenchange",errorEventName:"mozfullscreenerror"},{requestFullscreenName:"msRequestFullscreen",exitFullscreenName:"msExitFullscreen",fullscreenElementName:"msFullscreenElement",fullscreenEnabledName:"msFullscreenEnabled",changeEventName:"MSFullscreenChange",errorEventName:"MSFullscreenError"}].find((({exitFullscreenName:e})=>e in document));const n={change:null===e.names||void 0===e.names?void 0:e.names.changeEventName,error:null===e.names||void 0===e.names?void 0:e.names.errorEventName};function r(){if(!e.names)throw new e.UnavailableError;return Boolean(document[e.names.fullscreenElementName])}function l(e,r,l){const a=n[e];a&&document.addEventListener(a,r,l)}function a(e,r,l){const a=n[e];a&&document.removeEventListener(a,r,l)}function t(n,r){return new Promise(((t,s)=>{if(!e.names)throw new e.UnavailableError;const c=()=>{a("change",c),a("error",u),t()},u=e=>{a("change",c),a("error",u),s(e)};l("change",c),l("error",u);const o=n[e.names.requestFullscreenName](r);o instanceof Promise&&o.then(c
|
|
1
|
+
import{es5ErrorCompat}from"@js-toolkit/utils/es5ErrorCompat";import{promisify}from"@js-toolkit/utils/promisify";export class FullscreenUnavailableError extends Error{constructor(){super("Fullscreen is not available"),es5ErrorCompat(this,FullscreenUnavailableError)}}export var fullscreen;!function(e){e.names=[{requestFullscreenName:"requestFullscreen",exitFullscreenName:"exitFullscreen",fullscreenElementName:"fullscreenElement",fullscreenEnabledName:"fullscreenEnabled",changeEventName:"fullscreenchange",errorEventName:"fullscreenerror"},{requestFullscreenName:"webkitRequestFullscreen",exitFullscreenName:"webkitExitFullscreen",fullscreenElementName:"webkitFullscreenElement",fullscreenEnabledName:"webkitFullscreenEnabled",changeEventName:"webkitfullscreenchange",errorEventName:"webkitfullscreenerror"},{requestFullscreenName:"webkitRequestFullScreen",exitFullscreenName:"webkitCancelFullScreen",fullscreenElementName:"webkitCurrentFullScreenElement",fullscreenEnabledName:"webkitCancelFullScreen",changeEventName:"webkitfullscreenchange",errorEventName:"webkitfullscreenerror"},{requestFullscreenName:"mozRequestFullScreen",exitFullscreenName:"mozCancelFullScreen",fullscreenElementName:"mozFullScreenElement",fullscreenEnabledName:"mozFullScreenEnabled",changeEventName:"mozfullscreenchange",errorEventName:"mozfullscreenerror"},{requestFullscreenName:"msRequestFullscreen",exitFullscreenName:"msExitFullscreen",fullscreenElementName:"msFullscreenElement",fullscreenEnabledName:"msFullscreenEnabled",changeEventName:"MSFullscreenChange",errorEventName:"MSFullscreenError"}].find((({exitFullscreenName:e})=>e in document));const n={change:null===e.names||void 0===e.names?void 0:e.names.changeEventName,error:null===e.names||void 0===e.names?void 0:e.names.errorEventName};function r(){if(!e.names)throw new e.UnavailableError;return Boolean(document[e.names.fullscreenElementName])}function l(e,r,l){const a=n[e];a&&document.addEventListener(a,r,l)}function a(e,r,l){const a=n[e];a&&document.removeEventListener(a,r,l)}function t(n,r){return new Promise(((t,s)=>{if(!e.names)throw new e.UnavailableError;const c=()=>{a("change",c),a("error",u),t()},u=e=>{a("change",c),a("error",u),s(e)};l("change",c),l("error",u);const o=n[e.names.requestFullscreenName](r);o instanceof Promise&&o.then(c).catch(u)}))}function s(){return new Promise(((n,t)=>{if(!e.names)throw new e.UnavailableError;if(!r)return void n();const s=()=>{a("change",s),a("error",c),n()},c=e=>{a("change",s),a("error",c),t(e)};l("change",s),l("error",c);const u=document[e.names.exitFullscreenName]();u instanceof Promise&&u.then(s).catch(c)}))}e.UnavailableError=FullscreenUnavailableError,e.isApiAvailable=function(){return!!e.names},e.isApiEnabled=function(){return!!e.names&&Boolean(document[e.names.fullscreenEnabledName])},e.isFullscreen=r,e.getElement=function(){if(!e.names)throw new e.UnavailableError;return document[e.names.fullscreenElementName]},e.on=l,e.off=a,e.request=t,e.exit=s,e.toggle=function(e){return promisify((()=>r()?s():t(e)))},e.onChange=function(e){l("change",e)},e.onError=function(e){l("error",e)}}(fullscreen||(fullscreen={}));
|
package/getEventAwaiter.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getAwaiter}from"@js-toolkit/utils/getAwaiter";import{EventEmitterListener}from"./EventEmitterListener";import{isEventEmitterLike}from"./EventEmitterListener.utils";export function getEventAwaiter(t,e,r,i){const o=getAwaiter({lazy:!0}),n=Array.isArray(e)?e:[e],s=Array.isArray(r)?r:[r],E=isEventEmitterLike(t)?t:new EventEmitterListener(t),a=()=>{n.forEach((t=>E.off(t,
|
|
1
|
+
import{getAwaiter}from"@js-toolkit/utils/getAwaiter";import{EventEmitterListener}from"./EventEmitterListener";import{isEventEmitterLike}from"./EventEmitterListener.utils";export function getEventAwaiter(t,e,r,i){const o=getAwaiter({lazy:!0}),n=Array.isArray(e)?e:[e],s=Array.isArray(r)?r:[r],E=isEventEmitterLike(t)?t:new EventEmitterListener(t),a=()=>{o.resolve()},f=t=>{const e=i?i(t):t;null!=e&&o.reject(e)},m=()=>{n.forEach((t=>E.off(t,a))),s.forEach((t=>E.off(t,f)))},c=o.resolve;o.resolve=(...t)=>{m(),c(...t)};const v=o.reject;return o.reject=(...t)=>{v(...t),m()},n.forEach((t=>E.on(t,a))),s.forEach((t=>E.on(t,f))),o}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{v4 as uuid}from"uuid";import{IFRAME_CLIENT_READY,IFRAME_HOST_READY,IFRAME_PING,isPingMessage,isTargetReadyMessage}from"./messages";import{getOriginFromMessage}from"./getOriginFromMessage";import{isWindowProxy}from"./utils";export function getAutoConnectClient({data:e,target:s=window.parent,isReady:o=(
|
|
1
|
+
import{v4 as uuid}from"uuid";import{IFRAME_CLIENT_READY,IFRAME_HOST_READY,IFRAME_PING,isPingMessage,isTargetReadyMessage}from"./messages";import{getOriginFromMessage}from"./getOriginFromMessage";import{isWindowProxy}from"./utils";export function getAutoConnectClient({data:e,target:s=window.parent,isReady:o=()=>!0,onConnect:a,logger:t=console,messagesTypes:i}){const n={Ping:(null==i?void 0:i.Ping)||IFRAME_PING,TargetReady:(null==i?void 0:i.TargetReady)||IFRAME_HOST_READY,SelfReady:(null==i?void 0:i.SelfReady)||IFRAME_CLIENT_READY},r=uuid();let g;const d=(e,s,o)=>{window!==e&&(isWindowProxy(e)?(e.postMessage(s,o),t.debug(`Post message to parent window (origin=${o}):`,s)):(e.postMessage(s),t.debug("Post message to parent MessageEventSource:",s)))},u=i=>{if(!i.source||i.source!==s)return;if(!isPingMessage(i.data,n)&&!isTargetReadyMessage(i.data,n))return;t.debug(`Receive message from parent window (origin=${i.origin}):`,i.data);const u=getOriginFromMessage(i);if(isPingMessage(i.data,n))((e,s,a)=>{o()&&d(e,{uid:r,type:n.SelfReady,data:s},a)})(i.source,e,u);else{m();const{data:e}=i.data;[g]=i.ports,a(e,u,g),t.debug("Iframe connected.")}},m=()=>{window.removeEventListener("message",u)};return window.addEventListener("message",u),{ready:(e="*")=>{d(s,{uid:r,type:n.Ping},e)},destroy:()=>{m(),g&&(g.close(),g.onmessage=null,g.onmessageerror=null)}}}
|
package/loadScript.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{onDOMReady}from"./onDOMReady";function isScriptAdded(e){const r=e.startsWith("//")?window.location.protocol+e:e;for(let e=0;e<document.scripts.length;e+=1)if(document.scripts[e].src===r)return!0;return!1}export function loadScript(e,{keepScript:r,id:t,async:n=!0,defer:o=!1}={}){return new Promise(((d,
|
|
1
|
+
import{onDOMReady}from"./onDOMReady";function isScriptAdded(e){const r=e.startsWith("//")?window.location.protocol+e:e;for(let e=0;e<document.scripts.length;e+=1)if(document.scripts[e].src===r)return!0;return!1}export function loadScript(e,{keepScript:r,id:t,async:n=!0,defer:o=!1}={}){return new Promise(((d,c)=>{onDOMReady((()=>{try{if(t){if(document.scripts.namedItem(t))return void d()}else if(isScriptAdded(e))return void d();const i=document.createElement("script"),s=()=>{i.removeEventListener("load",a),i.removeEventListener("error",p),r||i.remove()},a=()=>{s(),d()},p=r=>{s();const t=r instanceof ErrorEvent?r:new Error(`Unable to load script by url ${e}.`,{cause:r});c(t)};t&&(i.id=t),i.async=n,i.defer=o,i.src=e,i.addEventListener("load",a,{once:!0}),i.addEventListener("error",p,{once:!0}),document.head.appendChild(i)}catch(e){c(e)}}))}))}
|
|
@@ -24,20 +24,22 @@ export declare class TextTracksController extends EventEmitter<TextTracksControl
|
|
|
24
24
|
private nextTextTrack;
|
|
25
25
|
get Events(): typeof TextTracksController.Events;
|
|
26
26
|
constructor(options?: TextTracksController.Options | undefined);
|
|
27
|
+
setOptions(options: Partial<TextTracksController.Options>): void;
|
|
27
28
|
isAttached(): boolean;
|
|
28
29
|
getMediaElement(): HTMLMediaElement;
|
|
29
30
|
detach(): void;
|
|
30
31
|
attach(media: HTMLMediaElement): void;
|
|
32
|
+
getTextTracks(): readonly TextTrackInfo[];
|
|
31
33
|
setTextTracks(textTrackList: readonly TextTrackItem[]): void;
|
|
32
34
|
getActiveTextTrack(): TextTrackInfo | undefined;
|
|
33
|
-
setActiveTextTrack(tt: ActivateTextTrackInfo | undefined):
|
|
35
|
+
setActiveTextTrack(tt: ActivateTextTrackInfo | undefined): boolean;
|
|
34
36
|
destroy(): void;
|
|
35
37
|
}
|
|
36
38
|
export declare namespace TextTracksController {
|
|
37
39
|
interface Options {
|
|
38
|
-
/**
|
|
40
|
+
/** Defaults to `false`. */
|
|
39
41
|
readonly emitNativeEvents?: boolean | undefined;
|
|
40
|
-
/**
|
|
42
|
+
/** Defaults to `true`. */
|
|
41
43
|
readonly hideActiveTrack?: boolean | undefined;
|
|
42
44
|
/** */
|
|
43
45
|
readonly preferCueRowLength?: number | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{EventEmitter}from"eventemitter3";import{EventListeners}from"../../EventListeners";import{MediaNotAttachedError}from"../MediaNotAttachedError";import{parseTextTracks,setActiveTextTrack,addTextTracks,isIOSFullscreen,splitRows,buildCueId}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){
|
|
1
|
+
import{EventEmitter}from"eventemitter3";import{EventListeners}from"../../EventListeners";import{MediaNotAttachedError}from"../MediaNotAttachedError";import{parseTextTracks,setActiveTextTrack,addTextTracks,isIOSFullscreen,splitRows,buildCueId}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){super(),this.eventListeners=new EventListeners,this.addedTracks=[],this.textTrackList=[],this.options={emitNativeEvents:!1,hideActiveTrack:!0,preferCueRowLength:0},t&&this.setOptions(t)}setOptions(t){var e,i,s;Object.assign(this.options,Object.assign(Object.assign({},t),{emitNativeEvents:null!==(e=t.emitNativeEvents)&&void 0!==e?e:this.options.emitNativeEvents,hideActiveTrack:null!==(i=t.hideActiveTrack)&&void 0!==i?i:this.options.hideActiveTrack,preferCueRowLength:null!==(s=t.preferCueRowLength)&&void 0!==s?s:this.options.preferCueRowLength}))}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();const e=(()=>{const e=[];return i=>{var s;const{activeCues:a}=i.target;if(!a)return;let n=e.length!==a.length;const r=new Array(a.length);for(let t=0;t<r.length;t+=1){const i=a[t];i.id=i.id||buildCueId(i,t),r[t]=i,r[t].rows=splitRows(i.text,this.options.preferCueRowLength),n||(null===(s=e[t])||void 0===s?void 0:s.id)===i.id||(n=!0),e[t]=i}e.length>r.length&&e.splice(r.length-e.length),n&&(this.emit(this.Events.TextTrackCueChanged,{textTrack:i.target,cues:r}),this.options.emitNativeEvents&&dispatchNativeEvent(t,"texttrackcuechange",{textTrack:i.target,cues:r}))}})(),i=()=>{var e;this.textTrackList=parseTextTracks(t),this.emit(this.Events.TextTrackListChanged,{textTracks:this.textTrackList}),this.options.emitNativeEvents&&dispatchNativeEvent(t,"texttracklistchange",{textTracks:this.textTrackList}),setActiveTextTrack(t,null!==(e=this.textTrack)&&void 0!==e?e:this.nextTextTrack,this.options.hideActiveTrack&&!isIOSFullscreen(t))};this.media=t,this.textTrackList=parseTextTracks(t);let s=!1;const a=t=>{s||i(),this.eventListeners.scope(t).on("cuechange",e)},n=t=>{i(),this.eventListeners.scope(t).off("cuechange",e)};if(this.eventListeners.scope(this.media.textTracks).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:{id:a[r].id,kind:a[r].kind,language: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&&a(t))).on("removetrack",(({track:t})=>t&&n(t))),this.media.textTracks.length>0){s=!0;try{Array.prototype.forEach.call(this.media.textTracks,a),i()}finally{s=!1}}}getTextTracks(){return this.textTrackList}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))),this.textTrackList=parseTextTracks(e)};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();return 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={}));
|
|
@@ -3,7 +3,7 @@ declare global {
|
|
|
3
3
|
customGroupId?: string | undefined;
|
|
4
4
|
}
|
|
5
5
|
}
|
|
6
|
-
export type TextTrackItem = Readonly<PartialSome<RequiredStrict<Pick<HTMLTrackElement, 'src'
|
|
6
|
+
export type TextTrackItem = Readonly<PartialSome<RequiredStrict<Pick<HTMLTrackElement, 'src'> & Pick<TextTrack, 'kind' | 'label' | 'language'>>, 'kind'>>;
|
|
7
7
|
export interface TextTrackInfo extends Pick<TextTrackItem, 'kind' | 'language' | 'label'> {
|
|
8
8
|
readonly id: string;
|
|
9
9
|
}
|
|
@@ -12,7 +12,7 @@ export type ActivateTextTrackInfo = OptionalToUndefined<PartialBut<Pick<TextTrac
|
|
|
12
12
|
export declare function fakeDetachTextTracks(media: HTMLMediaElement): void;
|
|
13
13
|
export declare function parseTextTracks(media: HTMLMediaElement): TextTrackInfo[];
|
|
14
14
|
export declare function isIOSFullscreen(media: HTMLMediaElement): boolean;
|
|
15
|
-
export declare function setActiveTextTrack(media: HTMLMediaElement, tt: ActivateTextTrackInfo | undefined, hideActiveTrack: boolean):
|
|
15
|
+
export declare function setActiveTextTrack(media: HTMLMediaElement, tt: ActivateTextTrackInfo | undefined, hideActiveTrack: boolean): boolean;
|
|
16
16
|
/** Dynamically add text tracks */
|
|
17
17
|
export declare function addTextTracks(media: HTMLMediaElement, textTrackList: readonly TextTrackItem[], onAdd: (el: HTMLTrackElement) => void): void;
|
|
18
18
|
export declare function buildCueId(cue: Pick<TextTrackCue, 'startTime'>, index: number): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isIOS}from"../../platform/isIOS";const DETACHED_GROUP_ID="__detached__";export function fakeDetachTextTracks(t){
|
|
1
|
+
import{isIOS}from"../../platform/isIOS";const DETACHED_GROUP_ID="__detached__";export function fakeDetachTextTracks(t){Array.prototype.forEach.call(t.textTracks,(t=>{const e=t;e.customGroupId&&(e.customGroupId="__detached__")}))}export function parseTextTracks(t){return 0===t.textTracks.length?[]:Array.prototype.reduce.call(t.textTracks,((t,{customGroupId:e,id:n,kind:l,language:r,label:a})=>("__detached__"!==e&&r&&t.push({id:n,kind:l,language:r,label:null!=a?a:""}),t)),[])}export function isIOSFullscreen(t){return isIOS()&&!!t.webkitDisplayingFullscreen}export function setActiveTextTrack(t,e,n){const{textTracks:l}=t;if(0===l.length)return!1;let r=!1,a=!1;for(let t=0;t<l.length;t+=1){const i=l[t];if(a||i.language!==(null==e?void 0:e.language)||e.kind&&i.kind!==e.kind)"disabled"!==i.mode&&(i.mode="disabled",r=!0);else{const t=n?"hidden":"showing";i.mode=t,a=!0,r=!0}}return r}export function addTextTracks(t,e,n){const l=Array.prototype.reduce.call(t.textTracks,((t,e)=>(e.language&&(t[e.language]=e),t)),{});e.forEach((e=>{var r;if(!l[e.language]){const l=document.createElement("track");l.src=e.src,l.srclang=e.language,l.label=e.label,l.kind=null!==(r=e.kind)&&void 0!==r?r:"captions",l.default=!1,n(t.appendChild(l))}}))}export function buildCueId(t,e){return`${t.startTime}-${e}`}export function splitRows(t,e){var n;if(e<=0)return t.split(/\r?\n/);const l=[];let r=0,a=r,i="";for(let o=0;o<=t.length;o+=1){const c=t[o];i.length>0&&r<a&&(l[a]=null==c?i.trim():i.trimStart(),i=""),r=a;let s=null!==(n=l[r])&&void 0!==n?n:"";if("\n"===c||"\r\n"===c)i.length>0&&s.length+i.length<=e&&(s+=s.length>0?i:i.trimStart(),i=""),a+=1;else if(" "===c){if(i.length>0){s.length+i.length>e&&s.length>0?(a+=1,s=s.trimEnd()):(s+=0===s.length?i.trimStart():i,i="")}i+=c}else if(null==c&&i.length>0){s.length+i.length>e&&0!==s.length?(r+=1,s=i.trim()):s+=i}else c&&(i+=c);l[r]=s}return l}
|
package/media/parseCueText.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@js-toolkit/web-utils",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.56.0",
|
|
4
4
|
"description": "Web utils",
|
|
5
5
|
"author": "VZH",
|
|
6
6
|
"license": "MIT",
|
|
@@ -17,35 +17,35 @@
|
|
|
17
17
|
"minor-publish": "npm run build && npm version minor --force --no-workspaces-update -m 'v%s' && npm run copy:configs && cd ./dist && npm publish --access public && git push --follow-tags"
|
|
18
18
|
},
|
|
19
19
|
"optionalDependencies": {
|
|
20
|
-
"@js-toolkit/node-utils": "^1.2.
|
|
20
|
+
"@js-toolkit/node-utils": "^1.2.1"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
|
-
"@eslint/compat": "^1.1.
|
|
23
|
+
"@eslint/compat": "^1.1.1",
|
|
24
24
|
"@eslint/eslintrc": "^3.1.0",
|
|
25
|
-
"@eslint/js": "^9.
|
|
26
|
-
"@js-toolkit/configs": "^3.93.
|
|
27
|
-
"@js-toolkit/utils": "^1.54.
|
|
28
|
-
"@types/eslint": "^
|
|
29
|
-
"@types/eslint__eslintrc": "^2.1.
|
|
25
|
+
"@eslint/js": "^9.9.1",
|
|
26
|
+
"@js-toolkit/configs": "^3.93.5",
|
|
27
|
+
"@js-toolkit/utils": "^1.54.2",
|
|
28
|
+
"@types/eslint": "^9.6.1",
|
|
29
|
+
"@types/eslint__eslintrc": "^2.1.2",
|
|
30
30
|
"@types/eslint__js": "^8.42.3",
|
|
31
31
|
"@types/lodash.throttle": "^4.1.9",
|
|
32
32
|
"@types/uuid": "^10.0.0",
|
|
33
33
|
"copyfiles": "^2.4.1",
|
|
34
|
-
"eslint": "^9.
|
|
34
|
+
"eslint": "^9.9.1",
|
|
35
35
|
"eslint-config-prettier": "^9.1.0",
|
|
36
36
|
"eslint-plugin-import": "^2.29.1",
|
|
37
|
-
"eslint-plugin-prettier": "^5.1
|
|
37
|
+
"eslint-plugin-prettier": "^5.2.1",
|
|
38
38
|
"eventemitter3": "^5.0.1",
|
|
39
39
|
"lodash.throttle": "^4.1.1",
|
|
40
|
-
"prettier": "^3.3.
|
|
40
|
+
"prettier": "^3.3.3",
|
|
41
41
|
"reconnecting-websocket": "^4.4.0",
|
|
42
|
-
"rimraf": "^
|
|
43
|
-
"terser": "^5.31.
|
|
44
|
-
"typescript": "^5.5.
|
|
45
|
-
"typescript-eslint": "^
|
|
42
|
+
"rimraf": "^6.0.1",
|
|
43
|
+
"terser": "^5.31.6",
|
|
44
|
+
"typescript": "^5.5.4",
|
|
45
|
+
"typescript-eslint": "^8.3.0",
|
|
46
46
|
"ua-parser-js": "^2.0.0-beta.3",
|
|
47
47
|
"uuid": "^10.0.0",
|
|
48
|
-
"webpack": "^5.
|
|
48
|
+
"webpack": "^5.94.0",
|
|
49
49
|
"yargs": "^17.7.2"
|
|
50
50
|
}
|
|
51
51
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
/// <reference types="ua-parser-js" preserve="true" />
|
|
1
2
|
type PlatformInfo = DeepReadonly<OmitStrict<UAParser.IResult, 'withClientHints' | 'withFeatureCheck'>> & {
|
|
2
3
|
toStringObject(): Record<Keys<ExcludeKeysOfType<UAParser.IResult, AnyFunction>>, string>;
|
|
3
4
|
};
|
|
5
|
+
export declare function getPlatformInfoSync(): PlatformInfo;
|
|
4
6
|
export declare function getPlatformInfo(): Promise<PlatformInfo>;
|
|
5
7
|
export declare function getCachedPlatformInfo(): PlatformInfo | undefined;
|
|
6
8
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{__awaiter}from"tslib";import{UAParser}from"ua-parser-js";let
|
|
1
|
+
import{__awaiter}from"tslib";import{UAParser}from"ua-parser-js";let syncResult,asyncResult,promise;function toPlatformInfo(t){return Object.assign(Object.assign({},t),{toStringObject(){return Object.getOwnPropertyNames(this).reduce(((t,e)=>{const n=e;return null!=this[n]&&"function"!=typeof this[n]&&(t[n]=this[n].toString()),t}),{})}})}export function getPlatformInfoSync(){return null==syncResult&&(syncResult=toPlatformInfo(new UAParser(navigator.userAgent).getResult().withFeatureCheck())),syncResult}export function getPlatformInfo(){return __awaiter(this,void 0,void 0,(function*(){return null==asyncResult&&(promise=null!=promise?promise:Promise.resolve(new UAParser(navigator.userAgent).getResult().withFeatureCheck().withClientHints()),asyncResult=toPlatformInfo(yield promise),syncResult=asyncResult,promise=void 0),asyncResult}))}export function getCachedPlatformInfo(){return null==asyncResult&&(console.warn("PlatformInfo is not ready yet."),getPlatformInfo()),asyncResult}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isScreenHDR(): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function isScreenHDR(){return window.matchMedia("(dynamic-range: high)").matches}
|
package/serviceWorker/utils.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/// <reference lib="webworker" preserve="true" />
|
|
1
2
|
export declare function isLocalhost(hostname?: string): boolean;
|
|
2
3
|
/** Delete all caches that aren't named in `caches`. */
|
|
3
4
|
export declare function removeUnknownCaches<T extends Record<string, string>>(expectedCaches: T): Promise<unknown>;
|
package/viewableTracker.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export interface ViewableTrackerOptions {
|
|
2
|
-
/** Visibility part to detect state as viewable. */
|
|
2
|
+
/** Visibility part to detect state as viewable. Up to 1. */
|
|
3
3
|
readonly visiblePart?: boolean | number | undefined;
|
|
4
4
|
readonly scrollThrottle?: number | undefined;
|
|
5
5
|
readonly documentVisibility?: boolean | undefined;
|
package/viewableTracker.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import throttleFn from"lodash.throttle";export function getViewableTracker(t,{visiblePart:e=.8,scrollThrottle:i=200,documentVisibility:n=!0,onChange:o}){const r
|
|
1
|
+
import throttleFn from"lodash.throttle";export function getViewableTracker(t,{visiblePart:e=.8,scrollThrottle:i=200,documentVisibility:n=!0,onChange:o}){const r=Math.min(+e,1);let s,l=0,c="visible"===document.visibilityState;const a=()=>{if(n&&"visible"!==document.visibilityState)return;const{top:e,bottom:i,height:l}=t.getBoundingClientRect(),c=l*r,a=e+c,d=window.innerHeight>=a&&i>c;s!==d&&(s=d,o(d))},d=()=>{const t="visible"===document.visibilityState;c!==t&&(c=t,t?(s=void 0,a()):s!==t&&o(t))},v=i&&i>0?throttleFn(a,i):()=>{n&&"visible"!==document.visibilityState||(l=window.requestAnimationFrame(a))};window.addEventListener("scroll",v,{capture:!1,passive:!0}),n&&document.addEventListener("visibilitychange",d);return{check:()=>{a(),n&&d()},destroy:()=>{cancelAnimationFrame(l),window.removeEventListener("scroll",v,{capture:!1}),document.removeEventListener("visibilitychange",d)}}}
|
package/ws/WSController.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{__rest}from"tslib";import ReconnectingWebSocket,{}from"reconnecting-websocket";import{DataEventEmitter}from"@js-toolkit/utils/DataEventEmitter";import{delayed}from"@js-toolkit/utils/delayed";import{EventEmitterListener}from"../EventEmitterListener";function getNotConnectedError(){return new Error("The object is not connected yet.")}export class WSController extends DataEventEmitter{get Events(){return WSController.Events}constructor(e,t){super();const n=null!=t?t:{},{logger:s,protocols:o,binaryType:i,idleTimeout:r,halfOpenDetection:c,startClosed:l}=n,a=__rest(n,["logger","protocols","binaryType","idleTimeout","halfOpenDetection","startClosed"]);this.logger=null!=s?s:console,this.ws=new ReconnectingWebSocket(e,o,Object.assign(Object.assign({},a),{startClosed:!0})),null!=i&&(this.ws.binaryType=i),this.listener=new EventEmitterListener(this.ws),r&&r>0&&(this.reconnectOnIdle=delayed((()=>{this.logger.info(`WS connection reconnecting after ${r}ms due to inactivity.`),this.ws.reconnect()}),r)),this.halfOpen=(()=>{if(!c)return;const{pingTimeout:e=12e3,outMessage:t=(
|
|
1
|
+
import{__rest}from"tslib";import ReconnectingWebSocket,{}from"reconnecting-websocket";import{DataEventEmitter}from"@js-toolkit/utils/DataEventEmitter";import{delayed}from"@js-toolkit/utils/delayed";import{EventEmitterListener}from"../EventEmitterListener";function getNotConnectedError(){return new Error("The object is not connected yet.")}export class WSController extends DataEventEmitter{get Events(){return WSController.Events}constructor(e,t){super();const n=null!=t?t:{},{logger:s,protocols:o,binaryType:i,idleTimeout:r,halfOpenDetection:c,startClosed:l}=n,a=__rest(n,["logger","protocols","binaryType","idleTimeout","halfOpenDetection","startClosed"]);this.logger=null!=s?s:console,this.ws=new ReconnectingWebSocket(e,o,Object.assign(Object.assign({},a),{startClosed:!0})),null!=i&&(this.ws.binaryType=i),this.listener=new EventEmitterListener(this.ws),r&&r>0&&(this.reconnectOnIdle=delayed((()=>{this.logger.info(`WS connection reconnecting after ${r}ms due to inactivity.`),this.ws.reconnect()}),r)),this.halfOpen=(()=>{if(!c)return;const{pingTimeout:e=12e3,outMessage:t=()=>JSON.stringify({type:"pong"}),inMessageFilter:n=e=>e&&"object"==typeof e&&"ping"===e.type}=c,s=delayed((()=>{this.logger.info(`WS connection reconnecting after ${e}ms due to the probability of a half-open connection.`),this.ws.reconnect()}),e),o=()=>{s(),this.ws.send("function"!=typeof t||t instanceof Blob?t:t())};return{heartbeat:o,cancel:()=>s.cancel(),onMessage:({data:e})=>{n(e)?o():s()}}})(),this.listener.on("open",(()=>{var e;this.reconnectOnIdle&&this.reconnectOnIdle(),null===(e=this.halfOpen)||void 0===e||e.heartbeat(),this.emit(this.Events.Connected)})).on("close",(({code:e})=>{var n,s;null===(n=this.reconnectOnIdle)||void 0===n||n.cancel(),null===(s=this.halfOpen)||void 0===s||s.cancel(),null!=(null==t?void 0:t.maxRetries)&&this.ws.readyState===this.ws.CLOSED&&this.ws.retryCount===t.maxRetries&&this.close(e,`Failed to connect after ${t.maxRetries} attempts.`)})).on("message",(e=>{var t;this.reconnectOnIdle&&this.reconnectOnIdle(),null===(t=this.halfOpen)||void 0===t||t.onMessage(e),this.emit(this.Events.Message,e)})).on("error",(({error:e,message:t})=>{this.emit(this.Events.Error,{error:e,message:t})})),this.halfOpen&&(this.isConnected()||this.ws.readyState===this.ws.CONNECTING)&&this.halfOpen.heartbeat(),l||this.connect()}isConnected(){return this.ws.readyState===this.ws.OPEN}getUrl(){return this.ws.url}connect(){this.ws.reconnect()}send(e){if(!this.ws)throw getNotConnectedError();this.ws.send(e)}close(e,t){const n=!!this.ws;try{this.reconnectOnIdle&&this.reconnectOnIdle.cancel(),this.halfOpen&&this.halfOpen.cancel(),this.ws.close(e,t)}catch(e){this.logger.warn(e)}n&&this.emit(this.Events.Closed,t?{reason:t}:void 0)}destroy(){this.close(),this.listener.removeAllListeners(),this.removeAllListeners()}}!function(e){let t;!function(e){e.Connected="Connected",e.Message="Message",e.Error="Error",e.Closed="Closed"}(t=e.Events||(e.Events={}))}(WSController||(WSController={}));
|