@wazo/sdk 0.39.0-beta.9 → 0.39.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 (139) hide show
  1. package/README.md +7 -7
  2. package/dist/wazo-sdk.js +12 -12
  3. package/esm/__tests__/api-client.test.js +7 -1
  4. package/esm/__tests__/web-rtc-client.test.js +10 -0
  5. package/esm/api/dird.js +2 -2
  6. package/esm/api-client.js +4 -0
  7. package/esm/checker/checks/ice-ipv4.js +2 -1
  8. package/esm/domain/Contact.js +15 -8
  9. package/esm/domain/Phone/WebRTCPhone.js +9 -11
  10. package/esm/domain/Session.js +24 -0
  11. package/esm/domain/__tests__/Contact.test.js +200 -48
  12. package/esm/lib/WazoSessionDescriptionHandler.js +14 -11
  13. package/esm/service/IssueReporter.js +12 -2
  14. package/esm/service/__tests__/IssueReporter.test.js +12 -0
  15. package/esm/service/getApiClient.js +9 -0
  16. package/esm/simple/Auth.js +40 -5
  17. package/esm/simple/Phone.js +3 -1
  18. package/esm/simple/Websocket.js +1 -0
  19. package/esm/simple/room/Stream.js +3 -3
  20. package/esm/types/api/dird.d.ts.map +1 -1
  21. package/esm/types/api-client.d.ts +3 -2
  22. package/esm/types/api-client.d.ts.map +1 -1
  23. package/esm/types/checker/checks/ice-ipv4.d.ts.map +1 -1
  24. package/esm/types/domain/Contact.d.ts +1 -1
  25. package/esm/types/domain/Contact.d.ts.map +1 -1
  26. package/esm/types/domain/Phone/WebRTCPhone.d.ts +1 -1
  27. package/esm/types/domain/Phone/WebRTCPhone.d.ts.map +1 -1
  28. package/esm/types/domain/Session.d.ts +2 -0
  29. package/esm/types/domain/Session.d.ts.map +1 -1
  30. package/esm/types/domain/types.d.ts +40 -14
  31. package/esm/types/domain/types.d.ts.map +1 -1
  32. package/esm/types/index.d.ts +2 -0
  33. package/esm/types/index.d.ts.map +1 -1
  34. package/esm/types/lib/WazoSessionDescriptionHandler.d.ts +1 -1
  35. package/esm/types/lib/WazoSessionDescriptionHandler.d.ts.map +1 -1
  36. package/esm/types/service/IssueReporter.d.ts +1 -0
  37. package/esm/types/service/IssueReporter.d.ts.map +1 -1
  38. package/esm/types/service/getApiClient.d.ts +2 -0
  39. package/esm/types/service/getApiClient.d.ts.map +1 -1
  40. package/esm/types/simple/Auth.d.ts.map +1 -1
  41. package/esm/types/simple/Phone.d.ts +4 -3
  42. package/esm/types/simple/Phone.d.ts.map +1 -1
  43. package/esm/types/simple/Websocket.d.ts.map +1 -1
  44. package/esm/types/simple/index.d.ts +1 -0
  45. package/esm/types/simple/index.d.ts.map +1 -1
  46. package/esm/types/utils/Emitter.d.ts +1 -1
  47. package/esm/types/utils/Heartbeat.d.ts +3 -2
  48. package/esm/types/utils/Heartbeat.d.ts.map +1 -1
  49. package/esm/types/utils/api-requester.d.ts +5 -1
  50. package/esm/types/utils/api-requester.d.ts.map +1 -1
  51. package/esm/types/web-rtc-client.d.ts +5 -29
  52. package/esm/types/web-rtc-client.d.ts.map +1 -1
  53. package/esm/types/websocket-client.d.ts +5 -1
  54. package/esm/types/websocket-client.d.ts.map +1 -1
  55. package/esm/utils/__tests__/api-requester.test.js +7 -2
  56. package/esm/utils/api-requester.js +23 -5
  57. package/esm/web-rtc-client.js +69 -40
  58. package/esm/websocket-client.js +9 -2
  59. package/lib/__tests__/api-client.test.js +7 -1
  60. package/lib/__tests__/web-rtc-client.test.js +16 -0
  61. package/lib/api/dird.js +2 -2
  62. package/lib/api-client.js +4 -0
  63. package/lib/checker/checks/ice-ipv4.js +2 -1
  64. package/lib/domain/Contact.js +15 -8
  65. package/lib/domain/Phone/WebRTCPhone.js +9 -11
  66. package/lib/domain/Session.js +23 -0
  67. package/lib/domain/__tests__/Contact.test.js +175 -50
  68. package/lib/lib/WazoSessionDescriptionHandler.js +15 -12
  69. package/lib/service/IssueReporter.js +12 -2
  70. package/lib/service/__tests__/IssueReporter.test.js +12 -0
  71. package/lib/service/getApiClient.js +12 -1
  72. package/lib/simple/Auth.js +34 -4
  73. package/lib/simple/Phone.js +3 -1
  74. package/lib/simple/Websocket.js +1 -0
  75. package/lib/simple/room/Stream.js +3 -3
  76. package/lib/types/api/dird.d.ts.map +1 -1
  77. package/lib/types/api-client.d.ts +3 -2
  78. package/lib/types/api-client.d.ts.map +1 -1
  79. package/lib/types/checker/checks/ice-ipv4.d.ts.map +1 -1
  80. package/lib/types/domain/Contact.d.ts +1 -1
  81. package/lib/types/domain/Contact.d.ts.map +1 -1
  82. package/lib/types/domain/Phone/WebRTCPhone.d.ts +1 -1
  83. package/lib/types/domain/Phone/WebRTCPhone.d.ts.map +1 -1
  84. package/lib/types/domain/Session.d.ts +2 -0
  85. package/lib/types/domain/Session.d.ts.map +1 -1
  86. package/lib/types/domain/types.d.ts +40 -14
  87. package/lib/types/domain/types.d.ts.map +1 -1
  88. package/lib/types/index.d.ts +2 -0
  89. package/lib/types/index.d.ts.map +1 -1
  90. package/lib/types/lib/WazoSessionDescriptionHandler.d.ts +1 -1
  91. package/lib/types/lib/WazoSessionDescriptionHandler.d.ts.map +1 -1
  92. package/lib/types/service/IssueReporter.d.ts +1 -0
  93. package/lib/types/service/IssueReporter.d.ts.map +1 -1
  94. package/lib/types/service/getApiClient.d.ts +2 -0
  95. package/lib/types/service/getApiClient.d.ts.map +1 -1
  96. package/lib/types/simple/Auth.d.ts.map +1 -1
  97. package/lib/types/simple/Phone.d.ts +4 -3
  98. package/lib/types/simple/Phone.d.ts.map +1 -1
  99. package/lib/types/simple/Websocket.d.ts.map +1 -1
  100. package/lib/types/simple/index.d.ts +1 -0
  101. package/lib/types/simple/index.d.ts.map +1 -1
  102. package/lib/types/utils/Emitter.d.ts +1 -1
  103. package/lib/types/utils/Heartbeat.d.ts +3 -2
  104. package/lib/types/utils/Heartbeat.d.ts.map +1 -1
  105. package/lib/types/utils/api-requester.d.ts +5 -1
  106. package/lib/types/utils/api-requester.d.ts.map +1 -1
  107. package/lib/types/web-rtc-client.d.ts +5 -29
  108. package/lib/types/web-rtc-client.d.ts.map +1 -1
  109. package/lib/types/websocket-client.d.ts +5 -1
  110. package/lib/types/websocket-client.d.ts.map +1 -1
  111. package/lib/utils/__tests__/api-requester.test.js +7 -2
  112. package/lib/utils/api-requester.js +19 -5
  113. package/lib/web-rtc-client.js +67 -39
  114. package/lib/websocket-client.js +8 -2
  115. package/package.json +37 -35
  116. package/src/__tests__/api-client.test.ts +9 -1
  117. package/src/__tests__/web-rtc-client.test.ts +12 -0
  118. package/src/api/dird.ts +3 -2
  119. package/src/api-client.ts +8 -2
  120. package/src/checker/checks/ice-ipv4.ts +2 -1
  121. package/src/domain/Contact.ts +16 -8
  122. package/src/domain/Phone/WebRTCPhone.ts +11 -12
  123. package/src/domain/Session.ts +28 -0
  124. package/src/domain/__tests__/Contact.test.ts +213 -54
  125. package/src/domain/types.ts +42 -14
  126. package/src/lib/WazoSessionDescriptionHandler.ts +15 -11
  127. package/src/service/IssueReporter.ts +13 -2
  128. package/src/service/__tests__/IssueReporter.test.ts +14 -0
  129. package/src/service/getApiClient.ts +12 -0
  130. package/src/simple/Auth.ts +58 -6
  131. package/src/simple/Phone.ts +15 -6
  132. package/src/simple/Websocket.ts +1 -0
  133. package/src/simple/room/Stream.ts +3 -3
  134. package/src/types/global.d.ts +1 -0
  135. package/src/utils/Heartbeat.ts +2 -2
  136. package/src/utils/__tests__/api-requester.test.ts +8 -2
  137. package/src/utils/api-requester.ts +31 -4
  138. package/src/web-rtc-client.ts +84 -70
  139. package/src/websocket-client.ts +14 -1
@@ -1,4 +1,5 @@
1
1
  import ReconnectingWebSocket from 'reconnecting-websocket';
2
+ import Session from './domain/Session';
2
3
  import Emitter from './utils/Emitter';
3
4
  import type { WebSocketMessage } from './types/WebSocketMessage';
4
5
  import Heartbeat from './utils/Heartbeat';
@@ -15,6 +16,7 @@ type Arguments = {
15
16
  token: string;
16
17
  events?: Array<string>;
17
18
  version?: number;
19
+ session?: Session;
18
20
  heartbeat?: {
19
21
  delay: number;
20
22
  timeout: number;
@@ -91,6 +93,7 @@ export declare const MEETING_USER_GUEST_AUTHORIZATION_CREATED = "meeting_user_gu
91
93
  export declare const HEARTBEAT_ENGINE_VERSION = "20.09";
92
94
  declare class WebSocketClient extends Emitter {
93
95
  initialized: boolean;
96
+ session?: Session;
94
97
  host: string | null | undefined;
95
98
  version: number | undefined;
96
99
  token: string | null | undefined;
@@ -110,9 +113,10 @@ declare class WebSocketClient extends Emitter {
110
113
  * @param events
111
114
  * @param version
112
115
  * @param heartbeat
116
+ * @param session
113
117
  * @param options @see https://github.com/pladaria/reconnecting-websocket#available-options
114
118
  */
115
- constructor({ host, token, version, events, heartbeat, }: Arguments, options?: Record<string, any>);
119
+ constructor({ host, token, version, events, heartbeat, session, }: Arguments, options?: Record<string, any>);
116
120
  connect(): void;
117
121
  close(force?: boolean): void;
118
122
  updateToken(token: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-client.d.ts","sourceRoot":"","sources":["../../src/websocket-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"websocket-client.d.ts","sourceRoot":"","sources":["../../src/websocket-client.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
+ const node_abort_controller_1 = require("node-abort-controller");
15
16
  const api_requester_1 = __importDefault(require("../api-requester"));
16
17
  const server = 'localhost';
17
18
  const path = 'auth';
@@ -27,6 +28,7 @@ const headers = {
27
28
  'Content-Type': 'application/json',
28
29
  'X-Auth-Token': token,
29
30
  };
31
+ const controller = new node_abort_controller_1.AbortController();
30
32
  describe('Generating query string', () => {
31
33
  it('should generate a simple query string from an object', () => {
32
34
  expect(api_requester_1.default.getQueryString({
@@ -88,7 +90,7 @@ describe('Retrieving headers', () => {
88
90
  });
89
91
  describe('Calling fetch', () => {
90
92
  it('should call fetch without body but query string in get method', () => __awaiter(void 0, void 0, void 0, function* () {
91
- jest.mock('node-fetch/lib/index', () => { });
93
+ jest.mock('node-fetch/src/index', () => { });
92
94
  // @ts-ignore
93
95
  global.fetch = jest.fn(() => Promise.resolve({
94
96
  json: () => Promise.resolve({}),
@@ -106,6 +108,7 @@ describe('Calling fetch', () => {
106
108
  expect(global.fetch).toBeCalledWith(url, {
107
109
  method: 'get',
108
110
  body: null,
111
+ signal: controller.signal,
109
112
  headers: {},
110
113
  agent: null,
111
114
  });
@@ -113,7 +116,7 @@ describe('Calling fetch', () => {
113
116
  });
114
117
  describe('With a refresh token', () => {
115
118
  it('should retry the call with a new token', () => __awaiter(void 0, void 0, void 0, function* () {
116
- jest.mock('node-fetch/lib/index', () => { });
119
+ jest.mock('node-fetch/src/index', () => { });
117
120
  let calls = 0;
118
121
  // @ts-ignore
119
122
  global.fetch = jest.fn(() => {
@@ -147,12 +150,14 @@ describe('With a refresh token', () => {
147
150
  expect(global.fetch).toHaveBeenNthCalledWith(1, url, {
148
151
  method: 'get',
149
152
  body: null,
153
+ signal: controller.signal,
150
154
  headers,
151
155
  agent: null,
152
156
  });
153
157
  expect(global.fetch).toHaveBeenNthCalledWith(2, url, {
154
158
  method: 'get',
155
159
  body: null,
160
+ signal: controller.signal,
156
161
  headers: updatedHeaders,
157
162
  agent: null,
158
163
  });
@@ -18,12 +18,14 @@ exports.realFetch = void 0;
18
18
  /* eslint-disable global-require */
19
19
  /* eslint-disable import/no-dynamic-require */
20
20
  const js_base64_1 = require("js-base64");
21
+ const node_abort_controller_1 = require("node-abort-controller");
21
22
  const BadResponse_1 = __importDefault(require("../domain/BadResponse"));
22
23
  const ServerError_1 = __importDefault(require("../domain/ServerError"));
23
24
  const isMobile_1 = __importDefault(require("./isMobile"));
24
25
  const IssueReporter_1 = __importDefault(require("../service/IssueReporter"));
25
- const methods = ['head', 'get', 'post', 'put', 'delete'];
26
+ const methods = ['head', 'get', 'post', 'put', 'delete', 'options'];
26
27
  const logger = IssueReporter_1.default ? IssueReporter_1.default.loggerFor('api') : console;
28
+ const REQUEST_TIMEOUT_MS = 300 * 1000; // 300s like the Chrome engine default value.
27
29
  // Use a function here to be able to mock it in tests
28
30
  const realFetch = () => {
29
31
  if (typeof fetch !== 'undefined') {
@@ -38,7 +40,7 @@ const realFetch = () => {
38
40
  return fetch;
39
41
  }
40
42
  // nodejs
41
- // this package is disable for react-native in package.json because it requires nodejs modules
43
+ // this package is disabled for react-native in package.json because it requires nodejs modules
42
44
  // Used to trick the optimizer to avoid requiring `node-fetch/lib/index` directly
43
45
  // It causes to require it on browsers when delivered by a nodejs engine (cf: vitejs).
44
46
  try {
@@ -63,13 +65,14 @@ class ApiRequester {
63
65
  return typeof btoa !== 'undefined' ? btoa(str) : js_base64_1.Base64.encode(str);
64
66
  }
65
67
  // @see https://github.com/facebook/flow/issues/183#issuecomment-358607052
66
- constructor({ server, refreshTokenCallback, clientId, agent = null, token = null, fetchOptions, }) {
68
+ constructor({ server, refreshTokenCallback, clientId, agent = null, token = null, fetchOptions, requestTimeout = REQUEST_TIMEOUT_MS, }) {
67
69
  this.server = server;
68
70
  this.agent = agent;
69
71
  this.clientId = clientId;
70
72
  this.refreshTokenCallback = refreshTokenCallback;
71
73
  this.refreshTokenPromise = null;
72
74
  this.fetchOptions = fetchOptions || {};
75
+ this.requestTimeout = requestTimeout || REQUEST_TIMEOUT_MS;
73
76
  if (token) {
74
77
  this.token = token;
75
78
  }
@@ -84,6 +87,9 @@ class ApiRequester {
84
87
  };
85
88
  });
86
89
  }
90
+ setRequestTimeout(requestTimeout) {
91
+ this.requestTimeout = requestTimeout;
92
+ }
87
93
  setTenant(tenant) {
88
94
  this.tenant = tenant;
89
95
  }
@@ -111,9 +117,10 @@ class ApiRequester {
111
117
  const hasEmptyResponse = method === 'delete' || isHead;
112
118
  const newParse = hasEmptyResponse ? ApiRequester.successResponseParser : parse;
113
119
  const fetchOptions = Object.assign({}, (this.fetchOptions || {}));
120
+ const controller = new node_abort_controller_1.AbortController();
114
121
  const extraHeaders = fetchOptions.headers || {};
115
122
  delete fetchOptions.headers;
116
- const options = Object.assign({ method, body: newBody, headers: Object.assign(Object.assign({}, this.getHeaders(headers)), extraHeaders), agent: this.agent }, fetchOptions);
123
+ const options = Object.assign({ method, body: newBody, signal: controller ? controller.signal : null, headers: Object.assign(Object.assign({}, this.getHeaders(headers)), extraHeaders), agent: this.agent }, fetchOptions);
117
124
  if (this.refreshTokenPromise) {
118
125
  logger.info('A token is already refreshing, waiting ...', {
119
126
  url,
@@ -121,7 +128,7 @@ class ApiRequester {
121
128
  yield this.refreshTokenPromise;
122
129
  }
123
130
  const start = new Date();
124
- return (0, exports.realFetch)()(url, options).then((response) => {
131
+ const requestPromise = (0, exports.realFetch)()(url, options).then((response) => {
125
132
  const contentType = response.headers.get('content-type') || '';
126
133
  const isJson = contentType.indexOf('application/json') !== -1;
127
134
  IssueReporter_1.default.logRequest(url, options, response, start);
@@ -157,6 +164,13 @@ class ApiRequester {
157
164
  }
158
165
  throw error;
159
166
  });
167
+ const requestTimeout = new Promise((resolve, reject) => {
168
+ setTimeout(() => {
169
+ controller.abort();
170
+ reject(new Error(`Request timed out after ${this.requestTimeout} ms`));
171
+ }, this.requestTimeout);
172
+ });
173
+ return Promise.race([requestPromise, requestTimeout]);
160
174
  });
161
175
  }
162
176
  _checkTokenExpired(response, err) {
@@ -103,6 +103,8 @@ class CanceledCallError extends Error {
103
103
  }
104
104
  exports.CanceledCallError = CanceledCallError;
105
105
  const MAX_REGISTER_TRIES = 5;
106
+ // setting a 24hr timeout and letting the backend define the actual value
107
+ const NO_ANSWER_TIMEOUT = 60 * 60 * 24; // in seconds
106
108
  class WebRTCClient extends Emitter_1.default {
107
109
  static isAPrivateIp(ip) {
108
110
  const regex = /^(?:10|127|172\.(?:1[6-9]|2[0-9]|3[01])|192\.168)\..*/;
@@ -116,7 +118,7 @@ class WebRTCClient extends Emitter_1.default {
116
118
  }
117
119
  return [];
118
120
  }
119
- constructor(config, session, uaConfigOverrides = undefined) {
121
+ constructor(config, session, uaConfigOverrides) {
120
122
  super();
121
123
  // For debug purpose
122
124
  this.clientId = Math.ceil(Math.random() * 1000);
@@ -177,10 +179,10 @@ class WebRTCClient extends Emitter_1.default {
177
179
  this.video = media.video;
178
180
  this.audio = media.audio;
179
181
  }
180
- createUserAgent(configOverrides) {
181
- const webRTCConfiguration = this._createWebRTCConfiguration(configOverrides);
182
- logger.info('sdk webrtc, creating UA', { webRTCConfiguration, clientId: this.clientId });
183
- webRTCConfiguration.delegate = {
182
+ createUserAgent(uaConfigOverrides) {
183
+ const uaOptions = this._createUaOptions(uaConfigOverrides);
184
+ logger.info('sdk webrtc, creating UA', { uaOptions, clientId: this.clientId });
185
+ uaOptions.delegate = {
184
186
  onConnect: this.onConnect.bind(this),
185
187
  onDisconnect: this.onDisconnect.bind(this),
186
188
  onInvite: (invitation) => {
@@ -196,7 +198,8 @@ class WebRTCClient extends Emitter_1.default {
196
198
  this.eventEmitter.emit(INVITE, invitation, this.sessionWantsToDoVideo(invitation), shouldAutoAnswer);
197
199
  },
198
200
  };
199
- const ua = new user_agent_1.UserAgent(webRTCConfiguration);
201
+ const ua = new user_agent_1.UserAgent(uaOptions);
202
+ ua.start();
200
203
  if (ua.transport && ua.transport.connectPromise) {
201
204
  ua.transport.connectPromise.catch((e) => {
202
205
  logger.warn('Transport connect error', e);
@@ -386,16 +389,27 @@ class WebRTCClient extends Emitter_1.default {
386
389
  userAgent: !!this.userAgent,
387
390
  registerer: !!this.registerer,
388
391
  });
389
- if (!this.registerer) {
390
- return Promise.resolve();
391
- }
392
392
  try {
393
- return this.registerer.unregister().then(() => {
394
- logger.info('sdk webrtc unregistered', { clientId: this.clientId });
395
- this._cleanupRegister();
396
- }).catch(e => {
397
- logger.error('sdk webrtc unregistering, promise error', e);
398
- this._cleanupRegister();
393
+ return new Promise((resolve, reject) => {
394
+ if (!this.registerer) {
395
+ return resolve();
396
+ }
397
+ const onRegisterStateChange = (state) => {
398
+ if (state === registerer_state_1.RegistererState.Unregistered) {
399
+ logger.info('sdk webrtc unregistered', { clientId: this.clientId });
400
+ if (this.registerer) {
401
+ this.registerer.stateChange.addListener(onRegisterStateChange);
402
+ }
403
+ this._cleanupRegister();
404
+ resolve();
405
+ }
406
+ };
407
+ this.registerer.stateChange.addListener(onRegisterStateChange);
408
+ this.registerer.unregister().then().catch(e => {
409
+ logger.error('sdk webrtc unregistering, promise error', e);
410
+ this._cleanupRegister();
411
+ reject();
412
+ });
399
413
  });
400
414
  }
401
415
  catch (e) {
@@ -457,9 +471,7 @@ class WebRTCClient extends Emitter_1.default {
457
471
  requestDelegate: {
458
472
  onAccept: (response) => {
459
473
  var _a;
460
- // @ts-ignore
461
474
  if ((_a = session.sessionDescriptionHandler) === null || _a === void 0 ? void 0 : _a.peerConnection) {
462
- // @ts-ignore
463
475
  session.sessionDescriptionHandler.peerConnection.sfu = conference;
464
476
  }
465
477
  // @ts-ignore
@@ -736,9 +748,9 @@ class WebRTCClient extends Emitter_1.default {
736
748
  hasVideo,
737
749
  isConference,
738
750
  };
739
- if (isConference) {
740
- this.mute(session);
741
- }
751
+ // We should also mute the call, because when holding a call during a voicemail, the audio is still sent with the
752
+ // `sendonly` direction
753
+ this.mute(session);
742
754
  session.sessionDescriptionHandlerOptionsReInvite = {
743
755
  // @ts-ignore
744
756
  hold: true,
@@ -778,9 +790,7 @@ class WebRTCClient extends Emitter_1.default {
778
790
  if (session.pendingReinvite) {
779
791
  return Promise.resolve();
780
792
  }
781
- if (isConference) {
782
- this.unmute(session);
783
- }
793
+ this.unmute(session);
784
794
  delete this.heldSessions[this.getSipSessionId(session)];
785
795
  session.sessionDescriptionHandlerOptionsReInvite = {
786
796
  // @ts-ignore
@@ -1148,9 +1158,9 @@ class WebRTCClient extends Emitter_1.default {
1148
1158
  });
1149
1159
  // Release old video stream
1150
1160
  if (localStream) {
1151
- localStream.getVideoTracks().forEach(track => {
1152
- track.stop();
1153
- });
1161
+ localStream.getVideoTracks()
1162
+ .filter((track) => track.enabled)
1163
+ .forEach((track) => track.stop());
1154
1164
  }
1155
1165
  const constraints = {
1156
1166
  video: id ? {
@@ -1476,7 +1486,7 @@ class WebRTCClient extends Emitter_1.default {
1476
1486
  if (!pc || !remoteStream) {
1477
1487
  return;
1478
1488
  }
1479
- remoteStream.getTracks().forEach(track => {
1489
+ remoteStream.getVideoTracks().forEach(track => {
1480
1490
  remoteStream.removeTrack(track);
1481
1491
  });
1482
1492
  if (pc.getReceivers) {
@@ -1528,6 +1538,7 @@ class WebRTCClient extends Emitter_1.default {
1528
1538
  createAudioElementFor(sessionId) {
1529
1539
  const audio = document.createElement('audio');
1530
1540
  audio.setAttribute('id', `audio-${sessionId}`);
1541
+ logger.info('creating audio element', { sessionId, audioOutputDeviceId: this.audioOutputDeviceId });
1531
1542
  if (audio.setSinkId && this.audioOutputDeviceId) {
1532
1543
  audio.setSinkId(this.audioOutputDeviceId);
1533
1544
  }
@@ -1653,7 +1664,7 @@ class WebRTCClient extends Emitter_1.default {
1653
1664
  // @ts-ignore
1654
1665
  return client.confd.getUserLineSipFromToken(session.uuid).then(sipLine => (Object.assign({ authorizationUser: sipLine.username, password: sipLine.secret, uri: `${sipLine.username}@${config.host}` }, config)));
1655
1666
  }
1656
- _createWebRTCConfiguration(configOverrides = {}) {
1667
+ _createUaOptions(uaOptionsOverrides = {}) {
1657
1668
  let { host, } = this.config;
1658
1669
  let port = this.config.port || 443;
1659
1670
  if (this.config.websocketSip) {
@@ -1661,11 +1672,12 @@ class WebRTCClient extends Emitter_1.default {
1661
1672
  [host] = webSocketSip;
1662
1673
  port = Number(webSocketSip[1]);
1663
1674
  }
1664
- const config = {
1675
+ const { userUuid } = this.config;
1676
+ const uaOptions = {
1677
+ noAnswerTimeout: NO_ANSWER_TIMEOUT,
1665
1678
  authorizationUsername: this.config.authorizationUser,
1666
1679
  authorizationPassword: this.config.password,
1667
1680
  displayName: this.config.displayName,
1668
- autoStart: true,
1669
1681
  hackIpInContact: true,
1670
1682
  contactParams: {
1671
1683
  transport: 'wss',
@@ -1686,8 +1698,8 @@ class WebRTCClient extends Emitter_1.default {
1686
1698
  return new WazoSessionDescriptionHandler_1.default(uaLogger, WazoSessionDescriptionHandler_1.wazoMediaStreamFactory, sdhOptions, isWeb, session);
1687
1699
  },
1688
1700
  transportOptions: {
1689
- traceSip: (configOverrides === null || configOverrides === void 0 ? void 0 : configOverrides.traceSip) || false,
1690
- wsServers: `wss://${host}:${port}/api/asterisk/ws`,
1701
+ traceSip: (uaOptionsOverrides === null || uaOptionsOverrides === void 0 ? void 0 : uaOptionsOverrides.traceSip) || false,
1702
+ wsServers: `wss://${host}:${port}/api/asterisk/ws${userUuid ? `?userUuid=${userUuid}` : ''}`,
1691
1703
  },
1692
1704
  sessionDescriptionHandlerFactoryOptions: {
1693
1705
  modifiers: [exports.replaceLocalIpModifier],
@@ -1699,13 +1711,14 @@ class WebRTCClient extends Emitter_1.default {
1699
1711
  peerConnectionOptions: {
1700
1712
  iceCheckingTimeout: this.config.iceCheckingTimeout || 1000,
1701
1713
  iceGatheringTimeout: this.config.iceCheckingTimeout || 1000,
1702
- rtcConfiguration: Object.assign(Object.assign({ rtcpMuxPolicy: 'require', iceServers: WebRTCClient.getIceServers(this.config.host) }, this._getRtcOptions()), ((configOverrides === null || configOverrides === void 0 ? void 0 : configOverrides.peerConnectionOptions) || {})),
1714
+ rtcConfiguration: Object.assign(Object.assign({ rtcpMuxPolicy: 'require', iceServers: WebRTCClient.getIceServers(this.config.host) }, this._getRtcOptions()), ((uaOptionsOverrides === null || uaOptionsOverrides === void 0 ? void 0 : uaOptionsOverrides.peerConnectionOptions) || {})),
1703
1715
  },
1704
1716
  // Configuration used in SDH to create the PeerConnection
1705
- peerConnectionConfiguration: Object.assign({ rtcpMuxPolicy: 'require', iceServers: WebRTCClient.getIceServers(this.config.host) }, ((configOverrides === null || configOverrides === void 0 ? void 0 : configOverrides.peerConnectionOptions) || {})),
1717
+ peerConnectionConfiguration: Object.assign({ rtcpMuxPolicy: 'require', iceServers: WebRTCClient.getIceServers(this.config.host) }, ((uaOptionsOverrides === null || uaOptionsOverrides === void 0 ? void 0 : uaOptionsOverrides.peerConnectionOptions) || {})),
1706
1718
  },
1707
1719
  };
1708
- return Object.assign(Object.assign({}, config), configOverrides);
1720
+ uaOptionsOverrides === null || uaOptionsOverrides === void 0 ? true : delete uaOptionsOverrides.traceSip;
1721
+ return Object.assign(Object.assign({}, uaOptions), uaOptionsOverrides);
1709
1722
  }
1710
1723
  // eslint-disable-next-line no-unused-vars
1711
1724
  _getRtcOptions() {
@@ -1864,6 +1877,19 @@ class WebRTCClient extends Emitter_1.default {
1864
1877
  // @ts-ignore
1865
1878
  const earlyStream = sipSession && sipSession.sessionDescriptionHandler ? sipSession.sessionDescriptionHandler.remoteMediaStream : null;
1866
1879
  const stream = newStream || removeStream || earlyStream;
1880
+ const shouldPause = audioElement.currentTime > 0 && !audioElement.paused && !audioElement.ended && audioElement.readyState > 2;
1881
+ logger.info('setting up media', {
1882
+ sessionId,
1883
+ streams: {
1884
+ new: !!newStream,
1885
+ remove: !!removeStream,
1886
+ early: !!earlyStream,
1887
+ },
1888
+ isWeb: this._isWeb(),
1889
+ hasAudio: this._hasAudio(),
1890
+ isConference,
1891
+ shouldPause,
1892
+ });
1867
1893
  if (!this._isWeb() || !stream) {
1868
1894
  return;
1869
1895
  }
@@ -1871,7 +1897,7 @@ class WebRTCClient extends Emitter_1.default {
1871
1897
  // Conference local stream is handled in Room
1872
1898
  return;
1873
1899
  }
1874
- if (audioElement.currentTime > 0 && !audioElement.paused && !audioElement.ended && audioElement.readyState > 2) {
1900
+ if (shouldPause) {
1875
1901
  audioElement.pause();
1876
1902
  }
1877
1903
  audioElement.srcObject = stream;
@@ -1906,7 +1932,7 @@ class WebRTCClient extends Emitter_1.default {
1906
1932
  }
1907
1933
  }
1908
1934
  _cleanupStream(stream) {
1909
- stream.getTracks().forEach(track => track.stop());
1935
+ stream.getTracks().filter(track => track.enabled).forEach(track => track.stop());
1910
1936
  }
1911
1937
  _toggleAudio(session, muteAudio) {
1912
1938
  // @ts-ignore
@@ -2125,8 +2151,10 @@ class WebRTCClient extends Emitter_1.default {
2125
2151
  networkStats.totalTransportReceived = transportReceived;
2126
2152
  networkStats.transportReceived = transportReceived - lastTransportReceived;
2127
2153
  networkStats.bandwidth = networkStats.audioBytesSent + networkStats.audioBytesReceived + networkStats.videoBytesSent + networkStats.videoBytesReceived + networkStats.transportReceived + networkStats.transportSent;
2128
- this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
2129
- this.sessionNetworkStats[sessionId].push(networkStats);
2154
+ if (this.sessionNetworkStats[sessionId]) {
2155
+ this.eventEmitter.emit(ON_NETWORK_STATS, session, networkStats, this.sessionNetworkStats[sessionId]);
2156
+ this.sessionNetworkStats[sessionId].push(networkStats);
2157
+ }
2130
2158
  });
2131
2159
  }
2132
2160
  _accept(session, options = {}) {
@@ -106,14 +106,16 @@ class WebSocketClient extends Emitter_1.default {
106
106
  * @param events
107
107
  * @param version
108
108
  * @param heartbeat
109
+ * @param session
109
110
  * @param options @see https://github.com/pladaria/reconnecting-websocket#available-options
110
111
  */
111
- constructor({ host, token, version, events, heartbeat, }, options = {
112
+ constructor({ host, token, version, events, heartbeat, session, }, options = {
112
113
  host,
113
114
  token,
114
115
  version: 1,
115
116
  events: [],
116
117
  heartbeat: {},
118
+ session: null,
117
119
  }) {
118
120
  super();
119
121
  this.initialized = false;
@@ -123,6 +125,7 @@ class WebSocketClient extends Emitter_1.default {
123
125
  this.events = events;
124
126
  this.options = options;
125
127
  this.version = version;
128
+ this.session = session;
126
129
  this._boundOnHeartbeat = this._onHeartbeat.bind(this);
127
130
  const { delay, timeout, max, } = heartbeat || {};
128
131
  this.heartbeat = new Heartbeat_1.default(delay, timeout, max);
@@ -350,7 +353,10 @@ class WebSocketClient extends Emitter_1.default {
350
353
  if (!this.host || !this.token) {
351
354
  this.close();
352
355
  }
353
- const url = `wss://${this.host || ''}/api/websocketd/?token=${this.token || ''}&version=${this.version}`;
356
+ let url = `wss://${this.host || ''}/api/websocketd/?token=${this.token || ''}&version=${this.version}`;
357
+ if (this.session) {
358
+ url += `&userUuid=${this.session.uuid}`;
359
+ }
354
360
  logger.info('Wazo WS url computed to reconnect', {
355
361
  url,
356
362
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wazo/sdk",
3
- "version": "0.39.0-beta.9",
3
+ "version": "0.39.0",
4
4
  "description": "Wazo's JavaScript Software Development Kit.",
5
5
  "main": "dist/wazo-sdk.js",
6
6
  "author": "Wazo (http://wazo.io)",
@@ -50,59 +50,61 @@
50
50
  "default": "./lib/index.js"
51
51
  }
52
52
  },
53
- "./lib/simple": "./lib/simple/index.js"
53
+ "./lib/simple": "./lib/simple/index.js",
54
+ "./dist/wazo-sdk": "./dist/wazo-sdk.js"
54
55
  },
55
56
  "dependencies": {
56
57
  "events": "^3.3.0",
57
58
  "fstream": "^1.0.12",
58
59
  "getstats": "manuquentin/getStats#fix_stats_mobile",
59
- "google-libphonenumber": "^3.2.18",
60
- "js-base64": "^3.6.0",
61
- "json-to-graphql-query": "^2.0.0",
62
- "jsrsasign": "^10.2.0",
60
+ "google-libphonenumber": "^3.2.32",
61
+ "js-base64": "^3.7.5",
62
+ "json-to-graphql-query": "^2.2.5",
63
+ "jsrsasign": "^10.8.6",
63
64
  "moment": "^2.29.1",
64
- "node-fetch": "^2.6.1",
65
+ "node-abort-controller": "^3.1.1",
66
+ "node-fetch": "^3.3.1",
65
67
  "reconnecting-websocket": "^4.4.0",
66
68
  "sdp-transform": "^2.14.1",
67
- "sip.js": "^0.20.0",
68
- "webrtc-adapter": "^7.7.1"
69
+ "sip.js": "^0.21.2",
70
+ "webrtc-adapter": "^8.2.3"
69
71
  },
70
72
  "devDependencies": {
71
- "@babel/core": "^7.13.10",
72
- "@babel/preset-env": "^7.13.12",
73
- "@babel/preset-typescript": "^7.18.6",
74
- "@rollup/plugin-commonjs": "^24.0.0",
73
+ "@babel/core": "^7.22.8",
74
+ "@babel/preset-env": "^7.22.7",
75
+ "@babel/preset-typescript": "^7.22.5",
76
+ "@rollup/plugin-commonjs": "^25.0.2",
75
77
  "@rollup/plugin-json": "^6.0.0",
76
- "@rollup/plugin-node-resolve": "^15.0.1",
77
- "@rollup/plugin-terser": "^0.3.0",
78
- "@rollup/plugin-typescript": "^10.0.1",
78
+ "@rollup/plugin-node-resolve": "^15.1.0",
79
+ "@rollup/plugin-terser": "^0.4.3",
80
+ "@rollup/plugin-typescript": "^11.1.2",
79
81
  "@types/events": "^3.0.0",
80
82
  "@types/google-libphonenumber": "^7.4.23",
81
- "@types/jest": "^26.0.24",
82
- "@types/jsrsasign": "^10.5.4",
83
- "@types/node": "^18.11.17",
84
- "@types/sdp-transform": "^2.4.5",
85
- "@typescript-eslint/eslint-plugin": "^5.47.0",
86
- "@typescript-eslint/parser": "^5.47.0",
83
+ "@types/jest": "^29.5.2",
84
+ "@types/jsrsasign": "^10.5.8",
85
+ "@types/node": "^20.4.0",
86
+ "@types/sdp-transform": "^2.4.6",
87
+ "@typescript-eslint/eslint-plugin": "^5.61.0",
88
+ "@typescript-eslint/parser": "^5.61.0",
87
89
  "babel-core": "^7.0.0-bridge.0",
88
90
  "babel-eslint": "10.1.0",
89
- "babel-loader": "^8.2.2",
90
- "eslint": "^7.22.0",
91
- "eslint-config-airbnb-base": "^14.2.1",
91
+ "babel-loader": "^9.1.2",
92
+ "eslint": "^8.44.0",
93
+ "eslint-config-airbnb-base": "^15.0.0",
92
94
  "eslint-config-airbnb-typescript": "^17.0.0",
93
- "eslint-config-prettier": "^8.1.0",
94
- "eslint-plugin-import": "^2.22.1",
95
- "eslint-plugin-prettier": "^3.3.1",
96
- "jest": "^26.6.3",
95
+ "eslint-config-prettier": "^8.8.0",
96
+ "eslint-plugin-import": "^2.27.5",
97
+ "eslint-plugin-prettier": "^4.2.1",
98
+ "jest": "^29.6.1",
97
99
  "jsonlint": "^1.6.3",
98
- "prettier-eslint-cli": "^5.0.1",
99
- "rimraf": "^3.0.2",
100
- "rollup": "^3.9.1",
101
- "ts-jest": "^26.5.4",
102
- "typescript": "^4.9.4"
100
+ "prettier-eslint-cli": "^7.1.0",
101
+ "rimraf": "^5.0.1",
102
+ "rollup": "^3.26.2",
103
+ "ts-jest": "^29.1.1",
104
+ "typescript": "^5.1.6"
103
105
  },
104
106
  "engines": {
105
- "node": ">=0.8"
107
+ "node": ">=16.14.0"
106
108
  },
107
109
  "react-native": {
108
110
  "node-fetch/lib/index": false
@@ -1,9 +1,13 @@
1
+ import { AbortController } from 'node-abort-controller';
1
2
  import { Base64 } from 'js-base64';
3
+
2
4
  import WazoApiClient from '../api-client';
3
5
  import ServerError from '../domain/ServerError';
4
6
  import BadResponse from '../domain/BadResponse';
5
7
  import Session from '../domain/Session';
6
8
 
9
+ const controller = new AbortController();
10
+
7
11
  const mockedResponse = {
8
12
  data: {
9
13
  token: 1,
@@ -75,7 +79,7 @@ const server = 'localhost';
75
79
  const authVersion = '0.1';
76
80
  const username = 'wazo';
77
81
  const password = 'zowa';
78
- jest.mock('node-fetch/lib/index', () => {});
82
+ jest.mock('node-fetch/src/index', () => {});
79
83
  const token = '1234';
80
84
 
81
85
  const client = new WazoApiClient({
@@ -112,6 +116,7 @@ describe('With correct API results', () => {
112
116
  expect(global.fetch).toBeCalledWith(`https://${server}/api/auth/${authVersion}/token`, {
113
117
  method: 'post',
114
118
  body: JSON.stringify(data),
119
+ signal: controller.signal,
115
120
  headers,
116
121
  agent: null,
117
122
  });
@@ -126,6 +131,7 @@ describe('With correct API results', () => {
126
131
  expect(global.fetch).toBeCalledWith(`https://${server}/api/auth/${authVersion}/token/${oldToken}`, {
127
132
  method: 'delete',
128
133
  body: null,
134
+ signal: controller.signal,
129
135
  headers: {},
130
136
  agent: null,
131
137
  });
@@ -148,6 +154,7 @@ describe('With unAuthorized API results', () => {
148
154
  expect(global.fetch).toBeCalledWith(`https://${server}/api/auth/${authVersion}/token/${tokenToCheck}`, {
149
155
  method: 'head',
150
156
  body: null,
157
+ signal: controller.signal,
151
158
  headers: {},
152
159
  agent: null,
153
160
  });
@@ -179,6 +186,7 @@ describe('With not found API results', () => {
179
186
  expect(global.fetch).toBeCalledWith(`https://${server}/api/calld/1.0/users/me/voicemails`, {
180
187
  method: 'get',
181
188
  body: null,
189
+ signal: controller.signal,
182
190
  headers: {
183
191
  'X-Auth-Token': token,
184
192
  'Content-Type': 'application/json',
@@ -1,6 +1,18 @@
1
1
  import WebRTCClient from '../web-rtc-client';
2
2
 
3
3
  jest.mock('sip.js/lib/platform/web/transport');
4
+ jest.mock('sip.js/lib/api/user-agent', () => ({
5
+ start: () => {},
6
+ UserAgent: class UserAgent {
7
+ // @ts-ignore
8
+ static makeURI = () => {};
9
+
10
+ // @ts-ignore
11
+ start = () => {};
12
+
13
+ transport = {};
14
+ },
15
+ }));
4
16
 
5
17
  // @ts-expect-error
6
18
  const client = new WebRTCClient({});