@js-toolkit/web-utils 1.64.0 → 1.64.2

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.
@@ -7,7 +7,7 @@ declare global {
7
7
  webkitSupportsFullscreen?: boolean | undefined;
8
8
  }
9
9
  }
10
- export declare class FullscreenController extends EventEmitter<FullscreenController.EventMap> implements AsyncDisposable {
10
+ export declare class FullscreenController extends EventEmitter<FullscreenController.EventMap, FullscreenController> implements AsyncDisposable {
11
11
  private readonly element;
12
12
  private options;
13
13
  static isApiAvailable(): boolean;
@@ -44,7 +44,7 @@ export declare namespace FullscreenController {
44
44
  Change = "change",
45
45
  Error = "error"
46
46
  }
47
- type EventMap = DefineAll<Events, {
47
+ type EventMap = EventEmitter.EventMap<DefineAll<Events, {
48
48
  [Events.Change]: [{
49
49
  fullscreen: boolean;
50
50
  type: FullscreenType;
@@ -53,7 +53,7 @@ export declare namespace FullscreenController {
53
53
  error: unknown;
54
54
  type: FullscreenType;
55
55
  }];
56
- }>;
56
+ }>, FullscreenController>;
57
57
  type EventHandler<T extends Events = Events> = EventEmitter.EventListener<EventMap, T, FullscreenController>;
58
58
  type EventHandlerMap<T extends Events = Events> = {
59
59
  [P in T]: EventHandler<P>;
package/README.md CHANGED
@@ -2,4 +2,40 @@
2
2
 
3
3
  [![npm package](https://img.shields.io/npm/v/@js-toolkit/web-utils.svg?style=flat-square)](https://www.npmjs.org/package/@js-toolkit/web-utils)
4
4
 
5
- Useful utils for browser environment.
5
+ A lightweight utility library for common operations in the browser environment. This package simplifies tasks such as DOM manipulation, event handling, and other browser-related utilities.
6
+
7
+ ## Installation
8
+
9
+ Install the library via npm:
10
+
11
+ ```bash
12
+ yarn add @js-toolkit/web-utils
13
+ # or
14
+ npm install @js-toolkit/web-utils
15
+ ```
16
+
17
+ # Usage
18
+
19
+ Here’s an example of how to use the library:
20
+
21
+ ```ts
22
+ import { getRandomID } from '@js-toolkit/web-utils/getRandomID';
23
+
24
+ const id = getRandomID();
25
+ ```
26
+
27
+ # Features
28
+
29
+ - Simplifies common browser tasks
30
+ - Lightweight and fast
31
+ - Easy to integrate with other JavaScript projects
32
+
33
+ # Contributing
34
+
35
+ Contributions are welcome! Please follow these steps:
36
+
37
+ 1. Fork the repository.
38
+ 1. Create a new branch (git checkout -b feature/my-feature-name).
39
+ 1. Commit your changes (git commit -m 'Add some feature').
40
+ 1. Push the branch (git push origin feature/my-feature-name).
41
+ 1. Open a pull request.
@@ -1 +1 @@
1
- export function resetMedia(e){(e.src||e.srcObject||e.childElementCount>0)&&(URL.revokeObjectURL(e.src),e.removeAttribute("src"),e.srcObject=null,e.childElementCount>0&&Array.prototype.filter.call(e.children,(e=>e instanceof HTMLSourceElement)).forEach((r=>e.removeChild(r))),e.load())}
1
+ export function resetMedia(e){(e.src||e.srcObject||e.childElementCount>0)&&(URL.revokeObjectURL(e.src),e.removeAttribute("src"),e.srcObject=null,e.childElementCount>0&&Array.prototype.filter.call(e.children,(e=>e instanceof HTMLSourceElement)).forEach((r=>{URL.revokeObjectURL(r.src),e.removeChild(r)})),e.load())}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@js-toolkit/web-utils",
3
- "version": "1.64.0",
3
+ "version": "1.64.2",
4
4
  "description": "Web utils",
5
5
  "author": "VZH",
6
6
  "license": "MIT",
@@ -20,30 +20,30 @@
20
20
  "@js-toolkit/node-utils": "^1.2.1"
21
21
  },
22
22
  "devDependencies": {
23
- "@eslint/compat": "^1.2.8",
23
+ "@eslint/compat": "^1.2.9",
24
24
  "@eslint/eslintrc": "^3.3.1",
25
- "@eslint/js": "^9.25.0",
26
- "@js-toolkit/configs": "^3.94.2",
25
+ "@eslint/js": "^9.27.0",
26
+ "@js-toolkit/configs": "^3.94.3",
27
27
  "@js-toolkit/utils": "^1.59.2",
28
28
  "@types/eslint": "^9.6.1",
29
29
  "@types/lodash.throttle": "^4.1.9",
30
30
  "@types/uuid": "^10.0.0",
31
31
  "copyfiles": "^2.4.1",
32
- "eslint": "^9.25.0",
33
- "eslint-config-prettier": "^10.1.2",
34
- "eslint-import-resolver-typescript": "^4.3.3",
32
+ "eslint": "^9.27.0",
33
+ "eslint-config-prettier": "^10.1.5",
34
+ "eslint-import-resolver-typescript": "^4.3.5",
35
35
  "eslint-plugin-import": "^2.31.0",
36
- "eslint-plugin-prettier": "^5.2.6",
36
+ "eslint-plugin-prettier": "^5.4.0",
37
37
  "lodash.throttle": "^4.1.1",
38
38
  "prettier": "^3.5.3",
39
39
  "reconnecting-websocket": "^4.4.0",
40
40
  "rimraf": "^6.0.1",
41
- "terser": "^5.39.0",
41
+ "terser": "^5.39.2",
42
42
  "typescript": "^5.8.3",
43
- "typescript-eslint": "^8.30.1",
43
+ "typescript-eslint": "^8.32.1",
44
44
  "ua-parser-js": "^2.0.3",
45
45
  "uuid": "^11.1.0",
46
- "webpack": "^5.99.6",
46
+ "webpack": "^5.99.8",
47
47
  "yargs": "^17.7.2"
48
48
  }
49
49
  }
@@ -0,0 +1,9 @@
1
+ type Methods = Pick<Console, 'debug' | 'error' | 'info' | 'log' | 'trace' | 'warn'>;
2
+ interface PatchConsoleLoggingOptions {
3
+ /** Defaults to 'replace'. */
4
+ readonly mode?: 'replace' | 'prepend' | 'append';
5
+ }
6
+ type CustomMethod = (level: keyof Methods, ...data: unknown[]) => void;
7
+ export declare function restoreConsoleLogging(): void;
8
+ export declare function patchConsoleLogging(customMethod: CustomMethod, { mode }?: PatchConsoleLoggingOptions): void;
9
+ export {};
@@ -0,0 +1 @@
1
+ const methods={debug:console.debug.bind(console),error:console.error.bind(console),info:console.info.bind(console),log:console.log.bind(console),trace:console.trace.bind(console),warn:console.warn.bind(console)};export function restoreConsoleLogging(){Object.entries(methods).forEach((([o,e])=>{console[o]=e}))}export function patchConsoleLogging(o,{mode:e="replace"}={}){restoreConsoleLogging(),Object.getOwnPropertyNames(methods).forEach((n=>{const s=n;console[s]=(...n)=>{"append"===e&&methods[s](...n),o(s,...n),"prepend"===e&&methods[s](...n)}}))}
@@ -4,7 +4,7 @@ import * as sdpUtils from './sdputils';
4
4
  export declare class PeerConnection extends EventEmitter<PeerConnection.EventMap, PeerConnection> implements Disposable {
5
5
  readonly options: PeerConnection.Options;
6
6
  get Events(): typeof PeerConnection.Events;
7
- readonly logger: Pick<log.Logger, "warn" | "debug">;
7
+ readonly logger: Pick<log.Logger, "debug" | "warn">;
8
8
  private pc;
9
9
  constructor(options?: PeerConnection.Options);
10
10
  private clear;
@@ -1 +1 @@
1
- import{EventEmitter}from"@js-toolkit/utils/EventEmitter";import{getErrorMessage}from"@js-toolkit/utils/getErrorMessage";import{hasIn}from"@js-toolkit/utils/hasIn";import log from"@js-toolkit/utils/log";import*as sdpUtils from"./sdputils";export class PeerConnection extends EventEmitter{options;get Events(){return PeerConnection.Events}logger;pc;constructor(e={}){super(),this.options=e,this.logger=e.logger??log.getLogger("PeerConnection"),this.pc=this.createPC()}clear(){this.pc.onsignalingstatechange=null,this.pc.onconnectionstatechange=null,this.pc.oniceconnectionstatechange=null,this.pc.ontrack=null,this.pc.onnegotiationneeded=null,this.pc.onicecandidate=null,this.pc.onicecandidateerror=null}createPC(){const e=new RTCPeerConnection(this.options.rtc);return e.onsignalingstatechange=()=>{this.logger.debug(`Signaling state changed to: ${e.signalingState}`),"closed"===e.signalingState&&(this.emit(this.Events.Closed),this.clear())},hasIn(RTCPeerConnection.prototype,"onconnectionstatechange")?e.onconnectionstatechange=()=>{this.logger.debug(`Connection state changed to: ${e.connectionState}`),"connected"===e.connectionState?this.emit(this.Events.Connected):"disconnected"===e.connectionState&&this.emit(this.Events.Disconnected)}:e.oniceconnectionstatechange=()=>{this.logger.debug(`ICE connection state changed to: ${e.iceConnectionState}`),"connected"===e.iceConnectionState?this.emit(this.Events.Connected):"disconnected"===e.iceConnectionState&&this.emit(this.Events.Disconnected)},e.ontrack=({streams:e,track:t})=>{if(this.logger.debug("Remote stream received.",e.length,t.kind),0===e.length)return;const[n]=e;n.onremovetrack=()=>{this.logger.debug("onremovetrack"),this.emit(this.Events.RemoteStreamChanged,n)},n.onaddtrack=()=>{this.logger.debug("onaddtrack"),this.emit(this.Events.RemoteStreamChanged,n)},this.emit(this.Events.RemoteStreamChanged,n)},e.onnegotiationneeded=()=>{const{iceConnectionState:t}=e;"connected"!==t&&"completed"!==t||(this.logger.debug("Reinitializing connection..."),this.emit(this.Events.ReinitializingConnectionRequired))},e.onicecandidate=({candidate:e})=>{e?sdpUtils.isValidIceCandidate(e)&&this.emit(this.Events.LocalIceCandidate,e):this.emit(this.Events.EndOfIceCandidates)},e.onicecandidateerror=e=>{if(e instanceof RTCPeerConnectionIceErrorEvent){const{errorCode:t,errorText:n,hostCandidate:i,url:o}=e;this.logger.warn(`ICE candidate error: errorCode=${t}, errorText=${n}, hostCandidate=${i}, url=${o}`)}else this.logger.warn(`ICE candidate error: ${getErrorMessage(e)}`)},e}async setLocalDescription(e,t){const n=sdpUtils.prepareLocalDescription(t,this.options.codecs);return await e.setLocalDescription(n),n}async setRemoteDescription(e,t){const n=sdpUtils.prepareRemoteDescription(t,this.options.codecs);return await e.setRemoteDescription(n),n}isConnected(){return"connected"===this.pc.iceConnectionState||"completed"===this.pc.iceConnectionState}isClosed(){return"closed"===this.pc.signalingState}addIceCandidate(e){return this.pc.addIceCandidate(e)}attachStream(e){const t=this.pc.getSenders(),n=t.length?e.getTracks().filter((e=>!t.find((({track:t})=>!!t&&t.id===e.id)))):e.getTracks();n.length?(n.forEach((t=>this.pc.addTrack(t,e))),this.logger.debug(`Attached ${n.length} track(s) to a peer connection.`)):this.logger.debug("No tracks to attach to a peer connection.")}reattachStream(e){const t=this.pc.iceConnectionState;if("new"!==t&&"connected"!==t&&"completed"!==t)return;const n=e?e.getTracks():[];this.pc.getSenders().forEach((e=>{const{track:t}=e;!t||"ended"!==t.readyState&&n.find((e=>e.id===t.id))||(this.pc.removeTrack(e),this.logger.debug(`'${t&&t.kind}' track is removed from a peer connection.`))})),e&&this.attachStream(e)}async createOffer(){const e=await this.pc.createOffer(this.options.offerOptions);return this.setLocalDescription(this.pc,e)}async createAnswer(e){await this.setRemoteDescription(this.pc,e);const t=await this.pc.createAnswer(this.options.offerOptions);return this.setLocalDescription(this.pc,t)}applyAnswer(e){return this.setRemoteDescription(this.pc,e)}reconnect(){this.close(),this.pc=this.createPC()}close(){this.pc.close(),this.pc.onsignalingstatechange&&(this.emit(this.Events.Closed),this.clear())}destroy(){this.close(),this.removeAllListeners()}[Symbol.dispose](){this.destroy()}}!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{EventEmitter}from"@js-toolkit/utils/EventEmitter";import{getErrorMessage}from"@js-toolkit/utils/getErrorMessage";import{hasIn}from"@js-toolkit/utils/hasIn";import log from"@js-toolkit/utils/log";import*as sdpUtils from"./sdputils";export class PeerConnection extends EventEmitter{options;get Events(){return PeerConnection.Events}logger;pc;constructor(e={}){super(),this.options=e,this.logger=e.logger??log.getLogger("PeerConnection"),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);e.onsignalingstatechange=()=>{this.logger.debug(`Signaling state changed to: ${e.signalingState}`),"closed"===e.signalingState&&(this.emit(this.Events.Closed),this.clear())};const t=e=>{this.logger.debug(`Connection state changed to: ${e}`),"connected"===e?this.emit(this.Events.Connected):"disconnected"===e&&this.emit(this.Events.Disconnected)};return hasIn(RTCPeerConnection.prototype,"onconnectionstatechange")?e.onconnectionstatechange=()=>t(e.connectionState):e.oniceconnectionstatechange=()=>t(e.iceConnectionState),e.ontrack=({streams:e,track:t})=>{if(this.logger.debug("Remote stream received.",e.length,t.kind),0===e.length)return;const[n]=e;n.onremovetrack=()=>{this.logger.debug("onremovetrack"),this.emit(this.Events.RemoteStreamChanged,n)},n.onaddtrack=()=>{this.logger.debug("onaddtrack"),this.emit(this.Events.RemoteStreamChanged,n)},this.emit(this.Events.RemoteStreamChanged,n)},e.onnegotiationneeded=()=>{const{iceConnectionState:t}=e;"connected"!==t&&"completed"!==t||(this.logger.debug("Reinitializing connection..."),this.emit(this.Events.ReinitializingConnectionRequired))},e.onicecandidate=({candidate:e})=>{e?sdpUtils.isValidIceCandidate(e)&&this.emit(this.Events.LocalIceCandidate,e):this.emit(this.Events.EndOfIceCandidates)},e.onicecandidateerror=e=>{if(e instanceof RTCPeerConnectionIceErrorEvent){const{errorCode:t,errorText:n,hostCandidate:i,url:o}=e;this.logger.warn(`ICE candidate error: errorCode=${t}, errorText=${n}, hostCandidate=${i}, url=${o}`)}else this.logger.warn(`ICE candidate error: ${getErrorMessage(e)}`)},e}async setLocalDescription(e,t){const n=sdpUtils.prepareLocalDescription(t,this.options.codecs);return await e.setLocalDescription(n),n}async setRemoteDescription(e,t){const n=sdpUtils.prepareRemoteDescription(t,this.options.codecs);return await e.setRemoteDescription(n),n}isConnected(){return"connected"===this.pc.iceConnectionState||"completed"===this.pc.iceConnectionState}isClosed(){return"closed"===this.pc.signalingState}addIceCandidate(e){return this.pc.addIceCandidate(e)}attachStream(e){const t=this.pc.getSenders(),n=t.length?e.getTracks().filter((e=>!t.find((({track:t})=>!!t&&t.id===e.id)))):e.getTracks();n.length?(n.forEach((t=>this.pc.addTrack(t,e))),this.logger.debug(`Attached ${n.length} track(s) to a peer connection.`)):this.logger.debug("No tracks to attach to a peer connection.")}reattachStream(e){const t=this.pc.iceConnectionState;if("new"!==t&&"connected"!==t&&"completed"!==t)return;const n=e?e.getTracks():[];this.pc.getSenders().forEach((e=>{const{track:t}=e;!t||"ended"!==t.readyState&&n.find((e=>e.id===t.id))||(this.pc.removeTrack(e),this.logger.debug(`'${t&&t.kind}' track is removed from a peer connection.`))})),e&&this.attachStream(e)}async createOffer(){const e=await this.pc.createOffer(this.options.offerOptions);return this.setLocalDescription(this.pc,e)}async createAnswer(e){await this.setRemoteDescription(this.pc,e);const t=await this.pc.createAnswer(this.options.offerOptions);return this.setLocalDescription(this.pc,t)}applyAnswer(e){return this.setRemoteDescription(this.pc,e)}reconnect(){this.close(),this.pc=this.createPC()}close(){this.pc.close(),this.pc.onsignalingstatechange&&(this.emit(this.Events.Closed),this.clear())}destroy(){this.close(),this.removeAllListeners()}[Symbol.dispose](){this.destroy()}}!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={}));