@wazo/sdk 1.0.0-alpha.0 → 1.0.0-alpha.10

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 (162) hide show
  1. package/README.md +16 -7
  2. package/dist/wazo-sdk.js +6 -6
  3. package/esm/__tests__/__voice__/call.test.js +57 -2
  4. package/esm/__tests__/api-client.test.js +20 -1
  5. package/esm/api/auth.js +16 -2
  6. package/esm/checker/checks/webrtc.js +2 -2
  7. package/esm/domain/CallLog.js +2 -3
  8. package/esm/domain/Phone/CTIPhone.js +2 -2
  9. package/esm/domain/Phone/WebRTCPhone.js +64 -63
  10. package/esm/index.js +5 -1
  11. package/esm/service/CallApi.js +4 -4
  12. package/esm/simple/Auth.js +19 -15
  13. package/esm/simple/Phone.js +6 -5
  14. package/esm/simple/__tests__/Auth.test.js +8 -64
  15. package/esm/simple/index.js +2 -1
  16. package/esm/simple/room/Room.js +2 -2
  17. package/esm/simple/room/SipRoom.js +2 -2
  18. package/esm/state-machine/call-state-machine.js +2 -2
  19. package/esm/state-machine/softphone-state-machine.js +1 -2
  20. package/esm/state-machine/utils.js +8 -3
  21. package/esm/types/api/auth.d.ts +3 -0
  22. package/esm/types/api/auth.d.ts.map +1 -1
  23. package/esm/types/checker/checks/index.d.ts +1 -1
  24. package/esm/types/checker/checks/webrtc-transport.d.ts +2 -2
  25. package/esm/types/checker/checks/webrtc-transport.d.ts.map +1 -1
  26. package/esm/types/domain/CallLog.d.ts.map +1 -1
  27. package/esm/types/domain/CallSession.d.ts +3 -3
  28. package/esm/types/domain/CallSession.d.ts.map +1 -1
  29. package/esm/types/domain/Phone/CTIPhone.d.ts.map +1 -1
  30. package/esm/types/domain/Phone/WebRTCPhone.d.ts +22 -22
  31. package/esm/types/domain/Phone/WebRTCPhone.d.ts.map +1 -1
  32. package/esm/types/domain/types.d.ts +0 -4
  33. package/esm/types/domain/types.d.ts.map +1 -1
  34. package/esm/types/index.d.ts +5 -1
  35. package/esm/types/index.d.ts.map +1 -1
  36. package/esm/types/lib/WazoSessionDescriptionHandler.d.ts +3 -3
  37. package/esm/types/lib/WazoSessionDescriptionHandler.d.ts.map +1 -1
  38. package/esm/types/service/CallApi.d.ts +5 -5
  39. package/esm/types/service/CallApi.d.ts.map +1 -1
  40. package/esm/types/simple/Auth.d.ts +6 -1
  41. package/esm/types/simple/Auth.d.ts.map +1 -1
  42. package/esm/types/simple/Phone.d.ts +8 -8
  43. package/esm/types/simple/Phone.d.ts.map +1 -1
  44. package/esm/types/simple/index.d.ts +3 -1
  45. package/esm/types/simple/index.d.ts.map +1 -1
  46. package/esm/types/state-machine/softphone-state-machine.d.ts +1 -2
  47. package/esm/types/state-machine/softphone-state-machine.d.ts.map +1 -1
  48. package/esm/types/state-machine/utils.d.ts +2 -2
  49. package/esm/types/state-machine/utils.d.ts.map +1 -1
  50. package/esm/types/utils/api-requester.d.ts.map +1 -1
  51. package/esm/types/utils/sdp.d.ts +3 -2
  52. package/esm/types/utils/sdp.d.ts.map +1 -1
  53. package/esm/types/utils/webrtc.d.ts +1 -0
  54. package/esm/types/utils/webrtc.d.ts.map +1 -1
  55. package/esm/types/voice/call.d.ts +30 -12
  56. package/esm/types/voice/call.d.ts.map +1 -1
  57. package/esm/types/voice/softphone.d.ts +25 -13
  58. package/esm/types/voice/softphone.d.ts.map +1 -1
  59. package/esm/types/web-rtc-client.d.ts +39 -38
  60. package/esm/types/web-rtc-client.d.ts.map +1 -1
  61. package/esm/utils/__tests__/api-requester.test.js +17 -0
  62. package/esm/utils/api-requester.js +9 -1
  63. package/esm/utils/sdp.js +22 -9
  64. package/esm/utils/webrtc.js +24 -4
  65. package/esm/voice/call.js +130 -38
  66. package/esm/voice/softphone.js +145 -35
  67. package/esm/web-rtc-client.js +61 -58
  68. package/lib/__tests__/__voice__/call.test.js +56 -1
  69. package/lib/__tests__/api-client.test.js +20 -1
  70. package/lib/api/auth.js +16 -2
  71. package/lib/checker/checks/webrtc.js +1 -1
  72. package/lib/domain/CallLog.js +2 -3
  73. package/lib/domain/Phone/CTIPhone.js +2 -2
  74. package/lib/domain/Phone/WebRTCPhone.js +63 -62
  75. package/lib/index.js +11 -3
  76. package/lib/service/CallApi.js +2 -2
  77. package/lib/simple/Auth.js +21 -15
  78. package/lib/simple/Phone.js +3 -2
  79. package/lib/simple/__tests__/Auth.test.js +11 -64
  80. package/lib/simple/index.js +2 -1
  81. package/lib/simple/room/Room.js +1 -1
  82. package/lib/simple/room/SipRoom.js +1 -1
  83. package/lib/state-machine/call-state-machine.js +2 -2
  84. package/lib/state-machine/softphone-state-machine.js +1 -2
  85. package/lib/state-machine/utils.js +8 -3
  86. package/lib/types/api/auth.d.ts +3 -0
  87. package/lib/types/api/auth.d.ts.map +1 -1
  88. package/lib/types/checker/checks/index.d.ts +1 -1
  89. package/lib/types/checker/checks/webrtc-transport.d.ts +2 -2
  90. package/lib/types/checker/checks/webrtc-transport.d.ts.map +1 -1
  91. package/lib/types/domain/CallLog.d.ts.map +1 -1
  92. package/lib/types/domain/CallSession.d.ts +3 -3
  93. package/lib/types/domain/CallSession.d.ts.map +1 -1
  94. package/lib/types/domain/Phone/CTIPhone.d.ts.map +1 -1
  95. package/lib/types/domain/Phone/WebRTCPhone.d.ts +22 -22
  96. package/lib/types/domain/Phone/WebRTCPhone.d.ts.map +1 -1
  97. package/lib/types/domain/types.d.ts +0 -4
  98. package/lib/types/domain/types.d.ts.map +1 -1
  99. package/lib/types/index.d.ts +5 -1
  100. package/lib/types/index.d.ts.map +1 -1
  101. package/lib/types/lib/WazoSessionDescriptionHandler.d.ts +3 -3
  102. package/lib/types/lib/WazoSessionDescriptionHandler.d.ts.map +1 -1
  103. package/lib/types/service/CallApi.d.ts +5 -5
  104. package/lib/types/service/CallApi.d.ts.map +1 -1
  105. package/lib/types/simple/Auth.d.ts +6 -1
  106. package/lib/types/simple/Auth.d.ts.map +1 -1
  107. package/lib/types/simple/Phone.d.ts +8 -8
  108. package/lib/types/simple/Phone.d.ts.map +1 -1
  109. package/lib/types/simple/index.d.ts +3 -1
  110. package/lib/types/simple/index.d.ts.map +1 -1
  111. package/lib/types/state-machine/softphone-state-machine.d.ts +1 -2
  112. package/lib/types/state-machine/softphone-state-machine.d.ts.map +1 -1
  113. package/lib/types/state-machine/utils.d.ts +2 -2
  114. package/lib/types/state-machine/utils.d.ts.map +1 -1
  115. package/lib/types/utils/api-requester.d.ts.map +1 -1
  116. package/lib/types/utils/sdp.d.ts +3 -2
  117. package/lib/types/utils/sdp.d.ts.map +1 -1
  118. package/lib/types/utils/webrtc.d.ts +1 -0
  119. package/lib/types/utils/webrtc.d.ts.map +1 -1
  120. package/lib/types/voice/call.d.ts +30 -12
  121. package/lib/types/voice/call.d.ts.map +1 -1
  122. package/lib/types/voice/softphone.d.ts +25 -13
  123. package/lib/types/voice/softphone.d.ts.map +1 -1
  124. package/lib/types/web-rtc-client.d.ts +39 -38
  125. package/lib/types/web-rtc-client.d.ts.map +1 -1
  126. package/lib/utils/__tests__/api-requester.test.js +17 -0
  127. package/lib/utils/api-requester.js +9 -1
  128. package/lib/utils/sdp.js +25 -10
  129. package/lib/utils/webrtc.js +25 -4
  130. package/lib/voice/call.js +131 -36
  131. package/lib/voice/softphone.js +150 -35
  132. package/lib/web-rtc-client.js +59 -57
  133. package/package.json +1 -1
  134. package/src/__tests__/__voice__/call.test.ts +63 -2
  135. package/src/__tests__/api-client.test.ts +22 -1
  136. package/src/api/auth.ts +30 -3
  137. package/src/checker/checks/webrtc-transport.ts +2 -2
  138. package/src/checker/checks/webrtc.ts +2 -2
  139. package/src/domain/CallLog.ts +2 -3
  140. package/src/domain/CallSession.ts +3 -3
  141. package/src/domain/Phone/CTIPhone.ts +3 -2
  142. package/src/domain/Phone/WebRTCPhone.ts +95 -93
  143. package/src/domain/types.ts +0 -5
  144. package/src/index.ts +6 -1
  145. package/src/lib/WazoSessionDescriptionHandler.ts +3 -3
  146. package/src/service/CallApi.ts +7 -7
  147. package/src/simple/Auth.ts +21 -16
  148. package/src/simple/Phone.ts +12 -11
  149. package/src/simple/__tests__/Auth.test.ts +9 -87
  150. package/src/simple/index.ts +2 -1
  151. package/src/simple/room/Room.ts +3 -3
  152. package/src/simple/room/SipRoom.ts +3 -3
  153. package/src/state-machine/call-state-machine.ts +2 -2
  154. package/src/state-machine/softphone-state-machine.ts +1 -2
  155. package/src/state-machine/utils.ts +12 -5
  156. package/src/utils/__tests__/api-requester.test.ts +20 -0
  157. package/src/utils/api-requester.ts +9 -1
  158. package/src/utils/sdp.ts +26 -11
  159. package/src/utils/webrtc.ts +27 -5
  160. package/src/voice/call.ts +169 -50
  161. package/src/voice/softphone.ts +180 -41
  162. package/src/web-rtc-client.ts +106 -99
@@ -2,8 +2,9 @@
2
2
  import { Inviter, UserAgent } from 'sip.js';
3
3
  import softphone from '../../voice/softphone';
4
4
  import Call from '../../voice/call';
5
- import { Actions, States } from '../../state-machine/call-state-machine';
5
+ import { Actions, EstablishedStates, States } from '../../state-machine/call-state-machine';
6
6
  import { Actions as SoftphoneActions } from '../../state-machine/softphone-state-machine';
7
+ import ApiCall from '../../domain/Call';
7
8
  import InvalidStateTransition from '../../domain/InvalidStateTransition';
8
9
  const uaOptions = {
9
10
  logBuiltinEnabled: false,
@@ -28,6 +29,7 @@ jest.mock('../../web-rtc-client', () => jest.fn().mockImplementation(() => ({
28
29
  answer: jest.fn(() => Promise.resolve()),
29
30
  hangup: jest.fn(() => Promise.resolve()),
30
31
  register: jest.fn(() => Promise.resolve()),
32
+ onCallEnded: jest.fn(() => Promise.resolve()),
31
33
  setOnHeartbeatTimeout: jest.fn(() => Promise.resolve()),
32
34
  setOnHeartbeatCallback: jest.fn(() => Promise.resolve()),
33
35
  on: jest.fn(),
@@ -35,22 +37,61 @@ jest.mock('../../web-rtc-client', () => jest.fn().mockImplementation(() => ({
35
37
  const ua = new UserAgent(uaOptions);
36
38
  const sipCall = new Inviter(ua, UserAgent.makeURI('sip:1234@my.stack.io'));
37
39
  softphone.connect();
40
+ // @ts-ignore: private method
38
41
  softphone._sendAction(SoftphoneActions.REGISTER_DONE);
39
42
  const invalidStateTransition = (state, action) => new InvalidStateTransition(`Invalid state transition from ${state} with action ${action}`, state, action);
40
43
  describe('Call', () => {
44
+ describe('parsing an API call', () => {
45
+ it('Should parse an API call and transform it to a Call instance', async () => {
46
+ const apiCall = new ApiCall({
47
+ id: '1234',
48
+ sipCallId: 'abcd',
49
+ isCaller: false,
50
+ isVideo: true,
51
+ recording: true,
52
+ callerName: '',
53
+ callerNumber: '',
54
+ calleeName: '',
55
+ calleeNumber: '0123423223',
56
+ dialedExtension: '',
57
+ lineId: null,
58
+ muted: true,
59
+ onHold: false,
60
+ startingTime: new Date(),
61
+ status: 'Up',
62
+ talkingToIds: [],
63
+ });
64
+ const call = Call.parseCall(apiCall);
65
+ expect(call.recording).toBeTruthy();
66
+ expect(call.id).toBe(apiCall.sipCallId);
67
+ expect(call.apiId).toBe(apiCall.id);
68
+ expect(call.number).toBe(apiCall.calleeNumber);
69
+ expect(call.answerTime).toStrictEqual(apiCall.startingTime);
70
+ expect(call.isMuted()).toBeTruthy();
71
+ expect(call.state).toStrictEqual({ [States.ESTABLISHED]: EstablishedStates.MUTED });
72
+ expect(call.isEstablished()).toBeTruthy();
73
+ });
74
+ });
41
75
  describe('accept', () => {
42
76
  it('Should throw an error when accepting a not ringing call', async () => {
43
77
  const call = new Call(sipCall, softphone);
44
78
  await expect(call.accept()).rejects.toThrowError(invalidStateTransition(States.IDLE, Actions.ACCEPT));
45
79
  });
46
- it.only('Should throw an error when the softphone is not registered', async () => {
80
+ it('Should throw an error when the softphone is not registered', async () => {
47
81
  const call = new Call(sipCall, softphone);
82
+ // @ts-ignore: private method
48
83
  call._sendAction(Actions.INCOMING_CALL);
84
+ // @ts-ignore: private method
49
85
  softphone._sendAction(SoftphoneActions.TRANSPORT_CLOSED);
50
86
  await expect(call.accept()).rejects.toThrowError(invalidStateTransition(States.RINGING, Actions.ACCEPT));
87
+ // Revert softphone state
88
+ softphone.connect();
89
+ // @ts-ignore: private method
90
+ softphone._sendAction(SoftphoneActions.REGISTER_DONE);
51
91
  });
52
92
  it('Should not throw an error when accepting a not ringing call', async () => {
53
93
  const call = new Call(sipCall, softphone);
94
+ // @ts-ignore: private method
54
95
  call._sendAction(Actions.INCOMING_CALL);
55
96
  await call.accept();
56
97
  expect(softphone.client.answer).toHaveBeenCalled();
@@ -63,10 +104,24 @@ describe('Call', () => {
63
104
  });
64
105
  it('Should not throw an error when terminating an established call', async () => {
65
106
  const call = new Call(sipCall, softphone);
107
+ // @ts-ignore: private method
66
108
  call._sendAction(Actions.MAKE_CALL);
109
+ // @ts-ignore: private method
67
110
  call._sendAction(Actions.REMOTLY_ACCEPTED);
68
111
  await call.hangup();
69
112
  expect(softphone.client.hangup).toHaveBeenCalled();
70
113
  });
71
114
  });
115
+ describe('state propagation', () => {
116
+ it('Should update the call state in events', (done) => {
117
+ const call = new Call(sipCall, softphone);
118
+ // @ts-ignore: private method
119
+ call._sendAction(Actions.MAKE_CALL);
120
+ call.on('remotelyAccepted', () => {
121
+ expect(call.state).toStrictEqual({ [States.ESTABLISHED]: EstablishedStates.ONGOING });
122
+ done();
123
+ });
124
+ call.onAccepted();
125
+ });
126
+ });
72
127
  });
@@ -113,7 +113,6 @@ describe('With correct API results', () => {
113
113
  body: JSON.stringify({ saml_session_id: samlSessionId }),
114
114
  signal: expect.any(Object),
115
115
  headers: {
116
- 'X-Auth-Token': token,
117
116
  'Content-Type': 'application/json',
118
117
  Accept: 'application/json',
119
118
  },
@@ -121,6 +120,26 @@ describe('With correct API results', () => {
121
120
  });
122
121
  });
123
122
  });
123
+ describe('samlLogIn mobile test', () => {
124
+ it('should retrieve user token', async () => {
125
+ Wazo.Auth.mobile = true;
126
+ const samlSessionId = 'a1b2C3d4';
127
+ const result = await client.auth.samlLogIn(samlSessionId);
128
+ expect(result).toBeInstanceOf(Session);
129
+ expect(result?.token).toBe(1);
130
+ expect(global.fetch).toBeCalledWith(`https://${server}/api/auth/${authVersion}/token`, {
131
+ method: 'post',
132
+ body: JSON.stringify({ saml_session_id: samlSessionId }),
133
+ signal: expect.any(Object),
134
+ headers: {
135
+ 'Content-Type': 'application/json',
136
+ 'Wazo-Session-Type': 'mobile',
137
+ Accept: 'application/json',
138
+ },
139
+ agent: null,
140
+ });
141
+ });
142
+ });
124
143
  describe('logOut test', () => {
125
144
  it('should delete the specified token', async () => {
126
145
  const oldToken = 123;
package/esm/api/auth.js CHANGED
@@ -33,10 +33,24 @@ export default ((client, baseUrl) => ({
33
33
  },
34
34
  logOut: (token) => client.delete(`${baseUrl}/token/${token}`, null, {}, ApiRequester.successResponseParser),
35
35
  samlLogIn: async (samlSessionId) => {
36
+ const headers = {
37
+ Accept: 'application/json',
38
+ 'Content-Type': 'application/json',
39
+ };
36
40
  const body = {
37
41
  saml_session_id: samlSessionId,
38
42
  };
39
- return client.post(`${baseUrl}/token`, body).then(Session.parse);
43
+ if (client.clientId) {
44
+ body.access_type = 'offline';
45
+ body.client_id = client.clientId;
46
+ }
47
+ if (Wazo.Auth.mobile) {
48
+ headers['Wazo-Session-Type'] = 'mobile';
49
+ }
50
+ return client.post(`${baseUrl}/token`, body, headers).then(Session.parse);
51
+ },
52
+ samlLogOut() {
53
+ return client.get(`${baseUrl}/saml/logout`, null, null);
40
54
  },
41
55
  initiateIdpAuthentication: async (domain, redirectUrl) => {
42
56
  const body = {
@@ -47,7 +61,7 @@ export default ((client, baseUrl) => ({
47
61
  Accept: 'application/json',
48
62
  'Content-Type': 'application/json',
49
63
  };
50
- return client.post(`${baseUrl}/saml/sso`, body, headers, (response) => response);
64
+ return client.post(`${baseUrl}/saml/sso`, body, headers);
51
65
  },
52
66
  refreshToken: (refreshToken, backend, expiration, isMobile, tenantId, domainName) => {
53
67
  const body = {
@@ -1,5 +1,5 @@
1
1
  /* global MediaStream */
2
- import { getSipSessionId } from '../../utils/sdp';
2
+ import { getSipCallId } from '../../utils/sdp';
3
3
  import WebRTCClient from '../../web-rtc-client';
4
4
  export default {
5
5
  name: 'WebRTC',
@@ -29,7 +29,7 @@ export default {
29
29
  });
30
30
  client.on(client.REGISTERED, () => {
31
31
  const sipSession = client.call('*10');
32
- if (!sipSession || !getSipSessionId(sipSession)) {
32
+ if (!sipSession || !getSipCallId(sipSession)) {
33
33
  return handleError('Unable to make call through WebRTC');
34
34
  }
35
35
  setTimeout(() => {
@@ -53,8 +53,7 @@ export default class CallLog {
53
53
  }
54
54
  static parseNew(plain, session) {
55
55
  const callLog = CallLog.parse(plain);
56
- // @TODO: FIXME add verification declined vs missed call
57
- callLog.newMissedCall = session && session.hasExtension((plain.requested_extension || plain.destination_extension)) && !plain.answered;
56
+ callLog.newMissedCall = session && plain.destination_user_uuid === session.uuid && !plain.answered;
58
57
  return callLog;
59
58
  }
60
59
  static newFrom(profile) {
@@ -112,7 +111,7 @@ export default class CallLog {
112
111
  return this.callDirection === 'inbound';
113
112
  }
114
113
  isAnOutgoingCall(session) {
115
- console.warn(`@wazo/sdk
114
+ console.warn(`@wazo/sdk
116
115
  CallLog.isAnOutgoingcall(session) method is obsolete.
117
116
  Please use CallLog.isOutgoing(session).
118
117
  `);
@@ -105,7 +105,7 @@ export default class CTIPhone extends Emitter {
105
105
  number: callSession.number,
106
106
  });
107
107
  try {
108
- await CallApi.cancelCall(callSession);
108
+ await CallApi.cancelCall({ apiId: callSession.getId() });
109
109
  if (this.currentCall && callSession.callId === this.currentCall.id) {
110
110
  this.endCurrentCall(callSession);
111
111
  }
@@ -127,7 +127,7 @@ export default class CTIPhone extends Emitter {
127
127
  callId: callSession.getId(),
128
128
  number: callSession.number,
129
129
  });
130
- await CallApi.cancelCall(callSession);
130
+ await CallApi.cancelCall({ id: callSession.getId() });
131
131
  this.eventEmitter.emit('onCallEnded', callSession);
132
132
  }
133
133
  async transfer(callSession, number) {