UNPKG

@webex/webex-core

Version:

Plugin handling for Cisco Webex

677 lines (666 loc) • 28.8 kB
"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