@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.
Files changed (80) hide show
  1. package/EventEmitterListener.d.ts +1 -1
  2. package/EventEmitterListener.js +1 -1
  3. package/EventEmitterListener.utils.js +1 -1
  4. package/EventListeners.d.ts +0 -1
  5. package/EventListeners.js +1 -1
  6. package/FullscreenController.d.ts +33 -32
  7. package/FullscreenController.js +1 -1
  8. package/PipController.d.ts +3 -2
  9. package/PipController.js +1 -1
  10. package/base64ToDataUrl.d.ts +0 -1
  11. package/base64ToDataUrl.js +1 -1
  12. package/blobToDataUrl.d.ts +0 -1
  13. package/blobToDataUrl.js +1 -1
  14. package/createLoop.d.ts +0 -1
  15. package/createLoop.js +1 -1
  16. package/dataUrlToBlob.d.ts +0 -1
  17. package/dataUrlToBlob.js +1 -1
  18. package/fullscreen.d.ts +2 -3
  19. package/fullscreen.js +1 -1
  20. package/ga/DataLayerProxy.d.ts +0 -1
  21. package/ga/DataLayerProxy.js +1 -1
  22. package/ga/getHandler.d.ts +1 -1
  23. package/ga/getHandler.js +1 -1
  24. package/ga/iframeMessenger.d.ts +0 -1
  25. package/ga/iframeMessenger.js +1 -1
  26. package/getAppContainer.d.ts +0 -1
  27. package/getAppContainer.js +1 -1
  28. package/getAspectRatio.d.ts +0 -1
  29. package/getAspectRatio.js +1 -1
  30. package/getBrowserLanguage.d.ts +0 -1
  31. package/getBrowserLanguage.js +1 -1
  32. package/getGeoCoordinates.d.ts +0 -1
  33. package/getGeoCoordinates.js +1 -1
  34. package/getGeoLocality.d.ts +0 -1
  35. package/getGeoLocality.js +1 -1
  36. package/getInnerRect.d.ts +0 -1
  37. package/getInnerRect.js +1 -1
  38. package/getInnerXDimensions.d.ts +0 -1
  39. package/getInnerXDimensions.js +1 -1
  40. package/getInnerYDimensions.d.ts +0 -1
  41. package/getInnerYDimensions.js +1 -1
  42. package/getRandomID.d.ts +0 -1
  43. package/getRandomID.js +1 -1
  44. package/getSecondsCounter.d.ts +0 -1
  45. package/getSecondsCounter.js +1 -1
  46. package/imageToBlob.d.ts +0 -1
  47. package/imageToBlob.js +1 -1
  48. package/loadImage.d.ts +0 -1
  49. package/loadImage.js +1 -1
  50. package/loadScript.js +1 -1
  51. package/onDOMReady.d.ts +0 -1
  52. package/onDOMReady.js +1 -1
  53. package/package.json +18 -19
  54. package/platform/getIOSVersion.d.ts +1 -2
  55. package/platform/getIOSVersion.js +1 -1
  56. package/platform/isAndroid.js +1 -1
  57. package/platform/isIOS.js +1 -1
  58. package/platform/isMacOS.js +1 -1
  59. package/platform/isMobile.js +1 -1
  60. package/platform/isSafari.js +1 -1
  61. package/platform/ua.d.ts +4 -0
  62. package/platform/ua.js +1 -0
  63. package/preventDefault.d.ts +0 -1
  64. package/preventDefault.js +1 -1
  65. package/saveFileAs.d.ts +0 -1
  66. package/saveFileAs.js +1 -1
  67. package/stopPropagation.d.ts +0 -1
  68. package/stopPropagation.js +1 -1
  69. package/toBase64.d.ts +0 -1
  70. package/toBase64.js +1 -1
  71. package/toLocalPoint.d.ts +0 -1
  72. package/toLocalPoint.js +1 -1
  73. package/webrtc/PeerConnection.d.ts +1 -1
  74. package/webrtc/PeerConnection.js +1 -1
  75. package/ws/WSController.d.ts +1 -1
  76. package/ws/WSController.js +1 -1
  77. package/ConnectionController.d.ts +0 -7
  78. package/ConnectionController.js +0 -1
  79. package/platform/getUAParserResult.d.ts +0 -2
  80. 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 default EventEmitterListener;
58
+ export {};
@@ -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}}export default EventEmitterListener;
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 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}
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}
@@ -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,t){var s,l;const r=null!=t?t:"",n=null!==(s=this.listeners.get(e))&&void 0!==s?s:new Map;!this.listeners.has(e)&&this.listeners.set(e,n);const i=null!==(l=n.get(r))&&void 0!==l?l:new EventEmitterListener(e);return!n.has(r)&&n.set(r,i),i}removeAllListeners(e,t){var s;if(e)if(t){const l=this.listeners.get(e);null===(s=null==l?void 0:l.get(t))||void 0===s||s.removeAllListeners(),null==l||l.delete(t),0===(null==l?void 0:l.size)&&this.listeners.delete(e)}else{const t=this.listeners.get(e);null==t||t.forEach((e=>e.removeAllListeners())),null==t||t.clear(),this.listeners.delete(e)}else this.listeners.forEach((e=>{e.forEach((e=>e.removeAllListeners())),e.clear()})),this.listeners.clear();return this}}export default EventListeners;
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 video?;
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, video?: HTMLVideoElement | undefined);
16
- private unbindVideo;
17
- setVideoElement(video: HTMLVideoElement | undefined): void;
18
+ constructor(element: Element, options?: FullscreenController.Options);
19
+ private unbind;
20
+ setOptions(options: FullscreenController.Options): void;
18
21
  destroy(): Promise<void>;
19
- get isFullscreenEnabled(): boolean;
20
- get isAnyFullscreenEnabled(): boolean;
21
- get isFullscreen(): boolean;
22
- get isPseudoFullscreen(): boolean;
23
- get currentElement(): Element | null;
24
- private changeHandler;
25
- private errorHandler;
26
- private beginFullscreenHandler;
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
- isFullscreen: boolean;
40
- video?: boolean | undefined;
41
- pseudo?: boolean | undefined;
42
- }
43
- ];
44
- [Events.Error]: [
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>;
@@ -1 +1 @@
1
- import{__rest}from"tslib";import{EventEmitter}from"eventemitter3";import{fullscreen}from"./fullscreen";import{toggleNativeSubtitles}from"./media/toggleNativeSubtitles";export function enterPseudoFullscreen(e){let t,i;return t={position:e.style.position,left:e.style.left,top:e.style.top,width:e.style.width,height:e.style.height,maxWidth:e.style.maxWidth,maxHeight:e.style.maxHeight,zIndex:e.style.zIndex},i=e,i.style.position="fixed",i.style.left="0px",i.style.top="0px",i.style.width="100%",i.style.height="100%",i.style.maxWidth="100%",i.style.maxHeight="100%",i.style.zIndex="99999",()=>{t&&i&&(i.style.position=t.position,i.style.left=t.left,i.style.top=t.top,i.style.width=t.width,i.style.height=t.height,i.style.maxWidth=t.maxWidth,i.style.maxHeight=t.maxHeight,i.style.zIndex=t.zIndex),t=void 0,i=void 0}}export class FullscreenController extends EventEmitter{get Events(){return FullscreenController.Events}constructor(e,t){if(super(),this.element=e,this.video=t,this.changeHandler=()=>{this.emit(this.Events.Change,{isFullscreen:this.isFullscreen})},this.errorHandler=e=>{this.emit(this.Events.Error,{error:e})},this.beginFullscreenHandler=()=>{this.emit(this.Events.Change,{isFullscreen:!0,video:!0})},this.endFullscreenHandler=()=>{this.emit(this.Events.Change,{isFullscreen:!1,video:!0})},fullscreen.names){const{names:t}=fullscreen;e.addEventListener(t.changeEventName,this.changeHandler),e.addEventListener(t.errorEventName,this.errorHandler)}t&&this.setVideoElement(t)}unbindVideo(){this.video&&(this.video.removeEventListener("webkitbeginfullscreen",this.beginFullscreenHandler),this.video.removeEventListener("webkitendfullscreen",this.endFullscreenHandler),this.video=void 0)}setVideoElement(e){this.unbindVideo(),this.video=e,this.video&&!fullscreen.names&&(this.video.addEventListener("webkitbeginfullscreen",this.beginFullscreenHandler),this.video.addEventListener("webkitendfullscreen",this.endFullscreenHandler))}destroy(){return this.exit().finally((()=>{if(this.removeAllListeners(),this.unbindVideo(),fullscreen.names){const{names:e}=fullscreen;this.element.removeEventListener(e.changeEventName,this.changeHandler),this.element.removeEventListener(e.errorEventName,this.errorHandler)}}))}get isFullscreenEnabled(){return fullscreen.isEnabled()}get isAnyFullscreenEnabled(){var e;return this.isFullscreenEnabled||!!(null===(e=this.video)||void 0===e?void 0:e.webkitEnterFullscreen)}get isFullscreen(){return!!this.currentElement}get isPseudoFullscreen(){return this.isFullscreen&&!!this.exitPseudoFullscreen}get currentElement(){var e;if(fullscreen.isSupported()){if(fullscreen.getElement()===this.element)return this.element}else{if(null===(e=this.video)||void 0===e?void 0:e.webkitDisplayingFullscreen)return this.video;if(this.exitPseudoFullscreen)return this.element}return null}request(e={}){return new Promise(((t,i)=>{if(this.isFullscreen)return void t();const{toggleNativeVideoSubtitles:n,pseudoFullscreenFallback:s}=e,l=__rest(e,["toggleNativeVideoSubtitles","pseudoFullscreenFallback"]);if(fullscreen.isEnabled())return void fullscreen.request(this.element,l).then(t,i);const{video:r}=this;if(null==r?void 0:r.webkitEnterFullscreen){if(n&&r.textTracks.length>0){toggleNativeSubtitles(!0,r.textTracks);const e=()=>{r.removeEventListener("webkitendfullscreen",e),toggleNativeSubtitles(!1,r.textTracks)};r.addEventListener("webkitendfullscreen",e)}const e=()=>{r.removeEventListener("webkitbeginfullscreen",e),t()};return r.addEventListener("webkitbeginfullscreen",e),void r.webkitEnterFullscreen()}if(s)return this.exitPseudoFullscreen=enterPseudoFullscreen(this.element),this.emit(this.Events.Change,{isFullscreen:!0,pseudo:!0}),void t();i(new fullscreen.UnavailableError)}))}exit(){return new Promise(((e,t)=>{if(!this.isFullscreen)return void e();if(fullscreen.isEnabled())return void fullscreen.exit().then(e,t);const{video:i}=this;if(null==i?void 0:i.webkitExitFullscreen){const t=()=>{i.removeEventListener("webkitendfullscreen",t),e()};return i.addEventListener("webkitendfullscreen",t),void i.webkitExitFullscreen()}if(this.exitPseudoFullscreen)return this.exitPseudoFullscreen(),this.exitPseudoFullscreen=void 0,this.emit(this.Events.Change,{isFullscreen:!1,pseudo:!0}),void e();t(new fullscreen.UnavailableError)}))}}!function(e){let t;!function(e){e.Change="change",e.Error="error"}(t=e.Events||(e.Events={}))}(FullscreenController||(FullscreenController={}));
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={}));
@@ -8,8 +8,9 @@ declare global {
8
8
  }
9
9
  }
10
10
  export declare class PipController extends EventEmitter<PipController.EventMap> {
11
- private static get isSupported();
12
- static isEnabled(video: HTMLVideoElement): boolean;
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 get isSupported(){return!!HTMLVideoElement.prototype.requestPictureInPicture&&!!document.exitPictureInPicture&&!!document.pictureInPictureEnabled}static isEnabled(e){return this.isSupported||!!e.webkitSupportsPresentationMode&&e.webkitSupportsPresentationMode("picture-in-picture")}get Events(){return PipController.Events}constructor(e){if(super(),this.listener=new EventEmitterListener(e),PipController.isEnabled(e)){const e=()=>{this.emit(this.Events.Change,{isPip:!0})},t=()=>{this.emit(this.Events.Change,{isPip:!1})};PipController.isSupported?(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.isSupported?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.isSupported)this.listener.target.requestPictureInPicture().then((()=>e()),t);else{if(!PipController.isEnabled(this.listener.target))throw getPipUnavailableError();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.isSupported)document.exitPictureInPicture().then(e,t);else{if(!PipController.isEnabled(this.listener.target))throw getPipUnavailableError();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(){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={}));
@@ -1,2 +1 @@
1
1
  export declare function base64ToDataUrl(base64: string, type?: string): string;
2
- export default base64ToDataUrl;
@@ -1 +1 @@
1
- export function base64ToDataUrl(a,e="image/png"){return`data:${e};base64,${a}`}export default base64ToDataUrl;
1
+ export function base64ToDataUrl(a,e="image/png"){return`data:${e};base64,${a}`}
@@ -1,2 +1 @@
1
1
  export declare function blobToDataUrl(blob: Blob): Promise<string>;
2
- export default blobToDataUrl;
package/blobToDataUrl.js CHANGED
@@ -1 +1 @@
1
- export function blobToDataUrl(e){return new Promise(((o,r)=>{const a=new FileReader;a.onload=()=>{o(a.result)},a.onerror=r,a.readAsDataURL(e)}))}export default blobToDataUrl;
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
@@ -5,4 +5,3 @@ export interface Loop {
5
5
  isActive: () => boolean;
6
6
  }
7
7
  export declare function createLoop(): Loop;
8
- export default createLoop;
package/createLoop.js CHANGED
@@ -1 +1 @@
1
- export function createLoop(){let e,t,a,n=!1;const o=()=>{n&&a&&(t&&cancelAnimationFrame(t),t=requestAnimationFrame(a))};return{start:(t,r)=>{a=t,n||(n=!0,e=window.setInterval(o,r))},stop:()=>{n&&(n=!1,window.clearInterval(e),t&&cancelAnimationFrame(t))},call:o,isActive:()=>n}}export default createLoop;
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}}
@@ -1,2 +1 @@
1
1
  export declare function dataUrlToBlob(dataUrl: string): Blob;
2
- export default dataUrlToBlob;
package/dataUrlToBlob.js CHANGED
@@ -1 +1 @@
1
- export function dataUrlToBlob(t){const[e,o]=t.split(","),r=window.atob(o),l=e.split(":")[1].split(";")[0],n=new ArrayBuffer(r.length),a=new Uint8Array(n);for(let t=0;t<r.length;t+=1)a[t]=r.charCodeAt(t);return new Blob([n],{type:l})}export default dataUrlToBlob;
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 isSupported(): boolean;
17
- export function isEnabled(): boolean;
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 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,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,c)}))}e.UnavailableError=FullscreenUnavailableError,e.isSupported=function(){return!!e.names},e.isEnabled=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={}));export default fullscreen;
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={}));
@@ -5,4 +5,3 @@ export declare class DataLayerProxy<D extends GAEventData> {
5
5
  constructor(transformers: GAEventDataTransformerMap<D>);
6
6
  push(data: D): void;
7
7
  }
8
- export default DataLayerProxy;
@@ -1 +1 @@
1
- import getHandler,{}from"./getHandler";export class DataLayerProxy{constructor(r){const a=getHandler("auto",r);if(!a)throw new Error("Data layer for Google Analytics is undefined.");this.handler=a}push(r){this.handler(r)}}export default DataLayerProxy;
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)}}
@@ -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 default getHandler;
19
+ export {};
package/ga/getHandler.js CHANGED
@@ -1 +1 @@
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}'.`)}}export default getHandler;
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}'.`)}}
@@ -4,4 +4,3 @@ export interface GAEventMessage<T extends string = string, D extends GAEventData
4
4
  event: D;
5
5
  }
6
6
  export declare function iframeMessenger<T extends string, D extends GAEventData>(type: T, data: D): void;
7
- export default iframeMessenger;
@@ -1 +1 @@
1
- export function iframeMessenger(e,t){window.parent.postMessage({type:e,event:t},"*")}export default iframeMessenger;
1
+ export function iframeMessenger(e,n){window.parent.postMessage({type:e,event:n},"*")}
@@ -1,2 +1 @@
1
1
  export declare function getAppContainer(id?: string): HTMLElement;
2
- export default getAppContainer;
@@ -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}export default getAppContainer;
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}
@@ -8,4 +8,3 @@ export interface AspectRatio {
8
8
  }
9
9
  /** Approximate aspect ratio */
10
10
  export declare function getAspectRatio(width: number, height: number): AspectRatio;
11
- export default getAspectRatio;
package/getAspectRatio.js CHANGED
@@ -1 +1 @@
1
- import farey from"@js-toolkit/utils/farey";export function getAspectRatio(t,e){const o=t/e,[r,i]=farey(o,50);return{width:r,height:i,ratio:o}}export default getAspectRatio;
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}}
@@ -4,4 +4,3 @@ declare global {
4
4
  }
5
5
  }
6
6
  export declare function getBrowserLanguage(): string | undefined;
7
- export default getBrowserLanguage;
@@ -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]}}export default getBrowserLanguage;
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,2 +1 @@
1
1
  export declare function getGeoCoordinates({ timeout, maximumAge, ...rest }?: PositionOptions): Promise<GeolocationPosition>;
2
- export default getGeoCoordinates;
@@ -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))}))}export default getGeoCoordinates;
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))}))}
@@ -2,4 +2,3 @@ export interface GeoLocalityOptions extends Pick<GeolocationCoordinates, 'longit
2
2
  lang?: string | undefined;
3
3
  }
4
4
  export declare function getGeoLocality({ longitude, latitude, lang }: GeoLocalityOptions): Promise<string>;
5
- export default getGeoLocality;
package/getGeoLocality.js CHANGED
@@ -1 +1 @@
1
- export function getGeoLocality({longitude:e,latitude:r,lang:t}){const o=new URL("https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/reverseGeocode");return o.searchParams.set("f","json"),o.searchParams.set("featureTypes","Locality"),o.searchParams.set("location",`{ x: ${e}, y: ${r} }`),t&&o.searchParams.set("langCode",t),window.fetch(o.toString()).then((e=>e.json())).then((e=>{const{address:r,error:t}=e;if(t)throw new Error(t.message);return r.PlaceName||r.LongLabel||r.ShortLabel||""}))}export default getGeoLocality;
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 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))}export default getInnerRect;
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))}
@@ -4,4 +4,3 @@ export interface InnerXDimensions {
4
4
  right: number;
5
5
  }
6
6
  export declare function getInnerXDimensions(elementOrComputedStyle: Element | CSSStyleDeclaration): InnerXDimensions;
7
- export default getInnerXDimensions;
@@ -1 +1 @@
1
- export function getInnerXDimensions(t){const{boxSizing:e,paddingLeft:o,paddingRight:r,borderLeftWidth:i,borderRightWidth:a,width:n}="tagName"in t?window.getComputedStyle(t):t,d=parseFloat(o)+parseFloat(i),p=parseFloat(r)+parseFloat(a);return{width:"border-box"===e?parseFloat(n)-d-p:parseFloat(n),left:d,right:p}}export default getInnerXDimensions;
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}}
@@ -4,4 +4,3 @@ export interface InnerYDimensions {
4
4
  bottom: number;
5
5
  }
6
6
  export declare function getInnerYDimensions(elementOrComputedStyle: Element | CSSStyleDeclaration): InnerYDimensions;
7
- export default getInnerYDimensions;
@@ -1 +1 @@
1
- export function getInnerYDimensions(t){const{boxSizing:o,paddingTop:e,paddingBottom:r,borderTopWidth:a,borderBottomWidth:n,height:i}="tagName"in t?window.getComputedStyle(t):t,p=parseFloat(e)+parseFloat(a),d=parseFloat(r)+parseFloat(n);return{height:"border-box"===o?parseFloat(i)-p-d:parseFloat(i),top:p,bottom:d}}export default 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
@@ -1,2 +1 @@
1
1
  export declare function getRandomID(maxLength?: number | undefined): string;
2
- export default getRandomID;
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.substr(0,t):n}export default getRandomID;
1
+ export function getRandomID(t){const n=crypto.getRandomValues(new Uint32Array(1))[0].toString(16);return t&&t>0?n.substring(0,t):n}
@@ -20,4 +20,3 @@ export interface SecondsCounter {
20
20
  readonly destroy: VoidFunction;
21
21
  }
22
22
  export declare function getSecondsCounter({ onChange }?: SecondsCounterOptions): SecondsCounter;
23
- export default getSecondsCounter;
@@ -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()}}}export default getSecondsCounter;
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
@@ -1,2 +1 @@
1
1
  export declare function imageToBlob(image: HTMLImageElement): Promise<Blob>;
2
- export default imageToBlob;
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."))}))}))}export default imageToBlob;
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 e=new Image;if(e.onload=()=>{e.onload=null,e.onerror=null,r(e)},e.onerror=o=>{e.onload=null,e.onerror=null,n(o)},"string"==typeof o)e.src=o;else{const{crossOrigin:r}=o,n=__rest(o,["crossOrigin"]);void 0!==r&&(e.crossOrigin=r),Object.assign(e,n)}}))}export default loadImage;
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 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)}}))}))}
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
@@ -1,3 +1,2 @@
1
1
  /** @returns cancel wait function */
2
2
  export declare function onDOMReady(callback: VoidFunction): VoidFunction;
3
- export default onDOMReady;
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)}}export default onDOMReady;
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.48.0",
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 origin master --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 origin master --follow-tags"
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.4"
20
+ "@js-toolkit/node-utils": "^1.1.7"
21
21
  },
22
22
  "devDependencies": {
23
- "@js-toolkit/configs": "^3.87.5",
24
- "@js-toolkit/utils": "^1.49.6",
25
- "@types/ua-parser-js": "^0.7.37",
26
- "@types/uuid": "^9.0.4",
27
- "@typescript-eslint/eslint-plugin": "^6.7.4",
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.50.0",
29
+ "eslint": "^8.55.0",
31
30
  "eslint-config-airbnb-base": "^15.0.0",
32
- "eslint-config-prettier": "^9.0.0",
33
- "eslint-plugin-import": "^2.28.1",
34
- "eslint-plugin-prettier": "^5.0.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.0.3",
35
+ "prettier": "^3.1.1",
37
36
  "reconnecting-websocket": "^4.4.0",
38
37
  "rimraf": "^5.0.5",
39
- "terser": "^5.20.0",
40
- "typescript": "^5.2.2",
41
- "ua-parser-js": "^1.0.36",
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.88.2",
42
+ "webpack": "^5.89.0",
44
43
  "yargs": "^17.7.2"
45
44
  }
46
45
  }
@@ -1,8 +1,7 @@
1
- declare class Semver {
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{getUAParserResult}from"./getUAParserResult";import{isIOS}from"./isIOS";class Semver{constructor(e,r,t){this.major=e,this.minor=r,this.patch=t}toString(){return`${this.major}_${this.minor}_${this.patch}`}}let memo;export function getIOSVersion(){if(void 0===memo){const{os:e}=getUAParserResult(),r=isIOS()&&e.version&&/(\d+)\.(\d+)(?:\.(\d+))?/.exec(e.version);memo=r?new Semver(parseInt(r[1],10)||0,parseInt(r[2],10)||0,parseInt(r[3],10)||0):null}return null!=memo?memo:void 0}
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}
@@ -1 +1 @@
1
- import{getUAParserResult}from"./getUAParserResult";export function isAndroid(){const r=getUAParserResult().os.name;return"Android"===r||"Android-x86"===r}
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{getUAParserResult}from"./getUAParserResult";import{isMobile}from"./isMobile";export function isIOS(){const e=getUAParserResult();return"iOS"===e.os.name||isMobile()&&"Apple"===e.device.vendor}
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)}
@@ -1 +1 @@
1
- import{getUAParserResult}from"./getUAParserResult";import{isMobile}from"./isMobile";export function isMacOS(){const e=getUAParserResult().os.name;return("Mac OS"===e||"macOS"===e)&&!isMobile()}
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()}
@@ -1 +1 @@
1
- import{getUAParserResult}from"./getUAParserResult";export function isMobile(){const e=getUAParserResult(),t=e.device.type;return!!("mobile"===t||"tablet"===t||!t&&"Apple"===e.device.vendor&&navigator.maxTouchPoints&&navigator.maxTouchPoints>2)}
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)}
@@ -1 +1 @@
1
- import{getUAParserResult}from"./getUAParserResult";import{isIOS}from"./isIOS";import{isMacOS}from"./isMacOS";export function isSafari(){const r=getUAParserResult().browser.name;return"Safari"===r||"Mobile Safari"===r||"WebKit"===r&&(isIOS()||isMacOS())}
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())}
@@ -0,0 +1,4 @@
1
+ type UAInfo = DeepReadonly<OmitStrict<UAParser.IResult, 'withClientHints'>>;
2
+ export declare function getUAInfo(): Promise<UAInfo>;
3
+ export declare function getCachedUAInfo(): UAInfo | undefined;
4
+ export {};
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}
@@ -2,4 +2,3 @@ export declare function preventDefault<T extends {
2
2
  readonly preventDefault: VoidFunction;
3
3
  readonly cancelable?: boolean | undefined;
4
4
  }>(event: T): void;
5
- export default preventDefault;
package/preventDefault.js CHANGED
@@ -1 +1 @@
1
- export function preventDefault(e){(null==e.cancelable||e.cancelable)&&e.preventDefault()}export default preventDefault;
1
+ export function preventDefault(e){(null==e.cancelable||e.cancelable)&&e.preventDefault()}
package/saveFileAs.d.ts CHANGED
@@ -1,2 +1 @@
1
1
  export declare function saveFileAs(filename: string, url: string, attrs?: Record<string, string> | undefined): void;
2
- export default saveFileAs;
package/saveFileAs.js CHANGED
@@ -1 +1 @@
1
- export function saveFileAs(e,t,r){const n=document.createElement("a");n.setAttribute("href",t),n.setAttribute("download",e),n.setAttribute("type","attachment"),r&&Object.entries(r).forEach((([e,t])=>{n.setAttribute(e,t),"target"===e&&"_blank"===t&&null==r.rel&&n.setAttribute("rel","noopener noreferrer")})),n.click()}export default saveFileAs;
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()}
@@ -1,4 +1,3 @@
1
1
  export declare function stopPropagation<T extends {
2
2
  stopPropagation: VoidFunction;
3
3
  }>(event: T): void;
4
- export default stopPropagation;
@@ -1 +1 @@
1
- export function stopPropagation(o){o.stopPropagation()}export default stopPropagation;
1
+ export function stopPropagation(o){o.stopPropagation()}
package/toBase64.d.ts CHANGED
@@ -1,2 +1 @@
1
1
  export declare function toBase64(str: string): string;
2
- export default toBase64;
package/toBase64.js CHANGED
@@ -1 +1 @@
1
- export function toBase64(e){return window.btoa(unescape(encodeURIComponent(e)))}export default toBase64;
1
+ export function toBase64(e){return window.btoa(unescape(encodeURIComponent(e)))}
package/toLocalPoint.d.ts CHANGED
@@ -2,4 +2,3 @@ export declare function toLocalPoint(coord: {
2
2
  clientX: number;
3
3
  clientY: number;
4
4
  }, targetOrClientRect: Element | Pick<DOMRect, 'left' | 'top'>): Point;
5
- export default toLocalPoint;
package/toLocalPoint.js CHANGED
@@ -1 +1 @@
1
- export function toLocalPoint(t,n){const o="tagName"in n?n.getBoundingClientRect():n;return{x:t.clientX-o.left,y:t.clientY-o.top}}export default toLocalPoint;
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, { type DataEventListener, type DataEventMap } from '@js-toolkit/utils/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;
@@ -1 +1 @@
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={}));
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={}));
@@ -1,5 +1,5 @@
1
1
  import ReconnectingWebSocket, { type ErrorEvent, type Message, type Options as BaseOptions, type UrlProvider } from 'reconnecting-websocket';
2
- import DataEventEmitter, { type DataEventListener, type DataEventMap } from '@js-toolkit/utils/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']>;
@@ -1 +1 @@
1
- import{__rest}from"tslib";import ReconnectingWebSocket,{}from"reconnecting-websocket";import DataEventEmitter,{}from"@js-toolkit/utils/DataEventEmitter";import delayed from"@js-toolkit/utils/delayed";import{EventEmitterListener}from"../EventEmitterListener";function getNotConnectedError(){return new Error("The object is not connected yet.")}export class WSController extends DataEventEmitter{get Events(){return WSController.Events}constructor(e,t){super();const n=null!=t?t:{},{logger:s,protocols:o,binaryType:i,idleTimeout:r,halfOpenDetection:c,startClosed:l}=n,a=__rest(n,["logger","protocols","binaryType","idleTimeout","halfOpenDetection","startClosed"]);this.logger=null!=s?s:console,this.ws=new ReconnectingWebSocket(e,o,Object.assign(Object.assign({},a),{startClosed:!0})),null!=i&&(this.ws.binaryType=i),this.listener=new EventEmitterListener(this.ws),r&&r>0&&(this.reconnectOnIdle=delayed((()=>{this.logger.info(`WS connection reconnecting after ${r}ms due to inactivity.`),this.ws.reconnect()}),r)),this.halfOpen=(()=>{if(!c)return;const{pingTimeout:e=12e3,outMessage:t=(()=>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
+ 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
- }
@@ -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,2 +0,0 @@
1
- /// <reference types="ua-parser-js" />
2
- export declare function getUAParserResult(): DeepReadonly<UAParser.IResult>;
@@ -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}