@voicenter-team/opensips-js 1.0.22 → 1.0.45
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/dist/index.d.ts +732 -0
- package/dist/opensips-js.cjs.js +155 -0
- package/dist/opensips-js.es.js +21367 -0
- package/dist/opensips-js.iife.js +155 -0
- package/dist/opensips-js.umd.js +155 -0
- package/package.json +14 -8
- package/src/types/Dialog.d.ts +7 -0
- package/src/types/Socket.d.ts +8 -0
- package/src/types/UAExtended.d.ts +22 -14
- package/src/types/listeners.d.ts +12 -4
- package/src/types/msrp.d.ts +15 -9
- package/src/types/rtc.d.ts +15 -5
- package/src/types/timer.d.ts +7 -0
- package/build/enum/call.event.listener.type.d.ts +0 -7
- package/build/enum/call.event.listener.type.js +0 -10
- package/build/enum/message.event.listener.type.d.ts +0 -5
- package/build/enum/message.event.listener.type.js +0 -8
- package/build/enum/metric.keys.to.include.d.ts +0 -2
- package/build/enum/metric.keys.to.include.js +0 -4
- package/build/enum/session.direction.enum.d.ts +0 -2
- package/build/enum/session.direction.enum.js +0 -5
- package/build/helpers/UA/index.d.ts +0 -41
- package/build/helpers/UA/index.js +0 -318
- package/build/helpers/audio.helper.d.ts +0 -15
- package/build/helpers/audio.helper.js +0 -97
- package/build/helpers/filter.helper.d.ts +0 -2
- package/build/helpers/filter.helper.js +0 -14
- package/build/helpers/jssip.d.ts +0 -5
- package/build/helpers/jssip.js +0 -30
- package/build/helpers/time.helper.d.ts +0 -16
- package/build/helpers/time.helper.js +0 -28
- package/build/helpers/volume.helper.d.ts +0 -2
- package/build/helpers/volume.helper.js +0 -76
- package/build/helpers/webrtcmetrics/collector.d.ts +0 -32
- package/build/helpers/webrtcmetrics/collector.js +0 -282
- package/build/helpers/webrtcmetrics/engine.d.ts +0 -20
- package/build/helpers/webrtcmetrics/engine.js +0 -164
- package/build/helpers/webrtcmetrics/exporter.d.ts +0 -116
- package/build/helpers/webrtcmetrics/exporter.js +0 -528
- package/build/helpers/webrtcmetrics/extractor.d.ts +0 -1
- package/build/helpers/webrtcmetrics/extractor.js +0 -976
- package/build/helpers/webrtcmetrics/index.d.ts +0 -63
- package/build/helpers/webrtcmetrics/index.js +0 -93
- package/build/helpers/webrtcmetrics/metrics.d.ts +0 -2
- package/build/helpers/webrtcmetrics/metrics.js +0 -8
- package/build/helpers/webrtcmetrics/probe.d.ts +0 -76
- package/build/helpers/webrtcmetrics/probe.js +0 -153
- package/build/helpers/webrtcmetrics/utils/config.d.ts +0 -12
- package/build/helpers/webrtcmetrics/utils/config.js +0 -28
- package/build/helpers/webrtcmetrics/utils/helper.d.ts +0 -13
- package/build/helpers/webrtcmetrics/utils/helper.js +0 -134
- package/build/helpers/webrtcmetrics/utils/log.d.ts +0 -7
- package/build/helpers/webrtcmetrics/utils/log.js +0 -71
- package/build/helpers/webrtcmetrics/utils/models.d.ts +0 -309
- package/build/helpers/webrtcmetrics/utils/models.js +0 -298
- package/build/helpers/webrtcmetrics/utils/score.d.ts +0 -4
- package/build/helpers/webrtcmetrics/utils/score.js +0 -235
- package/build/helpers/webrtcmetrics/utils/shortUUId.d.ts +0 -1
- package/build/helpers/webrtcmetrics/utils/shortUUId.js +0 -7
- package/build/index.d.ts +0 -180
- package/build/index.js +0 -1141
- package/build/lib/msrp/message.d.ts +0 -12
- package/build/lib/msrp/message.js +0 -82
- package/build/lib/msrp/session.d.ts +0 -94
- package/build/lib/msrp/session.js +0 -621
package/build/index.js
DELETED
@@ -1,1141 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
9
|
-
});
|
10
|
-
};
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
13
|
-
};
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
15
|
-
const UA_1 = __importDefault(require("./helpers/UA"));
|
16
|
-
const p_iteration_1 = require("p-iteration");
|
17
|
-
const time_helper_1 = require("./helpers/time.helper");
|
18
|
-
const filter_helper_1 = require("./helpers/filter.helper");
|
19
|
-
const audio_helper_1 = require("./helpers/audio.helper");
|
20
|
-
const metrics_1 = __importDefault(require("./helpers/webrtcmetrics/metrics"));
|
21
|
-
const JsSIP_1 = __importDefault(require("jssip/lib/JsSIP"));
|
22
|
-
const metric_keys_to_include_1 = require("./enum/metric.keys.to.include");
|
23
|
-
const call_event_listener_type_1 = require("./enum/call.event.listener.type");
|
24
|
-
const CALL_STATUS_UNANSWERED = 0;
|
25
|
-
const STORAGE_KEYS = {
|
26
|
-
SELECTED_INPUT_DEVICE: 'selectedInputDevice',
|
27
|
-
SELECTED_OUTPUT_DEVICE: 'selectedOutputDevice'
|
28
|
-
};
|
29
|
-
class OpenSIPSJS extends UA_1.default {
|
30
|
-
constructor(options, logger) {
|
31
|
-
const configuration = Object.assign(Object.assign({}, options.configuration), { sockets: options.socketInterfaces.map(sock => new JsSIP_1.default.WebSocketInterface(sock)) });
|
32
|
-
super(configuration);
|
33
|
-
this.initialized = false;
|
34
|
-
this.logger = console;
|
35
|
-
/* Events */
|
36
|
-
this.newRTCSessionEventName = 'newRTCSession';
|
37
|
-
this.registeredEventName = 'registered';
|
38
|
-
this.unregisteredEventName = 'unregistered';
|
39
|
-
this.disconnectedEventName = 'disconnected';
|
40
|
-
this.connectedEventName = 'connected';
|
41
|
-
this.newMSRPSessionEventName = 'newMSRPSession';
|
42
|
-
/* State */
|
43
|
-
this.muted = false;
|
44
|
-
this.isAutoAnswer = false;
|
45
|
-
this.isDNDEnabled = false;
|
46
|
-
this.muteWhenJoinEnabled = false;
|
47
|
-
this.activeRooms = {};
|
48
|
-
this.activeCalls = {};
|
49
|
-
this.extendedCalls = {};
|
50
|
-
this.activeMessages = {};
|
51
|
-
this.extendedMessages = {};
|
52
|
-
this.msrpHistory = {};
|
53
|
-
this.microphoneInputLevelValue = 2; // [0;2]
|
54
|
-
this.speakerVolumeValue = 1; // [0;1]
|
55
|
-
this.availableMediaDevices = [];
|
56
|
-
this.selectedMediaDevices = {
|
57
|
-
input: 'default',
|
58
|
-
output: 'default'
|
59
|
-
};
|
60
|
-
this.callStatus = {};
|
61
|
-
this.callTime = {};
|
62
|
-
this.callMetrics = {};
|
63
|
-
this.timeIntervals = {};
|
64
|
-
this.metricConfig = {
|
65
|
-
refreshEvery: 1000
|
66
|
-
};
|
67
|
-
this.originalStreamValue = null;
|
68
|
-
this.isReconnecting = false;
|
69
|
-
this.listenersList = {};
|
70
|
-
this.options = options;
|
71
|
-
if (logger && (0, audio_helper_1.isLoggerCompatible)(logger)) {
|
72
|
-
this.logger = logger;
|
73
|
-
}
|
74
|
-
}
|
75
|
-
on(type, listener) {
|
76
|
-
return super.on(type, listener);
|
77
|
-
}
|
78
|
-
off(type, listener) {
|
79
|
-
return super.off(type, listener);
|
80
|
-
}
|
81
|
-
emit(type, args) {
|
82
|
-
return super.emit(type, args);
|
83
|
-
}
|
84
|
-
get sipDomain() {
|
85
|
-
return this.options.sipDomain;
|
86
|
-
}
|
87
|
-
get sipOptions() {
|
88
|
-
const options = Object.assign(Object.assign({}, this.options.sipOptions), { mediaConstraints: this.getUserMediaConstraints });
|
89
|
-
return options;
|
90
|
-
}
|
91
|
-
get currentActiveRoomId() {
|
92
|
-
return this.currentActiveRoomIdValue;
|
93
|
-
}
|
94
|
-
set currentActiveRoomId(roomId) {
|
95
|
-
this.currentActiveRoomIdValue = roomId;
|
96
|
-
this.emit('currentActiveRoomChanged', roomId);
|
97
|
-
}
|
98
|
-
get autoAnswer() {
|
99
|
-
return this.isAutoAnswer;
|
100
|
-
}
|
101
|
-
get callAddingInProgress() {
|
102
|
-
return this.isCallAddingInProgress;
|
103
|
-
}
|
104
|
-
set callAddingInProgress(value) {
|
105
|
-
this.isCallAddingInProgress = value;
|
106
|
-
this.emit('callAddingInProgressChanged', value);
|
107
|
-
}
|
108
|
-
get isMSRPInitializing() {
|
109
|
-
return this.isMSRPInitializingValue;
|
110
|
-
}
|
111
|
-
get muteWhenJoin() {
|
112
|
-
return this.muteWhenJoinEnabled;
|
113
|
-
}
|
114
|
-
get isDND() {
|
115
|
-
return this.isDNDEnabled;
|
116
|
-
}
|
117
|
-
get speakerVolume() {
|
118
|
-
return this.speakerVolumeValue;
|
119
|
-
}
|
120
|
-
get microphoneInputLevel() {
|
121
|
-
return this.microphoneInputLevelValue;
|
122
|
-
}
|
123
|
-
get getActiveCalls() {
|
124
|
-
return this.activeCalls;
|
125
|
-
}
|
126
|
-
get hasActiveCalls() {
|
127
|
-
return Object.values(this.extendedCalls).length > 0;
|
128
|
-
}
|
129
|
-
get getActiveMessages() {
|
130
|
-
return this.activeMessages;
|
131
|
-
}
|
132
|
-
get getActiveRooms() {
|
133
|
-
return this.activeRooms;
|
134
|
-
}
|
135
|
-
get isMuted() {
|
136
|
-
return this.muted;
|
137
|
-
}
|
138
|
-
get getInputDeviceList() {
|
139
|
-
return this.availableMediaDevices.filter(device => device.kind === 'audioinput');
|
140
|
-
}
|
141
|
-
get getOutputDeviceList() {
|
142
|
-
return this.availableMediaDevices.filter(device => device.kind === 'audiooutput');
|
143
|
-
}
|
144
|
-
/*getInputDeviceList: (state) => {
|
145
|
-
return state.availableMediaDevices.filter(device => device.kind === 'audioinput');
|
146
|
-
},
|
147
|
-
getOutputDeviceList: (state) => {
|
148
|
-
return state.availableMediaDevices.filter(device => device.kind === 'audiooutput');
|
149
|
-
}*/
|
150
|
-
get getUserMediaConstraints() {
|
151
|
-
return {
|
152
|
-
audio: {
|
153
|
-
deviceId: {
|
154
|
-
exact: this.selectedMediaDevices.input
|
155
|
-
}
|
156
|
-
},
|
157
|
-
video: false
|
158
|
-
};
|
159
|
-
}
|
160
|
-
get getInputDefaultDevice() {
|
161
|
-
return this.getInputDeviceList.find(device => device.deviceId === 'default');
|
162
|
-
}
|
163
|
-
get getOutputDefaultDevice() {
|
164
|
-
return this.getOutputDeviceList.find(device => device.deviceId === 'default');
|
165
|
-
}
|
166
|
-
get selectedInputDevice() {
|
167
|
-
return this.selectedMediaDevices.input;
|
168
|
-
}
|
169
|
-
get selectedOutputDevice() {
|
170
|
-
return this.selectedMediaDevices.output;
|
171
|
-
}
|
172
|
-
get originalStream() {
|
173
|
-
return this.originalStreamValue;
|
174
|
-
}
|
175
|
-
setAvailableMediaDevices(devices) {
|
176
|
-
this.availableMediaDevices = devices;
|
177
|
-
this.emit('changeAvailableDeviceList', devices);
|
178
|
-
}
|
179
|
-
updateDeviceList() {
|
180
|
-
return __awaiter(this, void 0, void 0, function* () {
|
181
|
-
yield navigator.mediaDevices.getUserMedia(this.getUserMediaConstraints);
|
182
|
-
const devices = yield navigator.mediaDevices.enumerateDevices();
|
183
|
-
this.setAvailableMediaDevices(devices);
|
184
|
-
});
|
185
|
-
}
|
186
|
-
setMediaDevices(setDefaults = false) {
|
187
|
-
var _a, _b;
|
188
|
-
return __awaiter(this, void 0, void 0, function* () {
|
189
|
-
this.selectedMediaDevices.input = localStorage.getItem(STORAGE_KEYS.SELECTED_INPUT_DEVICE) || 'default';
|
190
|
-
this.selectedMediaDevices.output = localStorage.getItem(STORAGE_KEYS.SELECTED_OUTPUT_DEVICE) || 'default';
|
191
|
-
yield navigator.mediaDevices.getUserMedia(this.getUserMediaConstraints);
|
192
|
-
const devices = yield navigator.mediaDevices.enumerateDevices();
|
193
|
-
this.setAvailableMediaDevices(devices);
|
194
|
-
const defaultMicrophone = setDefaults
|
195
|
-
? ((_a = this.getInputDefaultDevice) === null || _a === void 0 ? void 0 : _a.deviceId) || ''
|
196
|
-
: '';
|
197
|
-
const defaultSpeaker = setDefaults
|
198
|
-
? ((_b = this.getOutputDefaultDevice) === null || _b === void 0 ? void 0 : _b.deviceId) || ''
|
199
|
-
: '';
|
200
|
-
yield this.setMicrophone(defaultMicrophone);
|
201
|
-
yield this.setSpeaker(defaultSpeaker);
|
202
|
-
});
|
203
|
-
}
|
204
|
-
setCallTime(value) {
|
205
|
-
const time = Object.assign({}, value);
|
206
|
-
delete time.callId;
|
207
|
-
this.callTime = Object.assign(Object.assign({}, this.callTime), { [value.callId]: time });
|
208
|
-
this.emit('changeCallTime', this.callTime);
|
209
|
-
}
|
210
|
-
removeCallTime(callId) {
|
211
|
-
const callTimeCopy = Object.assign({}, this.callTime);
|
212
|
-
delete callTimeCopy[callId];
|
213
|
-
this.callTime = Object.assign({}, callTimeCopy);
|
214
|
-
this.emit('changeCallTime', this.callTime);
|
215
|
-
}
|
216
|
-
setTimeInterval(callId, interval) {
|
217
|
-
this.timeIntervals = Object.assign(Object.assign({}, this.timeIntervals), { [callId]: interval });
|
218
|
-
}
|
219
|
-
removeTimeInterval(callId) {
|
220
|
-
const timeIntervalsCopy = Object.assign({}, this.timeIntervals);
|
221
|
-
clearInterval(timeIntervalsCopy[callId]);
|
222
|
-
delete timeIntervalsCopy[callId];
|
223
|
-
this.timeIntervals = Object.assign({}, timeIntervalsCopy);
|
224
|
-
}
|
225
|
-
_stopCallTimer(callId) {
|
226
|
-
this.removeTimeInterval(callId);
|
227
|
-
this.removeCallTime(callId);
|
228
|
-
}
|
229
|
-
setMetricsConfig(config) {
|
230
|
-
this.metricConfig = Object.assign(Object.assign({}, this.metricConfig), config);
|
231
|
-
}
|
232
|
-
sendDTMF(callId, value) {
|
233
|
-
const validation_regex = /^[A-D0-9]+$/g;
|
234
|
-
if (!validation_regex.test(value)) {
|
235
|
-
throw new Error('Not allowed character in DTMF input');
|
236
|
-
}
|
237
|
-
const call = this.extendedCalls[callId];
|
238
|
-
call.sendDTMF(value);
|
239
|
-
}
|
240
|
-
setIsMuted(value) {
|
241
|
-
this.muted = value;
|
242
|
-
this.emit('changeIsMuted', value);
|
243
|
-
}
|
244
|
-
doMute(value) {
|
245
|
-
const activeRoomId = this.currentActiveRoomId;
|
246
|
-
this.setIsMuted(value);
|
247
|
-
//this.isMuted = value
|
248
|
-
this.roomReconfigure(activeRoomId);
|
249
|
-
}
|
250
|
-
doCallHold({ callId, toHold, automatic }) {
|
251
|
-
const call = this.extendedCalls[callId];
|
252
|
-
call._automaticHold = automatic !== null && automatic !== void 0 ? automatic : false;
|
253
|
-
if (toHold) {
|
254
|
-
call.hold();
|
255
|
-
}
|
256
|
-
else {
|
257
|
-
call.unhold();
|
258
|
-
}
|
259
|
-
}
|
260
|
-
_cancelAllOutgoingUnanswered() {
|
261
|
-
Object.values(this.getActiveCalls).filter(call => {
|
262
|
-
return call.direction === 'outgoing'
|
263
|
-
&& call.status === CALL_STATUS_UNANSWERED;
|
264
|
-
}).forEach(call => this.callTerminate(call._id));
|
265
|
-
}
|
266
|
-
callAnswer(callId) {
|
267
|
-
const call = this.extendedCalls[callId];
|
268
|
-
this._cancelAllOutgoingUnanswered();
|
269
|
-
call.answer(this.sipOptions);
|
270
|
-
this.updateCall(call);
|
271
|
-
// TODO: maybe would be better to move to the top
|
272
|
-
this.setCurrentActiveRoomId(call.roomId);
|
273
|
-
call.connection.addEventListener('addstream', (event) => __awaiter(this, void 0, void 0, function* () {
|
274
|
-
this._triggerAddStream(event, call);
|
275
|
-
}));
|
276
|
-
}
|
277
|
-
msrpAnswer(callId) {
|
278
|
-
const call = this.extendedMessages[callId];
|
279
|
-
//this._cancelAllOutgoingUnanswered()
|
280
|
-
call.answer(this.sipOptions);
|
281
|
-
this.updateMSRPSession(call);
|
282
|
-
// TODO: maybe would be better to move to the top
|
283
|
-
//this.setCurrentActiveRoomId(call.roomId)
|
284
|
-
}
|
285
|
-
callMove(callId, roomId) {
|
286
|
-
return __awaiter(this, void 0, void 0, function* () {
|
287
|
-
this._updateCallStatus({ callId, isMoving: true });
|
288
|
-
yield this.callChangeRoom({ callId, roomId });
|
289
|
-
this._updateCallStatus({ callId, isMoving: false });
|
290
|
-
});
|
291
|
-
}
|
292
|
-
updateCall(value) {
|
293
|
-
this.activeCalls[value._id] = (0, audio_helper_1.simplifyCallObject)(value);
|
294
|
-
this.emit('changeActiveCalls', this.activeCalls);
|
295
|
-
}
|
296
|
-
updateMSRPSession(value) {
|
297
|
-
this.activeMessages[value._id] = (0, audio_helper_1.simplifyMessageObject)(value);
|
298
|
-
this.emit('changeActiveMessages', this.activeMessages);
|
299
|
-
}
|
300
|
-
updateRoom(value) {
|
301
|
-
const room = this.activeRooms[value.roomId];
|
302
|
-
const newRoomData = Object.assign(Object.assign({}, room), value);
|
303
|
-
this.activeRooms = Object.assign(Object.assign({}, this.activeRooms), { [value.roomId]: Object.assign({}, newRoomData) });
|
304
|
-
this.emit('updateRoom', { room: newRoomData, roomList: this.activeRooms });
|
305
|
-
}
|
306
|
-
hasAutoAnswerHeaders(event) {
|
307
|
-
const regex = /answer-after=0/;
|
308
|
-
const request = event.request;
|
309
|
-
const callInfoHeader = request.getHeader('Call-Info');
|
310
|
-
return callInfoHeader && regex.test(callInfoHeader);
|
311
|
-
}
|
312
|
-
_addCall(value, emitEvent = true) {
|
313
|
-
this.activeCalls = Object.assign(Object.assign({}, this.activeCalls), { [value._id]: (0, audio_helper_1.simplifyCallObject)(value) });
|
314
|
-
/*this.extendedCalls = {
|
315
|
-
...this.extendedCalls,
|
316
|
-
[value._id]: value
|
317
|
-
}*/
|
318
|
-
this.extendedCalls[value._id] = value;
|
319
|
-
if (emitEvent) {
|
320
|
-
this.emit('changeActiveCalls', this.activeCalls);
|
321
|
-
}
|
322
|
-
}
|
323
|
-
_addCallStatus(callId) {
|
324
|
-
this.callStatus = Object.assign(Object.assign({}, this.callStatus), { [callId]: {
|
325
|
-
isMoving: false,
|
326
|
-
isTransferring: false,
|
327
|
-
isMerging: false
|
328
|
-
} });
|
329
|
-
this.emit('changeCallStatus', this.callStatus);
|
330
|
-
}
|
331
|
-
_addMMSRPSession(value) {
|
332
|
-
this.activeMessages = Object.assign(Object.assign({}, this.activeMessages), { [value._id]: (0, audio_helper_1.simplifyMessageObject)(value) });
|
333
|
-
this.extendedMessages[value._id] = value;
|
334
|
-
this.emit('changeActiveMessages', this.activeMessages);
|
335
|
-
}
|
336
|
-
_addMSRPMessage(value, session) {
|
337
|
-
const sessionMessages = this.msrpHistory[session.id] || [];
|
338
|
-
sessionMessages.push(value);
|
339
|
-
this.msrpHistory = Object.assign(Object.assign({}, this.msrpHistory), { [session.id]: [...sessionMessages] });
|
340
|
-
this.emit('newMSRPMessage', { message: value, session: session });
|
341
|
-
}
|
342
|
-
_updateCallStatus(value) {
|
343
|
-
const prevStatus = Object.assign({}, this.callStatus[value.callId]);
|
344
|
-
const newStatus = Object.assign({}, prevStatus);
|
345
|
-
if (value.isMoving !== undefined) {
|
346
|
-
newStatus.isMoving = value.isMoving;
|
347
|
-
}
|
348
|
-
if (value.isTransferring !== undefined) {
|
349
|
-
newStatus.isTransferring = value.isTransferring;
|
350
|
-
}
|
351
|
-
if (value.isMerging !== undefined) {
|
352
|
-
newStatus.isMerging = value.isMerging;
|
353
|
-
}
|
354
|
-
this.callStatus = Object.assign(Object.assign({}, this.callStatus), { [value.callId]: Object.assign({}, newStatus) });
|
355
|
-
this.emit('changeCallStatus', this.callStatus);
|
356
|
-
}
|
357
|
-
_removeCallStatus(callId) {
|
358
|
-
const callStatusCopy = Object.assign({}, this.callStatus);
|
359
|
-
delete callStatusCopy[callId];
|
360
|
-
this.callStatus = Object.assign({}, callStatusCopy);
|
361
|
-
this.emit('changeCallStatus', this.callStatus);
|
362
|
-
}
|
363
|
-
_addRoom(value) {
|
364
|
-
this.activeRooms = Object.assign(Object.assign({}, this.activeRooms), { [value.roomId]: value });
|
365
|
-
this.emit('addRoom', { room: value, roomList: this.activeRooms });
|
366
|
-
}
|
367
|
-
setMicrophone(dId) {
|
368
|
-
return __awaiter(this, void 0, void 0, function* () {
|
369
|
-
if (!this.getInputDeviceList.find(({ deviceId }) => deviceId === dId)) {
|
370
|
-
return;
|
371
|
-
}
|
372
|
-
this.setSelectedInputDevice(dId);
|
373
|
-
let stream; // = null
|
374
|
-
try {
|
375
|
-
stream = yield navigator.mediaDevices.getUserMedia(this.getUserMediaConstraints);
|
376
|
-
}
|
377
|
-
catch (err) {
|
378
|
-
console.error(err);
|
379
|
-
}
|
380
|
-
if (Object.keys(this.getActiveCalls).length === 0) {
|
381
|
-
return;
|
382
|
-
}
|
383
|
-
const callsInCurrentRoom = Object.values(this.extendedCalls).filter(call => call.roomId === this.currentActiveRoomId);
|
384
|
-
if (callsInCurrentRoom.length === 1) {
|
385
|
-
Object.values(callsInCurrentRoom).forEach(call => {
|
386
|
-
const processedStream = (0, audio_helper_1.processAudioVolume)(stream, this.microphoneInputLevel);
|
387
|
-
processedStream.getTracks().forEach(track => track.enabled = !this.isMuted);
|
388
|
-
this._setOriginalStream(processedStream);
|
389
|
-
call.connection.getSenders()[0].replaceTrack(processedStream.getTracks()[0]);
|
390
|
-
this.updateCall(call);
|
391
|
-
});
|
392
|
-
}
|
393
|
-
else {
|
394
|
-
yield this._doConference(callsInCurrentRoom);
|
395
|
-
}
|
396
|
-
});
|
397
|
-
}
|
398
|
-
_setOriginalStream(value) {
|
399
|
-
this.originalStreamValue = value;
|
400
|
-
this.emit('changeOriginalStream', value);
|
401
|
-
}
|
402
|
-
setSpeaker(dId) {
|
403
|
-
return __awaiter(this, void 0, void 0, function* () {
|
404
|
-
if (!this.getOutputDeviceList.find(({ deviceId }) => deviceId === dId)) {
|
405
|
-
return;
|
406
|
-
}
|
407
|
-
this.setSelectedOutputDevice(dId);
|
408
|
-
const activeCallList = Object.values(this.extendedCalls);
|
409
|
-
if (activeCallList.length === 0) {
|
410
|
-
return;
|
411
|
-
}
|
412
|
-
const callsInCurrentRoom = activeCallList.filter(call => call.roomId === this.currentActiveRoomId);
|
413
|
-
if (callsInCurrentRoom.length === 1) {
|
414
|
-
activeCallList.forEach(call => {
|
415
|
-
var _a;
|
416
|
-
(_a = call.audioTag) === null || _a === void 0 ? void 0 : _a.setSinkId(dId);
|
417
|
-
this.updateCall(call);
|
418
|
-
});
|
419
|
-
}
|
420
|
-
else {
|
421
|
-
yield this._doConference(callsInCurrentRoom);
|
422
|
-
}
|
423
|
-
});
|
424
|
-
}
|
425
|
-
removeRoom(roomId) {
|
426
|
-
const activeRoomsCopy = Object.assign({}, this.activeRooms);
|
427
|
-
const roomToRemove = Object.assign({}, activeRoomsCopy[roomId]);
|
428
|
-
delete activeRoomsCopy[roomId];
|
429
|
-
this.activeRooms = Object.assign({}, activeRoomsCopy);
|
430
|
-
this.emit('removeRoom', { room: roomToRemove, roomList: this.activeRooms });
|
431
|
-
}
|
432
|
-
deleteRoomIfEmpty(roomId) {
|
433
|
-
if (roomId === undefined) {
|
434
|
-
return;
|
435
|
-
}
|
436
|
-
if (Object.values(this.extendedCalls).filter(call => call.roomId === roomId).length === 0) {
|
437
|
-
this.removeRoom(roomId);
|
438
|
-
if (this.currentActiveRoomId === roomId) {
|
439
|
-
this.currentActiveRoomId = undefined;
|
440
|
-
}
|
441
|
-
}
|
442
|
-
}
|
443
|
-
checkInitialized() {
|
444
|
-
if (!this.initialized) {
|
445
|
-
throw new Error('[OpenSIPSJS] You must call `start` method first!');
|
446
|
-
}
|
447
|
-
}
|
448
|
-
muteReconfigure(call) {
|
449
|
-
if (this.muted) {
|
450
|
-
call.mute({ audio: true });
|
451
|
-
}
|
452
|
-
else {
|
453
|
-
call.unmute({ audio: true });
|
454
|
-
}
|
455
|
-
}
|
456
|
-
roomReconfigure(roomId) {
|
457
|
-
return __awaiter(this, void 0, void 0, function* () {
|
458
|
-
if (roomId === undefined) {
|
459
|
-
return;
|
460
|
-
}
|
461
|
-
const callsInRoom = Object.values(this.extendedCalls).filter(call => call.roomId === roomId);
|
462
|
-
// Let`s take care on the audio output first and check if passed room is our selected room
|
463
|
-
if (this.currentActiveRoomId === roomId) {
|
464
|
-
callsInRoom.forEach(call => {
|
465
|
-
if (call.audioTag) {
|
466
|
-
this.muteReconfigure(call);
|
467
|
-
call.audioTag.muted = false;
|
468
|
-
this.updateCall(call);
|
469
|
-
}
|
470
|
-
});
|
471
|
-
}
|
472
|
-
else {
|
473
|
-
callsInRoom.forEach(call => {
|
474
|
-
if (call.audioTag) {
|
475
|
-
call.audioTag.muted = true;
|
476
|
-
this.updateCall(call);
|
477
|
-
}
|
478
|
-
});
|
479
|
-
}
|
480
|
-
// Now let`s configure the sound we are sending for each active call on this room
|
481
|
-
if (callsInRoom.length === 0) {
|
482
|
-
this.deleteRoomIfEmpty(roomId);
|
483
|
-
}
|
484
|
-
else if (callsInRoom.length === 1 && this.currentActiveRoomId !== roomId) {
|
485
|
-
if (!callsInRoom[0].isOnHold().local) {
|
486
|
-
this.doCallHold({ callId: callsInRoom[0].id, toHold: true, automatic: true });
|
487
|
-
}
|
488
|
-
}
|
489
|
-
else if (callsInRoom.length === 1 && this.currentActiveRoomId === roomId) {
|
490
|
-
if (callsInRoom[0].isOnHold().local && callsInRoom[0]._automaticHold) {
|
491
|
-
this.doCallHold({ callId: callsInRoom[0].id, toHold: false });
|
492
|
-
}
|
493
|
-
let stream;
|
494
|
-
try {
|
495
|
-
stream = yield navigator.mediaDevices.getUserMedia(this.getUserMediaConstraints);
|
496
|
-
}
|
497
|
-
catch (err) {
|
498
|
-
console.error(err);
|
499
|
-
}
|
500
|
-
if (stream && callsInRoom[0].connection && callsInRoom[0].connection.getSenders()[0]) {
|
501
|
-
const processedStream = (0, audio_helper_1.processAudioVolume)(stream, this.microphoneInputLevel);
|
502
|
-
processedStream.getTracks().forEach(track => track.enabled = !this.muted);
|
503
|
-
this._setOriginalStream(processedStream);
|
504
|
-
yield callsInRoom[0].connection.getSenders()[0].replaceTrack(processedStream.getTracks()[0]);
|
505
|
-
this.muteReconfigure(callsInRoom[0]);
|
506
|
-
}
|
507
|
-
}
|
508
|
-
else if (callsInRoom.length > 1) {
|
509
|
-
yield this._doConference(callsInRoom);
|
510
|
-
}
|
511
|
-
});
|
512
|
-
}
|
513
|
-
_doConference(sessions) {
|
514
|
-
return __awaiter(this, void 0, void 0, function* () {
|
515
|
-
sessions.forEach(call => {
|
516
|
-
if (call._localHold) {
|
517
|
-
this.doCallHold({ callId: call._id, toHold: false });
|
518
|
-
}
|
519
|
-
});
|
520
|
-
// Take all received tracks from the sessions you want to merge
|
521
|
-
const receivedTracks = [];
|
522
|
-
sessions.forEach(session => {
|
523
|
-
if (session !== null && session !== undefined) {
|
524
|
-
session.connection.getReceivers().forEach((receiver) => {
|
525
|
-
receivedTracks.push(receiver.track);
|
526
|
-
});
|
527
|
-
}
|
528
|
-
});
|
529
|
-
// Use the Web Audio API to mix the received tracks
|
530
|
-
const audioContext = new AudioContext();
|
531
|
-
const allReceivedMediaStreams = new MediaStream();
|
532
|
-
// For each call we will build dedicated mix for all other calls
|
533
|
-
yield (0, p_iteration_1.forEach)(sessions, (session) => __awaiter(this, void 0, void 0, function* () {
|
534
|
-
if (session === null || session === undefined) {
|
535
|
-
return;
|
536
|
-
}
|
537
|
-
const mixedOutput = audioContext.createMediaStreamDestination();
|
538
|
-
session.connection.getReceivers().forEach((receiver) => {
|
539
|
-
receivedTracks.forEach(track => {
|
540
|
-
allReceivedMediaStreams.addTrack(receiver.track);
|
541
|
-
if (receiver.track.id !== track.id) {
|
542
|
-
const sourceStream = audioContext.createMediaStreamSource(new MediaStream([track]));
|
543
|
-
sourceStream.connect(mixedOutput);
|
544
|
-
}
|
545
|
-
});
|
546
|
-
});
|
547
|
-
if (sessions[0].roomId === this.currentActiveRoomId) {
|
548
|
-
// Mixing your voice with all the received audio
|
549
|
-
const stream = yield navigator.mediaDevices.getUserMedia(this.getUserMediaConstraints);
|
550
|
-
const processedStream = (0, audio_helper_1.processAudioVolume)(stream, this.microphoneInputLevel);
|
551
|
-
processedStream.getTracks().forEach(track => track.enabled = !this.isMuted);
|
552
|
-
this._setOriginalStream(processedStream);
|
553
|
-
const sourceStream = audioContext.createMediaStreamSource(processedStream);
|
554
|
-
// stream.getTracks().forEach(track => track.enabled = !getters.isMuted) // TODO: Fix this
|
555
|
-
sourceStream.connect(mixedOutput);
|
556
|
-
}
|
557
|
-
if (session.connection.getSenders()[0]) {
|
558
|
-
//mixedOutput.stream.getTracks().forEach(track => track.enabled = !getters.isMuted) // Uncomment to mute all callers on mute
|
559
|
-
yield session.connection.getSenders()[0].replaceTrack(mixedOutput.stream.getTracks()[0]);
|
560
|
-
this._muteReconfigure(session);
|
561
|
-
}
|
562
|
-
}));
|
563
|
-
});
|
564
|
-
}
|
565
|
-
_muteReconfigure(call) {
|
566
|
-
if (this.isMuted) {
|
567
|
-
call.mute({ audio: true });
|
568
|
-
}
|
569
|
-
else {
|
570
|
-
call.unmute({ audio: true });
|
571
|
-
}
|
572
|
-
}
|
573
|
-
muteCaller(callId, value) {
|
574
|
-
const call = this.extendedCalls[callId];
|
575
|
-
if (call && call.connection.getReceivers().length) {
|
576
|
-
call.localMuted = value;
|
577
|
-
call.connection.getReceivers().forEach((receiver) => {
|
578
|
-
receiver.track.enabled = !value;
|
579
|
-
});
|
580
|
-
this.updateCall(call);
|
581
|
-
this.roomReconfigure(call.roomId);
|
582
|
-
}
|
583
|
-
}
|
584
|
-
callTerminate(callId) {
|
585
|
-
const call = this.extendedCalls[callId];
|
586
|
-
if (call._status !== 8) {
|
587
|
-
call.terminate();
|
588
|
-
}
|
589
|
-
}
|
590
|
-
messageTerminate(callId) {
|
591
|
-
const call = this.extendedMessages[callId];
|
592
|
-
if (call._status !== 8) {
|
593
|
-
call.terminate();
|
594
|
-
}
|
595
|
-
}
|
596
|
-
callTransfer(callId, target) {
|
597
|
-
if (target.toString().length === 0) {
|
598
|
-
return console.error('Target must be passed');
|
599
|
-
}
|
600
|
-
const call = this.extendedCalls[callId];
|
601
|
-
if (!call._is_confirmed && !call._is_canceled) {
|
602
|
-
const redirectTarget = `sip:${target}@${this.sipDomain}`;
|
603
|
-
call.terminate({
|
604
|
-
status_code: 302,
|
605
|
-
reason_phrase: 'Moved Temporarily',
|
606
|
-
extraHeaders: [`Contact: ${redirectTarget}`]
|
607
|
-
});
|
608
|
-
return;
|
609
|
-
}
|
610
|
-
this._updateCallStatus({ callId, isTransferring: true });
|
611
|
-
call.refer(`sip:${target}@${this.sipDomain}`);
|
612
|
-
this.updateCall(call);
|
613
|
-
}
|
614
|
-
callMerge(roomId) {
|
615
|
-
const callsInRoom = Object.values(this.extendedCalls).filter((call) => call.roomId === roomId);
|
616
|
-
if (callsInRoom.length !== 2)
|
617
|
-
return;
|
618
|
-
const firstCall = callsInRoom[0];
|
619
|
-
const secondCall = callsInRoom[1];
|
620
|
-
if (!firstCall || !secondCall) {
|
621
|
-
return;
|
622
|
-
}
|
623
|
-
// TODO: Check all call.id for working in the same way as call._id
|
624
|
-
this._updateCallStatus({ callId: firstCall._id, isMerging: true });
|
625
|
-
this._updateCallStatus({ callId: secondCall._id, isMerging: true });
|
626
|
-
firstCall.refer(secondCall.remote_identity.uri.toString(), { 'replaces': secondCall });
|
627
|
-
this.updateCall(firstCall);
|
628
|
-
}
|
629
|
-
// TODO: Use this method in demo
|
630
|
-
setDND(value) {
|
631
|
-
this.isDNDEnabled = value;
|
632
|
-
this.emit('changeIsDND', value);
|
633
|
-
}
|
634
|
-
_startCallTimer(callId) {
|
635
|
-
const timeData = {
|
636
|
-
callId,
|
637
|
-
hours: 0,
|
638
|
-
minutes: 0,
|
639
|
-
seconds: 0,
|
640
|
-
formatted: ''
|
641
|
-
};
|
642
|
-
this.setCallTime(timeData);
|
643
|
-
const interval = setInterval(() => {
|
644
|
-
const callTime = Object.assign({}, this.callTime[callId]);
|
645
|
-
const updatedTime = (0, time_helper_1.setupTime)(callTime);
|
646
|
-
this.setCallTime(Object.assign({ callId }, updatedTime));
|
647
|
-
}, 1000);
|
648
|
-
this.setTimeInterval(callId, interval);
|
649
|
-
}
|
650
|
-
setCurrentActiveRoomId(roomId) {
|
651
|
-
return __awaiter(this, void 0, void 0, function* () {
|
652
|
-
const oldRoomId = this.currentActiveRoomId;
|
653
|
-
if (roomId === oldRoomId) {
|
654
|
-
return;
|
655
|
-
}
|
656
|
-
this.currentActiveRoomId = roomId;
|
657
|
-
yield this.roomReconfigure(oldRoomId);
|
658
|
-
yield this.roomReconfigure(roomId);
|
659
|
-
});
|
660
|
-
}
|
661
|
-
getNewRoomId() {
|
662
|
-
const roomIdList = Object.keys(this.activeRooms);
|
663
|
-
if (roomIdList.length === 0) {
|
664
|
-
return 1;
|
665
|
-
}
|
666
|
-
return (parseInt(roomIdList.sort()[roomIdList.length - 1]) + 1);
|
667
|
-
}
|
668
|
-
subscribe(type, listener) {
|
669
|
-
const isListenerEmpty = !this.listenersList[type] || !this.listenersList[type].length;
|
670
|
-
const newListeners = isListenerEmpty ? [listener] : [...this.listenersList[type], listener];
|
671
|
-
this.listenersList = Object.assign(Object.assign({}, this.listenersList), { [type]: newListeners });
|
672
|
-
}
|
673
|
-
removeIListener(value) {
|
674
|
-
const listenersCopy = Object.assign({}, this.listenersList);
|
675
|
-
delete listenersCopy[value];
|
676
|
-
this.listenersList = Object.assign({}, listenersCopy);
|
677
|
-
}
|
678
|
-
addCall(event) {
|
679
|
-
var _a, _b;
|
680
|
-
return __awaiter(this, void 0, void 0, function* () {
|
681
|
-
const session = event.session;
|
682
|
-
const sessionAlreadyInActiveCalls = this.getActiveCalls[session.id];
|
683
|
-
if (sessionAlreadyInActiveCalls !== undefined) {
|
684
|
-
return;
|
685
|
-
}
|
686
|
-
const roomId = this.getNewRoomId();
|
687
|
-
const newRoomInfo = {
|
688
|
-
started: new Date(),
|
689
|
-
incomingInProgress: false,
|
690
|
-
roomId
|
691
|
-
};
|
692
|
-
if (session.direction === 'incoming') {
|
693
|
-
this.logger.log('New incoming call from', (_b = (_a = session._remote_identity) === null || _a === void 0 ? void 0 : _a._uri) === null || _b === void 0 ? void 0 : _b._user);
|
694
|
-
newRoomInfo.incomingInProgress = true;
|
695
|
-
this.subscribe(call_event_listener_type_1.CALL_EVENT_LISTENER_TYPE.CALL_CONFIRMED, (call) => {
|
696
|
-
if (session.id === call.id) {
|
697
|
-
this.updateRoom({
|
698
|
-
incomingInProgress: false,
|
699
|
-
roomId
|
700
|
-
});
|
701
|
-
this._startCallTimer(session.id);
|
702
|
-
}
|
703
|
-
});
|
704
|
-
this.subscribe(call_event_listener_type_1.CALL_EVENT_LISTENER_TYPE.CALL_FAILED, (call) => {
|
705
|
-
if (session.id === call.id) {
|
706
|
-
this.updateRoom({
|
707
|
-
incomingInProgress: false,
|
708
|
-
roomId
|
709
|
-
});
|
710
|
-
this.deleteRoomIfEmpty(roomId);
|
711
|
-
}
|
712
|
-
});
|
713
|
-
}
|
714
|
-
else if (session.direction === 'outgoing') {
|
715
|
-
this._startCallTimer(session.id);
|
716
|
-
}
|
717
|
-
const call = session;
|
718
|
-
const autoAnswerByHeaders = this.hasAutoAnswerHeaders(event);
|
719
|
-
const doAutoAnswer = call.direction === 'incoming' && !this.hasActiveCalls && (autoAnswerByHeaders || this.autoAnswer);
|
720
|
-
call.roomId = roomId;
|
721
|
-
call.localMuted = false;
|
722
|
-
call.autoAnswer = doAutoAnswer;
|
723
|
-
if (doAutoAnswer) {
|
724
|
-
this._addCall(call, false);
|
725
|
-
}
|
726
|
-
else {
|
727
|
-
this._addCall(call);
|
728
|
-
}
|
729
|
-
// this._addCall(call)
|
730
|
-
this._addCallStatus(session.id);
|
731
|
-
this._addRoom(newRoomInfo);
|
732
|
-
if (doAutoAnswer) {
|
733
|
-
this.callAnswer(call._id);
|
734
|
-
}
|
735
|
-
});
|
736
|
-
}
|
737
|
-
addMessageSession(session) {
|
738
|
-
// For cases when session.direction === 'outgoing' and all the
|
739
|
-
// session properties are missing before answer
|
740
|
-
if (!session._id) {
|
741
|
-
return;
|
742
|
-
}
|
743
|
-
const sessionAlreadyInActiveMessages = this.getActiveMessages[session._id];
|
744
|
-
if (sessionAlreadyInActiveMessages !== undefined) {
|
745
|
-
return;
|
746
|
-
}
|
747
|
-
/*const roomId = this.getNewRoomId()
|
748
|
-
|
749
|
-
const newRoomInfo: IRoom = {
|
750
|
-
started: new Date(),
|
751
|
-
incomingInProgress: false,
|
752
|
-
roomId
|
753
|
-
}*/
|
754
|
-
/*if (session.direction === 'incoming') {
|
755
|
-
newRoomInfo.incomingInProgress = true
|
756
|
-
|
757
|
-
this.subscribe(CALL_EVENT_LISTENER_TYPE.CALL_CONFIRMED, (call) => {
|
758
|
-
if (session.id === call.id) {
|
759
|
-
this.updateRoom( {
|
760
|
-
incomingInProgress: false,
|
761
|
-
roomId
|
762
|
-
})
|
763
|
-
this._startCallTimer(session.id)
|
764
|
-
}
|
765
|
-
})
|
766
|
-
|
767
|
-
this.subscribe(CALL_EVENT_LISTENER_TYPE.CALL_FAILED, (call) => {
|
768
|
-
if (session.id === call.id) {
|
769
|
-
this.updateRoom({
|
770
|
-
incomingInProgress: false,
|
771
|
-
roomId
|
772
|
-
})
|
773
|
-
}
|
774
|
-
})
|
775
|
-
|
776
|
-
} else if (session.direction === 'outgoing') {
|
777
|
-
this._startCallTimer(session.id)
|
778
|
-
}*/
|
779
|
-
const MSRPSession = session;
|
780
|
-
//MSRPSession.roomId = roomId
|
781
|
-
this._addMMSRPSession(MSRPSession);
|
782
|
-
//this._addMMSRPSessionStatus(session.id)
|
783
|
-
//this._addRoom(newRoomInfo)
|
784
|
-
}
|
785
|
-
_triggerListener({ listenerType, session, event }) {
|
786
|
-
const listeners = this.listenersList[listenerType];
|
787
|
-
if (!listeners || !listeners.length) {
|
788
|
-
return;
|
789
|
-
}
|
790
|
-
listeners.forEach((listener) => {
|
791
|
-
listener(session, event);
|
792
|
-
});
|
793
|
-
}
|
794
|
-
_triggerMSRPListener({ listenerType, session, event }) {
|
795
|
-
const listeners = this.listenersList[listenerType];
|
796
|
-
if (!listeners || !listeners.length) {
|
797
|
-
return;
|
798
|
-
}
|
799
|
-
listeners.forEach((listener) => {
|
800
|
-
listener(session, event);
|
801
|
-
});
|
802
|
-
}
|
803
|
-
_removeCall(value) {
|
804
|
-
const stateActiveCallsCopy = Object.assign({}, this.activeCalls);
|
805
|
-
delete stateActiveCallsCopy[value];
|
806
|
-
// delete activeCalls[value]
|
807
|
-
this.activeCalls = Object.assign({}, stateActiveCallsCopy);
|
808
|
-
const stateExtendedCallsCopy = Object.assign({}, this.extendedCalls);
|
809
|
-
delete stateExtendedCallsCopy[value];
|
810
|
-
this.extendedCalls = Object.assign({}, stateExtendedCallsCopy);
|
811
|
-
this.emit('changeActiveCalls', this.activeCalls);
|
812
|
-
}
|
813
|
-
_removeMMSRPSession(value) {
|
814
|
-
const stateActiveMessagesCopy = Object.assign({}, this.activeMessages);
|
815
|
-
delete stateActiveMessagesCopy[value];
|
816
|
-
//delete activeMessages[value]
|
817
|
-
this.activeMessages = Object.assign({}, stateActiveMessagesCopy);
|
818
|
-
const stateExtendedMessagesCopy = Object.assign({}, this.extendedMessages);
|
819
|
-
delete stateExtendedMessagesCopy[value];
|
820
|
-
this.extendedMessages = Object.assign({}, stateExtendedMessagesCopy);
|
821
|
-
this.emit('changeActiveMessages', this.activeMessages);
|
822
|
-
}
|
823
|
-
_activeCallListRemove(call) {
|
824
|
-
const callRoomIdToConfigure = this.extendedCalls[call._id].roomId;
|
825
|
-
this._removeCall(call._id);
|
826
|
-
this.roomReconfigure(callRoomIdToConfigure);
|
827
|
-
}
|
828
|
-
_activeMessageListRemove(call) {
|
829
|
-
//const callRoomIdToConfigure = activeMessages[call._id].roomId
|
830
|
-
this._removeMMSRPSession(call._id);
|
831
|
-
//this.roomReconfigure(callRoomIdToConfigure)
|
832
|
-
}
|
833
|
-
newRTCSessionCallback(event) {
|
834
|
-
const session = event.session;
|
835
|
-
if (this.isDND) {
|
836
|
-
session.terminate({ status_code: 486, reason_phrase: 'Do Not Disturb' });
|
837
|
-
return;
|
838
|
-
}
|
839
|
-
// stop timers on ended and failed
|
840
|
-
session.on('ended', (event) => {
|
841
|
-
var _a, _b;
|
842
|
-
this.logger.log('Session ended for', (_b = (_a = session._remote_identity) === null || _a === void 0 ? void 0 : _a._uri) === null || _b === void 0 ? void 0 : _b._user);
|
843
|
-
this._triggerListener({ listenerType: call_event_listener_type_1.CALL_EVENT_LISTENER_TYPE.CALL_ENDED, session, event });
|
844
|
-
const s = this.getActiveCalls[session.id];
|
845
|
-
if (s) {
|
846
|
-
this._activeCallListRemove(s);
|
847
|
-
}
|
848
|
-
this._stopCallTimer(session.id);
|
849
|
-
this._removeCallStatus(session.id);
|
850
|
-
this._removeCallMetrics(session.id);
|
851
|
-
if (!Object.keys(this.extendedCalls).length) {
|
852
|
-
this.setIsMuted(false);
|
853
|
-
}
|
854
|
-
});
|
855
|
-
session.on('progress', (event) => {
|
856
|
-
var _a, _b;
|
857
|
-
this.logger.log('Session in progress for', (_b = (_a = session._remote_identity) === null || _a === void 0 ? void 0 : _a._uri) === null || _b === void 0 ? void 0 : _b._user);
|
858
|
-
this._triggerListener({ listenerType: call_event_listener_type_1.CALL_EVENT_LISTENER_TYPE.CALL_PROGRESS, session, event });
|
859
|
-
});
|
860
|
-
session.on('failed', (event) => {
|
861
|
-
var _a, _b;
|
862
|
-
this.logger.log('Session failed for', (_b = (_a = session._remote_identity) === null || _a === void 0 ? void 0 : _a._uri) === null || _b === void 0 ? void 0 : _b._user);
|
863
|
-
this._triggerListener({ listenerType: call_event_listener_type_1.CALL_EVENT_LISTENER_TYPE.CALL_FAILED, session, event });
|
864
|
-
if (session.id === this.callAddingInProgress) {
|
865
|
-
this.callAddingInProgress = undefined;
|
866
|
-
}
|
867
|
-
const s = this.getActiveCalls[session.id];
|
868
|
-
if (s) {
|
869
|
-
this._activeCallListRemove(s);
|
870
|
-
}
|
871
|
-
this._stopCallTimer(session.id);
|
872
|
-
this._removeCallStatus(session.id);
|
873
|
-
this._removeCallMetrics(session.id);
|
874
|
-
if (!Object.keys(this.extendedCalls).length) {
|
875
|
-
this.setIsMuted(false);
|
876
|
-
}
|
877
|
-
});
|
878
|
-
session.on('confirmed', (event) => {
|
879
|
-
var _a, _b;
|
880
|
-
this.logger.log('Session confirmed for', (_b = (_a = session._remote_identity) === null || _a === void 0 ? void 0 : _a._uri) === null || _b === void 0 ? void 0 : _b._user);
|
881
|
-
this._triggerListener({ listenerType: call_event_listener_type_1.CALL_EVENT_LISTENER_TYPE.CALL_CONFIRMED, session, event });
|
882
|
-
this.updateCall(session);
|
883
|
-
if (session.id === this.callAddingInProgress) {
|
884
|
-
this.callAddingInProgress = undefined;
|
885
|
-
}
|
886
|
-
});
|
887
|
-
this.addCall(event);
|
888
|
-
if (session.direction === 'outgoing') {
|
889
|
-
const roomId = this.getActiveCalls[session.id].roomId;
|
890
|
-
this.setCurrentActiveRoomId(roomId);
|
891
|
-
}
|
892
|
-
}
|
893
|
-
newMSRPSessionCallback(event) {
|
894
|
-
const session = event.session;
|
895
|
-
/*if (this.isDND) {
|
896
|
-
session.terminate({ status_code: 486, reason_phrase: 'Do Not Disturb' })
|
897
|
-
return
|
898
|
-
}*/
|
899
|
-
// stop timers on ended and failed
|
900
|
-
session.on('ended', (event) => {
|
901
|
-
this._triggerMSRPListener({ listenerType: call_event_listener_type_1.CALL_EVENT_LISTENER_TYPE.CALL_ENDED, session, event });
|
902
|
-
const s = this.getActiveMessages[session.id];
|
903
|
-
this._activeMessageListRemove(s);
|
904
|
-
//this._stopCallTimer(session.id)
|
905
|
-
//this._removeCallStatus(session.id)
|
906
|
-
//this._removeCallMetrics(session.id)
|
907
|
-
/*if (!Object.keys(activeMessages).length) {
|
908
|
-
this.isMuted = false
|
909
|
-
}*/
|
910
|
-
});
|
911
|
-
/*session.on('active', (event: Event) => {
|
912
|
-
console.log('event newMSRPSessionCallback active', session)
|
913
|
-
//this._triggerMSRPListener({ listenerType: CALL_EVENT_LISTENER_TYPE.CALL_PROGRESS, session, event })
|
914
|
-
})*/
|
915
|
-
session.on('failed', (event) => {
|
916
|
-
this._triggerMSRPListener({ listenerType: call_event_listener_type_1.CALL_EVENT_LISTENER_TYPE.CALL_FAILED, session, event });
|
917
|
-
/*if (session.id === this.callAddingInProgress) {
|
918
|
-
this.callAddingInProgress = undefined
|
919
|
-
}*/
|
920
|
-
// console.log(session, '0000000000000000000000000')
|
921
|
-
const s = this.getActiveMessages[session.id];
|
922
|
-
this._activeMessageListRemove(s);
|
923
|
-
//this._stopCallTimer(session.id)
|
924
|
-
//this._removeCallStatus(session.id)
|
925
|
-
//this._removeCallMetrics(session.id)
|
926
|
-
/*if (!Object.keys(activeMessages).length) {
|
927
|
-
this.isMuted = false
|
928
|
-
}*/
|
929
|
-
});
|
930
|
-
session.on('confirmed', (event) => {
|
931
|
-
this._triggerMSRPListener({ listenerType: call_event_listener_type_1.CALL_EVENT_LISTENER_TYPE.CALL_CONFIRMED, session, event });
|
932
|
-
this.updateMSRPSession(session);
|
933
|
-
/*if (session.id === this.callAddingInProgress) {
|
934
|
-
this.callAddingInProgress = undefined
|
935
|
-
}*/
|
936
|
-
});
|
937
|
-
session.on('newMessage', (msg) => {
|
938
|
-
this._addMSRPMessage(msg, session);
|
939
|
-
});
|
940
|
-
this.addMessageSession(session);
|
941
|
-
/*if (session.direction === 'outgoing') {
|
942
|
-
const roomId = this.getActiveMessages[session.id].roomId
|
943
|
-
this.setCurrentActiveRoomId(roomId)
|
944
|
-
}*/
|
945
|
-
}
|
946
|
-
setInitialized(value) {
|
947
|
-
this.initialized = value;
|
948
|
-
this.emit('ready', value);
|
949
|
-
}
|
950
|
-
begin() {
|
951
|
-
if (this.isConnected()) {
|
952
|
-
console.error('Connection is already established');
|
953
|
-
return;
|
954
|
-
}
|
955
|
-
this.on(this.registeredEventName, () => {
|
956
|
-
this.logger.log('Successfully registered to', this.options.socketInterfaces[0]);
|
957
|
-
this.setInitialized(true);
|
958
|
-
});
|
959
|
-
this.on(this.unregisteredEventName, () => {
|
960
|
-
this.logger.log('Unregistered from', this.options.socketInterfaces[0]);
|
961
|
-
this.setInitialized(false);
|
962
|
-
});
|
963
|
-
this.on(this.newRTCSessionEventName, this.newRTCSessionCallback.bind(this));
|
964
|
-
this.on(this.connectedEventName, () => {
|
965
|
-
this.logger.log('Connected to', this.options.socketInterfaces[0]);
|
966
|
-
this.isReconnecting = false;
|
967
|
-
});
|
968
|
-
this.on(this.disconnectedEventName, () => {
|
969
|
-
if (this.isReconnecting) {
|
970
|
-
return;
|
971
|
-
}
|
972
|
-
this.logger.log('Disconnected from', this.options.socketInterfaces[0]);
|
973
|
-
this.logger.log('Reconnecting to', this.options.socketInterfaces[0]);
|
974
|
-
this.isReconnecting = true;
|
975
|
-
this.stop();
|
976
|
-
this.setInitialized(false);
|
977
|
-
setTimeout(this.start.bind(this), 5000);
|
978
|
-
});
|
979
|
-
this.on(this.newMSRPSessionEventName, this.newMSRPSessionCallback.bind(this));
|
980
|
-
this.logger.log('Connecting to', this.options.socketInterfaces[0]);
|
981
|
-
this.start();
|
982
|
-
this.setMediaDevices(true);
|
983
|
-
return this;
|
984
|
-
}
|
985
|
-
setMuteWhenJoin(value) {
|
986
|
-
this.muteWhenJoinEnabled = value;
|
987
|
-
this.emit('changeMuteWhenJoin', value);
|
988
|
-
}
|
989
|
-
setMicrophoneInputLevel(value) {
|
990
|
-
this.microphoneInputLevelValue = value;
|
991
|
-
this.roomReconfigure(this.currentActiveRoomId);
|
992
|
-
}
|
993
|
-
setSpeakerVolume(value) {
|
994
|
-
this.speakerVolumeValue = value;
|
995
|
-
Object.values(this.extendedCalls).forEach((call) => {
|
996
|
-
if (call.audioTag) {
|
997
|
-
call.audioTag.volume = value;
|
998
|
-
}
|
999
|
-
});
|
1000
|
-
}
|
1001
|
-
setAutoAnswer(value) {
|
1002
|
-
this.isAutoAnswer = value;
|
1003
|
-
}
|
1004
|
-
setSelectedInputDevice(deviceId) {
|
1005
|
-
localStorage.setItem(STORAGE_KEYS.SELECTED_INPUT_DEVICE, deviceId);
|
1006
|
-
this.selectedMediaDevices.input = deviceId;
|
1007
|
-
this.emit('changeActiveInputMediaDevice', deviceId);
|
1008
|
-
}
|
1009
|
-
setSelectedOutputDevice(deviceId) {
|
1010
|
-
localStorage.setItem(STORAGE_KEYS.SELECTED_OUTPUT_DEVICE, deviceId);
|
1011
|
-
this.selectedMediaDevices.output = deviceId;
|
1012
|
-
this.emit('changeActiveOutputMediaDevice', deviceId);
|
1013
|
-
}
|
1014
|
-
setIsMSRPInitializing(value) {
|
1015
|
-
this.isMSRPInitializingValue = value;
|
1016
|
-
this.emit('isMSRPInitializingChanged', value);
|
1017
|
-
}
|
1018
|
-
_setCallMetrics(value) {
|
1019
|
-
const metrics = Object.assign({}, value);
|
1020
|
-
delete metrics['callId'];
|
1021
|
-
this.callMetrics = Object.assign(Object.assign({}, this.callMetrics), { [value.callId]: metrics });
|
1022
|
-
this.emit('changeCallMetrics', this.callMetrics);
|
1023
|
-
}
|
1024
|
-
_removeCallMetrics(callId) {
|
1025
|
-
const callMetricsCopy = Object.assign({}, this.callMetrics);
|
1026
|
-
delete callMetricsCopy[callId];
|
1027
|
-
this.callMetrics = Object.assign({}, callMetricsCopy);
|
1028
|
-
this.emit('changeCallMetrics', this.callMetrics);
|
1029
|
-
}
|
1030
|
-
_getCallQuality(call) {
|
1031
|
-
const metrics = new metrics_1.default(this.metricConfig);
|
1032
|
-
const probe = metrics.createProbe(call.connection, {
|
1033
|
-
cid: call._id
|
1034
|
-
});
|
1035
|
-
const inboundKeys = [];
|
1036
|
-
let inboundAudio;
|
1037
|
-
probe.onreport = (probe) => {
|
1038
|
-
//console.log('probe', probe)
|
1039
|
-
/*const inboundMetrics = Object.entries(probe.audio).filter(([ key, value ]) => {
|
1040
|
-
return value.direction === 'inbound'
|
1041
|
-
})*/
|
1042
|
-
//const ioo = Object.entries(probe.audio).
|
1043
|
-
Object.entries(probe.audio).forEach(([key, value]) => {
|
1044
|
-
if (value.direction === 'inbound' && !inboundKeys.includes(key)) {
|
1045
|
-
inboundKeys.push(key);
|
1046
|
-
inboundAudio = key;
|
1047
|
-
}
|
1048
|
-
});
|
1049
|
-
/*inboundMetrics.forEach(([ key, value ]) => {
|
1050
|
-
if (!inboundKeys.includes(key)) {
|
1051
|
-
inboundKeys.push(key)
|
1052
|
-
inboundAudio = key
|
1053
|
-
}
|
1054
|
-
})*/
|
1055
|
-
const inboundAudioMetric = probe.audio[inboundAudio];
|
1056
|
-
const metric = (0, filter_helper_1.filterObjectKeys)(inboundAudioMetric, metric_keys_to_include_1.METRIC_KEYS_TO_INCLUDE);
|
1057
|
-
metric.callId = call._id;
|
1058
|
-
this._setCallMetrics(metrics);
|
1059
|
-
};
|
1060
|
-
this.subscribe(call_event_listener_type_1.CALL_EVENT_LISTENER_TYPE.CALL_ENDED, (session) => {
|
1061
|
-
if (session._id === call._id) {
|
1062
|
-
metrics.stopAllProbes();
|
1063
|
-
}
|
1064
|
-
});
|
1065
|
-
metrics.startAllProbes();
|
1066
|
-
}
|
1067
|
-
_triggerAddStream(event, call) {
|
1068
|
-
return __awaiter(this, void 0, void 0, function* () {
|
1069
|
-
this.setIsMuted(this.muteWhenJoin);
|
1070
|
-
const stream = yield navigator.mediaDevices.getUserMedia(this.getUserMediaConstraints);
|
1071
|
-
const processedStream = (0, audio_helper_1.processAudioVolume)(stream, this.microphoneInputLevel);
|
1072
|
-
const muteMicro = this.isMuted || this.muteWhenJoin;
|
1073
|
-
processedStream.getTracks().forEach(track => track.enabled = !muteMicro);
|
1074
|
-
this._setOriginalStream(processedStream);
|
1075
|
-
yield call.connection.getSenders()[0].replaceTrack(processedStream.getTracks()[0]);
|
1076
|
-
(0, audio_helper_1.syncStream)(event, call, this.selectedOutputDevice, this.speakerVolume);
|
1077
|
-
this._getCallQuality(call);
|
1078
|
-
this.updateCall(call);
|
1079
|
-
});
|
1080
|
-
}
|
1081
|
-
doCall({ target, addToCurrentRoom }) {
|
1082
|
-
this.checkInitialized();
|
1083
|
-
if (target.length === 0) {
|
1084
|
-
return console.error('Target must be a valid string');
|
1085
|
-
}
|
1086
|
-
this.logger.log(`Calling sip:${target}@${this.sipDomain}...`);
|
1087
|
-
const call = this.call(`sip:${target}@${this.sipDomain}`, this.sipOptions);
|
1088
|
-
this.callAddingInProgress = call.id;
|
1089
|
-
if (addToCurrentRoom && this.currentActiveRoomId !== undefined) {
|
1090
|
-
this.callChangeRoom({
|
1091
|
-
callId: call.id,
|
1092
|
-
roomId: this.currentActiveRoomId
|
1093
|
-
});
|
1094
|
-
}
|
1095
|
-
call.connection.addEventListener('addstream', (event) => {
|
1096
|
-
this._triggerAddStream(event, call);
|
1097
|
-
});
|
1098
|
-
}
|
1099
|
-
initMSRP(target, body, options) {
|
1100
|
-
this.checkInitialized();
|
1101
|
-
if (target.length === 0) {
|
1102
|
-
return console.error('Target must be a valid string');
|
1103
|
-
}
|
1104
|
-
const session = this.startMSRP(target, options);
|
1105
|
-
session.on('active', () => {
|
1106
|
-
this.addMessageSession(session);
|
1107
|
-
session.sendMSRP(body);
|
1108
|
-
this.setIsMSRPInitializing(false);
|
1109
|
-
});
|
1110
|
-
this.setIsMSRPInitializing(true);
|
1111
|
-
// if (this.currentActiveRoomId !== undefined) {
|
1112
|
-
// this.callChangeRoom({
|
1113
|
-
// callId: call.id,
|
1114
|
-
// roomId: this.currentActiveRoomId
|
1115
|
-
// })
|
1116
|
-
// }
|
1117
|
-
//this.updateMSRPSession(session)
|
1118
|
-
}
|
1119
|
-
sendMSRP(msrpSessionId, body) {
|
1120
|
-
const msrpSession = this.extendedMessages[msrpSessionId];
|
1121
|
-
if (!msrpSession) {
|
1122
|
-
throw new Error(`MSRP session with id ${msrpSessionId} doesn't exist!`);
|
1123
|
-
}
|
1124
|
-
msrpSession.sendMSRP(body);
|
1125
|
-
}
|
1126
|
-
callChangeRoom({ callId, roomId }) {
|
1127
|
-
return __awaiter(this, void 0, void 0, function* () {
|
1128
|
-
const oldRoomId = this.extendedCalls[callId].roomId;
|
1129
|
-
this.extendedCalls[callId].roomId = roomId;
|
1130
|
-
yield this.setCurrentActiveRoomId(roomId);
|
1131
|
-
return Promise.all([
|
1132
|
-
this.roomReconfigure(oldRoomId),
|
1133
|
-
this.roomReconfigure(roomId)
|
1134
|
-
]).then(() => {
|
1135
|
-
this.deleteRoomIfEmpty(oldRoomId);
|
1136
|
-
this.deleteRoomIfEmpty(roomId);
|
1137
|
-
});
|
1138
|
-
});
|
1139
|
-
}
|
1140
|
-
}
|
1141
|
-
exports.default = OpenSIPSJS;
|