@webex/webex-core
Version:
Plugin handling for Cisco Webex
677 lines (666 loc) • 28.8 kB
JavaScript
"use strict";
var _Object$keys2 = require("@babel/runtime-corejs2/core-js/object/keys");
var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols");
var _Object$getOwnPropertyDescriptor2 = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors");
var _Object$defineProperties = require("@babel/runtime-corejs2/core-js/object/define-properties");
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
_Object$defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
exports.registerInternalPlugin = registerInternalPlugin;
exports.registerPlugin = registerPlugin;
var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
var _apply = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/reflect/apply"));
var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
var _assign = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/assign"));
var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
var _deleteProperty = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/reflect/delete-property"));
var _getOwnPropertyDescriptor = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
var _applyDecoratedDescriptor2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/applyDecoratedDescriptor"));
var _events = require("events");
var _util = _interopRequireDefault(require("util"));
var _common = require("@webex/common");
var _httpCore = require("@webex/http-core");
var _lodash = require("lodash");
var _ampersandState = _interopRequireDefault(require("ampersand-state"));
var _uuid = _interopRequireDefault(require("uuid"));
var _auth = _interopRequireDefault(require("./interceptors/auth"));
var _networkTiming = _interopRequireDefault(require("./interceptors/network-timing"));
var _payloadTransformer = _interopRequireDefault(require("./interceptors/payload-transformer"));
var _redirect = _interopRequireDefault(require("./interceptors/redirect"));
var _requestEvent = _interopRequireDefault(require("./interceptors/request-event"));
var _requestLogger = _interopRequireDefault(require("./interceptors/request-logger"));
var _requestTiming = _interopRequireDefault(require("./interceptors/request-timing"));
var _responseLogger = _interopRequireDefault(require("./interceptors/response-logger"));
var _webexHttpError = _interopRequireDefault(require("./lib/webex-http-error"));
var _userAgent = _interopRequireDefault(require("./interceptors/user-agent"));
var _webexTrackingId = _interopRequireDefault(require("./interceptors/webex-tracking-id"));
var _webexUserAgent = _interopRequireDefault(require("./interceptors/webex-user-agent"));
var _rateLimit = _interopRequireDefault(require("./interceptors/rate-limit"));
var _embargo = _interopRequireDefault(require("./interceptors/embargo"));
var _defaultOptions = _interopRequireDefault(require("./interceptors/default-options"));
var _hostmap = _interopRequireDefault(require("./lib/interceptors/hostmap"));
var _config = _interopRequireDefault(require("./config"));
var _storage = require("./lib/storage");
var _webexCorePluginMixin = _interopRequireDefault(require("./lib/webex-core-plugin-mixin"));
var _webexInternalCorePluginMixin = _interopRequireDefault(require("./lib/webex-internal-core-plugin-mixin"));
var _webexInternalCore = _interopRequireDefault(require("./webex-internal-core"));
var _obj;
/*!
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
*/
function ownKeys(e, r) { var t = _Object$keys2(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return _Object$getOwnPropertyDescriptor2(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor2(t, r)); }); } return e; }
// TODO replace the Interceptor.create with Reflect.construct (
// Interceptor.create exists because new was really hard to call on an array of
// constructors)
var interceptors = {
WebexTrackingIdInterceptor: _webexTrackingId.default.create,
RequestEventInterceptor: _requestEvent.default.create,
RateLimitInterceptor: _rateLimit.default.create,
/* eslint-disable no-extra-parens */
RequestLoggerInterceptor: process.env.ENABLE_NETWORK_LOGGING || process.env.ENABLE_VERBOSE_NETWORK_LOGGING ? _requestLogger.default.create : undefined,
ResponseLoggerInterceptor: process.env.ENABLE_NETWORK_LOGGING || process.env.ENABLE_VERBOSE_NETWORK_LOGGING ? _responseLogger.default.create : undefined,
/* eslint-enable no-extra-parens */
RequestTimingInterceptor: _requestTiming.default.create,
ServiceInterceptor: undefined,
UserAgentInterceptor: _userAgent.default.create,
WebexUserAgentInterceptor: _webexUserAgent.default.create,
AuthInterceptor: _auth.default.create,
KmsDryErrorInterceptor: undefined,
PayloadTransformerInterceptor: _payloadTransformer.default.create,
ConversationInterceptor: undefined,
RedirectInterceptor: _redirect.default.create,
HttpStatusInterceptor: function HttpStatusInterceptor() {
return _httpCore.HttpStatusInterceptor.create({
error: _webexHttpError.default
});
},
NetworkTimingInterceptor: _networkTiming.default.create,
EmbargoInterceptor: _embargo.default.create,
DefaultOptionsInterceptor: _defaultOptions.default.create,
HostMapInterceptor: _hostmap.default.create
};
var preInterceptors = ['ResponseLoggerInterceptor', 'RequestTimingInterceptor', 'RequestEventInterceptor', 'WebexTrackingIdInterceptor', 'RateLimitInterceptor'];
var postInterceptors = ['HttpStatusInterceptor', 'NetworkTimingInterceptor', 'EmbargoInterceptor', 'RequestLoggerInterceptor', 'RateLimitInterceptor'];
var MAX_FILE_SIZE_IN_MB = 2048;
/**
* @class
*/
var WebexCore = _ampersandState.default.extend((_obj = {
version: "3.9.0",
children: {
internal: _webexInternalCore.default
},
constructor: function constructor() {
var attrs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var options = arguments.length > 1 ? arguments[1] : undefined;
if (typeof attrs === 'string') {
attrs = {
credentials: {
supertoken: {
// eslint-disable-next-line camelcase
access_token: attrs
}
}
};
} else {
// Reminder: order is important here
['credentials.authorization', 'authorization', 'credentials.supertoken.supertoken', 'supertoken', 'access_token', 'credentials.authorization.supertoken'].forEach(function (path) {
var val = (0, _lodash.get)(attrs, path);
if (val) {
(0, _lodash.unset)(attrs, path);
(0, _lodash.set)(attrs, 'credentials.supertoken', val);
}
});
['credentials', 'credentials.authorization'].forEach(function (path) {
var val = (0, _lodash.get)(attrs, path);
if (typeof val === 'string') {
(0, _lodash.unset)(attrs, path);
(0, _lodash.set)(attrs, 'credentials.supertoken', val);
}
});
if (typeof (0, _lodash.get)(attrs, 'credentials.access_token') === 'string') {
// Send access_token to get validated and corrected and then set it
(0, _lodash.set)(attrs, 'credentials.access_token', this.bearerValidator((0, _lodash.get)(attrs, 'credentials.access_token').trim()));
(0, _lodash.set)(attrs, 'credentials.supertoken', attrs.credentials);
}
}
return (0, _apply.default)(_ampersandState.default, this, [attrs, options]);
},
derived: {
boundedStorage: {
deps: [],
fn: function fn() {
return (0, _storage.makeWebexStore)('bounded', this);
}
},
unboundedStorage: {
deps: [],
fn: function fn() {
return (0, _storage.makeWebexStore)('unbounded', this);
}
},
ready: {
deps: ['loaded', 'internal.ready'],
fn: function fn() {
var _this = this;
return this.loaded && (0, _keys.default)(this._children).reduce(function (ready, name) {
return ready && _this[name] && _this[name].ready !== false;
}, true);
}
}
},
session: {
config: {
type: 'object'
},
/**
* When true, indicates that the initial load from the storage layer is
* complete
* @instance
* @memberof WebexCore
* @type {boolean}
*/
loaded: {
default: false,
type: 'boolean'
},
request: {
setOnce: true,
// It's supposed to be a function, but that's not a type defined in
// Ampersand
type: 'any'
},
sessionId: {
type: 'string'
}
},
/**
* @instance
* @memberof WebexCore
* @param {[type]} args
* @returns {[type]}
*/
refresh: function refresh() {
var _this$credentials;
return (_this$credentials = this.credentials).refresh.apply(_this$credentials, arguments);
},
/**
* Applies the directionally appropriate transforms to the specified object
* @param {string} direction
* @param {Object} object
* @returns {Promise}
*/
transform: function transform(direction, object) {
var _this2 = this;
var predicates = this.config.payloadTransformer.predicates.filter(function (p) {
return !p.direction || p.direction === direction;
});
var ctx = {
webex: this
};
return _promise.default.all(predicates.map(function (p) {
return p.test(ctx, object).then(function (shouldTransform) {
if (!shouldTransform) {
return undefined;
}
return p.extract(object)
// eslint-disable-next-line max-nested-callbacks
.then(function (target) {
return {
name: p.name,
target: target
};
});
});
})).then(function (data) {
return data.filter(function (d) {
return Boolean(d);
})
// eslint-disable-next-line max-nested-callbacks
.reduce(function (promise, _ref) {
var name = _ref.name,
target = _ref.target,
alias = _ref.alias;
return promise.then(function () {
if (alias) {
return _this2.applyNamedTransform(direction, alias, target);
}
return _this2.applyNamedTransform(direction, name, target);
});
}, _promise.default.resolve());
}).then(function () {
return object;
});
},
/**
* Applies the directionally appropriate transform to the specified parameters
* @param {string} direction
* @param {Object} ctx
* @param {string} name
* @returns {Promise}
*/
applyNamedTransform: function applyNamedTransform(direction, ctx, name) {
var _this3 = this;
for (var _len = arguments.length, rest = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
rest[_key - 3] = arguments[_key];
}
if ((0, _lodash.isString)(ctx)) {
rest.unshift(name);
name = ctx;
ctx = {
webex: this,
transform: function transform() {
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
return _this3.applyNamedTransform.apply(_this3, [direction, ctx].concat(args));
}
};
}
var transforms = ctx.webex.config.payloadTransformer.transforms.filter(function (tx) {
return tx.name === name && (!tx.direction || tx.direction === direction);
});
// too many implicit returns on the same line is difficult to interpret
// eslint-disable-next-line arrow-body-style
return transforms.reduce(function (promise, tx) {
return promise.then(function () {
if (tx.alias) {
var _ctx;
return (_ctx = ctx).transform.apply(_ctx, [tx.alias].concat(rest));
}
return _promise.default.resolve(tx.fn.apply(tx, [ctx].concat(rest)));
});
}, _promise.default.resolve()).then(function () {
return (0, _lodash.last)(rest);
});
},
/**
* @private
* @returns {Window}
*/
getWindow: function getWindow() {
// eslint-disable-next-line
return window;
},
/**
* Initializer
*
* @emits WebexCore#loaded
* @emits WebexCore#ready
* @instance
* @memberof WebexCore
* @param {Object} attrs
* @returns {WebexCore}
*/
initialize: function initialize() {
var _this4 = this;
var attrs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
this.config = (0, _lodash.merge)({}, _config.default, attrs.config);
// There's some unfortunateness with the way {@link AmpersandState#children}
// get initialized. We'll fire the change:config event so that
// {@link WebexPlugin#initialize()} can use
// `this.listenToOnce(parent, 'change:config', () => {});` to act on config
// during initialization
this.trigger('change:config');
var onLoaded = function onLoaded() {
if (_this4.loaded) {
/**
* Fires when all data has been loaded from the storage layer
* @event loaded
* @instance
* @memberof WebexCore
*/
_this4.trigger('loaded');
_this4.stopListening(_this4, 'change:loaded', onLoaded);
}
};
// This needs to run on nextTick or we'll never be able to wire up listeners
process.nextTick(function () {
_this4.listenToAndRun(_this4, 'change:loaded', onLoaded);
});
var onReady = function onReady() {
if (_this4.ready) {
/**
* Fires when all plugins have fully initialized
* @event ready
* @instance
* @memberof WebexCore
*/
_this4.trigger('ready');
_this4.stopListening(_this4, 'change:ready', onReady);
}
};
// This needs to run on nextTick or we'll never be able to wire up listeners
process.nextTick(function () {
_this4.listenToAndRun(_this4, 'change:ready', onReady);
});
// Make nested events propagate in a consistent manner
(0, _keys.default)(this.constructor.prototype._children).forEach(function (key) {
_this4.listenTo(_this4[key], 'change', function () {
for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
args[_key3] = arguments[_key3];
}
args.unshift("change:".concat(key));
_this4.trigger.apply(_this4, args);
});
});
var addInterceptor = function addInterceptor(ints, key) {
var interceptorsObj = _this4.config.interceptors || interceptors;
var interceptor = interceptorsObj[key];
if (!(0, _lodash.isFunction)(interceptor)) {
return ints;
}
ints.push((0, _apply.default)(interceptor, _this4, []));
return ints;
};
var ints = [];
if (this.config.interceptors) {
(0, _keys.default)(this.config.interceptors).reduce(addInterceptor, ints);
} else {
ints = preInterceptors.reduce(addInterceptor, ints);
ints = (0, _keys.default)(interceptors).filter(function (key) {
return !(preInterceptors.includes(key) || postInterceptors.includes(key));
}).reduce(addInterceptor, ints);
ints = postInterceptors.reduce(addInterceptor, ints);
}
this.request = (0, _httpCore.defaults)({
json: true,
interceptors: ints
});
this.prepareFetchOptions = (0, _httpCore.protoprepareFetchOptions)({
json: true,
interceptors: ints
});
this.setTimingsAndFetch = _httpCore.setTimingsAndFetch;
var sessionId = "".concat((0, _lodash.get)(this, 'config.trackingIdPrefix', 'webex-js-sdk'), "_").concat((0, _lodash.get)(this, 'config.trackingIdBase', _uuid.default.v4()));
if ((0, _lodash.get)(this, 'config.trackingIdSuffix')) {
sessionId += "_".concat((0, _lodash.get)(this, 'config.trackingIdSuffix'));
}
this.sessionId = sessionId;
},
/**
* setConfig
*
* Allows updating config
*
* @instance
* @memberof WebexCore
* @param {Object} newConfig
* @returns {null}
*/
setConfig: function setConfig() {
var newConfig = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
this.config = (0, _lodash.merge)({}, this.config, newConfig);
},
/**
*
* Check if access token is correctly formated and correct if it's not
* Warn user if token string has errors in it
* @param {string} token
* @returns {string}
*/
bearerValidator: function bearerValidator(token) {
if (token.includes('Bearer') && token.split(' ').length - 1 === 0) {
console.warn("Your access token does not have a space between 'Bearer' and the token, please add a space to it or replace it with this already fixed version:\n\n".concat(token.replace('Bearer', 'Bearer ').replace(/\s+/g, ' ')));
console.info("Tip: You don't need to add 'Bearer' to the access_token field. The token by itself is fine");
return token.replace('Bearer', 'Bearer ').replace(/\s+/g, ' ');
}
// Allow elseIf return
// eslint-disable-next-line no-else-return
else if (token.split(' ').length - 1 > 1) {
console.warn("Your access token has ".concat(token.split(' ').length - 2, " too many spaces, please use this format:\n\n").concat(token.replace(/\s+/g, ' ')));
console.info("Tip: You don't need to add 'Bearer' to the access_token field, the token by itself is fine");
return token.replace(/\s+/g, ' ');
}
return token.replace(/\s+/g, ' '); // Clean it anyway (just in case)
},
/**
* @instance
* @memberof WebexPlugin
* @param {number} depth
* @private
* @returns {Object}
*/
inspect: function inspect(depth) {
return _util.default.inspect((0, _lodash.omit)(this.serialize({
props: true,
session: true,
derived: true
}), 'boundedStorage', 'unboundedStorage', 'request', 'config'), {
depth: depth
});
},
/**
* Invokes all `onBeforeLogout` handlers in the scope of their plugin, clears
* all stores, and revokes the access token
* Note: If you're using the sdk in a server environment, you may be more
* interested in {@link `webex.internal.mercury.disconnect()`| Mercury#disconnect()}
* and {@link `webex.internal.device.unregister()`|Device#unregister()}
* or {@link `webex.phone.unregister()`|Phone#unregister}
* @instance
* @memberof WebexCore
* @param {Object} options Passed as the first argument to all
* `onBeforeLogout` handlers
* @returns {Promise}
*/
logout: function logout(options) {
var _this5 = this;
for (var _len4 = arguments.length, rest = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
rest[_key4 - 1] = arguments[_key4];
}
// prefer the refresh token, but for clients that don't have one, fallback
// to the access token
var token = this.credentials.supertoken && (this.credentials.supertoken.refresh_token || this.credentials.supertoken.access_token);
options = (0, _assign.default)({
token: token
}, options);
// onBeforeLogout should be executed in the opposite order in which handlers
// were registered. In that way, wdm unregister() will be above mercury
// disconnect(), but disconnect() will execute first.
// eslint-disable-next-line arrow-body-style
return this.config.onBeforeLogout.reverse().reduce(function (promise, _ref2) {
var plugin = _ref2.plugin,
fn = _ref2.fn;
return promise.then(function () {
return _promise.default.resolve((0, _apply.default)(fn, _this5[plugin] || _this5.internal[plugin], [options].concat(rest)))
// eslint-disable-next-line max-nested-callbacks
.catch(function (err) {
_this5.logger.warn("onBeforeLogout from plugin ".concat(plugin, ": failed"), err);
});
});
}, _promise.default.resolve()).then(function () {
return _promise.default.all([_this5.boundedStorage.clear(), _this5.unboundedStorage.clear()]);
}).then(function () {
var _this5$credentials;
return (_this5$credentials = _this5.credentials).invalidate.apply(_this5$credentials, rest);
}).then(function () {
var _this5$authorization;
return _this5.authorization && _this5.authorization.logout && (_this5$authorization = _this5.authorization).logout.apply(_this5$authorization, [options].concat(rest));
}).then(function () {
return _this5.trigger('client:logout');
});
},
/**
* General purpose wrapper to submit metrics via the metrics plugin (if the
* metrics plugin is installed)
* @instance
* @memberof WebexCore
* @returns {Promise}
*/
measure: function measure() {
if (this.metrics) {
var _this$metrics;
return (_this$metrics = this.metrics).sendUnstructured.apply(_this$metrics, arguments);
}
return _promise.default.resolve();
},
upload: function upload(options) {
var _this6 = this;
return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
var shunt, promise;
return _regenerator.default.wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
if (options.file) {
_context.next = 2;
break;
}
return _context.abrupt("return", _promise.default.reject(new Error('`options.file` is required')));
case 2:
options.phases = options.phases || {};
options.phases.initialize = options.phases.initialize || {};
options.phases.upload = options.phases.upload || {};
options.phases.finalize = options.phases.finalize || {};
(0, _lodash.defaultsDeep)(options.phases.initialize, {
method: 'POST',
body: {
uploadProtocol: 'content-length'
}
}, (0, _lodash.omit)(options, 'file', 'phases'));
(0, _lodash.defaultsDeep)(options.phases.upload, {
method: 'PUT',
json: false,
withCredentials: false,
body: options.file,
headers: {
'x-trans-id': _uuid.default.v4(),
authorization: undefined
}
});
(0, _lodash.defaultsDeep)(options.phases.finalize, {
method: 'POST'
}, (0, _lodash.omit)(options, 'file', 'phases'));
shunt = new _events.EventEmitter();
promise = _this6._uploadPhaseInitialize(options).then(function () {
var p = _this6._uploadPhaseUpload(options);
(0, _common.transferEvents)('progress', p, shunt);
return p;
}).then(function () {
for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
args[_key5] = arguments[_key5];
}
return _this6._uploadPhaseFinalize.apply(_this6, [options].concat(args));
}).then(function (res) {
return _objectSpread(_objectSpread({}, res.body), res.headers);
});
(0, _common.proxyEvents)(shunt, promise);
return _context.abrupt("return", promise);
case 13:
case "end":
return _context.stop();
}
}, _callee);
}))();
},
_uploadPhaseInitialize: function _uploadPhaseInitialize(options) {
var _this7 = this;
this.logger.debug('client: initiating upload session');
return this.request(options.phases.initialize).then(function () {
for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
args[_key6] = arguments[_key6];
}
var fileUploadSizeLimitInBytes = (args[0].body.fileUploadSizeLimit || MAX_FILE_SIZE_IN_MB) * 1024 * 1024;
var currentFileSizeInBytes = options.file.byteLength;
if (fileUploadSizeLimitInBytes && fileUploadSizeLimitInBytes < currentFileSizeInBytes) {
return _this7._uploadAbortSession.apply(_this7, [currentFileSizeInBytes].concat(args));
}
return _this7._uploadApplySession.apply(_this7, [options].concat(args));
}).then(function (res) {
_this7.logger.debug('client: initiated upload session');
return res;
});
},
_uploadAbortSession: function _uploadAbortSession(currentFileSizeInBytes, response) {
var _this8 = this;
this.logger.debug('client: deleting uploaded file');
return this.request({
method: 'DELETE',
url: response.body.url,
headers: response.options.headers
}).then(function () {
_this8.logger.debug('client: deleting uploaded file complete');
var abortErrorDetails = {
currentFileSizeInBytes: currentFileSizeInBytes,
fileUploadSizeLimitInMB: response.body.fileUploadSizeLimit || MAX_FILE_SIZE_IN_MB,
message: 'file-upload-size-limit-enabled'
};
return _promise.default.reject(new Error("".concat((0, _stringify.default)(abortErrorDetails))));
});
},
_uploadApplySession: function _uploadApplySession(options, res) {
var session = res.body;
['upload', 'finalize'].reduce(function (opts, key) {
opts[key] = (0, _keys.default)(opts[key]).reduce(function (phaseOptions, phaseKey) {
if (phaseKey.startsWith('$')) {
phaseOptions[phaseKey.substr(1)] = phaseOptions[phaseKey](session);
(0, _deleteProperty.default)(phaseOptions, phaseKey);
}
return phaseOptions;
}, opts[key]);
return opts;
}, options.phases);
},
_uploadPhaseUpload: function _uploadPhaseUpload(options) {
var _this9 = this;
this.logger.debug('client: uploading file');
var promise = this.request(options.phases.upload).then(function (res) {
_this9.logger.debug('client: uploaded file');
return res;
});
(0, _common.proxyEvents)(options.phases.upload.upload, promise);
/* istanbul ignore else */
if (process.env.NODE_ENV === 'test') {
promise.on('progress', function (event) {
_this9.logger.info('upload progress', event.loaded, event.total);
});
}
return promise;
},
_uploadPhaseFinalize: function _uploadPhaseFinalize(options) {
var _this10 = this;
this.logger.debug('client: finalizing upload session');
return this.request(options.phases.finalize).then(function (res) {
_this10.logger.debug('client: finalized upload session');
return res;
});
}
}, ((0, _applyDecoratedDescriptor2.default)(_obj, "_uploadPhaseUpload", [_common.retry], (0, _getOwnPropertyDescriptor.default)(_obj, "_uploadPhaseUpload"), _obj)), _obj));
WebexCore.version = "3.9.0";
(0, _webexInternalCorePluginMixin.default)(_webexInternalCore.default, _config.default, interceptors);
(0, _webexCorePluginMixin.default)(WebexCore, _config.default, interceptors);
var _default = exports.default = WebexCore;
/**
* @method registerPlugin
* @param {string} name
* @param {function} constructor
* @param {Object} options
* @param {Array<string>} options.proxies
* @param {Object} options.interceptors
* @returns {null}
*/
function registerPlugin(name, constructor) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
WebexCore.registerPlugin(name, constructor, options);
}
/**
* Registers plugins used by internal products that do not talk to public APIs.
* @method registerInternalPlugin
* @param {string} name
* @param {function} constructor
* @param {Object} options
* @param {Object} options.interceptors
* @private
* @returns {null}
*/
function registerInternalPlugin(name, constructor, options) {
_webexInternalCore.default.registerPlugin(name, constructor, options);
}
//# sourceMappingURL=webex-core.js.map