@signalwire/js 1.3.0-dev.1 → 1.3.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 (65) hide show
  1. package/README.md +4 -2
  2. package/dist/esm/common/src/BaseSession.d.ts +8 -13
  3. package/dist/esm/common/src/BaseSession.js +33 -46
  4. package/dist/esm/common/src/BrowserSession.d.ts +20 -57
  5. package/dist/esm/common/src/BrowserSession.js +91 -359
  6. package/dist/esm/common/src/messages/Verto.d.ts +1 -10
  7. package/dist/esm/common/src/messages/Verto.js +1 -16
  8. package/dist/esm/common/src/messages/verto/Login.d.ts +1 -13
  9. package/dist/esm/common/src/messages/verto/Login.js +2 -5
  10. package/dist/esm/common/src/services/BroadcastHandler.js +3 -2
  11. package/dist/esm/common/src/services/Handler.d.ts +8 -9
  12. package/dist/esm/common/src/services/Handler.js +38 -41
  13. package/dist/esm/common/src/util/constants/index.d.ts +0 -1
  14. package/dist/esm/common/src/util/constants/index.js +0 -1
  15. package/dist/esm/common/src/util/helpers.d.ts +9 -2
  16. package/dist/esm/common/src/util/helpers.js +11 -6
  17. package/dist/esm/common/src/util/interfaces.d.ts +55 -20
  18. package/dist/esm/common/src/util/logger.js +1 -4
  19. package/dist/esm/common/src/util/webrtc/index.d.ts +1 -6
  20. package/dist/esm/common/src/util/webrtc/index.js +2 -63
  21. package/dist/esm/common/src/webrtc/BaseCall.d.ts +76 -0
  22. package/dist/esm/common/src/webrtc/BaseCall.js +701 -0
  23. package/dist/esm/common/src/webrtc/Call.d.ts +5 -5
  24. package/dist/esm/common/src/webrtc/Call.js +15 -34
  25. package/dist/esm/common/src/webrtc/CantinaAuth.d.ts +13 -8
  26. package/dist/esm/common/src/webrtc/CantinaAuth.js +18 -24
  27. package/dist/esm/common/src/webrtc/LayoutHandler.d.ts +3 -0
  28. package/dist/esm/common/src/webrtc/LayoutHandler.js +36 -0
  29. package/dist/esm/common/src/webrtc/Peer.d.ts +21 -0
  30. package/dist/esm/common/src/webrtc/Peer.js +145 -0
  31. package/dist/esm/common/src/webrtc/VertoHandler.d.ts +11 -2
  32. package/dist/esm/common/src/webrtc/VertoHandler.js +187 -147
  33. package/dist/esm/common/src/webrtc/constants.d.ts +12 -28
  34. package/dist/esm/common/src/webrtc/constants.js +11 -34
  35. package/dist/esm/common/src/webrtc/helpers.d.ts +20 -18
  36. package/dist/esm/common/src/webrtc/helpers.js +177 -162
  37. package/dist/esm/common/src/webrtc/interfaces.d.ts +51 -209
  38. package/dist/esm/js/index.d.ts +1 -3
  39. package/dist/esm/js/index.js +1 -2
  40. package/dist/esm/js/src/SignalWire.d.ts +2 -0
  41. package/dist/esm/js/src/SignalWire.js +13 -0
  42. package/dist/esm/js/src/Verto.d.ts +2 -8
  43. package/dist/esm/js/src/Verto.js +14 -50
  44. package/dist/index.min.js +2 -2
  45. package/package.json +13 -14
  46. package/dist/esm/common/src/webrtc/ChatChannelHandler.d.ts +0 -5
  47. package/dist/esm/common/src/webrtc/ChatChannelHandler.js +0 -22
  48. package/dist/esm/common/src/webrtc/Conference.d.ts +0 -15
  49. package/dist/esm/common/src/webrtc/Conference.js +0 -68
  50. package/dist/esm/common/src/webrtc/ConferenceListChannelHandler.d.ts +0 -5
  51. package/dist/esm/common/src/webrtc/ConferenceListChannelHandler.js +0 -77
  52. package/dist/esm/common/src/webrtc/InfoChannelHandler.d.ts +0 -7
  53. package/dist/esm/common/src/webrtc/InfoChannelHandler.js +0 -85
  54. package/dist/esm/common/src/webrtc/LaChannelHandler.d.ts +0 -5
  55. package/dist/esm/common/src/webrtc/LaChannelHandler.js +0 -58
  56. package/dist/esm/common/src/webrtc/ModChannelHandler.d.ts +0 -71
  57. package/dist/esm/common/src/webrtc/ModChannelHandler.js +0 -267
  58. package/dist/esm/common/src/webrtc/RTCPeer.d.ts +0 -51
  59. package/dist/esm/common/src/webrtc/RTCPeer.js +0 -556
  60. package/dist/esm/common/src/webrtc/WebRTCCall.d.ts +0 -182
  61. package/dist/esm/common/src/webrtc/WebRTCCall.js +0 -784
  62. package/dist/esm/common/src/webrtc/deviceHelpers.d.ts +0 -18
  63. package/dist/esm/common/src/webrtc/deviceHelpers.js +0 -113
  64. package/dist/esm/common/src/webrtc/sdpHelpers.d.ts +0 -3
  65. package/dist/esm/common/src/webrtc/sdpHelpers.js +0 -56
@@ -1,81 +1,78 @@
1
- import { isFunction } from '../util/helpers';
1
+ import { objEmpty, isFunction } from '../util/helpers';
2
2
  const GLOBAL = 'GLOBAL';
3
3
  const queue = {};
4
- const _buildEventName = (event, uniqueId) => `${event}|${uniqueId}`;
5
- const isQueued = (event, uniqueId = GLOBAL) => {
6
- const eventName = _buildEventName(event, uniqueId);
7
- return eventName in queue;
8
- };
9
- const queueLength = (event, uniqueId = GLOBAL) => {
10
- const eventName = _buildEventName(event, uniqueId);
11
- return eventName in queue ? queue[eventName].length : 0;
4
+ const isQueued = (eventName, uniqueId = GLOBAL) => queue.hasOwnProperty(eventName) && queue[eventName].hasOwnProperty(uniqueId);
5
+ const queueLength = (eventName, uniqueId = GLOBAL) => {
6
+ if (!isQueued(eventName, uniqueId)) {
7
+ return 0;
8
+ }
9
+ return queue[eventName][uniqueId].length;
12
10
  };
13
- const register = (event, callback, uniqueId = GLOBAL) => {
14
- const eventName = _buildEventName(event, uniqueId);
15
- if (!(eventName in queue)) {
16
- queue[eventName] = [];
11
+ const register = (eventName, callback, uniqueId = GLOBAL) => {
12
+ if (!queue.hasOwnProperty(eventName)) {
13
+ queue[eventName] = {};
17
14
  }
18
- queue[eventName].push(callback);
15
+ if (!queue[eventName].hasOwnProperty(uniqueId)) {
16
+ queue[eventName][uniqueId] = [];
17
+ }
18
+ queue[eventName][uniqueId].push(callback);
19
19
  };
20
- const registerOnce = (event, callback, uniqueId = GLOBAL) => {
20
+ const registerOnce = (eventName, callback, uniqueId = GLOBAL) => {
21
21
  const cb = function (data) {
22
- deRegister(event, cb, uniqueId);
22
+ deRegister(eventName, cb, uniqueId);
23
23
  callback(data);
24
24
  };
25
25
  cb.prototype.targetRef = callback;
26
- return register(event, cb, uniqueId);
26
+ return register(eventName, cb, uniqueId);
27
27
  };
28
- const deRegister = (event, callback, uniqueId = GLOBAL) => {
29
- if (!isQueued(event, uniqueId)) {
28
+ const deRegister = (eventName, callback, uniqueId = GLOBAL) => {
29
+ if (!isQueued(eventName, uniqueId)) {
30
30
  return false;
31
31
  }
32
- const eventName = _buildEventName(event, uniqueId);
33
32
  if (isFunction(callback)) {
34
- const len = queue[eventName].length;
33
+ const len = queue[eventName][uniqueId].length;
35
34
  for (let i = len - 1; i >= 0; i--) {
36
- const fn = queue[eventName][i];
35
+ const fn = queue[eventName][uniqueId][i];
37
36
  if (callback === fn || (fn.prototype && callback === fn.prototype.targetRef)) {
38
- queue[eventName].splice(i, 1);
37
+ queue[eventName][uniqueId].splice(i, 1);
39
38
  }
40
39
  }
41
40
  }
42
41
  else {
43
- queue[eventName] = [];
42
+ queue[eventName][uniqueId] = [];
44
43
  }
45
- if (queue[eventName].length === 0) {
46
- delete queue[eventName];
44
+ if (queue[eventName][uniqueId].length === 0) {
45
+ delete queue[eventName][uniqueId];
46
+ if (objEmpty(queue[eventName])) {
47
+ delete queue[eventName];
48
+ }
47
49
  }
48
50
  return true;
49
51
  };
50
- const trigger = (event, data, uniqueId = GLOBAL, globalPropagation = true) => {
52
+ const trigger = (eventName, data, uniqueId = GLOBAL, globalPropagation = true) => {
51
53
  const _propagate = globalPropagation && uniqueId !== GLOBAL;
52
- if (!isQueued(event, uniqueId)) {
54
+ if (!isQueued(eventName, uniqueId)) {
53
55
  if (_propagate) {
54
- trigger(event, data);
56
+ trigger(eventName, data);
55
57
  }
56
58
  return false;
57
59
  }
58
- const eventName = _buildEventName(event, uniqueId);
59
- const len = queue[eventName].length;
60
+ const len = queue[eventName][uniqueId].length;
60
61
  if (!len) {
61
62
  if (_propagate) {
62
- trigger(event, data);
63
+ trigger(eventName, data);
63
64
  }
64
65
  return false;
65
66
  }
66
67
  for (let i = len - 1; i >= 0; i--) {
67
- queue[eventName][i](data);
68
+ queue[eventName][uniqueId][i](data);
68
69
  }
69
70
  if (_propagate) {
70
- trigger(event, data);
71
+ trigger(eventName, data);
71
72
  }
72
73
  return true;
73
74
  };
74
- const deRegisterAll = (event) => {
75
- const eventName = _buildEventName(event, '');
76
- Object.keys(queue)
77
- .filter(name => name.indexOf(eventName) === 0)
78
- .forEach(event => delete queue[event]);
75
+ const deRegisterAll = (eventName) => {
76
+ delete queue[eventName];
79
77
  };
80
- const clearQueue = () => Object.keys(queue).forEach(event => delete queue[event]);
81
- export { trigger, register, registerOnce, deRegister, deRegisterAll, isQueued, queueLength, clearQueue };
78
+ export { trigger, register, registerOnce, deRegister, deRegisterAll, isQueued, queueLength };
@@ -2,7 +2,6 @@ export declare const STORAGE_PREFIX = "@signalwire:";
2
2
  export declare const ADD = "add";
3
3
  export declare const REMOVE = "remove";
4
4
  export declare const SESSION_ID = "sessId";
5
- export declare const VERTO_PROTOCOL = "verto-protocol";
6
5
  export declare enum SwEvent {
7
6
  SocketOpen = "signalwire.socket.open",
8
7
  SocketClose = "signalwire.socket.close",
@@ -2,7 +2,6 @@ export const STORAGE_PREFIX = '@signalwire:';
2
2
  export const ADD = 'add';
3
3
  export const REMOVE = 'remove';
4
4
  export const SESSION_ID = 'sessId';
5
- export const VERTO_PROTOCOL = 'verto-protocol';
6
5
  export var SwEvent;
7
6
  (function (SwEvent) {
8
7
  SwEvent["SocketOpen"] = "signalwire.socket.open";
@@ -1,8 +1,16 @@
1
1
  export declare const deepCopy: (obj: Object) => any;
2
2
  export declare const objEmpty: (obj: Object) => boolean;
3
3
  export declare const mutateStorageKey: (key: string) => string;
4
- export declare const mutateLiveArrayData: (data: any[]) => any;
4
+ export declare const mutateLiveArrayData: (data: any) => {
5
+ participantId: number;
6
+ participantNumber: any;
7
+ participantName: any;
8
+ codec: any;
9
+ media: {};
10
+ participantData: any;
11
+ };
5
12
  export declare const safeParseJson: (value: string) => string | Object;
13
+ export declare const isDefined: (variable: any) => boolean;
6
14
  export declare const isFunction: (variable: any) => boolean;
7
15
  export declare const findElementByType: (tag: string | Function | HTMLMediaElement) => HTMLMediaElement;
8
16
  export declare const checkWebSocketHost: (host: string) => string;
@@ -10,4 +18,3 @@ export declare const destructResponse: (response: any, nodeId?: string) => {
10
18
  [key: string]: any;
11
19
  };
12
20
  export declare const randomInt: (min: number, max: number) => number;
13
- export declare const roundToFixed: (value: number, num?: number) => number;
@@ -1,11 +1,18 @@
1
+ import logger from './logger';
1
2
  import { STORAGE_PREFIX } from './constants';
2
3
  export const deepCopy = (obj) => JSON.parse(JSON.stringify(obj));
3
4
  export const objEmpty = (obj) => Object.keys(obj).length === 0;
4
5
  export const mutateStorageKey = (key) => `${STORAGE_PREFIX}${key}`;
5
6
  export const mutateLiveArrayData = (data) => {
6
- const [options, memberData, visibility] = data;
7
- const { memberID: participantId, callerIDNumber: participantNumber, callerIDName: participantName, company: participantCompany } = memberData;
8
- return Object.assign({ participantId, participantNumber, participantName, participantCompany, visibility }, options);
7
+ const [participantId, participantNumber, participantName, codec, mediaJson, participantData] = data;
8
+ let media = {};
9
+ try {
10
+ media = JSON.parse(mediaJson.replace(/ID"/g, 'Id"'));
11
+ }
12
+ catch (error) {
13
+ logger.warn('Verto LA invalid media JSON string:', mediaJson);
14
+ }
15
+ return { participantId: Number(participantId), participantNumber, participantName, codec, media, participantData };
9
16
  };
10
17
  export const safeParseJson = (value) => {
11
18
  if (typeof value !== 'string') {
@@ -18,6 +25,7 @@ export const safeParseJson = (value) => {
18
25
  return value;
19
26
  }
20
27
  };
28
+ export const isDefined = (variable) => typeof variable !== 'undefined';
21
29
  export const isFunction = (variable) => variable instanceof Function || typeof variable === 'function';
22
30
  export const findElementByType = (tag) => {
23
31
  if (typeof document !== 'object' || !('getElementById' in document)) {
@@ -63,6 +71,3 @@ export const destructResponse = (response, nodeId = null) => {
63
71
  export const randomInt = (min, max) => {
64
72
  return Math.floor(Math.random() * (max - min + 1) + min);
65
73
  };
66
- export const roundToFixed = (value, num = 2) => {
67
- return Number(value.toFixed(num));
68
- };
@@ -7,6 +7,7 @@ declare type TBladeVersion = {
7
7
  minor: number;
8
8
  revision: number;
9
9
  };
10
+ declare type SipCodec = 'PCMU' | 'PCMA' | 'OPUS' | 'G729' | 'G722' | 'VP8' | 'H264';
10
11
  export interface ISubscription {
11
12
  channel: string;
12
13
  protocol: string;
@@ -31,20 +32,16 @@ export interface IBladeConnectRequest extends IMessageBase {
31
32
  agent?: string;
32
33
  };
33
34
  }
34
- export interface IBladeAuthorization {
35
- expires_at: number;
36
- signature: string;
37
- project: string;
38
- scope_id: string;
39
- scopes: string[];
40
- resource: string;
41
- }
42
35
  export interface IBladeConnectResult extends IMessageBase {
43
36
  sessionid: string;
44
37
  nodeid: string;
45
38
  master_nodeid: string;
46
39
  protocols_uncertified: string[];
47
- authorization: IBladeAuthorization;
40
+ authorization: {
41
+ expires_at: number;
42
+ signature: string;
43
+ };
44
+ ice_servers?: RTCIceServer[];
48
45
  }
49
46
  export interface IBladeExecuteRequest extends IMessageBase {
50
47
  method: string;
@@ -79,12 +76,7 @@ export interface ISignalWireOptions {
79
76
  login?: string;
80
77
  passwd?: string;
81
78
  password?: string;
82
- userVariables?: {
83
- [key: string]: any;
84
- };
85
- loginParams?: {
86
- [key: string]: any;
87
- };
79
+ userVariables?: Object;
88
80
  }
89
81
  export interface SubscribeParams {
90
82
  channels?: string[];
@@ -182,33 +174,67 @@ export interface ICall {
182
174
  sendDigits: Function;
183
175
  sendDigitsAsync: Function;
184
176
  }
185
- export interface ICallDevice {
186
- type: string;
177
+ export interface CallingPhoneDevice {
178
+ type: 'phone';
187
179
  params: {
188
180
  from_number: string;
189
181
  to_number: string;
190
- timeout: number;
182
+ timeout?: number;
183
+ };
184
+ }
185
+ export interface SipHeader {
186
+ name: string;
187
+ value: string;
188
+ }
189
+ export interface CallingSipDevice {
190
+ type: 'sip';
191
+ params: {
192
+ from: string;
193
+ to: string;
194
+ headers?: SipHeader[];
195
+ timeout?: number;
196
+ codecs?: SipCodec[];
197
+ webrtc_media?: boolean;
198
+ from_name?: string;
191
199
  };
192
200
  }
201
+ export declare type ICallDevice = CallingPhoneDevice | CallingSipDevice;
193
202
  export interface ICallPeer {
194
203
  call_id: string;
195
204
  node_id: string;
196
205
  device?: ICallDevice;
197
206
  }
198
207
  export interface ICallOptions {
208
+ region?: string;
199
209
  device?: ICallDevice;
210
+ devices?: DeepArray<ICallDevice>;
200
211
  peer?: ICallPeer;
201
212
  node_id?: string;
202
213
  call_id?: string;
203
214
  call_state?: string;
204
215
  context?: string;
205
216
  }
206
- export interface IMakeCallParams {
207
- type: string;
217
+ export interface MakePhoneCallParams {
218
+ type: 'phone';
208
219
  from?: string;
209
220
  to: string;
210
221
  timeout?: number;
211
222
  }
223
+ export interface MakeSipCallParams {
224
+ type: 'sip';
225
+ from: string;
226
+ from_name?: string;
227
+ to: string;
228
+ timeout?: number;
229
+ headers?: SipHeader[];
230
+ codecs?: SipCodec[];
231
+ webrtc_media?: boolean;
232
+ }
233
+ export interface IDialCallParams {
234
+ region?: string;
235
+ devices: DeepArray<IMakeCallParams>;
236
+ }
237
+ export declare type IMakeCallParams = MakePhoneCallParams | MakeSipCallParams;
212
238
  export interface StringTMap<T> {
213
239
  [key: string]: T;
214
240
  }
@@ -395,4 +421,13 @@ export interface IMessageOptions {
395
421
  segments: number;
396
422
  reason?: string;
397
423
  }
424
+ export interface DialPayload {
425
+ tag: string;
426
+ devices: DeepArray<ICallDevice>;
427
+ region?: string;
428
+ }
429
+ export interface ReferParams {
430
+ to: string;
431
+ headers?: SipHeader[];
432
+ }
398
433
  export {};
@@ -5,10 +5,7 @@ const originalFactory = logger.methodFactory;
5
5
  logger.methodFactory = (methodName, logLevel, loggerName) => {
6
6
  const rawMethod = originalFactory(methodName, logLevel, loggerName);
7
7
  return function () {
8
- const messages = [];
9
- if (typeof window === 'undefined') {
10
- messages.push(datetime() + ' -');
11
- }
8
+ const messages = [datetime(), '-'];
12
9
  for (let i = 0; i < arguments.length; i++) {
13
10
  messages.push(arguments[i]);
14
11
  }
@@ -2,7 +2,6 @@ declare const RTCPeerConnection: (config: RTCConfiguration) => RTCPeerConnection
2
2
  declare const getUserMedia: (constraints: MediaStreamConstraints) => Promise<MediaStream>;
3
3
  declare const getDisplayMedia: (constraints: MediaStreamConstraints) => any;
4
4
  declare const enumerateDevices: () => Promise<MediaDeviceInfo[]>;
5
- declare const enumerateDevicesByKind: (filterByKind?: string) => Promise<MediaDeviceInfo[]>;
6
5
  declare const getSupportedConstraints: () => MediaTrackSupportedConstraints;
7
6
  declare const streamIsValid: (stream: MediaStream) => boolean;
8
7
  declare const attachMediaStream: (tag: any, stream: MediaStream) => void;
@@ -13,8 +12,4 @@ declare const toggleMuteMediaElement: (tag: any) => void;
13
12
  declare const setMediaElementSinkId: (tag: any, deviceId: string) => Promise<boolean>;
14
13
  declare const sdpToJsonHack: (sdp: any) => any;
15
14
  declare const stopStream: (stream: MediaStream) => void;
16
- declare const stopTrack: (track: MediaStreamTrack) => void;
17
- declare const getHostname: () => string;
18
- declare const buildVideoElementByTrack: (videoTrack: MediaStreamTrack, streamIds?: string[]) => HTMLVideoElement;
19
- declare const buildAudioElementByTrack: (audioTrack: MediaStreamTrack, streamIds?: string[]) => HTMLAudioElement;
20
- export { RTCPeerConnection, getUserMedia, getDisplayMedia, enumerateDevices, enumerateDevicesByKind, getSupportedConstraints, streamIsValid, attachMediaStream, detachMediaStream, sdpToJsonHack, stopStream, stopTrack, muteMediaElement, unmuteMediaElement, toggleMuteMediaElement, setMediaElementSinkId, getHostname, buildVideoElementByTrack, buildAudioElementByTrack, };
15
+ export { RTCPeerConnection, getUserMedia, getDisplayMedia, enumerateDevices, getSupportedConstraints, streamIsValid, attachMediaStream, detachMediaStream, sdpToJsonHack, stopStream, muteMediaElement, unmuteMediaElement, toggleMuteMediaElement, setMediaElementSinkId };
@@ -8,18 +8,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  });
9
9
  };
10
10
  import { findElementByType } from '../helpers';
11
- import logger from '../logger';
12
11
  const RTCPeerConnection = (config) => new window.RTCPeerConnection(config);
13
12
  const getUserMedia = (constraints) => navigator.mediaDevices.getUserMedia(constraints);
14
13
  const getDisplayMedia = (constraints) => navigator.mediaDevices.getDisplayMedia(constraints);
15
14
  const enumerateDevices = () => navigator.mediaDevices.enumerateDevices();
16
- const enumerateDevicesByKind = (filterByKind = null) => __awaiter(void 0, void 0, void 0, function* () {
17
- let devices = yield enumerateDevices().catch(error => []);
18
- if (filterByKind) {
19
- devices = devices.filter(({ kind }) => kind === filterByKind);
20
- }
21
- return devices;
22
- });
23
15
  const getSupportedConstraints = () => navigator.mediaDevices.getSupportedConstraints();
24
16
  const streamIsValid = (stream) => stream && stream instanceof MediaStream;
25
17
  const attachMediaStream = (tag, stream) => {
@@ -62,11 +54,6 @@ const toggleMuteMediaElement = (tag) => {
62
54
  const setMediaElementSinkId = (tag, deviceId) => __awaiter(void 0, void 0, void 0, function* () {
63
55
  const element = findElementByType(tag);
64
56
  if (element === null) {
65
- logger.info('No HTMLMediaElement to attach the speakerId');
66
- return false;
67
- }
68
- if (typeof deviceId !== 'string') {
69
- logger.info(`Invalid speaker deviceId: '${deviceId}'`);
70
57
  return false;
71
58
  }
72
59
  try {
@@ -80,56 +67,8 @@ const setMediaElementSinkId = (tag, deviceId) => __awaiter(void 0, void 0, void
80
67
  const sdpToJsonHack = sdp => sdp;
81
68
  const stopStream = (stream) => {
82
69
  if (streamIsValid(stream)) {
83
- stream.getTracks().forEach(stopTrack);
70
+ stream.getTracks().forEach(t => t.stop());
84
71
  }
85
72
  stream = null;
86
73
  };
87
- const stopTrack = (track) => {
88
- if (track && track.readyState === 'live') {
89
- track.stop();
90
- track.dispatchEvent(new Event('ended'));
91
- }
92
- };
93
- const getHostname = () => window.location.hostname;
94
- const buildVideoElementByTrack = (videoTrack, streamIds = []) => {
95
- const video = document.createElement('video');
96
- video.muted = true;
97
- video.autoplay = true;
98
- video.playsinline = true;
99
- video._streamIds = streamIds;
100
- const mediaStream = new MediaStream([videoTrack]);
101
- video.srcObject = mediaStream;
102
- const onCanPlay = () => console.debug('video can play!');
103
- const onPlay = () => console.debug('video is now playing...');
104
- video.addEventListener('play', onPlay);
105
- video.addEventListener('canplay', onCanPlay);
106
- videoTrack.addEventListener('ended', () => {
107
- video.removeEventListener('play', onPlay);
108
- video.removeEventListener('canplay', onCanPlay);
109
- video.srcObject = null;
110
- delete video._streamIds;
111
- video.remove();
112
- });
113
- return video;
114
- };
115
- const buildAudioElementByTrack = (audioTrack, streamIds = []) => {
116
- const audio = new Audio();
117
- audio.autoplay = true;
118
- audio.playsinline = true;
119
- audio._streamIds = streamIds;
120
- const mediaStream = new MediaStream([audioTrack]);
121
- audio.srcObject = mediaStream;
122
- const onCanPlay = () => console.debug('audio can play!');
123
- const onPlay = () => console.debug('audio is now playing...');
124
- audio.addEventListener('play', onPlay);
125
- audio.addEventListener('canplay', onCanPlay);
126
- audioTrack.addEventListener('ended', () => {
127
- audio.removeEventListener('play', onPlay);
128
- audio.removeEventListener('canplay', onCanPlay);
129
- audio.srcObject = null;
130
- delete audio._streamIds;
131
- audio.remove();
132
- });
133
- return audio;
134
- };
135
- export { RTCPeerConnection, getUserMedia, getDisplayMedia, enumerateDevices, enumerateDevicesByKind, getSupportedConstraints, streamIsValid, attachMediaStream, detachMediaStream, sdpToJsonHack, stopStream, stopTrack, muteMediaElement, unmuteMediaElement, toggleMuteMediaElement, setMediaElementSinkId, getHostname, buildVideoElementByTrack, buildAudioElementByTrack, };
74
+ export { RTCPeerConnection, getUserMedia, getDisplayMedia, enumerateDevices, getSupportedConstraints, streamIsValid, attachMediaStream, detachMediaStream, sdpToJsonHack, stopStream, muteMediaElement, unmuteMediaElement, toggleMuteMediaElement, setMediaElementSinkId };
@@ -0,0 +1,76 @@
1
+ import BrowserSession from '../BrowserSession';
2
+ import Peer from './Peer';
3
+ import { State, Direction } from './constants';
4
+ import { CallOptions, IWebRTCCall } from './interfaces';
5
+ export default abstract class BaseCall implements IWebRTCCall {
6
+ protected session: BrowserSession;
7
+ id: string;
8
+ state: string;
9
+ prevState: string;
10
+ direction: Direction;
11
+ peer: Peer;
12
+ options: CallOptions;
13
+ cause: string;
14
+ causeCode: number;
15
+ channels: string[];
16
+ role: string;
17
+ extension: string;
18
+ private _state;
19
+ private _prevState;
20
+ private gotAnswer;
21
+ private gotEarly;
22
+ private _lastSerno;
23
+ private _targetNodeId;
24
+ private _iceTimeout;
25
+ private _iceDone;
26
+ constructor(session: BrowserSession, opts?: CallOptions);
27
+ get nodeId(): string;
28
+ set nodeId(what: string);
29
+ get localStream(): MediaStream;
30
+ get remoteStream(): MediaStream;
31
+ get memberChannel(): string;
32
+ invite(): void;
33
+ answer(params?: {
34
+ iceTransportPolicy?: RTCConfiguration['iceTransportPolicy'];
35
+ }): void;
36
+ hangup(params?: any, execute?: boolean): void;
37
+ transfer(destination: string): void;
38
+ replace(replaceCallID: string): void;
39
+ hold(): any;
40
+ unhold(): any;
41
+ toggleHold(): any;
42
+ dtmf(dtmf: string): void;
43
+ message(to: string, body: string): void;
44
+ muteAudio(): void;
45
+ unmuteAudio(): void;
46
+ toggleAudioMute(): void;
47
+ setAudioInDevice(deviceId: string): Promise<void>;
48
+ muteVideo(): void;
49
+ unmuteVideo(): void;
50
+ toggleVideoMute(): void;
51
+ setVideoDevice(deviceId: string): Promise<void>;
52
+ deaf(): void;
53
+ undeaf(): void;
54
+ toggleDeaf(): void;
55
+ setState(state: State): void;
56
+ handleMessage(msg: any): void;
57
+ handleConferenceUpdate(packet: any, initialPvtData: any): Promise<string>;
58
+ _addChannel(channel: string): void;
59
+ private _subscribeConferenceChat;
60
+ private _subscribeConferenceInfo;
61
+ private _confControl;
62
+ private _subscribeConferenceModerator;
63
+ private _handleChangeHoldStateSuccess;
64
+ private _handleChangeHoldStateError;
65
+ private _onRemoteSdp;
66
+ private _requestAnotherLocalDescription;
67
+ private _onIceSdp;
68
+ private _registerPeerEvents;
69
+ private _checkConferenceSerno;
70
+ private _onMediaError;
71
+ private _dispatchConferenceUpdate;
72
+ private _dispatchNotification;
73
+ private _execute;
74
+ private _init;
75
+ protected _finalize(): void;
76
+ }