@wetspace/wetrtc 3.0.2 → 4.0.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 (139) hide show
  1. package/README.md +156 -29
  2. package/dist/es/__test__/codec-preference.test.js +36 -0
  3. package/dist/es/__test__/codec-preference.test.js.map +1 -0
  4. package/dist/es/__test__/data-manager.test.js +60 -0
  5. package/dist/es/__test__/data-manager.test.js.map +1 -0
  6. package/dist/es/__test__/fsm.test.js +33 -0
  7. package/dist/es/__test__/fsm.test.js.map +1 -0
  8. package/dist/es/__test__/media-manager.test.js +41 -0
  9. package/dist/es/__test__/media-manager.test.js.map +1 -0
  10. package/dist/es/__test__/signal-manager.test.js +100 -0
  11. package/dist/es/__test__/signal-manager.test.js.map +1 -0
  12. package/dist/es/__test__/wetrtc-lifecycle.test.js +152 -0
  13. package/dist/es/__test__/wetrtc-lifecycle.test.js.map +1 -0
  14. package/dist/es/data/data-manager.d.ts +37 -0
  15. package/dist/es/data/data-manager.d.ts.map +1 -0
  16. package/dist/es/data/data-manager.js +282 -0
  17. package/dist/es/data/data-manager.js.map +1 -0
  18. package/dist/es/data/types.d.ts +34 -0
  19. package/dist/es/data/types.d.ts.map +1 -0
  20. package/dist/es/data/types.js +0 -0
  21. package/dist/es/disposable.d.ts +12 -0
  22. package/dist/es/disposable.d.ts.map +1 -0
  23. package/dist/es/disposable.js +36 -0
  24. package/dist/es/disposable.js.map +1 -0
  25. package/dist/es/fsm.d.ts +26 -0
  26. package/dist/es/fsm.d.ts.map +1 -0
  27. package/dist/es/fsm.js +63 -0
  28. package/dist/es/fsm.js.map +1 -0
  29. package/dist/es/index.d.ts +22 -0
  30. package/dist/es/index.d.ts.map +1 -0
  31. package/dist/es/index.js +48 -0
  32. package/dist/es/index.js.map +1 -0
  33. package/dist/es/media/audio-encoding.d.ts +10 -0
  34. package/dist/es/media/audio-encoding.d.ts.map +1 -0
  35. package/dist/es/media/audio-encoding.js +41 -0
  36. package/dist/es/media/audio-encoding.js.map +1 -0
  37. package/dist/es/media/codec-preference.d.ts +11 -0
  38. package/dist/es/media/codec-preference.d.ts.map +1 -0
  39. package/dist/es/media/codec-preference.js +77 -0
  40. package/dist/es/media/codec-preference.js.map +1 -0
  41. package/dist/es/media/encoding-utils.d.ts +2 -0
  42. package/dist/es/media/encoding-utils.d.ts.map +1 -0
  43. package/dist/es/media/encoding-utils.js +8 -0
  44. package/dist/es/media/encoding-utils.js.map +1 -0
  45. package/dist/es/media/media-manager.d.ts +39 -0
  46. package/dist/es/media/media-manager.d.ts.map +1 -0
  47. package/dist/es/media/media-manager.js +121 -0
  48. package/dist/es/media/media-manager.js.map +1 -0
  49. package/dist/es/media/types.d.ts +25 -0
  50. package/dist/es/media/types.d.ts.map +1 -0
  51. package/dist/es/media/types.js +0 -0
  52. package/dist/es/media/video-encoding.d.ts +12 -0
  53. package/dist/es/media/video-encoding.d.ts.map +1 -0
  54. package/dist/es/media/video-encoding.js +60 -0
  55. package/dist/es/media/video-encoding.js.map +1 -0
  56. package/dist/es/signal/signal-manager.d.ts +45 -0
  57. package/dist/es/signal/signal-manager.d.ts.map +1 -0
  58. package/dist/es/signal/signal-manager.js +250 -0
  59. package/dist/es/signal/signal-manager.js.map +1 -0
  60. package/dist/es/signal/types.d.ts +26 -0
  61. package/dist/es/signal/types.d.ts.map +1 -0
  62. package/dist/es/signal/types.js +8 -0
  63. package/dist/es/signal/types.js.map +1 -0
  64. package/dist/es/stats/stats-monitor.d.ts +32 -0
  65. package/dist/es/stats/stats-monitor.d.ts.map +1 -0
  66. package/dist/es/stats/stats-monitor.js +191 -0
  67. package/dist/es/stats/stats-monitor.js.map +1 -0
  68. package/dist/es/stats/types.d.ts +33 -0
  69. package/dist/es/stats/types.d.ts.map +1 -0
  70. package/dist/es/stats/types.js +0 -0
  71. package/dist/es/utils/types.d.ts +46 -0
  72. package/dist/es/utils/types.d.ts.map +1 -0
  73. package/dist/es/utils/types.js +80 -0
  74. package/dist/es/utils/types.js.map +1 -0
  75. package/dist/es/wetrtc.d.ts +92 -0
  76. package/dist/es/wetrtc.d.ts.map +1 -0
  77. package/dist/es/wetrtc.js +403 -0
  78. package/dist/es/wetrtc.js.map +1 -0
  79. package/dist/lib/__test__/codec-preference.test.js +34 -0
  80. package/dist/lib/__test__/codec-preference.test.js.map +1 -0
  81. package/dist/lib/__test__/data-manager.test.js +61 -0
  82. package/dist/lib/__test__/data-manager.test.js.map +1 -0
  83. package/dist/lib/__test__/fsm.test.js +34 -0
  84. package/dist/lib/__test__/fsm.test.js.map +1 -0
  85. package/dist/lib/__test__/media-manager.test.js +42 -0
  86. package/dist/lib/__test__/media-manager.test.js.map +1 -0
  87. package/dist/lib/__test__/signal-manager.test.js +101 -0
  88. package/dist/lib/__test__/signal-manager.test.js.map +1 -0
  89. package/dist/lib/__test__/wetrtc-lifecycle.test.js +153 -0
  90. package/dist/lib/__test__/wetrtc-lifecycle.test.js.map +1 -0
  91. package/dist/lib/data/data-manager.js +306 -0
  92. package/dist/lib/data/data-manager.js.map +1 -0
  93. package/dist/lib/data/types.js +18 -0
  94. package/dist/lib/data/types.js.map +1 -0
  95. package/dist/lib/disposable.js +60 -0
  96. package/dist/lib/disposable.js.map +1 -0
  97. package/dist/lib/fsm.js +87 -0
  98. package/dist/lib/fsm.js.map +1 -0
  99. package/dist/lib/index.js +75 -0
  100. package/dist/lib/index.js.map +1 -0
  101. package/dist/lib/media/audio-encoding.js +66 -0
  102. package/dist/lib/media/audio-encoding.js.map +1 -0
  103. package/dist/lib/media/codec-preference.js +106 -0
  104. package/dist/lib/media/codec-preference.js.map +1 -0
  105. package/dist/lib/media/encoding-utils.js +32 -0
  106. package/dist/lib/media/encoding-utils.js.map +1 -0
  107. package/dist/lib/media/media-manager.js +145 -0
  108. package/dist/lib/media/media-manager.js.map +1 -0
  109. package/dist/lib/media/types.js +18 -0
  110. package/dist/lib/media/types.js.map +1 -0
  111. package/dist/lib/media/video-encoding.js +87 -0
  112. package/dist/lib/media/video-encoding.js.map +1 -0
  113. package/dist/lib/signal/signal-manager.js +274 -0
  114. package/dist/lib/signal/signal-manager.js.map +1 -0
  115. package/dist/lib/signal/types.js +32 -0
  116. package/dist/lib/signal/types.js.map +1 -0
  117. package/dist/lib/stats/stats-monitor.js +215 -0
  118. package/dist/lib/stats/stats-monitor.js.map +1 -0
  119. package/dist/lib/stats/types.js +18 -0
  120. package/dist/lib/stats/types.js.map +1 -0
  121. package/dist/lib/utils/types.js +108 -0
  122. package/dist/lib/utils/types.js.map +1 -0
  123. package/dist/lib/wetrtc.js +415 -0
  124. package/dist/lib/wetrtc.js.map +1 -0
  125. package/package.json +38 -42
  126. package/es/core/constant.d.ts +0 -6
  127. package/es/core/hook.d.ts +0 -31
  128. package/es/core/index.d.ts +0 -39
  129. package/es/index.d.ts +0 -6
  130. package/es/index.js +0 -1
  131. package/es/libs/index.d.ts +0 -41
  132. package/es/libs/record.d.ts +0 -8
  133. package/lib/core/constant.d.ts +0 -6
  134. package/lib/core/hook.d.ts +0 -31
  135. package/lib/core/index.d.ts +0 -39
  136. package/lib/index.d.ts +0 -6
  137. package/lib/index.js +0 -1
  138. package/lib/libs/index.d.ts +0 -41
  139. package/lib/libs/record.d.ts +0 -8
package/package.json CHANGED
@@ -1,42 +1,38 @@
1
- {
2
- "name": "@wetspace/wetrtc",
3
- "version": "3.0.2",
4
- "description": "wetrtc",
5
- "author": "tangjie <981955667@qq.com>",
6
- "license": "ISC",
7
- "main": "lib/index.js",
8
- "module": "es/index.js",
9
- "types": "es/index.d.ts",
10
- "keywords": [
11
- "component",
12
- "webrtc",
13
- "hooks",
14
- "react",
15
- "wetrtc"
16
- ],
17
- "sideEffects": [
18
- "./src/**/*.less",
19
- "./es/**/*.less",
20
- "./lib/**/*.less"
21
- ],
22
- "files": [
23
- "lib",
24
- "es"
25
- ],
26
- "publishConfig": {
27
- "registry": "https://registry.npmjs.org/",
28
- "access": "public"
29
- },
30
- "homepage": "https://wetspace.gitee.io/wetrtc/",
31
- "repository": {
32
- "type": "git",
33
- "url": "https://gitee.com/wetspace/wetrtc.git"
34
- },
35
- "scripts": {
36
- "start": "rollup -c -w",
37
- "build": "rm -fr lib && rm -fr es && set NODE_ENV=production&& rollup -c rollup.config.js"
38
- },
39
- "devDependencies": {
40
- "rollup": "^2.67.3"
41
- }
42
- }
1
+ {
2
+ "name": "@wetspace/wetrtc",
3
+ "version": "4.0.0",
4
+ "description": "Framework-agnostic WebRTC connection library",
5
+ "author": "tangjie <981955667@qq.com>",
6
+ "license": "MIT",
7
+ "main": "dist/es/index.js",
8
+ "module": "dist/es/index.js",
9
+ "types": "dist/es/index.d.ts",
10
+ "files": ["dist"],
11
+ "sideEffects": false,
12
+ "publishConfig": {
13
+ "registry": "https://registry.npmjs.org/",
14
+ "access": "public"
15
+ },
16
+ "homepage": "https://www.wetspace.top/docs/wetrtc/",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "https://gitee.com/wetspace/wetrtc.git"
20
+ },
21
+ "scripts": {
22
+ "build": "modern build",
23
+ "dev": "modern build --watch",
24
+ "clean": "rimraf dist",
25
+ "lint": "tsc --noEmit",
26
+ "test": "vitest run",
27
+ "test:watch": "vitest"
28
+ },
29
+ "devDependencies": {
30
+ "@modern-js/module-tools": "^2.71.0",
31
+ "rimraf": "^5.0.0",
32
+ "tslib": "^2.6.2",
33
+ "typescript": "^5.5.0",
34
+ "vitest": "^2.1.0"
35
+ },
36
+ "peerDependencies": {},
37
+ "keywords": ["webrtc", "p2p", "screenshare", "datachannel", "framework-agnostic"]
38
+ }
@@ -1,6 +0,0 @@
1
- export interface WetCreateConnectOneOption {
2
- configuration: RTCConfiguration;
3
- constraints: MediaStreamConstraints;
4
- transDirect: 'recvonly' | 'sendonly' | 'sendrecv';
5
- }
6
- export declare const DEFAULT_WetOption: WetCreateConnectOneOption;
package/es/core/hook.d.ts DELETED
@@ -1,31 +0,0 @@
1
- import { WetRTCPlayer } from './index';
2
- import type { ConnectionState } from './index';
3
- import type { MutableRefObject } from 'react';
4
- import type { ErrorMsgType } from '../libs';
5
- import { WetCreateConnectOneOption } from './constant';
6
- interface UseWebRtcRetrun {
7
- connect: (sdp?: RTCSessionDescriptionInit) => Promise<void>;
8
- disconnect: () => void;
9
- play: (type: 'remote' | 'local', player: WetRTCPlayer, outType?: 'video' | 'audio') => void;
10
- answerAction: (sdp: RTCSessionDescriptionInit) => void;
11
- byts: number;
12
- connectState: ConnectionState;
13
- useAblesState: {
14
- audioinput: boolean;
15
- audiooutput: boolean;
16
- videoinput: boolean;
17
- };
18
- }
19
- interface UseWebRtcParams {
20
- name?: string | number | MutableRefObject<string | number>;
21
- senderSdp: (sdp: RTCSessionDescriptionInit) => void;
22
- senderIce?: (ice: RTCIceCandidate) => void;
23
- connectionConfig?: Partial<WetCreateConnectOneOption>;
24
- onError?: (err: ErrorMsgType) => void;
25
- isLisenByts?: boolean;
26
- }
27
- declare function useWetRTC(options: Omit<UseWebRtcParams, 'isLisenByts'> & {
28
- isLisenByts: true;
29
- }): UseWebRtcRetrun;
30
- declare function useWetRTC(options: UseWebRtcParams): Omit<UseWebRtcRetrun, 'byts'>;
31
- export { useWetRTC };
@@ -1,39 +0,0 @@
1
- import type { WetCreateConnectOneOption } from './constant';
2
- export declare type WetRTCPlayer = HTMLVideoElement | HTMLAudioElement | null | undefined;
3
- export declare type ConnectionState = 'new' | 'connected' | 'disconnected' | 'closed' | 'failed';
4
- export declare type ErrorFn = ((...p: any) => void) | null;
5
- export declare type EventType = 'error' | 'state' | 'byts' | 'ice';
6
- export declare class WetRTC {
7
- constructor(options?: Partial<WetCreateConnectOneOption>);
8
- state: ConnectionState;
9
- isUseAbles: {
10
- audiooutput: boolean;
11
- audioinput: boolean;
12
- videoinput: boolean;
13
- };
14
- private streamControl;
15
- private runError;
16
- private runByt;
17
- private EventMap;
18
- private RTCPeerIns;
19
- private removeListenFn;
20
- private WetOption;
21
- getUseAbleDevices(): Promise<MediaDeviceInfo[] | null>;
22
- addEventListener(type: EventType, fn: (...p: any) => any): void;
23
- removeEventListener(type: EventType, fn: (...p: any) => any): void;
24
- private captureStream;
25
- connect(sdp?: RTCSessionDescriptionInit): Promise<RTCSessionDescriptionInit | null>;
26
- private closePeerInsTracks;
27
- /**
28
- * 关闭连接
29
- */
30
- disconnect(): void;
31
- /**
32
- * 关闭所有的流
33
- */
34
- close(): void;
35
- setRemoteSdp(_sdp: RTCSessionDescriptionInit): Promise<void>;
36
- addIceCandidate(_sdp: RTCIceCandidate): Promise<void>;
37
- playRemote(player: WetRTCPlayer, type?: 'video' | 'audio'): Promise<void>;
38
- playLocal(player: WetRTCPlayer, type?: 'video' | 'audio'): Promise<void>;
39
- }
package/es/index.d.ts DELETED
@@ -1,6 +0,0 @@
1
- import { getUseAbleDevices, getMediaStream, concatStream, filterStream, getRtcPeerTracks, stopStreamTrack } from './libs';
2
- import { streamToRecord } from './libs/record';
3
- import { WetRTC } from './core/index';
4
- import { useWetRTC } from './core/hook';
5
- export { getUseAbleDevices, getMediaStream, concatStream, filterStream, streamToRecord, getRtcPeerTracks, useWetRTC, stopStreamTrack, };
6
- export default WetRTC;
package/es/index.js DELETED
@@ -1 +0,0 @@
1
- import{useState,useRef,useEffect,useCallback}from"react";function __awaiter(e,o,a,c){return new(a=a||Promise)(function(n,t){function r(e){try{s(c.next(e))}catch(e){t(e)}}function i(e){try{s(c.throw(e))}catch(e){t(e)}}function s(e){var t;e.done?n(e.value):((t=e.value)instanceof a?t:new a(function(e){e(t)})).then(r,i)}s((c=c.apply(e,o||[])).next())})}const getUseAbleDevices=()=>__awaiter(void 0,void 0,void 0,function*(){return navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices?yield navigator.mediaDevices.enumerateDevices():(console.error("navigator.mediaDevices.enumerateDevices"),null)}),getMediaStream=(e="display",r)=>{const i="display"===e?"getDisplayMedia":"getUserMedia";return n=>__awaiter(void 0,void 0,void 0,function*(){let e=null;if(navigator.mediaDevices[i]){var t=Object.assign({video:!0,audio:{noiseSuppression:!0,echoCancellation:!0,enableBackground:!1,suppressLocalAudioPlayback:!0}},n);try{e=yield navigator.mediaDevices[i](t)}catch(e){r&&r({name:e.name||"Error",message:e.message||"内部错误"})}}else r&&r({name:"CompatibleError",message:"不支持navigator.mediaDevices"});return e})},stopStreamTrack=e=>{e&&e.getTracks().forEach(e=>{e.stop()})},concatStream=e=>{let t=[];return e.forEach(e=>{t=[...t,...e.getTracks()]}),new MediaStream(t)},filterStream=(e,t)=>{let n=[];return e.forEach(e=>{n=[...n,...e.getTracks().filter(e=>t?e.kind===t:e)]}),new MediaStream(n)},getRtcPeerTracks=(e,t)=>{const n={receivers(){const t=[];return e.getReceivers().forEach(e=>{e.track&&t.push(e.track)}),t},senders(){const t=[];return e.getSenders().forEach(e=>{e.track&&t.push(e.track)}),t}};return t?n[t]():[...n.receivers(),...n.senders()]},listenerEvent=(e,t)=>(e.addEventListener("track",t.track),e.addEventListener("icecandidate",t.icecandidate),e.addEventListener("connectionstatechange",t.connectionstatechange),()=>{e.removeEventListener("track",t.track),e.removeEventListener("icecandidate",t.icecandidate),e.removeEventListener("connectionstatechange",t.connectionstatechange)}),SaveFileToLocal=(e,t)=>{e=URL.createObjectURL(e);const n=document.createElement("a");n.href=e,n.target="_blank",n.style.display="none",document.body.appendChild(n),n.download=t,n.click(),URL.revokeObjectURL(e),document.body.removeChild(n)},streamToRecord=(e,t={audioBitsPerSecond:128e3,videoBitsPerSecond:25e5,mimeType:"video/webm"})=>{const n=t.mimeType?t.mimeType.split("/"):["webm"];let r=(new Date).getTime().toString();const i=MediaRecorder.isTypeSupported(t.mimeType||"");if(!i)throw new Error(t.mimeType+"类型不支持");const s=new MediaRecorder(e,t);s.addEventListener("dataavailable",e=>{SaveFileToLocal(e.data,r+"."+n[(null===n||void 0===n?void 0:n.length)-1])});const o=()=>{i&&s.stop()};return{start:()=>{i&&s.start()},pause:()=>{i&&s.pause()},save:e=>{i&&(r=e||(new Date).getTime().toString(),o())},stop:o,resume:()=>{i&&s.resume()}}},DEFAULT_WetOption={transDirect:"sendrecv",configuration:{iceServers:[{urls:"stun:stun.l.google.com:19302"}]},constraints:{video:!0,audio:{noiseSuppression:!0,echoCancellation:!0,suppressLocalAudioPlayback:!0}}};class WetRTC{constructor(e){this.state="new",this.isUseAbles={audiooutput:!1,audioinput:!1,videoinput:!1},this.streamControl={close:e=>{const t={remote:()=>{stopStreamTrack(this.streamControl.remoteStreams),this.streamControl.remoteStreams=null},local:()=>{stopStreamTrack(this.streamControl.localStreams),this.streamControl.localStreams=null}};e?t[e]():(t.local(),t.remote())}},this.runByt={time:null,close:()=>{this.runByt.time&&clearInterval(this.runByt.time)},run:()=>{const i=this.EventMap.get("byts");let s=null;i&&0<i.length&&(null!==i&&void 0!==i&&i.forEach(e=>{e(0)}),this.runByt.time=setInterval(()=>{var e;null!==(e=this.RTCPeerIns)&&void 0!==e&&e.getStats().then(e=>{const t={bytesReceived:0};if(e.forEach(e=>{"transport"===e.type&&(t.bytesReceived+=e.bytesReceived)}),s){const n=s.bytesReceived,r=t.bytesReceived;null!==i&&void 0!==i&&i.forEach(e=>{e(Number(((r-n)/1024).toFixed(2)))}),s=Object.assign({},t)}else s=Object.assign({},t)})},1e3))}},this.EventMap=new Map([]),this.RTCPeerIns=null,this.removeListenFn=()=>{},this.WetOption=Object.assign({},DEFAULT_WetOption),this.WetOption=Object.assign(Object.assign({},this.WetOption),e)}runError(t){const e=this.EventMap.get("error");null!==e&&void 0!==e&&e.forEach(e=>{e(t)})}getUseAbleDevices(){return __awaiter(this,void 0,void 0,function*(){return yield getUseAbleDevices()})}addEventListener(e,t){const n=this.EventMap.get(e);n?n.find(e=>e===t)||(n.push(t),this.EventMap.set(e,n)):this.EventMap.set(e,[t])}removeEventListener(e,t){const n=this.EventMap.get(e);var r;n&&(r=n.filter(e=>e!==t),this.EventMap.set(e,r))}captureStream(){return __awaiter(this,void 0,void 0,function*(){const e=yield getUseAbleDevices();if(e){const n=e.map(e=>e.kind);this.isUseAbles.audioinput=n.includes("audioinput"),this.isUseAbles.videoinput=n.includes("videoinput"),this.isUseAbles.audiooutput=n.includes("audiooutput")}else this.isUseAbles.audioinput=!0,this.isUseAbles.videoinput=!0,this.isUseAbles.audiooutput=!0;var t;return this.isUseAbles.audioinput||this.isUseAbles.videoinput?((t=yield getMediaStream("user",e=>{this.runError(e)})({video:!!this.isUseAbles.videoinput&&this.WetOption.constraints.video,audio:!!this.isUseAbles.audioinput&&this.WetOption.constraints.audio}))&&(this.streamControl.localStreams=t),t):(this.runError({name:"StreamError",message:"音频输入设备,视频输入设备均不可用"}),null)})}connect(o){var a;return __awaiter(this,void 0,void 0,function*(){if(["sendrecv","sendonly"].includes(this.WetOption.transDirect)&&(!this.streamControl.localStreams&&!(yield this.captureStream())))return null;let n="new",r=this;Object.defineProperty(this,"state",{get(){return n},set(e){"connected"===(n=e)?r.runByt.run():["disconnected","closed","failed"].includes(e)&&r.runByt.close();const t=r.EventMap.get("state");null!==t&&void 0!==t&&t.forEach(e=>{e(n)})}});var e;if(this.state="new",this.RTCPeerIns=new RTCPeerConnection(this.WetOption.configuration),this.removeListenFn=listenerEvent(this.RTCPeerIns,{track:e=>{e.streams&&e.streams[0]&&(this.streamControl.remoteStreams=e.streams[0])},icecandidate:t=>{if(t.candidate){const e=r.EventMap.get("ice");null!==e&&void 0!==e&&e.forEach(e=>{e(t.candidate)})}},connectionstatechange:e=>{e=e.target;this.state=e.connectionState}}),["sendrecv","sendonly"].includes(this.WetOption.transDirect)){const i=null===(a=this.streamControl)||void 0===a?void 0:a.localStreams;null!==i&&void 0!==i&&i.getTracks().forEach(e=>{var t;null!==(t=this.RTCPeerIns)&&void 0!==t&&t.addTrack(e,i)})}else try{this.RTCPeerIns.addTransceiver("video",{direction:"recvonly"}),this.RTCPeerIns.addTransceiver("audio",{direction:"recvonly"})}catch(e){const t=document.createElement("canvas"),s=t.captureStream();null!==s&&void 0!==s&&s.getTracks().forEach(e=>{var t;null!==(t=this.RTCPeerIns)&&void 0!==t&&t.addTrack(e,s)})}return o?(yield this.setRemoteSdp(o),e=yield this.RTCPeerIns.createAnswer(),yield this.RTCPeerIns.setLocalDescription(e),e):(e=yield this.RTCPeerIns.createOffer(),yield this.RTCPeerIns.setLocalDescription(e),e)})}closePeerInsTracks(){if(this.RTCPeerIns){const e={recvonly:()=>getRtcPeerTracks(this.RTCPeerIns,"receivers"),sendonly:()=>getRtcPeerTracks(this.RTCPeerIns,"senders"),sendrecv:()=>getRtcPeerTracks(this.RTCPeerIns)},t=e[this.WetOption.transDirect]();t.forEach(e=>{null!=e&&e.stop()})}}disconnect(){this.state="closed",this.removeListenFn(),this.closePeerInsTracks(),this.RTCPeerIns=null}close(){this.disconnect(),this.streamControl.close()}setRemoteSdp(e){var t;return __awaiter(this,void 0,void 0,function*(){if(!e)return this.runError({name:"OperationError",message:"缺失sdp信息"}),void(this.state="failed");try{yield null===(t=this.RTCPeerIns)||void 0===t?void 0:t.setRemoteDescription(e)}catch(e){this.state="failed",this.runError({name:e.name||"Error",message:e.message||"内部错误"})}})}addIceCandidate(n){return __awaiter(this,void 0,void 0,function*(){if(!n)return this.runError({name:"OperationError",message:"缺失IceSdp信息"}),void(this.state="failed");const e=()=>__awaiter(this,void 0,void 0,function*(){var e;try{yield null===(e=this.RTCPeerIns)||void 0===e?void 0:e.addIceCandidate(n)}catch(e){this.state="failed",this.runError({name:e.name||"Error",message:e.message||"内部错误"})}});if(this.RTCPeerIns)e();else{const t=setInterval(()=>__awaiter(this,void 0,void 0,function*(){e(),clearInterval(t)}),1e3)}})}playRemote(t,n){return __awaiter(this,void 0,void 0,function*(){var e;this.RTCPeerIns&&(e=this.RTCPeerIns.getReceivers().map(e=>e.track),e=new MediaStream(e),null!=t&&t.setAttribute("autoplay",""),null!=t&&t.setAttribute("playsinline",""),t&&(t.srcObject=filterStream([e],n)))})}playLocal(t,n){return __awaiter(this,void 0,void 0,function*(){this.streamControl.localStreams||(yield this.captureStream());var e=this.streamControl.localStreams;null!=t&&t.setAttribute("autoplay",""),null!=t&&t.setAttribute("playsinline",""),t&&(t.srcObject=filterStream([e],n))})}}let getRandomValues;const rnds8=new Uint8Array(16);function rng(){if(!getRandomValues&&!(getRandomValues="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return getRandomValues(rnds8)}const byteToHex=[];for(let e=0;e<256;++e)byteToHex.push((e+256).toString(16).slice(1));function unsafeStringify(e,t=0){return(byteToHex[e[t+0]]+byteToHex[e[t+1]]+byteToHex[e[t+2]]+byteToHex[e[t+3]]+"-"+byteToHex[e[t+4]]+byteToHex[e[t+5]]+"-"+byteToHex[e[t+6]]+byteToHex[e[t+7]]+"-"+byteToHex[e[t+8]]+byteToHex[e[t+9]]+"-"+byteToHex[e[t+10]]+byteToHex[e[t+11]]+byteToHex[e[t+12]]+byteToHex[e[t+13]]+byteToHex[e[t+14]]+byteToHex[e[t+15]]).toLowerCase()}const randomUUID="undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto);var native={randomUUID:randomUUID};function v4(e,t,n){if(native.randomUUID&&!t&&!e)return native.randomUUID();const r=(e=e||{}).random||(e.rng||rng)();if(r[6]=15&r[6]|64,r[8]=63&r[8]|128,t){n=n||0;for(let e=0;e<16;++e)t[n+e]=r[e];return t}return unsafeStringify(r)}function useWetRTC(e){const{connectionConfig:t,name:n,isLisenByts:r}=e,[u,l]=useState(0),i=useRef(""),s=useRef(e.senderSdp),o=useRef(e.senderIce),a=useRef(e.onError),c=(s.current=e.senderSdp,o.current=e.senderIce,a.current=e.onError,useRef(null)),[v,m]=useState({audioinput:!1,audiooutput:!1,videoinput:!1}),h=useRef({audioinput:!1,audiooutput:!1,videoinput:!1}),[d,p]=useState("new");useEffect(()=>{c.current=new WetRTC(t),c.current.addEventListener("error",e=>{a.current&&a.current(e)}),c.current.addEventListener("state",e=>{p(e)}),c.current.addEventListener("ice",e=>{o.current&&o.current(e)}),c.current.getUseAbleDevices().then(e=>{const t={audioinput:!0,audiooutput:!0,videoinput:!0};if(e){const n=e.map(e=>e.kind);t.audioinput=n.includes("audioinput"),t.audiooutput=n.includes("audiooutput"),t.videoinput=n.includes("videoinput"),h.current=Object.assign({},t)}m(()=>t)})},[]),useEffect(()=>{var e;"connected"===d&&r&&null!==(e=c.current)&&void 0!==e&&e.addEventListener("byts",e=>{l(e)})},[d,r]);return{connect:useCallback(t=>__awaiter(this,void 0,void 0,function*(){var e;n?i.current="object"==typeof n?n.current:n:i.current=i.current||v4(),c.current&&i.current&&((e=yield c.current.connect(t))&&s.current(e))}),[n&&"object"==typeof n?n.current:n]),disconnect:()=>{var e;null!==(e=c.current)&&void 0!==e&&e.close()},play:(e,t,n)=>{"local"===e?null!==(e=c.current)&&void 0!==e&&e.playLocal(t,n):null!==(e=c.current)&&void 0!==e&&e.playRemote(t,n)},answerAction:e=>{var t;null!==(t=c.current)&&void 0!==t&&t.setRemoteSdp(e)},byts:u,connectState:d,useAblesState:v}}export{concatStream,WetRTC as default,filterStream,getMediaStream,getRtcPeerTracks,getUseAbleDevices,stopStreamTrack,streamToRecord,useWetRTC};
@@ -1,41 +0,0 @@
1
- /**
2
- * 获取可用设备
3
- * @returns Promise
4
- */
5
- export interface ErrorMsgType {
6
- name: string;
7
- message: string;
8
- }
9
- export declare const getUseAbleDevices: () => Promise<MediaDeviceInfo[] | null>;
10
- /**
11
- * 获取支持的约束
12
- */
13
- export declare const getSupportedConsitains: () => MediaTrackSupportedConstraints;
14
- /**
15
- * 选择分享流(本地视频流) / 捕获用户许可的输入信号流
16
- * @returns Promise
17
- */
18
- export declare const getMediaStream: (type?: 'user' | 'display', onError?: ((params: ErrorMsgType) => void) | undefined) => (constraints?: MediaStreamConstraints | undefined) => Promise<MediaStream | null>;
19
- /**
20
- * 关闭流和轨道追踪
21
- */
22
- export declare const stopStreamTrack: (streams?: MediaStream | null | undefined) => void;
23
- /**
24
- * 将多个stream 整合为一个stream
25
- * @param options
26
- * @returns
27
- */
28
- export declare const concatStream: (options: MediaStream[]) => MediaStream;
29
- /**
30
- * 将多个stream 按'audio' 或'video'进行过滤整合,当type没有输出的流类型时将不会过滤
31
- * @param options
32
- * @param type
33
- * @returns
34
- */
35
- export declare const filterStream: (options: MediaStream[], type?: "audio" | "video" | undefined) => MediaStream;
36
- export declare const getRtcPeerTracks: (peerConnection: RTCPeerConnection, type?: "receivers" | "senders" | undefined) => MediaStreamTrack[];
37
- export declare const listenerEvent: (RTCPeerIns: RTCPeerConnection, option: {
38
- track: (e: RTCTrackEvent) => void;
39
- icecandidate: (e: RTCPeerConnectionIceEvent) => void;
40
- connectionstatechange: (e: Event) => void;
41
- }) => () => void;
@@ -1,8 +0,0 @@
1
- export declare const SaveFileToLocal: (blob: Blob, fileName: string) => void;
2
- export declare const streamToRecord: (stream: MediaStream, options?: MediaRecorderOptions) => {
3
- start: () => void;
4
- pause: () => void;
5
- save: (_fileName?: string | undefined) => void;
6
- stop: () => void;
7
- resume: () => void;
8
- };
@@ -1,6 +0,0 @@
1
- export interface WetCreateConnectOneOption {
2
- configuration: RTCConfiguration;
3
- constraints: MediaStreamConstraints;
4
- transDirect: 'recvonly' | 'sendonly' | 'sendrecv';
5
- }
6
- export declare const DEFAULT_WetOption: WetCreateConnectOneOption;
@@ -1,31 +0,0 @@
1
- import { WetRTCPlayer } from './index';
2
- import type { ConnectionState } from './index';
3
- import type { MutableRefObject } from 'react';
4
- import type { ErrorMsgType } from '../libs';
5
- import { WetCreateConnectOneOption } from './constant';
6
- interface UseWebRtcRetrun {
7
- connect: (sdp?: RTCSessionDescriptionInit) => Promise<void>;
8
- disconnect: () => void;
9
- play: (type: 'remote' | 'local', player: WetRTCPlayer, outType?: 'video' | 'audio') => void;
10
- answerAction: (sdp: RTCSessionDescriptionInit) => void;
11
- byts: number;
12
- connectState: ConnectionState;
13
- useAblesState: {
14
- audioinput: boolean;
15
- audiooutput: boolean;
16
- videoinput: boolean;
17
- };
18
- }
19
- interface UseWebRtcParams {
20
- name?: string | number | MutableRefObject<string | number>;
21
- senderSdp: (sdp: RTCSessionDescriptionInit) => void;
22
- senderIce?: (ice: RTCIceCandidate) => void;
23
- connectionConfig?: Partial<WetCreateConnectOneOption>;
24
- onError?: (err: ErrorMsgType) => void;
25
- isLisenByts?: boolean;
26
- }
27
- declare function useWetRTC(options: Omit<UseWebRtcParams, 'isLisenByts'> & {
28
- isLisenByts: true;
29
- }): UseWebRtcRetrun;
30
- declare function useWetRTC(options: UseWebRtcParams): Omit<UseWebRtcRetrun, 'byts'>;
31
- export { useWetRTC };
@@ -1,39 +0,0 @@
1
- import type { WetCreateConnectOneOption } from './constant';
2
- export declare type WetRTCPlayer = HTMLVideoElement | HTMLAudioElement | null | undefined;
3
- export declare type ConnectionState = 'new' | 'connected' | 'disconnected' | 'closed' | 'failed';
4
- export declare type ErrorFn = ((...p: any) => void) | null;
5
- export declare type EventType = 'error' | 'state' | 'byts' | 'ice';
6
- export declare class WetRTC {
7
- constructor(options?: Partial<WetCreateConnectOneOption>);
8
- state: ConnectionState;
9
- isUseAbles: {
10
- audiooutput: boolean;
11
- audioinput: boolean;
12
- videoinput: boolean;
13
- };
14
- private streamControl;
15
- private runError;
16
- private runByt;
17
- private EventMap;
18
- private RTCPeerIns;
19
- private removeListenFn;
20
- private WetOption;
21
- getUseAbleDevices(): Promise<MediaDeviceInfo[] | null>;
22
- addEventListener(type: EventType, fn: (...p: any) => any): void;
23
- removeEventListener(type: EventType, fn: (...p: any) => any): void;
24
- private captureStream;
25
- connect(sdp?: RTCSessionDescriptionInit): Promise<RTCSessionDescriptionInit | null>;
26
- private closePeerInsTracks;
27
- /**
28
- * 关闭连接
29
- */
30
- disconnect(): void;
31
- /**
32
- * 关闭所有的流
33
- */
34
- close(): void;
35
- setRemoteSdp(_sdp: RTCSessionDescriptionInit): Promise<void>;
36
- addIceCandidate(_sdp: RTCIceCandidate): Promise<void>;
37
- playRemote(player: WetRTCPlayer, type?: 'video' | 'audio'): Promise<void>;
38
- playLocal(player: WetRTCPlayer, type?: 'video' | 'audio'): Promise<void>;
39
- }
package/lib/index.d.ts DELETED
@@ -1,6 +0,0 @@
1
- import { getUseAbleDevices, getMediaStream, concatStream, filterStream, getRtcPeerTracks, stopStreamTrack } from './libs';
2
- import { streamToRecord } from './libs/record';
3
- import { WetRTC } from './core/index';
4
- import { useWetRTC } from './core/hook';
5
- export { getUseAbleDevices, getMediaStream, concatStream, filterStream, streamToRecord, getRtcPeerTracks, useWetRTC, stopStreamTrack, };
6
- export default WetRTC;
package/lib/index.js DELETED
@@ -1 +0,0 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).index={},e.react)}(this,function(e,f){"use strict";function y(e,o,a,c){return new(a=a||Promise)(function(n,t){function r(e){try{s(c.next(e))}catch(e){t(e)}}function i(e){try{s(c.throw(e))}catch(e){t(e)}}function s(e){var t;e.done?n(e.value):((t=e.value)instanceof a?t:new a(function(e){e(t)})).then(r,i)}s((c=c.apply(e,o||[])).next())})}const r=()=>y(void 0,void 0,void 0,function*(){return navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices?yield navigator.mediaDevices.enumerateDevices():(console.error("navigator.mediaDevices.enumerateDevices"),null)}),i=(e="display",r)=>{const i="display"===e?"getDisplayMedia":"getUserMedia";return n=>y(void 0,void 0,void 0,function*(){let e=null;if(navigator.mediaDevices[i]){var t=Object.assign({video:!0,audio:{noiseSuppression:!0,echoCancellation:!0,enableBackground:!1,suppressLocalAudioPlayback:!0}},n);try{e=yield navigator.mediaDevices[i](t)}catch(e){r&&r({name:e.name||"Error",message:e.message||"内部错误"})}}else r&&r({name:"CompatibleError",message:"不支持navigator.mediaDevices"});return e})},n=e=>{e&&e.getTracks().forEach(e=>{e.stop()})};const s=(e,t)=>{let n=[];return e.forEach(e=>{n=[...n,...e.getTracks().filter(e=>t?e.kind===t:e)]}),new MediaStream(n)},o=(e,t)=>{const n={receivers(){const t=[];return e.getReceivers().forEach(e=>{e.track&&t.push(e.track)}),t},senders(){const t=[];return e.getSenders().forEach(e=>{e.track&&t.push(e.track)}),t}};return t?n[t]():[...n.receivers(),...n.senders()]};const t={transDirect:"sendrecv",configuration:{iceServers:[{urls:"stun:stun.l.google.com:19302"}]},constraints:{video:!0,audio:{noiseSuppression:!0,echoCancellation:!0,suppressLocalAudioPlayback:!0}}};class g{constructor(e){this.state="new",this.isUseAbles={audiooutput:!1,audioinput:!1,videoinput:!1},this.streamControl={close:e=>{const t={remote:()=>{n(this.streamControl.remoteStreams),this.streamControl.remoteStreams=null},local:()=>{n(this.streamControl.localStreams),this.streamControl.localStreams=null}};e?t[e]():(t.local(),t.remote())}},this.runByt={time:null,close:()=>{this.runByt.time&&clearInterval(this.runByt.time)},run:()=>{const i=this.EventMap.get("byts");let s=null;i&&0<i.length&&(null!==i&&void 0!==i&&i.forEach(e=>{e(0)}),this.runByt.time=setInterval(()=>{var e;null!==(e=this.RTCPeerIns)&&void 0!==e&&e.getStats().then(e=>{const t={bytesReceived:0};if(e.forEach(e=>{"transport"===e.type&&(t.bytesReceived+=e.bytesReceived)}),s){const n=s.bytesReceived,r=t.bytesReceived;null!==i&&void 0!==i&&i.forEach(e=>{e(Number(((r-n)/1024).toFixed(2)))}),s=Object.assign({},t)}else s=Object.assign({},t)})},1e3))}},this.EventMap=new Map([]),this.RTCPeerIns=null,this.removeListenFn=()=>{},this.WetOption=Object.assign({},t),this.WetOption=Object.assign(Object.assign({},this.WetOption),e)}runError(t){const e=this.EventMap.get("error");null!==e&&void 0!==e&&e.forEach(e=>{e(t)})}getUseAbleDevices(){return y(this,void 0,void 0,function*(){return yield r()})}addEventListener(e,t){const n=this.EventMap.get(e);n?n.find(e=>e===t)||(n.push(t),this.EventMap.set(e,n)):this.EventMap.set(e,[t])}removeEventListener(e,t){const n=this.EventMap.get(e);var r;n&&(r=n.filter(e=>e!==t),this.EventMap.set(e,r))}captureStream(){return y(this,void 0,void 0,function*(){const e=yield r();if(e){const n=e.map(e=>e.kind);this.isUseAbles.audioinput=n.includes("audioinput"),this.isUseAbles.videoinput=n.includes("videoinput"),this.isUseAbles.audiooutput=n.includes("audiooutput")}else this.isUseAbles.audioinput=!0,this.isUseAbles.videoinput=!0,this.isUseAbles.audiooutput=!0;var t;return this.isUseAbles.audioinput||this.isUseAbles.videoinput?((t=yield i("user",e=>{this.runError(e)})({video:!!this.isUseAbles.videoinput&&this.WetOption.constraints.video,audio:!!this.isUseAbles.audioinput&&this.WetOption.constraints.audio}))&&(this.streamControl.localStreams=t),t):(this.runError({name:"StreamError",message:"音频输入设备,视频输入设备均不可用"}),null)})}connect(c){var d;return y(this,void 0,void 0,function*(){if(["sendrecv","sendonly"].includes(this.WetOption.transDirect)&&(!this.streamControl.localStreams&&!(yield this.captureStream())))return null;let n="new",r=this;Object.defineProperty(this,"state",{get(){return n},set(e){"connected"===(n=e)?r.runByt.run():["disconnected","closed","failed"].includes(e)&&r.runByt.close();const t=r.EventMap.get("state");null!==t&&void 0!==t&&t.forEach(e=>{e(n)})}});var e,t,i;if(this.state="new",this.RTCPeerIns=new RTCPeerConnection(this.WetOption.configuration),this.removeListenFn=(e=this.RTCPeerIns,t={track:e=>{e.streams&&e.streams[0]&&(this.streamControl.remoteStreams=e.streams[0])},icecandidate:t=>{if(t.candidate){const e=r.EventMap.get("ice");null!==e&&void 0!==e&&e.forEach(e=>{e(t.candidate)})}},connectionstatechange:e=>{e=e.target;this.state=e.connectionState}},e.addEventListener("track",t.track),e.addEventListener("icecandidate",t.icecandidate),e.addEventListener("connectionstatechange",t.connectionstatechange),()=>{e.removeEventListener("track",t.track),e.removeEventListener("icecandidate",t.icecandidate),e.removeEventListener("connectionstatechange",t.connectionstatechange)}),["sendrecv","sendonly"].includes(this.WetOption.transDirect)){const s=null===(d=this.streamControl)||void 0===d?void 0:d.localStreams;null!==s&&void 0!==s&&s.getTracks().forEach(e=>{var t;null!==(t=this.RTCPeerIns)&&void 0!==t&&t.addTrack(e,s)})}else try{this.RTCPeerIns.addTransceiver("video",{direction:"recvonly"}),this.RTCPeerIns.addTransceiver("audio",{direction:"recvonly"})}catch(e){const o=document.createElement("canvas"),a=o.captureStream();null!==a&&void 0!==a&&a.getTracks().forEach(e=>{var t;null!==(t=this.RTCPeerIns)&&void 0!==t&&t.addTrack(e,a)})}return c?(yield this.setRemoteSdp(c),i=yield this.RTCPeerIns.createAnswer(),yield this.RTCPeerIns.setLocalDescription(i),i):(i=yield this.RTCPeerIns.createOffer(),yield this.RTCPeerIns.setLocalDescription(i),i)})}closePeerInsTracks(){if(this.RTCPeerIns){const e={recvonly:()=>o(this.RTCPeerIns,"receivers"),sendonly:()=>o(this.RTCPeerIns,"senders"),sendrecv:()=>o(this.RTCPeerIns)},t=e[this.WetOption.transDirect]();t.forEach(e=>{null!=e&&e.stop()})}}disconnect(){this.state="closed",this.removeListenFn(),this.closePeerInsTracks(),this.RTCPeerIns=null}close(){this.disconnect(),this.streamControl.close()}setRemoteSdp(e){var t;return y(this,void 0,void 0,function*(){if(!e)return this.runError({name:"OperationError",message:"缺失sdp信息"}),void(this.state="failed");try{yield null===(t=this.RTCPeerIns)||void 0===t?void 0:t.setRemoteDescription(e)}catch(e){this.state="failed",this.runError({name:e.name||"Error",message:e.message||"内部错误"})}})}addIceCandidate(n){return y(this,void 0,void 0,function*(){if(!n)return this.runError({name:"OperationError",message:"缺失IceSdp信息"}),void(this.state="failed");const e=()=>y(this,void 0,void 0,function*(){var e;try{yield null===(e=this.RTCPeerIns)||void 0===e?void 0:e.addIceCandidate(n)}catch(e){this.state="failed",this.runError({name:e.name||"Error",message:e.message||"内部错误"})}});if(this.RTCPeerIns)e();else{const t=setInterval(()=>y(this,void 0,void 0,function*(){e(),clearInterval(t)}),1e3)}})}playRemote(t,n){return y(this,void 0,void 0,function*(){var e;this.RTCPeerIns&&(e=this.RTCPeerIns.getReceivers().map(e=>e.track),e=new MediaStream(e),null!=t&&t.setAttribute("autoplay",""),null!=t&&t.setAttribute("playsinline",""),t&&(t.srcObject=s([e],n)))})}playLocal(t,n){return y(this,void 0,void 0,function*(){this.streamControl.localStreams||(yield this.captureStream());var e=this.streamControl.localStreams;null!=t&&t.setAttribute("autoplay",""),null!=t&&t.setAttribute("playsinline",""),t&&(t.srcObject=s([e],n))})}}let a;const d=new Uint8Array(16);const c=[];for(let e=0;e<256;++e)c.push((e+256).toString(16).slice(1));var u={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function b(e,t,n){if(u.randomUUID&&!t&&!e)return u.randomUUID();const r=(e=e||{}).random||(e.rng||function(){if(!a&&!(a="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return a(d)})();if(r[6]=15&r[6]|64,r[8]=63&r[8]|128,t){n=n||0;for(let e=0;e<16;++e)t[n+e]=r[e];return t}return e=r,i=0,(c[e[i+0]]+c[e[i+1]]+c[e[i+2]]+c[e[i+3]]+"-"+c[e[i+4]]+c[e[i+5]]+"-"+c[e[i+6]]+c[e[i+7]]+"-"+c[e[i+8]]+c[e[i+9]]+"-"+c[e[i+10]]+c[e[i+11]]+c[e[i+12]]+c[e[i+13]]+c[e[i+14]]+c[e[i+15]]).toLowerCase();var i}e.concatStream=e=>{let t=[];return e.forEach(e=>{t=[...t,...e.getTracks()]}),new MediaStream(t)},e.default=g,e.filterStream=s,e.getMediaStream=i,e.getRtcPeerTracks=o,e.getUseAbleDevices=r,e.stopStreamTrack=n,e.streamToRecord=(e,t={audioBitsPerSecond:128e3,videoBitsPerSecond:25e5,mimeType:"video/webm"})=>{const r=t.mimeType?t.mimeType.split("/"):["webm"];let i=(new Date).getTime().toString();const n=MediaRecorder.isTypeSupported(t.mimeType||"");if(!n)throw new Error(t.mimeType+"类型不支持");const s=new MediaRecorder(e,t);s.addEventListener("dataavailable",e=>{{e=e.data;var t=i+"."+r[(null===r||void 0===r?void 0:r.length)-1];e=URL.createObjectURL(e);const n=document.createElement("a");return n.href=e,n.target="_blank",n.style.display="none",document.body.appendChild(n),n.download=t,n.click(),URL.revokeObjectURL(e),void document.body.removeChild(n)}});const o=()=>{n&&s.stop()};return{start:()=>{n&&s.start()},pause:()=>{n&&s.pause()},save:e=>{n&&(i=e||(new Date).getTime().toString(),o())},stop:o,resume:()=>{n&&s.resume()}}},e.useWetRTC=function(e){const{connectionConfig:t,name:n,isLisenByts:r}=e,[u,l]=f.useState(0),i=f.useRef(""),s=f.useRef(e.senderSdp),o=f.useRef(e.senderIce),a=f.useRef(e.onError),c=(s.current=e.senderSdp,o.current=e.senderIce,a.current=e.onError,f.useRef(null)),[v,h]=f.useState({audioinput:!1,audiooutput:!1,videoinput:!1}),p=f.useRef({audioinput:!1,audiooutput:!1,videoinput:!1}),[d,m]=f.useState("new");return f.useEffect(()=>{c.current=new g(t),c.current.addEventListener("error",e=>{a.current&&a.current(e)}),c.current.addEventListener("state",e=>{m(e)}),c.current.addEventListener("ice",e=>{o.current&&o.current(e)}),c.current.getUseAbleDevices().then(e=>{const t={audioinput:!0,audiooutput:!0,videoinput:!0};if(e){const n=e.map(e=>e.kind);t.audioinput=n.includes("audioinput"),t.audiooutput=n.includes("audiooutput"),t.videoinput=n.includes("videoinput"),p.current=Object.assign({},t)}h(()=>t)})},[]),f.useEffect(()=>{var e;"connected"===d&&r&&null!==(e=c.current)&&void 0!==e&&e.addEventListener("byts",e=>{l(e)})},[d,r]),{connect:f.useCallback(t=>y(this,void 0,void 0,function*(){var e;n?i.current="object"==typeof n?n.current:n:i.current=i.current||b(),c.current&&i.current&&((e=yield c.current.connect(t))&&s.current(e))}),[n&&"object"==typeof n?n.current:n]),disconnect:()=>{var e;null!==(e=c.current)&&void 0!==e&&e.close()},play:(e,t,n)=>{"local"===e?null!==(e=c.current)&&void 0!==e&&e.playLocal(t,n):null!==(e=c.current)&&void 0!==e&&e.playRemote(t,n)},answerAction:e=>{var t;null!==(t=c.current)&&void 0!==t&&t.setRemoteSdp(e)},byts:u,connectState:d,useAblesState:v}},Object.defineProperty(e,"__esModule",{value:!0})});
@@ -1,41 +0,0 @@
1
- /**
2
- * 获取可用设备
3
- * @returns Promise
4
- */
5
- export interface ErrorMsgType {
6
- name: string;
7
- message: string;
8
- }
9
- export declare const getUseAbleDevices: () => Promise<MediaDeviceInfo[] | null>;
10
- /**
11
- * 获取支持的约束
12
- */
13
- export declare const getSupportedConsitains: () => MediaTrackSupportedConstraints;
14
- /**
15
- * 选择分享流(本地视频流) / 捕获用户许可的输入信号流
16
- * @returns Promise
17
- */
18
- export declare const getMediaStream: (type?: 'user' | 'display', onError?: ((params: ErrorMsgType) => void) | undefined) => (constraints?: MediaStreamConstraints | undefined) => Promise<MediaStream | null>;
19
- /**
20
- * 关闭流和轨道追踪
21
- */
22
- export declare const stopStreamTrack: (streams?: MediaStream | null | undefined) => void;
23
- /**
24
- * 将多个stream 整合为一个stream
25
- * @param options
26
- * @returns
27
- */
28
- export declare const concatStream: (options: MediaStream[]) => MediaStream;
29
- /**
30
- * 将多个stream 按'audio' 或'video'进行过滤整合,当type没有输出的流类型时将不会过滤
31
- * @param options
32
- * @param type
33
- * @returns
34
- */
35
- export declare const filterStream: (options: MediaStream[], type?: "audio" | "video" | undefined) => MediaStream;
36
- export declare const getRtcPeerTracks: (peerConnection: RTCPeerConnection, type?: "receivers" | "senders" | undefined) => MediaStreamTrack[];
37
- export declare const listenerEvent: (RTCPeerIns: RTCPeerConnection, option: {
38
- track: (e: RTCTrackEvent) => void;
39
- icecandidate: (e: RTCPeerConnectionIceEvent) => void;
40
- connectionstatechange: (e: Event) => void;
41
- }) => () => void;
@@ -1,8 +0,0 @@
1
- export declare const SaveFileToLocal: (blob: Blob, fileName: string) => void;
2
- export declare const streamToRecord: (stream: MediaStream, options?: MediaRecorderOptions) => {
3
- start: () => void;
4
- pause: () => void;
5
- save: (_fileName?: string | undefined) => void;
6
- stop: () => void;
7
- resume: () => void;
8
- };