{"version":3,"sources":["jsdelivr-header.js","/npm/ari-client@2.2.0/lib/client.js"],"names":[],"mappings":"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","file":"/npm/ari-client@2.2.0/lib/client.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/ari-client@2.2.0/lib/client.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n *  Client to ARI instance behaving as an EventEmitter for web socket events.\n *  The client contains properties representing ARI resources. Those properties\n *  themselves will contain properties representing callable operations on those\n *  resources.\n *\n *  @module ari-client\n *\n *  @copyright 2014, Digium, Inc.\n *  @license Apache License, Version 2.0\n *  @author Samuel Fortier-Galarneau <sgalarneau@digium.com>\n */\n\n'use strict';\n\nvar util = require('util');\nvar request = require('request');\nvar url = require('url');\nvar events = require('events');\n\nvar WebSocket = require('ws');\nvar swagger = require('swagger-client');\nvar Promise = require('bluebird');\n\nvar _ = require('lodash');\nvar backoff = require('backoff-func');\nvar _resources = require('./resources.js');\nvar _utils = require('./utils.js');\n\n/**\n *  Client is an Event Emitter that allows root level resources\n *  to be accessed.\n *\n *  @class Client\n *  @constructor\n *  @param {string} url - The URL to the ARI instance\n *  @param {string} user - The username for the ARI instance\n *  @param {string} pass - The password for the ARI instance\n *  @prop {Connection} _connection - connection parts to an ARI instance\n *  @prop {Object} _instanceListeners - array of instance objects for\n *    instances that registered for scoped events keyed by event type\n */\nfunction Client(baseUrl, user, pass) {\n  var self = this;\n  events.EventEmitter.call(self);\n\n  // Store connection settings for prototype methods\n  var parsedUrl = url.parse(baseUrl);\n  /**\n   * Connection parts to an ARI instance.\n   *\n   * @class Connection\n   * @prop {string} protocol\n   * @prop {string} host\n   * @prop {string} hostname\n   * @prop {string} user - username for ARI instance\n   * @prop {string} pass - password for ARI instance\n   */\n  self._connection = {\n    protocol: parsedUrl.protocol,\n    host: parsedUrl.host,\n    hostname: parsedUrl.hostname,\n    user: user,\n    pass: pass\n  };\n\n  // Keep track of instance event listeners. once true means that the callback\n  // will only be called once for the given event.\n  //\n  // {\n  //   'eventType': [{'once': false, 'id': uniqueId, 'callback': callback}...],\n  //   ...\n  // }\n  self._instanceListeners = {};\n}\n\n// Make Client an Event Emitter\nutil.inherits(Client, events.EventEmitter);\n\n/**\n *  Attaches the API endpoints and operations for those endpoints to the Client\n *  instance.\n *\n *  @memberof Client\n *  @method _attachApi\n *  @param {attachApiCallback} callback - callback invoked once API attached\n *  @returns {Q} promise - a promise that will resolve to a client\n */\nClient.prototype._attachApi = function () {\n\n  var self = this;\n\n  return new Promise(function(resolve, reject) {\n\n    swagger.authorizations.add(\n      'basic-auth',\n      new swagger.PasswordAuthorization(\n        self._connection.hostname,\n        self._connection.user,\n        self._connection.pass\n      )\n    );\n\n    // Connect to API using swagger and attach resources on Client instance\n    var ariUrl = util.format(\n      '%s//%s/ari/api-docs/resources.json',\n      self._connection.protocol,\n      self._connection.host\n    );\n\n    request(ariUrl, function (err) {\n      if (err &&\n        ['ETIMEDOUT', 'ENOTFOUND', 'ECONNREFUSED'].indexOf(err.code) !== -1) {\n        err.name = 'HostIsNotReachable';\n\n        self.emit('APILoadError', err);\n        reject(err);\n      } else {\n        self._swagger = new swagger.SwaggerApi({\n          url: ariUrl,\n          success: swaggerLoaded,\n          failure: swaggerFailed\n        });\n      }\n    });\n\n    /**\n     *  Success handler for swagger connect.\n     *\n     *  @callback swaggerConnectSuccessCallback\n     *  @method swaggerLoaded\n     *  @memberof module:ari-client~Client~_attachApi\n     *  @private\n     */\n    function swaggerLoaded () {\n      if(self._swagger.ready === true) {\n        // Attach resources to client\n        _.each(_.keys(self._swagger.apis), attachResource);\n\n        // Attach resource creators to client\n        _.each(_resources.knownTypes, attachResourceCreators);\n\n        resolve(self);\n      }\n    }\n\n    /**\n     *  Failure handler for swagger connect.\n     *\n     *  @callback swaggerConnectFailureCallback\n     *  @method swaggerFailed\n     *  @memberof module:ari-client~Client~_attachApi\n     *  @private\n     */\n    function swaggerFailed (err) {\n      self.emit('APILoadError', err);\n      reject(err);\n    }\n\n    /**\n     *  Attach resource creators to Client instance to enable id generation.\n     *\n     *  Optionally, a values object can be used to set certain values on the\n     *  resource instance.\n     *\n     *  If the first argument is a string, it is used as an id.\n     *\n     *  @callback attachResourceCreatorsCallback\n     *  @method attachResourceCreators\n     *  @memberof module:ari-client~Client~_attachApi\n     *  @private\n     *  @param {string} resourceType - the type of the resource to setup a\n     *    create method for\n     */\n    function attachResourceCreators (resourceType) {\n      self[resourceType] = function (id, values) {\n        return _resources[resourceType](self, id, values);\n      };\n    }\n\n    /**\n     *  Attach resources and operations to Client instance.\n     *\n     *  @callback attachResourceCallback\n     *  @method attachResource\n     *  @memberof module:ari-client~Client~_attachApi\n     *  @private\n     *  @param {string} resource - the name of the resource\n     */\n    function attachResource (resource) {\n      self[resource] = {};\n      var operations = self._swagger.apis[resource].operations;\n      _.each(_.keys(operations), attachOperation);\n\n      // Attach operation to resource\n      function attachOperation (operation) {\n        self[resource][operation] = callSwagger;\n\n        var oper = self._swagger.apis[resource].operations[operation];\n        var respType = oper.type;\n        var multi = false;\n        var regexArr = _resources.swaggerListTypeRegex.exec(respType);\n        if (regexArr !== null) {\n          respType = regexArr[1];\n          multi = true;\n        }\n        var params = oper.parameters;\n\n        /**\n         *  Responsible for calling API through Swagger.\n         *\n         *  @callback attachResourceCallback\n         *  @memberof module:ari-client~Client~_attachApi~attachResource\n         *  @method callSwagger\n         *  @private\n         *  @param {Object} parameters - parameters to swagger\n         *  @param {Function} callback - callback invoked with swagger response\n         *  @returns {Q} promise - a promise that will resolve to a client\n         */\n        function callSwagger (/* args..., callback */) {\n          var args = _.toArray(arguments);\n          // Separate user callback from other args\n          var options = _.first(args);\n          var userCallback = (_.isFunction(_.last(args))) ? _.last(args)\n                                                          : undefined;\n\n          return new Promise(function(innerResolve, innerReject) {\n            args = [];\n\n            if (options === undefined || options === null ||\n                _.isFunction(options) || _.isArray(options)) {\n              options = {};\n            } else {\n              // Swagger can alter options passed in\n              options = _.clone(options);\n              // convert body params for swagger\n              options = _utils.parseBodyParams(params, options);\n            }\n\n            args.push(options);\n\n            // Inject response processing callback\n            args.push(processResponse);\n            // Inject error handling callback\n            args.push(swaggerError);\n\n            // Run operation against Swagger\n            self._swagger.apis[resource][operation].apply(null, args);\n\n            // Handle error from Swagger\n            function swaggerError (err) {\n              if (err && err.data) {\n                err = new Error(err.data.toString('utf-8'));\n              }\n\n              innerReject(err);\n            }\n\n            /**\n             *  Process response from Swagger.\n             *\n             *  @callback callSwaggerSuccessCallback\n             *  @method processResponse\n             *  @memberof\n             *    module:ari-client~Client~_attachApi~attachResource~callSwagger\n             *  @private\n             *  @param {Object} response - response from swagger\n             */\n            function processResponse (response) {\n              var result;\n\n              if (respType === 'binary') {\n                result = Buffer.from(response.data);\n              } else {\n                result = response.data.toString('utf-8');\n                if (respType !== null && result) {\n                  result = JSON.parse(result);\n                }\n              }\n\n              if (_.includes(_resources.knownTypes, respType) &&\n                  _resources[respType] !== undefined) {\n\n                if (multi) {\n                  result = _.map(result, function (obj) {\n                    return _resources[respType](\n                      self,\n                      obj\n                    );\n                  });\n                } else {\n                  result = _resources[respType](\n                    self,\n                    result\n                  );\n                }\n              }\n\n              innerResolve(result);\n            }\n          }).asCallback(userCallback);\n        }\n      }\n    }\n  });\n};\n\n/**\n *  Creates the web socket connection, subscribing to the given apps.\n *\n *  @memberof Client\n *  @method start\n */\nClient.prototype.start = function (apps, subscribeAll, callback) {\n  var self = this;\n  // are we currently processing a WebSocket error?\n  var processingError = false;\n\n  // Perform argument renaming for backwards compatibility\n  if (typeof subscribeAll === 'function') {\n    callback = subscribeAll;\n    subscribeAll = null;\n  }\n\n  return new Promise(function(resolve, reject) {\n\n    // Rewrite resolve/reject functions so they can only be called once and\n    // each disables the other when called.\n    resolve = _.once(resolve);\n\n    reject = _.once(reject);\n\n    var applications = (_.isArray(apps)) ? apps.join(',') : apps;\n    var wsUrl = util.format(\n      '%s://%s/ari/events?app=%s&api_key=%s:%s',\n      (self._connection.protocol === 'https:' ? 'wss' : 'ws'),\n      self._connection.host,\n      applications,\n      encodeURIComponent(self._connection.user),\n      encodeURIComponent(self._connection.pass)\n    );\n\n    if (subscribeAll) {\n      wsUrl += '&subscribeAll=true';\n    }\n\n    var retry = backoff.create({\n      delay: 100\n    });\n\n    connect();\n\n    /**\n     *  Connects to the application via WebSocket.\n     *\n     *  @method connect\n     *  @memberof module:ari-client~Client~start\n     *  @private\n     */\n    function connect () {\n      self._ws = new WebSocket(wsUrl);\n\n      self._ws.on('open', function () {\n        processOpen();\n      });\n      self._ws.on('error', processError);\n      self._ws.on('message', processMessage);\n      self._ws.on('pong', processPong);\n      self._ws.on('close', processClose);\n    }\n\n    /**\n     *  Process pong received by web socket and emit event\n     *\n     *  @method processPing\n     *  @memberof module:ari-client~Client~start\n     *  @private\n     */\n    function processPong () {\n      self.emit('pong');\n    }\n\n    /**\n     *  Process message received by web socket and emit event.\n     *\n     *  @method processMessage\n     *  @memberof module:ari-client~Client~start\n     *  @private\n     *  @param {Object} msg - the web socket message\n     *  @param {Object} flags - web socket control flags\n     */\n    function processMessage (msg, flags) {\n      var event = {};\n      if (msg) {\n        event = JSON.parse(msg);\n      }\n      var eventModels = self._swagger.apis.events.models;\n      var eventModel = _.find(eventModels, function (item, key) {\n        return key === event.type;\n      });\n      var resources = {};\n      var instanceIds = [];\n\n      // Pass in any property that is a known type as an object\n      _.each(eventModel.properties, function (prop) {\n        if (_.includes(_resources.knownTypes, prop.dataType) &&\n            event[prop.name] !== undefined &&\n            _resources[prop.dataType] !== undefined) {\n\n          var instance = _resources[prop.dataType](\n            self,\n            event[prop.name]\n          );\n          resources[prop.name] = instance;\n\n          // Keep track of which instance specific events we should\n          // emit\n          var listeners = self._instanceListeners[event.type];\n          var instanceId = instance._id().toString();\n\n          if (listeners) {\n            var updatedListeners = [];\n\n            _.each(listeners, function (listener) {\n              if (listener.id === instanceId) {\n                // make sure we do not duplicate events for a given instance\n                if (!_.includes(instanceIds, instanceId)) {\n                  instanceIds.push(instanceId);\n                }\n\n                // remove listeners that should only be invoked once\n                if (!listener.once) {\n                  updatedListeners.push(listener);\n                }\n              } else {\n                updatedListeners.push(listener);\n              }\n            });\n\n            self._instanceListeners[event.type] = updatedListeners;\n          }\n        }\n      });\n\n      var promoted = _.keys(resources).length;\n      if (promoted === 1) {\n        resources = resources[_.keys(resources)[0]];\n      } else if (promoted === 0) {\n        resources = undefined;\n      }\n\n      self.emit('*', event, resources);\n      self.emit(event.type, event, resources);\n      // If appropriate, emit instance specific events\n      if (instanceIds.length > 0) {\n        _.each(instanceIds, function (instanceId) {\n          self.emit(\n            util.format('%s-%s', event.type, instanceId),\n            event,\n            resources\n          );\n        });\n      }\n    }\n\n    /**\n     *  Process open event.\n     *\n     *  @method processOpen\n     *  @memberof module:ari-client~Client~start\n     *  @private\n     */\n    function processOpen () {\n      processingError = false;\n      // reset backoff handler when we successfully connect\n      retry = backoff.create({\n        delay: 100\n      });\n      self.emit('WebSocketConnected');\n      // onced, will not be called when an automatic reconnect succeeds.\n      resolve();\n    }\n\n    /**\n     *  Process close event. Attempt to reconnect to web socket with a back off\n     *  to ensure we do not flood the server.\n     *\n     *  @method processClose\n     *  @memberof module:ari-client~Client~start\n     *  @private\n     *  @param {Number} reason - reason code for disconnect\n     *  @param {String} description - reason text for disconnect\n     */\n    function processClose (reason, description) {\n      // was connection closed on purpose?\n      if (self._wsClosed) {\n        self._wsClosed = false;\n\n        return;\n      }\n\n      if (!processingError) {\n        reconnect();\n      }\n    }\n\n    /**\n     *  Process error event.\n     *\n     *  @method processError\n     *  @memberof module:ari-client~Client~start\n     *  @private\n     *  @param {Error} err - error object\n     */\n    function processError (err) {\n      // was connection closed on purpose?\n      if (self._wsClosed) {\n        return;\n      }\n\n      processingError = true;\n\n      reconnect(err);\n    }\n\n    /**\n     *  Attempts to reconnect to the WebSocket using a backoff function.\n     *\n     *  @method reconnect\n     *  @memberof module:ari-client~Client~start\n     *  @private\n     *  @param {Error} [err] - error object\n     */\n    function reconnect(err) {\n      var scheduled = retry(connect);\n      var msg = err ? err.message : 'unknown';\n\n      if (!scheduled) {\n        // onced or disabled if initial connection succeeds.\n        reject(new Error('Connection attempts exceeded WebSocketMaxRetries. ' +\n          msg));\n\n        self.emit('WebSocketMaxRetries', err);\n      } else {\n        self.emit('WebSocketReconnecting', err);\n      }\n    }\n\n  }).asCallback(callback);\n};\n\n/**\n *  Closes the web socket connection.\n *\n *  @memberof Client\n *  @method stop\n */\nClient.prototype.stop = function () {\n  var self = this;\n\n  self._ws.close();\n  self._wsClosed = true;\n};\n\n/**\n *  Pings the web socket\n *\n *  @memberof Client\n *  @method ping\n */\nClient.prototype.ping = function () {\n  var self = this;\n\n  if (self._ws === undefined || self._wsClosed) {\n    return;\n  }\n  self._ws.ping();\n};\n\n/**\n *  Create an instance of Client using the provided connection options and call\n *  the provided callback once the API has been attached to the Client.\n *\n *  @method connect\n *  @memberof module:ari-client\n *  @param {string} url - The URL to the ARI instance\n *  @param {string} user - The username for the ARI instance\n *  @param {string} pass - The password for the ARI instance\n *  @param {Client-clientCallback} cb -\n *    The callback to be called upon connection\n *  @returns {Q} promise - a promise that will resolve to a client\n */\nmodule.exports.connect = function (baseUrl, user, pass,\n    /**\n     *  @callback connectCallback\n     *  @memberof module:ari-client\n     *  @param {Error} err - error object if any, null otherwise\n     *  @param {Client} ari - ARI client instance\n     */\n    callback) {\n\n  var client = new Client(baseUrl, user, pass);\n  client.setMaxListeners(0);\n\n  return client._attachApi().asCallback(callback);\n};\n"]}