@apirtc/react-lib 1.1.8 → 1.2.1-rc.1
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/README.md +74 -41
- package/dist/esm/hooks/index.d.ts +3 -2
- package/dist/esm/hooks/useConversationStreams.d.ts +1 -0
- package/dist/esm/hooks/useStreamApplyAudioProcessor.d.ts +2 -2
- package/dist/esm/hooks/useStreamApplyVideoProcessor.d.ts +2 -2
- package/dist/esm/hooks/useTranscriptService.d.ts +13 -0
- package/dist/esm/hooks/useTranscriptService.spec.d.ts +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/hooks/index.d.ts +3 -2
- package/dist/hooks/useConversationStreams.d.ts +1 -0
- package/dist/hooks/useStreamApplyAudioProcessor.d.ts +2 -2
- package/dist/hooks/useStreamApplyVideoProcessor.d.ts +2 -2
- package/dist/hooks/useTranscriptService.d.ts +13 -0
- package/dist/hooks/useTranscriptService.spec.d.ts +1 -0
- package/dist/index.d.ts +19 -4
- package/dist/react-lib.production.min.js +1 -1
- package/dist/react-lib.production.min.js.map +1 -1
- package/package.json +53 -49
package/README.md
CHANGED
|
@@ -19,9 +19,9 @@ Visit this [codesandbox](https://codesandbox.io/s/apirtc-react-lib-demo-nrmcrn)
|
|
|
19
19
|
Get a stateful session:
|
|
20
20
|
|
|
21
21
|
```ts
|
|
22
|
-
import { useSession } from "@apirtc/react-lib"
|
|
23
|
-
const [credentials] = useState({ apiKey: "your_api_key" })
|
|
24
|
-
const { session } = useSession(credentials)
|
|
22
|
+
import { useSession } from "@apirtc/react-lib"
|
|
23
|
+
const [credentials] = useState({ apiKey: "your_api_key" })
|
|
24
|
+
const { session } = useSession(credentials)
|
|
25
25
|
```
|
|
26
26
|
|
|
27
27
|
### useUserMediaDevices
|
|
@@ -29,8 +29,8 @@ const { session } = useSession(credentials);
|
|
|
29
29
|
Get a stateful list of available media devices:
|
|
30
30
|
|
|
31
31
|
```ts
|
|
32
|
-
import { useUserMediaDevices } from "@apirtc/react-lib"
|
|
33
|
-
const { userMediaDevices } = useUserMediaDevices(session)
|
|
32
|
+
import { useUserMediaDevices } from "@apirtc/react-lib"
|
|
33
|
+
const { userMediaDevices } = useUserMediaDevices(session)
|
|
34
34
|
```
|
|
35
35
|
|
|
36
36
|
This hook can also manage devices selection.
|
|
@@ -40,25 +40,22 @@ This hook can also manage devices selection.
|
|
|
40
40
|
Get a stateful value for the camera stream:
|
|
41
41
|
|
|
42
42
|
```ts
|
|
43
|
-
import { useCameraStream } from "@apirtc/react-lib"
|
|
44
|
-
const { stream } = useCameraStream(session)
|
|
43
|
+
import { useCameraStream } from "@apirtc/react-lib"
|
|
44
|
+
const { stream } = useCameraStream(session)
|
|
45
45
|
```
|
|
46
46
|
|
|
47
47
|
### useStreamApplyAudioProcessor
|
|
48
48
|
|
|
49
49
|
```ts
|
|
50
|
-
import { useStreamApplyAudioProcessor } from "@apirtc/react-lib"
|
|
51
|
-
const { stream: noiseReductionStream } = useStreamApplyAudioProcessor(
|
|
52
|
-
stream,
|
|
53
|
-
"noiseReduction"
|
|
54
|
-
);
|
|
50
|
+
import { useStreamApplyAudioProcessor } from "@apirtc/react-lib"
|
|
51
|
+
const { stream: noiseReductionStream } = useStreamApplyAudioProcessor(stream, "noiseReduction")
|
|
55
52
|
```
|
|
56
53
|
|
|
57
54
|
### useStreamApplyVideoProcessor
|
|
58
55
|
|
|
59
56
|
```ts
|
|
60
|
-
import { useStreamApplyVideoProcessor } from "@apirtc/react-lib"
|
|
61
|
-
const { stream: blurredStream } = useStreamApplyVideoProcessor(stream, "blur")
|
|
57
|
+
import { useStreamApplyVideoProcessor } from "@apirtc/react-lib"
|
|
58
|
+
const { stream: blurredStream } = useStreamApplyVideoProcessor(stream, "blur")
|
|
62
59
|
```
|
|
63
60
|
|
|
64
61
|
### usePresence
|
|
@@ -66,9 +63,9 @@ const { stream: blurredStream } = useStreamApplyVideoProcessor(stream, "blur");
|
|
|
66
63
|
Get a stateful map of contacts by group:
|
|
67
64
|
|
|
68
65
|
```ts
|
|
69
|
-
import { usePresence } from "@apirtc/react-lib"
|
|
70
|
-
const [groups] = useState(["groupName1", "groupName2"])
|
|
71
|
-
const { contactsByGroup } = usePresence(session, groups)
|
|
66
|
+
import { usePresence } from "@apirtc/react-lib"
|
|
67
|
+
const [groups] = useState(["groupName1", "groupName2"])
|
|
68
|
+
const { contactsByGroup } = usePresence(session, groups)
|
|
72
69
|
```
|
|
73
70
|
|
|
74
71
|
### useConversation
|
|
@@ -76,8 +73,8 @@ const { contactsByGroup } = usePresence(session, groups);
|
|
|
76
73
|
Get a stateful **Conversation**:
|
|
77
74
|
|
|
78
75
|
```ts
|
|
79
|
-
import { useConversation } from "@apirtc/react-lib"
|
|
80
|
-
const { conversation } = useConversation(session, "conversationName")
|
|
76
|
+
import { useConversation } from "@apirtc/react-lib"
|
|
77
|
+
const { conversation } = useConversation(session, "conversationName")
|
|
81
78
|
```
|
|
82
79
|
|
|
83
80
|
### useConversationContacts
|
|
@@ -85,8 +82,8 @@ const { conversation } = useConversation(session, "conversationName");
|
|
|
85
82
|
Get **Conversation** **Contact**s in your state:
|
|
86
83
|
|
|
87
84
|
```ts
|
|
88
|
-
import { useConversationContacts } from "@apirtc/react-lib"
|
|
89
|
-
const { contacts } = useConversationContacts(conversation)
|
|
85
|
+
import { useConversationContacts } from "@apirtc/react-lib"
|
|
86
|
+
const { contacts } = useConversationContacts(conversation)
|
|
90
87
|
```
|
|
91
88
|
|
|
92
89
|
### useConversationModeration
|
|
@@ -94,16 +91,15 @@ const { contacts } = useConversationContacts(conversation);
|
|
|
94
91
|
Get a set of candidates **Contacts**, and get notified of ejection:
|
|
95
92
|
|
|
96
93
|
```ts
|
|
97
|
-
import { useConversationModeration } from "@apirtc/react-lib"
|
|
98
|
-
const { candidates, onEjected, onEjectedSelf } =
|
|
99
|
-
useConversationModeration(conversation);
|
|
94
|
+
import { useConversationModeration } from "@apirtc/react-lib"
|
|
95
|
+
const { candidates, onEjected, onEjectedSelf } = useConversationModeration(conversation)
|
|
100
96
|
```
|
|
101
97
|
|
|
102
98
|
### useConversationMessages
|
|
103
99
|
|
|
104
100
|
```ts
|
|
105
|
-
import { useConversationMessages } from "@apirtc/react-lib"
|
|
106
|
-
const { messages, sendMessage } = useConversationMessages(conversation)
|
|
101
|
+
import { useConversationMessages } from "@apirtc/react-lib"
|
|
102
|
+
const { messages, sendMessage } = useConversationMessages(conversation)
|
|
107
103
|
```
|
|
108
104
|
|
|
109
105
|
### useConversationStreams
|
|
@@ -111,15 +107,19 @@ const { messages, sendMessage } = useConversationMessages(conversation);
|
|
|
111
107
|
Control **Stream**s to publish, and get stateful arrays of published and subscribed **Stream**s:
|
|
112
108
|
|
|
113
109
|
```ts
|
|
114
|
-
import { useConversationStreams } from "@apirtc/react-lib"
|
|
115
|
-
const streamsToPublish = useMemo(
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
110
|
+
import { useConversationStreams } from "@apirtc/react-lib"
|
|
111
|
+
const streamsToPublish = useMemo(() => (stream ? [{ stream: stream }] : []), [stream])
|
|
112
|
+
const { publishedStreams, subscribedStreams } = useConversationStreams(conversation, streamsToPublish)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### useTranscriptService
|
|
116
|
+
|
|
117
|
+
Start, stop, and get messages from a TranscriptService in a conversation.
|
|
118
|
+
|
|
119
|
+
```ts
|
|
120
|
+
import { useTranscriptService } from "@apirtc/react-lib"
|
|
121
|
+
|
|
122
|
+
const { transcriptService, hasStarted, transcripts, startTranscriptService, stopTranscriptService } = useTranscriptService(conversation, true)
|
|
123
123
|
```
|
|
124
124
|
|
|
125
125
|
## Components
|
|
@@ -129,9 +129,8 @@ const { publishedStreams, subscribedStreams } = useConversationStreams(
|
|
|
129
129
|
Use it to display any **ApiRTC** **Stream**.
|
|
130
130
|
|
|
131
131
|
```tsx
|
|
132
|
-
import { VideoStream } from "@apirtc/react-lib"
|
|
133
|
-
|
|
134
|
-
<VideoStream stream={stream} muted={false}></VideoStream>;
|
|
132
|
+
import { VideoStream } from "@apirtc/react-lib"
|
|
133
|
+
;<VideoStream stream={stream} muted={false}></VideoStream>
|
|
135
134
|
```
|
|
136
135
|
|
|
137
136
|
Note: For more comprehensive set of UI components, please have a look at [@apirtc/mui-react-lib](https://github.com/ApiRTC/mui-react-lib)
|
|
@@ -148,13 +147,47 @@ Available log levels:
|
|
|
148
147
|
from web app code:
|
|
149
148
|
|
|
150
149
|
```ts
|
|
151
|
-
import { setLogLevel } from "@apirtc/react-lib"
|
|
150
|
+
import { setLogLevel } from "@apirtc/react-lib"
|
|
152
151
|
|
|
153
|
-
setLogLevel("warn")
|
|
152
|
+
setLogLevel("warn")
|
|
154
153
|
```
|
|
155
154
|
|
|
156
155
|
from console:
|
|
157
156
|
|
|
158
157
|
```js
|
|
159
|
-
setApirtcReactLibLogLevel("debug")
|
|
158
|
+
setApirtcReactLibLogLevel("debug")
|
|
160
159
|
```
|
|
160
|
+
|
|
161
|
+
## Contribute
|
|
162
|
+
|
|
163
|
+
You need to get access in write mode to the repository.
|
|
164
|
+
|
|
165
|
+
The 'developers' team has access.
|
|
166
|
+
|
|
167
|
+
Then work on a branch and submit merge requests to main branch.
|
|
168
|
+
|
|
169
|
+
## Code Formatting
|
|
170
|
+
|
|
171
|
+
This project uses Prettier for code formatting.
|
|
172
|
+
|
|
173
|
+
Most editors can format automatically using the provided configuration.
|
|
174
|
+
If not, you can manually run:
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
npm run format
|
|
178
|
+
|
|
179
|
+
## Release a new version
|
|
180
|
+
|
|
181
|
+
- run `npm run test`, making sure tests passed, and code coverage is fully 100%.
|
|
182
|
+
|
|
183
|
+
- Update README documentation section if relevant.
|
|
184
|
+
|
|
185
|
+
- Update [codesandbox](https://codesandbox.io/s/apirtc-react-lib-demo-nrmcrn) mentioned above if necessary.
|
|
186
|
+
|
|
187
|
+
- Update package.json version number.
|
|
188
|
+
|
|
189
|
+
- Update CHANGELOG accordingly.
|
|
190
|
+
|
|
191
|
+
- run `npm run build`
|
|
192
|
+
|
|
193
|
+
- run `npm publish --access public`
|
|
@@ -6,6 +6,7 @@ export { default as useConversationModeration } from "./useConversationModeratio
|
|
|
6
6
|
export { default as useConversationStreams } from "./useConversationStreams";
|
|
7
7
|
export { default as usePresence } from "./usePresence";
|
|
8
8
|
export { ApiKey, Credentials, default as useSession, LoginPassword, Token } from "./useSession";
|
|
9
|
-
export { default as useStreamApplyAudioProcessor } from
|
|
10
|
-
export { default as useStreamApplyVideoProcessor } from
|
|
9
|
+
export { default as useStreamApplyAudioProcessor } from "./useStreamApplyAudioProcessor";
|
|
10
|
+
export { default as useStreamApplyVideoProcessor } from "./useStreamApplyVideoProcessor";
|
|
11
11
|
export { default as useUserMediaDevices } from "./useUserMediaDevices";
|
|
12
|
+
export { default as useTranscriptService } from "./useTranscriptService";
|
|
@@ -10,5 +10,6 @@ streamsToPublish?: Array<{
|
|
|
10
10
|
publish: (localStream: Stream, options?: PublishOptions) => Promise<Stream>;
|
|
11
11
|
unpublish: (localStream: Stream) => void;
|
|
12
12
|
replacePublishedStream: (oldStream: Stream, newStream: Stream) => Promise<Stream>;
|
|
13
|
+
unpublishAll: () => void;
|
|
13
14
|
unsubscribeAll: () => void;
|
|
14
15
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Stream } from '@apirtc/apirtc';
|
|
1
|
+
import { AudioProcessorType, Stream } from '@apirtc/apirtc';
|
|
2
2
|
/**
|
|
3
3
|
* This hook takes stream passed as parameter, and
|
|
4
4
|
* returns either this stream or a stream with audio processor applied.
|
|
@@ -11,7 +11,7 @@ import { Stream } from '@apirtc/apirtc';
|
|
|
11
11
|
* @param audioProcessorType
|
|
12
12
|
* @returns new stream with Audio processor applied (or original stream if no processor applied)
|
|
13
13
|
*/
|
|
14
|
-
export default function useStreamApplyAudioProcessor(stream: Stream | undefined, processorType:
|
|
14
|
+
export default function useStreamApplyAudioProcessor(stream: Stream | undefined, processorType: AudioProcessorType, errorCallback?: (error: any) => void): {
|
|
15
15
|
stream: Stream | undefined;
|
|
16
16
|
applying: boolean;
|
|
17
17
|
applied: any;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Stream, VideoProcessorOptions } from '@apirtc/apirtc';
|
|
1
|
+
import { Stream, VideoProcessorOptions, VideoProcessorType } from '@apirtc/apirtc';
|
|
2
2
|
/**
|
|
3
3
|
* This hook takes stream passed as parameter, and
|
|
4
4
|
* returns either this stream or a stream with video processor applied.
|
|
@@ -12,7 +12,7 @@ import { Stream, VideoProcessorOptions } from '@apirtc/apirtc';
|
|
|
12
12
|
* @param {VideoProcessorOptions} options
|
|
13
13
|
* @returns new stream with video processor applied (or original stream if no processor applied)
|
|
14
14
|
*/
|
|
15
|
-
export default function useStreamApplyVideoProcessor(stream: Stream | undefined, processorType:
|
|
15
|
+
export default function useStreamApplyVideoProcessor(stream: Stream | undefined, processorType: VideoProcessorType, options?: VideoProcessorOptions, errorCallback?: (error: any) => void): {
|
|
16
16
|
stream: Stream | undefined;
|
|
17
17
|
applying: boolean;
|
|
18
18
|
applied: any;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Conference } from "@apirtc/apirtc";
|
|
2
|
+
/**
|
|
3
|
+
* A hook to start/stop and get messages from a transcriptService
|
|
4
|
+
* @param conversation an ApiRTC conversation
|
|
5
|
+
* @param autoStart boolean to automatically start transcription
|
|
6
|
+
*/
|
|
7
|
+
export default function useTranscriptService(conversation: Conference | undefined, autoStart: boolean | undefined): {
|
|
8
|
+
transcriptService: import("@apizee/ia").TranscriptService | null;
|
|
9
|
+
hasStarted: boolean;
|
|
10
|
+
transcripts: import("@apizee/ia").Transcript[];
|
|
11
|
+
startTranscriptService: () => Promise<void>;
|
|
12
|
+
stopTranscriptService: () => Promise<void>;
|
|
13
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "./getDisplayMedia.mock";
|
package/dist/esm/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e,{useRef as o,useEffect as t,useState as n,useCallback as i,useMemo as a}from"react";import{UserAgent as s,MediaDevice as r}from"@apirtc/apirtc";function l(n){const{autoPlay:i=!0}=n,a=o(null);return t((()=>{const e=a.current;if(e&&n.stream)return n.stream.attachToElement(e),()=>{e.src=""}}),[n.stream]),e.createElement("video",{id:n.stream.getId(),style:{maxWidth:"100%"},ref:a,autoPlay:i,muted:n.muted})}const c={},d="useCameraStream";function b(e,o=c,i){const[a,s]=n(),[r,l]=n(!1),[b,g]=n();return t((()=>{if(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${d}|useEffect`,e,o),e){const t=e.getUserAgent();l(!0),t.createStream(o).then((e=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${d}|createStream`,o,e),s(e),g(void 0)})).catch((e=>{console.error(`${d}|createStream error`,o,e),s(void 0),i&&i(e),g(e)})).finally((()=>{l(!1)}))}else s(void 0),g(void 0)}),[e,o,i]),t((()=>{const e=a;if(e)return()=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${d}|release stream`,e),e.release()}}),[a]),{stream:a,grabbing:r,error:b}}const g="useConversation";function u(e,o,a,s=!0,r){const[l,c]=n(),[d,b]=n(!1),[u,L]=n(!1),p=i(((e={})=>(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${g}|join`,l,e),new Promise(((o,t)=>{l?l.isJoined()?t(`${g}|join|conversation already joined`):(L(!0),l.join(e).then((()=>{b(!0),o()})).catch((e=>{t(e)})).finally((()=>{L(!1)}))):t(`${g}|join|conversation not defined`)})))),[l]),f=i((()=>(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${g}|leave`,l),new Promise(((e,o)=>{l?l.isJoined()?l.leave().then((()=>{b(!1),e()})).catch((e=>{o(e)})):o(`${g}|leave|conversation is not joined`):o(`${g}|leave|conversation not defined`)})))),[l]);return t((()=>{if(e&&o){globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${g}|getOrCreateConversation`,o,a);const t=e.getOrCreateConversation(o,a);return c(t),()=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${g}|useEffect cleanup`,o,a),t.isJoined()?t.leave().then((()=>{})).catch((e=>{globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${g}|useEffect conversation.leave()`,e)})).finally((()=>{t.destroy()})):t.destroy(),c(void 0),b(!1)}}}),[e,o,a]),t((()=>{if(l&&s){globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${g}|useEffect`,l,s,r);const e=l,o=s;return o&&(L(!0),e.join(r).then((()=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${g}|joined`,e),b(!0)})).catch((o=>{globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${g}|useEffect conversation.join() error`,e,r,o)})).finally((()=>{L(!1)}))),()=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${g}|useEffect cleanup`,e,o),e.isJoined()&&e.leave().then((()=>{b(!1)})).catch((o=>{globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${g}|useEffect conversation.leave() error`,e,o)}))}}}),[l,a,s,r]),{conversation:l,joining:u,joined:d,join:p,leave:f}}const L="useConversationContacts";function p(e,o,i){const[a,s]=n([]);return t((()=>{if(e){const t=t=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${L}|on:contactJoined:`,e.getName(),t),s((e=>[...e,t])),o&&o(t)};e.on("contactJoined",t);const n=o=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${L}|on:contactLeft:`,e.getName(),o),s((e=>e.filter((e=>e!==o)))),i&&i(o)};return e.on("contactLeft",n),()=>{e.removeListener("contactJoined",t),e.removeListener("contactLeft",n),s(new Array)}}}),[e,o,i]),{contacts:a}}const f="useConversationMessages";function v(e){const[o,a]=n([]);t((()=>{if(e){const o=o=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${f}|on:message:`,e.getName(),o),a((e=>[...e,o]))};return e.on("message",o),()=>{e.removeListener("message",o),a(new Array)}}}),[e]);return{messages:o,sendMessage:i(((o,t)=>new Promise(((n,i)=>{null==e||e.sendMessage(o).then((i=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${f}|sentMessage`,e.getName(),i,o),a((e=>[...e,{content:o,sender:t,time:new Date}])),n()})).catch((e=>{globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${f}|sendMessage error`,e),i(e)}))}))),[e])}}const h="useConversationModeration";function m(e,o,i){const[a,s]=n(new Set);return t((()=>{if(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${h}|useEffect conversation`,e),e){const t=e=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${h}|on:contactJoinedWaitingRoom`,e),s((o=>new Set(o.add(e))))},n=e=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${h}|on:contactLeftWaitingRoom`,e),s((o=>(o.delete(e),new Set(o))))},a=e=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${h}|on:participantEjected`,e),!0===e.self?(globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${h}|Self participant was ejected`),i&&i()):o&&o(e.contact)};return e.on("contactJoinedWaitingRoom",t).on("contactLeftWaitingRoom",n).on("participantEjected",a),()=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${h}|conversation clear`,e),e.removeListener("contactJoinedWaitingRoom",t).removeListener("contactLeftWaitingRoom",n).removeListener("participantEjected",a),s(new Set)}}}),[e,o,i]),{candidates:a}}function E(e){return null!=e}const $=[],T="useConversationStreams";function R(e,a=$,s){globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${T}|hook render|${null==e?void 0:e.getName()}`,a.map((e=>null==e?void 0:e.options)));const r=o([]),[l,c]=n(new Array),[d,b]=n(new Array),g=i(((o,t)=>new Promise(((n,i)=>{e&&(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${T}|publish|${e.getName()}`,o,t),e.publish(o,t).then((o=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${T}|published|${e.getName()}`,o),c((e=>[...e,o])),n(o)})).catch((e=>{i(e)})))}))),[e]),u=i(((o,t)=>new Promise(((n,i)=>{e&&(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${T}|replacePublishedStream|${e.getName()}|${o.getId()} -> ${t.getId()}`),e.replacePublishedStream(o,t).then((t=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${T}|stream replaced|${e.getName()}`,o,t),c((e=>{const n=e.indexOf(o);return n>=0&&e.splice(n,1,t),Array.from(e)})),n(t)})).catch((e=>{i(e)})))}))),[e]),L=i((o=>{e&&(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${T}|unpublish|${e.getName()}`,o.getId(),o),e.unpublish(o),c((e=>e.filter((e=>e!==o)))))}),[e]),p=i((()=>{const o=Math.max(r.current.length,a.length);globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${T}|doHandlePublication`,a,JSON.stringify(r.current.map((e=>null==e?void 0:e.stream.getId()))),JSON.stringify(a.map((e=>null==e?void 0:e.stream.getId()))),o);const t=[...r.current],n=a.map((e=>e&&e.options?{stream:e.stream,options:Object.assign({},e.options)}:e));r.current.length=0,r.current.push(...n);const i=new Set(a.filter(E).map((e=>e.stream))),l=(e,o)=>{g(o.stream,o.options).catch((o=>{r.current.splice(e,1,null),s?s(o):globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${T}|publish|error`,o)}))};for(let n=0;n<o;n++){const o=t[n],c=a[n];if(o&&c){const t=()=>{L(o.stream),l(n,c)};o.stream===c.stream?JSON.stringify(o.options)!==JSON.stringify(c.options)&&t():i.has(o.stream)?e&&!e.isPublishedStream(c.stream)&&l(n,c):e&&!e.isPublishedStream(c.stream)?JSON.stringify(o.options)===JSON.stringify(c.options)?u(o.stream,c.stream).catch((e=>{r.current.splice(n,1,null),s?s(e):globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${T}|replacePublishedStream|error`,e)})):t():L(o.stream)}else o&&!c?i.has(o.stream)||L(o.stream):!o&&c&&e&&!e.isPublishedStream(c.stream)&&l(n,c)}}),[e,a,g,L,u,s]),f=i((()=>{e&&c((o=>(o.forEach((o=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${T}|unpublish|${e.getName()}`,o),e.unpublish(o)})),[]))),r.current.length=0}),[e]),v=i((()=>{e&&b((o=>(o.forEach((o=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${T}|unsubscribeToStream|${e.getName()}`,o),e.unsubscribeToStream(o.getId())})),[])))}),[e]),h=i((()=>{f(),v()}),[f,v]);return t((()=>{if(e){r.current.length=0;const o=o=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${T}|on_streamAdded|${e.getName()}`,o),b((e=>[...e,o]))},t=o=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${T}|on_streamRemoved|${e.getName()}`,o),b((e=>e.filter((e=>e!==o))))},n=o=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${T}|on_streamListChanged|${e.getName()}`,o);const t=String(o.streamId);!0===o.isRemote&&("added"===o.listEventType?e.subscribeToStream(t):"removed"===o.listEventType&&e.unsubscribeToStream(t))};return e.on("streamAdded",o),e.on("streamRemoved",t),e.on("streamListChanged",n),()=>{e.removeListener("streamListChanged",n),e.removeListener("streamRemoved",t),e.removeListener("streamAdded",o),h()}}}),[e,h]),t((()=>{if(e){globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${T}|useEffect doHandlePublication|${e.getName()}`,a);const o=()=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${T}|on_joined|${e.getName()}`),p()},t=()=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${T}|on_left|${e.getName()}`),h()};return e.on("joined",o),e.on("left",t),e.isJoined()&&p(),()=>{e.removeListener("joined",o),e.removeListener("left",t)}}}),[e,a,p,h]),{publishedStreams:l,subscribedStreams:d,publish:g,unpublish:L,replacePublishedStream:u,unsubscribeAll:v}}const I="usePresence";function y(e,i){const a=o(new Set),s=o(new Map),[r,l]=n(new Map);t((()=>{if(e){const e=a.current,o=s.current;return()=>{e.clear(),o.clear(),l(new Map)}}}),[e]);const c=e=>{var o;const t=null!==(o=s.current.get(e))&&void 0!==o?o:new Set;return s.current.has(e)||s.current.set(e,t),t};return t((()=>{if(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${I}|useEffect session, groups`,i),e){const o=e,t=new Set(i);t.forEach((e=>{a.current.has(e)||(globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${I}|subscribeToGroup`,e),a.current.add(e),o.subscribeToGroup(e))}));let n=!1;if(a.current.forEach((e=>{t.has(e)||(globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${I}|unsubscribeToGroup`,e),o.unsubscribeToGroup(e),a.current.delete(e),s.current.delete(e),n=!0)})),n&&l(new Map(s.current)),i.length>0){const e=e=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${I}|contactListUpdate`,e);let o=!1;for(const n of Object.keys(e.joinedGroup))if(t.has(n)){const t=c(n);for(const i of e.joinedGroup[n])t.add(i),o=!0}for(const n of Object.keys(e.leftGroup))if(t.has(n)){const t=c(n);for(const i of e.leftGroup[n])t.delete(i),o=!0,0===t.size&&s.current.delete(n)}for(const t of e.userDataChanged)for(const e of s.current.values())if(e.has(t)){o=!0;break}o&&l(new Map(s.current))};return o.on("contactListUpdate",e),()=>{o.removeListener("contactListUpdate",e)}}}}),[e,i]),{contactsByGroup:r}}const S="useSession";function D(e,o,i){const[a,r]=n(),[l,c]=n(!1);t((()=>{if(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${S}|useEffect credentials, options`,e,o),e)return d(e,o).catch((e=>{console.error(`${S}|connection failed`,e),r(void 0),i?i(e):globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${S}|connect|error`,e)})),()=>{r(void 0),c(!1)}}),[e,o,i]),t((()=>{if(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${S}|useEffect session`,a),a){const e=a;return()=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${S}|useEffect session cleanup`,e),e.disconnect().then((()=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${S}|disconnected`,e)})).catch((e=>{console.error(`${S}|disconnect`,e)}))}}}),[a]);const d=(e,o)=>new Promise(((t,n)=>{const i=o||{cloudUrl:"https://cloud.apirtc.com"};let a;if("object"==typeof(l=e)&&"username"in l)i.password=e.password,a=new s({uri:`apirtc:${e.username}`});else if(function(e){return"object"==typeof e&&"apiKey"in e}(e))a=new s({uri:`apiKey:${e.apiKey}`});else{if(!function(e){return"object"==typeof e&&"token"in e}(e))return void n("credentials not recognized");a=new s({uri:`token:${e.token}`})}var l;c(!0),a.register(i).then((e=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${S}|connected`,e),r(e),t()})).catch((e=>{n(e)})).finally((()=>{c(!1)}))}));return{session:a,connecting:l,connect:d,disconnect:()=>{r(void 0)}}}const w="useStreamApplyAudioProcessor";function N(e,i,a){const s=o(),[r,l]=n(e),[c,d]=n(!1),[b,g]=n();return t((()=>()=>{s.current=void 0}),[e]),t((()=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${w}|useEffect`,e,i),l(e);const o=s.current||(null==e?void 0:e.audioAppliedFilter)||"none";return e&&i!==o&&(d(!0),e.applyAudioProcessor(i).then((e=>{l(e),s.current=i,g(void 0)})).catch((o=>{l(e),g(o),a?a(o):globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${w}|useEffect`,e,i,o)})).finally((()=>{d(!1)}))),()=>{g(void 0)}}),[e,i,a]),{stream:r,applying:c,applied:s.current||(null==e?void 0:e.audioAppliedFilter)||"none",error:b}}const j="useStreamApplyVideoProcessor";function A(e,i,a,s){const r=o(),[l,c]=n(e),[d,b]=n(!1),[g,u]=n();return t((()=>()=>{r.current=void 0}),[e]),t((()=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${j}|useEffect`,e,i,a),c(e);const o=r.current||(null==e?void 0:e.videoAppliedFilter)||"none";return e&&i!==o&&(b(!0),e.applyVideoProcessor(i,a).then((e=>{c(e),r.current=i,u(void 0)})).catch((o=>{u(o),s?s(o):globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${j}|useEffect`,e,i,a,o)})).finally((()=>{b(!1)}))),()=>{u(void 0)}}),[e,i,a,s]),{stream:l,applying:d,applied:r.current||(null==e?void 0:e.videoAppliedFilter)||"none",error:g}}const P="useUserMediaDevices",J=e=>{try{const o=localStorage.getItem(e),t=o?JSON.parse(o):null;return t?new r(t.id,t.type,t.label):void 0}catch(e){return void console.warn(`${P}|getMediaDeviceFromLocalStorage`,e)}},O=(e,o)=>{try{localStorage.setItem(e,o)}catch(e){}};function W(e,o){const i=a((()=>o?`${o}.audioIn`:void 0),[o]),s=a((()=>o?`${o}.audioOut`:void 0),[o]),r=a((()=>o?`${o}.videoIn`:void 0),[o]),[l,c]=n((()=>i?J(i):void 0)),[d,b]=n((()=>s?J(s):void 0)),[g,u]=n((()=>r?J(r):void 0)),[L,p]=n({audioinput:l?{[l.getId()]:l}:{},audiooutput:d?{[d.getId()]:d}:{},videoinput:g?{[g.getId()]:g}:{}});return t((()=>{if(e){const o=e.getUserAgent(),t=()=>{const e=o.getUserMediaDevices();globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${P}|mediaDeviceChanged`,e),p(e),c((o=>o?e.audioinput[o.getId()]:void 0)),b((o=>o?e.audiooutput[o.getId()]:void 0)),u((o=>o?e.videoinput[o.getId()]:void 0))};return o.on("mediaDeviceChanged",t),()=>{o.removeListener("mediaDeviceChanged",t)}}}),[e]),t((()=>{l&&i&&(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${P}|Storing audioIn`,l),O(i,JSON.stringify({id:l.getId(),type:l.getType(),label:l.getLabel()})))}),[i,l]),t((()=>{d&&s&&(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${P}|Storing audioOut`,d),O(s,JSON.stringify({id:d.getId(),type:d.getType(),label:d.getLabel()})))}),[s,d]),t((()=>{g&&r&&(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${P}|Storing videoIn`,g),O(r,JSON.stringify({id:g.getId(),type:g.getType(),label:g.getLabel()})))}),[r,g]),{userMediaDevices:L,selectedAudioIn:l,selectedAudioInId:null==l?void 0:l.getId(),setSelectedAudioIn:c,selectedAudioOut:d,selectedAudioOutId:null==d?void 0:d.getId(),setSelectedAudioOut:b,selectedVideoIn:g,selectedVideoInId:null==g?void 0:g.getId(),setSelectedVideoIn:u}}const C={level:"info",isDebugEnabled:!1,isInfoEnabled:!0,isWarnEnabled:!0};function M(e){switch(e){case"debug":globalThis.apirtcReactLibLogLevel={level:"debug",isDebugEnabled:!0,isInfoEnabled:!0,isWarnEnabled:!0};break;case"info":default:globalThis.apirtcReactLibLogLevel=C;break;case"warn":globalThis.apirtcReactLibLogLevel={level:"warn",isDebugEnabled:!1,isInfoEnabled:!1,isWarnEnabled:!0};break;case"error":globalThis.apirtcReactLibLogLevel={level:"error",isDebugEnabled:!1,isInfoEnabled:!1,isWarnEnabled:!1}}return globalThis.apirtcReactLibLogLevel}globalThis.apirtcReactLibLogLevel=C,globalThis.setApirtcReactLibLogLevel=M;export{l as VideoStream,M as setLogLevel,b as useCameraStream,u as useConversation,p as useConversationContacts,v as useConversationMessages,m as useConversationModeration,R as useConversationStreams,y as usePresence,D as useSession,N as useStreamApplyAudioProcessor,A as useStreamApplyVideoProcessor,W as useUserMediaDevices};
|
|
1
|
+
import e,{useRef as t,useEffect as o,useState as n,useCallback as i,useMemo as a}from"react";import{UserAgent as r,MediaDevice as s}from"@apirtc/apirtc";function c(n){const{autoPlay:i=!0}=n,a=t(null);return o((()=>{const e=a.current;if(e&&n.stream)return n.stream.attachToElement(e),()=>{e.src=""}}),[n.stream]),e.createElement("video",{id:n.stream.getId(),style:{maxWidth:"100%"},ref:a,autoPlay:i,muted:n.muted})}const l={},d="useCameraStream";function b(e,t=l,i){const[a,r]=n(),[s,c]=n(!1),[b,u]=n();return o((()=>{if(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${d}|useEffect`,e,t),e){const o=e.getUserAgent();c(!0),o.createStream(t).then((e=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${d}|createStream`,t,e),r(e),u(void 0)})).catch((e=>{console.error(`${d}|createStream error`,t,e),r(void 0),i&&i(e),u(e)})).finally((()=>{c(!1)}))}else r(void 0),u(void 0)}),[e,t,i]),o((()=>{const e=a;if(e)return()=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${d}|release stream`,e),e.release()}}),[a]),{stream:a,grabbing:s,error:b}}const u="useConversation";function g(e,t,a,r=!0,s){const[c,l]=n(),[d,b]=n(!1),[g,L]=n(!1),p=i(((e={})=>(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${u}|join`,c,e),new Promise(((t,o)=>{c?c.isJoined()?o(`${u}|join|conversation already joined`):(L(!0),c.join(e).then((()=>{b(!0),t()})).catch((e=>{o(e)})).finally((()=>{L(!1)}))):o(`${u}|join|conversation not defined`)})))),[c]),v=i((()=>(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${u}|leave`,c),new Promise(((e,t)=>{c?c.isJoined()?c.leave().then((()=>{b(!1),e()})).catch((e=>{t(e)})):t(`${u}|leave|conversation is not joined`):t(`${u}|leave|conversation not defined`)})))),[c]);return o((()=>{if(e&&t){globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${u}|getOrCreateConversation`,t,a);const o=e.getOrCreateConversation(t,a);return l(o),()=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${u}|useEffect cleanup`,t,a),o.isJoined()?o.leave().then((()=>{})).catch((e=>{globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${u}|useEffect conversation.leave()`,e)})).finally((()=>{o.destroy()})):o.destroy(),l(void 0),b(!1)}}}),[e,t,a]),o((()=>{if(c&&r){globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${u}|useEffect`,c,r,s);const e=c,t=r;return t&&(L(!0),e.join(s).then((()=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${u}|joined`,e),b(!0)})).catch((t=>{globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${u}|useEffect conversation.join() error`,e,s,t)})).finally((()=>{L(!1)}))),()=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${u}|useEffect cleanup`,e,t),e.isJoined()&&e.leave().then((()=>{b(!1)})).catch((t=>{globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${u}|useEffect conversation.leave() error`,e,t)}))}}}),[c,a,r,s]),{conversation:c,joining:g,joined:d,join:p,leave:v}}const L="useConversationContacts";function p(e,t,i){const[a,r]=n([]);return o((()=>{if(e){const o=o=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${L}|on:contactJoined:`,e.getName(),o),r((e=>[...e,o])),t&&t(o)};e.on("contactJoined",o);const n=t=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${L}|on:contactLeft:`,e.getName(),t),r((e=>e.filter((e=>e!==t)))),i&&i(t)};return e.on("contactLeft",n),()=>{e.removeListener("contactJoined",o),e.removeListener("contactLeft",n),r(new Array)}}}),[e,t,i]),{contacts:a}}const v="useConversationMessages";function f(e){const[t,a]=n([]);o((()=>{if(e){const t=t=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${v}|on:message:`,e.getName(),t),a((e=>[...e,t]))};return e.on("message",t),()=>{e.removeListener("message",t),a(new Array)}}}),[e]);return{messages:t,sendMessage:i(((t,o)=>new Promise(((n,i)=>{null==e||e.sendMessage(t).then((i=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${v}|sentMessage`,e.getName(),i,t),a((e=>[...e,{content:t,sender:o,time:new Date}])),n()})).catch((e=>{globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${v}|sendMessage error`,e),i(e)}))}))),[e])}}const h="useConversationModeration";function m(e,t,i){const[a,r]=n(new Set);return o((()=>{if(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${h}|useEffect conversation`,e),e){const o=e=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${h}|on:contactJoinedWaitingRoom`,e),r((t=>new Set(t.add(e))))},n=e=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${h}|on:contactLeftWaitingRoom`,e),r((t=>(t.delete(e),new Set(t))))},a=e=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${h}|on:participantEjected`,e),!0===e.self?(globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${h}|Self participant was ejected`),i&&i()):t&&t(e.contact)};return e.on("contactJoinedWaitingRoom",o).on("contactLeftWaitingRoom",n).on("participantEjected",a),()=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${h}|conversation clear`,e),e.removeListener("contactJoinedWaitingRoom",o).removeListener("contactLeftWaitingRoom",n).removeListener("participantEjected",a),r(new Set)}}}),[e,t,i]),{candidates:a}}function E(e){return null!=e}const T=[],$="useConversationStreams";function R(e,a=T,r){globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${$}|hook render|${null==e?void 0:e.getName()}`,a.map((e=>null==e?void 0:e.options)));const s=t([]),[c,l]=n(new Array),[d,b]=n(new Array),u=i(((t,o)=>new Promise(((n,i)=>{e&&(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${$}|publish|${e.getName()}`,t,o),e.publish(t,o).then((t=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${$}|published|${e.getName()}`,t),l((e=>[...e,t])),n(t)})).catch((e=>{i(e)})))}))),[e]),g=i(((t,o)=>new Promise(((n,i)=>{e&&(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${$}|replacePublishedStream|${e.getName()}|${t.getId()} -> ${o.getId()}`),e.replacePublishedStream(t,o).then((o=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${$}|stream replaced|${e.getName()}`,t,o),l((e=>{const n=e.indexOf(t);return n>=0&&e.splice(n,1,o),Array.from(e)})),n(o)})).catch((e=>{i(e)})))}))),[e]),L=i((t=>{e&&(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${$}|unpublish|${e.getName()}`,t.getId(),t),e.unpublish(t),l((e=>e.filter((e=>e!==t)))))}),[e]),p=i((()=>{const t=Math.max(s.current.length,a.length);globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${$}|doHandlePublication`,a,JSON.stringify(s.current.map((e=>null==e?void 0:e.stream.getId()))),JSON.stringify(a.map((e=>null==e?void 0:e.stream.getId()))),t);const o=[...s.current],n=a.map((e=>e&&e.options?{stream:e.stream,options:Object.assign({},e.options)}:e));s.current.length=0,s.current.push(...n);const i=new Set(a.filter(E).map((e=>e.stream))),c=(e,t)=>{u(t.stream,t.options).catch((t=>{s.current.splice(e,1,null),r?r(t):globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${$}|publish|error`,t)}))};for(let n=0;n<t;n++){const t=o[n],l=a[n];if(t&&l){const o=()=>{L(t.stream),c(n,l)};t.stream===l.stream?JSON.stringify(t.options)!==JSON.stringify(l.options)&&o():i.has(t.stream)?e&&!e.isPublishedStream(l.stream)&&c(n,l):e&&!e.isPublishedStream(l.stream)?JSON.stringify(t.options)===JSON.stringify(l.options)?g(t.stream,l.stream).catch((e=>{s.current.splice(n,1,null),r?r(e):globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${$}|replacePublishedStream|error`,e)})):o():L(t.stream)}else t&&!l?i.has(t.stream)||L(t.stream):!t&&l&&e&&!e.isPublishedStream(l.stream)&&c(n,l)}}),[e,a,u,L,g,r]),v=i((()=>{e&&l((t=>(t.forEach((t=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${$}|unpublish|${e.getName()}`,t),e.unpublish(t)})),[]))),s.current.length=0}),[e]),f=i((()=>{e&&b((t=>(t.forEach((t=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${$}|unsubscribeToStream|${e.getName()}`,t),e.unsubscribeToStream(t.getId())})),[])))}),[e]),h=i((()=>{v(),f()}),[v,f]);return o((()=>{if(e){s.current.length=0;const t=t=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${$}|on_streamAdded|${e.getName()}`,t),b((e=>[...e,t]))},o=t=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${$}|on_streamRemoved|${e.getName()}`,t),b((e=>e.filter((e=>e!==t))))},n=t=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${$}|on_streamListChanged|${e.getName()}`,t);const o=String(t.streamId);!0===t.isRemote&&("added"===t.listEventType?e.subscribeToStream(o):"removed"===t.listEventType&&e.unsubscribeToStream(o))};return e.on("streamAdded",t),e.on("streamRemoved",o),e.on("streamListChanged",n),()=>{e.removeListener("streamListChanged",n),e.removeListener("streamRemoved",o),e.removeListener("streamAdded",t),h()}}}),[e,h]),o((()=>{if(e){globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${$}|useEffect doHandlePublication|${e.getName()}`,a);const t=()=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${$}|on_joined|${e.getName()}`),p()},o=()=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${$}|on_left|${e.getName()}`),h()};return e.on("joined",t),e.on("left",o),e.isJoined()&&p(),()=>{e.removeListener("joined",t),e.removeListener("left",o)}}}),[e,a,p,h]),{publishedStreams:c,subscribedStreams:d,publish:u,unpublish:L,replacePublishedStream:g,unpublishAll:v,unsubscribeAll:f}}const S="usePresence";function y(e,i){const a=t(new Set),r=t(new Map),[s,c]=n(new Map);o((()=>{if(e){const e=a.current,t=r.current;return()=>{e.clear(),t.clear(),c(new Map)}}}),[e]);const l=e=>{var t;const o=null!==(t=r.current.get(e))&&void 0!==t?t:new Set;return r.current.has(e)||r.current.set(e,o),o};return o((()=>{if(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${S}|useEffect session, groups`,i),e){const t=e,o=new Set(i);o.forEach((e=>{a.current.has(e)||(globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${S}|subscribeToGroup`,e),a.current.add(e),t.subscribeToGroup(e))}));let n=!1;if(a.current.forEach((e=>{o.has(e)||(globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${S}|unsubscribeToGroup`,e),t.unsubscribeToGroup(e),a.current.delete(e),r.current.delete(e),n=!0)})),n&&c(new Map(r.current)),i.length>0){const e=e=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${S}|contactListUpdate`,e);let t=!1;for(const n of Object.keys(e.joinedGroup))if(o.has(n)){const o=l(n);for(const i of e.joinedGroup[n])o.add(i),t=!0}for(const n of Object.keys(e.leftGroup))if(o.has(n)){const o=l(n);for(const i of e.leftGroup[n])o.delete(i),t=!0,0===o.size&&r.current.delete(n)}for(const o of e.userDataChanged)for(const e of r.current.values())if(e.has(o)){t=!0;break}t&&c(new Map(r.current))};return t.on("contactListUpdate",e),()=>{t.removeListener("contactListUpdate",e)}}}}),[e,i]),{contactsByGroup:s}}const w="useSession";function I(e,t,i){const[a,s]=n(),[c,l]=n(!1);o((()=>{if(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${w}|useEffect credentials, options`,e,t),e)return d(e,t).catch((e=>{console.error(`${w}|connection failed`,e),s(void 0),i?i(e):globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${w}|connect|error`,e)})),()=>{s(void 0),l(!1)}}),[e,t,i]),o((()=>{if(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${w}|useEffect session`,a),a){const e=a;return()=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${w}|useEffect session cleanup`,e),e.disconnect().then((()=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${w}|disconnected`,e)})).catch((e=>{console.error(`${w}|disconnect`,e)}))}}}),[a]);const d=(e,t)=>new Promise(((o,n)=>{const i=t||{cloudUrl:"https://cloud.apirtc.com"};let a;if("object"==typeof(c=e)&&"username"in c)i.password=e.password,a=new r({uri:`apirtc:${e.username}`});else if(function(e){return"object"==typeof e&&"apiKey"in e}(e))a=new r({uri:`apiKey:${e.apiKey}`});else{if(!function(e){return"object"==typeof e&&"token"in e}(e))return void n("credentials not recognized");a=new r({uri:`token:${e.token}`})}var c;l(!0),a.register(i).then((e=>{globalThis.apirtcReactLibLogLevel.isInfoEnabled&&console.info(`${w}|connected`,e),s(e),o()})).catch((e=>{n(e)})).finally((()=>{l(!1)}))}));return{session:a,connecting:c,connect:d,disconnect:()=>{s(void 0)}}}const D="useStreamApplyAudioProcessor";function N(e,i,a){const r=t(),[s,c]=n(e),[l,d]=n(!1),[b,u]=n();return o((()=>()=>{r.current=void 0}),[e]),o((()=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${D}|useEffect`,e,i),c(e);const t=r.current||(null==e?void 0:e.audioAppliedFilter)||"none";return e&&i!==t&&(d(!0),e.applyAudioProcessor(i).then((e=>{c(e),r.current=i,u(void 0)})).catch((t=>{u(t),a?a(t):globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${D}|useEffect`,e,i,t)})).finally((()=>{d(!1)}))),()=>{u(void 0)}}),[e,i,a]),{stream:s,applying:l,applied:r.current||(null==e?void 0:e.audioAppliedFilter)||"none",error:b}}const j="useStreamApplyVideoProcessor";function A(e,i,a,r){const s=t(),[c,l]=n(e),[d,b]=n(!1),[u,g]=n();return o((()=>()=>{s.current=void 0}),[e]),o((()=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${j}|useEffect`,e,i,a),l(e);const t=s.current||(null==e?void 0:e.videoAppliedFilter)||"none";return e&&i!==t&&(b(!0),e.applyVideoProcessor(i,a).then((e=>{l(e),s.current=i,g(void 0)})).catch((t=>{g(t),r?r(t):globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${j}|useEffect`,e,i,a,t)})).finally((()=>{b(!1)}))),()=>{g(void 0)}}),[e,i,a,r]),{stream:c,applying:d,applied:s.current||(null==e?void 0:e.videoAppliedFilter)||"none",error:u}}const W="useUserMediaDevices",P=e=>{try{const t=localStorage.getItem(e),o=t?JSON.parse(t):null;return o?new s(o.id,o.type,o.label):void 0}catch(e){return void console.warn(`${W}|getMediaDeviceFromLocalStorage`,e)}},J=(e,t)=>{try{localStorage.setItem(e,t)}catch(e){}};function O(e,t){const i=a((()=>t?`${t}.audioIn`:void 0),[t]),r=a((()=>t?`${t}.audioOut`:void 0),[t]),s=a((()=>t?`${t}.videoIn`:void 0),[t]),[c,l]=n((()=>i?P(i):void 0)),[d,b]=n((()=>r?P(r):void 0)),[u,g]=n((()=>s?P(s):void 0)),[L,p]=n({audioinput:c?{[c.getId()]:c}:{},audiooutput:d?{[d.getId()]:d}:{},videoinput:u?{[u.getId()]:u}:{}});return o((()=>{if(e){const t=e.getUserAgent(),o=()=>{const e=t.getUserMediaDevices();globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${W}|mediaDeviceChanged`,e),p(e),l((t=>t?e.audioinput[t.getId()]:void 0)),b((t=>t?e.audiooutput[t.getId()]:void 0)),g((t=>t?e.videoinput[t.getId()]:void 0))};return t.on("mediaDeviceChanged",o),()=>{t.removeListener("mediaDeviceChanged",o)}}}),[e]),o((()=>{c&&i&&(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${W}|Storing audioIn`,c),J(i,JSON.stringify({id:c.getId(),type:c.getType(),label:c.getLabel()})))}),[i,c]),o((()=>{d&&r&&(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${W}|Storing audioOut`,d),J(r,JSON.stringify({id:d.getId(),type:d.getType(),label:d.getLabel()})))}),[r,d]),o((()=>{u&&s&&(globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${W}|Storing videoIn`,u),J(s,JSON.stringify({id:u.getId(),type:u.getType(),label:u.getLabel()})))}),[s,u]),{userMediaDevices:L,selectedAudioIn:c,selectedAudioInId:null==c?void 0:c.getId(),setSelectedAudioIn:l,selectedAudioOut:d,selectedAudioOutId:null==d?void 0:d.getId(),setSelectedAudioOut:b,selectedVideoIn:u,selectedVideoInId:null==u?void 0:u.getId(),setSelectedVideoIn:g}}function C(e,t,o,n){return new(o||(o=Promise))((function(i,a){function r(e){try{c(n.next(e))}catch(e){a(e)}}function s(e){try{c(n.throw(e))}catch(e){a(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(r,s)}c((n=n.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;const M="useTranscriptService";function k(e,t){const[a,r]=n(null),[s,c]=n(!1),[l,d]=n([]);o((()=>{if(a)return;let e=!0;return import("@apizee/ia").then((({TranscriptService:t})=>{if(!e)return void(globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${M}|instanciation aborted - component unmounted`));const o=new t;r(o)})),()=>{e=!1}}),[a]),o((()=>{if(!a)return void(globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${M}|useEffect transcript listener skipped - transcriptService not ready`));const e=e=>{const{transcript:t}=e;globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${M}|onTranscript`,t),d((e=>[...e,t]))};return a.addEventListener("transcript",e),()=>{a.removeEventListener("transcript",e),globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${M}|useEffect cleanup`,"onTranscript")}}),[a]);const b=i((()=>C(this,void 0,void 0,(function*(){globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${M}|startTranscriptService transcriptService, hasStarted`,a,s),a?s?globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${M}|startTranscriptService aborted - already started`):e?yield a.start(e).then((()=>{console.log(`${M}|startTranscriptService - started`),c(!0)})).catch((e=>{console.error(`${M}|startTranscriptService - failed`,e)})):console.warn(`${M}|startTranscriptService aborted - conversation not provided`):globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${M}|startTranscriptService aborted - transcriptService not initialized`)}))),[a,s,e]),u=i((()=>C(this,void 0,void 0,(function*(){a?e?yield a.stop(e).then((()=>{console.log(`${M}|stopTranscriptService - stopped`),c(!1)})).catch((e=>{console.error(`${M}|stopTranscriptService - failed`,e)})):console.warn(`${M}|stopTranscriptService aborted - conversation not provided`):globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${M}|stopTranscriptService aborted - transcriptService not initialized`)}))),[a,e]);return o((()=>{globalThis.apirtcReactLibLogLevel.isDebugEnabled&&console.debug(`${M}|useEffect autoStartTranscriptService autoStart, conversation`,t,e),t?e?b():globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${M}|useEffect - auto start transcription not possible if conversation not provided`):globalThis.apirtcReactLibLogLevel.isWarnEnabled&&console.warn(`${M}|useEffect autoStart skipped - autoStart=false`)}),[t,e,b]),{transcriptService:a,hasStarted:s,transcripts:l,startTranscriptService:b,stopTranscriptService:u}}const G={level:"info",isDebugEnabled:!1,isInfoEnabled:!0,isWarnEnabled:!0};function U(e){switch(e){case"debug":globalThis.apirtcReactLibLogLevel={level:"debug",isDebugEnabled:!0,isInfoEnabled:!0,isWarnEnabled:!0};break;case"info":default:globalThis.apirtcReactLibLogLevel=G;break;case"warn":globalThis.apirtcReactLibLogLevel={level:"warn",isDebugEnabled:!1,isInfoEnabled:!1,isWarnEnabled:!0};break;case"error":globalThis.apirtcReactLibLogLevel={level:"error",isDebugEnabled:!1,isInfoEnabled:!1,isWarnEnabled:!1}}return globalThis.apirtcReactLibLogLevel}globalThis.apirtcReactLibLogLevel=G,globalThis.setApirtcReactLibLogLevel=U;export{c as VideoStream,U as setLogLevel,b as useCameraStream,g as useConversation,p as useConversationContacts,f as useConversationMessages,m as useConversationModeration,R as useConversationStreams,y as usePresence,I as useSession,N as useStreamApplyAudioProcessor,A as useStreamApplyVideoProcessor,k as useTranscriptService,O as useUserMediaDevices};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|