sip-connector 16.2.0 → 18.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +128 -45
  2. package/dist/@SipConnector-CFYT0HQB.cjs +1 -0
  3. package/dist/{@SipConnector-D1YBDd7g.js → @SipConnector-UTHCoMXw.js} +880 -800
  4. package/dist/ApiManager/__tests-utils__/helpers.d.ts +2 -4
  5. package/dist/ApiManager/constants.d.ts +1 -2
  6. package/dist/ApiManager/eventNames.d.ts +1 -2
  7. package/dist/ApiManager/index.d.ts +1 -0
  8. package/dist/CallManager/@CallManager.d.ts +7 -6
  9. package/dist/CallManager/AbstractCallStrategy.d.ts +5 -1
  10. package/dist/CallManager/MCUCallStrategy.d.ts +1 -0
  11. package/dist/CallManager/eventNames.d.ts +42 -2
  12. package/dist/CallManager/index.d.ts +2 -1
  13. package/dist/CallManager/types.d.ts +5 -4
  14. package/dist/PresentationManager/types.d.ts +1 -1
  15. package/dist/SipConnector/@SipConnector.d.ts +4 -1
  16. package/dist/SipConnector/eventNames.d.ts +1 -1
  17. package/dist/SipConnectorFacade/index.d.ts +1 -1
  18. package/dist/StatsPeerConnection/index.d.ts +1 -1
  19. package/dist/TransceiverManager/@TransceiverManager.d.ts +70 -0
  20. package/dist/TransceiverManager/index.d.ts +1 -0
  21. package/dist/TransceiverManager/types.d.ts +11 -0
  22. package/dist/VideoSendingBalancer/index.d.ts +1 -1
  23. package/dist/__fixtures__/RTCPeerConnectionMock.d.ts +2 -1
  24. package/dist/__fixtures__/RTCRtpTransceiverMock.d.ts +16 -0
  25. package/dist/__fixtures__/eventNames.d.ts +1 -1
  26. package/dist/doMock.cjs +1 -1
  27. package/dist/doMock.js +166 -143
  28. package/dist/index.cjs +1 -1
  29. package/dist/index.js +83 -83
  30. package/package.json +12 -12
  31. package/dist/@SipConnector-B5FFHZzJ.cjs +0 -1
  32. /package/dist/SipConnectorFacade/{SipConnectorFacade.d.ts → @SipConnectorFacade.d.ts} +0 -0
  33. /package/dist/StatsPeerConnection/{StatsPeerConnection.d.ts → @StatsPeerConnection.d.ts} +0 -0
  34. /package/dist/VideoSendingBalancer/{VideoSendingBalancer.d.ts → @VideoSendingBalancer.d.ts} +0 -0
package/dist/index.js CHANGED
@@ -1,20 +1,20 @@
1
1
  import "events-constructor";
2
- import { E as h, O as K, l as o, p as X, s as Y, a as G } from "./@SipConnector-D1YBDd7g.js";
3
- import { c as ke, b as Le, S as xe, f as Ve, d as Be, e as $e, g as He, h as We } from "./@SipConnector-D1YBDd7g.js";
2
+ import { E as h, l as o, p as K, s as X, a as Y } from "./@SipConnector-UTHCoMXw.js";
3
+ import { c as Ue, b as ke, S as xe, f as Le, d as Ve, e as Be, g as $e, h as He } from "./@SipConnector-UTHCoMXw.js";
4
4
  import { isCanceledError as B } from "@krivega/cancelable-promise";
5
- import { hasCanceledError as q } from "repeated-calls";
6
- import { debounce as z } from "ts-debounce";
7
- import { UAParser as J } from "ua-parser-js";
8
- import { sequentPromises as Q } from "sequent-promises";
9
- const Z = (n) => n instanceof Object && ("originator" in n || "cause" in n), Ae = (n) => {
5
+ import { hasCanceledError as G } from "repeated-calls";
6
+ import { debounce as q } from "ts-debounce";
7
+ import { UAParser as z } from "ua-parser-js";
8
+ import { sequentPromises as J } from "sequent-promises";
9
+ const Q = (n) => n instanceof Object && ("originator" in n || "cause" in n), Ne = (n) => {
10
10
  if (B(n))
11
11
  return !0;
12
- if (!Z(n))
12
+ if (!Q(n))
13
13
  return !1;
14
14
  const { originator: e, cause: t } = n;
15
- return typeof t == "string" ? t === h.REQUEST_TIMEOUT || t === h.REJECTED || e === K.LOCAL && (t === h.CANCELED || t === h.BYE) : !1;
16
- }, ee = () => globalThis.process?.versions?.electron !== void 0, $ = () => {
17
- const n = new J(), { name: e } = n.getBrowser(), t = ee();
15
+ return typeof t == "string" ? t === h.REQUEST_TIMEOUT || t === h.REJECTED || e === "local" && (t === h.CANCELED || t === h.BYE) : !1;
16
+ }, Z = () => globalThis.process?.versions?.electron !== void 0, $ = () => {
17
+ const n = new z(), { name: e } = n.getBrowser(), t = Z();
18
18
  return {
19
19
  isChrome: e === "Chrome" || t
20
20
  };
@@ -24,7 +24,7 @@ const Z = (n) => n instanceof Object && ("originator" in n || "cause" in n), Ae
24
24
  return (t === h.BAD_MEDIA_DESCRIPTION || t === h.NOT_FOUND) && (r = `${n.message.to.uri.user}@${n.message.to.uri.host}`), r;
25
25
  };
26
26
  var H = /* @__PURE__ */ ((n) => (n.CONNECT_SERVER_FAILED = "CONNECT_SERVER_FAILED", n.WRONG_USER_OR_PASSWORD = "WRONG_USER_OR_PASSWORD", n.BAD_MEDIA_ERROR = "BAD_MEDIA_ERROR", n.NOT_FOUND_ERROR = "NOT_FOUND_ERROR", n.WS_CONNECTION_FAILED = "WS_CONNECTION_FAILED", n.CONNECT_SERVER_FAILED_BY_LINK = "CONNECT_SERVER_FAILED_BY_LINK", n))(H || {});
27
- const ne = new Error("Unknown error"), te = (n = ne) => {
27
+ const ee = new Error("Unknown error"), ne = (n = ee) => {
28
28
  const { cause: e, socket: t } = n;
29
29
  let r = "CONNECT_SERVER_FAILED";
30
30
  switch (e) {
@@ -44,7 +44,7 @@ const ne = new Error("Unknown error"), te = (n = ne) => {
44
44
  t !== void 0 && t._ws?.readyState === 3 ? r = "WS_CONNECTION_FAILED" : D(n) !== void 0 && D(n) !== "" && (r = "CONNECT_SERVER_FAILED_BY_LINK");
45
45
  }
46
46
  return r;
47
- }, oe = (n) => {
47
+ }, te = (n) => {
48
48
  let e = "";
49
49
  try {
50
50
  e = JSON.stringify(n);
@@ -52,16 +52,16 @@ const ne = new Error("Unknown error"), te = (n = ne) => {
52
52
  o("failed to stringify message", t);
53
53
  }
54
54
  return e;
55
- }, re = new Error("Unknown error"), se = (n = re) => {
55
+ }, oe = new Error("Unknown error"), re = (n = oe) => {
56
56
  const { code: e, cause: t, message: r } = n, a = D(n), s = { code: "", cause: "", message: "" };
57
- return typeof r == "object" && r !== null ? s.message = oe(r) : r && (s.message = String(r)), a !== void 0 && a !== "" && (s.link = a), e !== void 0 && e !== "" && (s.code = e), t !== void 0 && t !== "" && (s.cause = t), s;
58
- }, ae = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
57
+ return typeof r == "object" && r !== null ? s.message = te(r) : r && (s.message = String(r)), a !== void 0 && a !== "" && (s.link = a), e !== void 0 && e !== "" && (s.code = e), t !== void 0 && t !== "" && (s.cause = t), s;
58
+ }, se = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
59
59
  __proto__: null,
60
60
  EErrorTypes: H,
61
61
  getLinkError: D,
62
- getTypeFromError: te,
63
- getValuesFromError: se
64
- }, Symbol.toStringTag, { value: "Module" })), ce = ({
62
+ getTypeFromError: ne,
63
+ getValuesFromError: re
64
+ }, Symbol.toStringTag, { value: "Module" })), ae = ({
65
65
  sessionId: n,
66
66
  remoteAddress: e,
67
67
  isMutedAudio: t,
@@ -71,38 +71,38 @@ const ne = new Error("Unknown error"), te = (n = ne) => {
71
71
  }) => {
72
72
  const c = [], u = t ? "0" : "1", l = r ? "0" : "1";
73
73
  return c.push(`X-Vinteo-Mic-State: ${u}`, `X-Vinteo-MainCam-State: ${l}`), (a === !1 || a === void 0) && c.push("X-Vinteo-Purgatory-Call: yes"), n !== void 0 && n !== "" && c.push(`X-Vinteo-Session: ${n}`), s === !0 && c.push("X-Vinteo-Presentation-Call: yes"), e !== void 0 && e !== "" && c.push(`X-Vinteo-Remote: ${e}`), c;
74
- }, ie = "[@*!|]", ue = "_", le = (n) => {
74
+ }, ce = "[@*!|]", ie = "_", ue = (n) => {
75
75
  let e = n;
76
- return e = e.replaceAll(new RegExp(ie, "g"), ue), e;
77
- }, de = ({
76
+ return e = e.replaceAll(new RegExp(ce, "g"), ie), e;
77
+ }, le = ({
78
78
  appName: n,
79
79
  appVersion: e,
80
80
  browserName: t,
81
81
  browserVersion: r
82
82
  }) => {
83
- const s = `${le(n)} ${e}`;
83
+ const s = `${ue(n)} ${e}`;
84
84
  return `ChromeNew - ${t === void 0 ? s : `${t} ${r}, ${s}`}`;
85
- }, me = ({
85
+ }, de = ({
86
86
  isUnifiedSdpSemantic: n,
87
87
  appVersion: e,
88
88
  browserName: t,
89
89
  browserVersion: r,
90
90
  appName: a
91
- }) => n ? de({ appVersion: e, browserName: t, browserVersion: r, appName: a }) : "Chrome", W = "purgatory", F = (n) => n === W, Se = (n) => (e) => [...e].map((r) => async () => n(r)), fe = async ({
91
+ }) => n ? le({ appVersion: e, browserName: t, browserVersion: r, appName: a }) : "Chrome", W = "purgatory", F = (n) => n === W, me = (n) => (e) => [...e].map((r) => async () => n(r)), Se = async ({
92
92
  accumulatedKeys: n,
93
93
  sendKey: e,
94
94
  canRunTask: t
95
95
  }) => {
96
- const a = Se(e)(n);
97
- return Q(a, t);
98
- }, Ce = (n) => (t) => (o("onStartMainCam"), n.on("api:admin-start-main-cam", t)), pe = (n) => (t) => (o("onStartMic"), n.on("api:admin-start-mic", t)), he = (n) => (t) => (o("onStopMainCam"), n.on("api:admin-stop-main-cam", t)), Re = (n) => (t) => (o("onStopMic"), n.on("api:admin-stop-mic", t)), ge = ({ sipConnector: n }) => {
96
+ const a = me(e)(n);
97
+ return J(a, t);
98
+ }, fe = (n) => (t) => (o("onStartMainCam"), n.on("api:admin-start-main-cam", t)), Ce = (n) => (t) => (o("onStartMic"), n.on("api:admin-start-mic", t)), pe = (n) => (t) => (o("onStopMainCam"), n.on("api:admin-stop-main-cam", t)), he = (n) => (t) => (o("onStopMic"), n.on("api:admin-stop-mic", t)), Re = ({ sipConnector: n }) => {
99
99
  const e = (m, f) => ({ isSyncForced: S }) => {
100
100
  if (S === !0) {
101
101
  m();
102
102
  return;
103
103
  }
104
104
  f();
105
- }, t = Ce(n), r = he(n), a = pe(n), s = Re(n);
105
+ }, t = fe(n), r = pe(n), a = Ce(n), s = he(n);
106
106
  let c, u, l, p;
107
107
  const R = ({
108
108
  onStartMainCamForced: m,
@@ -112,13 +112,13 @@ const ne = new Error("Unknown error"), te = (n = ne) => {
112
112
  onStartMicForced: b,
113
113
  onStartMicNotForced: v,
114
114
  onStopMicForced: _,
115
- onStopMicNotForced: O
115
+ onStopMicNotForced: T
116
116
  }) => {
117
- const T = e(
117
+ const y = e(
118
118
  m,
119
119
  f
120
120
  );
121
- c = t(T);
121
+ c = t(y);
122
122
  const M = e(
123
123
  S,
124
124
  g
@@ -126,7 +126,7 @@ const ne = new Error("Unknown error"), te = (n = ne) => {
126
126
  u = r(M);
127
127
  const P = e(b, v);
128
128
  l = a(P);
129
- const C = e(_, O);
129
+ const C = e(_, T);
130
130
  p = s(C);
131
131
  }, d = () => {
132
132
  c?.(), u?.(), l?.(), p?.();
@@ -139,30 +139,30 @@ const ne = new Error("Unknown error"), te = (n = ne) => {
139
139
  d();
140
140
  }
141
141
  };
142
- }, De = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
142
+ }, Ae = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
143
143
  __proto__: null,
144
144
  PURGATORY_CONFERENCE_NUMBER: W,
145
- createSyncMediaState: ge,
145
+ createSyncMediaState: Re,
146
146
  createUaParser: $,
147
- error: ae,
148
- getExtraHeaders: ce,
149
- getUserAgent: me,
147
+ error: se,
148
+ getExtraHeaders: ae,
149
+ getUserAgent: de,
150
150
  hasPurgatory: F,
151
- prepareMediaStream: X,
152
- sendDtmfAccumulated: fe,
153
- setEncodingsToSender: Y,
154
- setParametersToSender: G
155
- }, Symbol.toStringTag, { value: "Module" })), Fe = () => $().isChrome, k = (n) => {
156
- if (!B(n) && !q(n))
151
+ prepareMediaStream: K,
152
+ sendDtmfAccumulated: Se,
153
+ setEncodingsToSender: X,
154
+ setParametersToSender: Y
155
+ }, Symbol.toStringTag, { value: "Module" })), De = () => $().isChrome, k = (n) => {
156
+ if (!B(n) && !G(n))
157
157
  throw n;
158
158
  return { isSuccessful: !1 };
159
- }, Ee = ({ kind: n, readyState: e }) => n === "video" && e === "live", L = (n, e, { onEnterPurgatory: t, onEnterConference: r }) => {
159
+ }, ge = ({ kind: n, readyState: e }) => n === "video" && e === "live", x = (n, e, { onEnterPurgatory: t, onEnterConference: r }) => {
160
160
  F(n) ? t && t() : r && r({ isSuccessProgressCall: e });
161
- }, x = (n, e) => {
161
+ }, L = (n, e) => {
162
162
  n(), e && e();
163
163
  }, V = (n, e, t) => {
164
164
  throw n && n(), e(), t;
165
- }, be = /* @__PURE__ */ new Set([
165
+ }, Ee = /* @__PURE__ */ new Set([
166
166
  "on",
167
167
  "once",
168
168
  "onceRace",
@@ -179,7 +179,7 @@ const ne = new Error("Unknown error"), te = (n = ne) => {
179
179
  "isConfigured",
180
180
  "isRegistered"
181
181
  ]);
182
- class we {
182
+ class Fe {
183
183
  // @ts-expect-error: proxy method
184
184
  on;
185
185
  // @ts-expect-error: proxy method
@@ -214,7 +214,7 @@ class we {
214
214
  constructor(e) {
215
215
  return this.sipConnector = e, new Proxy(this, {
216
216
  get: (t, r, a) => {
217
- if (typeof r == "string" && be.has(r) && r in this.sipConnector) {
217
+ if (typeof r == "string" && Ee.has(r) && r in this.sipConnector) {
218
218
  const c = Reflect.get(this.sipConnector, r, this.sipConnector);
219
219
  return typeof c == "function" ? c.bind(this.sipConnector) : c;
220
220
  }
@@ -259,7 +259,7 @@ class we {
259
259
  offerToReceiveVideo: R,
260
260
  directionVideo: d,
261
261
  directionAudio: A,
262
- setRemoteStreams: y,
262
+ setRemoteStreams: O,
263
263
  onBeforeProgressCall: m,
264
264
  onSuccessProgressCall: f,
265
265
  onEnterPurgatory: S,
@@ -267,12 +267,12 @@ class we {
267
267
  onFailProgressCall: b,
268
268
  onFinishProgressCall: v,
269
269
  onEndedCall: _,
270
- onAddedTransceiver: O
271
- } = e, T = this.resolveHandleReadyRemoteStreamsDebounced({
272
- onReadyRemoteStreams: y
270
+ onAddedTransceiver: T
271
+ } = e, y = this.resolveHandleReadyRemoteStreamsDebounced({
272
+ onReadyRemoteStreams: O
273
273
  }), M = this.resolveHandleReadyRemoteStreams({
274
274
  onReadyRemoteStreams: () => {
275
- T().catch(o);
275
+ y().catch(o);
276
276
  }
277
277
  });
278
278
  o("callToServer", e);
@@ -286,19 +286,19 @@ class we {
286
286
  directionVideo: d,
287
287
  directionAudio: A,
288
288
  degradationPreference: u,
289
- onAddedTransceiver: O,
289
+ onAddedTransceiver: T,
290
290
  sendEncodings: l,
291
291
  number: t,
292
292
  ontrack: M
293
293
  }));
294
294
  let C = !1, E;
295
295
  const N = (o("subscribeEnterConference: onEnterConference", g), this.sipConnector.on("api:enterRoom", ({ room: i }) => {
296
- o("enterRoom", { _room: i, isSuccessProgressCall: C }), E = i, (S ?? g) && L(E, C, {
296
+ o("enterRoom", { _room: i, isSuccessProgressCall: C }), E = i, (S ?? g) && x(E, C, {
297
297
  onEnterPurgatory: S,
298
298
  onEnterConference: g
299
299
  });
300
- })), w = (i) => (o("onSuccess"), C = !0, T().catch(o), f && f({ isPurgatory: F(E) }), this.sipConnector.onceRace(["call:ended", "call:failed"], () => {
301
- x(N, _);
300
+ })), w = (i) => (o("onSuccess"), C = !0, y().catch(o), f && f({ isPurgatory: F(E) }), this.sipConnector.onceRace(["call:ended", "call:failed"], () => {
301
+ L(N, _);
302
302
  }), i), I = (i) => (o("onFail"), V(b, N, i)), U = () => {
303
303
  o("onFinish"), v && v();
304
304
  };
@@ -318,7 +318,7 @@ class we {
318
318
  directionVideo: R,
319
319
  directionAudio: d,
320
320
  setRemoteStreams: A,
321
- onBeforeProgressCall: y,
321
+ onBeforeProgressCall: O,
322
322
  onSuccessProgressCall: m,
323
323
  onEnterPurgatory: f,
324
324
  onEnterConference: S,
@@ -326,11 +326,11 @@ class we {
326
326
  onFinishProgressCall: b,
327
327
  onEndedCall: v,
328
328
  onAddedTransceiver: _
329
- } = e, O = this.resolveHandleReadyRemoteStreamsDebounced({
329
+ } = e, T = this.resolveHandleReadyRemoteStreamsDebounced({
330
330
  onReadyRemoteStreams: A
331
- }), T = this.resolveHandleReadyRemoteStreams({
331
+ }), y = this.resolveHandleReadyRemoteStreams({
332
332
  onReadyRemoteStreams: () => {
333
- O().catch(o);
333
+ T().catch(o);
334
334
  }
335
335
  });
336
336
  o("answerToIncomingCall", e);
@@ -346,25 +346,25 @@ class we {
346
346
  degradationPreference: c,
347
347
  onAddedTransceiver: _,
348
348
  sendEncodings: u,
349
- ontrack: T
349
+ ontrack: y
350
350
  }), P = () => {
351
351
  const { remoteCallerData: i } = this.sipConnector;
352
352
  return i.incomingNumber;
353
353
  };
354
354
  let C = !1, E;
355
355
  const N = (o("subscribeEnterConference: onEnterConference", S), this.sipConnector.on("api:enterRoom", (i) => {
356
- o("enterRoom", { _room: i, isSuccessProgressCall: C }), E = i, (f ?? S) && L(E, C, {
356
+ o("enterRoom", { _room: i, isSuccessProgressCall: C }), E = i, (f ?? S) && x(E, C, {
357
357
  onEnterPurgatory: f,
358
358
  onEnterConference: S
359
359
  });
360
- })), w = (i) => (o("onSuccess"), C = !0, O().catch(o), m && m({ isPurgatory: F(E) }), this.sipConnector.onceRace(["call:ended", "call:failed"], () => {
361
- x(N, v);
360
+ })), w = (i) => (o("onSuccess"), C = !0, T().catch(o), m && m({ isPurgatory: F(E) }), this.sipConnector.onceRace(["call:ended", "call:failed"], () => {
361
+ L(N, v);
362
362
  }), i), I = (i) => (o("onFail"), V(g, N, i)), U = () => {
363
363
  o("onFinish"), b && b();
364
364
  };
365
- if (o("onBeforeProgressCall"), y) {
365
+ if (o("onBeforeProgressCall"), O) {
366
366
  const i = P();
367
- y(i);
367
+ O(i);
368
368
  }
369
369
  return M().then(w).catch((i) => I(i)).finally(U);
370
370
  };
@@ -441,7 +441,7 @@ class we {
441
441
  };
442
442
  resolveHandleReadyRemoteStreamsDebounced = ({
443
443
  onReadyRemoteStreams: e
444
- }) => z(() => {
444
+ }) => q(() => {
445
445
  const t = this.sipConnector.getRemoteStreams();
446
446
  o("remoteStreams", t), t && e(t);
447
447
  }, 200);
@@ -449,7 +449,7 @@ class we {
449
449
  resolveHandleReadyRemoteStreams = ({
450
450
  onReadyRemoteStreams: e
451
451
  }) => ({ track: t }) => {
452
- Ee(t) && e();
452
+ ge(t) && e();
453
453
  };
454
454
  getRemoteStreams = () => (o("getRemoteStreams"), this.sipConnector.getRemoteStreams());
455
455
  onUseLicense = (e) => (o("onUseLicense"), this.sipConnector.on("api:useLicense", e));
@@ -461,20 +461,20 @@ class we {
461
461
  o("offStats"), this.sipConnector.off("stats:collected", e);
462
462
  };
463
463
  }
464
- var ve = /* @__PURE__ */ ((n) => (n.VP8 = "video/VP8", n.VP9 = "video/VP9", n.H264 = "video/H264", n.AV1 = "video/AV1", n.rtx = "video/rtx", n.red = "video/red", n.flexfec03 = "video/flexfec-03", n))(ve || {});
464
+ var be = /* @__PURE__ */ ((n) => (n.VP8 = "video/VP8", n.VP9 = "video/VP9", n.H264 = "video/H264", n.AV1 = "video/AV1", n.rtx = "video/rtx", n.red = "video/red", n.flexfec03 = "video/flexfec-03", n))(be || {});
465
465
  export {
466
466
  h as ECallCause,
467
- ve as EMimeTypesVideoCodecs,
468
- ke as EStatsTypes,
469
- Le as EUseLicense,
467
+ be as EMimeTypesVideoCodecs,
468
+ Ue as EStatsTypes,
469
+ ke as EUseLicense,
470
470
  xe as SipConnector,
471
- we as SipConnectorFacade,
472
- Ve as StatsPeerConnection,
473
- Be as disableDebug,
474
- $e as enableDebug,
475
- He as getCodecFromSender,
476
- Fe as hasAvailableStats,
477
- Ae as hasCanceledCallError,
478
- We as hasCanceledStartPresentationError,
479
- De as tools
471
+ Fe as SipConnectorFacade,
472
+ Le as StatsPeerConnection,
473
+ Ve as disableDebug,
474
+ Be as enableDebug,
475
+ $e as getCodecFromSender,
476
+ De as hasAvailableStats,
477
+ Ne as hasCanceledCallError,
478
+ He as hasCanceledStartPresentationError,
479
+ Ae as tools
480
480
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sip-connector",
3
- "version": "16.2.0",
3
+ "version": "18.0.0",
4
4
  "description": "Module for connect to Vinteo server",
5
5
  "keywords": [
6
6
  "webrtc",
@@ -57,24 +57,24 @@
57
57
  },
58
58
  "dependencies": {
59
59
  "@krivega/cancelable-promise": "^1.1.4",
60
- "@krivega/jssip": "^5.3.0",
60
+ "@krivega/jssip": "^5.4.1",
61
61
  "@krivega/timeout-requester": "^1.0.0",
62
- "debug": "^4.4.1",
62
+ "debug": "^4.4.3",
63
63
  "events-constructor": "^2.0.0",
64
64
  "repeated-calls": "^2.4.0",
65
65
  "sequent-promises": "^2.0.1",
66
- "stack-promises": "^2.0.3",
66
+ "stack-promises": "^2.0.4",
67
67
  "ts-debounce": "^4.0.0",
68
68
  "ua-parser-js": "^2.0.5",
69
69
  "webrtc-mock": "^1.2.1",
70
- "xstate": "^5.21.0"
70
+ "xstate": "^5.22.0"
71
71
  },
72
72
  "devDependencies": {
73
73
  "@babel/preset-typescript": "^7.27.1",
74
74
  "@commitlint/cli": "^19.8.1",
75
75
  "@commitlint/config-conventional": "^19.8.1",
76
- "@eslint/compat": "^1.3.2",
77
- "@krivega/eslint-config": "^1.0.3",
76
+ "@eslint/compat": "^1.4.0",
77
+ "@krivega/eslint-config": "^1.0.5",
78
78
  "@types/debug": "^4.1.12",
79
79
  "@types/dom-mediacapture-transform": "^0.1.11",
80
80
  "@types/jest": "^30.0.0",
@@ -84,14 +84,14 @@
84
84
  "jest-environment-jsdom": "^30.1.2",
85
85
  "jest-extended": "^6.0.0",
86
86
  "jest-junit": "^16.0.0",
87
- "lint-staged": "^16.1.6",
87
+ "lint-staged": "^16.2.0",
88
88
  "prettier": "^3.6.2",
89
89
  "standard-version": "^9.5.0",
90
- "ts-jest": "^29.4.1",
90
+ "ts-jest": "^29.4.4",
91
91
  "ts-node": "^10.9.2",
92
92
  "tsc-files": "^1.1.4",
93
93
  "typescript": "^5.9.2",
94
- "vite": "^7.1.5",
94
+ "vite": "^7.1.7",
95
95
  "vite-plugin-dts": "^4.5.4",
96
96
  "vite-tsconfig-paths": "^5.1.4"
97
97
  },
@@ -103,11 +103,11 @@
103
103
  "events-constructor": "^2.0.0",
104
104
  "repeated-calls": "^2.4.0",
105
105
  "sequent-promises": "^2.0.1",
106
- "stack-promises": "^2.0.3",
106
+ "stack-promises": "^2.0.4",
107
107
  "ts-debounce": "^4.0.0",
108
108
  "ua-parser-js": "^2.0.5",
109
109
  "webrtc-mock": "^1.2.1",
110
- "xstate": "^5.21.0"
110
+ "xstate": "^5.22.0"
111
111
  },
112
112
  "packageManager": "yarn@1.22.22"
113
113
  }
@@ -1 +0,0 @@
1
- "use strict";const v=require("events-constructor"),me=require("@krivega/cancelable-promise"),q=require("debug"),G=require("repeated-calls"),ee=require("xstate"),te=require("stack-promises"),ne=require("@krivega/timeout-requester");require("ua-parser-js");require("sequent-promises");var N=(n=>(n.PEER_CONNECTION="peerconnection",n.CONNECTING="connecting",n.SENDING="sending",n.PROGRESS="progress",n.ACCEPTED="accepted",n.CONFIRMED="confirmed",n.ENDED="ended",n.FAILED="failed",n.NEW_DTMF="newDTMF",n.NEW_INFO="newInfo",n.HOLD="hold",n.UNHOLD="unhold",n.MUTED="muted",n.UNMUTED="unmuted",n.REINVITE="reinvite",n.UPDATE="update",n.REFER="refer",n.REPLACES="replaces",n.SDP="sdp",n.ICE_CANDIDATE="icecandidate",n.GET_USER_MEDIA_FAILED="getusermediafailed",n.PEER_CONNECTION_CREATE_OFFER_FAILED="peerconnection:createofferfailed",n.PEER_CONNECTION_CREATE_ANSWER_FAILED="peerconnection:createanswerfailed",n.PEER_CONNECTION_SET_LOCAL_DESCRIPTION_FAILED="peerconnection:setlocaldescriptionfailed",n.PEER_CONNECTION_SET_REMOTE_DESCRIPTION_FAILED="peerconnection:setremotedescriptionfailed",n.START_PRESENTATION="presentation:start",n.STARTED_PRESENTATION="presentation:started",n.END_PRESENTATION="presentation:end",n.ENDED_PRESENTATION="presentation:ended",n.FAILED_PRESENTATION="presentation:failed",n.PEER_CONNECTION_CONFIRMED="peerconnection:confirmed",n.PEER_CONNECTION_ONTRACK="peerconnection:ontrack",n.ENDED_FROM_SERVER="ended:fromserver",n))(N||{}),B=(n=>(n.LOCAL="local",n.REMOTE="remote",n.SYSTEM="system",n))(B||{});const se=["peerconnection","connecting","sending","progress","accepted","confirmed","ended","failed","newInfo","newDTMF","presentation:start","presentation:started","presentation:end","presentation:ended","presentation:failed","reinvite","update","refer","replaces","sdp","icecandidate","getusermediafailed","peerconnection:createofferfailed","peerconnection:createanswerfailed","peerconnection:setlocaldescriptionfailed","peerconnection:setremotedescriptionfailed"],pe=["peerconnection:confirmed","peerconnection:ontrack","ended:fromserver"],re=[...se,...pe],Pe=(n,e)=>{n.getVideoTracks().forEach(s=>{"contentHint"in s&&s.contentHint!==e&&(s.contentHint=e)})},L=(n,{directionVideo:e,directionAudio:t,contentHint:s}={})=>{if(!n||e==="recvonly"&&t==="recvonly")return;const r=t==="recvonly"?[]:n.getAudioTracks(),i=e==="recvonly"?[]:n.getVideoTracks(),a=[...r,...i],o=new MediaStream(a);return o.getTracks=()=>[...o.getAudioTracks(),...o.getVideoTracks()],s&&s!=="none"&&Pe(o,s),o};function Oe(n){return e=>`sip:${e}@${n}`}const fe=(n,e)=>()=>Math.floor(Math.random()*(e-n))+n,ie=n=>n.trim().replaceAll(" ","_"),ve=fe(1e5,99999999),De=n=>n.some(t=>{const{kind:s}=t;return s==="video"});class ye{isPendingCall=!1;isPendingAnswer=!1;rtcSession;remoteStreams={};events;callConfiguration={};constructor(e){this.events=e}}var Q=(n=>(n.BYE="Terminated",n.WEBRTC_ERROR="WebRTC Error",n.CANCELED="Canceled",n.REQUEST_TIMEOUT="Request Timeout",n.REJECTED="Rejected",n.REDIRECTED="Redirected",n.UNAVAILABLE="Unavailable",n.NOT_FOUND="Not Found",n.ADDRESS_INCOMPLETE="Address Incomplete",n.INCOMPATIBLE_SDP="Incompatible SDP",n.BAD_MEDIA_DESCRIPTION="Bad Media Description",n))(Q||{});class be{remoteStreams={};reset(){this.remoteStreams={}}generateStream(e,t){const{id:s}=e,r=this.remoteStreams[s]??new MediaStream;return t&&r.addTrack(t),r.addTrack(e),this.remoteStreams[s]=r,r}generateAudioStream(e){const{id:t}=e,s=this.remoteStreams[t]??new MediaStream;return s.addTrack(e),this.remoteStreams[t]=s,s}generateStreams(e){const t=[];return e.forEach((s,r)=>{if(s.kind==="audio")return;const i=s,a=e[r-1];let o;a?.kind==="audio"&&(o=a);const c=this.generateStream(i,o);t.push(c)}),t}generateAudioStreams(e){return e.map(t=>this.generateAudioStream(t))}}class Ue extends ye{remoteStreamsManager=new be;disposers=new Set;constructor(e){super(e),e.on(N.FAILED,this.handleEnded),e.on(N.ENDED,this.handleEnded)}get requested(){return this.isPendingCall||this.isPendingAnswer}get connection(){return this.rtcSession?.connection}get isCallActive(){return this.rtcSession?.isEstablished()===!0}get establishedRTCSession(){return this.rtcSession?.isEstablished()===!0?this.rtcSession:void 0}startCall=async(e,t,{number:s,mediaStream:r,extraHeaders:i=[],ontrack:a,iceServers:o,directionVideo:c,directionAudio:d,contentHint:u,offerToReceiveAudio:T=!0,offerToReceiveVideo:g=!0,degradationPreference:C,sendEncodings:m,onAddedTransceiver:I})=>(this.isPendingCall=!0,new Promise((R,y)=>{this.callConfiguration.number=s,this.callConfiguration.answer=!1,this.handleCall({ontrack:a}).then(R).catch(b=>{y(b)}),this.rtcSession=e.call(t(s),{extraHeaders:i,mediaStream:L(r,{directionVideo:c,directionAudio:d,contentHint:u}),eventHandlers:this.events.triggers,directionVideo:c,directionAudio:d,pcConfig:{iceServers:o},rtcOfferConstraints:{offerToReceiveAudio:T,offerToReceiveVideo:g},degradationPreference:C,sendEncodings:m,onAddedTransceiver:I})}).finally(()=>{this.isPendingCall=!1}));async endCall(){const{rtcSession:e}=this;if(e&&!e.isEnded())return e.terminateAsync({cause:Q.CANCELED}).finally(()=>{this.reset()});this.reset()}answerToIncomingCall=async(e,{mediaStream:t,ontrack:s,extraHeaders:r=[],iceServers:i,directionVideo:a,directionAudio:o,offerToReceiveAudio:c,offerToReceiveVideo:d,contentHint:u,degradationPreference:T,sendEncodings:g,onAddedTransceiver:C})=>(this.isPendingAnswer=!0,new Promise((m,I)=>{try{const R=e();this.rtcSession=R,this.subscribeToSessionEvents(R),this.callConfiguration.answer=!0,this.callConfiguration.number=R.remote_identity.uri.user,this.handleCall({ontrack:s}).then(m).catch(b=>{I(b)});const y=L(t,{directionVideo:a,directionAudio:o,contentHint:u});R.answer({extraHeaders:r,directionVideo:a,directionAudio:o,mediaStream:y,pcConfig:{iceServers:i},rtcOfferConstraints:{offerToReceiveAudio:c,offerToReceiveVideo:d},degradationPreference:T,sendEncodings:g,onAddedTransceiver:C})}catch(R){I(R)}}).finally(()=>{this.isPendingAnswer=!1}));getEstablishedRTCSession(){return this.rtcSession?.isEstablished()===!0?this.rtcSession:void 0}getCallConfiguration(){return{...this.callConfiguration}}getRemoteStreams(){if(!this.connection)return;const t=this.connection.getReceivers().map(({track:s})=>s);return De(t)?this.remoteStreamsManager.generateStreams(t):this.remoteStreamsManager.generateAudioStreams(t)}async replaceMediaStream(e,t){if(!this.rtcSession)throw new Error("No rtcSession established");const{contentHint:s}=t??{},r=L(e,{contentHint:s});if(r===void 0)throw new Error("No preparedMediaStream");return this.rtcSession.replaceMediaStream(r,t)}async restartIce(e){if(!this.rtcSession)throw new Error("No rtcSession established");return this.rtcSession.restartIce(e)}handleCall=async({ontrack:e})=>new Promise((t,s)=>{const r=()=>{this.events.on(N.PEER_CONNECTION,u),this.events.on(N.CONFIRMED,T)},i=()=>{this.events.off(N.PEER_CONNECTION,u),this.events.off(N.CONFIRMED,T)},a=()=>{this.events.on(N.FAILED,c),this.events.on(N.ENDED,c)},o=()=>{this.events.off(N.FAILED,c),this.events.off(N.ENDED,c)},c=g=>{i(),o(),s(g)};let d;const u=({peerconnection:g})=>{d=g;const C=m=>{this.events.trigger(N.PEER_CONNECTION_ONTRACK,g),e&&e(m)};g.addEventListener("track",C),this.disposers.add(()=>{g.removeEventListener("track",C)})},T=()=>{d!==void 0&&this.events.trigger(N.PEER_CONNECTION_CONFIRMED,d),i(),o(),t(d)};r(),a()});subscribeToSessionEvents(e){this.events.eachTriggers((t,s)=>{const r=se.find(i=>i===s);r&&(e.on(r,t),this.disposers.add(()=>{e.off(r,t)}))})}unsubscribeFromSessionEvents(){this.disposers.forEach(e=>{e()}),this.disposers.clear()}handleEnded=e=>{const{originator:t}=e;t===B.REMOTE&&this.events.trigger(N.ENDED_FROM_SERVER,e),this.reset()};reset=()=>{delete this.rtcSession,this.remoteStreamsManager.reset(),this.unsubscribeFromSessionEvents(),this.callConfiguration.number=void 0,this.callConfiguration.answer=!1}}class we{events;strategy;constructor(e){this.events=new v.Events(re),this.strategy=e??new Ue(this.events)}get requested(){return this.strategy.requested}get connection(){return this.strategy.connection}get establishedRTCSession(){return this.strategy.establishedRTCSession}get isCallActive(){return this.strategy.isCallActive}on(e,t){return this.events.on(e,t)}once(e,t){return this.events.once(e,t)}onceRace(e,t){return this.events.onceRace(e,t)}async wait(e){return this.events.wait(e)}off(e,t){this.events.off(e,t)}setStrategy(e){this.strategy=e}startCall=async(...e)=>this.strategy.startCall(...e);endCall=async()=>this.strategy.endCall();answerToIncomingCall=async(...e)=>this.strategy.answerToIncomingCall(...e);getEstablishedRTCSession=()=>this.strategy.getEstablishedRTCSession();getCallConfiguration=()=>this.strategy.getCallConfiguration();getRemoteStreams=()=>this.strategy.getRemoteStreams();replaceMediaStream=async(...e)=>this.strategy.replaceMediaStream(...e);restartIce=async e=>this.strategy.restartIce(e)}const Y="sip-connector",E=q(Y),Le=()=>{q.enable(Y)},Be=()=>{q.enable(`-${Y}`)},ke="Error decline with 603",Fe=1006,$e=n=>typeof n=="object"&&n!==null&&"code"in n&&n.code===Fe,Ve=n=>n.message===ke;var h=(n=>(n.CONTENT_TYPE="content-type",n.CONTENT_ENTER_ROOM="x-webrtc-enter-room",n.CONTENT_USE_LICENSE="X-WEBRTC-USE-LICENSE",n.PARTICIPANT_NAME="X-WEBRTC-PARTICIPANT-NAME",n.INPUT_CHANNELS="X-WEBRTC-INPUT-CHANNELS",n.OUTPUT_CHANNELS="X-WEBRTC-OUTPUT-CHANNELS",n.MAIN_CAM="X-WEBRTC-MAINCAM",n.MIC="X-WEBRTC-MIC",n.MEDIA_SYNC="X-WEBRTC-SYNC",n.MAIN_CAM_RESOLUTION="X-WEBRTC-MAINCAM-RESOLUTION",n.MEDIA_STATE="X-WEBRTC-MEDIA-STATE",n.MEDIA_TYPE="X-Vinteo-Media-Type",n.MAIN_CAM_STATE="X-Vinteo-MainCam-State",n.MIC_STATE="X-Vinteo-Mic-State",n.CONTENT_PARTICIPANT_STATE="X-WEBRTC-PARTSTATE",n.NOTIFY="X-VINTEO-NOTIFY",n.CONTENT_ENABLE_MEDIA_DEVICE="X-WEBRTC-REQUEST-ENABLE-MEDIA-DEVICE",n.CONTENT_SHARE_STATE="x-webrtc-share-state",n.MUST_STOP_PRESENTATION_P2P="x-webrtc-share-state: YOUMUSTSTOPSENDCONTENT",n.START_PRESENTATION_P2P="x-webrtc-share-state: YOUCANRECEIVECONTENT",n.STOP_PRESENTATION_P2P="x-webrtc-share-state: CONTENTEND",n.STOP_PRESENTATION="x-webrtc-share-state: STOPPRESENTATION",n.START_PRESENTATION="x-webrtc-share-state: LETMESTARTPRESENTATION",n.ENABLE_MAIN_CAM="X-WEBRTC-REQUEST-ENABLE-MEDIA-DEVICE: LETMESTARTMAINCAM",n.AVAILABLE_INCOMING_BITRATE="X-WEBRTC-AVAILABLE-INCOMING-BITRATE",n.AUDIO_TRACK_COUNT="X-WEBRTC-AUDIO-TRACK-COUNT",n.VIDEO_TRACK_COUNT="X-WEBRTC-VIDEO-TRACK-COUNT",n.TRACKS_DIRECTION="X-WEBRTC-TRACKS-DIRECTION",n))(h||{}),F=(n=>(n.AVAILABLE_SECOND_REMOTE_STREAM="YOUCANRECEIVECONTENT",n.NOT_AVAILABLE_SECOND_REMOTE_STREAM="CONTENTEND",n.MUST_STOP_PRESENTATION="YOUMUSTSTOPSENDCONTENT",n))(F||{}),$=(n=>(n.SPECTATOR="SPECTATOR",n.PARTICIPANT="PARTICIPANT",n.SPECTATOR_OVER_SFU="SPECTATOROVERSFU",n))($||{}),O=(n=>(n.ENTER_ROOM="application/vinteo.webrtc.roomname",n.MIC="application/vinteo.webrtc.mic",n.USE_LICENSE="application/vinteo.webrtc.uselic",n.PARTICIPANT_STATE="application/vinteo.webrtc.partstate",n.NOTIFY="application/vinteo.webrtc.notify",n.SHARE_STATE="application/vinteo.webrtc.sharedesktop",n.MAIN_CAM="application/vinteo.webrtc.maincam",n.RESTART="application/vinteo.webrtc.restart",n))(O||{}),M=(n=>(n.CHANNELS="application/vinteo.webrtc.channels",n.MEDIA_STATE="application/vinteo.webrtc.mediastate",n.REFUSAL="application/vinteo.webrtc.refusal",n.SHARE_STATE="application/vinteo.webrtc.sharedesktop",n.MAIN_CAM="application/vinteo.webrtc.maincam",n.STATS="application/vinteo.webrtc.stats",n))(M||{}),P=(n=>(n.PAUSE_MAIN_CAM="PAUSEMAINCAM",n.RESUME_MAIN_CAM="RESUMEMAINCAM",n.MAX_MAIN_CAM_RESOLUTION="MAXMAINCAMRESOLUTION",n.ADMIN_STOP_MAIN_CAM="ADMINSTOPMAINCAM",n.ADMIN_START_MAIN_CAM="ADMINSTARTMAINCAM",n))(P||{}),W=(n=>(n.ADMIN_STOP_MIC="ADMINSTOPMIC",n.ADMIN_START_MIC="ADMINSTARTMIC",n))(W||{}),H=(n=>(n.ADMIN_SYNC_FORCED="1",n.ADMIN_SYNC_NOT_FORCED="0",n))(H||{}),ae=(n=>(n.AUDIO="AUDIO",n.VIDEO="VIDEO",n.AUDIOPLUSPRESENTATION="AUDIOPLUSPRESENTATION",n))(ae||{}),l=(n=>(n.CHANNELS_NOTIFY="channels:notify",n.PARTICIPANT_ADDED_TO_LIST_MODERATORS="participant:added-to-list-moderators",n.PARTICIPANT_REMOVED_FROM_LIST_MODERATORS="participant:removed-from-list-moderators",n.PARTICIPANT_MOVE_REQUEST_TO_STREAM="participant:move-request-to-stream",n.PARTICIPANT_MOVE_REQUEST_TO_SPECTATORS="participant:move-request-to-spectators",n.PARTICIPANT_MOVE_REQUEST_TO_PARTICIPANTS="participant:move-request-to-participants",n.PARTICIPANT_MOVE_REQUEST_TO_SPECTATORS_OVER_SFU="participant:move-request-to-spectators-over-sfu",n.PARTICIPATION_ACCEPTING_WORD_REQUEST="participation:accepting-word-request",n.PARTICIPATION_CANCELLING_WORD_REQUEST="participation:cancelling-word-request",n.WEBCAST_STARTED="webcast:started",n.WEBCAST_STOPPED="webcast:stopped",n.ACCOUNT_CHANGED="account:changed",n.ACCOUNT_DELETED="account:deleted",n.CONFERENCE_PARTICIPANT_TOKEN_ISSUED="conference:participant-token-issued",n.CHANNELS="channels",n.ENTER_ROOM="enterRoom",n.SHARE_STATE="shareState",n.MAIN_CAM_CONTROL="main-cam-control",n.USE_LICENSE="useLicense",n.ADMIN_START_MAIN_CAM="admin-start-main-cam",n.ADMIN_STOP_MAIN_CAM="admin-stop-main-cam",n.ADMIN_START_MIC="admin-start-mic",n.ADMIN_STOP_MIC="admin-stop-mic",n.ADMIN_FORCE_SYNC_MEDIA_STATE="admin-force-sync-media-state",n.AVAILABLE_SECOND_REMOTE_STREAM="availableSecondRemoteStream",n.NOT_AVAILABLE_SECOND_REMOTE_STREAM="notAvailableSecondRemoteStream",n.MUST_STOP_PRESENTATION="mustStopPresentation",n.NEW_DTMF="newDTMF",n.RESTART="restart",n))(l||{});const oe=["participation:accepting-word-request","participation:cancelling-word-request","participant:move-request-to-stream","channels:notify","conference:participant-token-issued","account:changed","account:deleted","webcast:started","webcast:stopped","participant:added-to-list-moderators","participant:removed-from-list-moderators","participant:move-request-to-spectators","participant:move-request-to-participants","participant:move-request-to-spectators-over-sfu","channels","enterRoom","shareState","main-cam-control","useLicense","admin-start-main-cam","admin-stop-main-cam","admin-start-mic","admin-stop-mic","admin-force-sync-media-state","availableSecondRemoteStream","notAvailableSecondRemoteStream","mustStopPresentation","newDTMF","restart"];var _=(n=>(n.CHANNELS="channels",n.WEBCAST_STARTED="WebcastStarted",n.WEBCAST_STOPPED="WebcastStopped",n.ACCOUNT_CHANGED="accountChanged",n.ACCOUNT_DELETED="accountDeleted",n.ADDED_TO_LIST_MODERATORS="addedToListModerators",n.REMOVED_FROM_LIST_MODERATORS="removedFromListModerators",n.ACCEPTING_WORD_REQUEST="ParticipationRequestAccepted",n.CANCELLING_WORD_REQUEST="ParticipationRequestRejected",n.MOVE_REQUEST_TO_STREAM="ParticipantMovedToWebcast",n.CONFERENCE_PARTICIPANT_TOKEN_ISSUED="ConferenceParticipantTokenIssued",n))(_||{});class We{events;connectionManager;callManager;constructor({connectionManager:e,callManager:t}){this.connectionManager=e,this.callManager=t,this.events=new v.Events(oe),this.subscribe()}async waitChannels(){return this.wait(l.CHANNELS)}async waitSyncMediaState(){return this.wait(l.ADMIN_FORCE_SYNC_MEDIA_STATE)}async sendDTMF(e){return new Promise((t,s)=>{let r;try{r=this.getEstablishedRTCSessionProtected()}catch(i){s(i)}r&&(this.callManager.once("newDTMF",({originator:i})=>{i===B.LOCAL&&t()}),r.sendDTMF(e,{duration:120,interToneGap:600}))})}async sendChannels({inputChannels:e,outputChannels:t}){const s=this.getEstablishedRTCSessionProtected(),r=`${h.INPUT_CHANNELS}: ${e}`,i=`${h.OUTPUT_CHANNELS}: ${t}`,a=[r,i];return s.sendInfo(M.CHANNELS,void 0,{extraHeaders:a})}async sendMediaState({cam:e,mic:t},s={}){const r=this.getEstablishedRTCSessionProtected(),i=`${h.MEDIA_STATE}: currentstate`,a=`${h.MAIN_CAM_STATE}: ${Number(e)}`,o=`${h.MIC_STATE}: ${Number(t)}`,c=[i,a,o];return r.sendInfo(M.MEDIA_STATE,void 0,{noTerminateWhenError:!0,...s,extraHeaders:c})}async sendStats({availableIncomingBitrate:e}){const t=this.getEstablishedRTCSessionProtected(),r=[`${h.AVAILABLE_INCOMING_BITRATE}: ${e}`];return t.sendInfo(M.STATS,void 0,{noTerminateWhenError:!0,extraHeaders:r})}async sendRefusalToTurnOn(e,t={}){const s=this.getEstablishedRTCSessionProtected(),a=e==="mic"?0:1,c=[`${h.MEDIA_TYPE}: ${a}`];return s.sendInfo(M.REFUSAL,void 0,{noTerminateWhenError:!0,...t,extraHeaders:c})}async sendRefusalToTurnOnMic(e={}){return this.sendRefusalToTurnOn("mic",{noTerminateWhenError:!0,...e})}async sendRefusalToTurnOnCam(e={}){return this.sendRefusalToTurnOn("cam",{noTerminateWhenError:!0,...e})}async sendMustStopPresentationP2P(){await this.getEstablishedRTCSessionProtected().sendInfo(M.SHARE_STATE,void 0,{extraHeaders:[h.MUST_STOP_PRESENTATION_P2P]})}async sendStoppedPresentationP2P(){await this.getEstablishedRTCSessionProtected().sendInfo(M.SHARE_STATE,void 0,{extraHeaders:[h.STOP_PRESENTATION_P2P]})}async sendStoppedPresentation(){await this.getEstablishedRTCSessionProtected().sendInfo(M.SHARE_STATE,void 0,{extraHeaders:[h.STOP_PRESENTATION]})}async askPermissionToStartPresentationP2P(){await this.getEstablishedRTCSessionProtected().sendInfo(M.SHARE_STATE,void 0,{extraHeaders:[h.START_PRESENTATION_P2P]})}async askPermissionToStartPresentation(){await this.getEstablishedRTCSessionProtected().sendInfo(M.SHARE_STATE,void 0,{extraHeaders:[h.START_PRESENTATION]})}async askPermissionToEnableCam(e={}){const t=this.getEstablishedRTCSessionProtected(),s=[h.ENABLE_MAIN_CAM];return t.sendInfo(M.MAIN_CAM,void 0,{noTerminateWhenError:!0,...e,extraHeaders:s}).catch(r=>{if(Ve(r))throw r})}on(e,t){return this.events.on(e,t)}once(e,t){return this.events.once(e,t)}onceRace(e,t){return this.events.onceRace(e,t)}async wait(e){return this.events.wait(e)}off(e,t){this.events.off(e,t)}getEstablishedRTCSessionProtected=()=>{const e=this.callManager.getEstablishedRTCSession();if(!e)throw new Error("No rtcSession established");return e};subscribe(){this.connectionManager.on("sipEvent",this.handleSipEvent),this.callManager.on("newInfo",this.handleNewInfo),this.callManager.on("newDTMF",e=>{this.events.trigger("newDTMF",e)})}handleSipEvent=({request:e})=>{this.maybeHandleNotify(e)};maybeHandleNotify=e=>{try{const t=e.getHeader(h.NOTIFY);if(t){const s=JSON.parse(t);this.handleNotify(s)}}catch(t){E("error parse notify",t)}};handleNotify=e=>{switch(e.cmd){case _.CHANNELS:{const t=e;this.triggerChannelsNotify(t);break}case _.WEBCAST_STARTED:{const t=e;this.triggerWebcastStartedNotify(t);break}case _.WEBCAST_STOPPED:{const t=e;this.triggerWebcastStoppedNotify(t);break}case _.ADDED_TO_LIST_MODERATORS:{const t=e;this.triggerAddedToListModeratorsNotify(t);break}case _.REMOVED_FROM_LIST_MODERATORS:{const t=e;this.triggerRemovedFromListModeratorsNotify(t);break}case _.ACCEPTING_WORD_REQUEST:{const t=e;this.triggerParticipationAcceptingWordRequest(t);break}case _.CANCELLING_WORD_REQUEST:{const t=e;this.triggerParticipationCancellingWordRequest(t);break}case _.MOVE_REQUEST_TO_STREAM:{const t=e;this.triggerParticipantMoveRequestToStream(t);break}case _.ACCOUNT_CHANGED:{this.triggerAccountChangedNotify();break}case _.ACCOUNT_DELETED:{this.triggerAccountDeletedNotify();break}case _.CONFERENCE_PARTICIPANT_TOKEN_ISSUED:{const t=e;this.triggerConferenceParticipantTokenIssued(t);break}default:E("unknown cmd",e)}};handleNewInfo=e=>{const{originator:t}=e;if(t!==B.REMOTE)return;const{request:s}=e,r=s.getHeader(h.CONTENT_TYPE);if(r!==void 0)switch(r){case O.ENTER_ROOM:{this.triggerEnterRoom(s),this.maybeTriggerChannels(s);break}case O.NOTIFY:{this.maybeHandleNotify(s);break}case O.SHARE_STATE:{this.triggerShareState(s);break}case O.MAIN_CAM:{this.triggerMainCamControl(s);break}case O.MIC:{this.triggerMicControl(s);break}case O.USE_LICENSE:{this.triggerUseLicense(s);break}case O.PARTICIPANT_STATE:{this.maybeTriggerParticipantMoveRequest(s);break}case O.RESTART:{this.triggerRestart(s);break}}};triggerChannelsNotify=e=>{const t=e.input,s=e.output,r={inputChannels:t,outputChannels:s};this.events.trigger(l.CHANNELS_NOTIFY,r)};triggerWebcastStartedNotify=({body:{conference:e,type:t}})=>{const s={conference:e,type:t};this.events.trigger(l.WEBCAST_STARTED,s)};triggerWebcastStoppedNotify=({body:{conference:e,type:t}})=>{const s={conference:e,type:t};this.events.trigger(l.WEBCAST_STOPPED,s)};triggerAddedToListModeratorsNotify=({conference:e})=>{const t={conference:e};this.events.trigger(l.PARTICIPANT_ADDED_TO_LIST_MODERATORS,t)};triggerRemovedFromListModeratorsNotify=({conference:e})=>{const t={conference:e};this.events.trigger(l.PARTICIPANT_REMOVED_FROM_LIST_MODERATORS,t)};triggerParticipationAcceptingWordRequest=({body:{conference:e}})=>{const t={conference:e};this.events.trigger(l.PARTICIPATION_ACCEPTING_WORD_REQUEST,t)};triggerParticipationCancellingWordRequest=({body:{conference:e}})=>{const t={conference:e};this.events.trigger(l.PARTICIPATION_CANCELLING_WORD_REQUEST,t)};triggerParticipantMoveRequestToStream=({body:{conference:e}})=>{const t={conference:e};this.events.trigger(l.PARTICIPANT_MOVE_REQUEST_TO_STREAM,t)};triggerAccountChangedNotify=()=>{this.events.trigger(l.ACCOUNT_CHANGED,void 0)};triggerAccountDeletedNotify=()=>{this.events.trigger(l.ACCOUNT_DELETED,void 0)};triggerConferenceParticipantTokenIssued=({body:{conference:e,participant:t,jwt:s}})=>{const r={conference:e,participant:t,jwt:s};this.events.trigger(l.CONFERENCE_PARTICIPANT_TOKEN_ISSUED,r)};maybeTriggerChannels=e=>{const t=e.getHeader(h.INPUT_CHANNELS),s=e.getHeader(h.OUTPUT_CHANNELS);if(t&&s){const r={inputChannels:t,outputChannels:s};this.events.trigger(l.CHANNELS,r)}};triggerEnterRoom=e=>{const t=e.getHeader(h.CONTENT_ENTER_ROOM),s=e.getHeader(h.PARTICIPANT_NAME);this.events.trigger(l.ENTER_ROOM,{room:t,participantName:s})};triggerShareState=e=>{const t=e.getHeader(h.CONTENT_SHARE_STATE);if(t!==void 0)switch(t){case F.AVAILABLE_SECOND_REMOTE_STREAM:{this.events.trigger(l.AVAILABLE_SECOND_REMOTE_STREAM,void 0);break}case F.NOT_AVAILABLE_SECOND_REMOTE_STREAM:{this.events.trigger(l.NOT_AVAILABLE_SECOND_REMOTE_STREAM,void 0);break}case F.MUST_STOP_PRESENTATION:{this.events.trigger(l.MUST_STOP_PRESENTATION,void 0);break}}};maybeTriggerParticipantMoveRequest=e=>{const t=e.getHeader(h.CONTENT_PARTICIPANT_STATE);t===$.SPECTATOR&&this.events.trigger(l.PARTICIPANT_MOVE_REQUEST_TO_SPECTATORS,void 0),t===$.PARTICIPANT&&this.events.trigger(l.PARTICIPANT_MOVE_REQUEST_TO_PARTICIPANTS,void 0),t===$.SPECTATOR_OVER_SFU&&this.events.trigger(l.PARTICIPANT_MOVE_REQUEST_TO_SPECTATORS_OVER_SFU,void 0)};triggerMainCamControl=e=>{const t=e.getHeader(h.MAIN_CAM),s=e.getHeader(h.MEDIA_SYNC),r=s===H.ADMIN_SYNC_FORCED;if(t===P.ADMIN_START_MAIN_CAM){this.events.trigger(l.ADMIN_START_MAIN_CAM,{isSyncForced:r});return}if(t===P.ADMIN_STOP_MAIN_CAM){this.events.trigger(l.ADMIN_STOP_MAIN_CAM,{isSyncForced:r});return}(t===P.RESUME_MAIN_CAM||t===P.PAUSE_MAIN_CAM)&&s!==void 0&&this.events.trigger(l.ADMIN_FORCE_SYNC_MEDIA_STATE,{isSyncForced:r});const i=e.getHeader(h.MAIN_CAM_RESOLUTION);this.events.trigger(l.MAIN_CAM_CONTROL,{mainCam:t,resolutionMainCam:i})};triggerMicControl=e=>{const t=e.getHeader(h.MIC),r=e.getHeader(h.MEDIA_SYNC)===H.ADMIN_SYNC_FORCED;t===W.ADMIN_START_MIC?this.events.trigger(l.ADMIN_START_MIC,{isSyncForced:r}):t===W.ADMIN_STOP_MIC&&this.events.trigger(l.ADMIN_STOP_MIC,{isSyncForced:r})};triggerUseLicense=e=>{const t=e.getHeader(h.CONTENT_USE_LICENSE);this.events.trigger(l.USE_LICENSE,t)};triggerRestart=e=>{const t=e.getHeader(h.TRACKS_DIRECTION),s=Number(e.getHeader(h.AUDIO_TRACK_COUNT)),r=Number(e.getHeader(h.VIDEO_TRACK_COUNT)),i={tracksDirection:t,audioTrackCount:s,videoTrackCount:r};this.events.trigger(l.RESTART,i)}}const He=(n,e)=>(n.degradationPreference=e.degradationPreference,n),xe=(n,e)=>{n.encodings??=[];for(let t=n.encodings.length;t<e;t+=1)n.encodings.push({});return n},ce=n=>(e,t)=>t!==void 0&&e!==t||t===void 0&&e!==n,qe=ce(),Ge=(n,e)=>{if(qe(n,e))return n},Qe=(n,e)=>{const t=n.maxBitrate,s=Ge(e,t);return s!==void 0&&(n.maxBitrate=s),n},de=1,Ye=ce(de),ze=(n,e)=>{const t=n===void 0?void 0:Math.max(n,de);if(t!==void 0&&Ye(t,e))return t},Xe=(n,e)=>{const t=n.scaleResolutionDownBy,s=ze(e,t);return s!==void 0&&(n.scaleResolutionDownBy=s),n},Je=(n,e)=>{const t=e.encodings?.length??0;return xe(n,t),n.encodings.forEach((s,r)=>{const i=(e?.encodings??[])[r],a=i?.maxBitrate,o=i?.scaleResolutionDownBy;Qe(s,a),Xe(s,o)}),n},Ke=(n,e)=>{if(n.codecs?.length!==e.codecs?.length)return!0;for(let t=0;t<(n.codecs?.length??0);t++)if(JSON.stringify(n.codecs[t])!==JSON.stringify(e.codecs[t]))return!0;if(n.headerExtensions?.length!==e.headerExtensions?.length)return!0;for(let t=0;t<(n.headerExtensions?.length??0);t++)if(JSON.stringify(n.headerExtensions[t])!==JSON.stringify(e.headerExtensions[t]))return!0;if(n.encodings?.length!==e.encodings?.length)return!0;for(let t=0;t<(n.encodings?.length??0);t++)if(JSON.stringify(n.encodings[t])!==JSON.stringify(e.encodings[t]))return!0;return n.rtcp?.cname!==e.rtcp?.cname||n.rtcp?.reducedSize!==e.rtcp?.reducedSize||n.degradationPreference!==e.degradationPreference},he=async(n,e)=>{const t=n.getParameters(),s=JSON.parse(JSON.stringify(t));Je(t,e),He(t,e);const r=Ke(s,t);return r&&await n.setParameters(t),{parameters:t,isChanged:r}},z=async(n,e,t)=>{const{isChanged:s,parameters:r}=await he(n,{encodings:[{scaleResolutionDownBy:e.scaleResolutionDownBy,maxBitrate:e.maxBitrate}]});return s&&t&&t(r),{isChanged:s,parameters:r}},je=(n,e)=>n.find(t=>t.track!==null&&e.getTracks().includes(t.track)),Ze=async(n,e,t)=>{const s=je(n,e);if(s)return z(s,{maxBitrate:t})};var f=(n=>(n.START_PRESENTATION="presentation:start",n.STARTED_PRESENTATION="presentation:started",n.END_PRESENTATION="presentation:end",n.ENDED_PRESENTATION="presentation:ended",n.FAILED_PRESENTATION="presentation:failed",n))(f||{});const ge=["presentation:start","presentation:started","presentation:end","presentation:ended","presentation:failed"],et=1,tt=n=>G.hasCanceledError(n);class nt{events;promisePendingStartPresentation;promisePendingStopPresentation;streamPresentationCurrent;maxBitrate;cancelableSendPresentationWithRepeatedCalls;callManager;constructor({callManager:e,maxBitrate:t}){this.callManager=e,this.maxBitrate=t,this.events=new v.Events(ge),this.subscribe()}get isPendingPresentation(){return!!this.promisePendingStartPresentation||!!this.promisePendingStopPresentation}async startPresentation(e,t,{isNeedReinvite:s,contentHint:r,sendEncodings:i,onAddedTransceiver:a}={},o){const c=this.getRtcSessionProtected();if(this.streamPresentationCurrent)throw new Error("Presentation is already started");return this.sendPresentationWithDuplicatedCalls(e,{rtcSession:c,stream:t,presentationOptions:{isNeedReinvite:s,contentHint:r,sendEncodings:i,onAddedTransceiver:a},options:o})}async stopPresentation(e){this.cancelSendPresentationWithRepeatedCalls();const t=this.streamPresentationCurrent;let s=this.promisePendingStartPresentation??Promise.resolve(void 0);this.promisePendingStartPresentation&&await this.promisePendingStartPresentation.catch(()=>{});const r=this.callManager.getEstablishedRTCSession();return r&&t?s=e().then(async()=>r.stopPresentation(t)).catch(i=>{throw this.events.trigger(f.FAILED_PRESENTATION,i),i}):t&&this.events.trigger(f.ENDED_PRESENTATION,t),this.promisePendingStopPresentation=s,s.finally(()=>{this.resetPresentation()})}async updatePresentation(e,t,{contentHint:s,sendEncodings:r,onAddedTransceiver:i}={}){const a=this.getRtcSessionProtected();if(!this.streamPresentationCurrent)throw new Error("Presentation has not started yet");return this.promisePendingStartPresentation&&await this.promisePendingStartPresentation,this.sendPresentation(e,a,t,{contentHint:s,isNeedReinvite:!1,sendEncodings:r,onAddedTransceiver:i}).then(async o=>(await this.setMaxBitrate(),o))}cancelSendPresentationWithRepeatedCalls(){this.cancelableSendPresentationWithRepeatedCalls?.stopRepeatedCalls()}on(e,t){return this.events.on(e,t)}once(e,t){return this.events.once(e,t)}onceRace(e,t){return this.events.onceRace(e,t)}async wait(e){return this.events.wait(e)}off(e,t){this.events.off(e,t)}subscribe(){this.callManager.on("presentation:start",e=>{this.events.trigger(f.START_PRESENTATION,e)}),this.callManager.on("presentation:started",e=>{this.events.trigger(f.STARTED_PRESENTATION,e)}),this.callManager.on("presentation:end",e=>{this.events.trigger(f.END_PRESENTATION,e)}),this.callManager.on("presentation:ended",e=>{this.events.trigger(f.ENDED_PRESENTATION,e)}),this.callManager.on("presentation:failed",e=>{this.events.trigger(f.FAILED_PRESENTATION,e)}),this.callManager.on("failed",this.handleEnded),this.callManager.on("ended",this.handleEnded)}async sendPresentationWithDuplicatedCalls(e,{rtcSession:t,stream:s,presentationOptions:r,options:i={callLimit:et}}){const a=async()=>this.sendPresentation(e,t,s,r),o=()=>!!this.streamPresentationCurrent;return this.cancelableSendPresentationWithRepeatedCalls=G.repeatedCallsAsync({targetFunction:a,isComplete:o,isRejectAsValid:!0,...i}),this.cancelableSendPresentationWithRepeatedCalls.then(c=>c)}async sendPresentation(e,t,s,{isNeedReinvite:r=!0,contentHint:i="detail",degradationPreference:a,sendEncodings:o,onAddedTransceiver:c}){const d=L(s,{contentHint:i});if(d===void 0)throw new Error("No streamPresentationTarget");this.streamPresentationCurrent=d;const u=e().then(async()=>t.startPresentation(d,r,{degradationPreference:a,sendEncodings:o,onAddedTransceiver:c})).then(this.setMaxBitrate).then(()=>s).catch(T=>{throw this.removeStreamPresentationCurrent(),this.events.trigger(f.FAILED_PRESENTATION,T),T});return this.promisePendingStartPresentation=u,u.finally(()=>{this.promisePendingStartPresentation=void 0})}setMaxBitrate=async()=>{const{connection:e}=this.callManager,{streamPresentationCurrent:t}=this,{maxBitrate:s}=this;if(!e||!t||s===void 0)return;const r=e.getSenders();await Ze(r,t,s)};getRtcSessionProtected=()=>{const e=this.callManager.getEstablishedRTCSession();if(!e)throw new Error("No rtcSession established");return e};handleEnded=()=>{this.reset()};reset(){this.cancelSendPresentationWithRepeatedCalls(),this.resetPresentation()}resetPresentation(){this.removeStreamPresentationCurrent(),this.promisePendingStartPresentation=void 0,this.promisePendingStopPresentation=void 0}removeStreamPresentationCurrent(){delete this.streamPresentationCurrent}}class st{data={};getUa;constructor(e){this.getUa=e.getUa}isConfigured(){return this.getUa()!==void 0}get(){return{...this.data}}set(e){this.data={...e}}update(e,t){this.data[e]=t}clear(){this.data={}}isRegister(){return this.data.register===!0}getSipServerUrl(){return this.data.sipServerUrl}getDisplayName(){return this.data.displayName}getUser(){return this.data.user}getPassword(){return this.data.password}isRegisterEnabled(){return this.data.register===!0}}var A=(n=>(n.CONNECTING="connecting",n.CONNECTED="connected",n.DISCONNECTED="disconnected",n.NEW_RTC_SESSION="newRTCSession",n.REGISTERED="registered",n.UNREGISTERED="unregistered",n.REGISTRATION_FAILED="registrationFailed",n.NEW_MESSAGE="newMessage",n.SIP_EVENT="sipEvent",n))(A||{});const le=["connecting","connected","disconnected","newRTCSession","registered","unregistered","registrationFailed","newMessage","sipEvent"],ue=[...le],rt=3;class it{cancelableConnectWithRepeatedCalls;JsSIP;events;uaFactory;stateMachine;registrationManager;getUa;setUa;getConnectionConfiguration;setConnectionConfiguration;updateConnectionConfiguration;setSipServerUrl;setSocket;constructor(e){this.JsSIP=e.JsSIP,this.events=e.events,this.uaFactory=e.uaFactory,this.stateMachine=e.stateMachine,this.registrationManager=e.registrationManager,this.getUa=e.getUa,this.setUa=e.setUa,this.getConnectionConfiguration=e.getConnectionConfiguration,this.setConnectionConfiguration=e.setConnectionConfiguration,this.updateConnectionConfiguration=e.updateConnectionConfiguration,this.setSipServerUrl=e.setSipServerUrl,this.setSocket=e.setSocket}connect=async(e,t)=>(this.cancelRequests(),this.connectWithDuplicatedCalls(e,t));set=async({displayName:e})=>new Promise((t,s)=>{const r=this.getUa();if(!r){s(new Error("this.ua is not initialized"));return}let i=!1;const a=this.getConnectionConfiguration();e!==void 0&&e!==a.displayName&&(i=r.set("display_name",ie(e)),this.updateConnectionConfiguration("displayName",e));const o=i;o?t(o):s(new Error("nothing changed"))});disconnect=async()=>{const e=new Promise(s=>{this.events.once(A.DISCONNECTED,()=>{s()})}),t=this.getUa();return t?t.stop():this.events.trigger(A.DISCONNECTED,void 0),e.finally(()=>{this.setUa(void 0),this.stateMachine.reset()})};cancelRequests(){this.cancelConnectWithRepeatedCalls()}connectWithDuplicatedCalls=async(e,{callLimit:t=rt}={})=>{const s=async()=>this.connectInner(e),r=i=>{const c=this.getUa()?.isConnected()===!0&&this.hasEqualConnectionConfiguration(e),d=i!=null&&!$e(i);return c||d};return this.stateMachine.startConnect(),this.cancelableConnectWithRepeatedCalls=G.repeatedCallsAsync({targetFunction:s,isComplete:r,callLimit:t,isRejectAsValid:!0,isCheckBeforeCall:!1}),this.cancelableConnectWithRepeatedCalls.then(i=>{if(i instanceof this.JsSIP.UA)return i;throw i})};hasEqualConnectionConfiguration(e){const{configuration:t}=this.uaFactory.createConfiguration(e),r=this.getUa()?.configuration;return r?r.password===t.password&&r.register===t.register&&r.uri.toString()===t.uri&&r.display_name===t.display_name&&r.user_agent===t.user_agent&&r.sockets===t.sockets&&r.session_timers===t.session_timers&&r.register_expires===t.register_expires&&r.connection_recovery_min_interval===t.connection_recovery_min_interval&&r.connection_recovery_max_interval===t.connection_recovery_max_interval:!1}connectInner=async e=>this.initUa(e).then(async()=>this.start());initUa=async({user:e,password:t,sipServerUrl:s,sipWebSocketServerURL:r,remoteAddress:i,sessionTimers:a,registerExpires:o,connectionRecoveryMinInterval:c,connectionRecoveryMaxInterval:d,userAgent:u,displayName:T="",register:g=!1,extraHeaders:C=[]})=>{this.stateMachine.startInitUa(),this.setConnectionConfiguration({sipServerUrl:s,displayName:T,register:g,user:e,password:t}),this.getUa()&&await this.disconnect();const{ua:I,helpers:R}=this.uaFactory.createUAWithConfiguration({user:e,password:t,sipServerUrl:s,sipWebSocketServerURL:r,displayName:T,register:g,sessionTimers:a,registerExpires:o,connectionRecoveryMinInterval:c,connectionRecoveryMaxInterval:d,userAgent:u,remoteAddress:i,extraHeaders:C},this.events);return this.setUa(I),this.setSipServerUrl(R.getSipServerUrl),this.setSocket(R.socket),I};start=async()=>new Promise((e,t)=>{const s=this.getUa();if(!s){t(new Error("this.ua is not initialized"));return}let r;r=((c,d)=>{if(this.getConnectionConfiguration().register===!0)return this.registrationManager.subscribeToStartEvents(c,d);const T=A.CONNECTED,g=[A.DISCONNECTED];return this.events.on(T,c),g.forEach(C=>{this.events.on(C,d)}),()=>{this.events.off(T,c),g.forEach(C=>{this.events.off(C,d)})}})(()=>{r?.(),e(s)},c=>{r?.(),t(c)}),s.start()});cancelConnectWithRepeatedCalls(){this.cancelableConnectWithRepeatedCalls?.cancel()}}var Te=(n=>(n.START_CONNECT="START_CONNECT",n.START_INIT_UA="START_INIT_UA",n.UA_CONNECTED="UA_CONNECTED",n.UA_REGISTERED="UA_REGISTERED",n.UA_UNREGISTERED="UA_UNREGISTERED",n.UA_DISCONNECTED="UA_DISCONNECTED",n.CONNECTION_FAILED="CONNECTION_FAILED",n.RESET="RESET",n))(Te||{});const at=ee.setup({types:{context:{},events:{}},actions:{logTransition:(n,e)=>{E(`State transition: ${e.from} -> ${e.to} (${e.event})`)},logStateChange:(n,e)=>{E("ConnectionStateMachine state changed",e.state)}}}).createMachine({id:"connection",initial:"idle",context:{},states:{idle:{entry:{type:"logStateChange",params:{state:"idle"}},on:{START_CONNECT:{target:"connecting",actions:{type:"logTransition",params:{from:"idle",to:"connecting",event:"START_CONNECT"}}}}},connecting:{entry:{type:"logStateChange",params:{state:"connecting"}},on:{START_INIT_UA:{target:"initializing",actions:{type:"logTransition",params:{from:"connecting",to:"initializing",event:"START_INIT_UA"}}},UA_DISCONNECTED:{target:"disconnected",actions:{type:"logTransition",params:{from:"connecting",to:"disconnected",event:"UA_DISCONNECTED"}}},CONNECTION_FAILED:{target:"failed",actions:{type:"logTransition",params:{from:"connecting",to:"failed",event:"CONNECTION_FAILED"}}}}},initializing:{entry:{type:"logStateChange",params:{state:"initializing"}},on:{UA_CONNECTED:{target:"connected",actions:{type:"logTransition",params:{from:"initializing",to:"connected",event:"UA_CONNECTED"}}},UA_REGISTERED:{target:"registered",actions:{type:"logTransition",params:{from:"initializing",to:"registered",event:"UA_REGISTERED"}}},UA_DISCONNECTED:{target:"disconnected",actions:{type:"logTransition",params:{from:"initializing",to:"disconnected",event:"UA_DISCONNECTED"}}},CONNECTION_FAILED:{target:"failed",actions:{type:"logTransition",params:{from:"initializing",to:"failed",event:"CONNECTION_FAILED"}}}}},connected:{entry:{type:"logStateChange",params:{state:"connected"}},on:{UA_REGISTERED:{target:"registered",actions:{type:"logTransition",params:{from:"connected",to:"registered",event:"UA_REGISTERED"}}},UA_DISCONNECTED:{target:"disconnected",actions:{type:"logTransition",params:{from:"connected",to:"disconnected",event:"UA_DISCONNECTED"}}},CONNECTION_FAILED:{target:"failed",actions:{type:"logTransition",params:{from:"connected",to:"failed",event:"CONNECTION_FAILED"}}}}},registered:{entry:{type:"logStateChange",params:{state:"registered"}},on:{UA_UNREGISTERED:{target:"connected",actions:{type:"logTransition",params:{from:"registered",to:"connected",event:"UA_UNREGISTERED"}}},UA_DISCONNECTED:{target:"disconnected",actions:{type:"logTransition",params:{from:"registered",to:"disconnected",event:"UA_DISCONNECTED"}}},CONNECTION_FAILED:{target:"failed",actions:{type:"logTransition",params:{from:"registered",to:"failed",event:"CONNECTION_FAILED"}}}}},disconnected:{entry:{type:"logStateChange",params:{state:"disconnected"}},on:{RESET:{target:"idle",actions:{type:"logTransition",params:{from:"disconnected",to:"idle",event:"RESET"}}},START_CONNECT:{target:"connecting",actions:{type:"logTransition",params:{from:"disconnected",to:"connecting",event:"START_CONNECT"}}}}},failed:{entry:{type:"logStateChange",params:{state:"failed"}},on:{RESET:{target:"idle",actions:{type:"logTransition",params:{from:"failed",to:"idle",event:"RESET"}}},START_CONNECT:{target:"connecting",actions:{type:"logTransition",params:{from:"failed",to:"connecting",event:"START_CONNECT"}}}}}}});class ot{actor;stateChangeListeners=new Set;events;unsubscribeFromEvents;actorSubscription;constructor(e){this.events=e,this.actor=ee.createActor(at),this.actorSubscription=this.actor.subscribe(t=>{const s=t.value;this.stateChangeListeners.forEach(r=>{r(s)})}),this.actor.start(),this.subscribeToEvents()}get state(){return this.actor.getSnapshot().value}get isIdle(){return this.hasState("idle")}get isConnecting(){return this.hasState("connecting")}get isInitializing(){return this.hasState("initializing")}get isConnected(){return this.hasState("connected")}get isRegistered(){return this.hasState("registered")}get isDisconnected(){return this.hasState("disconnected")}get isFailed(){return this.hasState("failed")}get isPending(){return this.isConnecting||this.isInitializing}get isPendingConnect(){return this.isConnecting}get isPendingInitUa(){return this.isInitializing}get isActiveConnection(){return this.isConnected||this.isRegistered}startConnect(){this.toStartConnect()}startInitUa(){this.toStartInitUa()}reset(){this.toIdle()}destroy(){this.unsubscribeFromEvents?.(),this.actorSubscription?.unsubscribe(),this.actor.stop()}onStateChange(e){return this.stateChangeListeners.add(e),()=>{this.stateChangeListeners.delete(e)}}canTransition(e){return this.actor.getSnapshot().can({type:e})}getValidEvents(){return Object.values(Te).filter(e=>this.canTransition(e))}hasState(e){return this.actor.getSnapshot().matches(e)}sendEvent(e){const t=this.actor.getSnapshot(),s={type:e};if(!t.can(s)){E(`Invalid transition: ${s.type} from ${this.state}. Event cannot be processed in current state.`);return}this.actor.send(s)}toStartConnect=()=>{this.sendEvent("START_CONNECT")};toStartInitUa=()=>{this.sendEvent("START_INIT_UA")};toConnected=()=>{this.sendEvent("UA_CONNECTED")};toRegistered=()=>{this.sendEvent("UA_REGISTERED")};toUnregistered=()=>{this.sendEvent("UA_UNREGISTERED")};toDisconnected=()=>{this.sendEvent("UA_DISCONNECTED")};toFailed=()=>{this.sendEvent("CONNECTION_FAILED")};toIdle=()=>{this.sendEvent("RESET")};subscribeToEvents(){this.events.on("connected",this.toConnected),this.events.on("registered",this.toRegistered),this.events.on("unregistered",this.toUnregistered),this.events.on("disconnected",this.toDisconnected),this.events.on("registrationFailed",this.toFailed),this.unsubscribeFromEvents=()=>{this.events.off("connected",this.toConnected),this.events.off("registered",this.toRegistered),this.events.off("unregistered",this.toUnregistered),this.events.off("disconnected",this.toDisconnected),this.events.off("registrationFailed",this.toFailed)}}}class ct{events;getUaProtected;constructor(e){this.events=e.events,this.getUaProtected=e.getUaProtected}async register(){const e=this.getUaProtected();return new Promise((t,s)=>{e.on(A.REGISTERED,t),e.on(A.REGISTRATION_FAILED,s),e.register()})}async unregister(){const e=this.getUaProtected();return new Promise(t=>{e.on(A.UNREGISTERED,t),e.unregister()})}async tryRegister(){try{await this.unregister()}catch(e){E("tryRegister",e)}return this.register()}subscribeToStartEvents(e,t){const s=A.REGISTERED,r=[A.REGISTRATION_FAILED,A.DISCONNECTED];return this.events.on(s,e),r.forEach(i=>{this.events.on(i,t)}),()=>{this.events.off(s,e),r.forEach(i=>{this.events.off(i,t)})}}}class dt{uaFactory;getUaProtected;constructor(e){this.uaFactory=e.uaFactory,this.getUaProtected=e.getUaProtected}async sendOptions(e,t,s){const r=this.getUaProtected();return new Promise((i,a)=>{try{r.sendOptions(e,t,{extraHeaders:s,eventHandlers:{succeeded:()=>{i()},failed:a}})}catch(o){a(o)}})}async ping(e,t){const r=this.getUaProtected().configuration.uri;return this.sendOptions(r,e,t)}async checkTelephony({userAgent:e,displayName:t,sipServerUrl:s,sipWebSocketServerURL:r,remoteAddress:i,extraHeaders:a}){return new Promise((o,c)=>{const{configuration:d}=this.uaFactory.createConfiguration({sipWebSocketServerURL:r,displayName:t,userAgent:e,sipServerUrl:s}),u=this.uaFactory.createUA({...d,remoteAddress:i,extraHeaders:a}),T=()=>{const C=new Error("Telephony is not available");c(C)};u.once(A.DISCONNECTED,T);const g=()=>{u.removeAllListeners(),u.once(A.DISCONNECTED,()=>{o()}),u.stop()};u.once(A.CONNECTED,g),u.start()})}}const ht=n=>{const e=[];return n!==void 0&&n!==""&&e.push(`X-Vinteo-Remote: ${n}`),e};class D{JsSIP;constructor(e){this.JsSIP=e}static isRegisteredUA(e){return!!e&&e.isRegistered()}static validateConfiguration({register:e,password:t,user:s,sipServerUrl:r,sipWebSocketServerURL:i}){if(!r)throw new Error("sipServerUrl is required");if(!i)throw new Error("sipWebSocketServerURL is required");if(e&&(t===void 0||t===""))throw new Error("password is required for authorized connection");if(e&&(s===void 0||s===""))throw new Error("user is required for authorized connection")}static resolveAuthorizationUser(e,t){return e&&t!==void 0&&t.trim()!==""?t.trim():`${ve()}`}static buildExtraHeaders(e,t){const s=e!==void 0&&e!==""?ht(e):[];return t===void 0?s:[...s,...t]}createConfiguration({user:e,password:t,sipWebSocketServerURL:s,displayName:r="",sipServerUrl:i,register:a=!1,sessionTimers:o=!1,registerExpires:c=300,connectionRecoveryMinInterval:d=2,connectionRecoveryMaxInterval:u=6,userAgent:T}){D.validateConfiguration({register:a,password:t,user:e,sipServerUrl:i,sipWebSocketServerURL:s});const g=D.resolveAuthorizationUser(a,e),C=Oe(i),m=C(g),I=new this.JsSIP.WebSocketInterface(s);return{configuration:{password:t,register:a,uri:m,display_name:ie(r),user_agent:T,sdpSemantics:"unified-plan",sockets:[I],session_timers:o,register_expires:c,connection_recovery_min_interval:d,connection_recovery_max_interval:u},helpers:{socket:I,getSipServerUrl:C}}}createUA({remoteAddress:e,extraHeaders:t,...s}){const r=new this.JsSIP.UA(s),i=D.buildExtraHeaders(e,t);return i.length>0&&r.registrator().setExtraHeaders(i),r}createUAWithConfiguration(e,t){const{configuration:s,helpers:r}=this.createConfiguration(e),i=this.createUA({...s,remoteAddress:e.remoteAddress,extraHeaders:e.extraHeaders});return t.eachTriggers((a,o)=>{const c=le.find(d=>d===o);c&&i.on(c,a)}),{ua:i,helpers:r}}}class gt{events;ua;socket;uaFactory;registrationManager;stateMachine;connectionFlow;sipOperations;configurationManager;JsSIP;constructor({JsSIP:e}){this.JsSIP=e,this.events=new v.Events(ue),this.uaFactory=new D(e),this.registrationManager=new ct({events:this.events,getUaProtected:this.getUaProtected}),this.stateMachine=new ot(this.events),this.configurationManager=new st({getUa:this.getUa}),this.sipOperations=new dt({uaFactory:this.uaFactory,getUaProtected:this.getUaProtected}),this.connectionFlow=new it({JsSIP:this.JsSIP,events:this.events,uaFactory:this.uaFactory,stateMachine:this.stateMachine,registrationManager:this.registrationManager,getUa:this.getUa,getConnectionConfiguration:this.getConnectionConfiguration,setConnectionConfiguration:t=>{this.configurationManager.set(t)},updateConnectionConfiguration:(t,s)=>{this.configurationManager.update(t,s)},setUa:t=>{this.ua=t},setSipServerUrl:t=>{this.getSipServerUrl=t},setSocket:t=>{this.socket=t}})}get requested(){return this.stateMachine.isPending}get isPendingConnect(){return this.stateMachine.isPendingConnect}get isPendingInitUa(){return this.stateMachine.isPendingInitUa}get connectionState(){return this.stateMachine.state}get isRegistered(){return D.isRegisteredUA(this.ua)}get isRegisterConfig(){return this.configurationManager.isRegister()}connect=async(e,t)=>this.connectionFlow.connect(e,t);set=async({displayName:e})=>this.connectionFlow.set({displayName:e});disconnect=async()=>this.connectionFlow.disconnect();async register(){return this.registrationManager.register()}async unregister(){return this.registrationManager.unregister()}tryRegister=async()=>this.registrationManager.tryRegister();sendOptions=async(e,t,s)=>this.sipOperations.sendOptions(e,t,s);ping=async(e,t)=>this.sipOperations.ping(e,t);checkTelephony=async e=>this.sipOperations.checkTelephony(e);on(e,t){return this.events.on(e,t)}once(e,t){return this.events.once(e,t)}onceRace(e,t){return this.events.onceRace(e,t)}async wait(e){return this.events.wait(e)}off(e,t){this.events.off(e,t)}isConfigured(){return this.configurationManager.isConfigured()}getConnectionConfiguration=()=>this.configurationManager.get();destroy(){this.stateMachine.destroy()}getSipServerUrl=e=>e;getUaProtected=()=>{if(!this.ua)throw new Error("UA not initialized");return this.ua};getUa=()=>this.ua}class lt{connectionManager;stackPromises=te.createStackPromises({noRunIsNotActual:!0});constructor({connectionManager:e}){this.connectionManager=e}connect=async(...e)=>this.stackPromises.run(async()=>this.connectionManager.connect(...e));disconnect=async()=>this.stackPromises.run(async()=>this.connectionManager.disconnect());register=async()=>this.stackPromises.run(async()=>this.connectionManager.register());unregister=async()=>this.stackPromises.run(async()=>this.connectionManager.unregister());tryRegister=async()=>this.stackPromises.run(async()=>this.connectionManager.tryRegister());checkTelephony=async(...e)=>this.stackPromises.run(async()=>this.connectionManager.checkTelephony(...e));sendOptions=async(...e)=>this.stackPromises.run(async()=>this.connectionManager.sendOptions(...e));ping=async(...e)=>this.stackPromises.run(async()=>this.connectionManager.ping(...e));set=async(...e)=>this.stackPromises.run(async()=>this.connectionManager.set(...e))}var w=(n=>(n.INCOMING_CALL="incomingCall",n.DECLINED_INCOMING_CALL="declinedIncomingCall",n.TERMINATED_INCOMING_CALL="terminatedIncomingCall",n.FAILED_INCOMING_CALL="failedIncomingCall",n))(w||{}),x=(n=>(n.LOCAL="local",n.REMOTE="remote",n.SYSTEM="system",n))(x||{});const Se=["incomingCall","declinedIncomingCall","terminatedIncomingCall","failedIncomingCall"],ut=486,Tt=487;class St{events;incomingRTCSession;connectionManager;constructor(e){this.connectionManager=e,this.events=new v.Events(Se),this.start()}get remoteCallerData(){return{displayName:this.incomingRTCSession?.remote_identity.display_name,host:this.incomingRTCSession?.remote_identity.uri.host,incomingNumber:this.incomingRTCSession?.remote_identity.uri.user,rtcSession:this.incomingRTCSession}}get isAvailableIncomingCall(){return!!this.incomingRTCSession}start(){this.subscribe()}stop(){this.unsubscribe(),this.removeIncomingSession()}getIncomingRTCSession=()=>{const{incomingRTCSession:e}=this;if(!e)throw new Error("No incomingRTCSession");return e};extractIncomingRTCSession=()=>{const e=this.getIncomingRTCSession();return this.removeIncomingSession(),e};async declineToIncomingCall({statusCode:e=Tt}={}){return new Promise((t,s)=>{try{const r=this.getIncomingRTCSession(),i=this.remoteCallerData;this.removeIncomingSession(),this.events.trigger(w.DECLINED_INCOMING_CALL,i),r.terminate({status_code:e}),t()}catch(r){s(r)}})}async busyIncomingCall(){return this.declineToIncomingCall({statusCode:ut})}on(e,t){return this.events.on(e,t)}once(e,t){return this.events.once(e,t)}onceRace(e,t){return this.events.onceRace(e,t)}async wait(e){return this.events.wait(e)}off(e,t){this.events.off(e,t)}subscribe(){this.connectionManager.on("newRTCSession",this.handleNewRTCSession)}unsubscribe(){this.connectionManager.off("newRTCSession",this.handleNewRTCSession)}handleNewRTCSession=({originator:e,session:t})=>{e===x.REMOTE&&this.setIncomingSession(t)};setIncomingSession(e){this.incomingRTCSession=e;const t=this.remoteCallerData;e.on("failed",s=>{this.removeIncomingSession(),s.originator===x.LOCAL?this.events.trigger(w.TERMINATED_INCOMING_CALL,t):this.events.trigger(w.FAILED_INCOMING_CALL,t)}),this.events.trigger(w.INCOMING_CALL,t)}removeIncomingSession(){delete this.incomingRTCSession}}const U=1e3;var S=(n=>(n.INBOUND_RTP="inbound-rtp",n.REMOTE_OUTBOUND_RTP="remote-outbound-rtp",n.MEDIA_SOURCE="media-source",n.OUTBOUND_RTP="outbound-rtp",n.REMOTE_INBOUND_RTP="remote-inbound-rtp",n.CODEC="codec",n.CANDIDATE_PAIR="candidate-pair",n.CERTIFICATE="certificate",n.TRANSPORT="transport",n.LOCAL_CANDIDATE="local-candidate",n.REMOTE_CANDIDATE="remote-candidate",n))(S||{});const Ce=["collected"],J=()=>"performance"in window?performance.now():Date.now(),k=n=>[...n.keys()].reduce((e,t)=>{const s=n.get(t);return s===void 0?e:{...e,[s.type]:s}},{}),Ct=n=>{if(!n)return{outboundRtp:void 0,codec:void 0,mediaSource:void 0,remoteInboundRtp:void 0};const e=k(n);return{outboundRtp:e[S.OUTBOUND_RTP],codec:e[S.CODEC],mediaSource:e[S.MEDIA_SOURCE],remoteInboundRtp:e[S.REMOTE_INBOUND_RTP]}},K=n=>{if(!n)return{outboundRtp:void 0,codec:void 0,mediaSource:void 0,remoteInboundRtp:void 0};const e=k(n);return{outboundRtp:e[S.OUTBOUND_RTP],codec:e[S.CODEC],mediaSource:e[S.MEDIA_SOURCE],remoteInboundRtp:e[S.REMOTE_INBOUND_RTP]}},j=({videoReceiversStats:n,synchronizationSourcesVideo:e})=>{if(!n)return{inboundRtp:void 0,codec:void 0,synchronizationSources:e};const t=k(n);return{inboundRtp:t[S.INBOUND_RTP],codec:t[S.CODEC],synchronizationSources:e}},Et=({audioReceiverStats:n,synchronizationSourcesAudio:e})=>{if(!n)return{inboundRtp:void 0,codec:void 0,remoteOutboundRtp:void 0,synchronizationSources:e};const t=k(n);return{inboundRtp:t[S.INBOUND_RTP],codec:t[S.CODEC],remoteOutboundRtp:t[S.REMOTE_OUTBOUND_RTP],synchronizationSources:e}},Ee=n=>{if(!n)return{candidatePair:void 0,certificate:void 0,localCandidate:void 0,remoteCandidate:void 0,transport:void 0};const e=k(n);return{candidatePair:e[S.CANDIDATE_PAIR],certificate:e[S.CERTIFICATE],localCandidate:e[S.LOCAL_CANDIDATE],remoteCandidate:e[S.REMOTE_CANDIDATE],transport:e[S.TRANSPORT]}},Nt=({audioSenderStats:n,videoSenderFirstStats:e,videoSenderSecondStats:t})=>({video:K(e),secondVideo:K(t),audio:Ct(n),additional:Ee(n??e??t)}),At=({audioReceiverStats:n,videoReceiverFirstStats:e,videoReceiverSecondStats:t,synchronizationSources:s})=>({video:j({videoReceiversStats:e,synchronizationSourcesVideo:s.video}),secondVideo:j({videoReceiversStats:t,synchronizationSourcesVideo:s.video}),audio:Et({audioReceiverStats:n,synchronizationSourcesAudio:s.audio}),additional:Ee(n??e??t)}),Rt=({audioSenderStats:n,videoSenderFirstStats:e,videoSenderSecondStats:t,audioReceiverStats:s,videoReceiverFirstStats:r,videoReceiverSecondStats:i,synchronizationSources:a})=>{const o=Nt({audioSenderStats:n,videoSenderFirstStats:e,videoSenderSecondStats:t}),c=At({audioReceiverStats:s,videoReceiverFirstStats:r,videoReceiverSecondStats:i,synchronizationSources:a});return{outbound:o,inbound:c}},It=async n=>{const e="audio",t="video",s=n.getSenders(),r=s.find(g=>g.track?.kind===e),i=s.filter(g=>g.track?.kind===t),a=n.getReceivers(),o=a.find(g=>g.track.kind===e),c=a.filter(g=>g.track.kind===t),d={trackIdentifier:o?.track.id,item:o?.getSynchronizationSources()[0]},u={trackIdentifier:c[0]?.track.id,item:c[0]?.getSynchronizationSources()[0]},T={audio:d,video:u};return Promise.all([r?.getStats(),i[0]?.getStats(),i[1]?.getStats(),o?.getStats(),c[0]?.getStats(),c[1]?.getStats()]).then(g=>{const[C,m,I,R,y,b]=g;return{synchronizationSources:T,audioSenderStats:C,videoSenderFirstStats:m,videoSenderSecondStats:I,audioReceiverStats:R,videoReceiverFirstStats:y,videoReceiverSecondStats:b}})},_t=n=>{E(String(n))};class Ne{events;setTimeoutRequest;requesterAllStatistics=new me.CancelableRequest(It);constructor(){this.events=new v.TypedEvents(Ce),this.setTimeoutRequest=new ne.SetTimeoutRequest}get requested(){return this.setTimeoutRequest.requested}start(e,{interval:t=U,onError:s=_t}={}){this.stop(),this.setTimeoutRequest.request(()=>{this.collectStatistics(e,{onError:s})},t)}stop(){this.setTimeoutRequest.cancelRequest(),this.requesterAllStatistics.cancelRequest()}on(e,t){return this.events.on(e,t)}once(e,t){return this.events.once(e,t)}onceRace(e,t){return this.events.onceRace(e,t)}async wait(e){return this.events.wait(e)}off(e,t){this.events.off(e,t)}collectStatistics=(e,{onError:t})=>{const s=J();this.requesterAllStatistics.request(e).then(r=>{this.events.trigger("collected",Rt(r));const a=J()-s;let o=U;a>48?o=U*4:a>32?o=U*3:a>16&&(o=U*2),this.start(e,{onError:t,interval:o})}).catch(r=>{t&&t(r)})}}class Mt{availableIncomingBitrate;statsPeerConnection;callManager;apiManager;previousAvailableIncomingBitrate;constructor({callManager:e,apiManager:t}){this.callManager=e,this.apiManager=t,this.statsPeerConnection=new Ne,this.subscribe()}get events(){return this.statsPeerConnection.events}on(e,t){return this.statsPeerConnection.on(e,t)}once(e,t){return this.statsPeerConnection.once(e,t)}onceRace(e,t){return this.statsPeerConnection.onceRace(e,t)}async wait(e){return this.statsPeerConnection.wait(e)}off(e,t){this.statsPeerConnection.off(e,t)}hasAvailableIncomingBitrateChangedQuarter(){const e=this.previousAvailableIncomingBitrate,t=this.availableIncomingBitrate;return e===void 0||t===void 0?!1:e===0?t>0:Math.abs(t-e)/e>=.25}subscribe(){this.callManager.on("peerconnection:confirmed",this.handleStarted),this.callManager.on("failed",this.handleEnded),this.callManager.on("ended",this.handleEnded),this.statsPeerConnection.on("collected",this.handleStatsCollected)}handleStatsCollected=e=>{this.previousAvailableIncomingBitrate=this.availableIncomingBitrate,this.availableIncomingBitrate=e.inbound.additional.candidatePair?.availableIncomingBitrate,this.maybeSendStats()};handleStarted=e=>{this.statsPeerConnection.start(e)};handleEnded=()=>{this.statsPeerConnection.stop(),this.availableIncomingBitrate=void 0,this.previousAvailableIncomingBitrate=void 0};maybeSendStats(){this.availableIncomingBitrate!==void 0&&this.hasAvailableIncomingBitrateChangedQuarter()&&this.apiManager.sendStats({availableIncomingBitrate:this.availableIncomingBitrate}).catch(e=>{E("Failed to send stats",e)})}}const mt=(n,e)=>n.filter(s=>e.some(r=>r.clockRate===s.clockRate&&r.mimeType===s.mimeType&&r.channels===s.channels&&r.sdpFmtpLine===s.sdpFmtpLine)),pt=n=>{const e=RTCRtpSender.getCapabilities(n),t=RTCRtpReceiver.getCapabilities(n),s=e===null?[]:e.codecs,r=t===null?[]:t.codecs;return mt(s,r)},Pt=(n,e)=>e===void 0||e.length===0?n:n.sort((t,s)=>{const r=e.indexOf(t.mimeType),i=e.indexOf(s.mimeType),a=r===-1?Number.MAX_VALUE:r,o=i===-1?Number.MAX_VALUE:i;return a-o}),Ot=(n,e)=>e===void 0||e.length===0?n:n.filter(t=>!e.includes(t.mimeType)),ft=(n,{preferredMimeTypesVideoCodecs:e,excludeMimeTypesVideoCodecs:t})=>{try{if(typeof n.setCodecPreferences=="function"&&n.sender.track?.kind==="video"&&(e!==void 0&&e.length>0||t!==void 0&&t.length>0)){const s=pt("video"),r=Ot(s,t),i=Pt(r,e);n.setCodecPreferences(i)}}catch(s){E("setCodecPreferences error",s)}},vt=n=>[...n.keys()].map(e=>n.get(e)),Dt=(n,e)=>vt(n).find(t=>t?.type===e),Ae=async n=>n.getStats().then(e=>Dt(e,"codec")?.mimeType);class yt{async getCodecFromSender(e){return await Ae(e)??""}}class bt{stackPromises=te.createStackPromises({noRunIsNotActual:!0});async add(e){return this.stackPromises.add(e),this.run()}stop(){this.stackPromises.stop()}async run(){return this.stackPromises().catch(e=>{E("TaskQueue: error",e)})}}class Ut{taskQueue;onSetParameters;constructor(e){this.onSetParameters=e,this.taskQueue=new bt}async setEncodingsToSender(e,t){return this.taskQueue.add(async()=>z(e,t,this.onSetParameters))}stop(){this.taskQueue.stop()}}const Re=(n,e)=>n!==void 0&&e!==void 0&&n.toLowerCase().includes(e.toLowerCase()),wt=1e6,p=n=>n*wt,Ie=p(.06),_e=p(4),Lt=n=>n<=64?Ie:n<=128?p(.12):n<=256?p(.25):n<=384?p(.32):n<=426?p(.38):n<=640?p(.5):n<=848?p(.7):n<=1280?p(1):n<=1920?p(2):_e,Bt="av1",kt=n=>Re(n,Bt),Ft=.6,X=(n,e)=>kt(e)?n*Ft:n,$t=n=>X(Ie,n),Vt=n=>X(_e,n),Z=(n,e)=>{const t=Lt(n);return X(t,e)},V=1,Wt=({videoTrack:n,targetSize:e})=>{const t=n.getSettings(),s=t.width,r=t.height,i=s===void 0?V:s/e.width,a=r===void 0?V:r/e.height;return Math.max(i,a,V)};class Ht{ignoreForCodec;senderFinder;codecProvider;parametersSetter;resultNoChanged={isChanged:!1,parameters:{encodings:[{}],transactionId:"0",codecs:[],headerExtensions:[],rtcp:{}}};constructor({senderFinder:e,codecProvider:t,parametersSetter:s},r){this.senderFinder=e,this.codecProvider=t,this.parametersSetter=s,this.ignoreForCodec=r.ignoreForCodec}async balance(e,t){const s=e.getSenders(),r=this.senderFinder.findVideoSender(s);if(!r?.track)return{...this.resultNoChanged,sender:r};const i=await this.codecProvider.getCodecFromSender(r);if(Re(i,this.ignoreForCodec))return{...this.resultNoChanged,sender:r};const{mainCam:a,resolutionMainCam:o}=t??{};return this.processSender({mainCam:a,resolutionMainCam:o},{sender:r,codec:i,videoTrack:r.track}).then(c=>({...c,sender:r}))}async processSender(e,t){const{mainCam:s,resolutionMainCam:r}=e;switch(s){case P.PAUSE_MAIN_CAM:return this.downgradeResolutionSender(t);case P.RESUME_MAIN_CAM:return this.setBitrateByTrackResolution(t);case P.MAX_MAIN_CAM_RESOLUTION:return r!==void 0?this.setResolutionSender(r,t):this.setBitrateByTrackResolution(t);case P.ADMIN_STOP_MAIN_CAM:case P.ADMIN_START_MAIN_CAM:case void 0:return this.setBitrateByTrackResolution(t);default:return this.setBitrateByTrackResolution(t)}}async downgradeResolutionSender(e){const{sender:t,codec:s}=e,r={scaleResolutionDownBy:200,maxBitrate:$t(s)};return this.parametersSetter.setEncodingsToSender(t,r)}async setBitrateByTrackResolution(e){const{sender:t,videoTrack:s,codec:r}=e,a=s.getSettings().width,o=a===void 0?Vt(r):Z(a,r);return this.parametersSetter.setEncodingsToSender(t,{scaleResolutionDownBy:1,maxBitrate:o})}async setResolutionSender(e,t){const[s,r]=e.split("x"),{sender:i,videoTrack:a,codec:o}=t,c={width:Number(s),height:Number(r)},d=Wt({videoTrack:a,targetSize:c}),u=Z(c.width,o),T={scaleResolutionDownBy:d,maxBitrate:u};return this.parametersSetter.setEncodingsToSender(i,T)}}const xt=n=>n.find(e=>e.track?.kind==="video");class qt{findVideoSender(e){return xt(e)}}class Gt{currentSender;originalReplaceTrack;lastWidth;lastHeight;maxPollIntervalMs;currentPollIntervalMs;pollIntervalMs;setTimeoutRequest;constructor({pollIntervalMs:e=1e3,maxPollIntervalMs:t}){this.pollIntervalMs=e,this.maxPollIntervalMs=t??e*16,this.currentPollIntervalMs=this.pollIntervalMs,this.setTimeoutRequest=new ne.SetTimeoutRequest}subscribe(e,t){if(!e){this.detachSender();return}this.currentSender!==e&&(this.detachSender(),this.attachSender(e,t))}unsubscribe(){this.detachSender()}attachSender(e,t){this.currentSender=e;const s=e.replaceTrack.bind(e);this.originalReplaceTrack=s,e.replaceTrack=async r=>{await s(r),this.attachTrack(t,r??void 0),t()},this.attachTrack(t,e.track)}detachSender(){this.currentSender&&this.originalReplaceTrack&&(this.currentSender.replaceTrack=this.originalReplaceTrack),this.originalReplaceTrack=void 0,this.currentSender=void 0,this.detachTrack()}attachTrack(e,t){if(this.detachTrack(),!t)return;const{width:s,height:r}=t.getSettings();this.lastWidth=s,this.lastHeight=r,this.currentPollIntervalMs=this.pollIntervalMs,this.schedulePoll(t,e)}schedulePoll(e,t){const s=()=>{const{width:r,height:i}=e.getSettings();r!==this.lastWidth||i!==this.lastHeight?(this.lastWidth=r,this.lastHeight=i,this.currentPollIntervalMs=this.pollIntervalMs,t()):this.currentPollIntervalMs=Math.min(this.currentPollIntervalMs*2,this.maxPollIntervalMs),this.setTimeoutRequest.request(s,this.currentPollIntervalMs)};this.setTimeoutRequest.request(s,this.currentPollIntervalMs)}detachTrack(){this.setTimeoutRequest.cancelRequest(),this.lastWidth=void 0,this.lastHeight=void 0}}class Qt{apiManager;currentHandler;constructor(e){this.apiManager=e}subscribe(e){this.currentHandler=e,this.apiManager.on("main-cam-control",e)}unsubscribe(){this.currentHandler&&(this.apiManager.off("main-cam-control",this.currentHandler),this.currentHandler=void 0)}}class Yt{eventHandler;senderBalancer;parametersSetterWithQueue;getConnection;serverHeaders;trackMonitor;constructor(e,t,{ignoreForCodec:s,onSetParameters:r,pollIntervalMs:i}={}){this.getConnection=t,this.eventHandler=new Qt(e),this.parametersSetterWithQueue=new Ut(r),this.senderBalancer=new Ht({senderFinder:new qt,codecProvider:new yt,parametersSetter:this.parametersSetterWithQueue},{ignoreForCodec:s}),this.trackMonitor=new Gt({pollIntervalMs:i})}subscribe(){this.eventHandler.subscribe(this.handleMainCamControl)}unsubscribe(){this.eventHandler.unsubscribe(),this.parametersSetterWithQueue.stop(),this.reset()}reset(){delete this.serverHeaders,this.trackMonitor.unsubscribe()}async balance(){const e=this.getConnection();if(!e)throw new Error("connection is not exist");const t=await this.senderBalancer.balance(e,this.serverHeaders);return this.trackMonitor.subscribe(t.sender,()=>{this.balance().catch(s=>{E("balance on track change: error",s)})}),t}handleMainCamControl=e=>{this.serverHeaders=e,this.balance().catch(t=>{E("handleMainCamControl: error",t)})}}const Me=["balancing-scheduled","balancing-started","balancing-stopped","parameters-updated"];class zt{isBalancingActive=!1;events;callManager;balancingStartDelay;videoSendingBalancer;startBalancingTimer;constructor(e,t,s={}){this.events=new v.TypedEvents(Me),this.callManager=e,this.balancingStartDelay=s.balancingStartDelay??1e4,this.videoSendingBalancer=new Yt(t,()=>e.connection,{...s,onSetParameters:r=>{this.events.trigger("parameters-updated",r),s.onSetParameters?.(r)}}),this.subscribe()}get isBalancingScheduled(){return this.startBalancingTimer!==void 0}async startBalancing(){this.isBalancingActive||(this.clearStartTimer(),await this.videoSendingBalancer.balance(),this.videoSendingBalancer.subscribe(),this.isBalancingActive=!0,this.events.trigger("balancing-started",{delay:this.balancingStartDelay}))}stopBalancing(){this.clearStartTimer(),this.videoSendingBalancer.unsubscribe(),this.isBalancingActive=!1,this.events.trigger("balancing-stopped",{})}async balance(){return this.videoSendingBalancer.balance()}on(e,t){return this.events.on(e,t)}once(e,t){return this.events.once(e,t)}onceRace(e,t){return this.events.onceRace(e,t)}async wait(e){return this.events.wait(e)}off(e,t){this.events.off(e,t)}subscribe(){this.callManager.on("peerconnection:confirmed",this.handleCallStarted),this.callManager.on("ended",this.handleCallEnded),this.callManager.on("failed",this.handleCallEnded)}handleCallStarted=()=>{this.scheduleBalancingStart()};handleCallEnded=()=>{this.stopBalancing()};scheduleBalancingStart(){this.clearStartTimer(),this.startBalancingTimer=setTimeout(()=>{this.startBalancingTimer=void 0,this.startBalancing().catch(e=>{E("startBalancing: error",e)})},this.balancingStartDelay),this.events.trigger("balancing-scheduled",{delay:this.balancingStartDelay})}clearStartTimer(){this.startBalancingTimer&&(clearTimeout(this.startBalancingTimer),this.startBalancingTimer=void 0)}}const Xt=1e6,Jt=ue.map(n=>`connection:${n}`),Kt=re.map(n=>`call:${n}`),jt=oe.map(n=>`api:${n}`),Zt=Se.map(n=>`incoming-call:${n}`),en=ge.map(n=>`presentation:${n}`),tn=Ce.map(n=>`stats:${n}`),nn=Me.map(n=>`video-balancer:${n}`),sn=[...Jt,...Kt,...jt,...Zt,...en,...tn,...nn];class rn{events;connectionManager;connectionQueueManager;callManager;apiManager;incomingCallManager;presentationManager;statsManager;videoSendingBalancerManager;preferredMimeTypesVideoCodecs;excludeMimeTypesVideoCodecs;constructor({JsSIP:e},{preferredMimeTypesVideoCodecs:t,excludeMimeTypesVideoCodecs:s,videoBalancerOptions:r}={}){this.preferredMimeTypesVideoCodecs=t,this.excludeMimeTypesVideoCodecs=s,this.events=new v.Events(sn),this.connectionManager=new gt({JsSIP:e}),this.connectionQueueManager=new lt({connectionManager:this.connectionManager}),this.callManager=new we,this.apiManager=new We({connectionManager:this.connectionManager,callManager:this.callManager}),this.incomingCallManager=new St(this.connectionManager),this.presentationManager=new nt({callManager:this.callManager,maxBitrate:Xt}),this.statsManager=new Mt({callManager:this.callManager,apiManager:this.apiManager}),this.videoSendingBalancerManager=new zt(this.callManager,this.apiManager,r),this.subscribe()}get requestedConnection(){return this.connectionManager.requested}get isPendingConnect(){return this.connectionManager.isPendingConnect}get isPendingInitUa(){return this.connectionManager.isPendingInitUa}get connectionState(){return this.connectionManager.connectionState}get isRegistered(){return this.connectionManager.isRegistered}get isRegisterConfig(){return this.connectionManager.isRegisterConfig}get socket(){return this.connectionManager.socket}get requestedCall(){return this.callManager.requested}get connection(){return this.callManager.connection}get establishedRTCSession(){return this.callManager.establishedRTCSession}get isCallActive(){return this.callManager.isCallActive}get remoteCallerData(){return this.incomingCallManager.remoteCallerData}get isAvailableIncomingCall(){return this.incomingCallManager.isAvailableIncomingCall}on(e,t){return this.events.on(e,t)}once(e,t){return this.events.once(e,t)}onceRace(e,t){return this.events.onceRace(e,t)}async wait(e){return this.events.wait(e)}off(e,t){this.events.off(e,t)}connect=async(...e)=>this.connectionQueueManager.connect(...e);set=async(...e)=>this.connectionQueueManager.set(...e);disconnect=async()=>this.connectionQueueManager.disconnect();register=async()=>this.connectionQueueManager.register();unregister=async()=>this.connectionQueueManager.unregister();tryRegister=async()=>this.connectionQueueManager.tryRegister();sendOptions=async(e,t,s)=>this.connectionQueueManager.sendOptions(e,t,s);ping=async(e,t)=>this.connectionQueueManager.ping(e,t);checkTelephony=async e=>this.connectionQueueManager.checkTelephony(e);isConfigured=()=>this.connectionManager.isConfigured();getConnectionConfiguration=()=>this.connectionManager.getConnectionConfiguration();getSipServerUrl=e=>this.connectionManager.getSipServerUrl(e);call=async e=>{const{onAddedTransceiver:t,...s}=e;return this.callManager.startCall(this.connectionManager.getUaProtected(),this.getSipServerUrl,{...s,onAddedTransceiver:async(r,i,a)=>{this.setCodecPreferences(r),await t?.(r,i,a)}})};hangUp=async()=>this.callManager.endCall();answerToIncomingCall=async e=>{const{onAddedTransceiver:t,...s}=e;return this.callManager.answerToIncomingCall(this.incomingCallManager.extractIncomingRTCSession,{...s,onAddedTransceiver:async(r,i,a)=>{this.setCodecPreferences(r),await t?.(r,i,a)}})};declineToIncomingCall=async(...e)=>this.incomingCallManager.declineToIncomingCall(...e);getEstablishedRTCSession=()=>this.callManager.getEstablishedRTCSession();getCallConfiguration=()=>this.callManager.getCallConfiguration();getRemoteStreams=()=>this.callManager.getRemoteStreams();replaceMediaStream=async(...e)=>this.callManager.replaceMediaStream(...e);async startPresentation(e,t={}){const{isP2P:s,callLimit:r,onAddedTransceiver:i,...a}=t;return this.presentationManager.startPresentation(async()=>{s===!0?(await this.apiManager.sendMustStopPresentationP2P(),await this.apiManager.askPermissionToStartPresentationP2P()):await this.apiManager.askPermissionToStartPresentation()},e,{...a,onAddedTransceiver:async(o,c,d)=>{this.setCodecPreferences(o),await i?.(o,c,d)}},r===void 0?void 0:{callLimit:r})}async stopPresentation(e={}){const{isP2P:t}=e;return this.presentationManager.stopPresentation(async()=>{await(t===!0?this.apiManager.sendMustStopPresentationP2P():this.apiManager.sendStoppedPresentation())})}async updatePresentation(e,t={}){const{isP2P:s,onAddedTransceiver:r,...i}=t;return this.presentationManager.updatePresentation(async()=>{s===!0?(await this.apiManager.sendMustStopPresentationP2P(),await this.apiManager.askPermissionToStartPresentationP2P()):await this.apiManager.askPermissionToStartPresentation()},e,{...i,onAddedTransceiver:async(a,o,c)=>{this.setCodecPreferences(a),await r?.(a,o,c)}})}async waitChannels(...e){return this.apiManager.waitChannels(...e)}async waitSyncMediaState(...e){return this.apiManager.waitSyncMediaState(...e)}async sendDTMF(...e){return this.apiManager.sendDTMF(...e)}async sendChannels(...e){return this.apiManager.sendChannels(...e)}async sendMediaState(...e){return this.apiManager.sendMediaState(...e)}async sendRefusalToTurnOn(...e){return this.apiManager.sendRefusalToTurnOn(...e)}async sendRefusalToTurnOnMic(...e){return this.apiManager.sendRefusalToTurnOnMic(...e)}async sendRefusalToTurnOnCam(...e){return this.apiManager.sendRefusalToTurnOnCam(...e)}async sendMustStopPresentationP2P(...e){return this.apiManager.sendMustStopPresentationP2P(...e)}async sendStoppedPresentationP2P(...e){return this.apiManager.sendStoppedPresentationP2P(...e)}async sendStoppedPresentation(...e){return this.apiManager.sendStoppedPresentation(...e)}async askPermissionToStartPresentationP2P(...e){return this.apiManager.askPermissionToStartPresentationP2P(...e)}async askPermissionToStartPresentation(...e){return this.apiManager.askPermissionToStartPresentation(...e)}async askPermissionToEnableCam(...e){return this.apiManager.askPermissionToEnableCam(...e)}setCodecPreferences(e){ft(e,{preferredMimeTypesVideoCodecs:this.preferredMimeTypesVideoCodecs,excludeMimeTypesVideoCodecs:this.excludeMimeTypesVideoCodecs})}subscribe(){this.connectionManager.events.eachTriggers((e,t)=>{this.connectionManager.on(t,s=>{this.events.trigger(`connection:${t}`,s)})}),this.callManager.events.eachTriggers((e,t)=>{this.callManager.on(t,s=>{this.events.trigger(`call:${t}`,s)})}),this.apiManager.events.eachTriggers((e,t)=>{this.apiManager.on(t,s=>{this.events.trigger(`api:${t}`,s)})}),this.incomingCallManager.events.eachTriggers((e,t)=>{this.incomingCallManager.on(t,s=>{this.events.trigger(`incoming-call:${t}`,s)})}),this.presentationManager.events.eachTriggers((e,t)=>{this.presentationManager.on(t,s=>{this.events.trigger(`presentation:${t}`,s)})}),this.statsManager.events.eachTriggers((e,t)=>{this.statsManager.on(t,s=>{this.events.trigger(`stats:${t}`,s)})}),this.videoSendingBalancerManager.events.eachTriggers((e,t)=>{this.videoSendingBalancerManager.on(t,s=>{this.events.trigger(`video-balancer:${t}`,s)})}),this.apiManager.on("restart",this.handleRestart)}handleRestart=()=>{this.callManager.restartIce().catch(e=>{E("Failed to restart ICE",e)})}}exports.ECallCause=Q;exports.EStatsTypes=S;exports.EUseLicense=ae;exports.Originator=B;exports.SipConnector=rn;exports.StatsPeerConnection=Ne;exports.disableDebug=Be;exports.enableDebug=Le;exports.getCodecFromSender=Ae;exports.hasCanceledStartPresentationError=tt;exports.logger=E;exports.prepareMediaStream=L;exports.setEncodingsToSender=z;exports.setParametersToSender=he;