@js-toolkit/web-utils 1.48.0 → 1.49.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.d.ts +1 -1
- package/EventEmitterListener.js +1 -1
- package/EventEmitterListener.utils.js +1 -1
- package/EventListeners.d.ts +0 -1
- package/EventListeners.js +1 -1
- package/FullscreenController.d.ts +33 -32
- package/FullscreenController.js +1 -1
- package/PipController.d.ts +3 -2
- package/PipController.js +1 -1
- package/base64ToDataUrl.d.ts +0 -1
- package/base64ToDataUrl.js +1 -1
- package/blobToDataUrl.d.ts +0 -1
- package/blobToDataUrl.js +1 -1
- package/createLoop.d.ts +0 -1
- package/createLoop.js +1 -1
- package/dataUrlToBlob.d.ts +0 -1
- package/dataUrlToBlob.js +1 -1
- package/fullscreen.d.ts +2 -3
- package/fullscreen.js +1 -1
- package/ga/DataLayerProxy.d.ts +0 -1
- package/ga/DataLayerProxy.js +1 -1
- package/ga/getHandler.d.ts +1 -1
- package/ga/getHandler.js +1 -1
- package/ga/iframeMessenger.d.ts +0 -1
- package/ga/iframeMessenger.js +1 -1
- package/getAppContainer.d.ts +0 -1
- package/getAppContainer.js +1 -1
- package/getAspectRatio.d.ts +0 -1
- package/getAspectRatio.js +1 -1
- package/getBrowserLanguage.d.ts +0 -1
- package/getBrowserLanguage.js +1 -1
- package/getGeoCoordinates.d.ts +0 -1
- package/getGeoCoordinates.js +1 -1
- package/getGeoLocality.d.ts +0 -1
- package/getGeoLocality.js +1 -1
- package/getInnerRect.d.ts +0 -1
- package/getInnerRect.js +1 -1
- package/getInnerXDimensions.d.ts +0 -1
- package/getInnerXDimensions.js +1 -1
- package/getInnerYDimensions.d.ts +0 -1
- package/getInnerYDimensions.js +1 -1
- package/getRandomID.d.ts +0 -1
- package/getRandomID.js +1 -1
- package/getSecondsCounter.d.ts +0 -1
- package/getSecondsCounter.js +1 -1
- package/imageToBlob.d.ts +0 -1
- package/imageToBlob.js +1 -1
- package/loadImage.d.ts +0 -1
- package/loadImage.js +1 -1
- package/loadScript.js +1 -1
- package/onDOMReady.d.ts +0 -1
- package/onDOMReady.js +1 -1
- package/package.json +18 -19
- package/platform/getIOSVersion.d.ts +1 -2
- package/platform/getIOSVersion.js +1 -1
- package/platform/isAndroid.js +1 -1
- package/platform/isIOS.js +1 -1
- package/platform/isMacOS.js +1 -1
- package/platform/isMobile.js +1 -1
- package/platform/isSafari.js +1 -1
- package/platform/ua.d.ts +4 -0
- package/platform/ua.js +1 -0
- package/preventDefault.d.ts +0 -1
- package/preventDefault.js +1 -1
- package/saveFileAs.d.ts +0 -1
- package/saveFileAs.js +1 -1
- package/stopPropagation.d.ts +0 -1
- package/stopPropagation.js +1 -1
- package/toBase64.d.ts +0 -1
- package/toBase64.js +1 -1
- package/toLocalPoint.d.ts +0 -1
- package/toLocalPoint.js +1 -1
- package/webrtc/PeerConnection.d.ts +1 -1
- package/webrtc/PeerConnection.js +1 -1
- package/ws/WSController.d.ts +1 -1
- package/ws/WSController.js +1 -1
- package/ConnectionController.d.ts +0 -7
- package/ConnectionController.js +0 -1
- package/platform/getUAParserResult.d.ts +0 -2
- package/platform/getUAParserResult.js +0 -1
|
@@ -55,4 +55,4 @@ export declare class EventEmitterListener<T extends EmitterTarget, M extends Any
|
|
|
55
55
|
emit<K extends GetEventType<T>>(type: K, ...args: Parameters<GetEventListener<T, K, M>>): this;
|
|
56
56
|
emit(type: string, ...args: Parameters<GetEventListener<T, string, M>>): this;
|
|
57
57
|
}
|
|
58
|
-
export
|
|
58
|
+
export {};
|
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.normalListeners={},this.captureListeners={},this.passiveSupported=isPassiveSupported(),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){var r;if(!isDomEventTarget(this.target)){const s=this.normalListeners[t];return!!s&&(e?s.has(e):s.size>0)}const i=s[0],n=!0===i||i&&"object"==typeof i&&null!==(r=i.capture)&&void 0!==r&&r?this.captureListeners[t]:this.normalListeners[t];return!!n&&(e?n.has(e):n.size>0)}on(t,e,...s){var r,i,n,o,a,h,l,c;if(!isDomEventTarget(this.target)){const n=null!==(r=this.normalListeners[t])&&void 0!==r?r:new Map;this.normalListeners[t]=n;const o=null!==(i=n.get(e))&&void 0!==i?i:this.interceptor?this.createWrapper(t,e,!1):e;return!n.has(e)&&n.set(e,o),isEventTargetLike(this.target)?this.target.addEventListener(t,o,...s):this.target.on(t,o,...s),this}const u=s[0],p=!0===u||u&&"object"==typeof u&&null!==(n=u.capture)&&void 0!==n&&n,v=null!==(o=u&&"object"==typeof u&&u.once)&&void 0!==o&&o;if(p){const s=null!==(a=this.captureListeners[t])&&void 0!==a?a:new Map;this.captureListeners[t]=s;const r=null!==(h=s.get(e))&&void 0!==h?h:this.createWrapper(t,e,v,u);!s.has(e)&&s.set(e,r),this.target.addEventListener(t,r,normalizeOptions(u))}else{const s=null!==(l=this.normalListeners[t])&&void 0!==l?l:new Map;this.normalListeners[t]=s;const r=null!==(c=s.get(e))&&void 0!==c?c:this.createWrapper(t,e,v,u);!s.has(e)&&s.set(e,r),this.target.addEventListener(t,r,normalizeOptions(u))}return this}once(t,e,...s){var r,i;if(!isDomEventTarget(this.target)){const n=null!==(r=this.normalListeners[t])&&void 0!==r?r:new Map;this.normalListeners[t]=n;const o=null!==(i=n.get(e))&&void 0!==i?i:this.createWrapper(t,e,!0,...s);return!n.has(e)&&n.set(e,o),isEventTargetLike(this.target)?this.target.addEventListener(t,o,...s):this.target.once?this.target.once(t,o,...s):this.target.on(t,o,...s),this}const n=s[0];return this.on(t,e,Object.assign(Object.assign({},"object"==typeof n?n:null!=n&&{capture:n}),{once:!0}))}off(t,e,...s){var r;if(!isDomEventTarget(this.target)){const r=this.normalListeners[t],i=null==r?void 0:r.get(e);return r&&i&&r.delete(e),0===(null==r?void 0:r.size)&&delete this.normalListeners[t],isEventTargetLike(this.target)?this.target.removeEventListener(t,null!=i?i:e,...s):this.target.off(t,null!=i?i:e,...s),this}const i=s[0],n=!0===i||i&&"object"==typeof i&&null!==(r=i.capture)&&void 0!==r&&r,o=n?this.captureListeners[t]:this.normalListeners[t],a=null==o?void 0:o.get(e);return o&&a&&o.delete(e),0===(null==o?void 0:o.size)&&(n?delete this.captureListeners[t]:delete this.normalListeners[t]),this.target.removeEventListener(t,null!=a?a:e,normalizeOptions(i)),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
|
+
import{isPassiveSupported,isDomEventTarget,isEventTargetLike,normalizeOptions}from"./EventEmitterListener.utils";export class EventEmitterListener{constructor(t,e){this.target=t,this.interceptor=e,this.normalListeners={},this.captureListeners={},this.passiveSupported=isPassiveSupported(),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){var r;if(!isDomEventTarget(this.target)){const s=this.normalListeners[t];return!!s&&(e?s.has(e):s.size>0)}const i=s[0],n=!0===i||i&&"object"==typeof i&&null!==(r=i.capture)&&void 0!==r&&r?this.captureListeners[t]:this.normalListeners[t];return!!n&&(e?n.has(e):n.size>0)}on(t,e,...s){var r,i,n,o,a,h,l,c;if(!isDomEventTarget(this.target)){const n=null!==(r=this.normalListeners[t])&&void 0!==r?r:new Map;this.normalListeners[t]=n;const o=null!==(i=n.get(e))&&void 0!==i?i:this.interceptor?this.createWrapper(t,e,!1):e;return!n.has(e)&&n.set(e,o),isEventTargetLike(this.target)?this.target.addEventListener(t,o,...s):this.target.on(t,o,...s),this}const u=s[0],p=!0===u||u&&"object"==typeof u&&null!==(n=u.capture)&&void 0!==n&&n,v=null!==(o=u&&"object"==typeof u&&u.once)&&void 0!==o&&o;if(p){const s=null!==(a=this.captureListeners[t])&&void 0!==a?a:new Map;this.captureListeners[t]=s;const r=null!==(h=s.get(e))&&void 0!==h?h:this.createWrapper(t,e,v,u);!s.has(e)&&s.set(e,r),this.target.addEventListener(t,r,normalizeOptions(u))}else{const s=null!==(l=this.normalListeners[t])&&void 0!==l?l:new Map;this.normalListeners[t]=s;const r=null!==(c=s.get(e))&&void 0!==c?c:this.createWrapper(t,e,v,u);!s.has(e)&&s.set(e,r),this.target.addEventListener(t,r,normalizeOptions(u))}return this}once(t,e,...s){var r,i;if(!isDomEventTarget(this.target)){const n=null!==(r=this.normalListeners[t])&&void 0!==r?r:new Map;this.normalListeners[t]=n;const o=null!==(i=n.get(e))&&void 0!==i?i:this.createWrapper(t,e,!0,...s);return!n.has(e)&&n.set(e,o),isEventTargetLike(this.target)?this.target.addEventListener(t,o,...s):this.target.once?this.target.once(t,o,...s):this.target.on(t,o,...s),this}const n=s[0];return this.on(t,e,Object.assign(Object.assign({},"object"==typeof n?n:null!=n&&{capture:n}),{once:!0}))}off(t,e,...s){var r;if(!isDomEventTarget(this.target)){const r=this.normalListeners[t],i=null==r?void 0:r.get(e);return r&&i&&r.delete(e),0===(null==r?void 0:r.size)&&delete this.normalListeners[t],isEventTargetLike(this.target)?this.target.removeEventListener(t,null!=i?i:e,...s):this.target.off(t,null!=i?i:e,...s),this}const i=s[0],n=!0===i||i&&"object"==typeof i&&null!==(r=i.capture)&&void 0!==r&&r,o=n?this.captureListeners[t]:this.normalListeners[t],a=null==o?void 0:o.get(e);return o&&a&&o.delete(e),0===(null==o?void 0:o.size)&&(n?delete this.captureListeners[t]:delete this.normalListeners[t]),this.target.removeEventListener(t,null!=a?a:e,normalizeOptions(i)),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{__rest}from"tslib";import
|
|
1
|
+
import{__rest}from"tslib";import{isEmptyObject}from"@js-toolkit/utils/isEmptyObject";export function isEventTargetLike(t){return void 0!==t.addEventListener&&void 0!==t.removeEventListener}export function isDomEventTarget(t){return isEventTargetLike(t)&&void 0!==t.dispatchEvent}export function isEventEmitterLike(t){return!isEventTargetLike(t)&&!isDomEventTarget(t)&&void 0!==t.on&&void 0!==t.once&&void 0!==t.off}let passiveSupported=!1;export function isPassiveSupported(){return passiveSupported}try{const t={get passive(){return passiveSupported=!0,!1}};window.addEventListener("__testpassive__",null,t)}catch(e){}export function normalizeOptions(t){if(t&&"object"==typeof t){let e=t;if("passive"in t&&!passiveSupported){const{passive:i}=t;e=__rest(t,["passive"])}return isEmptyObject(e)?void 0:e}return t}
|
package/EventListeners.d.ts
CHANGED
|
@@ -5,4 +5,3 @@ export declare class EventListeners {
|
|
|
5
5
|
scope<T extends EmitterTarget, M extends AnyObject = GetEventMap<T>>(target: T, scope?: string): EventEmitterListener<T, M>;
|
|
6
6
|
removeAllListeners<T extends EmitterTarget>(target?: T | undefined, scope?: string): this;
|
|
7
7
|
}
|
|
8
|
-
export default EventListeners;
|
package/EventListeners.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{EventEmitterListener}from"./EventEmitterListener";export class EventListeners{constructor(){this.listeners=new Map}scope(e,
|
|
1
|
+
import{EventEmitterListener}from"./EventEmitterListener";export class EventListeners{constructor(){this.listeners=new Map}scope(e,s){var t,l;const r=null!=s?s:"",i=null!==(t=this.listeners.get(e))&&void 0!==t?t:new Map;!this.listeners.has(e)&&this.listeners.set(e,i);const n=null!==(l=i.get(r))&&void 0!==l?l:new EventEmitterListener(e);return!i.has(r)&&i.set(r,n),n}removeAllListeners(e,s){var t;if(e)if(s){const l=this.listeners.get(e);null===(t=null==l?void 0:l.get(s))||void 0===t||t.removeAllListeners(),null==l||l.delete(s),0===(null==l?void 0:l.size)&&this.listeners.delete(e)}else{const s=this.listeners.get(e);null==s||s.forEach((e=>e.removeAllListeners())),null==s||s.clear(),this.listeners.delete(e)}else this.listeners.forEach((e=>{e.forEach((e=>e.removeAllListeners())),e.clear()})),this.listeners.clear();return this}}
|
|
@@ -4,56 +4,57 @@ declare global {
|
|
|
4
4
|
webkitEnterFullscreen?: VoidFunction | undefined;
|
|
5
5
|
webkitExitFullscreen?: VoidFunction | undefined;
|
|
6
6
|
webkitDisplayingFullscreen?: boolean | undefined;
|
|
7
|
+
webkitSupportsFullscreen?: boolean | undefined;
|
|
7
8
|
}
|
|
8
9
|
}
|
|
9
10
|
export declare function enterPseudoFullscreen(element: Element & ElementCSSInlineStyle): VoidFunction;
|
|
10
11
|
export declare class FullscreenController extends EventEmitter<FullscreenController.EventMap> {
|
|
11
12
|
private readonly element;
|
|
12
|
-
private
|
|
13
|
+
private options;
|
|
14
|
+
static isApiAvailable(): boolean;
|
|
13
15
|
get Events(): typeof FullscreenController.Events;
|
|
16
|
+
private fallback;
|
|
14
17
|
private exitPseudoFullscreen;
|
|
15
|
-
constructor(element: Element,
|
|
16
|
-
private
|
|
17
|
-
|
|
18
|
+
constructor(element: Element, options?: FullscreenController.Options);
|
|
19
|
+
private unbind;
|
|
20
|
+
setOptions(options: FullscreenController.Options): void;
|
|
18
21
|
destroy(): Promise<void>;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
private
|
|
25
|
-
private
|
|
26
|
-
private
|
|
27
|
-
private endFullscreenHandler;
|
|
22
|
+
isAvailable(): boolean;
|
|
23
|
+
isFullscreen(): boolean;
|
|
24
|
+
isPseudoFullscreen(): boolean;
|
|
25
|
+
getCurrentElement(): Element | null;
|
|
26
|
+
private nativeChangeHandler;
|
|
27
|
+
private nativeErrorHandler;
|
|
28
|
+
private videoBeginFullscreenHandler;
|
|
29
|
+
private videoEndFullscreenHandler;
|
|
28
30
|
request(options?: FullscreenController.RequestOptions): Promise<void>;
|
|
29
31
|
exit(): Promise<void>;
|
|
30
32
|
}
|
|
31
33
|
export declare namespace FullscreenController {
|
|
34
|
+
type FullscreenType = 'video' | 'pseudo' | 'native';
|
|
35
|
+
type Options = {
|
|
36
|
+
readonly fallback?: ExtractStrict<FullscreenType, 'pseudo'> | undefined;
|
|
37
|
+
} | {
|
|
38
|
+
readonly fallback: HTMLVideoElement;
|
|
39
|
+
/** Used for iOS. */
|
|
40
|
+
readonly toggleNativeSubtitles?: boolean | undefined;
|
|
41
|
+
};
|
|
42
|
+
interface RequestOptions extends Readonly<FullscreenOptions> {
|
|
43
|
+
}
|
|
32
44
|
enum Events {
|
|
33
45
|
Change = "change",
|
|
34
46
|
Error = "error"
|
|
35
47
|
}
|
|
36
48
|
type EventMap = DefineAll<Events, {
|
|
37
|
-
[Events.Change]: [
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
{
|
|
46
|
-
error: unknown;
|
|
47
|
-
video?: boolean | undefined;
|
|
48
|
-
pseudo?: boolean | undefined;
|
|
49
|
-
}
|
|
50
|
-
];
|
|
49
|
+
[Events.Change]: [{
|
|
50
|
+
fullscreen: boolean;
|
|
51
|
+
type: FullscreenType;
|
|
52
|
+
}];
|
|
53
|
+
[Events.Error]: [{
|
|
54
|
+
error: unknown;
|
|
55
|
+
type: FullscreenType;
|
|
56
|
+
}];
|
|
51
57
|
}>;
|
|
52
|
-
interface RequestOptions extends Readonly<FullscreenOptions> {
|
|
53
|
-
/** Used for iOS */
|
|
54
|
-
readonly toggleNativeVideoSubtitles?: boolean | undefined;
|
|
55
|
-
readonly pseudoFullscreenFallback?: boolean | undefined;
|
|
56
|
-
}
|
|
57
58
|
type EventHandler<T extends Events = Events> = EventEmitter.EventListener<EventMap, T>;
|
|
58
59
|
type EventHandlerMap<T extends Events = Events> = {
|
|
59
60
|
[P in T]: EventHandler<P>;
|
package/FullscreenController.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
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,l;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},l=e,l.style.position="fixed",l.style.left="0px",l.style.top="0px",l.style.width="100%",l.style.height="100%",l.style.maxWidth="100%",l.style.maxHeight="100%",l.style.zIndex="99999",()=>{t&&l&&(l.style.position=t.position,l.style.left=t.left,l.style.top=t.top,l.style.width=t.width,l.style.height=t.height,l.style.maxWidth=t.maxWidth,l.style.maxHeight=t.maxHeight,l.style.zIndex=t.zIndex),t=void 0,l=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().finally((()=>{this.removeAllListeners(),this.unbind()}))}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,l)=>{if(this.isFullscreen())return void t();if(fullscreen.isApiEnabled())return void fullscreen.request(this.element,e).then(t,l);if("pseudo"===this.fallback)return this.exitPseudoFullscreen=enterPseudoFullscreen(this.element),this.emit(this.Events.Change,{fullscreen:!0,type:"pseudo"}),void t();const i=this.fallback instanceof HTMLVideoElement&&this.fallback||void 0;if((null==i?void 0:i.webkitEnterFullscreen)&&i.webkitSupportsFullscreen){const e=()=>{i.removeEventListener("webkitbeginfullscreen",e),t()};return i.addEventListener("webkitbeginfullscreen",e),void i.webkitEnterFullscreen()}l(new fullscreen.UnavailableError)}))}exit(){return new Promise(((e,t)=>{if(!this.isFullscreen())return void e();if(fullscreen.isApiEnabled())return void fullscreen.exit().then(e,t);if(this.exitPseudoFullscreen)return this.exitPseudoFullscreen(),this.exitPseudoFullscreen=void 0,this.emit(this.Events.Change,{fullscreen:!1,type:"pseudo"}),void e();const l=this.fallback instanceof HTMLVideoElement&&this.fallback||void 0;if((null==l?void 0:l.webkitExitFullscreen)&&l.webkitSupportsFullscreen){const t=()=>{l.removeEventListener("webkitendfullscreen",t),e()};return l.addEventListener("webkitendfullscreen",t),void l.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/PipController.d.ts
CHANGED
|
@@ -8,8 +8,9 @@ declare global {
|
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
10
|
export declare class PipController extends EventEmitter<PipController.EventMap> {
|
|
11
|
-
private static
|
|
12
|
-
static
|
|
11
|
+
private static isApiEnabled;
|
|
12
|
+
private static isWebkitApiEnabled;
|
|
13
|
+
static isAvailable(video: HTMLVideoElement): boolean;
|
|
13
14
|
get Events(): typeof PipController.Events;
|
|
14
15
|
private readonly listener;
|
|
15
16
|
constructor(video: HTMLVideoElement);
|
package/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
|
|
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(){return!!HTMLVideoElement.prototype.webkitSupportsPresentationMode&&HTMLVideoElement.prototype.webkitSupportsPresentationMode("picture-in-picture")}static isAvailable(e){return this.isApiEnabled()&&!e.disablePictureInPicture||this.isWebkitApiEnabled()}get Events(){return PipController.Events}constructor(e){if(super(),this.listener=new EventEmitterListener(e),PipController.isAvailable(e)){const e=()=>{this.emit(this.Events.Change,{isPip:!0})},t=()=>{this.emit(this.Events.Change,{isPip:!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()}))}get isPip(){return PipController.isApiEnabled()?document.pictureInPictureElement===this.listener.target:"picture-in-picture"===this.listener.target.webkitPresentationMode}get currentElement(){return this.isPip?this.listener.target:null}request(){return new Promise(((e,t)=>{if(this.isPip)e();else{if(!PipController.isAvailable(this.listener.target))throw getPipUnavailableError();PipController.isApiEnabled()?this.listener.target.requestPictureInPicture().then((()=>e()),t):(this.listener.once("webkitpresentationmodechanged",(()=>{"picture-in-picture"===this.listener.target.webkitPresentationMode?e():t(new Error("Something went wrong."))}),!0),this.listener.target.webkitSetPresentationMode("picture-in-picture"))}}))}exit(){return new Promise(((e,t)=>{if(this.isPip){if(!PipController.isAvailable(this.listener.target))throw getPipUnavailableError();PipController.isApiEnabled()?document.exitPictureInPicture().then(e,t):(this.listener.once("webkitpresentationmodechanged",(()=>{"picture-in-picture"!==this.listener.target.webkitPresentationMode?e():t(new Error("Something went wrong."))}),!0),this.listener.target.webkitSetPresentationMode("inline"))}else e()}))}}!function(e){let t;!function(e){e.Change="change"}(t=e.Events||(e.Events={}))}(PipController||(PipController={}));
|
package/base64ToDataUrl.d.ts
CHANGED
package/base64ToDataUrl.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function base64ToDataUrl(a,e="image/png"){return`data:${e};base64,${a}`}
|
|
1
|
+
export function base64ToDataUrl(a,e="image/png"){return`data:${e};base64,${a}`}
|
package/blobToDataUrl.d.ts
CHANGED
package/blobToDataUrl.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function blobToDataUrl(e){return new Promise(((o
|
|
1
|
+
export function blobToDataUrl(e){return new Promise(((r,o)=>{const n=new FileReader;n.onload=()=>{r(n.result)},n.onerror=o,n.readAsDataURL(e)}))}
|
package/createLoop.d.ts
CHANGED
package/createLoop.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function createLoop(){let e,t,a
|
|
1
|
+
export function createLoop(){let e,t,n,a=!1;const r=()=>{a&&n&&(t&&cancelAnimationFrame(t),t=requestAnimationFrame(n))};return{start:(t,i)=>{n=t,a||(a=!0,e=window.setInterval(r,i))},stop:()=>{a&&(a=!1,window.clearInterval(e),t&&cancelAnimationFrame(t))},call:r,isActive:()=>a}}
|
package/dataUrlToBlob.d.ts
CHANGED
package/dataUrlToBlob.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function dataUrlToBlob(t){const[e,
|
|
1
|
+
export function dataUrlToBlob(t){const[e,n]=t.split(","),r=window.atob(n),o=e.split(":")[1].split(";")[0],l=new ArrayBuffer(r.length),a=new Uint8Array(l);for(let t=0;t<r.length;t+=1)a[t]=r.charCodeAt(t);return new Blob([l],{type:o})}
|
package/fullscreen.d.ts
CHANGED
|
@@ -13,8 +13,8 @@ export declare namespace fullscreen {
|
|
|
13
13
|
export const names: FnNames | undefined;
|
|
14
14
|
export type EventType = 'change' | 'error';
|
|
15
15
|
export const UnavailableError: typeof FullscreenUnavailableError;
|
|
16
|
-
export function
|
|
17
|
-
export function
|
|
16
|
+
export function isApiAvailable(): boolean;
|
|
17
|
+
export function isApiEnabled(): boolean;
|
|
18
18
|
export function isFullscreen(): boolean;
|
|
19
19
|
export function getElement(): Element | null | undefined;
|
|
20
20
|
export function on(type: EventType, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions | undefined): void;
|
|
@@ -26,4 +26,3 @@ export declare namespace fullscreen {
|
|
|
26
26
|
export function onError(listener: EventListenerOrEventListenerObject): void;
|
|
27
27
|
export {};
|
|
28
28
|
}
|
|
29
|
-
export default fullscreen;
|
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
|
|
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,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,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/ga/DataLayerProxy.d.ts
CHANGED
package/ga/DataLayerProxy.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import{getHandler}from"./getHandler";export class DataLayerProxy{constructor(r){const e=getHandler("auto",r);if(!e)throw new Error("Data layer for Google Analytics is undefined.");this.handler=e}push(r){this.handler(r)}}
|
package/ga/getHandler.d.ts
CHANGED
|
@@ -16,4 +16,4 @@ export type GAEventDataTransformer<D extends GAEventData, L extends Extract<GALi
|
|
|
16
16
|
}[L];
|
|
17
17
|
export type GAEventDataTransformerMap<D extends GAEventData, L extends Extract<GALibType, 'gtm' | 'iframe'> = Extract<GALibType, 'gtm' | 'iframe'>> = L extends L ? Record<L, GAEventDataTransformer<D, L>> : never;
|
|
18
18
|
export declare function getHandler<D extends GAEventData, L extends GALibType>(gaLib: L, transformers: L extends 'auto' | 'gtm' | 'iframe' ? GAEventDataTransformerMap<D> : undefined): GADataHandler<D> | undefined;
|
|
19
|
-
export
|
|
19
|
+
export {};
|
package/ga/getHandler.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import{iframeMessenger}from"./iframeMessenger";import"./types";function gtmHandler(e,n,t){e.push(n(t))}function gtagHandler(e,n){const{action:t,eventCategory:a,trackingId:o,label:i}=n;e("event",t,{send_to:o,event_category:a,event_label:i,value:void 0})}function gaHandler(e,n,t){const a=window[e];if(!a)return;const{action:o,eventCategory:i,trackingId:r,label:d}=t,g={hitType:"event",eventCategory:i,eventAction:o,eventLabel:d,eventValue:void 0};if(r){const e=()=>{var e;const t=null!==(e=n[r])&&void 0!==e?e:a.getAll().find((e=>e.get("trackingId")===r));t&&(n[r]=t,t.send(g))};a.loaded?e():a(e)}else a("send",g)}export function getHandler(e,n){switch(e){case"auto":return window.gtag?getHandler("gtag",void 0):window.GoogleAnalyticsObject&&window[window.GoogleAnalyticsObject]||window.ga?getHandler("ga",void 0):window.dataLayer?getHandler("gtm",n):window.parent!==window?getHandler("iframe",n):void 0;case"iframe":return e=>{const t=n.iframe(e);iframeMessenger(t.type,t.event)};case"gtm":{const{dataLayer:e}=window;return e?t=>{gtmHandler(e,n.gtm,t)}:void 0}case"gtag":return window.gtag?gtagHandler.bind(void 0,window.gtag):void 0;case"ga":{const e=window.GoogleAnalyticsObject||"ga";return window[e]?gaHandler.bind(void 0,e,{}):void 0}default:throw new Error(`Unknown GA lib type '${e}'.`)}}
|
package/ga/iframeMessenger.d.ts
CHANGED
package/ga/iframeMessenger.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function iframeMessenger(e,
|
|
1
|
+
export function iframeMessenger(e,n){window.parent.postMessage({type:e,event:n},"*")}
|
package/getAppContainer.d.ts
CHANGED
package/getAppContainer.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function getAppContainer(t="root"){const n=document.getElementById(t);if(!n)throw new Error(`Container "${t}" for app not found.`);return n}
|
|
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}
|
package/getAspectRatio.d.ts
CHANGED
package/getAspectRatio.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import{farey}from"@js-toolkit/utils/farey";export function getAspectRatio(t,o){const r=t/o,[e,i]=farey(r,50);return{width:e,height:i,ratio:r}}
|
package/getBrowserLanguage.d.ts
CHANGED
package/getBrowserLanguage.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function getBrowserLanguage(){if("undefined"!=typeof window&&"navigator"in window){return(navigator.languages&&navigator.languages.length>0?navigator.languages[0]:navigator.language||navigator.userLanguage).split("-")[0]}}
|
|
1
|
+
export function getBrowserLanguage(){if("undefined"!=typeof window&&"navigator"in window){return(navigator.languages&&navigator.languages.length>0?navigator.languages[0]:navigator.language||navigator.userLanguage).split("-")[0]}}
|
package/getGeoCoordinates.d.ts
CHANGED
package/getGeoCoordinates.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{__rest}from"tslib";export function getGeoCoordinates(e={}){var{timeout:t=1e4,maximumAge:o=6e4}=e,i=__rest(e,["timeout","maximumAge"]);return new Promise(((e,m)=>{navigator.geolocation.getCurrentPosition((t=>e(t)),(e=>m(e)),Object.assign({timeout:t,maximumAge:o},i))}))}
|
|
1
|
+
import{__rest}from"tslib";export function getGeoCoordinates(e={}){var{timeout:t=1e4,maximumAge:o=6e4}=e,i=__rest(e,["timeout","maximumAge"]);return new Promise(((e,m)=>{navigator.geolocation.getCurrentPosition((t=>e(t)),(e=>m(e)),Object.assign({timeout:t,maximumAge:o},i))}))}
|
package/getGeoLocality.d.ts
CHANGED
package/getGeoLocality.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function getGeoLocality({longitude:e,latitude:r,lang:
|
|
1
|
+
export function getGeoLocality({longitude:e,latitude:r,lang:o}){const s=new URL("https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/reverseGeocode");return s.searchParams.set("f","json"),s.searchParams.set("featureTypes","Locality"),s.searchParams.set("location",`{ x: ${e}, y: ${r} }`),o&&s.searchParams.set("langCode",o),window.fetch(s.toString()).then((e=>e.json())).then((e=>{const{address:r,error:o}=e;if(o)throw new Error(o.message);return r.PlaceName||r.LongLabel||r.ShortLabel||""}))}
|
package/getInnerRect.d.ts
CHANGED
|
@@ -3,4 +3,3 @@ import { type InnerYDimensions } from './getInnerYDimensions';
|
|
|
3
3
|
export interface InnerRect extends InnerXDimensions, InnerYDimensions {
|
|
4
4
|
}
|
|
5
5
|
export declare function getInnerRect(elementOrComputedStyle: Element | CSSStyleDeclaration): InnerRect;
|
|
6
|
-
export default getInnerRect;
|
package/getInnerRect.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import{getInnerXDimensions}from"./getInnerXDimensions";import{getInnerYDimensions}from"./getInnerYDimensions";export function getInnerRect(n){const e="tagName"in n?window.getComputedStyle(n):n;return Object.assign(getInnerXDimensions(e),getInnerYDimensions(e))}
|
package/getInnerXDimensions.d.ts
CHANGED
package/getInnerXDimensions.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function getInnerXDimensions(t){const{boxSizing:e,paddingLeft:o,paddingRight:r,borderLeftWidth:
|
|
1
|
+
export function getInnerXDimensions(t){const{boxSizing:e,paddingLeft:o,paddingRight:r,borderLeftWidth:a,borderRightWidth:i,width:d}="tagName"in t?window.getComputedStyle(t):t,n=parseFloat(o)+parseFloat(a),p=parseFloat(r)+parseFloat(i);return{width:"border-box"===e?parseFloat(d)-n-p:parseFloat(d),left:n,right:p}}
|
package/getInnerYDimensions.d.ts
CHANGED
package/getInnerYDimensions.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function getInnerYDimensions(
|
|
1
|
+
export function getInnerYDimensions(o){const{boxSizing:t,paddingTop:e,paddingBottom:a,borderTopWidth:r,borderBottomWidth:i,height:n}="tagName"in o?window.getComputedStyle(o):o,p=parseFloat(e)+parseFloat(r),d=parseFloat(a)+parseFloat(i);return{height:"border-box"===t?parseFloat(n)-p-d:parseFloat(n),top:p,bottom:d}}
|
package/getRandomID.d.ts
CHANGED
package/getRandomID.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function getRandomID(t){const n=crypto.getRandomValues(new Uint32Array(1))[0].toString(16);return t&&t>0?n.
|
|
1
|
+
export function getRandomID(t){const n=crypto.getRandomValues(new Uint32Array(1))[0].toString(16);return t&&t>0?n.substring(0,t):n}
|
package/getSecondsCounter.d.ts
CHANGED
package/getSecondsCounter.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{toInt}from"@js-toolkit/utils/toInt";export function getSecondsCounter({onChange:t}={}){const e=new Set;let n=t,o=!1;return{getTotal:()=>e.size,push(t){if(o)throw new Error("SecondsCounter was destroyed.");const r="number"==typeof t?t:"currentTime"in t?t.currentTime:t.data.currentTime;if(null==t)return;const s=toInt(r);s>0&&!e.has(s)&&(e.add(s),n&&n({value:s,total:e.size}))},get onChange(){return n},set onChange(t){n=t},reset(){e.clear()},destroy(){o=!0,n=void 0,this.reset()}}}
|
|
1
|
+
import{toInt}from"@js-toolkit/utils/toInt";export function getSecondsCounter({onChange:t}={}){const e=new Set;let n=t,o=!1;return{getTotal:()=>e.size,push(t){if(o)throw new Error("SecondsCounter was destroyed.");const r="number"==typeof t?t:"currentTime"in t?t.currentTime:t.data.currentTime;if(null==t)return;const s=toInt(r);s>0&&!e.has(s)&&(e.add(s),n&&n({value:s,total:e.size}))},get onChange(){return n},set onChange(t){n=t},reset(){e.clear()},destroy(){o=!0,n=void 0,this.reset()}}}
|
package/imageToBlob.d.ts
CHANGED
package/imageToBlob.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function imageToBlob(e){return new Promise(((t,o)=>{const n=document.createElement("canvas");n.width=e.width,n.height=e.height;const r=n.getContext("2d");if(!r)throw new Error("Failed to get canvas 2d context.");r.drawImage(e,0,0),n.toBlob((e=>{e?t(e):o(new Error("Unable to get blob from image."))}))}))}
|
|
1
|
+
export function imageToBlob(e){return new Promise(((t,o)=>{const n=document.createElement("canvas");n.width=e.width,n.height=e.height;const r=n.getContext("2d");if(!r)throw new Error("Failed to get canvas 2d context.");r.drawImage(e,0,0),n.toBlob((e=>{e?t(e):o(new Error("Unable to get blob from image."))}))}))}
|
package/loadImage.d.ts
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
1
|
/** Don't worry, it uses cached by browser image if url already loaded previously otherwise cache the image. */
|
|
2
2
|
export declare function loadImage(src: string | OptionalToUndefined<PartialBut<Pick<HTMLImageElement, 'src' | 'srcset' | 'crossOrigin' | 'sizes'>, 'src'>>): Promise<HTMLImageElement>;
|
|
3
|
-
export default loadImage;
|
package/loadImage.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{__rest}from"tslib";export function loadImage(o){return new Promise(((r,n)=>{const
|
|
1
|
+
import{__rest}from"tslib";export function loadImage(o){return new Promise(((r,n)=>{const s=new Image;if(s.onload=()=>{s.onload=null,s.onerror=null,r(s)},s.onerror=o=>{s.onload=null,s.onerror=null,n(o)},"string"==typeof o)s.src=o;else{const{crossOrigin:r}=o,n=__rest(o,["crossOrigin"]);void 0!==r&&(s.crossOrigin=r),Object.assign(s,n)}}))}
|
package/loadScript.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
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,i)=>{onDOMReady((()=>{try{if(t){if(document.scripts.namedItem(t))return void d()}else if(isScriptAdded(e))return void d();const c=document.createElement("script"),s=()=>{c.removeEventListener("load",a),c.removeEventListener("error",p),r||c.remove()},a=()=>{s(),d()},p=e=>{s();const r=e instanceof ErrorEvent?e:new Error("Script load error. See previous log messages.");i(r)};t&&(c.id=t),c.async=n,c.defer=o,c.src=e,c.addEventListener("load",a,{once:!0}),c.addEventListener("error",p,{once:!0}),document.head.appendChild(c)}catch(e){i(e)}}))}))}
|
package/onDOMReady.d.ts
CHANGED
package/onDOMReady.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function onDOMReady(e){return"loading"===document.readyState?document.addEventListener("DOMContentLoaded",e,{once:!0}):e(),()=>{document.removeEventListener("DOMContentLoaded",e)}}
|
|
1
|
+
export function onDOMReady(e){return"loading"===document.readyState?document.addEventListener("DOMContentLoaded",e,{once:!0}):e(),()=>{document.removeEventListener("DOMContentLoaded",e)}}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@js-toolkit/web-utils",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.49.0",
|
|
4
4
|
"description": "Web utils",
|
|
5
5
|
"author": "VZH",
|
|
6
6
|
"license": "MIT",
|
|
@@ -13,34 +13,33 @@
|
|
|
13
13
|
"copy:configs": "copyfiles package.json .npmignore README.md LICENSE ./dist/",
|
|
14
14
|
"minify": "node-utils-minify --replace ./dist",
|
|
15
15
|
"build": "npm run clean && tsc --build ./tsconfig.json && npm run minify",
|
|
16
|
-
"patch-publish": "npm run build && npm version patch --force --no-workspaces-update -m 'v%s' && npm run copy:configs && cd ./dist && npm publish --access public && git push
|
|
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
|
|
16
|
+
"patch-publish": "npm run build && npm version patch --force --no-workspaces-update -m 'v%s' && npm run copy:configs && cd ./dist && npm publish --access public && git push --follow-tags",
|
|
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.1.
|
|
20
|
+
"@js-toolkit/node-utils": "^1.1.7"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
|
-
"@js-toolkit/configs": "^3.
|
|
24
|
-
"@js-toolkit/utils": "^1.
|
|
25
|
-
"@types/
|
|
26
|
-
"@
|
|
27
|
-
"@typescript-eslint/
|
|
28
|
-
"@typescript-eslint/parser": "^6.7.4",
|
|
23
|
+
"@js-toolkit/configs": "^3.88.2",
|
|
24
|
+
"@js-toolkit/utils": "^1.50.0",
|
|
25
|
+
"@types/uuid": "^9.0.7",
|
|
26
|
+
"@typescript-eslint/eslint-plugin": "^6.14.0",
|
|
27
|
+
"@typescript-eslint/parser": "^6.14.0",
|
|
29
28
|
"copyfiles": "^2.4.1",
|
|
30
|
-
"eslint": "^8.
|
|
29
|
+
"eslint": "^8.55.0",
|
|
31
30
|
"eslint-config-airbnb-base": "^15.0.0",
|
|
32
|
-
"eslint-config-prettier": "^9.
|
|
33
|
-
"eslint-plugin-import": "^2.
|
|
34
|
-
"eslint-plugin-prettier": "^5.0.
|
|
31
|
+
"eslint-config-prettier": "^9.1.0",
|
|
32
|
+
"eslint-plugin-import": "^2.29.0",
|
|
33
|
+
"eslint-plugin-prettier": "^5.0.1",
|
|
35
34
|
"eventemitter3": "^5.0.1",
|
|
36
|
-
"prettier": "^3.
|
|
35
|
+
"prettier": "^3.1.1",
|
|
37
36
|
"reconnecting-websocket": "^4.4.0",
|
|
38
37
|
"rimraf": "^5.0.5",
|
|
39
|
-
"terser": "^5.
|
|
40
|
-
"typescript": "^5.
|
|
41
|
-
"ua-parser-js": "^
|
|
38
|
+
"terser": "^5.26.0",
|
|
39
|
+
"typescript": "^5.3.3",
|
|
40
|
+
"ua-parser-js": "^2.0.0-beta.1",
|
|
42
41
|
"uuid": "^9.0.1",
|
|
43
|
-
"webpack": "^5.
|
|
42
|
+
"webpack": "^5.89.0",
|
|
44
43
|
"yargs": "^17.7.2"
|
|
45
44
|
}
|
|
46
45
|
}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
interface Semver {
|
|
2
2
|
readonly major: number;
|
|
3
3
|
readonly minor: number;
|
|
4
4
|
readonly patch: number;
|
|
5
|
-
constructor(major: number, minor: number, patch: number);
|
|
6
5
|
toString(): string;
|
|
7
6
|
}
|
|
8
7
|
export declare function getIOSVersion(): Semver | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{getCachedUAInfo}from"./ua";import{isIOS}from"./isIOS";let memo;export function getIOSVersion(){if(void 0===memo){const o=getCachedUAInfo();if(!o)return;const{os:e}=o,t=isIOS()&&e.version&&/(\d+)\.(\d+)(?:\.(\d+))?/.exec(e.version);memo=t?{major:parseInt(t[1],10)||0,minor:parseInt(t[2],10)||0,patch:parseInt(t[3],10)||0,toString(){return`${this.major}_${this.minor}_${this.patch}`}}:null}return null!=memo?memo:void 0}
|
package/platform/isAndroid.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{getCachedUAInfo}from"./ua";export function isAndroid(){const n=getCachedUAInfo();if(!n)return!1;const o=n.os.name;return"Android"===o||"Android-x86"===o}
|
package/platform/isIOS.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{getCachedUAInfo}from"./ua";import{isMobile}from"./isMobile";export function isIOS(){const e=getCachedUAInfo();return!!e&&("iOS"===e.os.name||isMobile()&&"Apple"===e.device.vendor)}
|
package/platform/isMacOS.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{getCachedUAInfo}from"./ua";import{isMobile}from"./isMobile";export function isMacOS(){const o=getCachedUAInfo();if(!o)return!1;const e=o.os.name;return("Mac OS"===e||"macOS"===e)&&!isMobile()}
|
package/platform/isMobile.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{getCachedUAInfo}from"./ua";export function isMobile(){const e=getCachedUAInfo();if(!e)return!1;const o=e.device.type;return!!("mobile"===o||"tablet"===o||!o&&"Apple"===e.device.vendor&&navigator.maxTouchPoints&&navigator.maxTouchPoints>2)}
|
package/platform/isSafari.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{getCachedUAInfo}from"./ua";import{isIOS}from"./isIOS";import{isMacOS}from"./isMacOS";export function isSafari(){const i=getCachedUAInfo();if(!i)return!1;const r=i.browser.name;return"Safari"===r||"Mobile Safari"===r||"WebKit"===r&&(isIOS()||isMacOS())}
|
package/platform/ua.d.ts
ADDED
package/platform/ua.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{__awaiter}from"tslib";import{UAParser}from"ua-parser-js";let result,promise;export function getUAInfo(){return __awaiter(this,void 0,void 0,(function*(){return null==result&&(promise=null!=promise?promise:Promise.resolve(new UAParser(navigator.userAgent).getResult().withClientHints()),result=yield promise,promise=void 0),result}))}export function getCachedUAInfo(){return result}
|
package/preventDefault.d.ts
CHANGED
package/preventDefault.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function preventDefault(e){(null==e.cancelable||e.cancelable)&&e.preventDefault()}
|
|
1
|
+
export function preventDefault(e){(null==e.cancelable||e.cancelable)&&e.preventDefault()}
|
package/saveFileAs.d.ts
CHANGED
package/saveFileAs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function saveFileAs(e,
|
|
1
|
+
export function saveFileAs(t,e,r){const n=document.createElement("a");n.setAttribute("href",e),n.setAttribute("download",t),n.setAttribute("type","attachment"),r&&Object.entries(r).forEach((([t,e])=>{n.setAttribute(t,e),"target"===t&&"_blank"===e&&null==r.rel&&n.setAttribute("rel","noopener noreferrer")})),n.click()}
|
package/stopPropagation.d.ts
CHANGED
package/stopPropagation.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function stopPropagation(o){o.stopPropagation()}
|
|
1
|
+
export function stopPropagation(o){o.stopPropagation()}
|
package/toBase64.d.ts
CHANGED
package/toBase64.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function toBase64(e){return window.btoa(unescape(encodeURIComponent(e)))}
|
|
1
|
+
export function toBase64(e){return window.btoa(unescape(encodeURIComponent(e)))}
|
package/toLocalPoint.d.ts
CHANGED
package/toLocalPoint.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function toLocalPoint(t,n){const
|
|
1
|
+
export function toLocalPoint(t,n){const e="tagName"in n?n.getBoundingClientRect():n;return{x:t.clientX-e.left,y:t.clientY-e.top}}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import DataEventEmitter,
|
|
1
|
+
import { DataEventEmitter, type DataEventListener, type DataEventMap } from '@js-toolkit/utils/DataEventEmitter';
|
|
2
2
|
import * as sdpUtils from './sdputils';
|
|
3
3
|
export declare class PeerConnection extends DataEventEmitter<PeerConnection.EventMap, PeerConnection> {
|
|
4
4
|
readonly options: PeerConnection.Options;
|
package/webrtc/PeerConnection.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{__awaiter}from"tslib";import
|
|
1
|
+
import{__awaiter}from"tslib";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{get Events(){return PeerConnection.Events}constructor(e={}){var t;super(),this.options=e,this.logger=null!==(t=e.logger)&&void 0!==t?t: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}setLocalDescription(e,t){return __awaiter(this,void 0,void 0,(function*(){const n=sdpUtils.prepareLocalDescription(t,this.options.codecs);return yield e.setLocalDescription(n),n}))}setRemoteDescription(e,t){return __awaiter(this,void 0,void 0,(function*(){const n=sdpUtils.prepareRemoteDescription(t,this.options.codecs);return yield 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)}createOffer(){return __awaiter(this,void 0,void 0,(function*(){const e=yield this.pc.createOffer(this.options.offerOptions);return this.setLocalDescription(this.pc,e)}))}createAnswer(e){return __awaiter(this,void 0,void 0,(function*(){yield this.setRemoteDescription(this.pc,e);const t=yield 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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import ReconnectingWebSocket, { type ErrorEvent, type Message, type Options as BaseOptions, type UrlProvider } from 'reconnecting-websocket';
|
|
2
|
-
import DataEventEmitter,
|
|
2
|
+
import { DataEventEmitter, type DataEventListener, type DataEventMap } from '@js-toolkit/utils/DataEventEmitter';
|
|
3
3
|
export declare class WSController<TData = unknown> extends DataEventEmitter<WSController.EventMap<TData>, WSController<TData>> {
|
|
4
4
|
get Events(): typeof WSController.Events;
|
|
5
5
|
readonly logger: NonNullable<WSController.Options['logger']>;
|
package/ws/WSController.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{__rest}from"tslib";import ReconnectingWebSocket,{}from"reconnecting-websocket";import
|
|
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={}));
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { DataEventEmitter } from '@js-toolkit/utils/DataEventEmitter';
|
|
2
|
-
export declare class ConnectionController extends DataEventEmitter<'online' | 'offline' | 'destroy'> {
|
|
3
|
-
private readonly listener;
|
|
4
|
-
constructor(target?: Window & typeof globalThis);
|
|
5
|
-
isOnline(): boolean;
|
|
6
|
-
destroy(): void;
|
|
7
|
-
}
|
package/ConnectionController.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{DataEventEmitter}from"@js-toolkit/utils/DataEventEmitter";import{EventEmitterListener}from"./EventEmitterListener";export class ConnectionController extends DataEventEmitter{constructor(t=window){super(),this.listener=new EventEmitterListener(t).on("online",(()=>this.emit("online"))).on("offline",(()=>this.emit("offline")))}isOnline(){return navigator.onLine}destroy(){this.listener.removeAllListeners(),this.emit("destroy"),this.removeAllListeners()}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{UAParser}from"ua-parser-js";let result;export function getUAParserResult(){if(null==result){const r=new UAParser(navigator.userAgent);result=r.getResult()}return result}
|