@js-toolkit/web-utils 1.56.0 → 1.57.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/EventEmitterListener.js +1 -1
- package/EventEmitterListener.utils.js +1 -1
- package/EventListeners.js +1 -1
- package/FullscreenController.js +1 -1
- package/LICENSE +0 -0
- package/WakeLockController.d.ts +20 -0
- package/WakeLockController.js +1 -0
- package/fullscreen.js +1 -1
- package/ga/DataLayerProxy.js +1 -1
- package/getCurrentScriptUrl.js +1 -1
- package/getGeoCoordinates.js +1 -1
- package/iframe/getAutoConnectClient.js +1 -1
- package/iframe/getAutoConnectHost.d.ts +1 -1
- package/iframe/getAutoConnectHost.js +1 -1
- package/iframe/getAutoConnector.js +1 -1
- package/isImageTypeSupported.js +1 -1
- package/isWebPSupported.js +1 -1
- package/loadImage.js +1 -1
- package/loadScript.d.ts +1 -1
- package/loadScript.js +1 -1
- package/media/Capabilities.js +1 -1
- package/media/MediaNotAttachedError.js +1 -1
- package/media/MediaStreamController.d.ts +2 -2
- package/media/MediaStreamController.js +1 -1
- package/media/PipController.js +1 -1
- package/media/TextTracksController/TextTracksController.d.ts +1 -1
- package/media/TextTracksController/TextTracksController.js +1 -1
- package/media/TextTracksController/utils.js +1 -1
- package/media/parseCueText.js +1 -1
- package/onPageReady.js +1 -1
- package/package.json +12 -12
- package/performance/getNavigationTiming.js +1 -1
- package/platform/getIOSVersion.js +1 -1
- package/platform/getPlatformInfo.js +1 -1
- package/platform/isMSESupported.js +1 -1
- package/platform/isMediaCapabilitiesSupported.js +1 -1
- package/serviceWorker/ServiceWorkerInstaller.d.ts +1 -3
- package/serviceWorker/ServiceWorkerInstaller.js +1 -1
- package/serviceWorker/utils.js +1 -1
- package/webrtc/PeerConnection.js +1 -1
- package/ws/WSController.d.ts +2 -2
- package/ws/WSController.js +1 -1
- package/getAppContainer.d.ts +0 -1
- package/getAppContainer.js +0 -1
package/EventEmitterListener.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isPassiveSupported,isDomEventTarget,isEventTargetLike,normalizeOptions}from"./EventEmitterListener.utils";export class EventEmitterListener{constructor(t,e){this.target=t,this.interceptor=e,this.
|
|
1
|
+
import{isPassiveSupported,isDomEventTarget,isEventTargetLike,normalizeOptions}from"./EventEmitterListener.utils";export class EventEmitterListener{target;interceptor;normalListeners={};captureListeners={};passiveSupported=isPassiveSupported();constructor(t,e){this.target=t,this.interceptor=e,this.target=t}createWrapper(t,e,s,...r){return(...i)=>{s&&this.off(t,e,...r);const n=this.interceptor&&this.interceptor(...i)||i;e(...n)}}getListenerList({event:t,type:e}={}){const s="normal"===e&&this.normalListeners||"capture"===e&&this.captureListeners||void 0;if(s){const e=t?s[t]&&{[t]:s[t]}:s;return e?Object.values(e).flatMap((t=>t?Array.from(t.keys()):[])):[]}return this.getListenerList({event:t,type:"normal"}).concat(this.getListenerList({event:t,type:"capture"}))}getListeners({event:t,type:e}={}){const s="normal"===e&&this.normalListeners||"capture"===e&&this.captureListeners||void 0;if(!s){const e=this.getListeners({event:t,type:"normal"}),s=this.getListeners({event:t,type:"capture"}),r={},i=([t,e])=>{const s=r[t];r[t]=s?s.concat(e):e};return Object.entries(e).forEach(i),Object.entries(s).forEach(i),r}const r=t?s[t]&&{[t]:s[t]}:s;return r?Object.entries(r).reduce(((t,[e,s])=>{const r=s?Array.from(s.keys()):[];return r.length>0&&(t[e]=r),t}),{}):{}}has(t,e,...s){if(!isDomEventTarget(this.target)){const s=this.normalListeners[t];return!!s&&(e?s.has(e):s.size>0)}const r=s[0],i=!0===r||r&&"object"==typeof r&&(r.capture??!1)?this.captureListeners[t]:this.normalListeners[t];return!!i&&(e?i.has(e):i.size>0)}on(t,e,...s){if(!isDomEventTarget(this.target)){const r=this.normalListeners[t]??new Map;this.normalListeners[t]=r;const i=r.get(e)??(this.interceptor?this.createWrapper(t,e,!1):e);return!r.has(e)&&r.set(e,i),isEventTargetLike(this.target)?this.target.addEventListener(t,i,...s):this.target.on(t,i,...s),this}const r=s[0],i=!0===r||r&&"object"==typeof r&&(r.capture??!1),n=(r&&"object"==typeof r&&r.once)??!1;if(i){const s=this.captureListeners[t]??new Map;this.captureListeners[t]=s;const i=s.get(e)??this.createWrapper(t,e,n,r);!s.has(e)&&s.set(e,i),this.target.addEventListener(t,i,normalizeOptions(r))}else{const s=this.normalListeners[t]??new Map;this.normalListeners[t]=s;const i=s.get(e)??this.createWrapper(t,e,n,r);!s.has(e)&&s.set(e,i),this.target.addEventListener(t,i,normalizeOptions(r))}return this}once(t,e,...s){if(!isDomEventTarget(this.target)){const r=this.normalListeners[t]??new Map;this.normalListeners[t]=r;const i=r.get(e)??this.createWrapper(t,e,!0,...s);return!r.has(e)&&r.set(e,i),isEventTargetLike(this.target)?this.target.addEventListener(t,i,...s):this.target.once?this.target.once(t,i,...s):this.target.on(t,i,...s),this}const r=s[0];return this.on(t,e,{..."object"==typeof r?r:null!=r&&{capture:r},once:!0})}off(t,e,...s){if(!isDomEventTarget(this.target)){const r=this.normalListeners[t],i=r?.get(e);return r&&i&&r.delete(e),0===r?.size&&delete this.normalListeners[t],isEventTargetLike(this.target)?this.target.removeEventListener(t,i??e,...s):this.target.off(t,i??e,...s),this}const r=s[0],i=!0===r||r&&"object"==typeof r&&(r.capture??!1),n=i?this.captureListeners[t]:this.normalListeners[t],o=n?.get(e);return n&&o&&n.delete(e),0===n?.size&&(i?delete this.captureListeners[t]:delete this.normalListeners[t]),this.target.removeEventListener(t,o??e,normalizeOptions(r)),this}removeAllListeners(t){if(t){const e=this.normalListeners[t];e&&e.forEach(((e,s)=>this.off(t,s)));const s=this.captureListeners[t];s&&s.forEach(((e,s)=>this.off(t,s,!0)))}else Object.keys(this.normalListeners).forEach((t=>this.removeAllListeners(t))),Object.keys(this.captureListeners).forEach((t=>this.removeAllListeners(t)));return this}removeAllListenersBut(...t){return 0===t.length?this.removeAllListeners():(Object.keys(this.normalListeners).forEach((e=>!t.includes(e)&&this.removeAllListeners(e))),Object.keys(this.captureListeners).forEach((e=>!t.includes(e)&&this.removeAllListeners(e))),this)}emit(t,...e){const[s,...r]=e;return this.getListenerList({event:t}).forEach((t=>{t(s,...r)})),this}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{isEmptyObject}from"@js-toolkit/utils/isEmptyObject";export function isEventTargetLike(e){return void 0!==e.addEventListener&&void 0!==e.removeEventListener}export function isDomEventTarget(e){return isEventTargetLike(e)&&void 0!==e.dispatchEvent}export function isEventEmitterLike(e){return!isEventTargetLike(e)&&!isDomEventTarget(e)&&void 0!==e.on&&void 0!==e.once&&void 0!==e.off}let passiveSupported=!1;export function isPassiveSupported(){return passiveSupported}try{const e={get passive(){return passiveSupported=!0,!1}};window.addEventListener("__testpassive__",null,e)}catch(t){}export function normalizeOptions(e){if(e&&"object"==typeof e){let t=e;if("passive"in e&&!passiveSupported){const{passive:i,...n}=e;t=n}return isEmptyObject(t)?void 0:t}return e}
|
package/EventListeners.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{EventEmitterListener}from"./EventEmitterListener";export class EventListeners{
|
|
1
|
+
import{EventEmitterListener}from"./EventEmitterListener";export class EventListeners{listeners=new Map;getScopes(){return this.listeners.keys()}scope(e,s){const t=s??"",r=this.listeners.get(e)??new Map;!this.listeners.has(e)&&this.listeners.set(e,r);const i=r.get(t)??new EventEmitterListener(e);return!r.has(t)&&r.set(t,i),i}removeAllListeners(e,s){if(e)if(s){const t=this.listeners.get(e);t?.get(s)?.removeAllListeners(),t?.delete(s),0===t?.size&&this.listeners.delete(e)}else{const s=this.listeners.get(e);s?.forEach((e=>e.removeAllListeners())),s?.clear(),this.listeners.delete(e)}else this.listeners.forEach((e=>{e.forEach((e=>e.removeAllListeners())),e.clear()})),this.listeners.clear();return this}}
|
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,n;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},n=e,n.style.position="fixed",n.style.left="0px",n.style.top="0px",n.style.width="100%",n.style.height="100%",n.style.maxWidth="100%",n.style.maxHeight="100%",n.style.zIndex="99999",()=>{t&&n&&(n.style.position=t.position,n.style.left=t.left,n.style.top=t.top,n.style.width=t.width,n.style.height=t.height,n.style.maxWidth=t.maxWidth,n.style.maxHeight=t.maxHeight,n.style.zIndex=t.zIndex),t=void 0,n=void 0}}export class FullscreenController extends EventEmitter{element;options;static isApiAvailable(){return fullscreen.isApiEnabled()}get Events(){return FullscreenController.Events}fallback;exitPseudoFullscreen;constructor(e,t={}){super(),this.element=e,this.options=t,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=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}nativeChangeHandler=()=>{this.emit(this.Events.Change,{fullscreen:this.isFullscreen(),type:"native"})};nativeErrorHandler=e=>{this.emit(this.Events.Error,{error:e,type:"native"})};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})();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"})};request(e={}){return new Promise(((t,n)=>{if(this.isFullscreen())return void t();if(fullscreen.isApiEnabled())return void fullscreen.request(this.element,e).then(t).catch(n);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(l?.webkitEnterFullscreen&&l.webkitSupportsFullscreen){const e=()=>{l.removeEventListener("webkitbeginfullscreen",e),t()};return l.addEventListener("webkitbeginfullscreen",e),void l.webkitEnterFullscreen()}n(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 n=this.fallback instanceof HTMLVideoElement&&this.fallback||void 0;if(n?.webkitExitFullscreen&&n.webkitSupportsFullscreen){const t=()=>{n.removeEventListener("webkitendfullscreen",t),e()};return n.addEventListener("webkitendfullscreen",t),void n.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/LICENSE
CHANGED
|
File without changes
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { DataEventEmitter } from '@js-toolkit/utils/DataEventEmitter';
|
|
2
|
+
export declare class WakeLockController extends DataEventEmitter<{
|
|
3
|
+
activated: [];
|
|
4
|
+
deactivated: [];
|
|
5
|
+
error: [{
|
|
6
|
+
error: unknown;
|
|
7
|
+
}];
|
|
8
|
+
}, WakeLockController> {
|
|
9
|
+
static isApiAvailable(): boolean;
|
|
10
|
+
private wakelock;
|
|
11
|
+
private releasing;
|
|
12
|
+
/** Lock when document will be visible. */
|
|
13
|
+
private relockOnVisible;
|
|
14
|
+
private restoreWakeLock;
|
|
15
|
+
private onRelease;
|
|
16
|
+
isActive(): boolean;
|
|
17
|
+
request(): Promise<void>;
|
|
18
|
+
release(): Promise<void>;
|
|
19
|
+
destroy(): Promise<void>;
|
|
20
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{DataEventEmitter}from"@js-toolkit/utils/DataEventEmitter";import{hasIn}from"@js-toolkit/utils/hasIn";export class WakeLockController extends DataEventEmitter{static isApiAvailable(){return hasIn(navigator,"wakeLock")&&null!=navigator.wakeLock}wakelock;releasing=!1;relockOnVisible=!1;restoreWakeLock=()=>{"visible"===document.visibilityState&&this.relockOnVisible&&(this.relockOnVisible=!1,this.request().catch((e=>this.emit("error",{error:e}))))};onRelease=()=>{this.wakelock&&(this.wakelock.removeEventListener("release",this.onRelease),this.wakelock=void 0,this.releasing?document.removeEventListener("visibilitychange",this.restoreWakeLock):"hidden"===document.visibilityState&&(this.relockOnVisible=!0,document.addEventListener("visibilitychange",this.restoreWakeLock)),this.emit("deactivated"))};isActive(){return!!this.wakelock&&!this.wakelock.released}async request(){if(!this.wakelock){try{this.wakelock=await navigator.wakeLock.request("screen")}catch(e){if("visible"===document.visibilityState)throw e;return this.relockOnVisible=!0,document.addEventListener("visibilitychange",this.restoreWakeLock),void this.emit("error",{error:e})}this.relockOnVisible=!1,this.wakelock.addEventListener("release",this.onRelease),this.emit("activated")}}async release(){if(this.wakelock&&!this.wakelock.released)try{this.releasing=!0,await this.wakelock.release(),this.relockOnVisible=!1}finally{this.releasing=!1}}async destroy(){await this.release(),this.removeAllListeners()}}
|
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:
|
|
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:e.names?.changeEventName,error:e.names?.errorEventName};function r(){if(!e.names)throw new e.UnavailableError;return Boolean(document[e.names.fullscreenElementName])}function l(e,r,l){const t=n[e];t&&document.addEventListener(t,r,l)}function t(e,r,l){const t=n[e];t&&document.removeEventListener(t,r,l)}function a(n,r){return new Promise(((a,s)=>{if(!e.names)throw new e.UnavailableError;const c=()=>{t("change",c),t("error",u),a()},u=e=>{t("change",c),t("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,a)=>{if(!e.names)throw new e.UnavailableError;if(!r)return void n();const s=()=>{t("change",s),t("error",c),n()},c=e=>{t("change",s),t("error",c),a(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=t,e.request=a,e.exit=s,e.toggle=function(e){return promisify((()=>r()?s():a(e)))},e.onChange=function(e){l("change",e)},e.onError=function(e){l("error",e)}}(fullscreen||(fullscreen={}));
|
package/ga/DataLayerProxy.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getHandler}from"./getHandler";export class DataLayerProxy{constructor(r){const
|
|
1
|
+
import{getHandler}from"./getHandler";export class DataLayerProxy{handler;constructor(r){const e=getHandler("auto",r);if(!e)throw new Error("Google Analytics handler is not created.");this.handler=e}push(r){this.handler(r)}}
|
package/getCurrentScriptUrl.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const{currentScript:currentScript}=document;export function getCurrentScriptUrl(r){return new URL(
|
|
1
|
+
const{currentScript:currentScript}=document;export function getCurrentScriptUrl(r){return new URL(r??"",currentScript?.src)}
|
package/getGeoCoordinates.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export function getGeoCoordinates({timeout:e=1e4,maximumAge:o=6e4,...t}={}){return new Promise(((i,m)=>{navigator.geolocation.getCurrentPosition((e=>i(e)),(e=>m(e)),{timeout:e,maximumAge:o,...t})}))}
|
|
@@ -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:
|
|
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:a=()=>!0,onConnect:t,logger:o=console,messagesTypes:i}){const n={Ping:i?.Ping||IFRAME_PING,TargetReady:i?.TargetReady||IFRAME_HOST_READY,SelfReady:i?.SelfReady||IFRAME_CLIENT_READY},r=uuid();let g;const d=(e,s,a)=>{window!==e&&(isWindowProxy(e)?(e.postMessage(s,a),o.debug(`Post message to parent window (origin=${a}):`,s)):(e.postMessage(s),o.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;o.debug(`Receive message from parent window (origin=${i.origin}):`,i.data);const u=getOriginFromMessage(i);if(isPingMessage(i.data,n))((e,s,t)=>{a()&&d(e,{uid:r,type:n.SelfReady,data:s},t)})(i.source,e,u);else{m();const{data:e}=i.data;[g]=i.ports,t(e,u,g),o.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)}}}
|
|
@@ -4,7 +4,7 @@ interface AutoConnectHost {
|
|
|
4
4
|
readonly stop: VoidFunction;
|
|
5
5
|
readonly destroy: VoidFunction;
|
|
6
6
|
/** Send `ready` to iframe. */
|
|
7
|
-
readonly ready: <T>(data: T, target: MessageEventSource, origin?: string
|
|
7
|
+
readonly ready: <T>(data: T, target: MessageEventSource, origin?: string) => void;
|
|
8
8
|
}
|
|
9
9
|
export type AutoConnectHostOptions<T = AnyObject> = {
|
|
10
10
|
readonly onSendData?: ((target: MessageEventSource, origin: string) => T) | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{v4 as uuid}from"uuid";import{onDOMReady}from"../onDOMReady";import{IFRAME_HOST_READY,IFRAME_CLIENT_READY,IFRAME_PING,isPingMessage,isTargetReadyMessage}from"./messages";import{isWindowProxy,selectFrames}from"./utils";import{getOriginFromMessage}from"./getOriginFromMessage";export function getAutoConnectHost({onSendData:e,logger:o=console,openChannel:s,onConnect:t,messagesTypes:n}){const r={Ping:
|
|
1
|
+
import{v4 as uuid}from"uuid";import{onDOMReady}from"../onDOMReady";import{IFRAME_HOST_READY,IFRAME_CLIENT_READY,IFRAME_PING,isPingMessage,isTargetReadyMessage}from"./messages";import{isWindowProxy,selectFrames}from"./utils";import{getOriginFromMessage}from"./getOriginFromMessage";export function getAutoConnectHost({onSendData:e,logger:o=console,openChannel:s,onConnect:t,messagesTypes:n}){const r={Ping:n?.Ping||IFRAME_PING,TargetReady:n?.TargetReady||IFRAME_CLIENT_READY,SelfReady:n?.SelfReady||IFRAME_HOST_READY};let a,i;const d=uuid(),g=s?new MessageChannel:void 0,m=(e,s,t,n)=>{window!==s&&(isWindowProxy(s)?(s.postMessage(e,t,n),o.debug(`Post message to iframe (origin=${t}):`,e)):(s.postMessage(e,n&&{transfer:n}),o.debug("Post message to MessageEventSource:",e)))},u=(e,o)=>{m({uid:d,type:r.Ping},e,o)},c=(e,o,s="*")=>{m({uid:d,type:r.SelfReady,data:e},o,s,g?[g.port2]:void 0)},l=n=>{if(!n.source||n.source===window)return;if(!isPingMessage(n.data,r)&&!isTargetReadyMessage(n.data,r))return;o.debug(`Receive message from iframe (origin=${n.origin}):`,n.data);const a=n.source,i=getOriginFromMessage(n);if(isPingMessage(n.data,r))u(a,i);else{c(e?e(a,i):void 0,a,i);const{data:r}=n.data;setTimeout((()=>{s&&g?t(r,a,i,g.port1):s||t(r,a,i),o.debug("Iframe Host connected.")}),0)}},f=()=>{a&&(a(),a=void 0)};return{start:(...e)=>{if(a)return void o.warn("Already started. You should first call `stop`.");const s=onDOMReady((()=>{i=(()=>{const o="function"==typeof e[0]?e[0]():e;return o.length>0?o:void 0})();const o=i||selectFrames();window.addEventListener("message",l);for(let e=0;e<o.length;e+=1){const s=o[e];s.contentWindow&&u(s.contentWindow,"*")}}));a=()=>{s(),window.removeEventListener("message",l),i=void 0}},stop:f,ready:c,destroy:()=>{f(),g&&(g.port1.close(),g.port2.close(),g.port1.onmessage=null,g.port1.onmessageerror=null)}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{v4 as uuid}from"uuid";import{onDOMReady}from"../onDOMReady";import{isPingMessage,isTargetReadyMessage}from"./messages";import{isWindowProxy,readTargets}from"./utils";import{getOriginFromMessage}from"./getOriginFromMessage";export{getClientMessages,getHostMessages}from"./messages";export function getAutoConnector({id:e,label:t,strictTargets:
|
|
1
|
+
import{v4 as uuid}from"uuid";import{onDOMReady}from"../onDOMReady";import{isPingMessage,isTargetReadyMessage}from"./messages";import{isWindowProxy,readTargets}from"./utils";import{getOriginFromMessage}from"./getOriginFromMessage";export{getClientMessages,getHostMessages}from"./messages";export function getAutoConnector({id:e,label:t,strictTargets:s=!0,messagesTypes:o,channel:n,logger:i=console,onSendData:a,onConnect:r}){const d=e||uuid(),g=t||d,c=new Map,u="open"===n?new Map:void 0;let f,p;const l=(e,t,s,o,n)=>{if(window!==t)if(isWindowProxy(t)){t.postMessage(e,s,n);const a=t===window.parent?"iframe parent":"iframe";i.debug(`${g}: Post message to ${a} (uid=${o},self.uid=${d},origin=${s}):`,e)}else t.postMessage(e,n&&{transfer:n}),i.debug(`${g}: Post message to MessageEventSource (uid=${o},self.uid=${d}):`,e)},m=(e,t,s)=>{l({uid:d,type:o.Ping},e,t,s)},h=e=>{if(!e.source||e.source===window)return;if(!isPingMessage(e.data,o)&&!isTargetReadyMessage(e.data,o))return;if(e.data.uid===d)return;const t=e.source,p=e.data.uid;if(i.debug(`${g}: Receive message from iframe (uid=${p},self.uid=${d},origin=${e.origin}):`,e.data),s&&f&&!f.has(t))return void i.debug(`${g}: Could not find target (uid=${p},self.uid=${d}) by message.source.`);const h=getOriginFromMessage(e);if(isPingMessage(e.data,o)&&!c.get(p)?.Ping)return c.set(p,{...c.get(p),Ping:!0}),void m(t,h,p);let w=!1;if(c.get(p)?.Ping&&!c.get(p)?.SelfReady){c.set(p,{...c.get(p),SelfReady:!0});const e={target:t,origin:h},s=u?(()=>{const t=u.get(p)?.[0]??new MessageChannel;return u.set(p,[t,e]),t.port2})():void 0;((e,t,s,n,i)=>{l({uid:d,type:o.SelfReady,data:e},t,s,n,i?[i]:void 0)})(a?a(e):void 0,t,h,p,s),w=!1}if(isTargetReadyMessage(e.data,o)&&c.get(p)?.SelfReady){c.delete(p),f?.delete(t);const s=(()=>{if("open"===n){const e=u?.get(p)?.[0].port1;if(!e)throw new Error("Something went wrong: MessageChannel is not created despite the fact that the `channel` option is `open`.");return e}if("use"===n){const t=e.ports[0];if(!t)throw new Error("MessagePort is not received despite the fact that the `channel` option is `use`. The `channel` option of connector on another side must be equals `open`.");return t}})(),{data:o}=e.data,a=()=>{i.debug(`${g}: Connection established (self.uid=${d} + uid=${p}).`),r({data:o,target:t,origin:h},s)};w?setTimeout(a,0):a()}},w=()=>{p&&(p(),p=void 0)};return{start:(e,t={})=>{if(p&&!t.append)return void i.warn(`${g}: Already started. You should first call \`stop\`.`);if(t.append){const e=f;w(),f=e}const s=()=>{const s=(()=>{const t="function"==typeof e?e():e;return t.length>0?t:void 0})(),o=s&&readTargets(s);if(!o)return;const n=new Set(o);t.append?(f||(f=new Set),n.forEach((e=>f.add(e)))):f=n,window.addEventListener("message",h);(t.append?n:f).forEach((e=>{e!==window&&m(e,"*","")}))},o="function"==typeof e?onDOMReady(s):s();p=()=>{o&&o(),window.removeEventListener("message",h),f=void 0}},stop:w,isStarted:()=>!!p,close:e=>{const t=e instanceof Set?e:new Set(readTargets(e));if(0!==t.size&&(u&&u.forEach((([e,s],o)=>{t.has(s.target)&&(e.port1.close(),e.port2.close(),u.delete(o))})),f)){const e=f;t.forEach((t=>e.delete(t)))}},destroy:()=>{w(),c.clear(),u&&(u.forEach((([e])=>{e.port1.close(),e.port2.close()})),u.clear())}}}
|
package/isImageTypeSupported.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function isImageTypeSupported(t){try{return document.createElement("canvas").toDataURL(t).startsWith(`data:${t}`)}catch
|
|
1
|
+
export function isImageTypeSupported(t){try{return document.createElement("canvas").toDataURL(t).startsWith(`data:${t}`)}catch{return!1}}
|
package/isWebPSupported.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export async function isWebPSupported(A="lossy"){const Q={lossy:"UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",lossless:"UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==",alpha:"UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA==",animation:"UklGRlIAAABXRUJQVlA4WAoAAAASAAAAAAAAAAAAQU5JTQYAAAD/////AABBTk1GJgAAAAAAAAAAAAAAAAAAAGQAAABWUDhMDQAAAC8AAAAQBxAREYiI/gcA"},o=new Image;return new Promise((l=>{o.onload=()=>l(o.width>0&&o.height>0),o.onerror=()=>l(!1),o.src=`data:image/webp;base64,${Q[A]}`}))}
|
package/loadImage.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export function loadImage(o){return new Promise(((n,r)=>{const e=new Image;if(e.onload=()=>{e.onload=null,e.onerror=null,n(e)},e.onerror=o=>{e.onload=null,e.onerror=null,r(o)},"string"==typeof o)e.src=o;else{const{crossOrigin:n,...r}=o;void 0!==n&&(e.crossOrigin=n),Object.assign(e,r)}}))}
|
package/loadScript.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export interface LoadScriptOptions extends Partial<Pick<HTMLScriptElement, 'id' | 'async' | 'defer'>> {
|
|
2
2
|
keepScript?: boolean | undefined;
|
|
3
3
|
}
|
|
4
|
-
export declare function loadScript(url: string, { keepScript, id, async, defer }?: LoadScriptOptions): Promise<void>;
|
|
4
|
+
export declare function loadScript(url: string, { keepScript, id, async, defer }?: LoadScriptOptions, isExecuted?: (() => boolean) | undefined): Promise<void>;
|
package/loadScript.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{onDOMReady}from"./onDOMReady";function
|
|
1
|
+
import{onDOMReady}from"./onDOMReady";function findScript(e){const t=e.startsWith("//")?window.location.protocol+e:e;for(let e=0;e<document.scripts.length;e+=1)if(document.scripts[e].src===t)return document.scripts[e]}export function loadScript(e,{keepScript:t,id:r,async:n=!0,defer:o=!1}={},c=void 0){return new Promise(((i,d)=>{onDOMReady((()=>{try{const s=r?document.scripts.namedItem(r):findScript(e);if(s&&(!c||c()))return void i();const a=s??document.createElement("script"),p=()=>{a.removeEventListener("load",m),a.removeEventListener("error",u),t||s||a.remove()},m=()=>{p(),i()},u=t=>{p();const r=t instanceof ErrorEvent?t:new Error(`Unable to load script by url ${e}.`,{cause:t});d(r)};a.addEventListener("load",m,{once:!0}),a.addEventListener("error",u,{once:!0}),s||(r&&(a.id=r),a.async=n,a.defer=o,a.src=e,document.head.appendChild(a))}catch(e){d(e)}}))}))}
|
package/media/Capabilities.js
CHANGED
|
@@ -1 +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()}}
|
|
1
|
+
import{getMediaSource}from"./getMediaSource";export class Capabilities{static supportMap=new Map;static canPlayMap=new Map;static tmpVideo;static cacheTimer;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()}}
|
|
@@ -1 +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,
|
|
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,name:"MediaNotAttachedError "})}}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { BaseMediaController } from './BaseMediaController';
|
|
2
2
|
export declare function attachMediaStream(media: HTMLMediaElement, stream: MediaStream | undefined): void;
|
|
3
3
|
export declare function removeTrack(mediaStream: MediaStream, track: MediaStreamTrack): void;
|
|
4
|
-
export declare function addTrack(mediaStream: MediaStream, track: MediaStreamTrack, onEnded?: VoidFunction
|
|
4
|
+
export declare function addTrack(mediaStream: MediaStream, track: MediaStreamTrack, onEnded?: VoidFunction): void;
|
|
5
5
|
export declare class MediaStreamController implements BaseMediaController {
|
|
6
6
|
private mediaStream;
|
|
7
7
|
private media;
|
|
@@ -10,7 +10,7 @@ export declare class MediaStreamController implements BaseMediaController {
|
|
|
10
10
|
detach(): void;
|
|
11
11
|
updateStream(stream: MediaStream): void;
|
|
12
12
|
removeTrack(track: MediaStreamTrack): void;
|
|
13
|
-
addTrack(track: MediaStreamTrack, onEnded?: VoidFunction
|
|
13
|
+
addTrack(track: MediaStreamTrack, onEnded?: VoidFunction): void;
|
|
14
14
|
reset(): void;
|
|
15
15
|
destroy(): void;
|
|
16
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{resetMedia}from"./resetMedia";export function attachMediaStream(e,t){t&&t.active&&e.muted&&0===t.getVideoTracks().filter((e=>!e.getSettings().displaySurface)).length?e.srcObject=null:e.srcObject=t&&t.active?t:null}export function removeTrack(e,t){e.removeTrack(t),e.dispatchEvent(new MediaStreamTrackEvent("removetrack",{track:t}))}export function addTrack(e,t,a){e.addTrack(t),e.dispatchEvent(new MediaStreamTrackEvent("addtrack",{track:t})),t.addEventListener("ended",(()=>{removeTrack(e,t),a&&a()}),{once:!0})}export class MediaStreamController{constructor(e){this.mediaStream=e}attach(e){this.media=e,attachMediaStream(e,this.mediaStream)}detach(){if(this.media){const{media:e}=this;this.media=void 0,resetMedia(e)}}updateStream(e){if(this.mediaStream===e)return;const{media:t}=this;this.mediaStream=e,t&&this.attach(t)}removeTrack(e){removeTrack(this.mediaStream,e)}addTrack(e,t){addTrack(this.mediaStream,e,(()=>{this.removeTrack(e),t&&t()}))}reset(){this.mediaStream.getTracks().forEach((e=>{e.stop(),this.removeTrack(e)}))}destroy(){this.detach(),this.reset()}}
|
|
1
|
+
import{resetMedia}from"./resetMedia";export function attachMediaStream(e,t){t&&t.active&&e.muted&&0===t.getVideoTracks().filter((e=>!e.getSettings().displaySurface)).length?e.srcObject=null:e.srcObject=t&&t.active?t:null}export function removeTrack(e,t){e.removeTrack(t),e.dispatchEvent(new MediaStreamTrackEvent("removetrack",{track:t}))}export function addTrack(e,t,a){e.addTrack(t),e.dispatchEvent(new MediaStreamTrackEvent("addtrack",{track:t})),t.addEventListener("ended",(()=>{removeTrack(e,t),a&&a()}),{once:!0})}export class MediaStreamController{mediaStream;media;constructor(e){this.mediaStream=e}attach(e){this.media=e,attachMediaStream(e,this.mediaStream)}detach(){if(this.media){const{media:e}=this;this.media=void 0,resetMedia(e)}}updateStream(e){if(this.mediaStream===e)return;const{media:t}=this;this.mediaStream=e,t&&this.attach(t)}removeTrack(e){removeTrack(this.mediaStream,e)}addTrack(e,t){addTrack(this.mediaStream,e,(()=>{this.removeTrack(e),t&&t()}))}reset(){this.mediaStream.getTracks().forEach((e=>{e.stop(),this.removeTrack(e)}))}destroy(){this.detach(),this.reset()}}
|
package/media/PipController.js
CHANGED
|
@@ -1 +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={}));
|
|
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}listener;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={}));
|
|
@@ -23,7 +23,7 @@ export declare class TextTracksController extends EventEmitter<TextTracksControl
|
|
|
23
23
|
private textTrack;
|
|
24
24
|
private nextTextTrack;
|
|
25
25
|
get Events(): typeof TextTracksController.Events;
|
|
26
|
-
constructor(options?: TextTracksController.Options
|
|
26
|
+
constructor(options?: TextTracksController.Options);
|
|
27
27
|
setOptions(options: Partial<TextTracksController.Options>): void;
|
|
28
28
|
isAttached(): boolean;
|
|
29
29
|
getMediaElement(): HTMLMediaElement;
|
|
@@ -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){super(),this.
|
|
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{options;eventListeners=new EventListeners;addedTracks=[];textTrackList=[];media;textTrack;nextTextTrack;get Events(){return TextTracksController.Events}constructor(t){super(),this.options={emitNativeEvents:!1,hideActiveTrack:!0,preferCueRowLength:0},t&&this.setOptions(t)}setOptions(t){Object.assign(this.options,{...t,emitNativeEvents:t.emitNativeEvents??this.options.emitNativeEvents,hideActiveTrack:t.hideActiveTrack??this.options.hideActiveTrack,preferCueRowLength:t.preferCueRowLength??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=>{const{activeCues:s}=i.target;if(!s)return;let a=e.length!==s.length;const r=new Array(s.length);for(let t=0;t<r.length;t+=1){const i=s[t];i.id=i.id||buildCueId(i,t),r[t]=i,r[t].rows=splitRows(i.text,this.options.preferCueRowLength),a||e[t]?.id===i.id||(a=!0),e[t]=i}e.length>r.length&&e.splice(r.length-e.length),a&&(this.emit(this.Events.TextTrackCueChanged,{textTrack:i.target,cues:r}),this.options.emitNativeEvents&&dispatchNativeEvent(t,"texttrackcuechange",{textTrack:i.target,cues:r}))}})(),i=()=>{this.textTrackList=parseTextTracks(t),this.emit(this.Events.TextTrackListChanged,{textTracks:this.textTrackList}),this.options.emitNativeEvents&&dispatchNativeEvent(t,"texttracklistchange",{textTracks:this.textTrackList}),setActiveTextTrack(t,this.textTrack??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)},r=t=>{i(),this.eventListeners.scope(t).off("cuechange",e)};if(this.eventListeners.scope(this.media.textTracks).on("change",(()=>{const{textTracks:e}=t,{nextTextTrack:i}=this;let s=-1;for(let a=0;a<e.length;a+=1){const r=e[a];if(r.language===i?.language&&r.kind===i?.kind||isIOSFullscreen(t)||(r.mode="disabled"),"disabled"!==r.mode&&s>=0&&(r.mode="disabled"),"disabled"!==r.mode){if(s=a,!r.native&&!isIOSFullscreen(t)){const t=this.options.hideActiveTrack?"hidden":"showing";r.mode!==t&&(r.mode=t)}r.native&&r.language===i?.language&&r.kind===i.kind&&(r.mode="showing")}}const a=e[s]&&(this.textTrackList[s]??{id:e[s].id,kind:e[s].kind,language:e[s].language,label:e[s].label});this.textTrack?.language===a?.language&&this.textTrack?.kind===a?.kind||(this.textTrack=a,this.nextTextTrack=this.textTrack,this.emit(this.Events.CurrentTextTrackChanged,{textTrack:this.textTrack,index:s}),this.options.emitNativeEvents&&dispatchNativeEvent(t,"texttrackchange",{textTrack:this.textTrack,index:s}))})).on("addtrack",(({track:t})=>t&&a(t))).on("removetrack",(({track:t})=>t&&r(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={}));
|
|
@@ -1 +1 @@
|
|
|
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:
|
|
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:r,language:l,label:a})=>("__detached__"!==e&&l&&t.push({id:n,kind:r,language:l,label:a??""}),t)),[])}export function isIOSFullscreen(t){return isIOS()&&!!t.webkitDisplayingFullscreen}export function setActiveTextTrack(t,e,n){const{textTracks:r}=t;if(0===r.length)return!1;let l=!1,a=!1;for(let t=0;t<r.length;t+=1){const c=r[t];if(a||c.language!==e?.language||e.kind&&c.kind!==e.kind)"disabled"!==c.mode&&(c.mode="disabled",l=!0);else{const t=n?"hidden":"showing";c.mode=t,a=!0,l=!0}}return l}export function addTextTracks(t,e,n){const r=Array.prototype.reduce.call(t.textTracks,((t,e)=>(e.language&&(t[e.language]=e),t)),{});e.forEach((e=>{if(!r[e.language]){const r=document.createElement("track");r.src=e.src,r.srclang=e.language,r.label=e.label,r.kind=e.kind??"captions",r.default=!1,n(t.appendChild(r))}}))}export function buildCueId(t,e){return`${t.startTime}-${e}`}export function splitRows(t,e){if(e<=0)return t.split(/\r?\n/);const n=[];let r=0,l=r,a="";for(let c=0;c<=t.length;c+=1){const i=t[c];a.length>0&&r<l&&(n[l]=null==i?a.trim():a.trimStart(),a=""),r=l;let o=n[r]??"";if("\n"===i||"\r\n"===i)a.length>0&&o.length+a.length<=e&&(o+=o.length>0?a:a.trimStart(),a=""),l+=1;else if(" "===i){if(a.length>0){o.length+a.length>e&&o.length>0?(l+=1,o=o.trimEnd()):(o+=0===o.length?a.trimStart():a,a="")}a+=i}else if(null==i&&a.length>0){o.length+a.length>e&&0!==o.length?(r+=1,o=a.trim()):o+=a}else i&&(a+=i);n[r]=o}return n}
|
package/media/parseCueText.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{splitRows}from"./TextTracksController/utils";const ESCAPE={"&":"&","<":"<",">":">","‎":"","‏":""," ":" "},TAG_NAME={c:"span",i:"i",b:"b",u:"u",ruby:"ruby",rt:"rt",lang:"span"},TAG_ANNOTATION={v:"title",lang:"lang"},NEEDS_PARENT={rt:"ruby"};function computeSeconds(e,t,n,o){return 3600*(+e||0)+60*(+t||0)+(+n||0)+(+o||0)/1e3}function parseTimeStamp(e){const t=e.match(/^(\d+):(\d{2})(:\d{2})?\.(\d{3})/);if(!t)return;const[,n,o,
|
|
1
|
+
import{splitRows}from"./TextTracksController/utils";const ESCAPE={"&":"&","<":"<",">":">","‎":"","‏":""," ":" "},TAG_NAME={c:"span",i:"i",b:"b",u:"u",ruby:"ruby",rt:"rt",lang:"span"},TAG_ANNOTATION={v:"title",lang:"lang"},NEEDS_PARENT={rt:"ruby"};function computeSeconds(e,t,n,o){return 3600*(+e||0)+60*(+t||0)+(+n||0)+(+o||0)/1e3}function parseTimeStamp(e){const t=e.match(/^(\d+):(\d{2})(:\d{2})?\.(\d{3})/);if(!t)return;const[,n,o,r,s]=t;return s?computeSeconds(n,o,r.replace(":",""),s):+n>59?computeSeconds(n,o,"",s):computeSeconds("",n,o,s)}function unescape(e){let t,n=e;for(;t=n.match(/&(amp|lt|gt|lrm|rlm|nbsp);/);)n=n.replace(t[0],(e=>ESCAPE[e]));return n}function nextToken(e){if(!e)return[e,void 0];const t=e.match(/^([^<]*)(<[^>]+>?)?/);if(!t)return[e,void 0];const n=t[1]?t[1]:t[2];return[e.substring(n.length),n]}function shouldAdd(e,t){return!NEEDS_PARENT[t.localName]||NEEDS_PARENT[t.localName]===e.localName}function createHtmlNode(e,t){const n=TAG_NAME[e];if(!n)return;const o=window.document.createElement(n),r=TAG_ANNOTATION[e];return r&&t&&(o[r]=t.trim()),o}export function parseCueText(e,t,{preferLength:n=0}={}){let o,r,s=e,l=-1;const c=[],a=[],u=[],i=e=>{0===a.length&&a.push([]),a.at(-1).push(t?t(e,(a.at(-1)??a.at(-2))?.at(-1)):e)},p=e=>{const t=c.pop()??"",n=o;if(o=n.parentElement||void 0,null==o){i({id:e,startTime:l>=0?l:void 0,tag:t,node:n})}},d=()=>`${a.length}-${(a.at(-1)?.length??0)+1}`,m=(e,t)=>{t?u.push(e):u[u.length-1]+=e,t&&a.push([]),null==o?(e=>{const t=createHtmlNode("c","");t.appendChild(window.document.createTextNode(unescape(e)));const n={id:d(),node:t,tag:"c",startTime:l>=0?l:void 0};i(n)})(e):o.appendChild(window.document.createTextNode(unescape(e)))};for(;null!=([s,r]=nextToken(s),r);)if("<"===r[0])if("/"===r[1])c.at(-1)===r.substring(2).replace(">","")&&p(d());else{const e=parseTimeStamp(r.substring(1,r.length-1));if(e)l=e;else{const e=r.match(/^<([^.\s/0-9>]+)(\.[^\s\\>]+)?([^>\\]+)?(\\?)>?$/),t=e&&createHtmlNode(e[1],e[3]);!t||o&&!shouldAdd(o,t)||(e[2]&&(t.className=e[2].substring(1).replace("."," ")),c.push(e[1]),o?.appendChild(t),o=t)}}else if(0===u.length||n>0&&u.at(-1).length+r.length>n){const e=splitRows(r,n);for(let t=0;t<e.length;t+=1)m(e[t],!0)}else m(r,!1);return{segments:a,rawText:u}}
|
package/onPageReady.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{delay}from"@js-toolkit/utils/delay";export function isPageReady(){return"complete"===document.readyState}export function onPageReady(e,t){let o;const n=()=>{window.removeEventListener("load",a),
|
|
1
|
+
import{delay}from"@js-toolkit/utils/delay";export function isPageReady(){return"complete"===document.readyState}export function onPageReady(e,t){let o;const n=()=>{window.removeEventListener("load",a),o?.cancel()},a=()=>{n(),e()};return isPageReady()?e():(window.addEventListener("load",a,{once:!0}),t?.timeout&&(o=delay(a,t.timeout))),n}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@js-toolkit/web-utils",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.57.0",
|
|
4
4
|
"description": "Web utils",
|
|
5
5
|
"author": "VZH",
|
|
6
6
|
"license": "MIT",
|
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
"@js-toolkit/node-utils": "^1.2.1"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
|
-
"@eslint/compat": "^1.
|
|
23
|
+
"@eslint/compat": "^1.2.2",
|
|
24
24
|
"@eslint/eslintrc": "^3.1.0",
|
|
25
|
-
"@eslint/js": "^9.
|
|
26
|
-
"@js-toolkit/configs": "^3.93.
|
|
25
|
+
"@eslint/js": "^9.14.0",
|
|
26
|
+
"@js-toolkit/configs": "^3.93.11",
|
|
27
27
|
"@js-toolkit/utils": "^1.54.2",
|
|
28
28
|
"@types/eslint": "^9.6.1",
|
|
29
29
|
"@types/eslint__eslintrc": "^2.1.2",
|
|
@@ -31,21 +31,21 @@
|
|
|
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.14.0",
|
|
35
35
|
"eslint-config-prettier": "^9.1.0",
|
|
36
|
-
"eslint-plugin-import": "^2.
|
|
36
|
+
"eslint-plugin-import": "^2.31.0",
|
|
37
37
|
"eslint-plugin-prettier": "^5.2.1",
|
|
38
38
|
"eventemitter3": "^5.0.1",
|
|
39
39
|
"lodash.throttle": "^4.1.1",
|
|
40
40
|
"prettier": "^3.3.3",
|
|
41
41
|
"reconnecting-websocket": "^4.4.0",
|
|
42
42
|
"rimraf": "^6.0.1",
|
|
43
|
-
"terser": "^5.
|
|
44
|
-
"typescript": "^5.
|
|
45
|
-
"typescript-eslint": "^8.
|
|
46
|
-
"ua-parser-js": "^2.0.0-
|
|
47
|
-
"uuid": "^
|
|
48
|
-
"webpack": "^5.
|
|
43
|
+
"terser": "^5.36.0",
|
|
44
|
+
"typescript": "^5.6.3",
|
|
45
|
+
"typescript-eslint": "^8.14.0",
|
|
46
|
+
"ua-parser-js": "^2.0.0-rc.2",
|
|
47
|
+
"uuid": "^11.0.3",
|
|
48
|
+
"webpack": "^5.96.1",
|
|
49
49
|
"yargs": "^17.7.2"
|
|
50
50
|
}
|
|
51
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{onPageReady}from"../onPageReady";export function getNavigationTiming(){return new Promise((e=>{onPageReady((()=>setTimeout((()=>{
|
|
1
|
+
import{onPageReady}from"../onPageReady";export function getNavigationTiming(){return new Promise((e=>{onPageReady((()=>setTimeout((()=>{try{const n=window.performance?.getEntriesByType("navigation")[0];e(n)}catch{e(void 0)}}),0)))}))}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getCachedPlatformInfo}from"./getPlatformInfo";import{isIOS}from"./isIOS";let memo;export function getIOSVersion(){if(void 0===memo){const o=getCachedPlatformInfo();if(!o)return;const{os:t}=o,r=isIOS()&&t.version&&/(\d+)\.(\d+)(?:\.(\d+))?/.exec(t.version);memo=r?{major:parseInt(r[1],10)||0,minor:parseInt(r[2],10)||0,patch:parseInt(r[3],10)||0,toString(){return`${this.major}_${this.minor}_${this.patch}`}}:null}return
|
|
1
|
+
import{getCachedPlatformInfo}from"./getPlatformInfo";import{isIOS}from"./isIOS";let memo;export function getIOSVersion(){if(void 0===memo){const o=getCachedPlatformInfo();if(!o)return;const{os:t}=o,r=isIOS()&&t.version&&/(\d+)\.(\d+)(?:\.(\d+))?/.exec(t.version);memo=r?{major:parseInt(r[1],10)||0,minor:parseInt(r[2],10)||0,patch:parseInt(r[3],10)||0,toString(){return`${this.major}_${this.minor}_${this.patch}`}}:null}return memo??void 0}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{UAParser}from"ua-parser-js";let syncResult,asyncResult,promise;function toPlatformInfo(t){return{...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 async function getPlatformInfo(){return null==asyncResult&&(promise=promise??Promise.resolve(new UAParser(navigator.userAgent).getResult().withFeatureCheck().withClientHints()),asyncResult=toPlatformInfo(await promise),syncResult=asyncResult,promise=void 0),asyncResult}export function getCachedPlatformInfo(){return null==asyncResult&&(console.warn("PlatformInfo is not ready yet."),getPlatformInfo()),asyncResult}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getMediaSource}from"../media/getMediaSource";function getSourceBuffer(){return window.SourceBuffer}export function isMSESupported(){
|
|
1
|
+
import{getMediaSource}from"../media/getMediaSource";function getSourceBuffer(){return window.SourceBuffer}export function isMSESupported(){if(!getMediaSource()?.isTypeSupported)return!1;const e=getSourceBuffer();return!e||e.prototype&&"function"==typeof e.prototype.appendBuffer&&"function"==typeof e.prototype.remove}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export function isMediaCapabilitiesSupported(){
|
|
1
|
+
export function isMediaCapabilitiesSupported(){return!!window.MediaCapabilities&&!!window.navigator&&!!window.navigator.mediaCapabilities?.decodingInfo}
|
|
@@ -25,12 +25,10 @@ export declare class ServiceWorkerInstaller extends DataEventEmitter<{
|
|
|
25
25
|
private cancelDefferedRegister;
|
|
26
26
|
constructor();
|
|
27
27
|
destroy(): void;
|
|
28
|
-
register(swUrl: string | URL, options?: ServiceWorkerInstaller.RegistrationOptions
|
|
28
|
+
register(swUrl: string | URL, options?: ServiceWorkerInstaller.RegistrationOptions): void;
|
|
29
29
|
unregister(): void;
|
|
30
30
|
}
|
|
31
31
|
export declare namespace ServiceWorkerInstaller {
|
|
32
|
-
interface Options {
|
|
33
|
-
}
|
|
34
32
|
interface RegistrationOptions extends globalThis.RegistrationOptions {
|
|
35
33
|
/** Wait for page ready. */
|
|
36
34
|
readonly deffered?: boolean | number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{DataEventEmitter}from"@js-toolkit/utils/DataEventEmitter";import{ErrorCompat}from"@js-toolkit/utils/ErrorCompat";import{onPageReady}from"../onPageReady";import{isLocalhost}from"./utils";export class ServiceWorkerUnavailableError extends ErrorCompat{constructor(){super(ServiceWorkerUnavailableError,"ServiceWorker is not available",{name:"ServiceWorkerUnavailableError"})}}export class ServiceWorkerInstaller extends DataEventEmitter{static isAvailable(){return"serviceWorker"in navigator}registration;cancelDefferedRegister;constructor(){super()}destroy(){this.cancelDefferedRegister&&this.cancelDefferedRegister(),this.removeAllListeners()}register(r,e){if(!ServiceWorkerInstaller.isAvailable())throw new ServiceWorkerUnavailableError;const{deffered:t,...i}=e??{},o=async()=>{try{if(isLocalhost()){const e=await fetch(r);if(!e.ok)throw new Error(`No service worker found at '${e.url}'.`,{cause:`Response: ${e.status} ${e.statusText}`})}const e=await navigator.serviceWorker.register(r,i);this.registration=e,this.emit("registered",{registration:e}),e.onupdatefound=()=>{const r=e.installing;null!=r&&(r.onstatechange=()=>{"installed"===r.state&&(navigator.serviceWorker.controller?this.emit("updatePending",{registration:e}):this.emit("updated",{registration:e}))},r.onerror=r=>{const e=new Error("Error during service worker installation",{cause:r});this.emit("error",{error:e})})}}catch(r){const e=new Error("Error during service worker registration",{cause:r});this.emit("error",{error:e})}};t?this.cancelDefferedRegister=onPageReady(o,"number"==typeof t?{timeout:t}:void 0):o()}unregister(){this.cancelDefferedRegister&&this.cancelDefferedRegister(),this.registration?.unregister().catch((r=>{const e=new Error("Error during service worker unregister",{cause:r});this.emit("error",{error:e})}))}}
|
package/serviceWorker/utils.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{getErrorMessage}from"@js-toolkit/utils/getErrorMessage";export function isLocalhost(e=window.location.hostname){return!("localhost"!==e&&"[::1]"!==e&&!e.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/))}export function removeUnknownCaches(e){return caches.keys().then((r=>{const o=new Set(Object.values(e));return Promise.all(r.map((e=>{if(!o.has(e))return caches.delete(e)})))}))}export async function addResourcesToCache(e,r){const o=await caches.open(e);await o.addAll(r)}export async function cacheFirst(e,{request:r,fallbackUrl:o,saveToCache:t,logger:n=console}){const s=await caches.open(e),c=await s.match(r);if(c)return n.debug("Found response in cache:",c),c;n.debug("No response for %s found in cache. About to fetch from network...",r.url);try{const e=await fetch(r.clone());return n.debug("Response for %s from network is: %O",r.url,e),e.status<400&&(!t||t({request:r,response:e}))?(n.debug("Caching the response to",r.url),s.put(r,e.clone()).catch((e=>{n.error(getErrorMessage(new Error(`Caching error of ${r.url}`,{cause:e})))}))):n.debug("Not caching the response to",r.url),e}catch(e){const r=o&&await s.match(o);if(r)return r;throw n.error("Error in fetch handler:",e),e}}
|
package/webrtc/PeerConnection.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{DataEventEmitter}from"@js-toolkit/utils/DataEventEmitter";import{getErrorMessage}from"@js-toolkit/utils/getErrorMessage";import{hasIn}from"@js-toolkit/utils/hasIn";import*as sdpUtils from"./sdputils";export class PeerConnection extends DataEventEmitter{options;get Events(){return PeerConnection.Events}logger;pc;constructor(e={}){super(),this.options=e,this.logger=e.logger??console,this.pc=this.createPC()}clear(){this.pc.onsignalingstatechange=null,this.pc.onconnectionstatechange=null,this.pc.oniceconnectionstatechange=null,this.pc.ontrack=null,this.pc.onnegotiationneeded=null,this.pc.onicecandidate=null,this.pc.onicecandidateerror=null}createPC(){const e=new RTCPeerConnection(this.options.rtc);return e.onsignalingstatechange=()=>{this.logger.debug(`Signaling state changed to: ${e.signalingState}`),"closed"===e.signalingState&&(this.emit(this.Events.Closed),this.clear())},hasIn(RTCPeerConnection.prototype,"onconnectionstatechange")?e.onconnectionstatechange=()=>{this.logger.debug(`Connection state changed to: ${e.connectionState}`),"connected"===e.connectionState?this.emit(this.Events.Connected):"disconnected"===e.connectionState&&this.emit(this.Events.Disconnected)}:e.oniceconnectionstatechange=()=>{this.logger.debug(`ICE connection state changed to: ${e.iceConnectionState}`),"connected"===e.iceConnectionState?this.emit(this.Events.Connected):"disconnected"===e.iceConnectionState&&this.emit(this.Events.Disconnected)},e.ontrack=({streams:e,track:t})=>{if(this.logger.debug("Remote stream received.",e.length,t.kind),0===e.length)return;const[n]=e;n.onremovetrack=()=>{this.logger.debug("onremovetrack"),this.emit(this.Events.RemoteStreamChanged,n)},n.onaddtrack=()=>{this.logger.debug("onaddtrack"),this.emit(this.Events.RemoteStreamChanged,n)},this.emit(this.Events.RemoteStreamChanged,n)},e.onnegotiationneeded=()=>{const{iceConnectionState:t}=e;"connected"!==t&&"completed"!==t||(this.logger.debug("Reinitializing connection..."),this.emit(this.Events.ReinitializingConnectionRequired))},e.onicecandidate=({candidate:e})=>{e?sdpUtils.isValidIceCandidate(e)&&this.emit(this.Events.LocalIceCandidate,e):this.emit(this.Events.EndOfIceCandidates)},e.onicecandidateerror=e=>{if(e instanceof RTCPeerConnectionIceErrorEvent){const{errorCode:t,errorText:n,hostCandidate:i,url:o}=e;this.logger.warn(`ICE candidate error: errorCode=${t}, errorText=${n}, hostCandidate=${i}, url=${o}`)}else this.logger.warn(`ICE candidate error: ${getErrorMessage(e)}`)},e}async setLocalDescription(e,t){const n=sdpUtils.prepareLocalDescription(t,this.options.codecs);return await e.setLocalDescription(n),n}async setRemoteDescription(e,t){const n=sdpUtils.prepareRemoteDescription(t,this.options.codecs);return await e.setRemoteDescription(n),n}isConnected(){return"connected"===this.pc.iceConnectionState||"completed"===this.pc.iceConnectionState}isClosed(){return"closed"===this.pc.signalingState}addIceCandidate(e){return this.pc.addIceCandidate(e)}attachStream(e){const t=this.pc.getSenders(),n=t.length?e.getTracks().filter((e=>!t.find((({track:t})=>!!t&&t.id===e.id)))):e.getTracks();n.length?(n.forEach((t=>this.pc.addTrack(t,e))),this.logger.debug(`Attached ${n.length} track(s) to a peer connection.`)):this.logger.debug("No tracks to attach to a peer connection.")}reattachStream(e){const t=this.pc.iceConnectionState;if("new"!==t&&"connected"!==t&&"completed"!==t)return;const n=e?e.getTracks():[];this.pc.getSenders().forEach((e=>{const{track:t}=e;!t||"ended"!==t.readyState&&n.find((e=>e.id===t.id))||(this.pc.removeTrack(e),this.logger.debug(`'${t&&t.kind}' track is removed from a peer connection.`))})),e&&this.attachStream(e)}async createOffer(){const e=await this.pc.createOffer(this.options.offerOptions);return this.setLocalDescription(this.pc,e)}async createAnswer(e){await this.setRemoteDescription(this.pc,e);const t=await this.pc.createAnswer(this.options.offerOptions);return this.setLocalDescription(this.pc,t)}applyAnswer(e){return this.setRemoteDescription(this.pc,e)}reconnect(){this.close(),this.pc=this.createPC()}close(){this.pc.close(),this.pc.onsignalingstatechange&&(this.emit(this.Events.Closed),this.clear())}destroy(){this.close(),this.removeAllListeners()}}!function(e){let t;!function(e){e.LocalIceCandidate="LocalIceCandidate",e.EndOfIceCandidates="EndOfIceCandidates",e.Connected="Connected",e.Disconnected="Disconnected",e.RemoteStreamChanged="RemoteStreamChanged",e.ReinitializingConnectionRequired="ReinitializingConnectionRequired",e.Closed="Closed"}(t=e.Events||(e.Events={}))}(PeerConnection||(PeerConnection={}));
|
package/ws/WSController.d.ts
CHANGED
|
@@ -7,12 +7,12 @@ export declare class WSController<TData = unknown> extends DataEventEmitter<WSCo
|
|
|
7
7
|
private readonly listener;
|
|
8
8
|
private readonly reconnectOnIdle;
|
|
9
9
|
private readonly halfOpen;
|
|
10
|
-
constructor(url: UrlProvider, options?: WSController.Options
|
|
10
|
+
constructor(url: UrlProvider, options?: WSController.Options);
|
|
11
11
|
isConnected(): boolean;
|
|
12
12
|
getUrl(): string;
|
|
13
13
|
connect(): void;
|
|
14
14
|
send(data: Message): void;
|
|
15
|
-
close(code?: number
|
|
15
|
+
close(code?: number, reason?: string): void;
|
|
16
16
|
destroy(): void;
|
|
17
17
|
}
|
|
18
18
|
export declare namespace WSController {
|
package/ws/WSController.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
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}logger;ws;listener;reconnectOnIdle;halfOpen;constructor(e,t){super();const{logger:n,protocols:s,binaryType:o,idleTimeout:r,halfOpenDetection:i,startClosed:c,...l}=t??{};this.logger=n??console,this.ws=new ReconnectingWebSocket(e,s,{...l,startClosed:!0}),null!=o&&(this.ws.binaryType=o),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(!i)return;const{pingTimeout:e=12e3,outMessage:t=()=>JSON.stringify({type:"pong"}),inMessageFilter:n=e=>e&&"object"==typeof e&&"ping"===e.type}=i,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",(()=>{this.reconnectOnIdle&&this.reconnectOnIdle(),this.halfOpen?.heartbeat(),this.emit(this.Events.Connected)})).on("close",(({code:e})=>{this.reconnectOnIdle?.cancel(),this.halfOpen?.cancel(),null!=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=>{this.reconnectOnIdle&&this.reconnectOnIdle(),this.halfOpen?.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(),c||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={}));
|
package/getAppContainer.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function getAppContainer(id?: string): HTMLElement;
|
package/getAppContainer.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export function getAppContainer(t="root"){const n=document.getElementById(t);if(!n)throw new Error(`Container "${t}" for the app is not found.`);return n}
|