@wazo/sdk 1.0.0-alpha.2 → 1.0.0-alpha.20
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 +2 -2
- package/esm/__tests__/__voice__/call.test.js +52 -3
- package/esm/api/auth.js +3 -0
- 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 +59 -57
- package/esm/index.js +3 -1
- package/esm/service/CallApi.js +4 -4
- package/esm/simple/Auth.js +13 -3
- package/esm/simple/Phone.js +5 -5
- 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 +34 -19
- package/esm/state-machine/softphone-state-machine.js +1 -2
- package/esm/state-machine/utils.js +10 -4
- 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 +3 -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/call-state-machine.d.ts +12 -1
- package/esm/types/state-machine/call-state-machine.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 +1 -1
- package/esm/types/state-machine/utils.d.ts.map +1 -1
- package/esm/types/utils/sdp.d.ts +1 -2
- package/esm/types/utils/sdp.d.ts.map +1 -1
- package/esm/types/utils/update-from.d.ts +1 -1
- package/esm/types/utils/update-from.d.ts.map +1 -1
- package/esm/types/utils/webrtc.d.ts.map +1 -1
- package/esm/types/voice/call.d.ts +15 -3
- package/esm/types/voice/call.d.ts.map +1 -1
- package/esm/types/voice/softphone.d.ts +7 -0
- 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/sdp.js +16 -9
- package/esm/utils/update-from.js +2 -2
- package/esm/utils/webrtc.js +10 -4
- package/esm/voice/call.js +86 -28
- package/esm/voice/softphone.js +58 -17
- package/esm/web-rtc-client.js +67 -58
- package/lib/__tests__/__voice__/call.test.js +51 -2
- package/lib/api/auth.js +3 -0
- 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 +58 -56
- package/lib/index.js +7 -3
- package/lib/service/CallApi.js +2 -2
- package/lib/simple/Auth.js +15 -3
- package/lib/simple/Phone.js +2 -2
- 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 +35 -20
- package/lib/state-machine/softphone-state-machine.js +1 -2
- package/lib/state-machine/utils.js +10 -4
- 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 +3 -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/call-state-machine.d.ts +12 -1
- package/lib/types/state-machine/call-state-machine.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 +1 -1
- package/lib/types/state-machine/utils.d.ts.map +1 -1
- package/lib/types/utils/sdp.d.ts +1 -2
- package/lib/types/utils/sdp.d.ts.map +1 -1
- package/lib/types/utils/update-from.d.ts +1 -1
- package/lib/types/utils/update-from.d.ts.map +1 -1
- package/lib/types/utils/webrtc.d.ts.map +1 -1
- package/lib/types/voice/call.d.ts +15 -3
- package/lib/types/voice/call.d.ts.map +1 -1
- package/lib/types/voice/softphone.d.ts +7 -0
- 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/sdp.js +17 -10
- package/lib/utils/update-from.js +2 -2
- package/lib/utils/webrtc.js +11 -4
- package/lib/voice/call.js +89 -27
- package/lib/voice/softphone.js +62 -17
- package/lib/web-rtc-client.js +66 -57
- package/package.json +1 -1
- package/src/__tests__/__voice__/call.test.ts +61 -3
- package/src/api/auth.ts +5 -0
- 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 +87 -85
- package/src/domain/__tests__/CallSession.test.ts +4 -0
- package/src/domain/types.ts +0 -5
- package/src/index.ts +4 -1
- package/src/lib/WazoSessionDescriptionHandler.ts +3 -3
- package/src/service/CallApi.ts +7 -7
- package/src/simple/Auth.ts +15 -3
- package/src/simple/Phone.ts +11 -11
- 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 +38 -19
- package/src/state-machine/softphone-state-machine.ts +1 -2
- package/src/state-machine/utils.ts +12 -4
- package/src/utils/sdp.ts +18 -11
- package/src/utils/update-from.ts +2 -2
- package/src/utils/webrtc.ts +11 -4
- package/src/voice/call.ts +109 -36
- package/src/voice/softphone.ts +75 -18
- package/src/web-rtc-client.ts +112 -98
|
@@ -10,7 +10,7 @@ import { OutgoingByeRequest, OutgoingInviteRequest, OutgoingRequest } from 'sip.
|
|
|
10
10
|
import { Inviter, Invitation, Registerer } from 'sip.js/lib/api';
|
|
11
11
|
import Emitter from './utils/Emitter';
|
|
12
12
|
import Heartbeat from './utils/Heartbeat';
|
|
13
|
-
import type { MediaConfig, UserAgentConfigOverrides, WebRtcConfig,
|
|
13
|
+
import type { MediaConfig, UserAgentConfigOverrides, WebRtcConfig, SipCall } from './domain/types';
|
|
14
14
|
export declare const events: string[];
|
|
15
15
|
export declare const transportEvents: string[];
|
|
16
16
|
export declare class CanceledCallError extends Error {
|
|
@@ -35,7 +35,7 @@ export default class WebRTCClient extends Emitter {
|
|
|
35
35
|
heartbeatTimeoutCb: ((...args: Array<any>) => any) | null | undefined;
|
|
36
36
|
heartbeatCb: ((...args: Array<any>) => any) | null | undefined;
|
|
37
37
|
statsIntervals: Record<string, any>;
|
|
38
|
-
sipSessions: Record<string,
|
|
38
|
+
sipSessions: Record<string, SipCall>;
|
|
39
39
|
conferences: Record<string, boolean>;
|
|
40
40
|
skipRegister: boolean;
|
|
41
41
|
networkMonitoringInterval: Record<string, any>;
|
|
@@ -43,6 +43,7 @@ export default class WebRTCClient extends Emitter {
|
|
|
43
43
|
forceClosed: boolean;
|
|
44
44
|
ON_USER_AGENT: string;
|
|
45
45
|
REGISTERED: string;
|
|
46
|
+
REGISTERING: string;
|
|
46
47
|
UNREGISTERED: string;
|
|
47
48
|
REGISTRATION_FAILED: string;
|
|
48
49
|
INVITE: string;
|
|
@@ -60,7 +61,7 @@ export default class WebRTCClient extends Emitter {
|
|
|
60
61
|
ON_EARLY_MEDIA: string;
|
|
61
62
|
ON_PROGRESS: string;
|
|
62
63
|
ON_DISCONNECTED: string;
|
|
63
|
-
constructor(config: WebRtcConfig, session?:
|
|
64
|
+
constructor(config: WebRtcConfig, session?: SipCall, uaConfigOverrides?: UserAgentConfigOverrides);
|
|
64
65
|
configureMedia(media: MediaConfig): void;
|
|
65
66
|
setMediaConstraints(media: MediaStreamConstraints): void;
|
|
66
67
|
createUserAgent(uaConfigOverrides?: UserAgentConfigOverrides): UserAgent;
|
|
@@ -73,40 +74,40 @@ export default class WebRTCClient extends Emitter {
|
|
|
73
74
|
_monkeyPatchRegisterer(registerer: Registerer | null | undefined): void;
|
|
74
75
|
unregister(): Promise<void>;
|
|
75
76
|
stop(): Promise<void>;
|
|
76
|
-
call(number: string, enableVideo?: boolean, audioOnly?: boolean, conference?: boolean, options?: {}):
|
|
77
|
+
call(number: string, enableVideo?: boolean, audioOnly?: boolean, conference?: boolean, options?: {}): SipCall | null;
|
|
77
78
|
answer(session: Invitation, enableVideo?: boolean): Promise<void>;
|
|
78
|
-
hangup(session:
|
|
79
|
-
startNetworkMonitoring(session:
|
|
80
|
-
stopNetworkMonitoring(session:
|
|
81
|
-
reject(session:
|
|
79
|
+
hangup(session: SipCall): Promise<OutgoingByeRequest | null>;
|
|
80
|
+
startNetworkMonitoring(session: SipCall, interval?: number): void;
|
|
81
|
+
stopNetworkMonitoring(session: SipCall): void;
|
|
82
|
+
reject(session: SipCall): Promise<void>;
|
|
82
83
|
close(force?: boolean): Promise<void>;
|
|
83
|
-
mute(session:
|
|
84
|
-
unmute(session:
|
|
85
|
-
isAudioMuted(session:
|
|
86
|
-
toggleCameraOn(session:
|
|
87
|
-
toggleCameraOff(session:
|
|
88
|
-
hold(session:
|
|
89
|
-
unhold(session:
|
|
84
|
+
mute(session: SipCall): void;
|
|
85
|
+
unmute(session: SipCall): void;
|
|
86
|
+
isAudioMuted(session: SipCall): boolean;
|
|
87
|
+
toggleCameraOn(session: SipCall): void;
|
|
88
|
+
toggleCameraOff(session: SipCall): void;
|
|
89
|
+
hold(session: SipCall, isConference?: boolean, hadVideo?: boolean): Promise<OutgoingInviteRequest | void>;
|
|
90
|
+
unhold(session: SipCall, isConference?: boolean): Promise<OutgoingInviteRequest | void>;
|
|
90
91
|
getHeldSession(sessionId: string): any;
|
|
91
|
-
isCallHeld(session:
|
|
92
|
+
isCallHeld(session: SipCall): boolean;
|
|
92
93
|
isVideoRemotelyHeld(sessionId: string): boolean;
|
|
93
|
-
sendDTMF(session:
|
|
94
|
+
sendDTMF(session: SipCall, tone: string): boolean;
|
|
94
95
|
message(destination: string, message: string): void;
|
|
95
|
-
transfer(session:
|
|
96
|
-
atxfer(session:
|
|
97
|
-
sendMessage(sipSession:
|
|
96
|
+
transfer(session: SipCall, target: string): void;
|
|
97
|
+
atxfer(session: SipCall): Record<string, any>;
|
|
98
|
+
sendMessage(sipSession: SipCall | null | undefined, body: string, contentType?: string): void;
|
|
98
99
|
pingServer(): OutgoingRequest | void;
|
|
99
100
|
getState(): UserAgentState;
|
|
100
101
|
getContactIdentifier(): string | null;
|
|
101
102
|
changeAudioOutputVolume(volume: number): void;
|
|
102
103
|
changeAudioOutputDevice(id: string): Promise<void>;
|
|
103
|
-
changeAudioInputDevice(id: string, session:
|
|
104
|
-
changeVideoInputDevice(id: string, session?:
|
|
104
|
+
changeAudioInputDevice(id: string, session: SipCall | null | undefined, force?: boolean): Promise<MediaStream | null>;
|
|
105
|
+
changeVideoInputDevice(id: string, session?: SipCall): Promise<MediaStream | void>;
|
|
105
106
|
setVideoInputDevice(id: string): null | undefined;
|
|
106
|
-
changeSessionVideoInputDevice(id: string | null | undefined, session:
|
|
107
|
+
changeSessionVideoInputDevice(id: string | null | undefined, session: SipCall): Promise<MediaStream | void>;
|
|
107
108
|
getAudioDeviceId(): string | null | undefined;
|
|
108
109
|
getVideoDeviceId(): string | null;
|
|
109
|
-
reinvite(sipSession:
|
|
110
|
+
reinvite(sipSession: SipCall, newConstraints?: Record<string, any> | null | undefined, conference?: boolean, audioOnly?: boolean, iceRestart?: boolean): Promise<OutgoingInviteRequest | void>;
|
|
110
111
|
getUserMedia(constraints: Record<string, any>): Promise<MediaStream>;
|
|
111
112
|
getPeerConnection(sessionId: string): RTCPeerConnection | null | undefined;
|
|
112
113
|
getLocalStream(sessionId: string): MediaStream | null;
|
|
@@ -128,15 +129,15 @@ export default class WebRTCClient extends Emitter {
|
|
|
128
129
|
stopHeartbeat(): void;
|
|
129
130
|
setOnHeartbeatTimeout(cb: (...args: Array<any>) => any): void;
|
|
130
131
|
setOnHeartbeatCallback(cb: (...args: Array<any>) => any): void;
|
|
131
|
-
onCallEnded(session:
|
|
132
|
+
onCallEnded(session: SipCall): void;
|
|
132
133
|
attemptReconnection(): void;
|
|
133
|
-
storeSipSession(session:
|
|
134
|
-
getSipSession(id: string):
|
|
135
|
-
|
|
134
|
+
storeSipSession(session: SipCall): void;
|
|
135
|
+
getSipSession(id: string): SipCall | null | undefined;
|
|
136
|
+
getSipCallIds(): string[];
|
|
136
137
|
updateLocalStream(sipSessionId: string, newStream: MediaStream): Promise<void>;
|
|
137
138
|
isConference(sessionId: string): boolean;
|
|
138
139
|
createAudioElementFor(sessionId: string): Promise<HTMLAudioElement>;
|
|
139
|
-
_onTransportError(): void;
|
|
140
|
+
_onTransportError(reason?: string): void;
|
|
140
141
|
enableLogger(logConnector: (level: any, className: string, label: any, content: string) => void): void;
|
|
141
142
|
_onHeartbeat(message: string | Record<string, any>): void;
|
|
142
143
|
_onHeartbeatTimeout(): Promise<void>;
|
|
@@ -144,20 +145,20 @@ export default class WebRTCClient extends Emitter {
|
|
|
144
145
|
_getAudioConstraints(): MediaTrackConstraints | boolean;
|
|
145
146
|
_getVideoConstraints(video?: boolean): MediaTrackConstraints | boolean;
|
|
146
147
|
_connectIfNeeded(): Promise<any>;
|
|
147
|
-
_buildConfig(config: WebRtcConfig, session:
|
|
148
|
-
_setupSession(session:
|
|
149
|
-
_onProgress(session:
|
|
150
|
-
_onAccepted(session:
|
|
151
|
-
_setupMedias(session:
|
|
152
|
-
_cleanupMedia(session?:
|
|
148
|
+
_buildConfig(config: WebRtcConfig, session: SipCall | null | undefined): Promise<WebRtcConfig>;
|
|
149
|
+
_setupSession(session: SipCall): void;
|
|
150
|
+
_onProgress(session: SipCall, early?: boolean): Promise<void>;
|
|
151
|
+
_onAccepted(session: SipCall, sessionDialog?: SessionDialog, withEvent?: boolean, initAllTracks?: boolean): Promise<void>;
|
|
152
|
+
_setupMedias(session: SipCall, newStream?: MediaStream | null | undefined): Promise<void>;
|
|
153
|
+
_cleanupMedia(session?: SipCall): void;
|
|
153
154
|
_cleanupRegister(): void;
|
|
154
|
-
_startSendingStats(session:
|
|
155
|
-
_stopSendingStats(session:
|
|
155
|
+
_startSendingStats(session: SipCall): void;
|
|
156
|
+
_stopSendingStats(session: SipCall): void;
|
|
156
157
|
_disconnectTransport(force?: boolean): Promise<void>;
|
|
157
158
|
_fetchNetworkStats(sessionId: string): Promise<Record<string, any> | null | undefined>;
|
|
158
159
|
_accept(session: Invitation, options?: InvitationAcceptOptions): Promise<void>;
|
|
159
160
|
_reject(session: Invitation, options?: InvitationRejectOptions): Promise<void>;
|
|
160
161
|
_cancel(session: Inviter, options?: InviterCancelOptions): Promise<void>;
|
|
161
|
-
_bye(session:
|
|
162
|
+
_bye(session: SipCall, options?: SessionByeOptions): Promise<OutgoingByeRequest | null>;
|
|
162
163
|
}
|
|
163
164
|
//# sourceMappingURL=web-rtc-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-rtc-client.d.ts","sourceRoot":"","sources":["../../src/web-rtc-client.ts"],"names":[],"mappings":"AAGA,OAAO,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AACxF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AACxF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAG5E,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAIjE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAStD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAoC,MAAM,gBAAgB,CAAC;AACnG,OAAO,OAAO,MAAM,iBAAiB,CAAC;AAGtC,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAE1C,OAAO,KAAK,EAAE,WAAW,EAAE,wBAAwB,EAAE,YAAY,EAAoC,
|
|
1
|
+
{"version":3,"file":"web-rtc-client.d.ts","sourceRoot":"","sources":["../../src/web-rtc-client.ts"],"names":[],"mappings":"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"}
|
package/esm/utils/sdp.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/* eslint-disable no-underscore-dangle */
|
|
2
2
|
import sdpParser from 'sdp-transform';
|
|
3
3
|
import { UserAgent } from 'sip.js/lib/api/user-agent';
|
|
4
|
-
import { Inviter } from 'sip.js/lib/api';
|
|
5
|
-
|
|
4
|
+
import { Inviter, Invitation } from 'sip.js/lib/api';
|
|
5
|
+
import { SessionDialog } from 'sip.js/lib/core/dialogs/session-dialog';
|
|
6
6
|
export const getCandidates = (rawSdp) => {
|
|
7
7
|
if (!rawSdp) {
|
|
8
8
|
return [];
|
|
@@ -106,22 +106,29 @@ export const addIcesInAllBundles = (sdp) => {
|
|
|
106
106
|
}));
|
|
107
107
|
return sdpParser.write(parsedSdp);
|
|
108
108
|
};
|
|
109
|
-
export const
|
|
109
|
+
export const getSipCallId = (sipSession) => {
|
|
110
110
|
if (!sipSession) {
|
|
111
111
|
return '';
|
|
112
112
|
}
|
|
113
|
-
const message = sipSession.message;
|
|
114
|
-
if (message?.callId) {
|
|
115
|
-
return message.callId.substring(0, SIP_ID_LENGTH);
|
|
116
|
-
}
|
|
117
113
|
// For Inviter
|
|
118
114
|
// @ts-ignore: private
|
|
119
115
|
if (sipSession instanceof Inviter && sipSession.outgoingRequestMessage) {
|
|
120
116
|
// @ts-ignore: private
|
|
121
|
-
return sipSession.outgoingRequestMessage.callId
|
|
117
|
+
return sipSession.outgoingRequestMessage.callId;
|
|
122
118
|
}
|
|
123
119
|
// For Invitation
|
|
124
|
-
|
|
120
|
+
// @ts-ignore: private
|
|
121
|
+
if (sipSession instanceof Invitation && sipSession.incomingInviteRequest.message) {
|
|
122
|
+
// @ts-ignore: private
|
|
123
|
+
return sipSession.incomingInviteRequest.message.callId;
|
|
124
|
+
}
|
|
125
|
+
// For EarlyMedia
|
|
126
|
+
// @ts-ignore: private
|
|
127
|
+
if (sipSession instanceof SessionDialog) {
|
|
128
|
+
// @ts-ignore: private
|
|
129
|
+
return sipSession.dialogState.callId;
|
|
130
|
+
}
|
|
131
|
+
return sipSession.id;
|
|
125
132
|
};
|
|
126
133
|
// We need to replace 0.0.0.0 to 127.0.0.1 in the sdp to avoid MOH during a createOffer.
|
|
127
134
|
export const replaceLocalIpModifier = (description) => Promise.resolve({
|
package/esm/utils/update-from.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* eslint-disable no-param-reassign */
|
|
2
|
-
export default ((instance, from) => {
|
|
3
|
-
Object.keys(from)
|
|
2
|
+
export default ((instance, from, attributes = null) => {
|
|
3
|
+
(attributes || Object.keys(from))
|
|
4
4
|
.forEach(key => {
|
|
5
5
|
if ((!instance[key] && from[key])
|
|
6
6
|
|| (typeof instance[key] !== 'undefined' && typeof from[key] !== 'undefined' && instance[key] !== from[key])) {
|
package/esm/utils/webrtc.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defaultPeerConnectionConfiguration } from 'sip.js/lib/platform/web/session-description-handler/peer-connection-configuration-default';
|
|
2
2
|
import { stripVideo } from 'sip.js/lib/platform/web';
|
|
3
3
|
import WazoSessionDescriptionHandler, { wazoMediaStreamFactory } from '../lib/WazoSessionDescriptionHandler';
|
|
4
|
-
import { getVideoDirection, hasAnActiveVideo, makeURI, replaceLocalIpModifier } from './sdp';
|
|
4
|
+
import { getSipCallId, getVideoDirection, hasAnActiveVideo, makeURI, replaceLocalIpModifier } from './sdp';
|
|
5
5
|
import IssueReporter from '../service/IssueReporter';
|
|
6
6
|
import { lastIndexOf } from './array';
|
|
7
7
|
const logger = IssueReporter.loggerFor('webrtc');
|
|
@@ -121,6 +121,9 @@ export const sessionWantsToDoVideo = (sipCall) => {
|
|
|
121
121
|
const { body, } = sipCall.request || sipCall;
|
|
122
122
|
// Sometimes with InviteClientContext the body is in the body attribute ...
|
|
123
123
|
const sdp = typeof body === 'object' && body ? body.body : body;
|
|
124
|
+
if (!sdp) {
|
|
125
|
+
return sipCall.sessionDescriptionHandler?.localMediaStreamConstraints?.video;
|
|
126
|
+
}
|
|
124
127
|
return hasAnActiveVideo(sdp);
|
|
125
128
|
};
|
|
126
129
|
export const getWebRtcStats = async (sipCall) => {
|
|
@@ -176,6 +179,9 @@ export const toggleVideo = (sipCall, muteCamera) => {
|
|
|
176
179
|
export const isVideoMuted = (sipCall) => {
|
|
177
180
|
const sdh = sipCall.sessionDescriptionHandler;
|
|
178
181
|
const pc = sdh?.peerConnection;
|
|
182
|
+
if (!pc) {
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
179
185
|
if (pc?.getSenders) {
|
|
180
186
|
for (const sender of pc.getSenders()) {
|
|
181
187
|
if (sender && sender.track && sender.track.kind === 'video') {
|
|
@@ -198,7 +204,7 @@ export const cleanupStream = (stream) => {
|
|
|
198
204
|
};
|
|
199
205
|
export const setLocalMediaStream = (sipCall, newStream) => {
|
|
200
206
|
logger.info('setting local media stream', {
|
|
201
|
-
id: sipCall
|
|
207
|
+
id: getSipCallId(sipCall),
|
|
202
208
|
tracks: newStream ? newStream.getTracks() : null,
|
|
203
209
|
});
|
|
204
210
|
if (sipCall.sessionDescriptionHandler) {
|
|
@@ -211,7 +217,7 @@ export const updateRemoteStream = (sipCall, allTracks = true) => {
|
|
|
211
217
|
const remoteStream = getRemoteStream(sipCall);
|
|
212
218
|
const pc = getPeerConnection(sipCall);
|
|
213
219
|
logger.info('Updating remote stream', {
|
|
214
|
-
id: sipCall
|
|
220
|
+
id: getSipCallId(sipCall),
|
|
215
221
|
tracks: remoteStream ? remoteStream.getTracks() : null,
|
|
216
222
|
receiverTracks: pc && pc.getReceivers ? pc.getReceivers().map((receiver) => receiver.track) : null,
|
|
217
223
|
});
|
|
@@ -241,7 +247,7 @@ export const getVideoConstraints = (video = false) => {
|
|
|
241
247
|
return false;
|
|
242
248
|
}
|
|
243
249
|
// @ts-ignore: media constraints
|
|
244
|
-
return
|
|
250
|
+
return video?.deviceId?.exact ? video : true;
|
|
245
251
|
};
|
|
246
252
|
// eslint-disable-next-line no-unused-vars
|
|
247
253
|
const getRtcOptions = () => {
|
package/esm/voice/call.js
CHANGED
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
/* eslint-disable no-underscore-dangle */
|
|
2
2
|
import { EventEmitter } from 'events';
|
|
3
3
|
import { createActor } from 'xstate';
|
|
4
|
+
import { Inviter } from 'sip.js/lib/api/inviter';
|
|
4
5
|
import { Invitation } from 'sip.js/lib/api/invitation';
|
|
5
6
|
import { SessionState } from 'sip.js/lib/api/session-state';
|
|
6
7
|
import callStateMachine, { Actions, EstablishedActions, States, EstablishedStates } from '../state-machine/call-state-machine';
|
|
8
|
+
import newFrom from '../utils/new-from';
|
|
9
|
+
import updateFrom from '../utils/update-from';
|
|
7
10
|
import IssueReporter from '../service/IssueReporter';
|
|
8
|
-
import softphone
|
|
9
|
-
import { getCallDisplayName, getCallNumber,
|
|
11
|
+
import softphone from './softphone';
|
|
12
|
+
import { getCallDisplayName, getCallNumber, getSipCallId } from '../utils/sdp';
|
|
10
13
|
import { assertCan, assertState, getState } from '../state-machine/utils';
|
|
11
|
-
import { downgradeToAudio, getLocalStream, getLocalVideoStream, getPeerConnection, getRemoteStream, getRemoteVideoStream, getStreamFromConstraints, getWebRtcStats, hasALocalVideoTrack, hasLocalVideo, hasRemoteVideo, isVideoMuted, isVideoRemotelyHeld, setLocalMediaStream, toggleVideo, upgradeToVideo } from '../utils/webrtc';
|
|
14
|
+
import { downgradeToAudio, getLocalStream, getLocalVideoStream, getPeerConnection, getRemoteStream, getRemoteVideoStream, getStreamFromConstraints, getWebRtcStats, hasALocalVideoTrack, hasLocalVideo, hasRemoteVideo, isVideoMuted, isVideoRemotelyHeld, sessionWantsToDoVideo, setLocalMediaStream, toggleVideo, upgradeToVideo } from '../utils/webrtc';
|
|
12
15
|
const logger = IssueReporter.loggerFor('call');
|
|
13
16
|
// Events
|
|
14
|
-
export const
|
|
17
|
+
export const EVENT_CALL_REMOTLY_ACCEPTED = 'remotelyAccepted';
|
|
18
|
+
export const EVENT_CALL_LOCALLY_ACCEPTED = 'locallyAccepted';
|
|
15
19
|
export const EVENT_CALL_CANCELED = 'canceled';
|
|
16
20
|
export const EVENT_PROGRESS = 'progress';
|
|
17
21
|
export const EVENT_EARLY_MEDIA = 'earlyMedia';
|
|
@@ -37,6 +41,7 @@ export const EVENT_CAMERA_DISABLED = 'onCameraDisabled';
|
|
|
37
41
|
export const MESSAGE_TYPE_CHAT = 'message/TYPE_CHAT';
|
|
38
42
|
export const MESSAGE_TYPE_SIGNAL = 'message/TYPE_SIGNAL';
|
|
39
43
|
export const MESSAGE_TRACK_UPDATED = 'onTrackUpdated';
|
|
44
|
+
const attributesToUpdate = ['apiId', 'talkingToIds', 'creationTime', 'answerTime', 'endTime', 'recording', 'recordingPaused', 'displayName', 'number'];
|
|
40
45
|
class Call extends EventEmitter {
|
|
41
46
|
callActor;
|
|
42
47
|
// Wazo call id, used in Wazo Websocket and API
|
|
@@ -49,9 +54,13 @@ class Call extends EventEmitter {
|
|
|
49
54
|
phone;
|
|
50
55
|
shouldSendReinvite = false;
|
|
51
56
|
recording = false;
|
|
57
|
+
recordingPaused = false;
|
|
52
58
|
displayName;
|
|
53
59
|
number;
|
|
54
60
|
currentScreenShare;
|
|
61
|
+
static newFrom(call) {
|
|
62
|
+
return newFrom(call, Call);
|
|
63
|
+
}
|
|
55
64
|
static parseCall(apiCall) {
|
|
56
65
|
const sipCall = {
|
|
57
66
|
id: apiCall.sipCallId,
|
|
@@ -61,28 +70,40 @@ class Call extends EventEmitter {
|
|
|
61
70
|
remoteIdentity: {
|
|
62
71
|
uri: {
|
|
63
72
|
_normal: {
|
|
64
|
-
user: apiCall.calleeNumber,
|
|
73
|
+
user: apiCall.calleeName || apiCall.calleeNumber,
|
|
65
74
|
},
|
|
66
75
|
},
|
|
67
76
|
},
|
|
68
77
|
// Mock sdk so `hasLocalVideo` will return true.
|
|
69
78
|
sessionDescriptionHandler: {
|
|
70
79
|
localMediaStream: {
|
|
71
|
-
getTracks: () => (apiCall.isVideo ? [{ kind: 'video', readyState: 'live' }] : []),
|
|
80
|
+
getTracks: () => (apiCall.isVideo ? [{ id: 'mocked', kind: 'video', readyState: 'live' }] : []),
|
|
72
81
|
},
|
|
73
82
|
},
|
|
74
83
|
};
|
|
75
84
|
const call = new Call(sipCall, softphone);
|
|
76
|
-
// call._sendAction(Actions.ES);
|
|
77
85
|
call.apiId = apiCall.id;
|
|
78
|
-
call.
|
|
86
|
+
call.creationTime = new Date(+apiCall.startingTime);
|
|
87
|
+
call.recording = apiCall.isRecording();
|
|
79
88
|
// Update call state
|
|
80
89
|
const snapshot = call.callActor.getSnapshot();
|
|
81
90
|
if (apiCall.isUp()) {
|
|
82
|
-
snapshot.value = {
|
|
91
|
+
snapshot.value = {
|
|
92
|
+
[States.ESTABLISHED]: {
|
|
93
|
+
[EstablishedStates.ONGOING]: {},
|
|
94
|
+
muteState: EstablishedStates.UN_MUTED,
|
|
95
|
+
holdState: EstablishedStates.UN_HELD,
|
|
96
|
+
},
|
|
97
|
+
};
|
|
83
98
|
}
|
|
84
99
|
if (apiCall.muted) {
|
|
85
|
-
snapshot.value = {
|
|
100
|
+
snapshot.value = {
|
|
101
|
+
[States.ESTABLISHED]: {
|
|
102
|
+
[EstablishedStates.ONGOING]: {},
|
|
103
|
+
muteState: EstablishedStates.MUTED,
|
|
104
|
+
holdState: EstablishedStates.UN_HELD,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
86
107
|
}
|
|
87
108
|
if (apiCall.isRinging()) {
|
|
88
109
|
snapshot.value = States.RINGING;
|
|
@@ -103,7 +124,6 @@ class Call extends EventEmitter {
|
|
|
103
124
|
this.sipCall = sipCall;
|
|
104
125
|
this.number = getCallNumber(sipCall);
|
|
105
126
|
this.displayName = getCallDisplayName(sipCall);
|
|
106
|
-
this._bindEvents();
|
|
107
127
|
}
|
|
108
128
|
async accept(options = {}) {
|
|
109
129
|
assertCan(this.callActor, Actions.ACCEPT);
|
|
@@ -114,6 +134,7 @@ class Call extends EventEmitter {
|
|
|
114
134
|
this.answerTime = new Date();
|
|
115
135
|
return this.phone.client.answer(this.sipCall, options.withCamera).then(() => {
|
|
116
136
|
logger.info('call - accepted', { id: this.id, ...options });
|
|
137
|
+
this.emit(EVENT_CALL_LOCALLY_ACCEPTED, this);
|
|
117
138
|
return this.id;
|
|
118
139
|
}).catch(e => {
|
|
119
140
|
logger.error(e);
|
|
@@ -124,14 +145,16 @@ class Call extends EventEmitter {
|
|
|
124
145
|
async reject() {
|
|
125
146
|
assertCan(this.callActor, Actions.REJECT);
|
|
126
147
|
logger.info('call - reject', { id: this.id });
|
|
127
|
-
this.
|
|
128
|
-
this.shouldSendReinvite = false;
|
|
129
|
-
return this.hangup();
|
|
148
|
+
return this._terminate();
|
|
130
149
|
}
|
|
131
150
|
async hangup() {
|
|
132
151
|
assertCan(this.callActor, Actions.HANGUP);
|
|
133
152
|
logger.info('call - hangup', { id: this.id });
|
|
153
|
+
return this._terminate();
|
|
154
|
+
}
|
|
155
|
+
async _terminate() {
|
|
134
156
|
await this.phone.client.hangup(this.sipCall);
|
|
157
|
+
this.shouldSendReinvite = false;
|
|
135
158
|
// Remove this call from softphone's calls
|
|
136
159
|
this.phone.onCallTerminated(this);
|
|
137
160
|
return true;
|
|
@@ -225,26 +248,38 @@ class Call extends EventEmitter {
|
|
|
225
248
|
turnCameraOn() {
|
|
226
249
|
assertState(this.callActor, States.ESTABLISHED);
|
|
227
250
|
logger.info('call - turn camera on', { id: this.id });
|
|
228
|
-
toggleVideo(this.sipCall,
|
|
251
|
+
toggleVideo(this.sipCall, false);
|
|
229
252
|
this.emit(EVENT_CAMERA_RESUMED);
|
|
230
253
|
}
|
|
231
254
|
turnCameraOff() {
|
|
232
255
|
assertState(this.callActor, States.ESTABLISHED);
|
|
233
256
|
logger.info('call - turn camera off', { id: this.id });
|
|
234
|
-
toggleVideo(this.sipCall,
|
|
257
|
+
toggleVideo(this.sipCall, true);
|
|
235
258
|
this.emit(EVENT_CAMERA_DISABLED);
|
|
236
259
|
}
|
|
237
260
|
isMuted() {
|
|
238
|
-
return this._hasEstablishedState(EstablishedStates.MUTED);
|
|
261
|
+
return this._hasEstablishedState('muteState', EstablishedStates.MUTED);
|
|
239
262
|
}
|
|
240
263
|
isCameraMuted() {
|
|
241
264
|
return isVideoMuted(this.sipCall);
|
|
242
265
|
}
|
|
243
266
|
isHeld() {
|
|
244
|
-
return this._hasEstablishedState(EstablishedStates.HELD);
|
|
267
|
+
return this._hasEstablishedState('holdState', EstablishedStates.HELD);
|
|
268
|
+
}
|
|
269
|
+
isEstablishing() {
|
|
270
|
+
return this.sipCall.state === SessionState.Establishing;
|
|
245
271
|
}
|
|
246
272
|
isEstablished() {
|
|
247
|
-
return States.ESTABLISHED in this.state;
|
|
273
|
+
return typeof this.state === 'object' && States.ESTABLISHED in this.state;
|
|
274
|
+
}
|
|
275
|
+
isRinging() {
|
|
276
|
+
return this.state === States.RINGING;
|
|
277
|
+
}
|
|
278
|
+
isOutgoing() {
|
|
279
|
+
return this.sipCall instanceof Inviter;
|
|
280
|
+
}
|
|
281
|
+
isIncoming() {
|
|
282
|
+
return !this.isOutgoing();
|
|
248
283
|
}
|
|
249
284
|
isConference() {
|
|
250
285
|
return getPeerConnection(this.sipCall)?.sfu;
|
|
@@ -252,7 +287,7 @@ class Call extends EventEmitter {
|
|
|
252
287
|
transfer(target) {
|
|
253
288
|
assertState(this.callActor, States.ESTABLISHED);
|
|
254
289
|
logger.info('call - transfer', { id: this.id, target });
|
|
255
|
-
this.phone.client.transfer(this.sipCall, target);
|
|
290
|
+
return this.phone.client.transfer(this.sipCall, target);
|
|
256
291
|
}
|
|
257
292
|
atxfer() {
|
|
258
293
|
assertState(this.callActor, States.ESTABLISHED);
|
|
@@ -381,9 +416,14 @@ class Call extends EventEmitter {
|
|
|
381
416
|
logger.info('call - updrading directly in screensharing mode', { id: this.id, tracks: localStream?.getTracks() });
|
|
382
417
|
this._onScreenSharing(localStream, false, desktop);
|
|
383
418
|
}
|
|
419
|
+
onMakeCall() {
|
|
420
|
+
this._bindEvents();
|
|
421
|
+
this._sendAction(Actions.MAKE_CALL);
|
|
422
|
+
}
|
|
384
423
|
onAccepted() {
|
|
424
|
+
this.answerTime = new Date();
|
|
385
425
|
this._sendAction(Actions.REMOTLY_ACCEPTED);
|
|
386
|
-
this.emit(
|
|
426
|
+
this.emit(EVENT_CALL_REMOTLY_ACCEPTED);
|
|
387
427
|
}
|
|
388
428
|
onProgress() {
|
|
389
429
|
this.emit(EVENT_PROGRESS);
|
|
@@ -399,6 +439,7 @@ class Call extends EventEmitter {
|
|
|
399
439
|
}
|
|
400
440
|
onCallIncoming() {
|
|
401
441
|
this._sendAction(Actions.INCOMING_CALL);
|
|
442
|
+
this._bindEvents();
|
|
402
443
|
}
|
|
403
444
|
onRejected() {
|
|
404
445
|
this.endTime = new Date();
|
|
@@ -420,6 +461,9 @@ class Call extends EventEmitter {
|
|
|
420
461
|
hasLocalVideo() {
|
|
421
462
|
return hasLocalVideo(this.sipCall);
|
|
422
463
|
}
|
|
464
|
+
wantsToDoVideo() {
|
|
465
|
+
return sessionWantsToDoVideo(this.sipCall);
|
|
466
|
+
}
|
|
423
467
|
getLocalStream() {
|
|
424
468
|
return getLocalStream(this.sipCall);
|
|
425
469
|
}
|
|
@@ -432,21 +476,33 @@ class Call extends EventEmitter {
|
|
|
432
476
|
isVideoRemotelyHeld() {
|
|
433
477
|
return isVideoRemotelyHeld(this.sipCall);
|
|
434
478
|
}
|
|
435
|
-
isRinging() {
|
|
436
|
-
return this.state === States.RINGING;
|
|
437
|
-
}
|
|
438
479
|
onReinvite(request, updatedCalleeName, updatedNumber, hadRemoteVideo) {
|
|
439
480
|
this.emit(EVENT_REINVITE, request, updatedCalleeName, updatedNumber, hadRemoteVideo);
|
|
440
481
|
}
|
|
482
|
+
updateFrom(call) {
|
|
483
|
+
updateFrom(this, call, attributesToUpdate);
|
|
484
|
+
}
|
|
485
|
+
is(otherCall) {
|
|
486
|
+
return otherCall && this.id && this.id === otherCall.id;
|
|
487
|
+
}
|
|
488
|
+
shouldAutoAnswer() {
|
|
489
|
+
return !!this.sipCall.request?.getHeader('alert-info');
|
|
490
|
+
}
|
|
441
491
|
get id() {
|
|
442
|
-
return
|
|
492
|
+
return getSipCallId(this.sipCall);
|
|
443
493
|
}
|
|
444
494
|
get state() {
|
|
445
495
|
return getState(this.callActor);
|
|
446
496
|
}
|
|
447
|
-
_hasEstablishedState(establishedState) {
|
|
497
|
+
_hasEstablishedState(subState, establishedState) {
|
|
448
498
|
const state = this.state;
|
|
449
|
-
|
|
499
|
+
if (typeof state !== 'object') {
|
|
500
|
+
return false;
|
|
501
|
+
}
|
|
502
|
+
if (!(States.ESTABLISHED in state)) {
|
|
503
|
+
return false;
|
|
504
|
+
}
|
|
505
|
+
return state[States.ESTABLISHED][subState] === establishedState;
|
|
450
506
|
}
|
|
451
507
|
_bindEvents() {
|
|
452
508
|
if (this.sipCall instanceof Invitation) {
|
|
@@ -459,7 +515,7 @@ class Call extends EventEmitter {
|
|
|
459
515
|
this.emit(EVENT_CALL_CANCELED, elsewhere);
|
|
460
516
|
};
|
|
461
517
|
}
|
|
462
|
-
this.sipCall
|
|
518
|
+
this.sipCall?.stateChange?.addListener((newState) => {
|
|
463
519
|
switch (newState) {
|
|
464
520
|
case SessionState.Terminating:
|
|
465
521
|
logger.info('call - terminating', { id: this.id });
|
|
@@ -581,7 +637,9 @@ class Call extends EventEmitter {
|
|
|
581
637
|
this.emit(EVENT_SHARE_SCREEN_STARTED, screenStream);
|
|
582
638
|
}
|
|
583
639
|
_sendAction(action) {
|
|
640
|
+
const was = this.state;
|
|
584
641
|
this.callActor.send({ type: action });
|
|
642
|
+
logger.trace('call - send action', { id: this.id, action, was, state: this.state });
|
|
585
643
|
}
|
|
586
644
|
}
|
|
587
645
|
export default Call;
|