ringcentral-call-control
Version:
[](https://coveralls.io/github/ringcentral/ringcentral-call-control-js?branch=master) [ • 77 kB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define([], factory);
else if(typeof exports === 'object')
exports["RingCentralCallControl"] = factory();
else
root["RingCentralCallControl"] = factory();
})(this, () => {
return /******/ (() => { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({
/***/ 7
(module) {
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
var R = typeof Reflect === 'object' ? Reflect : null
var ReflectApply = R && typeof R.apply === 'function'
? R.apply
: function ReflectApply(target, receiver, args) {
return Function.prototype.apply.call(target, receiver, args);
}
var ReflectOwnKeys
if (R && typeof R.ownKeys === 'function') {
ReflectOwnKeys = R.ownKeys
} else if (Object.getOwnPropertySymbols) {
ReflectOwnKeys = function ReflectOwnKeys(target) {
return Object.getOwnPropertyNames(target)
.concat(Object.getOwnPropertySymbols(target));
};
} else {
ReflectOwnKeys = function ReflectOwnKeys(target) {
return Object.getOwnPropertyNames(target);
};
}
function ProcessEmitWarning(warning) {
if (console && console.warn) console.warn(warning);
}
var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {
return value !== value;
}
function EventEmitter() {
EventEmitter.init.call(this);
}
module.exports = EventEmitter;
module.exports.once = once;
// Backwards-compat with node 0.10.x
EventEmitter.EventEmitter = EventEmitter;
EventEmitter.prototype._events = undefined;
EventEmitter.prototype._eventsCount = 0;
EventEmitter.prototype._maxListeners = undefined;
// By default EventEmitters will print a warning if more than 10 listeners are
// added to it. This is a useful default which helps finding memory leaks.
var defaultMaxListeners = 10;
function checkListener(listener) {
if (typeof listener !== 'function') {
throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
}
}
Object.defineProperty(EventEmitter, 'defaultMaxListeners', {
enumerable: true,
get: function() {
return defaultMaxListeners;
},
set: function(arg) {
if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {
throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.');
}
defaultMaxListeners = arg;
}
});
EventEmitter.init = function() {
if (this._events === undefined ||
this._events === Object.getPrototypeOf(this)._events) {
this._events = Object.create(null);
this._eventsCount = 0;
}
this._maxListeners = this._maxListeners || undefined;
};
// Obviously not all Emitters should be limited to 10. This function allows
// that to be increased. Set to zero for unlimited.
EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {
throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.');
}
this._maxListeners = n;
return this;
};
function _getMaxListeners(that) {
if (that._maxListeners === undefined)
return EventEmitter.defaultMaxListeners;
return that._maxListeners;
}
EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
return _getMaxListeners(this);
};
EventEmitter.prototype.emit = function emit(type) {
var args = [];
for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);
var doError = (type === 'error');
var events = this._events;
if (events !== undefined)
doError = (doError && events.error === undefined);
else if (!doError)
return false;
// If there is no 'error' event listener then throw.
if (doError) {
var er;
if (args.length > 0)
er = args[0];
if (er instanceof Error) {
// Note: The comments on the `throw` lines are intentional, they show
// up in Node's output if this results in an unhandled exception.
throw er; // Unhandled 'error' event
}
// At least give some kind of context to the user
var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));
err.context = er;
throw err; // Unhandled 'error' event
}
var handler = events[type];
if (handler === undefined)
return false;
if (typeof handler === 'function') {
ReflectApply(handler, this, args);
} else {
var len = handler.length;
var listeners = arrayClone(handler, len);
for (var i = 0; i < len; ++i)
ReflectApply(listeners[i], this, args);
}
return true;
};
function _addListener(target, type, listener, prepend) {
var m;
var events;
var existing;
checkListener(listener);
events = target._events;
if (events === undefined) {
events = target._events = Object.create(null);
target._eventsCount = 0;
} else {
// To avoid recursion in the case that type === "newListener"! Before
// adding it to the listeners, first emit "newListener".
if (events.newListener !== undefined) {
target.emit('newListener', type,
listener.listener ? listener.listener : listener);
// Re-assign `events` because a newListener handler could have caused the
// this._events to be assigned to a new object
events = target._events;
}
existing = events[type];
}
if (existing === undefined) {
// Optimize the case of one listener. Don't need the extra array object.
existing = events[type] = listener;
++target._eventsCount;
} else {
if (typeof existing === 'function') {
// Adding the second element, need to change to array.
existing = events[type] =
prepend ? [listener, existing] : [existing, listener];
// If we've already got an array, just append.
} else if (prepend) {
existing.unshift(listener);
} else {
existing.push(listener);
}
// Check for listener leak
m = _getMaxListeners(target);
if (m > 0 && existing.length > m && !existing.warned) {
existing.warned = true;
// No error code for this since it is a Warning
// eslint-disable-next-line no-restricted-syntax
var w = new Error('Possible EventEmitter memory leak detected. ' +
existing.length + ' ' + String(type) + ' listeners ' +
'added. Use emitter.setMaxListeners() to ' +
'increase limit');
w.name = 'MaxListenersExceededWarning';
w.emitter = target;
w.type = type;
w.count = existing.length;
ProcessEmitWarning(w);
}
}
return target;
}
EventEmitter.prototype.addListener = function addListener(type, listener) {
return _addListener(this, type, listener, false);
};
EventEmitter.prototype.on = EventEmitter.prototype.addListener;
EventEmitter.prototype.prependListener =
function prependListener(type, listener) {
return _addListener(this, type, listener, true);
};
function onceWrapper() {
if (!this.fired) {
this.target.removeListener(this.type, this.wrapFn);
this.fired = true;
if (arguments.length === 0)
return this.listener.call(this.target);
return this.listener.apply(this.target, arguments);
}
}
function _onceWrap(target, type, listener) {
var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };
var wrapped = onceWrapper.bind(state);
wrapped.listener = listener;
state.wrapFn = wrapped;
return wrapped;
}
EventEmitter.prototype.once = function once(type, listener) {
checkListener(listener);
this.on(type, _onceWrap(this, type, listener));
return this;
};
EventEmitter.prototype.prependOnceListener =
function prependOnceListener(type, listener) {
checkListener(listener);
this.prependListener(type, _onceWrap(this, type, listener));
return this;
};
// Emits a 'removeListener' event if and only if the listener was removed.
EventEmitter.prototype.removeListener =
function removeListener(type, listener) {
var list, events, position, i, originalListener;
checkListener(listener);
events = this._events;
if (events === undefined)
return this;
list = events[type];
if (list === undefined)
return this;
if (list === listener || list.listener === listener) {
if (--this._eventsCount === 0)
this._events = Object.create(null);
else {
delete events[type];
if (events.removeListener)
this.emit('removeListener', type, list.listener || listener);
}
} else if (typeof list !== 'function') {
position = -1;
for (i = list.length - 1; i >= 0; i--) {
if (list[i] === listener || list[i].listener === listener) {
originalListener = list[i].listener;
position = i;
break;
}
}
if (position < 0)
return this;
if (position === 0)
list.shift();
else {
spliceOne(list, position);
}
if (list.length === 1)
events[type] = list[0];
if (events.removeListener !== undefined)
this.emit('removeListener', type, originalListener || listener);
}
return this;
};
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
EventEmitter.prototype.removeAllListeners =
function removeAllListeners(type) {
var listeners, events, i;
events = this._events;
if (events === undefined)
return this;
// not listening for removeListener, no need to emit
if (events.removeListener === undefined) {
if (arguments.length === 0) {
this._events = Object.create(null);
this._eventsCount = 0;
} else if (events[type] !== undefined) {
if (--this._eventsCount === 0)
this._events = Object.create(null);
else
delete events[type];
}
return this;
}
// emit removeListener for all listeners on all events
if (arguments.length === 0) {
var keys = Object.keys(events);
var key;
for (i = 0; i < keys.length; ++i) {
key = keys[i];
if (key === 'removeListener') continue;
this.removeAllListeners(key);
}
this.removeAllListeners('removeListener');
this._events = Object.create(null);
this._eventsCount = 0;
return this;
}
listeners = events[type];
if (typeof listeners === 'function') {
this.removeListener(type, listeners);
} else if (listeners !== undefined) {
// LIFO order
for (i = listeners.length - 1; i >= 0; i--) {
this.removeListener(type, listeners[i]);
}
}
return this;
};
function _listeners(target, type, unwrap) {
var events = target._events;
if (events === undefined)
return [];
var evlistener = events[type];
if (evlistener === undefined)
return [];
if (typeof evlistener === 'function')
return unwrap ? [evlistener.listener || evlistener] : [evlistener];
return unwrap ?
unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
}
EventEmitter.prototype.listeners = function listeners(type) {
return _listeners(this, type, true);
};
EventEmitter.prototype.rawListeners = function rawListeners(type) {
return _listeners(this, type, false);
};
EventEmitter.listenerCount = function(emitter, type) {
if (typeof emitter.listenerCount === 'function') {
return emitter.listenerCount(type);
} else {
return listenerCount.call(emitter, type);
}
};
EventEmitter.prototype.listenerCount = listenerCount;
function listenerCount(type) {
var events = this._events;
if (events !== undefined) {
var evlistener = events[type];
if (typeof evlistener === 'function') {
return 1;
} else if (evlistener !== undefined) {
return evlistener.length;
}
}
return 0;
}
EventEmitter.prototype.eventNames = function eventNames() {
return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
};
function arrayClone(arr, n) {
var copy = new Array(n);
for (var i = 0; i < n; ++i)
copy[i] = arr[i];
return copy;
}
function spliceOne(list, index) {
for (; index + 1 < list.length; index++)
list[index] = list[index + 1];
list.pop();
}
function unwrapListeners(arr) {
var ret = new Array(arr.length);
for (var i = 0; i < ret.length; ++i) {
ret[i] = arr[i].listener || arr[i];
}
return ret;
}
function once(emitter, name) {
return new Promise(function (resolve, reject) {
function errorListener(err) {
emitter.removeListener(name, resolver);
reject(err);
}
function resolver() {
if (typeof emitter.removeListener === 'function') {
emitter.removeListener('error', errorListener);
}
resolve([].slice.call(arguments));
};
eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });
if (name !== 'error') {
addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });
}
});
}
function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
if (typeof emitter.on === 'function') {
eventTargetAgnosticAddListener(emitter, 'error', handler, flags);
}
}
function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
if (typeof emitter.on === 'function') {
if (flags.once) {
emitter.once(name, listener);
} else {
emitter.on(name, listener);
}
} else if (typeof emitter.addEventListener === 'function') {
// EventTarget does not have `error` event semantics like Node
// EventEmitters, we do not listen for `error` events here.
emitter.addEventListener(name, function wrapListener(arg) {
// IE does not have builtin `{ once: true }` support so we
// have to do it manually.
if (flags.once) {
emitter.removeEventListener(name, wrapListener);
}
listener(arg);
});
} else {
throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter);
}
}
/***/ },
/***/ 156
(__unused_webpack_module, exports, __webpack_require__) {
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.RingCentralCallControl = void 0;
var events_1 = __webpack_require__(7);
var formatParty_1 = __webpack_require__(325);
var helper_1 = __webpack_require__(306);
var Session_1 = __webpack_require__(688);
var userAgent_1 = __webpack_require__(460);
var RingCentralCallControl = /** @class */ (function (_super) {
__extends(RingCentralCallControl, _super);
function RingCentralCallControl(_a) {
var sdk = _a.sdk, accountLevel = _a.accountLevel, _b = _a.preloadSessions, preloadSessions = _b === void 0 ? true : _b, _c = _a.preloadDevices, preloadDevices = _c === void 0 ? true : _c, extensionInfo = _a.extensionInfo, userAgent = _a.userAgent;
var _this = _super.call(this) || this;
_this._eventSequenceMap = {};
_this._accountLevel = !!accountLevel;
_this._sdk = sdk;
_this._userAgent = userAgent;
_this._sessionsMap = new Map;
_this._devices = [];
_this._ready = false;
_this._initializePromise = null;
_this._preloadSessions = preloadSessions;
_this._preloadDevices = preloadDevices;
_this._currentExtension = extensionInfo;
_this.initialize();
return _this;
}
RingCentralCallControl.prototype.initialize = function () {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (this._ready) {
return [2 /*return*/];
}
if (!this._initializePromise) {
this._initializePromise = this._initialize();
}
return [4 /*yield*/, this._initializePromise];
case 1:
_a.sent();
this._initializePromise = null;
return [2 /*return*/];
}
});
});
};
RingCentralCallControl.prototype._initialize = function () {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!!this._currentExtension) return [3 /*break*/, 2];
return [4 /*yield*/, this.loadCurrentExtension()];
case 1:
_a.sent();
_a.label = 2;
case 2:
if (!this._preloadSessions) return [3 /*break*/, 4];
return [4 /*yield*/, this.preloadSessions()];
case 3:
_a.sent();
_a.label = 4;
case 4:
if (!this._preloadDevices) return [3 /*break*/, 6];
return [4 /*yield*/, this.loadDevices()];
case 5:
_a.sent();
_a.label = 6;
case 6:
this._ready = true;
this.emit('initialized');
return [2 /*return*/];
}
});
});
};
RingCentralCallControl.prototype.onNotificationEvent = function (message) {
var _this = this;
if (message.event.indexOf('/telephony/sessions') === -1) {
return;
}
var _a = message.body, eventTime = _a.eventTime, telephonySessionId = _a.telephonySessionId, newData = __rest(_a, ["eventTime", "telephonySessionId"]);
if (!telephonySessionId) {
return;
}
var validatedSequence = this.checkSequence(message.body);
if (!validatedSequence) {
return;
}
var existedSession = this._sessionsMap.get(telephonySessionId);
newData.id = telephonySessionId;
newData.extensionId = this.extensionId;
newData.accountId = this.accountId;
newData.parties = newData.parties.map(function (p) { return (0, formatParty_1.formatParty)(p); });
if (!existedSession) {
var disconnectedParties = newData.parties.filter(function (p) { return p.status.code === 'Disconnected'; });
if (disconnectedParties.length === newData.parties.length) {
return;
}
// use first event's eventTime as session creationTime
newData.creationTime = eventTime;
// if new session is the inbound leg of ringout call then abandon it
var checkResult = (0, helper_1.ringOutInboundLegCheck)(newData, this.sessions);
if (checkResult.isRingOutInboundLeg) {
return;
}
if (!checkResult.isRingOutInboundLeg && checkResult.legSessionId) {
// if find an inbound leg then remove it from sessions
this._sessionsMap.delete(checkResult.legSessionId);
}
var newSession_1 = new Session_1.Session(newData, this._sdk, this._accountLevel);
newSession_1.on('status', function () {
_this.onSessionStatusUpdated(newSession_1);
});
this._sessionsMap.set(telephonySessionId, newSession_1);
if (newSession_1.party) {
this.emit('new', newSession_1);
}
return;
}
var party = existedSession.party;
existedSession.onUpdated(newData);
if (!party && existedSession.party) {
this.emit('new', existedSession);
}
};
RingCentralCallControl.prototype.checkSequence = function (_a) {
var sequence = _a.sequence, telephonySessionId = _a.telephonySessionId, parties = _a.parties;
var result = true;
var partyId = parties[0] && parties[0].id;
var eventSequenceData = this._eventSequenceMap[partyId];
if (eventSequenceData && eventSequenceData.sequence > sequence) {
result = false;
}
else {
this._eventSequenceMap[partyId] = {
sequence: sequence,
telephonySessionId: telephonySessionId,
updatedAt: Date.now(),
};
}
this.cleanExpiredSequenceData();
return result;
};
RingCentralCallControl.prototype.cleanExpiredSequenceData = function () {
var _this = this;
Object.keys(this._eventSequenceMap).forEach(function (partyId) {
var eventSequenceData = _this._eventSequenceMap[partyId];
var existedSession = _this._sessionsMap.get(eventSequenceData.telephonySessionId);
if (!existedSession && eventSequenceData.updatedAt + 60000 < Date.now()) {
delete _this._eventSequenceMap[partyId];
}
});
};
Object.defineProperty(RingCentralCallControl.prototype, "sessions", {
get: function () {
return Array.from(this._sessionsMap.values());
},
enumerable: false,
configurable: true
});
Object.defineProperty(RingCentralCallControl.prototype, "sessionsMap", {
get: function () {
return this._sessionsMap;
},
enumerable: false,
configurable: true
});
RingCentralCallControl.prototype.loadCurrentExtension = function () {
return __awaiter(this, void 0, void 0, function () {
var response, _a, e_1;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
_b.trys.push([0, 3, , 4]);
return [4 /*yield*/, this._sdk.platform().get('/restapi/v1.0/account/~/extension/~', undefined, this.requestOptions)];
case 1:
response = _b.sent();
_a = this;
return [4 /*yield*/, response.json()];
case 2:
_a._currentExtension = _b.sent();
return [3 /*break*/, 4];
case 3:
e_1 = _b.sent();
console.error('Fetch extension info error', e_1);
return [3 /*break*/, 4];
case 4: return [2 /*return*/];
}
});
});
};
RingCentralCallControl.prototype.preloadSessions = function () {
return __awaiter(this, void 0, void 0, function () {
var activeCalls;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.loadActiveCalls()];
case 1:
activeCalls = _a.sent();
return [4 /*yield*/, this.loadSessions(activeCalls)];
case 2:
_a.sent();
return [2 /*return*/];
}
});
});
};
RingCentralCallControl.prototype.loadActiveCalls = function () {
return __awaiter(this, void 0, void 0, function () {
var presenceUrl, response, data, presences, activeCalls_1, e_2;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
presenceUrl = '/restapi/v1.0/account/~/extension/~/presence?detailedTelephonyState=true&sipData=true';
if (this._accountLevel) {
presenceUrl = '/restapi/v1.0/account/~/presence?detailedTelephonyState=true&sipData=true';
}
_a.label = 1;
case 1:
_a.trys.push([1, 4, , 5]);
return [4 /*yield*/, this._sdk.platform().get(presenceUrl, undefined, this.requestOptions)];
case 2:
response = _a.sent();
return [4 /*yield*/, response.json()];
case 3:
data = _a.sent();
if (this._accountLevel) {
presences = data.records;
activeCalls_1 = [];
presences.forEach(function (presence) {
if (presence.activeCalls) {
activeCalls_1 = activeCalls_1.concat(presence.activeCalls);
}
});
return [2 /*return*/, activeCalls_1];
}
return [2 /*return*/, data.activeCalls || []];
case 4:
e_2 = _a.sent();
console.error('Fetch presence error', e_2);
return [2 /*return*/, []];
case 5: return [2 /*return*/];
}
});
});
};
RingCentralCallControl.prototype.loadSessions = function (activeCalls) {
return __awaiter(this, void 0, void 0, function () {
var e_3;
var _this = this;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (activeCalls.length === 0) {
return [2 /*return*/];
}
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
return [4 /*yield*/, Promise.all(activeCalls.map(function (activeCall) { return __awaiter(_this, void 0, void 0, function () {
var response, data, session;
var _this = this;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this._sdk.platform().get("/restapi/v1.0/account/~/telephony/sessions/".concat(activeCall.telephonySessionId), undefined, this.requestOptions)];
case 1:
response = _a.sent();
return [4 /*yield*/, response.json()];
case 2:
data = _a.sent();
data.extensionId = this.extensionId;
data.accountId = this.accountId;
data.parties = data.parties.map(function (p) { return (0, formatParty_1.formatParty)(p); });
// since call session status API not provide the `sessionId`, so pick from presence here.
data.sessionId = activeCall.sessionId;
session = new Session_1.Session(data, this._sdk, this._accountLevel);
this._sessionsMap.set(activeCall.telephonySessionId, session);
session.on('status', function () {
_this.onSessionStatusUpdated(session);
});
return [2 /*return*/];
}
});
}); }))];
case 2:
_a.sent();
return [3 /*break*/, 4];
case 3:
e_3 = _a.sent();
console.error('load sessions error', e_3);
return [3 /*break*/, 4];
case 4: return [2 /*return*/];
}
});
});
};
RingCentralCallControl.prototype.restoreSessions = function (sessionDatas) {
var _this = this;
var oldSessionMap = this._sessionsMap;
this._sessionsMap = new Map();
sessionDatas.forEach(function (sessionData) {
if (oldSessionMap.get(sessionData.id)) {
var oldSession = oldSessionMap.get(sessionData.id);
oldSession.restore(sessionData);
_this._sessionsMap.set(sessionData.id, oldSession);
return;
}
_this._sessionsMap.set(sessionData.id, new Session_1.Session(sessionData, _this._sdk, _this._accountLevel));
});
};
RingCentralCallControl.prototype.loadDevices = function () {
return __awaiter(this, void 0, void 0, function () {
var response, data, e_4;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 3, , 4]);
return [4 /*yield*/, this._sdk.platform().get('/restapi/v1.0/account/~/extension/~/device', undefined, this.requestOptions)];
case 1:
response = _a.sent();
return [4 /*yield*/, response.json()];
case 2:
data = _a.sent();
this._devices = data.records || [];
return [3 /*break*/, 4];
case 3:
e_4 = _a.sent();
console.error('Fetch presence error', e_4);
return [3 /*break*/, 4];
case 4: return [2 /*return*/];
}
});
});
};
RingCentralCallControl.prototype.onSessionStatusUpdated = function (session) {
var party = session.party;
if (party &&
party.status.code === Session_1.PartyStatusCode.disconnected &&
party.status.reason !== 'Pickup' && // don't end when call switched
party.status.reason !== 'CallSwitch' // don't end when call switched
) {
this._sessionsMap.delete(session.id);
}
};
RingCentralCallControl.prototype.refreshDevices = function () {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.loadDevices()];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
};
RingCentralCallControl.prototype.createCall = function (deviceId, to) {
return __awaiter(this, void 0, void 0, function () {
var response, sessionData, session;
var _this = this;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this._sdk.platform().post('/restapi/v1.0/account/~/telephony/call-out', {
from: { deviceId: deviceId },
to: to,
}, undefined, this.requestOptions)];
case 1:
response = _a.sent();
return [4 /*yield*/, response.json()];
case 2:
sessionData = (_a.sent()).session;
sessionData.extensionId = this.extensionId;
sessionData.accountId = this.accountId;
sessionData.parties = sessionData.parties.map(function (p) { return (0, formatParty_1.formatParty)(p); });
session = new Session_1.Session(sessionData, this._sdk, this._accountLevel);
this._sessionsMap.set(sessionData.id, session);
session.on('status', function () {
_this.onSessionStatusUpdated(session);
});
return [2 /*return*/, session];
}
});
});
};
// Fucntion to create conference session
// The session's parties are empty
// Join as HOST with voice by using webphone sdk to call session.voiceCallToken
// Then bring in other telephony session into this conference
RingCentralCallControl.prototype.createConference = function () {
return __awaiter(this, void 0, void 0, function () {
var response, sessionData, session;
var _this = this;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this._sdk.platform().post('/restapi/v1.0/account/~/telephony/conference', {}, undefined, this.requestOptions)];
case 1:
response = _a.sent();
return [4 /*yield*/, response.json()];
case 2:
sessionData = (_a.sent()).session;
sessionData.extensionId = this.extensionId;
sessionData.accountId = this.accountId;
sessionData.parties = (sessionData.parties || []).map(function (p) { return (0, formatParty_1.formatParty)(p); });
session = new Session_1.Session(sessionData, this._sdk, this._accountLevel);
this._sessionsMap.set(sessionData.id, session);
session.on('status', function () {
_this.onSessionStatusUpdated(session);
});
return [2 /*return*/, session];
}
});
});
};
Object.defineProperty(RingCentralCallControl.prototype, "accountId", {
get: function () {
return this._currentExtension && String(this._currentExtension.account.id);
},
enumerable: false,
configurable: true
});
Object.defineProperty(RingCentralCallControl.prototype, "extensionId", {
get: function () {
return this._currentExtension && String(this._currentExtension.id);
},
enumerable: false,
configurable: true
});
Object.defineProperty(RingCentralCallControl.prototype, "devices", {
get: function () {
return this._devices;
},
enumerable: false,
configurable: true
});
Object.defineProperty(RingCentralCallControl.prototype, "ready", {
get: function () {
return this._ready;
},
enumerable: false,
configurable: true
});
Object.defineProperty(RingCentralCallControl.prototype, "requestOptions", {
get: function () {
return {
userAgent: this._userAgent ? "".concat(this._userAgent, " ").concat(userAgent_1.USER_AGENT) : userAgent_1.USER_AGENT,
};
},
enumerable: false,
configurable: true
});
Object.defineProperty(RingCentralCallControl.prototype, "eventSequenceMap", {
get: function () {
return this._eventSequenceMap;
},
enumerable: false,
configurable: true
});
return RingCentralCallControl;
}(events_1.EventEmitter));
exports.RingCentralCallControl = RingCentralCallControl;
/***/ },
/***/ 306
(__unused_webpack_module, exports, __webpack_require__) {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.ringOutInboundLegCheck = void 0;
var Session_1 = __webpack_require__(688);
function ringOutInboundLegCheck(newData, allSessions) {
var _a = newData || {}, _b = _a.parties, parties = _b === void 0 ? [] : _b, _c = _a.origin, origin = _c === void 0 ? { type: 'Call' } : _c;
var party = parties[0];
var checkResult = {
isRingOutInboundLeg: false,
legSessionId: null,
};
if (!party || origin.type === 'Call' && party.direction === Session_1.Direction.outbound) {
return checkResult;
}
if (allSessions.length) {
for (var _i = 0, allSessions_1 = allSessions; _i < allSessions_1.length; _i++) {
var session = allSessions_1[_i];
var sessionIdGap = parseInt(newData.sessionId, 10) - parseInt(session.sessionId, 10);
var existedSessionParty = session.party;
switch (sessionIdGap) {
case 1000:
case 2000:
case 3000:
case 4000: {
if (party.direction === Session_1.Direction.inbound && party.from && party.to &&
existedSessionParty.from && existedSessionParty.to && (party.from.phoneNumber === existedSessionParty.to.phoneNumber) &&
(party.to.phoneNumber === existedSessionParty.from.phoneNumber)) {
checkResult.isRingOutInboundLeg = true;
}
break;
}
case -1000:
case -2000:
case -3000:
case -4000: {
if (party.direction === Session_1.Direction.outbound && party.from && party.to &&
existedSessionParty.from && existedSessionParty.to && (party.from.phoneNumber === existedSessionParty.to.phoneNumber) &&
(party.to.phoneNumber === existedSessionParty.from.phoneNumber)) {
checkResult.isRingOutInboundLeg = false;
checkResult.legSessionId = session.id;
}
break;
}
default:
break;
}
}
}
return checkResult;
}
exports.ringOutInboundLegCheck = ringOutInboundLegCheck;
/***/ },
/***/ 325
(__unused_webpack_module, exports) {
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.formatParty = void 0;
function formatParty(_a) {
var owner = _a.owner, party = __rest(_a, ["owner"]);
if (!owner) {
if (!party.extensionId && party.accountId) {
delete party.accountId;
}
else if (party.extensionId && party.accountId) {
party.extensionId = String(party.extensionId);
party.accountId = String(party.accountId);
}
return party;
}
party.extensionId = String(owner.extensionId);
party.accountId = String(owner.accountId);
return party;
}
exports.formatParty = formatParty;
/***/ },
/***/ 460
(__unused_webpack_module, exports) {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.USER_AGENT = void 0;
exports.USER_AGENT = 'RingCentralCallControl/0.2.1';
/***/ },
/***/ 688
(__unused_webpack_module, exports, __webpack_require__) {
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.Session = exports.ReplyWithPattern = exports.PartyStatusCode = exports.Direction = void 0;
var events_1 = __webpack_require__(7);
var formatParty_1 = __webpack_require__(325);
var userAgent_1 = __webpack_require__(460);
var Direction;
(function (Direction) {
Direction["inbound"] = "Inbound";
Direction["outbound"] = "Outbound";
})(Direction = exports.Direction || (exports.Direction = {}));
var PartyStatusCode;
(function (PartyStatusCode) {
PartyStatusCode["setup"] = "Setup";
PartyStatusCode["proceeding"] = "Proceeding";
PartyStatusCode["answered"] = "Answered";
PartyStatusCode["disconnected"] = "Disconnected";
PartyStatusCode["gone"] = "Gone";
PartyStatusCode["parked"] = "Parked";
PartyStatusCode["hold"] = "Hold";
PartyStatusCode["voicemail"] = "Voicemail";
PartyStatusCode["faxReceive"] = "FaxReceive";
PartyStatusCode["voicemailScreening"] = "VoiceMailScreening";
})(PartyStatusCode = exports.PartyStatusCode || (exports.PartyStatusCode = {}));
var ReplyWithPattern;
(function (ReplyWithPattern) {
ReplyWithPattern["willCallYouBack"] = "WillCallYouBack";
ReplyWithPattern["callMeBack"] = "CallMeBack";
ReplyWithPattern["onMyWay"] = "OnMyWay";
ReplyWithPattern["onTheOtherLine"] = "OnTheOtherLine";
ReplyWithPattern["willCallYouBackLater"] = "WillCallYouBackLater";
ReplyWithPattern["callMeBackLater"] = "CallMeBackLater";
ReplyWithPattern["inAMeeting"] = "InAMeeting";
ReplyWithPattern["onTheOtherLineNoCall"] = "OnTheOtherLineNoCall";
})(ReplyWithPattern = exports.ReplyWithPattern || (exports.ReplyWithPattern = {}));
function objectEqual(obj