@js-toolkit/web-utils 1.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/EventEmitterListener.d.ts +58 -0
- package/EventEmitterListener.js +1 -0
- package/EventEmitterListener.utils.d.ts +30 -0
- package/EventEmitterListener.utils.js +1 -0
- package/EventListeners.d.ts +8 -0
- package/EventListeners.js +1 -0
- package/FullscreenController.d.ts +61 -0
- package/FullscreenController.js +1 -0
- package/LICENSE +21 -0
- package/PipController.d.ts +31 -0
- package/PipController.js +1 -0
- package/README.md +5 -0
- package/base64ToDataUrl.d.ts +2 -0
- package/base64ToDataUrl.js +1 -0
- package/blobToDataUrl.d.ts +2 -0
- package/blobToDataUrl.js +1 -0
- package/copyToClipboard.d.ts +1 -0
- package/copyToClipboard.js +1 -0
- package/createLoop.d.ts +8 -0
- package/createLoop.js +1 -0
- package/createRafLoop.d.ts +10 -0
- package/createRafLoop.js +1 -0
- package/dataUrlToBlob.d.ts +2 -0
- package/dataUrlToBlob.js +1 -0
- package/detection/getIOSVersion.d.ts +9 -0
- package/detection/getIOSVersion.js +1 -0
- package/detection/getUAParserResult.d.ts +2 -0
- package/detection/getUAParserResult.js +1 -0
- package/detection/isAirPlayAvailable.d.ts +2 -0
- package/detection/isAirPlayAvailable.js +1 -0
- package/detection/isAndroid.d.ts +2 -0
- package/detection/isAndroid.js +1 -0
- package/detection/isIOS.d.ts +2 -0
- package/detection/isIOS.js +1 -0
- package/detection/isMacOS.d.ts +2 -0
- package/detection/isMacOS.js +1 -0
- package/detection/isMobile.d.ts +2 -0
- package/detection/isMobile.js +1 -0
- package/detection/isSafari.d.ts +2 -0
- package/detection/isSafari.js +1 -0
- package/fullscreen.d.ts +29 -0
- package/fullscreen.js +1 -0
- package/ga/DataLayerProxy.d.ts +8 -0
- package/ga/DataLayerProxy.js +1 -0
- package/ga/getHandler.d.ts +19 -0
- package/ga/getHandler.js +1 -0
- package/ga/iframeMessenger.d.ts +7 -0
- package/ga/iframeMessenger.js +1 -0
- package/ga/types.d.ts +41 -0
- package/ga/types.js +1 -0
- package/getAppContainer.d.ts +2 -0
- package/getAppContainer.js +1 -0
- package/getAspectRatio.d.ts +11 -0
- package/getAspectRatio.js +1 -0
- package/getBrowserLanguage.d.ts +7 -0
- package/getBrowserLanguage.js +1 -0
- package/getEventAwaiter.d.ts +6 -0
- package/getEventAwaiter.js +1 -0
- package/getGeoCoordinates.d.ts +2 -0
- package/getGeoCoordinates.js +1 -0
- package/getGeoLocality.d.ts +5 -0
- package/getGeoLocality.js +1 -0
- package/getInnerRect.d.ts +6 -0
- package/getInnerRect.js +1 -0
- package/getInnerXDimensions.d.ts +7 -0
- package/getInnerXDimensions.js +1 -0
- package/getInnerYDimensions.d.ts +7 -0
- package/getInnerYDimensions.js +1 -0
- package/getRandomID.d.ts +2 -0
- package/getRandomID.js +1 -0
- package/getScreenSize.d.ts +6 -0
- package/getScreenSize.js +1 -0
- package/getSecondsCounter.d.ts +23 -0
- package/getSecondsCounter.js +1 -0
- package/iframe/getAutoConnectClient.d.ts +15 -0
- package/iframe/getAutoConnectClient.js +1 -0
- package/iframe/getAutoConnectHost.d.ts +21 -0
- package/iframe/getAutoConnectHost.js +1 -0
- package/iframe/getAutoConnector.d.ts +32 -0
- package/iframe/getAutoConnector.js +1 -0
- package/iframe/getOriginFromMessage.d.ts +1 -0
- package/iframe/getOriginFromMessage.js +1 -0
- package/iframe/isIframeLoaded.d.ts +5 -0
- package/iframe/isIframeLoaded.js +1 -0
- package/iframe/messages.d.ts +19 -0
- package/iframe/messages.js +1 -0
- package/iframe/utils.d.ts +3 -0
- package/iframe/utils.js +1 -0
- package/imageToBlob.d.ts +2 -0
- package/imageToBlob.js +1 -0
- package/isImageTypeSupported.d.ts +1 -0
- package/isImageTypeSupported.js +1 -0
- package/isStandaloneApp.d.ts +2 -0
- package/isStandaloneApp.js +1 -0
- package/isWebPSupported.d.ts +1 -0
- package/isWebPSupported.js +1 -0
- package/loadImage.d.ts +3 -0
- package/loadImage.js +1 -0
- package/loadScript.d.ts +4 -0
- package/loadScript.js +1 -0
- package/media/MediaStreamController.d.ts +15 -0
- package/media/MediaStreamController.js +1 -0
- package/media/getDurationTime.d.ts +1 -0
- package/media/getDurationTime.js +1 -0
- package/media/isMediaSeekable.d.ts +1 -0
- package/media/isMediaSeekable.js +1 -0
- package/media/mse.d.ts +8 -0
- package/media/mse.js +1 -0
- package/media/resetMedia.d.ts +2 -0
- package/media/resetMedia.js +1 -0
- package/media/timeRanges.d.ts +3 -0
- package/media/timeRanges.js +1 -0
- package/media/toggleNativeSubtitles.d.ts +6 -0
- package/media/toggleNativeSubtitles.js +1 -0
- package/onDOMReady.d.ts +3 -0
- package/onDOMReady.js +1 -0
- package/onPageReady.d.ts +3 -0
- package/onPageReady.js +1 -0
- package/package.json +46 -0
- package/performance/getNavigationTiming.d.ts +1 -0
- package/performance/getNavigationTiming.js +1 -0
- package/preventDefault.d.ts +5 -0
- package/preventDefault.js +1 -0
- package/rafCallback.d.ts +5 -0
- package/rafCallback.js +1 -0
- package/saveFileAs.d.ts +2 -0
- package/saveFileAs.js +1 -0
- package/serviceWorker.d.ts +8 -0
- package/serviceWorker.js +1 -0
- package/stopPropagation.d.ts +4 -0
- package/stopPropagation.js +1 -0
- package/takeSnapshot.d.ts +9 -0
- package/takeSnapshot.js +1 -0
- package/toBase64.d.ts +2 -0
- package/toBase64.js +1 -0
- package/toLocalPoint.d.ts +5 -0
- package/toLocalPoint.js +1 -0
- package/types/index.d.ts +4 -0
- package/types/index.js +1 -0
- package/types/refs.d.ts +1 -0
- package/types/refs.js +1 -0
- package/webrtc/PeerConnection.d.ts +68 -0
- package/webrtc/PeerConnection.js +1 -0
- package/webrtc/sdputils.d.ts +20 -0
- package/webrtc/sdputils.js +1 -0
- package/ws/WSController.d.ts +50 -0
- package/ws/WSController.js +1 -0
package/getInnerRect.js
ADDED
|
@@ -0,0 +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;
|
|
@@ -0,0 +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;
|
|
@@ -0,0 +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;
|
package/getRandomID.d.ts
ADDED
package/getRandomID.js
ADDED
|
@@ -0,0 +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;
|
package/getScreenSize.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function angleToOrientationType(e){return 0===e?"portrait-primary":180===e?"portrait-secondary":90===e?"landscape-primary":-90===e?"landscape-secondary":void 0}export function getScreenSize({respectOrientation:e=!0}={}){const{width:n,height:t,orientation:i}=window.screen;if(e){const e=i?i.type:angleToOrientationType(window.orientation);if(("landscape-primary"===e||"landscape-secondary"===e)&&n<t)return{width:t,height:n}}return{width:n,height:t}}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface SecondsCounterOptions {
|
|
2
|
+
readonly onChange?: ((data: {
|
|
3
|
+
/** Current seconds (integer). */
|
|
4
|
+
value: number;
|
|
5
|
+
/** The number of records - total seconds. It's not a duration. (integer). */
|
|
6
|
+
total: number;
|
|
7
|
+
}) => void) | undefined;
|
|
8
|
+
}
|
|
9
|
+
export interface SecondsCounter {
|
|
10
|
+
readonly getTotal: () => number;
|
|
11
|
+
readonly push: (currentTime: number | {
|
|
12
|
+
currentTime: number;
|
|
13
|
+
} | {
|
|
14
|
+
data: {
|
|
15
|
+
currentTime: number;
|
|
16
|
+
};
|
|
17
|
+
}) => void;
|
|
18
|
+
onChange: SecondsCounterOptions['onChange'];
|
|
19
|
+
readonly reset: VoidFunction;
|
|
20
|
+
readonly destroy: VoidFunction;
|
|
21
|
+
}
|
|
22
|
+
export declare function getSecondsCounter({ onChange }?: SecondsCounterOptions): SecondsCounter;
|
|
23
|
+
export default getSecondsCounter;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{toInt}from"@jstoolkit/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;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type MessagesTypes } from './messages';
|
|
2
|
+
interface AutoConnectClient {
|
|
3
|
+
readonly ready: (origin?: string) => void;
|
|
4
|
+
readonly destroy: VoidFunction;
|
|
5
|
+
}
|
|
6
|
+
interface AutoConnectClientOptions<T = unknown> {
|
|
7
|
+
readonly data: T;
|
|
8
|
+
readonly target?: MessageEventSource | undefined;
|
|
9
|
+
readonly isReady?: () => boolean;
|
|
10
|
+
readonly onConnect: <T = unknown>(data: T, origin: string, port?: MessagePort) => void;
|
|
11
|
+
readonly logger?: Pick<Console, 'debug'> | undefined;
|
|
12
|
+
readonly messagesTypes?: Partial<MessagesTypes>;
|
|
13
|
+
}
|
|
14
|
+
export declare function getAutoConnectClient<T = unknown>({ data, target, isReady, onConnect, logger, messagesTypes: messagesTypes0, }: AutoConnectClientOptions<T>): AutoConnectClient;
|
|
15
|
+
export {};
|
|
@@ -0,0 +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";export function getAutoConnectClient({data:e,target:s=window.parent,isReady:a=(()=>!0),onConnect:t,logger:o=console,messagesTypes:n}){const i={Ping:(null==n?void 0:n.Ping)||IFRAME_PING,TargetReady:(null==n?void 0:n.TargetReady)||IFRAME_HOST_READY,SelfReady:(null==n?void 0:n.SelfReady)||IFRAME_CLIENT_READY},r=uuid();let g;const d=(e,s,a)=>{window!==e&&(e instanceof MessagePort||e instanceof ServiceWorker?(e.postMessage(s),o.debug("Post message to parent MessageEventSource:",s)):(e.postMessage(s,a),o.debug(`Post message to parent window (origin=${a}):`,s)))},u=n=>{if(!n.source||n.source!==s)return;if(!isPingMessage(n.data,i)&&!isTargetReadyMessage(n.data,i))return;o.debug(`Receive message from parent window (origin=${n.origin}):`,n.data);const u=getOriginFromMessage(n);if(isPingMessage(n.data,i))((e,s,t)=>{a()&&d(e,{uid:r,type:i.SelfReady,data:s},t)})(n.source,e,u);else{m();const{data:e}=n.data;[g]=n.ports,t(e,u,g),o.debug("Iframe connected.")}},m=()=>{window.removeEventListener("message",u)};return window.addEventListener("message",u),{ready:(e="*")=>{d(s,{uid:r,type:i.Ping},e)},destroy:()=>{m(),g&&(g.close(),g.onmessage=null,g.onmessageerror=null)}}}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type MessagesTypes } from './messages';
|
|
2
|
+
interface AutoConnectHost {
|
|
3
|
+
readonly start: (...iframes: readonly HTMLIFrameElement[] | [() => readonly HTMLIFrameElement[]]) => void;
|
|
4
|
+
readonly stop: VoidFunction;
|
|
5
|
+
readonly destroy: VoidFunction;
|
|
6
|
+
/** Send `ready` to iframe. */
|
|
7
|
+
readonly ready: <T>(data: T, target: MessageEventSource, origin?: string | undefined) => void;
|
|
8
|
+
}
|
|
9
|
+
export type AutoConnectHostOptions<T = AnyObject> = {
|
|
10
|
+
readonly onSendData?: ((target: MessageEventSource, origin: string) => T) | undefined;
|
|
11
|
+
readonly logger?: Pick<Console, 'warn' | 'debug'> | undefined;
|
|
12
|
+
readonly messagesTypes?: Partial<MessagesTypes>;
|
|
13
|
+
} & ({
|
|
14
|
+
readonly openChannel: true;
|
|
15
|
+
readonly onConnect: <T = unknown>(data: T, target: MessageEventSource, origin: string, port: MessagePort) => void;
|
|
16
|
+
} | {
|
|
17
|
+
readonly openChannel?: false | undefined;
|
|
18
|
+
readonly onConnect: <T = unknown>(data: T, target: MessageEventSource, origin: string) => void;
|
|
19
|
+
});
|
|
20
|
+
export declare function getAutoConnectHost<T>({ onSendData, logger, openChannel, onConnect, messagesTypes: messagesTypes0, }: AutoConnectHostOptions<T>): AutoConnectHost;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{v4 as uuid}from"uuid";import{onDOMReady}from"../onDOMReady";import{IFRAME_HOST_READY,IFRAME_CLIENT_READY,IFRAME_PING,isPingMessage,isTargetReadyMessage}from"./messages";import{selectFrames}from"./utils";import{getOriginFromMessage}from"./getOriginFromMessage";export function getAutoConnectHost({onSendData:e,logger:o=console,openChannel:s,onConnect:t,messagesTypes:n}){const r={Ping:(null==n?void 0:n.Ping)||IFRAME_PING,TargetReady:(null==n?void 0:n.TargetReady)||IFRAME_CLIENT_READY,SelfReady:(null==n?void 0:n.SelfReady)||IFRAME_HOST_READY};let a,i;const d=uuid(),g=s?new MessageChannel:void 0,u=(e,s,t,n)=>{window!==s&&(s instanceof MessagePort||s instanceof ServiceWorker?(s.postMessage(e,n&&{transfer:n}),o.debug("Post message to MessageEventSource:",e)):(s.postMessage(e,t,n),o.debug(`Post message to iframe (origin=${t}):`,e)))},l=(e,o)=>{u({uid:d,type:r.Ping},e,o)},c=(e,o,s="*")=>{u({uid:d,type:r.SelfReady,data:e},o,s,g?[g.port2]:void 0)},m=n=>{if(!n.source||n.source===window)return;if(!isPingMessage(n.data,r)&&!isTargetReadyMessage(n.data,r))return;o.debug(`Receive message from iframe (origin=${n.origin}):`,n.data);const a=n.source,i=getOriginFromMessage(n);if(isPingMessage(n.data,r))l(a,i);else{c(e?e(a,i):void 0,a,i);const{data:r}=n.data;setTimeout((()=>{s&&g?t(r,a,i,g.port1):s||t(r,a,i),o.debug("Iframe Host connected.")}),0)}},f=()=>{a&&(a(),a=void 0)};return{start:(...e)=>{if(a)return void o.warn("Already started. You should first call `stop`.");const s=onDOMReady((()=>{i=(()=>{const o="function"==typeof e[0]?e[0]():e;return o.length>0?o:void 0})();const o=i||selectFrames();window.addEventListener("message",m);for(let e=0;e<o.length;e+=1){const s=o[e];s.contentWindow&&l(s.contentWindow,"*")}}));a=()=>{s(),window.removeEventListener("message",m),i=void 0}},stop:f,ready:c,destroy:()=>{f(),g&&(g.port1.close(),g.port2.close(),g.port1.onmessage=null,g.port1.onmessageerror=null)}}}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type MessagesTypes } from './messages';
|
|
2
|
+
import { type Target } from './utils';
|
|
3
|
+
export { getClientMessages, getHostMessages } from './messages';
|
|
4
|
+
interface AutoConnector {
|
|
5
|
+
/** If function passed the connector waits until DOM ready. */
|
|
6
|
+
readonly start: (targets: ArrayLike<Target> | (() => ArrayLike<Target>)) => void;
|
|
7
|
+
readonly stop: VoidFunction;
|
|
8
|
+
readonly destroy: VoidFunction;
|
|
9
|
+
}
|
|
10
|
+
interface TargetInfo {
|
|
11
|
+
readonly target: Window;
|
|
12
|
+
readonly origin: string;
|
|
13
|
+
}
|
|
14
|
+
interface ConnectTargetInfo<ReceiveData = unknown> extends TargetInfo {
|
|
15
|
+
readonly data: ReceiveData;
|
|
16
|
+
}
|
|
17
|
+
export type AutoConnectorOptions<SendData = AnyObject, ReceiveData = unknown> = {
|
|
18
|
+
readonly id?: string | undefined;
|
|
19
|
+
readonly label?: string | undefined;
|
|
20
|
+
readonly onSendData?: ((info: TargetInfo) => SendData) | undefined;
|
|
21
|
+
readonly messagesTypes: MessagesTypes;
|
|
22
|
+
/** Process messages only from targets passed to `start` method. Default `true`. */
|
|
23
|
+
readonly strictTargets?: boolean;
|
|
24
|
+
readonly logger?: Pick<Console, 'warn' | 'debug'> | undefined;
|
|
25
|
+
} & ({
|
|
26
|
+
readonly channel: 'open' | 'use';
|
|
27
|
+
readonly onConnect: (info: ConnectTargetInfo<ReceiveData>, port: MessagePort) => void;
|
|
28
|
+
} | {
|
|
29
|
+
readonly channel?: undefined;
|
|
30
|
+
readonly onConnect: (info: ConnectTargetInfo<ReceiveData>) => void;
|
|
31
|
+
});
|
|
32
|
+
export declare function getAutoConnector<SendData, ReceiveData>({ id, label: labelOption, strictTargets, messagesTypes, channel: channelOption, logger, onSendData, onConnect, }: AutoConnectorOptions<SendData, ReceiveData>): AutoConnector;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{v4 as uuid}from"uuid";import{onDOMReady}from"../onDOMReady";import{isPingMessage,isTargetReadyMessage}from"./messages";import{findTarget}from"./utils";import{getOriginFromMessage}from"./getOriginFromMessage";export{getClientMessages,getHostMessages}from"./messages";export function getAutoConnector({id:e,label:t,strictTargets:o=!0,messagesTypes:n,channel:s,logger:i=console,onSendData:a,onConnect:r}){const d=e||uuid(),g=t||d,u=new Map,c="open"===s?new Map:void 0;let l,f;const m=(e,t,o,n,s)=>{window!==t&&(t instanceof MessagePort||t instanceof ServiceWorker?(t.postMessage(e,s&&{transfer:s}),i.debug(`${g}: Post message to MessageEventSource (uid=${n}):`,e)):(t.postMessage(e,o,s),i.debug(`${g}: Post message to iframe (uid=${n},origin=${o}):`,e)))},v=(e,t,o)=>{m({uid:d,type:n.Ping},e,t,o)},p=e=>{var t,f,p,M;if(!e.source||e.source===window)return;if(!isPingMessage(e.data,n)&&!isTargetReadyMessage(e.data,n))return;if(e.data.uid===d)return;const h=e.source,w=e.data.uid;if(i.debug(`${g}: Receive message from iframe (uid=${w},origin=${e.origin}):`,e.data),o&&l){if(!findTarget(h,l))return void i.warn(`${g}: Could not find target (uid=${w}) by message.source.`)}const y=getOriginFromMessage(e);if(isPingMessage(e.data,n)&&!(null===(t=u.get(w))||void 0===t?void 0:t.Ping))return u.set(w,Object.assign(Object.assign({},u.get(w)),{Ping:!0})),void v(h,y,w);let $=!1;if((null===(f=u.get(w))||void 0===f?void 0:f.Ping)&&!(null===(p=u.get(w))||void 0===p?void 0:p.SelfReady)){u.set(w,Object.assign(Object.assign({},u.get(w)),{SelfReady:!0}));const e=c?(()=>{var e;const t=null!==(e=c.get(w))&&void 0!==e?e:new MessageChannel;return c.set(w,t),t.port2})():void 0;((e,t,o,s,i)=>{m({uid:d,type:n.SelfReady,data:e},t,o,s,i?[i]:void 0)})(a?a({target:h,origin:y}):void 0,h,y,w,e),$=!1}if(isTargetReadyMessage(e.data,n)&&(null===(M=u.get(w))||void 0===M?void 0:M.SelfReady)){u.delete(w);const t=(()=>{var t;if("open"===s){const e=null===(t=null==c?void 0:c.get(w))||void 0===t?void 0:t.port1;if(!e)throw new Error("Something went wrong: MessageChannel is not created despite the fact that the `channel` option is `open`.");return e}if("use"===s){const t=e.ports[0];if(!t)throw new Error("MessagePort is not received despite the fact that the `channel` option is `use`. The `channel` option of connector on another side must be equals `open`.");return t}})(),{data:o}=e.data,n=()=>{i.debug(`${g}: Iframe connection established (${d} + ${w}).`),r({data:o,target:h,origin:y},t)};$?setTimeout(n,0):n()}},M=()=>{f&&(f(),f=void 0)};return{start:e=>{if(f)return void i.warn(`${g}: Already started. You should first call \`stop\`.`);const t=()=>{l=(()=>{const t="function"==typeof e?e():e;return t.length>0?t:void 0})(),window.addEventListener("message",p);const t=null!=l?l:[];for(let e=0;e<t.length;e+=1){const o=t[e],n=o instanceof HTMLIFrameElement?o.contentWindow:o;n&&n!==window&&v(n,"*","")}},o="function"==typeof e?onDOMReady(t):t();f=()=>{o&&o(),window.removeEventListener("message",p),l=void 0}},stop:M,destroy:()=>{M(),u.clear(),c&&(c.forEach((e=>{e.port1.close(),e.port2.close()})),c.clear())}}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getOriginFromMessage({ origin }: MessageEvent): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function getOriginFromMessage({origin:n}){return n&&"null"!==n&&"undefined"!==n?n:"*"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function isIframeLoaded(e,{blank:t,complete:n}={}){if(!e.contentDocument)return!1;const{documentURI:o,readyState:c}=e.contentDocument;return(t||!!o&&"about:blank"!==o)&&(n?"complete"===c:"interactive"===c||"complete"===c)}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare const IFRAME_PING = "@_IFRAME_PING";
|
|
2
|
+
export declare const IFRAME_HOST_READY = "@_IFRAME_HOST_READY";
|
|
3
|
+
export declare const IFRAME_CLIENT_READY = "@_IFRAME_CLIENT_READY";
|
|
4
|
+
export type MessagesTypes = {
|
|
5
|
+
readonly Ping: string;
|
|
6
|
+
readonly TargetReady: string;
|
|
7
|
+
readonly SelfReady: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function getHostMessages(): MessagesTypes;
|
|
10
|
+
export declare function getClientMessages(): MessagesTypes;
|
|
11
|
+
export interface IframeMessage<T extends keyof MessagesTypes = keyof MessagesTypes> {
|
|
12
|
+
readonly uid: string;
|
|
13
|
+
readonly type: MessagesTypes[T];
|
|
14
|
+
}
|
|
15
|
+
export interface IframeDataMessage<T extends keyof MessagesTypes = keyof MessagesTypes, D = unknown> extends IframeMessage<T> {
|
|
16
|
+
readonly data: D;
|
|
17
|
+
}
|
|
18
|
+
export declare function isPingMessage(data: unknown, messagesTypes: MessagesTypes): data is IframeMessage<'Ping'>;
|
|
19
|
+
export declare function isTargetReadyMessage<T>(data: unknown, messagesTypes: MessagesTypes): data is IframeDataMessage<'TargetReady', T>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const IFRAME_PING="@_IFRAME_PING";export const IFRAME_HOST_READY="@_IFRAME_HOST_READY";export const IFRAME_CLIENT_READY="@_IFRAME_CLIENT_READY";export function getHostMessages(){return{Ping:IFRAME_PING,SelfReady:IFRAME_HOST_READY,TargetReady:IFRAME_CLIENT_READY}}export function getClientMessages(){return{Ping:IFRAME_PING,SelfReady:IFRAME_CLIENT_READY,TargetReady:IFRAME_HOST_READY}}export function isPingMessage(e,t){return!!e&&e.type===t.Ping}export function isTargetReadyMessage(e,t){return!!e&&e.type===t.TargetReady}
|
package/iframe/utils.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function selectFrames(){return document.getElementsByTagName("iframe")}export function findTarget(e,t){for(let n=0;n<t.length;n+=1){const r=t[n];if((r instanceof HTMLIFrameElement?r.contentWindow:r)===e)return r}}
|
package/imageToBlob.d.ts
ADDED
package/imageToBlob.js
ADDED
|
@@ -0,0 +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;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isImageTypeSupported(mimeType: string): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function isImageTypeSupported(t){try{return document.createElement("canvas").toDataURL(t).startsWith(`data:${t}`)}catch(t){return!1}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function isStandaloneApp(){return window.matchMedia("(display-mode: standalone)").matches}export default isStandaloneApp;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isWebPSupported(feature?: 'lossy' | 'lossless' | 'alpha' | 'animation'): Promise<boolean>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{__awaiter}from"tslib";export function isWebPSupported(A="lossy"){return __awaiter(this,void 0,void 0,(function*(){const o={lossy:"UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",lossless:"UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==",alpha:"UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA==",animation:"UklGRlIAAABXRUJQVlA4WAoAAAASAAAAAAAAAAAAQU5JTQYAAAD/////AABBTk1GJgAAAAAAAAAAAAAAAAAAAGQAAABWUDhMDQAAAC8AAAAQBxAREYiI/gcA"},i=new Image;return new Promise((Q=>{i.onload=()=>Q(i.width>0&&i.height>0),i.onerror=()=>Q(!1),i.src=`data:image/webp;base64,${o[A]}`}))}))}
|
package/loadImage.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Don't worry, it uses cached by browser image if url already loaded previously otherwise cache the image. */
|
|
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
ADDED
|
@@ -0,0 +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;
|
package/loadScript.d.ts
ADDED
package/loadScript.js
ADDED
|
@@ -0,0 +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)}}))}))}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare function attachMediaStream(media: HTMLMediaElement, stream: MediaStream | undefined): void;
|
|
2
|
+
export declare function removeTrack(mediaStream: MediaStream, track: MediaStreamTrack): void;
|
|
3
|
+
export declare function addTrack(mediaStream: MediaStream, track: MediaStreamTrack, onEnded?: VoidFunction | undefined): void;
|
|
4
|
+
export declare class MediaStreamController {
|
|
5
|
+
private mediaStream;
|
|
6
|
+
private media;
|
|
7
|
+
constructor(mediaStream: MediaStream);
|
|
8
|
+
attachMedia(media: HTMLMediaElement): void;
|
|
9
|
+
detachMedia(): void;
|
|
10
|
+
updateStream(stream: MediaStream): void;
|
|
11
|
+
removeTrack(track: MediaStreamTrack): void;
|
|
12
|
+
addTrack(track: MediaStreamTrack, onEnded?: VoidFunction | undefined): void;
|
|
13
|
+
reset(): void;
|
|
14
|
+
destroy(): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{resetMedia}from"./resetMedia";export function attachMediaStream(e,t){t&&t.active&&e.muted&&0===t.getVideoTracks().filter((e=>!e.getSettings().displaySurface)).length?e.srcObject=null:e.srcObject=t&&t.active?t:null}export function removeTrack(e,t){e.removeTrack(t),e.dispatchEvent(new MediaStreamTrackEvent("removetrack",{track:t}))}export function addTrack(e,t,a){e.addTrack(t),e.dispatchEvent(new MediaStreamTrackEvent("addtrack",{track:t})),t.addEventListener("ended",(()=>{removeTrack(e,t),a&&a()}),{once:!0})}export class MediaStreamController{constructor(e){this.mediaStream=e}attachMedia(e){this.media=e,attachMediaStream(e,this.mediaStream)}detachMedia(){if(this.media){const{media:e}=this;this.media=void 0,resetMedia(e)}}updateStream(e){if(this.mediaStream===e)return;const{media:t}=this;this.mediaStream=e,t&&this.attachMedia(t)}removeTrack(e){removeTrack(this.mediaStream,e)}addTrack(e,t){addTrack(this.mediaStream,e,(()=>{this.removeTrack(e),t&&t()}))}reset(){this.mediaStream.getTracks().forEach((e=>{e.stop(),this.removeTrack(e)}))}destroy(){this.detachMedia(),this.reset()}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getDurationTime(media: Pick<HTMLMediaElement, 'duration'>): number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function getDurationTime(i){return Number.isFinite(i.duration)&&i.duration>=0?i.duration:NaN}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isMediaSeekable(media: HTMLMediaElement): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getTimeRangeDuration}from"./timeRanges";export function isMediaSeekable(e){return getTimeRangeDuration(e.seekable)>0}
|
package/media/mse.d.ts
ADDED
package/media/mse.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function getMediaSource(){return window.MediaSource||window.WebKitMediaSource}export function isMSESupported(){return!!getMediaSource()}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function resetMedia(e){(e.src||e.srcObject)&&(URL.revokeObjectURL(e.src),e.removeAttribute("src"),e.srcObject=null,e.load())}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function getTimeRangeStart(e){return e.length>0?e.start(e.length-1):0}export function getTimeRangeEnd(e){return e.length>0?e.end(e.length-1):0}export function getTimeRangeDuration(e){return getTimeRangeEnd(e)-getTimeRangeStart(e)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function toggleNativeSubtitles(e,o){for(let n=0;n<o.length;n+=1){const t=o[n];e?t.ignoreChange=!0:delete t.ignoreChange,e&&"hidden"===t.mode?t.mode="showing":e||"showing"!==t.mode||(t.mode="hidden")}}
|
package/onDOMReady.d.ts
ADDED
package/onDOMReady.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function onDOMReady(e){return"loading"===document.readyState?document.addEventListener("DOMContentLoaded",e,{once:!0}):e(),()=>{document.removeEventListener("DOMContentLoaded",e)}}export default onDOMReady;
|
package/onPageReady.d.ts
ADDED
package/onPageReady.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function isPageReady(){return"complete"===document.readyState}export function onPageReady(e){return isPageReady()?e():window.addEventListener("load",e,{once:!0}),()=>{window.removeEventListener("load",e)}}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@js-toolkit/web-utils",
|
|
3
|
+
"version": "1.47.0",
|
|
4
|
+
"description": "Web utils",
|
|
5
|
+
"author": "VZH",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/js-toolkit/web-utils"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"clean": "rimraf dist/*",
|
|
13
|
+
"copy:configs": "copyfiles package.json .npmignore README.md LICENSE ./dist/",
|
|
14
|
+
"minify": "node-utils-minify --replace ./dist",
|
|
15
|
+
"build": "npm run clean && tsc --build ./tsconfig.json && npm run minify",
|
|
16
|
+
"patch-publish": "npm run build && npm version patch --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 --no-workspaces-update -m 'v%s' && npm run copy:configs && cd ./dist && npm publish --access public && git push origin master --follow-tags"
|
|
18
|
+
},
|
|
19
|
+
"optionalDependencies": {
|
|
20
|
+
"@js-toolkit/node-utils": "^1.1.4"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@js-toolkit/configs": "^3.87.5",
|
|
24
|
+
"@js-toolkit/utils": "^1.49.1",
|
|
25
|
+
"@types/ua-parser-js": "^0.7.36",
|
|
26
|
+
"@types/uuid": "^9.0.2",
|
|
27
|
+
"@typescript-eslint/eslint-plugin": "^6.3.0",
|
|
28
|
+
"@typescript-eslint/parser": "^6.3.0",
|
|
29
|
+
"copyfiles": "^2.4.1",
|
|
30
|
+
"eslint": "^8.47.0",
|
|
31
|
+
"eslint-config-airbnb-base": "^15.0.0",
|
|
32
|
+
"eslint-config-prettier": "^9.0.0",
|
|
33
|
+
"eslint-plugin-import": "^2.28.0",
|
|
34
|
+
"eslint-plugin-prettier": "^5.0.0",
|
|
35
|
+
"eventemitter3": "^5.0.1",
|
|
36
|
+
"prettier": "^3.0.1",
|
|
37
|
+
"reconnecting-websocket": "^4.4.0",
|
|
38
|
+
"rimraf": "^5.0.1",
|
|
39
|
+
"terser": "^5.19.2",
|
|
40
|
+
"typescript": "^5.1.6",
|
|
41
|
+
"ua-parser-js": "^1.0.35",
|
|
42
|
+
"uuid": "^9.0.0",
|
|
43
|
+
"webpack": "^5.88.2",
|
|
44
|
+
"yargs": "^17.7.2"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getNavigationTiming(): Promise<PerformanceNavigationTiming | undefined>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{onPageReady}from"../onPageReady";export function getNavigationTiming(){return new Promise((e=>{onPageReady((()=>setTimeout((()=>{var o;try{const n=null===(o=window.performance)||void 0===o?void 0:o.getEntriesByType("navigation")[0];e(n)}catch(o){e(void 0)}}),0)))}))}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function preventDefault(e){(null==e.cancelable||e.cancelable)&&e.preventDefault()}export default preventDefault;
|
package/rafCallback.d.ts
ADDED
package/rafCallback.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function rafCallback(n){let a=0;const e=(...e)=>{a=requestAnimationFrame((()=>n(...e)))};return e.cancel=()=>cancelAnimationFrame(a),e}
|
package/saveFileAs.d.ts
ADDED
package/saveFileAs.js
ADDED
|
@@ -0,0 +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;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface Config {
|
|
2
|
+
onUpdate?(registration: ServiceWorkerRegistration): void;
|
|
3
|
+
onSuccess?(registration: ServiceWorkerRegistration): void;
|
|
4
|
+
}
|
|
5
|
+
export declare const UpdateEventType = "SW:UPDATE";
|
|
6
|
+
export declare function register(config?: Config | undefined): void;
|
|
7
|
+
export declare function unregister(): void;
|
|
8
|
+
export declare function addUpdateListener(callback: VoidFunction): void;
|
package/serviceWorker.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import appEnv from"@js-toolkit/configs/appEnv";import buildConfig from"@js-toolkit/configs/buildConfig";const logPrefix="SW:";export const UpdateEventType="SW:UPDATE";const isLocalhost=Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||new RegExp(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/).exec(window.location.hostname));function registerValidSW(e,o){navigator.serviceWorker.register(e).then((e=>{e.onupdatefound=()=>{const r=e.installing;null!=r&&(r.onstatechange=()=>{"installed"===r.state&&(navigator.serviceWorker.controller?(console.log(logPrefix,"New content is available and will be used when all tabs for this page are closed. See https://cra.link/PWA."),window.dispatchEvent(new Event(UpdateEventType)),o&&o.onUpdate&&o.onUpdate(e)):(console.log(logPrefix,"Content is cached for offline use."),o&&o.onSuccess&&o.onSuccess(e)))},r.onerror=e=>{console.error(logPrefix,"Installing worker:",e)})}})).catch((e=>{console.error(logPrefix,"Error during service worker registration:",e.message||e)}))}function checkValidServiceWorker(e,o){return fetch(e,{headers:{"Service-Worker":"script"}}).then((r=>{const n=r.headers.get("content-type");404===r.status||null!=n&&!n.includes("javascript")?navigator.serviceWorker.ready.then((e=>{e.unregister().then((()=>{window.location.reload()}))})):registerValidSW(e,o)})).catch((()=>{console.log(logPrefix,"No internet connection found. App is running in offline mode.")}))}export function register(e){if(appEnv.prod&&"serviceWorker"in navigator){const o=buildConfig.client||buildConfig.default.client;if(new URL(o.output.publicPath,window.location.href).origin!==window.location.origin)return void console.warn(logPrefix,"Origins are different.");window.addEventListener("load",(()=>{const r=`${o.output.publicPath}${o.output.sw.swDest}`;isLocalhost?(checkValidServiceWorker(r,e),navigator.serviceWorker.ready.then((()=>{console.log(logPrefix,"This web app is being served cache-first by a service worker. To learn more, visit https://bit.ly/CRA-PWA")}))):registerValidSW(r,e)}))}}export function unregister(){"serviceWorker"in navigator&&navigator.serviceWorker.ready.then((e=>e.unregister())).catch((e=>{console.error(logPrefix,"Error during service worker unregister:",e.message||e)}))}export function addUpdateListener(e){window.addEventListener(UpdateEventType,e)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function stopPropagation(o){o.stopPropagation()}export default stopPropagation;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function get2dContextError(): Error;
|
|
2
|
+
export interface TakeSnapshotOptions {
|
|
3
|
+
width?: number | undefined;
|
|
4
|
+
height?: number | undefined;
|
|
5
|
+
type?: string | undefined;
|
|
6
|
+
quality?: number | undefined;
|
|
7
|
+
}
|
|
8
|
+
export declare function takeSnapshot(element: CanvasImageSource, { width, height, type, quality, }?: TakeSnapshotOptions): string;
|
|
9
|
+
export declare function takeSnapshotAsync(element: CanvasImageSource, { width, height, type, quality, }?: TakeSnapshotOptions): Promise<Blob>;
|
package/takeSnapshot.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{hasIn}from"@jstoolkit/utils/hasIn";export function get2dContextError(){return new Error("Failed to get canvas 2d context.")}const getDefaultWidth=t=>t instanceof HTMLVideoElement?t.videoWidth:hasIn(t,"displayWidth")?t.displayWidth:t.width instanceof SVGAnimatedLength?t.width.animVal.value:t.width,getDefaultHeight=t=>t instanceof HTMLVideoElement?t.videoHeight:hasIn(t,"displayHeight")?t.displayHeight:t.height instanceof SVGAnimatedLength?t.height.animVal.value:t.height;export function takeSnapshot(t,{width:e=getDefaultWidth(t),height:i=getDefaultHeight(t),type:n="image/jpeg",quality:a=1}={}){const o=document.createElement("canvas");o.width=e,o.height=i;const h=o.getContext("2d");if(!h)throw get2dContextError();return h.drawImage(t,0,0),o.toDataURL(n,a)}export function takeSnapshotAsync(t,{width:e=getDefaultWidth(t),height:i=getDefaultHeight(t),type:n="image/jpeg",quality:a=1}={}){return new Promise(((o,h)=>{const d=document.createElement("canvas");d.width=e,d.height=i;const g=d.getContext("2d");if(!g)throw get2dContextError();g.drawImage(t,0,0),d.toBlob((t=>{null==t?h(new Error("Unable get blob")):o(t)}),n,a)}))}
|
package/toBase64.d.ts
ADDED
package/toBase64.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function toBase64(e){return window.btoa(unescape(encodeURIComponent(e)))}export default toBase64;
|
package/toLocalPoint.js
ADDED
|
@@ -0,0 +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;
|
package/types/index.d.ts
ADDED
package/types/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
package/types/refs.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import '@jstoolkit/utils/types';
|
package/types/refs.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"@jstoolkit/utils/types";
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import DataEventEmitter, { type DataEventListener, type DataEventMap } from '@jstoolkit/utils/DataEventEmitter';
|
|
2
|
+
import * as sdpUtils from './sdputils';
|
|
3
|
+
export declare class PeerConnection extends DataEventEmitter<PeerConnection.EventMap, PeerConnection> {
|
|
4
|
+
readonly options: PeerConnection.Options;
|
|
5
|
+
get Events(): typeof PeerConnection.Events;
|
|
6
|
+
readonly logger: Pick<Console, "debug" | "warn">;
|
|
7
|
+
private pc;
|
|
8
|
+
constructor(options?: PeerConnection.Options);
|
|
9
|
+
private clear;
|
|
10
|
+
private createPC;
|
|
11
|
+
private setLocalDescription;
|
|
12
|
+
private setRemoteDescription;
|
|
13
|
+
isConnected(): boolean;
|
|
14
|
+
isClosed(): boolean;
|
|
15
|
+
/** Add icecandidate when the clients is exchanging icecandidates. */
|
|
16
|
+
addIceCandidate(candidate: RTCIceCandidateInit | RTCIceCandidate): Promise<void>;
|
|
17
|
+
/** Add stream to the remote peer if needed. */
|
|
18
|
+
attachStream(stream: MediaStream): void;
|
|
19
|
+
/**
|
|
20
|
+
* Remove ended tracks and unknown tracks and invoke `attachStream`.
|
|
21
|
+
* If stream is not passed then all tracks will be removed.
|
|
22
|
+
*/
|
|
23
|
+
reattachStream(stream: MediaStream | undefined): void;
|
|
24
|
+
/** A call to establish a connection. */
|
|
25
|
+
createOffer(): Promise<RTCSessionDescriptionInit>;
|
|
26
|
+
/** A call from another client which received an offer. */
|
|
27
|
+
createAnswer(offer: RTCSessionDescriptionInit): Promise<RTCSessionDescriptionInit>;
|
|
28
|
+
/** Apply answer from another client after calling `createOffer`. */
|
|
29
|
+
applyAnswer(remoteDesc: RTCSessionDescriptionInit): Promise<RTCSessionDescriptionInit>;
|
|
30
|
+
reconnect(): void;
|
|
31
|
+
/** After calling this method the connection can no longer be used unless `reconnect` will be called. */
|
|
32
|
+
close(): void;
|
|
33
|
+
destroy(): void;
|
|
34
|
+
}
|
|
35
|
+
export declare namespace PeerConnection {
|
|
36
|
+
interface Options {
|
|
37
|
+
readonly offerOptions?: RTCOfferOptions;
|
|
38
|
+
readonly rtc?: RTCConfiguration;
|
|
39
|
+
readonly codecs?: sdpUtils.PreferCodecs;
|
|
40
|
+
readonly logger?: Pick<Console, 'warn' | 'debug'>;
|
|
41
|
+
readonly id?: string;
|
|
42
|
+
}
|
|
43
|
+
enum Events {
|
|
44
|
+
/** IceCandidate for exchanging. */
|
|
45
|
+
LocalIceCandidate = "LocalIceCandidate",
|
|
46
|
+
EndOfIceCandidates = "EndOfIceCandidates",
|
|
47
|
+
/** The connection is established. */
|
|
48
|
+
Connected = "Connected",
|
|
49
|
+
/** The remote client closed a connection or connection is failed. */
|
|
50
|
+
Disconnected = "Disconnected",
|
|
51
|
+
RemoteStreamChanged = "RemoteStreamChanged",
|
|
52
|
+
ReinitializingConnectionRequired = "ReinitializingConnectionRequired",
|
|
53
|
+
Closed = "Closed"
|
|
54
|
+
}
|
|
55
|
+
type EventMap = DataEventMap<DefineAll<Events, {
|
|
56
|
+
[Events.LocalIceCandidate]: [RTCIceCandidate];
|
|
57
|
+
[Events.EndOfIceCandidates]: [];
|
|
58
|
+
[Events.Connected]: [];
|
|
59
|
+
[Events.Disconnected]: [];
|
|
60
|
+
[Events.RemoteStreamChanged]: [MediaStream];
|
|
61
|
+
[Events.ReinitializingConnectionRequired]: [];
|
|
62
|
+
[Events.Closed]: [];
|
|
63
|
+
}>, PeerConnection>;
|
|
64
|
+
type EventHandler<T extends Events = Events> = DataEventListener<EventMap, T, PeerConnection>;
|
|
65
|
+
type EventHandlerMap<T extends Events = Events> = {
|
|
66
|
+
[P in T]: EventHandler<P>;
|
|
67
|
+
};
|
|
68
|
+
}
|