sip-connector 19.9.0 → 20.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +131 -37
- package/dist/{@SipConnector-BpypVXj0.js → @SipConnector-BTzZa4hh.js} +862 -554
- package/dist/@SipConnector-DL_XXmJn.cjs +1 -0
- package/dist/ApiManager/eventNames.d.ts +10 -3
- package/dist/CallManager/@CallManager.d.ts +18 -4
- package/dist/CallManager/MCUSession.d.ts +0 -1
- package/dist/CallManager/RecvSession.d.ts +1 -1
- package/dist/CallManager/RemoteStreamsManager.d.ts +20 -5
- package/dist/CallManager/RoleManager.d.ts +31 -0
- package/dist/CallManager/eventNames.d.ts +9 -2
- package/dist/CallManager/index.d.ts +1 -1
- package/dist/CallManager/types.d.ts +17 -5
- package/dist/ConnectionManager/@ConnectionManager.d.ts +2 -2
- package/dist/ConnectionManager/ConfigurationManager.d.ts +6 -1
- package/dist/ConnectionManager/ConnectionFlow.d.ts +5 -4
- package/dist/ConnectionManager/SipOperations.d.ts +2 -2
- package/dist/ConnectionManager/UAFactory.d.ts +4 -4
- package/dist/SipConnector/@SipConnector.d.ts +4 -2
- package/dist/SipConnector/eventNames.d.ts +1 -1
- package/dist/SipConnectorFacade/@SipConnectorFacade.d.ts +0 -2
- package/dist/VideoSendingBalancer/__fixtures__/createMockTrack.d.ts +1 -1
- package/dist/__fixtures__/RTCPeerConnectionMock.d.ts +1 -1
- package/dist/__fixtures__/index.d.ts +4 -4
- package/dist/doMock.cjs +1 -1
- package/dist/doMock.js +23 -21
- package/dist/index.cjs +1 -1
- package/dist/index.js +156 -171
- package/dist/tools/__fixtures__/connectToServer.d.ts +15 -15
- package/dist/tools/__fixtures__/permissions.d.ts +2 -2
- package/dist/tools/__fixtures__/processRequest.d.ts +2 -2
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/sendOffer.d.ts +39 -0
- package/dist/utils/utils.d.ts +1 -1
- package/package.json +4 -4
- package/dist/@SipConnector-CR3DyIpB.cjs +0 -1
package/README.md
CHANGED
|
@@ -95,11 +95,11 @@ const facade = new SipConnectorFacade(sipConnector);
|
|
|
95
95
|
// Подключение с объектом параметров
|
|
96
96
|
await facade.connectToServer({
|
|
97
97
|
userAgent: tools.getUserAgent({ appName: 'MyApp' }),
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
98
|
+
sipServerUrl: 'sip.example.com', // WebSocket URL (путь /webrtc/wss/ добавляется автоматически)
|
|
99
|
+
sipServerIp: 'sip.example.com', // SIP сервер IP
|
|
100
|
+
user: '1001', // SIP URI user part
|
|
101
101
|
password: 'secret',
|
|
102
|
-
|
|
102
|
+
register: true, // Включить SIP REGISTER
|
|
103
103
|
});
|
|
104
104
|
|
|
105
105
|
// Или с функцией для динамического получения параметров
|
|
@@ -108,11 +108,11 @@ await facade.connectToServer(async () => {
|
|
|
108
108
|
const config = await fetchConnectionConfig();
|
|
109
109
|
return {
|
|
110
110
|
userAgent: tools.getUserAgent({ appName: 'MyApp' }),
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
111
|
+
sipServerUrl: config.websocketUrl, // Без пути /webrtc/wss/ - он добавляется автоматически
|
|
112
|
+
sipServerIp: config.sipServerIp,
|
|
113
|
+
user: config.username,
|
|
114
114
|
password: config.password,
|
|
115
|
-
|
|
115
|
+
register: true,
|
|
116
116
|
};
|
|
117
117
|
});
|
|
118
118
|
```
|
|
@@ -126,14 +126,23 @@ const localStream = await navigator.mediaDevices.getUserMedia({
|
|
|
126
126
|
video: true,
|
|
127
127
|
});
|
|
128
128
|
|
|
129
|
+
// Подписка на изменения удаленных потоков
|
|
130
|
+
const unsubscribeRemoteStreams = sipConnector.on('call:remote-streams-changed', (event) => {
|
|
131
|
+
console.log('Изменение удаленных потоков:', {
|
|
132
|
+
participantId: event.participantId,
|
|
133
|
+
changeType: event.changeType, // 'added' | 'removed'
|
|
134
|
+
trackId: event.trackId,
|
|
135
|
+
streams: event.streams, // Актуальный массив всех удаленных потоков
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
// Обновление UI с новыми потоками
|
|
139
|
+
updateRemoteStreamsDisplay(event.streams);
|
|
140
|
+
});
|
|
141
|
+
|
|
129
142
|
// Инициация звонка
|
|
130
143
|
const pc = await facade.callToServer({
|
|
131
144
|
conference: '12345',
|
|
132
145
|
mediaStream: localStream,
|
|
133
|
-
setRemoteStreams: (streams) => {
|
|
134
|
-
// Обработка удаленных потоков
|
|
135
|
-
console.log('Получены удаленные потоки:', streams);
|
|
136
|
-
},
|
|
137
146
|
});
|
|
138
147
|
|
|
139
148
|
// Подписка на WebRTC-статистику
|
|
@@ -148,6 +157,7 @@ const unsubscribeStats = facade.onStats(({ outbound, inbound }) => {
|
|
|
148
157
|
```typescript
|
|
149
158
|
await facade.disconnectFromServer();
|
|
150
159
|
unsubscribeStats();
|
|
160
|
+
unsubscribeRemoteStreams();
|
|
151
161
|
```
|
|
152
162
|
|
|
153
163
|
---
|
|
@@ -157,15 +167,17 @@ unsubscribeStats();
|
|
|
157
167
|
### Обработка входящих вызовов
|
|
158
168
|
|
|
159
169
|
```typescript
|
|
170
|
+
// Подписка на изменения удаленных потоков (до ответа на звонок)
|
|
171
|
+
const unsubscribeRemoteStreams = sipConnector.on('call:remote-streams-changed', (event) => {
|
|
172
|
+
console.log('Изменение удаленных потоков:', event);
|
|
173
|
+
displayRemoteStreams(event.streams);
|
|
174
|
+
});
|
|
175
|
+
|
|
160
176
|
// Подписка на входящие события
|
|
161
177
|
sipConnector.on('incoming-call:incomingCall', () => {
|
|
162
178
|
// Автоматический ответ с локальным потоком
|
|
163
179
|
facade.answerToIncomingCall({
|
|
164
180
|
mediaStream: localStream,
|
|
165
|
-
setRemoteStreams: (streams) => {
|
|
166
|
-
// Отображение удаленных потоков
|
|
167
|
-
displayRemoteStreams(streams);
|
|
168
|
-
},
|
|
169
181
|
});
|
|
170
182
|
});
|
|
171
183
|
```
|
|
@@ -277,20 +289,40 @@ await facade.startPresentation({
|
|
|
277
289
|
### Отслеживание перемещений
|
|
278
290
|
|
|
279
291
|
```typescript
|
|
280
|
-
// Подписка на перемещение в зрители
|
|
281
|
-
const unsubscribeMoveToSpectators =
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
292
|
+
// Подписка на перемещение в зрители (новый формат с audioId)
|
|
293
|
+
const unsubscribeMoveToSpectators = sipConnector.on(
|
|
294
|
+
'api:participant:move-request-to-spectators',
|
|
295
|
+
(data) => {
|
|
296
|
+
if (data.isSynthetic) {
|
|
297
|
+
console.log('Участник перемещен в зрители (синтетическое событие)');
|
|
298
|
+
} else {
|
|
299
|
+
console.log('Участник перемещен в зрители с audioId:', data.audioId);
|
|
300
|
+
}
|
|
301
|
+
updateParticipantRole('spectator');
|
|
302
|
+
},
|
|
303
|
+
);
|
|
304
|
+
|
|
305
|
+
// Подписка на перемещение в зрители (старый формат для обратной совместимости)
|
|
306
|
+
const unsubscribeMoveToSpectatorsSynthetic = sipConnector.on(
|
|
307
|
+
'api:participant:move-request-to-spectators-synthetic',
|
|
308
|
+
() => {
|
|
309
|
+
console.log('Участник перемещен в зрители (старый формат)');
|
|
310
|
+
updateParticipantRole('spectator');
|
|
311
|
+
},
|
|
312
|
+
);
|
|
285
313
|
|
|
286
314
|
// Подписка на перемещение в участники
|
|
287
|
-
const unsubscribeMoveToParticipants =
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
315
|
+
const unsubscribeMoveToParticipants = sipConnector.on(
|
|
316
|
+
'api:participant:move-request-to-participants',
|
|
317
|
+
() => {
|
|
318
|
+
console.log('Участник перемещен в участники');
|
|
319
|
+
updateParticipantRole('participant');
|
|
320
|
+
},
|
|
321
|
+
);
|
|
291
322
|
|
|
292
323
|
// Отписка при необходимости
|
|
293
324
|
unsubscribeMoveToSpectators();
|
|
325
|
+
unsubscribeMoveToSpectatorsSynthetic();
|
|
294
326
|
unsubscribeMoveToParticipants();
|
|
295
327
|
```
|
|
296
328
|
|
|
@@ -317,7 +349,24 @@ facade.onUseLicense((license) => {
|
|
|
317
349
|
### Работа с удаленными потоками
|
|
318
350
|
|
|
319
351
|
```typescript
|
|
320
|
-
//
|
|
352
|
+
// Подписка на изменения удаленных потоков
|
|
353
|
+
let currentRemoteStreams: MediaStream[] = [];
|
|
354
|
+
|
|
355
|
+
const unsubscribeRemoteStreams = sipConnector.on('call:remote-streams-changed', (event) => {
|
|
356
|
+
console.log('Изменение удаленных потоков:', {
|
|
357
|
+
participantId: event.participantId,
|
|
358
|
+
changeType: event.changeType, // 'added' | 'removed'
|
|
359
|
+
trackId: event.trackId,
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
// Обновляем текущие потоки
|
|
363
|
+
currentRemoteStreams = event.streams;
|
|
364
|
+
|
|
365
|
+
// Обновляем UI
|
|
366
|
+
updateStreamsDisplay(event.streams);
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
// Получение текущих удаленных потоков (синхронный метод)
|
|
321
370
|
const remoteStreams = facade.getRemoteStreams();
|
|
322
371
|
if (remoteStreams) {
|
|
323
372
|
console.log('Активные удаленные потоки:', remoteStreams.length);
|
|
@@ -432,15 +481,15 @@ sipConnector.on('api:restart', (data) => {
|
|
|
432
481
|
|
|
433
482
|
SDK использует **событийно-ориентированную архитектуру** с префиксами для группировки:
|
|
434
483
|
|
|
435
|
-
| Префикс | Описание | Примеры событий
|
|
436
|
-
| ------------------ | ------------------------ |
|
|
437
|
-
| `connection:*` | События подключения | `connected`, `disconnected`
|
|
438
|
-
| `call:*` | События звонков | `accepted`, `ended`, `failed`
|
|
439
|
-
| `api:*` | События от сервера | `enterRoom`, `useLicense`, `restart`
|
|
440
|
-
| `incoming-call:*` | События входящих звонков | `incomingCall`
|
|
441
|
-
| `presentation:*` | События презентаций | `started`, `stopped`
|
|
442
|
-
| `stats:*` | События статистики | `collected`
|
|
443
|
-
| `video-balancer:*` | События балансировки | `balancing-started`, `parameters-updated`
|
|
484
|
+
| Префикс | Описание | Примеры событий |
|
|
485
|
+
| ------------------ | ------------------------ | ------------------------------------------------------------------------------ |
|
|
486
|
+
| `connection:*` | События подключения | `connected`, `disconnected` |
|
|
487
|
+
| `call:*` | События звонков | `accepted`, `ended`, `failed`, `remote-streams-changed` |
|
|
488
|
+
| `api:*` | События от сервера | `enterRoom`, `useLicense`, `restart`, `participant:move-request-to-spectators` |
|
|
489
|
+
| `incoming-call:*` | События входящих звонков | `incomingCall` |
|
|
490
|
+
| `presentation:*` | События презентаций | `started`, `stopped` |
|
|
491
|
+
| `stats:*` | События статистики | `collected` |
|
|
492
|
+
| `video-balancer:*` | События балансировки | `balancing-started`, `parameters-updated` |
|
|
444
493
|
|
|
445
494
|
### Основные события
|
|
446
495
|
|
|
@@ -475,8 +524,50 @@ sipConnector.on('api:useLicense', (license) => {
|
|
|
475
524
|
sipConnector.on('api:restart', (data) => {
|
|
476
525
|
console.log('Событие restart от сервера:', data);
|
|
477
526
|
});
|
|
527
|
+
|
|
528
|
+
// Изменения удаленных потоков
|
|
529
|
+
sipConnector.on('call:remote-streams-changed', (event) => {
|
|
530
|
+
console.log('Изменение удаленных потоков:', {
|
|
531
|
+
participantId: event.participantId,
|
|
532
|
+
changeType: event.changeType, // 'added' | 'removed'
|
|
533
|
+
trackId: event.trackId,
|
|
534
|
+
streams: event.streams,
|
|
535
|
+
});
|
|
536
|
+
});
|
|
537
|
+
|
|
538
|
+
// Перемещение участников
|
|
539
|
+
sipConnector.on('api:participant:move-request-to-spectators', (data) => {
|
|
540
|
+
if (data.isSynthetic) {
|
|
541
|
+
console.log('Перемещение в зрители (синтетическое)');
|
|
542
|
+
} else {
|
|
543
|
+
console.log('Перемещение в зрители с audioId:', data.audioId);
|
|
544
|
+
}
|
|
545
|
+
});
|
|
546
|
+
|
|
547
|
+
sipConnector.on('api:participant:move-request-to-spectators-synthetic', () => {
|
|
548
|
+
console.log('Перемещение в зрители (старый формат для обратной совместимости)');
|
|
549
|
+
});
|
|
478
550
|
```
|
|
479
551
|
|
|
552
|
+
### Детальная таблица событий
|
|
553
|
+
|
|
554
|
+
#### События звонков (`call:*`)
|
|
555
|
+
|
|
556
|
+
| Событие | Описание | Данные |
|
|
557
|
+
| ----------------------------- | --------------------------- | ------------------------------------------------------------------------------------------------------ |
|
|
558
|
+
| `call:accepted` | Звонок принят | - |
|
|
559
|
+
| `call:ended` | Звонок завершен | `EndEvent` |
|
|
560
|
+
| `call:failed` | Звонок завершился с ошибкой | `EndEvent` |
|
|
561
|
+
| `call:remote-streams-changed` | Изменение удаленных потоков | `{ participantId: string, changeType: 'added' \| 'removed', trackId: string, streams: MediaStream[] }` |
|
|
562
|
+
|
|
563
|
+
#### События участников (`api:participant:*`)
|
|
564
|
+
|
|
565
|
+
| Событие | Описание | Данные |
|
|
566
|
+
| ------------------------------------------------------ | ------------------------------ | ------------------------------------------------------------------ |
|
|
567
|
+
| `api:participant:move-request-to-spectators` | Перемещение в зрители (новый) | `{ isSynthetic: true } \| { isSynthetic: false, audioId: string }` |
|
|
568
|
+
| `api:participant:move-request-to-spectators-synthetic` | Перемещение в зрители (старый) | - |
|
|
569
|
+
| `api:participant:move-request-to-participants` | Перемещение в участники | - |
|
|
570
|
+
|
|
480
571
|
### Продвинутые паттерны
|
|
481
572
|
|
|
482
573
|
```typescript
|
|
@@ -759,8 +850,11 @@ sipConnector.startAutoConnect({
|
|
|
759
850
|
getParameters: async () => {
|
|
760
851
|
return {
|
|
761
852
|
displayName: 'displayName',
|
|
762
|
-
|
|
763
|
-
|
|
853
|
+
sipServerUrl: 'example.com', // Путь /webrtc/wss/ добавляется автоматически
|
|
854
|
+
sipServerIp: 'sip.example.com',
|
|
855
|
+
user: 'user',
|
|
856
|
+
password: 'password',
|
|
857
|
+
register: true,
|
|
764
858
|
};
|
|
765
859
|
},
|
|
766
860
|
// Проверяет готовность к подключению
|