@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.
- package/README.md +16 -7
- package/dist/wazo-sdk.js +6 -6
- package/esm/__tests__/__voice__/call.test.js +57 -2
- package/esm/__tests__/api-client.test.js +20 -1
- package/esm/api/auth.js +16 -2
- package/esm/checker/checks/webrtc.js +2 -2
- package/esm/domain/CallLog.js +2 -3
- package/esm/domain/Phone/CTIPhone.js +2 -2
- package/esm/domain/Phone/WebRTCPhone.js +64 -63
- package/esm/index.js +5 -1
- package/esm/service/CallApi.js +4 -4
- package/esm/simple/Auth.js +19 -15
- package/esm/simple/Phone.js +6 -5
- package/esm/simple/__tests__/Auth.test.js +8 -64
- package/esm/simple/index.js +2 -1
- package/esm/simple/room/Room.js +2 -2
- package/esm/simple/room/SipRoom.js +2 -2
- package/esm/state-machine/call-state-machine.js +2 -2
- package/esm/state-machine/softphone-state-machine.js +1 -2
- package/esm/state-machine/utils.js +8 -3
- package/esm/types/api/auth.d.ts +3 -0
- package/esm/types/api/auth.d.ts.map +1 -1
- package/esm/types/checker/checks/index.d.ts +1 -1
- package/esm/types/checker/checks/webrtc-transport.d.ts +2 -2
- package/esm/types/checker/checks/webrtc-transport.d.ts.map +1 -1
- package/esm/types/domain/CallLog.d.ts.map +1 -1
- package/esm/types/domain/CallSession.d.ts +3 -3
- package/esm/types/domain/CallSession.d.ts.map +1 -1
- package/esm/types/domain/Phone/CTIPhone.d.ts.map +1 -1
- package/esm/types/domain/Phone/WebRTCPhone.d.ts +22 -22
- package/esm/types/domain/Phone/WebRTCPhone.d.ts.map +1 -1
- package/esm/types/domain/types.d.ts +0 -4
- package/esm/types/domain/types.d.ts.map +1 -1
- package/esm/types/index.d.ts +5 -1
- package/esm/types/index.d.ts.map +1 -1
- package/esm/types/lib/WazoSessionDescriptionHandler.d.ts +3 -3
- package/esm/types/lib/WazoSessionDescriptionHandler.d.ts.map +1 -1
- package/esm/types/service/CallApi.d.ts +5 -5
- package/esm/types/service/CallApi.d.ts.map +1 -1
- package/esm/types/simple/Auth.d.ts +6 -1
- package/esm/types/simple/Auth.d.ts.map +1 -1
- package/esm/types/simple/Phone.d.ts +8 -8
- package/esm/types/simple/Phone.d.ts.map +1 -1
- package/esm/types/simple/index.d.ts +3 -1
- package/esm/types/simple/index.d.ts.map +1 -1
- package/esm/types/state-machine/softphone-state-machine.d.ts +1 -2
- package/esm/types/state-machine/softphone-state-machine.d.ts.map +1 -1
- package/esm/types/state-machine/utils.d.ts +2 -2
- package/esm/types/state-machine/utils.d.ts.map +1 -1
- package/esm/types/utils/api-requester.d.ts.map +1 -1
- package/esm/types/utils/sdp.d.ts +3 -2
- package/esm/types/utils/sdp.d.ts.map +1 -1
- package/esm/types/utils/webrtc.d.ts +1 -0
- package/esm/types/utils/webrtc.d.ts.map +1 -1
- package/esm/types/voice/call.d.ts +30 -12
- package/esm/types/voice/call.d.ts.map +1 -1
- package/esm/types/voice/softphone.d.ts +25 -13
- package/esm/types/voice/softphone.d.ts.map +1 -1
- package/esm/types/web-rtc-client.d.ts +39 -38
- package/esm/types/web-rtc-client.d.ts.map +1 -1
- package/esm/utils/__tests__/api-requester.test.js +17 -0
- package/esm/utils/api-requester.js +9 -1
- package/esm/utils/sdp.js +22 -9
- package/esm/utils/webrtc.js +24 -4
- package/esm/voice/call.js +130 -38
- package/esm/voice/softphone.js +145 -35
- package/esm/web-rtc-client.js +61 -58
- package/lib/__tests__/__voice__/call.test.js +56 -1
- package/lib/__tests__/api-client.test.js +20 -1
- package/lib/api/auth.js +16 -2
- package/lib/checker/checks/webrtc.js +1 -1
- package/lib/domain/CallLog.js +2 -3
- package/lib/domain/Phone/CTIPhone.js +2 -2
- package/lib/domain/Phone/WebRTCPhone.js +63 -62
- package/lib/index.js +11 -3
- package/lib/service/CallApi.js +2 -2
- package/lib/simple/Auth.js +21 -15
- package/lib/simple/Phone.js +3 -2
- package/lib/simple/__tests__/Auth.test.js +11 -64
- package/lib/simple/index.js +2 -1
- package/lib/simple/room/Room.js +1 -1
- package/lib/simple/room/SipRoom.js +1 -1
- package/lib/state-machine/call-state-machine.js +2 -2
- package/lib/state-machine/softphone-state-machine.js +1 -2
- package/lib/state-machine/utils.js +8 -3
- package/lib/types/api/auth.d.ts +3 -0
- package/lib/types/api/auth.d.ts.map +1 -1
- package/lib/types/checker/checks/index.d.ts +1 -1
- package/lib/types/checker/checks/webrtc-transport.d.ts +2 -2
- package/lib/types/checker/checks/webrtc-transport.d.ts.map +1 -1
- package/lib/types/domain/CallLog.d.ts.map +1 -1
- package/lib/types/domain/CallSession.d.ts +3 -3
- package/lib/types/domain/CallSession.d.ts.map +1 -1
- package/lib/types/domain/Phone/CTIPhone.d.ts.map +1 -1
- package/lib/types/domain/Phone/WebRTCPhone.d.ts +22 -22
- package/lib/types/domain/Phone/WebRTCPhone.d.ts.map +1 -1
- package/lib/types/domain/types.d.ts +0 -4
- package/lib/types/domain/types.d.ts.map +1 -1
- package/lib/types/index.d.ts +5 -1
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/lib/WazoSessionDescriptionHandler.d.ts +3 -3
- package/lib/types/lib/WazoSessionDescriptionHandler.d.ts.map +1 -1
- package/lib/types/service/CallApi.d.ts +5 -5
- package/lib/types/service/CallApi.d.ts.map +1 -1
- package/lib/types/simple/Auth.d.ts +6 -1
- package/lib/types/simple/Auth.d.ts.map +1 -1
- package/lib/types/simple/Phone.d.ts +8 -8
- package/lib/types/simple/Phone.d.ts.map +1 -1
- package/lib/types/simple/index.d.ts +3 -1
- package/lib/types/simple/index.d.ts.map +1 -1
- package/lib/types/state-machine/softphone-state-machine.d.ts +1 -2
- package/lib/types/state-machine/softphone-state-machine.d.ts.map +1 -1
- package/lib/types/state-machine/utils.d.ts +2 -2
- package/lib/types/state-machine/utils.d.ts.map +1 -1
- package/lib/types/utils/api-requester.d.ts.map +1 -1
- package/lib/types/utils/sdp.d.ts +3 -2
- package/lib/types/utils/sdp.d.ts.map +1 -1
- package/lib/types/utils/webrtc.d.ts +1 -0
- package/lib/types/utils/webrtc.d.ts.map +1 -1
- package/lib/types/voice/call.d.ts +30 -12
- package/lib/types/voice/call.d.ts.map +1 -1
- package/lib/types/voice/softphone.d.ts +25 -13
- package/lib/types/voice/softphone.d.ts.map +1 -1
- package/lib/types/web-rtc-client.d.ts +39 -38
- package/lib/types/web-rtc-client.d.ts.map +1 -1
- package/lib/utils/__tests__/api-requester.test.js +17 -0
- package/lib/utils/api-requester.js +9 -1
- package/lib/utils/sdp.js +25 -10
- package/lib/utils/webrtc.js +25 -4
- package/lib/voice/call.js +131 -36
- package/lib/voice/softphone.js +150 -35
- package/lib/web-rtc-client.js +59 -57
- package/package.json +1 -1
- package/src/__tests__/__voice__/call.test.ts +63 -2
- package/src/__tests__/api-client.test.ts +22 -1
- package/src/api/auth.ts +30 -3
- package/src/checker/checks/webrtc-transport.ts +2 -2
- package/src/checker/checks/webrtc.ts +2 -2
- package/src/domain/CallLog.ts +2 -3
- package/src/domain/CallSession.ts +3 -3
- package/src/domain/Phone/CTIPhone.ts +3 -2
- package/src/domain/Phone/WebRTCPhone.ts +95 -93
- package/src/domain/types.ts +0 -5
- package/src/index.ts +6 -1
- package/src/lib/WazoSessionDescriptionHandler.ts +3 -3
- package/src/service/CallApi.ts +7 -7
- package/src/simple/Auth.ts +21 -16
- package/src/simple/Phone.ts +12 -11
- package/src/simple/__tests__/Auth.test.ts +9 -87
- package/src/simple/index.ts +2 -1
- package/src/simple/room/Room.ts +3 -3
- package/src/simple/room/SipRoom.ts +3 -3
- package/src/state-machine/call-state-machine.ts +2 -2
- package/src/state-machine/softphone-state-machine.ts +1 -2
- package/src/state-machine/utils.ts +12 -5
- package/src/utils/__tests__/api-requester.test.ts +20 -0
- package/src/utils/api-requester.ts +9 -1
- package/src/utils/sdp.ts +26 -11
- package/src/utils/webrtc.ts +27 -5
- package/src/voice/call.ts +169 -50
- package/src/voice/softphone.ts +180 -41
- 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
|
|
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
|
-
|
|
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
|
|
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 {
|
|
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 || !
|
|
32
|
+
if (!sipSession || !getSipCallId(sipSession)) {
|
|
33
33
|
return handleError('Unable to make call through WebRTC');
|
|
34
34
|
}
|
|
35
35
|
setTimeout(() => {
|
package/esm/domain/CallLog.js
CHANGED
|
@@ -53,8 +53,7 @@ export default class CallLog {
|
|
|
53
53
|
}
|
|
54
54
|
static parseNew(plain, session) {
|
|
55
55
|
const callLog = CallLog.parse(plain);
|
|
56
|
-
|
|
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) {
|