@wazo/sdk 0.37.30 → 0.37.34

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 (80) hide show
  1. package/dist/wazo-sdk.js +4 -4
  2. package/esm/__tests__/api-client.test.js +30 -0
  3. package/esm/__tests__/web-rtc-client.test.js +57 -6
  4. package/esm/api/calld.js +30 -0
  5. package/esm/api-client.js +30 -0
  6. package/esm/checker/Checker.js +57 -6
  7. package/esm/checker/checks/aor.js +30 -0
  8. package/esm/checker/checks/api.js +30 -0
  9. package/esm/checker/checks/index.js +57 -6
  10. package/esm/checker/checks/webrtc-transport.js +57 -6
  11. package/esm/checker/checks/webrtc.js +57 -6
  12. package/esm/domain/AdHocAPIConference.js +30 -0
  13. package/esm/domain/CallSession.js +9 -1
  14. package/esm/domain/Features.js +30 -0
  15. package/esm/domain/MeetingStatus.js +29 -0
  16. package/esm/domain/Phone/CTIPhone.js +39 -1
  17. package/esm/domain/Phone/WebRTCPhone.js +43 -8
  18. package/esm/domain/__tests__/CallSession.test.js +41 -5
  19. package/esm/domain/__tests__/IndirectTransfer.test.js +9 -1
  20. package/esm/domain/__tests__/Room.test.js +9 -1
  21. package/esm/index.js +100 -14
  22. package/esm/service/CallApi.js +30 -0
  23. package/esm/service/getApiClient.js +30 -0
  24. package/esm/simple/Auth.js +100 -14
  25. package/esm/simple/Configuration.js +100 -14
  26. package/esm/simple/Directory.js +30 -0
  27. package/esm/simple/Phone.js +100 -14
  28. package/esm/simple/index.js +100 -14
  29. package/esm/simple/room/LocalParticipant.js +100 -14
  30. package/esm/simple/room/Participant.js +100 -14
  31. package/esm/simple/room/RemoteParticipant.js +100 -14
  32. package/esm/simple/room/Room.js +100 -14
  33. package/esm/simple/room/SipRoom.js +100 -14
  34. package/esm/simple/room/Stream.js +100 -14
  35. package/esm/simple/room/__tests__/RemoteParticipant.test.js +100 -14
  36. package/esm/simple/utils.js +100 -14
  37. package/esm/web-rtc-client.js +57 -6
  38. package/lib/__tests__/api-client.test.js +30 -0
  39. package/lib/__tests__/web-rtc-client.test.js +57 -6
  40. package/lib/api/calld.js +30 -0
  41. package/lib/api-client.js +30 -0
  42. package/lib/checker/Checker.js +57 -6
  43. package/lib/checker/checks/aor.js +30 -0
  44. package/lib/checker/checks/api.js +30 -0
  45. package/lib/checker/checks/index.js +57 -6
  46. package/lib/checker/checks/webrtc-transport.js +57 -6
  47. package/lib/checker/checks/webrtc.js +57 -6
  48. package/lib/domain/AdHocAPIConference.js +30 -0
  49. package/lib/domain/CallSession.js +9 -1
  50. package/lib/domain/Features.js +30 -0
  51. package/lib/domain/MeetingStatus.js +31 -0
  52. package/lib/domain/Phone/CTIPhone.js +39 -1
  53. package/lib/domain/Phone/WebRTCPhone.js +43 -8
  54. package/lib/domain/__tests__/CallSession.test.js +41 -5
  55. package/lib/domain/__tests__/IndirectTransfer.test.js +9 -1
  56. package/lib/domain/__tests__/Room.test.js +9 -1
  57. package/lib/index.js +100 -14
  58. package/lib/service/CallApi.js +30 -0
  59. package/lib/service/getApiClient.js +30 -0
  60. package/lib/simple/Auth.js +100 -14
  61. package/lib/simple/Configuration.js +100 -14
  62. package/lib/simple/Directory.js +30 -0
  63. package/lib/simple/Phone.js +100 -14
  64. package/lib/simple/index.js +100 -14
  65. package/lib/simple/room/LocalParticipant.js +100 -14
  66. package/lib/simple/room/Participant.js +100 -14
  67. package/lib/simple/room/RemoteParticipant.js +100 -14
  68. package/lib/simple/room/Room.js +100 -14
  69. package/lib/simple/room/SipRoom.js +100 -14
  70. package/lib/simple/room/Stream.js +100 -14
  71. package/lib/simple/room/__tests__/RemoteParticipant.test.js +100 -14
  72. package/lib/simple/utils.js +100 -14
  73. package/lib/web-rtc-client.js +57 -6
  74. package/package.json +1 -1
  75. package/src/api/calld.js +3 -0
  76. package/src/domain/CallSession.js +9 -1
  77. package/src/domain/MeetingStatus.js +27 -0
  78. package/src/domain/Phone/WebRTCPhone.js +34 -7
  79. package/src/domain/__tests__/CallSession.test.js +32 -4
  80. package/src/web-rtc-client.js +27 -6
@@ -4085,6 +4085,34 @@ var chatdMethods = (client , baseUrl ) => ({
4085
4085
  client.get(`${baseUrl}/users/me/rooms/messages`, options),
4086
4086
  });
4087
4087
 
4088
+ //
4089
+
4090
+
4091
+
4092
+
4093
+
4094
+ class MeetingStatus {
4095
+
4096
+
4097
+
4098
+
4099
+ constructor({
4100
+ full,
4101
+ } = {}) {
4102
+ this.full = full;
4103
+
4104
+ // Useful to compare instead of instanceof with minified code
4105
+ this.type = 'MeetingStatus';
4106
+ }
4107
+
4108
+ static parse(plain ) {
4109
+ return new MeetingStatus({
4110
+ full: plain.full,
4111
+ });
4112
+ }
4113
+
4114
+ }
4115
+
4088
4116
  /* */
4089
4117
 
4090
4118
 
@@ -4279,6 +4307,8 @@ var calldMethods = (client , baseUrl ) => ({
4279
4307
  client.put(`${baseUrl}/users/me/calls/${callId}/record/resume`, null, null,
4280
4308
  ApiRequester.successResponseParser),
4281
4309
 
4310
+ guestGetMeetingStatus: (meetingUuid ) =>
4311
+ client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}/status`).then(MeetingStatus.parse),
4282
4312
  });
4283
4313
 
4284
4314
  //
@@ -5927,7 +5957,7 @@ const ON_NETWORK_STATS = 'onNetworkStats';
5927
5957
  const ON_DISCONNECTED = 'onDisconnected';
5928
5958
  class CanceledCallError extends Error {}
5929
5959
 
5930
- const MAX_REGISTER_TRIES = 10;
5960
+ const MAX_REGISTER_TRIES = 5;
5931
5961
 
5932
5962
 
5933
5963
 
@@ -5981,6 +6011,7 @@ class WebRTCClient extends Emitter {
5981
6011
 
5982
6012
 
5983
6013
 
6014
+
5984
6015
 
5985
6016
  // sugar
5986
6017
 
@@ -6043,6 +6074,7 @@ class WebRTCClient extends Emitter {
6043
6074
  this.conferences = {};
6044
6075
  this.networkMonitoringInterval = {};
6045
6076
  this.sessionNetworkStats = {};
6077
+ this.forceClosed = false;
6046
6078
 
6047
6079
  this._boundOnHeartbeat = this._onHeartbeat.bind(this);
6048
6080
  this.heartbeat = new Heartbeat(config.heartbeatDelay, config.heartbeatTimeout, config.maxHeartbeats);
@@ -6164,6 +6196,8 @@ class WebRTCClient extends Emitter {
6164
6196
  skipRegister: this.skipRegister,
6165
6197
  };
6166
6198
 
6199
+ this.forceClosed = false;
6200
+
6167
6201
  if (this.skipRegister) {
6168
6202
  logger$1.info('sdk webrtc skip register...', logInfo);
6169
6203
  return Promise.resolve();
@@ -6188,7 +6222,15 @@ class WebRTCClient extends Emitter {
6188
6222
  const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
6189
6223
 
6190
6224
  const onRegisterFailed = () => {
6191
- logger$1.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
6225
+ logger$1.info('sdk webrtc registering failed', {
6226
+ tries,
6227
+ registerer: !!this.registerer,
6228
+ forceClosed: this.forceClosed,
6229
+ });
6230
+ if (this.forceClosed) {
6231
+ return;
6232
+ }
6233
+
6192
6234
  this.connectionPromise = null;
6193
6235
  if (this.registerer && this.registerer.waiting) {
6194
6236
  this.registerer.waitingToggle(false);
@@ -6466,8 +6508,9 @@ class WebRTCClient extends Emitter {
6466
6508
  }
6467
6509
  }
6468
6510
 
6469
- async close() {
6470
- logger$1.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
6511
+ async close(force = false) {
6512
+ logger$1.info('sdk webrtc closing client', { userAgent: !!this.userAgent, force });
6513
+ this.forceClosed = force;
6471
6514
  this._cleanupMedia();
6472
6515
  this.connectionPromise = null;
6473
6516
 
@@ -6486,7 +6529,7 @@ class WebRTCClient extends Emitter {
6486
6529
  this.userAgent.delegate = null;
6487
6530
  this.userAgent.stateChange.removeAllListeners();
6488
6531
 
6489
- await this._disconnectTransport();
6532
+ await this._disconnectTransport(force);
6490
6533
 
6491
6534
  this._cleanupRegister();
6492
6535
 
@@ -7922,7 +7965,15 @@ class WebRTCClient extends Emitter {
7922
7965
  return userAgent.UserAgent.makeURI(`sip:${target}@${this.config.host}`);
7923
7966
  }
7924
7967
 
7925
- async _disconnectTransport() {
7968
+ async _disconnectTransport(force = false) {
7969
+ if (force) {
7970
+ // Bypass sip.js state machine that prevent to close WS with the state `Connecting`
7971
+ this.userAgent.transport.disconnectResolve = () => {};
7972
+ // eslint-disable-next-line
7973
+ this.userAgent.transport._ws.close(1000);
7974
+ return;
7975
+ }
7976
+
7926
7977
  // Check if `disconnectPromise` is not present to avoid `Disconnect promise must not be defined` errors.
7927
7978
  if (this.userAgent && this.userAgent.transport && !this.userAgent.transport.disconnectPromise) {
7928
7979
  try {
@@ -4037,6 +4037,34 @@ var chatdMethods = (client , baseUrl ) => ({
4037
4037
  client.get(`${baseUrl}/users/me/rooms/messages`, options),
4038
4038
  });
4039
4039
 
4040
+ //
4041
+
4042
+
4043
+
4044
+
4045
+
4046
+ class MeetingStatus {
4047
+
4048
+
4049
+
4050
+
4051
+ constructor({
4052
+ full,
4053
+ } = {}) {
4054
+ this.full = full;
4055
+
4056
+ // Useful to compare instead of instanceof with minified code
4057
+ this.type = 'MeetingStatus';
4058
+ }
4059
+
4060
+ static parse(plain ) {
4061
+ return new MeetingStatus({
4062
+ full: plain.full,
4063
+ });
4064
+ }
4065
+
4066
+ }
4067
+
4040
4068
  /* */
4041
4069
 
4042
4070
 
@@ -4231,6 +4259,8 @@ var calldMethods = (client , baseUrl ) => ({
4231
4259
  client.put(`${baseUrl}/users/me/calls/${callId}/record/resume`, null, null,
4232
4260
  ApiRequester.successResponseParser),
4233
4261
 
4262
+ guestGetMeetingStatus: (meetingUuid ) =>
4263
+ client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}/status`).then(MeetingStatus.parse),
4234
4264
  });
4235
4265
 
4236
4266
  //
@@ -4037,6 +4037,34 @@ var chatdMethods = (client , baseUrl ) => ({
4037
4037
  client.get(`${baseUrl}/users/me/rooms/messages`, options),
4038
4038
  });
4039
4039
 
4040
+ //
4041
+
4042
+
4043
+
4044
+
4045
+
4046
+ class MeetingStatus {
4047
+
4048
+
4049
+
4050
+
4051
+ constructor({
4052
+ full,
4053
+ } = {}) {
4054
+ this.full = full;
4055
+
4056
+ // Useful to compare instead of instanceof with minified code
4057
+ this.type = 'MeetingStatus';
4058
+ }
4059
+
4060
+ static parse(plain ) {
4061
+ return new MeetingStatus({
4062
+ full: plain.full,
4063
+ });
4064
+ }
4065
+
4066
+ }
4067
+
4040
4068
  /* */
4041
4069
 
4042
4070
 
@@ -4231,6 +4259,8 @@ var calldMethods = (client , baseUrl ) => ({
4231
4259
  client.put(`${baseUrl}/users/me/calls/${callId}/record/resume`, null, null,
4232
4260
  ApiRequester.successResponseParser),
4233
4261
 
4262
+ guestGetMeetingStatus: (meetingUuid ) =>
4263
+ client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}/status`).then(MeetingStatus.parse),
4234
4264
  });
4235
4265
 
4236
4266
  //
@@ -4085,6 +4085,34 @@ var chatdMethods = (client , baseUrl ) => ({
4085
4085
  client.get(`${baseUrl}/users/me/rooms/messages`, options),
4086
4086
  });
4087
4087
 
4088
+ //
4089
+
4090
+
4091
+
4092
+
4093
+
4094
+ class MeetingStatus {
4095
+
4096
+
4097
+
4098
+
4099
+ constructor({
4100
+ full,
4101
+ } = {}) {
4102
+ this.full = full;
4103
+
4104
+ // Useful to compare instead of instanceof with minified code
4105
+ this.type = 'MeetingStatus';
4106
+ }
4107
+
4108
+ static parse(plain ) {
4109
+ return new MeetingStatus({
4110
+ full: plain.full,
4111
+ });
4112
+ }
4113
+
4114
+ }
4115
+
4088
4116
  /* */
4089
4117
 
4090
4118
 
@@ -4279,6 +4307,8 @@ var calldMethods = (client , baseUrl ) => ({
4279
4307
  client.put(`${baseUrl}/users/me/calls/${callId}/record/resume`, null, null,
4280
4308
  ApiRequester.successResponseParser),
4281
4309
 
4310
+ guestGetMeetingStatus: (meetingUuid ) =>
4311
+ client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}/status`).then(MeetingStatus.parse),
4282
4312
  });
4283
4313
 
4284
4314
  //
@@ -5927,7 +5957,7 @@ const ON_NETWORK_STATS = 'onNetworkStats';
5927
5957
  const ON_DISCONNECTED = 'onDisconnected';
5928
5958
  class CanceledCallError extends Error {}
5929
5959
 
5930
- const MAX_REGISTER_TRIES = 10;
5960
+ const MAX_REGISTER_TRIES = 5;
5931
5961
 
5932
5962
 
5933
5963
 
@@ -5981,6 +6011,7 @@ class WebRTCClient extends Emitter {
5981
6011
 
5982
6012
 
5983
6013
 
6014
+
5984
6015
 
5985
6016
  // sugar
5986
6017
 
@@ -6043,6 +6074,7 @@ class WebRTCClient extends Emitter {
6043
6074
  this.conferences = {};
6044
6075
  this.networkMonitoringInterval = {};
6045
6076
  this.sessionNetworkStats = {};
6077
+ this.forceClosed = false;
6046
6078
 
6047
6079
  this._boundOnHeartbeat = this._onHeartbeat.bind(this);
6048
6080
  this.heartbeat = new Heartbeat(config.heartbeatDelay, config.heartbeatTimeout, config.maxHeartbeats);
@@ -6164,6 +6196,8 @@ class WebRTCClient extends Emitter {
6164
6196
  skipRegister: this.skipRegister,
6165
6197
  };
6166
6198
 
6199
+ this.forceClosed = false;
6200
+
6167
6201
  if (this.skipRegister) {
6168
6202
  logger.info('sdk webrtc skip register...', logInfo);
6169
6203
  return Promise.resolve();
@@ -6188,7 +6222,15 @@ class WebRTCClient extends Emitter {
6188
6222
  const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
6189
6223
 
6190
6224
  const onRegisterFailed = () => {
6191
- logger.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
6225
+ logger.info('sdk webrtc registering failed', {
6226
+ tries,
6227
+ registerer: !!this.registerer,
6228
+ forceClosed: this.forceClosed,
6229
+ });
6230
+ if (this.forceClosed) {
6231
+ return;
6232
+ }
6233
+
6192
6234
  this.connectionPromise = null;
6193
6235
  if (this.registerer && this.registerer.waiting) {
6194
6236
  this.registerer.waitingToggle(false);
@@ -6466,8 +6508,9 @@ class WebRTCClient extends Emitter {
6466
6508
  }
6467
6509
  }
6468
6510
 
6469
- async close() {
6470
- logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
6511
+ async close(force = false) {
6512
+ logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent, force });
6513
+ this.forceClosed = force;
6471
6514
  this._cleanupMedia();
6472
6515
  this.connectionPromise = null;
6473
6516
 
@@ -6486,7 +6529,7 @@ class WebRTCClient extends Emitter {
6486
6529
  this.userAgent.delegate = null;
6487
6530
  this.userAgent.stateChange.removeAllListeners();
6488
6531
 
6489
- await this._disconnectTransport();
6532
+ await this._disconnectTransport(force);
6490
6533
 
6491
6534
  this._cleanupRegister();
6492
6535
 
@@ -7922,7 +7965,15 @@ class WebRTCClient extends Emitter {
7922
7965
  return userAgent.UserAgent.makeURI(`sip:${target}@${this.config.host}`);
7923
7966
  }
7924
7967
 
7925
- async _disconnectTransport() {
7968
+ async _disconnectTransport(force = false) {
7969
+ if (force) {
7970
+ // Bypass sip.js state machine that prevent to close WS with the state `Connecting`
7971
+ this.userAgent.transport.disconnectResolve = () => {};
7972
+ // eslint-disable-next-line
7973
+ this.userAgent.transport._ws.close(1000);
7974
+ return;
7975
+ }
7976
+
7926
7977
  // Check if `disconnectPromise` is not present to avoid `Disconnect promise must not be defined` errors.
7927
7978
  if (this.userAgent && this.userAgent.transport && !this.userAgent.transport.disconnectPromise) {
7928
7979
  try {
@@ -4588,6 +4588,34 @@ var chatdMethods = (client , baseUrl ) => ({
4588
4588
  client.get(`${baseUrl}/users/me/rooms/messages`, options),
4589
4589
  });
4590
4590
 
4591
+ //
4592
+
4593
+
4594
+
4595
+
4596
+
4597
+ class MeetingStatus {
4598
+
4599
+
4600
+
4601
+
4602
+ constructor({
4603
+ full,
4604
+ } = {}) {
4605
+ this.full = full;
4606
+
4607
+ // Useful to compare instead of instanceof with minified code
4608
+ this.type = 'MeetingStatus';
4609
+ }
4610
+
4611
+ static parse(plain ) {
4612
+ return new MeetingStatus({
4613
+ full: plain.full,
4614
+ });
4615
+ }
4616
+
4617
+ }
4618
+
4591
4619
  /* */
4592
4620
 
4593
4621
 
@@ -4782,6 +4810,8 @@ var calldMethods = (client , baseUrl ) => ({
4782
4810
  client.put(`${baseUrl}/users/me/calls/${callId}/record/resume`, null, null,
4783
4811
  ApiRequester.successResponseParser),
4784
4812
 
4813
+ guestGetMeetingStatus: (meetingUuid ) =>
4814
+ client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}/status`).then(MeetingStatus.parse),
4785
4815
  });
4786
4816
 
4787
4817
  //
@@ -5341,7 +5371,7 @@ const ON_NETWORK_STATS = 'onNetworkStats';
5341
5371
  const ON_DISCONNECTED = 'onDisconnected';
5342
5372
  class CanceledCallError extends Error {}
5343
5373
 
5344
- const MAX_REGISTER_TRIES = 10;
5374
+ const MAX_REGISTER_TRIES = 5;
5345
5375
 
5346
5376
 
5347
5377
 
@@ -5395,6 +5425,7 @@ class WebRTCClient extends Emitter {
5395
5425
 
5396
5426
 
5397
5427
 
5428
+
5398
5429
 
5399
5430
  // sugar
5400
5431
 
@@ -5457,6 +5488,7 @@ class WebRTCClient extends Emitter {
5457
5488
  this.conferences = {};
5458
5489
  this.networkMonitoringInterval = {};
5459
5490
  this.sessionNetworkStats = {};
5491
+ this.forceClosed = false;
5460
5492
 
5461
5493
  this._boundOnHeartbeat = this._onHeartbeat.bind(this);
5462
5494
  this.heartbeat = new Heartbeat(config.heartbeatDelay, config.heartbeatTimeout, config.maxHeartbeats);
@@ -5578,6 +5610,8 @@ class WebRTCClient extends Emitter {
5578
5610
  skipRegister: this.skipRegister,
5579
5611
  };
5580
5612
 
5613
+ this.forceClosed = false;
5614
+
5581
5615
  if (this.skipRegister) {
5582
5616
  logger.info('sdk webrtc skip register...', logInfo);
5583
5617
  return Promise.resolve();
@@ -5602,7 +5636,15 @@ class WebRTCClient extends Emitter {
5602
5636
  const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
5603
5637
 
5604
5638
  const onRegisterFailed = () => {
5605
- logger.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
5639
+ logger.info('sdk webrtc registering failed', {
5640
+ tries,
5641
+ registerer: !!this.registerer,
5642
+ forceClosed: this.forceClosed,
5643
+ });
5644
+ if (this.forceClosed) {
5645
+ return;
5646
+ }
5647
+
5606
5648
  this.connectionPromise = null;
5607
5649
  if (this.registerer && this.registerer.waiting) {
5608
5650
  this.registerer.waitingToggle(false);
@@ -5880,8 +5922,9 @@ class WebRTCClient extends Emitter {
5880
5922
  }
5881
5923
  }
5882
5924
 
5883
- async close() {
5884
- logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
5925
+ async close(force = false) {
5926
+ logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent, force });
5927
+ this.forceClosed = force;
5885
5928
  this._cleanupMedia();
5886
5929
  this.connectionPromise = null;
5887
5930
 
@@ -5900,7 +5943,7 @@ class WebRTCClient extends Emitter {
5900
5943
  this.userAgent.delegate = null;
5901
5944
  this.userAgent.stateChange.removeAllListeners();
5902
5945
 
5903
- await this._disconnectTransport();
5946
+ await this._disconnectTransport(force);
5904
5947
 
5905
5948
  this._cleanupRegister();
5906
5949
 
@@ -7336,7 +7379,15 @@ class WebRTCClient extends Emitter {
7336
7379
  return userAgent.UserAgent.makeURI(`sip:${target}@${this.config.host}`);
7337
7380
  }
7338
7381
 
7339
- async _disconnectTransport() {
7382
+ async _disconnectTransport(force = false) {
7383
+ if (force) {
7384
+ // Bypass sip.js state machine that prevent to close WS with the state `Connecting`
7385
+ this.userAgent.transport.disconnectResolve = () => {};
7386
+ // eslint-disable-next-line
7387
+ this.userAgent.transport._ws.close(1000);
7388
+ return;
7389
+ }
7390
+
7340
7391
  // Check if `disconnectPromise` is not present to avoid `Disconnect promise must not be defined` errors.
7341
7392
  if (this.userAgent && this.userAgent.transport && !this.userAgent.transport.disconnectPromise) {
7342
7393
  try {
@@ -4588,6 +4588,34 @@ var chatdMethods = (client , baseUrl ) => ({
4588
4588
  client.get(`${baseUrl}/users/me/rooms/messages`, options),
4589
4589
  });
4590
4590
 
4591
+ //
4592
+
4593
+
4594
+
4595
+
4596
+
4597
+ class MeetingStatus {
4598
+
4599
+
4600
+
4601
+
4602
+ constructor({
4603
+ full,
4604
+ } = {}) {
4605
+ this.full = full;
4606
+
4607
+ // Useful to compare instead of instanceof with minified code
4608
+ this.type = 'MeetingStatus';
4609
+ }
4610
+
4611
+ static parse(plain ) {
4612
+ return new MeetingStatus({
4613
+ full: plain.full,
4614
+ });
4615
+ }
4616
+
4617
+ }
4618
+
4591
4619
  /* */
4592
4620
 
4593
4621
 
@@ -4782,6 +4810,8 @@ var calldMethods = (client , baseUrl ) => ({
4782
4810
  client.put(`${baseUrl}/users/me/calls/${callId}/record/resume`, null, null,
4783
4811
  ApiRequester.successResponseParser),
4784
4812
 
4813
+ guestGetMeetingStatus: (meetingUuid ) =>
4814
+ client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}/status`).then(MeetingStatus.parse),
4785
4815
  });
4786
4816
 
4787
4817
  //
@@ -5341,7 +5371,7 @@ const ON_NETWORK_STATS = 'onNetworkStats';
5341
5371
  const ON_DISCONNECTED = 'onDisconnected';
5342
5372
  class CanceledCallError extends Error {}
5343
5373
 
5344
- const MAX_REGISTER_TRIES = 10;
5374
+ const MAX_REGISTER_TRIES = 5;
5345
5375
 
5346
5376
 
5347
5377
 
@@ -5395,6 +5425,7 @@ class WebRTCClient extends Emitter {
5395
5425
 
5396
5426
 
5397
5427
 
5428
+
5398
5429
 
5399
5430
  // sugar
5400
5431
 
@@ -5457,6 +5488,7 @@ class WebRTCClient extends Emitter {
5457
5488
  this.conferences = {};
5458
5489
  this.networkMonitoringInterval = {};
5459
5490
  this.sessionNetworkStats = {};
5491
+ this.forceClosed = false;
5460
5492
 
5461
5493
  this._boundOnHeartbeat = this._onHeartbeat.bind(this);
5462
5494
  this.heartbeat = new Heartbeat(config.heartbeatDelay, config.heartbeatTimeout, config.maxHeartbeats);
@@ -5578,6 +5610,8 @@ class WebRTCClient extends Emitter {
5578
5610
  skipRegister: this.skipRegister,
5579
5611
  };
5580
5612
 
5613
+ this.forceClosed = false;
5614
+
5581
5615
  if (this.skipRegister) {
5582
5616
  logger.info('sdk webrtc skip register...', logInfo);
5583
5617
  return Promise.resolve();
@@ -5602,7 +5636,15 @@ class WebRTCClient extends Emitter {
5602
5636
  const registerOptions = this._isWeb() ? {} : { extraContactHeaderParams: ['mobility=mobile'] };
5603
5637
 
5604
5638
  const onRegisterFailed = () => {
5605
- logger.info('sdk webrtc registering failed', { tries, registerer: !!this.registerer });
5639
+ logger.info('sdk webrtc registering failed', {
5640
+ tries,
5641
+ registerer: !!this.registerer,
5642
+ forceClosed: this.forceClosed,
5643
+ });
5644
+ if (this.forceClosed) {
5645
+ return;
5646
+ }
5647
+
5606
5648
  this.connectionPromise = null;
5607
5649
  if (this.registerer && this.registerer.waiting) {
5608
5650
  this.registerer.waitingToggle(false);
@@ -5880,8 +5922,9 @@ class WebRTCClient extends Emitter {
5880
5922
  }
5881
5923
  }
5882
5924
 
5883
- async close() {
5884
- logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent });
5925
+ async close(force = false) {
5926
+ logger.info('sdk webrtc closing client', { userAgent: !!this.userAgent, force });
5927
+ this.forceClosed = force;
5885
5928
  this._cleanupMedia();
5886
5929
  this.connectionPromise = null;
5887
5930
 
@@ -5900,7 +5943,7 @@ class WebRTCClient extends Emitter {
5900
5943
  this.userAgent.delegate = null;
5901
5944
  this.userAgent.stateChange.removeAllListeners();
5902
5945
 
5903
- await this._disconnectTransport();
5946
+ await this._disconnectTransport(force);
5904
5947
 
5905
5948
  this._cleanupRegister();
5906
5949
 
@@ -7336,7 +7379,15 @@ class WebRTCClient extends Emitter {
7336
7379
  return userAgent.UserAgent.makeURI(`sip:${target}@${this.config.host}`);
7337
7380
  }
7338
7381
 
7339
- async _disconnectTransport() {
7382
+ async _disconnectTransport(force = false) {
7383
+ if (force) {
7384
+ // Bypass sip.js state machine that prevent to close WS with the state `Connecting`
7385
+ this.userAgent.transport.disconnectResolve = () => {};
7386
+ // eslint-disable-next-line
7387
+ this.userAgent.transport._ws.close(1000);
7388
+ return;
7389
+ }
7390
+
7340
7391
  // Check if `disconnectPromise` is not present to avoid `Disconnect promise must not be defined` errors.
7341
7392
  if (this.userAgent && this.userAgent.transport && !this.userAgent.transport.disconnectPromise) {
7342
7393
  try {
@@ -4022,6 +4022,34 @@ var chatdMethods = (client , baseUrl ) => ({
4022
4022
  client.get(`${baseUrl}/users/me/rooms/messages`, options),
4023
4023
  });
4024
4024
 
4025
+ //
4026
+
4027
+
4028
+
4029
+
4030
+
4031
+ class MeetingStatus {
4032
+
4033
+
4034
+
4035
+
4036
+ constructor({
4037
+ full,
4038
+ } = {}) {
4039
+ this.full = full;
4040
+
4041
+ // Useful to compare instead of instanceof with minified code
4042
+ this.type = 'MeetingStatus';
4043
+ }
4044
+
4045
+ static parse(plain ) {
4046
+ return new MeetingStatus({
4047
+ full: plain.full,
4048
+ });
4049
+ }
4050
+
4051
+ }
4052
+
4025
4053
  /* */
4026
4054
 
4027
4055
 
@@ -4216,6 +4244,8 @@ var calldMethods = (client , baseUrl ) => ({
4216
4244
  client.put(`${baseUrl}/users/me/calls/${callId}/record/resume`, null, null,
4217
4245
  ApiRequester.successResponseParser),
4218
4246
 
4247
+ guestGetMeetingStatus: (meetingUuid ) =>
4248
+ client.get(`${baseUrl}/guests/me/meetings/${meetingUuid}/status`).then(MeetingStatus.parse),
4219
4249
  });
4220
4250
 
4221
4251
  //
@@ -370,13 +370,21 @@ class CallSession {
370
370
 
371
371
  // Retro-compatibility: `answered` was a boolean before. We can reproduce the behaviour with a getter/setter
372
372
  set answered(value ) {
373
- this.answerTime = value ? new Date() : null;
373
+ this.answerTime = value ? this.answerTime || new Date() : null;
374
374
  }
375
375
 
376
376
  get answered() {
377
377
  return !!this.answerTime;
378
378
  }
379
379
 
380
+ toJSON() {
381
+ const jsonObj = { ...this };
382
+ // $FlowFixMe
383
+ jsonObj.answered = this.answered;
384
+
385
+ return jsonObj;
386
+ }
387
+
380
388
  static parseCall(call ) {
381
389
  return new CallSession({
382
390
  callId: call.id,