@js-toolkit/web-utils 1.54.0 → 1.55.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/iframe/getAutoConnectClient.js +1 -1
- package/media/TextTracksController/TextTracksController.d.ts +5 -3
- package/media/TextTracksController/TextTracksController.js +1 -1
- package/media/TextTracksController/utils.d.ts +2 -2
- package/media/TextTracksController/utils.js +1 -1
- package/media/parseCueText.d.ts +1 -0
- package/package.json +15 -15
- package/platform/getPlatformInfo.d.ts +2 -0
- package/platform/getPlatformInfo.js +1 -1
- package/serviceWorker/utils.d.ts +1 -0
- package/ws/WSController.js +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{v4 as uuid}from"uuid";import{IFRAME_CLIENT_READY,IFRAME_HOST_READY,IFRAME_PING,isPingMessage,isTargetReadyMessage}from"./messages";import{getOriginFromMessage}from"./getOriginFromMessage";import{isWindowProxy}from"./utils";export function getAutoConnectClient({data:e,target:s=window.parent,isReady:o=(
|
|
1
|
+
import{v4 as uuid}from"uuid";import{IFRAME_CLIENT_READY,IFRAME_HOST_READY,IFRAME_PING,isPingMessage,isTargetReadyMessage}from"./messages";import{getOriginFromMessage}from"./getOriginFromMessage";import{isWindowProxy}from"./utils";export function getAutoConnectClient({data:e,target:s=window.parent,isReady:o=()=>!0,onConnect:a,logger:t=console,messagesTypes:i}){const n={Ping:(null==i?void 0:i.Ping)||IFRAME_PING,TargetReady:(null==i?void 0:i.TargetReady)||IFRAME_HOST_READY,SelfReady:(null==i?void 0:i.SelfReady)||IFRAME_CLIENT_READY},r=uuid();let g;const d=(e,s,o)=>{window!==e&&(isWindowProxy(e)?(e.postMessage(s,o),t.debug(`Post message to parent window (origin=${o}):`,s)):(e.postMessage(s),t.debug("Post message to parent MessageEventSource:",s)))},u=i=>{if(!i.source||i.source!==s)return;if(!isPingMessage(i.data,n)&&!isTargetReadyMessage(i.data,n))return;t.debug(`Receive message from parent window (origin=${i.origin}):`,i.data);const u=getOriginFromMessage(i);if(isPingMessage(i.data,n))((e,s,a)=>{o()&&d(e,{uid:r,type:n.SelfReady,data:s},a)})(i.source,e,u);else{m();const{data:e}=i.data;[g]=i.ports,a(e,u,g),t.debug("Iframe connected.")}},m=()=>{window.removeEventListener("message",u)};return window.addEventListener("message",u),{ready:(e="*")=>{d(s,{uid:r,type:n.Ping},e)},destroy:()=>{m(),g&&(g.close(),g.onmessage=null,g.onmessageerror=null)}}}
|
|
@@ -24,20 +24,22 @@ export declare class TextTracksController extends EventEmitter<TextTracksControl
|
|
|
24
24
|
private nextTextTrack;
|
|
25
25
|
get Events(): typeof TextTracksController.Events;
|
|
26
26
|
constructor(options?: TextTracksController.Options | undefined);
|
|
27
|
+
setOptions(options: Partial<TextTracksController.Options>): void;
|
|
27
28
|
isAttached(): boolean;
|
|
28
29
|
getMediaElement(): HTMLMediaElement;
|
|
29
30
|
detach(): void;
|
|
30
31
|
attach(media: HTMLMediaElement): void;
|
|
32
|
+
getTextTracks(): readonly TextTrackInfo[];
|
|
31
33
|
setTextTracks(textTrackList: readonly TextTrackItem[]): void;
|
|
32
34
|
getActiveTextTrack(): TextTrackInfo | undefined;
|
|
33
|
-
setActiveTextTrack(tt: ActivateTextTrackInfo | undefined):
|
|
35
|
+
setActiveTextTrack(tt: ActivateTextTrackInfo | undefined): boolean;
|
|
34
36
|
destroy(): void;
|
|
35
37
|
}
|
|
36
38
|
export declare namespace TextTracksController {
|
|
37
39
|
interface Options {
|
|
38
|
-
/**
|
|
40
|
+
/** Defaults to `false`. */
|
|
39
41
|
readonly emitNativeEvents?: boolean | undefined;
|
|
40
|
-
/**
|
|
42
|
+
/** Defaults to `true`. */
|
|
41
43
|
readonly hideActiveTrack?: boolean | undefined;
|
|
42
44
|
/** */
|
|
43
45
|
readonly preferCueRowLength?: number | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{EventEmitter}from"eventemitter3";import{EventListeners}from"../../EventListeners";import{MediaNotAttachedError}from"../MediaNotAttachedError";import{parseTextTracks,setActiveTextTrack,addTextTracks,isIOSFullscreen,splitRows,buildCueId}from"./utils";function dispatchNativeEvent(t,e,i){t.dispatchEvent(new CustomEvent(e,{detail:i}))}export class TextTracksController extends EventEmitter{get Events(){return TextTracksController.Events}constructor(t){
|
|
1
|
+
import{EventEmitter}from"eventemitter3";import{EventListeners}from"../../EventListeners";import{MediaNotAttachedError}from"../MediaNotAttachedError";import{parseTextTracks,setActiveTextTrack,addTextTracks,isIOSFullscreen,splitRows,buildCueId}from"./utils";function dispatchNativeEvent(t,e,i){t.dispatchEvent(new CustomEvent(e,{detail:i}))}export class TextTracksController extends EventEmitter{get Events(){return TextTracksController.Events}constructor(t){super(),this.eventListeners=new EventListeners,this.addedTracks=[],this.textTrackList=[],this.options={emitNativeEvents:!1,hideActiveTrack:!0,preferCueRowLength:0},t&&this.setOptions(t)}setOptions(t){var e,i,s;Object.assign(this.options,Object.assign(Object.assign({},t),{emitNativeEvents:null!==(e=t.emitNativeEvents)&&void 0!==e?e:this.options.emitNativeEvents,hideActiveTrack:null!==(i=t.hideActiveTrack)&&void 0!==i?i:this.options.hideActiveTrack,preferCueRowLength:null!==(s=t.preferCueRowLength)&&void 0!==s?s:this.options.preferCueRowLength}))}isAttached(){return!!this.media}getMediaElement(){if(!this.media)throw new MediaNotAttachedError;return this.media}detach(){this.eventListeners.removeAllListeners(),this.media=void 0,this.addedTracks=[],this.textTrackList=[],this.textTrack=void 0,this.nextTextTrack=void 0}attach(t){this.detach();const e=(()=>{const e=[];return i=>{var s;const{activeCues:a}=i.target;if(!a)return;let n=e.length!==a.length;const r=new Array(a.length);for(let t=0;t<r.length;t+=1){const i=a[t];i.id=i.id||buildCueId(i,t),r[t]=i,r[t].rows=splitRows(i.text,this.options.preferCueRowLength),n||(null===(s=e[t])||void 0===s?void 0:s.id)===i.id||(n=!0),e[t]=i}e.length>r.length&&e.splice(r.length-e.length),n&&(this.emit(this.Events.TextTrackCueChanged,{textTrack:i.target,cues:r}),this.options.emitNativeEvents&&dispatchNativeEvent(t,"texttrackcuechange",{textTrack:i.target,cues:r}))}})(),i=()=>{var e;this.textTrackList=parseTextTracks(t),this.emit(this.Events.TextTrackListChanged,{textTracks:this.textTrackList}),this.options.emitNativeEvents&&dispatchNativeEvent(t,"texttracklistchange",{textTracks:this.textTrackList}),setActiveTextTrack(t,null!==(e=this.textTrack)&&void 0!==e?e:this.nextTextTrack,this.options.hideActiveTrack&&!isIOSFullscreen(t))};this.media=t,this.textTrackList=parseTextTracks(t);let s=!1;const a=t=>{s||i(),this.eventListeners.scope(t).on("cuechange",e)},n=t=>{i(),this.eventListeners.scope(t).off("cuechange",e)};if(this.eventListeners.scope(this.media.textTracks).on("change",(()=>{var e,i,s;const{textTracks:a}=t,{nextTextTrack:n}=this;let r=-1;for(let e=0;e<a.length;e+=1){const i=a[e];if(i.language===(null==n?void 0:n.language)&&i.kind===(null==n?void 0:n.kind)||isIOSFullscreen(t)||(i.mode="disabled"),"disabled"!==i.mode&&r>=0&&(i.mode="disabled"),"disabled"!==i.mode){if(r=e,!i.native&&!isIOSFullscreen(t)){const t=this.options.hideActiveTrack?"hidden":"showing";i.mode!==t&&(i.mode=t)}i.native&&i.language===(null==n?void 0:n.language)&&i.kind===n.kind&&(i.mode="showing")}}const c=a[r]&&(null!==(e=this.textTrackList[r])&&void 0!==e?e:{id:a[r].id,kind:a[r].kind,language:a[r].language,label:a[r].label});(null===(i=this.textTrack)||void 0===i?void 0:i.language)===(null==c?void 0:c.language)&&(null===(s=this.textTrack)||void 0===s?void 0:s.kind)===(null==c?void 0:c.kind)||(this.textTrack=c,this.nextTextTrack=this.textTrack,this.emit(this.Events.CurrentTextTrackChanged,{textTrack:this.textTrack,index:r}),this.options.emitNativeEvents&&dispatchNativeEvent(t,"texttrackchange",{textTrack:this.textTrack,index:r}))})).on("addtrack",(({track:t})=>t&&a(t))).on("removetrack",(({track:t})=>t&&n(t))),this.media.textTracks.length>0){s=!0;try{Array.prototype.forEach.call(this.media.textTracks,a),i()}finally{s=!1}}}getTextTracks(){return this.textTrackList}setTextTracks(t){const e=this.getMediaElement();if(this.eventListeners.scope(e,"@@setTextTracks").removeAllListeners(),this.addedTracks.forEach((t=>t.remove())),0===t.length)return;const i=()=>{addTextTracks(e,t,(t=>this.addedTracks.push(t))),this.textTrackList=parseTextTracks(e)};e.readyState>=e.HAVE_CURRENT_DATA?i():this.eventListeners.scope(e,"@@setTextTracks").once("loadeddata",i)}getActiveTextTrack(){return this.textTrack}setActiveTextTrack(t){const e=this.getMediaElement();return this.nextTextTrack=t&&this.textTrackList.find((e=>e.language===t.language&&(!t.kind||e.kind===t.kind))),setActiveTextTrack(e,this.nextTextTrack,this.options.hideActiveTrack&&!isIOSFullscreen(e))}destroy(){this.detach(),this.removeAllListeners()}}!function(t){let e;!function(t){t.TextTrackListChanged="TrackListChanged",t.CurrentTextTrackChanged="CurrentTextTrackChanged",t.TextTrackCueChanged="TextTrackCueChanged"}(e=t.Events||(t.Events={}))}(TextTracksController||(TextTracksController={}));
|
|
@@ -3,7 +3,7 @@ declare global {
|
|
|
3
3
|
customGroupId?: string | undefined;
|
|
4
4
|
}
|
|
5
5
|
}
|
|
6
|
-
export type TextTrackItem = Readonly<PartialSome<RequiredStrict<Pick<HTMLTrackElement, 'src'
|
|
6
|
+
export type TextTrackItem = Readonly<PartialSome<RequiredStrict<Pick<HTMLTrackElement, 'src'> & Pick<TextTrack, 'kind' | 'label' | 'language'>>, 'kind'>>;
|
|
7
7
|
export interface TextTrackInfo extends Pick<TextTrackItem, 'kind' | 'language' | 'label'> {
|
|
8
8
|
readonly id: string;
|
|
9
9
|
}
|
|
@@ -12,7 +12,7 @@ export type ActivateTextTrackInfo = OptionalToUndefined<PartialBut<Pick<TextTrac
|
|
|
12
12
|
export declare function fakeDetachTextTracks(media: HTMLMediaElement): void;
|
|
13
13
|
export declare function parseTextTracks(media: HTMLMediaElement): TextTrackInfo[];
|
|
14
14
|
export declare function isIOSFullscreen(media: HTMLMediaElement): boolean;
|
|
15
|
-
export declare function setActiveTextTrack(media: HTMLMediaElement, tt: ActivateTextTrackInfo | undefined, hideActiveTrack: boolean):
|
|
15
|
+
export declare function setActiveTextTrack(media: HTMLMediaElement, tt: ActivateTextTrackInfo | undefined, hideActiveTrack: boolean): boolean;
|
|
16
16
|
/** Dynamically add text tracks */
|
|
17
17
|
export declare function addTextTracks(media: HTMLMediaElement, textTrackList: readonly TextTrackItem[], onAdd: (el: HTMLTrackElement) => void): void;
|
|
18
18
|
export declare function buildCueId(cue: Pick<TextTrackCue, 'startTime'>, index: number): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isIOS}from"../../platform/isIOS";const DETACHED_GROUP_ID="__detached__";export function fakeDetachTextTracks(t){
|
|
1
|
+
import{isIOS}from"../../platform/isIOS";const DETACHED_GROUP_ID="__detached__";export function fakeDetachTextTracks(t){Array.prototype.forEach.call(t.textTracks,(t=>{const e=t;e.customGroupId&&(e.customGroupId="__detached__")}))}export function parseTextTracks(t){return 0===t.textTracks.length?[]:Array.prototype.reduce.call(t.textTracks,((t,{customGroupId:e,id:n,kind:l,language:r,label:a})=>("__detached__"!==e&&r&&t.push({id:n,kind:l,language:r,label:null!=a?a:""}),t)),[])}export function isIOSFullscreen(t){return isIOS()&&!!t.webkitDisplayingFullscreen}export function setActiveTextTrack(t,e,n){const{textTracks:l}=t;if(0===l.length)return!1;let r=!1,a=!1;for(let t=0;t<l.length;t+=1){const i=l[t];if(a||i.language!==(null==e?void 0:e.language)||e.kind&&i.kind!==e.kind)"disabled"!==i.mode&&(i.mode="disabled",r=!0);else{const t=n?"hidden":"showing";i.mode=t,a=!0,r=!0}}return r}export function addTextTracks(t,e,n){const l=Array.prototype.reduce.call(t.textTracks,((t,e)=>(e.language&&(t[e.language]=e),t)),{});e.forEach((e=>{var r;if(!l[e.language]){const l=document.createElement("track");l.src=e.src,l.srclang=e.language,l.label=e.label,l.kind=null!==(r=e.kind)&&void 0!==r?r:"captions",l.default=!1,n(t.appendChild(l))}}))}export function buildCueId(t,e){return`${t.startTime}-${e}`}export function splitRows(t,e){var n;if(e<=0)return t.split(/\r?\n/);const l=[];let r=0,a=r,i="";for(let o=0;o<=t.length;o+=1){const c=t[o];i.length>0&&r<a&&(l[a]=null==c?i.trim():i.trimStart(),i=""),r=a;let s=null!==(n=l[r])&&void 0!==n?n:"";if("\n"===c||"\r\n"===c)i.length>0&&s.length+i.length<=e&&(s+=s.length>0?i:i.trimStart(),i=""),a+=1;else if(" "===c){if(i.length>0){s.length+i.length>e&&s.length>0?(a+=1,s=s.trimEnd()):(s+=0===s.length?i.trimStart():i,i="")}i+=c}else if(null==c&&i.length>0){s.length+i.length>e&&0!==s.length?(r+=1,s=i.trim()):s+=i}else c&&(i+=c);l[r]=s}return l}
|
package/media/parseCueText.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@js-toolkit/web-utils",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.55.0",
|
|
4
4
|
"description": "Web utils",
|
|
5
5
|
"author": "VZH",
|
|
6
6
|
"license": "MIT",
|
|
@@ -17,35 +17,35 @@
|
|
|
17
17
|
"minor-publish": "npm run build && npm version minor --force --no-workspaces-update -m 'v%s' && npm run copy:configs && cd ./dist && npm publish --access public && git push --follow-tags"
|
|
18
18
|
},
|
|
19
19
|
"optionalDependencies": {
|
|
20
|
-
"@js-toolkit/node-utils": "^1.2.
|
|
20
|
+
"@js-toolkit/node-utils": "^1.2.1"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
|
-
"@eslint/compat": "^1.1.
|
|
23
|
+
"@eslint/compat": "^1.1.1",
|
|
24
24
|
"@eslint/eslintrc": "^3.1.0",
|
|
25
|
-
"@eslint/js": "^9.
|
|
26
|
-
"@js-toolkit/configs": "^3.93.
|
|
25
|
+
"@eslint/js": "^9.7.0",
|
|
26
|
+
"@js-toolkit/configs": "^3.93.1",
|
|
27
27
|
"@js-toolkit/utils": "^1.54.0",
|
|
28
|
-
"@types/eslint": "^
|
|
29
|
-
"@types/eslint__eslintrc": "^2.1.
|
|
28
|
+
"@types/eslint": "^9.6.0",
|
|
29
|
+
"@types/eslint__eslintrc": "^2.1.2",
|
|
30
30
|
"@types/eslint__js": "^8.42.3",
|
|
31
31
|
"@types/lodash.throttle": "^4.1.9",
|
|
32
32
|
"@types/uuid": "^10.0.0",
|
|
33
33
|
"copyfiles": "^2.4.1",
|
|
34
|
-
"eslint": "^9.
|
|
34
|
+
"eslint": "^9.7.0",
|
|
35
35
|
"eslint-config-prettier": "^9.1.0",
|
|
36
36
|
"eslint-plugin-import": "^2.29.1",
|
|
37
|
-
"eslint-plugin-prettier": "^5.1
|
|
37
|
+
"eslint-plugin-prettier": "^5.2.1",
|
|
38
38
|
"eventemitter3": "^5.0.1",
|
|
39
39
|
"lodash.throttle": "^4.1.1",
|
|
40
|
-
"prettier": "^3.3.
|
|
40
|
+
"prettier": "^3.3.3",
|
|
41
41
|
"reconnecting-websocket": "^4.4.0",
|
|
42
|
-
"rimraf": "^
|
|
43
|
-
"terser": "^5.31.
|
|
44
|
-
"typescript": "^5.5.
|
|
45
|
-
"typescript-eslint": "^7.
|
|
42
|
+
"rimraf": "^6.0.1",
|
|
43
|
+
"terser": "^5.31.3",
|
|
44
|
+
"typescript": "^5.5.4",
|
|
45
|
+
"typescript-eslint": "^7.17.0",
|
|
46
46
|
"ua-parser-js": "^2.0.0-beta.3",
|
|
47
47
|
"uuid": "^10.0.0",
|
|
48
|
-
"webpack": "^5.
|
|
48
|
+
"webpack": "^5.93.0",
|
|
49
49
|
"yargs": "^17.7.2"
|
|
50
50
|
}
|
|
51
51
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
/// <reference types="ua-parser-js" preserve="true" />
|
|
1
2
|
type PlatformInfo = DeepReadonly<OmitStrict<UAParser.IResult, 'withClientHints' | 'withFeatureCheck'>> & {
|
|
2
3
|
toStringObject(): Record<Keys<ExcludeKeysOfType<UAParser.IResult, AnyFunction>>, string>;
|
|
3
4
|
};
|
|
5
|
+
export declare function getPlatformInfoSync(): PlatformInfo;
|
|
4
6
|
export declare function getPlatformInfo(): Promise<PlatformInfo>;
|
|
5
7
|
export declare function getCachedPlatformInfo(): PlatformInfo | undefined;
|
|
6
8
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{__awaiter}from"tslib";import{UAParser}from"ua-parser-js";let
|
|
1
|
+
import{__awaiter}from"tslib";import{UAParser}from"ua-parser-js";let syncResult,asyncResult,promise;function toPlatformInfo(t){return Object.assign(Object.assign({},t),{toStringObject(){return Object.getOwnPropertyNames(this).reduce(((t,e)=>{const n=e;return null!=this[n]&&"function"!=typeof this[n]&&(t[n]=this[n].toString()),t}),{})}})}export function getPlatformInfoSync(){return null==syncResult&&(syncResult=toPlatformInfo(new UAParser(navigator.userAgent).getResult().withFeatureCheck())),syncResult}export function getPlatformInfo(){return __awaiter(this,void 0,void 0,(function*(){return null==asyncResult&&(promise=null!=promise?promise:Promise.resolve(new UAParser(navigator.userAgent).getResult().withFeatureCheck().withClientHints()),asyncResult=toPlatformInfo(yield promise),syncResult=asyncResult,promise=void 0),asyncResult}))}export function getCachedPlatformInfo(){return null==asyncResult&&(console.warn("PlatformInfo is not ready yet."),getPlatformInfo()),asyncResult}
|
package/serviceWorker/utils.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/// <reference lib="webworker" preserve="true" />
|
|
1
2
|
export declare function isLocalhost(hostname?: string): boolean;
|
|
2
3
|
/** Delete all caches that aren't named in `caches`. */
|
|
3
4
|
export declare function removeUnknownCaches<T extends Record<string, string>>(expectedCaches: T): Promise<unknown>;
|
package/ws/WSController.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{__rest}from"tslib";import ReconnectingWebSocket,{}from"reconnecting-websocket";import{DataEventEmitter}from"@js-toolkit/utils/DataEventEmitter";import{delayed}from"@js-toolkit/utils/delayed";import{EventEmitterListener}from"../EventEmitterListener";function getNotConnectedError(){return new Error("The object is not connected yet.")}export class WSController extends DataEventEmitter{get Events(){return WSController.Events}constructor(e,t){super();const n=null!=t?t:{},{logger:s,protocols:o,binaryType:i,idleTimeout:r,halfOpenDetection:c,startClosed:l}=n,a=__rest(n,["logger","protocols","binaryType","idleTimeout","halfOpenDetection","startClosed"]);this.logger=null!=s?s:console,this.ws=new ReconnectingWebSocket(e,o,Object.assign(Object.assign({},a),{startClosed:!0})),null!=i&&(this.ws.binaryType=i),this.listener=new EventEmitterListener(this.ws),r&&r>0&&(this.reconnectOnIdle=delayed((()=>{this.logger.info(`WS connection reconnecting after ${r}ms due to inactivity.`),this.ws.reconnect()}),r)),this.halfOpen=(()=>{if(!c)return;const{pingTimeout:e=12e3,outMessage:t=(
|
|
1
|
+
import{__rest}from"tslib";import ReconnectingWebSocket,{}from"reconnecting-websocket";import{DataEventEmitter}from"@js-toolkit/utils/DataEventEmitter";import{delayed}from"@js-toolkit/utils/delayed";import{EventEmitterListener}from"../EventEmitterListener";function getNotConnectedError(){return new Error("The object is not connected yet.")}export class WSController extends DataEventEmitter{get Events(){return WSController.Events}constructor(e,t){super();const n=null!=t?t:{},{logger:s,protocols:o,binaryType:i,idleTimeout:r,halfOpenDetection:c,startClosed:l}=n,a=__rest(n,["logger","protocols","binaryType","idleTimeout","halfOpenDetection","startClosed"]);this.logger=null!=s?s:console,this.ws=new ReconnectingWebSocket(e,o,Object.assign(Object.assign({},a),{startClosed:!0})),null!=i&&(this.ws.binaryType=i),this.listener=new EventEmitterListener(this.ws),r&&r>0&&(this.reconnectOnIdle=delayed((()=>{this.logger.info(`WS connection reconnecting after ${r}ms due to inactivity.`),this.ws.reconnect()}),r)),this.halfOpen=(()=>{if(!c)return;const{pingTimeout:e=12e3,outMessage:t=()=>JSON.stringify({type:"pong"}),inMessageFilter:n=e=>e&&"object"==typeof e&&"ping"===e.type}=c,s=delayed((()=>{this.logger.info(`WS connection reconnecting after ${e}ms due to the probability of a half-open connection.`),this.ws.reconnect()}),e),o=()=>{s(),this.ws.send("function"!=typeof t||t instanceof Blob?t:t())};return{heartbeat:o,cancel:()=>s.cancel(),onMessage:({data:e})=>{n(e)?o():s()}}})(),this.listener.on("open",(()=>{var e;this.reconnectOnIdle&&this.reconnectOnIdle(),null===(e=this.halfOpen)||void 0===e||e.heartbeat(),this.emit(this.Events.Connected)})).on("close",(({code:e})=>{var n,s;null===(n=this.reconnectOnIdle)||void 0===n||n.cancel(),null===(s=this.halfOpen)||void 0===s||s.cancel(),null!=(null==t?void 0:t.maxRetries)&&this.ws.readyState===this.ws.CLOSED&&this.ws.retryCount===t.maxRetries&&this.close(e,`Failed to connect after ${t.maxRetries} attempts.`)})).on("message",(e=>{var t;this.reconnectOnIdle&&this.reconnectOnIdle(),null===(t=this.halfOpen)||void 0===t||t.onMessage(e),this.emit(this.Events.Message,e)})).on("error",(({error:e,message:t})=>{this.emit(this.Events.Error,{error:e,message:t})})),this.halfOpen&&(this.isConnected()||this.ws.readyState===this.ws.CONNECTING)&&this.halfOpen.heartbeat(),l||this.connect()}isConnected(){return this.ws.readyState===this.ws.OPEN}getUrl(){return this.ws.url}connect(){this.ws.reconnect()}send(e){if(!this.ws)throw getNotConnectedError();this.ws.send(e)}close(e,t){const n=!!this.ws;try{this.reconnectOnIdle&&this.reconnectOnIdle.cancel(),this.halfOpen&&this.halfOpen.cancel(),this.ws.close(e,t)}catch(e){this.logger.warn(e)}n&&this.emit(this.Events.Closed,t?{reason:t}:void 0)}destroy(){this.close(),this.listener.removeAllListeners(),this.removeAllListeners()}}!function(e){let t;!function(e){e.Connected="Connected",e.Message="Message",e.Error="Error",e.Closed="Closed"}(t=e.Events||(e.Events={}))}(WSController||(WSController={}));
|