@sentdm/voice-client 0.0.0-stage → 0.2.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/CHANGELOG.md +70 -0
- package/LICENSE +201 -0
- package/README.md +283 -2
- package/THIRD_PARTY_NOTICES.md +153 -0
- package/adapter/loader.d.mts +3 -0
- package/adapter/loader.d.mts.map +1 -0
- package/adapter/loader.d.ts +3 -0
- package/adapter/loader.d.ts.map +1 -0
- package/adapter/loader.js +6 -0
- package/adapter/loader.js.map +1 -0
- package/adapter/loader.mjs +3 -0
- package/adapter/loader.mjs.map +1 -0
- package/adapter/sinch-rtc.js +30 -0
- package/adapter/sinch-rtc.mjs +31 -0
- package/adapter/sinch.d.mts +3 -0
- package/adapter/sinch.d.mts.map +1 -0
- package/adapter/sinch.d.ts +3 -0
- package/adapter/sinch.d.ts.map +1 -0
- package/adapter/sinch.js +296 -0
- package/adapter/sinch.js.map +1 -0
- package/adapter/sinch.mjs +292 -0
- package/adapter/sinch.mjs.map +1 -0
- package/adapter/types.d.mts +79 -0
- package/adapter/types.d.mts.map +1 -0
- package/adapter/types.d.ts +79 -0
- package/adapter/types.d.ts.map +1 -0
- package/adapter/types.js +3 -0
- package/adapter/types.js.map +1 -0
- package/adapter/types.mjs +2 -0
- package/adapter/types.mjs.map +1 -0
- package/audio.d.mts +42 -0
- package/audio.d.mts.map +1 -0
- package/audio.d.ts +42 -0
- package/audio.d.ts.map +1 -0
- package/audio.js +125 -0
- package/audio.js.map +1 -0
- package/audio.mjs +121 -0
- package/audio.mjs.map +1 -0
- package/call.d.mts +60 -0
- package/call.d.mts.map +1 -0
- package/call.d.ts +60 -0
- package/call.d.ts.map +1 -0
- package/call.js +84 -0
- package/call.js.map +1 -0
- package/call.mjs +80 -0
- package/call.mjs.map +1 -0
- package/client.d.mts +118 -0
- package/client.d.mts.map +1 -0
- package/client.d.ts +118 -0
- package/client.d.ts.map +1 -0
- package/client.js +371 -0
- package/client.js.map +1 -0
- package/client.mjs +367 -0
- package/client.mjs.map +1 -0
- package/errors.d.mts +2 -0
- package/errors.d.mts.map +1 -0
- package/errors.d.ts +2 -0
- package/errors.d.ts.map +1 -0
- package/errors.js +16 -0
- package/errors.js.map +1 -0
- package/errors.mjs +4 -0
- package/errors.mjs.map +1 -0
- package/index.d.mts +4 -0
- package/index.d.mts.map +1 -0
- package/index.d.ts +4 -0
- package/index.d.ts.map +1 -0
- package/index.js +18 -0
- package/index.js.map +1 -0
- package/index.mjs +4 -0
- package/index.mjs.map +1 -0
- package/internal/tslib.js +75 -0
- package/internal/tslib.mjs +17 -0
- package/invite.d.mts +28 -0
- package/invite.d.mts.map +1 -0
- package/invite.d.ts +28 -0
- package/invite.d.ts.map +1 -0
- package/invite.js +64 -0
- package/invite.js.map +1 -0
- package/invite.mjs +60 -0
- package/invite.mjs.map +1 -0
- package/package.json +41 -3
- package/src/adapter/loader.ts +4 -0
- package/src/adapter/sinch-rtc.ts +3 -0
- package/src/adapter/sinch.ts +348 -0
- package/src/adapter/types.ts +64 -0
- package/src/audio.ts +174 -0
- package/src/call.ts +145 -0
- package/src/client.ts +598 -0
- package/src/errors.ts +15 -0
- package/src/index.ts +14 -0
- package/src/invite.ts +75 -0
- package/src/sw.js +14 -0
- package/src/tsconfig.json +11 -0
- package/src/version.ts +1 -0
- package/sw.js +14 -0
- package/version.d.mts +2 -0
- package/version.d.mts.map +1 -0
- package/version.d.ts +2 -0
- package/version.d.ts.map +1 -0
- package/version.js +5 -0
- package/version.js.map +1 -0
- package/version.mjs +2 -0
- package/version.mjs.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sinch.d.mts","sourceRoot":"","sources":["../src/adapter/sinch.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,cAAc,EAMf,oBAAgB;AAmEjB,eAAO,MAAM,gBAAgB,EAAE,cAM5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sinch.d.ts","sourceRoot":"","sources":["../src/adapter/sinch.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,cAAc,EAMf,mBAAgB;AAmEjB,eAAO,MAAM,gBAAgB,EAAE,cAM5B,CAAC"}
|
package/adapter/sinch.js
ADDED
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _SinchAdapter_instances, _SinchAdapter_sinch, _SinchAdapter_options, _SinchAdapter_client, _SinchAdapter_credential, _SinchAdapter_inputDeviceId, _SinchAdapter_audio, _SinchAdapter_calls, _SinchAdapter_answerRetryAt, _SinchAdapter_incomingListeners, _SinchAdapter_callEventListeners, _SinchAdapter_start, _SinchAdapter_stop, _SinchAdapter_started, _SinchAdapter_useInput, _SinchAdapter_playback, _SinchAdapter_placed, _SinchAdapter_play, _SinchAdapter_receive, _SinchAdapter_track, _SinchAdapter_ended, _SinchAdapter_warning, _SinchAdapter_emit;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.loadSinchAdapter = void 0;
|
|
5
|
+
const tslib_1 = require("../internal/tslib.js");
|
|
6
|
+
const voice_client_core_1 = require("@sentdm/voice-client-core");
|
|
7
|
+
const environmentHost = 'ocra-euc1.api.sinch.com';
|
|
8
|
+
const applicationPrefix = '//rtc.sinch.com/applications/';
|
|
9
|
+
const answerThrottle = 1500;
|
|
10
|
+
/** The application key and user id a credential names, read from its claims without verifying it. */
|
|
11
|
+
function credentialSubject(credential) {
|
|
12
|
+
let claims = {};
|
|
13
|
+
try {
|
|
14
|
+
claims = JSON.parse(atob((credential.split('.')[1] ?? '').replace(/-/g, '+').replace(/_/g, '/'))) ?? {};
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
// Read as empty, which Sinch refuses when the client starts.
|
|
18
|
+
}
|
|
19
|
+
const iss = typeof claims.iss === 'string' ? claims.iss : '';
|
|
20
|
+
const sub = typeof claims.sub === 'string' ? claims.sub : '';
|
|
21
|
+
return {
|
|
22
|
+
applicationKey: iss.slice(applicationPrefix.length),
|
|
23
|
+
userId: sub.startsWith(`${iss}/users/`) ? sub.slice(`${iss}/users/`.length) : '',
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const providerError = (error) => error instanceof voice_client_core_1.SentVoiceError ? error : (new voice_client_core_1.SentVoiceError({
|
|
27
|
+
code: 'UNKNOWN',
|
|
28
|
+
category: 'signaling',
|
|
29
|
+
retriable: false,
|
|
30
|
+
message: 'An unexpected calling error occurred.',
|
|
31
|
+
providerDetail: error,
|
|
32
|
+
}));
|
|
33
|
+
// The Sinch backend refuses a call it cannot set up with `Unable to connect call (<reason>)`, an HTTP
|
|
34
|
+
// failure whose only discriminator is that text. The caller gets a stable code and Sent's wording; the
|
|
35
|
+
// provider's reason is kept as provider detail, for telemetry.
|
|
36
|
+
const setupRefusal = /^Unable to connect call(?: \((.+)\))?/;
|
|
37
|
+
const setupRefusalMessages = {
|
|
38
|
+
'destination user not found': 'The destination is not registered.',
|
|
39
|
+
};
|
|
40
|
+
const callSetupError = (error) => {
|
|
41
|
+
const match = setupRefusal.exec(error.message);
|
|
42
|
+
if (!match)
|
|
43
|
+
return undefined;
|
|
44
|
+
const reason = match[1];
|
|
45
|
+
const message = reason === undefined ? undefined : setupRefusalMessages[reason];
|
|
46
|
+
return new voice_client_core_1.CallFailedError({
|
|
47
|
+
message: message ?? 'The call could not be connected.',
|
|
48
|
+
providerDetail: error,
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
const rethrow = (error) => {
|
|
52
|
+
throw providerError(error);
|
|
53
|
+
};
|
|
54
|
+
const guard = (action) => {
|
|
55
|
+
try {
|
|
56
|
+
return action();
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
return rethrow(error);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
const loadSinchAdapter = async (options) => new SinchAdapter(await Promise.resolve().then(() => tslib_1.__importStar(require("./sinch-rtc.js"))).catch((error) => {
|
|
63
|
+
throw new voice_client_core_1.NetworkError({ message: 'The calling provider could not be loaded.', providerDetail: error });
|
|
64
|
+
}), options);
|
|
65
|
+
exports.loadSinchAdapter = loadSinchAdapter;
|
|
66
|
+
class SinchAdapter {
|
|
67
|
+
constructor(sinch, options) {
|
|
68
|
+
_SinchAdapter_instances.add(this);
|
|
69
|
+
_SinchAdapter_sinch.set(this, void 0);
|
|
70
|
+
_SinchAdapter_options.set(this, void 0);
|
|
71
|
+
_SinchAdapter_client.set(this, void 0);
|
|
72
|
+
_SinchAdapter_credential.set(this, '');
|
|
73
|
+
_SinchAdapter_inputDeviceId.set(this, void 0);
|
|
74
|
+
_SinchAdapter_audio.set(this, void 0);
|
|
75
|
+
_SinchAdapter_calls.set(this, new Map());
|
|
76
|
+
_SinchAdapter_answerRetryAt.set(this, new Map());
|
|
77
|
+
_SinchAdapter_incomingListeners.set(this, []);
|
|
78
|
+
_SinchAdapter_callEventListeners.set(this, []);
|
|
79
|
+
tslib_1.__classPrivateFieldSet(this, _SinchAdapter_sinch, sinch, "f");
|
|
80
|
+
tslib_1.__classPrivateFieldSet(this, _SinchAdapter_options, options, "f");
|
|
81
|
+
}
|
|
82
|
+
async register(credential) {
|
|
83
|
+
tslib_1.__classPrivateFieldSet(this, _SinchAdapter_credential, credential, "f");
|
|
84
|
+
tslib_1.__classPrivateFieldSet(this, _SinchAdapter_client, tslib_1.__classPrivateFieldGet(this, _SinchAdapter_client, "f") ?? await tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_start).call(this, credential).catch(rethrow), "f");
|
|
85
|
+
}
|
|
86
|
+
async unregister() {
|
|
87
|
+
const client = tslib_1.__classPrivateFieldGet(this, _SinchAdapter_client, "f");
|
|
88
|
+
tslib_1.__classPrivateFieldSet(this, _SinchAdapter_client, undefined, "f");
|
|
89
|
+
if (client)
|
|
90
|
+
await tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_stop).call(this, client).catch(rethrow);
|
|
91
|
+
}
|
|
92
|
+
async call(target) {
|
|
93
|
+
const { callClient } = tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_started).call(this);
|
|
94
|
+
return tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_placed).call(this, target.kind === 'user' ? callClient.callUser(target.id) : callClient.callPhoneNumber(target.number));
|
|
95
|
+
}
|
|
96
|
+
async joinConference(room) {
|
|
97
|
+
return tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_placed).call(this, tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_started).call(this).callClient.callConference(room));
|
|
98
|
+
}
|
|
99
|
+
async answer(callId) {
|
|
100
|
+
const wait = (tslib_1.__classPrivateFieldGet(this, _SinchAdapter_answerRetryAt, "f").get(callId) ?? 0) - Date.now();
|
|
101
|
+
if (wait > 0)
|
|
102
|
+
await new Promise((resolve) => setTimeout(resolve, wait));
|
|
103
|
+
const call = tslib_1.__classPrivateFieldGet(this, _SinchAdapter_calls, "f").get(callId);
|
|
104
|
+
if (!call)
|
|
105
|
+
return;
|
|
106
|
+
tslib_1.__classPrivateFieldGet(this, _SinchAdapter_answerRetryAt, "f").set(callId, Date.now() + answerThrottle);
|
|
107
|
+
await call.answer().catch((error) => {
|
|
108
|
+
throw new voice_client_core_1.MediaPermissionError({ providerDetail: error });
|
|
109
|
+
});
|
|
110
|
+
tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_play).call(this, call);
|
|
111
|
+
}
|
|
112
|
+
async reject(callId) {
|
|
113
|
+
return this.hangup(callId);
|
|
114
|
+
}
|
|
115
|
+
async hangup(callId) {
|
|
116
|
+
guard(() => tslib_1.__classPrivateFieldGet(this, _SinchAdapter_calls, "f").get(callId)?.hangup());
|
|
117
|
+
}
|
|
118
|
+
mute(callId, muted) {
|
|
119
|
+
const call = tslib_1.__classPrivateFieldGet(this, _SinchAdapter_calls, "f").get(callId);
|
|
120
|
+
if (muted)
|
|
121
|
+
call?.mute();
|
|
122
|
+
else
|
|
123
|
+
call?.unmute();
|
|
124
|
+
}
|
|
125
|
+
sendDigits(callId, digits) {
|
|
126
|
+
guard(() => tslib_1.__classPrivateFieldGet(this, _SinchAdapter_calls, "f").get(callId)?.sendDtmf(digits));
|
|
127
|
+
}
|
|
128
|
+
async getStats(callId) {
|
|
129
|
+
const call = tslib_1.__classPrivateFieldGet(this, _SinchAdapter_calls, "f").get(callId);
|
|
130
|
+
const report = await call?.getPeerConnectionStats();
|
|
131
|
+
const stats = { jitter: 0, packetLoss: 0, rtt: 0 };
|
|
132
|
+
report?.forEach((entry) => {
|
|
133
|
+
if (entry.type === 'inbound-rtp' && entry.kind === 'audio') {
|
|
134
|
+
const lost = Math.max(0, entry.packetsLost ?? 0);
|
|
135
|
+
const packets = lost + (entry.packetsReceived ?? 0);
|
|
136
|
+
stats.jitter = (entry.jitter ?? 0) * 1000;
|
|
137
|
+
stats.packetLoss = packets > 0 ? lost / packets : 0;
|
|
138
|
+
}
|
|
139
|
+
else if (entry.type === 'candidate-pair' && entry.state === 'succeeded') {
|
|
140
|
+
stats.rtt = (entry.currentRoundTripTime ?? 0) * 1000;
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
return stats;
|
|
144
|
+
}
|
|
145
|
+
onIncoming(listener) {
|
|
146
|
+
tslib_1.__classPrivateFieldGet(this, _SinchAdapter_incomingListeners, "f").push(listener);
|
|
147
|
+
}
|
|
148
|
+
onCallEvent(listener) {
|
|
149
|
+
tslib_1.__classPrivateFieldGet(this, _SinchAdapter_callEventListeners, "f").push(listener);
|
|
150
|
+
}
|
|
151
|
+
async setInputDevice(deviceId) {
|
|
152
|
+
tslib_1.__classPrivateFieldSet(this, _SinchAdapter_inputDeviceId, deviceId, "f");
|
|
153
|
+
if (tslib_1.__classPrivateFieldGet(this, _SinchAdapter_client, "f")?.isStarted())
|
|
154
|
+
tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_useInput).call(this, tslib_1.__classPrivateFieldGet(this, _SinchAdapter_client, "f").callClient, deviceId);
|
|
155
|
+
}
|
|
156
|
+
async setOutputDevice(deviceId) {
|
|
157
|
+
const audio = tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_playback).call(this);
|
|
158
|
+
if (!('setSinkId' in audio)) {
|
|
159
|
+
throw new voice_client_core_1.CapabilityUnsupportedError({
|
|
160
|
+
message: 'Choosing the audio output device is not supported by this browser.',
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
await audio.setSinkId(deviceId).catch(rethrow);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
_SinchAdapter_sinch = new WeakMap(), _SinchAdapter_options = new WeakMap(), _SinchAdapter_client = new WeakMap(), _SinchAdapter_credential = new WeakMap(), _SinchAdapter_inputDeviceId = new WeakMap(), _SinchAdapter_audio = new WeakMap(), _SinchAdapter_calls = new WeakMap(), _SinchAdapter_answerRetryAt = new WeakMap(), _SinchAdapter_incomingListeners = new WeakMap(), _SinchAdapter_callEventListeners = new WeakMap(), _SinchAdapter_instances = new WeakSet(), _SinchAdapter_start = async function _SinchAdapter_start(credential) {
|
|
167
|
+
const { applicationKey, userId } = credentialSubject(credential);
|
|
168
|
+
const client = tslib_1.__classPrivateFieldGet(this, _SinchAdapter_sinch, "f").Sinch.getSinchClientBuilder()
|
|
169
|
+
.applicationKey(applicationKey)
|
|
170
|
+
.userId(userId)
|
|
171
|
+
.environmentHost(environmentHost)
|
|
172
|
+
.build();
|
|
173
|
+
const { url, scope } = tslib_1.__classPrivateFieldGet(this, _SinchAdapter_options, "f").serviceWorker ?? {};
|
|
174
|
+
try {
|
|
175
|
+
await new Promise((resolve, reject) => {
|
|
176
|
+
client.addListener({
|
|
177
|
+
onCredentialsRequired: (_, registration) => void registration.register(tslib_1.__classPrivateFieldGet(this, _SinchAdapter_credential, "f")),
|
|
178
|
+
onClientStarted: ({ callClient }) => {
|
|
179
|
+
callClient.addListener({ onIncomingCall: (_, call) => tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_receive).call(this, call) });
|
|
180
|
+
if (tslib_1.__classPrivateFieldGet(this, _SinchAdapter_inputDeviceId, "f") !== undefined)
|
|
181
|
+
tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_useInput).call(this, callClient, tslib_1.__classPrivateFieldGet(this, _SinchAdapter_inputDeviceId, "f"));
|
|
182
|
+
resolve();
|
|
183
|
+
},
|
|
184
|
+
onClientFailed: (_, error) => reject(error),
|
|
185
|
+
});
|
|
186
|
+
client
|
|
187
|
+
.setSupportManagedPush(url, scope === undefined ? undefined : { scope })
|
|
188
|
+
.then(() => client.start(), reject);
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
await tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_stop).call(this, client).catch(() => { });
|
|
193
|
+
throw error;
|
|
194
|
+
}
|
|
195
|
+
return client;
|
|
196
|
+
}, _SinchAdapter_stop = async function _SinchAdapter_stop(client) {
|
|
197
|
+
try {
|
|
198
|
+
await client.disableManagedPushSupport();
|
|
199
|
+
}
|
|
200
|
+
finally {
|
|
201
|
+
client.terminate();
|
|
202
|
+
}
|
|
203
|
+
}, _SinchAdapter_started = function _SinchAdapter_started() {
|
|
204
|
+
if (!tslib_1.__classPrivateFieldGet(this, _SinchAdapter_client, "f"))
|
|
205
|
+
throw new voice_client_core_1.NotRegisteredError();
|
|
206
|
+
return tslib_1.__classPrivateFieldGet(this, _SinchAdapter_client, "f");
|
|
207
|
+
}, _SinchAdapter_useInput = function _SinchAdapter_useInput(callClient, deviceId) {
|
|
208
|
+
callClient.setAudioTrackConstraints({ deviceId });
|
|
209
|
+
}, _SinchAdapter_playback = function _SinchAdapter_playback() {
|
|
210
|
+
return (tslib_1.__classPrivateFieldSet(this, _SinchAdapter_audio, tslib_1.__classPrivateFieldGet(this, _SinchAdapter_audio, "f") ?? (tslib_1.__classPrivateFieldGet(this, _SinchAdapter_options, "f").audioElement ?? new Audio()), "f"));
|
|
211
|
+
}, _SinchAdapter_placed = async function _SinchAdapter_placed(placing) {
|
|
212
|
+
const call = await placing.catch(rethrow);
|
|
213
|
+
if (!call.outgoingStream?.getAudioTracks().length) {
|
|
214
|
+
guard(() => call.hangup());
|
|
215
|
+
throw new voice_client_core_1.MediaPermissionError();
|
|
216
|
+
}
|
|
217
|
+
tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_play).call(this, call);
|
|
218
|
+
return tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_track).call(this, call);
|
|
219
|
+
}, _SinchAdapter_play = function _SinchAdapter_play(call) {
|
|
220
|
+
const audio = tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_playback).call(this);
|
|
221
|
+
audio.autoplay = true;
|
|
222
|
+
audio.srcObject = call.incomingStream ?? null;
|
|
223
|
+
}, _SinchAdapter_receive = function _SinchAdapter_receive(call) {
|
|
224
|
+
tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_track).call(this, call);
|
|
225
|
+
for (const listener of tslib_1.__classPrivateFieldGet(this, _SinchAdapter_incomingListeners, "f"))
|
|
226
|
+
listener({ callId: call.id, from: call.remoteUserId });
|
|
227
|
+
}, _SinchAdapter_track = function _SinchAdapter_track(call) {
|
|
228
|
+
const listener = {
|
|
229
|
+
onCallProgressing: () => tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_emit).call(this, { callId: call.id, type: 'ringing' }),
|
|
230
|
+
onCallAnswered: () => tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_emit).call(this, { callId: call.id, type: 'answered' }),
|
|
231
|
+
onCallEstablished: () => tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_emit).call(this, { callId: call.id, type: 'connected' }),
|
|
232
|
+
onCallQualityWarningEvent: (_, warning) => {
|
|
233
|
+
const event = tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_warning).call(this, call.id, warning);
|
|
234
|
+
if (event)
|
|
235
|
+
tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_emit).call(this, event);
|
|
236
|
+
},
|
|
237
|
+
onCallEnded: () => {
|
|
238
|
+
call.removeListener(listener);
|
|
239
|
+
tslib_1.__classPrivateFieldGet(this, _SinchAdapter_calls, "f").delete(call.id);
|
|
240
|
+
tslib_1.__classPrivateFieldGet(this, _SinchAdapter_answerRetryAt, "f").delete(call.id);
|
|
241
|
+
if (tslib_1.__classPrivateFieldGet(this, _SinchAdapter_audio, "f") && tslib_1.__classPrivateFieldGet(this, _SinchAdapter_audio, "f").srcObject === call.incomingStream)
|
|
242
|
+
tslib_1.__classPrivateFieldGet(this, _SinchAdapter_audio, "f").srcObject = null;
|
|
243
|
+
tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_emit).call(this, tslib_1.__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_ended).call(this, call));
|
|
244
|
+
},
|
|
245
|
+
};
|
|
246
|
+
call.addListener(listener);
|
|
247
|
+
tslib_1.__classPrivateFieldGet(this, _SinchAdapter_calls, "f").set(call.id, call);
|
|
248
|
+
return call.id;
|
|
249
|
+
}, _SinchAdapter_ended = function _SinchAdapter_ended({ id: callId, details: { endCause, error } }) {
|
|
250
|
+
const { CallEndCause, ErrorType } = tslib_1.__classPrivateFieldGet(this, _SinchAdapter_sinch, "f");
|
|
251
|
+
switch (endCause) {
|
|
252
|
+
case CallEndCause.Denied:
|
|
253
|
+
return { callId, type: 'ended', reason: 'busy' };
|
|
254
|
+
case CallEndCause.NoAnswer:
|
|
255
|
+
case CallEndCause.Timeout:
|
|
256
|
+
return { callId, type: 'ended', reason: 'noAnswer' };
|
|
257
|
+
case CallEndCause.Inactive:
|
|
258
|
+
return {
|
|
259
|
+
callId,
|
|
260
|
+
type: 'ended',
|
|
261
|
+
reason: 'failed',
|
|
262
|
+
error: new voice_client_core_1.NetworkError({ providerDetail: error }),
|
|
263
|
+
};
|
|
264
|
+
case CallEndCause.Failure:
|
|
265
|
+
if (!error)
|
|
266
|
+
return { callId, type: 'ended', reason: 'failed' };
|
|
267
|
+
return {
|
|
268
|
+
callId,
|
|
269
|
+
type: 'ended',
|
|
270
|
+
reason: 'failed',
|
|
271
|
+
error: error.domain === ErrorType.Network ?
|
|
272
|
+
new voice_client_core_1.NetworkError({ providerDetail: error })
|
|
273
|
+
: (callSetupError(error) ?? providerError(error)),
|
|
274
|
+
};
|
|
275
|
+
default:
|
|
276
|
+
return { callId, type: 'ended', reason: 'completed' };
|
|
277
|
+
}
|
|
278
|
+
}, _SinchAdapter_warning = function _SinchAdapter_warning(callId, { name, type }) {
|
|
279
|
+
const cleared = type === tslib_1.__classPrivateFieldGet(this, _SinchAdapter_sinch, "f").CallQualityWarningEventType.Recover;
|
|
280
|
+
switch (name) {
|
|
281
|
+
case 'missingMediaStream':
|
|
282
|
+
return { callId, type: cleared ? 'reconnected' : 'reconnecting' };
|
|
283
|
+
case 'highInboundJitter':
|
|
284
|
+
return { callId, type: 'qualityWarning', warning: { metric: 'jitter', cleared } };
|
|
285
|
+
case 'highInboundPacketLoss':
|
|
286
|
+
return { callId, type: 'qualityWarning', warning: { metric: 'packetLoss', cleared } };
|
|
287
|
+
case 'highRemoteInboundRtt':
|
|
288
|
+
return { callId, type: 'qualityWarning', warning: { metric: 'rtt', cleared } };
|
|
289
|
+
default:
|
|
290
|
+
return undefined;
|
|
291
|
+
}
|
|
292
|
+
}, _SinchAdapter_emit = function _SinchAdapter_emit(event) {
|
|
293
|
+
for (const listener of tslib_1.__classPrivateFieldGet(this, _SinchAdapter_callEventListeners, "f"))
|
|
294
|
+
listener(event);
|
|
295
|
+
};
|
|
296
|
+
//# sourceMappingURL=sinch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sinch.js","sourceRoot":"","sources":["../src/adapter/sinch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
var _SinchAdapter_instances, _SinchAdapter_sinch, _SinchAdapter_options, _SinchAdapter_client, _SinchAdapter_credential, _SinchAdapter_inputDeviceId, _SinchAdapter_audio, _SinchAdapter_calls, _SinchAdapter_answerRetryAt, _SinchAdapter_incomingListeners, _SinchAdapter_callEventListeners, _SinchAdapter_start, _SinchAdapter_stop, _SinchAdapter_started, _SinchAdapter_useInput, _SinchAdapter_playback, _SinchAdapter_placed, _SinchAdapter_play, _SinchAdapter_receive, _SinchAdapter_track, _SinchAdapter_ended, _SinchAdapter_warning, _SinchAdapter_emit;
|
|
2
|
+
import { __classPrivateFieldGet, __classPrivateFieldSet } from "../internal/tslib.mjs";
|
|
3
|
+
import { CallFailedError, CapabilityUnsupportedError, MediaPermissionError, NetworkError, NotRegisteredError, SentVoiceError, } from '@sentdm/voice-client-core';
|
|
4
|
+
const environmentHost = 'ocra-euc1.api.sinch.com';
|
|
5
|
+
const applicationPrefix = '//rtc.sinch.com/applications/';
|
|
6
|
+
const answerThrottle = 1500;
|
|
7
|
+
/** The application key and user id a credential names, read from its claims without verifying it. */
|
|
8
|
+
function credentialSubject(credential) {
|
|
9
|
+
let claims = {};
|
|
10
|
+
try {
|
|
11
|
+
claims = JSON.parse(atob((credential.split('.')[1] ?? '').replace(/-/g, '+').replace(/_/g, '/'))) ?? {};
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// Read as empty, which Sinch refuses when the client starts.
|
|
15
|
+
}
|
|
16
|
+
const iss = typeof claims.iss === 'string' ? claims.iss : '';
|
|
17
|
+
const sub = typeof claims.sub === 'string' ? claims.sub : '';
|
|
18
|
+
return {
|
|
19
|
+
applicationKey: iss.slice(applicationPrefix.length),
|
|
20
|
+
userId: sub.startsWith(`${iss}/users/`) ? sub.slice(`${iss}/users/`.length) : '',
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const providerError = (error) => error instanceof SentVoiceError ? error : (new SentVoiceError({
|
|
24
|
+
code: 'UNKNOWN',
|
|
25
|
+
category: 'signaling',
|
|
26
|
+
retriable: false,
|
|
27
|
+
message: 'An unexpected calling error occurred.',
|
|
28
|
+
providerDetail: error,
|
|
29
|
+
}));
|
|
30
|
+
// The Sinch backend refuses a call it cannot set up with `Unable to connect call (<reason>)`, an HTTP
|
|
31
|
+
// failure whose only discriminator is that text. The caller gets a stable code and Sent's wording; the
|
|
32
|
+
// provider's reason is kept as provider detail, for telemetry.
|
|
33
|
+
const setupRefusal = /^Unable to connect call(?: \((.+)\))?/;
|
|
34
|
+
const setupRefusalMessages = {
|
|
35
|
+
'destination user not found': 'The destination is not registered.',
|
|
36
|
+
};
|
|
37
|
+
const callSetupError = (error) => {
|
|
38
|
+
const match = setupRefusal.exec(error.message);
|
|
39
|
+
if (!match)
|
|
40
|
+
return undefined;
|
|
41
|
+
const reason = match[1];
|
|
42
|
+
const message = reason === undefined ? undefined : setupRefusalMessages[reason];
|
|
43
|
+
return new CallFailedError({
|
|
44
|
+
message: message ?? 'The call could not be connected.',
|
|
45
|
+
providerDetail: error,
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
const rethrow = (error) => {
|
|
49
|
+
throw providerError(error);
|
|
50
|
+
};
|
|
51
|
+
const guard = (action) => {
|
|
52
|
+
try {
|
|
53
|
+
return action();
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
return rethrow(error);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
export const loadSinchAdapter = async (options) => new SinchAdapter(await import("./sinch-rtc.mjs").catch((error) => {
|
|
60
|
+
throw new NetworkError({ message: 'The calling provider could not be loaded.', providerDetail: error });
|
|
61
|
+
}), options);
|
|
62
|
+
class SinchAdapter {
|
|
63
|
+
constructor(sinch, options) {
|
|
64
|
+
_SinchAdapter_instances.add(this);
|
|
65
|
+
_SinchAdapter_sinch.set(this, void 0);
|
|
66
|
+
_SinchAdapter_options.set(this, void 0);
|
|
67
|
+
_SinchAdapter_client.set(this, void 0);
|
|
68
|
+
_SinchAdapter_credential.set(this, '');
|
|
69
|
+
_SinchAdapter_inputDeviceId.set(this, void 0);
|
|
70
|
+
_SinchAdapter_audio.set(this, void 0);
|
|
71
|
+
_SinchAdapter_calls.set(this, new Map());
|
|
72
|
+
_SinchAdapter_answerRetryAt.set(this, new Map());
|
|
73
|
+
_SinchAdapter_incomingListeners.set(this, []);
|
|
74
|
+
_SinchAdapter_callEventListeners.set(this, []);
|
|
75
|
+
__classPrivateFieldSet(this, _SinchAdapter_sinch, sinch, "f");
|
|
76
|
+
__classPrivateFieldSet(this, _SinchAdapter_options, options, "f");
|
|
77
|
+
}
|
|
78
|
+
async register(credential) {
|
|
79
|
+
__classPrivateFieldSet(this, _SinchAdapter_credential, credential, "f");
|
|
80
|
+
__classPrivateFieldSet(this, _SinchAdapter_client, __classPrivateFieldGet(this, _SinchAdapter_client, "f") ?? await __classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_start).call(this, credential).catch(rethrow), "f");
|
|
81
|
+
}
|
|
82
|
+
async unregister() {
|
|
83
|
+
const client = __classPrivateFieldGet(this, _SinchAdapter_client, "f");
|
|
84
|
+
__classPrivateFieldSet(this, _SinchAdapter_client, undefined, "f");
|
|
85
|
+
if (client)
|
|
86
|
+
await __classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_stop).call(this, client).catch(rethrow);
|
|
87
|
+
}
|
|
88
|
+
async call(target) {
|
|
89
|
+
const { callClient } = __classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_started).call(this);
|
|
90
|
+
return __classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_placed).call(this, target.kind === 'user' ? callClient.callUser(target.id) : callClient.callPhoneNumber(target.number));
|
|
91
|
+
}
|
|
92
|
+
async joinConference(room) {
|
|
93
|
+
return __classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_placed).call(this, __classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_started).call(this).callClient.callConference(room));
|
|
94
|
+
}
|
|
95
|
+
async answer(callId) {
|
|
96
|
+
const wait = (__classPrivateFieldGet(this, _SinchAdapter_answerRetryAt, "f").get(callId) ?? 0) - Date.now();
|
|
97
|
+
if (wait > 0)
|
|
98
|
+
await new Promise((resolve) => setTimeout(resolve, wait));
|
|
99
|
+
const call = __classPrivateFieldGet(this, _SinchAdapter_calls, "f").get(callId);
|
|
100
|
+
if (!call)
|
|
101
|
+
return;
|
|
102
|
+
__classPrivateFieldGet(this, _SinchAdapter_answerRetryAt, "f").set(callId, Date.now() + answerThrottle);
|
|
103
|
+
await call.answer().catch((error) => {
|
|
104
|
+
throw new MediaPermissionError({ providerDetail: error });
|
|
105
|
+
});
|
|
106
|
+
__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_play).call(this, call);
|
|
107
|
+
}
|
|
108
|
+
async reject(callId) {
|
|
109
|
+
return this.hangup(callId);
|
|
110
|
+
}
|
|
111
|
+
async hangup(callId) {
|
|
112
|
+
guard(() => __classPrivateFieldGet(this, _SinchAdapter_calls, "f").get(callId)?.hangup());
|
|
113
|
+
}
|
|
114
|
+
mute(callId, muted) {
|
|
115
|
+
const call = __classPrivateFieldGet(this, _SinchAdapter_calls, "f").get(callId);
|
|
116
|
+
if (muted)
|
|
117
|
+
call?.mute();
|
|
118
|
+
else
|
|
119
|
+
call?.unmute();
|
|
120
|
+
}
|
|
121
|
+
sendDigits(callId, digits) {
|
|
122
|
+
guard(() => __classPrivateFieldGet(this, _SinchAdapter_calls, "f").get(callId)?.sendDtmf(digits));
|
|
123
|
+
}
|
|
124
|
+
async getStats(callId) {
|
|
125
|
+
const call = __classPrivateFieldGet(this, _SinchAdapter_calls, "f").get(callId);
|
|
126
|
+
const report = await call?.getPeerConnectionStats();
|
|
127
|
+
const stats = { jitter: 0, packetLoss: 0, rtt: 0 };
|
|
128
|
+
report?.forEach((entry) => {
|
|
129
|
+
if (entry.type === 'inbound-rtp' && entry.kind === 'audio') {
|
|
130
|
+
const lost = Math.max(0, entry.packetsLost ?? 0);
|
|
131
|
+
const packets = lost + (entry.packetsReceived ?? 0);
|
|
132
|
+
stats.jitter = (entry.jitter ?? 0) * 1000;
|
|
133
|
+
stats.packetLoss = packets > 0 ? lost / packets : 0;
|
|
134
|
+
}
|
|
135
|
+
else if (entry.type === 'candidate-pair' && entry.state === 'succeeded') {
|
|
136
|
+
stats.rtt = (entry.currentRoundTripTime ?? 0) * 1000;
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
return stats;
|
|
140
|
+
}
|
|
141
|
+
onIncoming(listener) {
|
|
142
|
+
__classPrivateFieldGet(this, _SinchAdapter_incomingListeners, "f").push(listener);
|
|
143
|
+
}
|
|
144
|
+
onCallEvent(listener) {
|
|
145
|
+
__classPrivateFieldGet(this, _SinchAdapter_callEventListeners, "f").push(listener);
|
|
146
|
+
}
|
|
147
|
+
async setInputDevice(deviceId) {
|
|
148
|
+
__classPrivateFieldSet(this, _SinchAdapter_inputDeviceId, deviceId, "f");
|
|
149
|
+
if (__classPrivateFieldGet(this, _SinchAdapter_client, "f")?.isStarted())
|
|
150
|
+
__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_useInput).call(this, __classPrivateFieldGet(this, _SinchAdapter_client, "f").callClient, deviceId);
|
|
151
|
+
}
|
|
152
|
+
async setOutputDevice(deviceId) {
|
|
153
|
+
const audio = __classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_playback).call(this);
|
|
154
|
+
if (!('setSinkId' in audio)) {
|
|
155
|
+
throw new CapabilityUnsupportedError({
|
|
156
|
+
message: 'Choosing the audio output device is not supported by this browser.',
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
await audio.setSinkId(deviceId).catch(rethrow);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
_SinchAdapter_sinch = new WeakMap(), _SinchAdapter_options = new WeakMap(), _SinchAdapter_client = new WeakMap(), _SinchAdapter_credential = new WeakMap(), _SinchAdapter_inputDeviceId = new WeakMap(), _SinchAdapter_audio = new WeakMap(), _SinchAdapter_calls = new WeakMap(), _SinchAdapter_answerRetryAt = new WeakMap(), _SinchAdapter_incomingListeners = new WeakMap(), _SinchAdapter_callEventListeners = new WeakMap(), _SinchAdapter_instances = new WeakSet(), _SinchAdapter_start = async function _SinchAdapter_start(credential) {
|
|
163
|
+
const { applicationKey, userId } = credentialSubject(credential);
|
|
164
|
+
const client = __classPrivateFieldGet(this, _SinchAdapter_sinch, "f").Sinch.getSinchClientBuilder()
|
|
165
|
+
.applicationKey(applicationKey)
|
|
166
|
+
.userId(userId)
|
|
167
|
+
.environmentHost(environmentHost)
|
|
168
|
+
.build();
|
|
169
|
+
const { url, scope } = __classPrivateFieldGet(this, _SinchAdapter_options, "f").serviceWorker ?? {};
|
|
170
|
+
try {
|
|
171
|
+
await new Promise((resolve, reject) => {
|
|
172
|
+
client.addListener({
|
|
173
|
+
onCredentialsRequired: (_, registration) => void registration.register(__classPrivateFieldGet(this, _SinchAdapter_credential, "f")),
|
|
174
|
+
onClientStarted: ({ callClient }) => {
|
|
175
|
+
callClient.addListener({ onIncomingCall: (_, call) => __classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_receive).call(this, call) });
|
|
176
|
+
if (__classPrivateFieldGet(this, _SinchAdapter_inputDeviceId, "f") !== undefined)
|
|
177
|
+
__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_useInput).call(this, callClient, __classPrivateFieldGet(this, _SinchAdapter_inputDeviceId, "f"));
|
|
178
|
+
resolve();
|
|
179
|
+
},
|
|
180
|
+
onClientFailed: (_, error) => reject(error),
|
|
181
|
+
});
|
|
182
|
+
client
|
|
183
|
+
.setSupportManagedPush(url, scope === undefined ? undefined : { scope })
|
|
184
|
+
.then(() => client.start(), reject);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
await __classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_stop).call(this, client).catch(() => { });
|
|
189
|
+
throw error;
|
|
190
|
+
}
|
|
191
|
+
return client;
|
|
192
|
+
}, _SinchAdapter_stop = async function _SinchAdapter_stop(client) {
|
|
193
|
+
try {
|
|
194
|
+
await client.disableManagedPushSupport();
|
|
195
|
+
}
|
|
196
|
+
finally {
|
|
197
|
+
client.terminate();
|
|
198
|
+
}
|
|
199
|
+
}, _SinchAdapter_started = function _SinchAdapter_started() {
|
|
200
|
+
if (!__classPrivateFieldGet(this, _SinchAdapter_client, "f"))
|
|
201
|
+
throw new NotRegisteredError();
|
|
202
|
+
return __classPrivateFieldGet(this, _SinchAdapter_client, "f");
|
|
203
|
+
}, _SinchAdapter_useInput = function _SinchAdapter_useInput(callClient, deviceId) {
|
|
204
|
+
callClient.setAudioTrackConstraints({ deviceId });
|
|
205
|
+
}, _SinchAdapter_playback = function _SinchAdapter_playback() {
|
|
206
|
+
return (__classPrivateFieldSet(this, _SinchAdapter_audio, __classPrivateFieldGet(this, _SinchAdapter_audio, "f") ?? (__classPrivateFieldGet(this, _SinchAdapter_options, "f").audioElement ?? new Audio()), "f"));
|
|
207
|
+
}, _SinchAdapter_placed = async function _SinchAdapter_placed(placing) {
|
|
208
|
+
const call = await placing.catch(rethrow);
|
|
209
|
+
if (!call.outgoingStream?.getAudioTracks().length) {
|
|
210
|
+
guard(() => call.hangup());
|
|
211
|
+
throw new MediaPermissionError();
|
|
212
|
+
}
|
|
213
|
+
__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_play).call(this, call);
|
|
214
|
+
return __classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_track).call(this, call);
|
|
215
|
+
}, _SinchAdapter_play = function _SinchAdapter_play(call) {
|
|
216
|
+
const audio = __classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_playback).call(this);
|
|
217
|
+
audio.autoplay = true;
|
|
218
|
+
audio.srcObject = call.incomingStream ?? null;
|
|
219
|
+
}, _SinchAdapter_receive = function _SinchAdapter_receive(call) {
|
|
220
|
+
__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_track).call(this, call);
|
|
221
|
+
for (const listener of __classPrivateFieldGet(this, _SinchAdapter_incomingListeners, "f"))
|
|
222
|
+
listener({ callId: call.id, from: call.remoteUserId });
|
|
223
|
+
}, _SinchAdapter_track = function _SinchAdapter_track(call) {
|
|
224
|
+
const listener = {
|
|
225
|
+
onCallProgressing: () => __classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_emit).call(this, { callId: call.id, type: 'ringing' }),
|
|
226
|
+
onCallAnswered: () => __classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_emit).call(this, { callId: call.id, type: 'answered' }),
|
|
227
|
+
onCallEstablished: () => __classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_emit).call(this, { callId: call.id, type: 'connected' }),
|
|
228
|
+
onCallQualityWarningEvent: (_, warning) => {
|
|
229
|
+
const event = __classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_warning).call(this, call.id, warning);
|
|
230
|
+
if (event)
|
|
231
|
+
__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_emit).call(this, event);
|
|
232
|
+
},
|
|
233
|
+
onCallEnded: () => {
|
|
234
|
+
call.removeListener(listener);
|
|
235
|
+
__classPrivateFieldGet(this, _SinchAdapter_calls, "f").delete(call.id);
|
|
236
|
+
__classPrivateFieldGet(this, _SinchAdapter_answerRetryAt, "f").delete(call.id);
|
|
237
|
+
if (__classPrivateFieldGet(this, _SinchAdapter_audio, "f") && __classPrivateFieldGet(this, _SinchAdapter_audio, "f").srcObject === call.incomingStream)
|
|
238
|
+
__classPrivateFieldGet(this, _SinchAdapter_audio, "f").srcObject = null;
|
|
239
|
+
__classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_emit).call(this, __classPrivateFieldGet(this, _SinchAdapter_instances, "m", _SinchAdapter_ended).call(this, call));
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
call.addListener(listener);
|
|
243
|
+
__classPrivateFieldGet(this, _SinchAdapter_calls, "f").set(call.id, call);
|
|
244
|
+
return call.id;
|
|
245
|
+
}, _SinchAdapter_ended = function _SinchAdapter_ended({ id: callId, details: { endCause, error } }) {
|
|
246
|
+
const { CallEndCause, ErrorType } = __classPrivateFieldGet(this, _SinchAdapter_sinch, "f");
|
|
247
|
+
switch (endCause) {
|
|
248
|
+
case CallEndCause.Denied:
|
|
249
|
+
return { callId, type: 'ended', reason: 'busy' };
|
|
250
|
+
case CallEndCause.NoAnswer:
|
|
251
|
+
case CallEndCause.Timeout:
|
|
252
|
+
return { callId, type: 'ended', reason: 'noAnswer' };
|
|
253
|
+
case CallEndCause.Inactive:
|
|
254
|
+
return {
|
|
255
|
+
callId,
|
|
256
|
+
type: 'ended',
|
|
257
|
+
reason: 'failed',
|
|
258
|
+
error: new NetworkError({ providerDetail: error }),
|
|
259
|
+
};
|
|
260
|
+
case CallEndCause.Failure:
|
|
261
|
+
if (!error)
|
|
262
|
+
return { callId, type: 'ended', reason: 'failed' };
|
|
263
|
+
return {
|
|
264
|
+
callId,
|
|
265
|
+
type: 'ended',
|
|
266
|
+
reason: 'failed',
|
|
267
|
+
error: error.domain === ErrorType.Network ?
|
|
268
|
+
new NetworkError({ providerDetail: error })
|
|
269
|
+
: (callSetupError(error) ?? providerError(error)),
|
|
270
|
+
};
|
|
271
|
+
default:
|
|
272
|
+
return { callId, type: 'ended', reason: 'completed' };
|
|
273
|
+
}
|
|
274
|
+
}, _SinchAdapter_warning = function _SinchAdapter_warning(callId, { name, type }) {
|
|
275
|
+
const cleared = type === __classPrivateFieldGet(this, _SinchAdapter_sinch, "f").CallQualityWarningEventType.Recover;
|
|
276
|
+
switch (name) {
|
|
277
|
+
case 'missingMediaStream':
|
|
278
|
+
return { callId, type: cleared ? 'reconnected' : 'reconnecting' };
|
|
279
|
+
case 'highInboundJitter':
|
|
280
|
+
return { callId, type: 'qualityWarning', warning: { metric: 'jitter', cleared } };
|
|
281
|
+
case 'highInboundPacketLoss':
|
|
282
|
+
return { callId, type: 'qualityWarning', warning: { metric: 'packetLoss', cleared } };
|
|
283
|
+
case 'highRemoteInboundRtt':
|
|
284
|
+
return { callId, type: 'qualityWarning', warning: { metric: 'rtt', cleared } };
|
|
285
|
+
default:
|
|
286
|
+
return undefined;
|
|
287
|
+
}
|
|
288
|
+
}, _SinchAdapter_emit = function _SinchAdapter_emit(event) {
|
|
289
|
+
for (const listener of __classPrivateFieldGet(this, _SinchAdapter_callEventListeners, "f"))
|
|
290
|
+
listener(event);
|
|
291
|
+
};
|
|
292
|
+
//# sourceMappingURL=sinch.mjs.map
|